blob: b09af614a8bd72b53b122fab3b710ed8cd9b9f54 [file] [log] [blame]
{"version":3,"file":"select.js","sources":["../../../src/material/select/select-module.ts","../../../src/material/select/select.ts","../../../src/material/select/select-errors.ts","../../../src/material/select/select-animations.ts"],"sourcesContent":["/**\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\nimport {OverlayModule} from '@angular/cdk/overlay';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule, MatOptionModule} from '@angular/material/core';\nimport {MatFormFieldModule} from '@angular/material/form-field';\nimport {MAT_SELECT_SCROLL_STRATEGY_PROVIDER, MatSelect, MatSelectTrigger} from './select';\n\n\n@NgModule({\n imports: [\n CommonModule,\n OverlayModule,\n MatOptionModule,\n MatCommonModule,\n ],\n exports: [MatFormFieldModule, MatSelect, MatSelectTrigger, MatOptionModule, MatCommonModule],\n declarations: [MatSelect, MatSelectTrigger],\n providers: [MAT_SELECT_SCROLL_STRATEGY_PROVIDER]\n})\nexport class MatSelectModule {}\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\nimport {ActiveDescendantKeyManager, LiveAnnouncer} from '@angular/cdk/a11y';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {SelectionModel} from '@angular/cdk/collections';\nimport {\n A,\n DOWN_ARROW,\n END,\n ENTER,\n HOME,\n LEFT_ARROW,\n RIGHT_ARROW,\n SPACE,\n UP_ARROW,\n hasModifierKey,\n} from '@angular/cdk/keycodes';\nimport {CdkConnectedOverlay, Overlay, ScrollStrategy} from '@angular/cdk/overlay';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {\n AfterContentInit,\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n Directive,\n DoCheck,\n ElementRef,\n EventEmitter,\n Inject,\n InjectionToken,\n Input,\n isDevMode,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n QueryList,\n Self,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {ControlValueAccessor, FormGroupDirective, NgControl, NgForm} from '@angular/forms';\nimport {\n _countGroupLabelsBeforeOption,\n _getOptionScrollPosition,\n CanDisable,\n CanDisableCtor,\n CanDisableRipple,\n CanDisableRippleCtor,\n CanUpdateErrorState,\n CanUpdateErrorStateCtor,\n ErrorStateMatcher,\n HasTabIndex,\n HasTabIndexCtor,\n MAT_OPTION_PARENT_COMPONENT,\n MatOptgroup,\n MatOption,\n MatOptionSelectionChange,\n mixinDisabled,\n mixinDisableRipple,\n mixinErrorState,\n mixinTabIndex,\n} from '@angular/material/core';\nimport {MatFormField, MatFormFieldControl} from '@angular/material/form-field';\nimport {defer, merge, Observable, Subject} from 'rxjs';\nimport {\n distinctUntilChanged,\n filter,\n map,\n startWith,\n switchMap,\n take,\n takeUntil,\n} from 'rxjs/operators';\nimport {matSelectAnimations} from './select-animations';\nimport {\n getMatSelectDynamicMultipleError,\n getMatSelectNonArrayValueError,\n getMatSelectNonFunctionValueError,\n} from './select-errors';\n\n\nlet nextUniqueId = 0;\n\n/**\n * The following style constants are necessary to save here in order\n * to properly calculate the alignment of the selected option over\n * the trigger element.\n */\n\n/** The max height of the select's overlay panel */\nexport const SELECT_PANEL_MAX_HEIGHT = 256;\n\n/** The panel's padding on the x-axis */\nexport const SELECT_PANEL_PADDING_X = 16;\n\n/** The panel's x axis padding if it is indented (e.g. there is an option group). */\nexport const SELECT_PANEL_INDENT_PADDING_X = SELECT_PANEL_PADDING_X * 2;\n\n/** The height of the select items in `em` units. */\nexport const SELECT_ITEM_HEIGHT_EM = 3;\n\n// TODO(josephperrott): Revert to a constant after 2018 spec updates are fully merged.\n/**\n * Distance between the panel edge and the option text in\n * multi-selection mode.\n *\n * Calculated as:\n * (SELECT_PANEL_PADDING_X * 1.5) + 20 = 44\n * The padding is multiplied by 1.5 because the checkbox's margin is half the padding.\n * The checkbox width is 16px.\n */\nexport let SELECT_MULTIPLE_PANEL_PADDING_X = 0;\n\n/**\n * The select panel will only \"fit\" inside the viewport if it is positioned at\n * this value or more away from the viewport boundary.\n */\nexport const SELECT_PANEL_VIEWPORT_PADDING = 8;\n\n/** Injection token that determines the scroll handling while a select is open. */\nexport const MAT_SELECT_SCROLL_STRATEGY =\n new InjectionToken<() => ScrollStrategy>('mat-select-scroll-strategy');\n\n/** @docs-private */\nexport function MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY(overlay: Overlay):\n () => ScrollStrategy {\n return () => overlay.scrollStrategies.reposition();\n}\n\n/** @docs-private */\nexport const MAT_SELECT_SCROLL_STRATEGY_PROVIDER = {\n provide: MAT_SELECT_SCROLL_STRATEGY,\n deps: [Overlay],\n useFactory: MAT_SELECT_SCROLL_STRATEGY_PROVIDER_FACTORY,\n};\n\n/** Change event object that is emitted when the select value has changed. */\nexport class MatSelectChange {\n constructor(\n /** Reference to the select that emitted the change event. */\n public source: MatSelect,\n /** Current value of the select that emitted the event. */\n public value: any) { }\n}\n\n// Boilerplate for applying mixins to MatSelect.\n/** @docs-private */\nclass MatSelectBase {\n constructor(public _elementRef: ElementRef,\n public _defaultErrorStateMatcher: ErrorStateMatcher,\n public _parentForm: NgForm,\n public _parentFormGroup: FormGroupDirective,\n public ngControl: NgControl) {}\n}\nconst _MatSelectMixinBase:\n CanDisableCtor &\n HasTabIndexCtor &\n CanDisableRippleCtor &\n CanUpdateErrorStateCtor &\n typeof MatSelectBase =\n mixinDisableRipple(mixinTabIndex(mixinDisabled(mixinErrorState(MatSelectBase))));\n\n\n/**\n * Allows the user to customize the trigger that is displayed when the select has a value.\n */\n@Directive({\n selector: 'mat-select-trigger'\n})\nexport class MatSelectTrigger {}\n\n\n@Component({\n moduleId: module.id,\n selector: 'mat-select',\n exportAs: 'matSelect',\n templateUrl: 'select.html',\n styleUrls: ['select.css'],\n inputs: ['disabled', 'disableRipple', 'tabIndex'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'role': 'listbox',\n '[attr.id]': 'id',\n '[attr.tabindex]': 'tabIndex',\n '[attr.aria-label]': '_getAriaLabel()',\n '[attr.aria-labelledby]': '_getAriaLabelledby()',\n '[attr.aria-required]': 'required.toString()',\n '[attr.aria-disabled]': 'disabled.toString()',\n '[attr.aria-invalid]': 'errorState',\n '[attr.aria-owns]': 'panelOpen ? _optionIds : null',\n '[attr.aria-multiselectable]': 'multiple',\n '[attr.aria-describedby]': '_ariaDescribedby || null',\n '[attr.aria-activedescendant]': '_getAriaActiveDescendant()',\n '[class.mat-select-disabled]': 'disabled',\n '[class.mat-select-invalid]': 'errorState',\n '[class.mat-select-required]': 'required',\n '[class.mat-select-empty]': 'empty',\n 'class': 'mat-select',\n '(keydown)': '_handleKeydown($event)',\n '(focus)': '_onFocus()',\n '(blur)': '_onBlur()',\n },\n animations: [\n matSelectAnimations.transformPanelWrap,\n matSelectAnimations.transformPanel\n ],\n providers: [\n {provide: MatFormFieldControl, useExisting: MatSelect},\n {provide: MAT_OPTION_PARENT_COMPONENT, useExisting: MatSelect}\n ],\n})\nexport class MatSelect extends _MatSelectMixinBase implements AfterContentInit, OnChanges,\n OnDestroy, OnInit, DoCheck, ControlValueAccessor, CanDisable, HasTabIndex,\n MatFormFieldControl<any>, CanUpdateErrorState, CanDisableRipple {\n private _scrollStrategyFactory: () => ScrollStrategy;\n\n /** Whether or not the overlay panel is open. */\n private _panelOpen = false;\n\n /** Whether filling out the select is required in the form. */\n private _required: boolean = false;\n\n /** The scroll position of the overlay panel, calculated to center the selected option. */\n private _scrollTop = 0;\n\n /** The placeholder displayed in the trigger of the select. */\n private _placeholder: string;\n\n /** Whether the component is in multiple selection mode. */\n private _multiple: boolean = false;\n\n /** Comparison function to specify which option is displayed. Defaults to object equality. */\n private _compareWith = (o1: any, o2: any) => o1 === o2;\n\n /** Unique id for this input. */\n private _uid = `mat-select-${nextUniqueId++}`;\n\n /** Emits whenever the component is destroyed. */\n private readonly _destroy = new Subject<void>();\n\n /** The last measured value for the trigger's client bounding rect. */\n _triggerRect: ClientRect;\n\n /** The aria-describedby attribute on the select for improved a11y. */\n _ariaDescribedby: string;\n\n /** The cached font-size of the trigger element. */\n _triggerFontSize = 0;\n\n /** Deals with the selection logic. */\n _selectionModel: SelectionModel<MatOption>;\n\n /** Manages keyboard events for options in the panel. */\n _keyManager: ActiveDescendantKeyManager<MatOption>;\n\n /** `View -> model callback called when value changes` */\n _onChange: (value: any) => void = () => {};\n\n /** `View -> model callback called when select has been touched` */\n _onTouched = () => {};\n\n /** The IDs of child options to be passed to the aria-owns attribute. */\n _optionIds: string = '';\n\n /** The value of the select panel's transform-origin property. */\n _transformOrigin: string = 'top';\n\n /** Emits when the panel element is finished transforming in. */\n _panelDoneAnimatingStream = new Subject<string>();\n\n /** Strategy that will be used to handle scrolling while the select panel is open. */\n _scrollStrategy: ScrollStrategy;\n\n /**\n * The y-offset of the overlay panel in relation to the trigger's top start corner.\n * This must be adjusted to align the selected option text over the trigger text.\n * when the panel opens. Will change based on the y-position of the selected option.\n */\n _offsetY = 0;\n\n /**\n * This position config ensures that the top \"start\" corner of the overlay\n * is aligned with with the top \"start\" of the origin by default (overlapping\n * the trigger completely). If the panel cannot fit below the trigger, it\n * will fall back to a position above the trigger.\n */\n _positions = [\n {\n originX: 'start',\n originY: 'top',\n overlayX: 'start',\n overlayY: 'top',\n },\n {\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'bottom',\n },\n ];\n\n /** Whether the component is disabling centering of the active option over the trigger. */\n private _disableOptionCentering: boolean = false;\n\n /** Whether the select is focused. */\n get focused(): boolean {\n return this._focused || this._panelOpen;\n }\n /**\n * @deprecated Setter to be removed as this property is intended to be readonly.\n * @breaking-change 8.0.0\n */\n set focused(value: boolean) {\n this._focused = value;\n }\n private _focused = false;\n\n /** A name for this control that can be used by `mat-form-field`. */\n controlType = 'mat-select';\n\n /** Trigger that opens the select. */\n @ViewChild('trigger', {static: false}) trigger: ElementRef;\n\n /** Panel containing the select options. */\n @ViewChild('panel', {static: false}) panel: ElementRef;\n\n /** Overlay pane containing the options. */\n @ViewChild(CdkConnectedOverlay, {static: false}) overlayDir: CdkConnectedOverlay;\n\n /** All of the defined select options. */\n @ContentChildren(MatOption, { descendants: true }) options: QueryList<MatOption>;\n\n /** All of the defined groups of options. */\n @ContentChildren(MatOptgroup) optionGroups: QueryList<MatOptgroup>;\n\n /** Classes to be passed to the select panel. Supports the same syntax as `ngClass`. */\n @Input() panelClass: string|string[]|Set<string>|{[key: string]: any};\n\n /** User-supplied override of the trigger element. */\n @ContentChild(MatSelectTrigger, {static: false}) customTrigger: MatSelectTrigger;\n\n /** Placeholder to be shown if no value has been selected. */\n @Input()\n get placeholder(): string { return this._placeholder; }\n set placeholder(value: string) {\n this._placeholder = value;\n this.stateChanges.next();\n }\n\n /** Whether the component is required. */\n @Input()\n get required(): boolean { return this._required; }\n set required(value: boolean) {\n this._required = coerceBooleanProperty(value);\n this.stateChanges.next();\n }\n\n /** Whether the user should be allowed to select multiple options. */\n @Input()\n get multiple(): boolean { return this._multiple; }\n set multiple(value: boolean) {\n if (this._selectionModel) {\n throw getMatSelectDynamicMultipleError();\n }\n\n this._multiple = coerceBooleanProperty(value);\n }\n\n /** Whether to center the active option over the trigger. */\n @Input()\n get disableOptionCentering(): boolean { return this._disableOptionCentering; }\n set disableOptionCentering(value: boolean) {\n this._disableOptionCentering = coerceBooleanProperty(value);\n }\n\n /**\n * Function to compare the option values with the selected values. The first argument\n * is a value from an option. The second is a value from the selection. A boolean\n * should be returned.\n */\n @Input()\n get compareWith() { return this._compareWith; }\n set compareWith(fn: (o1: any, o2: any) => boolean) {\n if (typeof fn !== 'function') {\n throw getMatSelectNonFunctionValueError();\n }\n this._compareWith = fn;\n if (this._selectionModel) {\n // A different comparator means the selection could change.\n this._initializeSelection();\n }\n }\n\n /** Value of the select control. */\n @Input()\n get value(): any { return this._value; }\n set value(newValue: any) {\n if (newValue !== this._value) {\n this.writeValue(newValue);\n this._value = newValue;\n }\n }\n private _value: any;\n\n /** Aria label of the select. If not specified, the placeholder will be used as label. */\n @Input('aria-label') ariaLabel: string = '';\n\n /** Input that can be used to specify the `aria-labelledby` attribute. */\n @Input('aria-labelledby') ariaLabelledby: string;\n\n /** Object used to control when error messages are shown. */\n @Input() errorStateMatcher: ErrorStateMatcher;\n\n /**\n * Function used to sort the values in a select in multiple mode.\n * Follows the same logic as `Array.prototype.sort`.\n */\n @Input() sortComparator: (a: MatOption, b: MatOption, options: MatOption[]) => number;\n\n /** Unique id of the element. */\n @Input()\n get id(): string { return this._id; }\n set id(value: string) {\n this._id = value || this._uid;\n this.stateChanges.next();\n }\n private _id: string;\n\n /** Combined stream of all of the child options' change events. */\n readonly optionSelectionChanges: Observable<MatOptionSelectionChange> = defer(() => {\n const options = this.options;\n\n if (options) {\n return options.changes.pipe(\n startWith(options),\n switchMap(() => merge(...options.map(option => option.onSelectionChange)))\n );\n }\n\n return this._ngZone.onStable\n .asObservable()\n .pipe(take(1), switchMap(() => this.optionSelectionChanges));\n }) as Observable<MatOptionSelectionChange>;\n\n /** Event emitted when the select panel has been toggled. */\n @Output() readonly openedChange: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** Event emitted when the select has been opened. */\n @Output('opened') readonly _openedStream: Observable<void> =\n this.openedChange.pipe(filter(o => o), map(() => {}));\n\n /** Event emitted when the select has been closed. */\n @Output('closed') readonly _closedStream: Observable<void> =\n this.openedChange.pipe(filter(o => !o), map(() => {}));\n\n /** Event emitted when the selected value has been changed by the user. */\n @Output() readonly selectionChange: EventEmitter<MatSelectChange> =\n new EventEmitter<MatSelectChange>();\n\n /**\n * Event that emits whenever the raw value of the select changes. This is here primarily\n * to facilitate the two-way binding for the `value` input.\n * @docs-private\n */\n @Output() readonly valueChange: EventEmitter<any> = new EventEmitter<any>();\n\n constructor(\n private _viewportRuler: ViewportRuler,\n private _changeDetectorRef: ChangeDetectorRef,\n private _ngZone: NgZone,\n _defaultErrorStateMatcher: ErrorStateMatcher,\n elementRef: ElementRef,\n @Optional() private _dir: Directionality,\n @Optional() _parentForm: NgForm,\n @Optional() _parentFormGroup: FormGroupDirective,\n @Optional() private _parentFormField: MatFormField,\n @Self() @Optional() public ngControl: NgControl,\n @Attribute('tabindex') tabIndex: string,\n @Inject(MAT_SELECT_SCROLL_STRATEGY) scrollStrategyFactory: any,\n /**\n * @deprecated _liveAnnouncer to be turned into a required parameter.\n * @breaking-change 8.0.0\n */\n private _liveAnnouncer?: LiveAnnouncer) {\n super(elementRef, _defaultErrorStateMatcher, _parentForm,\n _parentFormGroup, ngControl);\n\n if (this.ngControl) {\n // Note: we provide the value accessor through here, instead of\n // the `providers` to avoid running into a circular import.\n this.ngControl.valueAccessor = this;\n }\n\n this._scrollStrategyFactory = scrollStrategyFactory;\n this._scrollStrategy = this._scrollStrategyFactory();\n this.tabIndex = parseInt(tabIndex) || 0;\n\n // Force setter to be called in case id was not specified.\n this.id = this.id;\n }\n\n ngOnInit() {\n this._selectionModel = new SelectionModel<MatOption>(this.multiple);\n this.stateChanges.next();\n\n // We need `distinctUntilChanged` here, because some browsers will\n // fire the animation end event twice for the same animation. See:\n // https://github.com/angular/angular/issues/24084\n this._panelDoneAnimatingStream\n .pipe(distinctUntilChanged(), takeUntil(this._destroy))\n .subscribe(() => {\n if (this.panelOpen) {\n this._scrollTop = 0;\n this.openedChange.emit(true);\n } else {\n this.openedChange.emit(false);\n this.overlayDir.offsetX = 0;\n this._changeDetectorRef.markForCheck();\n }\n });\n\n this._viewportRuler.change()\n .pipe(takeUntil(this._destroy))\n .subscribe(() => {\n if (this._panelOpen) {\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\n this._changeDetectorRef.markForCheck();\n }\n });\n }\n\n ngAfterContentInit() {\n this._initKeyManager();\n\n this._selectionModel.onChange.pipe(takeUntil(this._destroy)).subscribe(event => {\n event.added.forEach(option => option.select());\n event.removed.forEach(option => option.deselect());\n });\n\n this.options.changes.pipe(startWith(null), takeUntil(this._destroy)).subscribe(() => {\n this._resetOptions();\n this._initializeSelection();\n });\n }\n\n ngDoCheck() {\n if (this.ngControl) {\n this.updateErrorState();\n }\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // Updating the disabled state is handled by `mixinDisabled`, but we need to additionally let\n // the parent form field know to run change detection when the disabled state changes.\n if (changes['disabled']) {\n this.stateChanges.next();\n }\n }\n\n ngOnDestroy() {\n this._destroy.next();\n this._destroy.complete();\n this.stateChanges.complete();\n }\n\n /** Toggles the overlay panel open or closed. */\n toggle(): void {\n this.panelOpen ? this.close() : this.open();\n }\n\n /** Opens the overlay panel. */\n open(): void {\n if (this.disabled || !this.options || !this.options.length || this._panelOpen) {\n return;\n }\n\n this._triggerRect = this.trigger.nativeElement.getBoundingClientRect();\n // Note: The computed font-size will be a string pixel value (e.g. \"16px\").\n // `parseInt` ignores the trailing 'px' and converts this to a number.\n this._triggerFontSize = parseInt(getComputedStyle(this.trigger.nativeElement).fontSize || '0');\n\n this._panelOpen = true;\n this._keyManager.withHorizontalOrientation(null);\n this._calculateOverlayPosition();\n this._highlightCorrectOption();\n this._changeDetectorRef.markForCheck();\n\n // Set the font size on the panel element once it exists.\n this._ngZone.onStable.asObservable().pipe(take(1)).subscribe(() => {\n if (this._triggerFontSize && this.overlayDir.overlayRef &&\n this.overlayDir.overlayRef.overlayElement) {\n this.overlayDir.overlayRef.overlayElement.style.fontSize = `${this._triggerFontSize}px`;\n }\n });\n }\n\n /** Closes the overlay panel and focuses the host element. */\n close(): void {\n if (this._panelOpen) {\n this._panelOpen = false;\n this._keyManager.withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr');\n this._changeDetectorRef.markForCheck();\n this._onTouched();\n }\n }\n\n /**\n * Sets the select's value. Part of the ControlValueAccessor interface\n * required to integrate with Angular's core forms API.\n *\n * @param value New value to be written to the model.\n */\n writeValue(value: any): void {\n if (this.options) {\n this._setSelectionByValue(value);\n }\n }\n\n /**\n * Saves a callback function to be invoked when the select's value\n * changes from user input. Part of the ControlValueAccessor interface\n * required to integrate with Angular's core forms API.\n *\n * @param fn Callback to be triggered when the value changes.\n */\n registerOnChange(fn: (value: any) => void): void {\n this._onChange = fn;\n }\n\n /**\n * Saves a callback function to be invoked when the select is blurred\n * by the user. Part of the ControlValueAccessor interface required\n * to integrate with Angular's core forms API.\n *\n * @param fn Callback to be triggered when the component has been touched.\n */\n registerOnTouched(fn: () => {}): void {\n this._onTouched = fn;\n }\n\n /**\n * Disables the select. Part of the ControlValueAccessor interface required\n * to integrate with Angular's core forms API.\n *\n * @param isDisabled Sets whether the component is disabled.\n */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this._changeDetectorRef.markForCheck();\n this.stateChanges.next();\n }\n\n /** Whether or not the overlay panel is open. */\n get panelOpen(): boolean {\n return this._panelOpen;\n }\n\n /** The currently selected option. */\n get selected(): MatOption | MatOption[] {\n return this.multiple ? this._selectionModel.selected : this._selectionModel.selected[0];\n }\n\n /** The value displayed in the trigger. */\n get triggerValue(): string {\n if (this.empty) {\n return '';\n }\n\n if (this._multiple) {\n const selectedOptions = this._selectionModel.selected.map(option => option.viewValue);\n\n if (this._isRtl()) {\n selectedOptions.reverse();\n }\n\n // TODO(crisbeto): delimiter should be configurable for proper localization.\n return selectedOptions.join(', ');\n }\n\n return this._selectionModel.selected[0].viewValue;\n }\n\n /** Whether the element is in RTL mode. */\n _isRtl(): boolean {\n return this._dir ? this._dir.value === 'rtl' : false;\n }\n\n /** Handles all keydown events on the select. */\n _handleKeydown(event: KeyboardEvent): void {\n if (!this.disabled) {\n this.panelOpen ? this._handleOpenKeydown(event) : this._handleClosedKeydown(event);\n }\n }\n\n /** Handles keyboard events while the select is closed. */\n private _handleClosedKeydown(event: KeyboardEvent): void {\n const keyCode = event.keyCode;\n const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW ||\n keyCode === LEFT_ARROW || keyCode === RIGHT_ARROW;\n const isOpenKey = keyCode === ENTER || keyCode === SPACE;\n const manager = this._keyManager;\n\n // Open the select on ALT + arrow key to match the native <select>\n if ((isOpenKey && !hasModifierKey(event)) || ((this.multiple || event.altKey) && isArrowKey)) {\n event.preventDefault(); // prevents the page from scrolling down when pressing space\n this.open();\n } else if (!this.multiple) {\n const previouslySelectedOption = this.selected;\n\n if (keyCode === HOME || keyCode === END) {\n keyCode === HOME ? manager.setFirstItemActive() : manager.setLastItemActive();\n event.preventDefault();\n } else {\n manager.onKeydown(event);\n }\n\n const selectedOption = this.selected;\n\n // Since the value has changed, we need to announce it ourselves.\n // @breaking-change 8.0.0 remove null check for _liveAnnouncer.\n if (this._liveAnnouncer && selectedOption && previouslySelectedOption !== selectedOption) {\n // We set a duration on the live announcement, because we want the live element to be\n // cleared after a while so that users can't navigate to it using the arrow keys.\n this._liveAnnouncer.announce((selectedOption as MatOption).viewValue, 10000);\n }\n }\n }\n\n /** Handles keyboard events when the selected is open. */\n private _handleOpenKeydown(event: KeyboardEvent): void {\n const keyCode = event.keyCode;\n const isArrowKey = keyCode === DOWN_ARROW || keyCode === UP_ARROW;\n const manager = this._keyManager;\n\n if (keyCode === HOME || keyCode === END) {\n event.preventDefault();\n keyCode === HOME ? manager.setFirstItemActive() : manager.setLastItemActive();\n } else if (isArrowKey && event.altKey) {\n // Close the select on ALT + arrow key to match the native <select>\n event.preventDefault();\n this.close();\n } else if ((keyCode === ENTER || keyCode === SPACE) && manager.activeItem &&\n !hasModifierKey(event)) {\n event.preventDefault();\n manager.activeItem._selectViaInteraction();\n } else if (this._multiple && keyCode === A && event.ctrlKey) {\n event.preventDefault();\n const hasDeselectedOptions = this.options.some(opt => !opt.disabled && !opt.selected);\n\n this.options.forEach(option => {\n if (!option.disabled) {\n hasDeselectedOptions ? option.select() : option.deselect();\n }\n });\n } else {\n const previouslyFocusedIndex = manager.activeItemIndex;\n\n manager.onKeydown(event);\n\n if (this._multiple && isArrowKey && event.shiftKey && manager.activeItem &&\n manager.activeItemIndex !== previouslyFocusedIndex) {\n manager.activeItem._selectViaInteraction();\n }\n }\n }\n\n _onFocus() {\n if (!this.disabled) {\n this._focused = true;\n this.stateChanges.next();\n }\n }\n\n /**\n * Calls the touched callback only if the panel is closed. Otherwise, the trigger will\n * \"blur\" to the panel when it opens, causing a false positive.\n */\n _onBlur() {\n this._focused = false;\n\n if (!this.disabled && !this.panelOpen) {\n this._onTouched();\n this._changeDetectorRef.markForCheck();\n this.stateChanges.next();\n }\n }\n\n /**\n * Callback that is invoked when the overlay panel has been attached.\n */\n _onAttached(): void {\n this.overlayDir.positionChange.pipe(take(1)).subscribe(() => {\n this._setPseudoCheckboxPaddingSize();\n this._changeDetectorRef.detectChanges();\n this._calculateOverlayOffsetX();\n this.panel.nativeElement.scrollTop = this._scrollTop;\n });\n }\n\n /** Returns the theme to be used on the panel. */\n _getPanelTheme(): string {\n return this._parentFormField ? `mat-${this._parentFormField.color}` : '';\n }\n\n // TODO(josephperrott): Remove after 2018 spec updates are fully merged.\n /** Sets the pseudo checkbox padding size based on the width of the pseudo checkbox. */\n private _setPseudoCheckboxPaddingSize() {\n if (!SELECT_MULTIPLE_PANEL_PADDING_X && this.multiple) {\n const pseudoCheckbox = this.panel.nativeElement.querySelector('.mat-pseudo-checkbox');\n if (pseudoCheckbox) {\n SELECT_MULTIPLE_PANEL_PADDING_X = SELECT_PANEL_PADDING_X * 1.5 + pseudoCheckbox.offsetWidth;\n }\n }\n }\n\n /** Whether the select has a value. */\n get empty(): boolean {\n return !this._selectionModel || this._selectionModel.isEmpty();\n }\n\n private _initializeSelection(): void {\n // Defer setting the value in order to avoid the \"Expression\n // has changed after it was checked\" errors from Angular.\n Promise.resolve().then(() => {\n this._setSelectionByValue(this.ngControl ? this.ngControl.value : this._value);\n this.stateChanges.next();\n });\n }\n\n /**\n * Sets the selected option based on a value. If no option can be\n * found with the designated value, the select trigger is cleared.\n */\n private _setSelectionByValue(value: any | any[]): void {\n if (this.multiple && value) {\n if (!Array.isArray(value)) {\n throw getMatSelectNonArrayValueError();\n }\n\n this._selectionModel.clear();\n value.forEach((currentValue: any) => this._selectValue(currentValue));\n this._sortValues();\n } else {\n this._selectionModel.clear();\n const correspondingOption = this._selectValue(value);\n\n // Shift focus to the active item. Note that we shouldn't do this in multiple\n // mode, because we don't know what option the user interacted with last.\n if (correspondingOption) {\n this._keyManager.setActiveItem(correspondingOption);\n }\n }\n\n this._changeDetectorRef.markForCheck();\n }\n\n /**\n * Finds and selects and option based on its value.\n * @returns Option that has the corresponding value.\n */\n private _selectValue(value: any): MatOption | undefined {\n const correspondingOption = this.options.find((option: MatOption) => {\n try {\n // Treat null as a special reset value.\n return option.value != null && this._compareWith(option.value, value);\n } catch (error) {\n if (isDevMode()) {\n // Notify developers of errors in their comparator.\n console.warn(error);\n }\n return false;\n }\n });\n\n if (correspondingOption) {\n this._selectionModel.select(correspondingOption);\n }\n\n return correspondingOption;\n }\n\n /** Sets up a key manager to listen to keyboard events on the overlay panel. */\n private _initKeyManager() {\n this._keyManager = new ActiveDescendantKeyManager<MatOption>(this.options)\n .withTypeAhead()\n .withVerticalOrientation()\n .withHorizontalOrientation(this._isRtl() ? 'rtl' : 'ltr')\n .withAllowedModifierKeys(['shiftKey']);\n\n this._keyManager.tabOut.pipe(takeUntil(this._destroy)).subscribe(() => {\n // Restore focus to the trigger before closing. Ensures that the focus\n // position won't be lost if the user got focus into the overlay.\n this.focus();\n this.close();\n });\n\n this._keyManager.change.pipe(takeUntil(this._destroy)).subscribe(() => {\n if (this._panelOpen && this.panel) {\n this._scrollActiveOptionIntoView();\n } else if (!this._panelOpen && !this.multiple && this._keyManager.activeItem) {\n this._keyManager.activeItem._selectViaInteraction();\n }\n });\n }\n\n /** Drops current option subscriptions and IDs and resets from scratch. */\n private _resetOptions(): void {\n const changedOrDestroyed = merge(this.options.changes, this._destroy);\n\n this.optionSelectionChanges.pipe(takeUntil(changedOrDestroyed)).subscribe(event => {\n this._onSelect(event.source, event.isUserInput);\n\n if (event.isUserInput && !this.multiple && this._panelOpen) {\n this.close();\n this.focus();\n }\n });\n\n // Listen to changes in the internal state of the options and react accordingly.\n // Handles cases like the labels of the selected options changing.\n merge(...this.options.map(option => option._stateChanges))\n .pipe(takeUntil(changedOrDestroyed))\n .subscribe(() => {\n this._changeDetectorRef.markForCheck();\n this.stateChanges.next();\n });\n\n this._setOptionIds();\n }\n\n /** Invoked when an option is clicked. */\n private _onSelect(option: MatOption, isUserInput: boolean): void {\n const wasSelected = this._selectionModel.isSelected(option);\n\n if (option.value == null && !this._multiple) {\n option.deselect();\n this._selectionModel.clear();\n this._propagateChanges(option.value);\n } else {\n option.selected ? this._selectionModel.select(option) : this._selectionModel.deselect(option);\n\n if (isUserInput) {\n this._keyManager.setActiveItem(option);\n }\n\n if (this.multiple) {\n this._sortValues();\n\n if (isUserInput) {\n // In case the user selected the option with their mouse, we\n // want to restore focus back to the trigger, in order to\n // prevent the select keyboard controls from clashing with\n // the ones from `mat-option`.\n this.focus();\n }\n }\n }\n\n if (wasSelected !== this._selectionModel.isSelected(option)) {\n this._propagateChanges();\n }\n\n this.stateChanges.next();\n }\n\n /** Sorts the selected values in the selected based on their order in the panel. */\n private _sortValues() {\n if (this.multiple) {\n const options = this.options.toArray();\n\n this._selectionModel.sort((a, b) => {\n return this.sortComparator ? this.sortComparator(a, b, options) :\n options.indexOf(a) - options.indexOf(b);\n });\n this.stateChanges.next();\n }\n }\n\n /** Emits change event to set the model value. */\n private _propagateChanges(fallbackValue?: any): void {\n let valueToEmit: any = null;\n\n if (this.multiple) {\n valueToEmit = (this.selected as MatOption[]).map(option => option.value);\n } else {\n valueToEmit = this.selected ? (this.selected as MatOption).value : fallbackValue;\n }\n\n this._value = valueToEmit;\n this.valueChange.emit(valueToEmit);\n this._onChange(valueToEmit);\n this.selectionChange.emit(new MatSelectChange(this, valueToEmit));\n this._changeDetectorRef.markForCheck();\n }\n\n /** Records option IDs to pass to the aria-owns property. */\n private _setOptionIds() {\n this._optionIds = this.options.map(option => option.id).join(' ');\n }\n\n /**\n * Highlights the selected item. If no option is selected, it will highlight\n * the first item instead.\n */\n private _highlightCorrectOption(): void {\n if (this._keyManager) {\n if (this.empty) {\n this._keyManager.setFirstItemActive();\n } else {\n this._keyManager.setActiveItem(this._selectionModel.selected[0]);\n }\n }\n }\n\n /** Scrolls the active option into view. */\n private _scrollActiveOptionIntoView(): void {\n const activeOptionIndex = this._keyManager.activeItemIndex || 0;\n const labelCount = _countGroupLabelsBeforeOption(activeOptionIndex, this.options,\n this.optionGroups);\n\n this.panel.nativeElement.scrollTop = _getOptionScrollPosition(\n activeOptionIndex + labelCount,\n this._getItemHeight(),\n this.panel.nativeElement.scrollTop,\n SELECT_PANEL_MAX_HEIGHT\n );\n }\n\n /** Focuses the select element. */\n focus(): void {\n this._elementRef.nativeElement.focus();\n }\n\n /** Gets the index of the provided option in the option list. */\n private _getOptionIndex(option: MatOption): number | undefined {\n return this.options.reduce((result: number | undefined, current: MatOption, index: number) => {\n return result === undefined ? (option === current ? index : undefined) : result;\n }, undefined);\n }\n\n /** Calculates the scroll position and x- and y-offsets of the overlay panel. */\n private _calculateOverlayPosition(): void {\n const itemHeight = this._getItemHeight();\n const items = this._getItemCount();\n const panelHeight = Math.min(items * itemHeight, SELECT_PANEL_MAX_HEIGHT);\n const scrollContainerHeight = items * itemHeight;\n\n // The farthest the panel can be scrolled before it hits the bottom\n const maxScroll = scrollContainerHeight - panelHeight;\n\n // If no value is selected we open the popup to the first item.\n let selectedOptionOffset =\n this.empty ? 0 : this._getOptionIndex(this._selectionModel.selected[0])!;\n\n selectedOptionOffset += _countGroupLabelsBeforeOption(selectedOptionOffset, this.options,\n this.optionGroups);\n\n // We must maintain a scroll buffer so the selected option will be scrolled to the\n // center of the overlay panel rather than the top.\n const scrollBuffer = panelHeight / 2;\n this._scrollTop = this._calculateOverlayScroll(selectedOptionOffset, scrollBuffer, maxScroll);\n this._offsetY = this._calculateOverlayOffsetY(selectedOptionOffset, scrollBuffer, maxScroll);\n\n this._checkOverlayWithinViewport(maxScroll);\n }\n\n /**\n * Calculates the scroll position of the select's overlay panel.\n *\n * Attempts to center the selected option in the panel. If the option is\n * too high or too low in the panel to be scrolled to the center, it clamps the\n * scroll position to the min or max scroll positions respectively.\n */\n _calculateOverlayScroll(selectedIndex: number, scrollBuffer: number,\n maxScroll: number): number {\n const itemHeight = this._getItemHeight();\n const optionOffsetFromScrollTop = itemHeight * selectedIndex;\n const halfOptionHeight = itemHeight / 2;\n\n // Starts at the optionOffsetFromScrollTop, which scrolls the option to the top of the\n // scroll container, then subtracts the scroll buffer to scroll the option down to\n // the center of the overlay panel. Half the option height must be re-added to the\n // scrollTop so the option is centered based on its middle, not its top edge.\n const optimalScrollPosition = optionOffsetFromScrollTop - scrollBuffer + halfOptionHeight;\n return Math.min(Math.max(0, optimalScrollPosition), maxScroll);\n }\n\n /** Returns the aria-label of the select component. */\n _getAriaLabel(): string | null {\n // If an ariaLabelledby value has been set by the consumer, the select should not overwrite the\n // `aria-labelledby` value by setting the ariaLabel to the placeholder.\n return this.ariaLabelledby ? null : this.ariaLabel || this.placeholder;\n }\n\n /** Returns the aria-labelledby of the select component. */\n _getAriaLabelledby(): string | null {\n if (this.ariaLabelledby) {\n return this.ariaLabelledby;\n }\n\n // Note: we use `_getAriaLabel` here, because we want to check whether there's a\n // computed label. `this.ariaLabel` is only the user-specified label.\n if (!this._parentFormField || !this._parentFormField._hasFloatingLabel() ||\n this._getAriaLabel()) {\n return null;\n }\n\n return this._parentFormField._labelId || null;\n }\n\n /** Determines the `aria-activedescendant` to be set on the host. */\n _getAriaActiveDescendant(): string | null {\n if (this.panelOpen && this._keyManager && this._keyManager.activeItem) {\n return this._keyManager.activeItem.id;\n }\n\n return null;\n }\n\n /**\n * Sets the x-offset of the overlay panel in relation to the trigger's top start corner.\n * This must be adjusted to align the selected option text over the trigger text when\n * the panel opens. Will change based on LTR or RTL text direction. Note that the offset\n * can't be calculated until the panel has been attached, because we need to know the\n * content width in order to constrain the panel within the viewport.\n */\n private _calculateOverlayOffsetX(): void {\n const overlayRect = this.overlayDir.overlayRef.overlayElement.getBoundingClientRect();\n const viewportSize = this._viewportRuler.getViewportSize();\n const isRtl = this._isRtl();\n const paddingWidth = this.multiple ? SELECT_MULTIPLE_PANEL_PADDING_X + SELECT_PANEL_PADDING_X :\n SELECT_PANEL_PADDING_X * 2;\n let offsetX: number;\n\n // Adjust the offset, depending on the option padding.\n if (this.multiple) {\n offsetX = SELECT_MULTIPLE_PANEL_PADDING_X;\n } else {\n let selected = this._selectionModel.selected[0] || this.options.first;\n offsetX = selected && selected.group ? SELECT_PANEL_INDENT_PADDING_X : SELECT_PANEL_PADDING_X;\n }\n\n // Invert the offset in LTR.\n if (!isRtl) {\n offsetX *= -1;\n }\n\n // Determine how much the select overflows on each side.\n const leftOverflow = 0 - (overlayRect.left + offsetX - (isRtl ? paddingWidth : 0));\n const rightOverflow = overlayRect.right + offsetX - viewportSize.width\n + (isRtl ? 0 : paddingWidth);\n\n // If the element overflows on either side, reduce the offset to allow it to fit.\n if (leftOverflow > 0) {\n offsetX += leftOverflow + SELECT_PANEL_VIEWPORT_PADDING;\n } else if (rightOverflow > 0) {\n offsetX -= rightOverflow + SELECT_PANEL_VIEWPORT_PADDING;\n }\n\n // Set the offset directly in order to avoid having to go through change detection and\n // potentially triggering \"changed after it was checked\" errors. Round the value to avoid\n // blurry content in some browsers.\n this.overlayDir.offsetX = Math.round(offsetX);\n this.overlayDir.overlayRef.updatePosition();\n }\n\n /**\n * Calculates the y-offset of the select's overlay panel in relation to the\n * top start corner of the trigger. It has to be adjusted in order for the\n * selected option to be aligned over the trigger when the panel opens.\n */\n private _calculateOverlayOffsetY(selectedIndex: number, scrollBuffer: number,\n maxScroll: number): number {\n const itemHeight = this._getItemHeight();\n const optionHeightAdjustment = (itemHeight - this._triggerRect.height) / 2;\n const maxOptionsDisplayed = Math.floor(SELECT_PANEL_MAX_HEIGHT / itemHeight);\n let optionOffsetFromPanelTop: number;\n\n // Disable offset if requested by user by returning 0 as value to offset\n if (this._disableOptionCentering) {\n return 0;\n }\n\n if (this._scrollTop === 0) {\n optionOffsetFromPanelTop = selectedIndex * itemHeight;\n } else if (this._scrollTop === maxScroll) {\n const firstDisplayedIndex = this._getItemCount() - maxOptionsDisplayed;\n const selectedDisplayIndex = selectedIndex - firstDisplayedIndex;\n\n // The first item is partially out of the viewport. Therefore we need to calculate what\n // portion of it is shown in the viewport and account for it in our offset.\n let partialItemHeight =\n itemHeight - (this._getItemCount() * itemHeight - SELECT_PANEL_MAX_HEIGHT) % itemHeight;\n\n // Because the panel height is longer than the height of the options alone,\n // there is always extra padding at the top or bottom of the panel. When\n // scrolled to the very bottom, this padding is at the top of the panel and\n // must be added to the offset.\n optionOffsetFromPanelTop = selectedDisplayIndex * itemHeight + partialItemHeight;\n } else {\n // If the option was scrolled to the middle of the panel using a scroll buffer,\n // its offset will be the scroll buffer minus the half height that was added to\n // center it.\n optionOffsetFromPanelTop = scrollBuffer - itemHeight / 2;\n }\n\n // The final offset is the option's offset from the top, adjusted for the height difference,\n // multiplied by -1 to ensure that the overlay moves in the correct direction up the page.\n // The value is rounded to prevent some browsers from blurring the content.\n return Math.round(optionOffsetFromPanelTop * -1 - optionHeightAdjustment);\n }\n\n /**\n * Checks that the attempted overlay position will fit within the viewport.\n * If it will not fit, tries to adjust the scroll position and the associated\n * y-offset so the panel can open fully on-screen. If it still won't fit,\n * sets the offset back to 0 to allow the fallback position to take over.\n */\n private _checkOverlayWithinViewport(maxScroll: number): void {\n const itemHeight = this._getItemHeight();\n const viewportSize = this._viewportRuler.getViewportSize();\n\n const topSpaceAvailable = this._triggerRect.top - SELECT_PANEL_VIEWPORT_PADDING;\n const bottomSpaceAvailable =\n viewportSize.height - this._triggerRect.bottom - SELECT_PANEL_VIEWPORT_PADDING;\n\n const panelHeightTop = Math.abs(this._offsetY);\n const totalPanelHeight =\n Math.min(this._getItemCount() * itemHeight, SELECT_PANEL_MAX_HEIGHT);\n const panelHeightBottom = totalPanelHeight - panelHeightTop - this._triggerRect.height;\n\n if (panelHeightBottom > bottomSpaceAvailable) {\n this._adjustPanelUp(panelHeightBottom, bottomSpaceAvailable);\n } else if (panelHeightTop > topSpaceAvailable) {\n this._adjustPanelDown(panelHeightTop, topSpaceAvailable, maxScroll);\n } else {\n this._transformOrigin = this._getOriginBasedOnOption();\n }\n }\n\n /** Adjusts the overlay panel up to fit in the viewport. */\n private _adjustPanelUp(panelHeightBottom: number, bottomSpaceAvailable: number) {\n // Browsers ignore fractional scroll offsets, so we need to round.\n const distanceBelowViewport = Math.round(panelHeightBottom - bottomSpaceAvailable);\n\n // Scrolls the panel up by the distance it was extending past the boundary, then\n // adjusts the offset by that amount to move the panel up into the viewport.\n this._scrollTop -= distanceBelowViewport;\n this._offsetY -= distanceBelowViewport;\n this._transformOrigin = this._getOriginBasedOnOption();\n\n // If the panel is scrolled to the very top, it won't be able to fit the panel\n // by scrolling, so set the offset to 0 to allow the fallback position to take\n // effect.\n if (this._scrollTop <= 0) {\n this._scrollTop = 0;\n this._offsetY = 0;\n this._transformOrigin = `50% bottom 0px`;\n }\n }\n\n /** Adjusts the overlay panel down to fit in the viewport. */\n private _adjustPanelDown(panelHeightTop: number, topSpaceAvailable: number,\n maxScroll: number) {\n // Browsers ignore fractional scroll offsets, so we need to round.\n const distanceAboveViewport = Math.round(panelHeightTop - topSpaceAvailable);\n\n // Scrolls the panel down by the distance it was extending past the boundary, then\n // adjusts the offset by that amount to move the panel down into the viewport.\n this._scrollTop += distanceAboveViewport;\n this._offsetY += distanceAboveViewport;\n this._transformOrigin = this._getOriginBasedOnOption();\n\n // If the panel is scrolled to the very bottom, it won't be able to fit the\n // panel by scrolling, so set the offset to 0 to allow the fallback position\n // to take effect.\n if (this._scrollTop >= maxScroll) {\n this._scrollTop = maxScroll;\n this._offsetY = 0;\n this._transformOrigin = `50% top 0px`;\n return;\n }\n }\n\n /** Sets the transform origin point based on the selected option. */\n private _getOriginBasedOnOption(): string {\n const itemHeight = this._getItemHeight();\n const optionHeightAdjustment = (itemHeight - this._triggerRect.height) / 2;\n const originY = Math.abs(this._offsetY) - optionHeightAdjustment + itemHeight / 2;\n return `50% ${originY}px 0px`;\n }\n\n /** Calculates the amount of items in the select. This includes options and group labels. */\n private _getItemCount(): number {\n return this.options.length + this.optionGroups.length;\n }\n\n /** Calculates the height of the select's options. */\n private _getItemHeight(): number {\n return this._triggerFontSize * SELECT_ITEM_HEIGHT_EM;\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n setDescribedByIds(ids: string[]) {\n this._ariaDescribedby = ids.join(' ');\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n onContainerClick() {\n this.focus();\n this.open();\n }\n\n /**\n * Implemented as part of MatFormFieldControl.\n * @docs-private\n */\n get shouldLabelFloat(): boolean {\n return this._panelOpen || !this.empty;\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/**\n * Returns an exception to be thrown when attempting to change a select's `multiple` option\n * after initialization.\n * @docs-private\n */\nexport function getMatSelectDynamicMultipleError(): Error {\n return Error('Cannot change `multiple` mode of select after initialization.');\n}\n\n/**\n * Returns an exception to be thrown when attempting to assign a non-array value to a select\n * in `multiple` mode. Note that `undefined` and `null` are still valid values to allow for\n * resetting the value.\n * @docs-private\n */\nexport function getMatSelectNonArrayValueError(): Error {\n return Error('Value must be an array in multiple-selection mode.');\n}\n\n/**\n * Returns an exception to be thrown when assigning a non-function value to the comparator\n * used to determine if a value corresponds to an option. Note that whether the function\n * actually takes two values and returns a boolean is not checked.\n */\nexport function getMatSelectNonFunctionValueError(): Error {\n return Error('`compareWith` must be a function.');\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\nimport {\n animate,\n animateChild,\n AnimationTriggerMetadata,\n query,\n state,\n style,\n transition,\n trigger,\n} from '@angular/animations';\n\n/**\n * The following are all the animations for the mat-select component, with each\n * const containing the metadata for one animation.\n *\n * The values below match the implementation of the AngularJS Material mat-select animation.\n * @docs-private\n */\nexport const matSelectAnimations: {\n readonly transformPanelWrap: AnimationTriggerMetadata;\n readonly transformPanel: AnimationTriggerMetadata;\n readonly fadeInContent: AnimationTriggerMetadata;\n} = {\n /**\n * This animation ensures the select's overlay panel animation (transformPanel) is called when\n * closing the select.\n * This is needed due to https://github.com/angular/angular/issues/23302\n */\n transformPanelWrap: trigger('transformPanelWrap', [\n transition('* => void', query('@transformPanel', [animateChild()],\n {optional: true}))\n ]),\n\n /**\n * This animation transforms the select's overlay panel on and off the page.\n *\n * When the panel is attached to the DOM, it expands its width by the amount of padding, scales it\n * up to 100% on the Y axis, fades in its border, and translates slightly up and to the\n * side to ensure the option text correctly overlaps the trigger text.\n *\n * When the panel is removed from the DOM, it simply fades out linearly.\n */\n transformPanel: trigger('transformPanel', [\n state('void', style({\n transform: 'scaleY(0.8)',\n minWidth: '100%',\n opacity: 0\n })),\n state('showing', style({\n opacity: 1,\n minWidth: 'calc(100% + 32px)', // 32px = 2 * 16px padding\n transform: 'scaleY(1)'\n })),\n state('showing-multiple', style({\n opacity: 1,\n minWidth: 'calc(100% + 64px)', // 64px = 48px padding on the left + 16px padding on the right\n transform: 'scaleY(1)'\n })),\n transition('void => *', animate('120ms cubic-bezier(0, 0, 0.2, 1)')),\n transition('* => void', animate('100ms 25ms linear', style({opacity: 0})))\n ]),\n\n /**\n * This animation fades in the background color and text content of the\n * select's options. It is time delayed to occur 100ms after the overlay\n * panel has transformed in.\n * @deprecated Not used anymore. To be removed.\n * @breaking-change 8.0.0\n */\n fadeInContent: trigger('fadeInContent', [\n state('showing', style({opacity: 1})),\n transition('void => showing', [\n style({opacity: 0}),\n animate('150ms 100ms cubic-bezier(0.55, 0, 0.55, 0.2)')\n ])\n ])\n};\n\n\n/**\n * @deprecated\n * @breaking-change 8.0.0\n * @docs-private\n */\nexport const transformPanel = matSelectAnimations.transformPanel;\n\n/**\n * @deprecated\n * @breaking-change 8.0.0\n * @docs-private\n */\nexport const fadeInContent = matSelectAnimations.fadeInContent;\n"],"names":[],"mappings":"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"}