@warp-ds/elements 2.3.2 → 2.4.0-next.2

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