{"version":3,"file":"slider.mjs","sources":["../../../../../../src/material/slider/slider.ts","../../../../../../src/material/slider/slider.html","../../../../../../src/material/slider/slider-module.ts","../../../../../../src/material/slider/public-api.ts","../../../../../../src/material/slider/index.ts","../../../../../../src/material/slider/slider_public_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  CanDisable,\n  HasTabIndex,\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 */\nconst _MatSliderBase = mixinTabIndex(\n  mixinColor(\n    mixinDisabled(\n      class {\n        constructor(public _elementRef: ElementRef) {}\n      },\n    ),\n    'accent',\n  ),\n);\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\n  extends _MatSliderBase\n  implements ControlValueAccessor, OnDestroy, CanDisable, CanColor, AfterViewInit, HasTabIndex\n{\n  /** Whether the slider is inverted. */\n  @Input()\n  get invert(): boolean {\n    return this._invert;\n  }\n  set invert(value: BooleanInput) {\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 {\n    return this._max;\n  }\n  set max(v: NumberInput) {\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 {\n    return this._min;\n  }\n  set min(v: NumberInput) {\n    this._min = coerceNumberProperty(v, this._min);\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 {\n    return this._step;\n  }\n  set step(v: NumberInput) {\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 {\n    return this._thumbLabel;\n  }\n  set thumbLabel(value: BooleanInput) {\n    this._thumbLabel = coerceBooleanProperty(value);\n  }\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(): 'auto' | number {\n    return this._tickInterval;\n  }\n  set tickInterval(value: 'auto' | NumberInput) {\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 {\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 as number;\n  }\n  set value(v: NumberInput) {\n    if (v !== this._value) {\n      let value = coerceNumberProperty(v, 0);\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 {\n    return this._vertical;\n  }\n  set vertical(value: BooleanInput) {\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 {\n    return this._clamp(this._percent);\n  }\n  private _percent: number = 0;\n\n  /**\n   * Whether or not the thumb is sliding and what the user is using to slide it with.\n   * Used to determine if there should be a transition for the thumb and fill track.\n   */\n  _isSliding: 'keyboard' | 'pointer' | null = null;\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  /** 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  /**\n   * Identifier used to attribute a touch event to a particular slider.\n   * Will be undefined if one of the following conditions is true:\n   * - The user isn't dragging using a touch device.\n   * - The browser doesn't support `Touch.identifier`.\n   * - Dragging hasn't started yet.\n   */\n  private _touchId: number | undefined;\n\n  constructor(\n    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  ) {\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.monitor(this._elementRef, true).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 (\n      this.disabled ||\n      hasModifierKey(event) ||\n      (this._isSliding && this._isSliding !== 'keyboard')\n    ) {\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 = 'keyboard';\n    event.preventDefault();\n  }\n\n  _onKeyup() {\n    if (this._isSliding === 'keyboard') {\n      this._isSliding = null;\n    }\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      this._touchId = isTouchEvent(event)\n        ? getTouchIdForSlider(event, this._elementRef.nativeElement)\n        : undefined;\n      const pointerPosition = getPointerPositionOnPage(event, this._touchId);\n\n      if (pointerPosition) {\n        const oldValue = this.value;\n        this._isSliding = 'pointer';\n        this._lastPointerEvent = event;\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        // Despite the fact that we explicitly bind active events, in some cases the browser\n        // still dispatches non-cancelable events which cause this call to throw an error.\n        // There doesn't appear to be a good way of avoiding them. See #23820.\n        if (event.cancelable) {\n          event.preventDefault();\n        }\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  /**\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 === 'pointer') {\n      const pointerPosition = getPointerPositionOnPage(event, this._touchId);\n\n      if (pointerPosition) {\n        // Prevent the slide from selecting anything else.\n        if (event.cancelable) {\n          event.preventDefault();\n        }\n        const oldValue = this.value;\n        this._lastPointerEvent = event;\n        this._updateValueFromPosition(pointerPosition);\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\n  /** Called when the user has lifted their pointer. Bound on the document level. */\n  private _pointerUp = (event: TouchEvent | MouseEvent) => {\n    if (this._isSliding === 'pointer') {\n      if (\n        !isTouchEvent(event) ||\n        typeof this._touchId !== 'number' ||\n        // Note that we use `changedTouches`, rather than `touches` because it\n        // seems like in most cases `touches` is empty for `touchend` events.\n        findMatchingTouch(event.changedTouches, this._touchId)\n      ) {\n        if (event.cancelable) {\n          event.preventDefault();\n        }\n        this._removeGlobalEvents();\n        this._isSliding = null;\n        this._touchId = undefined;\n\n        if (this._valueOnSlideStart != this.value && !this.disabled) {\n          this._emitChangeEvent();\n        }\n\n        this._valueOnSlideStart = this._lastPointerEvent = null;\n      }\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    // Pre-clamp the current value since it's allowed to be\n    // out of bounds when assigned programmatically.\n    const clampedValue = this._clamp(this.value || 0, this.min, this.max);\n    this.value = this._clamp(clampedValue + 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    let tickIntervalPercent: number;\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      tickIntervalPercent = pixelsPerTick / trackSize;\n    } else {\n      tickIntervalPercent = (this.tickInterval * this.step) / (this.max - this.min);\n    }\n    this._tickIntervalPercent = isSafeNumber(tickIntervalPercent) ? tickIntervalPercent : 0;\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    const percentage = ((value || 0) - this.min) / (this.max - this.min);\n    return isSafeNumber(percentage) ? percentage : 0;\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\n/** Checks if number is safe for calculation */\nfunction isSafeNumber(value: number) {\n  return !isNaN(value) && isFinite(value);\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, id: number | undefined) {\n  let point: {clientX: number; clientY: number} | undefined;\n\n  if (isTouchEvent(event)) {\n    // The `identifier` could be undefined if the browser doesn't support `TouchEvent.identifier`.\n    // If that's the case, attribute the first touch to all active sliders. This should still cover\n    // the most common case while only breaking multi-touch.\n    if (typeof id === 'number') {\n      point = findMatchingTouch(event.touches, id) || findMatchingTouch(event.changedTouches, id);\n    } else {\n      // `touches` will be empty for start/end events so we have to fall back to `changedTouches`.\n      point = event.touches[0] || event.changedTouches[0];\n    }\n  } else {\n    point = event;\n  }\n\n  return point ? {x: point.clientX, y: point.clientY} : undefined;\n}\n\n/** Finds a `Touch` with a specific ID in a `TouchList`. */\nfunction findMatchingTouch(touches: TouchList, id: number): Touch | undefined {\n  for (let i = 0; i < touches.length; i++) {\n    if (touches[i].identifier === id) {\n      return touches[i];\n    }\n  }\n\n  return undefined;\n}\n\n/** Gets the unique ID of a touch that matches a specific slider. */\nfunction getTouchIdForSlider(event: TouchEvent, sliderHost: HTMLElement): number | undefined {\n  for (let i = 0; i < event.touches.length; i++) {\n    const target = event.touches[i].target as HTMLElement;\n\n    if (sliderHost === target || sliderHost.contains(target)) {\n      return event.touches[i].identifier;\n    }\n  }\n\n  return undefined;\n}\n","<div class=\"mat-slider-wrapper\" #sliderWrapper>\n  <div class=\"mat-slider-track-wrapper\">\n    <div class=\"mat-slider-track-background\" [ngStyle]=\"_getTrackBackgroundStyles()\"></div>\n    <div class=\"mat-slider-track-fill\" [ngStyle]=\"_getTrackFillStyles()\"></div>\n  </div>\n  <div class=\"mat-slider-ticks-container\" [ngStyle]=\"_getTicksContainerStyles()\">\n    <div class=\"mat-slider-ticks\" [ngStyle]=\"_getTicksStyles()\"></div>\n  </div>\n  <div class=\"mat-slider-thumb-container\" [ngStyle]=\"_getThumbContainerStyles()\">\n    <div class=\"mat-slider-focus-ring\"></div>\n    <div class=\"mat-slider-thumb\"></div>\n    <div class=\"mat-slider-thumb-label\">\n      <span class=\"mat-slider-thumb-label-text\">{{displayValue}}</span>\n    </div>\n  </div>\n</div>\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@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 * @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 './public-api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}