@warp-ds/elements 2.5.0-next.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/custom-elements.json +80 -2535
- package/dist/index.d.ts +51 -1279
- package/dist/packages/icon/icon.d.ts +0 -5
- package/dist/packages/icon/icon.js +24 -98
- package/dist/packages/icon/icon.js.map +7 -0
- package/dist/web-types.json +36 -683
- package/package.json +12 -60
- package/dist/packages/checkbox/checkbox.d.ts +0 -66
- package/dist/packages/checkbox/checkbox.js +0 -2591
- package/dist/packages/checkbox/checkbox.js.map +0 -7
- package/dist/packages/checkbox/checkbox.react.stories.d.ts +0 -12
- package/dist/packages/checkbox/checkbox.react.stories.js +0 -10
- package/dist/packages/checkbox/checkbox.stories.d.ts +0 -12
- package/dist/packages/checkbox/checkbox.stories.js +0 -26
- package/dist/packages/checkbox/react.d.ts +0 -5
- package/dist/packages/checkbox/react.js +0 -15
- package/dist/packages/checkbox/styles.d.ts +0 -0
- package/dist/packages/checkbox/styles.js +0 -0
- package/dist/packages/checkbox-group/checkbox-group.d.ts +0 -10
- package/dist/packages/checkbox-group/checkbox-group.js +0 -7
- package/dist/packages/checkbox-group/checkbox-group.js.map +0 -7
- package/dist/packages/checkbox-group/react.d.ts +0 -2
- package/dist/packages/checkbox-group/react.js +0 -11
- package/dist/packages/dead-toggle/dead-toggle.d.ts +0 -17
- package/dist/packages/dead-toggle/dead-toggle.js +0 -2547
- package/dist/packages/dead-toggle/dead-toggle.js.map +0 -7
- package/dist/packages/dead-toggle/dead-toggle.react.stories.d.ts +0 -15
- package/dist/packages/dead-toggle/dead-toggle.react.stories.js +0 -34
- package/dist/packages/dead-toggle/dead-toggle.stories.d.ts +0 -14
- package/dist/packages/dead-toggle/dead-toggle.stories.js +0 -45
- package/dist/packages/dead-toggle/dead-toggle.test.d.ts +0 -1
- package/dist/packages/dead-toggle/dead-toggle.test.js +0 -9
- package/dist/packages/dead-toggle/react.d.ts +0 -2
- package/dist/packages/dead-toggle/react.js +0 -11
- package/dist/packages/pagination/locales/da/messages.d.mts +0 -1
- package/dist/packages/pagination/locales/da/messages.mjs +0 -1
- package/dist/packages/pagination/locales/en/messages.d.mts +0 -1
- package/dist/packages/pagination/locales/en/messages.mjs +0 -1
- package/dist/packages/pagination/locales/fi/messages.d.mts +0 -1
- package/dist/packages/pagination/locales/fi/messages.mjs +0 -1
- package/dist/packages/pagination/locales/nb/messages.d.mts +0 -1
- package/dist/packages/pagination/locales/nb/messages.mjs +0 -1
- package/dist/packages/pagination/locales/sv/messages.d.mts +0 -1
- package/dist/packages/pagination/locales/sv/messages.mjs +0 -1
- package/dist/packages/pagination/pagination.d.ts +0 -32
- package/dist/packages/pagination/pagination.js +0 -2500
- package/dist/packages/pagination/pagination.js.map +0 -7
- package/dist/packages/pagination/pagination.react.stories.d.ts +0 -21
- package/dist/packages/pagination/pagination.react.stories.js +0 -45
- package/dist/packages/pagination/pagination.stories.d.ts +0 -14
- package/dist/packages/pagination/pagination.stories.js +0 -56
- package/dist/packages/pagination/pagination.test.d.ts +0 -1
- package/dist/packages/pagination/pagination.test.js +0 -76
- package/dist/packages/pagination/react.d.ts +0 -5
- package/dist/packages/pagination/react.js +0 -15
- package/dist/packages/pagination/styles.d.ts +0 -1
- package/dist/packages/pagination/styles.js +0 -2
- package/dist/packages/radio/base-element.d.ts +0 -46
- package/dist/packages/radio/base-element.js +0 -100
- package/dist/packages/radio/custom-error-validator.d.ts +0 -6
- package/dist/packages/radio/custom-error-validator.js +0 -22
- package/dist/packages/radio/form-associated-element.d.ts +0 -103
- package/dist/packages/radio/form-associated-element.js +0 -282
- package/dist/packages/radio/host-styles.d.ts +0 -1
- package/dist/packages/radio/host-styles.js +0 -12
- package/dist/packages/radio/invalid.d.ts +0 -8
- package/dist/packages/radio/invalid.js +0 -5
- package/dist/packages/radio/math.d.ts +0 -1
- package/dist/packages/radio/math.js +0 -4
- package/dist/packages/radio/radio-styles.d.ts +0 -0
- package/dist/packages/radio/radio-styles.js +0 -0
- package/dist/packages/radio/radio.d.ts +0 -38
- package/dist/packages/radio/radio.js +0 -2562
- package/dist/packages/radio/radio.js.map +0 -7
- package/dist/packages/radio/radio.react.stories.d.ts +0 -9
- package/dist/packages/radio/radio.react.stories.js +0 -10
- package/dist/packages/radio/radio.stories.d.ts +0 -15
- package/dist/packages/radio/radio.stories.js +0 -61
- package/dist/packages/radio/react.d.ts +0 -2
- package/dist/packages/radio/react.js +0 -11
- package/dist/packages/radio/required-validator.d.ts +0 -11
- package/dist/packages/radio/required-validator.js +0 -34
- package/dist/packages/radio/slot.d.ts +0 -20
- package/dist/packages/radio/slot.js +0 -71
- package/dist/packages/radio/watch.d.ts +0 -26
- package/dist/packages/radio/watch.js +0 -39
- package/dist/packages/radio-group/radio-group-styles.d.ts +0 -1
- package/dist/packages/radio-group/radio-group-styles.js +0 -59
- package/dist/packages/radio-group/radio-group.d.ts +0 -72
- package/dist/packages/radio-group/radio-group.js +0 -2648
- package/dist/packages/radio-group/radio-group.js.map +0 -7
- package/dist/packages/radio-group/react.d.ts +0 -7
- package/dist/packages/radio-group/react.js +0 -17
- package/dist/packages/slider/Slider.d.ts +0 -2
- package/dist/packages/slider/Slider.js +0 -8
- package/dist/packages/slider/index.d.ts +0 -2
- package/dist/packages/slider/index.js +0 -2
- package/dist/packages/slider/locales/da/messages.d.mts +0 -1
- package/dist/packages/slider/locales/da/messages.mjs +0 -1
- package/dist/packages/slider/locales/en/messages.d.mts +0 -1
- package/dist/packages/slider/locales/en/messages.mjs +0 -1
- package/dist/packages/slider/locales/fi/messages.d.mts +0 -1
- package/dist/packages/slider/locales/fi/messages.mjs +0 -1
- package/dist/packages/slider/locales/nb/messages.d.mts +0 -1
- package/dist/packages/slider/locales/nb/messages.mjs +0 -1
- package/dist/packages/slider/locales/sv/messages.d.mts +0 -1
- package/dist/packages/slider/locales/sv/messages.mjs +0 -1
- package/dist/packages/slider/react.d.ts +0 -3
- package/dist/packages/slider/react.js +0 -13
- package/dist/packages/slider/slider.d.ts +0 -55
- package/dist/packages/slider/slider.js +0 -2632
- package/dist/packages/slider/slider.js.map +0 -7
- package/dist/packages/slider/slider.react.stories.d.ts +0 -19
- package/dist/packages/slider/slider.react.stories.js +0 -140
- package/dist/packages/slider/slider.stories.d.ts +0 -22
- package/dist/packages/slider/slider.stories.js +0 -405
- package/dist/packages/slider/slider.test.d.ts +0 -5
- package/dist/packages/slider/slider.test.js +0 -112
- package/dist/packages/slider/styles/w-slider.styles.d.ts +0 -1
- package/dist/packages/slider/styles/w-slider.styles.js +0 -148
- package/dist/packages/slider/styles.d.ts +0 -1
- package/dist/packages/slider/styles.js +0 -2
- package/dist/packages/slider-thumb/SliderThumb.d.ts +0 -2
- package/dist/packages/slider-thumb/SliderThumb.js +0 -8
- package/dist/packages/slider-thumb/oddbird-css-anchor-positioning.d.ts +0 -2
- package/dist/packages/slider-thumb/oddbird-css-anchor-positioning.js +0 -3
- package/dist/packages/slider-thumb/react.d.ts +0 -6
- package/dist/packages/slider-thumb/react.js +0 -15
- package/dist/packages/slider-thumb/slider-thumb.d.ts +0 -63
- package/dist/packages/slider-thumb/slider-thumb.js +0 -2748
- package/dist/packages/slider-thumb/slider-thumb.js.map +0 -7
- package/dist/packages/slider-thumb/styles/w-slider-thumb.styles.d.ts +0 -1
- package/dist/packages/slider-thumb/styles/w-slider-thumb.styles.js +0 -175
- package/dist/packages/step/locales/da/messages.d.mts +0 -1
- package/dist/packages/step/locales/da/messages.mjs +0 -1
- package/dist/packages/step/locales/en/messages.d.mts +0 -1
- package/dist/packages/step/locales/en/messages.mjs +0 -1
- package/dist/packages/step/locales/fi/messages.d.mts +0 -1
- package/dist/packages/step/locales/fi/messages.mjs +0 -1
- package/dist/packages/step/locales/nb/messages.d.mts +0 -1
- package/dist/packages/step/locales/nb/messages.mjs +0 -1
- package/dist/packages/step/locales/sv/messages.d.mts +0 -1
- package/dist/packages/step/locales/sv/messages.mjs +0 -1
- package/dist/packages/step/react.d.ts +0 -2
- package/dist/packages/step/react.js +0 -11
- package/dist/packages/step/step.d.ts +0 -22
- package/dist/packages/step/step.js +0 -2461
- package/dist/packages/step/step.js.map +0 -7
- package/dist/packages/step-indicator/index.d.ts +0 -2
- package/dist/packages/step-indicator/index.js +0 -2
- package/dist/packages/step-indicator/react.d.ts +0 -3
- package/dist/packages/step-indicator/react.js +0 -13
- package/dist/packages/step-indicator/step-indicator.d.ts +0 -14
- package/dist/packages/step-indicator/step-indicator.js +0 -2445
- package/dist/packages/step-indicator/step-indicator.js.map +0 -7
- package/dist/packages/step-indicator/stepindicator.react.stories.d.ts +0 -15
- package/dist/packages/step-indicator/stepindicator.react.stories.js +0 -112
- package/dist/packages/step-indicator/stepindicator.stories.d.ts +0 -13
- package/dist/packages/step-indicator/stepindicator.stories.js +0 -173
- package/dist/packages/step-indicator/styles.d.ts +0 -1
- package/dist/packages/step-indicator/styles.js +0 -2
- package/dist/packages/textarea/locales/da/messages.d.mts +0 -1
- package/dist/packages/textarea/locales/da/messages.mjs +0 -1
- package/dist/packages/textarea/locales/en/messages.d.mts +0 -1
- package/dist/packages/textarea/locales/en/messages.mjs +0 -1
- package/dist/packages/textarea/locales/fi/messages.d.mts +0 -1
- package/dist/packages/textarea/locales/fi/messages.mjs +0 -1
- package/dist/packages/textarea/locales/nb/messages.d.mts +0 -1
- package/dist/packages/textarea/locales/nb/messages.mjs +0 -1
- package/dist/packages/textarea/locales/sv/messages.d.mts +0 -1
- package/dist/packages/textarea/locales/sv/messages.mjs +0 -1
- package/dist/packages/textarea/react.d.ts +0 -11
- package/dist/packages/textarea/react.js +0 -21
- package/dist/packages/textarea/styles.d.ts +0 -1
- package/dist/packages/textarea/styles.js +0 -2
- package/dist/packages/textarea/textarea.d.ts +0 -49
- package/dist/packages/textarea/textarea.js +0 -2475
- package/dist/packages/textarea/textarea.js.map +0 -7
- package/dist/packages/textarea/textarea.react.stories.d.ts +0 -33
- package/dist/packages/textarea/textarea.react.stories.js +0 -41
- package/dist/packages/textarea/textarea.stories.d.ts +0 -19
- package/dist/packages/textarea/textarea.stories.js +0 -85
- package/dist/packages/textarea/textarea.test.d.ts +0 -1
- package/dist/packages/textarea/textarea.test.js +0 -68
- package/dist/packages/toggle-styles.d.ts +0 -1
- package/dist/packages/toggle-styles.js +0 -108
|
@@ -1,405 +0,0 @@
|
|
|
1
|
-
import { getStorybookHelpers } from '@wc-toolkit/storybook-helpers';
|
|
2
|
-
import { html } from 'lit';
|
|
3
|
-
import '../affix/affix.js';
|
|
4
|
-
import '../attention/attention.js';
|
|
5
|
-
import '../textfield/textfield.js';
|
|
6
|
-
import './slider.js';
|
|
7
|
-
import '../slider-thumb/slider-thumb.js';
|
|
8
|
-
const { events: sliderEvents, args: sliderArgs, argTypes: sliderArgTypes, } = getStorybookHelpers('w-slider');
|
|
9
|
-
const meta = {
|
|
10
|
-
title: 'Forms/Slider and Range Slider',
|
|
11
|
-
args: sliderArgs,
|
|
12
|
-
argTypes: sliderArgTypes,
|
|
13
|
-
parameters: {
|
|
14
|
-
actions: {
|
|
15
|
-
handles: sliderEvents,
|
|
16
|
-
},
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
export default meta;
|
|
20
|
-
export const Single = {
|
|
21
|
-
render() {
|
|
22
|
-
return html `
|
|
23
|
-
<w-slider label="Single" min="0" max="100">
|
|
24
|
-
<w-slider-thumb name="value"></w-slider-thumb>
|
|
25
|
-
</w-slider>
|
|
26
|
-
`;
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
export const Range = {
|
|
30
|
-
render() {
|
|
31
|
-
return html `
|
|
32
|
-
<w-slider label="Range" min="0" max="100" step="25">
|
|
33
|
-
<w-slider-thumb
|
|
34
|
-
slot="from"
|
|
35
|
-
aria-label="From value"
|
|
36
|
-
name="from"
|
|
37
|
-
></w-slider-thumb>
|
|
38
|
-
<w-slider-thumb
|
|
39
|
-
slot="to"
|
|
40
|
-
aria-label="To value"
|
|
41
|
-
name="to"
|
|
42
|
-
></w-slider-thumb>
|
|
43
|
-
</w-slider>
|
|
44
|
-
`;
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
// Take a suffix attribute on `<w-slider>` I think, have `<w-slider-thumb>` get from that.
|
|
48
|
-
export const SuffixSquareMeters = {
|
|
49
|
-
args: {
|
|
50
|
-
locale: 'nb',
|
|
51
|
-
suffix: 'm²',
|
|
52
|
-
},
|
|
53
|
-
render({ locale, suffix }) {
|
|
54
|
-
return html `
|
|
55
|
-
<w-slider
|
|
56
|
-
label="Apartment size"
|
|
57
|
-
min="0"
|
|
58
|
-
max="250"
|
|
59
|
-
suffix="${suffix}"
|
|
60
|
-
data-testid="sqm"
|
|
61
|
-
>
|
|
62
|
-
<w-slider-thumb
|
|
63
|
-
slot="from"
|
|
64
|
-
aria-label="From size"
|
|
65
|
-
name="from"
|
|
66
|
-
></w-slider-thumb>
|
|
67
|
-
<w-slider-thumb
|
|
68
|
-
slot="to"
|
|
69
|
-
aria-label="To size"
|
|
70
|
-
name="to"
|
|
71
|
-
></w-slider-thumb>
|
|
72
|
-
</w-slider>
|
|
73
|
-
<script type="module">
|
|
74
|
-
const sqmSlider = document.querySelector('w-slider[data-testid="sqm"]');
|
|
75
|
-
sqmSlider.formatter = window.getNumberFormatter("${locale}").format;
|
|
76
|
-
</script>
|
|
77
|
-
`;
|
|
78
|
-
},
|
|
79
|
-
};
|
|
80
|
-
export const SuffixCurrency = {
|
|
81
|
-
args: {
|
|
82
|
-
locale: 'nb',
|
|
83
|
-
suffix: 'kr',
|
|
84
|
-
},
|
|
85
|
-
render({ locale, suffix }) {
|
|
86
|
-
return html `
|
|
87
|
-
<w-slider
|
|
88
|
-
label="Price"
|
|
89
|
-
min="0"
|
|
90
|
-
max="250000"
|
|
91
|
-
suffix="${suffix}"
|
|
92
|
-
data-testid="currency"
|
|
93
|
-
>
|
|
94
|
-
<w-slider-thumb
|
|
95
|
-
slot="from"
|
|
96
|
-
aria-label="From price"
|
|
97
|
-
name="from"
|
|
98
|
-
></w-slider-thumb>
|
|
99
|
-
<w-slider-thumb
|
|
100
|
-
slot="to"
|
|
101
|
-
aria-label="To price"
|
|
102
|
-
name="to"
|
|
103
|
-
></w-slider-thumb>
|
|
104
|
-
</w-slider>
|
|
105
|
-
<script type="module">
|
|
106
|
-
const currencySlider = document.querySelector(
|
|
107
|
-
'w-slider[data-testid="currency"]'
|
|
108
|
-
);
|
|
109
|
-
currencySlider.formatter = window.getNumberFormatter(
|
|
110
|
-
"${locale}"
|
|
111
|
-
).format;
|
|
112
|
-
</script>
|
|
113
|
-
`;
|
|
114
|
-
},
|
|
115
|
-
};
|
|
116
|
-
export const SuffixKilometers = {
|
|
117
|
-
args: {
|
|
118
|
-
locale: 'nb',
|
|
119
|
-
suffix: 'km',
|
|
120
|
-
},
|
|
121
|
-
render({ locale, suffix }) {
|
|
122
|
-
return html `
|
|
123
|
-
<w-slider
|
|
124
|
-
label="Distance"
|
|
125
|
-
min="0"
|
|
126
|
-
max="250000"
|
|
127
|
-
suffix="${suffix}"
|
|
128
|
-
data-testid="km"
|
|
129
|
-
>
|
|
130
|
-
<w-slider-thumb
|
|
131
|
-
slot="from"
|
|
132
|
-
aria-label="From distance"
|
|
133
|
-
name="from"
|
|
134
|
-
></w-slider-thumb>
|
|
135
|
-
<w-slider-thumb
|
|
136
|
-
slot="to"
|
|
137
|
-
aria-label="To distance"
|
|
138
|
-
name="to"
|
|
139
|
-
></w-slider-thumb>
|
|
140
|
-
</w-slider>
|
|
141
|
-
<script type="module">
|
|
142
|
-
const kmSlider = document.querySelector('w-slider[data-testid="km"]');
|
|
143
|
-
kmSlider.formatter = window.getNumberFormatter("${locale}").format;
|
|
144
|
-
</script>
|
|
145
|
-
`;
|
|
146
|
-
},
|
|
147
|
-
};
|
|
148
|
-
export const Marks = {
|
|
149
|
-
args: {
|
|
150
|
-
locale: 'nb',
|
|
151
|
-
step: '5',
|
|
152
|
-
markers: '5',
|
|
153
|
-
},
|
|
154
|
-
render({ markers, step }) {
|
|
155
|
-
return html `
|
|
156
|
-
<w-slider
|
|
157
|
-
label="Single"
|
|
158
|
-
min="0"
|
|
159
|
-
max="100"
|
|
160
|
-
step="${step}"
|
|
161
|
-
markers="${markers}"
|
|
162
|
-
>
|
|
163
|
-
<w-slider-thumb name="value"></w-slider-thumb>
|
|
164
|
-
</w-slider>
|
|
165
|
-
`;
|
|
166
|
-
},
|
|
167
|
-
};
|
|
168
|
-
export const Step = {
|
|
169
|
-
args: {
|
|
170
|
-
step: 5,
|
|
171
|
-
},
|
|
172
|
-
render({ step }) {
|
|
173
|
-
return html `
|
|
174
|
-
<w-slider label="Single" step="${step}" min="0" max="100">
|
|
175
|
-
<w-slider-thumb name="value"></w-slider-thumb>
|
|
176
|
-
</w-slider>
|
|
177
|
-
`;
|
|
178
|
-
},
|
|
179
|
-
};
|
|
180
|
-
export const OverUnder = {
|
|
181
|
-
args: {},
|
|
182
|
-
render() {
|
|
183
|
-
return html `
|
|
184
|
-
<form id="overunder" style="margin-bottom: 16px" lang="nb">
|
|
185
|
-
<w-slider
|
|
186
|
-
label="Produksjonsår"
|
|
187
|
-
min="1950"
|
|
188
|
-
max="2025"
|
|
189
|
-
data-testid="overunder"
|
|
190
|
-
allow-values-outside-range
|
|
191
|
-
>
|
|
192
|
-
<w-slider-thumb
|
|
193
|
-
slot="from"
|
|
194
|
-
aria-label="Fra år"
|
|
195
|
-
aria-description="1950 inkluderer kjøretøy produsert fram til 1950"
|
|
196
|
-
name="from"
|
|
197
|
-
></w-slider-thumb>
|
|
198
|
-
<w-slider-thumb
|
|
199
|
-
slot="to"
|
|
200
|
-
aria-label="Til år"
|
|
201
|
-
aria-description="2025 inkluderer kjøretøy produsert etter 2025"
|
|
202
|
-
name="to"
|
|
203
|
-
></w-slider-thumb>
|
|
204
|
-
</w-slider>
|
|
205
|
-
</form>
|
|
206
|
-
<p>
|
|
207
|
-
Drag the slider to show the value below. See the Code tab for how to
|
|
208
|
-
format the labels.
|
|
209
|
-
</p>
|
|
210
|
-
<output>
|
|
211
|
-
<dl>
|
|
212
|
-
<dt>From:</dt>
|
|
213
|
-
<dd id="overunder-from"></dd>
|
|
214
|
-
<dt>To:</dt>
|
|
215
|
-
<dd id="overunder-to"></dd>
|
|
216
|
-
</dl>
|
|
217
|
-
</output>
|
|
218
|
-
<script>
|
|
219
|
-
/** Here is how you can show labels to indicate min and max values are "up to and including" and "this value and above". */
|
|
220
|
-
const overunderSlider = document.querySelector(
|
|
221
|
-
'w-slider[data-testid="overunder"]'
|
|
222
|
-
);
|
|
223
|
-
overunderSlider.formatter = function (value, type) {
|
|
224
|
-
if (value === "" && type === "from") {
|
|
225
|
-
return "Før 1950";
|
|
226
|
-
}
|
|
227
|
-
if (value === "" && type === "to") {
|
|
228
|
-
return "Etter 2025";
|
|
229
|
-
}
|
|
230
|
-
return value;
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
/** Code to show the form values in output */
|
|
234
|
-
document.forms["overunder"].addEventListener("input", function () {
|
|
235
|
-
const formData = new FormData(this);
|
|
236
|
-
const from = formData.get("from");
|
|
237
|
-
const to = formData.get("to");
|
|
238
|
-
document.getElementById("overunder-from").innerText = from;
|
|
239
|
-
document.getElementById("overunder-to").innerText = to;
|
|
240
|
-
});
|
|
241
|
-
</script>
|
|
242
|
-
`;
|
|
243
|
-
},
|
|
244
|
-
};
|
|
245
|
-
export const SingleError = {
|
|
246
|
-
args: {
|
|
247
|
-
locale: 'nb',
|
|
248
|
-
},
|
|
249
|
-
render() {
|
|
250
|
-
return html `
|
|
251
|
-
<w-slider label="Single" min="0" max="100">
|
|
252
|
-
<p slot="description">Try typing a value over 100</p>
|
|
253
|
-
<w-slider-thumb></w-slider-thumb>
|
|
254
|
-
</w-slider>
|
|
255
|
-
`;
|
|
256
|
-
},
|
|
257
|
-
};
|
|
258
|
-
export const RangeError = {
|
|
259
|
-
args: {},
|
|
260
|
-
render() {
|
|
261
|
-
return html `
|
|
262
|
-
<form id="rangeerror" style="margin-bottom: 16px">
|
|
263
|
-
<w-slider label="Production year" min="1950" max="2025" over under>
|
|
264
|
-
<p slot="description">
|
|
265
|
-
Try typing a from value higher than a to value
|
|
266
|
-
</p>
|
|
267
|
-
<w-slider-thumb slot="from" name="from"></w-slider-thumb>
|
|
268
|
-
<w-slider-thumb slot="to" name="to"></w-slider-thumb>
|
|
269
|
-
</w-slider>
|
|
270
|
-
</form>
|
|
271
|
-
<p>
|
|
272
|
-
Drag the slider to show the value below. See the Code tab for how to
|
|
273
|
-
format the labels.
|
|
274
|
-
</p>
|
|
275
|
-
<output>
|
|
276
|
-
<dl>
|
|
277
|
-
<dt>From:</dt>
|
|
278
|
-
<dd id="rangeerror-from"></dd>
|
|
279
|
-
<dt>To:</dt>
|
|
280
|
-
<dd id="rangeerror-to"></dd>
|
|
281
|
-
</dl>
|
|
282
|
-
</output>
|
|
283
|
-
<script>
|
|
284
|
-
/** Code to show the form values in output */
|
|
285
|
-
document.forms["rangeerror"].addEventListener("input", function () {
|
|
286
|
-
const formData = new FormData(this);
|
|
287
|
-
const from = formData.get("from");
|
|
288
|
-
const to = formData.get("to");
|
|
289
|
-
document.getElementById("rangeerror-from").innerText = from;
|
|
290
|
-
document.getElementById("rangeerror-to").innerText = to;
|
|
291
|
-
});
|
|
292
|
-
</script>
|
|
293
|
-
`;
|
|
294
|
-
},
|
|
295
|
-
};
|
|
296
|
-
export const TestCase = {
|
|
297
|
-
args: {},
|
|
298
|
-
render() {
|
|
299
|
-
return html `
|
|
300
|
-
<form id="overunder" style="margin-bottom: 16px" lang="nb">
|
|
301
|
-
<w-slider
|
|
302
|
-
label="Bredde"
|
|
303
|
-
suffix="cm"
|
|
304
|
-
min="200"
|
|
305
|
-
max="350"
|
|
306
|
-
data-testid="overunder"
|
|
307
|
-
allow-values-outside-range
|
|
308
|
-
step="50"
|
|
309
|
-
>
|
|
310
|
-
<w-slider-thumb
|
|
311
|
-
slot="from"
|
|
312
|
-
aria-label="Fra år"
|
|
313
|
-
aria-description="1950 inkluderer kjøretøy produsert fram til 1950"
|
|
314
|
-
name="from"
|
|
315
|
-
value=""
|
|
316
|
-
></w-slider-thumb>
|
|
317
|
-
<w-slider-thumb
|
|
318
|
-
slot="to"
|
|
319
|
-
aria-label="Til år"
|
|
320
|
-
aria-description="2025 inkluderer kjøretøy produsert etter 2025"
|
|
321
|
-
name="to"
|
|
322
|
-
value=""
|
|
323
|
-
></w-slider-thumb>
|
|
324
|
-
</w-slider>
|
|
325
|
-
</form>
|
|
326
|
-
<p>
|
|
327
|
-
Drag the slider to show the value below. See the Code tab for how to
|
|
328
|
-
format the labels.
|
|
329
|
-
</p>
|
|
330
|
-
<output>
|
|
331
|
-
<dl>
|
|
332
|
-
<dt>From:</dt>
|
|
333
|
-
<dd id="overunder-from"></dd>
|
|
334
|
-
<dt>To:</dt>
|
|
335
|
-
<dd id="overunder-to"></dd>
|
|
336
|
-
</dl>
|
|
337
|
-
</output>
|
|
338
|
-
<script>
|
|
339
|
-
/** Here is how you can show labels to indicate min and max values are "up to and including" and "this value and above". */
|
|
340
|
-
const overunderSlider = document.querySelector(
|
|
341
|
-
'w-slider[data-testid="overunder"]'
|
|
342
|
-
);
|
|
343
|
-
overunderSlider.formatter = function (value, type) {
|
|
344
|
-
if (value === "" && type === "from") {
|
|
345
|
-
return "Under 200";
|
|
346
|
-
}
|
|
347
|
-
if (value === "" && type === "to") {
|
|
348
|
-
return "Over 350";
|
|
349
|
-
}
|
|
350
|
-
return value;
|
|
351
|
-
};
|
|
352
|
-
|
|
353
|
-
/** Code to show the form values in output */
|
|
354
|
-
document.forms["overunder"].addEventListener("input", function () {
|
|
355
|
-
const formData = new FormData(this);
|
|
356
|
-
const from = formData.get("from");
|
|
357
|
-
const to = formData.get("to");
|
|
358
|
-
document.getElementById("overunder-from").innerText = from;
|
|
359
|
-
document.getElementById("overunder-to").innerText = to;
|
|
360
|
-
});
|
|
361
|
-
</script>
|
|
362
|
-
`;
|
|
363
|
-
},
|
|
364
|
-
};
|
|
365
|
-
export const CustomError = {
|
|
366
|
-
args: {
|
|
367
|
-
locale: 'nb',
|
|
368
|
-
},
|
|
369
|
-
render() {
|
|
370
|
-
return html `
|
|
371
|
-
<w-slider
|
|
372
|
-
label="Production year"
|
|
373
|
-
min="1950"
|
|
374
|
-
max="2025"
|
|
375
|
-
over
|
|
376
|
-
under
|
|
377
|
-
error="I'm an external error telling you something is wrong"
|
|
378
|
-
invalid
|
|
379
|
-
>
|
|
380
|
-
<w-slider-thumb slot="from" name="from"></w-slider-thumb>
|
|
381
|
-
<w-slider-thumb slot="to" name="to"></w-slider-thumb>
|
|
382
|
-
</w-slider>
|
|
383
|
-
`;
|
|
384
|
-
},
|
|
385
|
-
};
|
|
386
|
-
export const Description = {
|
|
387
|
-
args: {
|
|
388
|
-
locale: 'nb',
|
|
389
|
-
},
|
|
390
|
-
render() {
|
|
391
|
-
return html `
|
|
392
|
-
<w-slider
|
|
393
|
-
label="Production year"
|
|
394
|
-
min="1950"
|
|
395
|
-
max="2025"
|
|
396
|
-
over
|
|
397
|
-
under
|
|
398
|
-
help-text="Production year of the car"
|
|
399
|
-
>
|
|
400
|
-
<w-slider-thumb slot="from" name="from"></w-slider-thumb>
|
|
401
|
-
<w-slider-thumb slot="to" name="to"></w-slider-thumb>
|
|
402
|
-
</w-slider>
|
|
403
|
-
`;
|
|
404
|
-
},
|
|
405
|
-
};
|
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import { userEvent } from '@vitest/browser/context';
|
|
2
|
-
import { html } from 'lit';
|
|
3
|
-
import { expect, test } from 'vitest';
|
|
4
|
-
import { render } from 'vitest-browser-lit';
|
|
5
|
-
import '../attention/attention.js';
|
|
6
|
-
import '../affix/affix.js';
|
|
7
|
-
import '../textfield/textfield.js';
|
|
8
|
-
import './slider.js';
|
|
9
|
-
import '../slider-thumb/slider-thumb.js';
|
|
10
|
-
test('single slider starts with a default value equal to max', async () => {
|
|
11
|
-
const component = html `
|
|
12
|
-
<form data-testid="form">
|
|
13
|
-
<w-slider label="Single" min="0" max="100">
|
|
14
|
-
<w-slider-thumb name="value"></w-slider-thumb>
|
|
15
|
-
</w-slider>
|
|
16
|
-
</form>
|
|
17
|
-
`;
|
|
18
|
-
const page = render(component);
|
|
19
|
-
await expect.element(page.getByLabelText('Single').first()).toHaveValue('100');
|
|
20
|
-
});
|
|
21
|
-
test('range slider starts with a default from value equal to min, and to value equal to max', async () => {
|
|
22
|
-
const component = html `
|
|
23
|
-
<form data-testid="form">
|
|
24
|
-
<w-slider label="Range" min="0" max="100">
|
|
25
|
-
<w-slider-thumb aria-label="From" name="rangefrom" slot="from"></w-slider-thumb>
|
|
26
|
-
<w-slider-thumb aria-label="To" name="rangeto" slot="to"></w-slider-thumb>
|
|
27
|
-
</w-slider>
|
|
28
|
-
</form>
|
|
29
|
-
`;
|
|
30
|
-
const page = render(component);
|
|
31
|
-
await expect.element(page.getByLabelText('From').first()).toHaveValue('0');
|
|
32
|
-
await expect.element(page.getByLabelText('To').first()).toHaveValue('100');
|
|
33
|
-
});
|
|
34
|
-
test('can set slider value via the range input', async () => {
|
|
35
|
-
const component = html `
|
|
36
|
-
<form data-testid="form">
|
|
37
|
-
<w-slider label="Single" min="0" max="100">
|
|
38
|
-
<w-slider-thumb name="value"></w-slider-thumb>
|
|
39
|
-
</w-slider>
|
|
40
|
-
</form>
|
|
41
|
-
`;
|
|
42
|
-
const page = render(component);
|
|
43
|
-
await userEvent.type(page.getByLabelText('Single').first(), '{ArrowLeft}{ArrowLeft}{ArrowLeft}');
|
|
44
|
-
await expect.element(page.getByLabelText('Single').first()).toHaveValue('97');
|
|
45
|
-
await expect.element(page.getByRole('spinbutton')).toHaveValue(97); // keeps value in sync between inputs
|
|
46
|
-
const formData = new FormData(page.getByTestId('form').element());
|
|
47
|
-
expect(formData.get('value')).toBe('97');
|
|
48
|
-
});
|
|
49
|
-
test('can set slider value via the number input', async () => {
|
|
50
|
-
const component = html `
|
|
51
|
-
<form data-testid="form">
|
|
52
|
-
<w-slider label="Single" min="0" max="100">
|
|
53
|
-
<w-slider-thumb name="value"></w-slider-thumb>
|
|
54
|
-
</w-slider>
|
|
55
|
-
</form>
|
|
56
|
-
`;
|
|
57
|
-
const page = render(component);
|
|
58
|
-
await page.getByRole('spinbutton').fill('50');
|
|
59
|
-
await expect.element(page.getByRole('spinbutton')).toHaveValue(50);
|
|
60
|
-
await expect.element(page.getByLabelText('Single').first()).toHaveValue('50'); // keeps value in sync between inputs
|
|
61
|
-
const formData = new FormData(page.getByTestId('form').element());
|
|
62
|
-
expect(formData.get('value')).toBe('50');
|
|
63
|
-
});
|
|
64
|
-
test('deleting from number input works as expected', async () => {
|
|
65
|
-
const component = html `
|
|
66
|
-
<form data-testid="form">
|
|
67
|
-
<w-slider label="Production year" min="1950" max="2025" over under>
|
|
68
|
-
<p slot="description">Try typing a from value higher than a to value</p>
|
|
69
|
-
<w-slider-thumb slot="from" name="from"></w-slider-thumb>
|
|
70
|
-
<w-slider-thumb slot="to" name="to"></w-slider-thumb>
|
|
71
|
-
</w-slider>
|
|
72
|
-
</form>
|
|
73
|
-
`;
|
|
74
|
-
const page = render(component);
|
|
75
|
-
await expect.element(page.getByRole('spinbutton').last()).toHaveValue(2025);
|
|
76
|
-
await userEvent.type(page.getByRole('spinbutton').last(), '{Backspace}');
|
|
77
|
-
await expect.element(page.getByRole('spinbutton').last()).toHaveValue(202);
|
|
78
|
-
await userEvent.type(page.getByRole('spinbutton').last(), '{Backspace}');
|
|
79
|
-
await expect.element(page.getByRole('spinbutton').last()).toHaveValue(20);
|
|
80
|
-
await userEvent.type(page.getByRole('spinbutton').last(), '{Backspace}');
|
|
81
|
-
await expect.element(page.getByRole('spinbutton').last()).toHaveValue(2);
|
|
82
|
-
await userEvent.type(page.getByRole('spinbutton').last(), '{Backspace}');
|
|
83
|
-
await expect.element(page.getByRole('spinbutton').last()).not.toHaveValue();
|
|
84
|
-
});
|
|
85
|
-
test('can reset slider by resetting surrounding form', async () => {
|
|
86
|
-
render(html `
|
|
87
|
-
<form>
|
|
88
|
-
<w-slider label="Slider from 0 - 10" min="0" max="10">
|
|
89
|
-
<p slot="description">If you want to slide between 0 and 10, this slider has you covered.</p>
|
|
90
|
-
<w-slider-thumb name="zero-ten" value="3"></w-slider-thumb>
|
|
91
|
-
</w-slider>
|
|
92
|
-
</form>
|
|
93
|
-
`);
|
|
94
|
-
const form = document.querySelector('form');
|
|
95
|
-
const wSlider = document.querySelector('w-slider');
|
|
96
|
-
const wSliderThumb = wSlider.querySelector('w-slider-thumb');
|
|
97
|
-
// sanity
|
|
98
|
-
expect(form).not.toBeNull();
|
|
99
|
-
expect(wSlider).not.toBeNull();
|
|
100
|
-
expect(wSliderThumb).not.toBeNull();
|
|
101
|
-
expect(wSliderThumb.value).toBe('3');
|
|
102
|
-
expect(Object.fromEntries(new FormData(form).entries())['zero-ten']).toBe('3');
|
|
103
|
-
wSliderThumb.value = '5';
|
|
104
|
-
await wSliderThumb.updateComplete;
|
|
105
|
-
expect(wSliderThumb.value).toBe('5');
|
|
106
|
-
expect(Object.fromEntries(new FormData(form).entries())['zero-ten']).toBe('5');
|
|
107
|
-
// Reset the form
|
|
108
|
-
form.reset();
|
|
109
|
-
await wSliderThumb.updateComplete;
|
|
110
|
-
expect(wSliderThumb.value).toBe('3');
|
|
111
|
-
expect(Object.fromEntries(new FormData(form).entries())['zero-ten']).toBe('3');
|
|
112
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const wSliderStyles: import("lit").CSSResult;
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { css } from 'lit';
|
|
2
|
-
export const wSliderStyles = css `
|
|
3
|
-
.w-slider {
|
|
4
|
-
position: relative;
|
|
5
|
-
border: none;
|
|
6
|
-
padding: 0;
|
|
7
|
-
margin: 0;
|
|
8
|
-
display: grid;
|
|
9
|
-
width: 100%;
|
|
10
|
-
grid-template-areas:
|
|
11
|
-
"label"
|
|
12
|
-
"description"
|
|
13
|
-
"slider"
|
|
14
|
-
"error";
|
|
15
|
-
grid-template-columns: 1fr;
|
|
16
|
-
|
|
17
|
-
--w-slider-track-background: var(--w-s-color-background-disabled-subtle);
|
|
18
|
-
--w-slider-track-active-background: var(--w-s-color-background-primary);
|
|
19
|
-
--w-slider-track-height: 4px;
|
|
20
|
-
--w-slider-track-active-height: 6px;
|
|
21
|
-
--w-slider-thumb-background: var(--w-s-color-background-primary);
|
|
22
|
-
--w-slider-thumb-background-hover: var(
|
|
23
|
-
--w-s-color-background-primary-hover
|
|
24
|
-
);
|
|
25
|
-
--w-slider-thumb-size: 28px;
|
|
26
|
-
--w-slider-thumb-offset: calc(var(--w-slider-thumb-size) / 2);
|
|
27
|
-
--w-slider-marker-color: var(--w-s-color-border);
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
/* Vertical position of range and markers */
|
|
31
|
-
--_range-top: calc(
|
|
32
|
-
var(--w-slider-thumb-size) / 2 +
|
|
33
|
-
calc(
|
|
34
|
-
var(--w-slider-track-active-height) - calc(
|
|
35
|
-
var(--w-slider-track-height) / 2
|
|
36
|
-
) + 1px
|
|
37
|
-
)
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
.w-slider__label {
|
|
42
|
-
grid-area: label;
|
|
43
|
-
font-size: var(--w-font-size-s);
|
|
44
|
-
line-height: var(--w-line-height-s);
|
|
45
|
-
font-weight: bold;
|
|
46
|
-
padding-bottom: 8px;
|
|
47
|
-
color: var(--w-s-color-text);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
.w-slider__description {
|
|
51
|
-
grid-area: description;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
.w-slider__range {
|
|
55
|
-
align-self: center;
|
|
56
|
-
background: var(--w-slider-track-background);
|
|
57
|
-
border-radius: 4px;
|
|
58
|
-
height: var(--w-slider-track-active-height);
|
|
59
|
-
position: absolute;
|
|
60
|
-
/* For range sliders to avoid overlapping the slider thumbs we transform them to
|
|
61
|
-
be visually to the left and right of their respective input[type="range"]. This
|
|
62
|
-
padding is here so the active-range element is the same width as the input fields. */
|
|
63
|
-
padding-inline-start: var(--active-range-inline-start-padding, 0);
|
|
64
|
-
padding-inline-end: var(--active-range-inline-end-padding, 0);
|
|
65
|
-
top: var(--_range-top);
|
|
66
|
-
left: 0;
|
|
67
|
-
right: 0;
|
|
68
|
-
grid-area: slider;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
.w-slider__active-range {
|
|
72
|
-
box-sizing: content-box;
|
|
73
|
-
background: var(--w-slider-track-active-background);
|
|
74
|
-
height: var(--w-slider-track-active-height);
|
|
75
|
-
|
|
76
|
-
border-start-start-radius: var(--active-range-border-radius, 0);
|
|
77
|
-
border-end-start-radius: var(--active-range-border-radius, 0);
|
|
78
|
-
|
|
79
|
-
/* takes over-under into the calculation if set, as this makes the ranges longer in reality */
|
|
80
|
-
--max-with-offset: calc(var(--max) + var(--over-under-offset, 0));
|
|
81
|
-
|
|
82
|
-
/* calculate the offset for the "from" thumb in percentage to move the range visualisation from the left edge, using max() to avoid going off screen */
|
|
83
|
-
--offset-percentage: calc(calc(var(--from) - var(--min)) / calc(var(--max-with-offset) - var(--min)) * 100);
|
|
84
|
-
margin-left: calc(max(var(--offset-percentage) * 1%, 0px) - 1px);
|
|
85
|
-
|
|
86
|
-
/* calculate the width of the selected range in percentage, clamped between min/max */
|
|
87
|
-
--value-range: calc(var(--max-with-offset) - var(--min));
|
|
88
|
-
--range-span-percentage: calc(calc(min(var(--to), var(--max-with-offset)) - max(var(--min), var(--from))) / var(--value-range) * 100 );
|
|
89
|
-
width: calc(var(--range-span-percentage) * 1% + 1px);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
z-index: 1;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
.w-slider__markers {
|
|
96
|
-
--_marker-height: 7px;
|
|
97
|
-
--_marker-width: 1px;
|
|
98
|
-
|
|
99
|
-
align-self: center;
|
|
100
|
-
|
|
101
|
-
/* Creates a linear gradient with --_marker-width wide markers
|
|
102
|
-
followed by enough transparent that we can repeat the gradient
|
|
103
|
-
along the X axis and have markers visible where we want them. */
|
|
104
|
-
background: linear-gradient(
|
|
105
|
-
to right,
|
|
106
|
-
var(--w-slider-marker-color) var(--_marker-width),
|
|
107
|
-
rgba(0, 0, 0, 0) 1px calc(100% - 1px),
|
|
108
|
-
var(--w-slider-marker-color) 100%
|
|
109
|
-
)
|
|
110
|
-
repeat-x;
|
|
111
|
-
--_step-width-as-percent: calc(var(--markers) / var(--_value-range) * 100);
|
|
112
|
-
background-size: calc(var(--_step-width-as-percent) * 1%)
|
|
113
|
-
var(--_marker-height);
|
|
114
|
-
|
|
115
|
-
background-position: bottom 0 left 8px right 8px;
|
|
116
|
-
position: absolute;
|
|
117
|
-
top: calc(var(--_range-top) + 2px);
|
|
118
|
-
left: 1px;
|
|
119
|
-
right: 1px;
|
|
120
|
-
grid-area: slider;
|
|
121
|
-
height: var(--_marker-height);
|
|
122
|
-
margin-inline: var(--w-slider-thumb-offset);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
.w-slider__error {
|
|
126
|
-
grid-area: error;
|
|
127
|
-
padding-top: 8px;
|
|
128
|
-
font-size: var(--w-font-size-xs);
|
|
129
|
-
line-height: var(--w-line-height-xs);
|
|
130
|
-
color: var(--w-s-color-text-negative);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
.w-slider__help-text {
|
|
134
|
-
grid-area: error;
|
|
135
|
-
padding-top: 8px;
|
|
136
|
-
font-size: var(--w-font-size-xs);
|
|
137
|
-
line-height: var(--w-line-height-xs);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
slot::slotted(w-slider-thumb) {
|
|
141
|
-
position: static;
|
|
142
|
-
top: 0;
|
|
143
|
-
left: 0;
|
|
144
|
-
right: 0;
|
|
145
|
-
bottom: 0;
|
|
146
|
-
grid-area: slider;
|
|
147
|
-
}
|
|
148
|
-
`;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare const styles: import("lit").CSSResult;
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import { css } from 'lit';
|
|
2
|
-
export const styles = css `*,:before,:after{--w-rotate:0;--w-rotate-x:0;--w-rotate-y:0;--w-rotate-z:0;--w-scale-x:1;--w-scale-y:1;--w-scale-z:1;--w-skew-x:0;--w-skew-y:0;--w-translate-x:0;--w-translate-y:0;--w-translate-z:0}.hidden{display:none}.absolute{position:absolute}.relative{position:relative}.static{position:static}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}`;
|