@spectrum-web-components/slider 0.43.0 → 0.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -130,6 +130,10 @@ When both `fill-start` and `variant="filled"` are used in `<sp-slider>`, the `fi
130
130
 
131
131
  ### fill-start with value
132
132
 
133
+ Any number (including `0`) can be used as a fill-start value. If a [custom normalization](#advanced-normalization) function is provided, it will also normalize all fill-related params.
134
+
135
+ #### Fill Start greater than value
136
+
133
137
  ```html
134
138
  <sp-slider
135
139
  id="fill-start-slider"
@@ -141,6 +145,11 @@ When both `fill-start` and `variant="filled"` are used in `<sp-slider>`, the `fi
141
145
  fill-start="0.7"
142
146
  variant="filled"
143
147
  ></sp-slider>
148
+ ```
149
+
150
+ #### Fill Start less than value
151
+
152
+ ```html
144
153
  <sp-slider
145
154
  id="fill-start-slider"
146
155
  label="Fill Start less than Value"
@@ -151,15 +160,19 @@ When both `fill-start` and `variant="filled"` are used in `<sp-slider>`, the `fi
151
160
  fill-start="0.25"
152
161
  variant="filled"
153
162
  ></sp-slider>
163
+ ```
164
+
165
+ #### Fill Start with 0 and negative minimum range
166
+
167
+ ```html
154
168
  <sp-slider
155
- label="Slider Label"
169
+ label="Fill Start with 0"
156
170
  max="1"
157
- min="0"
171
+ min="-1"
158
172
  value=".7"
159
173
  step="0.1"
160
- fill-start="0.25"
174
+ fill-start="0"
161
175
  variant="filled"
162
- disabled
163
176
  ></sp-slider>
164
177
  ```
165
178
 
@@ -303,6 +303,15 @@
303
303
  }
304
304
  ]
305
305
  },
306
+ {
307
+ "kind": "field",
308
+ "name": "activeHandleModel",
309
+ "type": {
310
+ "text": "ModelValue"
311
+ },
312
+ "privacy": "public",
313
+ "readonly": true
314
+ },
306
315
  {
307
316
  "kind": "method",
308
317
  "name": "getActiveHandleElements",
@@ -1070,24 +1079,6 @@
1070
1079
  }
1071
1080
  ]
1072
1081
  },
1073
- {
1074
- "kind": "method",
1075
- "name": "getOffsetPosition",
1076
- "privacy": "private",
1077
- "return": {
1078
- "type": {
1079
- "text": "number"
1080
- }
1081
- },
1082
- "parameters": [
1083
- {
1084
- "name": "value",
1085
- "type": {
1086
- "text": "number"
1087
- }
1088
- }
1089
- ]
1090
- },
1091
1082
  {
1092
1083
  "kind": "method",
1093
1084
  "name": "fillStyles",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spectrum-web-components/slider",
3
- "version": "0.43.0",
3
+ "version": "0.44.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -75,12 +75,12 @@
75
75
  "dependencies": {
76
76
  "@internationalized/number": "^3.1.0",
77
77
  "@lit-labs/observers": "^2.0.0",
78
- "@spectrum-web-components/base": "^0.43.0",
79
- "@spectrum-web-components/field-label": "^0.43.0",
80
- "@spectrum-web-components/number-field": "^0.43.0",
81
- "@spectrum-web-components/reactive-controllers": "^0.43.0",
82
- "@spectrum-web-components/shared": "^0.43.0",
83
- "@spectrum-web-components/theme": "^0.43.0"
78
+ "@spectrum-web-components/base": "^0.44.0",
79
+ "@spectrum-web-components/field-label": "^0.44.0",
80
+ "@spectrum-web-components/number-field": "^0.44.0",
81
+ "@spectrum-web-components/reactive-controllers": "^0.44.0",
82
+ "@spectrum-web-components/shared": "^0.44.0",
83
+ "@spectrum-web-components/theme": "^0.44.0"
84
84
  },
85
85
  "devDependencies": {
86
86
  "@spectrum-css/slider": "^5.1.0"
@@ -92,5 +92,5 @@
92
92
  "./**/*.dev.js",
93
93
  "./sync/sp-*.js"
94
94
  ],
95
- "gitHead": "dd5179a5eae5fe69ac77c5e10faed912d0e780e3"
95
+ "gitHead": "0002d42ce82463b85022e5aa5f7aba8484cba096"
96
96
  }
@@ -65,6 +65,7 @@ export declare class HandleController {
65
65
  get activeHandle(): string;
66
66
  get activeHandleInputId(): string;
67
67
  activateHandle(name: string): void;
68
+ get activeHandleModel(): ModelValue;
68
69
  private getActiveHandleElements;
69
70
  private getHandleElements;
70
71
  private clearHandleComponentCache;
@@ -219,6 +219,10 @@ export class HandleController {
219
219
  }
220
220
  this.handleOrder.push(name);
221
221
  }
222
+ get activeHandleModel() {
223
+ const active = this.activeHandle;
224
+ return this.model.find((model) => model.name === active);
225
+ }
222
226
  getActiveHandleElements() {
223
227
  const name = this.activeHandle;
224
228
  const handleSlider = this.handles.get(name);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["HandleController.ts"],
4
- "sourcesContent": ["/*\nCopyright 2021 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport { html, TemplateResult } from '@spectrum-web-components/base';\nimport {\n classMap,\n ifDefined,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\nimport { MutationController } from '@lit-labs/observers/mutation-controller.js';\nimport { Slider } from './Slider.dev.js'\nimport { SliderHandle, SliderNormalization } from './SliderHandle.dev.js'\n\ninterface HandleReference {\n handle: HTMLElement;\n input: HTMLInputElement;\n}\n\ninterface HandleComponents extends HandleReference {\n model: SliderHandle;\n}\n\ninterface RangeAndClamp {\n range: { min: number; max: number };\n clamp: { min: number; max: number };\n}\ninterface ModelValue extends RangeAndClamp {\n name: string;\n value: number;\n normalizedValue: number;\n step: number;\n highlight: boolean;\n ariaLabel?: string;\n normalization: SliderNormalization;\n handle: SliderHandle;\n}\n\ninterface InputWithModel extends HTMLInputElement {\n model: ModelValue;\n}\n\ninterface DataFromPointerEvent {\n resolvedInput: boolean;\n input: InputWithModel;\n model?: ModelValue;\n}\n\nexport interface HandleValueDictionary {\n [key: string]: number;\n}\n\nexport class HandleController {\n private host!: Slider;\n private handles: Map<string, SliderHandle> = new Map();\n private model: ModelValue[] = [];\n private handleOrder: string[] = [];\n private draggingHandle?: SliderHandle;\n private handleRefMap?: WeakMap<SliderHandle, HandleReference>;\n\n constructor(host: Slider) {\n this.host = host;\n\n new MutationController(this.host, {\n config: {\n subtree: true,\n childList: true,\n },\n callback: () => {\n this.extractModelFromLightDom();\n },\n });\n\n this.extractModelFromLightDom();\n }\n\n public get values(): HandleValueDictionary {\n const result: HandleValueDictionary = {};\n for (const model of this.handles.values()) {\n result[model.handleName] = model.value;\n }\n return result;\n }\n\n public get size(): number {\n return this.handles.size;\n }\n\n public inputForHandle(handle: SliderHandle): HTMLInputElement | undefined {\n if (this.handles.has(handle.handleName)) {\n const { input } = this.getHandleElements(handle) || {};\n return input;\n }\n /* c8 ignore next 2 */\n throw new Error(`No input for handle \"${handle.name}\"`);\n }\n\n public requestUpdate(): void {\n if (this.host.hasUpdated) {\n this.host.requestUpdate();\n }\n }\n\n /**\n * It is possible for value attributes to be set programmatically. The <input>\n * for a particular slider needs to have an opportunity to validate any such\n * values\n *\n * @param handle Handle who's value needs validation\n */\n public setValueFromHandle(handle: SliderHandle): void {\n const elements = this.getHandleElements(handle);\n /* c8 ignore next */\n if (!elements) return;\n\n const { input } = elements;\n if (input.valueAsNumber === handle.value) {\n if (handle.dragging) {\n handle.dispatchInputEvent();\n }\n } else {\n input.valueAsNumber = handle.value;\n this.requestUpdate();\n }\n handle.value = input.valueAsNumber;\n }\n\n public handleHasChanged(handle: SliderHandle): void {\n if (handle !== this.host) {\n this.requestUpdate();\n }\n }\n\n public formattedValueForHandle(model: ModelValue): string {\n const { handle } = model;\n const numberFormat = handle.numberFormat ?? this.host.numberFormat;\n const _forcedUnit =\n handle._forcedUnit === ''\n ? this.host._forcedUnit\n : handle._forcedUnit;\n return (\n handle.getAriaHandleText(model.value, numberFormat) + _forcedUnit\n );\n }\n\n public get formattedValues(): Map<string, string> {\n const result = new Map<string, string>();\n for (const model of this.model) {\n result.set(model.name, this.formattedValueForHandle(model));\n }\n return result;\n }\n\n public get focusElement(): HTMLElement {\n const { input } = this.getActiveHandleElements();\n if (\n !input ||\n (this.host.editable &&\n !(input as InputWithModel).model.handle.dragging)\n ) {\n return this.host.numberField;\n }\n return input;\n }\n\n protected handleOrientation = (): void => {\n this.updateBoundingRect();\n };\n\n public hostConnected(): void {\n if ('orientation' in screen) {\n screen.orientation.addEventListener(\n 'change',\n this.handleOrientation\n );\n } else {\n window.addEventListener(\n 'orientationchange',\n this.handleOrientation\n );\n }\n }\n\n public hostDisconnected(): void {\n if ('orientation' in screen) {\n screen.orientation.removeEventListener(\n 'change',\n this.handleOrientation\n );\n } else {\n window.removeEventListener(\n 'orientationchange',\n this.handleOrientation\n );\n }\n }\n\n public hostUpdate(): void {\n this.updateModel();\n }\n\n // Since extractModelFromLightDom bails on the first un-upgraded handle,\n // a maximum of one listener will be set up per extraction attempt.\n private waitForUpgrade(handle: HTMLElement): boolean {\n if (handle instanceof SliderHandle) {\n return false;\n }\n handle.addEventListener(\n 'sp-slider-handle-ready',\n () => this.extractModelFromLightDom(),\n { once: true, passive: true }\n );\n return true;\n }\n\n private extractModelFromLightDom = (): void => {\n let handles = [\n ...this.host.querySelectorAll('[slot=\"handle\"]'),\n ] as SliderHandle[];\n if (handles.length === 0) {\n handles = [this.host as SliderHandle];\n }\n // extractModelFromLightDom depends on slotted handles already having been upgraded\n if (handles.some((h) => this.waitForUpgrade(h))) {\n return;\n }\n this.handles = new Map();\n this.handleOrder = [];\n handles.forEach((handle, index) => {\n /* c8 ignore next */\n if (!handle.handleName?.length) {\n handle.name = `handle${index + 1}`;\n }\n this.handles.set(handle.handleName, handle);\n this.handleOrder.push(handle.handleName);\n handle.handleController = this;\n });\n this.requestUpdate();\n };\n\n public get activeHandle(): string {\n return this.handleOrder[this.handleOrder.length - 1];\n }\n\n public get activeHandleInputId(): string {\n const active = this.activeHandle;\n const index = this.model.findIndex((model) => model.name === active);\n return `input-${index}`;\n }\n\n public activateHandle(name: string): void {\n const index = this.handleOrder.findIndex((item) => item === name);\n if (index >= 0) {\n this.handleOrder.splice(index, 1);\n }\n this.handleOrder.push(name);\n }\n\n private getActiveHandleElements(): HandleComponents {\n const name = this.activeHandle;\n const handleSlider = this.handles.get(name) as SliderHandle;\n const elements = this.getHandleElements(\n handleSlider\n ) as HandleReference;\n return { model: handleSlider, ...elements };\n }\n\n private getHandleElements(sliderHandle: SliderHandle): HandleReference {\n if (!this.handleRefMap) {\n this.handleRefMap = new WeakMap();\n\n const inputNodes =\n this.host.shadowRoot.querySelectorAll('.handle > input');\n for (const inputNode of inputNodes) {\n const input = inputNode as HTMLInputElement;\n const handle = input.parentElement as HTMLElement;\n const model = this.handles.get(\n handle.getAttribute('name') as string\n );\n if (model) {\n this.handleRefMap.set(model, { input, handle });\n }\n }\n }\n\n const components = this.handleRefMap.get(\n sliderHandle\n ) as HandleReference;\n return components;\n }\n\n private clearHandleComponentCache(): void {\n delete this.handleRefMap;\n }\n\n private _boundingClientRect?: DOMRect;\n\n private get boundingClientRect(): DOMRect {\n if (!this._boundingClientRect) {\n this._boundingClientRect = this.host.track.getBoundingClientRect();\n }\n return this._boundingClientRect;\n }\n\n private updateBoundingRect(): void {\n delete this._boundingClientRect;\n }\n\n /**\n * Return the `input` and `model` associated with the event and\n * whether the `input` is a `resolvedInput` meaning it was acquired\n * from the `model` rather than the event.\n */\n protected extractDataFromEvent(event: PointerEvent): DataFromPointerEvent {\n if (!this._activePointerEventData) {\n let input = (event.target as Element).querySelector(\n ':scope > .input'\n ) as InputWithModel;\n const resolvedInput = !input;\n const model = input\n ? input.model\n : this.model.find((item) => item.name === this.activeHandle);\n if (!input && !!model) {\n input = model.handle.focusElement as InputWithModel;\n }\n this._activePointerEventData = {\n input,\n model,\n resolvedInput,\n };\n }\n return this._activePointerEventData;\n }\n\n private _activePointerEventData!: DataFromPointerEvent | undefined;\n\n /**\n * @description check for defaultvalue(value) property in sp-slider and reset on double click on sliderHandle\n * @param event\n */\n public handleDoubleClick(event: PointerEvent): void {\n const input = (event.target as Element).querySelector(\n '.input'\n ) as InputWithModel;\n\n if (input.model?.handle.defaultValue !== undefined) {\n input.model.handle.value = input.model.handle.defaultValue;\n this.dispatchChangeEvent(input, input.model.handle);\n input.model.handle.dispatchInputEvent();\n this.requestUpdate();\n }\n }\n\n public handlePointerdown(event: PointerEvent): void {\n const { resolvedInput, model } = this.extractDataFromEvent(event);\n if (!model || this.host.disabled || event.button !== 0) {\n event.preventDefault();\n return;\n }\n this.host.track.setPointerCapture(event.pointerId);\n this.updateBoundingRect();\n if (event.pointerType === 'mouse') {\n this.host.labelEl.click();\n }\n this.draggingHandle = model.handle;\n model.handle.dragging = true;\n this.activateHandle(model.name);\n if (resolvedInput) {\n // When the input is resolved forward the pointer event to\n // `handlePointermove` in order to update the value/UI becuase\n // the pointer event was on the track not a handle\n this.handlePointermove(event);\n }\n this.requestUpdate();\n }\n\n public handlePointerup(event: PointerEvent): void {\n const { input, model } = this.extractDataFromEvent(event);\n delete this._activePointerEventData;\n if (!model) return;\n if (event.pointerType === 'mouse') {\n this.host.labelEl.click();\n }\n this.cancelDrag(model);\n this.requestUpdate();\n this.host.track.releasePointerCapture(event.pointerId);\n this.dispatchChangeEvent(input, model.handle);\n }\n\n public handlePointermove(event: PointerEvent): void {\n const { input, model } = this.extractDataFromEvent(event);\n if (!model) return;\n /* c8 ignore next 3 */\n if (!this.draggingHandle) {\n return;\n }\n input.value = this.calculateHandlePosition(event, model).toString();\n model.handle.value = parseFloat(input.value);\n this.host.indeterminate = false;\n this.requestUpdate();\n }\n\n public cancelDrag(model?: ModelValue): void {\n model =\n model || this.model.find((item) => item.name === this.activeHandle);\n if (!model) return;\n model.handle.highlight = false;\n delete this.draggingHandle;\n model.handle.dragging = false;\n }\n\n /**\n * Keep the slider value property in sync with the input element's value\n */\n private onInputChange = (event: Event): void => {\n const input = event.target as InputWithModel;\n input.model.handle.value = input.valueAsNumber;\n\n this.requestUpdate();\n this.dispatchChangeEvent(input, input.model.handle);\n };\n\n private onInputFocus = (event: Event): void => {\n const input = event.target as InputWithModel;\n let isFocusVisible;\n try {\n isFocusVisible =\n input.matches(':focus-visible') ||\n this.host.matches('.focus-visible');\n /* c8 ignore next 3 */\n } catch (error) {\n isFocusVisible = this.host.matches('.focus-visible');\n }\n input.model.handle.highlight = isFocusVisible;\n this.requestUpdate();\n };\n\n private onInputBlur = (event: Event): void => {\n const input = event.target as InputWithModel;\n input.model.handle.highlight = false;\n this.requestUpdate();\n };\n\n private onInputKeydown = (event: KeyboardEvent): void => {\n if (event.key == 'Escape') {\n const input = event.target as InputWithModel;\n if (\n input.model.handle?.defaultValue !== undefined &&\n input.model.handle.value !== input.model.handle.defaultValue\n ) {\n input.model.handle.value = input.model.handle.defaultValue;\n input.model.handle.dispatchInputEvent();\n this.dispatchChangeEvent(input, input.model.handle);\n this.requestUpdate();\n event.preventDefault();\n event.stopPropagation();\n }\n return;\n }\n const input = event.target as InputWithModel;\n input.model.handle.highlight = true;\n this.requestUpdate();\n };\n\n private dispatchChangeEvent(\n input: HTMLInputElement,\n handle: SliderHandle\n ): void {\n input.valueAsNumber = handle.value;\n\n const changeEvent = new Event('change', {\n bubbles: true,\n composed: true,\n });\n\n handle.dispatchEvent(changeEvent);\n }\n\n /**\n * Returns the value under the cursor\n * @param: PointerEvent on slider\n * @return: Slider value that correlates to the position under the pointer\n */\n private calculateHandlePosition(\n event: PointerEvent | MouseEvent,\n model: ModelValue\n ): number {\n const rect = this.boundingClientRect;\n const minOffset = rect.left;\n const offset = event.clientX;\n const size = rect.width;\n\n const directionalOffset = this.host.isLTR\n ? offset - minOffset\n : size - (offset - minOffset);\n const normalized = directionalOffset / size;\n\n return model.normalization.fromNormalized(\n normalized,\n model.range.min,\n model.range.max\n );\n }\n\n public renderHandle(\n model: ModelValue,\n index: number,\n zIndex: number,\n isMultiHandle: boolean\n ): TemplateResult {\n const classes = {\n handle: true,\n dragging: this.draggingHandle?.handleName === model.name,\n 'handle-highlight': model.highlight,\n };\n const style = {\n [this.host.isLTR ? 'left' : 'right']: `${\n model.normalizedValue * 100\n }%`,\n 'z-index': zIndex.toString(),\n ...(isMultiHandle && {\n 'background-color': `var(--spectrum-slider-handle-background-color-${index}, var(--spectrum-slider-handle-background-color))`,\n 'border-color': `var(--spectrum-slider-handle-border-color-${index}, var(--spectrum-slider-handle-border-color))`,\n }),\n };\n const ariaLabelledBy = isMultiHandle ? `label input-${index}` : 'label';\n return html`\n <div\n class=${classMap(classes)}\n name=${model.name}\n style=${styleMap(style)}\n role=\"presentation\"\n >\n <input\n type=\"range\"\n class=\"input\"\n id=\"input-${index}\"\n min=${model.clamp.min}\n max=${model.clamp.max}\n step=${model.step}\n value=${model.value}\n aria-disabled=${ifDefined(\n this.host.disabled ? 'true' : undefined\n )}\n tabindex=${ifDefined(this.host.editable ? -1 : undefined)}\n aria-label=${ifDefined(model.ariaLabel)}\n aria-labelledby=${ariaLabelledBy}\n aria-valuetext=${this.formattedValueForHandle(model)}\n aria-describedby=\"slider-description\"\n @change=${this.onInputChange}\n @focus=${this.onInputFocus}\n @blur=${this.onInputBlur}\n @keydown=${this.onInputKeydown}\n .model=${model}\n />\n <span id=\"slider-description\">\n Press escape or double click to reset the slider to its\n default value.\n </span>\n </div>\n `;\n }\n\n public render(): TemplateResult[] {\n this.clearHandleComponentCache();\n return this.model.map((model, index) => {\n const zIndex = this.handleOrder.indexOf(model.name) + 2;\n return this.renderHandle(\n model,\n index,\n zIndex,\n this.model.length > 1\n );\n });\n }\n\n /**\n * Returns a list of track segment [start, end] tuples where the values are\n * normalized to be between 0 and 1.\n * @returns A list of track segment tuples [start, end]\n */\n public trackSegments(): [number, number][] {\n const values = this.model.map((model) => model.normalizedValue);\n values.sort((a, b) => a - b);\n\n // The first segment always starts at 0\n values.unshift(0);\n return values.map((value, index, array) => [\n value,\n array[index + 1] ?? 1,\n ]);\n }\n\n private updateModel(): void {\n const handles = [...this.handles.values()];\n\n const getRangeAndClamp = (index: number): RangeAndClamp => {\n const handle = handles[index];\n const previous = handles[index - 1];\n const next = handles[index + 1];\n\n const min =\n typeof handle.min === 'number'\n ? handle.min\n : (this.host.min as number);\n const max =\n typeof handle.max === 'number'\n ? handle.max\n : (this.host.max as number);\n\n const result: RangeAndClamp = {\n range: { min: min, max: max },\n clamp: { min: min, max: max },\n };\n\n if (handle.min === 'previous') {\n if (previous) {\n for (let j = index - 1; j >= 0; j--) {\n const item = handles[j];\n if (typeof item.min === 'number') {\n result.range.min = item.min;\n break;\n }\n }\n result.clamp.min = Math.max(\n previous.value,\n result.range.min\n );\n }\n if (window.__swc.DEBUG) {\n if (!previous) {\n window.__swc.warn(\n this.host,\n '<sp-slider-handle> elements that are the first child of an <sp-slider> element cannot have attribute \"min=\\'previous\\'\"`',\n 'https://opensource.adobe.com/spectrum-web-components/components/slider-handle/#multi-handle-slider-with-ordered-handles'\n );\n }\n }\n }\n if (handle.max === 'next') {\n if (next) {\n for (let j = index + 1; j < handles.length; j++) {\n const item = handles[j];\n if (typeof item.max === 'number') {\n result.range.max = item.max;\n break;\n }\n }\n result.clamp.max = Math.min(next.value, result.range.max);\n }\n if (window.__swc.DEBUG) {\n if (!next) {\n window.__swc.warn(\n this.host,\n '<sp-slider-handle> elements that are the last child of an <sp-slider> element cannot have attribute \"max=\\'next\\'\"',\n 'https://opensource.adobe.com/spectrum-web-components/components/slider-handle/#multi-handle-slider-with-ordered-handles'\n );\n }\n }\n }\n return result;\n };\n\n const modelValues = handles.map((handle, index) => {\n const rangeAndClamp = getRangeAndClamp(index);\n const { toNormalized } = handle.normalization;\n const clampedValue = Math.max(\n Math.min(handle.value, rangeAndClamp.clamp.max),\n rangeAndClamp.clamp.min\n );\n const normalizedValue = toNormalized(\n clampedValue,\n rangeAndClamp.range.min,\n rangeAndClamp.range.max\n );\n const model = {\n name: handle.handleName,\n value: clampedValue,\n normalizedValue,\n highlight: handle.highlight,\n step: handle.step ?? this.host.step,\n normalization: handle.normalization,\n handle,\n ariaLabel:\n handle !== this.host && handle?.label.length > 0\n ? handle.label\n : undefined,\n ...rangeAndClamp,\n };\n return model;\n });\n\n this.model = modelValues;\n }\n\n public async handleUpdatesComplete(): Promise<void> {\n const updates = [...this.handles.values()]\n .filter((handle) => handle !== this.host)\n .map((handle) => handle.updateComplete);\n await Promise.all(updates);\n }\n}\n"],
5
- "mappings": ";AAWA,SAAS,YAA4B;AACrC;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,0BAA0B;AAEnC,SAAS,oBAAyC;AAwC3C,aAAM,iBAAiB;AAAA,EAQ1B,YAAY,MAAc;AAN1B,SAAQ,UAAqC,oBAAI,IAAI;AACrD,SAAQ,QAAsB,CAAC;AAC/B,SAAQ,cAAwB,CAAC;AA6GjC,SAAU,oBAAoB,MAAY;AACtC,WAAK,mBAAmB;AAAA,IAC5B;AAgDA,SAAQ,2BAA2B,MAAY;AAC3C,UAAI,UAAU;AAAA,QACV,GAAG,KAAK,KAAK,iBAAiB,iBAAiB;AAAA,MACnD;AACA,UAAI,QAAQ,WAAW,GAAG;AACtB,kBAAU,CAAC,KAAK,IAAoB;AAAA,MACxC;AAEA,UAAI,QAAQ,KAAK,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,GAAG;AAC7C;AAAA,MACJ;AACA,WAAK,UAAU,oBAAI,IAAI;AACvB,WAAK,cAAc,CAAC;AACpB,cAAQ,QAAQ,CAAC,QAAQ,UAAU;AA3O3C;AA6OY,YAAI,GAAC,YAAO,eAAP,mBAAmB,SAAQ;AAC5B,iBAAO,OAAO,SAAS,QAAQ,CAAC;AAAA,QACpC;AACA,aAAK,QAAQ,IAAI,OAAO,YAAY,MAAM;AAC1C,aAAK,YAAY,KAAK,OAAO,UAAU;AACvC,eAAO,mBAAmB;AAAA,MAC9B,CAAC;AACD,WAAK,cAAc;AAAA,IACvB;AAgLA;AAAA;AAAA;AAAA,SAAQ,gBAAgB,CAAC,UAAuB;AAC5C,YAAM,QAAQ,MAAM;AACpB,YAAM,MAAM,OAAO,QAAQ,MAAM;AAEjC,WAAK,cAAc;AACnB,WAAK,oBAAoB,OAAO,MAAM,MAAM,MAAM;AAAA,IACtD;AAEA,SAAQ,eAAe,CAAC,UAAuB;AAC3C,YAAM,QAAQ,MAAM;AACpB,UAAI;AACJ,UAAI;AACA,yBACI,MAAM,QAAQ,gBAAgB,KAC9B,KAAK,KAAK,QAAQ,gBAAgB;AAAA,MAE1C,SAAS,OAAO;AACZ,yBAAiB,KAAK,KAAK,QAAQ,gBAAgB;AAAA,MACvD;AACA,YAAM,MAAM,OAAO,YAAY;AAC/B,WAAK,cAAc;AAAA,IACvB;AAEA,SAAQ,cAAc,CAAC,UAAuB;AAC1C,YAAM,QAAQ,MAAM;AACpB,YAAM,MAAM,OAAO,YAAY;AAC/B,WAAK,cAAc;AAAA,IACvB;AAEA,SAAQ,iBAAiB,CAAC,UAA+B;AAlc7D;AAmcQ,UAAI,MAAM,OAAO,UAAU;AACvB,cAAMA,SAAQ,MAAM;AACpB,cACI,KAAAA,OAAM,MAAM,WAAZ,mBAAoB,kBAAiB,UACrCA,OAAM,MAAM,OAAO,UAAUA,OAAM,MAAM,OAAO,cAClD;AACE,UAAAA,OAAM,MAAM,OAAO,QAAQA,OAAM,MAAM,OAAO;AAC9C,UAAAA,OAAM,MAAM,OAAO,mBAAmB;AACtC,eAAK,oBAAoBA,QAAOA,OAAM,MAAM,MAAM;AAClD,eAAK,cAAc;AACnB,gBAAM,eAAe;AACrB,gBAAM,gBAAgB;AAAA,QAC1B;AACA;AAAA,MACJ;AACA,YAAM,QAAQ,MAAM;AACpB,YAAM,MAAM,OAAO,YAAY;AAC/B,WAAK,cAAc;AAAA,IACvB;AAjZI,SAAK,OAAO;AAEZ,QAAI,mBAAmB,KAAK,MAAM;AAAA,MAC9B,QAAQ;AAAA,QACJ,SAAS;AAAA,QACT,WAAW;AAAA,MACf;AAAA,MACA,UAAU,MAAM;AACZ,aAAK,yBAAyB;AAAA,MAClC;AAAA,IACJ,CAAC;AAED,SAAK,yBAAyB;AAAA,EAClC;AAAA,EAEA,IAAW,SAAgC;AACvC,UAAM,SAAgC,CAAC;AACvC,eAAW,SAAS,KAAK,QAAQ,OAAO,GAAG;AACvC,aAAO,MAAM,UAAU,IAAI,MAAM;AAAA,IACrC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,IAAW,OAAe;AACtB,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEO,eAAe,QAAoD;AACtE,QAAI,KAAK,QAAQ,IAAI,OAAO,UAAU,GAAG;AACrC,YAAM,EAAE,MAAM,IAAI,KAAK,kBAAkB,MAAM,KAAK,CAAC;AACrD,aAAO;AAAA,IACX;AAEA,UAAM,IAAI,MAAM,wBAAwB,OAAO,IAAI,GAAG;AAAA,EAC1D;AAAA,EAEO,gBAAsB;AACzB,QAAI,KAAK,KAAK,YAAY;AACtB,WAAK,KAAK,cAAc;AAAA,IAC5B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,mBAAmB,QAA4B;AAClD,UAAM,WAAW,KAAK,kBAAkB,MAAM;AAE9C,QAAI,CAAC,SAAU;AAEf,UAAM,EAAE,MAAM,IAAI;AAClB,QAAI,MAAM,kBAAkB,OAAO,OAAO;AACtC,UAAI,OAAO,UAAU;AACjB,eAAO,mBAAmB;AAAA,MAC9B;AAAA,IACJ,OAAO;AACH,YAAM,gBAAgB,OAAO;AAC7B,WAAK,cAAc;AAAA,IACvB;AACA,WAAO,QAAQ,MAAM;AAAA,EACzB;AAAA,EAEO,iBAAiB,QAA4B;AAChD,QAAI,WAAW,KAAK,MAAM;AACtB,WAAK,cAAc;AAAA,IACvB;AAAA,EACJ;AAAA,EAEO,wBAAwB,OAA2B;AA5I9D;AA6IQ,UAAM,EAAE,OAAO,IAAI;AACnB,UAAM,gBAAe,YAAO,iBAAP,YAAuB,KAAK,KAAK;AACtD,UAAM,cACF,OAAO,gBAAgB,KACjB,KAAK,KAAK,cACV,OAAO;AACjB,WACI,OAAO,kBAAkB,MAAM,OAAO,YAAY,IAAI;AAAA,EAE9D;AAAA,EAEA,IAAW,kBAAuC;AAC9C,UAAM,SAAS,oBAAI,IAAoB;AACvC,eAAW,SAAS,KAAK,OAAO;AAC5B,aAAO,IAAI,MAAM,MAAM,KAAK,wBAAwB,KAAK,CAAC;AAAA,IAC9D;AACA,WAAO;AAAA,EACX;AAAA,EAEA,IAAW,eAA4B;AACnC,UAAM,EAAE,MAAM,IAAI,KAAK,wBAAwB;AAC/C,QACI,CAAC,SACA,KAAK,KAAK,YACP,CAAE,MAAyB,MAAM,OAAO,UAC9C;AACE,aAAO,KAAK,KAAK;AAAA,IACrB;AACA,WAAO;AAAA,EACX;AAAA,EAMO,gBAAsB;AACzB,QAAI,iBAAiB,QAAQ;AACzB,aAAO,YAAY;AAAA,QACf;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ,OAAO;AACH,aAAO;AAAA,QACH;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AAAA,EACJ;AAAA,EAEO,mBAAyB;AAC5B,QAAI,iBAAiB,QAAQ;AACzB,aAAO,YAAY;AAAA,QACf;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ,OAAO;AACH,aAAO;AAAA,QACH;AAAA,QACA,KAAK;AAAA,MACT;AAAA,IACJ;AAAA,EACJ;AAAA,EAEO,aAAmB;AACtB,SAAK,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA,EAIQ,eAAe,QAA8B;AACjD,QAAI,kBAAkB,cAAc;AAChC,aAAO;AAAA,IACX;AACA,WAAO;AAAA,MACH;AAAA,MACA,MAAM,KAAK,yBAAyB;AAAA,MACpC,EAAE,MAAM,MAAM,SAAS,KAAK;AAAA,IAChC;AACA,WAAO;AAAA,EACX;AAAA,EA2BA,IAAW,eAAuB;AAC9B,WAAO,KAAK,YAAY,KAAK,YAAY,SAAS,CAAC;AAAA,EACvD;AAAA,EAEA,IAAW,sBAA8B;AACrC,UAAM,SAAS,KAAK;AACpB,UAAM,QAAQ,KAAK,MAAM,UAAU,CAAC,UAAU,MAAM,SAAS,MAAM;AACnE,WAAO,SAAS,KAAK;AAAA,EACzB;AAAA,EAEO,eAAe,MAAoB;AACtC,UAAM,QAAQ,KAAK,YAAY,UAAU,CAAC,SAAS,SAAS,IAAI;AAChE,QAAI,SAAS,GAAG;AACZ,WAAK,YAAY,OAAO,OAAO,CAAC;AAAA,IACpC;AACA,SAAK,YAAY,KAAK,IAAI;AAAA,EAC9B;AAAA,EAEQ,0BAA4C;AAChD,UAAM,OAAO,KAAK;AAClB,UAAM,eAAe,KAAK,QAAQ,IAAI,IAAI;AAC1C,UAAM,WAAW,KAAK;AAAA,MAClB;AAAA,IACJ;AACA,WAAO,EAAE,OAAO,cAAc,GAAG,SAAS;AAAA,EAC9C;AAAA,EAEQ,kBAAkB,cAA6C;AACnE,QAAI,CAAC,KAAK,cAAc;AACpB,WAAK,eAAe,oBAAI,QAAQ;AAEhC,YAAM,aACF,KAAK,KAAK,WAAW,iBAAiB,iBAAiB;AAC3D,iBAAW,aAAa,YAAY;AAChC,cAAM,QAAQ;AACd,cAAM,SAAS,MAAM;AACrB,cAAM,QAAQ,KAAK,QAAQ;AAAA,UACvB,OAAO,aAAa,MAAM;AAAA,QAC9B;AACA,YAAI,OAAO;AACP,eAAK,aAAa,IAAI,OAAO,EAAE,OAAO,OAAO,CAAC;AAAA,QAClD;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,aAAa,KAAK,aAAa;AAAA,MACjC;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEQ,4BAAkC;AACtC,WAAO,KAAK;AAAA,EAChB;AAAA,EAIA,IAAY,qBAA8B;AACtC,QAAI,CAAC,KAAK,qBAAqB;AAC3B,WAAK,sBAAsB,KAAK,KAAK,MAAM,sBAAsB;AAAA,IACrE;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEQ,qBAA2B;AAC/B,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,qBAAqB,OAA2C;AACtE,QAAI,CAAC,KAAK,yBAAyB;AAC/B,UAAI,QAAS,MAAM,OAAmB;AAAA,QAClC;AAAA,MACJ;AACA,YAAM,gBAAgB,CAAC;AACvB,YAAM,QAAQ,QACR,MAAM,QACN,KAAK,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,KAAK,YAAY;AAC/D,UAAI,CAAC,SAAS,CAAC,CAAC,OAAO;AACnB,gBAAQ,MAAM,OAAO;AAAA,MACzB;AACA,WAAK,0BAA0B;AAAA,QAC3B;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AACA,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,kBAAkB,OAA2B;AA3VxD;AA4VQ,UAAM,QAAS,MAAM,OAAmB;AAAA,MACpC;AAAA,IACJ;AAEA,UAAI,WAAM,UAAN,mBAAa,OAAO,kBAAiB,QAAW;AAChD,YAAM,MAAM,OAAO,QAAQ,MAAM,MAAM,OAAO;AAC9C,WAAK,oBAAoB,OAAO,MAAM,MAAM,MAAM;AAClD,YAAM,MAAM,OAAO,mBAAmB;AACtC,WAAK,cAAc;AAAA,IACvB;AAAA,EACJ;AAAA,EAEO,kBAAkB,OAA2B;AAChD,UAAM,EAAE,eAAe,MAAM,IAAI,KAAK,qBAAqB,KAAK;AAChE,QAAI,CAAC,SAAS,KAAK,KAAK,YAAY,MAAM,WAAW,GAAG;AACpD,YAAM,eAAe;AACrB;AAAA,IACJ;AACA,SAAK,KAAK,MAAM,kBAAkB,MAAM,SAAS;AACjD,SAAK,mBAAmB;AACxB,QAAI,MAAM,gBAAgB,SAAS;AAC/B,WAAK,KAAK,QAAQ,MAAM;AAAA,IAC5B;AACA,SAAK,iBAAiB,MAAM;AAC5B,UAAM,OAAO,WAAW;AACxB,SAAK,eAAe,MAAM,IAAI;AAC9B,QAAI,eAAe;AAIf,WAAK,kBAAkB,KAAK;AAAA,IAChC;AACA,SAAK,cAAc;AAAA,EACvB;AAAA,EAEO,gBAAgB,OAA2B;AAC9C,UAAM,EAAE,OAAO,MAAM,IAAI,KAAK,qBAAqB,KAAK;AACxD,WAAO,KAAK;AACZ,QAAI,CAAC,MAAO;AACZ,QAAI,MAAM,gBAAgB,SAAS;AAC/B,WAAK,KAAK,QAAQ,MAAM;AAAA,IAC5B;AACA,SAAK,WAAW,KAAK;AACrB,SAAK,cAAc;AACnB,SAAK,KAAK,MAAM,sBAAsB,MAAM,SAAS;AACrD,SAAK,oBAAoB,OAAO,MAAM,MAAM;AAAA,EAChD;AAAA,EAEO,kBAAkB,OAA2B;AAChD,UAAM,EAAE,OAAO,MAAM,IAAI,KAAK,qBAAqB,KAAK;AACxD,QAAI,CAAC,MAAO;AAEZ,QAAI,CAAC,KAAK,gBAAgB;AACtB;AAAA,IACJ;AACA,UAAM,QAAQ,KAAK,wBAAwB,OAAO,KAAK,EAAE,SAAS;AAClE,UAAM,OAAO,QAAQ,WAAW,MAAM,KAAK;AAC3C,SAAK,KAAK,gBAAgB;AAC1B,SAAK,cAAc;AAAA,EACvB;AAAA,EAEO,WAAW,OAA0B;AACxC,YACI,SAAS,KAAK,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,KAAK,YAAY;AACtE,QAAI,CAAC,MAAO;AACZ,UAAM,OAAO,YAAY;AACzB,WAAO,KAAK;AACZ,UAAM,OAAO,WAAW;AAAA,EAC5B;AAAA,EAuDQ,oBACJ,OACA,QACI;AACJ,UAAM,gBAAgB,OAAO;AAE7B,UAAM,cAAc,IAAI,MAAM,UAAU;AAAA,MACpC,SAAS;AAAA,MACT,UAAU;AAAA,IACd,CAAC;AAED,WAAO,cAAc,WAAW;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,wBACJ,OACA,OACM;AACN,UAAM,OAAO,KAAK;AAClB,UAAM,YAAY,KAAK;AACvB,UAAM,SAAS,MAAM;AACrB,UAAM,OAAO,KAAK;AAElB,UAAM,oBAAoB,KAAK,KAAK,QAC9B,SAAS,YACT,QAAQ,SAAS;AACvB,UAAM,aAAa,oBAAoB;AAEvC,WAAO,MAAM,cAAc;AAAA,MACvB;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,IAChB;AAAA,EACJ;AAAA,EAEO,aACH,OACA,OACA,QACA,eACc;AApgBtB;AAqgBQ,UAAM,UAAU;AAAA,MACZ,QAAQ;AAAA,MACR,YAAU,UAAK,mBAAL,mBAAqB,gBAAe,MAAM;AAAA,MACpD,oBAAoB,MAAM;AAAA,IAC9B;AACA,UAAM,QAAQ;AAAA,MACV,CAAC,KAAK,KAAK,QAAQ,SAAS,OAAO,GAAG,GAClC,MAAM,kBAAkB,GAC5B;AAAA,MACA,WAAW,OAAO,SAAS;AAAA,MAC3B,GAAI,iBAAiB;AAAA,QACjB,oBAAoB,iDAAiD,KAAK;AAAA,QAC1E,gBAAgB,6CAA6C,KAAK;AAAA,MACtE;AAAA,IACJ;AACA,UAAM,iBAAiB,gBAAgB,eAAe,KAAK,KAAK;AAChE,WAAO;AAAA;AAAA,wBAES,SAAS,OAAO,CAAC;AAAA,uBAClB,MAAM,IAAI;AAAA,wBACT,SAAS,KAAK,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAMP,KAAK;AAAA,0BACX,MAAM,MAAM,GAAG;AAAA,0BACf,MAAM,MAAM,GAAG;AAAA,2BACd,MAAM,IAAI;AAAA,4BACT,MAAM,KAAK;AAAA,oCACH;AAAA,MACZ,KAAK,KAAK,WAAW,SAAS;AAAA,IAClC,CAAC;AAAA,+BACU,UAAU,KAAK,KAAK,WAAW,KAAK,MAAS,CAAC;AAAA,iCAC5C,UAAU,MAAM,SAAS,CAAC;AAAA,sCACrB,cAAc;AAAA,qCACf,KAAK,wBAAwB,KAAK,CAAC;AAAA;AAAA,8BAE1C,KAAK,aAAa;AAAA,6BACnB,KAAK,YAAY;AAAA,4BAClB,KAAK,WAAW;AAAA,+BACb,KAAK,cAAc;AAAA,6BACrB,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ9B;AAAA,EAEO,SAA2B;AAC9B,SAAK,0BAA0B;AAC/B,WAAO,KAAK,MAAM,IAAI,CAAC,OAAO,UAAU;AACpC,YAAM,SAAS,KAAK,YAAY,QAAQ,MAAM,IAAI,IAAI;AACtD,aAAO,KAAK;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,MAAM,SAAS;AAAA,MACxB;AAAA,IACJ,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,gBAAoC;AACvC,UAAM,SAAS,KAAK,MAAM,IAAI,CAAC,UAAU,MAAM,eAAe;AAC9D,WAAO,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAG3B,WAAO,QAAQ,CAAC;AAChB,WAAO,OAAO,IAAI,CAAC,OAAO,OAAO,UAAO;AAllBhD;AAklBmD;AAAA,QACvC;AAAA,SACA,WAAM,QAAQ,CAAC,MAAf,YAAoB;AAAA,MACxB;AAAA,KAAC;AAAA,EACL;AAAA,EAEQ,cAAoB;AACxB,UAAM,UAAU,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC;AAEzC,UAAM,mBAAmB,CAAC,UAAiC;AACvD,YAAM,SAAS,QAAQ,KAAK;AAC5B,YAAM,WAAW,QAAQ,QAAQ,CAAC;AAClC,YAAM,OAAO,QAAQ,QAAQ,CAAC;AAE9B,YAAM,MACF,OAAO,OAAO,QAAQ,WAChB,OAAO,MACN,KAAK,KAAK;AACrB,YAAM,MACF,OAAO,OAAO,QAAQ,WAChB,OAAO,MACN,KAAK,KAAK;AAErB,YAAM,SAAwB;AAAA,QAC1B,OAAO,EAAE,KAAU,IAAS;AAAA,QAC5B,OAAO,EAAE,KAAU,IAAS;AAAA,MAChC;AAEA,UAAI,OAAO,QAAQ,YAAY;AAC3B,YAAI,UAAU;AACV,mBAAS,IAAI,QAAQ,GAAG,KAAK,GAAG,KAAK;AACjC,kBAAM,OAAO,QAAQ,CAAC;AACtB,gBAAI,OAAO,KAAK,QAAQ,UAAU;AAC9B,qBAAO,MAAM,MAAM,KAAK;AACxB;AAAA,YACJ;AAAA,UACJ;AACA,iBAAO,MAAM,MAAM,KAAK;AAAA,YACpB,SAAS;AAAA,YACT,OAAO,MAAM;AAAA,UACjB;AAAA,QACJ;AACA,YAAI,MAAoB;AACpB,cAAI,CAAC,UAAU;AACX,mBAAO,MAAM;AAAA,cACT,KAAK;AAAA,cACL;AAAA,cACA;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AACA,UAAI,OAAO,QAAQ,QAAQ;AACvB,YAAI,MAAM;AACN,mBAAS,IAAI,QAAQ,GAAG,IAAI,QAAQ,QAAQ,KAAK;AAC7C,kBAAM,OAAO,QAAQ,CAAC;AACtB,gBAAI,OAAO,KAAK,QAAQ,UAAU;AAC9B,qBAAO,MAAM,MAAM,KAAK;AACxB;AAAA,YACJ;AAAA,UACJ;AACA,iBAAO,MAAM,MAAM,KAAK,IAAI,KAAK,OAAO,OAAO,MAAM,GAAG;AAAA,QAC5D;AACA,YAAI,MAAoB;AACpB,cAAI,CAAC,MAAM;AACP,mBAAO,MAAM;AAAA,cACT,KAAK;AAAA,cACL;AAAA,cACA;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAEA,UAAM,cAAc,QAAQ,IAAI,CAAC,QAAQ,UAAU;AA9pB3D;AA+pBY,YAAM,gBAAgB,iBAAiB,KAAK;AAC5C,YAAM,EAAE,aAAa,IAAI,OAAO;AAChC,YAAM,eAAe,KAAK;AAAA,QACtB,KAAK,IAAI,OAAO,OAAO,cAAc,MAAM,GAAG;AAAA,QAC9C,cAAc,MAAM;AAAA,MACxB;AACA,YAAM,kBAAkB;AAAA,QACpB;AAAA,QACA,cAAc,MAAM;AAAA,QACpB,cAAc,MAAM;AAAA,MACxB;AACA,YAAM,QAAQ;AAAA,QACV,MAAM,OAAO;AAAA,QACb,OAAO;AAAA,QACP;AAAA,QACA,WAAW,OAAO;AAAA,QAClB,OAAM,YAAO,SAAP,YAAe,KAAK,KAAK;AAAA,QAC/B,eAAe,OAAO;AAAA,QACtB;AAAA,QACA,WACI,WAAW,KAAK,SAAQ,iCAAQ,MAAM,UAAS,IACzC,OAAO,QACP;AAAA,QACV,GAAG;AAAA,MACP;AACA,aAAO;AAAA,IACX,CAAC;AAED,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,MAAa,wBAAuC;AAChD,UAAM,UAAU,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC,EACpC,OAAO,CAAC,WAAW,WAAW,KAAK,IAAI,EACvC,IAAI,CAAC,WAAW,OAAO,cAAc;AAC1C,UAAM,QAAQ,IAAI,OAAO;AAAA,EAC7B;AACJ;",
4
+ "sourcesContent": ["/*\nCopyright 2021 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport { html, TemplateResult } from '@spectrum-web-components/base';\nimport {\n classMap,\n ifDefined,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\nimport { MutationController } from '@lit-labs/observers/mutation-controller.js';\nimport { Slider } from './Slider.dev.js'\nimport { SliderHandle, SliderNormalization } from './SliderHandle.dev.js'\n\ninterface HandleReference {\n handle: HTMLElement;\n input: HTMLInputElement;\n}\n\ninterface HandleComponents extends HandleReference {\n model: SliderHandle;\n}\n\ninterface RangeAndClamp {\n range: { min: number; max: number };\n clamp: { min: number; max: number };\n}\ninterface ModelValue extends RangeAndClamp {\n name: string;\n value: number;\n normalizedValue: number;\n step: number;\n highlight: boolean;\n ariaLabel?: string;\n normalization: SliderNormalization;\n handle: SliderHandle;\n}\n\ninterface InputWithModel extends HTMLInputElement {\n model: ModelValue;\n}\n\ninterface DataFromPointerEvent {\n resolvedInput: boolean;\n input: InputWithModel;\n model?: ModelValue;\n}\n\nexport interface HandleValueDictionary {\n [key: string]: number;\n}\n\nexport class HandleController {\n private host!: Slider;\n private handles: Map<string, SliderHandle> = new Map();\n private model: ModelValue[] = [];\n private handleOrder: string[] = [];\n private draggingHandle?: SliderHandle;\n private handleRefMap?: WeakMap<SliderHandle, HandleReference>;\n\n constructor(host: Slider) {\n this.host = host;\n\n new MutationController(this.host, {\n config: {\n subtree: true,\n childList: true,\n },\n callback: () => {\n this.extractModelFromLightDom();\n },\n });\n\n this.extractModelFromLightDom();\n }\n\n public get values(): HandleValueDictionary {\n const result: HandleValueDictionary = {};\n for (const model of this.handles.values()) {\n result[model.handleName] = model.value;\n }\n return result;\n }\n\n public get size(): number {\n return this.handles.size;\n }\n\n public inputForHandle(handle: SliderHandle): HTMLInputElement | undefined {\n if (this.handles.has(handle.handleName)) {\n const { input } = this.getHandleElements(handle) || {};\n return input;\n }\n /* c8 ignore next 2 */\n throw new Error(`No input for handle \"${handle.name}\"`);\n }\n\n public requestUpdate(): void {\n if (this.host.hasUpdated) {\n this.host.requestUpdate();\n }\n }\n\n /**\n * It is possible for value attributes to be set programmatically. The <input>\n * for a particular slider needs to have an opportunity to validate any such\n * values\n *\n * @param handle Handle who's value needs validation\n */\n public setValueFromHandle(handle: SliderHandle): void {\n const elements = this.getHandleElements(handle);\n /* c8 ignore next */\n if (!elements) return;\n\n const { input } = elements;\n if (input.valueAsNumber === handle.value) {\n if (handle.dragging) {\n handle.dispatchInputEvent();\n }\n } else {\n input.valueAsNumber = handle.value;\n this.requestUpdate();\n }\n handle.value = input.valueAsNumber;\n }\n\n public handleHasChanged(handle: SliderHandle): void {\n if (handle !== this.host) {\n this.requestUpdate();\n }\n }\n\n public formattedValueForHandle(model: ModelValue): string {\n const { handle } = model;\n const numberFormat = handle.numberFormat ?? this.host.numberFormat;\n const _forcedUnit =\n handle._forcedUnit === ''\n ? this.host._forcedUnit\n : handle._forcedUnit;\n return (\n handle.getAriaHandleText(model.value, numberFormat) + _forcedUnit\n );\n }\n\n public get formattedValues(): Map<string, string> {\n const result = new Map<string, string>();\n for (const model of this.model) {\n result.set(model.name, this.formattedValueForHandle(model));\n }\n return result;\n }\n\n public get focusElement(): HTMLElement {\n const { input } = this.getActiveHandleElements();\n if (\n !input ||\n (this.host.editable &&\n !(input as InputWithModel).model.handle.dragging)\n ) {\n return this.host.numberField;\n }\n return input;\n }\n\n protected handleOrientation = (): void => {\n this.updateBoundingRect();\n };\n\n public hostConnected(): void {\n if ('orientation' in screen) {\n screen.orientation.addEventListener(\n 'change',\n this.handleOrientation\n );\n } else {\n window.addEventListener(\n 'orientationchange',\n this.handleOrientation\n );\n }\n }\n\n public hostDisconnected(): void {\n if ('orientation' in screen) {\n screen.orientation.removeEventListener(\n 'change',\n this.handleOrientation\n );\n } else {\n window.removeEventListener(\n 'orientationchange',\n this.handleOrientation\n );\n }\n }\n\n public hostUpdate(): void {\n this.updateModel();\n }\n\n // Since extractModelFromLightDom bails on the first un-upgraded handle,\n // a maximum of one listener will be set up per extraction attempt.\n private waitForUpgrade(handle: HTMLElement): boolean {\n if (handle instanceof SliderHandle) {\n return false;\n }\n handle.addEventListener(\n 'sp-slider-handle-ready',\n () => this.extractModelFromLightDom(),\n { once: true, passive: true }\n );\n return true;\n }\n\n private extractModelFromLightDom = (): void => {\n let handles = [\n ...this.host.querySelectorAll('[slot=\"handle\"]'),\n ] as SliderHandle[];\n if (handles.length === 0) {\n handles = [this.host as SliderHandle];\n }\n // extractModelFromLightDom depends on slotted handles already having been upgraded\n if (handles.some((h) => this.waitForUpgrade(h))) {\n return;\n }\n this.handles = new Map();\n this.handleOrder = [];\n handles.forEach((handle, index) => {\n /* c8 ignore next */\n if (!handle.handleName?.length) {\n handle.name = `handle${index + 1}`;\n }\n this.handles.set(handle.handleName, handle);\n this.handleOrder.push(handle.handleName);\n handle.handleController = this;\n });\n this.requestUpdate();\n };\n\n public get activeHandle(): string {\n return this.handleOrder[this.handleOrder.length - 1];\n }\n\n public get activeHandleInputId(): string {\n const active = this.activeHandle;\n const index = this.model.findIndex((model) => model.name === active);\n return `input-${index}`;\n }\n\n public activateHandle(name: string): void {\n const index = this.handleOrder.findIndex((item) => item === name);\n if (index >= 0) {\n this.handleOrder.splice(index, 1);\n }\n this.handleOrder.push(name);\n }\n\n public get activeHandleModel(): ModelValue {\n const active = this.activeHandle;\n return this.model.find((model) => model.name === active)!;\n }\n\n private getActiveHandleElements(): HandleComponents {\n const name = this.activeHandle;\n const handleSlider = this.handles.get(name) as SliderHandle;\n const elements = this.getHandleElements(\n handleSlider\n ) as HandleReference;\n return { model: handleSlider, ...elements };\n }\n\n private getHandleElements(sliderHandle: SliderHandle): HandleReference {\n if (!this.handleRefMap) {\n this.handleRefMap = new WeakMap();\n\n const inputNodes =\n this.host.shadowRoot.querySelectorAll('.handle > input');\n for (const inputNode of inputNodes) {\n const input = inputNode as HTMLInputElement;\n const handle = input.parentElement as HTMLElement;\n const model = this.handles.get(\n handle.getAttribute('name') as string\n );\n if (model) {\n this.handleRefMap.set(model, { input, handle });\n }\n }\n }\n\n const components = this.handleRefMap.get(\n sliderHandle\n ) as HandleReference;\n return components;\n }\n\n private clearHandleComponentCache(): void {\n delete this.handleRefMap;\n }\n\n private _boundingClientRect?: DOMRect;\n\n private get boundingClientRect(): DOMRect {\n if (!this._boundingClientRect) {\n this._boundingClientRect = this.host.track.getBoundingClientRect();\n }\n return this._boundingClientRect;\n }\n\n private updateBoundingRect(): void {\n delete this._boundingClientRect;\n }\n\n /**\n * Return the `input` and `model` associated with the event and\n * whether the `input` is a `resolvedInput` meaning it was acquired\n * from the `model` rather than the event.\n */\n protected extractDataFromEvent(event: PointerEvent): DataFromPointerEvent {\n if (!this._activePointerEventData) {\n let input = (event.target as Element).querySelector(\n ':scope > .input'\n ) as InputWithModel;\n const resolvedInput = !input;\n const model = input\n ? input.model\n : this.model.find((item) => item.name === this.activeHandle);\n if (!input && !!model) {\n input = model.handle.focusElement as InputWithModel;\n }\n this._activePointerEventData = {\n input,\n model,\n resolvedInput,\n };\n }\n return this._activePointerEventData;\n }\n\n private _activePointerEventData!: DataFromPointerEvent | undefined;\n\n /**\n * @description check for defaultvalue(value) property in sp-slider and reset on double click on sliderHandle\n * @param event\n */\n public handleDoubleClick(event: PointerEvent): void {\n const input = (event.target as Element).querySelector(\n '.input'\n ) as InputWithModel;\n\n if (input.model?.handle.defaultValue !== undefined) {\n input.model.handle.value = input.model.handle.defaultValue;\n this.dispatchChangeEvent(input, input.model.handle);\n input.model.handle.dispatchInputEvent();\n this.requestUpdate();\n }\n }\n\n public handlePointerdown(event: PointerEvent): void {\n const { resolvedInput, model } = this.extractDataFromEvent(event);\n if (!model || this.host.disabled || event.button !== 0) {\n event.preventDefault();\n return;\n }\n this.host.track.setPointerCapture(event.pointerId);\n this.updateBoundingRect();\n if (event.pointerType === 'mouse') {\n this.host.labelEl.click();\n }\n this.draggingHandle = model.handle;\n model.handle.dragging = true;\n this.activateHandle(model.name);\n if (resolvedInput) {\n // When the input is resolved forward the pointer event to\n // `handlePointermove` in order to update the value/UI becuase\n // the pointer event was on the track not a handle\n this.handlePointermove(event);\n }\n this.requestUpdate();\n }\n\n public handlePointerup(event: PointerEvent): void {\n const { input, model } = this.extractDataFromEvent(event);\n delete this._activePointerEventData;\n if (!model) return;\n if (event.pointerType === 'mouse') {\n this.host.labelEl.click();\n }\n this.cancelDrag(model);\n this.requestUpdate();\n this.host.track.releasePointerCapture(event.pointerId);\n this.dispatchChangeEvent(input, model.handle);\n }\n\n public handlePointermove(event: PointerEvent): void {\n const { input, model } = this.extractDataFromEvent(event);\n if (!model) return;\n /* c8 ignore next 3 */\n if (!this.draggingHandle) {\n return;\n }\n input.value = this.calculateHandlePosition(event, model).toString();\n model.handle.value = parseFloat(input.value);\n this.host.indeterminate = false;\n this.requestUpdate();\n }\n\n public cancelDrag(model?: ModelValue): void {\n model =\n model || this.model.find((item) => item.name === this.activeHandle);\n if (!model) return;\n model.handle.highlight = false;\n delete this.draggingHandle;\n model.handle.dragging = false;\n }\n\n /**\n * Keep the slider value property in sync with the input element's value\n */\n private onInputChange = (event: Event): void => {\n const input = event.target as InputWithModel;\n input.model.handle.value = input.valueAsNumber;\n\n this.requestUpdate();\n this.dispatchChangeEvent(input, input.model.handle);\n };\n\n private onInputFocus = (event: Event): void => {\n const input = event.target as InputWithModel;\n let isFocusVisible;\n try {\n isFocusVisible =\n input.matches(':focus-visible') ||\n this.host.matches('.focus-visible');\n /* c8 ignore next 3 */\n } catch (error) {\n isFocusVisible = this.host.matches('.focus-visible');\n }\n input.model.handle.highlight = isFocusVisible;\n this.requestUpdate();\n };\n\n private onInputBlur = (event: Event): void => {\n const input = event.target as InputWithModel;\n input.model.handle.highlight = false;\n this.requestUpdate();\n };\n\n private onInputKeydown = (event: KeyboardEvent): void => {\n if (event.key == 'Escape') {\n const input = event.target as InputWithModel;\n if (\n input.model.handle?.defaultValue !== undefined &&\n input.model.handle.value !== input.model.handle.defaultValue\n ) {\n input.model.handle.value = input.model.handle.defaultValue;\n input.model.handle.dispatchInputEvent();\n this.dispatchChangeEvent(input, input.model.handle);\n this.requestUpdate();\n event.preventDefault();\n event.stopPropagation();\n }\n return;\n }\n const input = event.target as InputWithModel;\n input.model.handle.highlight = true;\n this.requestUpdate();\n };\n\n private dispatchChangeEvent(\n input: HTMLInputElement,\n handle: SliderHandle\n ): void {\n input.valueAsNumber = handle.value;\n\n const changeEvent = new Event('change', {\n bubbles: true,\n composed: true,\n });\n\n handle.dispatchEvent(changeEvent);\n }\n\n /**\n * Returns the value under the cursor\n * @param: PointerEvent on slider\n * @return: Slider value that correlates to the position under the pointer\n */\n private calculateHandlePosition(\n event: PointerEvent | MouseEvent,\n model: ModelValue\n ): number {\n const rect = this.boundingClientRect;\n const minOffset = rect.left;\n const offset = event.clientX;\n const size = rect.width;\n\n const directionalOffset = this.host.isLTR\n ? offset - minOffset\n : size - (offset - minOffset);\n const normalized = directionalOffset / size;\n\n return model.normalization.fromNormalized(\n normalized,\n model.range.min,\n model.range.max\n );\n }\n\n public renderHandle(\n model: ModelValue,\n index: number,\n zIndex: number,\n isMultiHandle: boolean\n ): TemplateResult {\n const classes = {\n handle: true,\n dragging: this.draggingHandle?.handleName === model.name,\n 'handle-highlight': model.highlight,\n };\n const style = {\n [this.host.isLTR ? 'left' : 'right']: `${\n model.normalizedValue * 100\n }%`,\n 'z-index': zIndex.toString(),\n ...(isMultiHandle && {\n 'background-color': `var(--spectrum-slider-handle-background-color-${index}, var(--spectrum-slider-handle-background-color))`,\n 'border-color': `var(--spectrum-slider-handle-border-color-${index}, var(--spectrum-slider-handle-border-color))`,\n }),\n };\n const ariaLabelledBy = isMultiHandle ? `label input-${index}` : 'label';\n return html`\n <div\n class=${classMap(classes)}\n name=${model.name}\n style=${styleMap(style)}\n role=\"presentation\"\n >\n <input\n type=\"range\"\n class=\"input\"\n id=\"input-${index}\"\n min=${model.clamp.min}\n max=${model.clamp.max}\n step=${model.step}\n value=${model.value}\n aria-disabled=${ifDefined(\n this.host.disabled ? 'true' : undefined\n )}\n tabindex=${ifDefined(this.host.editable ? -1 : undefined)}\n aria-label=${ifDefined(model.ariaLabel)}\n aria-labelledby=${ariaLabelledBy}\n aria-valuetext=${this.formattedValueForHandle(model)}\n aria-describedby=\"slider-description\"\n @change=${this.onInputChange}\n @focus=${this.onInputFocus}\n @blur=${this.onInputBlur}\n @keydown=${this.onInputKeydown}\n .model=${model}\n />\n <span id=\"slider-description\">\n Press escape or double click to reset the slider to its\n default value.\n </span>\n </div>\n `;\n }\n\n public render(): TemplateResult[] {\n this.clearHandleComponentCache();\n return this.model.map((model, index) => {\n const zIndex = this.handleOrder.indexOf(model.name) + 2;\n return this.renderHandle(\n model,\n index,\n zIndex,\n this.model.length > 1\n );\n });\n }\n\n /**\n * Returns a list of track segment [start, end] tuples where the values are\n * normalized to be between 0 and 1.\n * @returns A list of track segment tuples [start, end]\n */\n public trackSegments(): [number, number][] {\n const values = this.model.map((model) => model.normalizedValue);\n values.sort((a, b) => a - b);\n\n // The first segment always starts at 0\n values.unshift(0);\n return values.map((value, index, array) => [\n value,\n array[index + 1] ?? 1,\n ]);\n }\n\n private updateModel(): void {\n const handles = [...this.handles.values()];\n\n const getRangeAndClamp = (index: number): RangeAndClamp => {\n const handle = handles[index];\n const previous = handles[index - 1];\n const next = handles[index + 1];\n\n const min =\n typeof handle.min === 'number'\n ? handle.min\n : (this.host.min as number);\n const max =\n typeof handle.max === 'number'\n ? handle.max\n : (this.host.max as number);\n\n const result: RangeAndClamp = {\n range: { min: min, max: max },\n clamp: { min: min, max: max },\n };\n\n if (handle.min === 'previous') {\n if (previous) {\n for (let j = index - 1; j >= 0; j--) {\n const item = handles[j];\n if (typeof item.min === 'number') {\n result.range.min = item.min;\n break;\n }\n }\n result.clamp.min = Math.max(\n previous.value,\n result.range.min\n );\n }\n if (window.__swc.DEBUG) {\n if (!previous) {\n window.__swc.warn(\n this.host,\n '<sp-slider-handle> elements that are the first child of an <sp-slider> element cannot have attribute \"min=\\'previous\\'\"`',\n 'https://opensource.adobe.com/spectrum-web-components/components/slider-handle/#multi-handle-slider-with-ordered-handles'\n );\n }\n }\n }\n if (handle.max === 'next') {\n if (next) {\n for (let j = index + 1; j < handles.length; j++) {\n const item = handles[j];\n if (typeof item.max === 'number') {\n result.range.max = item.max;\n break;\n }\n }\n result.clamp.max = Math.min(next.value, result.range.max);\n }\n if (window.__swc.DEBUG) {\n if (!next) {\n window.__swc.warn(\n this.host,\n '<sp-slider-handle> elements that are the last child of an <sp-slider> element cannot have attribute \"max=\\'next\\'\"',\n 'https://opensource.adobe.com/spectrum-web-components/components/slider-handle/#multi-handle-slider-with-ordered-handles'\n );\n }\n }\n }\n return result;\n };\n\n const modelValues = handles.map((handle, index) => {\n const rangeAndClamp = getRangeAndClamp(index);\n const { toNormalized } = handle.normalization;\n const clampedValue = Math.max(\n Math.min(handle.value, rangeAndClamp.clamp.max),\n rangeAndClamp.clamp.min\n );\n const normalizedValue = toNormalized(\n clampedValue,\n rangeAndClamp.range.min,\n rangeAndClamp.range.max\n );\n const model = {\n name: handle.handleName,\n value: clampedValue,\n normalizedValue,\n highlight: handle.highlight,\n step: handle.step ?? this.host.step,\n normalization: handle.normalization,\n handle,\n ariaLabel:\n handle !== this.host && handle?.label.length > 0\n ? handle.label\n : undefined,\n ...rangeAndClamp,\n };\n return model;\n });\n\n this.model = modelValues;\n }\n\n public async handleUpdatesComplete(): Promise<void> {\n const updates = [...this.handles.values()]\n .filter((handle) => handle !== this.host)\n .map((handle) => handle.updateComplete);\n await Promise.all(updates);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["input"]
7
7
  }
@@ -1,4 +1,4 @@
1
- "use strict";import{html as m}from"@spectrum-web-components/base";import{classMap as p,ifDefined as c,styleMap as g}from"@spectrum-web-components/base/src/directives.js";import{MutationController as v}from"@lit-labs/observers/mutation-controller.js";import{SliderHandle as f}from"./SliderHandle.js";export class HandleController{constructor(e){this.handles=new Map;this.model=[];this.handleOrder=[];this.handleOrientation=()=>{this.updateBoundingRect()};this.extractModelFromLightDom=()=>{let e=[...this.host.querySelectorAll('[slot="handle"]')];e.length===0&&(e=[this.host]),!e.some(t=>this.waitForUpgrade(t))&&(this.handles=new Map,this.handleOrder=[],e.forEach((t,n)=>{var a;(a=t.handleName)!=null&&a.length||(t.name=`handle${n+1}`),this.handles.set(t.handleName,t),this.handleOrder.push(t.handleName),t.handleController=this}),this.requestUpdate())};this.onInputChange=e=>{const t=e.target;t.model.handle.value=t.valueAsNumber,this.requestUpdate(),this.dispatchChangeEvent(t,t.model.handle)};this.onInputFocus=e=>{const t=e.target;let n;try{n=t.matches(":focus-visible")||this.host.matches(".focus-visible")}catch(a){n=this.host.matches(".focus-visible")}t.model.handle.highlight=n,this.requestUpdate()};this.onInputBlur=e=>{const t=e.target;t.model.handle.highlight=!1,this.requestUpdate()};this.onInputKeydown=e=>{var n;if(e.key=="Escape"){const a=e.target;((n=a.model.handle)==null?void 0:n.defaultValue)!==void 0&&a.model.handle.value!==a.model.handle.defaultValue&&(a.model.handle.value=a.model.handle.defaultValue,a.model.handle.dispatchInputEvent(),this.dispatchChangeEvent(a,a.model.handle),this.requestUpdate(),e.preventDefault(),e.stopPropagation());return}const t=e.target;t.model.handle.highlight=!0,this.requestUpdate()};this.host=e,new v(this.host,{config:{subtree:!0,childList:!0},callback:()=>{this.extractModelFromLightDom()}}),this.extractModelFromLightDom()}get values(){const e={};for(const t of this.handles.values())e[t.handleName]=t.value;return e}get size(){return this.handles.size}inputForHandle(e){if(this.handles.has(e.handleName)){const{input:t}=this.getHandleElements(e)||{};return t}throw new Error(`No input for handle "${e.name}"`)}requestUpdate(){this.host.hasUpdated&&this.host.requestUpdate()}setValueFromHandle(e){const t=this.getHandleElements(e);if(!t)return;const{input:n}=t;n.valueAsNumber===e.value?e.dragging&&e.dispatchInputEvent():(n.valueAsNumber=e.value,this.requestUpdate()),e.value=n.valueAsNumber}handleHasChanged(e){e!==this.host&&this.requestUpdate()}formattedValueForHandle(e){var i;const{handle:t}=e,n=(i=t.numberFormat)!=null?i:this.host.numberFormat,a=t._forcedUnit===""?this.host._forcedUnit:t._forcedUnit;return t.getAriaHandleText(e.value,n)+a}get formattedValues(){const e=new Map;for(const t of this.model)e.set(t.name,this.formattedValueForHandle(t));return e}get focusElement(){const{input:e}=this.getActiveHandleElements();return!e||this.host.editable&&!e.model.handle.dragging?this.host.numberField:e}hostConnected(){"orientation"in screen?screen.orientation.addEventListener("change",this.handleOrientation):window.addEventListener("orientationchange",this.handleOrientation)}hostDisconnected(){"orientation"in screen?screen.orientation.removeEventListener("change",this.handleOrientation):window.removeEventListener("orientationchange",this.handleOrientation)}hostUpdate(){this.updateModel()}waitForUpgrade(e){return e instanceof f?!1:(e.addEventListener("sp-slider-handle-ready",()=>this.extractModelFromLightDom(),{once:!0,passive:!0}),!0)}get activeHandle(){return this.handleOrder[this.handleOrder.length-1]}get activeHandleInputId(){const e=this.activeHandle;return`input-${this.model.findIndex(n=>n.name===e)}`}activateHandle(e){const t=this.handleOrder.findIndex(n=>n===e);t>=0&&this.handleOrder.splice(t,1),this.handleOrder.push(e)}getActiveHandleElements(){const e=this.activeHandle,t=this.handles.get(e),n=this.getHandleElements(t);return{model:t,...n}}getHandleElements(e){if(!this.handleRefMap){this.handleRefMap=new WeakMap;const n=this.host.shadowRoot.querySelectorAll(".handle > input");for(const a of n){const i=a,l=i.parentElement,r=this.handles.get(l.getAttribute("name"));r&&this.handleRefMap.set(r,{input:i,handle:l})}}return this.handleRefMap.get(e)}clearHandleComponentCache(){delete this.handleRefMap}get boundingClientRect(){return this._boundingClientRect||(this._boundingClientRect=this.host.track.getBoundingClientRect()),this._boundingClientRect}updateBoundingRect(){delete this._boundingClientRect}extractDataFromEvent(e){if(!this._activePointerEventData){let t=e.target.querySelector(":scope > .input");const n=!t,a=t?t.model:this.model.find(i=>i.name===this.activeHandle);!t&&a&&(t=a.handle.focusElement),this._activePointerEventData={input:t,model:a,resolvedInput:n}}return this._activePointerEventData}handleDoubleClick(e){var n;const t=e.target.querySelector(".input");((n=t.model)==null?void 0:n.handle.defaultValue)!==void 0&&(t.model.handle.value=t.model.handle.defaultValue,this.dispatchChangeEvent(t,t.model.handle),t.model.handle.dispatchInputEvent(),this.requestUpdate())}handlePointerdown(e){const{resolvedInput:t,model:n}=this.extractDataFromEvent(e);if(!n||this.host.disabled||e.button!==0){e.preventDefault();return}this.host.track.setPointerCapture(e.pointerId),this.updateBoundingRect(),e.pointerType==="mouse"&&this.host.labelEl.click(),this.draggingHandle=n.handle,n.handle.dragging=!0,this.activateHandle(n.name),t&&this.handlePointermove(e),this.requestUpdate()}handlePointerup(e){const{input:t,model:n}=this.extractDataFromEvent(e);delete this._activePointerEventData,n&&(e.pointerType==="mouse"&&this.host.labelEl.click(),this.cancelDrag(n),this.requestUpdate(),this.host.track.releasePointerCapture(e.pointerId),this.dispatchChangeEvent(t,n.handle))}handlePointermove(e){const{input:t,model:n}=this.extractDataFromEvent(e);n&&this.draggingHandle&&(t.value=this.calculateHandlePosition(e,n).toString(),n.handle.value=parseFloat(t.value),this.host.indeterminate=!1,this.requestUpdate())}cancelDrag(e){e=e||this.model.find(t=>t.name===this.activeHandle),e&&(e.handle.highlight=!1,delete this.draggingHandle,e.handle.dragging=!1)}dispatchChangeEvent(e,t){e.valueAsNumber=t.value;const n=new Event("change",{bubbles:!0,composed:!0});t.dispatchEvent(n)}calculateHandlePosition(e,t){const n=this.boundingClientRect,a=n.left,i=e.clientX,l=n.width,s=(this.host.isLTR?i-a:l-(i-a))/l;return t.normalization.fromNormalized(s,t.range.min,t.range.max)}renderHandle(e,t,n,a){var s;const i={handle:!0,dragging:((s=this.draggingHandle)==null?void 0:s.handleName)===e.name,"handle-highlight":e.highlight},l={[this.host.isLTR?"left":"right"]:`${e.normalizedValue*100}%`,"z-index":n.toString(),...a&&{"background-color":`var(--spectrum-slider-handle-background-color-${t}, var(--spectrum-slider-handle-background-color))`,"border-color":`var(--spectrum-slider-handle-border-color-${t}, var(--spectrum-slider-handle-border-color))`}},r=a?`label input-${t}`:"label";return m`
1
+ "use strict";import{html as m}from"@spectrum-web-components/base";import{classMap as p,ifDefined as c,styleMap as g}from"@spectrum-web-components/base/src/directives.js";import{MutationController as v}from"@lit-labs/observers/mutation-controller.js";import{SliderHandle as f}from"./SliderHandle.js";export class HandleController{constructor(e){this.handles=new Map;this.model=[];this.handleOrder=[];this.handleOrientation=()=>{this.updateBoundingRect()};this.extractModelFromLightDom=()=>{let e=[...this.host.querySelectorAll('[slot="handle"]')];e.length===0&&(e=[this.host]),!e.some(t=>this.waitForUpgrade(t))&&(this.handles=new Map,this.handleOrder=[],e.forEach((t,n)=>{var a;(a=t.handleName)!=null&&a.length||(t.name=`handle${n+1}`),this.handles.set(t.handleName,t),this.handleOrder.push(t.handleName),t.handleController=this}),this.requestUpdate())};this.onInputChange=e=>{const t=e.target;t.model.handle.value=t.valueAsNumber,this.requestUpdate(),this.dispatchChangeEvent(t,t.model.handle)};this.onInputFocus=e=>{const t=e.target;let n;try{n=t.matches(":focus-visible")||this.host.matches(".focus-visible")}catch(a){n=this.host.matches(".focus-visible")}t.model.handle.highlight=n,this.requestUpdate()};this.onInputBlur=e=>{const t=e.target;t.model.handle.highlight=!1,this.requestUpdate()};this.onInputKeydown=e=>{var n;if(e.key=="Escape"){const a=e.target;((n=a.model.handle)==null?void 0:n.defaultValue)!==void 0&&a.model.handle.value!==a.model.handle.defaultValue&&(a.model.handle.value=a.model.handle.defaultValue,a.model.handle.dispatchInputEvent(),this.dispatchChangeEvent(a,a.model.handle),this.requestUpdate(),e.preventDefault(),e.stopPropagation());return}const t=e.target;t.model.handle.highlight=!0,this.requestUpdate()};this.host=e,new v(this.host,{config:{subtree:!0,childList:!0},callback:()=>{this.extractModelFromLightDom()}}),this.extractModelFromLightDom()}get values(){const e={};for(const t of this.handles.values())e[t.handleName]=t.value;return e}get size(){return this.handles.size}inputForHandle(e){if(this.handles.has(e.handleName)){const{input:t}=this.getHandleElements(e)||{};return t}throw new Error(`No input for handle "${e.name}"`)}requestUpdate(){this.host.hasUpdated&&this.host.requestUpdate()}setValueFromHandle(e){const t=this.getHandleElements(e);if(!t)return;const{input:n}=t;n.valueAsNumber===e.value?e.dragging&&e.dispatchInputEvent():(n.valueAsNumber=e.value,this.requestUpdate()),e.value=n.valueAsNumber}handleHasChanged(e){e!==this.host&&this.requestUpdate()}formattedValueForHandle(e){var i;const{handle:t}=e,n=(i=t.numberFormat)!=null?i:this.host.numberFormat,a=t._forcedUnit===""?this.host._forcedUnit:t._forcedUnit;return t.getAriaHandleText(e.value,n)+a}get formattedValues(){const e=new Map;for(const t of this.model)e.set(t.name,this.formattedValueForHandle(t));return e}get focusElement(){const{input:e}=this.getActiveHandleElements();return!e||this.host.editable&&!e.model.handle.dragging?this.host.numberField:e}hostConnected(){"orientation"in screen?screen.orientation.addEventListener("change",this.handleOrientation):window.addEventListener("orientationchange",this.handleOrientation)}hostDisconnected(){"orientation"in screen?screen.orientation.removeEventListener("change",this.handleOrientation):window.removeEventListener("orientationchange",this.handleOrientation)}hostUpdate(){this.updateModel()}waitForUpgrade(e){return e instanceof f?!1:(e.addEventListener("sp-slider-handle-ready",()=>this.extractModelFromLightDom(),{once:!0,passive:!0}),!0)}get activeHandle(){return this.handleOrder[this.handleOrder.length-1]}get activeHandleInputId(){const e=this.activeHandle;return`input-${this.model.findIndex(n=>n.name===e)}`}activateHandle(e){const t=this.handleOrder.findIndex(n=>n===e);t>=0&&this.handleOrder.splice(t,1),this.handleOrder.push(e)}get activeHandleModel(){const e=this.activeHandle;return this.model.find(t=>t.name===e)}getActiveHandleElements(){const e=this.activeHandle,t=this.handles.get(e),n=this.getHandleElements(t);return{model:t,...n}}getHandleElements(e){if(!this.handleRefMap){this.handleRefMap=new WeakMap;const n=this.host.shadowRoot.querySelectorAll(".handle > input");for(const a of n){const i=a,l=i.parentElement,r=this.handles.get(l.getAttribute("name"));r&&this.handleRefMap.set(r,{input:i,handle:l})}}return this.handleRefMap.get(e)}clearHandleComponentCache(){delete this.handleRefMap}get boundingClientRect(){return this._boundingClientRect||(this._boundingClientRect=this.host.track.getBoundingClientRect()),this._boundingClientRect}updateBoundingRect(){delete this._boundingClientRect}extractDataFromEvent(e){if(!this._activePointerEventData){let t=e.target.querySelector(":scope > .input");const n=!t,a=t?t.model:this.model.find(i=>i.name===this.activeHandle);!t&&a&&(t=a.handle.focusElement),this._activePointerEventData={input:t,model:a,resolvedInput:n}}return this._activePointerEventData}handleDoubleClick(e){var n;const t=e.target.querySelector(".input");((n=t.model)==null?void 0:n.handle.defaultValue)!==void 0&&(t.model.handle.value=t.model.handle.defaultValue,this.dispatchChangeEvent(t,t.model.handle),t.model.handle.dispatchInputEvent(),this.requestUpdate())}handlePointerdown(e){const{resolvedInput:t,model:n}=this.extractDataFromEvent(e);if(!n||this.host.disabled||e.button!==0){e.preventDefault();return}this.host.track.setPointerCapture(e.pointerId),this.updateBoundingRect(),e.pointerType==="mouse"&&this.host.labelEl.click(),this.draggingHandle=n.handle,n.handle.dragging=!0,this.activateHandle(n.name),t&&this.handlePointermove(e),this.requestUpdate()}handlePointerup(e){const{input:t,model:n}=this.extractDataFromEvent(e);delete this._activePointerEventData,n&&(e.pointerType==="mouse"&&this.host.labelEl.click(),this.cancelDrag(n),this.requestUpdate(),this.host.track.releasePointerCapture(e.pointerId),this.dispatchChangeEvent(t,n.handle))}handlePointermove(e){const{input:t,model:n}=this.extractDataFromEvent(e);n&&this.draggingHandle&&(t.value=this.calculateHandlePosition(e,n).toString(),n.handle.value=parseFloat(t.value),this.host.indeterminate=!1,this.requestUpdate())}cancelDrag(e){e=e||this.model.find(t=>t.name===this.activeHandle),e&&(e.handle.highlight=!1,delete this.draggingHandle,e.handle.dragging=!1)}dispatchChangeEvent(e,t){e.valueAsNumber=t.value;const n=new Event("change",{bubbles:!0,composed:!0});t.dispatchEvent(n)}calculateHandlePosition(e,t){const n=this.boundingClientRect,a=n.left,i=e.clientX,l=n.width,s=(this.host.isLTR?i-a:l-(i-a))/l;return t.normalization.fromNormalized(s,t.range.min,t.range.max)}renderHandle(e,t,n,a){var s;const i={handle:!0,dragging:((s=this.draggingHandle)==null?void 0:s.handleName)===e.name,"handle-highlight":e.highlight},l={[this.host.isLTR?"left":"right"]:`${e.normalizedValue*100}%`,"z-index":n.toString(),...a&&{"background-color":`var(--spectrum-slider-handle-background-color-${t}, var(--spectrum-slider-handle-background-color))`,"border-color":`var(--spectrum-slider-handle-border-color-${t}, var(--spectrum-slider-handle-border-color))`}},r=a?`label input-${t}`:"label";return m`
2
2
  <div
3
3
  class=${p(i)}
4
4
  name=${e.name}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["HandleController.ts"],
4
- "sourcesContent": ["/*\nCopyright 2021 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport { html, TemplateResult } from '@spectrum-web-components/base';\nimport {\n classMap,\n ifDefined,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\nimport { MutationController } from '@lit-labs/observers/mutation-controller.js';\nimport { Slider } from './Slider.js';\nimport { SliderHandle, SliderNormalization } from './SliderHandle.js';\n\ninterface HandleReference {\n handle: HTMLElement;\n input: HTMLInputElement;\n}\n\ninterface HandleComponents extends HandleReference {\n model: SliderHandle;\n}\n\ninterface RangeAndClamp {\n range: { min: number; max: number };\n clamp: { min: number; max: number };\n}\ninterface ModelValue extends RangeAndClamp {\n name: string;\n value: number;\n normalizedValue: number;\n step: number;\n highlight: boolean;\n ariaLabel?: string;\n normalization: SliderNormalization;\n handle: SliderHandle;\n}\n\ninterface InputWithModel extends HTMLInputElement {\n model: ModelValue;\n}\n\ninterface DataFromPointerEvent {\n resolvedInput: boolean;\n input: InputWithModel;\n model?: ModelValue;\n}\n\nexport interface HandleValueDictionary {\n [key: string]: number;\n}\n\nexport class HandleController {\n private host!: Slider;\n private handles: Map<string, SliderHandle> = new Map();\n private model: ModelValue[] = [];\n private handleOrder: string[] = [];\n private draggingHandle?: SliderHandle;\n private handleRefMap?: WeakMap<SliderHandle, HandleReference>;\n\n constructor(host: Slider) {\n this.host = host;\n\n new MutationController(this.host, {\n config: {\n subtree: true,\n childList: true,\n },\n callback: () => {\n this.extractModelFromLightDom();\n },\n });\n\n this.extractModelFromLightDom();\n }\n\n public get values(): HandleValueDictionary {\n const result: HandleValueDictionary = {};\n for (const model of this.handles.values()) {\n result[model.handleName] = model.value;\n }\n return result;\n }\n\n public get size(): number {\n return this.handles.size;\n }\n\n public inputForHandle(handle: SliderHandle): HTMLInputElement | undefined {\n if (this.handles.has(handle.handleName)) {\n const { input } = this.getHandleElements(handle) || {};\n return input;\n }\n /* c8 ignore next 2 */\n throw new Error(`No input for handle \"${handle.name}\"`);\n }\n\n public requestUpdate(): void {\n if (this.host.hasUpdated) {\n this.host.requestUpdate();\n }\n }\n\n /**\n * It is possible for value attributes to be set programmatically. The <input>\n * for a particular slider needs to have an opportunity to validate any such\n * values\n *\n * @param handle Handle who's value needs validation\n */\n public setValueFromHandle(handle: SliderHandle): void {\n const elements = this.getHandleElements(handle);\n /* c8 ignore next */\n if (!elements) return;\n\n const { input } = elements;\n if (input.valueAsNumber === handle.value) {\n if (handle.dragging) {\n handle.dispatchInputEvent();\n }\n } else {\n input.valueAsNumber = handle.value;\n this.requestUpdate();\n }\n handle.value = input.valueAsNumber;\n }\n\n public handleHasChanged(handle: SliderHandle): void {\n if (handle !== this.host) {\n this.requestUpdate();\n }\n }\n\n public formattedValueForHandle(model: ModelValue): string {\n const { handle } = model;\n const numberFormat = handle.numberFormat ?? this.host.numberFormat;\n const _forcedUnit =\n handle._forcedUnit === ''\n ? this.host._forcedUnit\n : handle._forcedUnit;\n return (\n handle.getAriaHandleText(model.value, numberFormat) + _forcedUnit\n );\n }\n\n public get formattedValues(): Map<string, string> {\n const result = new Map<string, string>();\n for (const model of this.model) {\n result.set(model.name, this.formattedValueForHandle(model));\n }\n return result;\n }\n\n public get focusElement(): HTMLElement {\n const { input } = this.getActiveHandleElements();\n if (\n !input ||\n (this.host.editable &&\n !(input as InputWithModel).model.handle.dragging)\n ) {\n return this.host.numberField;\n }\n return input;\n }\n\n protected handleOrientation = (): void => {\n this.updateBoundingRect();\n };\n\n public hostConnected(): void {\n if ('orientation' in screen) {\n screen.orientation.addEventListener(\n 'change',\n this.handleOrientation\n );\n } else {\n window.addEventListener(\n 'orientationchange',\n this.handleOrientation\n );\n }\n }\n\n public hostDisconnected(): void {\n if ('orientation' in screen) {\n screen.orientation.removeEventListener(\n 'change',\n this.handleOrientation\n );\n } else {\n window.removeEventListener(\n 'orientationchange',\n this.handleOrientation\n );\n }\n }\n\n public hostUpdate(): void {\n this.updateModel();\n }\n\n // Since extractModelFromLightDom bails on the first un-upgraded handle,\n // a maximum of one listener will be set up per extraction attempt.\n private waitForUpgrade(handle: HTMLElement): boolean {\n if (handle instanceof SliderHandle) {\n return false;\n }\n handle.addEventListener(\n 'sp-slider-handle-ready',\n () => this.extractModelFromLightDom(),\n { once: true, passive: true }\n );\n return true;\n }\n\n private extractModelFromLightDom = (): void => {\n let handles = [\n ...this.host.querySelectorAll('[slot=\"handle\"]'),\n ] as SliderHandle[];\n if (handles.length === 0) {\n handles = [this.host as SliderHandle];\n }\n // extractModelFromLightDom depends on slotted handles already having been upgraded\n if (handles.some((h) => this.waitForUpgrade(h))) {\n return;\n }\n this.handles = new Map();\n this.handleOrder = [];\n handles.forEach((handle, index) => {\n /* c8 ignore next */\n if (!handle.handleName?.length) {\n handle.name = `handle${index + 1}`;\n }\n this.handles.set(handle.handleName, handle);\n this.handleOrder.push(handle.handleName);\n handle.handleController = this;\n });\n this.requestUpdate();\n };\n\n public get activeHandle(): string {\n return this.handleOrder[this.handleOrder.length - 1];\n }\n\n public get activeHandleInputId(): string {\n const active = this.activeHandle;\n const index = this.model.findIndex((model) => model.name === active);\n return `input-${index}`;\n }\n\n public activateHandle(name: string): void {\n const index = this.handleOrder.findIndex((item) => item === name);\n if (index >= 0) {\n this.handleOrder.splice(index, 1);\n }\n this.handleOrder.push(name);\n }\n\n private getActiveHandleElements(): HandleComponents {\n const name = this.activeHandle;\n const handleSlider = this.handles.get(name) as SliderHandle;\n const elements = this.getHandleElements(\n handleSlider\n ) as HandleReference;\n return { model: handleSlider, ...elements };\n }\n\n private getHandleElements(sliderHandle: SliderHandle): HandleReference {\n if (!this.handleRefMap) {\n this.handleRefMap = new WeakMap();\n\n const inputNodes =\n this.host.shadowRoot.querySelectorAll('.handle > input');\n for (const inputNode of inputNodes) {\n const input = inputNode as HTMLInputElement;\n const handle = input.parentElement as HTMLElement;\n const model = this.handles.get(\n handle.getAttribute('name') as string\n );\n if (model) {\n this.handleRefMap.set(model, { input, handle });\n }\n }\n }\n\n const components = this.handleRefMap.get(\n sliderHandle\n ) as HandleReference;\n return components;\n }\n\n private clearHandleComponentCache(): void {\n delete this.handleRefMap;\n }\n\n private _boundingClientRect?: DOMRect;\n\n private get boundingClientRect(): DOMRect {\n if (!this._boundingClientRect) {\n this._boundingClientRect = this.host.track.getBoundingClientRect();\n }\n return this._boundingClientRect;\n }\n\n private updateBoundingRect(): void {\n delete this._boundingClientRect;\n }\n\n /**\n * Return the `input` and `model` associated with the event and\n * whether the `input` is a `resolvedInput` meaning it was acquired\n * from the `model` rather than the event.\n */\n protected extractDataFromEvent(event: PointerEvent): DataFromPointerEvent {\n if (!this._activePointerEventData) {\n let input = (event.target as Element).querySelector(\n ':scope > .input'\n ) as InputWithModel;\n const resolvedInput = !input;\n const model = input\n ? input.model\n : this.model.find((item) => item.name === this.activeHandle);\n if (!input && !!model) {\n input = model.handle.focusElement as InputWithModel;\n }\n this._activePointerEventData = {\n input,\n model,\n resolvedInput,\n };\n }\n return this._activePointerEventData;\n }\n\n private _activePointerEventData!: DataFromPointerEvent | undefined;\n\n /**\n * @description check for defaultvalue(value) property in sp-slider and reset on double click on sliderHandle\n * @param event\n */\n public handleDoubleClick(event: PointerEvent): void {\n const input = (event.target as Element).querySelector(\n '.input'\n ) as InputWithModel;\n\n if (input.model?.handle.defaultValue !== undefined) {\n input.model.handle.value = input.model.handle.defaultValue;\n this.dispatchChangeEvent(input, input.model.handle);\n input.model.handle.dispatchInputEvent();\n this.requestUpdate();\n }\n }\n\n public handlePointerdown(event: PointerEvent): void {\n const { resolvedInput, model } = this.extractDataFromEvent(event);\n if (!model || this.host.disabled || event.button !== 0) {\n event.preventDefault();\n return;\n }\n this.host.track.setPointerCapture(event.pointerId);\n this.updateBoundingRect();\n if (event.pointerType === 'mouse') {\n this.host.labelEl.click();\n }\n this.draggingHandle = model.handle;\n model.handle.dragging = true;\n this.activateHandle(model.name);\n if (resolvedInput) {\n // When the input is resolved forward the pointer event to\n // `handlePointermove` in order to update the value/UI becuase\n // the pointer event was on the track not a handle\n this.handlePointermove(event);\n }\n this.requestUpdate();\n }\n\n public handlePointerup(event: PointerEvent): void {\n const { input, model } = this.extractDataFromEvent(event);\n delete this._activePointerEventData;\n if (!model) return;\n if (event.pointerType === 'mouse') {\n this.host.labelEl.click();\n }\n this.cancelDrag(model);\n this.requestUpdate();\n this.host.track.releasePointerCapture(event.pointerId);\n this.dispatchChangeEvent(input, model.handle);\n }\n\n public handlePointermove(event: PointerEvent): void {\n const { input, model } = this.extractDataFromEvent(event);\n if (!model) return;\n /* c8 ignore next 3 */\n if (!this.draggingHandle) {\n return;\n }\n input.value = this.calculateHandlePosition(event, model).toString();\n model.handle.value = parseFloat(input.value);\n this.host.indeterminate = false;\n this.requestUpdate();\n }\n\n public cancelDrag(model?: ModelValue): void {\n model =\n model || this.model.find((item) => item.name === this.activeHandle);\n if (!model) return;\n model.handle.highlight = false;\n delete this.draggingHandle;\n model.handle.dragging = false;\n }\n\n /**\n * Keep the slider value property in sync with the input element's value\n */\n private onInputChange = (event: Event): void => {\n const input = event.target as InputWithModel;\n input.model.handle.value = input.valueAsNumber;\n\n this.requestUpdate();\n this.dispatchChangeEvent(input, input.model.handle);\n };\n\n private onInputFocus = (event: Event): void => {\n const input = event.target as InputWithModel;\n let isFocusVisible;\n try {\n isFocusVisible =\n input.matches(':focus-visible') ||\n this.host.matches('.focus-visible');\n /* c8 ignore next 3 */\n } catch (error) {\n isFocusVisible = this.host.matches('.focus-visible');\n }\n input.model.handle.highlight = isFocusVisible;\n this.requestUpdate();\n };\n\n private onInputBlur = (event: Event): void => {\n const input = event.target as InputWithModel;\n input.model.handle.highlight = false;\n this.requestUpdate();\n };\n\n private onInputKeydown = (event: KeyboardEvent): void => {\n if (event.key == 'Escape') {\n const input = event.target as InputWithModel;\n if (\n input.model.handle?.defaultValue !== undefined &&\n input.model.handle.value !== input.model.handle.defaultValue\n ) {\n input.model.handle.value = input.model.handle.defaultValue;\n input.model.handle.dispatchInputEvent();\n this.dispatchChangeEvent(input, input.model.handle);\n this.requestUpdate();\n event.preventDefault();\n event.stopPropagation();\n }\n return;\n }\n const input = event.target as InputWithModel;\n input.model.handle.highlight = true;\n this.requestUpdate();\n };\n\n private dispatchChangeEvent(\n input: HTMLInputElement,\n handle: SliderHandle\n ): void {\n input.valueAsNumber = handle.value;\n\n const changeEvent = new Event('change', {\n bubbles: true,\n composed: true,\n });\n\n handle.dispatchEvent(changeEvent);\n }\n\n /**\n * Returns the value under the cursor\n * @param: PointerEvent on slider\n * @return: Slider value that correlates to the position under the pointer\n */\n private calculateHandlePosition(\n event: PointerEvent | MouseEvent,\n model: ModelValue\n ): number {\n const rect = this.boundingClientRect;\n const minOffset = rect.left;\n const offset = event.clientX;\n const size = rect.width;\n\n const directionalOffset = this.host.isLTR\n ? offset - minOffset\n : size - (offset - minOffset);\n const normalized = directionalOffset / size;\n\n return model.normalization.fromNormalized(\n normalized,\n model.range.min,\n model.range.max\n );\n }\n\n public renderHandle(\n model: ModelValue,\n index: number,\n zIndex: number,\n isMultiHandle: boolean\n ): TemplateResult {\n const classes = {\n handle: true,\n dragging: this.draggingHandle?.handleName === model.name,\n 'handle-highlight': model.highlight,\n };\n const style = {\n [this.host.isLTR ? 'left' : 'right']: `${\n model.normalizedValue * 100\n }%`,\n 'z-index': zIndex.toString(),\n ...(isMultiHandle && {\n 'background-color': `var(--spectrum-slider-handle-background-color-${index}, var(--spectrum-slider-handle-background-color))`,\n 'border-color': `var(--spectrum-slider-handle-border-color-${index}, var(--spectrum-slider-handle-border-color))`,\n }),\n };\n const ariaLabelledBy = isMultiHandle ? `label input-${index}` : 'label';\n return html`\n <div\n class=${classMap(classes)}\n name=${model.name}\n style=${styleMap(style)}\n role=\"presentation\"\n >\n <input\n type=\"range\"\n class=\"input\"\n id=\"input-${index}\"\n min=${model.clamp.min}\n max=${model.clamp.max}\n step=${model.step}\n value=${model.value}\n aria-disabled=${ifDefined(\n this.host.disabled ? 'true' : undefined\n )}\n tabindex=${ifDefined(this.host.editable ? -1 : undefined)}\n aria-label=${ifDefined(model.ariaLabel)}\n aria-labelledby=${ariaLabelledBy}\n aria-valuetext=${this.formattedValueForHandle(model)}\n aria-describedby=\"slider-description\"\n @change=${this.onInputChange}\n @focus=${this.onInputFocus}\n @blur=${this.onInputBlur}\n @keydown=${this.onInputKeydown}\n .model=${model}\n />\n <span id=\"slider-description\">\n Press escape or double click to reset the slider to its\n default value.\n </span>\n </div>\n `;\n }\n\n public render(): TemplateResult[] {\n this.clearHandleComponentCache();\n return this.model.map((model, index) => {\n const zIndex = this.handleOrder.indexOf(model.name) + 2;\n return this.renderHandle(\n model,\n index,\n zIndex,\n this.model.length > 1\n );\n });\n }\n\n /**\n * Returns a list of track segment [start, end] tuples where the values are\n * normalized to be between 0 and 1.\n * @returns A list of track segment tuples [start, end]\n */\n public trackSegments(): [number, number][] {\n const values = this.model.map((model) => model.normalizedValue);\n values.sort((a, b) => a - b);\n\n // The first segment always starts at 0\n values.unshift(0);\n return values.map((value, index, array) => [\n value,\n array[index + 1] ?? 1,\n ]);\n }\n\n private updateModel(): void {\n const handles = [...this.handles.values()];\n\n const getRangeAndClamp = (index: number): RangeAndClamp => {\n const handle = handles[index];\n const previous = handles[index - 1];\n const next = handles[index + 1];\n\n const min =\n typeof handle.min === 'number'\n ? handle.min\n : (this.host.min as number);\n const max =\n typeof handle.max === 'number'\n ? handle.max\n : (this.host.max as number);\n\n const result: RangeAndClamp = {\n range: { min: min, max: max },\n clamp: { min: min, max: max },\n };\n\n if (handle.min === 'previous') {\n if (previous) {\n for (let j = index - 1; j >= 0; j--) {\n const item = handles[j];\n if (typeof item.min === 'number') {\n result.range.min = item.min;\n break;\n }\n }\n result.clamp.min = Math.max(\n previous.value,\n result.range.min\n );\n }\n if (window.__swc.DEBUG) {\n if (!previous) {\n window.__swc.warn(\n this.host,\n '<sp-slider-handle> elements that are the first child of an <sp-slider> element cannot have attribute \"min=\\'previous\\'\"`',\n 'https://opensource.adobe.com/spectrum-web-components/components/slider-handle/#multi-handle-slider-with-ordered-handles'\n );\n }\n }\n }\n if (handle.max === 'next') {\n if (next) {\n for (let j = index + 1; j < handles.length; j++) {\n const item = handles[j];\n if (typeof item.max === 'number') {\n result.range.max = item.max;\n break;\n }\n }\n result.clamp.max = Math.min(next.value, result.range.max);\n }\n if (window.__swc.DEBUG) {\n if (!next) {\n window.__swc.warn(\n this.host,\n '<sp-slider-handle> elements that are the last child of an <sp-slider> element cannot have attribute \"max=\\'next\\'\"',\n 'https://opensource.adobe.com/spectrum-web-components/components/slider-handle/#multi-handle-slider-with-ordered-handles'\n );\n }\n }\n }\n return result;\n };\n\n const modelValues = handles.map((handle, index) => {\n const rangeAndClamp = getRangeAndClamp(index);\n const { toNormalized } = handle.normalization;\n const clampedValue = Math.max(\n Math.min(handle.value, rangeAndClamp.clamp.max),\n rangeAndClamp.clamp.min\n );\n const normalizedValue = toNormalized(\n clampedValue,\n rangeAndClamp.range.min,\n rangeAndClamp.range.max\n );\n const model = {\n name: handle.handleName,\n value: clampedValue,\n normalizedValue,\n highlight: handle.highlight,\n step: handle.step ?? this.host.step,\n normalization: handle.normalization,\n handle,\n ariaLabel:\n handle !== this.host && handle?.label.length > 0\n ? handle.label\n : undefined,\n ...rangeAndClamp,\n };\n return model;\n });\n\n this.model = modelValues;\n }\n\n public async handleUpdatesComplete(): Promise<void> {\n const updates = [...this.handles.values()]\n .filter((handle) => handle !== this.host)\n .map((handle) => handle.updateComplete);\n await Promise.all(updates);\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\nCopyright 2021 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\nimport { html, TemplateResult } from '@spectrum-web-components/base';\nimport {\n classMap,\n ifDefined,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\nimport { MutationController } from '@lit-labs/observers/mutation-controller.js';\nimport { Slider } from './Slider.js';\nimport { SliderHandle, SliderNormalization } from './SliderHandle.js';\n\ninterface HandleReference {\n handle: HTMLElement;\n input: HTMLInputElement;\n}\n\ninterface HandleComponents extends HandleReference {\n model: SliderHandle;\n}\n\ninterface RangeAndClamp {\n range: { min: number; max: number };\n clamp: { min: number; max: number };\n}\ninterface ModelValue extends RangeAndClamp {\n name: string;\n value: number;\n normalizedValue: number;\n step: number;\n highlight: boolean;\n ariaLabel?: string;\n normalization: SliderNormalization;\n handle: SliderHandle;\n}\n\ninterface InputWithModel extends HTMLInputElement {\n model: ModelValue;\n}\n\ninterface DataFromPointerEvent {\n resolvedInput: boolean;\n input: InputWithModel;\n model?: ModelValue;\n}\n\nexport interface HandleValueDictionary {\n [key: string]: number;\n}\n\nexport class HandleController {\n private host!: Slider;\n private handles: Map<string, SliderHandle> = new Map();\n private model: ModelValue[] = [];\n private handleOrder: string[] = [];\n private draggingHandle?: SliderHandle;\n private handleRefMap?: WeakMap<SliderHandle, HandleReference>;\n\n constructor(host: Slider) {\n this.host = host;\n\n new MutationController(this.host, {\n config: {\n subtree: true,\n childList: true,\n },\n callback: () => {\n this.extractModelFromLightDom();\n },\n });\n\n this.extractModelFromLightDom();\n }\n\n public get values(): HandleValueDictionary {\n const result: HandleValueDictionary = {};\n for (const model of this.handles.values()) {\n result[model.handleName] = model.value;\n }\n return result;\n }\n\n public get size(): number {\n return this.handles.size;\n }\n\n public inputForHandle(handle: SliderHandle): HTMLInputElement | undefined {\n if (this.handles.has(handle.handleName)) {\n const { input } = this.getHandleElements(handle) || {};\n return input;\n }\n /* c8 ignore next 2 */\n throw new Error(`No input for handle \"${handle.name}\"`);\n }\n\n public requestUpdate(): void {\n if (this.host.hasUpdated) {\n this.host.requestUpdate();\n }\n }\n\n /**\n * It is possible for value attributes to be set programmatically. The <input>\n * for a particular slider needs to have an opportunity to validate any such\n * values\n *\n * @param handle Handle who's value needs validation\n */\n public setValueFromHandle(handle: SliderHandle): void {\n const elements = this.getHandleElements(handle);\n /* c8 ignore next */\n if (!elements) return;\n\n const { input } = elements;\n if (input.valueAsNumber === handle.value) {\n if (handle.dragging) {\n handle.dispatchInputEvent();\n }\n } else {\n input.valueAsNumber = handle.value;\n this.requestUpdate();\n }\n handle.value = input.valueAsNumber;\n }\n\n public handleHasChanged(handle: SliderHandle): void {\n if (handle !== this.host) {\n this.requestUpdate();\n }\n }\n\n public formattedValueForHandle(model: ModelValue): string {\n const { handle } = model;\n const numberFormat = handle.numberFormat ?? this.host.numberFormat;\n const _forcedUnit =\n handle._forcedUnit === ''\n ? this.host._forcedUnit\n : handle._forcedUnit;\n return (\n handle.getAriaHandleText(model.value, numberFormat) + _forcedUnit\n );\n }\n\n public get formattedValues(): Map<string, string> {\n const result = new Map<string, string>();\n for (const model of this.model) {\n result.set(model.name, this.formattedValueForHandle(model));\n }\n return result;\n }\n\n public get focusElement(): HTMLElement {\n const { input } = this.getActiveHandleElements();\n if (\n !input ||\n (this.host.editable &&\n !(input as InputWithModel).model.handle.dragging)\n ) {\n return this.host.numberField;\n }\n return input;\n }\n\n protected handleOrientation = (): void => {\n this.updateBoundingRect();\n };\n\n public hostConnected(): void {\n if ('orientation' in screen) {\n screen.orientation.addEventListener(\n 'change',\n this.handleOrientation\n );\n } else {\n window.addEventListener(\n 'orientationchange',\n this.handleOrientation\n );\n }\n }\n\n public hostDisconnected(): void {\n if ('orientation' in screen) {\n screen.orientation.removeEventListener(\n 'change',\n this.handleOrientation\n );\n } else {\n window.removeEventListener(\n 'orientationchange',\n this.handleOrientation\n );\n }\n }\n\n public hostUpdate(): void {\n this.updateModel();\n }\n\n // Since extractModelFromLightDom bails on the first un-upgraded handle,\n // a maximum of one listener will be set up per extraction attempt.\n private waitForUpgrade(handle: HTMLElement): boolean {\n if (handle instanceof SliderHandle) {\n return false;\n }\n handle.addEventListener(\n 'sp-slider-handle-ready',\n () => this.extractModelFromLightDom(),\n { once: true, passive: true }\n );\n return true;\n }\n\n private extractModelFromLightDom = (): void => {\n let handles = [\n ...this.host.querySelectorAll('[slot=\"handle\"]'),\n ] as SliderHandle[];\n if (handles.length === 0) {\n handles = [this.host as SliderHandle];\n }\n // extractModelFromLightDom depends on slotted handles already having been upgraded\n if (handles.some((h) => this.waitForUpgrade(h))) {\n return;\n }\n this.handles = new Map();\n this.handleOrder = [];\n handles.forEach((handle, index) => {\n /* c8 ignore next */\n if (!handle.handleName?.length) {\n handle.name = `handle${index + 1}`;\n }\n this.handles.set(handle.handleName, handle);\n this.handleOrder.push(handle.handleName);\n handle.handleController = this;\n });\n this.requestUpdate();\n };\n\n public get activeHandle(): string {\n return this.handleOrder[this.handleOrder.length - 1];\n }\n\n public get activeHandleInputId(): string {\n const active = this.activeHandle;\n const index = this.model.findIndex((model) => model.name === active);\n return `input-${index}`;\n }\n\n public activateHandle(name: string): void {\n const index = this.handleOrder.findIndex((item) => item === name);\n if (index >= 0) {\n this.handleOrder.splice(index, 1);\n }\n this.handleOrder.push(name);\n }\n\n public get activeHandleModel(): ModelValue {\n const active = this.activeHandle;\n return this.model.find((model) => model.name === active)!;\n }\n\n private getActiveHandleElements(): HandleComponents {\n const name = this.activeHandle;\n const handleSlider = this.handles.get(name) as SliderHandle;\n const elements = this.getHandleElements(\n handleSlider\n ) as HandleReference;\n return { model: handleSlider, ...elements };\n }\n\n private getHandleElements(sliderHandle: SliderHandle): HandleReference {\n if (!this.handleRefMap) {\n this.handleRefMap = new WeakMap();\n\n const inputNodes =\n this.host.shadowRoot.querySelectorAll('.handle > input');\n for (const inputNode of inputNodes) {\n const input = inputNode as HTMLInputElement;\n const handle = input.parentElement as HTMLElement;\n const model = this.handles.get(\n handle.getAttribute('name') as string\n );\n if (model) {\n this.handleRefMap.set(model, { input, handle });\n }\n }\n }\n\n const components = this.handleRefMap.get(\n sliderHandle\n ) as HandleReference;\n return components;\n }\n\n private clearHandleComponentCache(): void {\n delete this.handleRefMap;\n }\n\n private _boundingClientRect?: DOMRect;\n\n private get boundingClientRect(): DOMRect {\n if (!this._boundingClientRect) {\n this._boundingClientRect = this.host.track.getBoundingClientRect();\n }\n return this._boundingClientRect;\n }\n\n private updateBoundingRect(): void {\n delete this._boundingClientRect;\n }\n\n /**\n * Return the `input` and `model` associated with the event and\n * whether the `input` is a `resolvedInput` meaning it was acquired\n * from the `model` rather than the event.\n */\n protected extractDataFromEvent(event: PointerEvent): DataFromPointerEvent {\n if (!this._activePointerEventData) {\n let input = (event.target as Element).querySelector(\n ':scope > .input'\n ) as InputWithModel;\n const resolvedInput = !input;\n const model = input\n ? input.model\n : this.model.find((item) => item.name === this.activeHandle);\n if (!input && !!model) {\n input = model.handle.focusElement as InputWithModel;\n }\n this._activePointerEventData = {\n input,\n model,\n resolvedInput,\n };\n }\n return this._activePointerEventData;\n }\n\n private _activePointerEventData!: DataFromPointerEvent | undefined;\n\n /**\n * @description check for defaultvalue(value) property in sp-slider and reset on double click on sliderHandle\n * @param event\n */\n public handleDoubleClick(event: PointerEvent): void {\n const input = (event.target as Element).querySelector(\n '.input'\n ) as InputWithModel;\n\n if (input.model?.handle.defaultValue !== undefined) {\n input.model.handle.value = input.model.handle.defaultValue;\n this.dispatchChangeEvent(input, input.model.handle);\n input.model.handle.dispatchInputEvent();\n this.requestUpdate();\n }\n }\n\n public handlePointerdown(event: PointerEvent): void {\n const { resolvedInput, model } = this.extractDataFromEvent(event);\n if (!model || this.host.disabled || event.button !== 0) {\n event.preventDefault();\n return;\n }\n this.host.track.setPointerCapture(event.pointerId);\n this.updateBoundingRect();\n if (event.pointerType === 'mouse') {\n this.host.labelEl.click();\n }\n this.draggingHandle = model.handle;\n model.handle.dragging = true;\n this.activateHandle(model.name);\n if (resolvedInput) {\n // When the input is resolved forward the pointer event to\n // `handlePointermove` in order to update the value/UI becuase\n // the pointer event was on the track not a handle\n this.handlePointermove(event);\n }\n this.requestUpdate();\n }\n\n public handlePointerup(event: PointerEvent): void {\n const { input, model } = this.extractDataFromEvent(event);\n delete this._activePointerEventData;\n if (!model) return;\n if (event.pointerType === 'mouse') {\n this.host.labelEl.click();\n }\n this.cancelDrag(model);\n this.requestUpdate();\n this.host.track.releasePointerCapture(event.pointerId);\n this.dispatchChangeEvent(input, model.handle);\n }\n\n public handlePointermove(event: PointerEvent): void {\n const { input, model } = this.extractDataFromEvent(event);\n if (!model) return;\n /* c8 ignore next 3 */\n if (!this.draggingHandle) {\n return;\n }\n input.value = this.calculateHandlePosition(event, model).toString();\n model.handle.value = parseFloat(input.value);\n this.host.indeterminate = false;\n this.requestUpdate();\n }\n\n public cancelDrag(model?: ModelValue): void {\n model =\n model || this.model.find((item) => item.name === this.activeHandle);\n if (!model) return;\n model.handle.highlight = false;\n delete this.draggingHandle;\n model.handle.dragging = false;\n }\n\n /**\n * Keep the slider value property in sync with the input element's value\n */\n private onInputChange = (event: Event): void => {\n const input = event.target as InputWithModel;\n input.model.handle.value = input.valueAsNumber;\n\n this.requestUpdate();\n this.dispatchChangeEvent(input, input.model.handle);\n };\n\n private onInputFocus = (event: Event): void => {\n const input = event.target as InputWithModel;\n let isFocusVisible;\n try {\n isFocusVisible =\n input.matches(':focus-visible') ||\n this.host.matches('.focus-visible');\n /* c8 ignore next 3 */\n } catch (error) {\n isFocusVisible = this.host.matches('.focus-visible');\n }\n input.model.handle.highlight = isFocusVisible;\n this.requestUpdate();\n };\n\n private onInputBlur = (event: Event): void => {\n const input = event.target as InputWithModel;\n input.model.handle.highlight = false;\n this.requestUpdate();\n };\n\n private onInputKeydown = (event: KeyboardEvent): void => {\n if (event.key == 'Escape') {\n const input = event.target as InputWithModel;\n if (\n input.model.handle?.defaultValue !== undefined &&\n input.model.handle.value !== input.model.handle.defaultValue\n ) {\n input.model.handle.value = input.model.handle.defaultValue;\n input.model.handle.dispatchInputEvent();\n this.dispatchChangeEvent(input, input.model.handle);\n this.requestUpdate();\n event.preventDefault();\n event.stopPropagation();\n }\n return;\n }\n const input = event.target as InputWithModel;\n input.model.handle.highlight = true;\n this.requestUpdate();\n };\n\n private dispatchChangeEvent(\n input: HTMLInputElement,\n handle: SliderHandle\n ): void {\n input.valueAsNumber = handle.value;\n\n const changeEvent = new Event('change', {\n bubbles: true,\n composed: true,\n });\n\n handle.dispatchEvent(changeEvent);\n }\n\n /**\n * Returns the value under the cursor\n * @param: PointerEvent on slider\n * @return: Slider value that correlates to the position under the pointer\n */\n private calculateHandlePosition(\n event: PointerEvent | MouseEvent,\n model: ModelValue\n ): number {\n const rect = this.boundingClientRect;\n const minOffset = rect.left;\n const offset = event.clientX;\n const size = rect.width;\n\n const directionalOffset = this.host.isLTR\n ? offset - minOffset\n : size - (offset - minOffset);\n const normalized = directionalOffset / size;\n\n return model.normalization.fromNormalized(\n normalized,\n model.range.min,\n model.range.max\n );\n }\n\n public renderHandle(\n model: ModelValue,\n index: number,\n zIndex: number,\n isMultiHandle: boolean\n ): TemplateResult {\n const classes = {\n handle: true,\n dragging: this.draggingHandle?.handleName === model.name,\n 'handle-highlight': model.highlight,\n };\n const style = {\n [this.host.isLTR ? 'left' : 'right']: `${\n model.normalizedValue * 100\n }%`,\n 'z-index': zIndex.toString(),\n ...(isMultiHandle && {\n 'background-color': `var(--spectrum-slider-handle-background-color-${index}, var(--spectrum-slider-handle-background-color))`,\n 'border-color': `var(--spectrum-slider-handle-border-color-${index}, var(--spectrum-slider-handle-border-color))`,\n }),\n };\n const ariaLabelledBy = isMultiHandle ? `label input-${index}` : 'label';\n return html`\n <div\n class=${classMap(classes)}\n name=${model.name}\n style=${styleMap(style)}\n role=\"presentation\"\n >\n <input\n type=\"range\"\n class=\"input\"\n id=\"input-${index}\"\n min=${model.clamp.min}\n max=${model.clamp.max}\n step=${model.step}\n value=${model.value}\n aria-disabled=${ifDefined(\n this.host.disabled ? 'true' : undefined\n )}\n tabindex=${ifDefined(this.host.editable ? -1 : undefined)}\n aria-label=${ifDefined(model.ariaLabel)}\n aria-labelledby=${ariaLabelledBy}\n aria-valuetext=${this.formattedValueForHandle(model)}\n aria-describedby=\"slider-description\"\n @change=${this.onInputChange}\n @focus=${this.onInputFocus}\n @blur=${this.onInputBlur}\n @keydown=${this.onInputKeydown}\n .model=${model}\n />\n <span id=\"slider-description\">\n Press escape or double click to reset the slider to its\n default value.\n </span>\n </div>\n `;\n }\n\n public render(): TemplateResult[] {\n this.clearHandleComponentCache();\n return this.model.map((model, index) => {\n const zIndex = this.handleOrder.indexOf(model.name) + 2;\n return this.renderHandle(\n model,\n index,\n zIndex,\n this.model.length > 1\n );\n });\n }\n\n /**\n * Returns a list of track segment [start, end] tuples where the values are\n * normalized to be between 0 and 1.\n * @returns A list of track segment tuples [start, end]\n */\n public trackSegments(): [number, number][] {\n const values = this.model.map((model) => model.normalizedValue);\n values.sort((a, b) => a - b);\n\n // The first segment always starts at 0\n values.unshift(0);\n return values.map((value, index, array) => [\n value,\n array[index + 1] ?? 1,\n ]);\n }\n\n private updateModel(): void {\n const handles = [...this.handles.values()];\n\n const getRangeAndClamp = (index: number): RangeAndClamp => {\n const handle = handles[index];\n const previous = handles[index - 1];\n const next = handles[index + 1];\n\n const min =\n typeof handle.min === 'number'\n ? handle.min\n : (this.host.min as number);\n const max =\n typeof handle.max === 'number'\n ? handle.max\n : (this.host.max as number);\n\n const result: RangeAndClamp = {\n range: { min: min, max: max },\n clamp: { min: min, max: max },\n };\n\n if (handle.min === 'previous') {\n if (previous) {\n for (let j = index - 1; j >= 0; j--) {\n const item = handles[j];\n if (typeof item.min === 'number') {\n result.range.min = item.min;\n break;\n }\n }\n result.clamp.min = Math.max(\n previous.value,\n result.range.min\n );\n }\n if (window.__swc.DEBUG) {\n if (!previous) {\n window.__swc.warn(\n this.host,\n '<sp-slider-handle> elements that are the first child of an <sp-slider> element cannot have attribute \"min=\\'previous\\'\"`',\n 'https://opensource.adobe.com/spectrum-web-components/components/slider-handle/#multi-handle-slider-with-ordered-handles'\n );\n }\n }\n }\n if (handle.max === 'next') {\n if (next) {\n for (let j = index + 1; j < handles.length; j++) {\n const item = handles[j];\n if (typeof item.max === 'number') {\n result.range.max = item.max;\n break;\n }\n }\n result.clamp.max = Math.min(next.value, result.range.max);\n }\n if (window.__swc.DEBUG) {\n if (!next) {\n window.__swc.warn(\n this.host,\n '<sp-slider-handle> elements that are the last child of an <sp-slider> element cannot have attribute \"max=\\'next\\'\"',\n 'https://opensource.adobe.com/spectrum-web-components/components/slider-handle/#multi-handle-slider-with-ordered-handles'\n );\n }\n }\n }\n return result;\n };\n\n const modelValues = handles.map((handle, index) => {\n const rangeAndClamp = getRangeAndClamp(index);\n const { toNormalized } = handle.normalization;\n const clampedValue = Math.max(\n Math.min(handle.value, rangeAndClamp.clamp.max),\n rangeAndClamp.clamp.min\n );\n const normalizedValue = toNormalized(\n clampedValue,\n rangeAndClamp.range.min,\n rangeAndClamp.range.max\n );\n const model = {\n name: handle.handleName,\n value: clampedValue,\n normalizedValue,\n highlight: handle.highlight,\n step: handle.step ?? this.host.step,\n normalization: handle.normalization,\n handle,\n ariaLabel:\n handle !== this.host && handle?.label.length > 0\n ? handle.label\n : undefined,\n ...rangeAndClamp,\n };\n return model;\n });\n\n this.model = modelValues;\n }\n\n public async handleUpdatesComplete(): Promise<void> {\n const updates = [...this.handles.values()]\n .filter((handle) => handle !== this.host)\n .map((handle) => handle.updateComplete);\n await Promise.all(updates);\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["html", "classMap", "ifDefined", "styleMap", "MutationController", "SliderHandle", "host", "handles", "h", "handle", "index", "_a", "event", "input", "isFocusVisible", "error", "result", "model", "elements", "numberFormat", "_forcedUnit", "active", "name", "item", "handleSlider", "sliderHandle", "inputNodes", "inputNode", "resolvedInput", "changeEvent", "rect", "minOffset", "offset", "size", "normalized", "zIndex", "isMultiHandle", "classes", "style", "ariaLabelledBy", "values", "a", "b", "value", "array", "getRangeAndClamp", "previous", "next", "min", "max", "j", "modelValues", "rangeAndClamp", "toNormalized", "clampedValue", "normalizedValue", "updates"]
7
7
  }
package/src/Slider.d.ts CHANGED
@@ -79,11 +79,6 @@ export declare class Slider extends Slider_base {
79
79
  * @returns
80
80
  */
81
81
  private getOffsetWidth;
82
- /**
83
- * @description calculates the fill width starting point to fill width
84
- * @param value
85
- */
86
- private getOffsetPosition;
87
82
  private fillStyles;
88
83
  private renderFillOffset;
89
84
  private renderHandle;
package/src/Slider.dev.js CHANGED
@@ -258,19 +258,21 @@ export class Slider extends SizedMixin(ObserveSlotText(SliderHandle, ""), {
258
258
  */
259
259
  getOffsetWidth(fillStartValue, currentValue) {
260
260
  const distance = Math.abs(currentValue - fillStartValue);
261
- return distance / (this.max - this.min) * 100;
262
- }
263
- /**
264
- * @description calculates the fill width starting point to fill width
265
- * @param value
266
- */
267
- getOffsetPosition(value) {
268
- return (value - this.min) / (this.max - this.min) * 100;
261
+ return distance * 100;
269
262
  }
270
263
  fillStyles(centerPoint) {
264
+ const activeModel = this.handleController.activeHandleModel;
265
+ const centerPointNormalized = activeModel.normalization.toNormalized(
266
+ centerPoint,
267
+ this.min,
268
+ this.max
269
+ );
271
270
  const position = this.dir === "rtl" ? "right" : "left";
272
- const offsetPosition = this.value > centerPoint ? this.getOffsetPosition(centerPoint) : this.getOffsetPosition(this.value);
273
- const offsetWidth = this.getOffsetWidth(centerPoint, this.value);
271
+ const offsetPosition = (this.value > centerPoint ? centerPointNormalized : activeModel.normalizedValue) * 100;
272
+ const offsetWidth = this.getOffsetWidth(
273
+ centerPointNormalized,
274
+ activeModel.normalizedValue
275
+ );
274
276
  const styles = {
275
277
  [position]: `${offsetPosition}%`,
276
278
  width: `${offsetWidth}%`
@@ -278,7 +280,7 @@ export class Slider extends SizedMixin(ObserveSlotText(SliderHandle, ""), {
278
280
  return styles;
279
281
  }
280
282
  renderFillOffset() {
281
- if (!this._cachedValue || !this.centerPoint) {
283
+ if (this._cachedValue === void 0 || this.centerPoint === void 0) {
282
284
  return html``;
283
285
  }
284
286
  return html`
@@ -411,10 +413,10 @@ export class Slider extends SizedMixin(ObserveSlotText(SliderHandle, ""), {
411
413
  willUpdate(changed) {
412
414
  if (changed.has("value") && changed.has("fillStart")) {
413
415
  this._cachedValue = Number(this.value);
414
- if (this.fillStart) {
415
- this.centerPoint = Number(this.fillStart);
416
- } else {
416
+ if (this.getAttribute("fill-start") === "") {
417
417
  this.centerPoint = (Number(this.max) - Number(this.min)) / 2 + Number(this.min);
418
+ } else if (!Number.isNaN(Number(this.fillStart))) {
419
+ this.centerPoint = Number(this.fillStart);
418
420
  }
419
421
  }
420
422
  }