{"version":3,"file":"default-_yarn___virtual___angular-material-virtual-894adb27e5_0_cache_angular-material-npm-15-41c2a3.96a87701ea720716.js","mappings":"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","names":["i0","_r9","ctx_r8","ctx_r10","index","day_r1","_r5","ctx_r4","ctx_r6","ctx_r7","_r10","ctx_r9","ctx_r11","ctx_r12","_r14","ctx_r13","ctx_r15","ctx_r16","MatDatepickerIntl","constructor","this","changes","Subject","calendarLabel","openCalendarLabel","closeCalendarLabel","prevMonthLabel","nextMonthLabel","prevYearLabel","nextYearLabel","prevMultiYearLabel","nextMultiYearLabel","switchToMonthViewLabel","switchToMultiYearViewLabel","startDateLabel","endDateLabel","formatYearRange","start","end","formatYearRangeLabel","ɵfac","ɵprov","factory","MatCalendarCell","value","displayValue","ariaLabel","enabled","cssClasses","compareValue","rawValue","calendarBodyId","MatCalendarBody","ngAfterViewChecked","_focusActiveCellAfterViewChecked","_focusActiveCell","_elementRef","_ngZone","_platform","inject","Platform","numCols","activeCell","isRange","cellAspectRatio","previewStart","previewEnd","selectedValueChange","EventEmitter","previewChange","activeDateChange","dragStarted","dragEnded","_didDragSinceMouseDown","_enterHandler","event","_skipNextFocus","type","target","cell","_getCellFromElement","run","emit","_touchmoveHandler","getActualTouchTarget","getCellElement","preventDefault","_leaveHandler","relatedTarget","_mousedownHandler","_isInRange","_mouseupHandler","cellElement","closest","nativeElement","_touchendHandler","_id","_startDateLabelId","_endDateLabelId","runOutsideAngular","element","addEventListener","isBrowser","window","_cellClicked","_emitActiveDateChange","_isSelected","startValue","endValue","ngOnChanges","columnChanges","rows","_firstRowOffset","length","_cellPadding","_cellWidth","ngOnDestroy","removeEventListener","_isActiveCell","rowIndex","colIndex","cellNumber","movePreview","onStable","pipe","take","subscribe","setTimeout","querySelector","focus","_scheduleFocusActiveCellAfterViewChecked","_isRangeStart","isStart","_isRangeEnd","isEnd","isInRange","_isComparisonStart","comparisonStart","comparisonEnd","_isComparisonBridgeStart","previousCell","previousRow","_isComparisonBridgeEnd","_isComparisonEnd","nextCell","nextRow","_isInComparisonRange","_isComparisonIdentical","_isPreviewStart","_isPreviewEnd","_isInPreview","_getDescribedby","row","getAttribute","col","parseInt","ɵcmp","selectors","attrs","i1","styles","isTableCell","node","nodeName","parentNode","rangeEnabled","touchLocation","changedTouches","document","elementFromPoint","clientX","clientY","DateRange","MatDateSelectionModel","selection","_adapter","_selectionChanged","selectionChanged","updateSelection","source","oldValue","next","complete","_isValidDateInstance","date","isDateInstance","isValid","MatSingleDateSelectionModel","adapter","super","add","isComplete","clone","i1$1","MAT_SINGLE_DATE_SELECTION_MODEL_PROVIDER","provide","deps","Optional","SkipSelf","DateAdapter","useFactory","MAT_SINGLE_DATE_SELECTION_MODEL_FACTORY","parent","MAT_DATE_RANGE_SELECTION_STRATEGY","InjectionToken","MatMonthView","activeDate","_activeDate","oldActiveDate","validDate","_dateAdapter","getValidDateOrNull","deserialize","today","clampDate","minDate","maxDate","_hasSameMonthAndYear","_init","selected","_selected","_setRanges","_minDate","_maxDate","_changeDetectorRef","_dateFormats","_dir","_rangeStrategy","_rerenderSubscription","Subscription","activeDrag","selectedChange","_userSelection","ngAfterContentInit","localeChanges","startWith","comparisonChange","firstChange","_clearPreview","unsubscribe","_dateSelected","selectedDate","_getDateFromDayOfMonth","rangeStartDate","rangeEndDate","_getDateInCurrentMonth","markForCheck","_updateActiveDate","compareDate","_handleCalendarBodyKeydown","isRtl","_isRtl","keyCode","LEFT_ARROW","addCalendarDays","RIGHT_ARROW","UP_ARROW","DOWN_ARROW","HOME","getDate","END","getNumDaysInMonth","PAGE_UP","altKey","addCalendarYears","addCalendarMonths","PAGE_DOWN","ENTER","SPACE","_selectionKeyPressed","_canSelect","ESCAPE","_previewEnd","hasModifierKey","stopPropagation","_handleCalendarBodyKeyup","_todayDate","_getCellCompareValue","_monthLabel","display","monthLabel","format","getMonthNames","getMonth","toLocaleUpperCase","firstOfMonth","createDate","getYear","_firstWeekOffset","getDayOfWeek","getFirstDayOfWeek","_initWeekdays","_createWeekCells","_matCalendarBody","_previewChanged","previewRange","createPreview","_previewStart","dragRange","createDrag","detectChanges","_dragEnded","dragDropResult","dayOfMonth","firstDayOfWeek","narrowWeekdays","getDayOfWeekNames","weekdays","map","long","i","narrow","_weekdays","slice","concat","daysInMonth","dateNames","getDateNames","_weeks","push","_shouldEnableDate","dateA11yLabel","cellClasses","dateClass","undefined","dateFilter","d1","d2","year","month","day","Date","getTime","selectedValue","_rangeStart","_rangeEnd","_isRange","_comparisonRangeStart","_comparisonRangeEnd","MAT_DATE_FORMATS","i2","_t","ctx","decls","encapsulation","yearsPerPage","MatMultiYearView","isSameMultiYearView","_setSelectedYear","yearSelected","_todayYear","minYearOfPage","getActiveOffset","_years","_createCellForYear","_yearSelected","selectedYear","_getDateFromYear","_getActiveCell","activeMonth","Math","min","yearName","getYearName","_shouldEnableYear","_selectedYear","dateAdapter","date1","date2","year1","year2","startingYear","getStartingYear","floor","euclideanModulo","a","b","MatYearView","_setSelectedMonth","monthSelected","_monthSelected","selectedMonth","_getDateFromMonth","_todayMonth","_getMonthInCurrentYear","_yearLabel","monthNames","_months","_createCellForMonth","normalizedDate","monthName","monthYearA11yLabel","_shouldEnableMonth","activeYear","_isYearAndMonthAfterMaxDate","_isYearAndMonthBeforeMinDate","maxYear","maxMonth","minYear","minMonth","_selectedMonth","calendarHeaderId","MatCalendarHeader","_intl","calendar","changeDetectorRef","_periodButtonLabelId","stateChanges","periodButtonText","currentView","monthYearLabel","_formatMinAndMaxYearLabels","periodButtonDescription","periodButtonLabel","prevButtonLabel","nextButtonLabel","currentPeriodClicked","previousClicked","nextClicked","previousEnabled","_isSameView","nextEnabled","maxYearOfPage","forwardRef","MatCalendar","i3","startAt","_startAt","_clampedActiveDate","_currentView","viewChangedResult","_moveFocusOnNextTick","viewChanged","startView","_userDragDrop","_activeDrag","_intlChanges","_calendarHeaderPortal","ComponentPortal","headerComponent","focusActiveCell","minDateChange","sameDate","previousValue","currentValue","maxDateChange","change","view","_getCurrentViewComponent","updateTodaysDate","_yearSelectedInMultiYearView","normalizedYear","_monthSelectedInYearView","normalizedMonth","_goToDateInView","_dragStarted","monthView","yearView","multiYearView","i5","i6","matDatepickerAnimations","transformPanel","trigger","transition","animate","keyframes","style","opacity","transform","fadeInCalendar","state","datepickerUid","MAT_DATEPICKER_SCROLL_STRATEGY","MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER","Overlay","MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY","overlay","scrollStrategies","reposition","_MatDatepickerContentBase","mixinColor","MatDatepickerContent","elementRef","_globalModel","_rangeSelectionStrategy","intl","_subscriptions","_animationDone","_isAnimating","_actionsPortal","_closeButtonText","ngOnInit","_animationState","datepicker","touchUi","ngAfterViewInit","_calendar","_handleUserSelection","_model","newSelection","selectionFinished","close","_handleUserDragDrop","_startExitAnimation","_handleAnimationEvent","phaseName","_getSelected","_applyPendingSelection","_assignActions","portal","forceRerender","changeDetection","MatDatepickerBase","datepickerInput","getStartValue","color","_color","getThemePalette","_touchUi","coerceBooleanProperty","disabled","_disabled","newValue","restoreFocus","_restoreFocus","panelClass","_panelClass","coerceStringArray","opened","_opened","open","_getMinDate","_getMaxDate","max","_getDateFilter","_overlay","_viewContainerRef","scrollStrategy","_inputStateChanges","_document","DOCUMENT","xPosition","yPosition","openedStream","closedStream","id","_focusedElementBeforeOpen","_backdropHarnessClass","_scrollStrategy","positionChange","_overlayRef","positionStrategy","getConfig","FlexibleConnectedPositionStrategy","_setConnectedPositions","updatePosition","_destroyOverlay","select","_selectYear","_selectMonth","_viewChanged","registerInput","input","registerActions","_componentRef","instance","removeActions","_getFocusedElementPierceShadowDom","_openOverlay","canRestoreFocus","completeClose","location","activeElement","contains","_forwardContentValues","_dialogLabelId","getOverlayLabelId","isDialog","overlayRef","create","OverlayConfig","_getDialogStrategy","_getDropdownStrategy","hasBackdrop","backdropClass","direction","block","_getCloseStream","keydownEvents","attach","dispose","position","global","centerHorizontally","centerVertically","strategy","flexibleConnectedTo","getConnectedOverlayOrigin","withTransformOriginOn","withFlexibleDimensions","withViewportMargin","withLockedPosition","primaryX","secondaryX","primaryY","secondaryY","withPositions","originX","originY","overlayX","overlayY","ctrlShiftMetaModifiers","merge","backdropClick","detachments","filter","every","modifier","i9","ɵdir","inputs","MatDatepicker","t","useExisting","MatDatepickerInputEvent","targetElement","MatDatepickerInputBase","_getValueFromModel","_pendingValue","_assignValueProgrammatically","_parentDisabled","_isInitialized","blur","_getValidators","_parseValidator","_minValidator","_maxValidator","_filterValidator","_registerModel","model","_valueChangesSubscription","_assignValue","_shouldHandleChangeEvent","_lastValueValid","_isValidValue","_cvaOnChange","_onTouched","_formatValue","dateInput","dateChange","_validatorOnChange","_localeSubscription","matDatepickerParse","text","control","controlValue","_matchesFilter","matDatepickerFilter","matDatepickerMin","actual","matDatepickerMax","dateInputsHaveChanged","keys","Object","key","registerOnValidatorChange","fn","validate","c","_validator","writeValue","registerOnChange","registerOnTouched","setDisabledState","isDisabled","_onKeydown","readOnly","_openPopup","_onInput","lastValueWasValid","parse","hasChanged","_onChange","_onBlur","_assignValueToModel","MAT_DATEPICKER_VALUE_ACCESSOR","NG_VALUE_ACCESSOR","MatDatepickerInput","multi","MAT_DATEPICKER_VALIDATORS","NG_VALIDATORS","matDatepicker","_datepicker","_closedSubscription","_min","validValue","_max","_dateFilter","wasMatchingValue","dateFormats","_formField","Validators","getLabelId","modelValue","MAT_FORM_FIELD","MAT_INPUT_VALUE_ACCESSOR","MatDatepickerToggleIcon","MatDatepickerToggle","defaultTabIndex","_stateChanges","parsedTabIndex","Number","tabIndex","_watchStateChanges","_open","datepickerStateChanged","of","inputStateChanged","datepickerToggled","dirIndex","_c2","ngContentSelectors","_c3","MatDatepickerModule","ɵmod","ɵinj","imports","CommonModule","MatButtonModule","OverlayModule","A11yModule","PortalModule","MatCommonModule","CdkScrollableModule"],"sourceRoot":"webpack:///","sources":["./.yarn/__virtual__/@angular-material-virtual-894adb27e5/0/cache/@angular-material-npm-15.2.6-c3a4b7c31c-45a31fd989.zip/node_modules/@angular/material/fesm2020/datepicker.mjs"],"sourcesContent":["import * as i5 from '@angular/cdk/a11y';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport * as i9 from '@angular/cdk/overlay';\nimport { Overlay, FlexibleConnectedPositionStrategy, OverlayConfig, OverlayModule } from '@angular/cdk/overlay';\nimport * as i6 from '@angular/cdk/portal';\nimport { ComponentPortal, TemplatePortal, PortalModule } from '@angular/cdk/portal';\nimport * as i1 from '@angular/common';\nimport { DOCUMENT, CommonModule } from '@angular/common';\nimport * as i0 from '@angular/core';\nimport { Injectable, inject, EventEmitter, Component, ViewEncapsulation, ChangeDetectionStrategy, Input, Output, Optional, SkipSelf, InjectionToken, Inject, ViewChild, forwardRef, Directive, Attribute, ContentChild, Self, TemplateRef, NgModule } from '@angular/core';\nimport * as i3 from '@angular/material/button';\nimport { MatButtonModule } from '@angular/material/button';\nimport { CdkScrollableModule } from '@angular/cdk/scrolling';\nimport * as i1$1 from '@angular/material/core';\nimport { DateAdapter, MAT_DATE_FORMATS, mixinColor, mixinErrorState, MatCommonModule } from '@angular/material/core';\nimport { Subject, Subscription, merge, of } from 'rxjs';\nimport { ESCAPE, hasModifierKey, SPACE, ENTER, PAGE_DOWN, PAGE_UP, END, HOME, DOWN_ARROW, UP_ARROW, RIGHT_ARROW, LEFT_ARROW, BACKSPACE } from '@angular/cdk/keycodes';\nimport * as i2 from '@angular/cdk/bidi';\nimport { Directionality } from '@angular/cdk/bidi';\nimport { Platform, _getFocusedElementPierceShadowDom } from '@angular/cdk/platform';\nimport { take, startWith, filter } from 'rxjs/operators';\nimport { coerceBooleanProperty, coerceStringArray } from '@angular/cdk/coercion';\nimport { trigger, transition, animate, keyframes, style, state } from '@angular/animations';\nimport * as i2$1 from '@angular/forms';\nimport { NG_VALUE_ACCESSOR, NG_VALIDATORS, Validators, NgControl } from '@angular/forms';\nimport { MAT_FORM_FIELD, MatFormFieldControl } from '@angular/material/form-field';\nimport { MAT_INPUT_VALUE_ACCESSOR } from '@angular/material/input';\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** @docs-private */\nfunction createMissingDateImplError(provider) {\n return Error(`MatDatepicker: No provider found for ${provider}. You must import one of the following ` +\n `modules at your application root: MatNativeDateModule, MatMomentDateModule, or provide a ` +\n `custom implementation.`);\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Datepicker data that requires internationalization. */\nclass MatDatepickerIntl {\n constructor() {\n /**\n * Stream that emits whenever the labels here are changed. Use this to notify\n * components if the labels have changed after initialization.\n */\n this.changes = new Subject();\n /** A label for the calendar popup (used by screen readers). */\n this.calendarLabel = 'Calendar';\n /** A label for the button used to open the calendar popup (used by screen readers). */\n this.openCalendarLabel = 'Open calendar';\n /** Label for the button used to close the calendar popup. */\n this.closeCalendarLabel = 'Close calendar';\n /** A label for the previous month button (used by screen readers). */\n this.prevMonthLabel = 'Previous month';\n /** A label for the next month button (used by screen readers). */\n this.nextMonthLabel = 'Next month';\n /** A label for the previous year button (used by screen readers). */\n this.prevYearLabel = 'Previous year';\n /** A label for the next year button (used by screen readers). */\n this.nextYearLabel = 'Next year';\n /** A label for the previous multi-year button (used by screen readers). */\n this.prevMultiYearLabel = 'Previous 24 years';\n /** A label for the next multi-year button (used by screen readers). */\n this.nextMultiYearLabel = 'Next 24 years';\n /** A label for the 'switch to month view' button (used by screen readers). */\n this.switchToMonthViewLabel = 'Choose date';\n /** A label for the 'switch to year view' button (used by screen readers). */\n this.switchToMultiYearViewLabel = 'Choose month and year';\n /**\n * A label for the first date of a range of dates (used by screen readers).\n * @deprecated Provide your own internationalization string.\n * @breaking-change 17.0.0\n */\n this.startDateLabel = 'Start date';\n /**\n * A label for the last date of a range of dates (used by screen readers).\n * @deprecated Provide your own internationalization string.\n * @breaking-change 17.0.0\n */\n this.endDateLabel = 'End date';\n }\n /** Formats a range of years (used for visuals). */\n formatYearRange(start, end) {\n return `${start} \\u2013 ${end}`;\n }\n /** Formats a label for a range of years (used by screen readers). */\n formatYearRangeLabel(start, end) {\n return `${start} to ${end}`;\n }\n}\nMatDatepickerIntl.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerIntl, deps: [], target: i0.ɵɵFactoryTarget.Injectable });\nMatDatepickerIntl.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerIntl, providedIn: 'root' });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerIntl, decorators: [{\n type: Injectable,\n args: [{ providedIn: 'root' }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * An internal class that represents the data corresponding to a single calendar cell.\n * @docs-private\n */\nclass MatCalendarCell {\n constructor(value, displayValue, ariaLabel, enabled, cssClasses = {}, compareValue = value, rawValue) {\n this.value = value;\n this.displayValue = displayValue;\n this.ariaLabel = ariaLabel;\n this.enabled = enabled;\n this.cssClasses = cssClasses;\n this.compareValue = compareValue;\n this.rawValue = rawValue;\n }\n}\nlet calendarBodyId = 1;\n/**\n * An internal component used to display calendar data in a table.\n * @docs-private\n */\nclass MatCalendarBody {\n ngAfterViewChecked() {\n if (this._focusActiveCellAfterViewChecked) {\n this._focusActiveCell();\n this._focusActiveCellAfterViewChecked = false;\n }\n }\n constructor(_elementRef, _ngZone) {\n this._elementRef = _elementRef;\n this._ngZone = _ngZone;\n this._platform = inject(Platform);\n /**\n * Used to focus the active cell after change detection has run.\n */\n this._focusActiveCellAfterViewChecked = false;\n /** The number of columns in the table. */\n this.numCols = 7;\n /** The cell number of the active cell in the table. */\n this.activeCell = 0;\n /** Whether a range is being selected. */\n this.isRange = false;\n /**\n * The aspect ratio (width / height) to use for the cells in the table. This aspect ratio will be\n * maintained even as the table resizes.\n */\n this.cellAspectRatio = 1;\n /** Start of the preview range. */\n this.previewStart = null;\n /** End of the preview range. */\n this.previewEnd = null;\n /** Emits when a new value is selected. */\n this.selectedValueChange = new EventEmitter();\n /** Emits when the preview has changed as a result of a user action. */\n this.previewChange = new EventEmitter();\n this.activeDateChange = new EventEmitter();\n /** Emits the date at the possible start of a drag event. */\n this.dragStarted = new EventEmitter();\n /** Emits the date at the conclusion of a drag, or null if mouse was not released on a date. */\n this.dragEnded = new EventEmitter();\n this._didDragSinceMouseDown = false;\n /**\n * Event handler for when the user enters an element\n * inside the calendar body (e.g. by hovering in or focus).\n */\n this._enterHandler = (event) => {\n if (this._skipNextFocus && event.type === 'focus') {\n this._skipNextFocus = false;\n return;\n }\n // We only need to hit the zone when we're selecting a range.\n if (event.target && this.isRange) {\n const cell = this._getCellFromElement(event.target);\n if (cell) {\n this._ngZone.run(() => this.previewChange.emit({ value: cell.enabled ? cell : null, event }));\n }\n }\n };\n this._touchmoveHandler = (event) => {\n if (!this.isRange)\n return;\n const target = getActualTouchTarget(event);\n const cell = target ? this._getCellFromElement(target) : null;\n if (target !== event.target) {\n this._didDragSinceMouseDown = true;\n }\n // If the initial target of the touch is a date cell, prevent default so\n // that the move is not handled as a scroll.\n if (getCellElement(event.target)) {\n event.preventDefault();\n }\n this._ngZone.run(() => this.previewChange.emit({ value: cell?.enabled ? cell : null, event }));\n };\n /**\n * Event handler for when the user's pointer leaves an element\n * inside the calendar body (e.g. by hovering out or blurring).\n */\n this._leaveHandler = (event) => {\n // We only need to hit the zone when we're selecting a range.\n if (this.previewEnd !== null && this.isRange) {\n if (event.type !== 'blur') {\n this._didDragSinceMouseDown = true;\n }\n // Only reset the preview end value when leaving cells. This looks better, because\n // we have a gap between the cells and the rows and we don't want to remove the\n // range just for it to show up again when the user moves a few pixels to the side.\n if (event.target &&\n this._getCellFromElement(event.target) &&\n !(event.relatedTarget &&\n this._getCellFromElement(event.relatedTarget))) {\n this._ngZone.run(() => this.previewChange.emit({ value: null, event }));\n }\n }\n };\n /**\n * Triggered on mousedown or touchstart on a date cell.\n * Respsonsible for starting a drag sequence.\n */\n this._mousedownHandler = (event) => {\n if (!this.isRange)\n return;\n this._didDragSinceMouseDown = false;\n // Begin a drag if a cell within the current range was targeted.\n const cell = event.target && this._getCellFromElement(event.target);\n if (!cell || !this._isInRange(cell.rawValue)) {\n return;\n }\n this._ngZone.run(() => {\n this.dragStarted.emit({\n value: cell.rawValue,\n event,\n });\n });\n };\n /** Triggered on mouseup anywhere. Respsonsible for ending a drag sequence. */\n this._mouseupHandler = (event) => {\n if (!this.isRange)\n return;\n const cellElement = getCellElement(event.target);\n if (!cellElement) {\n // Mouseup happened outside of datepicker. Cancel drag.\n this._ngZone.run(() => {\n this.dragEnded.emit({ value: null, event });\n });\n return;\n }\n if (cellElement.closest('.mat-calendar-body') !== this._elementRef.nativeElement) {\n // Mouseup happened inside a different month instance.\n // Allow it to handle the event.\n return;\n }\n this._ngZone.run(() => {\n const cell = this._getCellFromElement(cellElement);\n this.dragEnded.emit({ value: cell?.rawValue ?? null, event });\n });\n };\n /** Triggered on touchend anywhere. Respsonsible for ending a drag sequence. */\n this._touchendHandler = (event) => {\n const target = getActualTouchTarget(event);\n if (target) {\n this._mouseupHandler({ target });\n }\n };\n this._id = `mat-calendar-body-${calendarBodyId++}`;\n this._startDateLabelId = `${this._id}-start-date`;\n this._endDateLabelId = `${this._id}-end-date`;\n _ngZone.runOutsideAngular(() => {\n const element = _elementRef.nativeElement;\n element.addEventListener('mouseenter', this._enterHandler, true);\n element.addEventListener('touchmove', this._touchmoveHandler, true);\n element.addEventListener('focus', this._enterHandler, true);\n element.addEventListener('mouseleave', this._leaveHandler, true);\n element.addEventListener('blur', this._leaveHandler, true);\n element.addEventListener('mousedown', this._mousedownHandler);\n element.addEventListener('touchstart', this._mousedownHandler);\n if (this._platform.isBrowser) {\n window.addEventListener('mouseup', this._mouseupHandler);\n window.addEventListener('touchend', this._touchendHandler);\n }\n });\n }\n /** Called when a cell is clicked. */\n _cellClicked(cell, event) {\n // Ignore \"clicks\" that are actually canceled drags (eg the user dragged\n // off and then went back to this cell to undo).\n if (this._didDragSinceMouseDown) {\n return;\n }\n if (cell.enabled) {\n this.selectedValueChange.emit({ value: cell.value, event });\n }\n }\n _emitActiveDateChange(cell, event) {\n if (cell.enabled) {\n this.activeDateChange.emit({ value: cell.value, event });\n }\n }\n /** Returns whether a cell should be marked as selected. */\n _isSelected(value) {\n return this.startValue === value || this.endValue === value;\n }\n ngOnChanges(changes) {\n const columnChanges = changes['numCols'];\n const { rows, numCols } = this;\n if (changes['rows'] || columnChanges) {\n this._firstRowOffset = rows && rows.length && rows[0].length ? numCols - rows[0].length : 0;\n }\n if (changes['cellAspectRatio'] || columnChanges || !this._cellPadding) {\n this._cellPadding = `${(50 * this.cellAspectRatio) / numCols}%`;\n }\n if (columnChanges || !this._cellWidth) {\n this._cellWidth = `${100 / numCols}%`;\n }\n }\n ngOnDestroy() {\n const element = this._elementRef.nativeElement;\n element.removeEventListener('mouseenter', this._enterHandler, true);\n element.removeEventListener('touchmove', this._touchmoveHandler, true);\n element.removeEventListener('focus', this._enterHandler, true);\n element.removeEventListener('mouseleave', this._leaveHandler, true);\n element.removeEventListener('blur', this._leaveHandler, true);\n element.removeEventListener('mousedown', this._mousedownHandler);\n element.removeEventListener('touchstart', this._mousedownHandler);\n if (this._platform.isBrowser) {\n window.removeEventListener('mouseup', this._mouseupHandler);\n window.removeEventListener('touchend', this._touchendHandler);\n }\n }\n /** Returns whether a cell is active. */\n _isActiveCell(rowIndex, colIndex) {\n let cellNumber = rowIndex * this.numCols + colIndex;\n // Account for the fact that the first row may not have as many cells.\n if (rowIndex) {\n cellNumber -= this._firstRowOffset;\n }\n return cellNumber == this.activeCell;\n }\n /**\n * Focuses the active cell after the microtask queue is empty.\n *\n * Adding a 0ms setTimeout seems to fix Voiceover losing focus when pressing PageUp/PageDown\n * (issue #24330).\n *\n * Determined a 0ms by gradually increasing duration from 0 and testing two use cases with screen\n * reader enabled:\n *\n * 1. Pressing PageUp/PageDown repeatedly with pausing between each key press.\n * 2. Pressing and holding the PageDown key with repeated keys enabled.\n *\n * Test 1 worked roughly 95-99% of the time with 0ms and got a little bit better as the duration\n * increased. Test 2 got slightly better until the duration was long enough to interfere with\n * repeated keys. If the repeated key speed was faster than the timeout duration, then pressing\n * and holding pagedown caused the entire page to scroll.\n *\n * Since repeated key speed can verify across machines, determined that any duration could\n * potentially interfere with repeated keys. 0ms would be best because it almost entirely\n * eliminates the focus being lost in Voiceover (#24330) without causing unintended side effects.\n * Adding delay also complicates writing tests.\n */\n _focusActiveCell(movePreview = true) {\n this._ngZone.runOutsideAngular(() => {\n this._ngZone.onStable.pipe(take(1)).subscribe(() => {\n setTimeout(() => {\n const activeCell = this._elementRef.nativeElement.querySelector('.mat-calendar-body-active');\n if (activeCell) {\n if (!movePreview) {\n this._skipNextFocus = true;\n }\n activeCell.focus();\n }\n });\n });\n });\n }\n /** Focuses the active cell after change detection has run and the microtask queue is empty. */\n _scheduleFocusActiveCellAfterViewChecked() {\n this._focusActiveCellAfterViewChecked = true;\n }\n /** Gets whether a value is the start of the main range. */\n _isRangeStart(value) {\n return isStart(value, this.startValue, this.endValue);\n }\n /** Gets whether a value is the end of the main range. */\n _isRangeEnd(value) {\n return isEnd(value, this.startValue, this.endValue);\n }\n /** Gets whether a value is within the currently-selected range. */\n _isInRange(value) {\n return isInRange(value, this.startValue, this.endValue, this.isRange);\n }\n /** Gets whether a value is the start of the comparison range. */\n _isComparisonStart(value) {\n return isStart(value, this.comparisonStart, this.comparisonEnd);\n }\n /** Whether the cell is a start bridge cell between the main and comparison ranges. */\n _isComparisonBridgeStart(value, rowIndex, colIndex) {\n if (!this._isComparisonStart(value) || this._isRangeStart(value) || !this._isInRange(value)) {\n return false;\n }\n let previousCell = this.rows[rowIndex][colIndex - 1];\n if (!previousCell) {\n const previousRow = this.rows[rowIndex - 1];\n previousCell = previousRow && previousRow[previousRow.length - 1];\n }\n return previousCell && !this._isRangeEnd(previousCell.compareValue);\n }\n /** Whether the cell is an end bridge cell between the main and comparison ranges. */\n _isComparisonBridgeEnd(value, rowIndex, colIndex) {\n if (!this._isComparisonEnd(value) || this._isRangeEnd(value) || !this._isInRange(value)) {\n return false;\n }\n let nextCell = this.rows[rowIndex][colIndex + 1];\n if (!nextCell) {\n const nextRow = this.rows[rowIndex + 1];\n nextCell = nextRow && nextRow[0];\n }\n return nextCell && !this._isRangeStart(nextCell.compareValue);\n }\n /** Gets whether a value is the end of the comparison range. */\n _isComparisonEnd(value) {\n return isEnd(value, this.comparisonStart, this.comparisonEnd);\n }\n /** Gets whether a value is within the current comparison range. */\n _isInComparisonRange(value) {\n return isInRange(value, this.comparisonStart, this.comparisonEnd, this.isRange);\n }\n /**\n * Gets whether a value is the same as the start and end of the comparison range.\n * For context, the functions that we use to determine whether something is the start/end of\n * a range don't allow for the start and end to be on the same day, because we'd have to use\n * much more specific CSS selectors to style them correctly in all scenarios. This is fine for\n * the regular range, because when it happens, the selected styles take over and still show where\n * the range would've been, however we don't have these selected styles for a comparison range.\n * This function is used to apply a class that serves the same purpose as the one for selected\n * dates, but it only applies in the context of a comparison range.\n */\n _isComparisonIdentical(value) {\n // Note that we don't need to null check the start/end\n // here, because the `value` will always be defined.\n return this.comparisonStart === this.comparisonEnd && value === this.comparisonStart;\n }\n /** Gets whether a value is the start of the preview range. */\n _isPreviewStart(value) {\n return isStart(value, this.previewStart, this.previewEnd);\n }\n /** Gets whether a value is the end of the preview range. */\n _isPreviewEnd(value) {\n return isEnd(value, this.previewStart, this.previewEnd);\n }\n /** Gets whether a value is inside the preview range. */\n _isInPreview(value) {\n return isInRange(value, this.previewStart, this.previewEnd, this.isRange);\n }\n /** Gets ids of aria descriptions for the start and end of a date range. */\n _getDescribedby(value) {\n if (!this.isRange) {\n return null;\n }\n if (this.startValue === value && this.endValue === value) {\n return `${this._startDateLabelId} ${this._endDateLabelId}`;\n }\n else if (this.startValue === value) {\n return this._startDateLabelId;\n }\n else if (this.endValue === value) {\n return this._endDateLabelId;\n }\n return null;\n }\n /** Finds the MatCalendarCell that corresponds to a DOM node. */\n _getCellFromElement(element) {\n const cell = getCellElement(element);\n if (cell) {\n const row = cell.getAttribute('data-mat-row');\n const col = cell.getAttribute('data-mat-col');\n if (row && col) {\n return this.rows[parseInt(row)][parseInt(col)];\n }\n }\n return null;\n }\n}\nMatCalendarBody.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatCalendarBody, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });\nMatCalendarBody.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatCalendarBody, selector: \"[mat-calendar-body]\", inputs: { label: \"label\", rows: \"rows\", todayValue: \"todayValue\", startValue: \"startValue\", endValue: \"endValue\", labelMinRequiredCells: \"labelMinRequiredCells\", numCols: \"numCols\", activeCell: \"activeCell\", isRange: \"isRange\", cellAspectRatio: \"cellAspectRatio\", comparisonStart: \"comparisonStart\", comparisonEnd: \"comparisonEnd\", previewStart: \"previewStart\", previewEnd: \"previewEnd\", startDateAccessibleName: \"startDateAccessibleName\", endDateAccessibleName: \"endDateAccessibleName\" }, outputs: { selectedValueChange: \"selectedValueChange\", previewChange: \"previewChange\", activeDateChange: \"activeDateChange\", dragStarted: \"dragStarted\", dragEnded: \"dragEnded\" }, host: { classAttribute: \"mat-calendar-body\" }, exportAs: [\"matCalendarBody\"], usesOnChanges: true, ngImport: i0, template: \"\\n\\n \\n {{label}}\\n \\n\\n\\n\\n\\n \\n \\n {{_firstRowOffset >= labelMinRequiredCells ? label : ''}}\\n \\n \\n \\n \\n \\n {{item.displayValue}}\\n \\n \\n \\n \\n\\n\\n\\n\\n\", styles: [\".mat-calendar-body{min-width:224px}.mat-calendar-body-label{height:0;line-height:0;text-align:left;padding-left:4.7142857143%;padding-right:4.7142857143%}.mat-calendar-body-hidden-label{display:none}.mat-calendar-body-cell-container{position:relative;height:0;line-height:0}.mat-calendar-body-cell{-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:rgba(0,0,0,0);position:absolute;top:0;left:0;width:100%;height:100%;background:none;text-align:center;outline:none;font-family:inherit;margin:0}.mat-calendar-body-cell::-moz-focus-inner{border:0}.mat-calendar-body-cell::before,.mat-calendar-body-cell::after,.mat-calendar-body-cell-preview{content:\\\"\\\";position:absolute;top:5%;left:0;z-index:0;box-sizing:border-box;display:block;height:90%;width:100%}.mat-calendar-body-range-start:not(.mat-calendar-body-in-comparison-range)::before,.mat-calendar-body-range-start::after,.mat-calendar-body-comparison-start:not(.mat-calendar-body-comparison-bridge-start)::before,.mat-calendar-body-comparison-start::after,.mat-calendar-body-preview-start .mat-calendar-body-cell-preview{left:5%;width:95%;border-top-left-radius:999px;border-bottom-left-radius:999px}[dir=rtl] .mat-calendar-body-range-start:not(.mat-calendar-body-in-comparison-range)::before,[dir=rtl] .mat-calendar-body-range-start::after,[dir=rtl] .mat-calendar-body-comparison-start:not(.mat-calendar-body-comparison-bridge-start)::before,[dir=rtl] .mat-calendar-body-comparison-start::after,[dir=rtl] .mat-calendar-body-preview-start .mat-calendar-body-cell-preview{left:0;border-radius:0;border-top-right-radius:999px;border-bottom-right-radius:999px}.mat-calendar-body-range-end:not(.mat-calendar-body-in-comparison-range)::before,.mat-calendar-body-range-end::after,.mat-calendar-body-comparison-end:not(.mat-calendar-body-comparison-bridge-end)::before,.mat-calendar-body-comparison-end::after,.mat-calendar-body-preview-end .mat-calendar-body-cell-preview{width:95%;border-top-right-radius:999px;border-bottom-right-radius:999px}[dir=rtl] .mat-calendar-body-range-end:not(.mat-calendar-body-in-comparison-range)::before,[dir=rtl] .mat-calendar-body-range-end::after,[dir=rtl] .mat-calendar-body-comparison-end:not(.mat-calendar-body-comparison-bridge-end)::before,[dir=rtl] .mat-calendar-body-comparison-end::after,[dir=rtl] .mat-calendar-body-preview-end .mat-calendar-body-cell-preview{left:5%;border-radius:0;border-top-left-radius:999px;border-bottom-left-radius:999px}[dir=rtl] .mat-calendar-body-comparison-bridge-start.mat-calendar-body-range-end::after,[dir=rtl] .mat-calendar-body-comparison-bridge-end.mat-calendar-body-range-start::after{width:95%;border-top-right-radius:999px;border-bottom-right-radius:999px}.mat-calendar-body-comparison-start.mat-calendar-body-range-end::after,[dir=rtl] .mat-calendar-body-comparison-start.mat-calendar-body-range-end::after,.mat-calendar-body-comparison-end.mat-calendar-body-range-start::after,[dir=rtl] .mat-calendar-body-comparison-end.mat-calendar-body-range-start::after{width:90%}.mat-calendar-body-in-preview .mat-calendar-body-cell-preview{border-top:dashed 1px;border-bottom:dashed 1px}.mat-calendar-body-preview-start .mat-calendar-body-cell-preview{border-left:dashed 1px}[dir=rtl] .mat-calendar-body-preview-start .mat-calendar-body-cell-preview{border-left:0;border-right:dashed 1px}.mat-calendar-body-preview-end .mat-calendar-body-cell-preview{border-right:dashed 1px}[dir=rtl] .mat-calendar-body-preview-end .mat-calendar-body-cell-preview{border-right:0;border-left:dashed 1px}.mat-calendar-body-disabled{cursor:default}.cdk-high-contrast-active .mat-calendar-body-disabled{opacity:.5}.mat-calendar-body-cell-content{top:5%;left:5%;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:90%;height:90%;line-height:1;border-width:1px;border-style:solid;border-radius:999px}.mat-calendar-body-cell-content.mat-focus-indicator{position:absolute}.cdk-high-contrast-active .mat-calendar-body-cell-content{border:none}.cdk-high-contrast-active .mat-datepicker-popup:not(:empty),.cdk-high-contrast-active .mat-calendar-body-cell:not(.mat-calendar-body-in-range) .mat-calendar-body-selected{outline:solid 1px}.cdk-high-contrast-active .mat-calendar-body-today{outline:dotted 1px}.cdk-high-contrast-active .mat-calendar-body-cell::before,.cdk-high-contrast-active .mat-calendar-body-cell::after,.cdk-high-contrast-active .mat-calendar-body-selected{background:none}.cdk-high-contrast-active .mat-calendar-body-in-range::before,.cdk-high-contrast-active .mat-calendar-body-comparison-bridge-start::before,.cdk-high-contrast-active .mat-calendar-body-comparison-bridge-end::before{border-top:solid 1px;border-bottom:solid 1px}.cdk-high-contrast-active .mat-calendar-body-range-start::before{border-left:solid 1px}[dir=rtl] .cdk-high-contrast-active .mat-calendar-body-range-start::before{border-left:0;border-right:solid 1px}.cdk-high-contrast-active .mat-calendar-body-range-end::before{border-right:solid 1px}[dir=rtl] .cdk-high-contrast-active .mat-calendar-body-range-end::before{border-right:0;border-left:solid 1px}.cdk-high-contrast-active .mat-calendar-body-in-comparison-range::before{border-top:dashed 1px;border-bottom:dashed 1px}.cdk-high-contrast-active .mat-calendar-body-comparison-start::before{border-left:dashed 1px}[dir=rtl] .cdk-high-contrast-active .mat-calendar-body-comparison-start::before{border-left:0;border-right:dashed 1px}.cdk-high-contrast-active .mat-calendar-body-comparison-end::before{border-right:dashed 1px}[dir=rtl] .cdk-high-contrast-active .mat-calendar-body-comparison-end::before{border-right:0;border-left:dashed 1px}[dir=rtl] .mat-calendar-body-label{text-align:right}\"], dependencies: [{ kind: \"directive\", type: i1.NgClass, selector: \"[ngClass]\", inputs: [\"class\", \"ngClass\"] }, { kind: \"directive\", type: i1.NgForOf, selector: \"[ngFor][ngForOf]\", inputs: [\"ngForOf\", \"ngForTrackBy\", \"ngForTemplate\"] }, { kind: \"directive\", type: i1.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatCalendarBody, decorators: [{\n type: Component,\n args: [{ selector: '[mat-calendar-body]', host: {\n 'class': 'mat-calendar-body',\n }, exportAs: 'matCalendarBody', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"\\n\\n \\n {{label}}\\n \\n\\n\\n\\n\\n \\n \\n {{_firstRowOffset >= labelMinRequiredCells ? label : ''}}\\n \\n \\n \\n \\n \\n {{item.displayValue}}\\n \\n \\n \\n \\n\\n\\n\\n\\n\", styles: [\".mat-calendar-body{min-width:224px}.mat-calendar-body-label{height:0;line-height:0;text-align:left;padding-left:4.7142857143%;padding-right:4.7142857143%}.mat-calendar-body-hidden-label{display:none}.mat-calendar-body-cell-container{position:relative;height:0;line-height:0}.mat-calendar-body-cell{-webkit-user-select:none;user-select:none;cursor:pointer;outline:none;border:none;-webkit-tap-highlight-color:rgba(0,0,0,0);position:absolute;top:0;left:0;width:100%;height:100%;background:none;text-align:center;outline:none;font-family:inherit;margin:0}.mat-calendar-body-cell::-moz-focus-inner{border:0}.mat-calendar-body-cell::before,.mat-calendar-body-cell::after,.mat-calendar-body-cell-preview{content:\\\"\\\";position:absolute;top:5%;left:0;z-index:0;box-sizing:border-box;display:block;height:90%;width:100%}.mat-calendar-body-range-start:not(.mat-calendar-body-in-comparison-range)::before,.mat-calendar-body-range-start::after,.mat-calendar-body-comparison-start:not(.mat-calendar-body-comparison-bridge-start)::before,.mat-calendar-body-comparison-start::after,.mat-calendar-body-preview-start .mat-calendar-body-cell-preview{left:5%;width:95%;border-top-left-radius:999px;border-bottom-left-radius:999px}[dir=rtl] .mat-calendar-body-range-start:not(.mat-calendar-body-in-comparison-range)::before,[dir=rtl] .mat-calendar-body-range-start::after,[dir=rtl] .mat-calendar-body-comparison-start:not(.mat-calendar-body-comparison-bridge-start)::before,[dir=rtl] .mat-calendar-body-comparison-start::after,[dir=rtl] .mat-calendar-body-preview-start .mat-calendar-body-cell-preview{left:0;border-radius:0;border-top-right-radius:999px;border-bottom-right-radius:999px}.mat-calendar-body-range-end:not(.mat-calendar-body-in-comparison-range)::before,.mat-calendar-body-range-end::after,.mat-calendar-body-comparison-end:not(.mat-calendar-body-comparison-bridge-end)::before,.mat-calendar-body-comparison-end::after,.mat-calendar-body-preview-end .mat-calendar-body-cell-preview{width:95%;border-top-right-radius:999px;border-bottom-right-radius:999px}[dir=rtl] .mat-calendar-body-range-end:not(.mat-calendar-body-in-comparison-range)::before,[dir=rtl] .mat-calendar-body-range-end::after,[dir=rtl] .mat-calendar-body-comparison-end:not(.mat-calendar-body-comparison-bridge-end)::before,[dir=rtl] .mat-calendar-body-comparison-end::after,[dir=rtl] .mat-calendar-body-preview-end .mat-calendar-body-cell-preview{left:5%;border-radius:0;border-top-left-radius:999px;border-bottom-left-radius:999px}[dir=rtl] .mat-calendar-body-comparison-bridge-start.mat-calendar-body-range-end::after,[dir=rtl] .mat-calendar-body-comparison-bridge-end.mat-calendar-body-range-start::after{width:95%;border-top-right-radius:999px;border-bottom-right-radius:999px}.mat-calendar-body-comparison-start.mat-calendar-body-range-end::after,[dir=rtl] .mat-calendar-body-comparison-start.mat-calendar-body-range-end::after,.mat-calendar-body-comparison-end.mat-calendar-body-range-start::after,[dir=rtl] .mat-calendar-body-comparison-end.mat-calendar-body-range-start::after{width:90%}.mat-calendar-body-in-preview .mat-calendar-body-cell-preview{border-top:dashed 1px;border-bottom:dashed 1px}.mat-calendar-body-preview-start .mat-calendar-body-cell-preview{border-left:dashed 1px}[dir=rtl] .mat-calendar-body-preview-start .mat-calendar-body-cell-preview{border-left:0;border-right:dashed 1px}.mat-calendar-body-preview-end .mat-calendar-body-cell-preview{border-right:dashed 1px}[dir=rtl] .mat-calendar-body-preview-end .mat-calendar-body-cell-preview{border-right:0;border-left:dashed 1px}.mat-calendar-body-disabled{cursor:default}.cdk-high-contrast-active .mat-calendar-body-disabled{opacity:.5}.mat-calendar-body-cell-content{top:5%;left:5%;z-index:1;display:flex;align-items:center;justify-content:center;box-sizing:border-box;width:90%;height:90%;line-height:1;border-width:1px;border-style:solid;border-radius:999px}.mat-calendar-body-cell-content.mat-focus-indicator{position:absolute}.cdk-high-contrast-active .mat-calendar-body-cell-content{border:none}.cdk-high-contrast-active .mat-datepicker-popup:not(:empty),.cdk-high-contrast-active .mat-calendar-body-cell:not(.mat-calendar-body-in-range) .mat-calendar-body-selected{outline:solid 1px}.cdk-high-contrast-active .mat-calendar-body-today{outline:dotted 1px}.cdk-high-contrast-active .mat-calendar-body-cell::before,.cdk-high-contrast-active .mat-calendar-body-cell::after,.cdk-high-contrast-active .mat-calendar-body-selected{background:none}.cdk-high-contrast-active .mat-calendar-body-in-range::before,.cdk-high-contrast-active .mat-calendar-body-comparison-bridge-start::before,.cdk-high-contrast-active .mat-calendar-body-comparison-bridge-end::before{border-top:solid 1px;border-bottom:solid 1px}.cdk-high-contrast-active .mat-calendar-body-range-start::before{border-left:solid 1px}[dir=rtl] .cdk-high-contrast-active .mat-calendar-body-range-start::before{border-left:0;border-right:solid 1px}.cdk-high-contrast-active .mat-calendar-body-range-end::before{border-right:solid 1px}[dir=rtl] .cdk-high-contrast-active .mat-calendar-body-range-end::before{border-right:0;border-left:solid 1px}.cdk-high-contrast-active .mat-calendar-body-in-comparison-range::before{border-top:dashed 1px;border-bottom:dashed 1px}.cdk-high-contrast-active .mat-calendar-body-comparison-start::before{border-left:dashed 1px}[dir=rtl] .cdk-high-contrast-active .mat-calendar-body-comparison-start::before{border-left:0;border-right:dashed 1px}.cdk-high-contrast-active .mat-calendar-body-comparison-end::before{border-right:dashed 1px}[dir=rtl] .cdk-high-contrast-active .mat-calendar-body-comparison-end::before{border-right:0;border-left:dashed 1px}[dir=rtl] .mat-calendar-body-label{text-align:right}\"] }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }]; }, propDecorators: { label: [{\n type: Input\n }], rows: [{\n type: Input\n }], todayValue: [{\n type: Input\n }], startValue: [{\n type: Input\n }], endValue: [{\n type: Input\n }], labelMinRequiredCells: [{\n type: Input\n }], numCols: [{\n type: Input\n }], activeCell: [{\n type: Input\n }], isRange: [{\n type: Input\n }], cellAspectRatio: [{\n type: Input\n }], comparisonStart: [{\n type: Input\n }], comparisonEnd: [{\n type: Input\n }], previewStart: [{\n type: Input\n }], previewEnd: [{\n type: Input\n }], startDateAccessibleName: [{\n type: Input\n }], endDateAccessibleName: [{\n type: Input\n }], selectedValueChange: [{\n type: Output\n }], previewChange: [{\n type: Output\n }], activeDateChange: [{\n type: Output\n }], dragStarted: [{\n type: Output\n }], dragEnded: [{\n type: Output\n }] } });\n/** Checks whether a node is a table cell element. */\nfunction isTableCell(node) {\n return node?.nodeName === 'TD';\n}\n/**\n * Gets the date table cell element that is or contains the specified element.\n * Or returns null if element is not part of a date cell.\n */\nfunction getCellElement(element) {\n let cell;\n if (isTableCell(element)) {\n cell = element;\n }\n else if (isTableCell(element.parentNode)) {\n cell = element.parentNode;\n }\n else if (isTableCell(element.parentNode?.parentNode)) {\n cell = element.parentNode.parentNode;\n }\n return cell?.getAttribute('data-mat-row') != null ? cell : null;\n}\n/** Checks whether a value is the start of a range. */\nfunction isStart(value, start, end) {\n return end !== null && start !== end && value < end && value === start;\n}\n/** Checks whether a value is the end of a range. */\nfunction isEnd(value, start, end) {\n return start !== null && start !== end && value >= start && value === end;\n}\n/** Checks whether a value is inside of a range. */\nfunction isInRange(value, start, end, rangeEnabled) {\n return (rangeEnabled &&\n start !== null &&\n end !== null &&\n start !== end &&\n value >= start &&\n value <= end);\n}\n/**\n * Extracts the element that actually corresponds to a touch event's location\n * (rather than the element that initiated the sequence of touch events).\n */\nfunction getActualTouchTarget(event) {\n const touchLocation = event.changedTouches[0];\n return document.elementFromPoint(touchLocation.clientX, touchLocation.clientY);\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** A class representing a range of dates. */\nclass DateRange {\n constructor(\n /** The start date of the range. */\n start, \n /** The end date of the range. */\n end) {\n this.start = start;\n this.end = end;\n }\n}\n/**\n * A selection model containing a date selection.\n * @docs-private\n */\nclass MatDateSelectionModel {\n constructor(\n /** The current selection. */\n selection, _adapter) {\n this.selection = selection;\n this._adapter = _adapter;\n this._selectionChanged = new Subject();\n /** Emits when the selection has changed. */\n this.selectionChanged = this._selectionChanged;\n this.selection = selection;\n }\n /**\n * Updates the current selection in the model.\n * @param value New selection that should be assigned.\n * @param source Object that triggered the selection change.\n */\n updateSelection(value, source) {\n const oldValue = this.selection;\n this.selection = value;\n this._selectionChanged.next({ selection: value, source, oldValue });\n }\n ngOnDestroy() {\n this._selectionChanged.complete();\n }\n _isValidDateInstance(date) {\n return this._adapter.isDateInstance(date) && this._adapter.isValid(date);\n }\n}\nMatDateSelectionModel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDateSelectionModel, deps: \"invalid\", target: i0.ɵɵFactoryTarget.Injectable });\nMatDateSelectionModel.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDateSelectionModel });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDateSelectionModel, decorators: [{\n type: Injectable\n }], ctorParameters: function () { return [{ type: undefined }, { type: i1$1.DateAdapter }]; } });\n/**\n * A selection model that contains a single date.\n * @docs-private\n */\nclass MatSingleDateSelectionModel extends MatDateSelectionModel {\n constructor(adapter) {\n super(null, adapter);\n }\n /**\n * Adds a date to the current selection. In the case of a single date selection, the added date\n * simply overwrites the previous selection\n */\n add(date) {\n super.updateSelection(date, this);\n }\n /** Checks whether the current selection is valid. */\n isValid() {\n return this.selection != null && this._isValidDateInstance(this.selection);\n }\n /**\n * Checks whether the current selection is complete. In the case of a single date selection, this\n * is true if the current selection is not null.\n */\n isComplete() {\n return this.selection != null;\n }\n /** Clones the selection model. */\n clone() {\n const clone = new MatSingleDateSelectionModel(this._adapter);\n clone.updateSelection(this.selection, this);\n return clone;\n }\n}\nMatSingleDateSelectionModel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatSingleDateSelectionModel, deps: [{ token: i1$1.DateAdapter }], target: i0.ɵɵFactoryTarget.Injectable });\nMatSingleDateSelectionModel.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatSingleDateSelectionModel });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatSingleDateSelectionModel, decorators: [{\n type: Injectable\n }], ctorParameters: function () { return [{ type: i1$1.DateAdapter }]; } });\n/**\n * A selection model that contains a date range.\n * @docs-private\n */\nclass MatRangeDateSelectionModel extends MatDateSelectionModel {\n constructor(adapter) {\n super(new DateRange(null, null), adapter);\n }\n /**\n * Adds a date to the current selection. In the case of a date range selection, the added date\n * fills in the next `null` value in the range. If both the start and the end already have a date,\n * the selection is reset so that the given date is the new `start` and the `end` is null.\n */\n add(date) {\n let { start, end } = this.selection;\n if (start == null) {\n start = date;\n }\n else if (end == null) {\n end = date;\n }\n else {\n start = date;\n end = null;\n }\n super.updateSelection(new DateRange(start, end), this);\n }\n /** Checks whether the current selection is valid. */\n isValid() {\n const { start, end } = this.selection;\n // Empty ranges are valid.\n if (start == null && end == null) {\n return true;\n }\n // Complete ranges are only valid if both dates are valid and the start is before the end.\n if (start != null && end != null) {\n return (this._isValidDateInstance(start) &&\n this._isValidDateInstance(end) &&\n this._adapter.compareDate(start, end) <= 0);\n }\n // Partial ranges are valid if the start/end is valid.\n return ((start == null || this._isValidDateInstance(start)) &&\n (end == null || this._isValidDateInstance(end)));\n }\n /**\n * Checks whether the current selection is complete. In the case of a date range selection, this\n * is true if the current selection has a non-null `start` and `end`.\n */\n isComplete() {\n return this.selection.start != null && this.selection.end != null;\n }\n /** Clones the selection model. */\n clone() {\n const clone = new MatRangeDateSelectionModel(this._adapter);\n clone.updateSelection(this.selection, this);\n return clone;\n }\n}\nMatRangeDateSelectionModel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatRangeDateSelectionModel, deps: [{ token: i1$1.DateAdapter }], target: i0.ɵɵFactoryTarget.Injectable });\nMatRangeDateSelectionModel.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatRangeDateSelectionModel });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatRangeDateSelectionModel, decorators: [{\n type: Injectable\n }], ctorParameters: function () { return [{ type: i1$1.DateAdapter }]; } });\n/** @docs-private */\nfunction MAT_SINGLE_DATE_SELECTION_MODEL_FACTORY(parent, adapter) {\n return parent || new MatSingleDateSelectionModel(adapter);\n}\n/**\n * Used to provide a single selection model to a component.\n * @docs-private\n */\nconst MAT_SINGLE_DATE_SELECTION_MODEL_PROVIDER = {\n provide: MatDateSelectionModel,\n deps: [[new Optional(), new SkipSelf(), MatDateSelectionModel], DateAdapter],\n useFactory: MAT_SINGLE_DATE_SELECTION_MODEL_FACTORY,\n};\n/** @docs-private */\nfunction MAT_RANGE_DATE_SELECTION_MODEL_FACTORY(parent, adapter) {\n return parent || new MatRangeDateSelectionModel(adapter);\n}\n/**\n * Used to provide a range selection model to a component.\n * @docs-private\n */\nconst MAT_RANGE_DATE_SELECTION_MODEL_PROVIDER = {\n provide: MatDateSelectionModel,\n deps: [[new Optional(), new SkipSelf(), MatDateSelectionModel], DateAdapter],\n useFactory: MAT_RANGE_DATE_SELECTION_MODEL_FACTORY,\n};\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Injection token used to customize the date range selection behavior. */\nconst MAT_DATE_RANGE_SELECTION_STRATEGY = new InjectionToken('MAT_DATE_RANGE_SELECTION_STRATEGY');\n/** Provides the default date range selection behavior. */\nclass DefaultMatCalendarRangeStrategy {\n constructor(_dateAdapter) {\n this._dateAdapter = _dateAdapter;\n }\n selectionFinished(date, currentRange) {\n let { start, end } = currentRange;\n if (start == null) {\n start = date;\n }\n else if (end == null && date && this._dateAdapter.compareDate(date, start) >= 0) {\n end = date;\n }\n else {\n start = date;\n end = null;\n }\n return new DateRange(start, end);\n }\n createPreview(activeDate, currentRange) {\n let start = null;\n let end = null;\n if (currentRange.start && !currentRange.end && activeDate) {\n start = currentRange.start;\n end = activeDate;\n }\n return new DateRange(start, end);\n }\n createDrag(dragOrigin, originalRange, newDate) {\n let start = originalRange.start;\n let end = originalRange.end;\n if (!start || !end) {\n // Can't drag from an incomplete range.\n return null;\n }\n const adapter = this._dateAdapter;\n const isRange = adapter.compareDate(start, end) !== 0;\n const diffYears = adapter.getYear(newDate) - adapter.getYear(dragOrigin);\n const diffMonths = adapter.getMonth(newDate) - adapter.getMonth(dragOrigin);\n const diffDays = adapter.getDate(newDate) - adapter.getDate(dragOrigin);\n if (isRange && adapter.sameDate(dragOrigin, originalRange.start)) {\n start = newDate;\n if (adapter.compareDate(newDate, end) > 0) {\n end = adapter.addCalendarYears(end, diffYears);\n end = adapter.addCalendarMonths(end, diffMonths);\n end = adapter.addCalendarDays(end, diffDays);\n }\n }\n else if (isRange && adapter.sameDate(dragOrigin, originalRange.end)) {\n end = newDate;\n if (adapter.compareDate(newDate, start) < 0) {\n start = adapter.addCalendarYears(start, diffYears);\n start = adapter.addCalendarMonths(start, diffMonths);\n start = adapter.addCalendarDays(start, diffDays);\n }\n }\n else {\n start = adapter.addCalendarYears(start, diffYears);\n start = adapter.addCalendarMonths(start, diffMonths);\n start = adapter.addCalendarDays(start, diffDays);\n end = adapter.addCalendarYears(end, diffYears);\n end = adapter.addCalendarMonths(end, diffMonths);\n end = adapter.addCalendarDays(end, diffDays);\n }\n return new DateRange(start, end);\n }\n}\nDefaultMatCalendarRangeStrategy.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: DefaultMatCalendarRangeStrategy, deps: [{ token: i1$1.DateAdapter }], target: i0.ɵɵFactoryTarget.Injectable });\nDefaultMatCalendarRangeStrategy.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: DefaultMatCalendarRangeStrategy });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: DefaultMatCalendarRangeStrategy, decorators: [{\n type: Injectable\n }], ctorParameters: function () { return [{ type: i1$1.DateAdapter }]; } });\n/** @docs-private */\nfunction MAT_CALENDAR_RANGE_STRATEGY_PROVIDER_FACTORY(parent, adapter) {\n return parent || new DefaultMatCalendarRangeStrategy(adapter);\n}\n/** @docs-private */\nconst MAT_CALENDAR_RANGE_STRATEGY_PROVIDER = {\n provide: MAT_DATE_RANGE_SELECTION_STRATEGY,\n deps: [[new Optional(), new SkipSelf(), MAT_DATE_RANGE_SELECTION_STRATEGY], DateAdapter],\n useFactory: MAT_CALENDAR_RANGE_STRATEGY_PROVIDER_FACTORY,\n};\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst DAYS_PER_WEEK = 7;\n/**\n * An internal component used to display a single month in the datepicker.\n * @docs-private\n */\nclass MatMonthView {\n /**\n * The date to display in this month view (everything other than the month and year is ignored).\n */\n get activeDate() {\n return this._activeDate;\n }\n set activeDate(value) {\n const oldActiveDate = this._activeDate;\n const validDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value)) ||\n this._dateAdapter.today();\n this._activeDate = this._dateAdapter.clampDate(validDate, this.minDate, this.maxDate);\n if (!this._hasSameMonthAndYear(oldActiveDate, this._activeDate)) {\n this._init();\n }\n }\n /** The currently selected date. */\n get selected() {\n return this._selected;\n }\n set selected(value) {\n if (value instanceof DateRange) {\n this._selected = value;\n }\n else {\n this._selected = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n this._setRanges(this._selected);\n }\n /** The minimum selectable date. */\n get minDate() {\n return this._minDate;\n }\n set minDate(value) {\n this._minDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n /** The maximum selectable date. */\n get maxDate() {\n return this._maxDate;\n }\n set maxDate(value) {\n this._maxDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n constructor(_changeDetectorRef, _dateFormats, _dateAdapter, _dir, _rangeStrategy) {\n this._changeDetectorRef = _changeDetectorRef;\n this._dateFormats = _dateFormats;\n this._dateAdapter = _dateAdapter;\n this._dir = _dir;\n this._rangeStrategy = _rangeStrategy;\n this._rerenderSubscription = Subscription.EMPTY;\n /** Origin of active drag, or null when dragging is not active. */\n this.activeDrag = null;\n /** Emits when a new date is selected. */\n this.selectedChange = new EventEmitter();\n /** Emits when any date is selected. */\n this._userSelection = new EventEmitter();\n /** Emits when the user initiates a date range drag via mouse or touch. */\n this.dragStarted = new EventEmitter();\n /**\n * Emits when the user completes or cancels a date range drag.\n * Emits null when the drag was canceled or the newly selected date range if completed.\n */\n this.dragEnded = new EventEmitter();\n /** Emits when any date is activated. */\n this.activeDateChange = new EventEmitter();\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n if (!this._dateFormats) {\n throw createMissingDateImplError('MAT_DATE_FORMATS');\n }\n }\n this._activeDate = this._dateAdapter.today();\n }\n ngAfterContentInit() {\n this._rerenderSubscription = this._dateAdapter.localeChanges\n .pipe(startWith(null))\n .subscribe(() => this._init());\n }\n ngOnChanges(changes) {\n const comparisonChange = changes['comparisonStart'] || changes['comparisonEnd'];\n if (comparisonChange && !comparisonChange.firstChange) {\n this._setRanges(this.selected);\n }\n if (changes['activeDrag'] && !this.activeDrag) {\n this._clearPreview();\n }\n }\n ngOnDestroy() {\n this._rerenderSubscription.unsubscribe();\n }\n /** Handles when a new date is selected. */\n _dateSelected(event) {\n const date = event.value;\n const selectedDate = this._getDateFromDayOfMonth(date);\n let rangeStartDate;\n let rangeEndDate;\n if (this._selected instanceof DateRange) {\n rangeStartDate = this._getDateInCurrentMonth(this._selected.start);\n rangeEndDate = this._getDateInCurrentMonth(this._selected.end);\n }\n else {\n rangeStartDate = rangeEndDate = this._getDateInCurrentMonth(this._selected);\n }\n if (rangeStartDate !== date || rangeEndDate !== date) {\n this.selectedChange.emit(selectedDate);\n }\n this._userSelection.emit({ value: selectedDate, event: event.event });\n this._clearPreview();\n this._changeDetectorRef.markForCheck();\n }\n /**\n * Takes the index of a calendar body cell wrapped in in an event as argument. For the date that\n * corresponds to the given cell, set `activeDate` to that date and fire `activeDateChange` with\n * that date.\n *\n * This function is used to match each component's model of the active date with the calendar\n * body cell that was focused. It updates its value of `activeDate` synchronously and updates the\n * parent's value asynchronously via the `activeDateChange` event. The child component receives an\n * updated value asynchronously via the `activeCell` Input.\n */\n _updateActiveDate(event) {\n const month = event.value;\n const oldActiveDate = this._activeDate;\n this.activeDate = this._getDateFromDayOfMonth(month);\n if (this._dateAdapter.compareDate(oldActiveDate, this.activeDate)) {\n this.activeDateChange.emit(this._activeDate);\n }\n }\n /** Handles keydown events on the calendar body when calendar is in month view. */\n _handleCalendarBodyKeydown(event) {\n // TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent\n // disabled ones from being selected. This may not be ideal, we should look into whether\n // navigation should skip over disabled dates, and if so, how to implement that efficiently.\n const oldActiveDate = this._activeDate;\n const isRtl = this._isRtl();\n switch (event.keyCode) {\n case LEFT_ARROW:\n this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, isRtl ? 1 : -1);\n break;\n case RIGHT_ARROW:\n this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, isRtl ? -1 : 1);\n break;\n case UP_ARROW:\n this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, -7);\n break;\n case DOWN_ARROW:\n this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, 7);\n break;\n case HOME:\n this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, 1 - this._dateAdapter.getDate(this._activeDate));\n break;\n case END:\n this.activeDate = this._dateAdapter.addCalendarDays(this._activeDate, this._dateAdapter.getNumDaysInMonth(this._activeDate) -\n this._dateAdapter.getDate(this._activeDate));\n break;\n case PAGE_UP:\n this.activeDate = event.altKey\n ? this._dateAdapter.addCalendarYears(this._activeDate, -1)\n : this._dateAdapter.addCalendarMonths(this._activeDate, -1);\n break;\n case PAGE_DOWN:\n this.activeDate = event.altKey\n ? this._dateAdapter.addCalendarYears(this._activeDate, 1)\n : this._dateAdapter.addCalendarMonths(this._activeDate, 1);\n break;\n case ENTER:\n case SPACE:\n this._selectionKeyPressed = true;\n if (this._canSelect(this._activeDate)) {\n // Prevent unexpected default actions such as form submission.\n // Note that we only prevent the default action here while the selection happens in\n // `keyup` below. We can't do the selection here, because it can cause the calendar to\n // reopen if focus is restored immediately. We also can't call `preventDefault` on `keyup`\n // because it's too late (see #23305).\n event.preventDefault();\n }\n return;\n case ESCAPE:\n // Abort the current range selection if the user presses escape mid-selection.\n if (this._previewEnd != null && !hasModifierKey(event)) {\n this._clearPreview();\n // If a drag is in progress, cancel the drag without changing the\n // current selection.\n if (this.activeDrag) {\n this.dragEnded.emit({ value: null, event });\n }\n else {\n this.selectedChange.emit(null);\n this._userSelection.emit({ value: null, event });\n }\n event.preventDefault();\n event.stopPropagation(); // Prevents the overlay from closing.\n }\n return;\n default:\n // Don't prevent default or focus active cell on keys that we don't explicitly handle.\n return;\n }\n if (this._dateAdapter.compareDate(oldActiveDate, this.activeDate)) {\n this.activeDateChange.emit(this.activeDate);\n this._focusActiveCellAfterViewChecked();\n }\n // Prevent unexpected default actions such as form submission.\n event.preventDefault();\n }\n /** Handles keyup events on the calendar body when calendar is in month view. */\n _handleCalendarBodyKeyup(event) {\n if (event.keyCode === SPACE || event.keyCode === ENTER) {\n if (this._selectionKeyPressed && this._canSelect(this._activeDate)) {\n this._dateSelected({ value: this._dateAdapter.getDate(this._activeDate), event });\n }\n this._selectionKeyPressed = false;\n }\n }\n /** Initializes this month view. */\n _init() {\n this._setRanges(this.selected);\n this._todayDate = this._getCellCompareValue(this._dateAdapter.today());\n this._monthLabel = this._dateFormats.display.monthLabel\n ? this._dateAdapter.format(this.activeDate, this._dateFormats.display.monthLabel)\n : this._dateAdapter\n .getMonthNames('short')[this._dateAdapter.getMonth(this.activeDate)].toLocaleUpperCase();\n let firstOfMonth = this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), this._dateAdapter.getMonth(this.activeDate), 1);\n this._firstWeekOffset =\n (DAYS_PER_WEEK +\n this._dateAdapter.getDayOfWeek(firstOfMonth) -\n this._dateAdapter.getFirstDayOfWeek()) %\n DAYS_PER_WEEK;\n this._initWeekdays();\n this._createWeekCells();\n this._changeDetectorRef.markForCheck();\n }\n /** Focuses the active cell after the microtask queue is empty. */\n _focusActiveCell(movePreview) {\n this._matCalendarBody._focusActiveCell(movePreview);\n }\n /** Focuses the active cell after change detection has run and the microtask queue is empty. */\n _focusActiveCellAfterViewChecked() {\n this._matCalendarBody._scheduleFocusActiveCellAfterViewChecked();\n }\n /** Called when the user has activated a new cell and the preview needs to be updated. */\n _previewChanged({ event, value: cell }) {\n if (this._rangeStrategy) {\n // We can assume that this will be a range, because preview\n // events aren't fired for single date selections.\n const value = cell ? cell.rawValue : null;\n const previewRange = this._rangeStrategy.createPreview(value, this.selected, event);\n this._previewStart = this._getCellCompareValue(previewRange.start);\n this._previewEnd = this._getCellCompareValue(previewRange.end);\n if (this.activeDrag && value) {\n const dragRange = this._rangeStrategy.createDrag?.(this.activeDrag.value, this.selected, value, event);\n if (dragRange) {\n this._previewStart = this._getCellCompareValue(dragRange.start);\n this._previewEnd = this._getCellCompareValue(dragRange.end);\n }\n }\n // Note that here we need to use `detectChanges`, rather than `markForCheck`, because\n // the way `_focusActiveCell` is set up at the moment makes it fire at the wrong time\n // when navigating one month back using the keyboard which will cause this handler\n // to throw a \"changed after checked\" error when updating the preview state.\n this._changeDetectorRef.detectChanges();\n }\n }\n /**\n * Called when the user has ended a drag. If the drag/drop was successful,\n * computes and emits the new range selection.\n */\n _dragEnded(event) {\n if (!this.activeDrag)\n return;\n if (event.value) {\n // Propagate drag effect\n const dragDropResult = this._rangeStrategy?.createDrag?.(this.activeDrag.value, this.selected, event.value, event.event);\n this.dragEnded.emit({ value: dragDropResult ?? null, event: event.event });\n }\n else {\n this.dragEnded.emit({ value: null, event: event.event });\n }\n }\n /**\n * Takes a day of the month and returns a new date in the same month and year as the currently\n * active date. The returned date will have the same day of the month as the argument date.\n */\n _getDateFromDayOfMonth(dayOfMonth) {\n return this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), this._dateAdapter.getMonth(this.activeDate), dayOfMonth);\n }\n /** Initializes the weekdays. */\n _initWeekdays() {\n const firstDayOfWeek = this._dateAdapter.getFirstDayOfWeek();\n const narrowWeekdays = this._dateAdapter.getDayOfWeekNames('narrow');\n const longWeekdays = this._dateAdapter.getDayOfWeekNames('long');\n // Rotate the labels for days of the week based on the configured first day of the week.\n let weekdays = longWeekdays.map((long, i) => {\n return { long, narrow: narrowWeekdays[i] };\n });\n this._weekdays = weekdays.slice(firstDayOfWeek).concat(weekdays.slice(0, firstDayOfWeek));\n }\n /** Creates MatCalendarCells for the dates in this month. */\n _createWeekCells() {\n const daysInMonth = this._dateAdapter.getNumDaysInMonth(this.activeDate);\n const dateNames = this._dateAdapter.getDateNames();\n this._weeks = [[]];\n for (let i = 0, cell = this._firstWeekOffset; i < daysInMonth; i++, cell++) {\n if (cell == DAYS_PER_WEEK) {\n this._weeks.push([]);\n cell = 0;\n }\n const date = this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), this._dateAdapter.getMonth(this.activeDate), i + 1);\n const enabled = this._shouldEnableDate(date);\n const ariaLabel = this._dateAdapter.format(date, this._dateFormats.display.dateA11yLabel);\n const cellClasses = this.dateClass ? this.dateClass(date, 'month') : undefined;\n this._weeks[this._weeks.length - 1].push(new MatCalendarCell(i + 1, dateNames[i], ariaLabel, enabled, cellClasses, this._getCellCompareValue(date), date));\n }\n }\n /** Date filter for the month */\n _shouldEnableDate(date) {\n return (!!date &&\n (!this.minDate || this._dateAdapter.compareDate(date, this.minDate) >= 0) &&\n (!this.maxDate || this._dateAdapter.compareDate(date, this.maxDate) <= 0) &&\n (!this.dateFilter || this.dateFilter(date)));\n }\n /**\n * Gets the date in this month that the given Date falls on.\n * Returns null if the given Date is in another month.\n */\n _getDateInCurrentMonth(date) {\n return date && this._hasSameMonthAndYear(date, this.activeDate)\n ? this._dateAdapter.getDate(date)\n : null;\n }\n /** Checks whether the 2 dates are non-null and fall within the same month of the same year. */\n _hasSameMonthAndYear(d1, d2) {\n return !!(d1 &&\n d2 &&\n this._dateAdapter.getMonth(d1) == this._dateAdapter.getMonth(d2) &&\n this._dateAdapter.getYear(d1) == this._dateAdapter.getYear(d2));\n }\n /** Gets the value that will be used to one cell to another. */\n _getCellCompareValue(date) {\n if (date) {\n // We use the time since the Unix epoch to compare dates in this view, rather than the\n // cell values, because we need to support ranges that span across multiple months/years.\n const year = this._dateAdapter.getYear(date);\n const month = this._dateAdapter.getMonth(date);\n const day = this._dateAdapter.getDate(date);\n return new Date(year, month, day).getTime();\n }\n return null;\n }\n /** Determines whether the user has the RTL layout direction. */\n _isRtl() {\n return this._dir && this._dir.value === 'rtl';\n }\n /** Sets the current range based on a model value. */\n _setRanges(selectedValue) {\n if (selectedValue instanceof DateRange) {\n this._rangeStart = this._getCellCompareValue(selectedValue.start);\n this._rangeEnd = this._getCellCompareValue(selectedValue.end);\n this._isRange = true;\n }\n else {\n this._rangeStart = this._rangeEnd = this._getCellCompareValue(selectedValue);\n this._isRange = false;\n }\n this._comparisonRangeStart = this._getCellCompareValue(this.comparisonStart);\n this._comparisonRangeEnd = this._getCellCompareValue(this.comparisonEnd);\n }\n /** Gets whether a date can be selected in the month view. */\n _canSelect(date) {\n return !this.dateFilter || this.dateFilter(date);\n }\n /** Clears out preview state. */\n _clearPreview() {\n this._previewStart = this._previewEnd = null;\n }\n}\nMatMonthView.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatMonthView, deps: [{ token: i0.ChangeDetectorRef }, { token: MAT_DATE_FORMATS, optional: true }, { token: i1$1.DateAdapter, optional: true }, { token: i2.Directionality, optional: true }, { token: MAT_DATE_RANGE_SELECTION_STRATEGY, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatMonthView.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatMonthView, selector: \"mat-month-view\", inputs: { activeDate: \"activeDate\", selected: \"selected\", minDate: \"minDate\", maxDate: \"maxDate\", dateFilter: \"dateFilter\", dateClass: \"dateClass\", comparisonStart: \"comparisonStart\", comparisonEnd: \"comparisonEnd\", startDateAccessibleName: \"startDateAccessibleName\", endDateAccessibleName: \"endDateAccessibleName\", activeDrag: \"activeDrag\" }, outputs: { selectedChange: \"selectedChange\", _userSelection: \"_userSelection\", dragStarted: \"dragStarted\", dragEnded: \"dragEnded\", activeDateChange: \"activeDateChange\" }, viewQueries: [{ propertyName: \"_matCalendarBody\", first: true, predicate: MatCalendarBody, descendants: true }], exportAs: [\"matMonthView\"], usesOnChanges: true, ngImport: i0, template: \"\\n \\n \\n \\n \\n \\n \\n \\n \\n
\\n {{day.long}}\\n {{day.narrow}}\\n
\\n\", dependencies: [{ kind: \"directive\", type: i1.NgForOf, selector: \"[ngFor][ngForOf]\", inputs: [\"ngForOf\", \"ngForTrackBy\", \"ngForTemplate\"] }, { kind: \"component\", type: MatCalendarBody, selector: \"[mat-calendar-body]\", inputs: [\"label\", \"rows\", \"todayValue\", \"startValue\", \"endValue\", \"labelMinRequiredCells\", \"numCols\", \"activeCell\", \"isRange\", \"cellAspectRatio\", \"comparisonStart\", \"comparisonEnd\", \"previewStart\", \"previewEnd\", \"startDateAccessibleName\", \"endDateAccessibleName\"], outputs: [\"selectedValueChange\", \"previewChange\", \"activeDateChange\", \"dragStarted\", \"dragEnded\"], exportAs: [\"matCalendarBody\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatMonthView, decorators: [{\n type: Component,\n args: [{ selector: 'mat-month-view', exportAs: 'matMonthView', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"\\n \\n \\n \\n \\n \\n \\n \\n \\n
\\n {{day.long}}\\n {{day.narrow}}\\n
\\n\" }]\n }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_DATE_FORMATS]\n }] }, { type: i1$1.DateAdapter, decorators: [{\n type: Optional\n }] }, { type: i2.Directionality, decorators: [{\n type: Optional\n }] }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_DATE_RANGE_SELECTION_STRATEGY]\n }, {\n type: Optional\n }] }]; }, propDecorators: { activeDate: [{\n type: Input\n }], selected: [{\n type: Input\n }], minDate: [{\n type: Input\n }], maxDate: [{\n type: Input\n }], dateFilter: [{\n type: Input\n }], dateClass: [{\n type: Input\n }], comparisonStart: [{\n type: Input\n }], comparisonEnd: [{\n type: Input\n }], startDateAccessibleName: [{\n type: Input\n }], endDateAccessibleName: [{\n type: Input\n }], activeDrag: [{\n type: Input\n }], selectedChange: [{\n type: Output\n }], _userSelection: [{\n type: Output\n }], dragStarted: [{\n type: Output\n }], dragEnded: [{\n type: Output\n }], activeDateChange: [{\n type: Output\n }], _matCalendarBody: [{\n type: ViewChild,\n args: [MatCalendarBody]\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nconst yearsPerPage = 24;\nconst yearsPerRow = 4;\n/**\n * An internal component used to display a year selector in the datepicker.\n * @docs-private\n */\nclass MatMultiYearView {\n /** The date to display in this multi-year view (everything other than the year is ignored). */\n get activeDate() {\n return this._activeDate;\n }\n set activeDate(value) {\n let oldActiveDate = this._activeDate;\n const validDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value)) ||\n this._dateAdapter.today();\n this._activeDate = this._dateAdapter.clampDate(validDate, this.minDate, this.maxDate);\n if (!isSameMultiYearView(this._dateAdapter, oldActiveDate, this._activeDate, this.minDate, this.maxDate)) {\n this._init();\n }\n }\n /** The currently selected date. */\n get selected() {\n return this._selected;\n }\n set selected(value) {\n if (value instanceof DateRange) {\n this._selected = value;\n }\n else {\n this._selected = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n this._setSelectedYear(value);\n }\n /** The minimum selectable date. */\n get minDate() {\n return this._minDate;\n }\n set minDate(value) {\n this._minDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n /** The maximum selectable date. */\n get maxDate() {\n return this._maxDate;\n }\n set maxDate(value) {\n this._maxDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n constructor(_changeDetectorRef, _dateAdapter, _dir) {\n this._changeDetectorRef = _changeDetectorRef;\n this._dateAdapter = _dateAdapter;\n this._dir = _dir;\n this._rerenderSubscription = Subscription.EMPTY;\n /** Emits when a new year is selected. */\n this.selectedChange = new EventEmitter();\n /** Emits the selected year. This doesn't imply a change on the selected date */\n this.yearSelected = new EventEmitter();\n /** Emits when any date is activated. */\n this.activeDateChange = new EventEmitter();\n if (!this._dateAdapter && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw createMissingDateImplError('DateAdapter');\n }\n this._activeDate = this._dateAdapter.today();\n }\n ngAfterContentInit() {\n this._rerenderSubscription = this._dateAdapter.localeChanges\n .pipe(startWith(null))\n .subscribe(() => this._init());\n }\n ngOnDestroy() {\n this._rerenderSubscription.unsubscribe();\n }\n /** Initializes this multi-year view. */\n _init() {\n this._todayYear = this._dateAdapter.getYear(this._dateAdapter.today());\n // We want a range years such that we maximize the number of\n // enabled dates visible at once. This prevents issues where the minimum year\n // is the last item of a page OR the maximum year is the first item of a page.\n // The offset from the active year to the \"slot\" for the starting year is the\n // *actual* first rendered year in the multi-year view.\n const activeYear = this._dateAdapter.getYear(this._activeDate);\n const minYearOfPage = activeYear - getActiveOffset(this._dateAdapter, this.activeDate, this.minDate, this.maxDate);\n this._years = [];\n for (let i = 0, row = []; i < yearsPerPage; i++) {\n row.push(minYearOfPage + i);\n if (row.length == yearsPerRow) {\n this._years.push(row.map(year => this._createCellForYear(year)));\n row = [];\n }\n }\n this._changeDetectorRef.markForCheck();\n }\n /** Handles when a new year is selected. */\n _yearSelected(event) {\n const year = event.value;\n const selectedYear = this._dateAdapter.createDate(year, 0, 1);\n const selectedDate = this._getDateFromYear(year);\n this.yearSelected.emit(selectedYear);\n this.selectedChange.emit(selectedDate);\n }\n /**\n * Takes the index of a calendar body cell wrapped in in an event as argument. For the date that\n * corresponds to the given cell, set `activeDate` to that date and fire `activeDateChange` with\n * that date.\n *\n * This function is used to match each component's model of the active date with the calendar\n * body cell that was focused. It updates its value of `activeDate` synchronously and updates the\n * parent's value asynchronously via the `activeDateChange` event. The child component receives an\n * updated value asynchronously via the `activeCell` Input.\n */\n _updateActiveDate(event) {\n const year = event.value;\n const oldActiveDate = this._activeDate;\n this.activeDate = this._getDateFromYear(year);\n if (this._dateAdapter.compareDate(oldActiveDate, this.activeDate)) {\n this.activeDateChange.emit(this.activeDate);\n }\n }\n /** Handles keydown events on the calendar body when calendar is in multi-year view. */\n _handleCalendarBodyKeydown(event) {\n const oldActiveDate = this._activeDate;\n const isRtl = this._isRtl();\n switch (event.keyCode) {\n case LEFT_ARROW:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, isRtl ? 1 : -1);\n break;\n case RIGHT_ARROW:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, isRtl ? -1 : 1);\n break;\n case UP_ARROW:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, -yearsPerRow);\n break;\n case DOWN_ARROW:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, yearsPerRow);\n break;\n case HOME:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, -getActiveOffset(this._dateAdapter, this.activeDate, this.minDate, this.maxDate));\n break;\n case END:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, yearsPerPage -\n getActiveOffset(this._dateAdapter, this.activeDate, this.minDate, this.maxDate) -\n 1);\n break;\n case PAGE_UP:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, event.altKey ? -yearsPerPage * 10 : -yearsPerPage);\n break;\n case PAGE_DOWN:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, event.altKey ? yearsPerPage * 10 : yearsPerPage);\n break;\n case ENTER:\n case SPACE:\n // Note that we only prevent the default action here while the selection happens in\n // `keyup` below. We can't do the selection here, because it can cause the calendar to\n // reopen if focus is restored immediately. We also can't call `preventDefault` on `keyup`\n // because it's too late (see #23305).\n this._selectionKeyPressed = true;\n break;\n default:\n // Don't prevent default or focus active cell on keys that we don't explicitly handle.\n return;\n }\n if (this._dateAdapter.compareDate(oldActiveDate, this.activeDate)) {\n this.activeDateChange.emit(this.activeDate);\n }\n this._focusActiveCellAfterViewChecked();\n // Prevent unexpected default actions such as form submission.\n event.preventDefault();\n }\n /** Handles keyup events on the calendar body when calendar is in multi-year view. */\n _handleCalendarBodyKeyup(event) {\n if (event.keyCode === SPACE || event.keyCode === ENTER) {\n if (this._selectionKeyPressed) {\n this._yearSelected({ value: this._dateAdapter.getYear(this._activeDate), event });\n }\n this._selectionKeyPressed = false;\n }\n }\n _getActiveCell() {\n return getActiveOffset(this._dateAdapter, this.activeDate, this.minDate, this.maxDate);\n }\n /** Focuses the active cell after the microtask queue is empty. */\n _focusActiveCell() {\n this._matCalendarBody._focusActiveCell();\n }\n /** Focuses the active cell after change detection has run and the microtask queue is empty. */\n _focusActiveCellAfterViewChecked() {\n this._matCalendarBody._scheduleFocusActiveCellAfterViewChecked();\n }\n /**\n * Takes a year and returns a new date on the same day and month as the currently active date\n * The returned date will have the same year as the argument date.\n */\n _getDateFromYear(year) {\n const activeMonth = this._dateAdapter.getMonth(this.activeDate);\n const daysInMonth = this._dateAdapter.getNumDaysInMonth(this._dateAdapter.createDate(year, activeMonth, 1));\n const normalizedDate = this._dateAdapter.createDate(year, activeMonth, Math.min(this._dateAdapter.getDate(this.activeDate), daysInMonth));\n return normalizedDate;\n }\n /** Creates an MatCalendarCell for the given year. */\n _createCellForYear(year) {\n const date = this._dateAdapter.createDate(year, 0, 1);\n const yearName = this._dateAdapter.getYearName(date);\n const cellClasses = this.dateClass ? this.dateClass(date, 'multi-year') : undefined;\n return new MatCalendarCell(year, yearName, yearName, this._shouldEnableYear(year), cellClasses);\n }\n /** Whether the given year is enabled. */\n _shouldEnableYear(year) {\n // disable if the year is greater than maxDate lower than minDate\n if (year === undefined ||\n year === null ||\n (this.maxDate && year > this._dateAdapter.getYear(this.maxDate)) ||\n (this.minDate && year < this._dateAdapter.getYear(this.minDate))) {\n return false;\n }\n // enable if it reaches here and there's no filter defined\n if (!this.dateFilter) {\n return true;\n }\n const firstOfYear = this._dateAdapter.createDate(year, 0, 1);\n // If any date in the year is enabled count the year as enabled.\n for (let date = firstOfYear; this._dateAdapter.getYear(date) == year; date = this._dateAdapter.addCalendarDays(date, 1)) {\n if (this.dateFilter(date)) {\n return true;\n }\n }\n return false;\n }\n /** Determines whether the user has the RTL layout direction. */\n _isRtl() {\n return this._dir && this._dir.value === 'rtl';\n }\n /** Sets the currently-highlighted year based on a model value. */\n _setSelectedYear(value) {\n this._selectedYear = null;\n if (value instanceof DateRange) {\n const displayValue = value.start || value.end;\n if (displayValue) {\n this._selectedYear = this._dateAdapter.getYear(displayValue);\n }\n }\n else if (value) {\n this._selectedYear = this._dateAdapter.getYear(value);\n }\n }\n}\nMatMultiYearView.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatMultiYearView, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$1.DateAdapter, optional: true }, { token: i2.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatMultiYearView.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatMultiYearView, selector: \"mat-multi-year-view\", inputs: { activeDate: \"activeDate\", selected: \"selected\", minDate: \"minDate\", maxDate: \"maxDate\", dateFilter: \"dateFilter\", dateClass: \"dateClass\" }, outputs: { selectedChange: \"selectedChange\", yearSelected: \"yearSelected\", activeDateChange: \"activeDateChange\" }, viewQueries: [{ propertyName: \"_matCalendarBody\", first: true, predicate: MatCalendarBody, descendants: true }], exportAs: [\"matMultiYearView\"], ngImport: i0, template: \"\\n \\n \\n \\n \\n \\n
\\n\", dependencies: [{ kind: \"component\", type: MatCalendarBody, selector: \"[mat-calendar-body]\", inputs: [\"label\", \"rows\", \"todayValue\", \"startValue\", \"endValue\", \"labelMinRequiredCells\", \"numCols\", \"activeCell\", \"isRange\", \"cellAspectRatio\", \"comparisonStart\", \"comparisonEnd\", \"previewStart\", \"previewEnd\", \"startDateAccessibleName\", \"endDateAccessibleName\"], outputs: [\"selectedValueChange\", \"previewChange\", \"activeDateChange\", \"dragStarted\", \"dragEnded\"], exportAs: [\"matCalendarBody\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatMultiYearView, decorators: [{\n type: Component,\n args: [{ selector: 'mat-multi-year-view', exportAs: 'matMultiYearView', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"\\n \\n \\n \\n \\n \\n
\\n\" }]\n }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1$1.DateAdapter, decorators: [{\n type: Optional\n }] }, { type: i2.Directionality, decorators: [{\n type: Optional\n }] }]; }, propDecorators: { activeDate: [{\n type: Input\n }], selected: [{\n type: Input\n }], minDate: [{\n type: Input\n }], maxDate: [{\n type: Input\n }], dateFilter: [{\n type: Input\n }], dateClass: [{\n type: Input\n }], selectedChange: [{\n type: Output\n }], yearSelected: [{\n type: Output\n }], activeDateChange: [{\n type: Output\n }], _matCalendarBody: [{\n type: ViewChild,\n args: [MatCalendarBody]\n }] } });\nfunction isSameMultiYearView(dateAdapter, date1, date2, minDate, maxDate) {\n const year1 = dateAdapter.getYear(date1);\n const year2 = dateAdapter.getYear(date2);\n const startingYear = getStartingYear(dateAdapter, minDate, maxDate);\n return (Math.floor((year1 - startingYear) / yearsPerPage) ===\n Math.floor((year2 - startingYear) / yearsPerPage));\n}\n/**\n * When the multi-year view is first opened, the active year will be in view.\n * So we compute how many years are between the active year and the *slot* where our\n * \"startingYear\" will render when paged into view.\n */\nfunction getActiveOffset(dateAdapter, activeDate, minDate, maxDate) {\n const activeYear = dateAdapter.getYear(activeDate);\n return euclideanModulo(activeYear - getStartingYear(dateAdapter, minDate, maxDate), yearsPerPage);\n}\n/**\n * We pick a \"starting\" year such that either the maximum year would be at the end\n * or the minimum year would be at the beginning of a page.\n */\nfunction getStartingYear(dateAdapter, minDate, maxDate) {\n let startingYear = 0;\n if (maxDate) {\n const maxYear = dateAdapter.getYear(maxDate);\n startingYear = maxYear - yearsPerPage + 1;\n }\n else if (minDate) {\n startingYear = dateAdapter.getYear(minDate);\n }\n return startingYear;\n}\n/** Gets remainder that is non-negative, even if first number is negative */\nfunction euclideanModulo(a, b) {\n return ((a % b) + b) % b;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * An internal component used to display a single year in the datepicker.\n * @docs-private\n */\nclass MatYearView {\n /** The date to display in this year view (everything other than the year is ignored). */\n get activeDate() {\n return this._activeDate;\n }\n set activeDate(value) {\n let oldActiveDate = this._activeDate;\n const validDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value)) ||\n this._dateAdapter.today();\n this._activeDate = this._dateAdapter.clampDate(validDate, this.minDate, this.maxDate);\n if (this._dateAdapter.getYear(oldActiveDate) !== this._dateAdapter.getYear(this._activeDate)) {\n this._init();\n }\n }\n /** The currently selected date. */\n get selected() {\n return this._selected;\n }\n set selected(value) {\n if (value instanceof DateRange) {\n this._selected = value;\n }\n else {\n this._selected = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n this._setSelectedMonth(value);\n }\n /** The minimum selectable date. */\n get minDate() {\n return this._minDate;\n }\n set minDate(value) {\n this._minDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n /** The maximum selectable date. */\n get maxDate() {\n return this._maxDate;\n }\n set maxDate(value) {\n this._maxDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n constructor(_changeDetectorRef, _dateFormats, _dateAdapter, _dir) {\n this._changeDetectorRef = _changeDetectorRef;\n this._dateFormats = _dateFormats;\n this._dateAdapter = _dateAdapter;\n this._dir = _dir;\n this._rerenderSubscription = Subscription.EMPTY;\n /** Emits when a new month is selected. */\n this.selectedChange = new EventEmitter();\n /** Emits the selected month. This doesn't imply a change on the selected date */\n this.monthSelected = new EventEmitter();\n /** Emits when any date is activated. */\n this.activeDateChange = new EventEmitter();\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n if (!this._dateFormats) {\n throw createMissingDateImplError('MAT_DATE_FORMATS');\n }\n }\n this._activeDate = this._dateAdapter.today();\n }\n ngAfterContentInit() {\n this._rerenderSubscription = this._dateAdapter.localeChanges\n .pipe(startWith(null))\n .subscribe(() => this._init());\n }\n ngOnDestroy() {\n this._rerenderSubscription.unsubscribe();\n }\n /** Handles when a new month is selected. */\n _monthSelected(event) {\n const month = event.value;\n const selectedMonth = this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), month, 1);\n this.monthSelected.emit(selectedMonth);\n const selectedDate = this._getDateFromMonth(month);\n this.selectedChange.emit(selectedDate);\n }\n /**\n * Takes the index of a calendar body cell wrapped in in an event as argument. For the date that\n * corresponds to the given cell, set `activeDate` to that date and fire `activeDateChange` with\n * that date.\n *\n * This function is used to match each component's model of the active date with the calendar\n * body cell that was focused. It updates its value of `activeDate` synchronously and updates the\n * parent's value asynchronously via the `activeDateChange` event. The child component receives an\n * updated value asynchronously via the `activeCell` Input.\n */\n _updateActiveDate(event) {\n const month = event.value;\n const oldActiveDate = this._activeDate;\n this.activeDate = this._getDateFromMonth(month);\n if (this._dateAdapter.compareDate(oldActiveDate, this.activeDate)) {\n this.activeDateChange.emit(this.activeDate);\n }\n }\n /** Handles keydown events on the calendar body when calendar is in year view. */\n _handleCalendarBodyKeydown(event) {\n // TODO(mmalerba): We currently allow keyboard navigation to disabled dates, but just prevent\n // disabled ones from being selected. This may not be ideal, we should look into whether\n // navigation should skip over disabled dates, and if so, how to implement that efficiently.\n const oldActiveDate = this._activeDate;\n const isRtl = this._isRtl();\n switch (event.keyCode) {\n case LEFT_ARROW:\n this.activeDate = this._dateAdapter.addCalendarMonths(this._activeDate, isRtl ? 1 : -1);\n break;\n case RIGHT_ARROW:\n this.activeDate = this._dateAdapter.addCalendarMonths(this._activeDate, isRtl ? -1 : 1);\n break;\n case UP_ARROW:\n this.activeDate = this._dateAdapter.addCalendarMonths(this._activeDate, -4);\n break;\n case DOWN_ARROW:\n this.activeDate = this._dateAdapter.addCalendarMonths(this._activeDate, 4);\n break;\n case HOME:\n this.activeDate = this._dateAdapter.addCalendarMonths(this._activeDate, -this._dateAdapter.getMonth(this._activeDate));\n break;\n case END:\n this.activeDate = this._dateAdapter.addCalendarMonths(this._activeDate, 11 - this._dateAdapter.getMonth(this._activeDate));\n break;\n case PAGE_UP:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, event.altKey ? -10 : -1);\n break;\n case PAGE_DOWN:\n this.activeDate = this._dateAdapter.addCalendarYears(this._activeDate, event.altKey ? 10 : 1);\n break;\n case ENTER:\n case SPACE:\n // Note that we only prevent the default action here while the selection happens in\n // `keyup` below. We can't do the selection here, because it can cause the calendar to\n // reopen if focus is restored immediately. We also can't call `preventDefault` on `keyup`\n // because it's too late (see #23305).\n this._selectionKeyPressed = true;\n break;\n default:\n // Don't prevent default or focus active cell on keys that we don't explicitly handle.\n return;\n }\n if (this._dateAdapter.compareDate(oldActiveDate, this.activeDate)) {\n this.activeDateChange.emit(this.activeDate);\n this._focusActiveCellAfterViewChecked();\n }\n // Prevent unexpected default actions such as form submission.\n event.preventDefault();\n }\n /** Handles keyup events on the calendar body when calendar is in year view. */\n _handleCalendarBodyKeyup(event) {\n if (event.keyCode === SPACE || event.keyCode === ENTER) {\n if (this._selectionKeyPressed) {\n this._monthSelected({ value: this._dateAdapter.getMonth(this._activeDate), event });\n }\n this._selectionKeyPressed = false;\n }\n }\n /** Initializes this year view. */\n _init() {\n this._setSelectedMonth(this.selected);\n this._todayMonth = this._getMonthInCurrentYear(this._dateAdapter.today());\n this._yearLabel = this._dateAdapter.getYearName(this.activeDate);\n let monthNames = this._dateAdapter.getMonthNames('short');\n // First row of months only contains 5 elements so we can fit the year label on the same row.\n this._months = [\n [0, 1, 2, 3],\n [4, 5, 6, 7],\n [8, 9, 10, 11],\n ].map(row => row.map(month => this._createCellForMonth(month, monthNames[month])));\n this._changeDetectorRef.markForCheck();\n }\n /** Focuses the active cell after the microtask queue is empty. */\n _focusActiveCell() {\n this._matCalendarBody._focusActiveCell();\n }\n /** Schedules the matCalendarBody to focus the active cell after change detection has run */\n _focusActiveCellAfterViewChecked() {\n this._matCalendarBody._scheduleFocusActiveCellAfterViewChecked();\n }\n /**\n * Gets the month in this year that the given Date falls on.\n * Returns null if the given Date is in another year.\n */\n _getMonthInCurrentYear(date) {\n return date && this._dateAdapter.getYear(date) == this._dateAdapter.getYear(this.activeDate)\n ? this._dateAdapter.getMonth(date)\n : null;\n }\n /**\n * Takes a month and returns a new date in the same day and year as the currently active date.\n * The returned date will have the same month as the argument date.\n */\n _getDateFromMonth(month) {\n const normalizedDate = this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), month, 1);\n const daysInMonth = this._dateAdapter.getNumDaysInMonth(normalizedDate);\n return this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), month, Math.min(this._dateAdapter.getDate(this.activeDate), daysInMonth));\n }\n /** Creates an MatCalendarCell for the given month. */\n _createCellForMonth(month, monthName) {\n const date = this._dateAdapter.createDate(this._dateAdapter.getYear(this.activeDate), month, 1);\n const ariaLabel = this._dateAdapter.format(date, this._dateFormats.display.monthYearA11yLabel);\n const cellClasses = this.dateClass ? this.dateClass(date, 'year') : undefined;\n return new MatCalendarCell(month, monthName.toLocaleUpperCase(), ariaLabel, this._shouldEnableMonth(month), cellClasses);\n }\n /** Whether the given month is enabled. */\n _shouldEnableMonth(month) {\n const activeYear = this._dateAdapter.getYear(this.activeDate);\n if (month === undefined ||\n month === null ||\n this._isYearAndMonthAfterMaxDate(activeYear, month) ||\n this._isYearAndMonthBeforeMinDate(activeYear, month)) {\n return false;\n }\n if (!this.dateFilter) {\n return true;\n }\n const firstOfMonth = this._dateAdapter.createDate(activeYear, month, 1);\n // If any date in the month is enabled count the month as enabled.\n for (let date = firstOfMonth; this._dateAdapter.getMonth(date) == month; date = this._dateAdapter.addCalendarDays(date, 1)) {\n if (this.dateFilter(date)) {\n return true;\n }\n }\n return false;\n }\n /**\n * Tests whether the combination month/year is after this.maxDate, considering\n * just the month and year of this.maxDate\n */\n _isYearAndMonthAfterMaxDate(year, month) {\n if (this.maxDate) {\n const maxYear = this._dateAdapter.getYear(this.maxDate);\n const maxMonth = this._dateAdapter.getMonth(this.maxDate);\n return year > maxYear || (year === maxYear && month > maxMonth);\n }\n return false;\n }\n /**\n * Tests whether the combination month/year is before this.minDate, considering\n * just the month and year of this.minDate\n */\n _isYearAndMonthBeforeMinDate(year, month) {\n if (this.minDate) {\n const minYear = this._dateAdapter.getYear(this.minDate);\n const minMonth = this._dateAdapter.getMonth(this.minDate);\n return year < minYear || (year === minYear && month < minMonth);\n }\n return false;\n }\n /** Determines whether the user has the RTL layout direction. */\n _isRtl() {\n return this._dir && this._dir.value === 'rtl';\n }\n /** Sets the currently-selected month based on a model value. */\n _setSelectedMonth(value) {\n if (value instanceof DateRange) {\n this._selectedMonth =\n this._getMonthInCurrentYear(value.start) || this._getMonthInCurrentYear(value.end);\n }\n else {\n this._selectedMonth = this._getMonthInCurrentYear(value);\n }\n }\n}\nMatYearView.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatYearView, deps: [{ token: i0.ChangeDetectorRef }, { token: MAT_DATE_FORMATS, optional: true }, { token: i1$1.DateAdapter, optional: true }, { token: i2.Directionality, optional: true }], target: i0.ɵɵFactoryTarget.Component });\nMatYearView.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatYearView, selector: \"mat-year-view\", inputs: { activeDate: \"activeDate\", selected: \"selected\", minDate: \"minDate\", maxDate: \"maxDate\", dateFilter: \"dateFilter\", dateClass: \"dateClass\" }, outputs: { selectedChange: \"selectedChange\", monthSelected: \"monthSelected\", activeDateChange: \"activeDateChange\" }, viewQueries: [{ propertyName: \"_matCalendarBody\", first: true, predicate: MatCalendarBody, descendants: true }], exportAs: [\"matYearView\"], ngImport: i0, template: \"\\n \\n \\n \\n \\n \\n
\\n\", dependencies: [{ kind: \"component\", type: MatCalendarBody, selector: \"[mat-calendar-body]\", inputs: [\"label\", \"rows\", \"todayValue\", \"startValue\", \"endValue\", \"labelMinRequiredCells\", \"numCols\", \"activeCell\", \"isRange\", \"cellAspectRatio\", \"comparisonStart\", \"comparisonEnd\", \"previewStart\", \"previewEnd\", \"startDateAccessibleName\", \"endDateAccessibleName\"], outputs: [\"selectedValueChange\", \"previewChange\", \"activeDateChange\", \"dragStarted\", \"dragEnded\"], exportAs: [\"matCalendarBody\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatYearView, decorators: [{\n type: Component,\n args: [{ selector: 'mat-year-view', exportAs: 'matYearView', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"\\n \\n \\n \\n \\n \\n
\\n\" }]\n }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_DATE_FORMATS]\n }] }, { type: i1$1.DateAdapter, decorators: [{\n type: Optional\n }] }, { type: i2.Directionality, decorators: [{\n type: Optional\n }] }]; }, propDecorators: { activeDate: [{\n type: Input\n }], selected: [{\n type: Input\n }], minDate: [{\n type: Input\n }], maxDate: [{\n type: Input\n }], dateFilter: [{\n type: Input\n }], dateClass: [{\n type: Input\n }], selectedChange: [{\n type: Output\n }], monthSelected: [{\n type: Output\n }], activeDateChange: [{\n type: Output\n }], _matCalendarBody: [{\n type: ViewChild,\n args: [MatCalendarBody]\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nlet calendarHeaderId = 1;\n/** Default header for MatCalendar */\nclass MatCalendarHeader {\n constructor(_intl, calendar, _dateAdapter, _dateFormats, changeDetectorRef) {\n this._intl = _intl;\n this.calendar = calendar;\n this._dateAdapter = _dateAdapter;\n this._dateFormats = _dateFormats;\n this._id = `mat-calendar-header-${calendarHeaderId++}`;\n this._periodButtonLabelId = `${this._id}-period-label`;\n this.calendar.stateChanges.subscribe(() => changeDetectorRef.markForCheck());\n }\n /** The display text for the current calendar view. */\n get periodButtonText() {\n if (this.calendar.currentView == 'month') {\n return this._dateAdapter\n .format(this.calendar.activeDate, this._dateFormats.display.monthYearLabel)\n .toLocaleUpperCase();\n }\n if (this.calendar.currentView == 'year') {\n return this._dateAdapter.getYearName(this.calendar.activeDate);\n }\n return this._intl.formatYearRange(...this._formatMinAndMaxYearLabels());\n }\n /** The aria description for the current calendar view. */\n get periodButtonDescription() {\n if (this.calendar.currentView == 'month') {\n return this._dateAdapter\n .format(this.calendar.activeDate, this._dateFormats.display.monthYearLabel)\n .toLocaleUpperCase();\n }\n if (this.calendar.currentView == 'year') {\n return this._dateAdapter.getYearName(this.calendar.activeDate);\n }\n // Format a label for the window of years displayed in the multi-year calendar view. Use\n // `formatYearRangeLabel` because it is TTS friendly.\n return this._intl.formatYearRangeLabel(...this._formatMinAndMaxYearLabels());\n }\n /** The `aria-label` for changing the calendar view. */\n get periodButtonLabel() {\n return this.calendar.currentView == 'month'\n ? this._intl.switchToMultiYearViewLabel\n : this._intl.switchToMonthViewLabel;\n }\n /** The label for the previous button. */\n get prevButtonLabel() {\n return {\n 'month': this._intl.prevMonthLabel,\n 'year': this._intl.prevYearLabel,\n 'multi-year': this._intl.prevMultiYearLabel,\n }[this.calendar.currentView];\n }\n /** The label for the next button. */\n get nextButtonLabel() {\n return {\n 'month': this._intl.nextMonthLabel,\n 'year': this._intl.nextYearLabel,\n 'multi-year': this._intl.nextMultiYearLabel,\n }[this.calendar.currentView];\n }\n /** Handles user clicks on the period label. */\n currentPeriodClicked() {\n this.calendar.currentView = this.calendar.currentView == 'month' ? 'multi-year' : 'month';\n }\n /** Handles user clicks on the previous button. */\n previousClicked() {\n this.calendar.activeDate =\n this.calendar.currentView == 'month'\n ? this._dateAdapter.addCalendarMonths(this.calendar.activeDate, -1)\n : this._dateAdapter.addCalendarYears(this.calendar.activeDate, this.calendar.currentView == 'year' ? -1 : -yearsPerPage);\n }\n /** Handles user clicks on the next button. */\n nextClicked() {\n this.calendar.activeDate =\n this.calendar.currentView == 'month'\n ? this._dateAdapter.addCalendarMonths(this.calendar.activeDate, 1)\n : this._dateAdapter.addCalendarYears(this.calendar.activeDate, this.calendar.currentView == 'year' ? 1 : yearsPerPage);\n }\n /** Whether the previous period button is enabled. */\n previousEnabled() {\n if (!this.calendar.minDate) {\n return true;\n }\n return (!this.calendar.minDate || !this._isSameView(this.calendar.activeDate, this.calendar.minDate));\n }\n /** Whether the next period button is enabled. */\n nextEnabled() {\n return (!this.calendar.maxDate || !this._isSameView(this.calendar.activeDate, this.calendar.maxDate));\n }\n /** Whether the two dates represent the same view in the current view mode (month or year). */\n _isSameView(date1, date2) {\n if (this.calendar.currentView == 'month') {\n return (this._dateAdapter.getYear(date1) == this._dateAdapter.getYear(date2) &&\n this._dateAdapter.getMonth(date1) == this._dateAdapter.getMonth(date2));\n }\n if (this.calendar.currentView == 'year') {\n return this._dateAdapter.getYear(date1) == this._dateAdapter.getYear(date2);\n }\n // Otherwise we are in 'multi-year' view.\n return isSameMultiYearView(this._dateAdapter, date1, date2, this.calendar.minDate, this.calendar.maxDate);\n }\n /**\n * Format two individual labels for the minimum year and maximum year available in the multi-year\n * calendar view. Returns an array of two strings where the first string is the formatted label\n * for the minimum year, and the second string is the formatted label for the maximum year.\n */\n _formatMinAndMaxYearLabels() {\n // The offset from the active year to the \"slot\" for the starting year is the\n // *actual* first rendered year in the multi-year view, and the last year is\n // just yearsPerPage - 1 away.\n const activeYear = this._dateAdapter.getYear(this.calendar.activeDate);\n const minYearOfPage = activeYear -\n getActiveOffset(this._dateAdapter, this.calendar.activeDate, this.calendar.minDate, this.calendar.maxDate);\n const maxYearOfPage = minYearOfPage + yearsPerPage - 1;\n const minYearLabel = this._dateAdapter.getYearName(this._dateAdapter.createDate(minYearOfPage, 0, 1));\n const maxYearLabel = this._dateAdapter.getYearName(this._dateAdapter.createDate(maxYearOfPage, 0, 1));\n return [minYearLabel, maxYearLabel];\n }\n}\nMatCalendarHeader.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatCalendarHeader, deps: [{ token: MatDatepickerIntl }, { token: forwardRef(() => MatCalendar) }, { token: i1$1.DateAdapter, optional: true }, { token: MAT_DATE_FORMATS, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });\nMatCalendarHeader.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatCalendarHeader, selector: \"mat-calendar-header\", exportAs: [\"matCalendarHeader\"], ngImport: i0, template: \"
\\n
\\n \\n\\n
\\n\\n \\n\\n \\n\\n \\n
\\n
\\n\\n\", dependencies: [{ kind: \"component\", type: i3.MatButton, selector: \" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] \", inputs: [\"disabled\", \"disableRipple\", \"color\"], exportAs: [\"matButton\"] }, { kind: \"component\", type: i3.MatIconButton, selector: \"button[mat-icon-button]\", inputs: [\"disabled\", \"disableRipple\", \"color\"], exportAs: [\"matButton\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatCalendarHeader, decorators: [{\n type: Component,\n args: [{ selector: 'mat-calendar-header', exportAs: 'matCalendarHeader', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"
\\n
\\n \\n\\n
\\n\\n \\n\\n \\n\\n \\n
\\n
\\n\\n\" }]\n }], ctorParameters: function () { return [{ type: MatDatepickerIntl }, { type: MatCalendar, decorators: [{\n type: Inject,\n args: [forwardRef(() => MatCalendar)]\n }] }, { type: i1$1.DateAdapter, decorators: [{\n type: Optional\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_DATE_FORMATS]\n }] }, { type: i0.ChangeDetectorRef }]; } });\n/** A calendar that is used as part of the datepicker. */\nclass MatCalendar {\n /** A date representing the period (month or year) to start the calendar in. */\n get startAt() {\n return this._startAt;\n }\n set startAt(value) {\n this._startAt = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n /** The currently selected date. */\n get selected() {\n return this._selected;\n }\n set selected(value) {\n if (value instanceof DateRange) {\n this._selected = value;\n }\n else {\n this._selected = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n }\n /** The minimum selectable date. */\n get minDate() {\n return this._minDate;\n }\n set minDate(value) {\n this._minDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n /** The maximum selectable date. */\n get maxDate() {\n return this._maxDate;\n }\n set maxDate(value) {\n this._maxDate = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n /**\n * The current active date. This determines which time period is shown and which date is\n * highlighted when using keyboard navigation.\n */\n get activeDate() {\n return this._clampedActiveDate;\n }\n set activeDate(value) {\n this._clampedActiveDate = this._dateAdapter.clampDate(value, this.minDate, this.maxDate);\n this.stateChanges.next();\n this._changeDetectorRef.markForCheck();\n }\n /** Whether the calendar is in month view. */\n get currentView() {\n return this._currentView;\n }\n set currentView(value) {\n const viewChangedResult = this._currentView !== value ? value : null;\n this._currentView = value;\n this._moveFocusOnNextTick = true;\n this._changeDetectorRef.markForCheck();\n if (viewChangedResult) {\n this.viewChanged.emit(viewChangedResult);\n }\n }\n constructor(_intl, _dateAdapter, _dateFormats, _changeDetectorRef) {\n this._dateAdapter = _dateAdapter;\n this._dateFormats = _dateFormats;\n this._changeDetectorRef = _changeDetectorRef;\n /**\n * Used for scheduling that focus should be moved to the active cell on the next tick.\n * We need to schedule it, rather than do it immediately, because we have to wait\n * for Angular to re-evaluate the view children.\n */\n this._moveFocusOnNextTick = false;\n /** Whether the calendar should be started in month or year view. */\n this.startView = 'month';\n /** Emits when the currently selected date changes. */\n this.selectedChange = new EventEmitter();\n /**\n * Emits the year chosen in multiyear view.\n * This doesn't imply a change on the selected date.\n */\n this.yearSelected = new EventEmitter();\n /**\n * Emits the month chosen in year view.\n * This doesn't imply a change on the selected date.\n */\n this.monthSelected = new EventEmitter();\n /**\n * Emits when the current view changes.\n */\n this.viewChanged = new EventEmitter(true);\n /** Emits when any date is selected. */\n this._userSelection = new EventEmitter();\n /** Emits a new date range value when the user completes a drag drop operation. */\n this._userDragDrop = new EventEmitter();\n /** Origin of active drag, or null when dragging is not active. */\n this._activeDrag = null;\n /**\n * Emits whenever there is a state change that the header may need to respond to.\n */\n this.stateChanges = new Subject();\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n if (!this._dateFormats) {\n throw createMissingDateImplError('MAT_DATE_FORMATS');\n }\n }\n this._intlChanges = _intl.changes.subscribe(() => {\n _changeDetectorRef.markForCheck();\n this.stateChanges.next();\n });\n }\n ngAfterContentInit() {\n this._calendarHeaderPortal = new ComponentPortal(this.headerComponent || MatCalendarHeader);\n this.activeDate = this.startAt || this._dateAdapter.today();\n // Assign to the private property since we don't want to move focus on init.\n this._currentView = this.startView;\n }\n ngAfterViewChecked() {\n if (this._moveFocusOnNextTick) {\n this._moveFocusOnNextTick = false;\n this.focusActiveCell();\n }\n }\n ngOnDestroy() {\n this._intlChanges.unsubscribe();\n this.stateChanges.complete();\n }\n ngOnChanges(changes) {\n // Ignore date changes that are at a different time on the same day. This fixes issues where\n // the calendar re-renders when there is no meaningful change to [minDate] or [maxDate]\n // (#24435).\n const minDateChange = changes['minDate'] &&\n !this._dateAdapter.sameDate(changes['minDate'].previousValue, changes['minDate'].currentValue)\n ? changes['minDate']\n : undefined;\n const maxDateChange = changes['maxDate'] &&\n !this._dateAdapter.sameDate(changes['maxDate'].previousValue, changes['maxDate'].currentValue)\n ? changes['maxDate']\n : undefined;\n const change = minDateChange || maxDateChange || changes['dateFilter'];\n if (change && !change.firstChange) {\n const view = this._getCurrentViewComponent();\n if (view) {\n // We need to `detectChanges` manually here, because the `minDate`, `maxDate` etc. are\n // passed down to the view via data bindings which won't be up-to-date when we call `_init`.\n this._changeDetectorRef.detectChanges();\n view._init();\n }\n }\n this.stateChanges.next();\n }\n /** Focuses the active date. */\n focusActiveCell() {\n this._getCurrentViewComponent()._focusActiveCell(false);\n }\n /** Updates today's date after an update of the active date */\n updateTodaysDate() {\n this._getCurrentViewComponent()._init();\n }\n /** Handles date selection in the month view. */\n _dateSelected(event) {\n const date = event.value;\n if (this.selected instanceof DateRange ||\n (date && !this._dateAdapter.sameDate(date, this.selected))) {\n this.selectedChange.emit(date);\n }\n this._userSelection.emit(event);\n }\n /** Handles year selection in the multiyear view. */\n _yearSelectedInMultiYearView(normalizedYear) {\n this.yearSelected.emit(normalizedYear);\n }\n /** Handles month selection in the year view. */\n _monthSelectedInYearView(normalizedMonth) {\n this.monthSelected.emit(normalizedMonth);\n }\n /** Handles year/month selection in the multi-year/year views. */\n _goToDateInView(date, view) {\n this.activeDate = date;\n this.currentView = view;\n }\n /** Called when the user starts dragging to change a date range. */\n _dragStarted(event) {\n this._activeDrag = event;\n }\n /**\n * Called when a drag completes. It may end in cancelation or in the selection\n * of a new range.\n */\n _dragEnded(event) {\n if (!this._activeDrag)\n return;\n if (event.value) {\n this._userDragDrop.emit(event);\n }\n this._activeDrag = null;\n }\n /** Returns the component instance that corresponds to the current calendar view. */\n _getCurrentViewComponent() {\n // The return type is explicitly written as a union to ensure that the Closure compiler does\n // not optimize calls to _init(). Without the explicit return type, TypeScript narrows it to\n // only the first component type. See https://github.com/angular/components/issues/22996.\n return this.monthView || this.yearView || this.multiYearView;\n }\n}\nMatCalendar.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatCalendar, deps: [{ token: MatDatepickerIntl }, { token: i1$1.DateAdapter, optional: true }, { token: MAT_DATE_FORMATS, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });\nMatCalendar.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatCalendar, selector: \"mat-calendar\", inputs: { headerComponent: \"headerComponent\", startAt: \"startAt\", startView: \"startView\", selected: \"selected\", minDate: \"minDate\", maxDate: \"maxDate\", dateFilter: \"dateFilter\", dateClass: \"dateClass\", comparisonStart: \"comparisonStart\", comparisonEnd: \"comparisonEnd\", startDateAccessibleName: \"startDateAccessibleName\", endDateAccessibleName: \"endDateAccessibleName\" }, outputs: { selectedChange: \"selectedChange\", yearSelected: \"yearSelected\", monthSelected: \"monthSelected\", viewChanged: \"viewChanged\", _userSelection: \"_userSelection\", _userDragDrop: \"_userDragDrop\" }, host: { classAttribute: \"mat-calendar\" }, providers: [MAT_SINGLE_DATE_SELECTION_MODEL_PROVIDER], viewQueries: [{ propertyName: \"monthView\", first: true, predicate: MatMonthView, descendants: true }, { propertyName: \"yearView\", first: true, predicate: MatYearView, descendants: true }, { propertyName: \"multiYearView\", first: true, predicate: MatMultiYearView, descendants: true }], exportAs: [\"matCalendar\"], usesOnChanges: true, ngImport: i0, template: \"\\n\\n
\\n \\n \\n\\n \\n \\n\\n \\n \\n
\\n\", styles: [\".mat-calendar{display:block}.mat-calendar-header{padding:8px 8px 0 8px}.mat-calendar-content{padding:0 8px 8px 8px;outline:none}.mat-calendar-controls{display:flex;align-items:center;margin:5% calc(4.7142857143% - 16px)}.mat-calendar-spacer{flex:1 1 auto}.mat-calendar-period-button{min-width:0;margin:0 8px}.mat-calendar-arrow{display:inline-block;width:10px;height:5px;margin:0 0 0 5px;vertical-align:middle}.mat-calendar-arrow.mat-calendar-invert{transform:rotate(180deg)}[dir=rtl] .mat-calendar-arrow{margin:0 5px 0 0}.cdk-high-contrast-active .mat-calendar-arrow{fill:CanvasText}.mat-calendar-previous-button,.mat-calendar-next-button{position:relative}.mat-calendar-previous-button::after,.mat-calendar-next-button::after{top:0;left:0;right:0;bottom:0;position:absolute;content:\\\"\\\";margin:15.5px;border:0 solid currentColor;border-top-width:2px}[dir=rtl] .mat-calendar-previous-button,[dir=rtl] .mat-calendar-next-button{transform:rotate(180deg)}.mat-calendar-previous-button::after{border-left-width:2px;transform:translateX(2px) rotate(-45deg)}.mat-calendar-next-button::after{border-right-width:2px;transform:translateX(-2px) rotate(45deg)}.mat-calendar-table{border-spacing:0;border-collapse:collapse;width:100%}.mat-calendar-table-header th{text-align:center;padding:0 0 8px 0}.mat-calendar-table-header-divider{position:relative;height:1px}.mat-calendar-table-header-divider::after{content:\\\"\\\";position:absolute;top:0;left:-8px;right:-8px;height:1px}.mat-calendar-body-cell-content::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 3px) * -1)}.mat-calendar-body-cell:focus .mat-focus-indicator::before{content:\\\"\\\"}.mat-calendar-hidden-label{display:none}\"], dependencies: [{ kind: \"directive\", type: i1.NgSwitch, selector: \"[ngSwitch]\", inputs: [\"ngSwitch\"] }, { kind: \"directive\", type: i1.NgSwitchCase, selector: \"[ngSwitchCase]\", inputs: [\"ngSwitchCase\"] }, { kind: \"directive\", type: i5.CdkMonitorFocus, selector: \"[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]\", outputs: [\"cdkFocusChange\"], exportAs: [\"cdkMonitorFocus\"] }, { kind: \"directive\", type: i6.CdkPortalOutlet, selector: \"[cdkPortalOutlet]\", inputs: [\"cdkPortalOutlet\"], outputs: [\"attached\"], exportAs: [\"cdkPortalOutlet\"] }, { kind: \"component\", type: MatMonthView, selector: \"mat-month-view\", inputs: [\"activeDate\", \"selected\", \"minDate\", \"maxDate\", \"dateFilter\", \"dateClass\", \"comparisonStart\", \"comparisonEnd\", \"startDateAccessibleName\", \"endDateAccessibleName\", \"activeDrag\"], outputs: [\"selectedChange\", \"_userSelection\", \"dragStarted\", \"dragEnded\", \"activeDateChange\"], exportAs: [\"matMonthView\"] }, { kind: \"component\", type: MatYearView, selector: \"mat-year-view\", inputs: [\"activeDate\", \"selected\", \"minDate\", \"maxDate\", \"dateFilter\", \"dateClass\"], outputs: [\"selectedChange\", \"monthSelected\", \"activeDateChange\"], exportAs: [\"matYearView\"] }, { kind: \"component\", type: MatMultiYearView, selector: \"mat-multi-year-view\", inputs: [\"activeDate\", \"selected\", \"minDate\", \"maxDate\", \"dateFilter\", \"dateClass\"], outputs: [\"selectedChange\", \"yearSelected\", \"activeDateChange\"], exportAs: [\"matMultiYearView\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatCalendar, decorators: [{\n type: Component,\n args: [{ selector: 'mat-calendar', host: {\n 'class': 'mat-calendar',\n }, exportAs: 'matCalendar', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [MAT_SINGLE_DATE_SELECTION_MODEL_PROVIDER], template: \"\\n\\n
\\n \\n \\n\\n \\n \\n\\n \\n \\n
\\n\", styles: [\".mat-calendar{display:block}.mat-calendar-header{padding:8px 8px 0 8px}.mat-calendar-content{padding:0 8px 8px 8px;outline:none}.mat-calendar-controls{display:flex;align-items:center;margin:5% calc(4.7142857143% - 16px)}.mat-calendar-spacer{flex:1 1 auto}.mat-calendar-period-button{min-width:0;margin:0 8px}.mat-calendar-arrow{display:inline-block;width:10px;height:5px;margin:0 0 0 5px;vertical-align:middle}.mat-calendar-arrow.mat-calendar-invert{transform:rotate(180deg)}[dir=rtl] .mat-calendar-arrow{margin:0 5px 0 0}.cdk-high-contrast-active .mat-calendar-arrow{fill:CanvasText}.mat-calendar-previous-button,.mat-calendar-next-button{position:relative}.mat-calendar-previous-button::after,.mat-calendar-next-button::after{top:0;left:0;right:0;bottom:0;position:absolute;content:\\\"\\\";margin:15.5px;border:0 solid currentColor;border-top-width:2px}[dir=rtl] .mat-calendar-previous-button,[dir=rtl] .mat-calendar-next-button{transform:rotate(180deg)}.mat-calendar-previous-button::after{border-left-width:2px;transform:translateX(2px) rotate(-45deg)}.mat-calendar-next-button::after{border-right-width:2px;transform:translateX(-2px) rotate(45deg)}.mat-calendar-table{border-spacing:0;border-collapse:collapse;width:100%}.mat-calendar-table-header th{text-align:center;padding:0 0 8px 0}.mat-calendar-table-header-divider{position:relative;height:1px}.mat-calendar-table-header-divider::after{content:\\\"\\\";position:absolute;top:0;left:-8px;right:-8px;height:1px}.mat-calendar-body-cell-content::before{margin:calc(calc(var(--mat-focus-indicator-border-width, 3px) + 3px) * -1)}.mat-calendar-body-cell:focus .mat-focus-indicator::before{content:\\\"\\\"}.mat-calendar-hidden-label{display:none}\"] }]\n }], ctorParameters: function () { return [{ type: MatDatepickerIntl }, { type: i1$1.DateAdapter, decorators: [{\n type: Optional\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_DATE_FORMATS]\n }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { headerComponent: [{\n type: Input\n }], startAt: [{\n type: Input\n }], startView: [{\n type: Input\n }], selected: [{\n type: Input\n }], minDate: [{\n type: Input\n }], maxDate: [{\n type: Input\n }], dateFilter: [{\n type: Input\n }], dateClass: [{\n type: Input\n }], comparisonStart: [{\n type: Input\n }], comparisonEnd: [{\n type: Input\n }], startDateAccessibleName: [{\n type: Input\n }], endDateAccessibleName: [{\n type: Input\n }], selectedChange: [{\n type: Output\n }], yearSelected: [{\n type: Output\n }], monthSelected: [{\n type: Output\n }], viewChanged: [{\n type: Output\n }], _userSelection: [{\n type: Output\n }], _userDragDrop: [{\n type: Output\n }], monthView: [{\n type: ViewChild,\n args: [MatMonthView]\n }], yearView: [{\n type: ViewChild,\n args: [MatYearView]\n }], multiYearView: [{\n type: ViewChild,\n args: [MatMultiYearView]\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * Animations used by the Material datepicker.\n * @docs-private\n */\nconst matDatepickerAnimations = {\n /** Transforms the height of the datepicker's calendar. */\n transformPanel: trigger('transformPanel', [\n transition('void => enter-dropdown', animate('120ms cubic-bezier(0, 0, 0.2, 1)', keyframes([\n style({ opacity: 0, transform: 'scale(1, 0.8)' }),\n style({ opacity: 1, transform: 'scale(1, 1)' }),\n ]))),\n transition('void => enter-dialog', animate('150ms cubic-bezier(0, 0, 0.2, 1)', keyframes([\n style({ opacity: 0, transform: 'scale(0.7)' }),\n style({ transform: 'none', opacity: 1 }),\n ]))),\n transition('* => void', animate('100ms linear', style({ opacity: 0 }))),\n ]),\n /** Fades in the content of the calendar. */\n fadeInCalendar: trigger('fadeInCalendar', [\n state('void', style({ opacity: 0 })),\n state('enter', style({ opacity: 1 })),\n // TODO(crisbeto): this animation should be removed since it isn't quite on spec, but we\n // need to keep it until #12440 gets in, otherwise the exit animation will look glitchy.\n transition('void => *', animate('120ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)')),\n ]),\n};\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Used to generate a unique ID for each datepicker instance. */\nlet datepickerUid = 0;\n/** Injection token that determines the scroll handling while the calendar is open. */\nconst MAT_DATEPICKER_SCROLL_STRATEGY = new InjectionToken('mat-datepicker-scroll-strategy');\n/** @docs-private */\nfunction MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY(overlay) {\n return () => overlay.scrollStrategies.reposition();\n}\n/** @docs-private */\nconst MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY_PROVIDER = {\n provide: MAT_DATEPICKER_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: MAT_DATEPICKER_SCROLL_STRATEGY_FACTORY,\n};\n// Boilerplate for applying mixins to MatDatepickerContent.\n/** @docs-private */\nconst _MatDatepickerContentBase = mixinColor(class {\n constructor(_elementRef) {\n this._elementRef = _elementRef;\n }\n});\n/**\n * Component used as the content for the datepicker overlay. We use this instead of using\n * MatCalendar directly as the content so we can control the initial focus. This also gives us a\n * place to put additional features of the overlay that are not part of the calendar itself in the\n * future. (e.g. confirmation buttons).\n * @docs-private\n */\nclass MatDatepickerContent extends _MatDatepickerContentBase {\n constructor(elementRef, _changeDetectorRef, _globalModel, _dateAdapter, _rangeSelectionStrategy, intl) {\n super(elementRef);\n this._changeDetectorRef = _changeDetectorRef;\n this._globalModel = _globalModel;\n this._dateAdapter = _dateAdapter;\n this._rangeSelectionStrategy = _rangeSelectionStrategy;\n this._subscriptions = new Subscription();\n /** Emits when an animation has finished. */\n this._animationDone = new Subject();\n /** Whether there is an in-progress animation. */\n this._isAnimating = false;\n /** Portal with projected action buttons. */\n this._actionsPortal = null;\n this._closeButtonText = intl.closeCalendarLabel;\n }\n ngOnInit() {\n this._animationState = this.datepicker.touchUi ? 'enter-dialog' : 'enter-dropdown';\n }\n ngAfterViewInit() {\n this._subscriptions.add(this.datepicker.stateChanges.subscribe(() => {\n this._changeDetectorRef.markForCheck();\n }));\n this._calendar.focusActiveCell();\n }\n ngOnDestroy() {\n this._subscriptions.unsubscribe();\n this._animationDone.complete();\n }\n _handleUserSelection(event) {\n const selection = this._model.selection;\n const value = event.value;\n const isRange = selection instanceof DateRange;\n // If we're selecting a range and we have a selection strategy, always pass the value through\n // there. Otherwise don't assign null values to the model, unless we're selecting a range.\n // A null value when picking a range means that the user cancelled the selection (e.g. by\n // pressing escape), whereas when selecting a single value it means that the value didn't\n // change. This isn't very intuitive, but it's here for backwards-compatibility.\n if (isRange && this._rangeSelectionStrategy) {\n const newSelection = this._rangeSelectionStrategy.selectionFinished(value, selection, event.event);\n this._model.updateSelection(newSelection, this);\n }\n else if (value &&\n (isRange || !this._dateAdapter.sameDate(value, selection))) {\n this._model.add(value);\n }\n // Delegate closing the overlay to the actions.\n if ((!this._model || this._model.isComplete()) && !this._actionsPortal) {\n this.datepicker.close();\n }\n }\n _handleUserDragDrop(event) {\n this._model.updateSelection(event.value, this);\n }\n _startExitAnimation() {\n this._animationState = 'void';\n this._changeDetectorRef.markForCheck();\n }\n _handleAnimationEvent(event) {\n this._isAnimating = event.phaseName === 'start';\n if (!this._isAnimating) {\n this._animationDone.next();\n }\n }\n _getSelected() {\n return this._model.selection;\n }\n /** Applies the current pending selection to the global model. */\n _applyPendingSelection() {\n if (this._model !== this._globalModel) {\n this._globalModel.updateSelection(this._model.selection, this);\n }\n }\n /**\n * Assigns a new portal containing the datepicker actions.\n * @param portal Portal with the actions to be assigned.\n * @param forceRerender Whether a re-render of the portal should be triggered. This isn't\n * necessary if the portal is assigned during initialization, but it may be required if it's\n * added at a later point.\n */\n _assignActions(portal, forceRerender) {\n // If we have actions, clone the model so that we have the ability to cancel the selection,\n // otherwise update the global model directly. Note that we want to assign this as soon as\n // possible, but `_actionsPortal` isn't available in the constructor so we do it in `ngOnInit`.\n this._model = portal ? this._globalModel.clone() : this._globalModel;\n this._actionsPortal = portal;\n if (forceRerender) {\n this._changeDetectorRef.detectChanges();\n }\n }\n}\nMatDatepickerContent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerContent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: MatDateSelectionModel }, { token: i1$1.DateAdapter }, { token: MAT_DATE_RANGE_SELECTION_STRATEGY, optional: true }, { token: MatDatepickerIntl }], target: i0.ɵɵFactoryTarget.Component });\nMatDatepickerContent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatDatepickerContent, selector: \"mat-datepicker-content\", inputs: { color: \"color\" }, host: { listeners: { \"@transformPanel.start\": \"_handleAnimationEvent($event)\", \"@transformPanel.done\": \"_handleAnimationEvent($event)\" }, properties: { \"@transformPanel\": \"_animationState\", \"class.mat-datepicker-content-touch\": \"datepicker.touchUi\" }, classAttribute: \"mat-datepicker-content\" }, viewQueries: [{ propertyName: \"_calendar\", first: true, predicate: MatCalendar, descendants: true }], exportAs: [\"matDatepickerContent\"], usesInheritance: true, ngImport: i0, template: \"\\n \\n\\n \\n\\n \\n {{ _closeButtonText }}\\n\\n\", styles: [\".mat-datepicker-content{display:block;border-radius:4px}.mat-datepicker-content .mat-calendar{width:296px;height:354px}.mat-datepicker-content .mat-datepicker-content-container-with-custom-header .mat-calendar{height:auto}.mat-datepicker-content .mat-datepicker-close-button{position:absolute;top:100%;left:0;margin-top:8px}.ng-animating .mat-datepicker-content .mat-datepicker-close-button{display:none}.mat-datepicker-content-container{display:flex;flex-direction:column;justify-content:space-between}.mat-datepicker-content-touch{display:block;max-height:80vh;position:relative;overflow:visible}.mat-datepicker-content-touch .mat-datepicker-content-container{min-height:312px;max-height:788px;min-width:250px;max-width:750px}.mat-datepicker-content-touch .mat-calendar{width:100%;height:auto}@media all and (orientation: landscape){.mat-datepicker-content-touch .mat-datepicker-content-container{width:64vh;height:80vh}}@media all and (orientation: portrait){.mat-datepicker-content-touch .mat-datepicker-content-container{width:80vw;height:100vw}.mat-datepicker-content-touch .mat-datepicker-content-container-with-actions{height:115vw}}\"], dependencies: [{ kind: \"directive\", type: i1.NgClass, selector: \"[ngClass]\", inputs: [\"class\", \"ngClass\"] }, { kind: \"component\", type: i3.MatButton, selector: \" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] \", inputs: [\"disabled\", \"disableRipple\", \"color\"], exportAs: [\"matButton\"] }, { kind: \"directive\", type: i5.CdkTrapFocus, selector: \"[cdkTrapFocus]\", inputs: [\"cdkTrapFocus\", \"cdkTrapFocusAutoCapture\"], exportAs: [\"cdkTrapFocus\"] }, { kind: \"directive\", type: i6.CdkPortalOutlet, selector: \"[cdkPortalOutlet]\", inputs: [\"cdkPortalOutlet\"], outputs: [\"attached\"], exportAs: [\"cdkPortalOutlet\"] }, { kind: \"component\", type: MatCalendar, selector: \"mat-calendar\", inputs: [\"headerComponent\", \"startAt\", \"startView\", \"selected\", \"minDate\", \"maxDate\", \"dateFilter\", \"dateClass\", \"comparisonStart\", \"comparisonEnd\", \"startDateAccessibleName\", \"endDateAccessibleName\"], outputs: [\"selectedChange\", \"yearSelected\", \"monthSelected\", \"viewChanged\", \"_userSelection\", \"_userDragDrop\"], exportAs: [\"matCalendar\"] }], animations: [matDatepickerAnimations.transformPanel, matDatepickerAnimations.fadeInCalendar], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerContent, decorators: [{\n type: Component,\n args: [{ selector: 'mat-datepicker-content', host: {\n 'class': 'mat-datepicker-content',\n '[@transformPanel]': '_animationState',\n '(@transformPanel.start)': '_handleAnimationEvent($event)',\n '(@transformPanel.done)': '_handleAnimationEvent($event)',\n '[class.mat-datepicker-content-touch]': 'datepicker.touchUi',\n }, animations: [matDatepickerAnimations.transformPanel, matDatepickerAnimations.fadeInCalendar], exportAs: 'matDatepickerContent', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, inputs: ['color'], template: \"\\n \\n\\n \\n\\n \\n {{ _closeButtonText }}\\n\\n\", styles: [\".mat-datepicker-content{display:block;border-radius:4px}.mat-datepicker-content .mat-calendar{width:296px;height:354px}.mat-datepicker-content .mat-datepicker-content-container-with-custom-header .mat-calendar{height:auto}.mat-datepicker-content .mat-datepicker-close-button{position:absolute;top:100%;left:0;margin-top:8px}.ng-animating .mat-datepicker-content .mat-datepicker-close-button{display:none}.mat-datepicker-content-container{display:flex;flex-direction:column;justify-content:space-between}.mat-datepicker-content-touch{display:block;max-height:80vh;position:relative;overflow:visible}.mat-datepicker-content-touch .mat-datepicker-content-container{min-height:312px;max-height:788px;min-width:250px;max-width:750px}.mat-datepicker-content-touch .mat-calendar{width:100%;height:auto}@media all and (orientation: landscape){.mat-datepicker-content-touch .mat-datepicker-content-container{width:64vh;height:80vh}}@media all and (orientation: portrait){.mat-datepicker-content-touch .mat-datepicker-content-container{width:80vw;height:100vw}.mat-datepicker-content-touch .mat-datepicker-content-container-with-actions{height:115vw}}\"] }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: MatDateSelectionModel }, { type: i1$1.DateAdapter }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_DATE_RANGE_SELECTION_STRATEGY]\n }] }, { type: MatDatepickerIntl }]; }, propDecorators: { _calendar: [{\n type: ViewChild,\n args: [MatCalendar]\n }] } });\n/** Base class for a datepicker. */\nclass MatDatepickerBase {\n /** The date to open the calendar to initially. */\n get startAt() {\n // If an explicit startAt is set we start there, otherwise we start at whatever the currently\n // selected value is.\n return this._startAt || (this.datepickerInput ? this.datepickerInput.getStartValue() : null);\n }\n set startAt(value) {\n this._startAt = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n }\n /** Color palette to use on the datepicker's calendar. */\n get color() {\n return (this._color || (this.datepickerInput ? this.datepickerInput.getThemePalette() : undefined));\n }\n set color(value) {\n this._color = value;\n }\n /**\n * Whether the calendar UI is in touch mode. In touch mode the calendar opens in a dialog rather\n * than a dropdown and elements have more padding to allow for bigger touch targets.\n */\n get touchUi() {\n return this._touchUi;\n }\n set touchUi(value) {\n this._touchUi = coerceBooleanProperty(value);\n }\n /** Whether the datepicker pop-up should be disabled. */\n get disabled() {\n return this._disabled === undefined && this.datepickerInput\n ? this.datepickerInput.disabled\n : !!this._disabled;\n }\n set disabled(value) {\n const newValue = coerceBooleanProperty(value);\n if (newValue !== this._disabled) {\n this._disabled = newValue;\n this.stateChanges.next(undefined);\n }\n }\n /**\n * Whether to restore focus to the previously-focused element when the calendar is closed.\n * Note that automatic focus restoration is an accessibility feature and it is recommended that\n * you provide your own equivalent, if you decide to turn it off.\n */\n get restoreFocus() {\n return this._restoreFocus;\n }\n set restoreFocus(value) {\n this._restoreFocus = coerceBooleanProperty(value);\n }\n /**\n * Classes to be passed to the date picker panel.\n * Supports string and string array values, similar to `ngClass`.\n */\n get panelClass() {\n return this._panelClass;\n }\n set panelClass(value) {\n this._panelClass = coerceStringArray(value);\n }\n /** Whether the calendar is open. */\n get opened() {\n return this._opened;\n }\n set opened(value) {\n coerceBooleanProperty(value) ? this.open() : this.close();\n }\n /** The minimum selectable date. */\n _getMinDate() {\n return this.datepickerInput && this.datepickerInput.min;\n }\n /** The maximum selectable date. */\n _getMaxDate() {\n return this.datepickerInput && this.datepickerInput.max;\n }\n _getDateFilter() {\n return this.datepickerInput && this.datepickerInput.dateFilter;\n }\n constructor(_overlay, _ngZone, _viewContainerRef, scrollStrategy, _dateAdapter, _dir, _model) {\n this._overlay = _overlay;\n this._ngZone = _ngZone;\n this._viewContainerRef = _viewContainerRef;\n this._dateAdapter = _dateAdapter;\n this._dir = _dir;\n this._model = _model;\n this._inputStateChanges = Subscription.EMPTY;\n this._document = inject(DOCUMENT);\n /** The view that the calendar should start in. */\n this.startView = 'month';\n this._touchUi = false;\n /** Preferred position of the datepicker in the X axis. */\n this.xPosition = 'start';\n /** Preferred position of the datepicker in the Y axis. */\n this.yPosition = 'below';\n this._restoreFocus = true;\n /**\n * Emits selected year in multiyear view.\n * This doesn't imply a change on the selected date.\n */\n this.yearSelected = new EventEmitter();\n /**\n * Emits selected month in year view.\n * This doesn't imply a change on the selected date.\n */\n this.monthSelected = new EventEmitter();\n /**\n * Emits when the current view changes.\n */\n this.viewChanged = new EventEmitter(true);\n /** Emits when the datepicker has been opened. */\n this.openedStream = new EventEmitter();\n /** Emits when the datepicker has been closed. */\n this.closedStream = new EventEmitter();\n this._opened = false;\n /** The id for the datepicker calendar. */\n this.id = `mat-datepicker-${datepickerUid++}`;\n /** The element that was focused before the datepicker was opened. */\n this._focusedElementBeforeOpen = null;\n /** Unique class that will be added to the backdrop so that the test harnesses can look it up. */\n this._backdropHarnessClass = `${this.id}-backdrop`;\n /** Emits when the datepicker's state changes. */\n this.stateChanges = new Subject();\n if (!this._dateAdapter && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw createMissingDateImplError('DateAdapter');\n }\n this._scrollStrategy = scrollStrategy;\n }\n ngOnChanges(changes) {\n const positionChange = changes['xPosition'] || changes['yPosition'];\n if (positionChange && !positionChange.firstChange && this._overlayRef) {\n const positionStrategy = this._overlayRef.getConfig().positionStrategy;\n if (positionStrategy instanceof FlexibleConnectedPositionStrategy) {\n this._setConnectedPositions(positionStrategy);\n if (this.opened) {\n this._overlayRef.updatePosition();\n }\n }\n }\n this.stateChanges.next(undefined);\n }\n ngOnDestroy() {\n this._destroyOverlay();\n this.close();\n this._inputStateChanges.unsubscribe();\n this.stateChanges.complete();\n }\n /** Selects the given date */\n select(date) {\n this._model.add(date);\n }\n /** Emits the selected year in multiyear view */\n _selectYear(normalizedYear) {\n this.yearSelected.emit(normalizedYear);\n }\n /** Emits selected month in year view */\n _selectMonth(normalizedMonth) {\n this.monthSelected.emit(normalizedMonth);\n }\n /** Emits changed view */\n _viewChanged(view) {\n this.viewChanged.emit(view);\n }\n /**\n * Register an input with this datepicker.\n * @param input The datepicker input to register with this datepicker.\n * @returns Selection model that the input should hook itself up to.\n */\n registerInput(input) {\n if (this.datepickerInput && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('A MatDatepicker can only be associated with a single input.');\n }\n this._inputStateChanges.unsubscribe();\n this.datepickerInput = input;\n this._inputStateChanges = input.stateChanges.subscribe(() => this.stateChanges.next(undefined));\n return this._model;\n }\n /**\n * Registers a portal containing action buttons with the datepicker.\n * @param portal Portal to be registered.\n */\n registerActions(portal) {\n if (this._actionsPortal && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('A MatDatepicker can only be associated with a single actions row.');\n }\n this._actionsPortal = portal;\n this._componentRef?.instance._assignActions(portal, true);\n }\n /**\n * Removes a portal containing action buttons from the datepicker.\n * @param portal Portal to be removed.\n */\n removeActions(portal) {\n if (portal === this._actionsPortal) {\n this._actionsPortal = null;\n this._componentRef?.instance._assignActions(null, true);\n }\n }\n /** Open the calendar. */\n open() {\n // Skip reopening if there's an in-progress animation to avoid overlapping\n // sequences which can cause \"changed after checked\" errors. See #25837.\n if (this._opened || this.disabled || this._componentRef?.instance._isAnimating) {\n return;\n }\n if (!this.datepickerInput && (typeof ngDevMode === 'undefined' || ngDevMode)) {\n throw Error('Attempted to open an MatDatepicker with no associated input.');\n }\n this._focusedElementBeforeOpen = _getFocusedElementPierceShadowDom();\n this._openOverlay();\n this._opened = true;\n this.openedStream.emit();\n }\n /** Close the calendar. */\n close() {\n // Skip reopening if there's an in-progress animation to avoid overlapping\n // sequences which can cause \"changed after checked\" errors. See #25837.\n if (!this._opened || this._componentRef?.instance._isAnimating) {\n return;\n }\n const canRestoreFocus = this._restoreFocus &&\n this._focusedElementBeforeOpen &&\n typeof this._focusedElementBeforeOpen.focus === 'function';\n const completeClose = () => {\n // The `_opened` could've been reset already if\n // we got two events in quick succession.\n if (this._opened) {\n this._opened = false;\n this.closedStream.emit();\n }\n };\n if (this._componentRef) {\n const { instance, location } = this._componentRef;\n instance._startExitAnimation();\n instance._animationDone.pipe(take(1)).subscribe(() => {\n const activeElement = this._document.activeElement;\n // Since we restore focus after the exit animation, we have to check that\n // the user didn't move focus themselves inside the `close` handler.\n if (canRestoreFocus &&\n (!activeElement ||\n activeElement === this._document.activeElement ||\n location.nativeElement.contains(activeElement))) {\n this._focusedElementBeforeOpen.focus();\n }\n this._focusedElementBeforeOpen = null;\n this._destroyOverlay();\n });\n }\n if (canRestoreFocus) {\n // Because IE moves focus asynchronously, we can't count on it being restored before we've\n // marked the datepicker as closed. If the event fires out of sequence and the element that\n // we're refocusing opens the datepicker on focus, the user could be stuck with not being\n // able to close the calendar at all. We work around it by making the logic, that marks\n // the datepicker as closed, async as well.\n setTimeout(completeClose);\n }\n else {\n completeClose();\n }\n }\n /** Applies the current pending selection on the overlay to the model. */\n _applyPendingSelection() {\n this._componentRef?.instance?._applyPendingSelection();\n }\n /** Forwards relevant values from the datepicker to the datepicker content inside the overlay. */\n _forwardContentValues(instance) {\n instance.datepicker = this;\n instance.color = this.color;\n instance._dialogLabelId = this.datepickerInput.getOverlayLabelId();\n instance._assignActions(this._actionsPortal, false);\n }\n /** Opens the overlay with the calendar. */\n _openOverlay() {\n this._destroyOverlay();\n const isDialog = this.touchUi;\n const portal = new ComponentPortal(MatDatepickerContent, this._viewContainerRef);\n const overlayRef = (this._overlayRef = this._overlay.create(new OverlayConfig({\n positionStrategy: isDialog ? this._getDialogStrategy() : this._getDropdownStrategy(),\n hasBackdrop: true,\n backdropClass: [\n isDialog ? 'cdk-overlay-dark-backdrop' : 'mat-overlay-transparent-backdrop',\n this._backdropHarnessClass,\n ],\n direction: this._dir,\n scrollStrategy: isDialog ? this._overlay.scrollStrategies.block() : this._scrollStrategy(),\n panelClass: `mat-datepicker-${isDialog ? 'dialog' : 'popup'}`,\n })));\n this._getCloseStream(overlayRef).subscribe(event => {\n if (event) {\n event.preventDefault();\n }\n this.close();\n });\n // The `preventDefault` call happens inside the calendar as well, however focus moves into\n // it inside a timeout which can give browsers a chance to fire off a keyboard event in-between\n // that can scroll the page (see #24969). Always block default actions of arrow keys for the\n // entire overlay so the page doesn't get scrolled by accident.\n overlayRef.keydownEvents().subscribe(event => {\n const keyCode = event.keyCode;\n if (keyCode === UP_ARROW ||\n keyCode === DOWN_ARROW ||\n keyCode === LEFT_ARROW ||\n keyCode === RIGHT_ARROW ||\n keyCode === PAGE_UP ||\n keyCode === PAGE_DOWN) {\n event.preventDefault();\n }\n });\n this._componentRef = overlayRef.attach(portal);\n this._forwardContentValues(this._componentRef.instance);\n // Update the position once the calendar has rendered. Only relevant in dropdown mode.\n if (!isDialog) {\n this._ngZone.onStable.pipe(take(1)).subscribe(() => overlayRef.updatePosition());\n }\n }\n /** Destroys the current overlay. */\n _destroyOverlay() {\n if (this._overlayRef) {\n this._overlayRef.dispose();\n this._overlayRef = this._componentRef = null;\n }\n }\n /** Gets a position strategy that will open the calendar as a dropdown. */\n _getDialogStrategy() {\n return this._overlay.position().global().centerHorizontally().centerVertically();\n }\n /** Gets a position strategy that will open the calendar as a dropdown. */\n _getDropdownStrategy() {\n const strategy = this._overlay\n .position()\n .flexibleConnectedTo(this.datepickerInput.getConnectedOverlayOrigin())\n .withTransformOriginOn('.mat-datepicker-content')\n .withFlexibleDimensions(false)\n .withViewportMargin(8)\n .withLockedPosition();\n return this._setConnectedPositions(strategy);\n }\n /** Sets the positions of the datepicker in dropdown mode based on the current configuration. */\n _setConnectedPositions(strategy) {\n const primaryX = this.xPosition === 'end' ? 'end' : 'start';\n const secondaryX = primaryX === 'start' ? 'end' : 'start';\n const primaryY = this.yPosition === 'above' ? 'bottom' : 'top';\n const secondaryY = primaryY === 'top' ? 'bottom' : 'top';\n return strategy.withPositions([\n {\n originX: primaryX,\n originY: secondaryY,\n overlayX: primaryX,\n overlayY: primaryY,\n },\n {\n originX: primaryX,\n originY: primaryY,\n overlayX: primaryX,\n overlayY: secondaryY,\n },\n {\n originX: secondaryX,\n originY: secondaryY,\n overlayX: secondaryX,\n overlayY: primaryY,\n },\n {\n originX: secondaryX,\n originY: primaryY,\n overlayX: secondaryX,\n overlayY: secondaryY,\n },\n ]);\n }\n /** Gets an observable that will emit when the overlay is supposed to be closed. */\n _getCloseStream(overlayRef) {\n const ctrlShiftMetaModifiers = ['ctrlKey', 'shiftKey', 'metaKey'];\n return merge(overlayRef.backdropClick(), overlayRef.detachments(), overlayRef.keydownEvents().pipe(filter(event => {\n // Closing on alt + up is only valid when there's an input associated with the datepicker.\n return ((event.keyCode === ESCAPE && !hasModifierKey(event)) ||\n (this.datepickerInput &&\n hasModifierKey(event, 'altKey') &&\n event.keyCode === UP_ARROW &&\n ctrlShiftMetaModifiers.every((modifier) => !hasModifierKey(event, modifier))));\n })));\n }\n}\nMatDatepickerBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerBase, deps: [{ token: i9.Overlay }, { token: i0.NgZone }, { token: i0.ViewContainerRef }, { token: MAT_DATEPICKER_SCROLL_STRATEGY }, { token: i1$1.DateAdapter, optional: true }, { token: i2.Directionality, optional: true }, { token: MatDateSelectionModel }], target: i0.ɵɵFactoryTarget.Directive });\nMatDatepickerBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatDatepickerBase, inputs: { calendarHeaderComponent: \"calendarHeaderComponent\", startAt: \"startAt\", startView: \"startView\", color: \"color\", touchUi: \"touchUi\", disabled: \"disabled\", xPosition: \"xPosition\", yPosition: \"yPosition\", restoreFocus: \"restoreFocus\", dateClass: \"dateClass\", panelClass: \"panelClass\", opened: \"opened\" }, outputs: { yearSelected: \"yearSelected\", monthSelected: \"monthSelected\", viewChanged: \"viewChanged\", openedStream: \"opened\", closedStream: \"closed\" }, usesOnChanges: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: i9.Overlay }, { type: i0.NgZone }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{\n type: Inject,\n args: [MAT_DATEPICKER_SCROLL_STRATEGY]\n }] }, { type: i1$1.DateAdapter, decorators: [{\n type: Optional\n }] }, { type: i2.Directionality, decorators: [{\n type: Optional\n }] }, { type: MatDateSelectionModel }]; }, propDecorators: { calendarHeaderComponent: [{\n type: Input\n }], startAt: [{\n type: Input\n }], startView: [{\n type: Input\n }], color: [{\n type: Input\n }], touchUi: [{\n type: Input\n }], disabled: [{\n type: Input\n }], xPosition: [{\n type: Input\n }], yPosition: [{\n type: Input\n }], restoreFocus: [{\n type: Input\n }], yearSelected: [{\n type: Output\n }], monthSelected: [{\n type: Output\n }], viewChanged: [{\n type: Output\n }], dateClass: [{\n type: Input\n }], openedStream: [{\n type: Output,\n args: ['opened']\n }], closedStream: [{\n type: Output,\n args: ['closed']\n }], panelClass: [{\n type: Input\n }], opened: [{\n type: Input\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// TODO(mmalerba): We use a component instead of a directive here so the user can use implicit\n// template reference variables (e.g. #d vs #d=\"matDatepicker\"). We can change this to a directive\n// if angular adds support for `exportAs: '$implicit'` on directives.\n/** Component responsible for managing the datepicker popup/dialog. */\nclass MatDatepicker extends MatDatepickerBase {\n}\nMatDatepicker.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepicker, deps: null, target: i0.ɵɵFactoryTarget.Component });\nMatDatepicker.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatDatepicker, selector: \"mat-datepicker\", providers: [\n MAT_SINGLE_DATE_SELECTION_MODEL_PROVIDER,\n { provide: MatDatepickerBase, useExisting: MatDatepicker },\n ], exportAs: [\"matDatepicker\"], usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepicker, decorators: [{\n type: Component,\n args: [{\n selector: 'mat-datepicker',\n template: '',\n exportAs: 'matDatepicker',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n MAT_SINGLE_DATE_SELECTION_MODEL_PROVIDER,\n { provide: MatDatepickerBase, useExisting: MatDatepicker },\n ],\n }]\n }] });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/**\n * An event used for datepicker input and change events. We don't always have access to a native\n * input or change event because the event may have been triggered by the user clicking on the\n * calendar popup. For consistency, we always use MatDatepickerInputEvent instead.\n */\nclass MatDatepickerInputEvent {\n constructor(\n /** Reference to the datepicker input component that emitted the event. */\n target, \n /** Reference to the native input element associated with the datepicker input. */\n targetElement) {\n this.target = target;\n this.targetElement = targetElement;\n this.value = this.target.value;\n }\n}\n/** Base class for datepicker inputs. */\nclass MatDatepickerInputBase {\n /** The value of the input. */\n get value() {\n return this._model ? this._getValueFromModel(this._model.selection) : this._pendingValue;\n }\n set value(value) {\n this._assignValueProgrammatically(value);\n }\n /** Whether the datepicker-input is disabled. */\n get disabled() {\n return !!this._disabled || this._parentDisabled();\n }\n set disabled(value) {\n const newValue = coerceBooleanProperty(value);\n const element = this._elementRef.nativeElement;\n if (this._disabled !== newValue) {\n this._disabled = newValue;\n this.stateChanges.next(undefined);\n }\n // We need to null check the `blur` method, because it's undefined during SSR.\n // In Ivy static bindings are invoked earlier, before the element is attached to the DOM.\n // This can cause an error to be thrown in some browsers (IE/Edge) which assert that the\n // element has been inserted.\n if (newValue && this._isInitialized && element.blur) {\n // Normally, native input elements automatically blur if they turn disabled. This behavior\n // is problematic, because it would mean that it triggers another change detection cycle,\n // which then causes a changed after checked error if the input element was focused before.\n element.blur();\n }\n }\n /** Gets the base validator functions. */\n _getValidators() {\n return [this._parseValidator, this._minValidator, this._maxValidator, this._filterValidator];\n }\n /** Registers a date selection model with the input. */\n _registerModel(model) {\n this._model = model;\n this._valueChangesSubscription.unsubscribe();\n if (this._pendingValue) {\n this._assignValue(this._pendingValue);\n }\n this._valueChangesSubscription = this._model.selectionChanged.subscribe(event => {\n if (this._shouldHandleChangeEvent(event)) {\n const value = this._getValueFromModel(event.selection);\n this._lastValueValid = this._isValidValue(value);\n this._cvaOnChange(value);\n this._onTouched();\n this._formatValue(value);\n this.dateInput.emit(new MatDatepickerInputEvent(this, this._elementRef.nativeElement));\n this.dateChange.emit(new MatDatepickerInputEvent(this, this._elementRef.nativeElement));\n }\n });\n }\n constructor(_elementRef, _dateAdapter, _dateFormats) {\n this._elementRef = _elementRef;\n this._dateAdapter = _dateAdapter;\n this._dateFormats = _dateFormats;\n /** Emits when a `change` event is fired on this ``. */\n this.dateChange = new EventEmitter();\n /** Emits when an `input` event is fired on this ``. */\n this.dateInput = new EventEmitter();\n /** Emits when the internal state has changed */\n this.stateChanges = new Subject();\n this._onTouched = () => { };\n this._validatorOnChange = () => { };\n this._cvaOnChange = () => { };\n this._valueChangesSubscription = Subscription.EMPTY;\n this._localeSubscription = Subscription.EMPTY;\n /** The form control validator for whether the input parses. */\n this._parseValidator = () => {\n return this._lastValueValid\n ? null\n : { 'matDatepickerParse': { 'text': this._elementRef.nativeElement.value } };\n };\n /** The form control validator for the date filter. */\n this._filterValidator = (control) => {\n const controlValue = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(control.value));\n return !controlValue || this._matchesFilter(controlValue)\n ? null\n : { 'matDatepickerFilter': true };\n };\n /** The form control validator for the min date. */\n this._minValidator = (control) => {\n const controlValue = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(control.value));\n const min = this._getMinDate();\n return !min || !controlValue || this._dateAdapter.compareDate(min, controlValue) <= 0\n ? null\n : { 'matDatepickerMin': { 'min': min, 'actual': controlValue } };\n };\n /** The form control validator for the max date. */\n this._maxValidator = (control) => {\n const controlValue = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(control.value));\n const max = this._getMaxDate();\n return !max || !controlValue || this._dateAdapter.compareDate(max, controlValue) >= 0\n ? null\n : { 'matDatepickerMax': { 'max': max, 'actual': controlValue } };\n };\n /** Whether the last value set on the input was valid. */\n this._lastValueValid = false;\n if (typeof ngDevMode === 'undefined' || ngDevMode) {\n if (!this._dateAdapter) {\n throw createMissingDateImplError('DateAdapter');\n }\n if (!this._dateFormats) {\n throw createMissingDateImplError('MAT_DATE_FORMATS');\n }\n }\n // Update the displayed date when the locale changes.\n this._localeSubscription = _dateAdapter.localeChanges.subscribe(() => {\n this._assignValueProgrammatically(this.value);\n });\n }\n ngAfterViewInit() {\n this._isInitialized = true;\n }\n ngOnChanges(changes) {\n if (dateInputsHaveChanged(changes, this._dateAdapter)) {\n this.stateChanges.next(undefined);\n }\n }\n ngOnDestroy() {\n this._valueChangesSubscription.unsubscribe();\n this._localeSubscription.unsubscribe();\n this.stateChanges.complete();\n }\n /** @docs-private */\n registerOnValidatorChange(fn) {\n this._validatorOnChange = fn;\n }\n /** @docs-private */\n validate(c) {\n return this._validator ? this._validator(c) : null;\n }\n // Implemented as part of ControlValueAccessor.\n writeValue(value) {\n this._assignValueProgrammatically(value);\n }\n // Implemented as part of ControlValueAccessor.\n registerOnChange(fn) {\n this._cvaOnChange = fn;\n }\n // Implemented as part of ControlValueAccessor.\n registerOnTouched(fn) {\n this._onTouched = fn;\n }\n // Implemented as part of ControlValueAccessor.\n setDisabledState(isDisabled) {\n this.disabled = isDisabled;\n }\n _onKeydown(event) {\n const ctrlShiftMetaModifiers = ['ctrlKey', 'shiftKey', 'metaKey'];\n const isAltDownArrow = hasModifierKey(event, 'altKey') &&\n event.keyCode === DOWN_ARROW &&\n ctrlShiftMetaModifiers.every((modifier) => !hasModifierKey(event, modifier));\n if (isAltDownArrow && !this._elementRef.nativeElement.readOnly) {\n this._openPopup();\n event.preventDefault();\n }\n }\n _onInput(value) {\n const lastValueWasValid = this._lastValueValid;\n let date = this._dateAdapter.parse(value, this._dateFormats.parse.dateInput);\n this._lastValueValid = this._isValidValue(date);\n date = this._dateAdapter.getValidDateOrNull(date);\n const hasChanged = !this._dateAdapter.sameDate(date, this.value);\n // We need to fire the CVA change event for all\n // nulls, otherwise the validators won't run.\n if (!date || hasChanged) {\n this._cvaOnChange(date);\n }\n else {\n // Call the CVA change handler for invalid values\n // since this is what marks the control as dirty.\n if (value && !this.value) {\n this._cvaOnChange(date);\n }\n if (lastValueWasValid !== this._lastValueValid) {\n this._validatorOnChange();\n }\n }\n if (hasChanged) {\n this._assignValue(date);\n this.dateInput.emit(new MatDatepickerInputEvent(this, this._elementRef.nativeElement));\n }\n }\n _onChange() {\n this.dateChange.emit(new MatDatepickerInputEvent(this, this._elementRef.nativeElement));\n }\n /** Handles blur events on the input. */\n _onBlur() {\n // Reformat the input only if we have a valid value.\n if (this.value) {\n this._formatValue(this.value);\n }\n this._onTouched();\n }\n /** Formats a value and sets it on the input element. */\n _formatValue(value) {\n this._elementRef.nativeElement.value =\n value != null ? this._dateAdapter.format(value, this._dateFormats.display.dateInput) : '';\n }\n /** Assigns a value to the model. */\n _assignValue(value) {\n // We may get some incoming values before the model was\n // assigned. Save the value so that we can assign it later.\n if (this._model) {\n this._assignValueToModel(value);\n this._pendingValue = null;\n }\n else {\n this._pendingValue = value;\n }\n }\n /** Whether a value is considered valid. */\n _isValidValue(value) {\n return !value || this._dateAdapter.isValid(value);\n }\n /**\n * Checks whether a parent control is disabled. This is in place so that it can be overridden\n * by inputs extending this one which can be placed inside of a group that can be disabled.\n */\n _parentDisabled() {\n return false;\n }\n /** Programmatically assigns a value to the input. */\n _assignValueProgrammatically(value) {\n value = this._dateAdapter.deserialize(value);\n this._lastValueValid = this._isValidValue(value);\n value = this._dateAdapter.getValidDateOrNull(value);\n this._assignValue(value);\n this._formatValue(value);\n }\n /** Gets whether a value matches the current date filter. */\n _matchesFilter(value) {\n const filter = this._getDateFilter();\n return !filter || filter(value);\n }\n}\nMatDatepickerInputBase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerInputBase, deps: [{ token: i0.ElementRef }, { token: i1$1.DateAdapter, optional: true }, { token: MAT_DATE_FORMATS, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\nMatDatepickerInputBase.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatDatepickerInputBase, inputs: { value: \"value\", disabled: \"disabled\" }, outputs: { dateChange: \"dateChange\", dateInput: \"dateInput\" }, usesOnChanges: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerInputBase, decorators: [{\n type: Directive\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$1.DateAdapter, decorators: [{\n type: Optional\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_DATE_FORMATS]\n }] }]; }, propDecorators: { value: [{\n type: Input\n }], disabled: [{\n type: Input\n }], dateChange: [{\n type: Output\n }], dateInput: [{\n type: Output\n }] } });\n/**\n * Checks whether the `SimpleChanges` object from an `ngOnChanges`\n * callback has any changes, accounting for date objects.\n */\nfunction dateInputsHaveChanged(changes, adapter) {\n const keys = Object.keys(changes);\n for (let key of keys) {\n const { previousValue, currentValue } = changes[key];\n if (adapter.isDateInstance(previousValue) && adapter.isDateInstance(currentValue)) {\n if (!adapter.sameDate(previousValue, currentValue)) {\n return true;\n }\n }\n else {\n return true;\n }\n }\n return false;\n}\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** @docs-private */\nconst MAT_DATEPICKER_VALUE_ACCESSOR = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MatDatepickerInput),\n multi: true,\n};\n/** @docs-private */\nconst MAT_DATEPICKER_VALIDATORS = {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => MatDatepickerInput),\n multi: true,\n};\n/** Directive used to connect an input to a MatDatepicker. */\nclass MatDatepickerInput extends MatDatepickerInputBase {\n /** The datepicker that this input is associated with. */\n set matDatepicker(datepicker) {\n if (datepicker) {\n this._datepicker = datepicker;\n this._closedSubscription = datepicker.closedStream.subscribe(() => this._onTouched());\n this._registerModel(datepicker.registerInput(this));\n }\n }\n /** The minimum valid date. */\n get min() {\n return this._min;\n }\n set min(value) {\n const validValue = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n if (!this._dateAdapter.sameDate(validValue, this._min)) {\n this._min = validValue;\n this._validatorOnChange();\n }\n }\n /** The maximum valid date. */\n get max() {\n return this._max;\n }\n set max(value) {\n const validValue = this._dateAdapter.getValidDateOrNull(this._dateAdapter.deserialize(value));\n if (!this._dateAdapter.sameDate(validValue, this._max)) {\n this._max = validValue;\n this._validatorOnChange();\n }\n }\n /** Function that can be used to filter out dates within the datepicker. */\n get dateFilter() {\n return this._dateFilter;\n }\n set dateFilter(value) {\n const wasMatchingValue = this._matchesFilter(this.value);\n this._dateFilter = value;\n if (this._matchesFilter(this.value) !== wasMatchingValue) {\n this._validatorOnChange();\n }\n }\n constructor(elementRef, dateAdapter, dateFormats, _formField) {\n super(elementRef, dateAdapter, dateFormats);\n this._formField = _formField;\n this._closedSubscription = Subscription.EMPTY;\n this._validator = Validators.compose(super._getValidators());\n }\n /**\n * Gets the element that the datepicker popup should be connected to.\n * @return The element to connect the popup to.\n */\n getConnectedOverlayOrigin() {\n return this._formField ? this._formField.getConnectedOverlayOrigin() : this._elementRef;\n }\n /** Gets the ID of an element that should be used a description for the calendar overlay. */\n getOverlayLabelId() {\n if (this._formField) {\n return this._formField.getLabelId();\n }\n return this._elementRef.nativeElement.getAttribute('aria-labelledby');\n }\n /** Returns the palette used by the input's form field, if any. */\n getThemePalette() {\n return this._formField ? this._formField.color : undefined;\n }\n /** Gets the value at which the calendar should start. */\n getStartValue() {\n return this.value;\n }\n ngOnDestroy() {\n super.ngOnDestroy();\n this._closedSubscription.unsubscribe();\n }\n /** Opens the associated datepicker. */\n _openPopup() {\n if (this._datepicker) {\n this._datepicker.open();\n }\n }\n _getValueFromModel(modelValue) {\n return modelValue;\n }\n _assignValueToModel(value) {\n if (this._model) {\n this._model.updateSelection(value, this);\n }\n }\n /** Gets the input's minimum date. */\n _getMinDate() {\n return this._min;\n }\n /** Gets the input's maximum date. */\n _getMaxDate() {\n return this._max;\n }\n /** Gets the input's date filtering function. */\n _getDateFilter() {\n return this._dateFilter;\n }\n _shouldHandleChangeEvent(event) {\n return event.source !== this;\n }\n}\nMatDatepickerInput.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerInput, deps: [{ token: i0.ElementRef }, { token: i1$1.DateAdapter, optional: true }, { token: MAT_DATE_FORMATS, optional: true }, { token: MAT_FORM_FIELD, optional: true }], target: i0.ɵɵFactoryTarget.Directive });\nMatDatepickerInput.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatDatepickerInput, selector: \"input[matDatepicker]\", inputs: { matDatepicker: \"matDatepicker\", min: \"min\", max: \"max\", dateFilter: [\"matDatepickerFilter\", \"dateFilter\"] }, host: { listeners: { \"input\": \"_onInput($event.target.value)\", \"change\": \"_onChange()\", \"blur\": \"_onBlur()\", \"keydown\": \"_onKeydown($event)\" }, properties: { \"attr.aria-haspopup\": \"_datepicker ? \\\"dialog\\\" : null\", \"attr.aria-owns\": \"(_datepicker?.opened && _datepicker.id) || null\", \"attr.min\": \"min ? _dateAdapter.toIso8601(min) : null\", \"attr.max\": \"max ? _dateAdapter.toIso8601(max) : null\", \"attr.data-mat-calendar\": \"_datepicker ? _datepicker.id : null\", \"disabled\": \"disabled\" }, classAttribute: \"mat-datepicker-input\" }, providers: [\n MAT_DATEPICKER_VALUE_ACCESSOR,\n MAT_DATEPICKER_VALIDATORS,\n { provide: MAT_INPUT_VALUE_ACCESSOR, useExisting: MatDatepickerInput },\n ], exportAs: [\"matDatepickerInput\"], usesInheritance: true, ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerInput, decorators: [{\n type: Directive,\n args: [{\n selector: 'input[matDatepicker]',\n providers: [\n MAT_DATEPICKER_VALUE_ACCESSOR,\n MAT_DATEPICKER_VALIDATORS,\n { provide: MAT_INPUT_VALUE_ACCESSOR, useExisting: MatDatepickerInput },\n ],\n host: {\n 'class': 'mat-datepicker-input',\n '[attr.aria-haspopup]': '_datepicker ? \"dialog\" : null',\n '[attr.aria-owns]': '(_datepicker?.opened && _datepicker.id) || null',\n '[attr.min]': 'min ? _dateAdapter.toIso8601(min) : null',\n '[attr.max]': 'max ? _dateAdapter.toIso8601(max) : null',\n // Used by the test harness to tie this input to its calendar. We can't depend on\n // `aria-owns` for this, because it's only defined while the calendar is open.\n '[attr.data-mat-calendar]': '_datepicker ? _datepicker.id : null',\n '[disabled]': 'disabled',\n '(input)': '_onInput($event.target.value)',\n '(change)': '_onChange()',\n '(blur)': '_onBlur()',\n '(keydown)': '_onKeydown($event)',\n },\n exportAs: 'matDatepickerInput',\n }]\n }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1$1.DateAdapter, decorators: [{\n type: Optional\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_DATE_FORMATS]\n }] }, { type: undefined, decorators: [{\n type: Optional\n }, {\n type: Inject,\n args: [MAT_FORM_FIELD]\n }] }]; }, propDecorators: { matDatepicker: [{\n type: Input\n }], min: [{\n type: Input\n }], max: [{\n type: Input\n }], dateFilter: [{\n type: Input,\n args: ['matDatepickerFilter']\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n/** Can be used to override the icon of a `matDatepickerToggle`. */\nclass MatDatepickerToggleIcon {\n}\nMatDatepickerToggleIcon.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerToggleIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive });\nMatDatepickerToggleIcon.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatDatepickerToggleIcon, selector: \"[matDatepickerToggleIcon]\", ngImport: i0 });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerToggleIcon, decorators: [{\n type: Directive,\n args: [{\n selector: '[matDatepickerToggleIcon]',\n }]\n }] });\nclass MatDatepickerToggle {\n /** Whether the toggle button is disabled. */\n get disabled() {\n if (this._disabled === undefined && this.datepicker) {\n return this.datepicker.disabled;\n }\n return !!this._disabled;\n }\n set disabled(value) {\n this._disabled = coerceBooleanProperty(value);\n }\n constructor(_intl, _changeDetectorRef, defaultTabIndex) {\n this._intl = _intl;\n this._changeDetectorRef = _changeDetectorRef;\n this._stateChanges = Subscription.EMPTY;\n const parsedTabIndex = Number(defaultTabIndex);\n this.tabIndex = parsedTabIndex || parsedTabIndex === 0 ? parsedTabIndex : null;\n }\n ngOnChanges(changes) {\n if (changes['datepicker']) {\n this._watchStateChanges();\n }\n }\n ngOnDestroy() {\n this._stateChanges.unsubscribe();\n }\n ngAfterContentInit() {\n this._watchStateChanges();\n }\n _open(event) {\n if (this.datepicker && !this.disabled) {\n this.datepicker.open();\n event.stopPropagation();\n }\n }\n _watchStateChanges() {\n const datepickerStateChanged = this.datepicker ? this.datepicker.stateChanges : of();\n const inputStateChanged = this.datepicker && this.datepicker.datepickerInput\n ? this.datepicker.datepickerInput.stateChanges\n : of();\n const datepickerToggled = this.datepicker\n ? merge(this.datepicker.openedStream, this.datepicker.closedStream)\n : of();\n this._stateChanges.unsubscribe();\n this._stateChanges = merge(this._intl.changes, datepickerStateChanged, inputStateChanged, datepickerToggled).subscribe(() => this._changeDetectorRef.markForCheck());\n }\n}\nMatDatepickerToggle.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerToggle, deps: [{ token: MatDatepickerIntl }, { token: i0.ChangeDetectorRef }, { token: 'tabindex', attribute: true }], target: i0.ɵɵFactoryTarget.Component });\nMatDatepickerToggle.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"14.0.0\", version: \"15.2.0-rc.0\", type: MatDatepickerToggle, selector: \"mat-datepicker-toggle\", inputs: { datepicker: [\"for\", \"datepicker\"], tabIndex: \"tabIndex\", ariaLabel: [\"aria-label\", \"ariaLabel\"], disabled: \"disabled\", disableRipple: \"disableRipple\" }, host: { listeners: { \"click\": \"_open($event)\" }, properties: { \"attr.tabindex\": \"null\", \"class.mat-datepicker-toggle-active\": \"datepicker && datepicker.opened\", \"class.mat-accent\": \"datepicker && datepicker.color === \\\"accent\\\"\", \"class.mat-warn\": \"datepicker && datepicker.color === \\\"warn\\\"\", \"attr.data-mat-calendar\": \"datepicker ? datepicker.id : null\" }, classAttribute: \"mat-datepicker-toggle\" }, queries: [{ propertyName: \"_customIcon\", first: true, predicate: MatDatepickerToggleIcon, descendants: true }], viewQueries: [{ propertyName: \"_button\", first: true, predicate: [\"button\"], descendants: true }], exportAs: [\"matDatepickerToggle\"], usesOnChanges: true, ngImport: i0, template: \"\\n\\n \\n \\n \\n\\n \\n\\n\", styles: [\".mat-datepicker-toggle{pointer-events:auto}.cdk-high-contrast-active .mat-datepicker-toggle-default-icon{color:CanvasText}\"], dependencies: [{ kind: \"directive\", type: i1.NgIf, selector: \"[ngIf]\", inputs: [\"ngIf\", \"ngIfThen\", \"ngIfElse\"] }, { kind: \"component\", type: i3.MatIconButton, selector: \"button[mat-icon-button]\", inputs: [\"disabled\", \"disableRipple\", \"color\"], exportAs: [\"matButton\"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"15.2.0-rc.0\", ngImport: i0, type: MatDatepickerToggle, decorators: [{\n type: Component,\n args: [{ selector: 'mat-datepicker-toggle', host: {\n 'class': 'mat-datepicker-toggle',\n '[attr.tabindex]': 'null',\n '[class.mat-datepicker-toggle-active]': 'datepicker && datepicker.opened',\n '[class.mat-accent]': 'datepicker && datepicker.color === \"accent\"',\n '[class.mat-warn]': 'datepicker && datepicker.color === \"warn\"',\n // Used by the test harness to tie this toggle to its datepicker.\n '[attr.data-mat-calendar]': 'datepicker ? datepicker.id : null',\n // Bind the `click` on the host, rather than the inner `button`, so that we can call\n // `stopPropagation` on it without affecting the user's `click` handlers. We need to stop\n // it so that the input doesn't get focused automatically by the form field (See #21836).\n '(click)': '_open($event)',\n }, exportAs: 'matDatepickerToggle', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: \"\\n\\n \\n \\n \\n\\n \\n\\n\", styles: [\".mat-datepicker-toggle{pointer-events:auto}.cdk-high-contrast-active .mat-datepicker-toggle-default-icon{color:CanvasText}\"] }]\n }], ctorParameters: function () { return [{ type: MatDatepickerIntl }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{\n type: Attribute,\n args: ['tabindex']\n }] }]; }, propDecorators: { datepicker: [{\n type: Input,\n args: ['for']\n }], tabIndex: [{\n type: Input\n }], ariaLabel: [{\n type: Input,\n args: ['aria-label']\n }], disabled: [{\n type: Input\n }], disableRipple: [{\n type: Input\n }], _customIcon: [{\n type: ContentChild,\n args: [MatDatepickerToggleIcon]\n }], _button: [{\n type: ViewChild,\n args: ['button']\n }] } });\n\n/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n// This file contains the `_computeAriaAccessibleName` function, which computes what the *expected*\n// ARIA accessible name would be for a given element. Implements a subset of ARIA specification\n// [Accessible Name and Description Computation 1.2](https://www.w3.org/TR/accname-1.2/).\n//\n// Specification accname-1.2 can be summarized by returning the result of the first method\n// available.\n//\n// 1. `aria-labelledby` attribute\n// ```\n// \n// \n// \n// ```\n// 2. `aria-label` attribute (e.g. ``)\n// 3. Label with `for`/`id`\n// ```\n// \n// \n// \n// ```\n// 4. `placeholder` attribute (e.g. ``)\n// 5. `title` attribute (e.g. ``)\n// 6. text content\n// ```\n// \n// \n// \n// ```\n/**\n * Computes the *expected* ARIA accessible name for argument element based on [accname-1.2\n * specification](https://www.w3.org/TR/accname-1.2/). Implements a subset of accname-1.2,\n * and should only be used for the Datepicker's specific use case.\n *\n * Intended use:\n * This is not a general use implementation. Only implements the parts of accname-1.2 that are\n * required for the Datepicker's specific use case. This function is not intended for any other\n * use.\n *\n * Limitations:\n * - Only covers the needs of `matStartDate` and `matEndDate`. Does not support other use cases.\n * - See NOTES's in implementation for specific details on what parts of the accname-1.2\n * specification are not implemented.\n *\n * @param element {HTMLInputElement} native <input/> element of `matStartDate` or\n * `matEndDate` component. Corresponds to the 'Root Element' from accname-1.2\n *\n * @return expected ARIA accessible name of argument <input/>\n */\nfunction _computeAriaAccessibleName(element) {\n return _computeAriaAccessibleNameInternal(element, true);\n}\n/**\n * Determine if argument node is an Element based on `nodeType` property. This function is safe to\n * use with server-side rendering.\n */\nfunction ssrSafeIsElement(node) {\n return node.nodeType === Node.ELEMENT_NODE;\n}\n/**\n * Determine if argument node is an HTMLInputElement based on `nodeName` property. This funciton is\n * safe to use with server-side rendering.\n */\nfunction ssrSafeIsHTMLInputElement(node) {\n return node.nodeName === 'INPUT';\n}\n/**\n * Determine if argument node is an HTMLTextAreaElement based on `nodeName` property. This\n * funciton is safe to use with server-side rendering.\n */\nfunction ssrSafeIsHTMLTextAreaElement(node) {\n return node.nodeName === 'TEXTAREA';\n}\n/**\n * Calculate the expected ARIA accessible name for given DOM Node. Given DOM Node may be either the\n * \"Root node\" passed to `_computeAriaAccessibleName` or \"Current node\" as result of recursion.\n *\n * @return the accessible name of argument DOM Node\n *\n * @param currentNode node to determine accessible name of\n * @param isDirectlyReferenced true if `currentNode` is the root node to calculate ARIA accessible\n * name of. False if it is a result of recursion.\n */\nfunction _computeAriaAccessibleNameInternal(currentNode, isDirectlyReferenced) {\n // NOTE: this differs from accname-1.2 specification.\n // - Does not implement Step 1. of accname-1.2: '''If `currentNode`'s role prohibits naming,\n // return the empty string (\"\")'''.\n // - Does not implement Step 2.A. of accname-1.2: '''if current node is hidden and not directly\n // referenced by aria-labelledby... return the empty string.'''\n // acc-name-1.2 Step 2.B.: aria-labelledby\n if (ssrSafeIsElement(currentNode) && isDirectlyReferenced) {\n const labelledbyIds = currentNode.getAttribute?.('aria-labelledby')?.split(/\\s+/g) || [];\n const validIdRefs = labelledbyIds.reduce((validIds, id) => {\n const elem = document.getElementById(id);\n if (elem) {\n validIds.push(elem);\n }\n return validIds;\n }, []);\n if (validIdRefs.length) {\n return validIdRefs\n .map(idRef => {\n return _computeAriaAccessibleNameInternal(idRef, false);\n })\n .join(' ');\n }\n }\n // acc-name-1.2 Step 2.C.: aria-label\n if (ssrSafeIsElement(currentNode)) {\n const ariaLabel = currentNode.getAttribute('aria-label')?.trim();\n if (ariaLabel) {\n return ariaLabel;\n }\n }\n // acc-name-1.2 Step 2.D. attribute or element that defines a text alternative\n //\n // NOTE: this differs from accname-1.2 specification.\n // Only implements Step 2.D. for `