@spectrum-web-components/slider 0.13.0-slim.10 → 0.13.1-devmode2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +16 -0
  2. package/custom-elements.json +103 -121
  3. package/package.json +44 -17
  4. package/sp-slider-handle.dev.js +3 -0
  5. package/sp-slider-handle.dev.js.map +7 -0
  6. package/sp-slider-handle.js +3 -14
  7. package/sp-slider-handle.js.map +7 -1
  8. package/sp-slider.dev.js +4 -0
  9. package/sp-slider.dev.js.map +7 -0
  10. package/sp-slider.js +4 -15
  11. package/sp-slider.js.map +7 -1
  12. package/src/HandleController.d.ts +1 -1
  13. package/src/HandleController.dev.js +434 -0
  14. package/src/HandleController.dev.js.map +7 -0
  15. package/src/HandleController.js +401 -437
  16. package/src/HandleController.js.map +7 -1
  17. package/src/Slider.d.ts +11 -1
  18. package/src/Slider.dev.js +367 -0
  19. package/src/Slider.dev.js.map +7 -0
  20. package/src/Slider.js +283 -286
  21. package/src/Slider.js.map +7 -1
  22. package/src/SliderHandle.d.ts +1 -2
  23. package/src/SliderHandle.dev.js +184 -0
  24. package/src/SliderHandle.dev.js.map +7 -0
  25. package/src/SliderHandle.js +171 -179
  26. package/src/SliderHandle.js.map +7 -1
  27. package/src/index.dev.js +4 -0
  28. package/src/index.dev.js.map +7 -0
  29. package/src/index.js +4 -15
  30. package/src/index.js.map +7 -1
  31. package/src/slider.css.dev.js +234 -0
  32. package/src/slider.css.dev.js.map +7 -0
  33. package/src/slider.css.js +59 -28
  34. package/src/slider.css.js.map +7 -1
  35. package/src/spectrum-slider.css.dev.js +216 -0
  36. package/src/spectrum-slider.css.dev.js.map +7 -0
  37. package/src/spectrum-slider.css.js +54 -27
  38. package/src/spectrum-slider.css.js.map +7 -1
  39. package/stories/slider.stories.js +270 -264
  40. package/stories/slider.stories.js.map +7 -1
  41. package/sync/sp-slider.dev.js +3 -0
  42. package/sync/sp-slider.dev.js.map +7 -0
  43. package/sync/sp-slider.js +3 -14
  44. package/sync/sp-slider.js.map +7 -1
  45. package/test/benchmark/test-basic.js +5 -16
  46. package/test/benchmark/test-basic.js.map +7 -1
  47. package/test/slider-editable-sync.test.js +134 -144
  48. package/test/slider-editable-sync.test.js.map +7 -1
  49. package/test/slider-editable.test.js +153 -144
  50. package/test/slider-editable.test.js.map +7 -1
  51. package/test/slider-handle-upgrade.test.js +10 -21
  52. package/test/slider-handle-upgrade.test.js.map +7 -1
  53. package/test/slider.test-vrt.js +4 -15
  54. package/test/slider.test-vrt.js.map +7 -1
  55. package/test/slider.test.js +780 -614
  56. package/test/slider.test.js.map +7 -1
@@ -1,30 +1,32 @@
1
- /*
2
- Copyright 2020 Adobe. All rights reserved.
3
- This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License. You may obtain a copy
5
- of the License at http://www.apache.org/licenses/LICENSE-2.0
6
-
7
- Unless required by applicable law or agreed to in writing, software distributed under
8
- the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
- OF ANY KIND, either express or implied. See the License for the specific language
10
- governing permissions and limitations under the License.
11
- */
12
- import '../sp-slider.js';
13
- import '../sp-slider-handle.js';
14
- import { tick } from '../stories/slider.stories.js';
15
- import { elementUpdated, expect, fixture, html, nextFrame, oneEvent, waitUntil, } from '@open-wc/testing';
16
- import { sendKeys } from '@web/test-runner-commands';
17
- import { sendMouse } from '../../../test/plugins/browser.js';
18
- describe('Slider', () => {
19
- it('loads', async () => {
20
- const el = await fixture(html `
1
+ import "@spectrum-web-components/slider/sp-slider.js";
2
+ import "@spectrum-web-components/slider/sp-slider-handle.js";
3
+ import { tick } from "../stories/slider.stories.js";
4
+ import {
5
+ elementUpdated,
6
+ expect,
7
+ fixture,
8
+ html,
9
+ nextFrame,
10
+ oneEvent,
11
+ waitUntil
12
+ } from "@open-wc/testing";
13
+ import { sendKeys } from "@web/test-runner-commands";
14
+ import { sendMouse } from "../../../test/plugins/browser.js";
15
+ import { stub } from "sinon";
16
+ import { testForLitDevWarnings } from "../../../test/testing-helpers.js";
17
+ describe("Slider", () => {
18
+ testForLitDevWarnings(async () => await fixture(html`
19
+ <sp-slider label="Slider"></sp-slider>
20
+ `));
21
+ it("loads", async () => {
22
+ const el = await fixture(html`
21
23
  <sp-slider label="Slider"></sp-slider>
22
24
  `);
23
- await elementUpdated(el);
24
- await expect(el).to.be.accessible();
25
- });
26
- it('loads - [variant="tick"]', async () => {
27
- const el = await fixture(html `
25
+ await elementUpdated(el);
26
+ await expect(el).to.be.accessible();
27
+ });
28
+ it('loads - [variant="tick"]', async () => {
29
+ const el = await fixture(html`
28
30
  <sp-slider
29
31
  label="Ticked Slider"
30
32
  min="-100"
@@ -34,447 +36,528 @@ describe('Slider', () => {
34
36
  variant="tick"
35
37
  ></sp-slider>
36
38
  `);
37
- await elementUpdated(el);
38
- await expect(el).to.be.accessible();
39
- });
40
- it('loads - [variant="tick"] irregularly', async () => {
41
- const el = await fixture(html `
39
+ await elementUpdated(el);
40
+ await expect(el).to.be.accessible();
41
+ });
42
+ it('loads - [variant="tick"] irregularly', async () => {
43
+ const el = await fixture(html`
42
44
  <sp-slider label="Slider"></sp-slider>
43
45
  `);
44
- await elementUpdated(el);
45
- await expect(el).to.be.accessible();
46
- });
47
- it('receives value from the outside', async () => {
48
- const el = await fixture(html `
46
+ await elementUpdated(el);
47
+ await expect(el).to.be.accessible();
48
+ });
49
+ it("receives value from the outside", async () => {
50
+ const el = await fixture(html`
49
51
  <sp-slider max="20"></sp-slider>
50
52
  `);
51
- await elementUpdated(el);
52
- expect(el.value).to.equal(10);
53
- el.value = 10;
54
- await elementUpdated(el);
55
- expect(el.value).to.equal(10);
56
- el.value = 50;
57
- await elementUpdated(el);
58
- expect(el.value).to.equal(20);
53
+ await elementUpdated(el);
54
+ expect(el.value).to.equal(10);
55
+ el.value = 10;
56
+ await elementUpdated(el);
57
+ expect(el.value).to.equal(10);
58
+ el.value = 50;
59
+ await elementUpdated(el);
60
+ expect(el.value).to.equal(20);
61
+ });
62
+ it("accepts keyboard events", async () => {
63
+ const el = await fixture(tick({
64
+ variant: "tick",
65
+ tickStep: 5
66
+ }));
67
+ await elementUpdated(el);
68
+ expect(el.value).to.equal(10);
69
+ expect(el.highlight).to.be.false;
70
+ el.focus();
71
+ await sendKeys({
72
+ press: "ArrowDown"
59
73
  });
60
- it('accepts keyboard events', async () => {
61
- const el = await fixture(tick({
62
- variant: 'tick',
63
- tickStep: 5,
64
- }));
65
- await elementUpdated(el);
66
- expect(el.value).to.equal(10);
67
- expect(el.highlight).to.be.false;
68
- el.focus();
69
- await sendKeys({
70
- press: 'ArrowDown',
71
- });
72
- await elementUpdated(el);
73
- expect(el.value).to.equal(9);
74
- expect(el.highlight).to.be.true;
75
- await sendKeys({
76
- press: 'ArrowUp',
77
- });
78
- await elementUpdated(el);
79
- expect(el.value).to.equal(10);
80
- expect(el.highlight).to.be.true;
74
+ await elementUpdated(el);
75
+ expect(el.value).to.equal(9);
76
+ expect(el.highlight).to.be.true;
77
+ await sendKeys({
78
+ press: "ArrowUp"
81
79
  });
82
- it('accepts pointer events', async () => {
83
- let pointerId = -1;
84
- const el = await fixture(html `
80
+ await elementUpdated(el);
81
+ expect(el.value).to.equal(10);
82
+ expect(el.highlight).to.be.true;
83
+ });
84
+ it("accepts pointer events", async () => {
85
+ let pointerId = -1;
86
+ const el = await fixture(html`
85
87
  <sp-slider></sp-slider>
86
88
  `);
87
- await elementUpdated(el);
88
- expect(el.dragging).to.be.false;
89
- expect(el.highlight).to.be.false;
90
- expect(pointerId).to.equal(-1);
91
- const handle = el.shadowRoot.querySelector('.handle');
92
- el.track.setPointerCapture = (id) => (pointerId = id);
93
- el.track.releasePointerCapture = (id) => (pointerId = id);
94
- handle.dispatchEvent(new PointerEvent('pointerdown', {
95
- button: 1,
96
- pointerId: 1,
97
- cancelable: true,
98
- bubbles: true,
99
- composed: true,
100
- }));
101
- await elementUpdated(el);
102
- expect(el.dragging).to.be.false;
103
- expect(pointerId, '1').to.equal(-1);
104
- handle.dispatchEvent(new PointerEvent('pointerdown', {
105
- button: 0,
106
- pointerId: 1,
107
- cancelable: true,
108
- bubbles: true,
109
- composed: true,
110
- }));
111
- await elementUpdated(el);
112
- expect(el.dragging, 'it is dragging 1').to.be.true;
113
- expect(pointerId, '2').to.equal(1);
114
- handle.dispatchEvent(new PointerEvent('pointerup', {
115
- pointerId: 2,
116
- cancelable: true,
117
- bubbles: true,
118
- composed: true,
119
- }));
120
- await elementUpdated(el);
121
- expect(el.dragging).to.be.false;
122
- expect(el.highlight).to.be.false;
123
- expect(pointerId, '3').to.equal(2);
124
- handle.dispatchEvent(new PointerEvent('pointerdown', {
125
- button: 0,
126
- pointerId: 1,
127
- cancelable: true,
128
- bubbles: true,
129
- composed: true,
130
- }));
131
- await elementUpdated(el);
132
- expect(el.dragging, 'it is dragging 2').to.be.true;
133
- expect(pointerId, '4').to.equal(1);
134
- handle.dispatchEvent(new PointerEvent('pointercancel', {
135
- pointerId: 3,
136
- cancelable: true,
137
- bubbles: true,
138
- composed: true,
139
- }));
140
- await elementUpdated(el);
141
- expect(el.dragging).to.be.false;
142
- expect(pointerId, '5').to.equal(3);
143
- });
144
- it('will `trackPointerDown` on `#controls`', async () => {
145
- let pointerId = -1;
146
- const el = await fixture(html `
89
+ await elementUpdated(el);
90
+ expect(el.dragging).to.be.false;
91
+ expect(el.highlight).to.be.false;
92
+ expect(pointerId).to.equal(-1);
93
+ const handle = el.shadowRoot.querySelector(".handle");
94
+ el.track.setPointerCapture = (id) => pointerId = id;
95
+ el.track.releasePointerCapture = (id) => pointerId = id;
96
+ handle.dispatchEvent(new PointerEvent("pointerdown", {
97
+ button: 1,
98
+ pointerId: 1,
99
+ cancelable: true,
100
+ bubbles: true,
101
+ composed: true
102
+ }));
103
+ await elementUpdated(el);
104
+ expect(el.dragging).to.be.false;
105
+ expect(pointerId, "1").to.equal(-1);
106
+ handle.dispatchEvent(new PointerEvent("pointerdown", {
107
+ button: 0,
108
+ pointerId: 1,
109
+ cancelable: true,
110
+ bubbles: true,
111
+ composed: true
112
+ }));
113
+ await elementUpdated(el);
114
+ expect(el.dragging, "it is dragging 1").to.be.true;
115
+ expect(pointerId, "2").to.equal(1);
116
+ handle.dispatchEvent(new PointerEvent("pointerup", {
117
+ pointerId: 2,
118
+ cancelable: true,
119
+ bubbles: true,
120
+ composed: true
121
+ }));
122
+ await elementUpdated(el);
123
+ expect(el.dragging).to.be.false;
124
+ expect(el.highlight).to.be.false;
125
+ expect(pointerId, "3").to.equal(2);
126
+ handle.dispatchEvent(new PointerEvent("pointerdown", {
127
+ button: 0,
128
+ pointerId: 1,
129
+ cancelable: true,
130
+ bubbles: true,
131
+ composed: true
132
+ }));
133
+ await elementUpdated(el);
134
+ expect(el.dragging, "it is dragging 2").to.be.true;
135
+ expect(pointerId, "4").to.equal(1);
136
+ handle.dispatchEvent(new PointerEvent("pointercancel", {
137
+ pointerId: 3,
138
+ cancelable: true,
139
+ bubbles: true,
140
+ composed: true
141
+ }));
142
+ await elementUpdated(el);
143
+ expect(el.dragging).to.be.false;
144
+ expect(pointerId, "5").to.equal(3);
145
+ });
146
+ it("will `trackPointerDown` on `#controls`", async () => {
147
+ let pointerId = -1;
148
+ const el = await fixture(html`
147
149
  <sp-slider style="width: 500px" max="70"></sp-slider>
148
150
  `);
149
- await elementUpdated(el);
150
- expect(el.value).to.equal(10);
151
- const controls = el.shadowRoot.querySelector('#controls');
152
- const handle = el.shadowRoot.querySelector('.handle');
153
- el.track.setPointerCapture = (id) => (pointerId = id);
154
- el.track.releasePointerCapture = (id) => (pointerId = id);
155
- controls.dispatchEvent(new PointerEvent('pointerdown', {
156
- button: 1,
157
- // account for 8px <body> margin by default
158
- clientX: 9,
159
- pointerId: 4,
160
- bubbles: true,
161
- cancelable: true,
162
- }));
163
- await elementUpdated(el);
164
- expect(pointerId).to.equal(-1);
165
- expect(el.value).to.equal(10);
166
- expect(el.dragging, 'handle is not yet being dragged').to.be.false;
167
- controls.dispatchEvent(new PointerEvent('pointerdown', {
168
- button: 0,
169
- // account for 8px <body> margin by default
170
- clientX: 9,
171
- pointerId: 4,
172
- bubbles: true,
173
- cancelable: true,
174
- }));
175
- await elementUpdated(el);
176
- expect(pointerId).to.equal(4);
177
- expect(el.value).to.equal(0);
178
- expect(el.dragging, 'handle is being dragged').to.be.true;
179
- handle.dispatchEvent(new PointerEvent('pointermove', {
180
- button: 0,
181
- // account for 8px <body> margin by default
182
- clientX: 508,
183
- pointerId: 4,
184
- bubbles: true,
185
- cancelable: true,
186
- }));
187
- await elementUpdated(el);
188
- expect(el.dragging, 'handle is still being dragged').to.be.true;
189
- expect(pointerId).to.equal(4);
190
- expect(el.value).to.equal(70);
191
- handle.dispatchEvent(new PointerEvent('pointerup', {
192
- button: 0,
193
- // account for 8px <body> margin by default
194
- clientX: 9,
195
- pointerId: 4,
196
- bubbles: true,
197
- cancelable: true,
198
- }));
199
- await elementUpdated(el);
200
- expect(pointerId).to.equal(4);
201
- expect(el.value).to.equal(70);
202
- expect(el.dragging, 'handle is no longer being dragged').to.be.false;
203
- });
204
- it('can be disabled', async () => {
205
- let pointerId = -1;
206
- const el = await fixture(html `
151
+ await elementUpdated(el);
152
+ expect(el.value).to.equal(10);
153
+ const controls = el.shadowRoot.querySelector("#controls");
154
+ const handle = el.shadowRoot.querySelector(".handle");
155
+ el.track.setPointerCapture = (id) => pointerId = id;
156
+ el.track.releasePointerCapture = (id) => pointerId = id;
157
+ controls.dispatchEvent(new PointerEvent("pointerdown", {
158
+ button: 1,
159
+ clientX: 9,
160
+ pointerId: 4,
161
+ bubbles: true,
162
+ cancelable: true
163
+ }));
164
+ await elementUpdated(el);
165
+ expect(pointerId).to.equal(-1);
166
+ expect(el.value).to.equal(10);
167
+ expect(el.dragging, "handle is not yet being dragged").to.be.false;
168
+ controls.dispatchEvent(new PointerEvent("pointerdown", {
169
+ button: 0,
170
+ clientX: 9,
171
+ pointerId: 4,
172
+ bubbles: true,
173
+ cancelable: true
174
+ }));
175
+ await elementUpdated(el);
176
+ expect(pointerId).to.equal(4);
177
+ expect(el.value).to.equal(0);
178
+ expect(el.dragging, "handle is being dragged").to.be.true;
179
+ handle.dispatchEvent(new PointerEvent("pointermove", {
180
+ button: 0,
181
+ clientX: 508,
182
+ pointerId: 4,
183
+ bubbles: true,
184
+ cancelable: true
185
+ }));
186
+ await elementUpdated(el);
187
+ expect(el.dragging, "handle is still being dragged").to.be.true;
188
+ expect(pointerId).to.equal(4);
189
+ expect(el.value).to.equal(70);
190
+ handle.dispatchEvent(new PointerEvent("pointerup", {
191
+ button: 0,
192
+ clientX: 9,
193
+ pointerId: 4,
194
+ bubbles: true,
195
+ cancelable: true
196
+ }));
197
+ await elementUpdated(el);
198
+ expect(pointerId).to.equal(4);
199
+ expect(el.value).to.equal(70);
200
+ expect(el.dragging, "handle is no longer being dragged").to.be.false;
201
+ });
202
+ it("can be disabled", async () => {
203
+ let pointerId = -1;
204
+ const el = await fixture(html`
207
205
  <sp-slider disabled></sp-slider>
208
206
  `);
209
- await elementUpdated(el);
210
- expect(el.dragging).to.be.false;
211
- expect(pointerId).to.equal(-1);
212
- expect(el.value).to.equal(10);
213
- const handle = el.shadowRoot.querySelector('.handle');
214
- handle.setPointerCapture = (id) => (pointerId = id);
215
- handle.dispatchEvent(new PointerEvent('pointerdown', {
216
- button: 0,
217
- pointerId: 1,
218
- cancelable: true,
219
- }));
220
- await elementUpdated(el);
221
- expect(el.dragging).to.be.false;
222
- expect(pointerId).to.equal(-1);
223
- const controls = el.shadowRoot.querySelector('#controls');
224
- controls.dispatchEvent(new PointerEvent('pointerdown', {
225
- button: 0,
226
- clientX: 50,
227
- pointerId: 1,
228
- cancelable: true,
229
- }));
230
- await elementUpdated(el);
231
- expect(pointerId).to.equal(-1);
232
- expect(el.value).to.equal(10);
207
+ await elementUpdated(el);
208
+ expect(el.dragging).to.be.false;
209
+ expect(pointerId).to.equal(-1);
210
+ expect(el.value).to.equal(10);
211
+ const handle = el.shadowRoot.querySelector(".handle");
212
+ handle.setPointerCapture = (id) => pointerId = id;
213
+ handle.dispatchEvent(new PointerEvent("pointerdown", {
214
+ button: 0,
215
+ pointerId: 1,
216
+ cancelable: true
217
+ }));
218
+ await elementUpdated(el);
219
+ expect(el.dragging).to.be.false;
220
+ expect(pointerId).to.equal(-1);
221
+ const controls = el.shadowRoot.querySelector("#controls");
222
+ controls.dispatchEvent(new PointerEvent("pointerdown", {
223
+ button: 0,
224
+ clientX: 50,
225
+ pointerId: 1,
226
+ cancelable: true
227
+ }));
228
+ await elementUpdated(el);
229
+ expect(pointerId).to.equal(-1);
230
+ expect(el.value).to.equal(10);
231
+ });
232
+ it("accepts pointermove events", async () => {
233
+ const el = await fixture(html`
234
+ <sp-slider></sp-slider>
235
+ `);
236
+ await elementUpdated(el);
237
+ expect(el.value).to.equal(10);
238
+ const handle = el.shadowRoot.querySelector(".handle");
239
+ await sendMouse({
240
+ steps: [
241
+ {
242
+ type: "move",
243
+ position: [9, 30]
244
+ },
245
+ {
246
+ type: "down"
247
+ }
248
+ ]
233
249
  });
234
- it('accepts pointermove events', async () => {
235
- const el = await fixture(html `
250
+ await elementUpdated(el);
251
+ expect(el.dragging, "is dragging").to.be.true;
252
+ expect(el.highlight, "not highlighted").to.be.false;
253
+ handle.dispatchEvent(new PointerEvent("pointermove", {
254
+ clientX: 0,
255
+ cancelable: true,
256
+ bubbles: true,
257
+ composed: true
258
+ }));
259
+ await elementUpdated(el);
260
+ expect(el.value).to.equal(0);
261
+ });
262
+ it("manages RTL when min != 0", async () => {
263
+ const el = await fixture(html`
264
+ <sp-slider min="1" max="11" dir="rtl"></sp-slider>
265
+ `);
266
+ await elementUpdated(el);
267
+ expect(el.value).to.equal(10);
268
+ const handle = el.shadowRoot.querySelector(".handle");
269
+ await sendMouse({
270
+ steps: [
271
+ {
272
+ type: "move",
273
+ position: [9, 30]
274
+ },
275
+ {
276
+ type: "down"
277
+ }
278
+ ]
279
+ });
280
+ await elementUpdated(el);
281
+ expect(el.dragging, "is dragging").to.be.true;
282
+ expect(el.highlight, "not highlighted").to.be.false;
283
+ handle.dispatchEvent(new PointerEvent("pointermove", {
284
+ clientX: 0,
285
+ cancelable: true,
286
+ bubbles: true,
287
+ composed: true
288
+ }));
289
+ await elementUpdated(el);
290
+ expect(el.value).to.equal(11);
291
+ });
292
+ it("goes [disabled] while dragging", async () => {
293
+ const el = await fixture(html`
236
294
  <sp-slider></sp-slider>
237
295
  `);
238
- await elementUpdated(el);
239
- expect(el.value).to.equal(10);
240
- const handle = el.shadowRoot.querySelector('.handle');
241
- await sendMouse({
242
- steps: [
243
- {
244
- type: 'move',
245
- position: [9, 30],
246
- },
247
- {
248
- type: 'down',
249
- },
250
- ],
251
- });
252
- await elementUpdated(el);
253
- expect(el.dragging, 'is dragging').to.be.true;
254
- expect(el.highlight, 'not highlighted').to.be.false;
255
- handle.dispatchEvent(new PointerEvent('pointermove', {
256
- clientX: 0,
257
- cancelable: true,
258
- bubbles: true,
259
- composed: true,
260
- }));
261
- await elementUpdated(el);
262
- expect(el.value).to.equal(0);
296
+ await elementUpdated(el);
297
+ expect(el.value).to.equal(10);
298
+ const handle = el.shadowRoot.querySelector(".handle");
299
+ const handleBoundingRect = handle.getBoundingClientRect();
300
+ await sendMouse({
301
+ steps: [
302
+ {
303
+ type: "move",
304
+ position: [
305
+ handleBoundingRect.x + handleBoundingRect.width / 2,
306
+ handleBoundingRect.y + handleBoundingRect.height / 2
307
+ ]
308
+ },
309
+ {
310
+ type: "down"
311
+ }
312
+ ]
263
313
  });
264
- it('accepts pointermove events in separate interactions', async () => {
265
- let pointerId = -1;
266
- const el = await fixture(html `
314
+ await elementUpdated(el);
315
+ expect(el.dragging, "is dragging").to.be.true;
316
+ expect(el.highlight, "not highlighted").to.be.false;
317
+ expect(el.value).to.equal(10);
318
+ const inputEvent = oneEvent(el, "input");
319
+ await sendMouse({
320
+ steps: [
321
+ {
322
+ type: "move",
323
+ position: [
324
+ handleBoundingRect.x + handleBoundingRect.width / 2 + 100,
325
+ handleBoundingRect.y + handleBoundingRect.height / 2
326
+ ]
327
+ }
328
+ ]
329
+ });
330
+ await inputEvent;
331
+ expect(el.value).to.equal(13);
332
+ el.disabled = true;
333
+ await elementUpdated(el);
334
+ expect(el.dragging, "is dragging").to.be.false;
335
+ expect(el.highlight, "not highlighted").to.be.false;
336
+ await sendMouse({
337
+ steps: [
338
+ {
339
+ type: "move",
340
+ position: [
341
+ 0,
342
+ handleBoundingRect.top + handleBoundingRect.height / 2
343
+ ]
344
+ }
345
+ ]
346
+ });
347
+ expect(el.value).to.equal(13);
348
+ });
349
+ it("accepts pointermove events in separate interactions", async () => {
350
+ let pointerId = -1;
351
+ const el = await fixture(html`
267
352
  <sp-slider style="width: 100px"></sp-slider>
268
353
  `);
269
- await elementUpdated(el);
270
- expect(el.value, 'initial').to.equal(10);
271
- const handle = el.shadowRoot.querySelector('.handle');
272
- el.track.setPointerCapture = (id) => (pointerId = id);
273
- el.track.releasePointerCapture = (id) => (pointerId = id);
274
- handle.dispatchEvent(new PointerEvent('pointerdown', {
275
- clientX: 58,
276
- cancelable: true,
277
- button: 0,
278
- pointerId: 100,
279
- composed: true,
280
- bubbles: true,
281
- }));
282
- await elementUpdated(el);
283
- handle.dispatchEvent(new PointerEvent('pointermove', {
284
- clientX: 58,
285
- cancelable: true,
286
- composed: true,
287
- bubbles: true,
288
- }));
289
- await elementUpdated(el);
290
- expect(el.value, 'first pointerdown').to.equal(50);
291
- expect(el.dragging, 'is dragging').to.be.true;
292
- expect(el.classList.contains('handle-highlight'), 'not highlighted').to
293
- .be.false;
294
- expect(pointerId).to.equal(100);
295
- handle.dispatchEvent(new PointerEvent('pointermove', {
296
- clientX: 0,
297
- cancelable: true,
298
- composed: true,
299
- bubbles: true,
300
- }));
301
- await elementUpdated(el);
302
- expect(el.value, 'first pointermove').to.equal(0);
303
- handle.dispatchEvent(new PointerEvent('pointerup', {
304
- clientX: 0,
305
- cancelable: true,
306
- composed: true,
307
- bubbles: true,
308
- }));
309
- await elementUpdated(el);
310
- expect(el.value, 'first pointerup').to.equal(0);
311
- expect(el.dragging, 'is dragging').to.be.false;
312
- handle.dispatchEvent(new PointerEvent('pointerdown', {
313
- clientX: 58,
314
- cancelable: true,
315
- button: 0,
316
- composed: true,
317
- bubbles: true,
318
- }));
319
- await elementUpdated(el);
320
- handle.dispatchEvent(new PointerEvent('pointermove', {
321
- clientX: 58,
322
- cancelable: true,
323
- composed: true,
324
- bubbles: true,
325
- }));
326
- await elementUpdated(el);
327
- expect(el.value, 'second pointerdown').to.equal(50);
328
- expect(el.dragging, 'is dragging').to.be.true;
329
- expect(el.classList.contains('handle-highlight'), 'not highlighted').to
330
- .be.false;
331
- handle.dispatchEvent(new PointerEvent('pointermove', {
332
- clientX: 0,
333
- cancelable: true,
334
- composed: true,
335
- bubbles: true,
336
- }));
337
- await elementUpdated(el);
338
- expect(el.value, 'second pointermove').to.equal(0);
339
- handle.dispatchEvent(new PointerEvent('pointerup', {
340
- clientX: 0,
341
- cancelable: true,
342
- composed: true,
343
- bubbles: true,
344
- }));
345
- await elementUpdated(el);
346
- expect(el.value, 'second pointerup').to.equal(0);
347
- expect(el.dragging, 'is dragging').to.be.false;
348
- });
349
- it('accepts pointermove events - [step=0]', async () => {
350
- const el = await fixture(html `
354
+ await elementUpdated(el);
355
+ expect(el.value, "initial").to.equal(10);
356
+ const handle = el.shadowRoot.querySelector(".handle");
357
+ el.track.setPointerCapture = (id) => pointerId = id;
358
+ el.track.releasePointerCapture = (id) => pointerId = id;
359
+ handle.dispatchEvent(new PointerEvent("pointerdown", {
360
+ clientX: 58,
361
+ cancelable: true,
362
+ button: 0,
363
+ pointerId: 100,
364
+ composed: true,
365
+ bubbles: true
366
+ }));
367
+ await elementUpdated(el);
368
+ handle.dispatchEvent(new PointerEvent("pointermove", {
369
+ clientX: 58,
370
+ cancelable: true,
371
+ composed: true,
372
+ bubbles: true
373
+ }));
374
+ await elementUpdated(el);
375
+ expect(el.value, "first pointerdown").to.equal(50);
376
+ expect(el.dragging, "is dragging").to.be.true;
377
+ expect(el.classList.contains("handle-highlight"), "not highlighted").to.be.false;
378
+ expect(pointerId).to.equal(100);
379
+ handle.dispatchEvent(new PointerEvent("pointermove", {
380
+ clientX: 0,
381
+ cancelable: true,
382
+ composed: true,
383
+ bubbles: true
384
+ }));
385
+ await elementUpdated(el);
386
+ expect(el.value, "first pointermove").to.equal(0);
387
+ handle.dispatchEvent(new PointerEvent("pointerup", {
388
+ clientX: 0,
389
+ cancelable: true,
390
+ composed: true,
391
+ bubbles: true
392
+ }));
393
+ await elementUpdated(el);
394
+ expect(el.value, "first pointerup").to.equal(0);
395
+ expect(el.dragging, "is dragging").to.be.false;
396
+ handle.dispatchEvent(new PointerEvent("pointerdown", {
397
+ clientX: 58,
398
+ cancelable: true,
399
+ button: 0,
400
+ composed: true,
401
+ bubbles: true
402
+ }));
403
+ await elementUpdated(el);
404
+ handle.dispatchEvent(new PointerEvent("pointermove", {
405
+ clientX: 58,
406
+ cancelable: true,
407
+ composed: true,
408
+ bubbles: true
409
+ }));
410
+ await elementUpdated(el);
411
+ expect(el.value, "second pointerdown").to.equal(50);
412
+ expect(el.dragging, "is dragging").to.be.true;
413
+ expect(el.classList.contains("handle-highlight"), "not highlighted").to.be.false;
414
+ handle.dispatchEvent(new PointerEvent("pointermove", {
415
+ clientX: 0,
416
+ cancelable: true,
417
+ composed: true,
418
+ bubbles: true
419
+ }));
420
+ await elementUpdated(el);
421
+ expect(el.value, "second pointermove").to.equal(0);
422
+ handle.dispatchEvent(new PointerEvent("pointerup", {
423
+ clientX: 0,
424
+ cancelable: true,
425
+ composed: true,
426
+ bubbles: true
427
+ }));
428
+ await elementUpdated(el);
429
+ expect(el.value, "second pointerup").to.equal(0);
430
+ expect(el.dragging, "is dragging").to.be.false;
431
+ });
432
+ it("accepts pointermove events - [step=0]", async () => {
433
+ const el = await fixture(html`
351
434
  <sp-slider step="0" max="20" style="width: 500px; float: left;">
352
435
  Step = 0
353
436
  </sp-slider>
354
437
  `);
355
- await elementUpdated(el);
356
- await nextFrame();
357
- await nextFrame();
358
- expect(el.value).to.equal(10);
359
- const handle = el.shadowRoot.querySelector('.handle');
360
- const handleBoundingRect = handle.getBoundingClientRect();
361
- const position = [
362
- handleBoundingRect.x + handleBoundingRect.width / 2,
363
- handleBoundingRect.y + handleBoundingRect.height / 2,
364
- ];
365
- await sendMouse({
366
- steps: [
367
- {
368
- type: 'move',
369
- position,
370
- },
371
- {
372
- type: 'down',
373
- },
374
- ],
375
- });
376
- await nextFrame();
377
- expect(el.highlight, 'with no highlight').to.be.false;
378
- expect(el.dragging, 'dragging').to.be.true;
379
- let inputEvent = oneEvent(el, 'input');
380
- await sendMouse({
381
- steps: [
382
- {
383
- type: 'move',
384
- position: [
385
- 200,
386
- handleBoundingRect.y + handleBoundingRect.height + 100,
387
- ],
388
- },
389
- ],
390
- });
391
- await inputEvent;
392
- expect(el.value).to.equal(8);
393
- inputEvent = oneEvent(el, 'input');
394
- await sendMouse({
395
- steps: [
396
- {
397
- type: 'move',
398
- position: [125, position[1]],
399
- },
400
- ],
401
- });
402
- await inputEvent;
403
- expect(el.value).to.equal(5);
438
+ await elementUpdated(el);
439
+ await nextFrame();
440
+ await nextFrame();
441
+ expect(el.value).to.equal(10);
442
+ const handle = el.shadowRoot.querySelector(".handle");
443
+ const handleBoundingRect = handle.getBoundingClientRect();
444
+ const position = [
445
+ handleBoundingRect.x + handleBoundingRect.width / 2,
446
+ handleBoundingRect.y + handleBoundingRect.height / 2
447
+ ];
448
+ await sendMouse({
449
+ steps: [
450
+ {
451
+ type: "move",
452
+ position
453
+ },
454
+ {
455
+ type: "down"
456
+ }
457
+ ]
458
+ });
459
+ await nextFrame();
460
+ expect(el.highlight, "with no highlight").to.be.false;
461
+ expect(el.dragging, "dragging").to.be.true;
462
+ let inputEvent = oneEvent(el, "input");
463
+ await sendMouse({
464
+ steps: [
465
+ {
466
+ type: "move",
467
+ position: [
468
+ 200,
469
+ handleBoundingRect.y + handleBoundingRect.height + 100
470
+ ]
471
+ }
472
+ ]
404
473
  });
405
- it('will not pointermove unless `pointerdown`', async () => {
406
- const el = await fixture(html `
474
+ await inputEvent;
475
+ expect(el.value).to.equal(8);
476
+ inputEvent = oneEvent(el, "input");
477
+ await sendMouse({
478
+ steps: [
479
+ {
480
+ type: "move",
481
+ position: [125, position[1]]
482
+ }
483
+ ]
484
+ });
485
+ await inputEvent;
486
+ expect(el.value).to.equal(5);
487
+ });
488
+ it("will not pointermove unless `pointerdown`", async () => {
489
+ const el = await fixture(html`
407
490
  <sp-slider></sp-slider>
408
491
  `);
409
- await elementUpdated(el);
410
- expect(el.value).to.equal(10);
411
- expect(el.dragging).to.be.false;
412
- const handle = el.shadowRoot.querySelector('.handle');
413
- handle.dispatchEvent(new PointerEvent('pointermove', {
414
- clientX: 0,
415
- cancelable: true,
416
- }));
417
- await nextFrame();
418
- expect(el.value).to.equal(10);
419
- });
420
- it('responds to input events on the <input/> element', async () => {
421
- const el = await fixture(html `
492
+ await elementUpdated(el);
493
+ expect(el.value).to.equal(10);
494
+ expect(el.dragging).to.be.false;
495
+ const handle = el.shadowRoot.querySelector(".handle");
496
+ handle.dispatchEvent(new PointerEvent("pointermove", {
497
+ clientX: 0,
498
+ cancelable: true
499
+ }));
500
+ await nextFrame();
501
+ expect(el.value).to.equal(10);
502
+ });
503
+ it("responds to input events on the <input/> element", async () => {
504
+ const el = await fixture(html`
422
505
  <sp-slider></sp-slider>
423
506
  `);
424
- await elementUpdated(el);
425
- expect(el.value).to.equal(10);
426
- const input = el.shadowRoot.querySelector('.input');
427
- input.value = '0';
428
- input.dispatchEvent(new Event('change'));
429
- expect(el.value).to.equal(0);
430
- });
431
- it('accepts variants', async () => {
432
- const el = await fixture(html `
507
+ await elementUpdated(el);
508
+ expect(el.value).to.equal(10);
509
+ const input = el.shadowRoot.querySelector(".input");
510
+ input.value = "0";
511
+ input.dispatchEvent(new Event("change"));
512
+ expect(el.value).to.equal(0);
513
+ });
514
+ it("accepts variants", async () => {
515
+ const el = await fixture(html`
433
516
  <sp-slider variant="tick"></sp-slider>
434
517
  `);
435
- await elementUpdated(el);
436
- expect(el.variant).to.equal('tick');
437
- expect(el.getAttribute('variant')).to.equal('tick');
438
- el.variant = 'ramp';
439
- await elementUpdated(el);
440
- expect(el.variant).to.equal('ramp');
441
- expect(el.getAttribute('variant')).to.equal('ramp');
442
- el.setAttribute('variant', 'filled');
443
- await elementUpdated(el);
444
- expect(el.variant).to.equal('filled');
445
- expect(el.getAttribute('variant')).to.equal('filled');
446
- el.removeAttribute('variant');
447
- await elementUpdated(el);
448
- expect(el.variant).to.equal('');
449
- expect(el.hasAttribute('variant')).to.be.false;
450
- });
451
- it('validates variants', async () => {
452
- const el = await fixture(html `
518
+ await elementUpdated(el);
519
+ expect(el.variant).to.equal("tick");
520
+ expect(el.getAttribute("variant")).to.equal("tick");
521
+ el.variant = "ramp";
522
+ await elementUpdated(el);
523
+ expect(el.variant).to.equal("ramp");
524
+ expect(el.getAttribute("variant")).to.equal("ramp");
525
+ el.setAttribute("variant", "filled");
526
+ await elementUpdated(el);
527
+ expect(el.variant).to.equal("filled");
528
+ expect(el.getAttribute("variant")).to.equal("filled");
529
+ el.removeAttribute("variant");
530
+ await elementUpdated(el);
531
+ expect(el.variant).to.equal("");
532
+ expect(el.hasAttribute("variant")).to.be.false;
533
+ });
534
+ it("validates variants", async () => {
535
+ const el = await fixture(html`
453
536
  <sp-slider variant="other"></sp-slider>
454
537
  `);
455
- await elementUpdated(el);
456
- expect(el.variant).to.equal('');
457
- expect(el.hasAttribute('variant')).to.be.false;
458
- el.variant = 'tick';
459
- await elementUpdated(el);
460
- expect(el.variant).to.equal('tick');
461
- expect(el.getAttribute('variant')).to.equal('tick');
462
- el.variant = 'tick';
463
- await elementUpdated(el);
464
- expect(el.variant).to.equal('tick');
465
- expect(el.getAttribute('variant')).to.equal('tick');
466
- });
467
- it('has a `focusElement`', async () => {
468
- const el = await fixture(html `
538
+ await elementUpdated(el);
539
+ expect(el.variant).to.equal("");
540
+ expect(el.hasAttribute("variant")).to.be.false;
541
+ el.variant = "tick";
542
+ await elementUpdated(el);
543
+ expect(el.variant).to.equal("tick");
544
+ expect(el.getAttribute("variant")).to.equal("tick");
545
+ el.variant = "tick";
546
+ await elementUpdated(el);
547
+ expect(el.variant).to.equal("tick");
548
+ expect(el.getAttribute("variant")).to.equal("tick");
549
+ });
550
+ it("has a `focusElement`", async () => {
551
+ const el = await fixture(html`
469
552
  <sp-slider></sp-slider>
470
553
  `);
471
- await elementUpdated(el);
472
- const input = el.focusElement;
473
- expect(input).to.not.be.undefined;
474
- expect(input.type).to.equal('range');
475
- });
476
- it('displays result of getAriaValueText', async () => {
477
- const el = await fixture(html `
554
+ await elementUpdated(el);
555
+ const input = el.focusElement;
556
+ expect(input).to.not.be.undefined;
557
+ expect(input.type).to.equal("range");
558
+ });
559
+ it("displays result of getAriaValueText", async () => {
560
+ const el = await fixture(html`
478
561
  <sp-slider
479
562
  value="50"
480
563
  min="0"
@@ -482,40 +565,40 @@ describe('Slider', () => {
482
565
  .getAriaHandleText=${(value) => `${value}%`}
483
566
  ></sp-slider>
484
567
  `);
485
- await elementUpdated(el);
486
- const input = el.focusElement;
487
- expect(input.getAttribute('aria-valuetext')).to.equal('50%');
488
- el.value = 100;
489
- await elementUpdated(el);
490
- expect(input.getAttribute('aria-valuetext')).to.equal('100%');
491
- });
492
- it('displays Intl.formatNumber results', async () => {
493
- const el = await fixture(html `
568
+ await elementUpdated(el);
569
+ const input = el.focusElement;
570
+ expect(input.getAttribute("aria-valuetext")).to.equal("50%");
571
+ el.value = 100;
572
+ await elementUpdated(el);
573
+ expect(input.getAttribute("aria-valuetext")).to.equal("100%");
574
+ });
575
+ it("displays Intl.formatNumber results", async () => {
576
+ const el = await fixture(html`
494
577
  <sp-slider
495
578
  value=".5"
496
579
  min="0"
497
580
  max="1"
498
- .formatOptions=${{ style: 'percent' }}
581
+ .formatOptions=${{ style: "percent" }}
499
582
  ></sp-slider>
500
583
  `);
501
- await elementUpdated(el);
502
- const input = el.focusElement;
503
- expect(input.getAttribute('aria-valuetext')).to.equal('50%');
504
- el.value = 100;
505
- await elementUpdated(el);
506
- expect(input.getAttribute('aria-valuetext')).to.equal('100%');
507
- });
508
- it('obeys language property', async () => {
509
- let lang = 'de';
510
- const langResolvers = [];
511
- const createLangResolver = (event) => {
512
- langResolvers.push(event.detail.callback);
513
- resolveLanguage();
514
- };
515
- const resolveLanguage = () => {
516
- langResolvers.forEach((resolver) => resolver(lang));
517
- };
518
- let el = await fixture(html `
584
+ await elementUpdated(el);
585
+ const input = el.focusElement;
586
+ expect(input.getAttribute("aria-valuetext")).to.equal("50%");
587
+ el.value = 100;
588
+ await elementUpdated(el);
589
+ expect(input.getAttribute("aria-valuetext")).to.equal("100%");
590
+ });
591
+ it("obeys language property", async () => {
592
+ let lang = "de";
593
+ const langResolvers = [];
594
+ const createLangResolver = (event) => {
595
+ langResolvers.push(event.detail.callback);
596
+ resolveLanguage();
597
+ };
598
+ const resolveLanguage = () => {
599
+ langResolvers.forEach((resolver) => resolver(lang));
600
+ };
601
+ let el = await fixture(html`
519
602
  <sp-slider
520
603
  value="2.44"
521
604
  min="0"
@@ -525,16 +608,16 @@ describe('Slider', () => {
525
608
  .formatOptions=${{ maximumFractionDigits: 2 }}
526
609
  ></sp-slider>
527
610
  `);
528
- await elementUpdated(el);
529
- let input = el.focusElement;
530
- expect(input.getAttribute('aria-valuetext'), 'First German number').to.equal('2,44');
531
- lang = 'en';
532
- resolveLanguage();
533
- await elementUpdated(el);
534
- expect(input.getAttribute('aria-valuetext'), 'First English number').to.equal('2.44');
535
- lang = 'de';
536
- resolveLanguage();
537
- el = await fixture(html `
611
+ await elementUpdated(el);
612
+ let input = el.focusElement;
613
+ expect(input.getAttribute("aria-valuetext"), "First German number").to.equal("2,44");
614
+ lang = "en";
615
+ resolveLanguage();
616
+ await elementUpdated(el);
617
+ expect(input.getAttribute("aria-valuetext"), "First English number").to.equal("2.44");
618
+ lang = "de";
619
+ resolveLanguage();
620
+ el = await fixture(html`
538
621
  <sp-slider
539
622
  min="0"
540
623
  max="10"
@@ -549,48 +632,48 @@ describe('Slider', () => {
549
632
  ></sp-slider-handle>
550
633
  </sp-slider>
551
634
  `);
552
- await elementUpdated(el);
553
- input = el.focusElement;
554
- expect(input.getAttribute('aria-valuetext'), 'Second German number').to.equal('2,44');
555
- lang = 'en';
556
- resolveLanguage();
557
- await elementUpdated(el);
558
- expect(input.getAttribute('aria-valuetext'), 'Second English number').to.equal('2.44');
559
- });
560
- it('uses fallback ariaValueText', async () => {
561
- const el = await fixture(html `
635
+ await elementUpdated(el);
636
+ input = el.focusElement;
637
+ expect(input.getAttribute("aria-valuetext"), "Second German number").to.equal("2,44");
638
+ lang = "en";
639
+ resolveLanguage();
640
+ await elementUpdated(el);
641
+ expect(input.getAttribute("aria-valuetext"), "Second English number").to.equal("2.44");
642
+ });
643
+ it("uses fallback ariaValueText", async () => {
644
+ const el = await fixture(html`
562
645
  <sp-slider value="50" min="0" max="100"></sp-slider>
563
646
  `);
564
- await elementUpdated(el);
565
- el.getAriaValueText = false;
566
- const input = el.focusElement;
567
- await elementUpdated(el);
568
- expect(input.getAttribute('aria-valuetext')).to.equal('50');
569
- });
570
- it('accepts min/max/value in the same timing', async () => {
571
- const el = await fixture(html `
647
+ await elementUpdated(el);
648
+ el.getAriaValueText = false;
649
+ const input = el.focusElement;
650
+ await elementUpdated(el);
651
+ expect(input.getAttribute("aria-valuetext")).to.equal("50");
652
+ });
653
+ it("accepts min/max/value in the same timing", async () => {
654
+ const el = await fixture(html`
572
655
  <sp-slider></sp-slider>
573
656
  `);
574
- await elementUpdated(el);
575
- expect(el.value).to.equal(10);
576
- el.min = 0;
577
- el.max = 200;
578
- el.value = 200;
579
- await elementUpdated(el);
580
- expect(el.value).to.equal(200);
581
- el.value = 500;
582
- el.min = 0;
583
- el.max = 500;
584
- await elementUpdated(el);
585
- expect(el.value).to.equal(500);
586
- el.value = -100;
587
- el.min = -100;
588
- el.max = 500;
589
- await elementUpdated(el);
590
- expect(el.value).to.equal(-100);
591
- });
592
- it('returns values for handles', async () => {
593
- let el = await fixture(html `
657
+ await elementUpdated(el);
658
+ expect(el.value).to.equal(10);
659
+ el.min = 0;
660
+ el.max = 200;
661
+ el.value = 200;
662
+ await elementUpdated(el);
663
+ expect(el.value).to.equal(200);
664
+ el.value = 500;
665
+ el.min = 0;
666
+ el.max = 500;
667
+ await elementUpdated(el);
668
+ expect(el.value).to.equal(500);
669
+ el.value = -100;
670
+ el.min = -100;
671
+ el.max = 500;
672
+ await elementUpdated(el);
673
+ expect(el.value).to.equal(-100);
674
+ });
675
+ it("returns values for handles", async () => {
676
+ let el = await fixture(html`
594
677
  <sp-slider>
595
678
  <sp-slider-handle
596
679
  slot="handle"
@@ -612,17 +695,17 @@ describe('Slider', () => {
612
695
  ></sp-slider-handle>
613
696
  </sp-slider>
614
697
  `);
615
- await elementUpdated(el);
616
- expect(el.values).to.deep.equal({ a: 10, b: 20, c: 30 });
617
- const middleHandle = el.querySelector('#middle-handle');
618
- middleHandle.value = 22;
619
- await elementUpdated(el);
620
- expect(el.values).to.deep.equal({ a: 10, b: 22, c: 30 });
621
- el = await fixture(html `
698
+ await elementUpdated(el);
699
+ expect(el.values).to.deep.equal({ a: 10, b: 20, c: 30 });
700
+ const middleHandle = el.querySelector("#middle-handle");
701
+ middleHandle.value = 22;
702
+ await elementUpdated(el);
703
+ expect(el.values).to.deep.equal({ a: 10, b: 22, c: 30 });
704
+ el = await fixture(html`
622
705
  <sp-slider value="10" min="0" max="100"></sp-slider>
623
706
  `);
624
- expect(el.values).to.deep.equal({ value: 10 });
625
- el = await fixture(html `
707
+ expect(el.values).to.deep.equal({ value: 10 });
708
+ el = await fixture(html`
626
709
  <sp-slider min="0" max="100">
627
710
  <sp-slider-handle
628
711
  slot="handle"
@@ -630,10 +713,102 @@ describe('Slider', () => {
630
713
  ></sp-slider-handle>
631
714
  </sp-slider>
632
715
  `);
633
- expect(el.values).to.deep.equal({ handle1: 10 });
716
+ expect(el.values).to.deep.equal({ handle1: 10 });
717
+ });
718
+ it("clamps values for multi-handle slider", async () => {
719
+ const el = await fixture(html`
720
+ <sp-slider min="0" max="100">
721
+ <sp-slider-handle
722
+ id="first-handle"
723
+ max="next"
724
+ slot="handle"
725
+ name="a"
726
+ value="10"
727
+ ></sp-slider-handle>
728
+ <sp-slider-handle
729
+ id="middle-handle"
730
+ min="previous"
731
+ max="next"
732
+ slot="handle"
733
+ name="b"
734
+ value="20"
735
+ ></sp-slider-handle>
736
+ <sp-slider-handle
737
+ id="last-handle"
738
+ min="previous"
739
+ slot="handle"
740
+ name="c"
741
+ value="30"
742
+ ></sp-slider-handle>
743
+ </sp-slider>
744
+ `);
745
+ await elementUpdated(el);
746
+ expect(el.values).to.deep.equal({ a: 10, b: 20, c: 30 });
747
+ const firstHandle = el.querySelector("#first-handle");
748
+ const middleHandle = el.querySelector("#middle-handle");
749
+ const lastHandle = el.querySelector("#last-handle");
750
+ firstHandle.value = 25;
751
+ await elementUpdated(el);
752
+ expect(el.values).to.deep.equal({ a: 20, b: 20, c: 30 });
753
+ firstHandle.value = 10;
754
+ await elementUpdated(el);
755
+ middleHandle.value = 5;
756
+ await elementUpdated(el);
757
+ expect(el.values).to.deep.equal({ a: 10, b: 10, c: 30 });
758
+ lastHandle.value = 11;
759
+ await elementUpdated(el);
760
+ expect(el.values).to.deep.equal({ a: 10, b: 10, c: 11 });
761
+ lastHandle.value = 7;
762
+ await elementUpdated(el);
763
+ expect(el.values).to.deep.equal({ a: 10, b: 10, c: 10 });
764
+ });
765
+ it('warns in Dev Mode when `min="previous"` is leveraged on first handle', async () => {
766
+ const consoleWarnStub = stub(console, "warn");
767
+ window.__swc.issuedWarnings = /* @__PURE__ */ new Set();
768
+ const el = await fixture(html`
769
+ <sp-slider min="0" max="100">
770
+ <sp-slider-handle
771
+ id="first-handle"
772
+ min="previous"
773
+ max="next"
774
+ slot="handle"
775
+ name="a"
776
+ value="10"
777
+ ></sp-slider-handle>
778
+ <sp-slider-handle
779
+ id="middle-handle"
780
+ min="previous"
781
+ max="next"
782
+ slot="handle"
783
+ name="b"
784
+ value="20"
785
+ ></sp-slider-handle>
786
+ <sp-slider-handle
787
+ id="last-handle"
788
+ min="previous"
789
+ slot="handle"
790
+ name="c"
791
+ value="30"
792
+ ></sp-slider-handle>
793
+ </sp-slider>
794
+ `);
795
+ await elementUpdated(el);
796
+ expect(consoleWarnStub.called).to.be.true;
797
+ const spyCall = consoleWarnStub.getCall(0);
798
+ expect(spyCall.args.at(0).includes("previous"), 'confirm "previous" in message').to.be.true;
799
+ expect(spyCall.args.at(-1), "confirm `data` shape").to.deep.equal({
800
+ data: {
801
+ localName: "sp-slider",
802
+ type: "api",
803
+ level: "default"
804
+ }
634
805
  });
635
- it('clamps values for multi-handle slider', async () => {
636
- const el = await fixture(html `
806
+ consoleWarnStub.restore();
807
+ });
808
+ it('warns in Dev Mode when `max="next"` is leveraged on last handle', async () => {
809
+ const consoleWarnStub = stub(console, "warn");
810
+ window.__swc.issuedWarnings = /* @__PURE__ */ new Set();
811
+ const el = await fixture(html`
637
812
  <sp-slider min="0" max="100">
638
813
  <sp-slider-handle
639
814
  id="first-handle"
@@ -653,57 +828,49 @@ describe('Slider', () => {
653
828
  <sp-slider-handle
654
829
  id="last-handle"
655
830
  min="previous"
831
+ max="next"
656
832
  slot="handle"
657
833
  name="c"
658
834
  value="30"
659
835
  ></sp-slider-handle>
660
836
  </sp-slider>
661
837
  `);
662
- await elementUpdated(el);
663
- expect(el.values).to.deep.equal({ a: 10, b: 20, c: 30 });
664
- const firstHandle = el.querySelector('#first-handle');
665
- const middleHandle = el.querySelector('#middle-handle');
666
- const lastHandle = el.querySelector('#last-handle');
667
- firstHandle.value = 25;
668
- await elementUpdated(el);
669
- expect(el.values).to.deep.equal({ a: 20, b: 20, c: 30 });
670
- firstHandle.value = 10;
671
- await elementUpdated(el);
672
- middleHandle.value = 5;
673
- await elementUpdated(el);
674
- expect(el.values).to.deep.equal({ a: 10, b: 10, c: 30 });
675
- lastHandle.value = 11;
676
- await elementUpdated(el);
677
- expect(el.values).to.deep.equal({ a: 10, b: 10, c: 11 });
678
- lastHandle.value = 7;
679
- await elementUpdated(el);
680
- expect(el.values).to.deep.equal({ a: 10, b: 10, c: 10 });
838
+ await elementUpdated(el);
839
+ expect(consoleWarnStub.called).to.be.true;
840
+ const spyCall = consoleWarnStub.getCall(0);
841
+ expect(spyCall.args.at(0).includes("next"), 'confirm "next" in message').to.be.true;
842
+ expect(spyCall.args.at(-1), "confirm `data` shape").to.deep.equal({
843
+ data: {
844
+ localName: "sp-slider",
845
+ type: "api",
846
+ level: "default"
847
+ }
681
848
  });
682
- it('builds both handles from a <template>', async () => {
683
- var _a;
684
- const template = document.createElement('template');
685
- template.innerHTML = `
849
+ consoleWarnStub.restore();
850
+ });
851
+ it("builds both handles from a <template>", async () => {
852
+ var _a;
853
+ const template = document.createElement("template");
854
+ template.innerHTML = `
686
855
  <sp-slider variant="range" step="1" id="price" name="price" label="Max Price" min="35425" max="86610">
687
856
  <sp-slider-handle slot="handle" name="min" label="Minimum" max="next" value="35425"></sp-slider-handle>
688
857
  <sp-slider-handle slot="handle" name="max" label="Maximum" min="previous" value="86610"></sp-slider-handle>
689
858
  </sp-slider>
690
859
  `;
691
- const el = await fixture(html `
860
+ const el = await fixture(html`
692
861
  <div></div>
693
862
  `);
694
- el.appendChild(template.content.cloneNode(true));
695
- await waitUntil(() => {
696
- var _a;
697
- return ((_a = el.querySelector('sp-slider')) === null || _a === void 0 ? void 0 : _a.shadowRoot) != null;
698
- });
699
- // Sliders take several frames to fully upgrade
700
- await nextFrame();
701
- const createdHandles = ((_a = el
702
- .querySelector('sp-slider')) === null || _a === void 0 ? void 0 : _a.shadowRoot.querySelectorAll('.handle')) || [];
703
- expect(createdHandles).to.have.lengthOf(2);
863
+ el.appendChild(template.content.cloneNode(true));
864
+ await waitUntil(() => {
865
+ var _a2;
866
+ return ((_a2 = el.querySelector("sp-slider")) == null ? void 0 : _a2.shadowRoot) != null;
704
867
  });
705
- it('enforces next/previous max/min', async () => {
706
- let el = await fixture(html `
868
+ await nextFrame();
869
+ const createdHandles = ((_a = el.querySelector("sp-slider")) == null ? void 0 : _a.shadowRoot.querySelectorAll(".handle")) || [];
870
+ expect(createdHandles).to.have.lengthOf(2);
871
+ });
872
+ it("enforces next/previous max/min", async () => {
873
+ let el = await fixture(html`
707
874
  <sp-slider min="0" max="100">
708
875
  <sp-slider-handle
709
876
  id="first-handle"
@@ -729,30 +896,30 @@ describe('Slider', () => {
729
896
  ></sp-slider-handle>
730
897
  </sp-slider>
731
898
  `);
732
- await elementUpdated(el);
733
- expect(el.values).to.deep.equal({ a: 10, b: 20, c: 30 });
734
- let firstHandle = el.querySelector('#first-handle');
735
- let lastHandle = el.querySelector('#last-handle');
736
- let firstInput = el.shadowRoot.querySelector('.handle[name="a"] > input');
737
- let middleInput = el.shadowRoot.querySelector('.handle[name="b"] > input');
738
- let lastInput = el.shadowRoot.querySelector('.handle[name="c"] > input');
739
- expect(firstInput.min).to.equal('0');
740
- expect(firstInput.max).to.equal('20');
741
- expect(middleInput.min).to.equal('10');
742
- expect(middleInput.max).to.equal('30');
743
- expect(lastInput.min).to.equal('20');
744
- expect(lastInput.max).to.equal('100');
745
- firstHandle.value = 15;
746
- lastHandle.value = 85;
747
- await elementUpdated(el);
748
- await elementUpdated(el);
749
- expect(firstInput.min).to.equal('0');
750
- expect(firstInput.max).to.equal('20');
751
- expect(middleInput.min).to.equal('15');
752
- expect(middleInput.max).to.equal('85');
753
- expect(lastInput.min).to.equal('20');
754
- expect(lastInput.max).to.equal('100');
755
- el = await fixture(html `
899
+ await elementUpdated(el);
900
+ expect(el.values).to.deep.equal({ a: 10, b: 20, c: 30 });
901
+ let firstHandle = el.querySelector("#first-handle");
902
+ let lastHandle = el.querySelector("#last-handle");
903
+ let firstInput = el.shadowRoot.querySelector('.handle[name="a"] > input');
904
+ let middleInput = el.shadowRoot.querySelector('.handle[name="b"] > input');
905
+ let lastInput = el.shadowRoot.querySelector('.handle[name="c"] > input');
906
+ expect(firstInput.min).to.equal("0");
907
+ expect(firstInput.max).to.equal("20");
908
+ expect(middleInput.min).to.equal("10");
909
+ expect(middleInput.max).to.equal("30");
910
+ expect(lastInput.min).to.equal("20");
911
+ expect(lastInput.max).to.equal("100");
912
+ firstHandle.value = 15;
913
+ lastHandle.value = 85;
914
+ await elementUpdated(el);
915
+ await elementUpdated(el);
916
+ expect(firstInput.min).to.equal("0");
917
+ expect(firstInput.max).to.equal("20");
918
+ expect(middleInput.min).to.equal("15");
919
+ expect(middleInput.max).to.equal("85");
920
+ expect(lastInput.min).to.equal("20");
921
+ expect(lastInput.max).to.equal("100");
922
+ el = await fixture(html`
756
923
  <sp-slider>
757
924
  <sp-slider-handle
758
925
  id="first-handle"
@@ -780,29 +947,28 @@ describe('Slider', () => {
780
947
  ></sp-slider-handle>
781
948
  </sp-slider>
782
949
  `);
783
- firstInput = el.shadowRoot.querySelector('.handle[name="a"] > input');
784
- middleInput = el.shadowRoot.querySelector('.handle[name="b"] > input');
785
- lastInput = el.shadowRoot.querySelector('.handle[name="c"] > input');
786
- expect(firstInput.min).to.equal('0');
787
- expect(firstInput.max).to.equal('20');
788
- expect(middleInput.min).to.equal('10');
789
- expect(middleInput.max).to.equal('30');
790
- expect(lastInput.min).to.equal('20');
791
- expect(lastInput.max).to.equal('100');
792
- firstHandle = el.querySelector('#first-handle');
793
- lastHandle = el.querySelector('#last-handle');
794
- firstHandle.min = 5;
795
- lastHandle.max = 95;
796
- await elementUpdated(el);
797
- await elementUpdated(el);
798
- expect(firstInput.min).to.equal('5');
799
- expect(firstInput.max).to.equal('20');
800
- expect(lastInput.min).to.equal('20');
801
- expect(lastInput.max).to.equal('95');
802
- });
803
- it('sends keyboard events to active handle', async () => {
804
- // let pointerId = -1;
805
- const el = await fixture(html `
950
+ firstInput = el.shadowRoot.querySelector('.handle[name="a"] > input');
951
+ middleInput = el.shadowRoot.querySelector('.handle[name="b"] > input');
952
+ lastInput = el.shadowRoot.querySelector('.handle[name="c"] > input');
953
+ expect(firstInput.min).to.equal("0");
954
+ expect(firstInput.max).to.equal("20");
955
+ expect(middleInput.min).to.equal("10");
956
+ expect(middleInput.max).to.equal("30");
957
+ expect(lastInput.min).to.equal("20");
958
+ expect(lastInput.max).to.equal("100");
959
+ firstHandle = el.querySelector("#first-handle");
960
+ lastHandle = el.querySelector("#last-handle");
961
+ firstHandle.min = 5;
962
+ lastHandle.max = 95;
963
+ await elementUpdated(el);
964
+ await elementUpdated(el);
965
+ expect(firstInput.min).to.equal("5");
966
+ expect(firstInput.max).to.equal("20");
967
+ expect(lastInput.min).to.equal("20");
968
+ expect(lastInput.max).to.equal("95");
969
+ });
970
+ it("sends keyboard events to active handle", async () => {
971
+ const el = await fixture(html`
806
972
  <sp-slider step="1" min="0" max="100">
807
973
  <sp-slider-handle
808
974
  id="first-handle"
@@ -828,15 +994,15 @@ describe('Slider', () => {
828
994
  ></sp-slider-handle>
829
995
  </sp-slider>
830
996
  `);
831
- await elementUpdated(el);
832
- expect(el.values).to.deep.equal({ a: 10, b: 20, c: 30 });
833
- const lastHandle = el.querySelector('#last-handle');
834
- lastHandle.focus();
835
- await sendKeys({
836
- press: 'ArrowDown',
837
- });
838
- await elementUpdated(el);
839
- expect(el.values).to.deep.equal({ a: 10, b: 20, c: 29 });
997
+ await elementUpdated(el);
998
+ expect(el.values).to.deep.equal({ a: 10, b: 20, c: 30 });
999
+ const lastHandle = el.querySelector("#last-handle");
1000
+ lastHandle.focus();
1001
+ await sendKeys({
1002
+ press: "ArrowDown"
840
1003
  });
1004
+ await elementUpdated(el);
1005
+ expect(el.values).to.deep.equal({ a: 10, b: 20, c: 29 });
1006
+ });
841
1007
  });
842
- //# sourceMappingURL=slider.test.js.map
1008
+ //# sourceMappingURL=slider.test.js.map