{"version":3,"file":"tabs.js","sources":["../../../../../../src/material/tabs/ink-bar.ts","../../../../../../src/material/tabs/tab-content.ts","../../../../../../src/material/tabs/tab-label.ts","../../../../../../src/material/tabs/tab.ts","../../../../../../src/material/tabs/tabs-animations.ts","../../../../../../src/material/tabs/tab-body.ts","../../../../../../src/material/tabs/tab-config.ts","../../../../../../src/material/tabs/tab-group.ts","../../../../../../src/material/tabs/tab-label-wrapper.ts","../../../../../../src/material/tabs/paginated-tab-header.ts","../../../../../../src/material/tabs/tab-header.ts","../../../../../../src/material/tabs/tab-nav-bar/tab-nav-bar.ts","../../../../../../src/material/tabs/tabs-module.ts","../../../../../../src/material/tabs/tab-nav-bar/index.ts","../../../../../../src/material/tabs/public-api.ts","../../../../../../src/material/tabs/index.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 {Directive, ElementRef, Inject, InjectionToken, NgZone, Optional} from '@angular/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\n/**\n * Interface for a a MatInkBar positioner method, defining the positioning and width of the ink\n * bar in a set of tabs.\n */\nexport interface _MatInkBarPositioner {\n (element: HTMLElement): { left: string, width: string };\n}\n\n/** Injection token for the MatInkBar's Positioner. */\nexport const _MAT_INK_BAR_POSITIONER =\n new InjectionToken<_MatInkBarPositioner>('MatInkBarPositioner', {\n providedIn: 'root',\n factory: _MAT_INK_BAR_POSITIONER_FACTORY\n });\n\n/**\n * The default positioner function for the MatInkBar.\n * @docs-private\n */\nexport function _MAT_INK_BAR_POSITIONER_FACTORY(): _MatInkBarPositioner {\n const method = (element: HTMLElement) => ({\n left: element ? (element.offsetLeft || 0) + 'px' : '0',\n width: element ? (element.offsetWidth || 0) + 'px' : '0',\n });\n\n return method;\n}\n\n/**\n * The ink-bar is used to display and animate the line underneath the current active tab label.\n * @docs-private\n */\n@Directive({\n selector: 'mat-ink-bar',\n host: {\n 'class': 'mat-ink-bar',\n '[class._mat-animation-noopable]': `_animationMode === 'NoopAnimations'`,\n },\n})\nexport class MatInkBar {\n constructor(\n private _elementRef: ElementRef,\n private _ngZone: NgZone,\n @Inject(_MAT_INK_BAR_POSITIONER) private _inkBarPositioner: _MatInkBarPositioner,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string) { }\n\n /**\n * Calculates the styles from the provided element in order to align the ink-bar to that element.\n * Shows the ink bar if previously set as hidden.\n * @param element\n */\n alignToElement(element: HTMLElement) {\n this.show();\n\n if (typeof requestAnimationFrame !== 'undefined') {\n this._ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => this._setStyles(element));\n });\n } else {\n this._setStyles(element);\n }\n }\n\n /** Shows the ink bar. */\n show(): void {\n this._elementRef.nativeElement.style.visibility = 'visible';\n }\n\n /** Hides the ink bar. */\n hide(): void {\n this._elementRef.nativeElement.style.visibility = 'hidden';\n }\n\n /**\n * Sets the proper styles to the ink bar element.\n * @param element\n */\n private _setStyles(element: HTMLElement) {\n const positions = this._inkBarPositioner(element);\n const inkBar: HTMLElement = this._elementRef.nativeElement;\n\n inkBar.style.left = positions.left;\n inkBar.style.width = positions.width;\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\nimport {Directive, InjectionToken, TemplateRef} from '@angular/core';\n\n/**\n * Injection token that can be used to reference instances of `MatTabContent`. It serves as\n * alternative token to the actual `MatTabContent` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nexport const MAT_TAB_CONTENT = new InjectionToken('MatTabContent');\n\n/** Decorates the `ng-template` tags and reads out the template from it. */\n@Directive({\n selector: '[matTabContent]',\n providers: [{provide: MAT_TAB_CONTENT, useExisting: MatTabContent}],\n})\nexport class MatTabContent {\n constructor(\n /** Content for the tab. */ public template: TemplateRef) {}\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 Directive,\n Inject,\n InjectionToken,\n Optional,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport {CdkPortal} from '@angular/cdk/portal';\n\n/**\n * Injection token that can be used to reference instances of `MatTabLabel`. It serves as\n * alternative token to the actual `MatTabLabel` class which could cause unnecessary\n * retention of the class and its directive metadata.\n */\nexport const MAT_TAB_LABEL = new InjectionToken('MatTabLabel');\n\n/**\n * Used to provide a tab label to a tab without causing a circular dependency.\n * @docs-private\n */\n export const MAT_TAB = new InjectionToken('MAT_TAB');\n\n/** Used to flag tab labels for use with the portal directive */\n@Directive({\n selector: '[mat-tab-label], [matTabLabel]',\n providers: [{provide: MAT_TAB_LABEL, useExisting: MatTabLabel}],\n})\nexport class MatTabLabel extends CdkPortal {\n constructor(\n templateRef: TemplateRef,\n viewContainerRef: ViewContainerRef,\n @Inject(MAT_TAB) @Optional() public _closestTab: any) {\n super(templateRef, viewContainerRef);\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\nimport {BooleanInput} from '@angular/cdk/coercion';\nimport {TemplatePortal} from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation,\n InjectionToken,\n Inject,\n Optional,\n} from '@angular/core';\nimport {CanDisable, mixinDisabled} from '@angular/material/core';\nimport {Subject} from 'rxjs';\nimport {MAT_TAB_CONTENT} from './tab-content';\nimport {MAT_TAB_LABEL, MatTabLabel, MAT_TAB} from './tab-label';\n\n\n// Boilerplate for applying mixins to MatTab.\n/** @docs-private */\nconst _MatTabBase = mixinDisabled(class {});\n\n/**\n * Used to provide a tab group to a tab without causing a circular dependency.\n * @docs-private\n */\nexport const MAT_TAB_GROUP = new InjectionToken('MAT_TAB_GROUP');\n\n@Component({\n selector: 'mat-tab',\n templateUrl: 'tab.html',\n inputs: ['disabled'],\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'matTab',\n providers: [{provide: MAT_TAB, useExisting: MatTab}]\n})\nexport class MatTab extends _MatTabBase implements OnInit, CanDisable, OnChanges, OnDestroy {\n /** Content for the tab label given by ``. */\n @ContentChild(MAT_TAB_LABEL)\n get templateLabel(): MatTabLabel { return this._templateLabel; }\n set templateLabel(value: MatTabLabel) { this._setTemplateLabelInput(value); }\n protected _templateLabel: MatTabLabel;\n\n /**\n * Template provided in the tab content that will be used if present, used to enable lazy-loading\n */\n @ContentChild(MAT_TAB_CONTENT, {read: TemplateRef, static: true})\n _explicitContent: TemplateRef;\n\n /** Template inside the MatTab view that contains an ``. */\n @ViewChild(TemplateRef, {static: true}) _implicitContent: TemplateRef;\n\n /** Plain text label for the tab, used when there is no template label. */\n @Input('label') textLabel: string = '';\n\n /** Aria label for the tab. */\n @Input('aria-label') ariaLabel: string;\n\n /**\n * Reference to the element that the tab is labelled by.\n * Will be cleared if `aria-label` is set at the same time.\n */\n @Input('aria-labelledby') ariaLabelledby: string;\n\n /** Portal that will be the hosted content of the tab */\n private _contentPortal: TemplatePortal | null = null;\n\n /** @docs-private */\n get content(): TemplatePortal | null {\n return this._contentPortal;\n }\n\n /** Emits whenever the internal state of the tab changes. */\n readonly _stateChanges = new Subject();\n\n /**\n * The relatively indexed position where 0 represents the center, negative is left, and positive\n * represents the right.\n */\n position: number | null = null;\n\n /**\n * The initial relatively index origin of the tab if it was created and selected after there\n * was already a selected tab. Provides context of what position the tab should originate from.\n */\n origin: number | null = null;\n\n /**\n * Whether the tab is currently active.\n */\n isActive = false;\n\n constructor(\n private _viewContainerRef: ViewContainerRef,\n @Inject(MAT_TAB_GROUP) @Optional() public _closestTabGroup: any) {\n super();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.hasOwnProperty('textLabel') || changes.hasOwnProperty('disabled')) {\n this._stateChanges.next();\n }\n }\n\n ngOnDestroy(): void {\n this._stateChanges.complete();\n }\n\n ngOnInit(): void {\n this._contentPortal = new TemplatePortal(\n this._explicitContent || this._implicitContent, this._viewContainerRef);\n }\n\n /**\n * This has been extracted to a util because of TS 4 and VE.\n * View Engine doesn't support property rename inheritance.\n * TS 4.0 doesn't allow properties to override accessors or vice-versa.\n * @docs-private\n */\n protected _setTemplateLabelInput(value: MatTabLabel|undefined) {\n // Only update the label if the query managed to find one. This works around an issue where a\n // user may have manually set `templateLabel` during creation mode, which would then get\n // clobbered by `undefined` when the query resolves. Also note that we check that the closest\n // tab matches the current one so that we don't pick up labels from nested tabs.\n if (value && value._closestTab === this) {\n this._templateLabel = value;\n }\n }\n\n static ngAcceptInputType_disabled: BooleanInput;\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 */\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n AnimationTriggerMetadata,\n} from '@angular/animations';\n\n/**\n * Animations used by the Material tabs.\n * @docs-private\n */\nexport const matTabsAnimations: {\n readonly translateTab: AnimationTriggerMetadata;\n} = {\n /** Animation translates a tab along the X axis. */\n translateTab: trigger('translateTab', [\n // Note: transitions to `none` instead of 0, because some browsers might blur the content.\n state('center, void, left-origin-center, right-origin-center', style({transform: 'none'})),\n\n // If the tab is either on the left or right, we additionally add a `min-height` of 1px\n // in order to ensure that the element has a height before its state changes. This is\n // necessary because Chrome does seem to skip the transition in RTL mode if the element does\n // not have a static height and is not rendered. See related issue: #9465\n state('left', style({transform: 'translate3d(-100%, 0, 0)', minHeight: '1px'})),\n state('right', style({transform: 'translate3d(100%, 0, 0)', minHeight: '1px'})),\n\n transition('* => left, * => right, left => center, right => center',\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')),\n transition('void => left-origin-center', [\n style({transform: 'translate3d(-100%, 0, 0)'}),\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')\n ]),\n transition('void => right-origin-center', [\n style({transform: 'translate3d(100%, 0, 0)'}),\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')\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\nimport {\n Component,\n ChangeDetectorRef,\n Input,\n Inject,\n Output,\n EventEmitter,\n OnDestroy,\n OnInit,\n ElementRef,\n Directive,\n Optional,\n ViewEncapsulation,\n ChangeDetectionStrategy,\n ComponentFactoryResolver,\n ViewContainerRef,\n forwardRef,\n ViewChild,\n} from '@angular/core';\nimport {AnimationEvent} from '@angular/animations';\nimport {TemplatePortal, CdkPortalOutlet} from '@angular/cdk/portal';\nimport {Directionality, Direction} from '@angular/cdk/bidi';\nimport {DOCUMENT} from '@angular/common';\nimport {Subscription, Subject} from 'rxjs';\nimport {matTabsAnimations} from './tabs-animations';\nimport {startWith, distinctUntilChanged} from 'rxjs/operators';\n\n/**\n * These position states are used internally as animation states for the tab body. Setting the\n * position state to left, right, or center will transition the tab body from its current\n * position to its respective state. If there is not current position (void, in the case of a new\n * tab body), then there will be no transition animation to its state.\n *\n * In the case of a new tab body that should immediately be centered with an animating transition,\n * then left-origin-center or right-origin-center can be used, which will use left or right as its\n * psuedo-prior state.\n */\nexport type MatTabBodyPositionState =\n 'left' | 'center' | 'right' | 'left-origin-center' | 'right-origin-center';\n\n/**\n * The origin state is an internally used state that is set on a new tab body indicating if it\n * began to the left or right of the prior selected index. For example, if the selected index was\n * set to 1, and a new tab is created and selected at index 2, then the tab body would have an\n * origin of right because its index was greater than the prior selected index.\n */\nexport type MatTabBodyOriginState = 'left' | 'right';\n\n/**\n * The portal host directive for the contents of the tab.\n * @docs-private\n */\n@Directive({\n selector: '[matTabBodyHost]'\n})\nexport class MatTabBodyPortal extends CdkPortalOutlet implements OnInit, OnDestroy {\n /** Subscription to events for when the tab body begins centering. */\n private _centeringSub = Subscription.EMPTY;\n /** Subscription to events for when the tab body finishes leaving from center position. */\n private _leavingSub = Subscription.EMPTY;\n\n constructor(\n componentFactoryResolver: ComponentFactoryResolver,\n viewContainerRef: ViewContainerRef,\n @Inject(forwardRef(() => MatTabBody)) private _host: MatTabBody,\n @Inject(DOCUMENT) _document: any) {\n super(componentFactoryResolver, viewContainerRef, _document);\n }\n\n /** Set initial visibility or set up subscription for changing visibility. */\n override ngOnInit(): void {\n super.ngOnInit();\n\n this._centeringSub = this._host._beforeCentering\n .pipe(startWith(this._host._isCenterPosition(this._host._position)))\n .subscribe((isCentering: boolean) => {\n if (isCentering && !this.hasAttached()) {\n this.attach(this._host._content);\n }\n });\n\n this._leavingSub = this._host._afterLeavingCenter.subscribe(() => {\n this.detach();\n });\n }\n\n /** Clean up centering subscription. */\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n this._centeringSub.unsubscribe();\n this._leavingSub.unsubscribe();\n }\n}\n\n/**\n * Base class with all of the `MatTabBody` functionality.\n * @docs-private\n */\n@Directive()\nexport abstract class _MatTabBodyBase implements OnInit, OnDestroy {\n /** Current position of the tab-body in the tab-group. Zero means that the tab is visible. */\n private _positionIndex: number;\n\n /** Subscription to the directionality change observable. */\n private _dirChangeSubscription = Subscription.EMPTY;\n\n /** Tab body position state. Used by the animation trigger for the current state. */\n _position: MatTabBodyPositionState;\n\n /** Emits when an animation on the tab is complete. */\n readonly _translateTabComplete = new Subject();\n\n /** Event emitted when the tab begins to animate towards the center as the active tab. */\n @Output() readonly _onCentering: EventEmitter = new EventEmitter();\n\n /** Event emitted before the centering of the tab begins. */\n @Output() readonly _beforeCentering: EventEmitter = new EventEmitter();\n\n /** Event emitted before the centering of the tab begins. */\n @Output() readonly _afterLeavingCenter: EventEmitter = new EventEmitter();\n\n /** Event emitted when the tab completes its animation towards the center. */\n @Output() readonly _onCentered: EventEmitter = new EventEmitter(true);\n\n /** The portal host inside of this container into which the tab body content will be loaded. */\n abstract _portalHost: CdkPortalOutlet;\n\n /** The tab body content to display. */\n @Input('content') _content: TemplatePortal;\n\n /** Position that will be used when the tab is immediately becoming visible after creation. */\n @Input() origin: number | null;\n\n // Note that the default value will always be overwritten by `MatTabBody`, but we need one\n // anyway to prevent the animations module from throwing an error if the body is used on its own.\n /** Duration for the tab's animation. */\n @Input() animationDuration: string = '500ms';\n\n /** The shifted index position of the tab body, where zero represents the active center tab. */\n @Input()\n set position(position: number) {\n this._positionIndex = position;\n this._computePositionAnimationState();\n }\n\n constructor(private _elementRef: ElementRef,\n @Optional() private _dir: Directionality,\n changeDetectorRef: ChangeDetectorRef) {\n\n if (_dir) {\n this._dirChangeSubscription = _dir.change.subscribe((dir: Direction) => {\n this._computePositionAnimationState(dir);\n changeDetectorRef.markForCheck();\n });\n }\n\n // Ensure that we get unique animation events, because the `.done` callback can get\n // invoked twice in some browsers. See https://github.com/angular/angular/issues/24084.\n this._translateTabComplete.pipe(distinctUntilChanged((x, y) => {\n return x.fromState === y.fromState && x.toState === y.toState;\n })).subscribe(event => {\n // If the transition to the center is complete, emit an event.\n if (this._isCenterPosition(event.toState) && this._isCenterPosition(this._position)) {\n this._onCentered.emit();\n }\n\n if (this._isCenterPosition(event.fromState) && !this._isCenterPosition(this._position)) {\n this._afterLeavingCenter.emit();\n }\n });\n }\n\n /**\n * After initialized, check if the content is centered and has an origin. If so, set the\n * special position states that transition the tab from the left or right before centering.\n */\n ngOnInit() {\n if (this._position == 'center' && this.origin != null) {\n this._position = this._computePositionFromOrigin(this.origin);\n }\n }\n\n ngOnDestroy() {\n this._dirChangeSubscription.unsubscribe();\n this._translateTabComplete.complete();\n }\n\n _onTranslateTabStarted(event: AnimationEvent): void {\n const isCentering = this._isCenterPosition(event.toState);\n this._beforeCentering.emit(isCentering);\n if (isCentering) {\n this._onCentering.emit(this._elementRef.nativeElement.clientHeight);\n }\n }\n\n /** The text direction of the containing app. */\n _getLayoutDirection(): Direction {\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n\n /** Whether the provided position state is considered center, regardless of origin. */\n _isCenterPosition(position: MatTabBodyPositionState|string): boolean {\n return position == 'center' ||\n position == 'left-origin-center' ||\n position == 'right-origin-center';\n }\n\n /** Computes the position state that will be used for the tab-body animation trigger. */\n private _computePositionAnimationState(dir: Direction = this._getLayoutDirection()) {\n if (this._positionIndex < 0) {\n this._position = dir == 'ltr' ? 'left' : 'right';\n } else if (this._positionIndex > 0) {\n this._position = dir == 'ltr' ? 'right' : 'left';\n } else {\n this._position = 'center';\n }\n }\n\n /**\n * Computes the position state based on the specified origin position. This is used if the\n * tab is becoming visible immediately after creation.\n */\n private _computePositionFromOrigin(origin: number): MatTabBodyPositionState {\n const dir = this._getLayoutDirection();\n\n if ((dir == 'ltr' && origin <= 0) || (dir == 'rtl' && origin > 0)) {\n return 'left-origin-center';\n }\n\n return 'right-origin-center';\n }\n}\n\n/**\n * Wrapper for the contents of a tab.\n * @docs-private\n */\n@Component({\n selector: 'mat-tab-body',\n templateUrl: 'tab-body.html',\n styleUrls: ['tab-body.css'],\n encapsulation: ViewEncapsulation.None,\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n animations: [matTabsAnimations.translateTab],\n host: {\n 'class': 'mat-tab-body',\n }\n})\nexport class MatTabBody extends _MatTabBodyBase {\n @ViewChild(CdkPortalOutlet) _portalHost: CdkPortalOutlet;\n\n constructor(elementRef: ElementRef,\n @Optional() dir: Directionality,\n changeDetectorRef: ChangeDetectorRef) {\n super(elementRef, dir, changeDetectorRef);\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 */\nimport {InjectionToken} from '@angular/core';\n\n/** Object that can be used to configure the default options for the tabs module. */\nexport interface MatTabsConfig {\n /** Duration for the tab animation. Must be a valid CSS value (e.g. 600ms). */\n animationDuration?: string;\n\n /**\n * Whether pagination should be disabled. This can be used to avoid unnecessary\n * layout recalculations if it's known that pagination won't be required.\n */\n disablePagination?: boolean;\n\n /**\n * Whether the ink bar should fit its width to the size of the tab label content.\n * This only applies to the MDC-based tabs.\n */\n fitInkBarToContent?: boolean;\n\n /** Whether the tab group should grow to the size of the active tab. */\n dynamicHeight?: boolean;\n\n /** `tabindex` to be set on the inner element that wraps the tab content. */\n contentTabIndex?: number;\n}\n\n/** Injection token that can be used to provide the default options the tabs module. */\nexport const MAT_TABS_CONFIG = new InjectionToken('MAT_TABS_CONFIG');\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 BooleanInput,\n coerceBooleanProperty,\n coerceNumberProperty,\n NumberInput\n} from '@angular/cdk/coercion';\nimport {\n AfterContentChecked,\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n Directive,\n ElementRef,\n EventEmitter,\n Inject,\n Input,\n OnDestroy,\n Optional,\n Output,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {FocusOrigin} from '@angular/cdk/a11y';\nimport {\n CanColor,\n CanDisableRipple,\n mixinColor,\n mixinDisableRipple,\n ThemePalette,\n} from '@angular/material/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {merge, Subscription} from 'rxjs';\nimport {startWith} from 'rxjs/operators';\nimport {MAT_TAB_GROUP, MatTab} from './tab';\nimport {MAT_TABS_CONFIG, MatTabsConfig} from './tab-config';\n\n\n/** Used to generate unique ID's for each tab component */\nlet nextId = 0;\n\n/** A simple change event emitted on focus or selection changes. */\nexport class MatTabChangeEvent {\n /** Index of the currently-selected tab. */\n index: number;\n /** Reference to the currently-selected tab. */\n tab: MatTab;\n}\n\n/** Possible positions for the tab header. */\nexport type MatTabHeaderPosition = 'above' | 'below';\n\n// Boilerplate for applying mixins to MatTabGroup.\n/** @docs-private */\nconst _MatTabGroupMixinBase = mixinColor(mixinDisableRipple(class {\n constructor(public _elementRef: ElementRef) {}\n}), 'primary');\n\ninterface MatTabGroupBaseHeader {\n _alignInkBarToSelectedTab: () => void;\n focusIndex: number;\n}\n\n/**\n * Base class with all of the `MatTabGroupBase` functionality.\n * @docs-private\n */\n@Directive()\nexport abstract class _MatTabGroupBase extends _MatTabGroupMixinBase implements AfterContentInit,\n AfterContentChecked, OnDestroy, CanColor, CanDisableRipple {\n\n /**\n * All tabs inside the tab group. This includes tabs that belong to groups that are nested\n * inside the current one. We filter out only the tabs that belong to this group in `_tabs`.\n */\n abstract _allTabs: QueryList;\n abstract _tabBodyWrapper: ElementRef;\n abstract _tabHeader: MatTabGroupBaseHeader;\n\n /** All of the tabs that belong to the group. */\n _tabs: QueryList = new QueryList();\n\n /** The tab index that should be selected after the content has been checked. */\n private _indexToSelect: number | null = 0;\n\n /** Snapshot of the height of the tab body wrapper before another tab is activated. */\n private _tabBodyWrapperHeight: number = 0;\n\n /** Subscription to tabs being added/removed. */\n private _tabsSubscription = Subscription.EMPTY;\n\n /** Subscription to changes in the tab labels. */\n private _tabLabelSubscription = Subscription.EMPTY;\n\n /** Whether the tab group should grow to the size of the active tab. */\n @Input()\n get dynamicHeight(): boolean { return this._dynamicHeight; }\n set dynamicHeight(value: boolean) { this._dynamicHeight = coerceBooleanProperty(value); }\n private _dynamicHeight: boolean;\n\n /** The index of the active tab. */\n @Input()\n get selectedIndex(): number | null { return this._selectedIndex; }\n set selectedIndex(value: number | null) {\n this._indexToSelect = coerceNumberProperty(value, null);\n }\n private _selectedIndex: number | null = null;\n\n /** Position of the tab header. */\n @Input() headerPosition: MatTabHeaderPosition = 'above';\n\n /** Duration for the tab animation. Will be normalized to milliseconds if no units are set. */\n @Input()\n get animationDuration(): string { return this._animationDuration; }\n set animationDuration(value: string) {\n this._animationDuration = /^\\d+$/.test(value) ? value + 'ms' : value;\n }\n private _animationDuration: string;\n\n /**\n * `tabindex` to be set on the inner element that wraps the tab content. Can be used for improved\n * accessibility when the tab does not have focusable elements or if it has scrollable content.\n * The `tabindex` will be removed automatically for inactive tabs.\n * Read more at https://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-2/tabs.html\n */\n @Input()\n get contentTabIndex(): number | null { return this._contentTabIndex; }\n set contentTabIndex(value: number | null) {\n this._contentTabIndex = coerceNumberProperty(value, null);\n }\n private _contentTabIndex: number | null;\n\n /**\n * Whether pagination should be disabled. This can be used to avoid unnecessary\n * layout recalculations if it's known that pagination won't be required.\n */\n @Input()\n disablePagination: boolean;\n\n /** Background color of the tab group. */\n @Input()\n get backgroundColor(): ThemePalette { return this._backgroundColor; }\n set backgroundColor(value: ThemePalette) {\n const nativeElement: HTMLElement = this._elementRef.nativeElement;\n\n nativeElement.classList.remove(`mat-background-${this.backgroundColor}`);\n\n if (value) {\n nativeElement.classList.add(`mat-background-${value}`);\n }\n\n this._backgroundColor = value;\n }\n private _backgroundColor: ThemePalette;\n\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\n @Output() readonly selectedIndexChange: EventEmitter = new EventEmitter();\n\n /** Event emitted when focus has changed within a tab group. */\n @Output() readonly focusChange: EventEmitter =\n new EventEmitter();\n\n /** Event emitted when the body animation has completed */\n @Output() readonly animationDone: EventEmitter = new EventEmitter();\n\n /** Event emitted when the tab selection has changed. */\n @Output() readonly selectedTabChange: EventEmitter =\n new EventEmitter(true);\n\n private _groupId: number;\n\n constructor(elementRef: ElementRef,\n protected _changeDetectorRef: ChangeDetectorRef,\n @Inject(MAT_TABS_CONFIG) @Optional() defaultConfig?: MatTabsConfig,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string) {\n super(elementRef);\n this._groupId = nextId++;\n this.animationDuration = defaultConfig && defaultConfig.animationDuration ?\n defaultConfig.animationDuration : '500ms';\n this.disablePagination = defaultConfig && defaultConfig.disablePagination != null ?\n defaultConfig.disablePagination : false;\n this.dynamicHeight = defaultConfig && defaultConfig.dynamicHeight != null ?\n defaultConfig.dynamicHeight : false;\n this.contentTabIndex = defaultConfig?.contentTabIndex ?? null;\n }\n\n /**\n * After the content is checked, this component knows what tabs have been defined\n * and what the selected index should be. This is where we can know exactly what position\n * each tab should be in according to the new selected index, and additionally we know how\n * a new selected tab should transition in (from the left or right).\n */\n ngAfterContentChecked() {\n // Don't clamp the `indexToSelect` immediately in the setter because it can happen that\n // the amount of tabs changes before the actual change detection runs.\n const indexToSelect = this._indexToSelect = this._clampTabIndex(this._indexToSelect);\n\n // If there is a change in selected index, emit a change event. Should not trigger if\n // the selected index has not yet been initialized.\n if (this._selectedIndex != indexToSelect) {\n const isFirstRun = this._selectedIndex == null;\n\n if (!isFirstRun) {\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\n // Preserve the height so page doesn't scroll up during tab change.\n // Fixes https://stackblitz.com/edit/mat-tabs-scroll-page-top-on-tab-change\n const wrapper = this._tabBodyWrapper.nativeElement;\n wrapper.style.minHeight = wrapper.clientHeight + 'px';\n }\n\n // Changing these values after change detection has run\n // since the checked content may contain references to them.\n Promise.resolve().then(() => {\n this._tabs.forEach((tab, index) => tab.isActive = index === indexToSelect);\n\n if (!isFirstRun) {\n this.selectedIndexChange.emit(indexToSelect);\n // Clear the min-height, this was needed during tab change to avoid\n // unnecessary scrolling.\n this._tabBodyWrapper.nativeElement.style.minHeight = '';\n }\n });\n }\n\n // Setup the position for each tab and optionally setup an origin on the next selected tab.\n this._tabs.forEach((tab: MatTab, index: number) => {\n tab.position = index - indexToSelect;\n\n // If there is already a selected tab, then set up an origin for the next selected tab\n // if it doesn't have one already.\n if (this._selectedIndex != null && tab.position == 0 && !tab.origin) {\n tab.origin = indexToSelect - this._selectedIndex;\n }\n });\n\n if (this._selectedIndex !== indexToSelect) {\n this._selectedIndex = indexToSelect;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n ngAfterContentInit() {\n this._subscribeToAllTabChanges();\n this._subscribeToTabLabels();\n\n // Subscribe to changes in the amount of tabs, in order to be\n // able to re-render the content as new tabs are added or removed.\n this._tabsSubscription = this._tabs.changes.subscribe(() => {\n const indexToSelect = this._clampTabIndex(this._indexToSelect);\n\n // Maintain the previously-selected tab if a new tab is added or removed and there is no\n // explicit change that selects a different tab.\n if (indexToSelect === this._selectedIndex) {\n const tabs = this._tabs.toArray();\n\n for (let i = 0; i < tabs.length; i++) {\n if (tabs[i].isActive) {\n // Assign both to the `_indexToSelect` and `_selectedIndex` so we don't fire a changed\n // event, otherwise the consumer may end up in an infinite loop in some edge cases like\n // adding a tab within the `selectedIndexChange` event.\n this._indexToSelect = this._selectedIndex = i;\n break;\n }\n }\n }\n\n this._changeDetectorRef.markForCheck();\n });\n }\n\n /** Listens to changes in all of the tabs. */\n private _subscribeToAllTabChanges() {\n // Since we use a query with `descendants: true` to pick up the tabs, we may end up catching\n // some that are inside of nested tab groups. We filter them out manually by checking that\n // the closest group to the tab is the current one.\n this._allTabs.changes\n .pipe(startWith(this._allTabs))\n .subscribe((tabs: QueryList) => {\n this._tabs.reset(tabs.filter(tab => {\n return tab._closestTabGroup === this || !tab._closestTabGroup;\n }));\n this._tabs.notifyOnChanges();\n });\n }\n\n ngOnDestroy() {\n this._tabs.destroy();\n this._tabsSubscription.unsubscribe();\n this._tabLabelSubscription.unsubscribe();\n }\n\n /** Re-aligns the ink bar to the selected tab element. */\n realignInkBar() {\n if (this._tabHeader) {\n this._tabHeader._alignInkBarToSelectedTab();\n }\n }\n\n /**\n * Sets focus to a particular tab.\n * @param index Index of the tab to be focused.\n */\n focusTab(index: number) {\n const header = this._tabHeader;\n\n if (header) {\n header.focusIndex = index;\n }\n }\n\n _focusChanged(index: number) {\n this.focusChange.emit(this._createChangeEvent(index));\n }\n\n private _createChangeEvent(index: number): MatTabChangeEvent {\n const event = new MatTabChangeEvent;\n event.index = index;\n if (this._tabs && this._tabs.length) {\n event.tab = this._tabs.toArray()[index];\n }\n return event;\n }\n\n /**\n * Subscribes to changes in the tab labels. This is needed, because the @Input for the label is\n * on the MatTab component, whereas the data binding is inside the MatTabGroup. In order for the\n * binding to be updated, we need to subscribe to changes in it and trigger change detection\n * manually.\n */\n private _subscribeToTabLabels() {\n if (this._tabLabelSubscription) {\n this._tabLabelSubscription.unsubscribe();\n }\n\n this._tabLabelSubscription = merge(...this._tabs.map(tab => tab._stateChanges))\n .subscribe(() => this._changeDetectorRef.markForCheck());\n }\n\n /** Clamps the given index to the bounds of 0 and the tabs length. */\n private _clampTabIndex(index: number | null): number {\n // Note the `|| 0`, which ensures that values like NaN can't get through\n // and which would otherwise throw the component into an infinite loop\n // (since Math.max(NaN, 0) === NaN).\n return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));\n }\n\n /** Returns a unique id for each tab label element */\n _getTabLabelId(i: number): string {\n return `mat-tab-label-${this._groupId}-${i}`;\n }\n\n /** Returns a unique id for each tab content element */\n _getTabContentId(i: number): string {\n return `mat-tab-content-${this._groupId}-${i}`;\n }\n\n /**\n * Sets the height of the body wrapper to the height of the activating tab if dynamic\n * height property is true.\n */\n _setTabBodyWrapperHeight(tabHeight: number): void {\n if (!this._dynamicHeight || !this._tabBodyWrapperHeight) { return; }\n\n const wrapper: HTMLElement = this._tabBodyWrapper.nativeElement;\n\n wrapper.style.height = this._tabBodyWrapperHeight + 'px';\n\n // This conditional forces the browser to paint the height so that\n // the animation to the new height can have an origin.\n if (this._tabBodyWrapper.nativeElement.offsetHeight) {\n wrapper.style.height = tabHeight + 'px';\n }\n }\n\n /** Removes the height of the tab body wrapper. */\n _removeTabBodyWrapperHeight(): void {\n const wrapper = this._tabBodyWrapper.nativeElement;\n this._tabBodyWrapperHeight = wrapper.clientHeight;\n wrapper.style.height = '';\n this.animationDone.emit();\n }\n\n /** Handle click events, setting new selected index if appropriate. */\n _handleClick(tab: MatTab, tabHeader: MatTabGroupBaseHeader, index: number) {\n if (!tab.disabled) {\n this.selectedIndex = tabHeader.focusIndex = index;\n }\n }\n\n /** Retrieves the tabindex for the tab. */\n _getTabIndex(tab: MatTab, idx: number): number | null {\n if (tab.disabled) {\n return null;\n }\n return this.selectedIndex === idx ? 0 : -1;\n }\n\n /** Callback for when the focused state of a tab has changed. */\n _tabFocusChanged(focusOrigin: FocusOrigin, index: number) {\n // Mouse/touch focus happens during the `mousedown`/`touchstart` phase which\n // can cause the tab to be moved out from under the pointer, interrupting the\n // click sequence (see #21898). We don't need to scroll the tab into view for\n // such cases anyway, because it will be done when the tab becomes selected.\n if (focusOrigin && focusOrigin !== 'mouse' && focusOrigin !== 'touch') {\n this._tabHeader.focusIndex = index;\n }\n }\n\n static ngAcceptInputType_dynamicHeight: BooleanInput;\n static ngAcceptInputType_animationDuration: NumberInput;\n static ngAcceptInputType_selectedIndex: NumberInput;\n static ngAcceptInputType_disableRipple: BooleanInput;\n static ngAcceptInputType_contentTabIndex: NumberInput;\n}\n\n/**\n * Material design tab-group component. Supports basic tab pairs (label + content) and includes\n * animated ink-bar, keyboard navigation, and screen reader.\n * See: https://material.io/design/components/tabs.html\n */\n@Component({\n selector: 'mat-tab-group',\n exportAs: 'matTabGroup',\n templateUrl: 'tab-group.html',\n styleUrls: ['tab-group.css'],\n encapsulation: ViewEncapsulation.None,\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n inputs: ['color', 'disableRipple'],\n providers: [{\n provide: MAT_TAB_GROUP,\n useExisting: MatTabGroup\n }],\n host: {\n 'class': 'mat-tab-group',\n '[class.mat-tab-group-dynamic-height]': 'dynamicHeight',\n '[class.mat-tab-group-inverted-header]': 'headerPosition === \"below\"',\n },\n})\nexport class MatTabGroup extends _MatTabGroupBase {\n @ContentChildren(MatTab, {descendants: true}) _allTabs: QueryList;\n @ViewChild('tabBodyWrapper') _tabBodyWrapper: ElementRef;\n @ViewChild('tabHeader') _tabHeader: MatTabGroupBaseHeader;\n\n constructor(elementRef: ElementRef,\n changeDetectorRef: ChangeDetectorRef,\n @Inject(MAT_TABS_CONFIG) @Optional() defaultConfig?: MatTabsConfig,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super(elementRef, changeDetectorRef, defaultConfig, animationMode);\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\nimport {BooleanInput} from '@angular/cdk/coercion';\nimport {Directive, ElementRef} from '@angular/core';\nimport {CanDisable, mixinDisabled} from '@angular/material/core';\n\n\n// Boilerplate for applying mixins to MatTabLabelWrapper.\n/** @docs-private */\nconst _MatTabLabelWrapperBase = mixinDisabled(class {});\n\n/**\n * Used in the `mat-tab-group` view to display tab labels.\n * @docs-private\n */\n@Directive({\n selector: '[matTabLabelWrapper]',\n inputs: ['disabled'],\n host: {\n '[class.mat-tab-disabled]': 'disabled',\n '[attr.aria-disabled]': '!!disabled',\n }\n})\nexport class MatTabLabelWrapper extends _MatTabLabelWrapperBase implements CanDisable {\n constructor(public elementRef: ElementRef) {\n super();\n }\n\n /** Sets focus on the wrapper element */\n focus(): void {\n this.elementRef.nativeElement.focus();\n }\n\n getOffsetLeft(): number {\n return this.elementRef.nativeElement.offsetLeft;\n }\n\n getOffsetWidth(): number {\n return this.elementRef.nativeElement.offsetWidth;\n }\n\n static ngAcceptInputType_disabled: BooleanInput;\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 ChangeDetectorRef,\n ElementRef,\n NgZone,\n Optional,\n QueryList,\n EventEmitter,\n AfterContentChecked,\n AfterContentInit,\n AfterViewInit,\n OnDestroy,\n Directive,\n Inject,\n Input,\n} from '@angular/core';\nimport {Direction, Directionality} from '@angular/cdk/bidi';\nimport {coerceNumberProperty, NumberInput} from '@angular/cdk/coercion';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {FocusKeyManager, FocusableOption} from '@angular/cdk/a11y';\nimport {ENTER, SPACE, hasModifierKey} from '@angular/cdk/keycodes';\nimport {merge, of as observableOf, Subject, timer, fromEvent} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\nimport {Platform, normalizePassiveListenerOptions} from '@angular/cdk/platform';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\n/** Config used to bind passive event listeners */\nconst passiveEventListenerOptions =\n normalizePassiveListenerOptions({passive: true}) as EventListenerOptions;\n\n/**\n * The directions that scrolling can go in when the header's tabs exceed the header width. 'After'\n * will scroll the header towards the end of the tabs list and 'before' will scroll towards the\n * beginning of the list.\n */\nexport type ScrollDirection = 'after' | 'before';\n\n/**\n * The distance in pixels that will be overshot when scrolling a tab label into view. This helps\n * provide a small affordance to the label next to it.\n */\nconst EXAGGERATED_OVERSCROLL = 60;\n\n/**\n * Amount of milliseconds to wait before starting to scroll the header automatically.\n * Set a little conservatively in order to handle fake events dispatched on touch devices.\n */\nconst HEADER_SCROLL_DELAY = 650;\n\n/**\n * Interval in milliseconds at which to scroll the header\n * while the user is holding their pointer.\n */\nconst HEADER_SCROLL_INTERVAL = 100;\n\n/** Item inside a paginated tab header. */\nexport type MatPaginatedTabHeaderItem = FocusableOption & {elementRef: ElementRef};\n\n/**\n * Base class for a tab header that supported pagination.\n * @docs-private\n */\n@Directive()\nexport abstract class MatPaginatedTabHeader implements AfterContentChecked, AfterContentInit,\n AfterViewInit, OnDestroy {\n abstract _items: QueryList;\n abstract _inkBar: {hide: () => void, alignToElement: (element: HTMLElement) => void};\n abstract _tabListContainer: ElementRef;\n abstract _tabList: ElementRef;\n abstract _nextPaginator: ElementRef;\n abstract _previousPaginator: ElementRef;\n\n /** The distance in pixels that the tab labels should be translated to the left. */\n private _scrollDistance = 0;\n\n /** Whether the header should scroll to the selected index after the view has been checked. */\n private _selectedIndexChanged = false;\n\n /** Emits when the component is destroyed. */\n protected readonly _destroyed = new Subject();\n\n /** Whether the controls for pagination should be displayed */\n _showPaginationControls = false;\n\n /** Whether the tab list can be scrolled more towards the end of the tab label list. */\n _disableScrollAfter = true;\n\n /** Whether the tab list can be scrolled more towards the beginning of the tab label list. */\n _disableScrollBefore = true;\n\n /**\n * The number of tab labels that are displayed on the header. When this changes, the header\n * should re-evaluate the scroll position.\n */\n private _tabLabelCount: number;\n\n /** Whether the scroll distance has changed and should be applied after the view is checked. */\n private _scrollDistanceChanged: boolean;\n\n /** Used to manage focus between the tabs. */\n private _keyManager: FocusKeyManager;\n\n /** Cached text content of the header. */\n private _currentTextContent: string;\n\n /** Stream that will stop the automated scrolling. */\n private _stopScrolling = new Subject();\n\n /**\n * Whether pagination should be disabled. This can be used to avoid unnecessary\n * layout recalculations if it's known that pagination won't be required.\n */\n @Input()\n disablePagination: boolean = false;\n\n /** The index of the active tab. */\n get selectedIndex(): number { return this._selectedIndex; }\n set selectedIndex(value: number) {\n value = coerceNumberProperty(value);\n\n if (this._selectedIndex != value) {\n this._selectedIndexChanged = true;\n this._selectedIndex = value;\n\n if (this._keyManager) {\n this._keyManager.updateActiveItem(value);\n }\n }\n }\n private _selectedIndex: number = 0;\n\n /** Event emitted when the option is selected. */\n readonly selectFocusedIndex: EventEmitter = new EventEmitter();\n\n /** Event emitted when a label is focused. */\n readonly indexFocused: EventEmitter = new EventEmitter();\n\n constructor(protected _elementRef: ElementRef,\n protected _changeDetectorRef: ChangeDetectorRef,\n private _viewportRuler: ViewportRuler,\n @Optional() private _dir: Directionality,\n private _ngZone: NgZone,\n private _platform: Platform,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string) {\n\n // Bind the `mouseleave` event on the outside since it doesn't change anything in the view.\n _ngZone.runOutsideAngular(() => {\n fromEvent(_elementRef.nativeElement, 'mouseleave')\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._stopInterval();\n });\n });\n }\n\n /** Called when the user has selected an item via the keyboard. */\n protected abstract _itemSelected(event: KeyboardEvent): void;\n\n ngAfterViewInit() {\n // We need to handle these events manually, because we want to bind passive event listeners.\n fromEvent(this._previousPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._handlePaginatorPress('before');\n });\n\n fromEvent(this._nextPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._handlePaginatorPress('after');\n });\n }\n\n ngAfterContentInit() {\n const dirChange = this._dir ? this._dir.change : observableOf('ltr');\n const resize = this._viewportRuler.change(150);\n const realign = () => {\n this.updatePagination();\n this._alignInkBarToSelectedTab();\n };\n\n this._keyManager = new FocusKeyManager(this._items)\n .withHorizontalOrientation(this._getLayoutDirection())\n .withHomeAndEnd()\n .withWrap();\n\n this._keyManager.updateActiveItem(this._selectedIndex);\n\n // Defer the first call in order to allow for slower browsers to lay out the elements.\n // This helps in cases where the user lands directly on a page with paginated tabs.\n typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame(realign) : realign();\n\n // On dir change or window resize, realign the ink bar and update the orientation of\n // the key manager if the direction has changed.\n merge(dirChange, resize, this._items.changes).pipe(takeUntil(this._destroyed)).subscribe(() => {\n // We need to defer this to give the browser some time to recalculate\n // the element dimensions. The call has to be wrapped in `NgZone.run`,\n // because the viewport change handler runs outside of Angular.\n this._ngZone.run(() => Promise.resolve().then(realign));\n this._keyManager.withHorizontalOrientation(this._getLayoutDirection());\n });\n\n // If there is a change in the focus key manager we need to emit the `indexFocused`\n // event in order to provide a public event that notifies about focus changes. Also we realign\n // the tabs container by scrolling the new focused tab into the visible section.\n this._keyManager.change.pipe(takeUntil(this._destroyed)).subscribe(newFocusIndex => {\n this.indexFocused.emit(newFocusIndex);\n this._setTabFocus(newFocusIndex);\n });\n }\n\n ngAfterContentChecked(): void {\n // If the number of tab labels have changed, check if scrolling should be enabled\n if (this._tabLabelCount != this._items.length) {\n this.updatePagination();\n this._tabLabelCount = this._items.length;\n this._changeDetectorRef.markForCheck();\n }\n\n // If the selected index has changed, scroll to the label and check if the scrolling controls\n // should be disabled.\n if (this._selectedIndexChanged) {\n this._scrollToLabel(this._selectedIndex);\n this._checkScrollingControls();\n this._alignInkBarToSelectedTab();\n this._selectedIndexChanged = false;\n this._changeDetectorRef.markForCheck();\n }\n\n // If the scroll distance has been changed (tab selected, focused, scroll controls activated),\n // then translate the header to reflect this.\n if (this._scrollDistanceChanged) {\n this._updateTabScrollPosition();\n this._scrollDistanceChanged = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n this._stopScrolling.complete();\n }\n\n /** Handles keyboard events on the header. */\n _handleKeydown(event: KeyboardEvent) {\n // We don't handle any key bindings with a modifier key.\n if (hasModifierKey(event)) {\n return;\n }\n\n switch (event.keyCode) {\n case ENTER:\n case SPACE:\n if (this.focusIndex !== this.selectedIndex) {\n this.selectFocusedIndex.emit(this.focusIndex);\n this._itemSelected(event);\n }\n break;\n default:\n this._keyManager.onKeydown(event);\n }\n }\n\n /**\n * Callback for when the MutationObserver detects that the content has changed.\n */\n _onContentChanges() {\n const textContent = this._elementRef.nativeElement.textContent;\n\n // We need to diff the text content of the header, because the MutationObserver callback\n // will fire even if the text content didn't change which is inefficient and is prone\n // to infinite loops if a poorly constructed expression is passed in (see #14249).\n if (textContent !== this._currentTextContent) {\n this._currentTextContent = textContent || '';\n\n // The content observer runs outside the `NgZone` by default, which\n // means that we need to bring the callback back in ourselves.\n this._ngZone.run(() => {\n this.updatePagination();\n this._alignInkBarToSelectedTab();\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n\n /**\n * Updates the view whether pagination should be enabled or not.\n *\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\n * page.\n */\n updatePagination() {\n this._checkPaginationEnabled();\n this._checkScrollingControls();\n this._updateTabScrollPosition();\n }\n\n /** Tracks which element has focus; used for keyboard navigation */\n get focusIndex(): number {\n return this._keyManager ? this._keyManager.activeItemIndex! : 0;\n }\n\n /** When the focus index is set, we must manually send focus to the correct label */\n set focusIndex(value: number) {\n if (!this._isValidIndex(value) || this.focusIndex === value || !this._keyManager) {\n return;\n }\n\n this._keyManager.setActiveItem(value);\n }\n\n /**\n * Determines if an index is valid. If the tabs are not ready yet, we assume that the user is\n * providing a valid index and return true.\n */\n _isValidIndex(index: number): boolean {\n if (!this._items) { return true; }\n\n const tab = this._items ? this._items.toArray()[index] : null;\n return !!tab && !tab.disabled;\n }\n\n /**\n * Sets focus on the HTML element for the label wrapper and scrolls it into the view if\n * scrolling is enabled.\n */\n _setTabFocus(tabIndex: number) {\n if (this._showPaginationControls) {\n this._scrollToLabel(tabIndex);\n }\n\n if (this._items && this._items.length) {\n this._items.toArray()[tabIndex].focus();\n\n // Do not let the browser manage scrolling to focus the element, this will be handled\n // by using translation. In LTR, the scroll left should be 0. In RTL, the scroll width\n // should be the full width minus the offset width.\n const containerEl = this._tabListContainer.nativeElement;\n const dir = this._getLayoutDirection();\n\n if (dir == 'ltr') {\n containerEl.scrollLeft = 0;\n } else {\n containerEl.scrollLeft = containerEl.scrollWidth - containerEl.offsetWidth;\n }\n }\n }\n\n /** The layout direction of the containing app. */\n _getLayoutDirection(): Direction {\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n\n /** Performs the CSS transformation on the tab list that will cause the list to scroll. */\n _updateTabScrollPosition() {\n if (this.disablePagination) {\n return;\n }\n\n const scrollDistance = this.scrollDistance;\n const translateX = this._getLayoutDirection() === 'ltr' ? -scrollDistance : scrollDistance;\n\n // Don't use `translate3d` here because we don't want to create a new layer. A new layer\n // seems to cause flickering and overflow in Internet Explorer. For example, the ink bar\n // and ripples will exceed the boundaries of the visible tab bar.\n // See: https://github.com/angular/components/issues/10276\n // We round the `transform` here, because transforms with sub-pixel precision cause some\n // browsers to blur the content of the element.\n this._tabList.nativeElement.style.transform = `translateX(${Math.round(translateX)}px)`;\n\n // Setting the `transform` on IE will change the scroll offset of the parent, causing the\n // position to be thrown off in some cases. We have to reset it ourselves to ensure that\n // it doesn't get thrown off. Note that we scope it only to IE and Edge, because messing\n // with the scroll position throws off Chrome 71+ in RTL mode (see #14689).\n if (this._platform.TRIDENT || this._platform.EDGE) {\n this._tabListContainer.nativeElement.scrollLeft = 0;\n }\n }\n\n /** Sets the distance in pixels that the tab header should be transformed in the X-axis. */\n get scrollDistance(): number { return this._scrollDistance; }\n set scrollDistance(value: number) {\n this._scrollTo(value);\n }\n\n /**\n * Moves the tab list in the 'before' or 'after' direction (towards the beginning of the list or\n * the end of the list, respectively). The distance to scroll is computed to be a third of the\n * length of the tab list view window.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _scrollHeader(direction: ScrollDirection) {\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n\n // Move the scroll distance one-third the length of the tab list's viewport.\n const scrollAmount = (direction == 'before' ? -1 : 1) * viewLength / 3;\n\n return this._scrollTo(this._scrollDistance + scrollAmount);\n }\n\n /** Handles click events on the pagination arrows. */\n _handlePaginatorClick(direction: ScrollDirection) {\n this._stopInterval();\n this._scrollHeader(direction);\n }\n\n /**\n * Moves the tab list such that the desired tab label (marked by index) is moved into view.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _scrollToLabel(labelIndex: number) {\n if (this.disablePagination) {\n return;\n }\n\n const selectedLabel = this._items ? this._items.toArray()[labelIndex] : null;\n\n if (!selectedLabel) {\n return;\n }\n\n // The view length is the visible width of the tab labels.\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n const {offsetLeft, offsetWidth} = selectedLabel.elementRef.nativeElement;\n\n let labelBeforePos: number, labelAfterPos: number;\n if (this._getLayoutDirection() == 'ltr') {\n labelBeforePos = offsetLeft;\n labelAfterPos = labelBeforePos + offsetWidth;\n } else {\n labelAfterPos = this._tabList.nativeElement.offsetWidth - offsetLeft;\n labelBeforePos = labelAfterPos - offsetWidth;\n }\n\n const beforeVisiblePos = this.scrollDistance;\n const afterVisiblePos = this.scrollDistance + viewLength;\n\n if (labelBeforePos < beforeVisiblePos) {\n // Scroll header to move label to the before direction\n this.scrollDistance -= beforeVisiblePos - labelBeforePos + EXAGGERATED_OVERSCROLL;\n } else if (labelAfterPos > afterVisiblePos) {\n // Scroll header to move label to the after direction\n this.scrollDistance += labelAfterPos - afterVisiblePos + EXAGGERATED_OVERSCROLL;\n }\n }\n\n /**\n * Evaluate whether the pagination controls should be displayed. If the scroll width of the\n * tab list is wider than the size of the header container, then the pagination controls should\n * be shown.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _checkPaginationEnabled() {\n if (this.disablePagination) {\n this._showPaginationControls = false;\n } else {\n const isEnabled =\n this._tabList.nativeElement.scrollWidth > this._elementRef.nativeElement.offsetWidth;\n\n if (!isEnabled) {\n this.scrollDistance = 0;\n }\n\n if (isEnabled !== this._showPaginationControls) {\n this._changeDetectorRef.markForCheck();\n }\n\n this._showPaginationControls = isEnabled;\n }\n }\n\n /**\n * Evaluate whether the before and after controls should be enabled or disabled.\n * If the header is at the beginning of the list (scroll distance is equal to 0) then disable the\n * before button. If the header is at the end of the list (scroll distance is equal to the\n * maximum distance we can scroll), then disable the after button.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _checkScrollingControls() {\n if (this.disablePagination) {\n this._disableScrollAfter = this._disableScrollBefore = true;\n } else {\n // Check if the pagination arrows should be activated.\n this._disableScrollBefore = this.scrollDistance == 0;\n this._disableScrollAfter = this.scrollDistance == this._getMaxScrollDistance();\n this._changeDetectorRef.markForCheck();\n }\n }\n\n /**\n * Determines what is the maximum length in pixels that can be set for the scroll distance. This\n * is equal to the difference in width between the tab list container and tab header container.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _getMaxScrollDistance(): number {\n const lengthOfTabList = this._tabList.nativeElement.scrollWidth;\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n return (lengthOfTabList - viewLength) || 0;\n }\n\n /** Tells the ink-bar to align itself to the current label wrapper */\n _alignInkBarToSelectedTab(): void {\n const selectedItem = this._items && this._items.length ?\n this._items.toArray()[this.selectedIndex] : null;\n const selectedLabelWrapper = selectedItem ? selectedItem.elementRef.nativeElement : null;\n\n if (selectedLabelWrapper) {\n this._inkBar.alignToElement(selectedLabelWrapper);\n } else {\n this._inkBar.hide();\n }\n }\n\n /** Stops the currently-running paginator interval. */\n _stopInterval() {\n this._stopScrolling.next();\n }\n\n /**\n * Handles the user pressing down on one of the paginators.\n * Starts scrolling the header after a certain amount of time.\n * @param direction In which direction the paginator should be scrolled.\n */\n _handlePaginatorPress(direction: ScrollDirection, mouseEvent?: MouseEvent) {\n // Don't start auto scrolling for right mouse button clicks. Note that we shouldn't have to\n // null check the `button`, but we do it so we don't break tests that use fake events.\n if (mouseEvent && mouseEvent.button != null && mouseEvent.button !== 0) {\n return;\n }\n\n // Avoid overlapping timers.\n this._stopInterval();\n\n // Start a timer after the delay and keep firing based on the interval.\n timer(HEADER_SCROLL_DELAY, HEADER_SCROLL_INTERVAL)\n // Keep the timer going until something tells it to stop or the component is destroyed.\n .pipe(takeUntil(merge(this._stopScrolling, this._destroyed)))\n .subscribe(() => {\n const {maxScrollDistance, distance} = this._scrollHeader(direction);\n\n // Stop the timer if we've reached the start or the end.\n if (distance === 0 || distance >= maxScrollDistance) {\n this._stopInterval();\n }\n });\n }\n\n /**\n * Scrolls the header to a given position.\n * @param position Position to which to scroll.\n * @returns Information on the current scroll distance and the maximum.\n */\n private _scrollTo(position: number) {\n if (this.disablePagination) {\n return {maxScrollDistance: 0, distance: 0};\n }\n\n const maxScrollDistance = this._getMaxScrollDistance();\n this._scrollDistance = Math.max(0, Math.min(maxScrollDistance, position));\n\n // Mark that the scroll distance has changed so that after the view is checked, the CSS\n // transformation can move the header.\n this._scrollDistanceChanged = true;\n this._checkScrollingControls();\n\n return {maxScrollDistance, distance: this._scrollDistance};\n }\n\n static ngAcceptInputType_selectedIndex: NumberInput;\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 {Directionality} from '@angular/cdk/bidi';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {\n AfterContentChecked,\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n NgZone,\n OnDestroy,\n Optional,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n AfterViewInit,\n Input,\n Inject,\n Directive,\n} from '@angular/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {BooleanInput, coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {MatInkBar} from './ink-bar';\nimport {MatTabLabelWrapper} from './tab-label-wrapper';\nimport {Platform} from '@angular/cdk/platform';\nimport {MatPaginatedTabHeader} from './paginated-tab-header';\n\n/**\n * Base class with all of the `MatTabHeader` functionality.\n * @docs-private\n */\n@Directive()\nexport abstract class _MatTabHeaderBase extends MatPaginatedTabHeader implements\n AfterContentChecked, AfterContentInit, AfterViewInit, OnDestroy {\n\n /** Whether the ripple effect is disabled or not. */\n @Input()\n get disableRipple() { return this._disableRipple; }\n set disableRipple(value: any) { this._disableRipple = coerceBooleanProperty(value); }\n private _disableRipple: boolean = false;\n\n constructor(elementRef: ElementRef,\n changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n @Optional() dir: Directionality,\n ngZone: NgZone,\n platform: Platform,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);\n }\n\n protected _itemSelected(event: KeyboardEvent) {\n event.preventDefault();\n }\n}\n\n/**\n * The header of the tab group which displays a list of all the tabs in the tab group. Includes\n * an ink bar that follows the currently selected tab. When the tabs list's width exceeds the\n * width of the header container, then arrows will be displayed to allow the user to scroll\n * left and right across the header.\n * @docs-private\n */\n@Component({\n selector: 'mat-tab-header',\n templateUrl: 'tab-header.html',\n styleUrls: ['tab-header.css'],\n inputs: ['selectedIndex'],\n outputs: ['selectFocusedIndex', 'indexFocused'],\n encapsulation: ViewEncapsulation.None,\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n host: {\n 'class': 'mat-tab-header',\n '[class.mat-tab-header-pagination-controls-enabled]': '_showPaginationControls',\n '[class.mat-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n },\n})\nexport class MatTabHeader extends _MatTabHeaderBase {\n @ContentChildren(MatTabLabelWrapper, {descendants: false}) _items: QueryList;\n @ViewChild(MatInkBar, {static: true}) _inkBar: MatInkBar;\n @ViewChild('tabListContainer', {static: true}) _tabListContainer: ElementRef;\n @ViewChild('tabList', {static: true}) _tabList: ElementRef;\n @ViewChild('nextPaginator') _nextPaginator: ElementRef;\n @ViewChild('previousPaginator') _previousPaginator: ElementRef;\n\n constructor(elementRef: ElementRef,\n changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n @Optional() dir: Directionality,\n ngZone: NgZone,\n platform: Platform,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);\n }\n\n static ngAcceptInputType_disableRipple: BooleanInput;\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 */\nimport {FocusableOption, FocusMonitor} from '@angular/cdk/a11y';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {BooleanInput, coerceBooleanProperty, NumberInput} from '@angular/cdk/coercion';\nimport {Platform} from '@angular/cdk/platform';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {\n AfterContentChecked,\n AfterContentInit,\n AfterViewInit,\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n Directive,\n ElementRef,\n forwardRef,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n CanDisable,\n CanDisableRipple,\n HasTabIndex,\n MAT_RIPPLE_GLOBAL_OPTIONS,\n mixinDisabled,\n mixinDisableRipple,\n mixinTabIndex, RippleConfig,\n RippleGlobalOptions,\n RippleRenderer,\n RippleTarget,\n ThemePalette,\n} from '@angular/material/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {startWith, takeUntil} from 'rxjs/operators';\nimport {MatInkBar} from '../ink-bar';\nimport {MatPaginatedTabHeader, MatPaginatedTabHeaderItem} from '../paginated-tab-header';\n\n/**\n * Base class with all of the `MatTabNav` functionality.\n * @docs-private\n */\n@Directive()\nexport abstract class _MatTabNavBase extends MatPaginatedTabHeader implements AfterContentChecked,\n AfterContentInit, OnDestroy {\n\n /** Query list of all tab links of the tab navigation. */\n abstract override _items: QueryList;\n\n /** Background color of the tab nav. */\n @Input()\n get backgroundColor(): ThemePalette { return this._backgroundColor; }\n set backgroundColor(value: ThemePalette) {\n const classList = this._elementRef.nativeElement.classList;\n classList.remove(`mat-background-${this.backgroundColor}`);\n\n if (value) {\n classList.add(`mat-background-${value}`);\n }\n\n this._backgroundColor = value;\n }\n private _backgroundColor: ThemePalette;\n\n /** Whether the ripple effect is disabled or not. */\n @Input()\n get disableRipple() { return this._disableRipple; }\n set disableRipple(value: any) { this._disableRipple = coerceBooleanProperty(value); }\n private _disableRipple: boolean = false;\n\n /** Theme color of the nav bar. */\n @Input() color: ThemePalette = 'primary';\n\n constructor(elementRef: ElementRef,\n @Optional() dir: Directionality,\n ngZone: NgZone,\n changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n platform: Platform,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);\n }\n\n protected _itemSelected() {\n // noop\n }\n\n override ngAfterContentInit() {\n // We need this to run before the `changes` subscription in parent to ensure that the\n // selectedIndex is up-to-date by the time the super class starts looking for it.\n this._items.changes.pipe(startWith(null), takeUntil(this._destroyed)).subscribe(() => {\n this.updateActiveLink();\n });\n\n super.ngAfterContentInit();\n }\n\n /** Notifies the component that the active link has been changed. */\n updateActiveLink() {\n if (!this._items) {\n return;\n }\n\n const items = this._items.toArray();\n\n for (let i = 0; i < items.length; i++) {\n if (items[i].active) {\n this.selectedIndex = i;\n this._changeDetectorRef.markForCheck();\n return;\n }\n }\n\n // The ink bar should hide itself if no items are active.\n this.selectedIndex = -1;\n this._inkBar.hide();\n }\n}\n\n\n/**\n * Navigation component matching the styles of the tab group header.\n * Provides anchored navigation with animated ink bar.\n */\n@Component({\n selector: '[mat-tab-nav-bar]',\n exportAs: 'matTabNavBar, matTabNav',\n inputs: ['color'],\n templateUrl: 'tab-nav-bar.html',\n styleUrls: ['tab-nav-bar.css'],\n host: {\n 'class': 'mat-tab-nav-bar mat-tab-header',\n '[class.mat-tab-header-pagination-controls-enabled]': '_showPaginationControls',\n '[class.mat-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n '[class.mat-primary]': 'color !== \"warn\" && color !== \"accent\"',\n '[class.mat-accent]': 'color === \"accent\"',\n '[class.mat-warn]': 'color === \"warn\"',\n },\n encapsulation: ViewEncapsulation.None,\n // tslint:disable-next-line:validate-decorators\n changeDetection: ChangeDetectionStrategy.Default,\n})\nexport class MatTabNav extends _MatTabNavBase {\n @ContentChildren(forwardRef(() => MatTabLink), {descendants: true}) _items: QueryList;\n @ViewChild(MatInkBar, {static: true}) _inkBar: MatInkBar;\n @ViewChild('tabListContainer', {static: true}) _tabListContainer: ElementRef;\n @ViewChild('tabList', {static: true}) _tabList: ElementRef;\n @ViewChild('nextPaginator') _nextPaginator: ElementRef;\n @ViewChild('previousPaginator') _previousPaginator: ElementRef;\n\n constructor(elementRef: ElementRef,\n @Optional() dir: Directionality,\n ngZone: NgZone,\n changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n platform: Platform,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super(elementRef, dir, ngZone, changeDetectorRef, viewportRuler, platform, animationMode);\n }\n\n static ngAcceptInputType_disableRipple: BooleanInput;\n}\n\n// Boilerplate for applying mixins to MatTabLink.\nconst _MatTabLinkMixinBase = mixinTabIndex(mixinDisableRipple(mixinDisabled(class {})));\n\n/** Base class with all of the `MatTabLink` functionality. */\n@Directive()\nexport class _MatTabLinkBase extends _MatTabLinkMixinBase implements AfterViewInit, OnDestroy,\n CanDisable, CanDisableRipple, HasTabIndex, RippleTarget, FocusableOption {\n\n /** Whether the tab link is active or not. */\n protected _isActive: boolean = false;\n\n /** Whether the link is active. */\n @Input()\n get active(): boolean { return this._isActive; }\n set active(value: boolean) {\n const newValue = coerceBooleanProperty(value);\n\n if (newValue !== this._isActive) {\n this._isActive = value;\n this._tabNavBar.updateActiveLink();\n }\n }\n\n /**\n * Ripple configuration for ripples that are launched on pointer down. The ripple config\n * is set to the global ripple options since we don't have any configurable options for\n * the tab link ripples.\n * @docs-private\n */\n rippleConfig: RippleConfig & RippleGlobalOptions;\n\n /**\n * Whether ripples are disabled on interaction.\n * @docs-private\n */\n get rippleDisabled(): boolean {\n return this.disabled || this.disableRipple || this._tabNavBar.disableRipple ||\n !!this.rippleConfig.disabled;\n }\n\n constructor(\n private _tabNavBar: _MatTabNavBase,\n /** @docs-private */ public elementRef: ElementRef,\n @Optional() @Inject(MAT_RIPPLE_GLOBAL_OPTIONS) globalRippleOptions: RippleGlobalOptions|null,\n @Attribute('tabindex') tabIndex: string, private _focusMonitor: FocusMonitor,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super();\n\n this.rippleConfig = globalRippleOptions || {};\n this.tabIndex = parseInt(tabIndex) || 0;\n\n if (animationMode === 'NoopAnimations') {\n this.rippleConfig.animation = {enterDuration: 0, exitDuration: 0};\n }\n }\n\n /** Focuses the tab link. */\n focus() {\n this.elementRef.nativeElement.focus();\n }\n\n ngAfterViewInit() {\n this._focusMonitor.monitor(this.elementRef);\n }\n\n ngOnDestroy() {\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n\n _handleFocus() {\n // Since we allow navigation through tabbing in the nav bar, we\n // have to update the focused index whenever the link receives focus.\n this._tabNavBar.focusIndex = this._tabNavBar._items.toArray().indexOf(this);\n }\n\n static ngAcceptInputType_active: BooleanInput;\n static ngAcceptInputType_disabled: BooleanInput;\n static ngAcceptInputType_disableRipple: BooleanInput;\n static ngAcceptInputType_tabIndex: NumberInput;\n}\n\n\n/**\n * Link inside of a `mat-tab-nav-bar`.\n */\n@Directive({\n selector: '[mat-tab-link], [matTabLink]',\n exportAs: 'matTabLink',\n inputs: ['disabled', 'disableRipple', 'tabIndex'],\n host: {\n 'class': 'mat-tab-link mat-focus-indicator',\n '[attr.aria-current]': 'active ? \"page\" : null',\n '[attr.aria-disabled]': 'disabled',\n '[attr.tabIndex]': 'tabIndex',\n '[class.mat-tab-disabled]': 'disabled',\n '[class.mat-tab-label-active]': 'active',\n '(focus)': '_handleFocus()'\n }\n})\nexport class MatTabLink extends _MatTabLinkBase implements OnDestroy {\n /** Reference to the RippleRenderer for the tab-link. */\n private _tabLinkRipple: RippleRenderer;\n\n constructor(\n tabNavBar: MatTabNav, elementRef: ElementRef, ngZone: NgZone,\n platform: Platform,\n @Optional() @Inject(MAT_RIPPLE_GLOBAL_OPTIONS) globalRippleOptions: RippleGlobalOptions|null,\n @Attribute('tabindex') tabIndex: string, focusMonitor: FocusMonitor,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super(tabNavBar, elementRef, globalRippleOptions, tabIndex, focusMonitor, animationMode);\n this._tabLinkRipple = new RippleRenderer(this, ngZone, elementRef, platform);\n this._tabLinkRipple.setupTriggerEvents(elementRef.nativeElement);\n }\n\n override ngOnDestroy() {\n super.ngOnDestroy();\n this._tabLinkRipple._removeTriggerEvents();\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\nimport {A11yModule} from '@angular/cdk/a11y';\nimport {ObserversModule} from '@angular/cdk/observers';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule, MatRippleModule} from '@angular/material/core';\nimport {MatInkBar} from './ink-bar';\nimport {MatTab} from './tab';\nimport {MatTabBody, MatTabBodyPortal} from './tab-body';\nimport {MatTabContent} from './tab-content';\nimport {MatTabGroup} from './tab-group';\nimport {MatTabHeader} from './tab-header';\nimport {MatTabLabel} from './tab-label';\nimport {MatTabLabelWrapper} from './tab-label-wrapper';\nimport {MatTabLink, MatTabNav} from './tab-nav-bar/tab-nav-bar';\n\n\n@NgModule({\n imports: [\n CommonModule,\n MatCommonModule,\n PortalModule,\n MatRippleModule,\n ObserversModule,\n A11yModule,\n ],\n // Don't export all components because some are only to be used internally.\n exports: [\n MatCommonModule,\n MatTabGroup,\n MatTabLabel,\n MatTab,\n MatTabNav,\n MatTabLink,\n MatTabContent,\n ],\n declarations: [\n MatTabGroup,\n MatTabLabel,\n MatTab,\n MatInkBar,\n MatTabLabelWrapper,\n MatTabNav,\n MatTabLink,\n MatTabBody,\n MatTabBodyPortal,\n MatTabHeader,\n MatTabContent,\n ],\n})\nexport class MatTabsModule {}\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\nexport * from './tab-nav-bar';\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\nexport {MatTabsModule} from './tabs-module';\nexport * from './tab-group';\nexport {MatInkBar, _MatInkBarPositioner, _MAT_INK_BAR_POSITIONER} from './ink-bar';\nexport {\n MatTabBody,\n _MatTabBodyBase,\n MatTabBodyOriginState,\n MatTabBodyPositionState,\n MatTabBodyPortal\n} from './tab-body';\nexport {MatTabHeader, _MatTabHeaderBase} from './tab-header';\nexport {MatTabLabelWrapper} from './tab-label-wrapper';\nexport {MatTab, MAT_TAB_GROUP} from './tab';\nexport {MatTabLabel, MAT_TAB} from './tab-label';\nexport {MatTabNav, MatTabLink, _MatTabNavBase, _MatTabLinkBase} from './tab-nav-bar/index';\nexport {MatTabContent} from './tab-content';\nexport {ScrollDirection} from './paginated-tab-header';\nexport * from './tabs-animations';\nexport {MAT_TABS_CONFIG, MatTabsConfig} from './tab-config';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n\nexport {_MAT_INK_BAR_POSITIONER_FACTORY as ɵangular_material_src_material_tabs_tabs_a} from './ink-bar';\nexport {MatPaginatedTabHeader as ɵangular_material_src_material_tabs_tabs_d} from './paginated-tab-header';\nexport {MAT_TAB_CONTENT as ɵangular_material_src_material_tabs_tabs_c} from './tab-content';\nexport {MAT_TAB_LABEL as ɵangular_material_src_material_tabs_tabs_b} from './tab-label';"],"names":["observableOf"],"mappings":"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"}