{"version":3,"file":"slider.js","sources":["../../../../../../src/material/slider/slider.ts","../../../../../../src/material/slider/slider-module.ts","../../../../../../src/material/slider/public-api.ts","../../../../../../src/material/slider/index.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 {FocusMonitor, FocusOrigin} from '@angular/cdk/a11y';\nimport {Directionality} from '@angular/cdk/bidi';\nimport {\n  BooleanInput,\n  coerceBooleanProperty,\n  coerceNumberProperty,\n  NumberInput\n} from '@angular/cdk/coercion';\nimport {\n  DOWN_ARROW,\n  END,\n  HOME,\n  LEFT_ARROW,\n  PAGE_DOWN,\n  PAGE_UP,\n  RIGHT_ARROW,\n  UP_ARROW,\n  hasModifierKey,\n} from '@angular/cdk/keycodes';\nimport {\n  Attribute,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  forwardRef,\n  Inject,\n  Input,\n  OnDestroy,\n  Optional,\n  Output,\n  ViewChild,\n  ViewEncapsulation,\n  NgZone,\n  AfterViewInit,\n} from '@angular/core';\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from '@angular/forms';\nimport {\n  CanColor,\n  CanColorCtor,\n  CanDisable,\n  CanDisableCtor,\n  HasTabIndex,\n  HasTabIndexCtor,\n  mixinColor,\n  mixinDisabled,\n  mixinTabIndex,\n} from '@angular/material/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {normalizePassiveListenerOptions} from '@angular/cdk/platform';\nimport {DOCUMENT} from '@angular/common';\nimport {Subscription} from 'rxjs';\n\nconst activeEventOptions = normalizePassiveListenerOptions({passive: false});\n\n/**\n * Visually, a 30px separation between tick marks looks best. This is very subjective but it is\n * the default separation we chose.\n */\nconst MIN_AUTO_TICK_SEPARATION = 30;\n\n/** The thumb gap size for a disabled slider. */\nconst DISABLED_THUMB_GAP = 7;\n\n/** The thumb gap size for a non-active slider at its minimum value. */\nconst MIN_VALUE_NONACTIVE_THUMB_GAP = 7;\n\n/** The thumb gap size for an active slider at its minimum value. */\nconst MIN_VALUE_ACTIVE_THUMB_GAP = 10;\n\n/**\n * Provider Expression that allows mat-slider to register as a ControlValueAccessor.\n * This allows it to support [(ngModel)] and [formControl].\n * @docs-private\n */\nexport const MAT_SLIDER_VALUE_ACCESSOR: any = {\n  provide: NG_VALUE_ACCESSOR,\n  useExisting: forwardRef(() => MatSlider),\n  multi: true\n};\n\n/** A simple change event emitted by the MatSlider component. */\nexport class MatSliderChange {\n  /** The MatSlider that changed. */\n  source: MatSlider;\n\n  /** The new value of the source slider. */\n  value: number | null;\n}\n\n// Boilerplate for applying mixins to MatSlider.\n/** @docs-private */\nclass MatSliderBase {\n  constructor(public _elementRef: ElementRef) {}\n}\nconst _MatSliderMixinBase:\n    HasTabIndexCtor &\n    CanColorCtor &\n    CanDisableCtor &\n    typeof MatSliderBase =\n        mixinTabIndex(mixinColor(mixinDisabled(MatSliderBase), 'accent'));\n\n/**\n * Allows users to select from a range of values by moving the slider thumb. It is similar in\n * behavior to the native `<input type=\"range\">` element.\n */\n@Component({\n  selector: 'mat-slider',\n  exportAs: 'matSlider',\n  providers: [MAT_SLIDER_VALUE_ACCESSOR],\n  host: {\n    '(focus)': '_onFocus()',\n    '(blur)': '_onBlur()',\n    '(keydown)': '_onKeydown($event)',\n    '(keyup)': '_onKeyup()',\n    '(mouseenter)': '_onMouseenter()',\n\n    // On Safari starting to slide temporarily triggers text selection mode which\n    // show the wrong cursor. We prevent it by stopping the `selectstart` event.\n    '(selectstart)': '$event.preventDefault()',\n    'class': 'mat-slider mat-focus-indicator',\n    'role': 'slider',\n    '[tabIndex]': 'tabIndex',\n    '[attr.aria-disabled]': 'disabled',\n    '[attr.aria-valuemax]': 'max',\n    '[attr.aria-valuemin]': 'min',\n    '[attr.aria-valuenow]': 'value',\n\n    // NVDA and Jaws appear to announce the `aria-valuenow` by calculating its percentage based\n    // on its value between `aria-valuemin` and `aria-valuemax`. Due to how decimals are handled,\n    // it can cause the slider to read out a very long value like 0.20000068 if the current value\n    // is 0.2 with a min of 0 and max of 1. We work around the issue by setting `aria-valuetext`\n    // to the same value that we set on the slider's thumb which will be truncated.\n    '[attr.aria-valuetext]': 'valueText == null ? displayValue : valueText',\n    '[attr.aria-orientation]': 'vertical ? \"vertical\" : \"horizontal\"',\n    '[class.mat-slider-disabled]': 'disabled',\n    '[class.mat-slider-has-ticks]': 'tickInterval',\n    '[class.mat-slider-horizontal]': '!vertical',\n    '[class.mat-slider-axis-inverted]': '_shouldInvertAxis()',\n    // Class binding which is only used by the test harness as there is no other\n    // way for the harness to detect if mouse coordinates need to be inverted.\n    '[class.mat-slider-invert-mouse-coords]': '_shouldInvertMouseCoords()',\n    '[class.mat-slider-sliding]': '_isSliding',\n    '[class.mat-slider-thumb-label-showing]': 'thumbLabel',\n    '[class.mat-slider-vertical]': 'vertical',\n    '[class.mat-slider-min-value]': '_isMinValue()',\n    '[class.mat-slider-hide-last-tick]':\n        'disabled || _isMinValue() && _getThumbGap() && _shouldInvertAxis()',\n    '[class._mat-animation-noopable]': '_animationMode === \"NoopAnimations\"',\n  },\n  templateUrl: 'slider.html',\n  styleUrls: ['slider.css'],\n  inputs: ['disabled', 'color', 'tabIndex'],\n  encapsulation: ViewEncapsulation.None,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatSlider extends _MatSliderMixinBase\n    implements ControlValueAccessor, OnDestroy, CanDisable, CanColor, AfterViewInit, HasTabIndex {\n  /** Whether the slider is inverted. */\n  @Input()\n  get invert(): boolean { return this._invert; }\n  set invert(value: boolean) {\n    this._invert = coerceBooleanProperty(value);\n  }\n  private _invert = false;\n\n  /** The maximum value that the slider can have. */\n  @Input()\n  get max(): number { return this._max; }\n  set max(v: number) {\n    this._max = coerceNumberProperty(v, this._max);\n    this._percent = this._calculatePercentage(this._value);\n\n    // Since this also modifies the percentage, we need to let the change detection know.\n    this._changeDetectorRef.markForCheck();\n  }\n  private _max: number = 100;\n\n  /** The minimum value that the slider can have. */\n  @Input()\n  get min(): number { return this._min; }\n  set min(v: number) {\n    this._min = coerceNumberProperty(v, this._min);\n\n    // If the value wasn't explicitly set by the user, set it to the min.\n    if (this._value === null) {\n      this.value = this._min;\n    }\n    this._percent = this._calculatePercentage(this._value);\n\n    // Since this also modifies the percentage, we need to let the change detection know.\n    this._changeDetectorRef.markForCheck();\n  }\n  private _min: number = 0;\n\n  /** The values at which the thumb will snap. */\n  @Input()\n  get step(): number { return this._step; }\n  set step(v: number) {\n    this._step = coerceNumberProperty(v, this._step);\n\n    if (this._step % 1 !== 0) {\n      this._roundToDecimal = this._step.toString().split('.').pop()!.length;\n    }\n\n    // Since this could modify the label, we need to notify the change detection.\n    this._changeDetectorRef.markForCheck();\n  }\n  private _step: number = 1;\n\n  /** Whether or not to show the thumb label. */\n  @Input()\n  get thumbLabel(): boolean { return this._thumbLabel; }\n  set thumbLabel(value: boolean) { this._thumbLabel = coerceBooleanProperty(value); }\n  private _thumbLabel: boolean = false;\n\n  /**\n   * How often to show ticks. Relative to the step so that a tick always appears on a step.\n   * Ex: Tick interval of 4 with a step of 3 will draw a tick every 4 steps (every 12 values).\n   */\n  @Input()\n  get tickInterval() { return this._tickInterval; }\n  set tickInterval(value: 'auto' | number) {\n    if (value === 'auto') {\n      this._tickInterval = 'auto';\n    } else if (typeof value === 'number' || typeof value === 'string') {\n      this._tickInterval = coerceNumberProperty(value, this._tickInterval as number);\n    } else {\n      this._tickInterval = 0;\n    }\n  }\n  private _tickInterval: 'auto' | number = 0;\n\n  /** Value of the slider. */\n  @Input()\n  get value(): number | null {\n    // If the value needs to be read and it is still uninitialized, initialize it to the min.\n    if (this._value === null) {\n      this.value = this._min;\n    }\n    return this._value;\n  }\n  set value(v: number | null) {\n    if (v !== this._value) {\n      let value = coerceNumberProperty(v);\n\n      // While incrementing by a decimal we can end up with values like 33.300000000000004.\n      // Truncate it to ensure that it matches the label and to make it easier to work with.\n      if (this._roundToDecimal && value !== this.min && value !== this.max) {\n        value = parseFloat(value.toFixed(this._roundToDecimal));\n      }\n\n      this._value = value;\n      this._percent = this._calculatePercentage(this._value);\n\n      // Since this also modifies the percentage, we need to let the change detection know.\n      this._changeDetectorRef.markForCheck();\n    }\n  }\n  private _value: number | null = null;\n\n  /**\n   * Function that will be used to format the value before it is displayed\n   * in the thumb label. Can be used to format very large number in order\n   * for them to fit into the slider thumb.\n   */\n  @Input() displayWith: (value: number) => string | number;\n\n  /** Text corresponding to the slider's value. Used primarily for improved accessibility. */\n  @Input() valueText: string;\n\n  /** Whether the slider is vertical. */\n  @Input()\n  get vertical(): boolean { return this._vertical; }\n  set vertical(value: boolean) {\n    this._vertical = coerceBooleanProperty(value);\n  }\n  private _vertical = false;\n\n  /** Event emitted when the slider value has changed. */\n  @Output() readonly change: EventEmitter<MatSliderChange> = new EventEmitter<MatSliderChange>();\n\n  /** Event emitted when the slider thumb moves. */\n  @Output() readonly input: EventEmitter<MatSliderChange> = new EventEmitter<MatSliderChange>();\n\n  /**\n   * Emits when the raw value of the slider changes. This is here primarily\n   * to facilitate the two-way binding for the `value` input.\n   * @docs-private\n   */\n  @Output() readonly valueChange: EventEmitter<number | null> = new EventEmitter<number | null>();\n\n  /** The value to be used for display purposes. */\n  get displayValue(): string | number {\n    if (this.displayWith) {\n      // Value is never null but since setters and getters cannot have\n      // different types, the value getter is also typed to return null.\n      return this.displayWith(this.value!);\n    }\n\n    // Note that this could be improved further by rounding something like 0.999 to 1 or\n    // 0.899 to 0.9, however it is very performance sensitive, because it gets called on\n    // every change detection cycle.\n    if (this._roundToDecimal && this.value && this.value % 1 !== 0) {\n      return this.value.toFixed(this._roundToDecimal);\n    }\n\n    return this.value || 0;\n  }\n\n  /** set focus to the host element */\n  focus(options?: FocusOptions) {\n    this._focusHostElement(options);\n  }\n\n  /** blur the host element */\n  blur() {\n    this._blurHostElement();\n  }\n\n  /** onTouch function registered via registerOnTouch (ControlValueAccessor). */\n  onTouched: () => any = () => {};\n\n  /** The percentage of the slider that coincides with the value. */\n  get percent(): number { return this._clamp(this._percent); }\n  private _percent: number = 0;\n\n  /**\n   * Whether or not the thumb is sliding.\n   * Used to determine if there should be a transition for the thumb and fill track.\n   */\n  _isSliding: boolean = false;\n\n  /**\n   * Whether or not the slider is active (clicked or sliding).\n   * Used to shrink and grow the thumb as according to the Material Design spec.\n   */\n  _isActive: boolean = false;\n\n  /**\n   * Whether the axis of the slider is inverted.\n   * (i.e. whether moving the thumb in the positive x or y direction decreases the slider's value).\n   */\n  _shouldInvertAxis() {\n    // Standard non-inverted mode for a vertical slider should be dragging the thumb from bottom to\n    // top. However from a y-axis standpoint this is inverted.\n    return this.vertical ? !this.invert : this.invert;\n  }\n\n\n  /** Whether the slider is at its minimum value. */\n  _isMinValue() {\n    return this.percent === 0;\n  }\n\n  /**\n   * The amount of space to leave between the slider thumb and the track fill & track background\n   * elements.\n   */\n  _getThumbGap() {\n    if (this.disabled) {\n      return DISABLED_THUMB_GAP;\n    }\n    if (this._isMinValue() && !this.thumbLabel) {\n      return this._isActive ? MIN_VALUE_ACTIVE_THUMB_GAP : MIN_VALUE_NONACTIVE_THUMB_GAP;\n    }\n    return 0;\n  }\n\n  /** CSS styles for the track background element. */\n  _getTrackBackgroundStyles(): { [key: string]: string } {\n    const axis = this.vertical ? 'Y' : 'X';\n    const scale = this.vertical ? `1, ${1 - this.percent}, 1` : `${1 - this.percent}, 1, 1`;\n    const sign = this._shouldInvertMouseCoords() ? '-' : '';\n\n    return {\n      // scale3d avoids some rendering issues in Chrome. See #12071.\n      transform: `translate${axis}(${sign}${this._getThumbGap()}px) scale3d(${scale})`\n    };\n  }\n\n  /** CSS styles for the track fill element. */\n  _getTrackFillStyles(): { [key: string]: string } {\n    const percent = this.percent;\n    const axis = this.vertical ? 'Y' : 'X';\n    const scale = this.vertical ? `1, ${percent}, 1` : `${percent}, 1, 1`;\n    const sign = this._shouldInvertMouseCoords() ? '' : '-';\n\n    return {\n      // scale3d avoids some rendering issues in Chrome. See #12071.\n      transform: `translate${axis}(${sign}${this._getThumbGap()}px) scale3d(${scale})`,\n      // iOS Safari has a bug where it won't re-render elements which start of as `scale(0)` until\n      // something forces a style recalculation on it. Since we'll end up with `scale(0)` when\n      // the value of the slider is 0, we can easily get into this situation. We force a\n      // recalculation by changing the element's `display` when it goes from 0 to any other value.\n      display: percent === 0 ? 'none' : ''\n    };\n  }\n\n  /** CSS styles for the ticks container element. */\n  _getTicksContainerStyles(): { [key: string]: string } {\n    let axis = this.vertical ? 'Y' : 'X';\n    // For a horizontal slider in RTL languages we push the ticks container off the left edge\n    // instead of the right edge to avoid causing a horizontal scrollbar to appear.\n    let sign = !this.vertical && this._getDirection() == 'rtl' ? '' : '-';\n    let offset = this._tickIntervalPercent / 2 * 100;\n    return {\n      'transform': `translate${axis}(${sign}${offset}%)`\n    };\n  }\n\n  /** CSS styles for the ticks element. */\n  _getTicksStyles(): { [key: string]: string } {\n    let tickSize = this._tickIntervalPercent * 100;\n    let backgroundSize = this.vertical ? `2px ${tickSize}%` : `${tickSize}% 2px`;\n    let axis = this.vertical ? 'Y' : 'X';\n    // Depending on the direction we pushed the ticks container, push the ticks the opposite\n    // direction to re-center them but clip off the end edge. In RTL languages we need to flip the\n    // ticks 180 degrees so we're really cutting off the end edge abd not the start.\n    let sign = !this.vertical && this._getDirection() == 'rtl' ? '-' : '';\n    let rotate = !this.vertical && this._getDirection() == 'rtl' ? ' rotate(180deg)' : '';\n    let styles: { [key: string]: string } = {\n      'backgroundSize': backgroundSize,\n      // Without translateZ ticks sometimes jitter as the slider moves on Chrome & Firefox.\n      'transform': `translateZ(0) translate${axis}(${sign}${tickSize / 2}%)${rotate}`\n    };\n\n    if (this._isMinValue() && this._getThumbGap()) {\n      const shouldInvertAxis = this._shouldInvertAxis();\n      let side: string;\n\n      if (this.vertical) {\n        side = shouldInvertAxis ? 'Bottom' : 'Top';\n      } else {\n        side = shouldInvertAxis ? 'Right' : 'Left';\n      }\n\n      styles[`padding${side}`] = `${this._getThumbGap()}px`;\n    }\n\n    return styles;\n  }\n\n  _getThumbContainerStyles(): { [key: string]: string } {\n    const shouldInvertAxis = this._shouldInvertAxis();\n    let axis = this.vertical ? 'Y' : 'X';\n    // For a horizontal slider in RTL languages we push the thumb container off the left edge\n    // instead of the right edge to avoid causing a horizontal scrollbar to appear.\n    let invertOffset =\n        (this._getDirection() == 'rtl' && !this.vertical) ? !shouldInvertAxis : shouldInvertAxis;\n    let offset = (invertOffset ? this.percent : 1 - this.percent) * 100;\n    return {\n      'transform': `translate${axis}(-${offset}%)`\n    };\n  }\n\n  /** The size of a tick interval as a percentage of the size of the track. */\n  private _tickIntervalPercent: number = 0;\n\n  /** The dimensions of the slider. */\n  private _sliderDimensions: ClientRect | null = null;\n\n  private _controlValueAccessorChangeFn: (value: any) => void = () => {};\n\n  /** Decimal places to round to, based on the step amount. */\n  private _roundToDecimal: number;\n\n  /** Subscription to the Directionality change EventEmitter. */\n  private _dirChangeSubscription = Subscription.EMPTY;\n\n  /** The value of the slider when the slide start event fires. */\n  private _valueOnSlideStart: number | null;\n\n  /** Reference to the inner slider wrapper element. */\n  @ViewChild('sliderWrapper') private _sliderWrapper: ElementRef;\n\n  /**\n   * Whether mouse events should be converted to a slider position by calculating their distance\n   * from the right or bottom edge of the slider as opposed to the top or left.\n   */\n  _shouldInvertMouseCoords() {\n    const shouldInvertAxis = this._shouldInvertAxis();\n    return (this._getDirection() == 'rtl' && !this.vertical) ? !shouldInvertAxis : shouldInvertAxis;\n  }\n\n  /** The language direction for this slider element. */\n  private _getDirection() {\n    return (this._dir && this._dir.value == 'rtl') ? 'rtl' : 'ltr';\n  }\n\n  /** Keeps track of the last pointer event that was captured by the slider. */\n  private _lastPointerEvent: MouseEvent | TouchEvent | null;\n\n  /** Used to subscribe to global move and end events */\n  protected _document: Document;\n\n  constructor(elementRef: ElementRef,\n              private _focusMonitor: FocusMonitor,\n              private _changeDetectorRef: ChangeDetectorRef,\n              @Optional() private _dir: Directionality,\n              @Attribute('tabindex') tabIndex: string,\n              private _ngZone: NgZone,\n              @Inject(DOCUMENT) _document: any,\n              @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string) {\n    super(elementRef);\n    this._document = _document;\n    this.tabIndex = parseInt(tabIndex) || 0;\n\n    _ngZone.runOutsideAngular(() => {\n      const element = elementRef.nativeElement;\n      element.addEventListener('mousedown', this._pointerDown, activeEventOptions);\n      element.addEventListener('touchstart', this._pointerDown, activeEventOptions);\n    });\n  }\n\n  ngAfterViewInit() {\n    this._focusMonitor\n        .monitor(this._elementRef, true)\n        .subscribe((origin: FocusOrigin) => {\n          this._isActive = !!origin && origin !== 'keyboard';\n          this._changeDetectorRef.detectChanges();\n        });\n    if (this._dir) {\n      this._dirChangeSubscription = this._dir.change.subscribe(() => {\n        this._changeDetectorRef.markForCheck();\n      });\n    }\n  }\n\n  ngOnDestroy() {\n    const element = this._elementRef.nativeElement;\n    element.removeEventListener('mousedown', this._pointerDown, activeEventOptions);\n    element.removeEventListener('touchstart', this._pointerDown, activeEventOptions);\n    this._lastPointerEvent = null;\n    this._removeGlobalEvents();\n    this._focusMonitor.stopMonitoring(this._elementRef);\n    this._dirChangeSubscription.unsubscribe();\n  }\n\n  _onMouseenter() {\n    if (this.disabled) {\n      return;\n    }\n\n    // We save the dimensions of the slider here so we can use them to update the spacing of the\n    // ticks and determine where on the slider click and slide events happen.\n    this._sliderDimensions = this._getSliderDimensions();\n    this._updateTickIntervalPercent();\n  }\n\n  _onFocus() {\n    // We save the dimensions of the slider here so we can use them to update the spacing of the\n    // ticks and determine where on the slider click and slide events happen.\n    this._sliderDimensions = this._getSliderDimensions();\n    this._updateTickIntervalPercent();\n  }\n\n  _onBlur() {\n    this.onTouched();\n  }\n\n  _onKeydown(event: KeyboardEvent) {\n    if (this.disabled || hasModifierKey(event)) {\n      return;\n    }\n\n    const oldValue = this.value;\n\n    switch (event.keyCode) {\n      case PAGE_UP:\n        this._increment(10);\n        break;\n      case PAGE_DOWN:\n        this._increment(-10);\n        break;\n      case END:\n        this.value = this.max;\n        break;\n      case HOME:\n        this.value = this.min;\n        break;\n      case LEFT_ARROW:\n        // NOTE: For a sighted user it would make more sense that when they press an arrow key on an\n        // inverted slider the thumb moves in that direction. However for a blind user, nothing\n        // about the slider indicates that it is inverted. They will expect left to be decrement,\n        // regardless of how it appears on the screen. For speakers ofRTL languages, they probably\n        // expect left to mean increment. Therefore we flip the meaning of the side arrow keys for\n        // RTL. For inverted sliders we prefer a good a11y experience to having it \"look right\" for\n        // sighted users, therefore we do not swap the meaning.\n        this._increment(this._getDirection() == 'rtl' ? 1 : -1);\n        break;\n      case UP_ARROW:\n        this._increment(1);\n        break;\n      case RIGHT_ARROW:\n        // See comment on LEFT_ARROW about the conditions under which we flip the meaning.\n        this._increment(this._getDirection() == 'rtl' ? -1 : 1);\n        break;\n      case DOWN_ARROW:\n        this._increment(-1);\n        break;\n      default:\n        // Return if the key is not one that we explicitly handle to avoid calling preventDefault on\n        // it.\n        return;\n    }\n\n    if (oldValue != this.value) {\n      this._emitInputEvent();\n      this._emitChangeEvent();\n    }\n\n    this._isSliding = true;\n    event.preventDefault();\n  }\n\n  _onKeyup() {\n    this._isSliding = false;\n  }\n\n  /** Called when the user has put their pointer down on the slider. */\n  private _pointerDown = (event: TouchEvent | MouseEvent) => {\n    // Don't do anything if the slider is disabled or the\n    // user is using anything other than the main mouse button.\n    if (this.disabled || this._isSliding || (!isTouchEvent(event) && event.button !== 0)) {\n      return;\n    }\n\n    this._ngZone.run(() => {\n      const oldValue = this.value;\n      const pointerPosition = getPointerPositionOnPage(event);\n      this._isSliding = true;\n      this._lastPointerEvent = event;\n      event.preventDefault();\n      this._focusHostElement();\n      this._onMouseenter(); // Simulate mouseenter in case this is a mobile device.\n      this._bindGlobalEvents(event);\n      this._focusHostElement();\n      this._updateValueFromPosition(pointerPosition);\n      this._valueOnSlideStart = oldValue;\n\n      // Emit a change and input event if the value changed.\n      if (oldValue != this.value) {\n        this._emitInputEvent();\n      }\n    });\n  }\n\n  /**\n   * Called when the user has moved their pointer after\n   * starting to drag. Bound on the document level.\n   */\n  private _pointerMove = (event: TouchEvent | MouseEvent) => {\n    if (this._isSliding) {\n      // Prevent the slide from selecting anything else.\n      event.preventDefault();\n      const oldValue = this.value;\n      this._lastPointerEvent = event;\n      this._updateValueFromPosition(getPointerPositionOnPage(event));\n\n      // Native range elements always emit `input` events when the value changed while sliding.\n      if (oldValue != this.value) {\n        this._emitInputEvent();\n      }\n    }\n  }\n\n  /** Called when the user has lifted their pointer. Bound on the document level. */\n  private _pointerUp = (event: TouchEvent | MouseEvent) => {\n    if (this._isSliding) {\n      event.preventDefault();\n      this._removeGlobalEvents();\n      this._isSliding = false;\n\n      if (this._valueOnSlideStart != this.value && !this.disabled) {\n        this._emitChangeEvent();\n      }\n\n      this._valueOnSlideStart = this._lastPointerEvent = null;\n    }\n  }\n\n  /** Called when the window has lost focus. */\n  private _windowBlur = () => {\n    // If the window is blurred while dragging we need to stop dragging because the\n    // browser won't dispatch the `mouseup` and `touchend` events anymore.\n    if (this._lastPointerEvent) {\n      this._pointerUp(this._lastPointerEvent);\n    }\n  }\n\n  /** Use defaultView of injected document if available or fallback to global window reference */\n  private _getWindow(): Window {\n    return this._document.defaultView || window;\n  }\n\n  /**\n   * Binds our global move and end events. They're bound at the document level and only while\n   * dragging so that the user doesn't have to keep their pointer exactly over the slider\n   * as they're swiping across the screen.\n   */\n  private _bindGlobalEvents(triggerEvent: TouchEvent | MouseEvent) {\n    // Note that we bind the events to the `document`, because it allows us to capture\n    // drag cancel events where the user's pointer is outside the browser window.\n    const document = this._document;\n    const isTouch = isTouchEvent(triggerEvent);\n    const moveEventName = isTouch ? 'touchmove' : 'mousemove';\n    const endEventName = isTouch ? 'touchend' : 'mouseup';\n    document.addEventListener(moveEventName, this._pointerMove, activeEventOptions);\n    document.addEventListener(endEventName, this._pointerUp, activeEventOptions);\n\n    if (isTouch) {\n      document.addEventListener('touchcancel', this._pointerUp, activeEventOptions);\n    }\n\n    const window = this._getWindow();\n\n    if (typeof window !== 'undefined' && window) {\n      window.addEventListener('blur', this._windowBlur);\n    }\n  }\n\n  /** Removes any global event listeners that we may have added. */\n  private _removeGlobalEvents() {\n    const document = this._document;\n    document.removeEventListener('mousemove', this._pointerMove, activeEventOptions);\n    document.removeEventListener('mouseup', this._pointerUp, activeEventOptions);\n    document.removeEventListener('touchmove', this._pointerMove, activeEventOptions);\n    document.removeEventListener('touchend', this._pointerUp, activeEventOptions);\n    document.removeEventListener('touchcancel', this._pointerUp, activeEventOptions);\n\n    const window = this._getWindow();\n\n    if (typeof window !== 'undefined' && window) {\n      window.removeEventListener('blur', this._windowBlur);\n    }\n  }\n\n  /** Increments the slider by the given number of steps (negative number decrements). */\n  private _increment(numSteps: number) {\n    this.value = this._clamp((this.value || 0) + this.step * numSteps, this.min, this.max);\n  }\n\n  /** Calculate the new value from the new physical location. The value will always be snapped. */\n  private _updateValueFromPosition(pos: {x: number, y: number}) {\n    if (!this._sliderDimensions) {\n      return;\n    }\n\n    let offset = this.vertical ? this._sliderDimensions.top : this._sliderDimensions.left;\n    let size = this.vertical ? this._sliderDimensions.height : this._sliderDimensions.width;\n    let posComponent = this.vertical ? pos.y : pos.x;\n\n    // The exact value is calculated from the event and used to find the closest snap value.\n    let percent = this._clamp((posComponent - offset) / size);\n\n    if (this._shouldInvertMouseCoords()) {\n      percent = 1 - percent;\n    }\n\n    // Since the steps may not divide cleanly into the max value, if the user\n    // slid to 0 or 100 percent, we jump to the min/max value. This approach\n    // is slightly more intuitive than using `Math.ceil` below, because it\n    // follows the user's pointer closer.\n    if (percent === 0) {\n      this.value = this.min;\n    } else if (percent === 1) {\n      this.value = this.max;\n    } else {\n      const exactValue = this._calculateValue(percent);\n\n      // This calculation finds the closest step by finding the closest\n      // whole number divisible by the step relative to the min.\n      const closestValue = Math.round((exactValue - this.min) / this.step) * this.step + this.min;\n\n      // The value needs to snap to the min and max.\n      this.value = this._clamp(closestValue, this.min, this.max);\n    }\n  }\n\n  /** Emits a change event if the current value is different from the last emitted value. */\n  private _emitChangeEvent() {\n    this._controlValueAccessorChangeFn(this.value);\n    this.valueChange.emit(this.value);\n    this.change.emit(this._createChangeEvent());\n  }\n\n  /** Emits an input event when the current value is different from the last emitted value. */\n  private _emitInputEvent() {\n    this.input.emit(this._createChangeEvent());\n  }\n\n  /** Updates the amount of space between ticks as a percentage of the width of the slider. */\n  private _updateTickIntervalPercent() {\n    if (!this.tickInterval || !this._sliderDimensions) {\n      return;\n    }\n\n    if (this.tickInterval == 'auto') {\n      let trackSize = this.vertical ? this._sliderDimensions.height : this._sliderDimensions.width;\n      let pixelsPerStep = trackSize * this.step / (this.max - this.min);\n      let stepsPerTick = Math.ceil(MIN_AUTO_TICK_SEPARATION / pixelsPerStep);\n      let pixelsPerTick = stepsPerTick * this.step;\n      this._tickIntervalPercent = pixelsPerTick / trackSize;\n    } else {\n      this._tickIntervalPercent = this.tickInterval * this.step / (this.max - this.min);\n    }\n  }\n\n  /** Creates a slider change object from the specified value. */\n  private _createChangeEvent(value = this.value): MatSliderChange {\n    let event = new MatSliderChange();\n\n    event.source = this;\n    event.value = value;\n\n    return event;\n  }\n\n  /** Calculates the percentage of the slider that a value is. */\n  private _calculatePercentage(value: number | null) {\n    return ((value || 0) - this.min) / (this.max - this.min);\n  }\n\n  /** Calculates the value a percentage of the slider corresponds to. */\n  private _calculateValue(percentage: number) {\n    return this.min + percentage * (this.max - this.min);\n  }\n\n  /** Return a number between two numbers. */\n  private _clamp(value: number, min = 0, max = 1) {\n    return Math.max(min, Math.min(value, max));\n  }\n\n  /**\n   * Get the bounding client rect of the slider track element.\n   * The track is used rather than the native element to ignore the extra space that the thumb can\n   * take up.\n   */\n  private _getSliderDimensions() {\n    return this._sliderWrapper ? this._sliderWrapper.nativeElement.getBoundingClientRect() : null;\n  }\n\n  /**\n   * Focuses the native element.\n   * Currently only used to allow a blur event to fire but will be used with keyboard input later.\n   */\n  private _focusHostElement(options?: FocusOptions) {\n    this._elementRef.nativeElement.focus(options);\n  }\n\n  /** Blurs the native element. */\n  private _blurHostElement() {\n    this._elementRef.nativeElement.blur();\n  }\n\n  /**\n   * Sets the model value. Implemented as part of ControlValueAccessor.\n   * @param value\n   */\n  writeValue(value: any) {\n    this.value = value;\n  }\n\n  /**\n   * Registers a callback to be triggered when the value has changed.\n   * Implemented as part of ControlValueAccessor.\n   * @param fn Callback to be registered.\n   */\n  registerOnChange(fn: (value: any) => void) {\n    this._controlValueAccessorChangeFn = fn;\n  }\n\n  /**\n   * Registers a callback to be triggered when the component is touched.\n   * Implemented as part of ControlValueAccessor.\n   * @param fn Callback to be registered.\n   */\n  registerOnTouched(fn: any) {\n    this.onTouched = fn;\n  }\n\n  /**\n   * Sets whether the component should be disabled.\n   * Implemented as part of ControlValueAccessor.\n   * @param isDisabled\n   */\n  setDisabledState(isDisabled: boolean) {\n    this.disabled = isDisabled;\n  }\n\n  static ngAcceptInputType_invert: BooleanInput;\n  static ngAcceptInputType_max: NumberInput;\n  static ngAcceptInputType_min: NumberInput;\n  static ngAcceptInputType_step: NumberInput;\n  static ngAcceptInputType_thumbLabel: BooleanInput;\n  static ngAcceptInputType_tickInterval: NumberInput;\n  static ngAcceptInputType_value: NumberInput;\n  static ngAcceptInputType_vertical: BooleanInput;\n  static ngAcceptInputType_disabled: BooleanInput;\n  static ngAcceptInputType_tabIndex: NumberInput;\n}\n\n/** Returns whether an event is a touch event. */\nfunction isTouchEvent(event: MouseEvent | TouchEvent): event is TouchEvent {\n  // This function is called for every pixel that the user has dragged so we need it to be\n  // as fast as possible. Since we only bind mouse events and touch events, we can assume\n  // that if the event's name starts with `t`, it's a touch event.\n  return event.type[0] === 't';\n}\n\n/** Gets the coordinates of a touch or mouse event relative to the viewport. */\nfunction getPointerPositionOnPage(event: MouseEvent | TouchEvent) {\n  // `touches` will be empty for start/end events so we have to fall back to `changedTouches`.\n  const point = isTouchEvent(event) ? (event.touches[0] || event.changedTouches[0]) : event;\n  return {x: point.clientX, y: point.clientY};\n}\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 */\n\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule} from '@angular/material/core';\nimport {MatSlider} from './slider';\n\n\n@NgModule({\n  imports: [CommonModule, MatCommonModule],\n  exports: [MatSlider, MatCommonModule],\n  declarations: [MatSlider],\n})\nexport class MatSliderModule {}\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 */\n\nexport * from './slider-module';\nexport * from './slider';\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}