| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128 |
- import * as i1$2 from '@angular/common';
- import { DOCUMENT, CommonModule } from '@angular/common';
- import * as i0 from '@angular/core';
- import { forwardRef, Directive, Inject, EventEmitter, Optional, Output, Input, Component, ViewEncapsulation, ChangeDetectionStrategy, ViewChild, InjectionToken, TemplateRef, ContentChild, ContentChildren, QueryList, Attribute, NgModule } from '@angular/core';
- import * as i5 from '@angular/material/core';
- import { mixinDisabled, mixinColor, mixinDisableRipple, mixinTabIndex, MAT_RIPPLE_GLOBAL_OPTIONS, MatCommonModule, MatRippleModule } from '@angular/material/core';
- import * as i2 from '@angular/cdk/portal';
- import { CdkPortalOutlet, CdkPortal, TemplatePortal, PortalModule } from '@angular/cdk/portal';
- import * as i5$1 from '@angular/cdk/observers';
- import { ObserversModule } from '@angular/cdk/observers';
- import * as i4 from '@angular/cdk/a11y';
- import { FocusKeyManager, A11yModule } from '@angular/cdk/a11y';
- import * as i1 from '@angular/cdk/bidi';
- import { Subscription, Subject, fromEvent, of, merge, EMPTY, Observable, timer, BehaviorSubject } from 'rxjs';
- import { startWith, distinctUntilChanged, takeUntil, take, switchMap, skip, filter } from 'rxjs/operators';
- import { trigger, state, style, transition, animate } from '@angular/animations';
- import { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';
- import * as i1$1 from '@angular/cdk/scrolling';
- import * as i3 from '@angular/cdk/platform';
- import { normalizePassiveListenerOptions } from '@angular/cdk/platform';
- import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';
- import { hasModifierKey, SPACE, ENTER } from '@angular/cdk/keycodes';
- /**
- * Animations used by the Material tabs.
- * @docs-private
- */
- const matTabsAnimations = {
- /** Animation translates a tab along the X axis. */
- translateTab: trigger('translateTab', [
- // Transitions to `none` instead of 0, because some browsers might blur the content.
- state('center, void, left-origin-center, right-origin-center', style({ transform: 'none' })),
- // If the tab is either on the left or right, we additionally add a `min-height` of 1px
- // in order to ensure that the element has a height before its state changes. This is
- // necessary because Chrome does seem to skip the transition in RTL mode if the element does
- // not have a static height and is not rendered. See related issue: #9465
- state('left', style({
- transform: 'translate3d(-100%, 0, 0)',
- minHeight: '1px',
- // Normally this is redundant since we detach the content from the DOM, but if the user
- // opted into keeping the content in the DOM, we have to hide it so it isn't focusable.
- visibility: 'hidden',
- })),
- state('right', style({
- transform: 'translate3d(100%, 0, 0)',
- minHeight: '1px',
- visibility: 'hidden',
- })),
- transition('* => left, * => right, left => center, right => center', animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')),
- transition('void => left-origin-center', [
- style({ transform: 'translate3d(-100%, 0, 0)', visibility: 'hidden' }),
- animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),
- ]),
- transition('void => right-origin-center', [
- style({ transform: 'translate3d(100%, 0, 0)', visibility: 'hidden' }),
- animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)'),
- ]),
- ]),
- };
- /**
- * The portal host directive for the contents of the tab.
- * @docs-private
- */
- class MatTabBodyPortal extends CdkPortalOutlet {
- constructor(componentFactoryResolver, viewContainerRef, _host, _document) {
- super(componentFactoryResolver, viewContainerRef, _document);
- this._host = _host;
- /** Subscription to events for when the tab body begins centering. */
- this._centeringSub = Subscription.EMPTY;
- /** Subscription to events for when the tab body finishes leaving from center position. */
- this._leavingSub = Subscription.EMPTY;
- }
- /** Set initial visibility or set up subscription for changing visibility. */
- ngOnInit() {
- super.ngOnInit();
- this._centeringSub = this._host._beforeCentering
- .pipe(startWith(this._host._isCenterPosition(this._host._position)))
- .subscribe((isCentering) => {
- if (isCentering && !this.hasAttached()) {
- this.attach(this._host._content);
- }
- });
- this._leavingSub = this._host._afterLeavingCenter.subscribe(() => {
- if (!this._host.preserveContent) {
- this.detach();
- }
- });
- }
- /** Clean up centering subscription. */
- ngOnDestroy() {
- super.ngOnDestroy();
- this._centeringSub.unsubscribe();
- this._leavingSub.unsubscribe();
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabBodyPortal, deps: [{ token: i0.ComponentFactoryResolver }, { token: i0.ViewContainerRef }, { token: forwardRef(() => MatTabBody) }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); }
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: MatTabBodyPortal, selector: "[matTabBodyHost]", usesInheritance: true, ngImport: i0 }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabBodyPortal, decorators: [{
- type: Directive,
- args: [{
- selector: '[matTabBodyHost]',
- }]
- }], ctorParameters: function () { return [{ type: i0.ComponentFactoryResolver }, { type: i0.ViewContainerRef }, { type: MatTabBody, decorators: [{
- type: Inject,
- args: [forwardRef(() => MatTabBody)]
- }] }, { type: undefined, decorators: [{
- type: Inject,
- args: [DOCUMENT]
- }] }]; } });
- /**
- * Base class with all of the `MatTabBody` functionality.
- * @docs-private
- */
- class _MatTabBodyBase {
- /** The shifted index position of the tab body, where zero represents the active center tab. */
- set position(position) {
- this._positionIndex = position;
- this._computePositionAnimationState();
- }
- constructor(_elementRef, _dir, changeDetectorRef) {
- this._elementRef = _elementRef;
- this._dir = _dir;
- /** Subscription to the directionality change observable. */
- this._dirChangeSubscription = Subscription.EMPTY;
- /** Emits when an animation on the tab is complete. */
- this._translateTabComplete = new Subject();
- /** Event emitted when the tab begins to animate towards the center as the active tab. */
- this._onCentering = new EventEmitter();
- /** Event emitted before the centering of the tab begins. */
- this._beforeCentering = new EventEmitter();
- /** Event emitted before the centering of the tab begins. */
- this._afterLeavingCenter = new EventEmitter();
- /** Event emitted when the tab completes its animation towards the center. */
- this._onCentered = new EventEmitter(true);
- // Note that the default value will always be overwritten by `MatTabBody`, but we need one
- // anyway to prevent the animations module from throwing an error if the body is used on its own.
- /** Duration for the tab's animation. */
- this.animationDuration = '500ms';
- /** Whether the tab's content should be kept in the DOM while it's off-screen. */
- this.preserveContent = false;
- if (_dir) {
- this._dirChangeSubscription = _dir.change.subscribe((dir) => {
- this._computePositionAnimationState(dir);
- changeDetectorRef.markForCheck();
- });
- }
- // Ensure that we get unique animation events, because the `.done` callback can get
- // invoked twice in some browsers. See https://github.com/angular/angular/issues/24084.
- this._translateTabComplete
- .pipe(distinctUntilChanged((x, y) => {
- return x.fromState === y.fromState && x.toState === y.toState;
- }))
- .subscribe(event => {
- // If the transition to the center is complete, emit an event.
- if (this._isCenterPosition(event.toState) && this._isCenterPosition(this._position)) {
- this._onCentered.emit();
- }
- if (this._isCenterPosition(event.fromState) && !this._isCenterPosition(this._position)) {
- this._afterLeavingCenter.emit();
- }
- });
- }
- /**
- * After initialized, check if the content is centered and has an origin. If so, set the
- * special position states that transition the tab from the left or right before centering.
- */
- ngOnInit() {
- if (this._position == 'center' && this.origin != null) {
- this._position = this._computePositionFromOrigin(this.origin);
- }
- }
- ngOnDestroy() {
- this._dirChangeSubscription.unsubscribe();
- this._translateTabComplete.complete();
- }
- _onTranslateTabStarted(event) {
- const isCentering = this._isCenterPosition(event.toState);
- this._beforeCentering.emit(isCentering);
- if (isCentering) {
- this._onCentering.emit(this._elementRef.nativeElement.clientHeight);
- }
- }
- /** The text direction of the containing app. */
- _getLayoutDirection() {
- return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';
- }
- /** Whether the provided position state is considered center, regardless of origin. */
- _isCenterPosition(position) {
- return (position == 'center' || position == 'left-origin-center' || position == 'right-origin-center');
- }
- /** Computes the position state that will be used for the tab-body animation trigger. */
- _computePositionAnimationState(dir = this._getLayoutDirection()) {
- if (this._positionIndex < 0) {
- this._position = dir == 'ltr' ? 'left' : 'right';
- }
- else if (this._positionIndex > 0) {
- this._position = dir == 'ltr' ? 'right' : 'left';
- }
- else {
- this._position = 'center';
- }
- }
- /**
- * Computes the position state based on the specified origin position. This is used if the
- * tab is becoming visible immediately after creation.
- */
- _computePositionFromOrigin(origin) {
- const dir = this._getLayoutDirection();
- if ((dir == 'ltr' && origin <= 0) || (dir == 'rtl' && origin > 0)) {
- return 'left-origin-center';
- }
- return 'right-origin-center';
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabBodyBase, deps: [{ token: i0.ElementRef }, { token: i1.Directionality, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: _MatTabBodyBase, inputs: { _content: ["content", "_content"], origin: "origin", animationDuration: "animationDuration", preserveContent: "preserveContent", position: "position" }, outputs: { _onCentering: "_onCentering", _beforeCentering: "_beforeCentering", _afterLeavingCenter: "_afterLeavingCenter", _onCentered: "_onCentered" }, ngImport: i0 }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabBodyBase, decorators: [{
- type: Directive
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Directionality, decorators: [{
- type: Optional
- }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { _onCentering: [{
- type: Output
- }], _beforeCentering: [{
- type: Output
- }], _afterLeavingCenter: [{
- type: Output
- }], _onCentered: [{
- type: Output
- }], _content: [{
- type: Input,
- args: ['content']
- }], origin: [{
- type: Input
- }], animationDuration: [{
- type: Input
- }], preserveContent: [{
- type: Input
- }], position: [{
- type: Input
- }] } });
- /**
- * Wrapper for the contents of a tab.
- * @docs-private
- */
- class MatTabBody extends _MatTabBodyBase {
- constructor(elementRef, dir, changeDetectorRef) {
- super(elementRef, dir, changeDetectorRef);
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabBody, deps: [{ token: i0.ElementRef }, { token: i1.Directionality, optional: true }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: MatTabBody, selector: "mat-tab-body", host: { classAttribute: "mat-mdc-tab-body" }, viewQueries: [{ propertyName: "_portalHost", first: true, predicate: CdkPortalOutlet, descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"mat-mdc-tab-body-content\" #content\n [@translateTab]=\"{\n value: _position,\n params: {animationDuration: animationDuration}\n }\"\n (@translateTab.start)=\"_onTranslateTabStarted($event)\"\n (@translateTab.done)=\"_translateTabComplete.next($event)\"\n cdkScrollable>\n <ng-template matTabBodyHost></ng-template>\n</div>\n", styles: [".mat-mdc-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-mdc-tab-body.mat-mdc-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-mdc-tab-group.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body.mat-mdc-tab-body-active{overflow-y:hidden}.mat-mdc-tab-body-content{height:100%;overflow:auto}.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body-content{overflow:hidden}.mat-mdc-tab-body-content[style*=\"visibility: hidden\"]{display:none}"], dependencies: [{ kind: "directive", type: MatTabBodyPortal, selector: "[matTabBodyHost]" }], animations: [matTabsAnimations.translateTab], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabBody, decorators: [{
- type: Component,
- args: [{ selector: 'mat-tab-body', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.Default, animations: [matTabsAnimations.translateTab], host: {
- 'class': 'mat-mdc-tab-body',
- }, template: "<div class=\"mat-mdc-tab-body-content\" #content\n [@translateTab]=\"{\n value: _position,\n params: {animationDuration: animationDuration}\n }\"\n (@translateTab.start)=\"_onTranslateTabStarted($event)\"\n (@translateTab.done)=\"_translateTabComplete.next($event)\"\n cdkScrollable>\n <ng-template matTabBodyHost></ng-template>\n</div>\n", styles: [".mat-mdc-tab-body{top:0;left:0;right:0;bottom:0;position:absolute;display:block;overflow:hidden;outline:0;flex-basis:100%}.mat-mdc-tab-body.mat-mdc-tab-body-active{position:relative;overflow-x:hidden;overflow-y:auto;z-index:1;flex-grow:1}.mat-mdc-tab-group.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body.mat-mdc-tab-body-active{overflow-y:hidden}.mat-mdc-tab-body-content{height:100%;overflow:auto}.mat-mdc-tab-group-dynamic-height .mat-mdc-tab-body-content{overflow:hidden}.mat-mdc-tab-body-content[style*=\"visibility: hidden\"]{display:none}"] }]
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Directionality, decorators: [{
- type: Optional
- }] }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { _portalHost: [{
- type: ViewChild,
- args: [CdkPortalOutlet]
- }] } });
- /**
- * Injection token that can be used to reference instances of `MatTabContent`. It serves as
- * alternative token to the actual `MatTabContent` class which could cause unnecessary
- * retention of the class and its directive metadata.
- */
- const MAT_TAB_CONTENT = new InjectionToken('MatTabContent');
- /** Decorates the `ng-template` tags and reads out the template from it. */
- class MatTabContent {
- constructor(/** Content for the tab. */ template) {
- this.template = template;
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabContent, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive }); }
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: MatTabContent, selector: "[matTabContent]", providers: [{ provide: MAT_TAB_CONTENT, useExisting: MatTabContent }], ngImport: i0 }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabContent, decorators: [{
- type: Directive,
- args: [{
- selector: '[matTabContent]',
- providers: [{ provide: MAT_TAB_CONTENT, useExisting: MatTabContent }],
- }]
- }], ctorParameters: function () { return [{ type: i0.TemplateRef }]; } });
- /**
- * Injection token that can be used to reference instances of `MatTabLabel`. It serves as
- * alternative token to the actual `MatTabLabel` class which could cause unnecessary
- * retention of the class and its directive metadata.
- */
- const MAT_TAB_LABEL = new InjectionToken('MatTabLabel');
- /**
- * Used to provide a tab label to a tab without causing a circular dependency.
- * @docs-private
- */
- const MAT_TAB = new InjectionToken('MAT_TAB');
- /** Used to flag tab labels for use with the portal directive */
- class MatTabLabel extends CdkPortal {
- constructor(templateRef, viewContainerRef, _closestTab) {
- super(templateRef, viewContainerRef);
- this._closestTab = _closestTab;
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabLabel, deps: [{ token: i0.TemplateRef }, { token: i0.ViewContainerRef }, { token: MAT_TAB, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: MatTabLabel, selector: "[mat-tab-label], [matTabLabel]", providers: [{ provide: MAT_TAB_LABEL, useExisting: MatTabLabel }], usesInheritance: true, ngImport: i0 }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabLabel, decorators: [{
- type: Directive,
- args: [{
- selector: '[mat-tab-label], [matTabLabel]',
- providers: [{ provide: MAT_TAB_LABEL, useExisting: MatTabLabel }],
- }]
- }], ctorParameters: function () { return [{ type: i0.TemplateRef }, { type: i0.ViewContainerRef }, { type: undefined, decorators: [{
- type: Inject,
- args: [MAT_TAB]
- }, {
- type: Optional
- }] }]; } });
- /** Class that is applied when a tab indicator is active. */
- const ACTIVE_CLASS = 'mdc-tab-indicator--active';
- /** Class that is applied when the tab indicator should not transition. */
- const NO_TRANSITION_CLASS = 'mdc-tab-indicator--no-transition';
- /**
- * Abstraction around the MDC tab indicator that acts as the tab header's ink bar.
- * @docs-private
- */
- class MatInkBar {
- constructor(_items) {
- this._items = _items;
- }
- /** Hides the ink bar. */
- hide() {
- this._items.forEach(item => item.deactivateInkBar());
- }
- /** Aligns the ink bar to a DOM node. */
- alignToElement(element) {
- const correspondingItem = this._items.find(item => item.elementRef.nativeElement === element);
- const currentItem = this._currentItem;
- if (correspondingItem === currentItem) {
- return;
- }
- currentItem?.deactivateInkBar();
- if (correspondingItem) {
- const clientRect = currentItem?.elementRef.nativeElement.getBoundingClientRect?.();
- // The ink bar won't animate unless we give it the `ClientRect` of the previous item.
- correspondingItem.activateInkBar(clientRect);
- this._currentItem = correspondingItem;
- }
- }
- }
- /**
- * Mixin that can be used to apply the `MatInkBarItem` behavior to a class.
- * Base on MDC's `MDCSlidingTabIndicatorFoundation`:
- * https://github.com/material-components/material-components-web/blob/c0a11ef0d000a098fd0c372be8f12d6a99302855/packages/mdc-tab-indicator/sliding-foundation.ts
- * @docs-private
- */
- function mixinInkBarItem(base) {
- return class extends base {
- constructor(...args) {
- super(...args);
- this._fitToContent = false;
- }
- /** Whether the ink bar should fit to the entire tab or just its content. */
- get fitInkBarToContent() {
- return this._fitToContent;
- }
- set fitInkBarToContent(v) {
- const newValue = coerceBooleanProperty(v);
- if (this._fitToContent !== newValue) {
- this._fitToContent = newValue;
- if (this._inkBarElement) {
- this._appendInkBarElement();
- }
- }
- }
- /** Aligns the ink bar to the current item. */
- activateInkBar(previousIndicatorClientRect) {
- const element = this.elementRef.nativeElement;
- // Early exit if no indicator is present to handle cases where an indicator
- // may be activated without a prior indicator state
- if (!previousIndicatorClientRect ||
- !element.getBoundingClientRect ||
- !this._inkBarContentElement) {
- element.classList.add(ACTIVE_CLASS);
- return;
- }
- // This animation uses the FLIP approach. You can read more about it at the link below:
- // https://aerotwist.com/blog/flip-your-animations/
- // Calculate the dimensions based on the dimensions of the previous indicator
- const currentClientRect = element.getBoundingClientRect();
- const widthDelta = previousIndicatorClientRect.width / currentClientRect.width;
- const xPosition = previousIndicatorClientRect.left - currentClientRect.left;
- element.classList.add(NO_TRANSITION_CLASS);
- this._inkBarContentElement.style.setProperty('transform', `translateX(${xPosition}px) scaleX(${widthDelta})`);
- // Force repaint before updating classes and transform to ensure the transform properly takes effect
- element.getBoundingClientRect();
- element.classList.remove(NO_TRANSITION_CLASS);
- element.classList.add(ACTIVE_CLASS);
- this._inkBarContentElement.style.setProperty('transform', '');
- }
- /** Removes the ink bar from the current item. */
- deactivateInkBar() {
- this.elementRef.nativeElement.classList.remove(ACTIVE_CLASS);
- }
- /** Initializes the foundation. */
- ngOnInit() {
- this._createInkBarElement();
- }
- /** Destroys the foundation. */
- ngOnDestroy() {
- this._inkBarElement?.remove();
- this._inkBarElement = this._inkBarContentElement = null;
- }
- /** Creates and appends the ink bar element. */
- _createInkBarElement() {
- const documentNode = this.elementRef.nativeElement.ownerDocument || document;
- this._inkBarElement = documentNode.createElement('span');
- this._inkBarContentElement = documentNode.createElement('span');
- this._inkBarElement.className = 'mdc-tab-indicator';
- this._inkBarContentElement.className =
- 'mdc-tab-indicator__content mdc-tab-indicator__content--underline';
- this._inkBarElement.appendChild(this._inkBarContentElement);
- this._appendInkBarElement();
- }
- /**
- * Appends the ink bar to the tab host element or content, depending on whether
- * the ink bar should fit to content.
- */
- _appendInkBarElement() {
- if (!this._inkBarElement && (typeof ngDevMode === 'undefined' || ngDevMode)) {
- throw Error('Ink bar element has not been created and cannot be appended');
- }
- const parentElement = this._fitToContent
- ? this.elementRef.nativeElement.querySelector('.mdc-tab__content')
- : this.elementRef.nativeElement;
- if (!parentElement && (typeof ngDevMode === 'undefined' || ngDevMode)) {
- throw Error('Missing element to host the ink bar');
- }
- parentElement.appendChild(this._inkBarElement);
- }
- };
- }
- /**
- * The default positioner function for the MatInkBar.
- * @docs-private
- */
- function _MAT_INK_BAR_POSITIONER_FACTORY() {
- const method = (element) => ({
- left: element ? (element.offsetLeft || 0) + 'px' : '0',
- width: element ? (element.offsetWidth || 0) + 'px' : '0',
- });
- return method;
- }
- /** Injection token for the MatInkBar's Positioner. */
- const _MAT_INK_BAR_POSITIONER = new InjectionToken('MatInkBarPositioner', {
- providedIn: 'root',
- factory: _MAT_INK_BAR_POSITIONER_FACTORY,
- });
- // Boilerplate for applying mixins to MatTabLabelWrapper.
- /** @docs-private */
- const _MatTabLabelWrapperMixinBase = mixinDisabled(class {
- });
- /**
- * Used in the `mat-tab-group` view to display tab labels.
- * @docs-private
- */
- class _MatTabLabelWrapperBase extends _MatTabLabelWrapperMixinBase {
- constructor(elementRef) {
- super();
- this.elementRef = elementRef;
- }
- /** Sets focus on the wrapper element */
- focus() {
- this.elementRef.nativeElement.focus();
- }
- getOffsetLeft() {
- return this.elementRef.nativeElement.offsetLeft;
- }
- getOffsetWidth() {
- return this.elementRef.nativeElement.offsetWidth;
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabLabelWrapperBase, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: _MatTabLabelWrapperBase, usesInheritance: true, ngImport: i0 }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabLabelWrapperBase, decorators: [{
- type: Directive
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; } });
- const _MatTabLabelWrapperBaseWithInkBarItem = mixinInkBarItem(_MatTabLabelWrapperBase);
- /**
- * Used in the `mat-tab-group` view to display tab labels.
- * @docs-private
- */
- class MatTabLabelWrapper extends _MatTabLabelWrapperBaseWithInkBarItem {
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabLabelWrapper, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: MatTabLabelWrapper, selector: "[matTabLabelWrapper]", inputs: { disabled: "disabled", fitInkBarToContent: "fitInkBarToContent" }, host: { properties: { "class.mat-mdc-tab-disabled": "disabled", "attr.aria-disabled": "!!disabled" } }, usesInheritance: true, ngImport: i0 }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabLabelWrapper, decorators: [{
- type: Directive,
- args: [{
- selector: '[matTabLabelWrapper]',
- inputs: ['disabled', 'fitInkBarToContent'],
- host: {
- '[class.mat-mdc-tab-disabled]': 'disabled',
- '[attr.aria-disabled]': '!!disabled',
- },
- }]
- }] });
- // Boilerplate for applying mixins to MatTab.
- /** @docs-private */
- const _MatTabMixinBase = mixinDisabled(class {
- });
- /**
- * Used to provide a tab group to a tab without causing a circular dependency.
- * @docs-private
- */
- const MAT_TAB_GROUP = new InjectionToken('MAT_TAB_GROUP');
- /** @docs-private */
- class _MatTabBase extends _MatTabMixinBase {
- /** @docs-private */
- get content() {
- return this._contentPortal;
- }
- constructor(_viewContainerRef, _closestTabGroup) {
- super();
- this._viewContainerRef = _viewContainerRef;
- this._closestTabGroup = _closestTabGroup;
- /** Plain text label for the tab, used when there is no template label. */
- this.textLabel = '';
- /** Portal that will be the hosted content of the tab */
- this._contentPortal = null;
- /** Emits whenever the internal state of the tab changes. */
- this._stateChanges = new Subject();
- /**
- * The relatively indexed position where 0 represents the center, negative is left, and positive
- * represents the right.
- */
- this.position = null;
- /**
- * The initial relatively index origin of the tab if it was created and selected after there
- * was already a selected tab. Provides context of what position the tab should originate from.
- */
- this.origin = null;
- /**
- * Whether the tab is currently active.
- */
- this.isActive = false;
- }
- ngOnChanges(changes) {
- if (changes.hasOwnProperty('textLabel') || changes.hasOwnProperty('disabled')) {
- this._stateChanges.next();
- }
- }
- ngOnDestroy() {
- this._stateChanges.complete();
- }
- ngOnInit() {
- this._contentPortal = new TemplatePortal(this._explicitContent || this._implicitContent, this._viewContainerRef);
- }
- /**
- * This has been extracted to a util because of TS 4 and VE.
- * View Engine doesn't support property rename inheritance.
- * TS 4.0 doesn't allow properties to override accessors or vice-versa.
- * @docs-private
- */
- _setTemplateLabelInput(value) {
- // Only update the label if the query managed to find one. This works around an issue where a
- // user may have manually set `templateLabel` during creation mode, which would then get
- // clobbered by `undefined` when the query resolves. Also note that we check that the closest
- // tab matches the current one so that we don't pick up labels from nested tabs.
- if (value && value._closestTab === this) {
- this._templateLabel = value;
- }
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabBase, deps: [{ token: i0.ViewContainerRef }, { token: MAT_TAB_GROUP, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: _MatTabBase, inputs: { textLabel: ["label", "textLabel"], ariaLabel: ["aria-label", "ariaLabel"], ariaLabelledby: ["aria-labelledby", "ariaLabelledby"], labelClass: "labelClass", bodyClass: "bodyClass" }, viewQueries: [{ propertyName: "_implicitContent", first: true, predicate: TemplateRef, descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0 }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabBase, decorators: [{
- type: Directive
- }], ctorParameters: function () { return [{ type: i0.ViewContainerRef }, { type: undefined, decorators: [{
- type: Inject,
- args: [MAT_TAB_GROUP]
- }, {
- type: Optional
- }] }]; }, propDecorators: { _implicitContent: [{
- type: ViewChild,
- args: [TemplateRef, { static: true }]
- }], textLabel: [{
- type: Input,
- args: ['label']
- }], ariaLabel: [{
- type: Input,
- args: ['aria-label']
- }], ariaLabelledby: [{
- type: Input,
- args: ['aria-labelledby']
- }], labelClass: [{
- type: Input
- }], bodyClass: [{
- type: Input
- }] } });
- class MatTab extends _MatTabBase {
- constructor() {
- super(...arguments);
- /**
- * Template provided in the tab content that will be used if present, used to enable lazy-loading
- */
- this._explicitContent = undefined;
- }
- /** Content for the tab label given by `<ng-template mat-tab-label>`. */
- get templateLabel() {
- return this._templateLabel;
- }
- set templateLabel(value) {
- this._setTemplateLabelInput(value);
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTab, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: MatTab, selector: "mat-tab", inputs: { disabled: "disabled" }, providers: [{ provide: MAT_TAB, useExisting: MatTab }], queries: [{ propertyName: "_explicitContent", first: true, predicate: MatTabContent, descendants: true, read: TemplateRef, static: true }, { propertyName: "templateLabel", first: true, predicate: MatTabLabel, descendants: true }], exportAs: ["matTab"], usesInheritance: true, ngImport: i0, template: "<!-- Create a template for the content of the <mat-tab> so that we can grab a reference to this\n TemplateRef and use it in a Portal to render the tab content in the appropriate place in the\n tab-group. -->\n<ng-template><ng-content></ng-content></ng-template>\n", changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTab, decorators: [{
- type: Component,
- args: [{ selector: 'mat-tab', inputs: ['disabled'], changeDetection: ChangeDetectionStrategy.Default, encapsulation: ViewEncapsulation.None, exportAs: 'matTab', providers: [{ provide: MAT_TAB, useExisting: MatTab }], template: "<!-- Create a template for the content of the <mat-tab> so that we can grab a reference to this\n TemplateRef and use it in a Portal to render the tab content in the appropriate place in the\n tab-group. -->\n<ng-template><ng-content></ng-content></ng-template>\n" }]
- }], propDecorators: { _explicitContent: [{
- type: ContentChild,
- args: [MatTabContent, { read: TemplateRef, static: true }]
- }], templateLabel: [{
- type: ContentChild,
- args: [MatTabLabel]
- }] } });
- /** Config used to bind passive event listeners */
- const passiveEventListenerOptions = normalizePassiveListenerOptions({
- passive: true,
- });
- /**
- * Amount of milliseconds to wait before starting to scroll the header automatically.
- * Set a little conservatively in order to handle fake events dispatched on touch devices.
- */
- const HEADER_SCROLL_DELAY = 650;
- /**
- * Interval in milliseconds at which to scroll the header
- * while the user is holding their pointer.
- */
- const HEADER_SCROLL_INTERVAL = 100;
- /**
- * Base class for a tab header that supported pagination.
- * @docs-private
- */
- class MatPaginatedTabHeader {
- /**
- * Whether pagination should be disabled. This can be used to avoid unnecessary
- * layout recalculations if it's known that pagination won't be required.
- */
- get disablePagination() {
- return this._disablePagination;
- }
- set disablePagination(value) {
- this._disablePagination = coerceBooleanProperty(value);
- }
- /** The index of the active tab. */
- get selectedIndex() {
- return this._selectedIndex;
- }
- set selectedIndex(value) {
- value = coerceNumberProperty(value);
- if (this._selectedIndex != value) {
- this._selectedIndexChanged = true;
- this._selectedIndex = value;
- if (this._keyManager) {
- this._keyManager.updateActiveItem(value);
- }
- }
- }
- constructor(_elementRef, _changeDetectorRef, _viewportRuler, _dir, _ngZone, _platform, _animationMode) {
- this._elementRef = _elementRef;
- this._changeDetectorRef = _changeDetectorRef;
- this._viewportRuler = _viewportRuler;
- this._dir = _dir;
- this._ngZone = _ngZone;
- this._platform = _platform;
- this._animationMode = _animationMode;
- /** The distance in pixels that the tab labels should be translated to the left. */
- this._scrollDistance = 0;
- /** Whether the header should scroll to the selected index after the view has been checked. */
- this._selectedIndexChanged = false;
- /** Emits when the component is destroyed. */
- this._destroyed = new Subject();
- /** Whether the controls for pagination should be displayed */
- this._showPaginationControls = false;
- /** Whether the tab list can be scrolled more towards the end of the tab label list. */
- this._disableScrollAfter = true;
- /** Whether the tab list can be scrolled more towards the beginning of the tab label list. */
- this._disableScrollBefore = true;
- /** Stream that will stop the automated scrolling. */
- this._stopScrolling = new Subject();
- this._disablePagination = false;
- this._selectedIndex = 0;
- /** Event emitted when the option is selected. */
- this.selectFocusedIndex = new EventEmitter();
- /** Event emitted when a label is focused. */
- this.indexFocused = new EventEmitter();
- // Bind the `mouseleave` event on the outside since it doesn't change anything in the view.
- _ngZone.runOutsideAngular(() => {
- fromEvent(_elementRef.nativeElement, 'mouseleave')
- .pipe(takeUntil(this._destroyed))
- .subscribe(() => {
- this._stopInterval();
- });
- });
- }
- ngAfterViewInit() {
- // We need to handle these events manually, because we want to bind passive event listeners.
- fromEvent(this._previousPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)
- .pipe(takeUntil(this._destroyed))
- .subscribe(() => {
- this._handlePaginatorPress('before');
- });
- fromEvent(this._nextPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)
- .pipe(takeUntil(this._destroyed))
- .subscribe(() => {
- this._handlePaginatorPress('after');
- });
- }
- ngAfterContentInit() {
- const dirChange = this._dir ? this._dir.change : of('ltr');
- const resize = this._viewportRuler.change(150);
- const realign = () => {
- this.updatePagination();
- this._alignInkBarToSelectedTab();
- };
- this._keyManager = new FocusKeyManager(this._items)
- .withHorizontalOrientation(this._getLayoutDirection())
- .withHomeAndEnd()
- .withWrap()
- // Allow focus to land on disabled tabs, as per https://w3c.github.io/aria-practices/#kbd_disabled_controls
- .skipPredicate(() => false);
- this._keyManager.updateActiveItem(this._selectedIndex);
- // Defer the first call in order to allow for slower browsers to lay out the elements.
- // This helps in cases where the user lands directly on a page with paginated tabs.
- // Note that we use `onStable` instead of `requestAnimationFrame`, because the latter
- // can hold up tests that are in a background tab.
- this._ngZone.onStable.pipe(take(1)).subscribe(realign);
- // On dir change or window resize, realign the ink bar and update the orientation of
- // the key manager if the direction has changed.
- merge(dirChange, resize, this._items.changes, this._itemsResized())
- .pipe(takeUntil(this._destroyed))
- .subscribe(() => {
- // We need to defer this to give the browser some time to recalculate
- // the element dimensions. The call has to be wrapped in `NgZone.run`,
- // because the viewport change handler runs outside of Angular.
- this._ngZone.run(() => {
- Promise.resolve().then(() => {
- // Clamp the scroll distance, because it can change with the number of tabs.
- this._scrollDistance = Math.max(0, Math.min(this._getMaxScrollDistance(), this._scrollDistance));
- realign();
- });
- });
- this._keyManager.withHorizontalOrientation(this._getLayoutDirection());
- });
- // If there is a change in the focus key manager we need to emit the `indexFocused`
- // event in order to provide a public event that notifies about focus changes. Also we realign
- // the tabs container by scrolling the new focused tab into the visible section.
- this._keyManager.change.subscribe(newFocusIndex => {
- this.indexFocused.emit(newFocusIndex);
- this._setTabFocus(newFocusIndex);
- });
- }
- /** Sends any changes that could affect the layout of the items. */
- _itemsResized() {
- if (typeof ResizeObserver !== 'function') {
- return EMPTY;
- }
- return this._items.changes.pipe(startWith(this._items), switchMap((tabItems) => new Observable((observer) => this._ngZone.runOutsideAngular(() => {
- const resizeObserver = new ResizeObserver(entries => observer.next(entries));
- tabItems.forEach(item => resizeObserver.observe(item.elementRef.nativeElement));
- return () => {
- resizeObserver.disconnect();
- };
- }))),
- // Skip the first emit since the resize observer emits when an item
- // is observed for new items when the tab is already inserted
- skip(1),
- // Skip emissions where all the elements are invisible since we don't want
- // the header to try and re-render with invalid measurements. See #25574.
- filter(entries => entries.some(e => e.contentRect.width > 0 && e.contentRect.height > 0)));
- }
- ngAfterContentChecked() {
- // If the number of tab labels have changed, check if scrolling should be enabled
- if (this._tabLabelCount != this._items.length) {
- this.updatePagination();
- this._tabLabelCount = this._items.length;
- this._changeDetectorRef.markForCheck();
- }
- // If the selected index has changed, scroll to the label and check if the scrolling controls
- // should be disabled.
- if (this._selectedIndexChanged) {
- this._scrollToLabel(this._selectedIndex);
- this._checkScrollingControls();
- this._alignInkBarToSelectedTab();
- this._selectedIndexChanged = false;
- this._changeDetectorRef.markForCheck();
- }
- // If the scroll distance has been changed (tab selected, focused, scroll controls activated),
- // then translate the header to reflect this.
- if (this._scrollDistanceChanged) {
- this._updateTabScrollPosition();
- this._scrollDistanceChanged = false;
- this._changeDetectorRef.markForCheck();
- }
- }
- ngOnDestroy() {
- this._keyManager?.destroy();
- this._destroyed.next();
- this._destroyed.complete();
- this._stopScrolling.complete();
- }
- /** Handles keyboard events on the header. */
- _handleKeydown(event) {
- // We don't handle any key bindings with a modifier key.
- if (hasModifierKey(event)) {
- return;
- }
- switch (event.keyCode) {
- case ENTER:
- case SPACE:
- if (this.focusIndex !== this.selectedIndex) {
- const item = this._items.get(this.focusIndex);
- if (item && !item.disabled) {
- this.selectFocusedIndex.emit(this.focusIndex);
- this._itemSelected(event);
- }
- }
- break;
- default:
- this._keyManager.onKeydown(event);
- }
- }
- /**
- * Callback for when the MutationObserver detects that the content has changed.
- */
- _onContentChanges() {
- const textContent = this._elementRef.nativeElement.textContent;
- // We need to diff the text content of the header, because the MutationObserver callback
- // will fire even if the text content didn't change which is inefficient and is prone
- // to infinite loops if a poorly constructed expression is passed in (see #14249).
- if (textContent !== this._currentTextContent) {
- this._currentTextContent = textContent || '';
- // The content observer runs outside the `NgZone` by default, which
- // means that we need to bring the callback back in ourselves.
- this._ngZone.run(() => {
- this.updatePagination();
- this._alignInkBarToSelectedTab();
- this._changeDetectorRef.markForCheck();
- });
- }
- }
- /**
- * Updates the view whether pagination should be enabled or not.
- *
- * WARNING: Calling this method can be very costly in terms of performance. It should be called
- * as infrequently as possible from outside of the Tabs component as it causes a reflow of the
- * page.
- */
- updatePagination() {
- this._checkPaginationEnabled();
- this._checkScrollingControls();
- this._updateTabScrollPosition();
- }
- /** Tracks which element has focus; used for keyboard navigation */
- get focusIndex() {
- return this._keyManager ? this._keyManager.activeItemIndex : 0;
- }
- /** When the focus index is set, we must manually send focus to the correct label */
- set focusIndex(value) {
- if (!this._isValidIndex(value) || this.focusIndex === value || !this._keyManager) {
- return;
- }
- this._keyManager.setActiveItem(value);
- }
- /**
- * Determines if an index is valid. If the tabs are not ready yet, we assume that the user is
- * providing a valid index and return true.
- */
- _isValidIndex(index) {
- return this._items ? !!this._items.toArray()[index] : true;
- }
- /**
- * Sets focus on the HTML element for the label wrapper and scrolls it into the view if
- * scrolling is enabled.
- */
- _setTabFocus(tabIndex) {
- if (this._showPaginationControls) {
- this._scrollToLabel(tabIndex);
- }
- if (this._items && this._items.length) {
- this._items.toArray()[tabIndex].focus();
- // Do not let the browser manage scrolling to focus the element, this will be handled
- // by using translation. In LTR, the scroll left should be 0. In RTL, the scroll width
- // should be the full width minus the offset width.
- const containerEl = this._tabListContainer.nativeElement;
- const dir = this._getLayoutDirection();
- if (dir == 'ltr') {
- containerEl.scrollLeft = 0;
- }
- else {
- containerEl.scrollLeft = containerEl.scrollWidth - containerEl.offsetWidth;
- }
- }
- }
- /** The layout direction of the containing app. */
- _getLayoutDirection() {
- return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';
- }
- /** Performs the CSS transformation on the tab list that will cause the list to scroll. */
- _updateTabScrollPosition() {
- if (this.disablePagination) {
- return;
- }
- const scrollDistance = this.scrollDistance;
- const translateX = this._getLayoutDirection() === 'ltr' ? -scrollDistance : scrollDistance;
- // Don't use `translate3d` here because we don't want to create a new layer. A new layer
- // seems to cause flickering and overflow in Internet Explorer. For example, the ink bar
- // and ripples will exceed the boundaries of the visible tab bar.
- // See: https://github.com/angular/components/issues/10276
- // We round the `transform` here, because transforms with sub-pixel precision cause some
- // browsers to blur the content of the element.
- this._tabList.nativeElement.style.transform = `translateX(${Math.round(translateX)}px)`;
- // Setting the `transform` on IE will change the scroll offset of the parent, causing the
- // position to be thrown off in some cases. We have to reset it ourselves to ensure that
- // it doesn't get thrown off. Note that we scope it only to IE and Edge, because messing
- // with the scroll position throws off Chrome 71+ in RTL mode (see #14689).
- if (this._platform.TRIDENT || this._platform.EDGE) {
- this._tabListContainer.nativeElement.scrollLeft = 0;
- }
- }
- /** Sets the distance in pixels that the tab header should be transformed in the X-axis. */
- get scrollDistance() {
- return this._scrollDistance;
- }
- set scrollDistance(value) {
- this._scrollTo(value);
- }
- /**
- * Moves the tab list in the 'before' or 'after' direction (towards the beginning of the list or
- * the end of the list, respectively). The distance to scroll is computed to be a third of the
- * length of the tab list view window.
- *
- * This is an expensive call that forces a layout reflow to compute box and scroll metrics and
- * should be called sparingly.
- */
- _scrollHeader(direction) {
- const viewLength = this._tabListContainer.nativeElement.offsetWidth;
- // Move the scroll distance one-third the length of the tab list's viewport.
- const scrollAmount = ((direction == 'before' ? -1 : 1) * viewLength) / 3;
- return this._scrollTo(this._scrollDistance + scrollAmount);
- }
- /** Handles click events on the pagination arrows. */
- _handlePaginatorClick(direction) {
- this._stopInterval();
- this._scrollHeader(direction);
- }
- /**
- * Moves the tab list such that the desired tab label (marked by index) is moved into view.
- *
- * This is an expensive call that forces a layout reflow to compute box and scroll metrics and
- * should be called sparingly.
- */
- _scrollToLabel(labelIndex) {
- if (this.disablePagination) {
- return;
- }
- const selectedLabel = this._items ? this._items.toArray()[labelIndex] : null;
- if (!selectedLabel) {
- return;
- }
- // The view length is the visible width of the tab labels.
- const viewLength = this._tabListContainer.nativeElement.offsetWidth;
- const { offsetLeft, offsetWidth } = selectedLabel.elementRef.nativeElement;
- let labelBeforePos, labelAfterPos;
- if (this._getLayoutDirection() == 'ltr') {
- labelBeforePos = offsetLeft;
- labelAfterPos = labelBeforePos + offsetWidth;
- }
- else {
- labelAfterPos = this._tabListInner.nativeElement.offsetWidth - offsetLeft;
- labelBeforePos = labelAfterPos - offsetWidth;
- }
- const beforeVisiblePos = this.scrollDistance;
- const afterVisiblePos = this.scrollDistance + viewLength;
- if (labelBeforePos < beforeVisiblePos) {
- // Scroll header to move label to the before direction
- this.scrollDistance -= beforeVisiblePos - labelBeforePos;
- }
- else if (labelAfterPos > afterVisiblePos) {
- // Scroll header to move label to the after direction
- this.scrollDistance += Math.min(labelAfterPos - afterVisiblePos, labelBeforePos - beforeVisiblePos);
- }
- }
- /**
- * Evaluate whether the pagination controls should be displayed. If the scroll width of the
- * tab list is wider than the size of the header container, then the pagination controls should
- * be shown.
- *
- * This is an expensive call that forces a layout reflow to compute box and scroll metrics and
- * should be called sparingly.
- */
- _checkPaginationEnabled() {
- if (this.disablePagination) {
- this._showPaginationControls = false;
- }
- else {
- const isEnabled = this._tabListInner.nativeElement.scrollWidth > this._elementRef.nativeElement.offsetWidth;
- if (!isEnabled) {
- this.scrollDistance = 0;
- }
- if (isEnabled !== this._showPaginationControls) {
- this._changeDetectorRef.markForCheck();
- }
- this._showPaginationControls = isEnabled;
- }
- }
- /**
- * Evaluate whether the before and after controls should be enabled or disabled.
- * If the header is at the beginning of the list (scroll distance is equal to 0) then disable the
- * before button. If the header is at the end of the list (scroll distance is equal to the
- * maximum distance we can scroll), then disable the after button.
- *
- * This is an expensive call that forces a layout reflow to compute box and scroll metrics and
- * should be called sparingly.
- */
- _checkScrollingControls() {
- if (this.disablePagination) {
- this._disableScrollAfter = this._disableScrollBefore = true;
- }
- else {
- // Check if the pagination arrows should be activated.
- this._disableScrollBefore = this.scrollDistance == 0;
- this._disableScrollAfter = this.scrollDistance == this._getMaxScrollDistance();
- this._changeDetectorRef.markForCheck();
- }
- }
- /**
- * Determines what is the maximum length in pixels that can be set for the scroll distance. This
- * is equal to the difference in width between the tab list container and tab header container.
- *
- * This is an expensive call that forces a layout reflow to compute box and scroll metrics and
- * should be called sparingly.
- */
- _getMaxScrollDistance() {
- const lengthOfTabList = this._tabListInner.nativeElement.scrollWidth;
- const viewLength = this._tabListContainer.nativeElement.offsetWidth;
- return lengthOfTabList - viewLength || 0;
- }
- /** Tells the ink-bar to align itself to the current label wrapper */
- _alignInkBarToSelectedTab() {
- const selectedItem = this._items && this._items.length ? this._items.toArray()[this.selectedIndex] : null;
- const selectedLabelWrapper = selectedItem ? selectedItem.elementRef.nativeElement : null;
- if (selectedLabelWrapper) {
- this._inkBar.alignToElement(selectedLabelWrapper);
- }
- else {
- this._inkBar.hide();
- }
- }
- /** Stops the currently-running paginator interval. */
- _stopInterval() {
- this._stopScrolling.next();
- }
- /**
- * Handles the user pressing down on one of the paginators.
- * Starts scrolling the header after a certain amount of time.
- * @param direction In which direction the paginator should be scrolled.
- */
- _handlePaginatorPress(direction, mouseEvent) {
- // Don't start auto scrolling for right mouse button clicks. Note that we shouldn't have to
- // null check the `button`, but we do it so we don't break tests that use fake events.
- if (mouseEvent && mouseEvent.button != null && mouseEvent.button !== 0) {
- return;
- }
- // Avoid overlapping timers.
- this._stopInterval();
- // Start a timer after the delay and keep firing based on the interval.
- timer(HEADER_SCROLL_DELAY, HEADER_SCROLL_INTERVAL)
- // Keep the timer going until something tells it to stop or the component is destroyed.
- .pipe(takeUntil(merge(this._stopScrolling, this._destroyed)))
- .subscribe(() => {
- const { maxScrollDistance, distance } = this._scrollHeader(direction);
- // Stop the timer if we've reached the start or the end.
- if (distance === 0 || distance >= maxScrollDistance) {
- this._stopInterval();
- }
- });
- }
- /**
- * Scrolls the header to a given position.
- * @param position Position to which to scroll.
- * @returns Information on the current scroll distance and the maximum.
- */
- _scrollTo(position) {
- if (this.disablePagination) {
- return { maxScrollDistance: 0, distance: 0 };
- }
- const maxScrollDistance = this._getMaxScrollDistance();
- this._scrollDistance = Math.max(0, Math.min(maxScrollDistance, position));
- // Mark that the scroll distance has changed so that after the view is checked, the CSS
- // transformation can move the header.
- this._scrollDistanceChanged = true;
- this._checkScrollingControls();
- return { maxScrollDistance, distance: this._scrollDistance };
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatPaginatedTabHeader, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$1.ViewportRuler }, { token: i1.Directionality, optional: true }, { token: i0.NgZone }, { token: i3.Platform }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: MatPaginatedTabHeader, inputs: { disablePagination: "disablePagination" }, ngImport: i0 }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatPaginatedTabHeader, decorators: [{
- type: Directive
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$1.ViewportRuler }, { type: i1.Directionality, decorators: [{
- type: Optional
- }] }, { type: i0.NgZone }, { type: i3.Platform }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [ANIMATION_MODULE_TYPE]
- }] }]; }, propDecorators: { disablePagination: [{
- type: Input
- }] } });
- /**
- * Base class with all of the `MatTabHeader` functionality.
- * @docs-private
- */
- class _MatTabHeaderBase extends MatPaginatedTabHeader {
- /** Whether the ripple effect is disabled or not. */
- get disableRipple() {
- return this._disableRipple;
- }
- set disableRipple(value) {
- this._disableRipple = coerceBooleanProperty(value);
- }
- constructor(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode) {
- super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);
- this._disableRipple = false;
- }
- _itemSelected(event) {
- event.preventDefault();
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabHeaderBase, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$1.ViewportRuler }, { token: i1.Directionality, optional: true }, { token: i0.NgZone }, { token: i3.Platform }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: _MatTabHeaderBase, inputs: { disableRipple: "disableRipple" }, usesInheritance: true, ngImport: i0 }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabHeaderBase, decorators: [{
- type: Directive
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$1.ViewportRuler }, { type: i1.Directionality, decorators: [{
- type: Optional
- }] }, { type: i0.NgZone }, { type: i3.Platform }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [ANIMATION_MODULE_TYPE]
- }] }]; }, propDecorators: { disableRipple: [{
- type: Input
- }] } });
- /**
- * The header of the tab group which displays a list of all the tabs in the tab group. Includes
- * an ink bar that follows the currently selected tab. When the tabs list's width exceeds the
- * width of the header container, then arrows will be displayed to allow the user to scroll
- * left and right across the header.
- * @docs-private
- */
- class MatTabHeader extends _MatTabHeaderBase {
- constructor(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode) {
- super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);
- }
- ngAfterContentInit() {
- this._inkBar = new MatInkBar(this._items);
- super.ngAfterContentInit();
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabHeader, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$1.ViewportRuler }, { token: i1.Directionality, optional: true }, { token: i0.NgZone }, { token: i3.Platform }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: MatTabHeader, selector: "mat-tab-header", inputs: { selectedIndex: "selectedIndex" }, outputs: { selectFocusedIndex: "selectFocusedIndex", indexFocused: "indexFocused" }, host: { properties: { "class.mat-mdc-tab-header-pagination-controls-enabled": "_showPaginationControls", "class.mat-mdc-tab-header-rtl": "_getLayoutDirection() == 'rtl'" }, classAttribute: "mat-mdc-tab-header" }, queries: [{ propertyName: "_items", predicate: MatTabLabelWrapper }], viewQueries: [{ propertyName: "_tabListContainer", first: true, predicate: ["tabListContainer"], descendants: true, static: true }, { propertyName: "_tabList", first: true, predicate: ["tabList"], descendants: true, static: true }, { propertyName: "_tabListInner", first: true, predicate: ["tabListInner"], descendants: true, static: true }, { propertyName: "_nextPaginator", first: true, predicate: ["nextPaginator"], descendants: true }, { propertyName: "_previousPaginator", first: true, predicate: ["previousPaginator"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<!-- TODO: this also had `mat-elevation-z4`. Figure out what we should do with it. -->\n<button class=\"mat-mdc-tab-header-pagination mat-mdc-tab-header-pagination-before\"\n #previousPaginator\n aria-hidden=\"true\"\n type=\"button\"\n mat-ripple\n tabindex=\"-1\"\n [matRippleDisabled]=\"_disableScrollBefore || disableRipple\"\n [class.mat-mdc-tab-header-pagination-disabled]=\"_disableScrollBefore\"\n [disabled]=\"_disableScrollBefore || null\"\n (click)=\"_handlePaginatorClick('before')\"\n (mousedown)=\"_handlePaginatorPress('before', $event)\"\n (touchend)=\"_stopInterval()\">\n <div class=\"mat-mdc-tab-header-pagination-chevron\"></div>\n</button>\n\n<div\n class=\"mat-mdc-tab-label-container\"\n #tabListContainer\n (keydown)=\"_handleKeydown($event)\"\n [class._mat-animation-noopable]=\"_animationMode === 'NoopAnimations'\">\n <div\n #tabList\n class=\"mat-mdc-tab-list\"\n role=\"tablist\"\n (cdkObserveContent)=\"_onContentChanges()\">\n <div class=\"mat-mdc-tab-labels\" #tabListInner>\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n<!-- TODO: this also had `mat-elevation-z4`. Figure out what we should do with it. -->\n<button class=\"mat-mdc-tab-header-pagination mat-mdc-tab-header-pagination-after\"\n #nextPaginator\n aria-hidden=\"true\"\n type=\"button\"\n mat-ripple\n [matRippleDisabled]=\"_disableScrollAfter || disableRipple\"\n [class.mat-mdc-tab-header-pagination-disabled]=\"_disableScrollAfter\"\n [disabled]=\"_disableScrollAfter || null\"\n tabindex=\"-1\"\n (mousedown)=\"_handlePaginatorPress('after', $event)\"\n (click)=\"_handlePaginatorClick('after')\"\n (touchend)=\"_stopInterval()\">\n <div class=\"mat-mdc-tab-header-pagination-chevron\"></div>\n</button>\n", styles: [".mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0;--mdc-tab-indicator-active-indicator-height:2px;--mdc-tab-indicator-active-indicator-shape:0;--mdc-secondary-navigation-tab-container-height:48px}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;background:none;border:none;outline:0;padding:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-header-pagination-icon-color)}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}._mat-animation-noopable span.mdc-tab-indicator__content,._mat-animation-noopable span.mdc-tab__text-label{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.mat-mdc-tab::before{margin:5px}.cdk-high-contrast-active .mat-mdc-tab[aria-disabled=true]{color:GrayText}"], dependencies: [{ kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "directive", type: i5$1.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabHeader, decorators: [{
- type: Component,
- args: [{ selector: 'mat-tab-header', inputs: ['selectedIndex'], outputs: ['selectFocusedIndex', 'indexFocused'], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.Default, host: {
- 'class': 'mat-mdc-tab-header',
- '[class.mat-mdc-tab-header-pagination-controls-enabled]': '_showPaginationControls',
- '[class.mat-mdc-tab-header-rtl]': "_getLayoutDirection() == 'rtl'",
- }, template: "<!-- TODO: this also had `mat-elevation-z4`. Figure out what we should do with it. -->\n<button class=\"mat-mdc-tab-header-pagination mat-mdc-tab-header-pagination-before\"\n #previousPaginator\n aria-hidden=\"true\"\n type=\"button\"\n mat-ripple\n tabindex=\"-1\"\n [matRippleDisabled]=\"_disableScrollBefore || disableRipple\"\n [class.mat-mdc-tab-header-pagination-disabled]=\"_disableScrollBefore\"\n [disabled]=\"_disableScrollBefore || null\"\n (click)=\"_handlePaginatorClick('before')\"\n (mousedown)=\"_handlePaginatorPress('before', $event)\"\n (touchend)=\"_stopInterval()\">\n <div class=\"mat-mdc-tab-header-pagination-chevron\"></div>\n</button>\n\n<div\n class=\"mat-mdc-tab-label-container\"\n #tabListContainer\n (keydown)=\"_handleKeydown($event)\"\n [class._mat-animation-noopable]=\"_animationMode === 'NoopAnimations'\">\n <div\n #tabList\n class=\"mat-mdc-tab-list\"\n role=\"tablist\"\n (cdkObserveContent)=\"_onContentChanges()\">\n <div class=\"mat-mdc-tab-labels\" #tabListInner>\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n<!-- TODO: this also had `mat-elevation-z4`. Figure out what we should do with it. -->\n<button class=\"mat-mdc-tab-header-pagination mat-mdc-tab-header-pagination-after\"\n #nextPaginator\n aria-hidden=\"true\"\n type=\"button\"\n mat-ripple\n [matRippleDisabled]=\"_disableScrollAfter || disableRipple\"\n [class.mat-mdc-tab-header-pagination-disabled]=\"_disableScrollAfter\"\n [disabled]=\"_disableScrollAfter || null\"\n tabindex=\"-1\"\n (mousedown)=\"_handlePaginatorPress('after', $event)\"\n (click)=\"_handlePaginatorClick('after')\"\n (touchend)=\"_stopInterval()\">\n <div class=\"mat-mdc-tab-header-pagination-chevron\"></div>\n</button>\n", styles: [".mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0;--mdc-tab-indicator-active-indicator-height:2px;--mdc-tab-indicator-active-indicator-shape:0;--mdc-secondary-navigation-tab-container-height:48px}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;background:none;border:none;outline:0;padding:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-header-pagination-icon-color)}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}._mat-animation-noopable span.mdc-tab-indicator__content,._mat-animation-noopable span.mdc-tab__text-label{transition:none}.mat-mdc-tab-label-container{display:flex;flex-grow:1;overflow:hidden;z-index:1}.mat-mdc-tab-labels{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-header .mat-mdc-tab-labels{justify-content:flex-end}.mat-mdc-tab::before{margin:5px}.cdk-high-contrast-active .mat-mdc-tab[aria-disabled=true]{color:GrayText}"] }]
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1$1.ViewportRuler }, { type: i1.Directionality, decorators: [{
- type: Optional
- }] }, { type: i0.NgZone }, { type: i3.Platform }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [ANIMATION_MODULE_TYPE]
- }] }]; }, propDecorators: { _items: [{
- type: ContentChildren,
- args: [MatTabLabelWrapper, { descendants: false }]
- }], _tabListContainer: [{
- type: ViewChild,
- args: ['tabListContainer', { static: true }]
- }], _tabList: [{
- type: ViewChild,
- args: ['tabList', { static: true }]
- }], _tabListInner: [{
- type: ViewChild,
- args: ['tabListInner', { static: true }]
- }], _nextPaginator: [{
- type: ViewChild,
- args: ['nextPaginator']
- }], _previousPaginator: [{
- type: ViewChild,
- args: ['previousPaginator']
- }] } });
- /** Injection token that can be used to provide the default options the tabs module. */
- const MAT_TABS_CONFIG = new InjectionToken('MAT_TABS_CONFIG');
- /** Used to generate unique ID's for each tab component */
- let nextId = 0;
- // Boilerplate for applying mixins to MatTabGroup.
- /** @docs-private */
- const _MatTabGroupMixinBase = mixinColor(mixinDisableRipple(class {
- constructor(_elementRef) {
- this._elementRef = _elementRef;
- }
- }), 'primary');
- /**
- * Base class with all of the `MatTabGroupBase` functionality.
- * @docs-private
- */
- class _MatTabGroupBase extends _MatTabGroupMixinBase {
- /** Whether the tab group should grow to the size of the active tab. */
- get dynamicHeight() {
- return this._dynamicHeight;
- }
- set dynamicHeight(value) {
- this._dynamicHeight = coerceBooleanProperty(value);
- }
- /** The index of the active tab. */
- get selectedIndex() {
- return this._selectedIndex;
- }
- set selectedIndex(value) {
- this._indexToSelect = coerceNumberProperty(value, null);
- }
- /** Duration for the tab animation. Will be normalized to milliseconds if no units are set. */
- get animationDuration() {
- return this._animationDuration;
- }
- set animationDuration(value) {
- this._animationDuration = /^\d+$/.test(value + '') ? value + 'ms' : value;
- }
- /**
- * `tabindex` to be set on the inner element that wraps the tab content. Can be used for improved
- * accessibility when the tab does not have focusable elements or if it has scrollable content.
- * The `tabindex` will be removed automatically for inactive tabs.
- * Read more at https://www.w3.org/TR/wai-aria-practices/examples/tabs/tabs-2/tabs.html
- */
- get contentTabIndex() {
- return this._contentTabIndex;
- }
- set contentTabIndex(value) {
- this._contentTabIndex = coerceNumberProperty(value, null);
- }
- /**
- * Whether pagination should be disabled. This can be used to avoid unnecessary
- * layout recalculations if it's known that pagination won't be required.
- */
- get disablePagination() {
- return this._disablePagination;
- }
- set disablePagination(value) {
- this._disablePagination = coerceBooleanProperty(value);
- }
- /**
- * By default tabs remove their content from the DOM while it's off-screen.
- * Setting this to `true` will keep it in the DOM which will prevent elements
- * like iframes and videos from reloading next time it comes back into the view.
- */
- get preserveContent() {
- return this._preserveContent;
- }
- set preserveContent(value) {
- this._preserveContent = coerceBooleanProperty(value);
- }
- /** Background color of the tab group. */
- get backgroundColor() {
- return this._backgroundColor;
- }
- set backgroundColor(value) {
- const classList = this._elementRef.nativeElement.classList;
- classList.remove('mat-tabs-with-background', `mat-background-${this.backgroundColor}`);
- if (value) {
- classList.add('mat-tabs-with-background', `mat-background-${value}`);
- }
- this._backgroundColor = value;
- }
- constructor(elementRef, _changeDetectorRef, defaultConfig, _animationMode) {
- super(elementRef);
- this._changeDetectorRef = _changeDetectorRef;
- this._animationMode = _animationMode;
- /** All of the tabs that belong to the group. */
- this._tabs = new QueryList();
- /** The tab index that should be selected after the content has been checked. */
- this._indexToSelect = 0;
- /** Index of the tab that was focused last. */
- this._lastFocusedTabIndex = null;
- /** Snapshot of the height of the tab body wrapper before another tab is activated. */
- this._tabBodyWrapperHeight = 0;
- /** Subscription to tabs being added/removed. */
- this._tabsSubscription = Subscription.EMPTY;
- /** Subscription to changes in the tab labels. */
- this._tabLabelSubscription = Subscription.EMPTY;
- this._dynamicHeight = false;
- this._selectedIndex = null;
- /** Position of the tab header. */
- this.headerPosition = 'above';
- this._disablePagination = false;
- this._preserveContent = false;
- /** Output to enable support for two-way binding on `[(selectedIndex)]` */
- this.selectedIndexChange = new EventEmitter();
- /** Event emitted when focus has changed within a tab group. */
- this.focusChange = new EventEmitter();
- /** Event emitted when the body animation has completed */
- this.animationDone = new EventEmitter();
- /** Event emitted when the tab selection has changed. */
- this.selectedTabChange = new EventEmitter(true);
- this._groupId = nextId++;
- this.animationDuration =
- defaultConfig && defaultConfig.animationDuration ? defaultConfig.animationDuration : '500ms';
- this.disablePagination =
- defaultConfig && defaultConfig.disablePagination != null
- ? defaultConfig.disablePagination
- : false;
- this.dynamicHeight =
- defaultConfig && defaultConfig.dynamicHeight != null ? defaultConfig.dynamicHeight : false;
- this.contentTabIndex = defaultConfig?.contentTabIndex ?? null;
- this.preserveContent = !!defaultConfig?.preserveContent;
- }
- /**
- * After the content is checked, this component knows what tabs have been defined
- * and what the selected index should be. This is where we can know exactly what position
- * each tab should be in according to the new selected index, and additionally we know how
- * a new selected tab should transition in (from the left or right).
- */
- ngAfterContentChecked() {
- // Don't clamp the `indexToSelect` immediately in the setter because it can happen that
- // the amount of tabs changes before the actual change detection runs.
- const indexToSelect = (this._indexToSelect = this._clampTabIndex(this._indexToSelect));
- // If there is a change in selected index, emit a change event. Should not trigger if
- // the selected index has not yet been initialized.
- if (this._selectedIndex != indexToSelect) {
- const isFirstRun = this._selectedIndex == null;
- if (!isFirstRun) {
- this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));
- // Preserve the height so page doesn't scroll up during tab change.
- // Fixes https://stackblitz.com/edit/mat-tabs-scroll-page-top-on-tab-change
- const wrapper = this._tabBodyWrapper.nativeElement;
- wrapper.style.minHeight = wrapper.clientHeight + 'px';
- }
- // Changing these values after change detection has run
- // since the checked content may contain references to them.
- Promise.resolve().then(() => {
- this._tabs.forEach((tab, index) => (tab.isActive = index === indexToSelect));
- if (!isFirstRun) {
- this.selectedIndexChange.emit(indexToSelect);
- // Clear the min-height, this was needed during tab change to avoid
- // unnecessary scrolling.
- this._tabBodyWrapper.nativeElement.style.minHeight = '';
- }
- });
- }
- // Setup the position for each tab and optionally setup an origin on the next selected tab.
- this._tabs.forEach((tab, index) => {
- tab.position = index - indexToSelect;
- // If there is already a selected tab, then set up an origin for the next selected tab
- // if it doesn't have one already.
- if (this._selectedIndex != null && tab.position == 0 && !tab.origin) {
- tab.origin = indexToSelect - this._selectedIndex;
- }
- });
- if (this._selectedIndex !== indexToSelect) {
- this._selectedIndex = indexToSelect;
- this._lastFocusedTabIndex = null;
- this._changeDetectorRef.markForCheck();
- }
- }
- ngAfterContentInit() {
- this._subscribeToAllTabChanges();
- this._subscribeToTabLabels();
- // Subscribe to changes in the amount of tabs, in order to be
- // able to re-render the content as new tabs are added or removed.
- this._tabsSubscription = this._tabs.changes.subscribe(() => {
- const indexToSelect = this._clampTabIndex(this._indexToSelect);
- // Maintain the previously-selected tab if a new tab is added or removed and there is no
- // explicit change that selects a different tab.
- if (indexToSelect === this._selectedIndex) {
- const tabs = this._tabs.toArray();
- let selectedTab;
- for (let i = 0; i < tabs.length; i++) {
- if (tabs[i].isActive) {
- // Assign both to the `_indexToSelect` and `_selectedIndex` so we don't fire a changed
- // event, otherwise the consumer may end up in an infinite loop in some edge cases like
- // adding a tab within the `selectedIndexChange` event.
- this._indexToSelect = this._selectedIndex = i;
- this._lastFocusedTabIndex = null;
- selectedTab = tabs[i];
- break;
- }
- }
- // If we haven't found an active tab and a tab exists at the selected index, it means
- // that the active tab was swapped out. Since this won't be picked up by the rendering
- // loop in `ngAfterContentChecked`, we need to sync it up manually.
- if (!selectedTab && tabs[indexToSelect]) {
- Promise.resolve().then(() => {
- tabs[indexToSelect].isActive = true;
- this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));
- });
- }
- }
- this._changeDetectorRef.markForCheck();
- });
- }
- /** Listens to changes in all of the tabs. */
- _subscribeToAllTabChanges() {
- // Since we use a query with `descendants: true` to pick up the tabs, we may end up catching
- // some that are inside of nested tab groups. We filter them out manually by checking that
- // the closest group to the tab is the current one.
- this._allTabs.changes.pipe(startWith(this._allTabs)).subscribe((tabs) => {
- this._tabs.reset(tabs.filter(tab => {
- return tab._closestTabGroup === this || !tab._closestTabGroup;
- }));
- this._tabs.notifyOnChanges();
- });
- }
- ngOnDestroy() {
- this._tabs.destroy();
- this._tabsSubscription.unsubscribe();
- this._tabLabelSubscription.unsubscribe();
- }
- /** Re-aligns the ink bar to the selected tab element. */
- realignInkBar() {
- if (this._tabHeader) {
- this._tabHeader._alignInkBarToSelectedTab();
- }
- }
- /**
- * Recalculates the tab group's pagination dimensions.
- *
- * WARNING: Calling this method can be very costly in terms of performance. It should be called
- * as infrequently as possible from outside of the Tabs component as it causes a reflow of the
- * page.
- */
- updatePagination() {
- if (this._tabHeader) {
- this._tabHeader.updatePagination();
- }
- }
- /**
- * Sets focus to a particular tab.
- * @param index Index of the tab to be focused.
- */
- focusTab(index) {
- const header = this._tabHeader;
- if (header) {
- header.focusIndex = index;
- }
- }
- _focusChanged(index) {
- this._lastFocusedTabIndex = index;
- this.focusChange.emit(this._createChangeEvent(index));
- }
- _createChangeEvent(index) {
- const event = new MatTabChangeEvent();
- event.index = index;
- if (this._tabs && this._tabs.length) {
- event.tab = this._tabs.toArray()[index];
- }
- return event;
- }
- /**
- * Subscribes to changes in the tab labels. This is needed, because the @Input for the label is
- * on the MatTab component, whereas the data binding is inside the MatTabGroup. In order for the
- * binding to be updated, we need to subscribe to changes in it and trigger change detection
- * manually.
- */
- _subscribeToTabLabels() {
- if (this._tabLabelSubscription) {
- this._tabLabelSubscription.unsubscribe();
- }
- this._tabLabelSubscription = merge(...this._tabs.map(tab => tab._stateChanges)).subscribe(() => this._changeDetectorRef.markForCheck());
- }
- /** Clamps the given index to the bounds of 0 and the tabs length. */
- _clampTabIndex(index) {
- // Note the `|| 0`, which ensures that values like NaN can't get through
- // and which would otherwise throw the component into an infinite loop
- // (since Math.max(NaN, 0) === NaN).
- return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));
- }
- /** Returns a unique id for each tab label element */
- _getTabLabelId(i) {
- return `mat-tab-label-${this._groupId}-${i}`;
- }
- /** Returns a unique id for each tab content element */
- _getTabContentId(i) {
- return `mat-tab-content-${this._groupId}-${i}`;
- }
- /**
- * Sets the height of the body wrapper to the height of the activating tab if dynamic
- * height property is true.
- */
- _setTabBodyWrapperHeight(tabHeight) {
- if (!this._dynamicHeight || !this._tabBodyWrapperHeight) {
- return;
- }
- const wrapper = this._tabBodyWrapper.nativeElement;
- wrapper.style.height = this._tabBodyWrapperHeight + 'px';
- // This conditional forces the browser to paint the height so that
- // the animation to the new height can have an origin.
- if (this._tabBodyWrapper.nativeElement.offsetHeight) {
- wrapper.style.height = tabHeight + 'px';
- }
- }
- /** Removes the height of the tab body wrapper. */
- _removeTabBodyWrapperHeight() {
- const wrapper = this._tabBodyWrapper.nativeElement;
- this._tabBodyWrapperHeight = wrapper.clientHeight;
- wrapper.style.height = '';
- this.animationDone.emit();
- }
- /** Handle click events, setting new selected index if appropriate. */
- _handleClick(tab, tabHeader, index) {
- tabHeader.focusIndex = index;
- if (!tab.disabled) {
- this.selectedIndex = index;
- }
- }
- /** Retrieves the tabindex for the tab. */
- _getTabIndex(index) {
- const targetIndex = this._lastFocusedTabIndex ?? this.selectedIndex;
- return index === targetIndex ? 0 : -1;
- }
- /** Callback for when the focused state of a tab has changed. */
- _tabFocusChanged(focusOrigin, index) {
- // Mouse/touch focus happens during the `mousedown`/`touchstart` phase which
- // can cause the tab to be moved out from under the pointer, interrupting the
- // click sequence (see #21898). We don't need to scroll the tab into view for
- // such cases anyway, because it will be done when the tab becomes selected.
- if (focusOrigin && focusOrigin !== 'mouse' && focusOrigin !== 'touch') {
- this._tabHeader.focusIndex = index;
- }
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabGroupBase, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: MAT_TABS_CONFIG, optional: true }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: _MatTabGroupBase, inputs: { dynamicHeight: "dynamicHeight", selectedIndex: "selectedIndex", headerPosition: "headerPosition", animationDuration: "animationDuration", contentTabIndex: "contentTabIndex", disablePagination: "disablePagination", preserveContent: "preserveContent", backgroundColor: "backgroundColor" }, outputs: { selectedIndexChange: "selectedIndexChange", focusChange: "focusChange", animationDone: "animationDone", selectedTabChange: "selectedTabChange" }, usesInheritance: true, ngImport: i0 }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabGroupBase, decorators: [{
- type: Directive
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
- type: Inject,
- args: [MAT_TABS_CONFIG]
- }, {
- type: Optional
- }] }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [ANIMATION_MODULE_TYPE]
- }] }]; }, propDecorators: { dynamicHeight: [{
- type: Input
- }], selectedIndex: [{
- type: Input
- }], headerPosition: [{
- type: Input
- }], animationDuration: [{
- type: Input
- }], contentTabIndex: [{
- type: Input
- }], disablePagination: [{
- type: Input
- }], preserveContent: [{
- type: Input
- }], backgroundColor: [{
- type: Input
- }], selectedIndexChange: [{
- type: Output
- }], focusChange: [{
- type: Output
- }], animationDone: [{
- type: Output
- }], selectedTabChange: [{
- type: Output
- }] } });
- /**
- * Material design tab-group component. Supports basic tab pairs (label + content) and includes
- * animated ink-bar, keyboard navigation, and screen reader.
- * See: https://material.io/design/components/tabs.html
- */
- class MatTabGroup extends _MatTabGroupBase {
- /** Whether the ink bar should fit its width to the size of the tab label content. */
- get fitInkBarToContent() {
- return this._fitInkBarToContent;
- }
- set fitInkBarToContent(v) {
- this._fitInkBarToContent = coerceBooleanProperty(v);
- this._changeDetectorRef.markForCheck();
- }
- /** Whether tabs should be stretched to fill the header. */
- get stretchTabs() {
- return this._stretchTabs;
- }
- set stretchTabs(v) {
- this._stretchTabs = coerceBooleanProperty(v);
- }
- constructor(elementRef, changeDetectorRef, defaultConfig, animationMode) {
- super(elementRef, changeDetectorRef, defaultConfig, animationMode);
- this._fitInkBarToContent = false;
- this._stretchTabs = true;
- this.fitInkBarToContent =
- defaultConfig && defaultConfig.fitInkBarToContent != null
- ? defaultConfig.fitInkBarToContent
- : false;
- this.stretchTabs =
- defaultConfig && defaultConfig.stretchTabs != null ? defaultConfig.stretchTabs : true;
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabGroup, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: MAT_TABS_CONFIG, optional: true }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: MatTabGroup, selector: "mat-tab-group", inputs: { color: "color", disableRipple: "disableRipple", fitInkBarToContent: "fitInkBarToContent", stretchTabs: ["mat-stretch-tabs", "stretchTabs"] }, host: { attributes: { "ngSkipHydration": "" }, properties: { "class.mat-mdc-tab-group-dynamic-height": "dynamicHeight", "class.mat-mdc-tab-group-inverted-header": "headerPosition === \"below\"", "class.mat-mdc-tab-group-stretch-tabs": "stretchTabs" }, classAttribute: "mat-mdc-tab-group" }, providers: [
- {
- provide: MAT_TAB_GROUP,
- useExisting: MatTabGroup,
- },
- ], queries: [{ propertyName: "_allTabs", predicate: MatTab, descendants: true }], viewQueries: [{ propertyName: "_tabBodyWrapper", first: true, predicate: ["tabBodyWrapper"], descendants: true }, { propertyName: "_tabHeader", first: true, predicate: ["tabHeader"], descendants: true }], exportAs: ["matTabGroup"], usesInheritance: true, ngImport: i0, template: "<mat-tab-header #tabHeader\n [selectedIndex]=\"selectedIndex || 0\"\n [disableRipple]=\"disableRipple\"\n [disablePagination]=\"disablePagination\"\n (indexFocused)=\"_focusChanged($event)\"\n (selectFocusedIndex)=\"selectedIndex = $event\">\n\n <div class=\"mdc-tab mat-mdc-tab mat-mdc-focus-indicator\"\n #tabNode\n role=\"tab\"\n matTabLabelWrapper\n cdkMonitorElementFocus\n *ngFor=\"let tab of _tabs; let i = index\"\n [id]=\"_getTabLabelId(i)\"\n [attr.tabIndex]=\"_getTabIndex(i)\"\n [attr.aria-posinset]=\"i + 1\"\n [attr.aria-setsize]=\"_tabs.length\"\n [attr.aria-controls]=\"_getTabContentId(i)\"\n [attr.aria-selected]=\"selectedIndex === i\"\n [attr.aria-label]=\"tab.ariaLabel || null\"\n [attr.aria-labelledby]=\"(!tab.ariaLabel && tab.ariaLabelledby) ? tab.ariaLabelledby : null\"\n [class.mdc-tab--active]=\"selectedIndex === i\"\n [ngClass]=\"tab.labelClass\"\n [disabled]=\"tab.disabled\"\n [fitInkBarToContent]=\"fitInkBarToContent\"\n (click)=\"_handleClick(tab, tabHeader, i)\"\n (cdkFocusChange)=\"_tabFocusChanged($event, i)\">\n <span class=\"mdc-tab__ripple\"></span>\n\n <!-- Needs to be a separate element, because we can't put\n `overflow: hidden` on tab due to the ink bar. -->\n <div\n class=\"mat-mdc-tab-ripple\"\n mat-ripple\n [matRippleTrigger]=\"tabNode\"\n [matRippleDisabled]=\"tab.disabled || disableRipple\"></div>\n\n <span class=\"mdc-tab__content\">\n <span class=\"mdc-tab__text-label\">\n <!-- If there is a label template, use it. -->\n <ng-template [ngIf]=\"tab.templateLabel\" [ngIfElse]=\"tabTextLabel\">\n <ng-template [cdkPortalOutlet]=\"tab.templateLabel\"></ng-template>\n </ng-template>\n\n <!-- If there is not a label template, fall back to the text label. -->\n <ng-template #tabTextLabel>{{tab.textLabel}}</ng-template>\n </span>\n </span>\n </div>\n</mat-tab-header>\n\n<div\n class=\"mat-mdc-tab-body-wrapper\"\n [class._mat-animation-noopable]=\"_animationMode === 'NoopAnimations'\"\n #tabBodyWrapper>\n <mat-tab-body role=\"tabpanel\"\n *ngFor=\"let tab of _tabs; let i = index\"\n [id]=\"_getTabContentId(i)\"\n [attr.tabindex]=\"(contentTabIndex != null && selectedIndex === i) ? contentTabIndex : null\"\n [attr.aria-labelledby]=\"_getTabLabelId(i)\"\n [class.mat-mdc-tab-body-active]=\"selectedIndex === i\"\n [ngClass]=\"tab.bodyClass\"\n [content]=\"tab.content!\"\n [position]=\"tab.position!\"\n [origin]=\"tab.origin\"\n [animationDuration]=\"animationDuration\"\n [preserveContent]=\"preserveContent\"\n (_onCentered)=\"_removeTabBodyWrapperHeight()\"\n (_onCentering)=\"_setTabBodyWrapperHeight($event)\">\n </mat-tab-body>\n</div>\n", styles: [".mdc-tab{min-width:90px;padding-right:24px;padding-left:24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;margin:0;padding-top:0;padding-bottom:0;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none;z-index:1}.mdc-tab::-moz-focus-inner{padding:0;border:0}.mdc-tab[hidden]{display:none}.mdc-tab--min-width{flex:0 1 auto}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab__icon{transition:150ms color linear;z-index:2}.mdc-tab--stacked .mdc-tab__content{flex-direction:column;align-items:center;justify-content:center}.mdc-tab--stacked .mdc-tab__text-label{padding-top:6px;padding-bottom:4px}.mdc-tab--active .mdc-tab__text-label,.mdc-tab--active .mdc-tab__icon{transition-delay:100ms}.mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label{padding-left:8px;padding-right:0}[dir=rtl] .mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label,.mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label[dir=rtl]{padding-left:0;padding-right:8px}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator__content--icon{align-self:center;margin:0 auto}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}.mdc-tab-indicator .mdc-tab-indicator__content{transition:250ms transform cubic-bezier(0.4, 0, 0.2, 1)}.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mdc-tab-indicator--fade .mdc-tab-indicator__content{transition:150ms opacity linear}.mdc-tab-indicator--active.mdc-tab-indicator--fade .mdc-tab-indicator__content{transition-delay:100ms}.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;font-family:var(--mat-tab-header-label-text-font);font-size:var(--mat-tab-header-label-text-size);letter-spacing:var(--mat-tab-header-label-text-letter-spacing);line-height:var(--mat-tab-header-label-text-line-height);font-weight:var(--mat-tab-header-label-text-weight)}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-color:var(--mdc-tab-indicator-active-indicator-color)}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-top-width:var(--mdc-tab-indicator-active-indicator-height)}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.mat-mdc-tab:not(.mdc-tab--stacked){height:var(--mdc-secondary-navigation-tab-container-height)}.mat-mdc-tab:not(:disabled).mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):hover.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):focus.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):active.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:disabled.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):hover:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):focus:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):active:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:disabled:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab.mdc-tab{flex-grow:0}.mat-mdc-tab:hover .mdc-tab__text-label{color:var(--mat-tab-header-inactive-hover-label-text-color)}.mat-mdc-tab:focus .mdc-tab__text-label{color:var(--mat-tab-header-inactive-focus-label-text-color)}.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-header-active-label-text-color)}.mat-mdc-tab.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-header-active-ripple-color)}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-header-active-hover-label-text-color)}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-hover-indicator-color)}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-header-active-focus-label-text-color)}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-focus-indicator-color)}.mat-mdc-tab.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-header-disabled-ripple-color)}.mat-mdc-tab .mdc-tab__ripple::before{content:\"\";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-header-inactive-label-text-color);display:inline-flex;align-items:center}.mat-mdc-tab .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-group.mat-mdc-tab-group-stretch-tabs>.mat-mdc-tab-header .mat-mdc-tab{flex-grow:1}.mat-mdc-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-header-with-background-background-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-focus-indicator::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-focus-indicator::before{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mdc-tab__ripple::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header{flex-direction:column-reverse}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header .mdc-tab-indicator__content--underline{align-self:flex-start}.mat-mdc-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important}"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "directive", type: i4.CdkMonitorFocus, selector: "[cdkMonitorElementFocus], [cdkMonitorSubtreeFocus]", outputs: ["cdkFocusChange"], exportAs: ["cdkMonitorFocus"] }, { kind: "component", type: MatTabBody, selector: "mat-tab-body" }, { kind: "directive", type: MatTabLabelWrapper, selector: "[matTabLabelWrapper]", inputs: ["disabled", "fitInkBarToContent"] }, { kind: "component", type: MatTabHeader, selector: "mat-tab-header", inputs: ["selectedIndex"], outputs: ["selectFocusedIndex", "indexFocused"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabGroup, decorators: [{
- type: Component,
- args: [{ selector: 'mat-tab-group', exportAs: 'matTabGroup', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.Default, inputs: ['color', 'disableRipple'], providers: [
- {
- provide: MAT_TAB_GROUP,
- useExisting: MatTabGroup,
- },
- ], host: {
- 'ngSkipHydration': '',
- 'class': 'mat-mdc-tab-group',
- '[class.mat-mdc-tab-group-dynamic-height]': 'dynamicHeight',
- '[class.mat-mdc-tab-group-inverted-header]': 'headerPosition === "below"',
- '[class.mat-mdc-tab-group-stretch-tabs]': 'stretchTabs',
- }, template: "<mat-tab-header #tabHeader\n [selectedIndex]=\"selectedIndex || 0\"\n [disableRipple]=\"disableRipple\"\n [disablePagination]=\"disablePagination\"\n (indexFocused)=\"_focusChanged($event)\"\n (selectFocusedIndex)=\"selectedIndex = $event\">\n\n <div class=\"mdc-tab mat-mdc-tab mat-mdc-focus-indicator\"\n #tabNode\n role=\"tab\"\n matTabLabelWrapper\n cdkMonitorElementFocus\n *ngFor=\"let tab of _tabs; let i = index\"\n [id]=\"_getTabLabelId(i)\"\n [attr.tabIndex]=\"_getTabIndex(i)\"\n [attr.aria-posinset]=\"i + 1\"\n [attr.aria-setsize]=\"_tabs.length\"\n [attr.aria-controls]=\"_getTabContentId(i)\"\n [attr.aria-selected]=\"selectedIndex === i\"\n [attr.aria-label]=\"tab.ariaLabel || null\"\n [attr.aria-labelledby]=\"(!tab.ariaLabel && tab.ariaLabelledby) ? tab.ariaLabelledby : null\"\n [class.mdc-tab--active]=\"selectedIndex === i\"\n [ngClass]=\"tab.labelClass\"\n [disabled]=\"tab.disabled\"\n [fitInkBarToContent]=\"fitInkBarToContent\"\n (click)=\"_handleClick(tab, tabHeader, i)\"\n (cdkFocusChange)=\"_tabFocusChanged($event, i)\">\n <span class=\"mdc-tab__ripple\"></span>\n\n <!-- Needs to be a separate element, because we can't put\n `overflow: hidden` on tab due to the ink bar. -->\n <div\n class=\"mat-mdc-tab-ripple\"\n mat-ripple\n [matRippleTrigger]=\"tabNode\"\n [matRippleDisabled]=\"tab.disabled || disableRipple\"></div>\n\n <span class=\"mdc-tab__content\">\n <span class=\"mdc-tab__text-label\">\n <!-- If there is a label template, use it. -->\n <ng-template [ngIf]=\"tab.templateLabel\" [ngIfElse]=\"tabTextLabel\">\n <ng-template [cdkPortalOutlet]=\"tab.templateLabel\"></ng-template>\n </ng-template>\n\n <!-- If there is not a label template, fall back to the text label. -->\n <ng-template #tabTextLabel>{{tab.textLabel}}</ng-template>\n </span>\n </span>\n </div>\n</mat-tab-header>\n\n<div\n class=\"mat-mdc-tab-body-wrapper\"\n [class._mat-animation-noopable]=\"_animationMode === 'NoopAnimations'\"\n #tabBodyWrapper>\n <mat-tab-body role=\"tabpanel\"\n *ngFor=\"let tab of _tabs; let i = index\"\n [id]=\"_getTabContentId(i)\"\n [attr.tabindex]=\"(contentTabIndex != null && selectedIndex === i) ? contentTabIndex : null\"\n [attr.aria-labelledby]=\"_getTabLabelId(i)\"\n [class.mat-mdc-tab-body-active]=\"selectedIndex === i\"\n [ngClass]=\"tab.bodyClass\"\n [content]=\"tab.content!\"\n [position]=\"tab.position!\"\n [origin]=\"tab.origin\"\n [animationDuration]=\"animationDuration\"\n [preserveContent]=\"preserveContent\"\n (_onCentered)=\"_removeTabBodyWrapperHeight()\"\n (_onCentering)=\"_setTabBodyWrapperHeight($event)\">\n </mat-tab-body>\n</div>\n", styles: [".mdc-tab{min-width:90px;padding-right:24px;padding-left:24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;margin:0;padding-top:0;padding-bottom:0;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none;z-index:1}.mdc-tab::-moz-focus-inner{padding:0;border:0}.mdc-tab[hidden]{display:none}.mdc-tab--min-width{flex:0 1 auto}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab__icon{transition:150ms color linear;z-index:2}.mdc-tab--stacked .mdc-tab__content{flex-direction:column;align-items:center;justify-content:center}.mdc-tab--stacked .mdc-tab__text-label{padding-top:6px;padding-bottom:4px}.mdc-tab--active .mdc-tab__text-label,.mdc-tab--active .mdc-tab__icon{transition-delay:100ms}.mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label{padding-left:8px;padding-right:0}[dir=rtl] .mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label,.mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label[dir=rtl]{padding-left:0;padding-right:8px}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator__content--icon{align-self:center;margin:0 auto}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}.mdc-tab-indicator .mdc-tab-indicator__content{transition:250ms transform cubic-bezier(0.4, 0, 0.2, 1)}.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mdc-tab-indicator--fade .mdc-tab-indicator__content{transition:150ms opacity linear}.mdc-tab-indicator--active.mdc-tab-indicator--fade .mdc-tab-indicator__content{transition-delay:100ms}.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;font-family:var(--mat-tab-header-label-text-font);font-size:var(--mat-tab-header-label-text-size);letter-spacing:var(--mat-tab-header-label-text-letter-spacing);line-height:var(--mat-tab-header-label-text-line-height);font-weight:var(--mat-tab-header-label-text-weight)}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-color:var(--mdc-tab-indicator-active-indicator-color)}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-top-width:var(--mdc-tab-indicator-active-indicator-height)}.mat-mdc-tab .mdc-tab-indicator__content--underline{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.mat-mdc-tab:not(.mdc-tab--stacked){height:var(--mdc-secondary-navigation-tab-container-height)}.mat-mdc-tab:not(:disabled).mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):hover.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):focus.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):active.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:disabled.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):hover:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):focus:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:not(:disabled):active:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab:disabled:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab.mdc-tab{flex-grow:0}.mat-mdc-tab:hover .mdc-tab__text-label{color:var(--mat-tab-header-inactive-hover-label-text-color)}.mat-mdc-tab:focus .mdc-tab__text-label{color:var(--mat-tab-header-inactive-focus-label-text-color)}.mat-mdc-tab.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-header-active-label-text-color)}.mat-mdc-tab.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-header-active-ripple-color)}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-header-active-hover-label-text-color)}.mat-mdc-tab.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-hover-indicator-color)}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-header-active-focus-label-text-color)}.mat-mdc-tab.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-focus-indicator-color)}.mat-mdc-tab.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-header-disabled-ripple-color)}.mat-mdc-tab .mdc-tab__ripple::before{content:\"\";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-header-inactive-label-text-color);display:inline-flex;align-items:center}.mat-mdc-tab .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-group.mat-mdc-tab-group-stretch-tabs>.mat-mdc-tab-header .mat-mdc-tab{flex-grow:1}.mat-mdc-tab-group{display:flex;flex-direction:column;max-width:100%}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-header-with-background-background-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mat-mdc-tab .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background.mat-primary>.mat-mdc-tab-header .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-header .mat-mdc-tab:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-focus-indicator::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-focus-indicator::before{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mdc-tab__ripple::before,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-group.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header{flex-direction:column-reverse}.mat-mdc-tab-group.mat-mdc-tab-group-inverted-header .mdc-tab-indicator__content--underline{align-self:flex-start}.mat-mdc-tab-body-wrapper{position:relative;overflow:hidden;display:flex;transition:height 500ms cubic-bezier(0.35, 0, 0.25, 1)}.mat-mdc-tab-body-wrapper._mat-animation-noopable{transition:none !important;animation:none !important}"] }]
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{
- type: Inject,
- args: [MAT_TABS_CONFIG]
- }, {
- type: Optional
- }] }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [ANIMATION_MODULE_TYPE]
- }] }]; }, propDecorators: { _allTabs: [{
- type: ContentChildren,
- args: [MatTab, { descendants: true }]
- }], _tabBodyWrapper: [{
- type: ViewChild,
- args: ['tabBodyWrapper']
- }], _tabHeader: [{
- type: ViewChild,
- args: ['tabHeader']
- }], fitInkBarToContent: [{
- type: Input
- }], stretchTabs: [{
- type: Input,
- args: ['mat-stretch-tabs']
- }] } });
- /** A simple change event emitted on focus or selection changes. */
- class MatTabChangeEvent {
- }
- // Increasing integer for generating unique ids for tab nav components.
- let nextUniqueId = 0;
- /**
- * Base class with all of the `MatTabNav` functionality.
- * @docs-private
- */
- class _MatTabNavBase extends MatPaginatedTabHeader {
- /** Background color of the tab nav. */
- get backgroundColor() {
- return this._backgroundColor;
- }
- set backgroundColor(value) {
- const classList = this._elementRef.nativeElement.classList;
- classList.remove('mat-tabs-with-background', `mat-background-${this.backgroundColor}`);
- if (value) {
- classList.add('mat-tabs-with-background', `mat-background-${value}`);
- }
- this._backgroundColor = value;
- }
- /** Whether the ripple effect is disabled or not. */
- get disableRipple() {
- return this._disableRipple;
- }
- set disableRipple(value) {
- this._disableRipple = coerceBooleanProperty(value);
- }
- constructor(elementRef, dir, ngZone, changeDetectorRef, viewportRuler, platform, animationMode) {
- super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);
- this._disableRipple = false;
- /** Theme color of the nav bar. */
- this.color = 'primary';
- }
- _itemSelected() {
- // noop
- }
- ngAfterContentInit() {
- // We need this to run before the `changes` subscription in parent to ensure that the
- // selectedIndex is up-to-date by the time the super class starts looking for it.
- this._items.changes.pipe(startWith(null), takeUntil(this._destroyed)).subscribe(() => {
- this.updateActiveLink();
- });
- super.ngAfterContentInit();
- }
- /** Notifies the component that the active link has been changed. */
- updateActiveLink() {
- if (!this._items) {
- return;
- }
- const items = this._items.toArray();
- for (let i = 0; i < items.length; i++) {
- if (items[i].active) {
- this.selectedIndex = i;
- this._changeDetectorRef.markForCheck();
- if (this.tabPanel) {
- this.tabPanel._activeTabId = items[i].id;
- }
- return;
- }
- }
- // The ink bar should hide itself if no items are active.
- this.selectedIndex = -1;
- this._inkBar.hide();
- }
- _getRole() {
- return this.tabPanel ? 'tablist' : this._elementRef.nativeElement.getAttribute('role');
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabNavBase, deps: [{ token: i0.ElementRef }, { token: i1.Directionality, optional: true }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i1$1.ViewportRuler }, { token: i3.Platform }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: _MatTabNavBase, inputs: { backgroundColor: "backgroundColor", disableRipple: "disableRipple", color: "color", tabPanel: "tabPanel" }, usesInheritance: true, ngImport: i0 }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabNavBase, decorators: [{
- type: Directive
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Directionality, decorators: [{
- type: Optional
- }] }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i1$1.ViewportRuler }, { type: i3.Platform }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [ANIMATION_MODULE_TYPE]
- }] }]; }, propDecorators: { backgroundColor: [{
- type: Input
- }], disableRipple: [{
- type: Input
- }], color: [{
- type: Input
- }], tabPanel: [{
- type: Input
- }] } });
- // Boilerplate for applying mixins to MatTabLink.
- const _MatTabLinkMixinBase = mixinTabIndex(mixinDisableRipple(mixinDisabled(class {
- })));
- /** Base class with all of the `MatTabLink` functionality. */
- class _MatTabLinkBase extends _MatTabLinkMixinBase {
- /** Whether the link is active. */
- get active() {
- return this._isActive;
- }
- set active(value) {
- const newValue = coerceBooleanProperty(value);
- if (newValue !== this._isActive) {
- this._isActive = newValue;
- this._tabNavBar.updateActiveLink();
- }
- }
- /**
- * Whether ripples are disabled on interaction.
- * @docs-private
- */
- get rippleDisabled() {
- return (this.disabled ||
- this.disableRipple ||
- this._tabNavBar.disableRipple ||
- !!this.rippleConfig.disabled);
- }
- constructor(_tabNavBar,
- /** @docs-private */ elementRef, globalRippleOptions, tabIndex, _focusMonitor, animationMode) {
- super();
- this._tabNavBar = _tabNavBar;
- this.elementRef = elementRef;
- this._focusMonitor = _focusMonitor;
- /** Whether the tab link is active or not. */
- this._isActive = false;
- /** Unique id for the tab. */
- this.id = `mat-tab-link-${nextUniqueId++}`;
- this.rippleConfig = globalRippleOptions || {};
- this.tabIndex = parseInt(tabIndex) || 0;
- if (animationMode === 'NoopAnimations') {
- this.rippleConfig.animation = { enterDuration: 0, exitDuration: 0 };
- }
- }
- /** Focuses the tab link. */
- focus() {
- this.elementRef.nativeElement.focus();
- }
- ngAfterViewInit() {
- this._focusMonitor.monitor(this.elementRef);
- }
- ngOnDestroy() {
- this._focusMonitor.stopMonitoring(this.elementRef);
- }
- _handleFocus() {
- // Since we allow navigation through tabbing in the nav bar, we
- // have to update the focused index whenever the link receives focus.
- this._tabNavBar.focusIndex = this._tabNavBar._items.toArray().indexOf(this);
- }
- _handleKeydown(event) {
- if (this._tabNavBar.tabPanel && event.keyCode === SPACE) {
- this.elementRef.nativeElement.click();
- }
- }
- _getAriaControls() {
- return this._tabNavBar.tabPanel
- ? this._tabNavBar.tabPanel?.id
- : this.elementRef.nativeElement.getAttribute('aria-controls');
- }
- _getAriaSelected() {
- if (this._tabNavBar.tabPanel) {
- return this.active ? 'true' : 'false';
- }
- else {
- return this.elementRef.nativeElement.getAttribute('aria-selected');
- }
- }
- _getAriaCurrent() {
- return this.active && !this._tabNavBar.tabPanel ? 'page' : null;
- }
- _getRole() {
- return this._tabNavBar.tabPanel ? 'tab' : this.elementRef.nativeElement.getAttribute('role');
- }
- _getTabIndex() {
- if (this._tabNavBar.tabPanel) {
- return this._isActive && !this.disabled ? 0 : -1;
- }
- else {
- return this.tabIndex;
- }
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabLinkBase, deps: [{ token: _MatTabNavBase }, { token: i0.ElementRef }, { token: MAT_RIPPLE_GLOBAL_OPTIONS, optional: true }, { token: 'tabindex', attribute: true }, { token: i4.FocusMonitor }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.0.0", type: _MatTabLinkBase, inputs: { active: "active", id: "id" }, usesInheritance: true, ngImport: i0 }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: _MatTabLinkBase, decorators: [{
- type: Directive
- }], ctorParameters: function () { return [{ type: _MatTabNavBase }, { type: i0.ElementRef }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [MAT_RIPPLE_GLOBAL_OPTIONS]
- }] }, { type: undefined, decorators: [{
- type: Attribute,
- args: ['tabindex']
- }] }, { type: i4.FocusMonitor }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [ANIMATION_MODULE_TYPE]
- }] }]; }, propDecorators: { active: [{
- type: Input
- }], id: [{
- type: Input
- }] } });
- const _MatTabLinkBaseWithInkBarItem = mixinInkBarItem(_MatTabLinkBase);
- /**
- * Navigation component matching the styles of the tab group header.
- * Provides anchored navigation with animated ink bar.
- */
- class MatTabNav extends _MatTabNavBase {
- /** Whether the ink bar should fit its width to the size of the tab label content. */
- get fitInkBarToContent() {
- return this._fitInkBarToContent.value;
- }
- set fitInkBarToContent(v) {
- this._fitInkBarToContent.next(coerceBooleanProperty(v));
- this._changeDetectorRef.markForCheck();
- }
- /** Whether tabs should be stretched to fill the header. */
- get stretchTabs() {
- return this._stretchTabs;
- }
- set stretchTabs(v) {
- this._stretchTabs = coerceBooleanProperty(v);
- }
- constructor(elementRef, dir, ngZone, changeDetectorRef, viewportRuler, platform, animationMode, defaultConfig) {
- super(elementRef, dir, ngZone, changeDetectorRef, viewportRuler, platform, animationMode);
- this._fitInkBarToContent = new BehaviorSubject(false);
- this._stretchTabs = true;
- this.disablePagination =
- defaultConfig && defaultConfig.disablePagination != null
- ? defaultConfig.disablePagination
- : false;
- this.fitInkBarToContent =
- defaultConfig && defaultConfig.fitInkBarToContent != null
- ? defaultConfig.fitInkBarToContent
- : false;
- this.stretchTabs =
- defaultConfig && defaultConfig.stretchTabs != null ? defaultConfig.stretchTabs : true;
- }
- ngAfterContentInit() {
- this._inkBar = new MatInkBar(this._items);
- super.ngAfterContentInit();
- }
- ngAfterViewInit() {
- if (!this.tabPanel && (typeof ngDevMode === 'undefined' || ngDevMode)) {
- throw new Error('A mat-tab-nav-panel must be specified via [tabPanel].');
- }
- super.ngAfterViewInit();
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabNav, deps: [{ token: i0.ElementRef }, { token: i1.Directionality, optional: true }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }, { token: i1$1.ViewportRuler }, { token: i3.Platform }, { token: ANIMATION_MODULE_TYPE, optional: true }, { token: MAT_TABS_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: MatTabNav, selector: "[mat-tab-nav-bar]", inputs: { color: "color", fitInkBarToContent: "fitInkBarToContent", stretchTabs: ["mat-stretch-tabs", "stretchTabs"] }, host: { properties: { "attr.role": "_getRole()", "class.mat-mdc-tab-header-pagination-controls-enabled": "_showPaginationControls", "class.mat-mdc-tab-header-rtl": "_getLayoutDirection() == 'rtl'", "class.mat-mdc-tab-nav-bar-stretch-tabs": "stretchTabs", "class.mat-primary": "color !== \"warn\" && color !== \"accent\"", "class.mat-accent": "color === \"accent\"", "class.mat-warn": "color === \"warn\"", "class._mat-animation-noopable": "_animationMode === \"NoopAnimations\"" }, classAttribute: "mat-mdc-tab-nav-bar mat-mdc-tab-header" }, queries: [{ propertyName: "_items", predicate: i0.forwardRef(function () { return MatTabLink; }), descendants: true }], viewQueries: [{ propertyName: "_tabListContainer", first: true, predicate: ["tabListContainer"], descendants: true, static: true }, { propertyName: "_tabList", first: true, predicate: ["tabList"], descendants: true, static: true }, { propertyName: "_tabListInner", first: true, predicate: ["tabListInner"], descendants: true, static: true }, { propertyName: "_nextPaginator", first: true, predicate: ["nextPaginator"], descendants: true }, { propertyName: "_previousPaginator", first: true, predicate: ["previousPaginator"], descendants: true }], exportAs: ["matTabNavBar", "matTabNav"], usesInheritance: true, ngImport: i0, template: "<!-- TODO: this also had `mat-elevation-z4`. Figure out what we should do with it. -->\n<button class=\"mat-mdc-tab-header-pagination mat-mdc-tab-header-pagination-before\"\n #previousPaginator\n aria-hidden=\"true\"\n type=\"button\"\n mat-ripple\n tabindex=\"-1\"\n [matRippleDisabled]=\"_disableScrollBefore || disableRipple\"\n [class.mat-mdc-tab-header-pagination-disabled]=\"_disableScrollBefore\"\n [disabled]=\"_disableScrollBefore || null\"\n (click)=\"_handlePaginatorClick('before')\"\n (mousedown)=\"_handlePaginatorPress('before', $event)\"\n (touchend)=\"_stopInterval()\">\n <div class=\"mat-mdc-tab-header-pagination-chevron\"></div>\n</button>\n\n<div class=\"mat-mdc-tab-link-container\" #tabListContainer (keydown)=\"_handleKeydown($event)\">\n <div class=\"mat-mdc-tab-list\" #tabList (cdkObserveContent)=\"_onContentChanges()\">\n <div class=\"mat-mdc-tab-links\" #tabListInner>\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n<!-- TODO: this also had `mat-elevation-z4`. Figure out what we should do with it. -->\n<button class=\"mat-mdc-tab-header-pagination mat-mdc-tab-header-pagination-after\"\n #nextPaginator\n aria-hidden=\"true\"\n type=\"button\"\n mat-ripple\n [matRippleDisabled]=\"_disableScrollAfter || disableRipple\"\n [class.mat-mdc-tab-header-pagination-disabled]=\"_disableScrollAfter\"\n [disabled]=\"_disableScrollAfter || null\"\n tabindex=\"-1\"\n (mousedown)=\"_handlePaginatorPress('after', $event)\"\n (click)=\"_handlePaginatorClick('after')\"\n (touchend)=\"_stopInterval()\">\n <div class=\"mat-mdc-tab-header-pagination-chevron\"></div>\n</button>\n", styles: [".mdc-tab{min-width:90px;padding-right:24px;padding-left:24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;margin:0;padding-top:0;padding-bottom:0;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none;z-index:1}.mdc-tab::-moz-focus-inner{padding:0;border:0}.mdc-tab[hidden]{display:none}.mdc-tab--min-width{flex:0 1 auto}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab__icon{transition:150ms color linear;z-index:2}.mdc-tab--stacked .mdc-tab__content{flex-direction:column;align-items:center;justify-content:center}.mdc-tab--stacked .mdc-tab__text-label{padding-top:6px;padding-bottom:4px}.mdc-tab--active .mdc-tab__text-label,.mdc-tab--active .mdc-tab__icon{transition-delay:100ms}.mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label{padding-left:8px;padding-right:0}[dir=rtl] .mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label,.mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label[dir=rtl]{padding-left:0;padding-right:8px}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator__content--icon{align-self:center;margin:0 auto}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}.mdc-tab-indicator .mdc-tab-indicator__content{transition:250ms transform cubic-bezier(0.4, 0, 0.2, 1)}.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mdc-tab-indicator--fade .mdc-tab-indicator__content{transition:150ms opacity linear}.mdc-tab-indicator--active.mdc-tab-indicator--fade .mdc-tab-indicator__content{transition-delay:100ms}.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0;--mdc-tab-indicator-active-indicator-height:2px;--mdc-tab-indicator-active-indicator-shape:0;--mdc-secondary-navigation-tab-container-height:48px}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;background:none;border:none;outline:0;padding:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-header-pagination-icon-color)}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}._mat-animation-noopable span.mdc-tab-indicator__content,._mat-animation-noopable span.mdc-tab__text-label{transition:none}.mat-mdc-tab-links{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-link-container .mat-mdc-tab-links{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-link-container .mat-mdc-tab-links{justify-content:flex-end}.mat-mdc-tab-link-container{display:flex;flex-grow:1;overflow:hidden;z-index:1}.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-header-with-background-background-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background.mat-primary>.mat-mdc-tab-link-container .mat-mdc-tab-link .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background.mat-primary>.mat-mdc-tab-link-container .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-link-container .mat-mdc-tab-link:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-link-container .mat-mdc-tab-link:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mat-mdc-focus-indicator::before,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-focus-indicator::before{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mat-ripple-element,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mdc-tab__ripple::before,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-header-with-background-foreground-color)}"], dependencies: [{ kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }, { kind: "directive", type: i5$1.CdkObserveContent, selector: "[cdkObserveContent]", inputs: ["cdkObserveContentDisabled", "debounce"], outputs: ["cdkObserveContent"], exportAs: ["cdkObserveContent"] }], changeDetection: i0.ChangeDetectionStrategy.Default, encapsulation: i0.ViewEncapsulation.None }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabNav, decorators: [{
- type: Component,
- args: [{ selector: '[mat-tab-nav-bar]', exportAs: 'matTabNavBar, matTabNav', inputs: ['color'], host: {
- '[attr.role]': '_getRole()',
- 'class': 'mat-mdc-tab-nav-bar mat-mdc-tab-header',
- '[class.mat-mdc-tab-header-pagination-controls-enabled]': '_showPaginationControls',
- '[class.mat-mdc-tab-header-rtl]': "_getLayoutDirection() == 'rtl'",
- '[class.mat-mdc-tab-nav-bar-stretch-tabs]': 'stretchTabs',
- '[class.mat-primary]': 'color !== "warn" && color !== "accent"',
- '[class.mat-accent]': 'color === "accent"',
- '[class.mat-warn]': 'color === "warn"',
- '[class._mat-animation-noopable]': '_animationMode === "NoopAnimations"',
- }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.Default, template: "<!-- TODO: this also had `mat-elevation-z4`. Figure out what we should do with it. -->\n<button class=\"mat-mdc-tab-header-pagination mat-mdc-tab-header-pagination-before\"\n #previousPaginator\n aria-hidden=\"true\"\n type=\"button\"\n mat-ripple\n tabindex=\"-1\"\n [matRippleDisabled]=\"_disableScrollBefore || disableRipple\"\n [class.mat-mdc-tab-header-pagination-disabled]=\"_disableScrollBefore\"\n [disabled]=\"_disableScrollBefore || null\"\n (click)=\"_handlePaginatorClick('before')\"\n (mousedown)=\"_handlePaginatorPress('before', $event)\"\n (touchend)=\"_stopInterval()\">\n <div class=\"mat-mdc-tab-header-pagination-chevron\"></div>\n</button>\n\n<div class=\"mat-mdc-tab-link-container\" #tabListContainer (keydown)=\"_handleKeydown($event)\">\n <div class=\"mat-mdc-tab-list\" #tabList (cdkObserveContent)=\"_onContentChanges()\">\n <div class=\"mat-mdc-tab-links\" #tabListInner>\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n\n<!-- TODO: this also had `mat-elevation-z4`. Figure out what we should do with it. -->\n<button class=\"mat-mdc-tab-header-pagination mat-mdc-tab-header-pagination-after\"\n #nextPaginator\n aria-hidden=\"true\"\n type=\"button\"\n mat-ripple\n [matRippleDisabled]=\"_disableScrollAfter || disableRipple\"\n [class.mat-mdc-tab-header-pagination-disabled]=\"_disableScrollAfter\"\n [disabled]=\"_disableScrollAfter || null\"\n tabindex=\"-1\"\n (mousedown)=\"_handlePaginatorPress('after', $event)\"\n (click)=\"_handlePaginatorClick('after')\"\n (touchend)=\"_stopInterval()\">\n <div class=\"mat-mdc-tab-header-pagination-chevron\"></div>\n</button>\n", styles: [".mdc-tab{min-width:90px;padding-right:24px;padding-left:24px;display:flex;flex:1 0 auto;justify-content:center;box-sizing:border-box;margin:0;padding-top:0;padding-bottom:0;border:none;outline:none;text-align:center;white-space:nowrap;cursor:pointer;-webkit-appearance:none;z-index:1}.mdc-tab::-moz-focus-inner{padding:0;border:0}.mdc-tab[hidden]{display:none}.mdc-tab--min-width{flex:0 1 auto}.mdc-tab__content{display:flex;align-items:center;justify-content:center;height:inherit;pointer-events:none}.mdc-tab__text-label{transition:150ms color linear;display:inline-block;line-height:1;z-index:2}.mdc-tab__icon{transition:150ms color linear;z-index:2}.mdc-tab--stacked .mdc-tab__content{flex-direction:column;align-items:center;justify-content:center}.mdc-tab--stacked .mdc-tab__text-label{padding-top:6px;padding-bottom:4px}.mdc-tab--active .mdc-tab__text-label,.mdc-tab--active .mdc-tab__icon{transition-delay:100ms}.mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label{padding-left:8px;padding-right:0}[dir=rtl] .mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label,.mdc-tab:not(.mdc-tab--stacked) .mdc-tab__icon+.mdc-tab__text-label[dir=rtl]{padding-left:0;padding-right:8px}.mdc-tab-indicator{display:flex;position:absolute;top:0;left:0;justify-content:center;width:100%;height:100%;pointer-events:none;z-index:1}.mdc-tab-indicator__content{transform-origin:left;opacity:0}.mdc-tab-indicator__content--underline{align-self:flex-end;box-sizing:border-box;width:100%;border-top-style:solid}.mdc-tab-indicator__content--icon{align-self:center;margin:0 auto}.mdc-tab-indicator--active .mdc-tab-indicator__content{opacity:1}.mdc-tab-indicator .mdc-tab-indicator__content{transition:250ms transform cubic-bezier(0.4, 0, 0.2, 1)}.mdc-tab-indicator--no-transition .mdc-tab-indicator__content{transition:none}.mdc-tab-indicator--fade .mdc-tab-indicator__content{transition:150ms opacity linear}.mdc-tab-indicator--active.mdc-tab-indicator--fade .mdc-tab-indicator__content{transition-delay:100ms}.mat-mdc-tab-ripple{position:absolute;top:0;left:0;bottom:0;right:0;pointer-events:none}.mat-mdc-tab-header{display:flex;overflow:hidden;position:relative;flex-shrink:0;--mdc-tab-indicator-active-indicator-height:2px;--mdc-tab-indicator-active-indicator-shape:0;--mdc-secondary-navigation-tab-container-height:48px}.mat-mdc-tab-header-pagination{-webkit-user-select:none;user-select:none;position:relative;display:none;justify-content:center;align-items:center;min-width:32px;cursor:pointer;z-index:2;-webkit-tap-highlight-color:rgba(0,0,0,0);touch-action:none;box-sizing:content-box;background:none;border:none;outline:0;padding:0}.mat-mdc-tab-header-pagination::-moz-focus-inner{border:0}.mat-mdc-tab-header-pagination .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-header-pagination-controls-enabled .mat-mdc-tab-header-pagination{display:flex}.mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after{padding-left:4px}.mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(-135deg)}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before,.mat-mdc-tab-header-pagination-after{padding-right:4px}.mat-mdc-tab-header-rtl .mat-mdc-tab-header-pagination-before .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-header-pagination-after .mat-mdc-tab-header-pagination-chevron{transform:rotate(45deg)}.mat-mdc-tab-header-pagination-chevron{border-style:solid;border-width:2px 2px 0 0;height:8px;width:8px;border-color:var(--mat-tab-header-pagination-icon-color)}.mat-mdc-tab-header-pagination-disabled{box-shadow:none;cursor:default;pointer-events:none}.mat-mdc-tab-header-pagination-disabled .mat-mdc-tab-header-pagination-chevron{opacity:.4}.mat-mdc-tab-list{flex-grow:1;position:relative;transition:transform 500ms cubic-bezier(0.35, 0, 0.25, 1)}._mat-animation-noopable .mat-mdc-tab-list{transition:none}._mat-animation-noopable span.mdc-tab-indicator__content,._mat-animation-noopable span.mdc-tab__text-label{transition:none}.mat-mdc-tab-links{display:flex;flex:1 0 auto}[mat-align-tabs=center]>.mat-mdc-tab-link-container .mat-mdc-tab-links{justify-content:center}[mat-align-tabs=end]>.mat-mdc-tab-link-container .mat-mdc-tab-links{justify-content:flex-end}.mat-mdc-tab-link-container{display:flex;flex-grow:1;overflow:hidden;z-index:1}.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination{background-color:var(--mat-tab-header-with-background-background-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background.mat-primary>.mat-mdc-tab-link-container .mat-mdc-tab-link .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background.mat-primary>.mat-mdc-tab-link-container .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-link-container .mat-mdc-tab-link:not(.mdc-tab--active) .mdc-tab__text-label{color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background:not(.mat-primary)>.mat-mdc-tab-link-container .mat-mdc-tab-link:not(.mdc-tab--active) .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mat-mdc-focus-indicator::before,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-focus-indicator::before{border-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mat-ripple-element,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mdc-tab__ripple::before,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-ripple-element,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mdc-tab__ripple::before{background-color:var(--mat-tab-header-with-background-foreground-color)}.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-link-container .mat-mdc-tab-header-pagination-chevron,.mat-mdc-tab-nav-bar.mat-tabs-with-background>.mat-mdc-tab-header-pagination .mat-mdc-tab-header-pagination-chevron{color:var(--mat-tab-header-with-background-foreground-color)}"] }]
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.Directionality, decorators: [{
- type: Optional
- }] }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }, { type: i1$1.ViewportRuler }, { type: i3.Platform }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [ANIMATION_MODULE_TYPE]
- }] }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [MAT_TABS_CONFIG]
- }] }]; }, propDecorators: { fitInkBarToContent: [{
- type: Input
- }], stretchTabs: [{
- type: Input,
- args: ['mat-stretch-tabs']
- }], _items: [{
- type: ContentChildren,
- args: [forwardRef(() => MatTabLink), { descendants: true }]
- }], _tabListContainer: [{
- type: ViewChild,
- args: ['tabListContainer', { static: true }]
- }], _tabList: [{
- type: ViewChild,
- args: ['tabList', { static: true }]
- }], _tabListInner: [{
- type: ViewChild,
- args: ['tabListInner', { static: true }]
- }], _nextPaginator: [{
- type: ViewChild,
- args: ['nextPaginator']
- }], _previousPaginator: [{
- type: ViewChild,
- args: ['previousPaginator']
- }] } });
- /**
- * Link inside of a `mat-tab-nav-bar`.
- */
- class MatTabLink extends _MatTabLinkBaseWithInkBarItem {
- constructor(tabNavBar, elementRef, globalRippleOptions, tabIndex, focusMonitor, animationMode) {
- super(tabNavBar, elementRef, globalRippleOptions, tabIndex, focusMonitor, animationMode);
- this._destroyed = new Subject();
- tabNavBar._fitInkBarToContent.pipe(takeUntil(this._destroyed)).subscribe(fitInkBarToContent => {
- this.fitInkBarToContent = fitInkBarToContent;
- });
- }
- ngOnDestroy() {
- this._destroyed.next();
- this._destroyed.complete();
- super.ngOnDestroy();
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabLink, deps: [{ token: MatTabNav }, { token: i0.ElementRef }, { token: MAT_RIPPLE_GLOBAL_OPTIONS, optional: true }, { token: 'tabindex', attribute: true }, { token: i4.FocusMonitor }, { token: ANIMATION_MODULE_TYPE, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: MatTabLink, selector: "[mat-tab-link], [matTabLink]", inputs: { disabled: "disabled", disableRipple: "disableRipple", tabIndex: "tabIndex", active: "active", id: "id" }, host: { listeners: { "focus": "_handleFocus()", "keydown": "_handleKeydown($event)" }, properties: { "attr.aria-controls": "_getAriaControls()", "attr.aria-current": "_getAriaCurrent()", "attr.aria-disabled": "disabled", "attr.aria-selected": "_getAriaSelected()", "attr.id": "id", "attr.tabIndex": "_getTabIndex()", "attr.role": "_getRole()", "class.mat-mdc-tab-disabled": "disabled", "class.mdc-tab--active": "active" }, classAttribute: "mdc-tab mat-mdc-tab-link mat-mdc-focus-indicator" }, exportAs: ["matTabLink"], usesInheritance: true, ngImport: i0, template: "<span class=\"mdc-tab__ripple\"></span>\n\n<div\n class=\"mat-mdc-tab-ripple\"\n mat-ripple\n [matRippleTrigger]=\"elementRef.nativeElement\"\n [matRippleDisabled]=\"rippleDisabled\"></div>\n\n<span class=\"mdc-tab__content\">\n <span class=\"mdc-tab__text-label\">\n <ng-content></ng-content>\n </span>\n</span>\n\n", styles: [".mat-mdc-tab-link{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;font-family:var(--mat-tab-header-label-text-font);font-size:var(--mat-tab-header-label-text-size);letter-spacing:var(--mat-tab-header-label-text-letter-spacing);line-height:var(--mat-tab-header-label-text-line-height);font-weight:var(--mat-tab-header-label-text-weight)}.mat-mdc-tab-link .mdc-tab-indicator__content--underline{border-color:var(--mdc-tab-indicator-active-indicator-color)}.mat-mdc-tab-link .mdc-tab-indicator__content--underline{border-top-width:var(--mdc-tab-indicator-active-indicator-height)}.mat-mdc-tab-link .mdc-tab-indicator__content--underline{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.mat-mdc-tab-link:not(.mdc-tab--stacked){height:var(--mdc-secondary-navigation-tab-container-height)}.mat-mdc-tab-link:not(:disabled).mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):hover.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):focus.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):active.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:disabled.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):hover:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):focus:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):active:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:disabled:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link.mdc-tab{flex-grow:0}.mat-mdc-tab-link:hover .mdc-tab__text-label{color:var(--mat-tab-header-inactive-hover-label-text-color)}.mat-mdc-tab-link:focus .mdc-tab__text-label{color:var(--mat-tab-header-inactive-focus-label-text-color)}.mat-mdc-tab-link.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-header-active-label-text-color)}.mat-mdc-tab-link.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab-link.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-header-active-ripple-color)}.mat-mdc-tab-link.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-header-active-hover-label-text-color)}.mat-mdc-tab-link.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-hover-indicator-color)}.mat-mdc-tab-link.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-header-active-focus-label-text-color)}.mat-mdc-tab-link.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-focus-indicator-color)}.mat-mdc-tab-link.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab-link.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab-link.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab-link.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-header-disabled-ripple-color)}.mat-mdc-tab-link .mdc-tab__ripple::before{content:\"\";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-link .mdc-tab__text-label{color:var(--mat-tab-header-inactive-label-text-color);display:inline-flex;align-items:center}.mat-mdc-tab-link .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab-link:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab-link.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab-link.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab-link .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-header.mat-mdc-tab-nav-bar-stretch-tabs .mat-mdc-tab-link{flex-grow:1}.mat-mdc-tab-link::before{margin:5px}@media(max-width: 599px){.mat-mdc-tab-link{min-width:72px}}"], dependencies: [{ kind: "directive", type: i5.MatRipple, selector: "[mat-ripple], [matRipple]", inputs: ["matRippleColor", "matRippleUnbounded", "matRippleCentered", "matRippleRadius", "matRippleAnimation", "matRippleDisabled", "matRippleTrigger"], exportAs: ["matRipple"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabLink, decorators: [{
- type: Component,
- args: [{ selector: '[mat-tab-link], [matTabLink]', exportAs: 'matTabLink', inputs: ['disabled', 'disableRipple', 'tabIndex', 'active', 'id'], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, host: {
- 'class': 'mdc-tab mat-mdc-tab-link mat-mdc-focus-indicator',
- '[attr.aria-controls]': '_getAriaControls()',
- '[attr.aria-current]': '_getAriaCurrent()',
- '[attr.aria-disabled]': 'disabled',
- '[attr.aria-selected]': '_getAriaSelected()',
- '[attr.id]': 'id',
- '[attr.tabIndex]': '_getTabIndex()',
- '[attr.role]': '_getRole()',
- '[class.mat-mdc-tab-disabled]': 'disabled',
- '[class.mdc-tab--active]': 'active',
- '(focus)': '_handleFocus()',
- '(keydown)': '_handleKeydown($event)',
- }, template: "<span class=\"mdc-tab__ripple\"></span>\n\n<div\n class=\"mat-mdc-tab-ripple\"\n mat-ripple\n [matRippleTrigger]=\"elementRef.nativeElement\"\n [matRippleDisabled]=\"rippleDisabled\"></div>\n\n<span class=\"mdc-tab__content\">\n <span class=\"mdc-tab__text-label\">\n <ng-content></ng-content>\n </span>\n</span>\n\n", styles: [".mat-mdc-tab-link{-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none;background:none;font-family:var(--mat-tab-header-label-text-font);font-size:var(--mat-tab-header-label-text-size);letter-spacing:var(--mat-tab-header-label-text-letter-spacing);line-height:var(--mat-tab-header-label-text-line-height);font-weight:var(--mat-tab-header-label-text-weight)}.mat-mdc-tab-link .mdc-tab-indicator__content--underline{border-color:var(--mdc-tab-indicator-active-indicator-color)}.mat-mdc-tab-link .mdc-tab-indicator__content--underline{border-top-width:var(--mdc-tab-indicator-active-indicator-height)}.mat-mdc-tab-link .mdc-tab-indicator__content--underline{border-radius:var(--mdc-tab-indicator-active-indicator-shape)}.mat-mdc-tab-link:not(.mdc-tab--stacked){height:var(--mdc-secondary-navigation-tab-container-height)}.mat-mdc-tab-link:not(:disabled).mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):hover.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):focus.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):active.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:disabled.mdc-tab--active .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):hover:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):focus:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:not(:disabled):active:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link:disabled:not(.mdc-tab--active) .mdc-tab__icon{fill:currentColor}.mat-mdc-tab-link.mdc-tab{flex-grow:0}.mat-mdc-tab-link:hover .mdc-tab__text-label{color:var(--mat-tab-header-inactive-hover-label-text-color)}.mat-mdc-tab-link:focus .mdc-tab__text-label{color:var(--mat-tab-header-inactive-focus-label-text-color)}.mat-mdc-tab-link.mdc-tab--active .mdc-tab__text-label{color:var(--mat-tab-header-active-label-text-color)}.mat-mdc-tab-link.mdc-tab--active .mdc-tab__ripple::before,.mat-mdc-tab-link.mdc-tab--active .mat-ripple-element{background-color:var(--mat-tab-header-active-ripple-color)}.mat-mdc-tab-link.mdc-tab--active:hover .mdc-tab__text-label{color:var(--mat-tab-header-active-hover-label-text-color)}.mat-mdc-tab-link.mdc-tab--active:hover .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-hover-indicator-color)}.mat-mdc-tab-link.mdc-tab--active:focus .mdc-tab__text-label{color:var(--mat-tab-header-active-focus-label-text-color)}.mat-mdc-tab-link.mdc-tab--active:focus .mdc-tab-indicator__content--underline{border-color:var(--mat-tab-header-active-focus-indicator-color)}.mat-mdc-tab-link.mat-mdc-tab-disabled{opacity:.4;pointer-events:none}.mat-mdc-tab-link.mat-mdc-tab-disabled .mdc-tab__content{pointer-events:none}.mat-mdc-tab-link.mat-mdc-tab-disabled .mdc-tab__ripple::before,.mat-mdc-tab-link.mat-mdc-tab-disabled .mat-ripple-element{background-color:var(--mat-tab-header-disabled-ripple-color)}.mat-mdc-tab-link .mdc-tab__ripple::before{content:\"\";display:block;position:absolute;top:0;left:0;right:0;bottom:0;opacity:0;pointer-events:none;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-link .mdc-tab__text-label{color:var(--mat-tab-header-inactive-label-text-color);display:inline-flex;align-items:center}.mat-mdc-tab-link .mdc-tab__content{position:relative;pointer-events:auto}.mat-mdc-tab-link:hover .mdc-tab__ripple::before{opacity:.04}.mat-mdc-tab-link.cdk-program-focused .mdc-tab__ripple::before,.mat-mdc-tab-link.cdk-keyboard-focused .mdc-tab__ripple::before{opacity:.12}.mat-mdc-tab-link .mat-ripple-element{opacity:.12;background-color:var(--mat-tab-header-inactive-ripple-color)}.mat-mdc-tab-header.mat-mdc-tab-nav-bar-stretch-tabs .mat-mdc-tab-link{flex-grow:1}.mat-mdc-tab-link::before{margin:5px}@media(max-width: 599px){.mat-mdc-tab-link{min-width:72px}}"] }]
- }], ctorParameters: function () { return [{ type: MatTabNav }, { type: i0.ElementRef }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [MAT_RIPPLE_GLOBAL_OPTIONS]
- }] }, { type: undefined, decorators: [{
- type: Attribute,
- args: ['tabindex']
- }] }, { type: i4.FocusMonitor }, { type: undefined, decorators: [{
- type: Optional
- }, {
- type: Inject,
- args: [ANIMATION_MODULE_TYPE]
- }] }]; } });
- /**
- * Tab panel component associated with MatTabNav.
- */
- class MatTabNavPanel {
- constructor() {
- /** Unique id for the tab panel. */
- this.id = `mat-tab-nav-panel-${nextUniqueId++}`;
- }
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabNavPanel, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: MatTabNavPanel, selector: "mat-tab-nav-panel", inputs: { id: "id" }, host: { attributes: { "role": "tabpanel" }, properties: { "attr.aria-labelledby": "_activeTabId", "attr.id": "id" }, classAttribute: "mat-mdc-tab-nav-panel" }, exportAs: ["matTabNavPanel"], ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabNavPanel, decorators: [{
- type: Component,
- args: [{
- selector: 'mat-tab-nav-panel',
- exportAs: 'matTabNavPanel',
- template: '<ng-content></ng-content>',
- host: {
- '[attr.aria-labelledby]': '_activeTabId',
- '[attr.id]': 'id',
- 'class': 'mat-mdc-tab-nav-panel',
- 'role': 'tabpanel',
- },
- encapsulation: ViewEncapsulation.None,
- changeDetection: ChangeDetectionStrategy.OnPush,
- }]
- }], propDecorators: { id: [{
- type: Input
- }] } });
- class MatTabsModule {
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.0", ngImport: i0, type: MatTabsModule, declarations: [MatTabContent,
- MatTabLabel,
- MatTab,
- MatTabGroup,
- MatTabNav,
- MatTabNavPanel,
- MatTabLink,
- // Private directives, should not be exported.
- MatTabBody,
- MatTabBodyPortal,
- MatTabLabelWrapper,
- MatTabHeader], imports: [CommonModule,
- MatCommonModule,
- PortalModule,
- MatRippleModule,
- ObserversModule,
- A11yModule], exports: [MatCommonModule,
- MatTabContent,
- MatTabLabel,
- MatTab,
- MatTabGroup,
- MatTabNav,
- MatTabNavPanel,
- MatTabLink] }); }
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabsModule, imports: [CommonModule,
- MatCommonModule,
- PortalModule,
- MatRippleModule,
- ObserversModule,
- A11yModule, MatCommonModule] }); }
- }
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: MatTabsModule, decorators: [{
- type: NgModule,
- args: [{
- imports: [
- CommonModule,
- MatCommonModule,
- PortalModule,
- MatRippleModule,
- ObserversModule,
- A11yModule,
- ],
- exports: [
- MatCommonModule,
- MatTabContent,
- MatTabLabel,
- MatTab,
- MatTabGroup,
- MatTabNav,
- MatTabNavPanel,
- MatTabLink,
- ],
- declarations: [
- MatTabContent,
- MatTabLabel,
- MatTab,
- MatTabGroup,
- MatTabNav,
- MatTabNavPanel,
- MatTabLink,
- // Private directives, should not be exported.
- MatTabBody,
- MatTabBodyPortal,
- MatTabLabelWrapper,
- MatTabHeader,
- ],
- }]
- }] });
- /**
- * Generated bundle index. Do not edit.
- */
- export { MAT_TAB, MAT_TABS_CONFIG, MAT_TAB_CONTENT, MAT_TAB_GROUP, MAT_TAB_LABEL, MatInkBar, MatPaginatedTabHeader, MatTab, MatTabBody, MatTabBodyPortal, MatTabChangeEvent, MatTabContent, MatTabGroup, MatTabHeader, MatTabLabel, MatTabLabelWrapper, MatTabLink, MatTabNav, MatTabNavPanel, MatTabsModule, _MAT_INK_BAR_POSITIONER, _MAT_INK_BAR_POSITIONER_FACTORY, _MatTabBase, _MatTabBodyBase, _MatTabGroupBase, _MatTabHeaderBase, _MatTabLabelWrapperBase, _MatTabLinkBase, _MatTabNavBase, matTabsAnimations };
- //# sourceMappingURL=tabs.mjs.map
|