UNPKG

25.6 kBJavaScriptView Raw
1import { coerceNumberProperty } from '@angular/cdk/coercion';
2import * as i1 from '@angular/cdk/platform';
3import { _getShadowRoot } from '@angular/cdk/platform';
4import * as i3 from '@angular/common';
5import { DOCUMENT, CommonModule } from '@angular/common';
6import * as i0 from '@angular/core';
7import { InjectionToken, Component, ChangeDetectionStrategy, ViewEncapsulation, Optional, Inject, Input, NgModule } from '@angular/core';
8import { mixinColor, MatCommonModule } from '@angular/material/core';
9import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';
10import { Subscription } from 'rxjs';
11import * as i2 from '@angular/cdk/scrolling';
12
13/**
14 * @license
15 * Copyright Google LLC All Rights Reserved.
16 *
17 * Use of this source code is governed by an MIT-style license that can be
18 * found in the LICENSE file at https://angular.io/license
19 */
20/**
21 * Base reference size of the spinner.
22 * @docs-private
23 */
24const BASE_SIZE = 100;
25/**
26 * Base reference stroke width of the spinner.
27 * @docs-private
28 */
29const BASE_STROKE_WIDTH = 10;
30// Boilerplate for applying mixins to MatProgressSpinner.
31/** @docs-private */
32const _MatProgressSpinnerBase = mixinColor(class {
33 constructor(_elementRef) {
34 this._elementRef = _elementRef;
35 }
36}, 'primary');
37/** Injection token to be used to override the default options for `mat-progress-spinner`. */
38const MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS = new InjectionToken('mat-progress-spinner-default-options', {
39 providedIn: 'root',
40 factory: MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY,
41});
42/** @docs-private */
43function MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY() {
44 return { diameter: BASE_SIZE };
45}
46// .0001 percentage difference is necessary in order to avoid unwanted animation frames
47// for example because the animation duration is 4 seconds, .1% accounts to 4ms
48// which are enough to see the flicker described in
49// https://github.com/angular/components/issues/8984
50const INDETERMINATE_ANIMATION_TEMPLATE = `
51 @keyframes mat-progress-spinner-stroke-rotate-DIAMETER {
52 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }
53 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }
54 12.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }
55 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }
56
57 25.0001% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }
58 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }
59 37.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }
60 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }
61
62 50.0001% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }
63 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }
64 62.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }
65 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }
66
67 75.0001% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }
68 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }
69 87.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }
70 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }
71 }
72`;
73/**
74 * `<mat-progress-spinner>` component.
75 */
76class MatProgressSpinner extends _MatProgressSpinnerBase {
77 constructor(elementRef, _platform, _document, animationMode, defaults,
78 /**
79 * @deprecated `changeDetectorRef`, `viewportRuler` and `ngZone`
80 * parameters to become required.
81 * @breaking-change 14.0.0
82 */
83 changeDetectorRef, viewportRuler, ngZone) {
84 super(elementRef);
85 this._document = _document;
86 this._diameter = BASE_SIZE;
87 this._value = 0;
88 this._resizeSubscription = Subscription.EMPTY;
89 /** Mode of the progress circle */
90 this.mode = 'determinate';
91 const trackedDiameters = MatProgressSpinner._diameters;
92 this._spinnerAnimationLabel = this._getSpinnerAnimationLabel();
93 // The base size is already inserted via the component's structural styles. We still
94 // need to track it so we don't end up adding the same styles again.
95 if (!trackedDiameters.has(_document.head)) {
96 trackedDiameters.set(_document.head, new Set([BASE_SIZE]));
97 }
98 this._noopAnimations =
99 animationMode === 'NoopAnimations' && !!defaults && !defaults._forceAnimations;
100 if (elementRef.nativeElement.nodeName.toLowerCase() === 'mat-spinner') {
101 this.mode = 'indeterminate';
102 }
103 if (defaults) {
104 if (defaults.color) {
105 this.color = this.defaultColor = defaults.color;
106 }
107 if (defaults.diameter) {
108 this.diameter = defaults.diameter;
109 }
110 if (defaults.strokeWidth) {
111 this.strokeWidth = defaults.strokeWidth;
112 }
113 }
114 // Safari has an issue where the circle isn't positioned correctly when the page has a
115 // different zoom level from the default. This handler triggers a recalculation of the
116 // `transform-origin` when the page zoom level changes.
117 // See `_getCircleTransformOrigin` for more info.
118 // @breaking-change 14.0.0 Remove null checks for `_changeDetectorRef`,
119 // `viewportRuler` and `ngZone`.
120 if (_platform.isBrowser && _platform.SAFARI && viewportRuler && changeDetectorRef && ngZone) {
121 this._resizeSubscription = viewportRuler.change(150).subscribe(() => {
122 // When the window is resize while the spinner is in `indeterminate` mode, we
123 // have to mark for check so the transform origin of the circle can be recomputed.
124 if (this.mode === 'indeterminate') {
125 ngZone.run(() => changeDetectorRef.markForCheck());
126 }
127 });
128 }
129 }
130 /** The diameter of the progress spinner (will set width and height of svg). */
131 get diameter() {
132 return this._diameter;
133 }
134 set diameter(size) {
135 this._diameter = coerceNumberProperty(size);
136 this._spinnerAnimationLabel = this._getSpinnerAnimationLabel();
137 // If this is set before `ngOnInit`, the style root may not have been resolved yet.
138 if (this._styleRoot) {
139 this._attachStyleNode();
140 }
141 }
142 /** Stroke width of the progress spinner. */
143 get strokeWidth() {
144 return this._strokeWidth || this.diameter / 10;
145 }
146 set strokeWidth(value) {
147 this._strokeWidth = coerceNumberProperty(value);
148 }
149 /** Value of the progress circle. */
150 get value() {
151 return this.mode === 'determinate' ? this._value : 0;
152 }
153 set value(newValue) {
154 this._value = Math.max(0, Math.min(100, coerceNumberProperty(newValue)));
155 }
156 ngOnInit() {
157 const element = this._elementRef.nativeElement;
158 // Note that we need to look up the root node in ngOnInit, rather than the constructor, because
159 // Angular seems to create the element outside the shadow root and then moves it inside, if the
160 // node is inside an `ngIf` and a ShadowDom-encapsulated component.
161 this._styleRoot = _getShadowRoot(element) || this._document.head;
162 this._attachStyleNode();
163 element.classList.add('mat-progress-spinner-indeterminate-animation');
164 }
165 ngOnDestroy() {
166 this._resizeSubscription.unsubscribe();
167 }
168 /** The radius of the spinner, adjusted for stroke width. */
169 _getCircleRadius() {
170 return (this.diameter - BASE_STROKE_WIDTH) / 2;
171 }
172 /** The view box of the spinner's svg element. */
173 _getViewBox() {
174 const viewBox = this._getCircleRadius() * 2 + this.strokeWidth;
175 return `0 0 ${viewBox} ${viewBox}`;
176 }
177 /** The stroke circumference of the svg circle. */
178 _getStrokeCircumference() {
179 return 2 * Math.PI * this._getCircleRadius();
180 }
181 /** The dash offset of the svg circle. */
182 _getStrokeDashOffset() {
183 if (this.mode === 'determinate') {
184 return (this._getStrokeCircumference() * (100 - this._value)) / 100;
185 }
186 return null;
187 }
188 /** Stroke width of the circle in percent. */
189 _getCircleStrokeWidth() {
190 return (this.strokeWidth / this.diameter) * 100;
191 }
192 /** Gets the `transform-origin` for the inner circle element. */
193 _getCircleTransformOrigin(svg) {
194 var _a;
195 // Safari has an issue where the `transform-origin` doesn't work as expected when the page
196 // has a different zoom level from the default. The problem appears to be that a zoom
197 // is applied on the `svg` node itself. We can work around it by calculating the origin
198 // based on the zoom level. On all other browsers the `currentScale` appears to always be 1.
199 const scale = ((_a = svg.currentScale) !== null && _a !== void 0 ? _a : 1) * 50;
200 return `${scale}% ${scale}%`;
201 }
202 /** Dynamically generates a style tag containing the correct animation for this diameter. */
203 _attachStyleNode() {
204 const styleRoot = this._styleRoot;
205 const currentDiameter = this._diameter;
206 const diameters = MatProgressSpinner._diameters;
207 let diametersForElement = diameters.get(styleRoot);
208 if (!diametersForElement || !diametersForElement.has(currentDiameter)) {
209 const styleTag = this._document.createElement('style');
210 styleTag.setAttribute('mat-spinner-animation', this._spinnerAnimationLabel);
211 styleTag.textContent = this._getAnimationText();
212 styleRoot.appendChild(styleTag);
213 if (!diametersForElement) {
214 diametersForElement = new Set();
215 diameters.set(styleRoot, diametersForElement);
216 }
217 diametersForElement.add(currentDiameter);
218 }
219 }
220 /** Generates animation styles adjusted for the spinner's diameter. */
221 _getAnimationText() {
222 const strokeCircumference = this._getStrokeCircumference();
223 return (INDETERMINATE_ANIMATION_TEMPLATE
224 // Animation should begin at 5% and end at 80%
225 .replace(/START_VALUE/g, `${0.95 * strokeCircumference}`)
226 .replace(/END_VALUE/g, `${0.2 * strokeCircumference}`)
227 .replace(/DIAMETER/g, `${this._spinnerAnimationLabel}`));
228 }
229 /** Returns the circle diameter formatted for use with the animation-name CSS property. */
230 _getSpinnerAnimationLabel() {
231 // The string of a float point number will include a period ‘.’ character,
232 // which is not valid for a CSS animation-name.
233 return this.diameter.toString().replace('.', '_');
234 }
235}
236/**
237 * Tracks diameters of existing instances to de-dupe generated styles (default d = 100).
238 * We need to keep track of which elements the diameters were attached to, because for
239 * elements in the Shadow DOM the style tags are attached to the shadow root, rather
240 * than the document head.
241 */
242MatProgressSpinner._diameters = new WeakMap();
243MatProgressSpinner.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: MatProgressSpinner, deps: [{ token: i0.ElementRef }, { token: i1.Platform }, { token: DOCUMENT, optional: true }, { token: ANIMATION_MODULE_TYPE, optional: true }, { token: MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS }, { token: i0.ChangeDetectorRef }, { token: i2.ViewportRuler }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
244MatProgressSpinner.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.1", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: { color: "color", diameter: "diameter", strokeWidth: "strokeWidth", mode: "mode", value: "value" }, host: { attributes: { "role": "progressbar", "tabindex": "-1" }, properties: { "class._mat-animation-noopable": "_noopAnimations", "style.width.px": "diameter", "style.height.px": "diameter", "attr.aria-valuemin": "mode === \"determinate\" ? 0 : null", "attr.aria-valuemax": "mode === \"determinate\" ? 100 : null", "attr.aria-valuenow": "mode === \"determinate\" ? value : null", "attr.mode": "mode" }, classAttribute: "mat-progress-spinner mat-spinner" }, exportAs: ["matProgressSpinner"], usesInheritance: true, ngImport: i0, template: "<!--\n preserveAspectRatio of xMidYMid meet as the center of the viewport is the circle's\n center. The center of the circle will remain at the center of the mat-progress-spinner\n element containing the SVG.\n-->\n<!--\n All children need to be hidden for screen readers in order to support ChromeVox.\n More context in the issue: https://github.com/angular/components/issues/22165.\n-->\n<svg\n [style.width.px]=\"diameter\"\n [style.height.px]=\"diameter\"\n [attr.viewBox]=\"_getViewBox()\"\n preserveAspectRatio=\"xMidYMid meet\"\n focusable=\"false\"\n [ngSwitch]=\"mode === 'indeterminate'\"\n aria-hidden=\"true\"\n #svg>\n\n <!--\n Technically we can reuse the same `circle` element, however Safari has an issue that breaks\n the SVG rendering in determinate mode, after switching between indeterminate and determinate.\n Using a different element avoids the issue. An alternative to this is adding `display: none`\n for a split second and then removing it when switching between modes, but it's hard to know\n for how long to hide the element and it can cause the UI to blink.\n -->\n <circle\n *ngSwitchCase=\"true\"\n cx=\"50%\"\n cy=\"50%\"\n [attr.r]=\"_getCircleRadius()\"\n [style.animation-name]=\"'mat-progress-spinner-stroke-rotate-' + _spinnerAnimationLabel\"\n [style.stroke-dashoffset.px]=\"_getStrokeDashOffset()\"\n [style.stroke-dasharray.px]=\"_getStrokeCircumference()\"\n [style.stroke-width.%]=\"_getCircleStrokeWidth()\"\n [style.transform-origin]=\"_getCircleTransformOrigin(svg)\"></circle>\n\n <circle\n *ngSwitchCase=\"false\"\n cx=\"50%\"\n cy=\"50%\"\n [attr.r]=\"_getCircleRadius()\"\n [style.stroke-dashoffset.px]=\"_getStrokeDashOffset()\"\n [style.stroke-dasharray.px]=\"_getStrokeCircumference()\"\n [style.stroke-width.%]=\"_getCircleStrokeWidth()\"\n [style.transform-origin]=\"_getCircleTransformOrigin(svg)\"></circle>\n</svg>\n", styles: [".mat-progress-spinner{display:block;position:relative;overflow:hidden}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:rgba(0,0,0,0);transition:stroke-dashoffset 225ms linear}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:CanvasText}.mat-progress-spinner[mode=indeterminate] svg{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}.mat-progress-spinner[mode=indeterminate] circle{transition-property:stroke;animation-duration:4000ms;animation-timing-function:cubic-bezier(0.35, 0, 0.25, 1);animation-iteration-count:infinite}.mat-progress-spinner._mat-animation-noopable svg,.mat-progress-spinner._mat-animation-noopable circle{animation:none;transition:none}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.606171575px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.606171575px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.606171575px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.606171575px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(341.5deg)}}"], dependencies: [{ kind: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
245i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: MatProgressSpinner, decorators: [{
246 type: Component,
247 args: [{ selector: 'mat-progress-spinner, mat-spinner', exportAs: 'matProgressSpinner', host: {
248 'role': 'progressbar',
249 // `mat-spinner` is here for backward compatibility.
250 'class': 'mat-progress-spinner mat-spinner',
251 // set tab index to -1 so screen readers will read the aria-label
252 // Note: there is a known issue with JAWS that does not read progressbar aria labels on FireFox
253 'tabindex': '-1',
254 '[class._mat-animation-noopable]': `_noopAnimations`,
255 '[style.width.px]': 'diameter',
256 '[style.height.px]': 'diameter',
257 '[attr.aria-valuemin]': 'mode === "determinate" ? 0 : null',
258 '[attr.aria-valuemax]': 'mode === "determinate" ? 100 : null',
259 '[attr.aria-valuenow]': 'mode === "determinate" ? value : null',
260 '[attr.mode]': 'mode',
261 }, inputs: ['color'], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<!--\n preserveAspectRatio of xMidYMid meet as the center of the viewport is the circle's\n center. The center of the circle will remain at the center of the mat-progress-spinner\n element containing the SVG.\n-->\n<!--\n All children need to be hidden for screen readers in order to support ChromeVox.\n More context in the issue: https://github.com/angular/components/issues/22165.\n-->\n<svg\n [style.width.px]=\"diameter\"\n [style.height.px]=\"diameter\"\n [attr.viewBox]=\"_getViewBox()\"\n preserveAspectRatio=\"xMidYMid meet\"\n focusable=\"false\"\n [ngSwitch]=\"mode === 'indeterminate'\"\n aria-hidden=\"true\"\n #svg>\n\n <!--\n Technically we can reuse the same `circle` element, however Safari has an issue that breaks\n the SVG rendering in determinate mode, after switching between indeterminate and determinate.\n Using a different element avoids the issue. An alternative to this is adding `display: none`\n for a split second and then removing it when switching between modes, but it's hard to know\n for how long to hide the element and it can cause the UI to blink.\n -->\n <circle\n *ngSwitchCase=\"true\"\n cx=\"50%\"\n cy=\"50%\"\n [attr.r]=\"_getCircleRadius()\"\n [style.animation-name]=\"'mat-progress-spinner-stroke-rotate-' + _spinnerAnimationLabel\"\n [style.stroke-dashoffset.px]=\"_getStrokeDashOffset()\"\n [style.stroke-dasharray.px]=\"_getStrokeCircumference()\"\n [style.stroke-width.%]=\"_getCircleStrokeWidth()\"\n [style.transform-origin]=\"_getCircleTransformOrigin(svg)\"></circle>\n\n <circle\n *ngSwitchCase=\"false\"\n cx=\"50%\"\n cy=\"50%\"\n [attr.r]=\"_getCircleRadius()\"\n [style.stroke-dashoffset.px]=\"_getStrokeDashOffset()\"\n [style.stroke-dasharray.px]=\"_getStrokeCircumference()\"\n [style.stroke-width.%]=\"_getCircleStrokeWidth()\"\n [style.transform-origin]=\"_getCircleTransformOrigin(svg)\"></circle>\n</svg>\n", styles: [".mat-progress-spinner{display:block;position:relative;overflow:hidden}.mat-progress-spinner svg{position:absolute;transform:rotate(-90deg);top:0;left:0;transform-origin:center;overflow:visible}.mat-progress-spinner circle{fill:rgba(0,0,0,0);transition:stroke-dashoffset 225ms linear}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:CanvasText}.mat-progress-spinner[mode=indeterminate] svg{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}.mat-progress-spinner[mode=indeterminate] circle{transition-property:stroke;animation-duration:4000ms;animation-timing-function:cubic-bezier(0.35, 0, 0.25, 1);animation-iteration-count:infinite}.mat-progress-spinner._mat-animation-noopable svg,.mat-progress-spinner._mat-animation-noopable circle{animation:none;transition:none}@keyframes mat-progress-spinner-linear-rotate{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}@keyframes mat-progress-spinner-stroke-rotate-100{0%{stroke-dashoffset:268.606171575px;transform:rotate(0)}12.5%{stroke-dashoffset:56.5486677px;transform:rotate(0)}12.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(72.5deg)}25%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(72.5deg)}25.0001%{stroke-dashoffset:268.606171575px;transform:rotate(270deg)}37.5%{stroke-dashoffset:56.5486677px;transform:rotate(270deg)}37.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(161.5deg)}50%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(161.5deg)}50.0001%{stroke-dashoffset:268.606171575px;transform:rotate(180deg)}62.5%{stroke-dashoffset:56.5486677px;transform:rotate(180deg)}62.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(251.5deg)}75%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(251.5deg)}75.0001%{stroke-dashoffset:268.606171575px;transform:rotate(90deg)}87.5%{stroke-dashoffset:56.5486677px;transform:rotate(90deg)}87.5001%{stroke-dashoffset:56.5486677px;transform:rotateX(180deg) rotate(341.5deg)}100%{stroke-dashoffset:268.606171575px;transform:rotateX(180deg) rotate(341.5deg)}}"] }]
262 }], ctorParameters: function () {
263 return [{ type: i0.ElementRef }, { type: i1.Platform }, { type: undefined, decorators: [{
264 type: Optional
265 }, {
266 type: Inject,
267 args: [DOCUMENT]
268 }] }, { type: undefined, decorators: [{
269 type: Optional
270 }, {
271 type: Inject,
272 args: [ANIMATION_MODULE_TYPE]
273 }] }, { type: undefined, decorators: [{
274 type: Inject,
275 args: [MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS]
276 }] }, { type: i0.ChangeDetectorRef }, { type: i2.ViewportRuler }, { type: i0.NgZone }];
277 }, propDecorators: { diameter: [{
278 type: Input
279 }], strokeWidth: [{
280 type: Input
281 }], mode: [{
282 type: Input
283 }], value: [{
284 type: Input
285 }] } });
286
287/**
288 * @license
289 * Copyright Google LLC All Rights Reserved.
290 *
291 * Use of this source code is governed by an MIT-style license that can be
292 * found in the LICENSE file at https://angular.io/license
293 */
294class MatProgressSpinnerModule {
295}
296MatProgressSpinnerModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: MatProgressSpinnerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
297MatProgressSpinnerModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.1", ngImport: i0, type: MatProgressSpinnerModule, declarations: [MatProgressSpinner], imports: [MatCommonModule, CommonModule], exports: [MatProgressSpinner, MatCommonModule] });
298MatProgressSpinnerModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: MatProgressSpinnerModule, imports: [MatCommonModule, CommonModule, MatCommonModule] });
299i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.1", ngImport: i0, type: MatProgressSpinnerModule, decorators: [{
300 type: NgModule,
301 args: [{
302 imports: [MatCommonModule, CommonModule],
303 exports: [MatProgressSpinner, MatCommonModule],
304 declarations: [MatProgressSpinner],
305 }]
306 }] });
307
308/**
309 * @license
310 * Copyright Google LLC All Rights Reserved.
311 *
312 * Use of this source code is governed by an MIT-style license that can be
313 * found in the LICENSE file at https://angular.io/license
314 */
315/**
316 * @deprecated Import `MatProgressSpinner` instead. Note that the
317 * `mat-spinner` selector isn't deprecated.
318 * @breaking-change 8.0.0
319 */
320// tslint:disable-next-line:variable-name
321const MatSpinner = MatProgressSpinner;
322
323/**
324 * @license
325 * Copyright Google LLC All Rights Reserved.
326 *
327 * Use of this source code is governed by an MIT-style license that can be
328 * found in the LICENSE file at https://angular.io/license
329 */
330
331/**
332 * Generated bundle index. Do not edit.
333 */
334
335export { MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS, MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY, MatProgressSpinner, MatProgressSpinnerModule, MatSpinner };
336//# sourceMappingURL=progress-spinner.mjs.map