@warp-ds/elements 2.3.0-next.3 → 2.3.0-next.30

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 (245) hide show
  1. package/dist/custom-elements.json +1139 -144
  2. package/dist/index.d.ts +413 -34
  3. package/dist/packages/affix/index.js.map +2 -2
  4. package/dist/packages/affix/react.d.ts +1 -1
  5. package/dist/packages/alert/index.js.map +2 -2
  6. package/dist/packages/alert/react.d.ts +1 -1
  7. package/dist/packages/attention/attention.stories.js +4 -1
  8. package/dist/packages/attention/index.js +58 -22
  9. package/dist/packages/attention/index.js.map +3 -3
  10. package/dist/packages/attention/react.d.ts +1 -1
  11. package/dist/packages/attention/styles.js +1 -1
  12. package/dist/packages/badge/index.js.map +2 -2
  13. package/dist/packages/badge/react.d.ts +1 -1
  14. package/dist/packages/box/index.js.map +2 -2
  15. package/dist/packages/box/react.d.ts +1 -1
  16. package/dist/packages/breadcrumbs/index.js.map +2 -2
  17. package/dist/packages/breadcrumbs/react.d.ts +1 -1
  18. package/dist/packages/button/button.react.stories.d.ts +1 -1
  19. package/dist/packages/button/button.stories.d.ts +4 -4
  20. package/dist/packages/button/button.stories.js +4 -4
  21. package/dist/packages/button/button.test.js +30 -1
  22. package/dist/packages/button/index.d.ts +2 -0
  23. package/dist/packages/button/index.js +52 -16
  24. package/dist/packages/button/index.js.map +3 -3
  25. package/dist/packages/button/react.d.ts +1 -1
  26. package/dist/packages/card/index.js.map +2 -2
  27. package/dist/packages/card/react.d.ts +1 -1
  28. package/dist/packages/checkbox/checkbox-group.d.ts +10 -0
  29. package/dist/packages/checkbox/checkbox-group.js +7 -0
  30. package/dist/packages/checkbox/checkbox-group.js.map +7 -0
  31. package/dist/packages/{rip-and-tear-checkbox → checkbox}/checkbox.d.ts +2 -2
  32. package/dist/packages/{rip-and-tear-checkbox → checkbox}/checkbox.js +3 -4
  33. package/dist/packages/checkbox/checkbox.js.map +7 -0
  34. package/dist/packages/{rip-and-tear-checkbox → checkbox}/checkbox.stories.d.ts +3 -0
  35. package/dist/packages/checkbox/checkbox.stories.js +25 -0
  36. package/dist/packages/checkbox/index.d.ts +2 -0
  37. package/dist/packages/checkbox/index.js +2 -0
  38. package/dist/packages/checkbox/react.d.ts +7 -0
  39. package/dist/packages/{rip-and-tear-checkbox → checkbox}/react.js +5 -0
  40. package/dist/packages/combobox/combobox.react.stories.d.ts +1 -1
  41. package/dist/packages/combobox/combobox.stories.d.ts +1 -0
  42. package/dist/packages/combobox/combobox.stories.js +29 -3
  43. package/dist/packages/combobox/index.d.ts +7 -1
  44. package/dist/packages/combobox/index.js +20 -19
  45. package/dist/packages/combobox/index.js.map +4 -4
  46. package/dist/packages/combobox/react.d.ts +1 -1
  47. package/dist/packages/combobox/styles.js +2 -1
  48. package/dist/packages/datepicker/datepicker.d.ts +1 -0
  49. package/dist/packages/datepicker/datepicker.js +35 -35
  50. package/dist/packages/datepicker/datepicker.js.map +3 -3
  51. package/dist/packages/datepicker/datepicker.react.stories.d.ts +1 -1
  52. package/dist/packages/datepicker/datepicker.test.js +27 -0
  53. package/dist/packages/datepicker/react.d.ts +1 -1
  54. package/dist/packages/{dead-toggle → deadtoggle}/index.js +2 -3
  55. package/dist/packages/deadtoggle/index.js.map +7 -0
  56. package/dist/packages/{dead-toggle → deadtoggle}/react.d.ts +1 -1
  57. package/dist/packages/expandable/index.js.map +2 -2
  58. package/dist/packages/expandable/react.d.ts +1 -1
  59. package/dist/packages/link/index.d.ts +2 -8
  60. package/dist/packages/link/index.js +46 -10
  61. package/dist/packages/link/index.js.map +4 -4
  62. package/dist/packages/link/link.react.stories.d.ts +6 -3
  63. package/dist/packages/link/link.react.stories.js +27 -10
  64. package/dist/packages/link/link.stories.d.ts +5 -2
  65. package/dist/packages/link/link.stories.js +27 -10
  66. package/dist/packages/link/react.d.ts +1 -1
  67. package/dist/packages/link/styles.js +39 -3
  68. package/dist/packages/modal/index.js.map +2 -2
  69. package/dist/packages/modal/modal-header.js.map +2 -2
  70. package/dist/packages/modal/modal.stories.d.ts +3 -3
  71. package/dist/packages/modal/modal.stories.js +32 -32
  72. package/dist/packages/modal/react.d.ts +1 -1
  73. package/dist/packages/pageindicator/react.d.ts +1 -1
  74. package/dist/packages/pagination/index.js.map +2 -2
  75. package/dist/packages/pagination/react.d.ts +1 -1
  76. package/dist/packages/pill/index.js.map +2 -2
  77. package/dist/packages/pill/react.d.ts +1 -1
  78. package/dist/packages/radio/index.d.ts +2 -0
  79. package/dist/packages/radio/index.js +2 -0
  80. package/dist/packages/{rip-and-tear-radio → radio}/radio-group-styles.js.map +1 -1
  81. package/dist/packages/{rip-and-tear-radio → radio}/radio-group.js +7 -8
  82. package/dist/packages/radio/radio-group.js.map +7 -0
  83. package/dist/packages/{rip-and-tear-radio → radio}/radio.js +3 -4
  84. package/dist/packages/radio/radio.js.map +7 -0
  85. package/dist/packages/radio/radio.stories.d.ts +15 -0
  86. package/dist/packages/radio/radio.stories.js +3702 -0
  87. package/dist/packages/radio/radio.stories.js.map +7 -0
  88. package/dist/packages/{rip-and-tear-radio → radio}/react.d.ts +2 -2
  89. package/dist/packages/select/index.d.ts +26 -5
  90. package/dist/packages/select/index.js +17 -16
  91. package/dist/packages/select/index.js.map +3 -3
  92. package/dist/packages/select/react.d.ts +1 -1
  93. package/dist/packages/select/select.react.stories.d.ts +1 -1
  94. package/dist/packages/select/select.stories.d.ts +1 -1
  95. package/dist/packages/select/select.stories.js +3 -4
  96. package/dist/packages/select/select.test.js +30 -0
  97. package/dist/packages/slider/locales/da/messages.mjs +1 -0
  98. package/dist/packages/slider/locales/en/messages.mjs +1 -0
  99. package/dist/packages/slider/locales/fi/messages.mjs +1 -0
  100. package/dist/packages/slider/locales/nb/messages.mjs +1 -0
  101. package/dist/packages/slider/locales/sv/messages.mjs +1 -0
  102. package/dist/packages/slider/react.d.ts +2 -2
  103. package/dist/packages/slider/slider-thumb.d.ts +13 -7
  104. package/dist/packages/slider/slider-thumb.js +92 -49
  105. package/dist/packages/slider/slider-thumb.js.map +4 -4
  106. package/dist/packages/slider/slider.d.ts +12 -3
  107. package/dist/packages/slider/slider.js +109 -31
  108. package/dist/packages/slider/slider.js.map +4 -4
  109. package/dist/packages/slider/slider.react.stories.d.ts +1 -0
  110. package/dist/packages/slider/slider.react.stories.js +22 -0
  111. package/dist/packages/slider/slider.stories.d.ts +3 -0
  112. package/dist/packages/slider/slider.stories.js +240 -33
  113. package/dist/packages/slider/slider.test.js +28 -0
  114. package/dist/packages/slider/styles/w-slider-thumb.styles.js +24 -16
  115. package/dist/packages/slider/styles/w-slider.styles.js +65 -18
  116. package/dist/packages/{steps → stepindicator}/index.d.ts +3 -2
  117. package/dist/packages/{steps → stepindicator}/index.js +8 -8
  118. package/dist/packages/stepindicator/index.js.map +7 -0
  119. package/dist/packages/stepindicator/locales/da/messages.d.mts +1 -0
  120. package/dist/packages/stepindicator/locales/en/messages.d.mts +1 -0
  121. package/dist/packages/stepindicator/locales/fi/messages.d.mts +1 -0
  122. package/dist/packages/stepindicator/locales/nb/messages.d.mts +1 -0
  123. package/dist/packages/stepindicator/locales/sv/messages.d.mts +1 -0
  124. package/dist/packages/stepindicator/react.d.ts +3 -0
  125. package/dist/packages/{steps → stepindicator}/react.js +2 -2
  126. package/dist/packages/{steps/steps.react.stories.d.ts → stepindicator/stepindicator.react.stories.d.ts} +4 -4
  127. package/dist/packages/{steps/steps.react.stories.js → stepindicator/stepindicator.react.stories.js} +11 -11
  128. package/dist/packages/{steps/steps.stories.js → stepindicator/stepindicator.stories.js} +16 -16
  129. package/dist/packages/switch/index.d.ts +10 -2
  130. package/dist/packages/switch/index.js +7 -6
  131. package/dist/packages/switch/index.js.map +4 -4
  132. package/dist/packages/switch/react.d.ts +1 -1
  133. package/dist/packages/switch/styles.js +1 -1
  134. package/dist/packages/switch/switch.react.stories.js +4 -4
  135. package/dist/packages/switch/switch.stories.js +6 -5
  136. package/dist/packages/switch/switch.test.d.ts +1 -0
  137. package/dist/packages/switch/switch.test.js +40 -0
  138. package/dist/packages/tabs/tab.js +4 -3
  139. package/dist/packages/tabs/tab.js.map +2 -2
  140. package/dist/packages/tabs/tabs.js +5 -5
  141. package/dist/packages/tabs/tabs.js.map +3 -3
  142. package/dist/packages/tabs/tabs.stories.d.ts +3 -0
  143. package/dist/packages/tabs/tabs.stories.js +16 -7
  144. package/dist/packages/textarea/index.d.ts +1 -0
  145. package/dist/packages/textarea/index.js +1 -0
  146. package/dist/packages/textarea/locales/da/messages.d.mts +1 -0
  147. package/dist/packages/textarea/locales/da/messages.mjs +1 -0
  148. package/dist/packages/textarea/locales/en/messages.d.mts +1 -0
  149. package/dist/packages/textarea/locales/en/messages.mjs +1 -0
  150. package/dist/packages/textarea/locales/fi/messages.d.mts +1 -0
  151. package/dist/packages/textarea/locales/fi/messages.mjs +1 -0
  152. package/dist/packages/textarea/locales/nb/messages.d.mts +1 -0
  153. package/dist/packages/textarea/locales/nb/messages.mjs +1 -0
  154. package/dist/packages/textarea/locales/sv/messages.d.mts +1 -0
  155. package/dist/packages/textarea/locales/sv/messages.mjs +1 -0
  156. package/dist/packages/textarea/react.d.ts +11 -0
  157. package/dist/packages/textarea/react.js +21 -0
  158. package/dist/packages/textarea/styles.d.ts +1 -0
  159. package/dist/packages/textarea/styles.js +2 -0
  160. package/dist/packages/textarea/textarea.d.ts +49 -0
  161. package/dist/packages/{rip-and-tear-radio/radio.stories.js → textarea/textarea.js} +35 -214
  162. package/dist/packages/textarea/textarea.js.map +7 -0
  163. package/dist/packages/textarea/textarea.react.stories.d.ts +33 -0
  164. package/dist/packages/textarea/textarea.react.stories.js +41 -0
  165. package/dist/packages/textarea/textarea.stories.d.ts +19 -0
  166. package/dist/packages/textarea/textarea.stories.js +85 -0
  167. package/dist/packages/textarea/textarea.test.d.ts +1 -0
  168. package/dist/packages/textarea/textarea.test.js +68 -0
  169. package/dist/packages/textfield/index.d.ts +6 -0
  170. package/dist/packages/textfield/index.js +21 -20
  171. package/dist/packages/textfield/index.js.map +3 -3
  172. package/dist/packages/textfield/react.d.ts +1 -1
  173. package/dist/packages/textfield/textfield.react.stories.d.ts +1 -1
  174. package/dist/packages/textfield/textfield.stories.d.ts +1 -0
  175. package/dist/packages/textfield/textfield.stories.js +17 -0
  176. package/dist/packages/toggle-styles.js +2 -3
  177. package/dist/web-types.json +473 -30
  178. package/package.json +37 -31
  179. package/dist/packages/dead-toggle/index.js.map +0 -7
  180. package/dist/packages/rip-and-tear-checkbox/checkbox.js.map +0 -7
  181. package/dist/packages/rip-and-tear-checkbox/checkbox.stories.js +0 -11
  182. package/dist/packages/rip-and-tear-checkbox/index.d.ts +0 -1
  183. package/dist/packages/rip-and-tear-checkbox/index.js +0 -4
  184. package/dist/packages/rip-and-tear-checkbox/react.d.ts +0 -5
  185. package/dist/packages/rip-and-tear-radio/index.d.ts +0 -1
  186. package/dist/packages/rip-and-tear-radio/index.js +0 -6
  187. package/dist/packages/rip-and-tear-radio/radio-group.js.map +0 -7
  188. package/dist/packages/rip-and-tear-radio/radio.js.map +0 -7
  189. package/dist/packages/rip-and-tear-radio/radio.stories.d.ts +0 -8
  190. package/dist/packages/rip-and-tear-radio/radio.stories.js.map +0 -7
  191. package/dist/packages/steps/index.js.map +0 -7
  192. package/dist/packages/steps/react.d.ts +0 -3
  193. /package/dist/packages/{rip-and-tear-checkbox/rip-and-tear-checkbox.react.stories.d.ts → checkbox/checkbox.react.stories.d.ts} +0 -0
  194. /package/dist/packages/{rip-and-tear-checkbox/rip-and-tear-checkbox.react.stories.js → checkbox/checkbox.react.stories.js} +0 -0
  195. /package/dist/packages/{rip-and-tear-checkbox → checkbox}/styles.d.ts +0 -0
  196. /package/dist/packages/{rip-and-tear-checkbox → checkbox}/styles.js +0 -0
  197. /package/dist/packages/{dead-toggle → deadtoggle}/dead-toggle.react.stories.d.ts +0 -0
  198. /package/dist/packages/{dead-toggle → deadtoggle}/dead-toggle.react.stories.js +0 -0
  199. /package/dist/packages/{dead-toggle → deadtoggle}/dead-toggle.stories.d.ts +0 -0
  200. /package/dist/packages/{dead-toggle → deadtoggle}/dead-toggle.stories.js +0 -0
  201. /package/dist/packages/{dead-toggle → deadtoggle}/dead-toggle.test.d.ts +0 -0
  202. /package/dist/packages/{dead-toggle → deadtoggle}/dead-toggle.test.js +0 -0
  203. /package/dist/packages/{dead-toggle → deadtoggle}/index.d.ts +0 -0
  204. /package/dist/packages/{dead-toggle → deadtoggle}/react.js +0 -0
  205. /package/dist/packages/{rip-and-tear-radio → radio}/base-element.d.ts +0 -0
  206. /package/dist/packages/{rip-and-tear-radio → radio}/base-element.js +0 -0
  207. /package/dist/packages/{rip-and-tear-radio → radio}/custom-error-validator.d.ts +0 -0
  208. /package/dist/packages/{rip-and-tear-radio → radio}/custom-error-validator.js +0 -0
  209. /package/dist/packages/{rip-and-tear-radio → radio}/form-associated-element.d.ts +0 -0
  210. /package/dist/packages/{rip-and-tear-radio → radio}/form-associated-element.js +0 -0
  211. /package/dist/packages/{rip-and-tear-radio → radio}/host-styles.d.ts +0 -0
  212. /package/dist/packages/{rip-and-tear-radio → radio}/host-styles.js +0 -0
  213. /package/dist/packages/{rip-and-tear-radio → radio}/invalid.d.ts +0 -0
  214. /package/dist/packages/{rip-and-tear-radio → radio}/invalid.js +0 -0
  215. /package/dist/packages/{rip-and-tear-radio → radio}/math.d.ts +0 -0
  216. /package/dist/packages/{rip-and-tear-radio → radio}/math.js +0 -0
  217. /package/dist/packages/{rip-and-tear-radio → radio}/radio-group-styles.d.ts +0 -0
  218. /package/dist/packages/{rip-and-tear-radio → radio}/radio-group-styles.js +0 -0
  219. /package/dist/packages/{rip-and-tear-radio → radio}/radio-group.d.ts +0 -0
  220. /package/dist/packages/{rip-and-tear-radio → radio}/radio-styles.d.ts +0 -0
  221. /package/dist/packages/{rip-and-tear-radio → radio}/radio-styles.js +0 -0
  222. /package/dist/packages/{rip-and-tear-radio → radio}/radio-styles.js.map +0 -0
  223. /package/dist/packages/{rip-and-tear-radio → radio}/radio.d.ts +0 -0
  224. /package/dist/packages/{rip-and-tear-radio/rip-and-tear-radio.react.stories.d.ts → radio/radio.react.stories.d.ts} +0 -0
  225. /package/dist/packages/{rip-and-tear-radio/rip-and-tear-radio.react.stories.js → radio/radio.react.stories.js} +0 -0
  226. /package/dist/packages/{rip-and-tear-radio → radio}/react.js +0 -0
  227. /package/dist/packages/{rip-and-tear-radio → radio}/required-validator.d.ts +0 -0
  228. /package/dist/packages/{rip-and-tear-radio → radio}/required-validator.js +0 -0
  229. /package/dist/packages/{rip-and-tear-radio → radio}/slot.d.ts +0 -0
  230. /package/dist/packages/{rip-and-tear-radio → radio}/slot.js +0 -0
  231. /package/dist/packages/{rip-and-tear-radio → radio}/watch.d.ts +0 -0
  232. /package/dist/packages/{rip-and-tear-radio → radio}/watch.js +0 -0
  233. /package/dist/packages/{steps → slider}/locales/da/messages.d.mts +0 -0
  234. /package/dist/packages/{steps → slider}/locales/en/messages.d.mts +0 -0
  235. /package/dist/packages/{steps → slider}/locales/fi/messages.d.mts +0 -0
  236. /package/dist/packages/{steps → slider}/locales/nb/messages.d.mts +0 -0
  237. /package/dist/packages/{steps → slider}/locales/sv/messages.d.mts +0 -0
  238. /package/dist/packages/{steps → stepindicator}/locales/da/messages.mjs +0 -0
  239. /package/dist/packages/{steps → stepindicator}/locales/en/messages.mjs +0 -0
  240. /package/dist/packages/{steps → stepindicator}/locales/fi/messages.mjs +0 -0
  241. /package/dist/packages/{steps → stepindicator}/locales/nb/messages.mjs +0 -0
  242. /package/dist/packages/{steps → stepindicator}/locales/sv/messages.mjs +0 -0
  243. /package/dist/packages/{steps/steps.stories.d.ts → stepindicator/stepindicator.stories.d.ts} +0 -0
  244. /package/dist/packages/{steps → stepindicator}/styles.d.ts +0 -0
  245. /package/dist/packages/{steps → stepindicator}/styles.js +0 -0
@@ -16,3 +16,4 @@ export declare const Step: Story;
16
16
  export declare const OverUnder: Story;
17
17
  export declare const SingleError: Story;
18
18
  export declare const RangeError: Story;
19
+ export declare const TestCase: Story;
@@ -116,3 +116,25 @@ export const RangeError = {
116
116
  React.createElement(SliderThumb, { slot: "to", name: "to" })));
117
117
  },
118
118
  };
119
+ export const TestCase = {
120
+ render() {
121
+ const [fromValue, setFromValue] = useState('0');
122
+ const [toValue, setToValue] = useState('150000');
123
+ return (React.createElement(React.Fragment, null,
124
+ React.createElement("form", { id: "overunder", style: { marginBottom: 16 }, lang: "nb", onInput: (val) => {
125
+ const formData = new FormData(val.currentTarget);
126
+ setFromValue(formData.get('from'));
127
+ setToValue(formData.get('to'));
128
+ } },
129
+ React.createElement(Slider, { label: "Pris", min: "0", max: "700000" },
130
+ React.createElement(SliderThumb, { slot: "from", "aria-label": "Fra pris", name: "from", value: fromValue }),
131
+ React.createElement(SliderThumb, { slot: "to", "aria-label": "Til pris", "aria-description": "700000 inkluderer prisen derfra og opp", name: "to", value: toValue }))),
132
+ React.createElement("p", null, "Drag the slider to show the value below. See the Code tab for how to format the labels."),
133
+ React.createElement("output", null,
134
+ React.createElement("dl", null,
135
+ React.createElement("dt", null, "From:"),
136
+ React.createElement("dd", null, fromValue),
137
+ React.createElement("dt", null, "To:"),
138
+ React.createElement("dd", null, toValue)))));
139
+ },
140
+ };
@@ -16,3 +16,6 @@ export declare const Step: Story;
16
16
  export declare const OverUnder: Story;
17
17
  export declare const SingleError: Story;
18
18
  export declare const RangeError: Story;
19
+ export declare const TestCase: Story;
20
+ export declare const CustomError: Story;
21
+ export declare const Description: Story;
@@ -29,8 +29,16 @@ export const Range = {
29
29
  render() {
30
30
  return html `
31
31
  <w-slider label="Range" min="0" max="100">
32
- <w-slider-thumb slot="from" aria-label="From value" name="from"></w-slider-thumb>
33
- <w-slider-thumb slot="to" aria-label="To value" name="to"></w-slider-thumb>
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>
34
42
  </w-slider>
35
43
  `;
36
44
  },
@@ -43,13 +51,27 @@ export const SuffixSquareMeters = {
43
51
  },
44
52
  render({ locale, suffix }) {
45
53
  return html `
46
- <w-slider label="Apartment size" min="0" max="250" suffix="${suffix}" data-testid="sqm">
47
- <w-slider-thumb slot="from" aria-label="From size" name="from"></w-slider-thumb>
48
- <w-slider-thumb slot="to" aria-label="To size" name="to"></w-slider-thumb>
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>
49
71
  </w-slider>
50
72
  <script type="module">
51
73
  const sqmSlider = document.querySelector('w-slider[data-testid="sqm"]');
52
- sqmSlider.formatter = window.getNumberFormatter('${locale}').format;
74
+ sqmSlider.formatter = window.getNumberFormatter("${locale}").format;
53
75
  </script>
54
76
  `;
55
77
  },
@@ -61,13 +83,31 @@ export const SuffixCurrency = {
61
83
  },
62
84
  render({ locale, suffix }) {
63
85
  return html `
64
- <w-slider label="Price" min="0" max="250000" suffix="${suffix}" data-testid="currency">
65
- <w-slider-thumb slot="from" aria-label="From price" name="from"></w-slider-thumb>
66
- <w-slider-thumb slot="to" aria-label="To price" name="to"></w-slider-thumb>
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>
67
103
  </w-slider>
68
104
  <script type="module">
69
- const currencySlider = document.querySelector('w-slider[data-testid="currency"]');
70
- currencySlider.formatter = window.getNumberFormatter('${locale}').format;
105
+ const currencySlider = document.querySelector(
106
+ 'w-slider[data-testid="currency"]'
107
+ );
108
+ currencySlider.formatter = window.getNumberFormatter(
109
+ "${locale}"
110
+ ).format;
71
111
  </script>
72
112
  `;
73
113
  },
@@ -79,13 +119,27 @@ export const SuffixKilometers = {
79
119
  },
80
120
  render({ locale, suffix }) {
81
121
  return html `
82
- <w-slider label="Distance" min="0" max="250000" suffix="${suffix}" data-testid="km">
83
- <w-slider-thumb slot="from" aria-label="From distance" name="from"></w-slider-thumb>
84
- <w-slider-thumb slot="to" aria-label="To distance" name="to"></w-slider-thumb>
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>
85
139
  </w-slider>
86
140
  <script type="module">
87
141
  const kmSlider = document.querySelector('w-slider[data-testid="km"]');
88
- kmSlider.formatter = window.getNumberFormatter('${locale}').format;
142
+ kmSlider.formatter = window.getNumberFormatter("${locale}").format;
89
143
  </script>
90
144
  `;
91
145
  },
@@ -98,7 +152,13 @@ export const Marks = {
98
152
  },
99
153
  render({ markers, step }) {
100
154
  return html `
101
- <w-slider label="Single" min="0" max="100" step="${step}" markers="${markers}">
155
+ <w-slider
156
+ label="Single"
157
+ min="0"
158
+ max="100"
159
+ step="${step}"
160
+ markers="${markers}"
161
+ >
102
162
  <w-slider-thumb name="value"></w-slider-thumb>
103
163
  </w-slider>
104
164
  `;
@@ -121,20 +181,31 @@ export const OverUnder = {
121
181
  render() {
122
182
  return html `
123
183
  <form id="overunder" style="margin-bottom: 16px" lang="nb">
124
- <w-slider label="Produksjonsår" min="1950" max="2025" data-testid="overunder">
184
+ <w-slider
185
+ label="Produksjonsår"
186
+ min="1950"
187
+ max="2025"
188
+ data-testid="overunder"
189
+ allow-values-outside-range
190
+ >
125
191
  <w-slider-thumb
126
192
  slot="from"
127
193
  aria-label="Fra år"
128
194
  aria-description="1950 inkluderer kjøretøy produsert fram til 1950"
129
- name="from"></w-slider-thumb>
195
+ name="from"
196
+ ></w-slider-thumb>
130
197
  <w-slider-thumb
131
198
  slot="to"
132
199
  aria-label="Til år"
133
200
  aria-description="2025 inkluderer kjøretøy produsert etter 2025"
134
- name="to"></w-slider-thumb>
201
+ name="to"
202
+ ></w-slider-thumb>
135
203
  </w-slider>
136
204
  </form>
137
- <p>Drag the slider to show the value below. See the Code tab for how to format the labels.</p>
205
+ <p>
206
+ Drag the slider to show the value below. See the Code tab for how to
207
+ format the labels.
208
+ </p>
138
209
  <output>
139
210
  <dl>
140
211
  <dt>From:</dt>
@@ -145,24 +216,26 @@ export const OverUnder = {
145
216
  </output>
146
217
  <script>
147
218
  /** Here is how you can show labels to indicate min and max values are "up to and including" and "this value and above". */
148
- const overunderSlider = document.querySelector('w-slider[data-testid="overunder"]');
149
- overunderSlider.formatter = function (value) {
150
- if (value === '1950') {
151
- return 'Før 1950';
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";
152
225
  }
153
- if (value === '2025') {
154
- return 'Etter 2025';
226
+ if (value === "" && type === "to") {
227
+ return "Etter 2025";
155
228
  }
156
229
  return value;
157
230
  };
158
231
 
159
232
  /** Code to show the form values in output */
160
- document.forms['overunder'].addEventListener('input', function () {
233
+ document.forms["overunder"].addEventListener("input", function () {
161
234
  const formData = new FormData(this);
162
- const from = formData.get('from');
163
- const to = formData.get('to');
164
- document.getElementById('overunder-from').innerText = from;
165
- document.getElementById('overunder-to').innerText = to;
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;
166
239
  });
167
240
  </script>
168
241
  `;
@@ -182,13 +255,147 @@ export const SingleError = {
182
255
  },
183
256
  };
184
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="Hestekrefter"
302
+ suffix="hk"
303
+ min="50"
304
+ max="500"
305
+ data-testid="overunder"
306
+ allow-values-outside-range
307
+ step="10"
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 50";
345
+ }
346
+ if (value === "" && type === "to") {
347
+ return "Over 500";
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 = {
185
386
  args: {
186
387
  locale: 'nb',
187
388
  },
188
389
  render() {
189
390
  return html `
190
- <w-slider label="Production year" min="1950" max="2025" over under>
191
- <p slot="description">Try typing a from value higher than a to value</p>
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
+ >
192
399
  <w-slider-thumb slot="from" name="from"></w-slider-thumb>
193
400
  <w-slider-thumb slot="to" name="to"></w-slider-thumb>
194
401
  </w-slider>
@@ -81,3 +81,31 @@ test('deleting from number input works as expected', async () => {
81
81
  await userEvent.type(page.getByRole('spinbutton').last(), '{Backspace}');
82
82
  await expect.element(page.getByRole('spinbutton').last()).not.toHaveValue();
83
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
+ });
@@ -6,9 +6,9 @@ export const wSliderThumbStyles = css `
6
6
  display: grid;
7
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
8
  grid-template-areas:
9
- 'slider slider slider'
10
- 'frommarker . tomarker'
11
- 'fromtextfield . totextfield';
9
+ "slider slider slider"
10
+ "frommarker . tomarker"
11
+ "fromtextfield . totextfield";
12
12
  grid-template-columns: 1fr 24px 1fr;
13
13
  }
14
14
 
@@ -39,7 +39,11 @@ export const wSliderThumbStyles = css `
39
39
  background: var(--w-s-color-background-primary);
40
40
  border-radius: 50%;
41
41
  height: var(--w-slider-thumb-size);
42
- margin-top: calc(-1 * calc(var(--w-slider-thumb-offset) - calc(var(--w-slider-track-height) / 2)));
42
+ margin-top: calc(
43
+ -1 * calc(var(--w-slider-thumb-offset) - calc(
44
+ var(--w-slider-track-height) / 2
45
+ ))
46
+ );
43
47
  pointer-events: initial;
44
48
  width: var(--w-slider-thumb-size);
45
49
  z-index: 1;
@@ -54,7 +58,11 @@ export const wSliderThumbStyles = css `
54
58
  border-radius: 50%;
55
59
  border-color: transparent;
56
60
  height: var(--w-slider-thumb-size);
57
- margin-top: calc(-1 * calc(var(--w-slider-thumb-offset) - calc(var(--w-slider-track-height) / 2)));
61
+ margin-top: calc(
62
+ -1 * calc(var(--w-slider-thumb-offset) - calc(
63
+ var(--w-slider-track-height) / 2
64
+ ))
65
+ );
58
66
  pointer-events: initial;
59
67
  width: var(--w-slider-thumb-size);
60
68
  z-index: 1;
@@ -124,44 +132,44 @@ export const wSliderThumbStyles = css `
124
132
  }
125
133
 
126
134
  .w-slider-thumb__textfield {
127
- margin-top: 10px;
135
+ margin-top: 12px;
128
136
  pointer-events: auto;
129
137
  grid-row: 3 / 4;
130
138
  grid-column: 1 / 3; /* Single sliders should have the text field use the fromtextfield _and_ gap portion of the CSS grid. */
131
139
  }
132
140
 
133
- :host([name='from']) .w-slider-thumb__textfield {
141
+ :host([name="from"]) .w-slider-thumb__textfield {
134
142
  grid-column: 1 / 2; /* Range sliders should leave the gap empty. */
135
143
  }
136
144
 
137
- :host([name='from']) .w-slider-thumb__range {
145
+ :host([name="from"]) .w-slider-thumb__range {
138
146
  margin-left: var(--w-slider-thumb-size);
139
147
  }
140
148
 
141
- :host([name='to']) .w-slider-thumb__range {
149
+ :host([name="to"]) .w-slider-thumb__range {
142
150
  margin-right: var(--w-slider-thumb-size);
143
151
  }
144
152
 
145
- :host([name='from']) .w-slider-thumb__range::-webkit-slider-thumb,
146
- :host([name='from']) .w-slider-thumb__tooltip-target {
153
+ :host([name="from"]) .w-slider-thumb__range::-webkit-slider-thumb,
154
+ :host([name="from"]) .w-slider-thumb__tooltip-target {
147
155
  transform: translateX(calc(-1 * var(--w-slider-thumb-size) - 1px));
148
156
  }
149
157
 
150
- :host([name='from']) .w-slider-thumb__range::-moz-range-thumb {
158
+ :host([name="from"]) .w-slider-thumb__range::-moz-range-thumb {
151
159
  transform: translateX(calc(-1 * var(--w-slider-thumb-size) - 1px));
152
160
  }
153
161
 
154
- :host([name='to']) .w-slider-thumb__textfield {
162
+ :host([name="to"]) .w-slider-thumb__textfield {
155
163
  grid-row: 3 / 4;
156
164
  grid-column: 3 / 4;
157
165
  }
158
166
 
159
- :host([name='to']) .w-slider-thumb__tooltip-target,
160
- :host([name='to']) .w-slider-thumb__range::-webkit-slider-thumb {
167
+ :host([name="to"]) .w-slider-thumb__tooltip-target,
168
+ :host([name="to"]) .w-slider-thumb__range::-webkit-slider-thumb {
161
169
  transform: translateX(calc(var(--w-slider-thumb-size) - 1px));
162
170
  }
163
171
 
164
- :host([name='to']) .w-slider-thumb__range::-moz-range-thumb {
172
+ :host([name="to"]) .w-slider-thumb__range::-moz-range-thumb {
165
173
  transform: translateX(calc(var(--w-slider-thumb-size) - 1px));
166
174
  }
167
175
  `;
@@ -8,9 +8,10 @@ export const wSliderStyles = css `
8
8
  display: grid;
9
9
  width: 100%;
10
10
  grid-template-areas:
11
- 'label'
12
- 'description'
13
- 'slider';
11
+ "label"
12
+ "description"
13
+ "slider"
14
+ "error";
14
15
  grid-template-columns: 1fr;
15
16
 
16
17
  --w-slider-track-background: var(--w-s-color-background-disabled-subtle);
@@ -18,7 +19,9 @@ export const wSliderStyles = css `
18
19
  --w-slider-track-height: 4px;
19
20
  --w-slider-track-active-height: 6px;
20
21
  --w-slider-thumb-background: var(--w-s-color-background-primary);
21
- --w-slider-thumb-background-hover: var(--w-s-color-background-primary-hover);
22
+ --w-slider-thumb-background-hover: var(
23
+ --w-s-color-background-primary-hover
24
+ );
22
25
  --w-slider-thumb-size: 28px;
23
26
  --w-slider-thumb-offset: calc(var(--w-slider-thumb-size) / 2);
24
27
  --w-slider-marker-color: var(--w-s-color-border);
@@ -29,26 +32,45 @@ export const wSliderStyles = css `
29
32
  --_value-range: calc(var(--max) - var(--min));
30
33
 
31
34
  /** Round up to the nearest --step, which defaults to 1 (https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/range#step) */
32
- --_from-in-range: round(up, max(calc(var(--from) - var(--min)), 0), var(--step, 1));
35
+ --_from-in-range: round(
36
+ up,
37
+ max(calc(var(--from) - var(--min)), 0),
38
+ var(--step, 1)
39
+ );
33
40
 
34
41
  /* limit to maximum value in range so typing a value larger than max doesn't explode layouts */
35
- --_to-in-range: round(up, min(calc(var(--to) - var(--min)), var(--_value-range)), var(--step, 1));
42
+ --_to-in-range: round(
43
+ up,
44
+ min(calc(var(--to) - var(--min)), var(--_value-range)),
45
+ var(--step, 1)
46
+ );
36
47
 
37
48
  /* Position the starting point of the fill in the case of a non-zero --from value in a range slider.
38
49
  * In other words, given a width of 100% how many percent should be left unfilled/blank
39
50
  * at the beginning of the range slider (dashes in this ASCII-range-slider: |---O******O|) */
40
- --_from-as-percent-of-max: calc(var(--_from-in-range) / var(--_value-range) * 100);
51
+ --_from-as-percent-of-max: calc(
52
+ var(--_from-in-range) / var(--_value-range) * 100
53
+ );
41
54
  --_blank-values-before: var(--_from-as-percent-of-max);
42
55
 
43
56
  /* Set the width of the fill as a percentage.
44
57
  * In other words, given a width of 100% how many percent should be left unfilled/blank
45
58
  * at the end of the slider (dashes in this ASCII-slider: |******O---|) */
46
- --_to-as-percent-of-max: calc(var(--_to-in-range) / var(--_value-range) * 100);
47
- --_filled-values: calc(var(--_to-as-percent-of-max) - var(--_blank-values-before));
59
+ --_to-as-percent-of-max: calc(
60
+ var(--_to-in-range) / var(--_value-range) * 100
61
+ );
62
+ --_filled-values: calc(
63
+ var(--_to-as-percent-of-max) - var(--_blank-values-before)
64
+ );
48
65
 
49
66
  /* Vertical position of range and markers */
50
67
  --_range-top: calc(
51
- var(--w-slider-thumb-size) / 2 + calc(var(--w-slider-track-active-height) - calc(var(--w-slider-track-height) / 2) + 1px)
68
+ var(--w-slider-thumb-size) / 2 +
69
+ calc(
70
+ var(--w-slider-track-active-height) - calc(
71
+ var(--w-slider-track-height) / 2
72
+ ) + 1px
73
+ )
52
74
  );
53
75
  }
54
76
 
@@ -90,8 +112,16 @@ export const wSliderStyles = css `
90
112
  border-start-start-radius: var(--active-range-border-radius, 0);
91
113
  border-end-start-radius: var(--active-range-border-radius, 0);
92
114
 
93
- margin-left: calc(calc(var(--_blank-values-before) * 1%) - var(--active-range-inline-start-padding, 0px));
94
- width: calc(calc(var(--_filled-values) * 1%) + var(--active-range-inline-end-padding, 0px));
115
+ margin-left: calc(
116
+ calc(var(--_blank-values-before) * 1%) - var(
117
+ --active-range-inline-start-padding,
118
+ 0px
119
+ )
120
+ );
121
+ width: calc(
122
+ calc(var(--_filled-values) * 1%) +
123
+ var(--active-range-inline-end-padding, 0px)
124
+ );
95
125
  z-index: 1;
96
126
  }
97
127
 
@@ -105,13 +135,15 @@ export const wSliderStyles = css `
105
135
  followed by enough transparent that we can repeat the gradient
106
136
  along the X axis and have markers visible where we want them. */
107
137
  background: linear-gradient(
108
- to right,
109
- var(--w-slider-marker-color) var(--_marker-width),
110
- rgba(0, 0, 0, 0) 1px calc(100% - 1px),
111
- var(--w-slider-marker-color) 100%
112
- ) repeat-x;
138
+ to right,
139
+ var(--w-slider-marker-color) var(--_marker-width),
140
+ rgba(0, 0, 0, 0) 1px calc(100% - 1px),
141
+ var(--w-slider-marker-color) 100%
142
+ )
143
+ repeat-x;
113
144
  --_step-width-as-percent: calc(var(--markers) / var(--_value-range) * 100);
114
- background-size: calc(var(--_step-width-as-percent) * 1%) var(--_marker-height);
145
+ background-size: calc(var(--_step-width-as-percent) * 1%)
146
+ var(--_marker-height);
115
147
 
116
148
  background-position: bottom 0 left 8px right 8px;
117
149
  position: absolute;
@@ -123,6 +155,21 @@ export const wSliderStyles = css `
123
155
  margin-inline: var(--w-slider-thumb-offset);
124
156
  }
125
157
 
158
+ .w-slider__error {
159
+ grid-area: error;
160
+ padding-top: 8px;
161
+ font-size: var(--w-font-size-xs);
162
+ line-height: var(--w-line-height-xs);
163
+ color: var(--w-s-color-text-negative);
164
+ }
165
+
166
+ .w-slider__help-text {
167
+ grid-area: error;
168
+ padding-top: 8px;
169
+ font-size: var(--w-font-size-xs);
170
+ line-height: var(--w-line-height-xs);
171
+ }
172
+
126
173
  slot::slotted(w-slider-thumb) {
127
174
  position: static;
128
175
  top: 0;