[6a3a178] | 1 | import { InjectionToken, Component, ChangeDetectionStrategy, ViewEncapsulation, ElementRef, Optional, Inject, Input, NgModule } from '@angular/core';
|
---|
| 2 | import { DOCUMENT, CommonModule } from '@angular/common';
|
---|
| 3 | import { mixinColor, MatCommonModule } from '@angular/material/core';
|
---|
| 4 | import { coerceNumberProperty } from '@angular/cdk/coercion';
|
---|
| 5 | import { _getShadowRoot, Platform } from '@angular/cdk/platform';
|
---|
| 6 | import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations';
|
---|
| 7 |
|
---|
| 8 | /**
|
---|
| 9 | * @license
|
---|
| 10 | * Copyright Google LLC All Rights Reserved.
|
---|
| 11 | *
|
---|
| 12 | * Use of this source code is governed by an MIT-style license that can be
|
---|
| 13 | * found in the LICENSE file at https://angular.io/license
|
---|
| 14 | */
|
---|
| 15 | /**
|
---|
| 16 | * Base reference size of the spinner.
|
---|
| 17 | * @docs-private
|
---|
| 18 | */
|
---|
| 19 | const BASE_SIZE = 100;
|
---|
| 20 | /**
|
---|
| 21 | * Base reference stroke width of the spinner.
|
---|
| 22 | * @docs-private
|
---|
| 23 | */
|
---|
| 24 | const BASE_STROKE_WIDTH = 10;
|
---|
| 25 | // Boilerplate for applying mixins to MatProgressSpinner.
|
---|
| 26 | /** @docs-private */
|
---|
| 27 | const _MatProgressSpinnerBase = mixinColor(class {
|
---|
| 28 | constructor(_elementRef) {
|
---|
| 29 | this._elementRef = _elementRef;
|
---|
| 30 | }
|
---|
| 31 | }, 'primary');
|
---|
| 32 | /** Injection token to be used to override the default options for `mat-progress-spinner`. */
|
---|
| 33 | const MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS = new InjectionToken('mat-progress-spinner-default-options', {
|
---|
| 34 | providedIn: 'root',
|
---|
| 35 | factory: MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY,
|
---|
| 36 | });
|
---|
| 37 | /** @docs-private */
|
---|
| 38 | function MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY() {
|
---|
| 39 | return { diameter: BASE_SIZE };
|
---|
| 40 | }
|
---|
| 41 | // .0001 percentage difference is necessary in order to avoid unwanted animation frames
|
---|
| 42 | // for example because the animation duration is 4 seconds, .1% accounts to 4ms
|
---|
| 43 | // which are enough to see the flicker described in
|
---|
| 44 | // https://github.com/angular/components/issues/8984
|
---|
| 45 | const INDETERMINATE_ANIMATION_TEMPLATE = `
|
---|
| 46 | @keyframes mat-progress-spinner-stroke-rotate-DIAMETER {
|
---|
| 47 | 0% { stroke-dashoffset: START_VALUE; transform: rotate(0); }
|
---|
| 48 | 12.5% { stroke-dashoffset: END_VALUE; transform: rotate(0); }
|
---|
| 49 | 12.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(72.5deg); }
|
---|
| 50 | 25% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(72.5deg); }
|
---|
| 51 |
|
---|
| 52 | 25.0001% { stroke-dashoffset: START_VALUE; transform: rotate(270deg); }
|
---|
| 53 | 37.5% { stroke-dashoffset: END_VALUE; transform: rotate(270deg); }
|
---|
| 54 | 37.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(161.5deg); }
|
---|
| 55 | 50% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(161.5deg); }
|
---|
| 56 |
|
---|
| 57 | 50.0001% { stroke-dashoffset: START_VALUE; transform: rotate(180deg); }
|
---|
| 58 | 62.5% { stroke-dashoffset: END_VALUE; transform: rotate(180deg); }
|
---|
| 59 | 62.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(251.5deg); }
|
---|
| 60 | 75% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(251.5deg); }
|
---|
| 61 |
|
---|
| 62 | 75.0001% { stroke-dashoffset: START_VALUE; transform: rotate(90deg); }
|
---|
| 63 | 87.5% { stroke-dashoffset: END_VALUE; transform: rotate(90deg); }
|
---|
| 64 | 87.5001% { stroke-dashoffset: END_VALUE; transform: rotateX(180deg) rotate(341.5deg); }
|
---|
| 65 | 100% { stroke-dashoffset: START_VALUE; transform: rotateX(180deg) rotate(341.5deg); }
|
---|
| 66 | }
|
---|
| 67 | `;
|
---|
| 68 | /**
|
---|
| 69 | * `<mat-progress-spinner>` component.
|
---|
| 70 | */
|
---|
| 71 | class MatProgressSpinner extends _MatProgressSpinnerBase {
|
---|
| 72 | constructor(elementRef, platform, _document, animationMode, defaults) {
|
---|
| 73 | super(elementRef);
|
---|
| 74 | this._document = _document;
|
---|
| 75 | this._diameter = BASE_SIZE;
|
---|
| 76 | this._value = 0;
|
---|
| 77 | this._fallbackAnimation = false;
|
---|
| 78 | /** Mode of the progress circle */
|
---|
| 79 | this.mode = 'determinate';
|
---|
| 80 | const trackedDiameters = MatProgressSpinner._diameters;
|
---|
| 81 | this._spinnerAnimationLabel = this._getSpinnerAnimationLabel();
|
---|
| 82 | // The base size is already inserted via the component's structural styles. We still
|
---|
| 83 | // need to track it so we don't end up adding the same styles again.
|
---|
| 84 | if (!trackedDiameters.has(_document.head)) {
|
---|
| 85 | trackedDiameters.set(_document.head, new Set([BASE_SIZE]));
|
---|
| 86 | }
|
---|
| 87 | this._fallbackAnimation = platform.EDGE || platform.TRIDENT;
|
---|
| 88 | this._noopAnimations = animationMode === 'NoopAnimations' &&
|
---|
| 89 | (!!defaults && !defaults._forceAnimations);
|
---|
| 90 | if (defaults) {
|
---|
| 91 | if (defaults.diameter) {
|
---|
| 92 | this.diameter = defaults.diameter;
|
---|
| 93 | }
|
---|
| 94 | if (defaults.strokeWidth) {
|
---|
| 95 | this.strokeWidth = defaults.strokeWidth;
|
---|
| 96 | }
|
---|
| 97 | }
|
---|
| 98 | }
|
---|
| 99 | /** The diameter of the progress spinner (will set width and height of svg). */
|
---|
| 100 | get diameter() { return this._diameter; }
|
---|
| 101 | set diameter(size) {
|
---|
| 102 | this._diameter = coerceNumberProperty(size);
|
---|
| 103 | this._spinnerAnimationLabel = this._getSpinnerAnimationLabel();
|
---|
| 104 | // If this is set before `ngOnInit`, the style root may not have been resolved yet.
|
---|
| 105 | if (!this._fallbackAnimation && this._styleRoot) {
|
---|
| 106 | this._attachStyleNode();
|
---|
| 107 | }
|
---|
| 108 | }
|
---|
| 109 | /** Stroke width of the progress spinner. */
|
---|
| 110 | get strokeWidth() {
|
---|
| 111 | return this._strokeWidth || this.diameter / 10;
|
---|
| 112 | }
|
---|
| 113 | set strokeWidth(value) {
|
---|
| 114 | this._strokeWidth = coerceNumberProperty(value);
|
---|
| 115 | }
|
---|
| 116 | /** Value of the progress circle. */
|
---|
| 117 | get value() {
|
---|
| 118 | return this.mode === 'determinate' ? this._value : 0;
|
---|
| 119 | }
|
---|
| 120 | set value(newValue) {
|
---|
| 121 | this._value = Math.max(0, Math.min(100, coerceNumberProperty(newValue)));
|
---|
| 122 | }
|
---|
| 123 | ngOnInit() {
|
---|
| 124 | const element = this._elementRef.nativeElement;
|
---|
| 125 | // Note that we need to look up the root node in ngOnInit, rather than the constructor, because
|
---|
| 126 | // Angular seems to create the element outside the shadow root and then moves it inside, if the
|
---|
| 127 | // node is inside an `ngIf` and a ShadowDom-encapsulated component.
|
---|
| 128 | this._styleRoot = _getShadowRoot(element) || this._document.head;
|
---|
| 129 | this._attachStyleNode();
|
---|
| 130 | // On IE and Edge, we can't animate the `stroke-dashoffset`
|
---|
| 131 | // reliably so we fall back to a non-spec animation.
|
---|
| 132 | const animationClass = `mat-progress-spinner-indeterminate${this._fallbackAnimation ? '-fallback' : ''}-animation`;
|
---|
| 133 | element.classList.add(animationClass);
|
---|
| 134 | }
|
---|
| 135 | /** The radius of the spinner, adjusted for stroke width. */
|
---|
| 136 | _getCircleRadius() {
|
---|
| 137 | return (this.diameter - BASE_STROKE_WIDTH) / 2;
|
---|
| 138 | }
|
---|
| 139 | /** The view box of the spinner's svg element. */
|
---|
| 140 | _getViewBox() {
|
---|
| 141 | const viewBox = this._getCircleRadius() * 2 + this.strokeWidth;
|
---|
| 142 | return `0 0 ${viewBox} ${viewBox}`;
|
---|
| 143 | }
|
---|
| 144 | /** The stroke circumference of the svg circle. */
|
---|
| 145 | _getStrokeCircumference() {
|
---|
| 146 | return 2 * Math.PI * this._getCircleRadius();
|
---|
| 147 | }
|
---|
| 148 | /** The dash offset of the svg circle. */
|
---|
| 149 | _getStrokeDashOffset() {
|
---|
| 150 | if (this.mode === 'determinate') {
|
---|
| 151 | return this._getStrokeCircumference() * (100 - this._value) / 100;
|
---|
| 152 | }
|
---|
| 153 | // In fallback mode set the circle to 80% and rotate it with CSS.
|
---|
| 154 | if (this._fallbackAnimation && this.mode === 'indeterminate') {
|
---|
| 155 | return this._getStrokeCircumference() * 0.2;
|
---|
| 156 | }
|
---|
| 157 | return null;
|
---|
| 158 | }
|
---|
| 159 | /** Stroke width of the circle in percent. */
|
---|
| 160 | _getCircleStrokeWidth() {
|
---|
| 161 | return this.strokeWidth / this.diameter * 100;
|
---|
| 162 | }
|
---|
| 163 | /** Dynamically generates a style tag containing the correct animation for this diameter. */
|
---|
| 164 | _attachStyleNode() {
|
---|
| 165 | const styleRoot = this._styleRoot;
|
---|
| 166 | const currentDiameter = this._diameter;
|
---|
| 167 | const diameters = MatProgressSpinner._diameters;
|
---|
| 168 | let diametersForElement = diameters.get(styleRoot);
|
---|
| 169 | if (!diametersForElement || !diametersForElement.has(currentDiameter)) {
|
---|
| 170 | const styleTag = this._document.createElement('style');
|
---|
| 171 | styleTag.setAttribute('mat-spinner-animation', this._spinnerAnimationLabel);
|
---|
| 172 | styleTag.textContent = this._getAnimationText();
|
---|
| 173 | styleRoot.appendChild(styleTag);
|
---|
| 174 | if (!diametersForElement) {
|
---|
| 175 | diametersForElement = new Set();
|
---|
| 176 | diameters.set(styleRoot, diametersForElement);
|
---|
| 177 | }
|
---|
| 178 | diametersForElement.add(currentDiameter);
|
---|
| 179 | }
|
---|
| 180 | }
|
---|
| 181 | /** Generates animation styles adjusted for the spinner's diameter. */
|
---|
| 182 | _getAnimationText() {
|
---|
| 183 | const strokeCircumference = this._getStrokeCircumference();
|
---|
| 184 | return INDETERMINATE_ANIMATION_TEMPLATE
|
---|
| 185 | // Animation should begin at 5% and end at 80%
|
---|
| 186 | .replace(/START_VALUE/g, `${0.95 * strokeCircumference}`)
|
---|
| 187 | .replace(/END_VALUE/g, `${0.2 * strokeCircumference}`)
|
---|
| 188 | .replace(/DIAMETER/g, `${this._spinnerAnimationLabel}`);
|
---|
| 189 | }
|
---|
| 190 | /** Returns the circle diameter formatted for use with the animation-name CSS property. */
|
---|
| 191 | _getSpinnerAnimationLabel() {
|
---|
| 192 | // The string of a float point number will include a period ‘.’ character,
|
---|
| 193 | // which is not valid for a CSS animation-name.
|
---|
| 194 | return this.diameter.toString().replace('.', '_');
|
---|
| 195 | }
|
---|
| 196 | }
|
---|
| 197 | /**
|
---|
| 198 | * Tracks diameters of existing instances to de-dupe generated styles (default d = 100).
|
---|
| 199 | * We need to keep track of which elements the diameters were attached to, because for
|
---|
| 200 | * elements in the Shadow DOM the style tags are attached to the shadow root, rather
|
---|
| 201 | * than the document head.
|
---|
| 202 | */
|
---|
| 203 | MatProgressSpinner._diameters = new WeakMap();
|
---|
| 204 | MatProgressSpinner.decorators = [
|
---|
| 205 | { type: Component, args: [{
|
---|
| 206 | selector: 'mat-progress-spinner',
|
---|
| 207 | exportAs: 'matProgressSpinner',
|
---|
| 208 | host: {
|
---|
| 209 | 'role': 'progressbar',
|
---|
| 210 | 'class': 'mat-progress-spinner',
|
---|
| 211 | // set tab index to -1 so screen readers will read the aria-label
|
---|
| 212 | // Note: there is a known issue with JAWS that does not read progressbar aria labels on FireFox
|
---|
| 213 | 'tabindex': '-1',
|
---|
| 214 | '[class._mat-animation-noopable]': `_noopAnimations`,
|
---|
| 215 | '[style.width.px]': 'diameter',
|
---|
| 216 | '[style.height.px]': 'diameter',
|
---|
| 217 | '[attr.aria-valuemin]': 'mode === "determinate" ? 0 : null',
|
---|
| 218 | '[attr.aria-valuemax]': 'mode === "determinate" ? 100 : null',
|
---|
| 219 | '[attr.aria-valuenow]': 'mode === "determinate" ? value : null',
|
---|
| 220 | '[attr.mode]': 'mode',
|
---|
| 221 | },
|
---|
| 222 | inputs: ['color'],
|
---|
| 223 | 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. `focusable=\"false\"` prevents IE from allowing the user to\n tab into the SVG element.\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\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()\"></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()\"></circle>\n</svg>\n",
|
---|
| 224 | changeDetection: ChangeDetectionStrategy.OnPush,
|
---|
| 225 | encapsulation: ViewEncapsulation.None,
|
---|
| 226 | 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:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}._mat-animation-noopable.mat-progress-spinner circle{transition:none;animation:none}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:currentColor;stroke:CanvasText}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[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-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{animation:mat-progress-spinner-stroke-rotate-fallback 10000ms cubic-bezier(0.87, 0.03, 0.33, 1) infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition:none;animation: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)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0deg)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}\n"]
|
---|
| 227 | },] }
|
---|
| 228 | ];
|
---|
| 229 | MatProgressSpinner.ctorParameters = () => [
|
---|
| 230 | { type: ElementRef },
|
---|
| 231 | { type: Platform },
|
---|
| 232 | { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },
|
---|
| 233 | { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] },
|
---|
| 234 | { type: undefined, decorators: [{ type: Inject, args: [MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS,] }] }
|
---|
| 235 | ];
|
---|
| 236 | MatProgressSpinner.propDecorators = {
|
---|
| 237 | diameter: [{ type: Input }],
|
---|
| 238 | strokeWidth: [{ type: Input }],
|
---|
| 239 | mode: [{ type: Input }],
|
---|
| 240 | value: [{ type: Input }]
|
---|
| 241 | };
|
---|
| 242 | /**
|
---|
| 243 | * `<mat-spinner>` component.
|
---|
| 244 | *
|
---|
| 245 | * This is a component definition to be used as a convenience reference to create an
|
---|
| 246 | * indeterminate `<mat-progress-spinner>` instance.
|
---|
| 247 | */
|
---|
| 248 | class MatSpinner extends MatProgressSpinner {
|
---|
| 249 | constructor(elementRef, platform, document, animationMode, defaults) {
|
---|
| 250 | super(elementRef, platform, document, animationMode, defaults);
|
---|
| 251 | this.mode = 'indeterminate';
|
---|
| 252 | }
|
---|
| 253 | }
|
---|
| 254 | MatSpinner.decorators = [
|
---|
| 255 | { type: Component, args: [{
|
---|
| 256 | selector: 'mat-spinner',
|
---|
| 257 | host: {
|
---|
| 258 | 'role': 'progressbar',
|
---|
| 259 | 'mode': 'indeterminate',
|
---|
| 260 | 'class': 'mat-spinner mat-progress-spinner',
|
---|
| 261 | '[class._mat-animation-noopable]': `_noopAnimations`,
|
---|
| 262 | '[style.width.px]': 'diameter',
|
---|
| 263 | '[style.height.px]': 'diameter',
|
---|
| 264 | },
|
---|
| 265 | inputs: ['color'],
|
---|
| 266 | 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. `focusable=\"false\"` prevents IE from allowing the user to\n tab into the SVG element.\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\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()\"></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()\"></circle>\n</svg>\n",
|
---|
| 267 | changeDetection: ChangeDetectionStrategy.OnPush,
|
---|
| 268 | encapsulation: ViewEncapsulation.None,
|
---|
| 269 | 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:transparent;transform-origin:center;transition:stroke-dashoffset 225ms linear}._mat-animation-noopable.mat-progress-spinner circle{transition:none;animation:none}.cdk-high-contrast-active .mat-progress-spinner circle{stroke:currentColor;stroke:CanvasText}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{animation:mat-progress-spinner-linear-rotate 2000ms linear infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[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-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-animation[mode=indeterminate] circle{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{animation:mat-progress-spinner-stroke-rotate-fallback 10000ms cubic-bezier(0.87, 0.03, 0.33, 1) infinite}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] svg{transition:none;animation:none}.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition-property:stroke}._mat-animation-noopable.mat-progress-spinner.mat-progress-spinner-indeterminate-fallback-animation[mode=indeterminate] circle{transition:none;animation: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)}}@keyframes mat-progress-spinner-stroke-rotate-fallback{0%{transform:rotate(0deg)}25%{transform:rotate(1170deg)}50%{transform:rotate(2340deg)}75%{transform:rotate(3510deg)}100%{transform:rotate(4680deg)}}\n"]
|
---|
| 270 | },] }
|
---|
| 271 | ];
|
---|
| 272 | MatSpinner.ctorParameters = () => [
|
---|
| 273 | { type: ElementRef },
|
---|
| 274 | { type: Platform },
|
---|
| 275 | { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },
|
---|
| 276 | { type: String, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE,] }] },
|
---|
| 277 | { type: undefined, decorators: [{ type: Inject, args: [MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS,] }] }
|
---|
| 278 | ];
|
---|
| 279 |
|
---|
| 280 | /**
|
---|
| 281 | * @license
|
---|
| 282 | * Copyright Google LLC All Rights Reserved.
|
---|
| 283 | *
|
---|
| 284 | * Use of this source code is governed by an MIT-style license that can be
|
---|
| 285 | * found in the LICENSE file at https://angular.io/license
|
---|
| 286 | */
|
---|
| 287 | class MatProgressSpinnerModule {
|
---|
| 288 | }
|
---|
| 289 | MatProgressSpinnerModule.decorators = [
|
---|
| 290 | { type: NgModule, args: [{
|
---|
| 291 | imports: [MatCommonModule, CommonModule],
|
---|
| 292 | exports: [
|
---|
| 293 | MatProgressSpinner,
|
---|
| 294 | MatSpinner,
|
---|
| 295 | MatCommonModule
|
---|
| 296 | ],
|
---|
| 297 | declarations: [
|
---|
| 298 | MatProgressSpinner,
|
---|
| 299 | MatSpinner
|
---|
| 300 | ],
|
---|
| 301 | },] }
|
---|
| 302 | ];
|
---|
| 303 |
|
---|
| 304 | /**
|
---|
| 305 | * @license
|
---|
| 306 | * Copyright Google LLC All Rights Reserved.
|
---|
| 307 | *
|
---|
| 308 | * Use of this source code is governed by an MIT-style license that can be
|
---|
| 309 | * found in the LICENSE file at https://angular.io/license
|
---|
| 310 | */
|
---|
| 311 |
|
---|
| 312 | /**
|
---|
| 313 | * Generated bundle index. Do not edit.
|
---|
| 314 | */
|
---|
| 315 |
|
---|
| 316 | export { MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS, MAT_PROGRESS_SPINNER_DEFAULT_OPTIONS_FACTORY, MatProgressSpinner, MatProgressSpinnerModule, MatSpinner };
|
---|
| 317 | //# sourceMappingURL=progress-spinner.js.map
|
---|