{"version":3,"file":"progress-bar.js","sources":["../../../src/material/progress-bar/progress-bar-module.ts","../../../src/material/progress-bar/progress-bar.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {NgModule} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatCommonModule} from '@angular/material/core';\nimport {MatProgressBar} from './progress-bar';\n\n\n@NgModule({\n  imports: [CommonModule, MatCommonModule],\n  exports: [MatProgressBar, MatCommonModule],\n  declarations: [MatProgressBar],\n})\nexport class MatProgressBarModule {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n  Component,\n  ChangeDetectionStrategy,\n  ElementRef,\n  Inject,\n  Input,\n  Output,\n  EventEmitter,\n  Optional,\n  NgZone,\n  ViewEncapsulation,\n  AfterViewInit,\n  ViewChild,\n  OnDestroy,\n  InjectionToken,\n  inject,\n} from '@angular/core';\nimport {fromEvent, Subscription, Observable} from 'rxjs';\nimport {filter} from 'rxjs/operators';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {CanColor, CanColorCtor, mixinColor} from '@angular/material/core';\nimport {DOCUMENT} from '@angular/common';\n\n// TODO(josephperrott): Benchpress tests.\n// TODO(josephperrott): Add ARIA attributes for progress bar \"for\".\n\n/** Last animation end data. */\nexport interface ProgressAnimationEnd {\n  value: number;\n}\n\n// Boilerplate for applying mixins to MatProgressBar.\n/** @docs-private */\nclass MatProgressBarBase {\n  constructor(public _elementRef: ElementRef) { }\n}\n\nconst _MatProgressBarMixinBase: CanColorCtor & typeof MatProgressBarBase =\n    mixinColor(MatProgressBarBase, 'primary');\n\n/**\n * Injection token used to provide the current location to `MatProgressBar`.\n * Used to handle server-side rendering and to stub out during unit tests.\n * @docs-private\n */\nexport const MAT_PROGRESS_BAR_LOCATION = new InjectionToken<MatProgressBarLocation>(\n  'mat-progress-bar-location',\n  {providedIn: 'root', factory: MAT_PROGRESS_BAR_LOCATION_FACTORY}\n);\n\n/**\n * Stubbed out location for `MatProgressBar`.\n * @docs-private\n */\nexport interface MatProgressBarLocation {\n  getPathname: () => string;\n}\n\n/** @docs-private */\nexport function MAT_PROGRESS_BAR_LOCATION_FACTORY(): MatProgressBarLocation {\n  const _document = inject(DOCUMENT);\n  const _location = _document ? _document.location : null;\n\n  return {\n    // Note that this needs to be a function, rather than a property, because Angular\n    // will only resolve it once, but we want the current path on each call.\n    getPathname: () => _location ? (_location.pathname + _location.search) : ''\n  };\n}\n\n\n/** Counter used to generate unique IDs for progress bars. */\nlet progressbarId = 0;\n\n/**\n * `<mat-progress-bar>` component.\n */\n@Component({\n  moduleId: module.id,\n  selector: 'mat-progress-bar',\n  exportAs: 'matProgressBar',\n  host: {\n    'role': 'progressbar',\n    'aria-valuemin': '0',\n    'aria-valuemax': '100',\n    '[attr.aria-valuenow]': '(mode === \"indeterminate\" || mode === \"query\") ? null : value',\n    '[attr.mode]': 'mode',\n    'class': 'mat-progress-bar',\n    '[class._mat-animation-noopable]': '_isNoopAnimation',\n  },\n  inputs: ['color'],\n  templateUrl: 'progress-bar.html',\n  styleUrls: ['progress-bar.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n})\nexport class MatProgressBar extends _MatProgressBarMixinBase implements CanColor,\n                                                      AfterViewInit, OnDestroy {\n  constructor(public _elementRef: ElementRef, private _ngZone: NgZone,\n              @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string,\n              /**\n               * @deprecated `location` parameter to be made required.\n               * @breaking-change 8.0.0\n               */\n              @Optional() @Inject(MAT_PROGRESS_BAR_LOCATION) location?: MatProgressBarLocation) {\n    super(_elementRef);\n\n    // We need to prefix the SVG reference with the current path, otherwise they won't work\n    // in Safari if the page has a `<base>` tag. Note that we need quotes inside the `url()`,\n\n    // because named route URLs can contain parentheses (see #12338). Also we don't use since\n    // we can't tell the difference between whether\n    // the consumer is using the hash location strategy or not, because `Location` normalizes\n    // both `/#/foo/bar` and `/foo/bar` to the same thing.\n    const path = location ? location.getPathname().split('#')[0] : '';\n    this._rectangleFillValue = `url('${path}#${this.progressbarId}')`;\n    this._isNoopAnimation = _animationMode === 'NoopAnimations';\n  }\n\n  /** Flag that indicates whether NoopAnimations mode is set to true. */\n  _isNoopAnimation = false;\n\n  /** Value of the progress bar. Defaults to zero. Mirrored to aria-valuenow. */\n  @Input()\n  get value(): number { return this._value; }\n  set value(v: number) {\n    this._value = clamp(v || 0);\n\n    // When noop animation is set to true, trigger animationEnd directly.\n    if (this._isNoopAnimation) {\n      this._emitAnimationEnd();\n    }\n  }\n  private _value: number = 0;\n\n  /** Buffer value of the progress bar. Defaults to zero. */\n  @Input()\n  get bufferValue(): number { return this._bufferValue; }\n  set bufferValue(v: number) { this._bufferValue = clamp(v || 0); }\n  private _bufferValue: number = 0;\n\n  @ViewChild('primaryValueBar', {static: false}) _primaryValueBar: ElementRef;\n\n  /**\n   * Event emitted when animation of the primary progress bar completes. This event will not\n   * be emitted when animations are disabled, nor will it be emitted for modes with continuous\n   * animations (indeterminate and query).\n   */\n  @Output() animationEnd = new EventEmitter<ProgressAnimationEnd>();\n\n  /** Reference to animation end subscription to be unsubscribed on destroy. */\n  private _animationEndSubscription: Subscription = Subscription.EMPTY;\n\n  /**\n   * Mode of the progress bar.\n   *\n   * Input must be one of these values: determinate, indeterminate, buffer, query, defaults to\n   * 'determinate'.\n   * Mirrored to mode attribute.\n   */\n  @Input() mode: 'determinate' | 'indeterminate' | 'buffer' | 'query' = 'determinate';\n\n  /** ID of the progress bar. */\n  progressbarId = `mat-progress-bar-${progressbarId++}`;\n\n  /** Attribute to be used for the `fill` attribute on the internal `rect` element. */\n  _rectangleFillValue: string;\n\n  /** Gets the current transform value for the progress bar's primary indicator. */\n  _primaryTransform() {\n    const scale = this.value / 100;\n    return {transform: `scaleX(${scale})`};\n  }\n\n  /**\n   * Gets the current transform value for the progress bar's buffer indicator. Only used if the\n   * progress mode is set to buffer, otherwise returns an undefined, causing no transformation.\n   */\n  _bufferTransform() {\n    if (this.mode === 'buffer') {\n      const scale = this.bufferValue / 100;\n      return {transform: `scaleX(${scale})`};\n    }\n  }\n\n  ngAfterViewInit() {\n    if (!this._isNoopAnimation) {\n      // Run outside angular so change detection didn't get triggered on every transition end\n      // instead only on the animation that we care about (primary value bar's transitionend)\n      this._ngZone.runOutsideAngular((() => {\n        const element = this._primaryValueBar.nativeElement;\n\n        this._animationEndSubscription =\n            (fromEvent(element, 'transitionend') as Observable<TransitionEvent>)\n              .pipe(filter(((e: TransitionEvent) => e.target === element)))\n              .subscribe(() => this._ngZone.run(() => this._emitAnimationEnd()));\n      }));\n    }\n  }\n\n  ngOnDestroy() {\n    this._animationEndSubscription.unsubscribe();\n  }\n\n  /** Emit an animationEnd event if in determinate or buffer mode. */\n  private _emitAnimationEnd(): void {\n    if (this.mode === 'determinate' || this.mode === 'buffer') {\n      this.animationEnd.next({value: this.value});\n    }\n  }\n}\n\n/** Clamps a value to be between two numbers, by default 0 and 100. */\nfunction clamp(v: number, min = 0, max = 100) {\n  return Math.max(min, Math.min(max, v));\n}\n"],"names":[],"mappings":"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"}