@spectrum-web-components/slider 0.14.0 → 0.14.2

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.
Files changed (51) hide show
  1. package/package.json +4 -4
  2. package/sp-slider-handle.dev.js +1 -0
  3. package/sp-slider-handle.dev.js.map +1 -1
  4. package/sp-slider-handle.js +1 -1
  5. package/sp-slider-handle.js.map +2 -2
  6. package/sp-slider.dev.js +1 -0
  7. package/sp-slider.dev.js.map +1 -1
  8. package/sp-slider.js +1 -1
  9. package/sp-slider.js.map +2 -2
  10. package/src/HandleController.dev.js +71 -17
  11. package/src/HandleController.dev.js.map +1 -1
  12. package/src/HandleController.js +1 -1
  13. package/src/HandleController.js.map +2 -2
  14. package/src/Slider.dev.js +18 -7
  15. package/src/Slider.dev.js.map +2 -2
  16. package/src/Slider.js +17 -17
  17. package/src/Slider.js.map +3 -3
  18. package/src/SliderHandle.dev.js +22 -12
  19. package/src/SliderHandle.dev.js.map +2 -2
  20. package/src/SliderHandle.js +1 -1
  21. package/src/SliderHandle.js.map +2 -2
  22. package/src/index.dev.js +1 -0
  23. package/src/index.dev.js.map +1 -1
  24. package/src/index.js +1 -1
  25. package/src/index.js.map +1 -1
  26. package/src/slider.css.dev.js +1 -0
  27. package/src/slider.css.dev.js.map +1 -1
  28. package/src/slider.css.js +1 -1
  29. package/src/slider.css.js.map +2 -2
  30. package/src/spectrum-slider.css.dev.js +1 -0
  31. package/src/spectrum-slider.css.dev.js.map +1 -1
  32. package/src/spectrum-slider.css.js +1 -1
  33. package/src/spectrum-slider.css.js.map +2 -2
  34. package/stories/slider.stories.js +414 -111
  35. package/stories/slider.stories.js.map +2 -2
  36. package/sync/sp-slider.dev.js +1 -0
  37. package/sync/sp-slider.dev.js.map +1 -1
  38. package/sync/sp-slider.js +1 -1
  39. package/sync/sp-slider.js.map +1 -1
  40. package/test/benchmark/test-basic.js +5 -1
  41. package/test/benchmark/test-basic.js.map +1 -1
  42. package/test/slider-editable-sync.test.js +149 -1
  43. package/test/slider-editable-sync.test.js.map +1 -1
  44. package/test/slider-editable.test.js +197 -1
  45. package/test/slider-editable.test.js.map +2 -2
  46. package/test/slider-handle-upgrade.test.js +12 -2
  47. package/test/slider-handle-upgrade.test.js.map +1 -1
  48. package/test/slider.test-vrt.js +4 -1
  49. package/test/slider.test-vrt.js.map +1 -1
  50. package/test/slider.test.js +920 -43
  51. package/test/slider.test.js.map +2 -2
@@ -1,8 +1,40 @@
1
- import"@spectrum-web-components/slider/sp-slider.js";import"@spectrum-web-components/slider/sp-slider-handle.js";import{tick as w}from"../stories/slider.stories.js";import{elementUpdated as l,expect as a,fixture as s,html as o,nextFrame as p,oneEvent as m,waitUntil as g}from"@open-wc/testing";import{sendKeys as h}from"@web/test-runner-commands";import{sendMouse as u}from"../../../test/plugins/browser.js";import{stub as v}from"sinon";import{testForLitDevWarnings as b}from"../../../test/testing-helpers.js";describe("Slider",()=>{b(async()=>await s(o`
1
+ "use strict";
2
+ import "@spectrum-web-components/slider/sp-slider.js";
3
+ import "@spectrum-web-components/slider/sp-slider-handle.js";
4
+ import { tick } from "../stories/slider.stories.js";
5
+ import {
6
+ elementUpdated,
7
+ expect,
8
+ fixture,
9
+ html,
10
+ nextFrame,
11
+ oneEvent,
12
+ waitUntil
13
+ } from "@open-wc/testing";
14
+ import { sendKeys } from "@web/test-runner-commands";
15
+ import { sendMouse } from "../../../test/plugins/browser.js";
16
+ import { stub } from "sinon";
17
+ import { testForLitDevWarnings } from "../../../test/testing-helpers.js";
18
+ describe("Slider", () => {
19
+ testForLitDevWarnings(
20
+ async () => await fixture(
21
+ html`
2
22
  <sp-slider label="Slider"></sp-slider>
3
- `)),it("loads",async()=>{const e=await s(o`
23
+ `
24
+ )
25
+ );
26
+ it("loads", async () => {
27
+ const el = await fixture(
28
+ html`
4
29
  <sp-slider label="Slider"></sp-slider>
5
- `);await l(e),await a(e).to.be.accessible()}),it('loads - [variant="tick"]',async()=>{const e=await s(o`
30
+ `
31
+ );
32
+ await elementUpdated(el);
33
+ await expect(el).to.be.accessible();
34
+ });
35
+ it('loads - [variant="tick"]', async () => {
36
+ const el = await fixture(
37
+ html`
6
38
  <sp-slider
7
39
  label="Ticked Slider"
8
40
  min="-100"
@@ -11,80 +43,751 @@ import"@spectrum-web-components/slider/sp-slider.js";import"@spectrum-web-compon
11
43
  tick-labels
12
44
  variant="tick"
13
45
  ></sp-slider>
14
- `);await l(e),await a(e).to.be.accessible()}),it('loads - [variant="tick"] irregularly',async()=>{const e=await s(o`
46
+ `
47
+ );
48
+ await elementUpdated(el);
49
+ await expect(el).to.be.accessible();
50
+ });
51
+ it('loads - [variant="tick"] irregularly', async () => {
52
+ const el = await fixture(
53
+ html`
15
54
  <sp-slider label="Slider"></sp-slider>
16
- `);await l(e),await a(e).to.be.accessible()}),it("receives value from the outside",async()=>{const e=await s(o`
55
+ `
56
+ );
57
+ await elementUpdated(el);
58
+ await expect(el).to.be.accessible();
59
+ });
60
+ it("receives value from the outside", async () => {
61
+ const el = await fixture(
62
+ html`
17
63
  <sp-slider max="20"></sp-slider>
18
- `);await l(e),a(e.value).to.equal(10),e.value=10,await l(e),a(e.value).to.equal(10),e.value=50,await l(e),a(e.value).to.equal(20)}),it("accepts keyboard events",async()=>{const e=await s(w({variant:"tick",tickStep:5}));await l(e),a(e.value).to.equal(10),a(e.highlight).to.be.false,e.focus(),await h({press:"ArrowDown"}),await l(e),a(e.value).to.equal(9),a(e.highlight).to.be.true,await h({press:"ArrowUp"}),await l(e),a(e.value).to.equal(10),a(e.highlight).to.be.true}),it("accepts pointer events",async()=>{let e=-1;const t=await s(o`
64
+ `
65
+ );
66
+ await elementUpdated(el);
67
+ expect(el.value).to.equal(10);
68
+ el.value = 10;
69
+ await elementUpdated(el);
70
+ expect(el.value).to.equal(10);
71
+ el.value = 50;
72
+ await elementUpdated(el);
73
+ expect(el.value).to.equal(20);
74
+ });
75
+ it("accepts keyboard events", async () => {
76
+ const el = await fixture(
77
+ tick({
78
+ variant: "tick",
79
+ tickStep: 5
80
+ })
81
+ );
82
+ await elementUpdated(el);
83
+ expect(el.value).to.equal(10);
84
+ expect(el.highlight).to.be.false;
85
+ el.focus();
86
+ await sendKeys({
87
+ press: "ArrowDown"
88
+ });
89
+ await elementUpdated(el);
90
+ expect(el.value).to.equal(9);
91
+ expect(el.highlight).to.be.true;
92
+ await sendKeys({
93
+ press: "ArrowUp"
94
+ });
95
+ await elementUpdated(el);
96
+ expect(el.value).to.equal(10);
97
+ expect(el.highlight).to.be.true;
98
+ });
99
+ it("accepts pointer events", async () => {
100
+ let pointerId = -1;
101
+ const el = await fixture(
102
+ html`
19
103
  <sp-slider></sp-slider>
20
- `);await l(t),a(t.dragging).to.be.false,a(t.highlight).to.be.false,a(e).to.equal(-1);const i=t.shadowRoot.querySelector(".handle");t.track.setPointerCapture=n=>e=n,t.track.releasePointerCapture=n=>e=n,i.dispatchEvent(new PointerEvent("pointerdown",{button:1,pointerId:1,cancelable:!0,bubbles:!0,composed:!0})),await l(t),a(t.dragging).to.be.false,a(e,"1").to.equal(-1),i.dispatchEvent(new PointerEvent("pointerdown",{button:0,pointerId:1,cancelable:!0,bubbles:!0,composed:!0})),await l(t),a(t.dragging,"it is dragging 1").to.be.true,a(e,"2").to.equal(1),i.dispatchEvent(new PointerEvent("pointerup",{pointerId:2,cancelable:!0,bubbles:!0,composed:!0})),await l(t),a(t.dragging).to.be.false,a(t.highlight).to.be.false,a(e,"3").to.equal(2),i.dispatchEvent(new PointerEvent("pointerdown",{button:0,pointerId:1,cancelable:!0,bubbles:!0,composed:!0})),await l(t),a(t.dragging,"it is dragging 2").to.be.true,a(e,"4").to.equal(1),i.dispatchEvent(new PointerEvent("pointercancel",{pointerId:3,cancelable:!0,bubbles:!0,composed:!0})),await l(t),a(t.dragging).to.be.false,a(e,"5").to.equal(3)}),it("will `trackPointerDown` on `#controls`",async()=>{let e=-1;const t=await s(o`
104
+ `
105
+ );
106
+ await elementUpdated(el);
107
+ expect(el.dragging).to.be.false;
108
+ expect(el.highlight).to.be.false;
109
+ expect(pointerId).to.equal(-1);
110
+ const handle = el.shadowRoot.querySelector(".handle");
111
+ el.track.setPointerCapture = (id) => pointerId = id;
112
+ el.track.releasePointerCapture = (id) => pointerId = id;
113
+ handle.dispatchEvent(
114
+ new PointerEvent("pointerdown", {
115
+ button: 1,
116
+ pointerId: 1,
117
+ cancelable: true,
118
+ bubbles: true,
119
+ composed: true
120
+ })
121
+ );
122
+ await elementUpdated(el);
123
+ expect(el.dragging).to.be.false;
124
+ expect(pointerId, "1").to.equal(-1);
125
+ handle.dispatchEvent(
126
+ new PointerEvent("pointerdown", {
127
+ button: 0,
128
+ pointerId: 1,
129
+ cancelable: true,
130
+ bubbles: true,
131
+ composed: true
132
+ })
133
+ );
134
+ await elementUpdated(el);
135
+ expect(el.dragging, "it is dragging 1").to.be.true;
136
+ expect(pointerId, "2").to.equal(1);
137
+ handle.dispatchEvent(
138
+ new PointerEvent("pointerup", {
139
+ pointerId: 2,
140
+ cancelable: true,
141
+ bubbles: true,
142
+ composed: true
143
+ })
144
+ );
145
+ await elementUpdated(el);
146
+ expect(el.dragging).to.be.false;
147
+ expect(el.highlight).to.be.false;
148
+ expect(pointerId, "3").to.equal(2);
149
+ handle.dispatchEvent(
150
+ new PointerEvent("pointerdown", {
151
+ button: 0,
152
+ pointerId: 1,
153
+ cancelable: true,
154
+ bubbles: true,
155
+ composed: true
156
+ })
157
+ );
158
+ await elementUpdated(el);
159
+ expect(el.dragging, "it is dragging 2").to.be.true;
160
+ expect(pointerId, "4").to.equal(1);
161
+ handle.dispatchEvent(
162
+ new PointerEvent("pointercancel", {
163
+ pointerId: 3,
164
+ cancelable: true,
165
+ bubbles: true,
166
+ composed: true
167
+ })
168
+ );
169
+ await elementUpdated(el);
170
+ expect(el.dragging).to.be.false;
171
+ expect(pointerId, "5").to.equal(3);
172
+ });
173
+ it("will `trackPointerDown` on `#controls`", async () => {
174
+ let pointerId = -1;
175
+ const el = await fixture(
176
+ html`
21
177
  <sp-slider style="width: 500px" max="70"></sp-slider>
22
- `);await l(t),a(t.value).to.equal(10);const i=t.shadowRoot.querySelector("#controls"),n=t.shadowRoot.querySelector(".handle");t.track.setPointerCapture=r=>e=r,t.track.releasePointerCapture=r=>e=r,i.dispatchEvent(new PointerEvent("pointerdown",{button:1,clientX:9,pointerId:4,bubbles:!0,cancelable:!0})),await l(t),a(e).to.equal(-1),a(t.value).to.equal(10),a(t.dragging,"handle is not yet being dragged").to.be.false,i.dispatchEvent(new PointerEvent("pointerdown",{button:0,clientX:9,pointerId:4,bubbles:!0,cancelable:!0})),await l(t),a(e).to.equal(4),a(t.value).to.equal(0),a(t.dragging,"handle is being dragged").to.be.true,n.dispatchEvent(new PointerEvent("pointermove",{button:0,clientX:508,pointerId:4,bubbles:!0,cancelable:!0})),await l(t),a(t.dragging,"handle is still being dragged").to.be.true,a(e).to.equal(4),a(t.value).to.equal(70),n.dispatchEvent(new PointerEvent("pointerup",{button:0,clientX:9,pointerId:4,bubbles:!0,cancelable:!0})),await l(t),a(e).to.equal(4),a(t.value).to.equal(70),a(t.dragging,"handle is no longer being dragged").to.be.false}),it("can be disabled",async()=>{let e=-1;const t=await s(o`
178
+ `
179
+ );
180
+ await elementUpdated(el);
181
+ expect(el.value).to.equal(10);
182
+ const controls = el.shadowRoot.querySelector(
183
+ "#controls"
184
+ );
185
+ const handle = el.shadowRoot.querySelector(".handle");
186
+ el.track.setPointerCapture = (id) => pointerId = id;
187
+ el.track.releasePointerCapture = (id) => pointerId = id;
188
+ controls.dispatchEvent(
189
+ new PointerEvent("pointerdown", {
190
+ button: 1,
191
+ clientX: 9,
192
+ pointerId: 4,
193
+ bubbles: true,
194
+ cancelable: true
195
+ })
196
+ );
197
+ await elementUpdated(el);
198
+ expect(pointerId).to.equal(-1);
199
+ expect(el.value).to.equal(10);
200
+ expect(el.dragging, "handle is not yet being dragged").to.be.false;
201
+ controls.dispatchEvent(
202
+ new PointerEvent("pointerdown", {
203
+ button: 0,
204
+ clientX: 9,
205
+ pointerId: 4,
206
+ bubbles: true,
207
+ cancelable: true
208
+ })
209
+ );
210
+ await elementUpdated(el);
211
+ expect(pointerId).to.equal(4);
212
+ expect(el.value).to.equal(0);
213
+ expect(el.dragging, "handle is being dragged").to.be.true;
214
+ handle.dispatchEvent(
215
+ new PointerEvent("pointermove", {
216
+ button: 0,
217
+ clientX: 508,
218
+ pointerId: 4,
219
+ bubbles: true,
220
+ cancelable: true
221
+ })
222
+ );
223
+ await elementUpdated(el);
224
+ expect(el.dragging, "handle is still being dragged").to.be.true;
225
+ expect(pointerId).to.equal(4);
226
+ expect(el.value).to.equal(70);
227
+ handle.dispatchEvent(
228
+ new PointerEvent("pointerup", {
229
+ button: 0,
230
+ clientX: 9,
231
+ pointerId: 4,
232
+ bubbles: true,
233
+ cancelable: true
234
+ })
235
+ );
236
+ await elementUpdated(el);
237
+ expect(pointerId).to.equal(4);
238
+ expect(el.value).to.equal(70);
239
+ expect(el.dragging, "handle is no longer being dragged").to.be.false;
240
+ });
241
+ it("can be disabled", async () => {
242
+ let pointerId = -1;
243
+ const el = await fixture(
244
+ html`
23
245
  <sp-slider disabled></sp-slider>
24
- `);await l(t),a(t.dragging).to.be.false,a(e).to.equal(-1),a(t.value).to.equal(10);const i=t.shadowRoot.querySelector(".handle");i.setPointerCapture=r=>e=r,i.dispatchEvent(new PointerEvent("pointerdown",{button:0,pointerId:1,cancelable:!0})),await l(t),a(t.dragging).to.be.false,a(e).to.equal(-1),t.shadowRoot.querySelector("#controls").dispatchEvent(new PointerEvent("pointerdown",{button:0,clientX:50,pointerId:1,cancelable:!0})),await l(t),a(e).to.equal(-1),a(t.value).to.equal(10)}),it("accepts pointermove events",async()=>{const e=await s(o`
246
+ `
247
+ );
248
+ await elementUpdated(el);
249
+ expect(el.dragging).to.be.false;
250
+ expect(pointerId).to.equal(-1);
251
+ expect(el.value).to.equal(10);
252
+ const handle = el.shadowRoot.querySelector(".handle");
253
+ handle.setPointerCapture = (id) => pointerId = id;
254
+ handle.dispatchEvent(
255
+ new PointerEvent("pointerdown", {
256
+ button: 0,
257
+ pointerId: 1,
258
+ cancelable: true
259
+ })
260
+ );
261
+ await elementUpdated(el);
262
+ expect(el.dragging).to.be.false;
263
+ expect(pointerId).to.equal(-1);
264
+ const controls = el.shadowRoot.querySelector(
265
+ "#controls"
266
+ );
267
+ controls.dispatchEvent(
268
+ new PointerEvent("pointerdown", {
269
+ button: 0,
270
+ clientX: 50,
271
+ pointerId: 1,
272
+ cancelable: true
273
+ })
274
+ );
275
+ await elementUpdated(el);
276
+ expect(pointerId).to.equal(-1);
277
+ expect(el.value).to.equal(10);
278
+ });
279
+ it("accepts pointermove events", async () => {
280
+ const el = await fixture(
281
+ html`
25
282
  <sp-slider></sp-slider>
26
- `);await l(e),a(e.value).to.equal(10);const t=e.shadowRoot.querySelector(".handle");await u({steps:[{type:"move",position:[9,30]},{type:"down"}]}),await l(e),a(e.dragging,"is dragging").to.be.true,a(e.highlight,"not highlighted").to.be.false,t.dispatchEvent(new PointerEvent("pointermove",{clientX:0,cancelable:!0,bubbles:!0,composed:!0})),await l(e),a(e.value).to.equal(0)}),it("manages RTL when min != 0",async()=>{const e=await s(o`
283
+ `
284
+ );
285
+ await elementUpdated(el);
286
+ expect(el.value).to.equal(10);
287
+ const handle = el.shadowRoot.querySelector(".handle");
288
+ await sendMouse({
289
+ steps: [
290
+ {
291
+ type: "move",
292
+ position: [9, 30]
293
+ },
294
+ {
295
+ type: "down"
296
+ }
297
+ ]
298
+ });
299
+ await elementUpdated(el);
300
+ expect(el.dragging, "is dragging").to.be.true;
301
+ expect(el.highlight, "not highlighted").to.be.false;
302
+ handle.dispatchEvent(
303
+ new PointerEvent("pointermove", {
304
+ clientX: 0,
305
+ cancelable: true,
306
+ bubbles: true,
307
+ composed: true
308
+ })
309
+ );
310
+ await elementUpdated(el);
311
+ expect(el.value).to.equal(0);
312
+ });
313
+ it("manages RTL when min != 0", async () => {
314
+ const el = await fixture(
315
+ html`
27
316
  <sp-slider min="1" max="11" dir="rtl"></sp-slider>
28
- `);await l(e),a(e.value).to.equal(10);const t=e.shadowRoot.querySelector(".handle");await u({steps:[{type:"move",position:[9,30]},{type:"down"}]}),await l(e),a(e.dragging,"is dragging").to.be.true,a(e.highlight,"not highlighted").to.be.false,t.dispatchEvent(new PointerEvent("pointermove",{clientX:0,cancelable:!0,bubbles:!0,composed:!0})),await l(e),a(e.value).to.equal(11)}),it("goes [disabled] while dragging",async()=>{const e=await s(o`
317
+ `
318
+ );
319
+ await elementUpdated(el);
320
+ expect(el.value).to.equal(10);
321
+ const handle = el.shadowRoot.querySelector(".handle");
322
+ await sendMouse({
323
+ steps: [
324
+ {
325
+ type: "move",
326
+ position: [9, 30]
327
+ },
328
+ {
329
+ type: "down"
330
+ }
331
+ ]
332
+ });
333
+ await elementUpdated(el);
334
+ expect(el.dragging, "is dragging").to.be.true;
335
+ expect(el.highlight, "not highlighted").to.be.false;
336
+ handle.dispatchEvent(
337
+ new PointerEvent("pointermove", {
338
+ clientX: 0,
339
+ cancelable: true,
340
+ bubbles: true,
341
+ composed: true
342
+ })
343
+ );
344
+ await elementUpdated(el);
345
+ expect(el.value).to.equal(11);
346
+ });
347
+ it("goes [disabled] while dragging", async () => {
348
+ const el = await fixture(
349
+ html`
29
350
  <sp-slider></sp-slider>
30
- `);await l(e),a(e.value).to.equal(10);const i=e.shadowRoot.querySelector(".handle").getBoundingClientRect();await u({steps:[{type:"move",position:[i.x+i.width/2,i.y+i.height/2]},{type:"down"}]}),await l(e),a(e.dragging,"is dragging").to.be.true,a(e.highlight,"not highlighted").to.be.false,a(e.value).to.equal(10);const n=m(e,"input");await u({steps:[{type:"move",position:[i.x+i.width/2+100,i.y+i.height/2]}]}),await n,a(e.value).to.equal(13),e.disabled=!0,await l(e),a(e.dragging,"is dragging").to.be.false,a(e.highlight,"not highlighted").to.be.false,await u({steps:[{type:"move",position:[0,i.top+i.height/2]}]}),a(e.value).to.equal(13)}),it("accepts pointermove events in separate interactions",async()=>{let e=-1;const t=await s(o`
351
+ `
352
+ );
353
+ await elementUpdated(el);
354
+ expect(el.value).to.equal(10);
355
+ const handle = el.shadowRoot.querySelector(".handle");
356
+ const handleBoundingRect = handle.getBoundingClientRect();
357
+ await sendMouse({
358
+ steps: [
359
+ {
360
+ type: "move",
361
+ position: [
362
+ handleBoundingRect.x + handleBoundingRect.width / 2,
363
+ handleBoundingRect.y + handleBoundingRect.height / 2
364
+ ]
365
+ },
366
+ {
367
+ type: "down"
368
+ }
369
+ ]
370
+ });
371
+ await elementUpdated(el);
372
+ expect(el.dragging, "is dragging").to.be.true;
373
+ expect(el.highlight, "not highlighted").to.be.false;
374
+ expect(el.value).to.equal(10);
375
+ const inputEvent = oneEvent(el, "input");
376
+ await sendMouse({
377
+ steps: [
378
+ {
379
+ type: "move",
380
+ position: [
381
+ handleBoundingRect.x + handleBoundingRect.width / 2 + 100,
382
+ handleBoundingRect.y + handleBoundingRect.height / 2
383
+ ]
384
+ }
385
+ ]
386
+ });
387
+ await inputEvent;
388
+ expect(el.value).to.equal(13);
389
+ el.disabled = true;
390
+ await elementUpdated(el);
391
+ expect(el.dragging, "is dragging").to.be.false;
392
+ expect(el.highlight, "not highlighted").to.be.false;
393
+ await sendMouse({
394
+ steps: [
395
+ {
396
+ type: "move",
397
+ position: [
398
+ 0,
399
+ handleBoundingRect.top + handleBoundingRect.height / 2
400
+ ]
401
+ }
402
+ ]
403
+ });
404
+ expect(el.value).to.equal(13);
405
+ });
406
+ it("accepts pointermove events in separate interactions", async () => {
407
+ let pointerId = -1;
408
+ const el = await fixture(
409
+ html`
31
410
  <sp-slider style="width: 100px"></sp-slider>
32
- `);await l(t),a(t.value,"initial").to.equal(10);const i=t.shadowRoot.querySelector(".handle");t.track.setPointerCapture=n=>e=n,t.track.releasePointerCapture=n=>e=n,i.dispatchEvent(new PointerEvent("pointerdown",{clientX:58,cancelable:!0,button:0,pointerId:100,composed:!0,bubbles:!0})),await l(t),i.dispatchEvent(new PointerEvent("pointermove",{clientX:58,cancelable:!0,composed:!0,bubbles:!0})),await l(t),a(t.value,"first pointerdown").to.equal(50),a(t.dragging,"is dragging").to.be.true,a(t.classList.contains("handle-highlight"),"not highlighted").to.be.false,a(e).to.equal(100),i.dispatchEvent(new PointerEvent("pointermove",{clientX:0,cancelable:!0,composed:!0,bubbles:!0})),await l(t),a(t.value,"first pointermove").to.equal(0),i.dispatchEvent(new PointerEvent("pointerup",{clientX:0,cancelable:!0,composed:!0,bubbles:!0})),await l(t),a(t.value,"first pointerup").to.equal(0),a(t.dragging,"is dragging").to.be.false,i.dispatchEvent(new PointerEvent("pointerdown",{clientX:58,cancelable:!0,button:0,composed:!0,bubbles:!0})),await l(t),i.dispatchEvent(new PointerEvent("pointermove",{clientX:58,cancelable:!0,composed:!0,bubbles:!0})),await l(t),a(t.value,"second pointerdown").to.equal(50),a(t.dragging,"is dragging").to.be.true,a(t.classList.contains("handle-highlight"),"not highlighted").to.be.false,i.dispatchEvent(new PointerEvent("pointermove",{clientX:0,cancelable:!0,composed:!0,bubbles:!0})),await l(t),a(t.value,"second pointermove").to.equal(0),i.dispatchEvent(new PointerEvent("pointerup",{clientX:0,cancelable:!0,composed:!0,bubbles:!0})),await l(t),a(t.value,"second pointerup").to.equal(0),a(t.dragging,"is dragging").to.be.false}),it("accepts pointermove events - [step=0]",async()=>{const e=await s(o`
411
+ `
412
+ );
413
+ await elementUpdated(el);
414
+ expect(el.value, "initial").to.equal(10);
415
+ const handle = el.shadowRoot.querySelector(".handle");
416
+ el.track.setPointerCapture = (id) => pointerId = id;
417
+ el.track.releasePointerCapture = (id) => pointerId = id;
418
+ handle.dispatchEvent(
419
+ new PointerEvent("pointerdown", {
420
+ clientX: 58,
421
+ cancelable: true,
422
+ button: 0,
423
+ pointerId: 100,
424
+ composed: true,
425
+ bubbles: true
426
+ })
427
+ );
428
+ await elementUpdated(el);
429
+ handle.dispatchEvent(
430
+ new PointerEvent("pointermove", {
431
+ clientX: 58,
432
+ cancelable: true,
433
+ composed: true,
434
+ bubbles: true
435
+ })
436
+ );
437
+ await elementUpdated(el);
438
+ expect(el.value, "first pointerdown").to.equal(50);
439
+ expect(el.dragging, "is dragging").to.be.true;
440
+ expect(el.classList.contains("handle-highlight"), "not highlighted").to.be.false;
441
+ expect(pointerId).to.equal(100);
442
+ handle.dispatchEvent(
443
+ new PointerEvent("pointermove", {
444
+ clientX: 0,
445
+ cancelable: true,
446
+ composed: true,
447
+ bubbles: true
448
+ })
449
+ );
450
+ await elementUpdated(el);
451
+ expect(el.value, "first pointermove").to.equal(0);
452
+ handle.dispatchEvent(
453
+ new PointerEvent("pointerup", {
454
+ clientX: 0,
455
+ cancelable: true,
456
+ composed: true,
457
+ bubbles: true
458
+ })
459
+ );
460
+ await elementUpdated(el);
461
+ expect(el.value, "first pointerup").to.equal(0);
462
+ expect(el.dragging, "is dragging").to.be.false;
463
+ handle.dispatchEvent(
464
+ new PointerEvent("pointerdown", {
465
+ clientX: 58,
466
+ cancelable: true,
467
+ button: 0,
468
+ composed: true,
469
+ bubbles: true
470
+ })
471
+ );
472
+ await elementUpdated(el);
473
+ handle.dispatchEvent(
474
+ new PointerEvent("pointermove", {
475
+ clientX: 58,
476
+ cancelable: true,
477
+ composed: true,
478
+ bubbles: true
479
+ })
480
+ );
481
+ await elementUpdated(el);
482
+ expect(el.value, "second pointerdown").to.equal(50);
483
+ expect(el.dragging, "is dragging").to.be.true;
484
+ expect(el.classList.contains("handle-highlight"), "not highlighted").to.be.false;
485
+ handle.dispatchEvent(
486
+ new PointerEvent("pointermove", {
487
+ clientX: 0,
488
+ cancelable: true,
489
+ composed: true,
490
+ bubbles: true
491
+ })
492
+ );
493
+ await elementUpdated(el);
494
+ expect(el.value, "second pointermove").to.equal(0);
495
+ handle.dispatchEvent(
496
+ new PointerEvent("pointerup", {
497
+ clientX: 0,
498
+ cancelable: true,
499
+ composed: true,
500
+ bubbles: true
501
+ })
502
+ );
503
+ await elementUpdated(el);
504
+ expect(el.value, "second pointerup").to.equal(0);
505
+ expect(el.dragging, "is dragging").to.be.false;
506
+ });
507
+ it("accepts pointermove events - [step=0]", async () => {
508
+ const el = await fixture(
509
+ html`
33
510
  <sp-slider step="0" max="20" style="width: 500px; float: left;">
34
511
  Step = 0
35
512
  </sp-slider>
36
- `);await l(e),await p(),await p(),a(e.value).to.equal(10);const i=e.shadowRoot.querySelector(".handle").getBoundingClientRect(),n=[i.x+i.width/2,i.y+i.height/2];await u({steps:[{type:"move",position:n},{type:"down"}]}),await p(),a(e.highlight,"with no highlight").to.be.false,a(e.dragging,"dragging").to.be.true;let r=m(e,"input");await u({steps:[{type:"move",position:[200,i.y+i.height+100]}]}),await r,a(e.value).to.equal(8),r=m(e,"input"),await u({steps:[{type:"move",position:[125,n[1]]}]}),await r,a(e.value).to.equal(5)}),it("will not pointermove unless `pointerdown`",async()=>{const e=await s(o`
513
+ `
514
+ );
515
+ await elementUpdated(el);
516
+ await nextFrame();
517
+ await nextFrame();
518
+ expect(el.value).to.equal(10);
519
+ const handle = el.shadowRoot.querySelector(".handle");
520
+ const handleBoundingRect = handle.getBoundingClientRect();
521
+ const position = [
522
+ handleBoundingRect.x + handleBoundingRect.width / 2,
523
+ handleBoundingRect.y + handleBoundingRect.height / 2
524
+ ];
525
+ await sendMouse({
526
+ steps: [
527
+ {
528
+ type: "move",
529
+ position
530
+ },
531
+ {
532
+ type: "down"
533
+ }
534
+ ]
535
+ });
536
+ await nextFrame();
537
+ expect(el.highlight, "with no highlight").to.be.false;
538
+ expect(el.dragging, "dragging").to.be.true;
539
+ let inputEvent = oneEvent(el, "input");
540
+ await sendMouse({
541
+ steps: [
542
+ {
543
+ type: "move",
544
+ position: [
545
+ 200,
546
+ handleBoundingRect.y + handleBoundingRect.height + 100
547
+ ]
548
+ }
549
+ ]
550
+ });
551
+ await inputEvent;
552
+ expect(el.value).to.equal(8);
553
+ inputEvent = oneEvent(el, "input");
554
+ await sendMouse({
555
+ steps: [
556
+ {
557
+ type: "move",
558
+ position: [125, position[1]]
559
+ }
560
+ ]
561
+ });
562
+ await inputEvent;
563
+ expect(el.value).to.equal(5);
564
+ });
565
+ it("will not pointermove unless `pointerdown`", async () => {
566
+ const el = await fixture(
567
+ html`
37
568
  <sp-slider></sp-slider>
38
- `);await l(e),a(e.value).to.equal(10),a(e.dragging).to.be.false,e.shadowRoot.querySelector(".handle").dispatchEvent(new PointerEvent("pointermove",{clientX:0,cancelable:!0})),await p(),a(e.value).to.equal(10)}),it("responds to input events on the <input/> element",async()=>{const e=await s(o`
569
+ `
570
+ );
571
+ await elementUpdated(el);
572
+ expect(el.value).to.equal(10);
573
+ expect(el.dragging).to.be.false;
574
+ const handle = el.shadowRoot.querySelector(".handle");
575
+ handle.dispatchEvent(
576
+ new PointerEvent("pointermove", {
577
+ clientX: 0,
578
+ cancelable: true
579
+ })
580
+ );
581
+ await nextFrame();
582
+ expect(el.value).to.equal(10);
583
+ });
584
+ it("responds to input events on the <input/> element", async () => {
585
+ const el = await fixture(
586
+ html`
39
587
  <sp-slider></sp-slider>
40
- `);await l(e),a(e.value).to.equal(10);const t=e.shadowRoot.querySelector(".input");t.value="0",t.dispatchEvent(new Event("change")),a(e.value).to.equal(0)}),it("accepts variants",async()=>{const e=await s(o`
588
+ `
589
+ );
590
+ await elementUpdated(el);
591
+ expect(el.value).to.equal(10);
592
+ const input = el.shadowRoot.querySelector(".input");
593
+ input.value = "0";
594
+ input.dispatchEvent(new Event("change"));
595
+ expect(el.value).to.equal(0);
596
+ });
597
+ it("accepts variants", async () => {
598
+ const el = await fixture(
599
+ html`
41
600
  <sp-slider variant="tick"></sp-slider>
42
- `);await l(e),a(e.variant).to.equal("tick"),a(e.getAttribute("variant")).to.equal("tick"),e.variant="ramp",await l(e),a(e.variant).to.equal("ramp"),a(e.getAttribute("variant")).to.equal("ramp"),e.setAttribute("variant","filled"),await l(e),a(e.variant).to.equal("filled"),a(e.getAttribute("variant")).to.equal("filled"),e.removeAttribute("variant"),await l(e),a(e.variant).to.equal(""),a(e.hasAttribute("variant")).to.be.false}),it("validates variants",async()=>{const e=await s(o`
601
+ `
602
+ );
603
+ await elementUpdated(el);
604
+ expect(el.variant).to.equal("tick");
605
+ expect(el.getAttribute("variant")).to.equal("tick");
606
+ el.variant = "ramp";
607
+ await elementUpdated(el);
608
+ expect(el.variant).to.equal("ramp");
609
+ expect(el.getAttribute("variant")).to.equal("ramp");
610
+ el.setAttribute("variant", "filled");
611
+ await elementUpdated(el);
612
+ expect(el.variant).to.equal("filled");
613
+ expect(el.getAttribute("variant")).to.equal("filled");
614
+ el.removeAttribute("variant");
615
+ await elementUpdated(el);
616
+ expect(el.variant).to.equal("");
617
+ expect(el.hasAttribute("variant")).to.be.false;
618
+ });
619
+ it("validates variants", async () => {
620
+ const el = await fixture(
621
+ html`
43
622
  <sp-slider variant="other"></sp-slider>
44
- `);await l(e),a(e.variant).to.equal(""),a(e.hasAttribute("variant")).to.be.false,e.variant="tick",await l(e),a(e.variant).to.equal("tick"),a(e.getAttribute("variant")).to.equal("tick"),e.variant="tick",await l(e),a(e.variant).to.equal("tick"),a(e.getAttribute("variant")).to.equal("tick")}),it("has a `focusElement`",async()=>{const e=await s(o`
623
+ `
624
+ );
625
+ await elementUpdated(el);
626
+ expect(el.variant).to.equal("");
627
+ expect(el.hasAttribute("variant")).to.be.false;
628
+ el.variant = "tick";
629
+ await elementUpdated(el);
630
+ expect(el.variant).to.equal("tick");
631
+ expect(el.getAttribute("variant")).to.equal("tick");
632
+ el.variant = "tick";
633
+ await elementUpdated(el);
634
+ expect(el.variant).to.equal("tick");
635
+ expect(el.getAttribute("variant")).to.equal("tick");
636
+ });
637
+ it("has a `focusElement`", async () => {
638
+ const el = await fixture(
639
+ html`
45
640
  <sp-slider></sp-slider>
46
- `);await l(e);const t=e.focusElement;a(t).to.not.be.undefined,a(t.type).to.equal("range")}),it("displays result of getAriaValueText",async()=>{const e=await s(o`
641
+ `
642
+ );
643
+ await elementUpdated(el);
644
+ const input = el.focusElement;
645
+ expect(input).to.not.be.undefined;
646
+ expect(input.type).to.equal("range");
647
+ });
648
+ it("displays result of getAriaValueText", async () => {
649
+ const el = await fixture(
650
+ html`
47
651
  <sp-slider
48
652
  value="50"
49
653
  min="0"
50
654
  max="100"
51
- .getAriaHandleText=${i=>`${i}%`}
655
+ .getAriaHandleText=${(value) => `${value}%`}
52
656
  ></sp-slider>
53
- `);await l(e);const t=e.focusElement;a(t.getAttribute("aria-valuetext")).to.equal("50%"),e.value=100,await l(e),a(t.getAttribute("aria-valuetext")).to.equal("100%")}),it("displays Intl.formatNumber results",async()=>{const e=await s(o`
657
+ `
658
+ );
659
+ await elementUpdated(el);
660
+ const input = el.focusElement;
661
+ expect(input.getAttribute("aria-valuetext")).to.equal("50%");
662
+ el.value = 100;
663
+ await elementUpdated(el);
664
+ expect(input.getAttribute("aria-valuetext")).to.equal("100%");
665
+ });
666
+ it("displays Intl.formatNumber results", async () => {
667
+ const el = await fixture(
668
+ html`
54
669
  <sp-slider
55
670
  value=".5"
56
671
  min="0"
57
672
  max="1"
58
- .formatOptions=${{style:"percent"}}
673
+ .formatOptions=${{ style: "percent" }}
59
674
  ></sp-slider>
60
- `);await l(e);const t=e.focusElement;a(t.getAttribute("aria-valuetext")).to.equal("50%"),e.value=100,await l(e),a(t.getAttribute("aria-valuetext")).to.equal("100%")}),it("obeys language property",async()=>{let e="de";const t=[],i=c=>{t.push(c.detail.callback),n()},n=()=>{t.forEach(c=>c(e))};let r=await s(o`
675
+ `
676
+ );
677
+ await elementUpdated(el);
678
+ const input = el.focusElement;
679
+ expect(input.getAttribute("aria-valuetext")).to.equal("50%");
680
+ el.value = 100;
681
+ await elementUpdated(el);
682
+ expect(input.getAttribute("aria-valuetext")).to.equal("100%");
683
+ });
684
+ it("obeys language property", async () => {
685
+ let lang = "de";
686
+ const langResolvers = [];
687
+ const createLangResolver = (event) => {
688
+ langResolvers.push(event.detail.callback);
689
+ resolveLanguage();
690
+ };
691
+ const resolveLanguage = () => {
692
+ langResolvers.forEach((resolver) => resolver(lang));
693
+ };
694
+ let el = await fixture(
695
+ html`
61
696
  <sp-slider
62
697
  value="2.44"
63
698
  min="0"
64
699
  max="10"
65
700
  step="0.01"
66
- @sp-language-context=${i}
67
- .formatOptions=${{maximumFractionDigits:2}}
701
+ @sp-language-context=${createLangResolver}
702
+ .formatOptions=${{ maximumFractionDigits: 2 }}
68
703
  ></sp-slider>
69
- `);await l(r);let d=r.focusElement;a(d.getAttribute("aria-valuetext"),"First German number").to.equal("2,44"),e="en",n(),await l(r),a(d.getAttribute("aria-valuetext"),"First English number").to.equal("2.44"),e="de",n(),r=await s(o`
704
+ `
705
+ );
706
+ await elementUpdated(el);
707
+ let input = el.focusElement;
708
+ expect(
709
+ input.getAttribute("aria-valuetext"),
710
+ "First German number"
711
+ ).to.equal("2,44");
712
+ lang = "en";
713
+ resolveLanguage();
714
+ await elementUpdated(el);
715
+ expect(
716
+ input.getAttribute("aria-valuetext"),
717
+ "First English number"
718
+ ).to.equal("2.44");
719
+ lang = "de";
720
+ resolveLanguage();
721
+ el = await fixture(
722
+ html`
70
723
  <sp-slider
71
724
  min="0"
72
725
  max="10"
73
- @sp-language-context=${i}
726
+ @sp-language-context=${createLangResolver}
74
727
  >
75
728
  <sp-slider-handle
76
729
  slot="handle"
77
730
  step="0.01"
78
731
  value="2.44"
79
- .formatOptions=${{maximumFractionDigits:2}}
80
- @sp-language-context=${i}
732
+ .formatOptions=${{ maximumFractionDigits: 2 }}
733
+ @sp-language-context=${createLangResolver}
81
734
  ></sp-slider-handle>
82
735
  </sp-slider>
83
- `),await l(r),d=r.focusElement,a(d.getAttribute("aria-valuetext"),"Second German number").to.equal("2,44"),e="en",n(),await l(r),a(d.getAttribute("aria-valuetext"),"Second English number").to.equal("2.44")}),it("uses fallback ariaValueText",async()=>{const e=await s(o`
736
+ `
737
+ );
738
+ await elementUpdated(el);
739
+ input = el.focusElement;
740
+ expect(
741
+ input.getAttribute("aria-valuetext"),
742
+ "Second German number"
743
+ ).to.equal("2,44");
744
+ lang = "en";
745
+ resolveLanguage();
746
+ await elementUpdated(el);
747
+ expect(
748
+ input.getAttribute("aria-valuetext"),
749
+ "Second English number"
750
+ ).to.equal("2.44");
751
+ });
752
+ it("uses fallback ariaValueText", async () => {
753
+ const el = await fixture(
754
+ html`
84
755
  <sp-slider value="50" min="0" max="100"></sp-slider>
85
- `);await l(e),e.getAriaValueText=!1;const t=e.focusElement;await l(e),a(t.getAttribute("aria-valuetext")).to.equal("50")}),it("accepts min/max/value in the same timing",async()=>{const e=await s(o`
756
+ `
757
+ );
758
+ await elementUpdated(el);
759
+ el.getAriaValueText = false;
760
+ const input = el.focusElement;
761
+ await elementUpdated(el);
762
+ expect(input.getAttribute("aria-valuetext")).to.equal("50");
763
+ });
764
+ it("accepts min/max/value in the same timing", async () => {
765
+ const el = await fixture(
766
+ html`
86
767
  <sp-slider></sp-slider>
87
- `);await l(e),a(e.value).to.equal(10),e.min=0,e.max=200,e.value=200,await l(e),a(e.value).to.equal(200),e.value=500,e.min=0,e.max=500,await l(e),a(e.value).to.equal(500),e.value=-100,e.min=-100,e.max=500,await l(e),a(e.value).to.equal(-100)}),it("returns values for handles",async()=>{let e=await s(o`
768
+ `
769
+ );
770
+ await elementUpdated(el);
771
+ expect(el.value).to.equal(10);
772
+ el.min = 0;
773
+ el.max = 200;
774
+ el.value = 200;
775
+ await elementUpdated(el);
776
+ expect(el.value).to.equal(200);
777
+ el.value = 500;
778
+ el.min = 0;
779
+ el.max = 500;
780
+ await elementUpdated(el);
781
+ expect(el.value).to.equal(500);
782
+ el.value = -100;
783
+ el.min = -100;
784
+ el.max = 500;
785
+ await elementUpdated(el);
786
+ expect(el.value).to.equal(-100);
787
+ });
788
+ it("returns values for handles", async () => {
789
+ let el = await fixture(
790
+ html`
88
791
  <sp-slider>
89
792
  <sp-slider-handle
90
793
  slot="handle"
@@ -105,16 +808,35 @@ import"@spectrum-web-components/slider/sp-slider.js";import"@spectrum-web-compon
105
808
  max="100"
106
809
  ></sp-slider-handle>
107
810
  </sp-slider>
108
- `);await l(e),a(e.values).to.deep.equal({a:10,b:20,c:30});const t=e.querySelector("#middle-handle");t.value=22,await l(e),a(e.values).to.deep.equal({a:10,b:22,c:30}),e=await s(o`
811
+ `
812
+ );
813
+ await elementUpdated(el);
814
+ expect(el.values).to.deep.equal({ a: 10, b: 20, c: 30 });
815
+ const middleHandle = el.querySelector("#middle-handle");
816
+ middleHandle.value = 22;
817
+ await elementUpdated(el);
818
+ expect(el.values).to.deep.equal({ a: 10, b: 22, c: 30 });
819
+ el = await fixture(
820
+ html`
109
821
  <sp-slider value="10" min="0" max="100"></sp-slider>
110
- `),a(e.values).to.deep.equal({value:10}),e=await s(o`
822
+ `
823
+ );
824
+ expect(el.values).to.deep.equal({ value: 10 });
825
+ el = await fixture(
826
+ html`
111
827
  <sp-slider min="0" max="100">
112
828
  <sp-slider-handle
113
829
  slot="handle"
114
830
  value="10"
115
831
  ></sp-slider-handle>
116
832
  </sp-slider>
117
- `),a(e.values).to.deep.equal({handle1:10})}),it("clamps values for multi-handle slider",async()=>{const e=await s(o`
833
+ `
834
+ );
835
+ expect(el.values).to.deep.equal({ handle1: 10 });
836
+ });
837
+ it("clamps values for multi-handle slider", async () => {
838
+ const el = await fixture(
839
+ html`
118
840
  <sp-slider min="0" max="100">
119
841
  <sp-slider-handle
120
842
  id="first-handle"
@@ -139,7 +861,33 @@ import"@spectrum-web-components/slider/sp-slider.js";import"@spectrum-web-compon
139
861
  value="30"
140
862
  ></sp-slider-handle>
141
863
  </sp-slider>
142
- `);await l(e),a(e.values).to.deep.equal({a:10,b:20,c:30});const t=e.querySelector("#first-handle"),i=e.querySelector("#middle-handle"),n=e.querySelector("#last-handle");t.value=25,await l(e),a(e.values).to.deep.equal({a:20,b:20,c:30}),t.value=10,await l(e),i.value=5,await l(e),a(e.values).to.deep.equal({a:10,b:10,c:30}),n.value=11,await l(e),a(e.values).to.deep.equal({a:10,b:10,c:11}),n.value=7,await l(e),a(e.values).to.deep.equal({a:10,b:10,c:10})}),it('warns in Dev Mode when `min="previous"` is leveraged on first handle',async()=>{const e=v(console,"warn");window.__swc.issuedWarnings=new Set;const t=await s(o`
864
+ `
865
+ );
866
+ await elementUpdated(el);
867
+ expect(el.values).to.deep.equal({ a: 10, b: 20, c: 30 });
868
+ const firstHandle = el.querySelector("#first-handle");
869
+ const middleHandle = el.querySelector("#middle-handle");
870
+ const lastHandle = el.querySelector("#last-handle");
871
+ firstHandle.value = 25;
872
+ await elementUpdated(el);
873
+ expect(el.values).to.deep.equal({ a: 20, b: 20, c: 30 });
874
+ firstHandle.value = 10;
875
+ await elementUpdated(el);
876
+ middleHandle.value = 5;
877
+ await elementUpdated(el);
878
+ expect(el.values).to.deep.equal({ a: 10, b: 10, c: 30 });
879
+ lastHandle.value = 11;
880
+ await elementUpdated(el);
881
+ expect(el.values).to.deep.equal({ a: 10, b: 10, c: 11 });
882
+ lastHandle.value = 7;
883
+ await elementUpdated(el);
884
+ expect(el.values).to.deep.equal({ a: 10, b: 10, c: 10 });
885
+ });
886
+ it('warns in Dev Mode when `min="previous"` is leveraged on first handle', async () => {
887
+ const consoleWarnStub = stub(console, "warn");
888
+ window.__swc.issuedWarnings = /* @__PURE__ */ new Set();
889
+ const el = await fixture(
890
+ html`
143
891
  <sp-slider min="0" max="100">
144
892
  <sp-slider-handle
145
893
  id="first-handle"
@@ -165,7 +913,29 @@ import"@spectrum-web-components/slider/sp-slider.js";import"@spectrum-web-compon
165
913
  value="30"
166
914
  ></sp-slider-handle>
167
915
  </sp-slider>
168
- `);await l(t),a(e.called).to.be.true;const i=e.getCall(0);a(i.args.at(0).includes("previous"),'confirm "previous" in message').to.be.true,a(i.args.at(-1),"confirm `data` shape").to.deep.equal({data:{localName:"sp-slider",type:"api",level:"default"}}),e.restore()}),it('warns in Dev Mode when `max="next"` is leveraged on last handle',async()=>{const e=v(console,"warn");window.__swc.issuedWarnings=new Set;const t=await s(o`
916
+ `
917
+ );
918
+ await elementUpdated(el);
919
+ expect(consoleWarnStub.called).to.be.true;
920
+ const spyCall = consoleWarnStub.getCall(0);
921
+ expect(
922
+ spyCall.args.at(0).includes("previous"),
923
+ 'confirm "previous" in message'
924
+ ).to.be.true;
925
+ expect(spyCall.args.at(-1), "confirm `data` shape").to.deep.equal({
926
+ data: {
927
+ localName: "sp-slider",
928
+ type: "api",
929
+ level: "default"
930
+ }
931
+ });
932
+ consoleWarnStub.restore();
933
+ });
934
+ it('warns in Dev Mode when `max="next"` is leveraged on last handle', async () => {
935
+ const consoleWarnStub = stub(console, "warn");
936
+ window.__swc.issuedWarnings = /* @__PURE__ */ new Set();
937
+ const el = await fixture(
938
+ html`
169
939
  <sp-slider min="0" max="100">
170
940
  <sp-slider-handle
171
941
  id="first-handle"
@@ -191,14 +961,47 @@ import"@spectrum-web-components/slider/sp-slider.js";import"@spectrum-web-compon
191
961
  value="30"
192
962
  ></sp-slider-handle>
193
963
  </sp-slider>
194
- `);await l(t),a(e.called).to.be.true;const i=e.getCall(0);a(i.args.at(0).includes("next"),'confirm "next" in message').to.be.true,a(i.args.at(-1),"confirm `data` shape").to.deep.equal({data:{localName:"sp-slider",type:"api",level:"default"}}),e.restore()}),it("builds both handles from a <template>",async()=>{var n;const e=document.createElement("template");e.innerHTML=`
964
+ `
965
+ );
966
+ await elementUpdated(el);
967
+ expect(consoleWarnStub.called).to.be.true;
968
+ const spyCall = consoleWarnStub.getCall(0);
969
+ expect(spyCall.args.at(0).includes("next"), 'confirm "next" in message').to.be.true;
970
+ expect(spyCall.args.at(-1), "confirm `data` shape").to.deep.equal({
971
+ data: {
972
+ localName: "sp-slider",
973
+ type: "api",
974
+ level: "default"
975
+ }
976
+ });
977
+ consoleWarnStub.restore();
978
+ });
979
+ it("builds both handles from a <template>", async () => {
980
+ var _a;
981
+ const template = document.createElement("template");
982
+ template.innerHTML = `
195
983
  <sp-slider variant="range" step="1" id="price" name="price" label="Max Price" min="35425" max="86610">
196
984
  <sp-slider-handle slot="handle" name="min" label="Minimum" max="next" value="35425"></sp-slider-handle>
197
985
  <sp-slider-handle slot="handle" name="max" label="Maximum" min="previous" value="86610"></sp-slider-handle>
198
986
  </sp-slider>
199
- `;const t=await s(o`
987
+ `;
988
+ const el = await fixture(
989
+ html`
200
990
  <div></div>
201
- `);t.appendChild(e.content.cloneNode(!0)),await g(()=>{var r;return((r=t.querySelector("sp-slider"))==null?void 0:r.shadowRoot)!=null}),await p();const i=((n=t.querySelector("sp-slider"))==null?void 0:n.shadowRoot.querySelectorAll(".handle"))||[];a(i).to.have.lengthOf(2)}),it("enforces next/previous max/min",async()=>{let e=await s(o`
991
+ `
992
+ );
993
+ el.appendChild(template.content.cloneNode(true));
994
+ await waitUntil(() => {
995
+ var _a2;
996
+ return ((_a2 = el.querySelector("sp-slider")) == null ? void 0 : _a2.shadowRoot) != null;
997
+ });
998
+ await nextFrame();
999
+ const createdHandles = ((_a = el.querySelector("sp-slider")) == null ? void 0 : _a.shadowRoot.querySelectorAll(".handle")) || [];
1000
+ expect(createdHandles).to.have.lengthOf(2);
1001
+ });
1002
+ it("enforces next/previous max/min", async () => {
1003
+ let el = await fixture(
1004
+ html`
202
1005
  <sp-slider min="0" max="100">
203
1006
  <sp-slider-handle
204
1007
  id="first-handle"
@@ -223,7 +1026,39 @@ import"@spectrum-web-components/slider/sp-slider.js";import"@spectrum-web-compon
223
1026
  value="30"
224
1027
  ></sp-slider-handle>
225
1028
  </sp-slider>
226
- `);await l(e),a(e.values).to.deep.equal({a:10,b:20,c:30});let t=e.querySelector("#first-handle"),i=e.querySelector("#last-handle"),n=e.shadowRoot.querySelector('.handle[name="a"] > input'),r=e.shadowRoot.querySelector('.handle[name="b"] > input'),d=e.shadowRoot.querySelector('.handle[name="c"] > input');a(n.min).to.equal("0"),a(n.max).to.equal("20"),a(r.min).to.equal("10"),a(r.max).to.equal("30"),a(d.min).to.equal("20"),a(d.max).to.equal("100"),t.value=15,i.value=85,await l(e),await l(e),a(n.min).to.equal("0"),a(n.max).to.equal("20"),a(r.min).to.equal("15"),a(r.max).to.equal("85"),a(d.min).to.equal("20"),a(d.max).to.equal("100"),e=await s(o`
1029
+ `
1030
+ );
1031
+ await elementUpdated(el);
1032
+ expect(el.values).to.deep.equal({ a: 10, b: 20, c: 30 });
1033
+ let firstHandle = el.querySelector("#first-handle");
1034
+ let lastHandle = el.querySelector("#last-handle");
1035
+ let firstInput = el.shadowRoot.querySelector(
1036
+ '.handle[name="a"] > input'
1037
+ );
1038
+ let middleInput = el.shadowRoot.querySelector(
1039
+ '.handle[name="b"] > input'
1040
+ );
1041
+ let lastInput = el.shadowRoot.querySelector(
1042
+ '.handle[name="c"] > input'
1043
+ );
1044
+ expect(firstInput.min).to.equal("0");
1045
+ expect(firstInput.max).to.equal("20");
1046
+ expect(middleInput.min).to.equal("10");
1047
+ expect(middleInput.max).to.equal("30");
1048
+ expect(lastInput.min).to.equal("20");
1049
+ expect(lastInput.max).to.equal("100");
1050
+ firstHandle.value = 15;
1051
+ lastHandle.value = 85;
1052
+ await elementUpdated(el);
1053
+ await elementUpdated(el);
1054
+ expect(firstInput.min).to.equal("0");
1055
+ expect(firstInput.max).to.equal("20");
1056
+ expect(middleInput.min).to.equal("15");
1057
+ expect(middleInput.max).to.equal("85");
1058
+ expect(lastInput.min).to.equal("20");
1059
+ expect(lastInput.max).to.equal("100");
1060
+ el = await fixture(
1061
+ html`
227
1062
  <sp-slider>
228
1063
  <sp-slider-handle
229
1064
  id="first-handle"
@@ -250,7 +1085,37 @@ import"@spectrum-web-components/slider/sp-slider.js";import"@spectrum-web-compon
250
1085
  value="30"
251
1086
  ></sp-slider-handle>
252
1087
  </sp-slider>
253
- `),n=e.shadowRoot.querySelector('.handle[name="a"] > input'),r=e.shadowRoot.querySelector('.handle[name="b"] > input'),d=e.shadowRoot.querySelector('.handle[name="c"] > input'),a(n.min).to.equal("0"),a(n.max).to.equal("20"),a(r.min).to.equal("10"),a(r.max).to.equal("30"),a(d.min).to.equal("20"),a(d.max).to.equal("100"),t=e.querySelector("#first-handle"),i=e.querySelector("#last-handle"),t.min=5,i.max=95,await l(e),await l(e),a(n.min).to.equal("5"),a(n.max).to.equal("20"),a(d.min).to.equal("20"),a(d.max).to.equal("95")}),it("sends keyboard events to active handle",async()=>{const e=await s(o`
1088
+ `
1089
+ );
1090
+ firstInput = el.shadowRoot.querySelector(
1091
+ '.handle[name="a"] > input'
1092
+ );
1093
+ middleInput = el.shadowRoot.querySelector(
1094
+ '.handle[name="b"] > input'
1095
+ );
1096
+ lastInput = el.shadowRoot.querySelector(
1097
+ '.handle[name="c"] > input'
1098
+ );
1099
+ expect(firstInput.min).to.equal("0");
1100
+ expect(firstInput.max).to.equal("20");
1101
+ expect(middleInput.min).to.equal("10");
1102
+ expect(middleInput.max).to.equal("30");
1103
+ expect(lastInput.min).to.equal("20");
1104
+ expect(lastInput.max).to.equal("100");
1105
+ firstHandle = el.querySelector("#first-handle");
1106
+ lastHandle = el.querySelector("#last-handle");
1107
+ firstHandle.min = 5;
1108
+ lastHandle.max = 95;
1109
+ await elementUpdated(el);
1110
+ await elementUpdated(el);
1111
+ expect(firstInput.min).to.equal("5");
1112
+ expect(firstInput.max).to.equal("20");
1113
+ expect(lastInput.min).to.equal("20");
1114
+ expect(lastInput.max).to.equal("95");
1115
+ });
1116
+ it("sends keyboard events to active handle", async () => {
1117
+ const el = await fixture(
1118
+ html`
254
1119
  <sp-slider step="1" min="0" max="100">
255
1120
  <sp-slider-handle
256
1121
  id="first-handle"
@@ -275,5 +1140,17 @@ import"@spectrum-web-components/slider/sp-slider.js";import"@spectrum-web-compon
275
1140
  value="30"
276
1141
  ></sp-slider-handle>
277
1142
  </sp-slider>
278
- `);await l(e),a(e.values).to.deep.equal({a:10,b:20,c:30}),e.querySelector("#last-handle").focus(),await h({press:"ArrowDown"}),await l(e),a(e.values).to.deep.equal({a:10,b:20,c:29})})});
1143
+ `
1144
+ );
1145
+ await elementUpdated(el);
1146
+ expect(el.values).to.deep.equal({ a: 10, b: 20, c: 30 });
1147
+ const lastHandle = el.querySelector("#last-handle");
1148
+ lastHandle.focus();
1149
+ await sendKeys({
1150
+ press: "ArrowDown"
1151
+ });
1152
+ await elementUpdated(el);
1153
+ expect(el.values).to.deep.equal({ a: 10, b: 20, c: 29 });
1154
+ });
1155
+ });
279
1156
  //# sourceMappingURL=slider.test.js.map