@spectrum-web-components/slider 0.11.0 → 0.12.1

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.
@@ -9,13 +9,16 @@ the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTA
9
9
  OF ANY KIND, either express or implied. See the License for the specific language
10
10
  governing permissions and limitations under the License.
11
11
  */
12
- import { html, ifDefined, classMap, styleMap, } from '@spectrum-web-components/base';
13
- import { streamingListener } from '@spectrum-web-components/base/src/streaming-listener.js';
12
+ import { html } from '@spectrum-web-components/base';
13
+ import { classMap, ifDefined, styleMap, } from '@spectrum-web-components/base/src/directives.js';
14
14
  export class HandleController {
15
15
  constructor(host) {
16
16
  this.handles = new Map();
17
17
  this.model = [];
18
18
  this.handleOrder = [];
19
+ this.handleOrientation = () => {
20
+ this.updateBoundingRect();
21
+ };
19
22
  this.extractModelFromLightDom = () => {
20
23
  let handles = [
21
24
  ...this.host.querySelectorAll('[slot="handle"]'),
@@ -151,9 +154,21 @@ export class HandleController {
151
154
  }
152
155
  this.observer.observe(this.host, { subtree: true, childList: true });
153
156
  this.extractModelFromLightDom();
157
+ if ('orientation' in screen) {
158
+ screen.orientation.addEventListener('change', this.handleOrientation);
159
+ }
160
+ else {
161
+ window.addEventListener('orientationchange', this.handleOrientation);
162
+ }
154
163
  }
155
164
  hostDisconnected() {
156
165
  this.observer.disconnect();
166
+ if ('orientation' in screen) {
167
+ screen.orientation.removeEventListener('change', this.handleOrientation);
168
+ }
169
+ else {
170
+ window.removeEventListener('orientationchange', this.handleOrientation);
171
+ }
157
172
  }
158
173
  hostUpdate() {
159
174
  this.updateModel();
@@ -208,59 +223,70 @@ export class HandleController {
208
223
  delete this._boundingClientRect;
209
224
  }
210
225
  /**
211
- * Receives an event from a track click and turns it into a drag
212
- * of the active handle
213
- * @param event Track click event
226
+ * Return the `input` and `model` associated with the event and
227
+ * whether the `input` is a `resolvedInput` meaning it was acquired
228
+ * from the `model` rather than the event.
214
229
  */
215
- beginTrackDrag(event) {
216
- const { handle } = this.getActiveHandleElements();
217
- const model = this.model.find((item) => item.name === this.activeHandle);
218
- /* c8 ignore next */
219
- if (!model)
220
- return;
221
- event.stopPropagation();
222
- event.preventDefault();
223
- const applyDefault = handle.dispatchEvent(new PointerEvent('pointerdown', event));
224
- if (applyDefault) {
225
- const model = this.model.find((model) => model.name === this.activeHandle);
226
- if (model) {
227
- this.handlePointermove(event, model);
230
+ extractDataFromEvent(event) {
231
+ if (!this._activePointerEventData) {
232
+ let input = event.target.querySelector(':scope > .input');
233
+ const resolvedInput = !input;
234
+ const model = input
235
+ ? input.model
236
+ : this.model.find((item) => item.name === this.activeHandle);
237
+ if (!input && !!model) {
238
+ input = model.handle.focusElement;
228
239
  }
240
+ this._activePointerEventData = {
241
+ input,
242
+ model,
243
+ resolvedInput,
244
+ };
229
245
  }
246
+ return this._activePointerEventData;
230
247
  }
231
- handlePointerdown(event, model) {
232
- const handle = event.target;
233
- if (this.host.disabled || event.button !== 0) {
248
+ handlePointerdown(event) {
249
+ const { resolvedInput, model } = this.extractDataFromEvent(event);
250
+ if (!model || this.host.disabled || event.button !== 0) {
234
251
  event.preventDefault();
235
252
  return;
236
253
  }
254
+ this.host.track.setPointerCapture(event.pointerId);
237
255
  this.updateBoundingRect();
238
256
  this.host.labelEl.click();
239
257
  this.draggingHandle = model.handle;
240
258
  model.handle.dragging = true;
241
259
  this.activateHandle(model.name);
242
- handle.setPointerCapture(event.pointerId);
243
- this.host.requestUpdate();
260
+ if (resolvedInput) {
261
+ // When the input is resolved forward the pointer event to
262
+ // `handlePointermove` in order to update the value/UI becuase
263
+ // the pointer event was on the track not a handle
264
+ this.handlePointermove(event);
265
+ }
266
+ this.requestUpdate();
244
267
  }
245
- handlePointerup(event, model) {
246
- // Retain focus on input element after mouse up to enable keyboard interactions
247
- const handle = event.target;
248
- const input = handle.querySelector('input');
268
+ handlePointerup(event) {
269
+ const { input, model } = this.extractDataFromEvent(event);
270
+ delete this._activePointerEventData;
271
+ if (!model)
272
+ return;
249
273
  this.host.labelEl.click();
250
274
  model.handle.highlight = false;
251
275
  delete this.draggingHandle;
252
276
  model.handle.dragging = false;
253
277
  this.requestUpdate();
254
- handle.releasePointerCapture(event.pointerId);
278
+ this.host.track.releasePointerCapture(event.pointerId);
255
279
  this.dispatchChangeEvent(input, model.handle);
256
280
  }
257
- handlePointermove(event, model) {
281
+ handlePointermove(event) {
282
+ const { input, model } = this.extractDataFromEvent(event);
283
+ if (!model)
284
+ return;
258
285
  /* c8 ignore next 3 */
259
286
  if (!this.draggingHandle) {
260
287
  return;
261
288
  }
262
289
  event.stopPropagation();
263
- const { input } = this.getHandleElements(model.handle);
264
290
  input.value = this.calculateHandlePosition(event, model).toString();
265
291
  model.handle.value = parseFloat(input.value);
266
292
  this.requestUpdate();
@@ -308,16 +334,6 @@ export class HandleController {
308
334
  class=${classMap(classes)}
309
335
  name=${model.name}
310
336
  style=${styleMap(style)}
311
- @manage=${streamingListener({
312
- type: 'pointerdown',
313
- fn: (event) => this.handlePointerdown(event, model),
314
- }, {
315
- type: 'pointermove',
316
- fn: (event) => this.handlePointermove(event, model),
317
- }, {
318
- type: ['pointerup', 'pointercancel'],
319
- fn: (event) => this.handlePointerup(event, model),
320
- })}
321
337
  role="presentation"
322
338
  >
323
339
  <input
@@ -1 +1 @@
1
- {"version":3,"file":"HandleController.js","sourceRoot":"","sources":["HandleController.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;EAUE;AACF,OAAO,EACH,IAAI,EAEJ,SAAS,EACT,QAAQ,EACR,QAAQ,GACX,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yDAAyD,CAAC;AAwC5F,MAAM,OAAO,gBAAgB;IASzB,YAAY,IAAY;QANhB,YAAO,GAA8B,IAAI,GAAG,EAAE,CAAC;QAC/C,UAAK,GAAiB,EAAE,CAAC;QACzB,gBAAW,GAAa,EAAE,CAAC;QAyG3B,6BAAwB,GAAG,GAAS,EAAE;YAC1C,IAAI,OAAO,GAAG;gBACV,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC;aACjC,CAAC;YACpB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;gBACtB,OAAO,GAAG,CAAC,IAAI,CAAC,IAAoB,CAAC,CAAC;aACzC;YACD,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;YACtB,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;;gBAC9B,oBAAoB;gBACpB,IAAI,CAAC,CAAA,MAAA,MAAM,CAAC,UAAU,0CAAE,MAAM,CAAA,EAAE;oBAC5B,MAAM,CAAC,IAAI,GAAG,SAAS,KAAK,GAAG,CAAC,EAAE,CAAC;iBACtC;gBACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;gBAC5C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACzC,MAAM,CAAC,gBAAgB,GAAG,IAAI,CAAC;YACnC,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC,CAAC;QA2IF;;WAEG;QACK,kBAAa,GAAG,CAAC,KAAY,EAAQ,EAAE;YAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAwB,CAAC;YAC7C,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;YAE/C,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC,CAAC;QAEM,iBAAY,GAAG,CAAC,KAAY,EAAQ,EAAE;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAwB,CAAC;YAC7C,IAAI,cAAc,CAAC;YACnB,IAAI;gBACA,cAAc;oBACV,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC;wBAC/B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBACxC,sBAAsB;aACzB;YAAC,OAAO,KAAK,EAAE;gBACZ,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;aACxD;YACD,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,cAAc,CAAC;YAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC,CAAC;QAEM,gBAAW,GAAG,CAAC,KAAY,EAAQ,EAAE;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAwB,CAAC;YAC7C,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;YACrC,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC,CAAC;QAEM,mBAAc,GAAG,CAAC,KAAY,EAAQ,EAAE;YAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAwB,CAAC;YAC7C,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;YACpC,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC,CAAC;QAtSE,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,IAAW,MAAM;QACb,MAAM,MAAM,GAA0B,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE;YACvC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC;SAC1C;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7B,CAAC;IAEM,cAAc,CAAC,MAAoB;QACtC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;YACrC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACjD,OAAO,KAAK,CAAC;SAChB;QACD,sBAAsB;QACtB,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IAC5D,CAAC;IAEM,aAAa;QAChB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAED;;;;;;OAMG;IACI,kBAAkB,CAAC,MAAoB;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAChD,oBAAoB;QACpB,IAAI,CAAC,QAAQ;YAAE,OAAO;QAEtB,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;QAC3B,IAAI,KAAK,CAAC,aAAa,KAAK,MAAM,CAAC,KAAK,EAAE;YACtC,IAAI,MAAM,CAAC,QAAQ,EAAE;gBACjB,MAAM,CAAC,kBAAkB,EAAE,CAAC;aAC/B;SACJ;aAAM;YACH,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;YACnC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;YACnC,IAAI,CAAC,aAAa,EAAE,CAAC;SACxB;QACD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC;IACvC,CAAC;IAEM,gBAAgB,CAAC,MAAoB;QACxC,IAAI,MAAM,KAAK,IAAI,CAAC,IAAI,EAAE;YACtB,IAAI,CAAC,aAAa,EAAE,CAAC;SACxB;IACL,CAAC;IAEM,uBAAuB,CAAC,KAAiB;;QAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;QACzB,MAAM,YAAY,GAAG,MAAA,MAAM,CAAC,YAAY,mCAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QACnE,OAAO,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC/D,CAAC;IAED,IAAW,eAAe;QACtB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE;YAC5B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,CAAC;SAC/D;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,IAAW,YAAY;QACnB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACjD,IACI,IAAI,CAAC,IAAI,CAAC,QAAQ;YAClB,CAAE,KAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAClD;YACE,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;SAChC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEM,aAAa;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAChB,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;SACvE;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,wBAAwB,EAAE,CAAC;IACpC,CAAC;IAEM,gBAAgB;QACnB,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC;IAEM,UAAU;QACb,IAAI,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IAuBD,IAAW,YAAY;QACnB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,IAAW,mBAAmB;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;QACrE,OAAO,SAAS,KAAK,EAAE,CAAC;IAC5B,CAAC;IAEM,cAAc,CAAC,IAAY;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QAClE,IAAI,KAAK,IAAI,CAAC,EAAE;YACZ,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SACrC;QACD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAEO,uBAAuB;QAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC;QAC/B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAiB,CAAC;QAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CACnC,YAAY,CACI,CAAC;QACrB,uBAAS,KAAK,EAAE,YAAY,IAAK,QAAQ,EAAG;IAChD,CAAC;IAEO,iBAAiB,CAAC,YAA0B;QAChD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACpB,IAAI,CAAC,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;YAElC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CACpD,iBAAiB,CACpB,CAAC;YACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;gBAChC,MAAM,KAAK,GAAG,SAA6B,CAAC;gBAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,aAA4B,CAAC;gBAClD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAC1B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAW,CACxC,CAAC;gBACF,IAAI,KAAK,EAAE;oBACP,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;iBACnD;aACJ;SACJ;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CACpC,YAAY,CACI,CAAC;QACrB,OAAO,UAAU,CAAC;IACtB,CAAC;IAEO,yBAAyB;QAC7B,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B,CAAC;IAED,IAAY,kBAAkB;QAC1B,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;YAC3B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC;SACtE;QACD,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAEO,kBAAkB;QACtB,OAAO,IAAI,CAAC,mBAAmB,CAAC;IACpC,CAAC;IAID;;;;OAIG;IACI,cAAc,CAAC,KAAmB;QACrC,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CACzB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,CAC5C,CAAC;QACF,oBAAoB;QACpB,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CACrC,IAAI,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CACzC,CAAC;QACF,IAAI,YAAY,EAAE;YACd,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CACzB,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,CAC9C,CAAC;YACF,IAAI,KAAK,EAAE;gBACP,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;aACxC;SACJ;IACL,CAAC;IAEO,iBAAiB,CAAC,KAAmB,EAAE,KAAiB;QAC5D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAwB,CAAC;QAC9C,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;YAC1C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO;SACV;QACD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC;QACnC,KAAK,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAEO,eAAe,CAAC,KAAmB,EAAE,KAAiB;QAC1D,+EAA+E;QAC/E,MAAM,MAAM,GAAG,KAAK,CAAC,MAAwB,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAqB,CAAC;QAChE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC1B,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC;QAC/B,OAAO,IAAI,CAAC,cAAc,CAAC;QAC3B,KAAK,CAAC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9C,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAEO,iBAAiB,CAAC,KAAmB,EAAE,KAAiB;QAC5D,sBAAsB;QACtB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACtB,OAAO;SACV;QACD,KAAK,CAAC,eAAe,EAAE,CAAC;QACxB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;QACpE,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAwCO,mBAAmB,CACvB,KAAuB,EACvB,MAAoB;QAEpB,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC;QAEnC,MAAM,WAAW,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE;YACpC,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACK,uBAAuB,CAC3B,KAAgC,EAChC,KAAiB;QAEjB,MAAM,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QAExB,MAAM,UAAU,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;QAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,cAAc,CAC5C,UAAU,EACV,KAAK,CAAC,KAAK,CAAC,GAAG,EACf,KAAK,CAAC,KAAK,CAAC,GAAG,CAClB,CAAC;QAEF,oBAAoB;QACpB,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC;IAC7D,CAAC;IAEM,YAAY,CACf,KAAiB,EACjB,KAAa,EACb,MAAc,EACd,aAAsB;;QAEtB,MAAM,OAAO,GAAG;YACZ,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,CAAA,MAAA,IAAI,CAAC,cAAc,0CAAE,UAAU,MAAK,KAAK,CAAC,IAAI;YACxD,kBAAkB,EAAE,KAAK,CAAC,SAAS;SACtC,CAAC;QACF,MAAM,KAAK,GAAG;YACV,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,GAClC,KAAK,CAAC,eAAe,GAAG,GAC5B,GAAG;YACH,SAAS,EAAE,MAAM,CAAC,QAAQ,EAAE;YAC5B,sCAAsC;YACtC,kBAAkB,EAAE,iDAAiD,KAAK,2DAA2D;YACrI,cAAc,EAAE,6CAA6C,KAAK,sDAAsD;SAC3H,CAAC;QACF,MAAM,cAAc,GAAG,aAAa,CAAC,CAAC,CAAC,eAAe,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACxE,OAAO,IAAI,CAAA;;wBAEK,QAAQ,CAAC,OAAO,CAAC;uBAClB,KAAK,CAAC,IAAI;wBACT,QAAQ,CAAC,KAAK,CAAC;0BACb,iBAAiB,CACvB;YACI,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;SACtD,EACD;YACI,IAAI,EAAE,aAAa;YACnB,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC;SACtD,EACD;YACI,IAAI,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC;YACpC,EAAE,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC;SACpD,CACJ;;;;;;gCAMe,KAAK;0BACX,KAAK,CAAC,KAAK,CAAC,GAAG;0BACf,KAAK,CAAC,KAAK,CAAC,GAAG;2BACd,KAAK,CAAC,IAAI;4BACT,KAAK,CAAC,KAAK;oCACH,SAAS,CACrB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAC1C;+BACU,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;iCAC5C,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC;sCACrB,cAAc;qCACf,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;8BAC1C,IAAI,CAAC,aAAa;6BACnB,IAAI,CAAC,YAAY;4BAClB,IAAI,CAAC,WAAW;+BACb,IAAI,CAAC,cAAc;6BACrB,KAAK;;;SAGzB,CAAC;IACN,CAAC;IAEM,MAAM;QACT,IAAI,CAAC,yBAAyB,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC,YAAY,CACpB,KAAK,EACL,KAAK,EACL,MAAM,EACN,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CACxB,CAAC;QACN,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACI,aAAa;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE7B,uCAAuC;QACvC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;;YAAC,OAAA;gBACvC,KAAK;gBACL,MAAA,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,mCAAI,CAAC;aACxB,CAAA;SAAA,CAAC,CAAC;IACP,CAAC;IAEO,WAAW;QACf,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAE3C,MAAM,gBAAgB,GAAG,CAAC,KAAa,EAAiB,EAAE;YACtD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAEhC,MAAM,GAAG,GACL,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;gBAC1B,CAAC,CAAC,MAAM,CAAC,GAAG;gBACZ,CAAC,CAAE,IAAI,CAAC,IAAI,CAAC,GAAc,CAAC;YACpC,MAAM,GAAG,GACL,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ;gBAC1B,CAAC,CAAC,MAAM,CAAC,GAAG;gBACZ,CAAC,CAAE,IAAI,CAAC,IAAI,CAAC,GAAc,CAAC;YAEpC,MAAM,MAAM,GAAkB;gBAC1B,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;gBAC7B,KAAK,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;aAChC,CAAC;YAEF,IAAI,MAAM,CAAC,GAAG,KAAK,UAAU,EAAE;gBAC3B,IAAI,QAAQ,EAAE;oBACV,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;wBACjC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;wBACxB,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE;4BAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;4BAC5B,MAAM;yBACT;qBACJ;oBACD,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CACvB,QAAQ,CAAC,KAAK,EACd,MAAM,CAAC,KAAK,CAAC,GAAG,CACnB,CAAC;oBACF,sBAAsB;iBACzB;qBAAM;oBACH,OAAO,CAAC,IAAI,CACR,0DAA0D,CAC7D,CAAC;iBACL;aACJ;YACD,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,EAAE;gBACvB,IAAI,IAAI,EAAE;oBACN,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;wBAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;wBACxB,IAAI,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,EAAE;4BAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;4BAC5B,MAAM;yBACT;qBACJ;oBACD,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC1D,sBAAsB;iBACzB;qBAAM;oBACH,OAAO,CAAC,IAAI,CACR,qDAAqD,CACxD,CAAC;iBACL;aACJ;YACD,OAAO,MAAM,CAAC;QAClB,CAAC,CAAC;QAEF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;;YAC9C,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC;YAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CACzB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,EAC/C,aAAa,CAAC,KAAK,CAAC,GAAG,CAC1B,CAAC;YACF,MAAM,eAAe,GAAG,YAAY,CAChC,YAAY,EACZ,aAAa,CAAC,KAAK,CAAC,GAAG,EACvB,aAAa,CAAC,KAAK,CAAC,GAAG,CAC1B,CAAC;YACF,MAAM,KAAK,mBACP,IAAI,EAAE,MAAM,CAAC,UAAU,EACvB,KAAK,EAAE,YAAY,EACnB,eAAe,EACf,SAAS,EAAE,MAAM,CAAC,SAAS,EAC3B,IAAI,EAAE,MAAA,MAAM,CAAC,IAAI,mCAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EACnC,aAAa,EAAE,MAAM,CAAC,aAAa,EACnC,MAAM,EACN,SAAS,EACL,MAAM,KAAK,IAAI,CAAC,IAAI,IAAI,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,KAAK,CAAC,MAAM,IAAG,CAAC;oBAC5C,CAAC,CAAC,MAAM,CAAC,KAAK;oBACd,CAAC,CAAC,SAAS,IAChB,aAAa,CACnB,CAAC;YACF,OAAO,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;IAC7B,CAAC;IAEM,KAAK,CAAC,qBAAqB;QAC9B,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;aACrC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC;aACxC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC5C,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;CACJ","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 {\n html,\n TemplateResult,\n ifDefined,\n classMap,\n styleMap,\n} from '@spectrum-web-components/base';\nimport { streamingListener } from '@spectrum-web-components/base/src/streaming-listener.js';\nimport { Slider } from './Slider.js';\nimport {\n SliderHandle,\n SliderNormalization,\n Controller,\n} 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\nexport interface HandleValueDictionary {\n [key: string]: number;\n}\n\nexport class HandleController implements Controller {\n private observer!: MutationObserver;\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\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 this.host.requestUpdate();\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 handle.value = input.valueAsNumber;\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 return handle.getAriaHandleText(model.value, numberFormat);\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 this.host.editable &&\n !(input as InputWithModel).model.handle.dragging\n ) {\n return this.host.numberField;\n }\n return input;\n }\n\n public hostConnected(): void {\n if (!this.observer) {\n this.observer = new MutationObserver(this.extractModelFromLightDom);\n }\n this.observer.observe(this.host, { subtree: true, childList: true });\n this.extractModelFromLightDom();\n }\n\n public hostDisconnected(): void {\n this.observer.disconnect();\n }\n\n public hostUpdate(): void {\n this.updateModel();\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 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 = this.host.shadowRoot.querySelectorAll(\n '.handle > input'\n );\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 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 private _boundingClientRect?: DOMRect;\n\n /**\n * Receives an event from a track click and turns it into a drag\n * of the active handle\n * @param event Track click event\n */\n public beginTrackDrag(event: PointerEvent): void {\n const { handle } = this.getActiveHandleElements();\n const model = this.model.find(\n (item) => item.name === this.activeHandle\n );\n /* c8 ignore next */\n if (!model) return;\n\n event.stopPropagation();\n event.preventDefault();\n const applyDefault = handle.dispatchEvent(\n new PointerEvent('pointerdown', event)\n );\n if (applyDefault) {\n const model = this.model.find(\n (model) => model.name === this.activeHandle\n );\n if (model) {\n this.handlePointermove(event, model);\n }\n }\n }\n\n private handlePointerdown(event: PointerEvent, model: ModelValue): void {\n const handle = event.target as HTMLDivElement;\n if (this.host.disabled || event.button !== 0) {\n event.preventDefault();\n return;\n }\n this.updateBoundingRect();\n this.host.labelEl.click();\n this.draggingHandle = model.handle;\n model.handle.dragging = true;\n this.activateHandle(model.name);\n handle.setPointerCapture(event.pointerId);\n this.host.requestUpdate();\n }\n\n private handlePointerup(event: PointerEvent, model: ModelValue): void {\n // Retain focus on input element after mouse up to enable keyboard interactions\n const handle = event.target as HTMLDivElement;\n const input = handle.querySelector('input') as HTMLInputElement;\n this.host.labelEl.click();\n model.handle.highlight = false;\n delete this.draggingHandle;\n model.handle.dragging = false;\n this.requestUpdate();\n handle.releasePointerCapture(event.pointerId);\n this.dispatchChangeEvent(input, model.handle);\n }\n\n private handlePointermove(event: PointerEvent, model: ModelValue): void {\n /* c8 ignore next 3 */\n if (!this.draggingHandle) {\n return;\n }\n event.stopPropagation();\n const { input } = this.getHandleElements(model.handle);\n input.value = this.calculateHandlePosition(event, model).toString();\n model.handle.value = parseFloat(input.value);\n this.requestUpdate();\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: Event): void => {\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 normalized = (offset - minOffset) / size;\n const value = model.normalization.fromNormalized(\n normalized,\n model.range.min,\n model.range.max\n );\n\n /* c8 ignore next */\n return this.host.isLTR ? value : model.range.max - value;\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 // Allow setting background per-handle\n 'background-color': `var(--spectrum-slider-handle-background-color-${index}, var(--spectrum-slider-handle-default-background-color))`,\n 'border-color': `var(--spectrum-slider-handle-border-color-${index}, var(-spectrum-slider-handle-default-border-color))`,\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 @manage=${streamingListener(\n {\n type: 'pointerdown',\n fn: (event) => this.handlePointerdown(event, model),\n },\n {\n type: 'pointermove',\n fn: (event) => this.handlePointermove(event, model),\n },\n {\n type: ['pointerup', 'pointercancel'],\n fn: (event) => this.handlePointerup(event, model),\n }\n )}\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 @change=${this.onInputChange}\n @focus=${this.onInputFocus}\n @blur=${this.onInputBlur}\n @keydown=${this.onInputKeydown}\n .model=${model}\n />\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) + 1;\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 /* c8 ignore next 5 */\n } else {\n console.warn(\n 'First slider handle cannot have attribute min=\"previous\"'\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 /* c8 ignore next 5 */\n } else {\n console.warn(\n 'Last slider handle cannot have attribute max=\"next\"'\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"]}
1
+ {"version":3,"file":"HandleController.js","sourceRoot":"","sources":["HandleController.ts"],"names":[],"mappings":"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","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 { Slider } from './Slider.js';\nimport {\n Controller,\n SliderHandle,\n SliderNormalization,\n} 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 implements Controller {\n private observer!: MutationObserver;\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\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 this.host.requestUpdate();\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 handle.value = input.valueAsNumber;\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 return handle.getAriaHandleText(model.value, numberFormat);\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 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 (!this.observer) {\n this.observer = new MutationObserver(this.extractModelFromLightDom);\n }\n this.observer.observe(this.host, { subtree: true, childList: true });\n this.extractModelFromLightDom();\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 this.observer.disconnect();\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 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 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 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 this.host.labelEl.click();\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 this.host.labelEl.click();\n model.handle.highlight = false;\n delete this.draggingHandle;\n model.handle.dragging = false;\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 event.stopPropagation();\n input.value = this.calculateHandlePosition(event, model).toString();\n model.handle.value = parseFloat(input.value);\n this.requestUpdate();\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: Event): void => {\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 normalized = (offset - minOffset) / size;\n const value = model.normalization.fromNormalized(\n normalized,\n model.range.min,\n model.range.max\n );\n\n /* c8 ignore next */\n return this.host.isLTR ? value : model.range.max - value;\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 // Allow setting background per-handle\n 'background-color': `var(--spectrum-slider-handle-background-color-${index}, var(--spectrum-slider-handle-default-background-color))`,\n 'border-color': `var(--spectrum-slider-handle-border-color-${index}, var(-spectrum-slider-handle-default-border-color))`,\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 @change=${this.onInputChange}\n @focus=${this.onInputFocus}\n @blur=${this.onInputBlur}\n @keydown=${this.onInputKeydown}\n .model=${model}\n />\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) + 1;\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 /* c8 ignore next 5 */\n } else {\n console.warn(\n 'First slider handle cannot have attribute min=\"previous\"'\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 /* c8 ignore next 5 */\n } else {\n console.warn(\n 'Last slider handle cannot have attribute max=\"next\"'\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"]}
package/src/Slider.d.ts CHANGED
@@ -56,15 +56,13 @@ export declare class Slider extends Slider_base {
56
56
  private renderTicks;
57
57
  private renderTrackSegment;
58
58
  private renderTrack;
59
- /**
60
- * Move the handle under the cursor and begin start a pointer capture when the track
61
- * is moused down
62
- */
63
- private handleTrackPointerdown;
59
+ protected handlePointerdown(event: PointerEvent): void;
60
+ protected handlePointermove(event: PointerEvent): void;
61
+ protected handlePointerup(event: PointerEvent): void;
64
62
  private handleNumberInput;
65
63
  private handleNumberChange;
66
64
  private trackSegmentStyles;
67
65
  private _numberFieldInput;
68
- protected _getUpdateComplete(): Promise<boolean>;
66
+ protected getUpdateComplete(): Promise<boolean>;
69
67
  }
70
68
  export {};
package/src/Slider.js CHANGED
@@ -10,12 +10,15 @@ OF ANY KIND, either express or implied. See the License for the specific languag
10
10
  governing permissions and limitations under the License.
11
11
  */
12
12
  import { __decorate } from "tslib";
13
- import { html, property, query, styleMap, ifDefined, repeat, classMap, } from '@spectrum-web-components/base';
13
+ import { html, } from '@spectrum-web-components/base';
14
+ import { property, query, } from '@spectrum-web-components/base/src/decorators.js';
15
+ import { classMap, ifDefined, repeat, styleMap, } from '@spectrum-web-components/base/src/directives.js';
14
16
  import sliderStyles from './slider.css.js';
15
17
  import { ObserveSlotText } from '@spectrum-web-components/shared/src/observe-slot-text.js';
16
18
  import '@spectrum-web-components/field-label/sp-field-label.js';
17
19
  import { HandleController } from './HandleController.js';
18
20
  import { SliderHandle } from './SliderHandle.js';
21
+ import { streamingListener } from '@spectrum-web-components/base/src/streaming-listener.js';
19
22
  export const variants = ['filled', 'ramp', 'range', 'tick'];
20
23
  /**
21
24
  * @element sp-slider
@@ -148,7 +151,7 @@ export class Slider extends ObserveSlotText(SliderHandle, '') {
148
151
  const textLabelVisible = this.labelVisibility === 'none' || this.labelVisibility === 'value';
149
152
  const valueLabelVisible = this.labelVisibility === 'none' || this.labelVisibility === 'text';
150
153
  return html `
151
- <div id="labelContainer">
154
+ <div id="label-container">
152
155
  <sp-field-label
153
156
  class=${classMap({
154
157
  'visually-hidden': textLabelVisible,
@@ -250,23 +253,28 @@ export class Slider extends ObserveSlotText(SliderHandle, '') {
250
253
  })),
251
254
  ];
252
255
  return html `
253
- <div id="track" @pointerdown=${this.handleTrackPointerdown}>
256
+ <div
257
+ id="track"
258
+ ${streamingListener({
259
+ start: ['pointerdown', this.handlePointerdown],
260
+ streamInside: ['pointermove', this.handlePointermove],
261
+ end: [['pointerup', 'pointercancel'], this.handlePointerup],
262
+ })}
263
+ >
254
264
  <div id="controls">
255
265
  ${repeat(trackItems, (item) => item.id, (item) => item.html)}
256
266
  </div>
257
267
  </div>
258
268
  `;
259
269
  }
260
- /**
261
- * Move the handle under the cursor and begin start a pointer capture when the track
262
- * is moused down
263
- */
264
- handleTrackPointerdown(event) {
265
- const target = event.target;
266
- if (target.classList.contains('handle')) {
267
- return;
268
- }
269
- this.handleController.beginTrackDrag(event);
270
+ handlePointerdown(event) {
271
+ this.handleController.handlePointerdown(event);
272
+ }
273
+ handlePointermove(event) {
274
+ this.handleController.handlePointermove(event);
275
+ }
276
+ handlePointerup(event) {
277
+ this.handleController.handlePointerup(event);
270
278
  }
271
279
  handleNumberInput(event) {
272
280
  var _a;
@@ -304,8 +312,8 @@ export class Slider extends ObserveSlotText(SliderHandle, '') {
304
312
  };
305
313
  return styles;
306
314
  }
307
- async _getUpdateComplete() {
308
- const complete = (await super._getUpdateComplete());
315
+ async getUpdateComplete() {
316
+ const complete = (await super.getUpdateComplete());
309
317
  if (this.editable) {
310
318
  await this._numberFieldInput;
311
319
  await this.numberField.updateComplete;
package/src/Slider.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Slider.js","sourceRoot":"","sources":["Slider.ts"],"names":[],"mappings":"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","sourcesContent":["/*\nCopyright 2020 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*/\n\nimport {\n html,\n property,\n CSSResultArray,\n TemplateResult,\n query,\n styleMap,\n ifDefined,\n repeat,\n classMap,\n} from '@spectrum-web-components/base';\n\nimport sliderStyles from './slider.css.js';\nimport { ObserveSlotText } from '@spectrum-web-components/shared/src/observe-slot-text.js';\nimport { StyleInfo } from 'lit-html/directives/style-map';\nimport '@spectrum-web-components/field-label/sp-field-label.js';\nimport type { NumberField } from '@spectrum-web-components/number-field';\nimport { HandleController, HandleValueDictionary } from './HandleController.js';\nimport { SliderHandle } from './SliderHandle.js';\n\nexport const variants = ['filled', 'ramp', 'range', 'tick'];\n\n/**\n * @element sp-slider\n *\n * @slot - text label for the Slider\n */\nexport class Slider extends ObserveSlotText(SliderHandle, '') {\n public static get styles(): CSSResultArray {\n return [sliderStyles];\n }\n\n public handleController: HandleController = new HandleController(this);\n\n /**\n * Whether to display a Number Field along side the slider UI\n */\n @property({ type: Boolean, reflect: true })\n public get editable(): boolean {\n return this._editable;\n }\n\n public set editable(editable: boolean) {\n if (editable === this.editable) return;\n const oldValue = this.editable;\n this._editable = this.handleController.size < 2 ? editable : false;\n if (this.editable) {\n this._numberFieldInput = import(\n '@spectrum-web-components/number-field/sp-number-field.js'\n );\n }\n if (oldValue !== this.editable) {\n this.requestUpdate('editable', oldValue);\n }\n }\n\n private _editable = false;\n\n /**\n * Whether the stepper UI of the Number Field is hidden or not\n */\n @property({ type: Boolean, reflect: true, attribute: 'hide-stepper' })\n public hideStepper = false;\n\n @property()\n public type = '';\n\n @property({ type: String })\n public set variant(variant: string) {\n const oldVariant = this.variant;\n if (variant === this.variant) {\n return;\n }\n if (variants.includes(variant)) {\n this.setAttribute('variant', variant);\n this._variant = variant;\n } else {\n this.removeAttribute('variant');\n this._variant = '';\n }\n this.requestUpdate('variant', oldVariant);\n }\n\n public get variant(): string {\n return this._variant;\n }\n\n public get values(): HandleValueDictionary {\n return this.handleController.values;\n }\n\n public get handleName(): string {\n return 'value';\n }\n\n /* Ensure that a '' value for `variant` removes the attribute instead of a blank value */\n private _variant = '';\n\n @property({ attribute: false })\n public getAriaValueText: (values: Map<string, string>) => string = (\n values\n ) => {\n const valueArray = [...values.values()];\n if (valueArray.length === 2)\n return `${valueArray[0]}${this._forcedUnit} - ${valueArray[1]}${this._forcedUnit}`;\n return valueArray.join(`${this._forcedUnit}, `) + this._forcedUnit;\n };\n\n public get ariaValueText(): string {\n if (!this.getAriaValueText) {\n return `${this.value}${this._forcedUnit}`;\n }\n return this.getAriaValueText(this.handleController.formattedValues);\n }\n\n @property({ type: String, reflect: true, attribute: 'label-visibility' })\n public labelVisibility?: 'text' | 'value' | 'none';\n\n @property({ type: Number, reflect: true })\n public min = 0;\n\n @property({ type: Number, reflect: true })\n public max = 100;\n\n @property({ type: Number })\n public step = 1;\n\n @property({ type: Number, attribute: 'tick-step' })\n public tickStep = 0;\n\n @property({ type: Boolean, attribute: 'tick-labels' })\n public tickLabels = false;\n\n @property({ type: Boolean, reflect: true })\n public disabled = false;\n\n @query('#label')\n public labelEl!: HTMLLabelElement;\n\n @query('#number-field')\n public numberField!: NumberField;\n\n @query('#track')\n public track!: HTMLDivElement;\n\n public get numberFormat(): Intl.NumberFormat {\n return this.getNumberFormat();\n }\n\n public get focusElement(): HTMLElement {\n return this.handleController.focusElement;\n }\n\n protected handleLabelClick(event: Event): void {\n if (this.editable) {\n event.preventDefault();\n this.focus();\n }\n }\n\n protected render(): TemplateResult {\n return html`\n ${this.renderLabel()} ${this.renderTrack()}\n ${this.editable\n ? html`\n <sp-number-field\n .formatOptions=${this.formatOptions || {}}\n id=\"number-field\"\n min=${this.min}\n max=${this.max}\n step=${this.step}\n value=${this.value}\n ?hide-stepper=${this.hideStepper}\n ?disabled=${this.disabled}\n @input=${this.handleNumberInput}\n @change=${this.handleNumberChange}\n ></sp-number-field>\n `\n : html``}\n `;\n }\n\n public connectedCallback(): void {\n super.connectedCallback();\n this.handleController.hostConnected();\n }\n\n public disconnectedCallback(): void {\n super.disconnectedCallback();\n this.handleController.hostDisconnected();\n }\n\n public update(changedProperties: Map<string, boolean>): void {\n this.handleController.hostUpdate();\n super.update(changedProperties);\n }\n\n private renderLabel(): TemplateResult {\n const textLabelVisible =\n this.labelVisibility === 'none' || this.labelVisibility === 'value';\n const valueLabelVisible =\n this.labelVisibility === 'none' || this.labelVisibility === 'text';\n return html`\n <div id=\"labelContainer\">\n <sp-field-label\n class=${classMap({\n 'visually-hidden': textLabelVisible,\n })}\n ?disabled=${this.disabled}\n id=\"label\"\n for=${this.editable\n ? 'number-field'\n : this.handleController.activeHandleInputId}\n @click=${this.handleLabelClick}\n >\n ${this.slotHasContent ? html`` : this.label}\n <slot>${this.label}</slot>\n </sp-field-label>\n <output\n class=${classMap({\n 'visually-hidden': valueLabelVisible,\n })}\n id=\"value\"\n aria-live=\"off\"\n for=\"input\"\n >\n ${this.ariaValueText}\n </output>\n </div>\n `;\n }\n\n private renderRamp(): TemplateResult {\n if (this.variant !== 'ramp') {\n return html``;\n }\n return html`\n <div id=\"ramp\">\n <svg\n viewBox=\"0 0 240 16\"\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M240,4v8c0,2.3-1.9,4.1-4.2,4L1,9C0.4,9,0,8.5,0,8c0-0.5,0.4-1,1-1l234.8-7C238.1-0.1,240,1.7,240,4z\"\n ></path>\n </svg>\n </div>\n `;\n }\n\n private renderTicks(): TemplateResult {\n if (this.variant !== 'tick') {\n return html``;\n }\n const tickStep = this.tickStep || this.step;\n const tickCount =\n ((this.max as number) - (this.min as number)) / tickStep;\n const partialFit = tickCount % 1 !== 0;\n const ticks = new Array(Math.floor(tickCount + 1));\n ticks.fill(0, 0, tickCount + 1);\n return html`\n <div\n class=\"${partialFit ? 'not-exact ' : ''}ticks\"\n style=${ifDefined(\n partialFit\n ? `--sp-slider-tick-offset: calc(100% / ${this.max} * ${this.tickStep}`\n : undefined\n )}\n >\n ${ticks.map(\n (_tick, i) => html`\n <div class=\"tick\">\n ${this.tickLabels\n ? html`\n <div class=\"tickLabel\">\n ${i * tickStep}\n </div>\n `\n : html``}\n </div>\n `\n )}\n </div>\n `;\n }\n\n private renderTrackSegment(start: number, end: number): TemplateResult {\n if (this.variant === 'ramp') {\n return html``;\n }\n return html`\n <div\n class=\"track\"\n style=${styleMap(this.trackSegmentStyles(start, end))}\n role=\"presentation\"\n ></div>\n `;\n }\n\n private renderTrack(): TemplateResult {\n const segments = this.handleController.trackSegments();\n\n const trackItems = [\n { id: 'track0', html: this.renderTrackSegment(...segments[0]) },\n { id: 'ramp', html: this.renderRamp() },\n { id: 'ticks', html: this.renderTicks() },\n { id: 'handles', html: this.handleController.render() },\n ...segments.slice(1).map(([start, end], index) => ({\n id: `track${index + 1}`,\n html: this.renderTrackSegment(start, end),\n })),\n ];\n\n return html`\n <div id=\"track\" @pointerdown=${this.handleTrackPointerdown}>\n <div id=\"controls\">\n ${repeat(\n trackItems,\n (item) => item.id,\n (item) => item.html\n )}\n </div>\n </div>\n `;\n }\n\n /**\n * Move the handle under the cursor and begin start a pointer capture when the track\n * is moused down\n */\n private handleTrackPointerdown(event: PointerEvent): void {\n const target = event.target as HTMLElement;\n if (target.classList.contains('handle')) {\n return;\n }\n this.handleController.beginTrackDrag(event);\n }\n\n private handleNumberInput(event: Event & { target: NumberField }): void {\n const { value } = event.target;\n if (event.target?.stepperActive && !isNaN(value)) {\n this.value = value;\n return;\n }\n // Do not apply uncommited values to the parent element unless interacting with the stepper UI.\n // Stop uncommited input from being annoucned to the parent application.\n event.stopPropagation();\n }\n\n private handleNumberChange(event: Event & { target: NumberField }): void {\n const { value } = event.target;\n if (isNaN(value)) {\n event.target.value = this.value;\n event.stopPropagation();\n } else {\n this.value = value;\n if (!event.target?.stepperActive) {\n // When stepper is not active, sythesize an `input` event so that the\n // `change` event isn't surprising.\n this.dispatchInputEvent();\n }\n }\n }\n\n private trackSegmentStyles(start: number, end: number): StyleInfo {\n const size = end - start;\n const styles: StyleInfo = {\n width: `${size * 100}%`,\n '--spectrum-slider-track-background-size': `${(1 / size) * 100}%`,\n '--spectrum-slider-track-segment-position': `${start * 100}%`,\n };\n return styles;\n }\n\n private _numberFieldInput: Promise<unknown> = Promise.resolve();\n\n protected async _getUpdateComplete(): Promise<boolean> {\n const complete = (await super._getUpdateComplete()) as boolean;\n if (this.editable) {\n await this._numberFieldInput;\n await this.numberField.updateComplete;\n }\n await this.handleController.handleUpdatesComplete();\n return complete;\n }\n}\n"]}
1
+ {"version":3,"file":"Slider.js","sourceRoot":"","sources":["Slider.ts"],"names":[],"mappings":"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","sourcesContent":["/*\nCopyright 2020 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*/\n\nimport {\n CSSResultArray,\n html,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport {\n classMap,\n ifDefined,\n repeat,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\n\nimport sliderStyles from './slider.css.js';\nimport { ObserveSlotText } from '@spectrum-web-components/shared/src/observe-slot-text.js';\nimport { StyleInfo } from 'lit-html/directives/style-map';\nimport '@spectrum-web-components/field-label/sp-field-label.js';\nimport type { NumberField } from '@spectrum-web-components/number-field';\nimport { HandleController, HandleValueDictionary } from './HandleController.js';\nimport { SliderHandle } from './SliderHandle.js';\nimport { streamingListener } from '@spectrum-web-components/base/src/streaming-listener.js';\n\nexport const variants = ['filled', 'ramp', 'range', 'tick'];\n\n/**\n * @element sp-slider\n *\n * @slot - text label for the Slider\n */\nexport class Slider extends ObserveSlotText(SliderHandle, '') {\n public static get styles(): CSSResultArray {\n return [sliderStyles];\n }\n\n public handleController: HandleController = new HandleController(this);\n\n /**\n * Whether to display a Number Field along side the slider UI\n */\n @property({ type: Boolean, reflect: true })\n public get editable(): boolean {\n return this._editable;\n }\n\n public set editable(editable: boolean) {\n if (editable === this.editable) return;\n const oldValue = this.editable;\n this._editable = this.handleController.size < 2 ? editable : false;\n if (this.editable) {\n this._numberFieldInput = import(\n '@spectrum-web-components/number-field/sp-number-field.js'\n );\n }\n if (oldValue !== this.editable) {\n this.requestUpdate('editable', oldValue);\n }\n }\n\n private _editable = false;\n\n /**\n * Whether the stepper UI of the Number Field is hidden or not\n */\n @property({ type: Boolean, reflect: true, attribute: 'hide-stepper' })\n public hideStepper = false;\n\n @property()\n public type = '';\n\n @property({ type: String })\n public set variant(variant: string) {\n const oldVariant = this.variant;\n if (variant === this.variant) {\n return;\n }\n if (variants.includes(variant)) {\n this.setAttribute('variant', variant);\n this._variant = variant;\n } else {\n this.removeAttribute('variant');\n this._variant = '';\n }\n this.requestUpdate('variant', oldVariant);\n }\n\n public get variant(): string {\n return this._variant;\n }\n\n public get values(): HandleValueDictionary {\n return this.handleController.values;\n }\n\n public get handleName(): string {\n return 'value';\n }\n\n /* Ensure that a '' value for `variant` removes the attribute instead of a blank value */\n private _variant = '';\n\n @property({ attribute: false })\n public getAriaValueText: (values: Map<string, string>) => string = (\n values\n ) => {\n const valueArray = [...values.values()];\n if (valueArray.length === 2)\n return `${valueArray[0]}${this._forcedUnit} - ${valueArray[1]}${this._forcedUnit}`;\n return valueArray.join(`${this._forcedUnit}, `) + this._forcedUnit;\n };\n\n public get ariaValueText(): string {\n if (!this.getAriaValueText) {\n return `${this.value}${this._forcedUnit}`;\n }\n return this.getAriaValueText(this.handleController.formattedValues);\n }\n\n @property({ type: String, reflect: true, attribute: 'label-visibility' })\n public labelVisibility?: 'text' | 'value' | 'none';\n\n @property({ type: Number, reflect: true })\n public min = 0;\n\n @property({ type: Number, reflect: true })\n public max = 100;\n\n @property({ type: Number })\n public step = 1;\n\n @property({ type: Number, attribute: 'tick-step' })\n public tickStep = 0;\n\n @property({ type: Boolean, attribute: 'tick-labels' })\n public tickLabels = false;\n\n @property({ type: Boolean, reflect: true })\n public disabled = false;\n\n @query('#label')\n public labelEl!: HTMLLabelElement;\n\n @query('#number-field')\n public numberField!: NumberField;\n\n @query('#track')\n public track!: HTMLDivElement;\n\n public get numberFormat(): Intl.NumberFormat {\n return this.getNumberFormat();\n }\n\n public get focusElement(): HTMLElement {\n return this.handleController.focusElement;\n }\n\n protected handleLabelClick(event: Event): void {\n if (this.editable) {\n event.preventDefault();\n this.focus();\n }\n }\n\n protected render(): TemplateResult {\n return html`\n ${this.renderLabel()} ${this.renderTrack()}\n ${this.editable\n ? html`\n <sp-number-field\n .formatOptions=${this.formatOptions || {}}\n id=\"number-field\"\n min=${this.min}\n max=${this.max}\n step=${this.step}\n value=${this.value}\n ?hide-stepper=${this.hideStepper}\n ?disabled=${this.disabled}\n @input=${this.handleNumberInput}\n @change=${this.handleNumberChange}\n ></sp-number-field>\n `\n : html``}\n `;\n }\n\n public connectedCallback(): void {\n super.connectedCallback();\n this.handleController.hostConnected();\n }\n\n public disconnectedCallback(): void {\n super.disconnectedCallback();\n this.handleController.hostDisconnected();\n }\n\n public update(changedProperties: Map<string, boolean>): void {\n this.handleController.hostUpdate();\n super.update(changedProperties);\n }\n\n private renderLabel(): TemplateResult {\n const textLabelVisible =\n this.labelVisibility === 'none' || this.labelVisibility === 'value';\n const valueLabelVisible =\n this.labelVisibility === 'none' || this.labelVisibility === 'text';\n return html`\n <div id=\"label-container\">\n <sp-field-label\n class=${classMap({\n 'visually-hidden': textLabelVisible,\n })}\n ?disabled=${this.disabled}\n id=\"label\"\n for=${this.editable\n ? 'number-field'\n : this.handleController.activeHandleInputId}\n @click=${this.handleLabelClick}\n >\n ${this.slotHasContent ? html`` : this.label}\n <slot>${this.label}</slot>\n </sp-field-label>\n <output\n class=${classMap({\n 'visually-hidden': valueLabelVisible,\n })}\n id=\"value\"\n aria-live=\"off\"\n for=\"input\"\n >\n ${this.ariaValueText}\n </output>\n </div>\n `;\n }\n\n private renderRamp(): TemplateResult {\n if (this.variant !== 'ramp') {\n return html``;\n }\n return html`\n <div id=\"ramp\">\n <svg\n viewBox=\"0 0 240 16\"\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M240,4v8c0,2.3-1.9,4.1-4.2,4L1,9C0.4,9,0,8.5,0,8c0-0.5,0.4-1,1-1l234.8-7C238.1-0.1,240,1.7,240,4z\"\n ></path>\n </svg>\n </div>\n `;\n }\n\n private renderTicks(): TemplateResult {\n if (this.variant !== 'tick') {\n return html``;\n }\n const tickStep = this.tickStep || this.step;\n const tickCount =\n ((this.max as number) - (this.min as number)) / tickStep;\n const partialFit = tickCount % 1 !== 0;\n const ticks = new Array(Math.floor(tickCount + 1));\n ticks.fill(0, 0, tickCount + 1);\n return html`\n <div\n class=\"${partialFit ? 'not-exact ' : ''}ticks\"\n style=${ifDefined(\n partialFit\n ? `--sp-slider-tick-offset: calc(100% / ${this.max} * ${this.tickStep}`\n : undefined\n )}\n >\n ${ticks.map(\n (_tick, i) => html`\n <div class=\"tick\">\n ${this.tickLabels\n ? html`\n <div class=\"tickLabel\">\n ${i * tickStep}\n </div>\n `\n : html``}\n </div>\n `\n )}\n </div>\n `;\n }\n\n private renderTrackSegment(start: number, end: number): TemplateResult {\n if (this.variant === 'ramp') {\n return html``;\n }\n return html`\n <div\n class=\"track\"\n style=${styleMap(this.trackSegmentStyles(start, end))}\n role=\"presentation\"\n ></div>\n `;\n }\n\n private renderTrack(): TemplateResult {\n const segments = this.handleController.trackSegments();\n\n const trackItems = [\n { id: 'track0', html: this.renderTrackSegment(...segments[0]) },\n { id: 'ramp', html: this.renderRamp() },\n { id: 'ticks', html: this.renderTicks() },\n { id: 'handles', html: this.handleController.render() },\n ...segments.slice(1).map(([start, end], index) => ({\n id: `track${index + 1}`,\n html: this.renderTrackSegment(start, end),\n })),\n ];\n\n return html`\n <div\n id=\"track\"\n ${streamingListener({\n start: ['pointerdown', this.handlePointerdown],\n streamInside: ['pointermove', this.handlePointermove],\n end: [['pointerup', 'pointercancel'], this.handlePointerup],\n })}\n >\n <div id=\"controls\">\n ${repeat(\n trackItems,\n (item) => item.id,\n (item) => item.html\n )}\n </div>\n </div>\n `;\n }\n\n protected handlePointerdown(event: PointerEvent): void {\n this.handleController.handlePointerdown(event);\n }\n\n protected handlePointermove(event: PointerEvent): void {\n this.handleController.handlePointermove(event);\n }\n\n protected handlePointerup(event: PointerEvent): void {\n this.handleController.handlePointerup(event);\n }\n\n private handleNumberInput(event: Event & { target: NumberField }): void {\n const { value } = event.target;\n if (event.target?.stepperActive && !isNaN(value)) {\n this.value = value;\n return;\n }\n // Do not apply uncommited values to the parent element unless interacting with the stepper UI.\n // Stop uncommited input from being annoucned to the parent application.\n event.stopPropagation();\n }\n\n private handleNumberChange(event: Event & { target: NumberField }): void {\n const { value } = event.target;\n if (isNaN(value)) {\n event.target.value = this.value;\n event.stopPropagation();\n } else {\n this.value = value;\n if (!event.target?.stepperActive) {\n // When stepper is not active, sythesize an `input` event so that the\n // `change` event isn't surprising.\n this.dispatchInputEvent();\n }\n }\n }\n\n private trackSegmentStyles(start: number, end: number): StyleInfo {\n const size = end - start;\n const styles: StyleInfo = {\n width: `${size * 100}%`,\n '--spectrum-slider-track-background-size': `${(1 / size) * 100}%`,\n '--spectrum-slider-track-segment-position': `${start * 100}%`,\n };\n return styles;\n }\n\n private _numberFieldInput: Promise<unknown> = Promise.resolve();\n\n protected async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n if (this.editable) {\n await this._numberFieldInput;\n await this.numberField.updateComplete;\n }\n await this.handleController.handleUpdatesComplete();\n return complete;\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { PropertyValues } from '@spectrum-web-components/base';
2
2
  import { Focusable } from '@spectrum-web-components/shared/src/focusable.js';
3
- import { NumberFormatter, NumberFormatOptions } from '@internationalized/number';
3
+ import { NumberFormatOptions, NumberFormatter } from '@internationalized/number';
4
4
  export declare type HandleMin = number | 'previous';
5
5
  export declare type HandleMax = number | 'next';
6
6
  export declare type HandleValues = {
@@ -20,6 +20,9 @@ export declare type SliderNormalization = {
20
20
  export declare const defaultNormalization: SliderNormalization;
21
21
  /**
22
22
  * @element sp-slider-handle
23
+ *
24
+ * @fires input - The value of the element has changed.
25
+ * @fires change - An alteration to the value of the element has been committed by the user.
23
26
  */
24
27
  export declare class SliderHandle extends Focusable {
25
28
  handleController?: Controller;
@@ -10,7 +10,7 @@ OF ANY KIND, either express or implied. See the License for the specific languag
10
10
  governing permissions and limitations under the License.
11
11
  */
12
12
  import { __decorate, __rest } from "tslib";
13
- import { property } from '@spectrum-web-components/base';
13
+ import { property } from '@spectrum-web-components/base/src/decorators.js';
14
14
  import { Focusable } from '@spectrum-web-components/shared/src/focusable.js';
15
15
  import { NumberFormatter, } from '@internationalized/number';
16
16
  export const defaultNormalization = {
@@ -43,6 +43,9 @@ const MaxConverter = {
43
43
  };
44
44
  /**
45
45
  * @element sp-slider-handle
46
+ *
47
+ * @fires input - The value of the element has changed.
48
+ * @fires change - An alteration to the value of the element has been committed by the user.
46
49
  */
47
50
  export class SliderHandle extends Focusable {
48
51
  constructor() {