@spectrum-web-components/slider 0.12.4 → 0.12.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +6 -6
- package/package.json +9 -9
- package/sp-slider-handle.d.ts +0 -6
- package/sp-slider-handle.js +0 -14
- package/sp-slider-handle.js.map +0 -1
- package/sp-slider.d.ts +0 -7
- package/sp-slider.js +0 -15
- package/sp-slider.js.map +0 -1
- package/src/HandleController.d.ts +0 -110
- package/src/HandleController.js +0 -470
- package/src/HandleController.js.map +0 -1
- package/src/Slider.d.ts +0 -68
- package/src/Slider.js +0 -370
- package/src/Slider.js.map +0 -1
- package/src/SliderHandle.d.ts +0 -57
- package/src/SliderHandle.js +0 -192
- package/src/SliderHandle.js.map +0 -1
- package/src/index.d.ts +0 -3
- package/src/index.js +0 -15
- package/src/index.js.map +0 -1
- package/src/slider.css.d.ts +0 -2
- package/src/slider.css.js +0 -203
- package/src/slider.css.js.map +0 -1
- package/src/spectrum-slider.css.d.ts +0 -2
- package/src/spectrum-slider.css.js +0 -189
- package/src/spectrum-slider.css.js.map +0 -1
- package/stories/slider.stories.js +0 -699
- package/stories/slider.stories.js.map +0 -1
package/src/Slider.js
DELETED
|
@@ -1,370 +0,0 @@
|
|
|
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 { __decorate } from "tslib";
|
|
13
|
-
import { html, } from '@spectrum-web-components/base';
|
|
14
|
-
import { property, query, } from '@spectrum-web-components/base/src/decorators.js';
|
|
15
|
-
import { classMap, ifDefined, repeat, styleMap, } from '@spectrum-web-components/base/src/directives.js';
|
|
16
|
-
import sliderStyles from './slider.css.js';
|
|
17
|
-
import { ObserveSlotText } from '@spectrum-web-components/shared/src/observe-slot-text.js';
|
|
18
|
-
import '@spectrum-web-components/field-label/sp-field-label.js';
|
|
19
|
-
import { HandleController } from './HandleController.js';
|
|
20
|
-
import { SliderHandle } from './SliderHandle.js';
|
|
21
|
-
import { streamingListener } from '@spectrum-web-components/base/src/streaming-listener.js';
|
|
22
|
-
export const variants = ['filled', 'ramp', 'range', 'tick'];
|
|
23
|
-
/**
|
|
24
|
-
* @element sp-slider
|
|
25
|
-
*
|
|
26
|
-
* @slot - text label for the Slider
|
|
27
|
-
*/
|
|
28
|
-
export class Slider extends ObserveSlotText(SliderHandle, '') {
|
|
29
|
-
constructor() {
|
|
30
|
-
super(...arguments);
|
|
31
|
-
this.handleController = new HandleController(this);
|
|
32
|
-
this._editable = false;
|
|
33
|
-
/**
|
|
34
|
-
* Whether the stepper UI of the Number Field is hidden or not
|
|
35
|
-
*/
|
|
36
|
-
this.hideStepper = false;
|
|
37
|
-
this.type = '';
|
|
38
|
-
/* Ensure that a '' value for `variant` removes the attribute instead of a blank value */
|
|
39
|
-
this._variant = '';
|
|
40
|
-
this.getAriaValueText = (values) => {
|
|
41
|
-
const valueArray = [...values.values()];
|
|
42
|
-
if (valueArray.length === 2)
|
|
43
|
-
return `${valueArray[0]}${this._forcedUnit} - ${valueArray[1]}${this._forcedUnit}`;
|
|
44
|
-
return valueArray.join(`${this._forcedUnit}, `) + this._forcedUnit;
|
|
45
|
-
};
|
|
46
|
-
this.min = 0;
|
|
47
|
-
this.max = 100;
|
|
48
|
-
this.step = 1;
|
|
49
|
-
this.tickStep = 0;
|
|
50
|
-
this.tickLabels = false;
|
|
51
|
-
this.disabled = false;
|
|
52
|
-
this._numberFieldInput = Promise.resolve();
|
|
53
|
-
}
|
|
54
|
-
static get styles() {
|
|
55
|
-
return [sliderStyles];
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Whether to display a Number Field along side the slider UI
|
|
59
|
-
*/
|
|
60
|
-
get editable() {
|
|
61
|
-
return this._editable;
|
|
62
|
-
}
|
|
63
|
-
set editable(editable) {
|
|
64
|
-
if (editable === this.editable)
|
|
65
|
-
return;
|
|
66
|
-
const oldValue = this.editable;
|
|
67
|
-
this._editable = this.handleController.size < 2 ? editable : false;
|
|
68
|
-
if (this.editable) {
|
|
69
|
-
this._numberFieldInput = import('@spectrum-web-components/number-field/sp-number-field.js');
|
|
70
|
-
}
|
|
71
|
-
if (oldValue !== this.editable) {
|
|
72
|
-
this.requestUpdate('editable', oldValue);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
set variant(variant) {
|
|
76
|
-
const oldVariant = this.variant;
|
|
77
|
-
if (variant === this.variant) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
if (variants.includes(variant)) {
|
|
81
|
-
this.setAttribute('variant', variant);
|
|
82
|
-
this._variant = variant;
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
this.removeAttribute('variant');
|
|
86
|
-
this._variant = '';
|
|
87
|
-
}
|
|
88
|
-
this.requestUpdate('variant', oldVariant);
|
|
89
|
-
}
|
|
90
|
-
get variant() {
|
|
91
|
-
return this._variant;
|
|
92
|
-
}
|
|
93
|
-
get values() {
|
|
94
|
-
return this.handleController.values;
|
|
95
|
-
}
|
|
96
|
-
get handleName() {
|
|
97
|
-
return 'value';
|
|
98
|
-
}
|
|
99
|
-
get ariaValueText() {
|
|
100
|
-
if (!this.getAriaValueText) {
|
|
101
|
-
return `${this.value}${this._forcedUnit}`;
|
|
102
|
-
}
|
|
103
|
-
return this.getAriaValueText(this.handleController.formattedValues);
|
|
104
|
-
}
|
|
105
|
-
get numberFormat() {
|
|
106
|
-
return this.getNumberFormat();
|
|
107
|
-
}
|
|
108
|
-
get focusElement() {
|
|
109
|
-
return this.handleController.focusElement;
|
|
110
|
-
}
|
|
111
|
-
handleLabelClick(event) {
|
|
112
|
-
if (this.editable) {
|
|
113
|
-
event.preventDefault();
|
|
114
|
-
this.focus();
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
render() {
|
|
118
|
-
return html `
|
|
119
|
-
${this.renderLabel()} ${this.renderTrack()}
|
|
120
|
-
${this.editable
|
|
121
|
-
? html `
|
|
122
|
-
<sp-number-field
|
|
123
|
-
.formatOptions=${this.formatOptions || {}}
|
|
124
|
-
id="number-field"
|
|
125
|
-
min=${this.min}
|
|
126
|
-
max=${this.max}
|
|
127
|
-
step=${this.step}
|
|
128
|
-
value=${this.value}
|
|
129
|
-
?hide-stepper=${this.hideStepper}
|
|
130
|
-
?disabled=${this.disabled}
|
|
131
|
-
@input=${this.handleNumberInput}
|
|
132
|
-
@change=${this.handleNumberChange}
|
|
133
|
-
></sp-number-field>
|
|
134
|
-
`
|
|
135
|
-
: html ``}
|
|
136
|
-
`;
|
|
137
|
-
}
|
|
138
|
-
connectedCallback() {
|
|
139
|
-
super.connectedCallback();
|
|
140
|
-
this.handleController.hostConnected();
|
|
141
|
-
}
|
|
142
|
-
disconnectedCallback() {
|
|
143
|
-
super.disconnectedCallback();
|
|
144
|
-
this.handleController.hostDisconnected();
|
|
145
|
-
}
|
|
146
|
-
update(changedProperties) {
|
|
147
|
-
this.handleController.hostUpdate();
|
|
148
|
-
super.update(changedProperties);
|
|
149
|
-
}
|
|
150
|
-
renderLabel() {
|
|
151
|
-
const textLabelVisible = this.labelVisibility === 'none' || this.labelVisibility === 'value';
|
|
152
|
-
const valueLabelVisible = this.labelVisibility === 'none' || this.labelVisibility === 'text';
|
|
153
|
-
return html `
|
|
154
|
-
<div id="label-container">
|
|
155
|
-
<sp-field-label
|
|
156
|
-
class=${classMap({
|
|
157
|
-
'visually-hidden': textLabelVisible,
|
|
158
|
-
})}
|
|
159
|
-
?disabled=${this.disabled}
|
|
160
|
-
id="label"
|
|
161
|
-
for=${this.editable
|
|
162
|
-
? 'number-field'
|
|
163
|
-
: this.handleController.activeHandleInputId}
|
|
164
|
-
@click=${this.handleLabelClick}
|
|
165
|
-
>
|
|
166
|
-
${this.slotHasContent ? html `` : this.label}
|
|
167
|
-
<slot>${this.label}</slot>
|
|
168
|
-
</sp-field-label>
|
|
169
|
-
<output
|
|
170
|
-
class=${classMap({
|
|
171
|
-
'visually-hidden': valueLabelVisible,
|
|
172
|
-
})}
|
|
173
|
-
id="value"
|
|
174
|
-
aria-live="off"
|
|
175
|
-
for="input"
|
|
176
|
-
>
|
|
177
|
-
${this.ariaValueText}
|
|
178
|
-
</output>
|
|
179
|
-
</div>
|
|
180
|
-
`;
|
|
181
|
-
}
|
|
182
|
-
renderRamp() {
|
|
183
|
-
if (this.variant !== 'ramp') {
|
|
184
|
-
return html ``;
|
|
185
|
-
}
|
|
186
|
-
return html `
|
|
187
|
-
<div id="ramp">
|
|
188
|
-
<svg
|
|
189
|
-
viewBox="0 0 240 16"
|
|
190
|
-
preserveAspectRatio="none"
|
|
191
|
-
aria-hidden="true"
|
|
192
|
-
focusable="false"
|
|
193
|
-
>
|
|
194
|
-
<path
|
|
195
|
-
d="M240,4v8c0,2.3-1.9,4.1-4.2,4L1,9C0.4,9,0,8.5,0,8c0-0.5,0.4-1,1-1l234.8-7C238.1-0.1,240,1.7,240,4z"
|
|
196
|
-
></path>
|
|
197
|
-
</svg>
|
|
198
|
-
</div>
|
|
199
|
-
`;
|
|
200
|
-
}
|
|
201
|
-
renderTicks() {
|
|
202
|
-
if (this.variant !== 'tick') {
|
|
203
|
-
return html ``;
|
|
204
|
-
}
|
|
205
|
-
const tickStep = this.tickStep || this.step;
|
|
206
|
-
const tickCount = (this.max - this.min) / tickStep;
|
|
207
|
-
const partialFit = tickCount % 1 !== 0;
|
|
208
|
-
const ticks = new Array(Math.floor(tickCount + 1));
|
|
209
|
-
ticks.fill(0, 0, tickCount + 1);
|
|
210
|
-
return html `
|
|
211
|
-
<div
|
|
212
|
-
class="${partialFit ? 'not-exact ' : ''}ticks"
|
|
213
|
-
style=${ifDefined(partialFit
|
|
214
|
-
? `--sp-slider-tick-offset: calc(100% / ${this.max} * ${this.tickStep}`
|
|
215
|
-
: undefined)}
|
|
216
|
-
>
|
|
217
|
-
${ticks.map((_tick, i) => html `
|
|
218
|
-
<div class="tick">
|
|
219
|
-
${this.tickLabels
|
|
220
|
-
? html `
|
|
221
|
-
<div class="tickLabel">
|
|
222
|
-
${i * tickStep}
|
|
223
|
-
</div>
|
|
224
|
-
`
|
|
225
|
-
: html ``}
|
|
226
|
-
</div>
|
|
227
|
-
`)}
|
|
228
|
-
</div>
|
|
229
|
-
`;
|
|
230
|
-
}
|
|
231
|
-
renderTrackSegment(start, end) {
|
|
232
|
-
if (this.variant === 'ramp') {
|
|
233
|
-
return html ``;
|
|
234
|
-
}
|
|
235
|
-
return html `
|
|
236
|
-
<div
|
|
237
|
-
class="track"
|
|
238
|
-
style=${styleMap(this.trackSegmentStyles(start, end))}
|
|
239
|
-
role="presentation"
|
|
240
|
-
></div>
|
|
241
|
-
`;
|
|
242
|
-
}
|
|
243
|
-
renderTrack() {
|
|
244
|
-
const segments = this.handleController.trackSegments();
|
|
245
|
-
const trackItems = [
|
|
246
|
-
{ id: 'track0', html: this.renderTrackSegment(...segments[0]) },
|
|
247
|
-
{ id: 'ramp', html: this.renderRamp() },
|
|
248
|
-
{ id: 'ticks', html: this.renderTicks() },
|
|
249
|
-
{ id: 'handles', html: this.handleController.render() },
|
|
250
|
-
...segments.slice(1).map(([start, end], index) => ({
|
|
251
|
-
id: `track${index + 1}`,
|
|
252
|
-
html: this.renderTrackSegment(start, end),
|
|
253
|
-
})),
|
|
254
|
-
];
|
|
255
|
-
return html `
|
|
256
|
-
<div
|
|
257
|
-
id="track"
|
|
258
|
-
${streamingListener({
|
|
259
|
-
start: ['pointerdown', this.handlePointerdown],
|
|
260
|
-
streamInside: ['pointermove', this.handlePointermove],
|
|
261
|
-
end: [['pointerup', 'pointercancel'], this.handlePointerup],
|
|
262
|
-
})}
|
|
263
|
-
>
|
|
264
|
-
<div id="controls">
|
|
265
|
-
${repeat(trackItems, (item) => item.id, (item) => item.html)}
|
|
266
|
-
</div>
|
|
267
|
-
</div>
|
|
268
|
-
`;
|
|
269
|
-
}
|
|
270
|
-
handlePointerdown(event) {
|
|
271
|
-
this.handleController.handlePointerdown(event);
|
|
272
|
-
}
|
|
273
|
-
handlePointermove(event) {
|
|
274
|
-
this.handleController.handlePointermove(event);
|
|
275
|
-
}
|
|
276
|
-
handlePointerup(event) {
|
|
277
|
-
this.handleController.handlePointerup(event);
|
|
278
|
-
}
|
|
279
|
-
handleNumberInput(event) {
|
|
280
|
-
var _a;
|
|
281
|
-
const { value } = event.target;
|
|
282
|
-
if (((_a = event.target) === null || _a === void 0 ? void 0 : _a.stepperActive) && !isNaN(value)) {
|
|
283
|
-
this.value = value;
|
|
284
|
-
return;
|
|
285
|
-
}
|
|
286
|
-
// Do not apply uncommited values to the parent element unless interacting with the stepper UI.
|
|
287
|
-
// Stop uncommited input from being annoucned to the parent application.
|
|
288
|
-
event.stopPropagation();
|
|
289
|
-
}
|
|
290
|
-
handleNumberChange(event) {
|
|
291
|
-
var _a;
|
|
292
|
-
const { value } = event.target;
|
|
293
|
-
if (isNaN(value)) {
|
|
294
|
-
event.target.value = this.value;
|
|
295
|
-
event.stopPropagation();
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
this.value = value;
|
|
299
|
-
if (!((_a = event.target) === null || _a === void 0 ? void 0 : _a.stepperActive)) {
|
|
300
|
-
// When stepper is not active, sythesize an `input` event so that the
|
|
301
|
-
// `change` event isn't surprising.
|
|
302
|
-
this.dispatchInputEvent();
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
trackSegmentStyles(start, end) {
|
|
307
|
-
const size = end - start;
|
|
308
|
-
const styles = {
|
|
309
|
-
width: `${size * 100}%`,
|
|
310
|
-
'--spectrum-slider-track-background-size': `${(1 / size) * 100}%`,
|
|
311
|
-
'--spectrum-slider-track-segment-position': `${start * 100}%`,
|
|
312
|
-
};
|
|
313
|
-
return styles;
|
|
314
|
-
}
|
|
315
|
-
async getUpdateComplete() {
|
|
316
|
-
const complete = (await super.getUpdateComplete());
|
|
317
|
-
if (this.editable) {
|
|
318
|
-
await this._numberFieldInput;
|
|
319
|
-
await this.numberField.updateComplete;
|
|
320
|
-
}
|
|
321
|
-
await this.handleController.handleUpdatesComplete();
|
|
322
|
-
return complete;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
__decorate([
|
|
326
|
-
property({ type: Boolean, reflect: true })
|
|
327
|
-
], Slider.prototype, "editable", null);
|
|
328
|
-
__decorate([
|
|
329
|
-
property({ type: Boolean, reflect: true, attribute: 'hide-stepper' })
|
|
330
|
-
], Slider.prototype, "hideStepper", void 0);
|
|
331
|
-
__decorate([
|
|
332
|
-
property()
|
|
333
|
-
], Slider.prototype, "type", void 0);
|
|
334
|
-
__decorate([
|
|
335
|
-
property({ type: String })
|
|
336
|
-
], Slider.prototype, "variant", null);
|
|
337
|
-
__decorate([
|
|
338
|
-
property({ attribute: false })
|
|
339
|
-
], Slider.prototype, "getAriaValueText", void 0);
|
|
340
|
-
__decorate([
|
|
341
|
-
property({ type: String, reflect: true, attribute: 'label-visibility' })
|
|
342
|
-
], Slider.prototype, "labelVisibility", void 0);
|
|
343
|
-
__decorate([
|
|
344
|
-
property({ type: Number, reflect: true })
|
|
345
|
-
], Slider.prototype, "min", void 0);
|
|
346
|
-
__decorate([
|
|
347
|
-
property({ type: Number, reflect: true })
|
|
348
|
-
], Slider.prototype, "max", void 0);
|
|
349
|
-
__decorate([
|
|
350
|
-
property({ type: Number })
|
|
351
|
-
], Slider.prototype, "step", void 0);
|
|
352
|
-
__decorate([
|
|
353
|
-
property({ type: Number, attribute: 'tick-step' })
|
|
354
|
-
], Slider.prototype, "tickStep", void 0);
|
|
355
|
-
__decorate([
|
|
356
|
-
property({ type: Boolean, attribute: 'tick-labels' })
|
|
357
|
-
], Slider.prototype, "tickLabels", void 0);
|
|
358
|
-
__decorate([
|
|
359
|
-
property({ type: Boolean, reflect: true })
|
|
360
|
-
], Slider.prototype, "disabled", void 0);
|
|
361
|
-
__decorate([
|
|
362
|
-
query('#label')
|
|
363
|
-
], Slider.prototype, "labelEl", void 0);
|
|
364
|
-
__decorate([
|
|
365
|
-
query('#number-field')
|
|
366
|
-
], Slider.prototype, "numberField", void 0);
|
|
367
|
-
__decorate([
|
|
368
|
-
query('#track')
|
|
369
|
-
], Slider.prototype, "track", void 0);
|
|
370
|
-
//# sourceMappingURL=Slider.js.map
|
package/src/Slider.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Slider.js","sourceRoot":"","sources":["Slider.ts"],"names":[],"mappings":"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","sourcesContent":["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n CSSResultArray,\n html,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport {\n classMap,\n ifDefined,\n repeat,\n styleMap,\n} from '@spectrum-web-components/base/src/directives.js';\n\nimport sliderStyles from './slider.css.js';\nimport { ObserveSlotText } from '@spectrum-web-components/shared/src/observe-slot-text.js';\nimport { StyleInfo } from 'lit-html/directives/style-map';\nimport '@spectrum-web-components/field-label/sp-field-label.js';\nimport type { NumberField } from '@spectrum-web-components/number-field';\nimport { HandleController, HandleValueDictionary } from './HandleController.js';\nimport { SliderHandle } from './SliderHandle.js';\nimport { streamingListener } from '@spectrum-web-components/base/src/streaming-listener.js';\n\nexport const variants = ['filled', 'ramp', 'range', 'tick'];\n\n/**\n * @element sp-slider\n *\n * @slot - text label for the Slider\n */\nexport class Slider extends ObserveSlotText(SliderHandle, '') {\n public static get styles(): CSSResultArray {\n return [sliderStyles];\n }\n\n public handleController: HandleController = new HandleController(this);\n\n /**\n * Whether to display a Number Field along side the slider UI\n */\n @property({ type: Boolean, reflect: true })\n public get editable(): boolean {\n return this._editable;\n }\n\n public set editable(editable: boolean) {\n if (editable === this.editable) return;\n const oldValue = this.editable;\n this._editable = this.handleController.size < 2 ? editable : false;\n if (this.editable) {\n this._numberFieldInput = import(\n '@spectrum-web-components/number-field/sp-number-field.js'\n );\n }\n if (oldValue !== this.editable) {\n this.requestUpdate('editable', oldValue);\n }\n }\n\n private _editable = false;\n\n /**\n * Whether the stepper UI of the Number Field is hidden or not\n */\n @property({ type: Boolean, reflect: true, attribute: 'hide-stepper' })\n public hideStepper = false;\n\n @property()\n public type = '';\n\n @property({ type: String })\n public set variant(variant: string) {\n const oldVariant = this.variant;\n if (variant === this.variant) {\n return;\n }\n if (variants.includes(variant)) {\n this.setAttribute('variant', variant);\n this._variant = variant;\n } else {\n this.removeAttribute('variant');\n this._variant = '';\n }\n this.requestUpdate('variant', oldVariant);\n }\n\n public get variant(): string {\n return this._variant;\n }\n\n public get values(): HandleValueDictionary {\n return this.handleController.values;\n }\n\n public get handleName(): string {\n return 'value';\n }\n\n /* Ensure that a '' value for `variant` removes the attribute instead of a blank value */\n private _variant = '';\n\n @property({ attribute: false })\n public getAriaValueText: (values: Map<string, string>) => string = (\n values\n ) => {\n const valueArray = [...values.values()];\n if (valueArray.length === 2)\n return `${valueArray[0]}${this._forcedUnit} - ${valueArray[1]}${this._forcedUnit}`;\n return valueArray.join(`${this._forcedUnit}, `) + this._forcedUnit;\n };\n\n public get ariaValueText(): string {\n if (!this.getAriaValueText) {\n return `${this.value}${this._forcedUnit}`;\n }\n return this.getAriaValueText(this.handleController.formattedValues);\n }\n\n @property({ type: String, reflect: true, attribute: 'label-visibility' })\n public labelVisibility?: 'text' | 'value' | 'none';\n\n @property({ type: Number, reflect: true })\n public min = 0;\n\n @property({ type: Number, reflect: true })\n public max = 100;\n\n @property({ type: Number })\n public step = 1;\n\n @property({ type: Number, attribute: 'tick-step' })\n public tickStep = 0;\n\n @property({ type: Boolean, attribute: 'tick-labels' })\n public tickLabels = false;\n\n @property({ type: Boolean, reflect: true })\n public disabled = false;\n\n @query('#label')\n public labelEl!: HTMLLabelElement;\n\n @query('#number-field')\n public numberField!: NumberField;\n\n @query('#track')\n public track!: HTMLDivElement;\n\n public get numberFormat(): Intl.NumberFormat {\n return this.getNumberFormat();\n }\n\n public get focusElement(): HTMLElement {\n return this.handleController.focusElement;\n }\n\n protected handleLabelClick(event: Event): void {\n if (this.editable) {\n event.preventDefault();\n this.focus();\n }\n }\n\n protected render(): TemplateResult {\n return html`\n ${this.renderLabel()} ${this.renderTrack()}\n ${this.editable\n ? html`\n <sp-number-field\n .formatOptions=${this.formatOptions || {}}\n id=\"number-field\"\n min=${this.min}\n max=${this.max}\n step=${this.step}\n value=${this.value}\n ?hide-stepper=${this.hideStepper}\n ?disabled=${this.disabled}\n @input=${this.handleNumberInput}\n @change=${this.handleNumberChange}\n ></sp-number-field>\n `\n : html``}\n `;\n }\n\n public connectedCallback(): void {\n super.connectedCallback();\n this.handleController.hostConnected();\n }\n\n public disconnectedCallback(): void {\n super.disconnectedCallback();\n this.handleController.hostDisconnected();\n }\n\n public update(changedProperties: Map<string, boolean>): void {\n this.handleController.hostUpdate();\n super.update(changedProperties);\n }\n\n private renderLabel(): TemplateResult {\n const textLabelVisible =\n this.labelVisibility === 'none' || this.labelVisibility === 'value';\n const valueLabelVisible =\n this.labelVisibility === 'none' || this.labelVisibility === 'text';\n return html`\n <div id=\"label-container\">\n <sp-field-label\n class=${classMap({\n 'visually-hidden': textLabelVisible,\n })}\n ?disabled=${this.disabled}\n id=\"label\"\n for=${this.editable\n ? 'number-field'\n : this.handleController.activeHandleInputId}\n @click=${this.handleLabelClick}\n >\n ${this.slotHasContent ? html`` : this.label}\n <slot>${this.label}</slot>\n </sp-field-label>\n <output\n class=${classMap({\n 'visually-hidden': valueLabelVisible,\n })}\n id=\"value\"\n aria-live=\"off\"\n for=\"input\"\n >\n ${this.ariaValueText}\n </output>\n </div>\n `;\n }\n\n private renderRamp(): TemplateResult {\n if (this.variant !== 'ramp') {\n return html``;\n }\n return html`\n <div id=\"ramp\">\n <svg\n viewBox=\"0 0 240 16\"\n preserveAspectRatio=\"none\"\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n <path\n d=\"M240,4v8c0,2.3-1.9,4.1-4.2,4L1,9C0.4,9,0,8.5,0,8c0-0.5,0.4-1,1-1l234.8-7C238.1-0.1,240,1.7,240,4z\"\n ></path>\n </svg>\n </div>\n `;\n }\n\n private renderTicks(): TemplateResult {\n if (this.variant !== 'tick') {\n return html``;\n }\n const tickStep = this.tickStep || this.step;\n const tickCount =\n ((this.max as number) - (this.min as number)) / tickStep;\n const partialFit = tickCount % 1 !== 0;\n const ticks = new Array(Math.floor(tickCount + 1));\n ticks.fill(0, 0, tickCount + 1);\n return html`\n <div\n class=\"${partialFit ? 'not-exact ' : ''}ticks\"\n style=${ifDefined(\n partialFit\n ? `--sp-slider-tick-offset: calc(100% / ${this.max} * ${this.tickStep}`\n : undefined\n )}\n >\n ${ticks.map(\n (_tick, i) => html`\n <div class=\"tick\">\n ${this.tickLabels\n ? html`\n <div class=\"tickLabel\">\n ${i * tickStep}\n </div>\n `\n : html``}\n </div>\n `\n )}\n </div>\n `;\n }\n\n private renderTrackSegment(start: number, end: number): TemplateResult {\n if (this.variant === 'ramp') {\n return html``;\n }\n return html`\n <div\n class=\"track\"\n style=${styleMap(this.trackSegmentStyles(start, end))}\n role=\"presentation\"\n ></div>\n `;\n }\n\n private renderTrack(): TemplateResult {\n const segments = this.handleController.trackSegments();\n\n const trackItems = [\n { id: 'track0', html: this.renderTrackSegment(...segments[0]) },\n { id: 'ramp', html: this.renderRamp() },\n { id: 'ticks', html: this.renderTicks() },\n { id: 'handles', html: this.handleController.render() },\n ...segments.slice(1).map(([start, end], index) => ({\n id: `track${index + 1}`,\n html: this.renderTrackSegment(start, end),\n })),\n ];\n\n return html`\n <div\n id=\"track\"\n ${streamingListener({\n start: ['pointerdown', this.handlePointerdown],\n streamInside: ['pointermove', this.handlePointermove],\n end: [['pointerup', 'pointercancel'], this.handlePointerup],\n })}\n >\n <div id=\"controls\">\n ${repeat(\n trackItems,\n (item) => item.id,\n (item) => item.html\n )}\n </div>\n </div>\n `;\n }\n\n protected handlePointerdown(event: PointerEvent): void {\n this.handleController.handlePointerdown(event);\n }\n\n protected handlePointermove(event: PointerEvent): void {\n this.handleController.handlePointermove(event);\n }\n\n protected handlePointerup(event: PointerEvent): void {\n this.handleController.handlePointerup(event);\n }\n\n private handleNumberInput(event: Event & { target: NumberField }): void {\n const { value } = event.target;\n if (event.target?.stepperActive && !isNaN(value)) {\n this.value = value;\n return;\n }\n // Do not apply uncommited values to the parent element unless interacting with the stepper UI.\n // Stop uncommited input from being annoucned to the parent application.\n event.stopPropagation();\n }\n\n private handleNumberChange(event: Event & { target: NumberField }): void {\n const { value } = event.target;\n if (isNaN(value)) {\n event.target.value = this.value;\n event.stopPropagation();\n } else {\n this.value = value;\n if (!event.target?.stepperActive) {\n // When stepper is not active, sythesize an `input` event so that the\n // `change` event isn't surprising.\n this.dispatchInputEvent();\n }\n }\n }\n\n private trackSegmentStyles(start: number, end: number): StyleInfo {\n const size = end - start;\n const styles: StyleInfo = {\n width: `${size * 100}%`,\n '--spectrum-slider-track-background-size': `${(1 / size) * 100}%`,\n '--spectrum-slider-track-segment-position': `${start * 100}%`,\n };\n return styles;\n }\n\n private _numberFieldInput: Promise<unknown> = Promise.resolve();\n\n protected async getUpdateComplete(): Promise<boolean> {\n const complete = (await super.getUpdateComplete()) as boolean;\n if (this.editable) {\n await this._numberFieldInput;\n await this.numberField.updateComplete;\n }\n await this.handleController.handleUpdatesComplete();\n return complete;\n }\n}\n"]}
|
package/src/SliderHandle.d.ts
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { PropertyValues } from '@spectrum-web-components/base';
|
|
2
|
-
import { Focusable } from '@spectrum-web-components/shared/src/focusable.js';
|
|
3
|
-
import { NumberFormatOptions, NumberFormatter } from '@internationalized/number';
|
|
4
|
-
export declare type HandleMin = number | 'previous';
|
|
5
|
-
export declare type HandleMax = number | 'next';
|
|
6
|
-
export declare type HandleValues = {
|
|
7
|
-
name: string;
|
|
8
|
-
value: number;
|
|
9
|
-
}[];
|
|
10
|
-
export interface Controller {
|
|
11
|
-
inputForHandle(handle: SliderHandle): HTMLInputElement | undefined;
|
|
12
|
-
requestUpdate(): void;
|
|
13
|
-
setValueFromHandle(handle: SliderHandle): void;
|
|
14
|
-
handleHasChanged(handle: SliderHandle): void;
|
|
15
|
-
}
|
|
16
|
-
export declare type SliderNormalization = {
|
|
17
|
-
toNormalized: (value: number, min: number, max: number) => number;
|
|
18
|
-
fromNormalized: (value: number, min: number, max: number) => number;
|
|
19
|
-
};
|
|
20
|
-
export declare const defaultNormalization: SliderNormalization;
|
|
21
|
-
/**
|
|
22
|
-
* @element sp-slider-handle
|
|
23
|
-
*
|
|
24
|
-
* @fires input - The value of the element has changed.
|
|
25
|
-
* @fires change - An alteration to the value of the element has been committed by the user.
|
|
26
|
-
*/
|
|
27
|
-
export declare class SliderHandle extends Focusable {
|
|
28
|
-
handleController?: Controller;
|
|
29
|
-
get handleName(): string;
|
|
30
|
-
get focusElement(): HTMLElement;
|
|
31
|
-
_forcedUnit: string;
|
|
32
|
-
value: number;
|
|
33
|
-
dragging: boolean;
|
|
34
|
-
highlight: boolean;
|
|
35
|
-
name: string;
|
|
36
|
-
min?: number | 'previous';
|
|
37
|
-
max?: number | 'next';
|
|
38
|
-
private resolvedLanguage;
|
|
39
|
-
step?: number;
|
|
40
|
-
formatOptions?: NumberFormatOptions;
|
|
41
|
-
label: string;
|
|
42
|
-
getAriaHandleText: (value: number, numberFormat: NumberFormatter) => string;
|
|
43
|
-
protected update(changes: PropertyValues): void;
|
|
44
|
-
protected updated(changedProperties: PropertyValues<this>): void;
|
|
45
|
-
protected firstUpdated(changedProperties: PropertyValues<this>): void;
|
|
46
|
-
normalization: SliderNormalization;
|
|
47
|
-
dispatchInputEvent(): void;
|
|
48
|
-
protected _numberFormatCache: {
|
|
49
|
-
numberFormat: NumberFormatter;
|
|
50
|
-
language: string;
|
|
51
|
-
} | undefined;
|
|
52
|
-
protected getNumberFormat(): Intl.NumberFormat;
|
|
53
|
-
get numberFormat(): NumberFormatter | undefined;
|
|
54
|
-
connectedCallback(): void;
|
|
55
|
-
disconnectedCallback(): void;
|
|
56
|
-
private resolveLanguage;
|
|
57
|
-
}
|
package/src/SliderHandle.js
DELETED
|
@@ -1,192 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
Copyright 2021 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 { __decorate, __rest } from "tslib";
|
|
13
|
-
import { property } from '@spectrum-web-components/base/src/decorators.js';
|
|
14
|
-
import { Focusable } from '@spectrum-web-components/shared/src/focusable.js';
|
|
15
|
-
import { NumberFormatter, } from '@internationalized/number';
|
|
16
|
-
export const defaultNormalization = {
|
|
17
|
-
toNormalized(value, min, max) {
|
|
18
|
-
return (value - min) / (max - min);
|
|
19
|
-
},
|
|
20
|
-
fromNormalized(value, min, max) {
|
|
21
|
-
return value * (max - min) + min;
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
const MinConverter = {
|
|
25
|
-
fromAttribute: (value) => {
|
|
26
|
-
if (value === 'previous')
|
|
27
|
-
return value;
|
|
28
|
-
return parseFloat(value);
|
|
29
|
-
},
|
|
30
|
-
toAttribute: (value) => {
|
|
31
|
-
return value.toString();
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
const MaxConverter = {
|
|
35
|
-
fromAttribute: (value) => {
|
|
36
|
-
if (value === 'next')
|
|
37
|
-
return value;
|
|
38
|
-
return parseFloat(value);
|
|
39
|
-
},
|
|
40
|
-
toAttribute: (value) => {
|
|
41
|
-
return value.toString();
|
|
42
|
-
},
|
|
43
|
-
};
|
|
44
|
-
/**
|
|
45
|
-
* @element sp-slider-handle
|
|
46
|
-
*
|
|
47
|
-
* @fires input - The value of the element has changed.
|
|
48
|
-
* @fires change - An alteration to the value of the element has been committed by the user.
|
|
49
|
-
*/
|
|
50
|
-
export class SliderHandle extends Focusable {
|
|
51
|
-
constructor() {
|
|
52
|
-
super(...arguments);
|
|
53
|
-
this._forcedUnit = '';
|
|
54
|
-
this.value = 10;
|
|
55
|
-
this.dragging = false;
|
|
56
|
-
this.highlight = false;
|
|
57
|
-
this.name = '';
|
|
58
|
-
this.resolvedLanguage = document.documentElement.lang || navigator.language;
|
|
59
|
-
this.label = '';
|
|
60
|
-
this.getAriaHandleText = (value, numberFormat) => {
|
|
61
|
-
return numberFormat.format(value);
|
|
62
|
-
};
|
|
63
|
-
this.normalization = defaultNormalization;
|
|
64
|
-
}
|
|
65
|
-
get handleName() {
|
|
66
|
-
return this.name;
|
|
67
|
-
}
|
|
68
|
-
get focusElement() {
|
|
69
|
-
var _a, _b;
|
|
70
|
-
/* c8 ignore next */
|
|
71
|
-
return (_b = (_a = this.handleController) === null || _a === void 0 ? void 0 : _a.inputForHandle(this)) !== null && _b !== void 0 ? _b : this;
|
|
72
|
-
}
|
|
73
|
-
update(changes) {
|
|
74
|
-
if (changes.has('formatOptions') || changes.has('resolvedLanguage')) {
|
|
75
|
-
delete this._numberFormatCache;
|
|
76
|
-
}
|
|
77
|
-
super.update(changes);
|
|
78
|
-
}
|
|
79
|
-
updated(changedProperties) {
|
|
80
|
-
var _a, _b;
|
|
81
|
-
if (changedProperties.has('value')) {
|
|
82
|
-
const oldValue = changedProperties.get('value');
|
|
83
|
-
if (oldValue != null) {
|
|
84
|
-
(_a = this.handleController /* c8 ignore next */) === null || _a === void 0 ? void 0 : _a.setValueFromHandle(this);
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
(_b = this.handleController) === null || _b === void 0 ? void 0 : _b.handleHasChanged(this);
|
|
88
|
-
super.updated(changedProperties);
|
|
89
|
-
}
|
|
90
|
-
firstUpdated(changedProperties) {
|
|
91
|
-
super.firstUpdated(changedProperties);
|
|
92
|
-
this.dispatchEvent(new CustomEvent('sp-slider-handle-ready'));
|
|
93
|
-
}
|
|
94
|
-
dispatchInputEvent() {
|
|
95
|
-
const inputEvent = new Event('input', {
|
|
96
|
-
bubbles: true,
|
|
97
|
-
composed: true,
|
|
98
|
-
});
|
|
99
|
-
this.dispatchEvent(inputEvent);
|
|
100
|
-
}
|
|
101
|
-
getNumberFormat() {
|
|
102
|
-
var _a;
|
|
103
|
-
/* c8 ignore next */
|
|
104
|
-
if (!this._numberFormatCache ||
|
|
105
|
-
this.resolvedLanguage !== this._numberFormatCache.language) {
|
|
106
|
-
let numberFormatter;
|
|
107
|
-
try {
|
|
108
|
-
numberFormatter = new NumberFormatter(this.resolvedLanguage, this.formatOptions);
|
|
109
|
-
this._forcedUnit = '';
|
|
110
|
-
// numberFormatter.format(1);
|
|
111
|
-
}
|
|
112
|
-
catch (error) {
|
|
113
|
-
const _b = this.formatOptions || {}, { style, unit,
|
|
114
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
115
|
-
unitDisplay } = _b, formatOptionsNoUnit = __rest(_b, ["style", "unit", "unitDisplay"]);
|
|
116
|
-
if (style === 'unit') {
|
|
117
|
-
this._forcedUnit = unit;
|
|
118
|
-
}
|
|
119
|
-
numberFormatter = new NumberFormatter(this.resolvedLanguage, formatOptionsNoUnit);
|
|
120
|
-
}
|
|
121
|
-
this._numberFormatCache = {
|
|
122
|
-
language: this.resolvedLanguage,
|
|
123
|
-
numberFormat: numberFormatter,
|
|
124
|
-
};
|
|
125
|
-
}
|
|
126
|
-
/* c8 ignore next */
|
|
127
|
-
return (_a = this._numberFormatCache) === null || _a === void 0 ? void 0 : _a.numberFormat;
|
|
128
|
-
}
|
|
129
|
-
get numberFormat() {
|
|
130
|
-
if (!this.formatOptions)
|
|
131
|
-
return;
|
|
132
|
-
return this.getNumberFormat();
|
|
133
|
-
}
|
|
134
|
-
connectedCallback() {
|
|
135
|
-
super.connectedCallback();
|
|
136
|
-
this.resolveLanguage();
|
|
137
|
-
}
|
|
138
|
-
disconnectedCallback() {
|
|
139
|
-
this.resolveLanguage();
|
|
140
|
-
super.disconnectedCallback();
|
|
141
|
-
}
|
|
142
|
-
resolveLanguage() {
|
|
143
|
-
const queryThemeEvent = new CustomEvent('sp-language-context', {
|
|
144
|
-
bubbles: true,
|
|
145
|
-
composed: true,
|
|
146
|
-
detail: {
|
|
147
|
-
callback: (lang) => {
|
|
148
|
-
this.resolvedLanguage = lang;
|
|
149
|
-
},
|
|
150
|
-
},
|
|
151
|
-
cancelable: true,
|
|
152
|
-
});
|
|
153
|
-
this.dispatchEvent(queryThemeEvent);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
__decorate([
|
|
157
|
-
property({ type: Number })
|
|
158
|
-
], SliderHandle.prototype, "value", void 0);
|
|
159
|
-
__decorate([
|
|
160
|
-
property({ type: Boolean, reflect: true })
|
|
161
|
-
], SliderHandle.prototype, "dragging", void 0);
|
|
162
|
-
__decorate([
|
|
163
|
-
property({ type: Boolean })
|
|
164
|
-
], SliderHandle.prototype, "highlight", void 0);
|
|
165
|
-
__decorate([
|
|
166
|
-
property({ type: String })
|
|
167
|
-
], SliderHandle.prototype, "name", void 0);
|
|
168
|
-
__decorate([
|
|
169
|
-
property({ reflect: true, converter: MinConverter })
|
|
170
|
-
], SliderHandle.prototype, "min", void 0);
|
|
171
|
-
__decorate([
|
|
172
|
-
property({ reflect: true, converter: MaxConverter })
|
|
173
|
-
], SliderHandle.prototype, "max", void 0);
|
|
174
|
-
__decorate([
|
|
175
|
-
property({ attribute: false })
|
|
176
|
-
], SliderHandle.prototype, "resolvedLanguage", void 0);
|
|
177
|
-
__decorate([
|
|
178
|
-
property({ type: Number, reflect: true })
|
|
179
|
-
], SliderHandle.prototype, "step", void 0);
|
|
180
|
-
__decorate([
|
|
181
|
-
property({ type: Object, attribute: 'format-options' })
|
|
182
|
-
], SliderHandle.prototype, "formatOptions", void 0);
|
|
183
|
-
__decorate([
|
|
184
|
-
property({ type: String })
|
|
185
|
-
], SliderHandle.prototype, "label", void 0);
|
|
186
|
-
__decorate([
|
|
187
|
-
property({ attribute: false })
|
|
188
|
-
], SliderHandle.prototype, "getAriaHandleText", void 0);
|
|
189
|
-
__decorate([
|
|
190
|
-
property({ attribute: false })
|
|
191
|
-
], SliderHandle.prototype, "normalization", void 0);
|
|
192
|
-
//# sourceMappingURL=SliderHandle.js.map
|