blob: 34cb64291f2d18ce7156e17bcaf9d265f618febc [file] [log] [blame]
{"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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"}