Skip to content

Commit e79f605

Browse files
committedMar 14, 2025
feat(material/button): allow appearance to be set dynamically
Adds the following features to the button: * Allows the appearance of a button to be set dynamically using the `matButton` input. * Aligns the terminology with the M3 spec. Currently the names are derived from an old spec. * Adds the ability to set the default appearance for buttons. * Adds a `matIconButton` selector to the icon button for consistency. * Adds a `matFab` selector to the FAB for consistency. * Adds a `matMiniFab` selector to the mini FAB for consistency. All of these changes are backwards-compatible and allow us to evolve the button in the future. Fixes #15367. Fixes #29841.
1 parent 7343657 commit e79f605

File tree

7 files changed

+179
-84
lines changed

7 files changed

+179
-84
lines changed
 

‎src/material/button/button-base.ts

+14-46
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,22 @@ import {
2424
import {_StructuralStylesLoader, MatRippleLoader, ThemePalette} from '../core';
2525
import {_CdkPrivateStyleLoader} from '@angular/cdk/private';
2626

27+
/**
28+
* Possible appearances for a `MatButton`.
29+
* See https://m3.material.io/components/buttons/overview
30+
*/
31+
export type MatButtonAppearance = 'text' | 'filled' | 'elevated' | 'outlined';
32+
2733
/** Object that can be used to configure the default options for the button component. */
2834
export interface MatButtonConfig {
2935
/** Whether disabled buttons should be interactive. */
3036
disabledInteractive?: boolean;
3137

3238
/** Default palette color to apply to buttons. */
3339
color?: ThemePalette;
40+
41+
/** Default appearance for plain buttons (not icon buttons or FABs). */
42+
defaultAppearance?: MatButtonAppearance;
3443
}
3544

3645
/** Injection token that can be used to provide the default options the button component. */
@@ -58,45 +67,14 @@ function transformTabIndex(value: unknown): number | undefined {
5867
return value == null ? undefined : numberAttribute(value);
5968
}
6069

61-
/** List of classes to add to buttons instances based on host attribute selector. */
62-
const HOST_SELECTOR_MDC_CLASS_PAIR: {attribute: string; mdcClasses: string[]}[] = [
63-
{
64-
attribute: 'mat-button',
65-
mdcClasses: ['mdc-button', 'mat-mdc-button'],
66-
},
67-
{
68-
attribute: 'mat-flat-button',
69-
mdcClasses: ['mdc-button', 'mdc-button--unelevated', 'mat-mdc-unelevated-button'],
70-
},
71-
{
72-
attribute: 'mat-raised-button',
73-
mdcClasses: ['mdc-button', 'mdc-button--raised', 'mat-mdc-raised-button'],
74-
},
75-
{
76-
attribute: 'mat-stroked-button',
77-
mdcClasses: ['mdc-button', 'mdc-button--outlined', 'mat-mdc-outlined-button'],
78-
},
79-
{
80-
attribute: 'mat-fab',
81-
mdcClasses: ['mdc-fab', 'mat-mdc-fab-base', 'mat-mdc-fab'],
82-
},
83-
{
84-
attribute: 'mat-mini-fab',
85-
mdcClasses: ['mdc-fab', 'mat-mdc-fab-base', 'mdc-fab--mini', 'mat-mdc-mini-fab'],
86-
},
87-
{
88-
attribute: 'mat-icon-button',
89-
mdcClasses: ['mdc-icon-button', 'mat-mdc-icon-button'],
90-
},
91-
];
92-
9370
/** Base class for all buttons. */
9471
@Directive()
9572
export class MatButtonBase implements AfterViewInit, OnDestroy {
96-
_elementRef = inject(ElementRef);
73+
_elementRef = inject<ElementRef<HTMLElement>>(ElementRef);
9774
_ngZone = inject(NgZone);
9875
_animationMode = inject(ANIMATION_MODULE_TYPE, {optional: true});
9976

77+
protected readonly _config = inject(MAT_BUTTON_CONFIG, {optional: true});
10078
private readonly _focusMonitor = inject(FocusMonitor);
10179
private _cleanupClick: (() => void) | undefined;
10280
private _renderer = inject(Renderer2);
@@ -179,22 +157,12 @@ export class MatButtonBase implements AfterViewInit, OnDestroy {
179157

180158
constructor() {
181159
inject(_CdkPrivateStyleLoader).load(_StructuralStylesLoader);
182-
const config = inject(MAT_BUTTON_CONFIG, {optional: true});
183-
const element: HTMLElement = this._elementRef.nativeElement;
184-
const classList = (element as HTMLElement).classList;
160+
const element = this._elementRef.nativeElement;
185161

186162
this._isAnchor = element.tagName === 'A';
187-
this.disabledInteractive = config?.disabledInteractive ?? false;
188-
this.color = config?.color ?? null;
163+
this.disabledInteractive = this._config?.disabledInteractive ?? false;
164+
this.color = this._config?.color ?? null;
189165
this._rippleLoader?.configureRipple(element, {className: 'mat-mdc-button-ripple'});
190-
191-
// For each of the variant selectors that is present in the button's host
192-
// attributes, add the correct corresponding MDC classes.
193-
for (const {attribute, mdcClasses} of HOST_SELECTOR_MDC_CLASS_PAIR) {
194-
if (element.hasAttribute(attribute)) {
195-
classList.add(...mdcClasses);
196-
}
197-
}
198166
}
199167

200168
ngAfterViewInit() {

‎src/material/button/button.spec.ts

+45-7
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,18 @@
11
import {createMouseEvent, dispatchEvent} from '@angular/cdk/testing/private';
22
import {ApplicationRef, Component} from '@angular/core';
3-
import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing';
3+
import {ComponentFixture, TestBed} from '@angular/core/testing';
44
import {ThemePalette} from '../core';
55
import {By} from '@angular/platform-browser';
66
import {
77
MAT_BUTTON_CONFIG,
88
MAT_FAB_DEFAULT_OPTIONS,
9+
MatButtonAppearance,
10+
MatButtonConfig,
911
MatButtonModule,
1012
MatFabDefaultOptions,
1113
} from './index';
1214

1315
describe('MatButton', () => {
14-
beforeEach(waitForAsync(() => {
15-
TestBed.configureTestingModule({
16-
imports: [MatButtonModule, TestApp],
17-
});
18-
}));
19-
2016
// General button tests
2117
it('should apply class based on color attribute', () => {
2218
let fixture = TestBed.createComponent(TestApp);
@@ -84,6 +80,45 @@ describe('MatButton', () => {
8480
expect(buttonDebugElement.nativeElement.classList.contains('custom-class')).toBe(true);
8581
});
8682

83+
it('should be able to change the button appearance dynamically', () => {
84+
const fixture = TestBed.createComponent(TestApp);
85+
const button = fixture.nativeElement.querySelector('.dynamic') as HTMLElement;
86+
fixture.detectChanges();
87+
88+
expect(button.classList).toContain('mat-mdc-button');
89+
expect(button.classList).not.toContain('mat-mdc-outlined-button');
90+
expect(button.classList).not.toContain('mat-mdc-raised-button');
91+
92+
fixture.componentInstance.appearance = 'outlined';
93+
fixture.changeDetectorRef.markForCheck();
94+
fixture.detectChanges();
95+
expect(button.classList).not.toContain('mat-mdc-button');
96+
expect(button.classList).toContain('mat-mdc-outlined-button');
97+
expect(button.classList).not.toContain('mat-mdc-raised-button');
98+
99+
fixture.componentInstance.appearance = 'elevated';
100+
fixture.changeDetectorRef.markForCheck();
101+
fixture.detectChanges();
102+
expect(button.classList).not.toContain('mat-mdc-button');
103+
expect(button.classList).not.toContain('mat-mdc-outlined-button');
104+
expect(button.classList).toContain('mat-mdc-raised-button');
105+
});
106+
107+
it('should be able to configure the default button appearance', () => {
108+
const config: MatButtonConfig = {
109+
defaultAppearance: 'outlined',
110+
};
111+
112+
TestBed.configureTestingModule({
113+
providers: [{provide: MAT_BUTTON_CONFIG, useValue: config}],
114+
});
115+
116+
const fixture = TestBed.createComponent(TestApp);
117+
const button = fixture.nativeElement.querySelector('.default-appearance') as HTMLElement;
118+
fixture.detectChanges();
119+
expect(button.classList).toContain('mat-mdc-outlined-button');
120+
});
121+
87122
describe('button[mat-fab]', () => {
88123
it('should have accent palette by default', () => {
89124
const fixture = TestBed.createComponent(TestApp);
@@ -422,6 +457,8 @@ describe('MatFabDefaultOptions', () => {
422457
<button mat-fab>Fab Button</button>
423458
<button mat-fab [extended]="extended" class="extended-fab-test">Extended</button>
424459
<button mat-mini-fab>Mini Fab Button</button>
460+
<button class="dynamic" [matButton]="appearance">Dynamic button</button>
461+
<button class="default-appearance" matButton>Dynamic button</button>
425462
`,
426463
imports: [MatButtonModule],
427464
})
@@ -433,6 +470,7 @@ class TestApp {
433470
tabIndex: number;
434471
extended = false;
435472
disabledInteractive = false;
473+
appearance: MatButtonAppearance = 'text';
436474

437475
increment() {
438476
this.clickCount++;

‎src/material/button/button.ts

+93-18
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,29 @@
66
* found in the LICENSE file at https://angular.dev/license
77
*/
88

9-
import {ChangeDetectionStrategy, Component, ViewEncapsulation} from '@angular/core';
10-
import {MAT_BUTTON_HOST, MatButtonBase} from './button-base';
9+
import {ChangeDetectionStrategy, Component, Input, ViewEncapsulation} from '@angular/core';
10+
import {MAT_BUTTON_HOST, MatButtonAppearance, MatButtonBase} from './button-base';
11+
12+
/**
13+
* Classes that need to be set for each appearance of the button.
14+
* Note that we use a `Map` here to avoid issues with property renaming.
15+
*/
16+
const APPEARANCE_CLASSES: Map<MatButtonAppearance, readonly string[]> = new Map([
17+
['text', ['mat-mdc-button']],
18+
['filled', ['mdc-button--unelevated', 'mat-mdc-unelevated-button']],
19+
['elevated', ['mdc-button--raised', 'mat-mdc-raised-button']],
20+
['outlined', ['mdc-button--outlined', 'mat-mdc-outlined-button']],
21+
]);
1122

1223
/**
1324
* Material Design button component. Users interact with a button to perform an action.
14-
* See https://material.io/components/buttons
15-
*
16-
* The `MatButton` class applies to native button elements and captures the appearances for
17-
* "text button", "outlined button", and "contained button" per the Material Design
18-
* specification. `MatButton` additionally captures an additional "flat" appearance, which matches
19-
* "contained" but without elevation.
25+
* See https://m3.material.io/components/buttons/overview
2026
*/
2127
@Component({
2228
selector: `
23-
button[mat-button], button[mat-raised-button], button[mat-flat-button],
24-
button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button],
25-
a[mat-stroked-button]
29+
button[matButton], a[matButton], button[mat-button], button[mat-raised-button],
30+
button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button],
31+
a[mat-flat-button], a[mat-stroked-button]
2632
`,
2733
templateUrl: 'button.html',
2834
styleUrls: ['button.css', 'button-high-contrast.css'],
@@ -31,18 +37,87 @@ import {MAT_BUTTON_HOST, MatButtonBase} from './button-base';
3137
encapsulation: ViewEncapsulation.None,
3238
changeDetection: ChangeDetectionStrategy.OnPush,
3339
})
34-
export class MatButton extends MatButtonBase {}
40+
export class MatButton extends MatButtonBase {
41+
/** Appearance of the button. */
42+
@Input('matButton')
43+
get appearance(): MatButtonAppearance | null {
44+
return this._appearance;
45+
}
46+
set appearance(value: MatButtonAppearance | '') {
47+
// Allow empty string so users can do `<button matButton></button>`
48+
// without having to write out `="text"` every time.
49+
this.setAppearance(value || this._config?.defaultAppearance || 'text');
50+
}
51+
private _appearance: MatButtonAppearance | null = null;
52+
53+
constructor(...args: unknown[]);
54+
55+
constructor() {
56+
super();
57+
const element = this._elementRef.nativeElement;
58+
const inferredAppearance = _inferAppearance(element);
59+
60+
// This class is common across all the appearances so we add it ahead of time.
61+
element.classList.add('mdc-button');
62+
63+
// Only set the appearance if we managed to infer it from the static attributes, rather than
64+
// doing something like `setAppearance(inferredAppearance || 'text')`, because doing so can
65+
// cause the fallback appearance's classes to be set and then immediately replaced when
66+
// the input value is assigned.
67+
if (inferredAppearance) {
68+
this.setAppearance(inferredAppearance);
69+
}
70+
}
71+
72+
/** Programmatically sets the appearance of the button. */
73+
setAppearance(appearance: MatButtonAppearance): void {
74+
if (appearance === this._appearance) {
75+
return;
76+
}
77+
78+
const classList = this._elementRef.nativeElement.classList;
79+
const previousClasses = this._appearance ? APPEARANCE_CLASSES.get(this._appearance) : null;
80+
const newClasses = APPEARANCE_CLASSES.get(appearance)!;
81+
82+
if ((typeof ngDevMode === 'undefined' || ngDevMode) && !newClasses) {
83+
throw new Error(`Unsupported MatButton appearance "${appearance}"`);
84+
}
85+
86+
if (previousClasses) {
87+
classList.remove(...previousClasses);
88+
}
89+
90+
classList.add(...newClasses);
91+
this._appearance = appearance;
92+
}
93+
}
94+
95+
/** Infers the button's appearance from its static attributes. */
96+
function _inferAppearance(button: HTMLElement): MatButtonAppearance | null {
97+
if (button.hasAttribute('mat-raised-button')) {
98+
return 'elevated';
99+
}
100+
101+
if (button.hasAttribute('mat-stroked-button')) {
102+
return 'outlined';
103+
}
104+
105+
if (button.hasAttribute('mat-flat-button')) {
106+
return 'filled';
107+
}
108+
109+
if (button.hasAttribute('mat-button')) {
110+
return 'text';
111+
}
112+
113+
return null;
114+
}
35115

36116
// tslint:disable:variable-name
37117
/**
38118
* Material Design button component for anchor elements. Anchor elements are used to provide
39119
* links for the user to navigate across different routes or pages.
40-
* See https://material.io/components/buttons
41-
*
42-
* The `MatAnchor` class applies to native anchor elements and captures the appearances for
43-
* "text button", "outlined button", and "contained button" per the Material Design
44-
* specification. `MatAnchor` additionally captures an additional "flat" appearance, which matches
45-
* "contained" but without elevation.
120+
* See https://m3.material.io/components/buttons/overview
46121
*/
47122
export const MatAnchor = MatButton;
48123
export type MatAnchor = MatButton;

‎src/material/button/fab.ts

+10-6
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,12 @@ const defaults = MAT_FAB_DEFAULT_OPTIONS_FACTORY();
5858
/**
5959
* Material Design floating action button (FAB) component. These buttons represent the primary
6060
* or most common action for users to interact with.
61-
* See https://material.io/components/buttons-floating-action-button/
61+
* See https://m3.material.io/components/floating-action-button/overview
6262
*
6363
* The `MatFabButton` class has two appearances: normal and extended.
6464
*/
6565
@Component({
66-
selector: `button[mat-fab], a[mat-fab]`,
66+
selector: `button[mat-fab], a[mat-fab], button[matFab], a[matFab]`,
6767
templateUrl: 'button.html',
6868
styleUrl: 'fab.css',
6969
host: {
@@ -86,6 +86,8 @@ export class MatFabButton extends MatButtonBase {
8686

8787
constructor() {
8888
super();
89+
const element = this._elementRef.nativeElement;
90+
element.classList.add('mdc-fab', 'mat-mdc-fab-base', 'mat-mdc-fab');
8991
this._options = this._options || defaults;
9092
this.color = this._options!.color || defaults.color;
9193
}
@@ -94,10 +96,10 @@ export class MatFabButton extends MatButtonBase {
9496
/**
9597
* Material Design mini floating action button (FAB) component. These buttons represent the primary
9698
* or most common action for users to interact with.
97-
* See https://material.io/components/buttons-floating-action-button/
99+
* See https://m3.material.io/components/floating-action-button/overview
98100
*/
99101
@Component({
100-
selector: `button[mat-mini-fab], a[mat-mini-fab]`,
102+
selector: `button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]`,
101103
templateUrl: 'button.html',
102104
styleUrl: 'fab.css',
103105
host: MAT_BUTTON_HOST,
@@ -114,6 +116,8 @@ export class MatMiniFabButton extends MatButtonBase {
114116

115117
constructor() {
116118
super();
119+
const element = this._elementRef.nativeElement;
120+
element.classList.add('mdc-fab', 'mat-mdc-fab-base', 'mdc-fab--mini', 'mat-mdc-mini-fab');
117121
this._options = this._options || defaults;
118122
this.color = this._options!.color || defaults.color;
119123
}
@@ -123,7 +127,7 @@ export class MatMiniFabButton extends MatButtonBase {
123127
/**
124128
* Material Design floating action button (FAB) component for anchor elements. Anchor elements
125129
* are used to provide links for the user to navigate across different routes or pages.
126-
* See https://material.io/components/buttons-floating-action-button/
130+
* See https://m3.material.io/components/floating-action-button/overview
127131
*
128132
* The `MatFabAnchor` class has two appearances: normal and extended.
129133
*/
@@ -133,7 +137,7 @@ export type MatFabAnchor = MatFabButton;
133137
/**
134138
* Material Design mini floating action button (FAB) component for anchor elements. Anchor elements
135139
* are used to provide links for the user to navigate across different routes or pages.
136-
* See https://material.io/components/buttons-floating-action-button/
140+
* See https://m3.material.io/components/floating-action-button/overview
137141
*/
138142
export const MatMiniFabAnchor = MatMiniFabButton;
139143
export type MatMiniFabAnchor = MatMiniFabButton;

‎src/material/button/icon-button.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {MAT_BUTTON_HOST, MatButtonBase} from './button-base';
1515
* See https://material.io/develop/web/components/buttons/icon-buttons/
1616
*/
1717
@Component({
18-
selector: `button[mat-icon-button], a[mat-icon-button]`,
18+
selector: `button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]`,
1919
templateUrl: 'icon-button.html',
2020
styleUrls: ['icon-button.css', 'button-high-contrast.css'],
2121
host: MAT_BUTTON_HOST,
@@ -28,7 +28,9 @@ export class MatIconButton extends MatButtonBase {
2828

2929
constructor() {
3030
super();
31-
this._rippleLoader.configureRipple(this._elementRef.nativeElement, {centered: true});
31+
const element = this._elementRef.nativeElement;
32+
element.classList.add('mdc-icon-button', 'mat-mdc-icon-button');
33+
this._rippleLoader.configureRipple(element, {centered: true});
3234
}
3335
}
3436

‎src/material/button/public-api.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@ export * from './button';
1010
export * from './fab';
1111
export * from './icon-button';
1212
export * from './module';
13-
export {MAT_BUTTON_CONFIG, MatButtonConfig} from './button-base';
13+
export {MAT_BUTTON_CONFIG, MatButtonAppearance, MatButtonConfig} from './button-base';

‎tools/public_api_guard/material/button.md

+12-4
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,23 @@ export type MatAnchor = MatButton;
3333

3434
// @public
3535
export class MatButton extends MatButtonBase {
36+
constructor(...args: unknown[]);
37+
get appearance(): MatButtonAppearance | null;
38+
set appearance(value: MatButtonAppearance | '');
39+
setAppearance(appearance: MatButtonAppearance): void;
3640
// (undocumented)
37-
static ɵcmp: i0.ɵɵComponentDeclaration<MatButton, " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", ["matButton", "matAnchor"], {}, {}, never, [".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])", "*", ".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"], true, never>;
41+
static ɵcmp: i0.ɵɵComponentDeclaration<MatButton, " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", ["matButton", "matAnchor"], { "appearance": { "alias": "matButton"; "required": false; }; }, {}, never, [".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])", "*", ".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"], true, never>;
3842
// (undocumented)
3943
static ɵfac: i0.ɵɵFactoryDeclaration<MatButton, never>;
4044
}
4145

46+
// @public
47+
export type MatButtonAppearance = 'text' | 'filled' | 'elevated' | 'outlined';
48+
4249
// @public
4350
export interface MatButtonConfig {
4451
color?: ThemePalette;
52+
defaultAppearance?: MatButtonAppearance;
4553
disabledInteractive?: boolean;
4654
}
4755

@@ -71,7 +79,7 @@ export class MatFabButton extends MatButtonBase {
7179
// (undocumented)
7280
static ngAcceptInputType_extended: unknown;
7381
// (undocumented)
74-
static ɵcmp: i0.ɵɵComponentDeclaration<MatFabButton, "button[mat-fab], a[mat-fab]", ["matButton", "matAnchor"], { "extended": { "alias": "extended"; "required": false; }; }, {}, never, [".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])", "*", ".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"], true, never>;
82+
static ɵcmp: i0.ɵɵComponentDeclaration<MatFabButton, "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", ["matButton", "matAnchor"], { "extended": { "alias": "extended"; "required": false; }; }, {}, never, [".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])", "*", ".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"], true, never>;
7583
// (undocumented)
7684
static ɵfac: i0.ɵɵFactoryDeclaration<MatFabButton, never>;
7785
}
@@ -91,7 +99,7 @@ export type MatIconAnchor = MatIconButton;
9199
export class MatIconButton extends MatButtonBase {
92100
constructor(...args: unknown[]);
93101
// (undocumented)
94-
static ɵcmp: i0.ɵɵComponentDeclaration<MatIconButton, "button[mat-icon-button], a[mat-icon-button]", ["matButton", "matAnchor"], {}, {}, never, ["*"], true, never>;
102+
static ɵcmp: i0.ɵɵComponentDeclaration<MatIconButton, "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", ["matButton", "matAnchor"], {}, {}, never, ["*"], true, never>;
95103
// (undocumented)
96104
static ɵfac: i0.ɵɵFactoryDeclaration<MatIconButton, never>;
97105
}
@@ -108,7 +116,7 @@ export class MatMiniFabButton extends MatButtonBase {
108116
// (undocumented)
109117
_isFab: boolean;
110118
// (undocumented)
111-
static ɵcmp: i0.ɵɵComponentDeclaration<MatMiniFabButton, "button[mat-mini-fab], a[mat-mini-fab]", ["matButton", "matAnchor"], {}, {}, never, [".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])", "*", ".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"], true, never>;
119+
static ɵcmp: i0.ɵɵComponentDeclaration<MatMiniFabButton, "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", ["matButton", "matAnchor"], {}, {}, never, [".material-icons:not([iconPositionEnd]), mat-icon:not([iconPositionEnd]), [matButtonIcon]:not([iconPositionEnd])", "*", ".material-icons[iconPositionEnd], mat-icon[iconPositionEnd], [matButtonIcon][iconPositionEnd]"], true, never>;
112120
// (undocumented)
113121
static ɵfac: i0.ɵɵFactoryDeclaration<MatMiniFabButton, never>;
114122
}

0 commit comments

Comments
 (0)
Please sign in to comment.