@warp-ds/elements 2.10.0-next.9 → 2.10.1-next.1

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 (724) hide show
  1. package/dist/.storybook/utilities.js +4 -4
  2. package/dist/api.js.map +2 -2
  3. package/dist/custom-elements.json +1211 -542
  4. package/dist/docs/affix/affix.md +111 -2
  5. package/dist/docs/affix/api.md +2 -2
  6. package/dist/docs/affix/styling.md +107 -0
  7. package/dist/docs/alert/alert.md +5 -5
  8. package/dist/docs/alert/api.md +4 -4
  9. package/dist/docs/attention/api.md +50 -2
  10. package/dist/docs/attention/attention.md +53 -3
  11. package/dist/docs/badge/api.md +50 -4
  12. package/dist/docs/badge/badge.md +50 -4
  13. package/dist/docs/box/api.md +2 -2
  14. package/dist/docs/box/box.md +4 -2
  15. package/dist/docs/breadcrumb-item/api.md +27 -0
  16. package/dist/docs/breadcrumb-item/breadcrumb-item.md +36 -0
  17. package/dist/docs/breadcrumbs/accessibility.md +8 -18
  18. package/dist/docs/breadcrumbs/breadcrumbs.md +123 -34
  19. package/dist/docs/breadcrumbs/examples.md +8 -8
  20. package/dist/docs/breadcrumbs/styling.md +96 -0
  21. package/dist/docs/breadcrumbs/usage.md +8 -8
  22. package/dist/docs/button/api.md +32 -24
  23. package/dist/docs/button/button.md +35 -24
  24. package/dist/docs/card/api.md +8 -0
  25. package/dist/docs/card/card.md +10 -0
  26. package/dist/docs/checkbox/api.md +52 -13
  27. package/dist/docs/checkbox/checkbox.md +231 -14
  28. package/dist/docs/checkbox/styling.md +173 -0
  29. package/dist/docs/checkbox-group/api.md +30 -6
  30. package/dist/docs/checkbox-group/checkbox-group.md +66 -36
  31. package/dist/docs/checkbox-group/styling.md +31 -29
  32. package/dist/docs/combobox/api.md +20 -12
  33. package/dist/docs/combobox/combobox.md +22 -12
  34. package/dist/docs/datepicker/api.md +22 -14
  35. package/dist/docs/datepicker/datepicker.md +24 -16
  36. package/dist/docs/expandable/api.md +6 -6
  37. package/dist/docs/expandable/expandable.md +8 -6
  38. package/dist/docs/icon/api.md +4 -4
  39. package/dist/docs/icon/icon.md +5 -5
  40. package/dist/docs/index.md +35 -32
  41. package/dist/docs/link/api.md +10 -10
  42. package/dist/docs/link/link.md +13 -11
  43. package/dist/docs/modal/api.md +20 -2
  44. package/dist/docs/modal/modal.md +101 -10
  45. package/dist/docs/modal/styling.md +75 -0
  46. package/dist/docs/modal/usage.md +4 -8
  47. package/dist/docs/modal-footer/modal-footer.md +2 -0
  48. package/dist/docs/modal-header/modal-header.md +2 -0
  49. package/dist/docs/page-indicator/page-indicator.md +2 -0
  50. package/dist/docs/pagination/api.md +4 -4
  51. package/dist/docs/pagination/pagination.md +6 -4
  52. package/dist/docs/pill/api.md +8 -8
  53. package/dist/docs/pill/pill.md +10 -8
  54. package/dist/docs/radio/radio.md +5 -1
  55. package/dist/docs/radio-group/api.md +4 -4
  56. package/dist/docs/radio-group/radio-group.md +186 -69
  57. package/dist/docs/radio-group/styling.md +179 -64
  58. package/dist/docs/select/api.md +10 -10
  59. package/dist/docs/select/select.md +103 -10
  60. package/dist/docs/select/styling.md +91 -0
  61. package/dist/docs/slider/api.md +38 -22
  62. package/dist/docs/slider/slider.md +40 -22
  63. package/dist/docs/slider-thumb/api.md +28 -12
  64. package/dist/docs/slider-thumb/slider-thumb.md +28 -12
  65. package/dist/docs/snackbar/accessibility.md +20 -0
  66. package/dist/docs/snackbar/api.md +30 -0
  67. package/dist/docs/snackbar/examples.md +191 -0
  68. package/dist/docs/snackbar/snackbar.md +387 -0
  69. package/dist/docs/snackbar/styling.md +72 -0
  70. package/dist/docs/snackbar/usage.md +60 -0
  71. package/dist/docs/snackbar-item/api.md +41 -0
  72. package/dist/docs/snackbar-item/snackbar-item.md +51 -0
  73. package/dist/docs/step/api.md +16 -0
  74. package/dist/docs/step/step.md +19 -1
  75. package/dist/docs/step-indicator/step-indicator.md +2 -0
  76. package/dist/docs/switch/api.md +8 -0
  77. package/dist/docs/switch/switch.md +10 -0
  78. package/dist/docs/tab/tab.md +2 -0
  79. package/dist/docs/tab-panel/tab-panel.md +3 -0
  80. package/dist/docs/tabs/api.md +3 -3
  81. package/dist/docs/tabs/tabs.md +5 -3
  82. package/dist/docs/textarea/api.md +54 -14
  83. package/dist/docs/textarea/styling.md +91 -0
  84. package/dist/docs/textarea/textarea.md +146 -19
  85. package/dist/docs/textfield/api.md +74 -34
  86. package/dist/docs/textfield/styling.md +95 -0
  87. package/dist/docs/textfield/textfield.md +171 -34
  88. package/dist/entrypoint-react.d.ts +38 -0
  89. package/dist/entrypoint-react.js +39 -0
  90. package/dist/index.d.ts +1007 -154
  91. package/dist/packages/affix/affix-styles.d.ts +8 -0
  92. package/dist/packages/affix/affix-styles.js +108 -0
  93. package/dist/packages/affix/affix.d.ts +12 -14
  94. package/dist/packages/affix/affix.hydration.test.d.ts +1 -1
  95. package/dist/packages/affix/affix.hydration.test.js +15 -15
  96. package/dist/packages/affix/affix.js +451 -320
  97. package/dist/packages/affix/affix.js.map +4 -4
  98. package/dist/packages/affix/affix.react.stories.d.ts +3 -3
  99. package/dist/packages/affix/affix.react.stories.js +3 -3
  100. package/dist/packages/affix/affix.react.test.js +5 -3
  101. package/dist/packages/affix/affix.stories.d.ts +3 -3
  102. package/dist/packages/affix/affix.stories.js +10 -10
  103. package/dist/packages/affix/affix.test.d.ts +1 -1
  104. package/dist/packages/affix/affix.test.js +10 -10
  105. package/dist/packages/affix/react.d.ts +8 -3
  106. package/dist/packages/affix/react.js +11 -6
  107. package/dist/packages/affix/styles.js +2 -2
  108. package/dist/packages/alert/alert.d.ts +9 -6
  109. package/dist/packages/alert/alert.hydration.test.d.ts +1 -1
  110. package/dist/packages/alert/alert.hydration.test.js +21 -21
  111. package/dist/packages/alert/alert.js +349 -324
  112. package/dist/packages/alert/alert.js.map +3 -3
  113. package/dist/packages/alert/alert.react.stories.d.ts +2 -2
  114. package/dist/packages/alert/alert.react.stories.js +13 -13
  115. package/dist/packages/alert/alert.stories.d.ts +4 -4
  116. package/dist/packages/alert/alert.stories.js +29 -27
  117. package/dist/packages/alert/alert.test.d.ts +1 -1
  118. package/dist/packages/alert/alert.test.js +34 -21
  119. package/dist/packages/alert/react.d.ts +8 -1
  120. package/dist/packages/alert/react.js +11 -4
  121. package/dist/packages/alert/styles.js +2 -2
  122. package/dist/packages/attention/attention.d.ts +14 -7
  123. package/dist/packages/attention/attention.hydration.test.d.ts +1 -1
  124. package/dist/packages/attention/attention.hydration.test.js +29 -29
  125. package/dist/packages/attention/attention.js +1744 -1681
  126. package/dist/packages/attention/attention.js.map +4 -4
  127. package/dist/packages/attention/attention.react.stories.d.ts +3 -3
  128. package/dist/packages/attention/attention.react.stories.js +13 -13
  129. package/dist/packages/attention/attention.react.test.js +11 -7
  130. package/dist/packages/attention/attention.stories.d.ts +4 -4
  131. package/dist/packages/attention/attention.stories.js +126 -117
  132. package/dist/packages/attention/attention.test.d.ts +1 -1
  133. package/dist/packages/attention/attention.test.js +18 -10
  134. package/dist/packages/attention/layout-styles.js +900 -900
  135. package/dist/packages/attention/react.d.ts +16 -6
  136. package/dist/packages/attention/react.js +22 -11
  137. package/dist/packages/attention/styles.js +2 -2
  138. package/dist/packages/badge/badge.d.ts +8 -3
  139. package/dist/packages/badge/badge.hydration.test.d.ts +1 -1
  140. package/dist/packages/badge/badge.hydration.test.js +25 -25
  141. package/dist/packages/badge/badge.js +281 -281
  142. package/dist/packages/badge/badge.js.map +3 -3
  143. package/dist/packages/badge/badge.react.stories.d.ts +3 -3
  144. package/dist/packages/badge/badge.react.stories.js +17 -17
  145. package/dist/packages/badge/badge.stories.d.ts +3 -3
  146. package/dist/packages/badge/badge.stories.js +22 -20
  147. package/dist/packages/badge/badge.test.d.ts +1 -1
  148. package/dist/packages/badge/badge.test.js +13 -11
  149. package/dist/packages/badge/react.d.ts +6 -1
  150. package/dist/packages/badge/react.js +9 -4
  151. package/dist/packages/badge/styles.js +2 -2
  152. package/dist/packages/box/box.d.ts +7 -2
  153. package/dist/packages/box/box.hydration.test.d.ts +1 -1
  154. package/dist/packages/box/box.hydration.test.js +14 -14
  155. package/dist/packages/box/box.js +288 -288
  156. package/dist/packages/box/box.js.map +3 -3
  157. package/dist/packages/box/box.react.stories.d.ts +4 -4
  158. package/dist/packages/box/box.react.stories.js +8 -8
  159. package/dist/packages/box/box.stories.d.ts +3 -3
  160. package/dist/packages/box/box.stories.js +25 -19
  161. package/dist/packages/box/box.test.d.ts +1 -1
  162. package/dist/packages/box/box.test.js +6 -6
  163. package/dist/packages/box/react.d.ts +6 -1
  164. package/dist/packages/box/react.js +9 -4
  165. package/dist/packages/box/slot.test.d.ts +1 -1
  166. package/dist/packages/box/slot.test.js +6 -6
  167. package/dist/packages/box/styles.js +2 -2
  168. package/dist/packages/breadcrumb-item/breadcrumb-item.d.ts +34 -0
  169. package/dist/packages/breadcrumb-item/breadcrumb-item.js +2529 -0
  170. package/dist/packages/breadcrumb-item/breadcrumb-item.js.map +7 -0
  171. package/dist/packages/breadcrumb-item/react.d.ts +8 -0
  172. package/dist/packages/breadcrumb-item/react.js +17 -0
  173. package/dist/packages/breadcrumb-item/styles.d.ts +4 -0
  174. package/dist/packages/breadcrumb-item/styles.js +81 -0
  175. package/dist/packages/breadcrumbs/breadcrumbs.d.ts +11 -4
  176. package/dist/packages/breadcrumbs/breadcrumbs.hydration.test.d.ts +1 -1
  177. package/dist/packages/breadcrumbs/breadcrumbs.hydration.test.js +55 -49
  178. package/dist/packages/breadcrumbs/breadcrumbs.js +288 -284
  179. package/dist/packages/breadcrumbs/breadcrumbs.js.map +4 -4
  180. package/dist/packages/breadcrumbs/breadcrumbs.react.stories.d.ts +4 -4
  181. package/dist/packages/breadcrumbs/breadcrumbs.react.stories.js +17 -16
  182. package/dist/packages/breadcrumbs/breadcrumbs.stories.d.ts +7 -8
  183. package/dist/packages/breadcrumbs/breadcrumbs.stories.js +30 -26
  184. package/dist/packages/breadcrumbs/breadcrumbs.test.d.ts +1 -1
  185. package/dist/packages/breadcrumbs/breadcrumbs.test.js +19 -17
  186. package/dist/packages/breadcrumbs/react.d.ts +8 -1
  187. package/dist/packages/breadcrumbs/react.js +11 -4
  188. package/dist/packages/breadcrumbs/styles.js +2 -2
  189. package/dist/packages/button/button.d.ts +22 -16
  190. package/dist/packages/button/button.hydration.test.d.ts +1 -1
  191. package/dist/packages/button/button.hydration.test.js +19 -19
  192. package/dist/packages/button/button.js +758 -711
  193. package/dist/packages/button/button.js.map +4 -4
  194. package/dist/packages/button/button.react.stories.d.ts +5 -5
  195. package/dist/packages/button/button.react.stories.js +30 -30
  196. package/dist/packages/button/button.react.test.js +13 -13
  197. package/dist/packages/button/button.stories.d.ts +4 -4
  198. package/dist/packages/button/button.stories.js +276 -167
  199. package/dist/packages/button/button.test.d.ts +1 -1
  200. package/dist/packages/button/button.test.js +36 -35
  201. package/dist/packages/button/react.d.ts +10 -3
  202. package/dist/packages/button/react.js +14 -7
  203. package/dist/packages/button/styles.js +373 -331
  204. package/dist/packages/card/card.d.ts +7 -2
  205. package/dist/packages/card/card.hydration.test.d.ts +1 -1
  206. package/dist/packages/card/card.hydration.test.js +14 -14
  207. package/dist/packages/card/card.js +310 -295
  208. package/dist/packages/card/card.js.map +4 -4
  209. package/dist/packages/card/card.react.stories.d.ts +4 -4
  210. package/dist/packages/card/card.react.stories.js +11 -11
  211. package/dist/packages/card/card.stories.d.ts +3 -3
  212. package/dist/packages/card/card.stories.js +36 -24
  213. package/dist/packages/card/card.test.d.ts +1 -1
  214. package/dist/packages/card/card.test.js +6 -6
  215. package/dist/packages/card/react.d.ts +6 -1
  216. package/dist/packages/card/react.js +9 -4
  217. package/dist/packages/card/styles.js +2 -2
  218. package/dist/packages/checkbox/checkbox.a11y.test.d.ts +1 -1
  219. package/dist/packages/checkbox/checkbox.a11y.test.js +47 -33
  220. package/dist/packages/checkbox/checkbox.d.ts +10 -4
  221. package/dist/packages/checkbox/checkbox.hydration.test.d.ts +1 -1
  222. package/dist/packages/checkbox/checkbox.hydration.test.js +21 -21
  223. package/dist/packages/checkbox/checkbox.js +481 -430
  224. package/dist/packages/checkbox/checkbox.js.map +3 -3
  225. package/dist/packages/checkbox/checkbox.react.stories.d.ts +4 -4
  226. package/dist/packages/checkbox/checkbox.react.stories.js +3 -3
  227. package/dist/packages/checkbox/checkbox.stories.d.ts +4 -4
  228. package/dist/packages/checkbox/checkbox.stories.js +99 -91
  229. package/dist/packages/checkbox/checkbox.test.d.ts +1 -1
  230. package/dist/packages/checkbox/checkbox.test.js +64 -64
  231. package/dist/packages/checkbox/react.d.ts +12 -3
  232. package/dist/packages/checkbox/react.js +13 -6
  233. package/dist/packages/checkbox/styles.js +183 -132
  234. package/dist/packages/checkbox-group/checkbox-group.a11y.test.d.ts +2 -2
  235. package/dist/packages/checkbox-group/checkbox-group.a11y.test.js +83 -73
  236. package/dist/packages/checkbox-group/checkbox-group.d.ts +13 -6
  237. package/dist/packages/checkbox-group/checkbox-group.hydration.test.d.ts +2 -2
  238. package/dist/packages/checkbox-group/checkbox-group.hydration.test.js +36 -19
  239. package/dist/packages/checkbox-group/checkbox-group.js +62 -57
  240. package/dist/packages/checkbox-group/checkbox-group.js.map +3 -3
  241. package/dist/packages/checkbox-group/checkbox-group.react.test.js +4 -4
  242. package/dist/packages/checkbox-group/checkbox-group.test.d.ts +2 -2
  243. package/dist/packages/checkbox-group/checkbox-group.test.js +183 -90
  244. package/dist/packages/checkbox-group/react.d.ts +10 -3
  245. package/dist/packages/checkbox-group/react.js +13 -6
  246. package/dist/packages/combobox/combobox.a11y.test.d.ts +2 -2
  247. package/dist/packages/combobox/combobox.a11y.test.js +72 -49
  248. package/dist/packages/combobox/combobox.d.ts +8 -3
  249. package/dist/packages/combobox/combobox.hydration.test.d.ts +1 -1
  250. package/dist/packages/combobox/combobox.hydration.test.js +45 -45
  251. package/dist/packages/combobox/combobox.js +337 -338
  252. package/dist/packages/combobox/combobox.js.map +4 -4
  253. package/dist/packages/combobox/combobox.react.stories.d.ts +45 -13
  254. package/dist/packages/combobox/combobox.react.stories.js +29 -29
  255. package/dist/packages/combobox/combobox.react.test.js +8 -8
  256. package/dist/packages/combobox/combobox.stories.d.ts +4 -4
  257. package/dist/packages/combobox/combobox.stories.js +100 -94
  258. package/dist/packages/combobox/combobox.test.d.ts +2 -2
  259. package/dist/packages/combobox/combobox.test.js +249 -133
  260. package/dist/packages/combobox/react.d.ts +28 -7
  261. package/dist/packages/combobox/react.js +23 -14
  262. package/dist/packages/combobox/styles.js +2 -3
  263. package/dist/packages/datepicker/DatePicker.test.d.ts +2 -2
  264. package/dist/packages/datepicker/DatePicker.test.js +49 -42
  265. package/dist/packages/datepicker/datepicker.d.ts +15 -12
  266. package/dist/packages/datepicker/datepicker.hydration.test.d.ts +1 -1
  267. package/dist/packages/datepicker/datepicker.hydration.test.js +21 -21
  268. package/dist/packages/datepicker/datepicker.js +673 -632
  269. package/dist/packages/datepicker/datepicker.js.map +4 -4
  270. package/dist/packages/datepicker/datepicker.react.stories.d.ts +17 -17
  271. package/dist/packages/datepicker/datepicker.react.stories.js +9 -9
  272. package/dist/packages/datepicker/datepicker.react.test.js +6 -6
  273. package/dist/packages/datepicker/datepicker.stories.d.ts +4 -4
  274. package/dist/packages/datepicker/datepicker.stories.js +32 -32
  275. package/dist/packages/datepicker/datepicker.test.d.ts +2 -2
  276. package/dist/packages/datepicker/datepicker.test.js +77 -79
  277. package/dist/packages/datepicker/react.d.ts +15 -9
  278. package/dist/packages/datepicker/react.js +21 -14
  279. package/dist/packages/datepicker/styles/w-datepicker-calendar.styles.js +13 -12
  280. package/dist/packages/datepicker/styles/w-datepicker-day.styles.js +58 -55
  281. package/dist/packages/datepicker/styles/w-datepicker-month.styles.js +60 -57
  282. package/dist/packages/datepicker/styles/w-datepicker.styles.js +87 -87
  283. package/dist/packages/datepicker/utils.d.ts +3 -0
  284. package/dist/packages/datepicker/utils.js +40 -1
  285. package/dist/packages/datepicker/utils.test.d.ts +1 -0
  286. package/dist/packages/datepicker/utils.test.js +29 -0
  287. package/dist/packages/expandable/expandable.d.ts +14 -7
  288. package/dist/packages/expandable/expandable.hydration.test.d.ts +1 -1
  289. package/dist/packages/expandable/expandable.hydration.test.js +21 -21
  290. package/dist/packages/expandable/expandable.js +359 -332
  291. package/dist/packages/expandable/expandable.js.map +4 -4
  292. package/dist/packages/expandable/expandable.react.stories.d.ts +3 -3
  293. package/dist/packages/expandable/expandable.react.stories.js +7 -7
  294. package/dist/packages/expandable/expandable.react.test.js +15 -7
  295. package/dist/packages/expandable/expandable.stories.d.ts +5 -5
  296. package/dist/packages/expandable/expandable.stories.js +51 -45
  297. package/dist/packages/expandable/expandable.test.d.ts +1 -1
  298. package/dist/packages/expandable/expandable.test.js +19 -17
  299. package/dist/packages/expandable/react.d.ts +7 -2
  300. package/dist/packages/expandable/react.js +14 -9
  301. package/dist/packages/expandable/styles.js +2 -2
  302. package/dist/packages/global.d.ts +1 -0
  303. package/dist/packages/global.js +5 -0
  304. package/dist/packages/i18n.d.ts +1 -1
  305. package/dist/packages/i18n.js +37 -29
  306. package/dist/packages/icon/icon.d.ts +10 -2
  307. package/dist/packages/icon/icon.hydration.test.d.ts +1 -1
  308. package/dist/packages/icon/icon.hydration.test.js +25 -25
  309. package/dist/packages/icon/icon.js +31 -26
  310. package/dist/packages/icon/icon.js.map +2 -2
  311. package/dist/packages/icon/icon.react.stories.d.ts +3 -2
  312. package/dist/packages/icon/icon.react.stories.js +284 -283
  313. package/dist/packages/icon/icon.stories.d.ts +7 -30
  314. package/dist/packages/icon/icon.stories.js +307 -297
  315. package/dist/packages/icon/icon.test.d.ts +1 -1
  316. package/dist/packages/icon/icon.test.js +36 -28
  317. package/dist/packages/icon/react.d.ts +4 -1
  318. package/dist/packages/icon/react.js +7 -4
  319. package/dist/packages/icon/style.js +24 -25
  320. package/dist/packages/interaction-type-detection.d.ts +22 -0
  321. package/dist/packages/interaction-type-detection.js +38 -0
  322. package/dist/packages/link/link.d.ts +14 -9
  323. package/dist/packages/link/link.hydration.test.d.ts +1 -1
  324. package/dist/packages/link/link.hydration.test.js +27 -27
  325. package/dist/packages/link/link.js +726 -679
  326. package/dist/packages/link/link.js.map +3 -3
  327. package/dist/packages/link/link.react.stories.d.ts +5 -5
  328. package/dist/packages/link/link.react.stories.js +42 -42
  329. package/dist/packages/link/link.react.test.js +5 -3
  330. package/dist/packages/link/link.stories.d.ts +3 -3
  331. package/dist/packages/link/link.stories.js +51 -51
  332. package/dist/packages/link/link.test.d.ts +1 -1
  333. package/dist/packages/link/link.test.js +11 -7
  334. package/dist/packages/link/react.d.ts +8 -3
  335. package/dist/packages/link/react.js +11 -6
  336. package/dist/packages/link/styles.js +63 -58
  337. package/dist/packages/modal/index.d.ts +7 -7
  338. package/dist/packages/modal/index.js +7 -7
  339. package/dist/packages/modal/modal.d.ts +26 -4
  340. package/dist/packages/modal/modal.hydration.test.d.ts +1 -1
  341. package/dist/packages/modal/modal.hydration.test.js +12 -12
  342. package/dist/packages/modal/modal.js +456 -409
  343. package/dist/packages/modal/modal.js.map +4 -4
  344. package/dist/packages/modal/modal.react.stories.d.ts +7 -7
  345. package/dist/packages/modal/modal.react.stories.js +15 -6
  346. package/dist/packages/modal/modal.react.test.js +5 -5
  347. package/dist/packages/modal/modal.stories.d.ts +9 -8
  348. package/dist/packages/modal/modal.stories.js +266 -248
  349. package/dist/packages/modal/react.d.ts +40 -8
  350. package/dist/packages/modal/react.js +45 -13
  351. package/dist/packages/modal/styles.d.ts +1 -0
  352. package/dist/packages/modal/styles.js +171 -0
  353. package/dist/packages/modal/util.js +3 -1
  354. package/dist/packages/modal-footer/modal-footer.d.ts +13 -2
  355. package/dist/packages/modal-footer/modal-footer.js +299 -296
  356. package/dist/packages/modal-footer/modal-footer.js.map +4 -4
  357. package/dist/packages/modal-footer/react.d.ts +6 -1
  358. package/dist/packages/modal-footer/react.js +9 -4
  359. package/dist/packages/modal-footer/styles.d.ts +1 -0
  360. package/dist/packages/modal-footer/styles.js +22 -0
  361. package/dist/packages/modal-header/modal-header.d.ts +21 -7
  362. package/dist/packages/modal-header/modal-header.js +451 -422
  363. package/dist/packages/modal-header/modal-header.js.map +4 -4
  364. package/dist/packages/modal-header/modal-header.react.test.js +5 -3
  365. package/dist/packages/modal-header/react.d.ts +9 -4
  366. package/dist/packages/modal-header/react.js +13 -8
  367. package/dist/packages/modal-header/styles.d.ts +1 -0
  368. package/dist/packages/modal-header/styles.js +96 -0
  369. package/dist/packages/page-indicator/page-indicator.d.ts +8 -5
  370. package/dist/packages/page-indicator/page-indicator.hydration.test.d.ts +1 -1
  371. package/dist/packages/page-indicator/page-indicator.hydration.test.js +22 -22
  372. package/dist/packages/page-indicator/page-indicator.js +29 -29
  373. package/dist/packages/page-indicator/page-indicator.js.map +4 -4
  374. package/dist/packages/page-indicator/page-indicator.react.stories.d.ts +3 -3
  375. package/dist/packages/page-indicator/page-indicator.react.stories.js +11 -11
  376. package/dist/packages/page-indicator/page-indicator.react.test.js +5 -5
  377. package/dist/packages/page-indicator/page-indicator.stories.d.ts +9 -27
  378. package/dist/packages/page-indicator/page-indicator.stories.js +63 -32
  379. package/dist/packages/page-indicator/page-indicator.test.d.ts +1 -1
  380. package/dist/packages/page-indicator/page-indicator.test.js +110 -70
  381. package/dist/packages/page-indicator/react.d.ts +9 -2
  382. package/dist/packages/page-indicator/react.js +14 -7
  383. package/dist/packages/page-indicator/style.js +21 -21
  384. package/dist/packages/pagination/pagination.a11y.test.d.ts +1 -1
  385. package/dist/packages/pagination/pagination.a11y.test.js +59 -25
  386. package/dist/packages/pagination/pagination.d.ts +17 -11
  387. package/dist/packages/pagination/pagination.hydration.test.d.ts +1 -1
  388. package/dist/packages/pagination/pagination.hydration.test.js +19 -19
  389. package/dist/packages/pagination/pagination.js +385 -354
  390. package/dist/packages/pagination/pagination.js.map +4 -4
  391. package/dist/packages/pagination/pagination.react.stories.d.ts +19 -11
  392. package/dist/packages/pagination/pagination.react.stories.js +8 -8
  393. package/dist/packages/pagination/pagination.react.test.js +6 -6
  394. package/dist/packages/pagination/pagination.stories.d.ts +3 -3
  395. package/dist/packages/pagination/pagination.stories.js +18 -18
  396. package/dist/packages/pagination/pagination.test.d.ts +1 -1
  397. package/dist/packages/pagination/pagination.test.js +146 -72
  398. package/dist/packages/pagination/react.d.ts +15 -6
  399. package/dist/packages/pagination/react.js +17 -10
  400. package/dist/packages/pagination/styles.js +2 -2
  401. package/dist/packages/pill/pill.d.ts +13 -6
  402. package/dist/packages/pill/pill.hydration.test.d.ts +1 -1
  403. package/dist/packages/pill/pill.hydration.test.js +14 -14
  404. package/dist/packages/pill/pill.js +337 -314
  405. package/dist/packages/pill/pill.js.map +4 -4
  406. package/dist/packages/pill/pill.react.stories.d.ts +15 -11
  407. package/dist/packages/pill/pill.react.stories.js +7 -3
  408. package/dist/packages/pill/pill.react.test.js +8 -8
  409. package/dist/packages/pill/pill.stories.d.ts +3 -3
  410. package/dist/packages/pill/pill.stories.js +8 -8
  411. package/dist/packages/pill/pill.test.d.ts +1 -1
  412. package/dist/packages/pill/pill.test.js +17 -15
  413. package/dist/packages/pill/react.d.ts +11 -6
  414. package/dist/packages/pill/react.js +23 -14
  415. package/dist/packages/pill/styles.js +2 -2
  416. package/dist/packages/radio/base-element.d.ts +3 -3
  417. package/dist/packages/radio/base-element.js +3 -3
  418. package/dist/packages/radio/custom-error-validator.d.ts +1 -1
  419. package/dist/packages/radio/custom-error-validator.js +3 -3
  420. package/dist/packages/radio/form-associated-element.d.ts +9 -9
  421. package/dist/packages/radio/form-associated-element.js +27 -26
  422. package/dist/packages/radio/host-styles.js +9 -9
  423. package/dist/packages/radio/invalid.d.ts +1 -1
  424. package/dist/packages/radio/invalid.js +1 -1
  425. package/dist/packages/radio/radio-styles.js +199 -160
  426. package/dist/packages/radio/radio.a11y.test.d.ts +2 -2
  427. package/dist/packages/radio/radio.a11y.test.js +60 -58
  428. package/dist/packages/radio/radio.d.ts +10 -4
  429. package/dist/packages/radio/radio.hydration.test.d.ts +1 -1
  430. package/dist/packages/radio/radio.hydration.test.js +23 -14
  431. package/dist/packages/radio/radio.js +491 -452
  432. package/dist/packages/radio/radio.js.map +3 -3
  433. package/dist/packages/radio/radio.react.stories.d.ts +2 -2
  434. package/dist/packages/radio/radio.react.stories.js +3 -3
  435. package/dist/packages/radio/radio.stories.d.ts +4 -4
  436. package/dist/packages/radio/radio.stories.js +152 -136
  437. package/dist/packages/radio/radio.test.d.ts +1 -1
  438. package/dist/packages/radio/radio.test.js +74 -73
  439. package/dist/packages/radio/react.d.ts +8 -1
  440. package/dist/packages/radio/react.js +11 -4
  441. package/dist/packages/radio/required-validator.d.ts +1 -1
  442. package/dist/packages/radio/required-validator.js +12 -7
  443. package/dist/packages/radio/slot.d.ts +1 -1
  444. package/dist/packages/radio/slot.js +11 -8
  445. package/dist/packages/radio/watch.d.ts +1 -1
  446. package/dist/packages/radio/watch.js +3 -1
  447. package/dist/packages/radio-group/radio-group-styles.js +121 -88
  448. package/dist/packages/radio-group/radio-group.a11y.test.d.ts +2 -2
  449. package/dist/packages/radio-group/radio-group.a11y.test.js +81 -79
  450. package/dist/packages/radio-group/radio-group.d.ts +10 -8
  451. package/dist/packages/radio-group/radio-group.hydration.test.d.ts +2 -2
  452. package/dist/packages/radio-group/radio-group.hydration.test.js +29 -18
  453. package/dist/packages/radio-group/radio-group.js +654 -566
  454. package/dist/packages/radio-group/radio-group.js.map +4 -4
  455. package/dist/packages/radio-group/radio-group.react.test.js +4 -4
  456. package/dist/packages/radio-group/radio-group.test.d.ts +2 -2
  457. package/dist/packages/radio-group/radio-group.test.js +304 -230
  458. package/dist/packages/radio-group/react.d.ts +14 -7
  459. package/dist/packages/radio-group/react.js +18 -10
  460. package/dist/packages/select/input-styles.d.ts +11 -0
  461. package/dist/packages/select/input-styles.js +88 -0
  462. package/dist/packages/select/locales/da/messages.mjs +1 -1
  463. package/dist/packages/select/locales/en/messages.mjs +1 -1
  464. package/dist/packages/select/locales/fi/messages.mjs +1 -1
  465. package/dist/packages/select/locales/nb/messages.mjs +1 -1
  466. package/dist/packages/select/locales/sv/messages.mjs +1 -1
  467. package/dist/packages/select/react.d.ts +11 -5
  468. package/dist/packages/select/react.js +16 -11
  469. package/dist/packages/select/select.a11y.test.d.ts +1 -1
  470. package/dist/packages/select/select.a11y.test.js +98 -91
  471. package/dist/packages/select/select.d.ts +18 -13
  472. package/dist/packages/select/select.hydration.test.d.ts +1 -1
  473. package/dist/packages/select/select.hydration.test.js +16 -16
  474. package/dist/packages/select/select.js +432 -336
  475. package/dist/packages/select/select.js.map +4 -4
  476. package/dist/packages/select/select.react.stories.d.ts +10 -10
  477. package/dist/packages/select/select.react.stories.js +19 -14
  478. package/dist/packages/select/select.react.test.js +6 -6
  479. package/dist/packages/select/select.stories.d.ts +3 -3
  480. package/dist/packages/select/select.stories.js +51 -48
  481. package/dist/packages/select/select.test.d.ts +1 -1
  482. package/dist/packages/select/select.test.js +227 -178
  483. package/dist/packages/select/styles.js +2 -2
  484. package/dist/packages/slider/index.d.ts +2 -2
  485. package/dist/packages/slider/index.js +2 -2
  486. package/dist/packages/slider/locales/da/messages.mjs +1 -1
  487. package/dist/packages/slider/locales/en/messages.mjs +1 -1
  488. package/dist/packages/slider/locales/fi/messages.mjs +1 -1
  489. package/dist/packages/slider/locales/nb/messages.mjs +1 -1
  490. package/dist/packages/slider/locales/sv/messages.mjs +1 -1
  491. package/dist/packages/slider/react.d.ts +9 -4
  492. package/dist/packages/slider/react.js +14 -9
  493. package/dist/packages/slider/slider.d.ts +32 -17
  494. package/dist/packages/slider/slider.hydration.test.d.ts +1 -1
  495. package/dist/packages/slider/slider.hydration.test.js +39 -20
  496. package/dist/packages/slider/slider.js +523 -466
  497. package/dist/packages/slider/slider.js.map +4 -4
  498. package/dist/packages/slider/slider.react.stories.d.ts +4 -4
  499. package/dist/packages/slider/slider.react.stories.js +31 -34
  500. package/dist/packages/slider/slider.react.test.js +6 -6
  501. package/dist/packages/slider/slider.stories.d.ts +9 -7
  502. package/dist/packages/slider/slider.stories.js +369 -340
  503. package/dist/packages/slider/slider.test.d.ts +5 -5
  504. package/dist/packages/slider/slider.test.js +476 -336
  505. package/dist/packages/slider/styles/w-slider.styles.js +166 -148
  506. package/dist/packages/slider/styles.js +2 -2
  507. package/dist/packages/slider-thumb/oddbird-css-anchor-positioning.d.ts +1 -1
  508. package/dist/packages/slider-thumb/oddbird-css-anchor-positioning.js +1 -1
  509. package/dist/packages/slider-thumb/react.d.ts +16 -5
  510. package/dist/packages/slider-thumb/react.js +16 -9
  511. package/dist/packages/slider-thumb/slider-thumb.d.ts +22 -17
  512. package/dist/packages/slider-thumb/slider-thumb.hydration.test.d.ts +1 -1
  513. package/dist/packages/slider-thumb/slider-thumb.hydration.test.js +26 -17
  514. package/dist/packages/slider-thumb/slider-thumb.js +549 -552
  515. package/dist/packages/slider-thumb/slider-thumb.js.map +4 -4
  516. package/dist/packages/slider-thumb/slider-thumb.react.test.js +9 -5
  517. package/dist/packages/slider-thumb/styles/w-slider-thumb.styles.js +189 -188
  518. package/dist/packages/slider-thumb/styles.d.ts +1 -0
  519. package/dist/packages/slider-thumb/styles.js +2 -0
  520. package/dist/packages/snackbar/locales/da/messages.d.mts +1 -0
  521. package/dist/packages/snackbar/locales/da/messages.mjs +1 -0
  522. package/dist/packages/snackbar/locales/en/messages.d.mts +1 -0
  523. package/dist/packages/snackbar/locales/en/messages.mjs +1 -0
  524. package/dist/packages/snackbar/locales/fi/messages.d.mts +1 -0
  525. package/dist/packages/snackbar/locales/fi/messages.mjs +1 -0
  526. package/dist/packages/snackbar/locales/nb/messages.d.mts +1 -0
  527. package/dist/packages/snackbar/locales/nb/messages.mjs +1 -0
  528. package/dist/packages/snackbar/locales/sv/messages.d.mts +1 -0
  529. package/dist/packages/snackbar/locales/sv/messages.mjs +1 -0
  530. package/dist/packages/snackbar/react.d.ts +41 -0
  531. package/dist/packages/snackbar/react.js +50 -0
  532. package/dist/packages/snackbar/snackbar.d.ts +134 -0
  533. package/dist/packages/snackbar/snackbar.hydration.test.d.ts +1 -0
  534. package/dist/packages/snackbar/snackbar.hydration.test.js +13 -0
  535. package/dist/packages/snackbar/snackbar.js +2665 -0
  536. package/dist/packages/snackbar/snackbar.js.map +7 -0
  537. package/dist/packages/snackbar/snackbar.react.stories.d.ts +12 -0
  538. package/dist/packages/snackbar/snackbar.react.stories.js +160 -0
  539. package/dist/packages/snackbar/snackbar.stories.d.ts +20 -0
  540. package/dist/packages/snackbar/snackbar.stories.js +363 -0
  541. package/dist/packages/snackbar/snackbar.test.d.ts +4 -0
  542. package/dist/packages/snackbar/snackbar.test.js +17 -0
  543. package/dist/packages/snackbar/styles.d.ts +1 -0
  544. package/dist/packages/snackbar/styles.js +35 -0
  545. package/dist/packages/snackbar-item/react.d.ts +12 -0
  546. package/dist/packages/snackbar-item/react.js +23 -0
  547. package/dist/packages/snackbar-item/snackbar-item.d.ts +71 -0
  548. package/dist/packages/snackbar-item/snackbar-item.js +2620 -0
  549. package/dist/packages/snackbar-item/snackbar-item.js.map +7 -0
  550. package/dist/packages/snackbar-item/snackbar-item.react.test.d.ts +1 -0
  551. package/dist/packages/snackbar-item/snackbar-item.react.test.js +5 -0
  552. package/dist/packages/snackbar-item/styles.d.ts +1 -0
  553. package/dist/packages/snackbar-item/styles.js +133 -0
  554. package/dist/packages/step/react.d.ts +6 -1
  555. package/dist/packages/step/react.js +9 -4
  556. package/dist/packages/step/step.d.ts +10 -3
  557. package/dist/packages/step/step.hydration.test.d.ts +1 -1
  558. package/dist/packages/step/step.hydration.test.js +10 -10
  559. package/dist/packages/step/step.js +336 -314
  560. package/dist/packages/step/step.js.map +4 -4
  561. package/dist/packages/step/styles.d.ts +1 -0
  562. package/dist/packages/step/styles.js +2 -0
  563. package/dist/packages/step-indicator/index.d.ts +2 -2
  564. package/dist/packages/step-indicator/index.js +2 -2
  565. package/dist/packages/step-indicator/react.d.ts +7 -2
  566. package/dist/packages/step-indicator/react.js +10 -5
  567. package/dist/packages/step-indicator/step-indicator.a11y.test.d.ts +2 -2
  568. package/dist/packages/step-indicator/step-indicator.a11y.test.js +48 -46
  569. package/dist/packages/step-indicator/step-indicator.d.ts +8 -1
  570. package/dist/packages/step-indicator/step-indicator.hydration.test.d.ts +1 -1
  571. package/dist/packages/step-indicator/step-indicator.hydration.test.js +10 -10
  572. package/dist/packages/step-indicator/step-indicator.js +285 -281
  573. package/dist/packages/step-indicator/step-indicator.js.map +3 -3
  574. package/dist/packages/step-indicator/stepindicator.react.stories.d.ts +2 -2
  575. package/dist/packages/step-indicator/stepindicator.react.stories.js +3 -3
  576. package/dist/packages/step-indicator/stepindicator.stories.d.ts +3 -3
  577. package/dist/packages/step-indicator/stepindicator.stories.js +129 -129
  578. package/dist/packages/step-indicator/styles.js +2 -2
  579. package/dist/packages/styles.js +277 -275
  580. package/dist/packages/switch/react.d.ts +9 -3
  581. package/dist/packages/switch/react.js +11 -6
  582. package/dist/packages/switch/styles.js +2 -2
  583. package/dist/packages/switch/switch.a11y.test.d.ts +1 -1
  584. package/dist/packages/switch/switch.a11y.test.js +46 -38
  585. package/dist/packages/switch/switch.d.ts +10 -3
  586. package/dist/packages/switch/switch.hydration.test.d.ts +1 -1
  587. package/dist/packages/switch/switch.hydration.test.js +23 -23
  588. package/dist/packages/switch/switch.js +304 -304
  589. package/dist/packages/switch/switch.js.map +3 -3
  590. package/dist/packages/switch/switch.react.stories.d.ts +4 -4
  591. package/dist/packages/switch/switch.react.stories.js +2 -2
  592. package/dist/packages/switch/switch.stories.d.ts +2 -2
  593. package/dist/packages/switch/switch.stories.js +42 -37
  594. package/dist/packages/switch/switch.test.d.ts +1 -1
  595. package/dist/packages/switch/switch.test.js +30 -35
  596. package/dist/packages/tab/react.d.ts +12 -7
  597. package/dist/packages/tab/react.js +14 -10
  598. package/dist/packages/tab/styles.d.ts +1 -0
  599. package/dist/packages/tab/styles.js +2 -0
  600. package/dist/packages/tab/tab.d.ts +13 -6
  601. package/dist/packages/tab/tab.hydration.test.d.ts +1 -1
  602. package/dist/packages/tab/tab.hydration.test.js +18 -12
  603. package/dist/packages/tab/tab.js +309 -308
  604. package/dist/packages/tab/tab.js.map +4 -4
  605. package/dist/packages/tab/tab.react.test.js +5 -3
  606. package/dist/packages/tab-panel/react.d.ts +10 -2
  607. package/dist/packages/tab-panel/react.js +18 -5
  608. package/dist/packages/tab-panel/tab-panel.d.ts +6 -3
  609. package/dist/packages/tab-panel/tab-panel.hydration.test.d.ts +1 -1
  610. package/dist/packages/tab-panel/tab-panel.hydration.test.js +13 -10
  611. package/dist/packages/tab-panel/tab-panel.js +293 -291
  612. package/dist/packages/tab-panel/tab-panel.js.map +3 -3
  613. package/dist/packages/tabs/index.d.ts +4 -4
  614. package/dist/packages/tabs/index.js +3 -3
  615. package/dist/packages/tabs/react.d.ts +31 -8
  616. package/dist/packages/tabs/react.js +34 -9
  617. package/dist/packages/tabs/styles.js +2 -2
  618. package/dist/packages/tabs/tabs.a11y.test.d.ts +3 -3
  619. package/dist/packages/tabs/tabs.a11y.test.js +188 -169
  620. package/dist/packages/tabs/tabs.d.ts +9 -6
  621. package/dist/packages/tabs/tabs.hydration.test.d.ts +3 -1
  622. package/dist/packages/tabs/tabs.hydration.test.js +22 -8
  623. package/dist/packages/tabs/tabs.js +293 -286
  624. package/dist/packages/tabs/tabs.js.map +3 -3
  625. package/dist/packages/tabs/tabs.react.stories.d.ts +12 -10
  626. package/dist/packages/tabs/tabs.react.stories.js +28 -28
  627. package/dist/packages/tabs/tabs.stories.d.ts +4 -4
  628. package/dist/packages/tabs/tabs.stories.js +101 -95
  629. package/dist/packages/tabs/tabs.test.d.ts +3 -3
  630. package/dist/packages/tabs/tabs.test.js +136 -122
  631. package/dist/packages/textarea/input-styles.d.ts +11 -0
  632. package/dist/packages/textarea/input-styles.js +88 -0
  633. package/dist/packages/textarea/locales/da/messages.mjs +1 -1
  634. package/dist/packages/textarea/locales/en/messages.mjs +1 -1
  635. package/dist/packages/textarea/locales/fi/messages.mjs +1 -1
  636. package/dist/packages/textarea/locales/nb/messages.mjs +1 -1
  637. package/dist/packages/textarea/locales/sv/messages.mjs +1 -1
  638. package/dist/packages/textarea/react.d.ts +17 -11
  639. package/dist/packages/textarea/react.js +22 -17
  640. package/dist/packages/textarea/styles.js +2 -2
  641. package/dist/packages/textarea/textarea.a11y.test.d.ts +1 -1
  642. package/dist/packages/textarea/textarea.a11y.test.js +90 -58
  643. package/dist/packages/textarea/textarea.d.ts +20 -20
  644. package/dist/packages/textarea/textarea.hydration.test.d.ts +1 -1
  645. package/dist/packages/textarea/textarea.hydration.test.js +19 -19
  646. package/dist/packages/textarea/textarea.js +385 -304
  647. package/dist/packages/textarea/textarea.js.map +4 -4
  648. package/dist/packages/textarea/textarea.react.stories.d.ts +38 -21
  649. package/dist/packages/textarea/textarea.react.stories.js +30 -13
  650. package/dist/packages/textarea/textarea.react.test.js +7 -7
  651. package/dist/packages/textarea/textarea.stories.d.ts +3 -3
  652. package/dist/packages/textarea/textarea.stories.js +44 -42
  653. package/dist/packages/textarea/textarea.test.d.ts +1 -1
  654. package/dist/packages/textarea/textarea.test.js +197 -88
  655. package/dist/packages/textfield/input-styles.d.ts +11 -0
  656. package/dist/packages/textfield/input-styles.js +88 -0
  657. package/dist/packages/textfield/locales/da/messages.d.mts +1 -0
  658. package/dist/packages/textfield/locales/da/messages.mjs +1 -0
  659. package/dist/packages/textfield/locales/en/messages.d.mts +1 -0
  660. package/dist/packages/textfield/locales/en/messages.mjs +1 -0
  661. package/dist/packages/textfield/locales/fi/messages.d.mts +1 -0
  662. package/dist/packages/textfield/locales/fi/messages.mjs +1 -0
  663. package/dist/packages/textfield/locales/nb/messages.d.mts +1 -0
  664. package/dist/packages/textfield/locales/nb/messages.mjs +1 -0
  665. package/dist/packages/textfield/locales/sv/messages.d.mts +1 -0
  666. package/dist/packages/textfield/locales/sv/messages.mjs +1 -0
  667. package/dist/packages/textfield/react.d.ts +17 -11
  668. package/dist/packages/textfield/react.js +22 -17
  669. package/dist/packages/textfield/react.test.d.ts +1 -0
  670. package/dist/packages/textfield/react.test.js +20 -0
  671. package/dist/packages/textfield/styles/w-textfield.styles.js +60 -58
  672. package/dist/packages/textfield/styles.js +2 -2
  673. package/dist/packages/textfield/textfield.d.ts +38 -26
  674. package/dist/packages/textfield/textfield.hydration.test.d.ts +1 -1
  675. package/dist/packages/textfield/textfield.hydration.test.js +19 -19
  676. package/dist/packages/textfield/textfield.js +468 -373
  677. package/dist/packages/textfield/textfield.js.map +4 -4
  678. package/dist/packages/textfield/textfield.react.stories.d.ts +51 -21
  679. package/dist/packages/textfield/textfield.react.stories.js +63 -31
  680. package/dist/packages/textfield/textfield.react.test.js +7 -7
  681. package/dist/packages/textfield/textfield.stories.d.ts +4 -4
  682. package/dist/packages/textfield/textfield.stories.js +107 -89
  683. package/dist/packages/textfield/textfield.test.d.ts +2 -2
  684. package/dist/packages/textfield/textfield.test.js +174 -71
  685. package/dist/packages/toast/api.d.ts +2 -2
  686. package/dist/packages/toast/api.js +3 -3
  687. package/dist/packages/toast/index.d.ts +5 -5
  688. package/dist/packages/toast/index.js +5 -5
  689. package/dist/packages/toast/styles.js +2 -2
  690. package/dist/packages/toast/toast.d.ts +10 -5
  691. package/dist/packages/toast/toast.js +349 -320
  692. package/dist/packages/toast/toast.js.map +4 -4
  693. package/dist/packages/toast/toast.stories.d.ts +4 -4
  694. package/dist/packages/toast/toast.stories.js +37 -16
  695. package/dist/packages/toast/toast.test.d.ts +1 -1
  696. package/dist/packages/toast/toast.test.js +48 -31
  697. package/dist/packages/toast/types.d.ts +1 -1
  698. package/dist/packages/toast-container/styles.d.ts +1 -0
  699. package/dist/packages/toast-container/styles.js +2 -0
  700. package/dist/packages/toast-container/toast-container.d.ts +8 -3
  701. package/dist/packages/toast-container/toast-container.js +295 -294
  702. package/dist/packages/toast-container/toast-container.js.map +4 -4
  703. package/dist/packages/types.d.ts +16 -0
  704. package/dist/packages/types.js +1 -0
  705. package/dist/packages/utils/element-collapse.d.ts +12 -0
  706. package/dist/packages/utils/element-collapse.js +102 -0
  707. package/dist/packages/utils/expand-transition.d.ts +1 -1
  708. package/dist/packages/utils/expand-transition.js +12 -10
  709. package/dist/packages/utils/unstyled-heading.d.ts +1 -1
  710. package/dist/packages/utils/unstyled-heading.js +4 -4
  711. package/dist/packages/utils/window-exists.js +1 -1
  712. package/dist/packages/utils.js +2 -2
  713. package/dist/setup-tests.d.ts +3 -3
  714. package/dist/setup-tests.js +16 -13
  715. package/dist/tests/react-hydration.js +29 -30
  716. package/dist/tests/react-ssr-attributes.d.ts +1 -1
  717. package/dist/tests/react-ssr-attributes.js +4 -4
  718. package/dist/web-types.json +458 -256
  719. package/eik/index.js +20 -2460
  720. package/package.json +21 -129
  721. package/dist/packages/slider/Slider.d.ts +0 -2
  722. package/dist/packages/slider/Slider.js +0 -8
  723. package/dist/packages/slider-thumb/SliderThumb.d.ts +0 -2
  724. package/dist/packages/slider-thumb/SliderThumb.js +0 -8
@@ -1,210 +1,227 @@
1
- import { userEvent } from 'vitest/browser';
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 () => {
1
+ import { i18n } from "@lingui/core";
2
+ import { userEvent } from "vitest/browser";
3
+ import { html } from "lit";
4
+ import { expect, test } from "vitest";
5
+ import { render } from "vitest-browser-lit";
6
+ import "../attention/attention.js";
7
+ import "../affix/affix.js";
8
+ import "../textfield/textfield.js";
9
+ import "./slider.js";
10
+ import "../slider-thumb/slider-thumb.js";
11
+ import { messages } from "./locales/en/messages.mjs";
12
+ import { messages as nbMessages } from "./locales/nb/messages.mjs";
13
+ // Initialize i18n with English locale for tests
14
+ i18n.load("en", messages);
15
+ i18n.load("nb", nbMessages);
16
+ i18n.activate("en");
17
+ test("single slider starts with a default value equal to max", async () => {
11
18
  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
- `;
19
+ <form data-testid="form">
20
+ <w-slider label="Single" min="0" max="100">
21
+ <w-slider-thumb name="value"></w-slider-thumb>
22
+ </w-slider>
23
+ </form>
24
+ `;
18
25
  const page = render(component);
19
- await expect.element(page.getByLabelText('Single').first()).toHaveValue('100');
26
+ await expect
27
+ .element(page.getByLabelText("Single").first())
28
+ .toHaveValue("100");
20
29
  });
21
- test('range slider starts with a default from value equal to min, and to value equal to max', async () => {
30
+ test("range slider starts with a default from value equal to min, and to value equal to max", async () => {
22
31
  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
- `;
32
+ <form data-testid="form">
33
+ <w-slider label="Range" min="0" max="100">
34
+ <w-slider-thumb
35
+ aria-label="From"
36
+ name="rangefrom"
37
+ slot="from"
38
+ ></w-slider-thumb>
39
+ <w-slider-thumb
40
+ aria-label="To"
41
+ name="rangeto"
42
+ slot="to"
43
+ ></w-slider-thumb>
44
+ </w-slider>
45
+ </form>
46
+ `;
30
47
  const page = render(component);
31
- await expect.element(page.getByLabelText('From').first()).toHaveValue('0');
32
- await expect.element(page.getByLabelText('To').first()).toHaveValue('100');
48
+ await expect.element(page.getByLabelText("From").first()).toHaveValue("0");
49
+ await expect.element(page.getByLabelText("To").first()).toHaveValue("100");
33
50
  });
34
- test('can set slider value via the range input', async () => {
51
+ test("can set slider value via the range input", async () => {
35
52
  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
- `;
53
+ <form data-testid="form">
54
+ <w-slider label="Single" min="0" max="100">
55
+ <w-slider-thumb name="value"></w-slider-thumb>
56
+ </w-slider>
57
+ </form>
58
+ `;
42
59
  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');
60
+ await userEvent.type(page.getByLabelText("Single").first(), "{ArrowLeft}{ArrowLeft}{ArrowLeft}");
61
+ await expect.element(page.getByLabelText("Single").first()).toHaveValue("97");
62
+ await expect.element(page.getByRole("spinbutton")).toHaveValue(97); // keeps value in sync between inputs
63
+ const formData = new FormData(page.getByTestId("form").element());
64
+ expect(formData.get("value")).toBe("97");
48
65
  });
49
- test('can set slider value via the number input', async () => {
66
+ test("can set slider value via the number input", async () => {
50
67
  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
- `;
68
+ <form data-testid="form">
69
+ <w-slider label="Single" min="0" max="100">
70
+ <w-slider-thumb name="value"></w-slider-thumb>
71
+ </w-slider>
72
+ </form>
73
+ `;
57
74
  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');
75
+ await page.getByRole("spinbutton").fill("50");
76
+ await expect.element(page.getByRole("spinbutton")).toHaveValue(50);
77
+ await expect.element(page.getByLabelText("Single").first()).toHaveValue("50"); // keeps value in sync between inputs
78
+ const formData = new FormData(page.getByTestId("form").element());
79
+ expect(formData.get("value")).toBe("50");
63
80
  });
64
- test('can increment and decrement the slider values with arrow keys in the number input', async () => {
81
+ test("can increment and decrement the slider values with arrow keys in the number input", async () => {
65
82
  const component = html `
66
- <form data-testid="form">
67
- <w-slider
68
- label="Model year"
69
- min="1950"
70
- max="2025"
71
- open-ended
72
- >
73
- <w-slider-thumb
74
- slot="from"
75
- aria-label="From year"
76
- name="from-year"
77
- ></w-slider-thumb>
78
- <w-slider-thumb
79
- slot="to"
80
- aria-label="To year"
81
- name="to-year"
82
- ></w-slider-thumb>
83
- </w-slider>
84
- </form>
85
- `;
83
+ <form data-testid="form">
84
+ <w-slider label="Model year" min="1950" max="2025" open-ended>
85
+ <w-slider-thumb
86
+ slot="from"
87
+ aria-label="From year"
88
+ name="from-year"
89
+ ></w-slider-thumb>
90
+ <w-slider-thumb
91
+ slot="to"
92
+ aria-label="To year"
93
+ name="to-year"
94
+ ></w-slider-thumb>
95
+ </w-slider>
96
+ </form>
97
+ `;
86
98
  const page = render(component);
87
- await userEvent.type(page.getByRole('spinbutton').first(), '{ArrowUp}');
99
+ await userEvent.type(page.getByRole("spinbutton").first(), "{ArrowUp}");
88
100
  // Go from Min "beyond" 1950 to 1950
89
- await expect.element(page.getByRole('spinbutton').first()).toHaveValue(1950);
90
- await expect.element(page.getByLabelText('From year').first()).toHaveValue('1950'); // keeps value in sync between inputs
91
- await userEvent.type(page.getByRole('spinbutton').last(), '{ArrowDown}');
101
+ await expect.element(page.getByRole("spinbutton").first()).toHaveValue(1950);
102
+ await expect
103
+ .element(page.getByLabelText("From year").first())
104
+ .toHaveValue("1950"); // keeps value in sync between inputs
105
+ await userEvent.type(page.getByRole("spinbutton").last(), "{ArrowDown}");
92
106
  // Go from Max "beyond" 2025 to 2025
93
- await expect.element(page.getByRole('spinbutton').last()).toHaveValue(2025);
94
- await expect.element(page.getByLabelText('To year').first()).toHaveValue('2025'); // keeps value in sync between inputs
95
- const formData = new FormData(page.getByTestId('form').element());
96
- expect(formData.get('from-year')).toBe('1950');
97
- expect(formData.get('to-year')).toBe('2025');
107
+ await expect.element(page.getByRole("spinbutton").last()).toHaveValue(2025);
108
+ await expect
109
+ .element(page.getByLabelText("To year").first())
110
+ .toHaveValue("2025"); // keeps value in sync between inputs
111
+ const formData = new FormData(page.getByTestId("form").element());
112
+ expect(formData.get("from-year")).toBe("1950");
113
+ expect(formData.get("to-year")).toBe("2025");
98
114
  });
99
- test('going down from Min and up from Max sets value to min - 1 and max + a respectively', async () => {
115
+ test("going down from Min and up from Max sets value to min - 1 and max + a respectively", async () => {
100
116
  const component = html `
101
- <form data-testid="form">
102
- <w-slider
103
- label="Model year"
104
- min="1950"
105
- max="2025"
106
- open-ended
107
- >
108
- <w-slider-thumb
109
- slot="from"
110
- aria-label="From year"
111
- name="from-year"
112
- ></w-slider-thumb>
113
- <w-slider-thumb
114
- slot="to"
115
- aria-label="To year"
116
- name="to-year"
117
- ></w-slider-thumb>
118
- </w-slider>
119
- </form>
120
- `;
117
+ <form data-testid="form">
118
+ <w-slider label="Model year" min="1950" max="2025" open-ended>
119
+ <w-slider-thumb
120
+ slot="from"
121
+ aria-label="From year"
122
+ name="from-year"
123
+ ></w-slider-thumb>
124
+ <w-slider-thumb
125
+ slot="to"
126
+ aria-label="To year"
127
+ name="to-year"
128
+ ></w-slider-thumb>
129
+ </w-slider>
130
+ </form>
131
+ `;
121
132
  const page = render(component);
122
- await userEvent.type(page.getByRole('spinbutton').first(), '{ArrowDown}');
123
- await expect.element(page.getByRole('spinbutton').first()).toHaveValue(1949);
124
- await expect.element(page.getByLabelText('From year').first()).toHaveValue('1949'); // keeps value in sync between inputs
125
- await userEvent.type(page.getByRole('spinbutton').last(), '{ArrowUp}');
126
- await expect.element(page.getByRole('spinbutton').last()).toHaveValue(2026);
127
- await expect.element(page.getByLabelText('To year').first()).toHaveValue('2026'); // keeps value in sync between inputs
128
- const formData = new FormData(page.getByTestId('form').element());
129
- expect(formData.get('from-year')).toBe('1949');
130
- expect(formData.get('to-year')).toBe('2026');
131
- });
132
- test('slider without suffix syncs empty suffix to thumb', async () => {
133
+ await userEvent.type(page.getByRole("spinbutton").first(), "{ArrowDown}");
134
+ await expect.element(page.getByRole("spinbutton").first()).toHaveValue(1949);
135
+ await expect
136
+ .element(page.getByLabelText("From year").first())
137
+ .toHaveValue("1949"); // keeps value in sync between inputs
138
+ await userEvent.type(page.getByRole("spinbutton").last(), "{ArrowUp}");
139
+ await expect.element(page.getByRole("spinbutton").last()).toHaveValue(2026);
140
+ await expect
141
+ .element(page.getByLabelText("To year").first())
142
+ .toHaveValue("2026"); // keeps value in sync between inputs
143
+ const formData = new FormData(page.getByTestId("form").element());
144
+ expect(formData.get("from-year")).toBe("1949");
145
+ expect(formData.get("to-year")).toBe("2026");
146
+ });
147
+ test("slider without suffix syncs empty suffix to thumb", async () => {
133
148
  render(html `
134
- <w-slider label="Single" min="0" max="100">
135
- <w-slider-thumb name="value"></w-slider-thumb>
136
- </w-slider>
137
- `);
138
- const slider = document.querySelector('w-slider');
139
- const thumb = document.querySelector('w-slider-thumb');
149
+ <w-slider label="Single" min="0" max="100">
150
+ <w-slider-thumb name="value"></w-slider-thumb>
151
+ </w-slider>
152
+ `);
153
+ const slider = document.querySelector("w-slider");
154
+ const thumb = document.querySelector("w-slider-thumb");
140
155
  await slider.updateComplete;
141
156
  await thumb.updateComplete;
142
157
  expect(slider.suffix).toBeUndefined();
143
- expect(thumb.suffix).toBe('');
158
+ expect(thumb.suffix).toBe("");
144
159
  });
145
- test('deleting from number input works as expected', async () => {
160
+ test("deleting from number input works as expected", async () => {
146
161
  const component = html `
147
- <form data-testid="form">
148
- <w-slider label="Production year" min="1950" max="2025" over under>
149
- <p slot="description">Try typing a from value higher than a to value</p>
150
- <w-slider-thumb slot="from" name="from"></w-slider-thumb>
151
- <w-slider-thumb slot="to" name="to"></w-slider-thumb>
152
- </w-slider>
153
- </form>
154
- `;
162
+ <form data-testid="form">
163
+ <w-slider label="Production year" min="1950" max="2025" over under>
164
+ <p slot="description">Try typing a from value higher than a to value</p>
165
+ <w-slider-thumb slot="from" name="from"></w-slider-thumb>
166
+ <w-slider-thumb slot="to" name="to"></w-slider-thumb>
167
+ </w-slider>
168
+ </form>
169
+ `;
155
170
  const page = render(component);
156
- await expect.element(page.getByRole('spinbutton').last()).toHaveValue(2025);
157
- await userEvent.type(page.getByRole('spinbutton').last(), '{Backspace}');
158
- await expect.element(page.getByRole('spinbutton').last()).toHaveValue(202);
159
- await userEvent.type(page.getByRole('spinbutton').last(), '{Backspace}');
160
- await expect.element(page.getByRole('spinbutton').last()).toHaveValue(20);
161
- await userEvent.type(page.getByRole('spinbutton').last(), '{Backspace}');
162
- await expect.element(page.getByRole('spinbutton').last()).toHaveValue(2);
163
- await userEvent.type(page.getByRole('spinbutton').last(), '{Backspace}');
164
- await expect.element(page.getByRole('spinbutton').last()).not.toHaveValue();
165
- });
166
- test('can reset slider by resetting surrounding form', async () => {
171
+ await expect.element(page.getByRole("spinbutton").last()).toHaveValue(2025);
172
+ await userEvent.type(page.getByRole("spinbutton").last(), "{Backspace}");
173
+ await expect.element(page.getByRole("spinbutton").last()).toHaveValue(202);
174
+ await userEvent.type(page.getByRole("spinbutton").last(), "{Backspace}");
175
+ await expect.element(page.getByRole("spinbutton").last()).toHaveValue(20);
176
+ await userEvent.type(page.getByRole("spinbutton").last(), "{Backspace}");
177
+ await expect.element(page.getByRole("spinbutton").last()).toHaveValue(2);
178
+ await userEvent.type(page.getByRole("spinbutton").last(), "{Backspace}");
179
+ await expect.element(page.getByRole("spinbutton").last()).not.toHaveValue();
180
+ });
181
+ test("can reset slider by resetting surrounding form", async () => {
167
182
  render(html `
168
- <form>
169
- <w-slider label="Slider from 0 - 10" min="0" max="10">
170
- <p slot="description">If you want to slide between 0 and 10, this slider has you covered.</p>
171
- <w-slider-thumb name="zero-ten" value="3"></w-slider-thumb>
172
- </w-slider>
173
- </form>
174
- `);
175
- const form = document.querySelector('form');
176
- const wSlider = document.querySelector('w-slider');
177
- const wSliderThumb = wSlider.querySelector('w-slider-thumb');
183
+ <form>
184
+ <w-slider label="Slider from 0 - 10" min="0" max="10">
185
+ <p slot="description">
186
+ If you want to slide between 0 and 10, this slider has you covered.
187
+ </p>
188
+ <w-slider-thumb name="zero-ten" value="3"></w-slider-thumb>
189
+ </w-slider>
190
+ </form>
191
+ `);
192
+ const form = document.querySelector("form");
193
+ const wSlider = document.querySelector("w-slider");
194
+ const wSliderThumb = wSlider.querySelector("w-slider-thumb");
178
195
  // sanity
179
196
  expect(form).not.toBeNull();
180
197
  expect(wSlider).not.toBeNull();
181
198
  expect(wSliderThumb).not.toBeNull();
182
- expect(wSliderThumb.value).toBe('3');
183
- expect(Object.fromEntries(new FormData(form).entries())['zero-ten']).toBe('3');
184
- wSliderThumb.value = '5';
199
+ expect(wSliderThumb.value).toBe("3");
200
+ expect(Object.fromEntries(new FormData(form).entries())["zero-ten"]).toBe("3");
201
+ wSliderThumb.value = "5";
185
202
  await wSliderThumb.updateComplete;
186
- expect(wSliderThumb.value).toBe('5');
187
- expect(Object.fromEntries(new FormData(form).entries())['zero-ten']).toBe('5');
203
+ expect(wSliderThumb.value).toBe("5");
204
+ expect(Object.fromEntries(new FormData(form).entries())["zero-ten"]).toBe("5");
188
205
  // Reset the form
189
206
  form.reset();
190
207
  await wSliderThumb.updateComplete;
191
- expect(wSliderThumb.value).toBe('3');
192
- expect(Object.fromEntries(new FormData(form).entries())['zero-ten']).toBe('3');
208
+ expect(wSliderThumb.value).toBe("3");
209
+ expect(Object.fromEntries(new FormData(form).entries())["zero-ten"]).toBe("3");
193
210
  });
194
211
  // labelFormatter tests
195
- test('labelFormatter formats min and max labels', async () => {
212
+ test("labelFormatter formats min and max labels", async () => {
196
213
  const component = html `
197
- <w-slider label="Production year" min="1950" max="2025">
198
- <w-slider-thumb slot="from" name="from"></w-slider-thumb>
199
- <w-slider-thumb slot="to" name="to"></w-slider-thumb>
200
- </w-slider>
201
- `;
214
+ <w-slider label="Production year" min="1950" max="2025">
215
+ <w-slider-thumb slot="from" name="from"></w-slider-thumb>
216
+ <w-slider-thumb slot="to" name="to"></w-slider-thumb>
217
+ </w-slider>
218
+ `;
202
219
  render(component);
203
- const slider = document.querySelector('w-slider');
220
+ const slider = document.querySelector("w-slider");
204
221
  slider.labelFormatter = (slot) => {
205
- if (slot === 'from')
206
- return 'Before 1950';
207
- return '2025+';
222
+ if (slot === "from")
223
+ return "Before 1950";
224
+ return "2025+";
208
225
  };
209
226
  await slider.updateComplete;
210
227
  const fromThumb = document.querySelector('w-slider-thumb[slot="from"]');
@@ -212,72 +229,72 @@ test('labelFormatter formats min and max labels', async () => {
212
229
  await fromThumb.updateComplete;
213
230
  await toThumb.updateComplete;
214
231
  // Check the visible labels are formatted
215
- const fromMarker = fromThumb.shadowRoot.querySelector('.w-slider-thumb__from-marker');
216
- const toMarker = toThumb.shadowRoot.querySelector('.w-slider-thumb__to-marker');
217
- expect(fromMarker.textContent.trim()).toBe('Before 1950');
218
- expect(toMarker.textContent.trim()).toBe('2025+');
232
+ const fromMarker = fromThumb.shadowRoot.querySelector(".w-slider-thumb__from-marker");
233
+ const toMarker = toThumb.shadowRoot.querySelector(".w-slider-thumb__to-marker");
234
+ expect(fromMarker.textContent.trim()).toBe("Before 1950");
235
+ expect(toMarker.textContent.trim()).toBe("2025+");
219
236
  });
220
- test('labelFormatter can hide labels by returning empty string', async () => {
237
+ test("labelFormatter can hide labels by returning empty string", async () => {
221
238
  const component = html `
222
- <w-slider label="Hidden labels" min="0" max="100">
223
- <w-slider-thumb name="value"></w-slider-thumb>
224
- </w-slider>
225
- `;
239
+ <w-slider label="Hidden labels" min="0" max="100">
240
+ <w-slider-thumb name="value"></w-slider-thumb>
241
+ </w-slider>
242
+ `;
226
243
  render(component);
227
- const slider = document.querySelector('w-slider');
228
- slider.labelFormatter = () => '';
244
+ const slider = document.querySelector("w-slider");
245
+ slider.labelFormatter = () => "";
229
246
  await slider.updateComplete;
230
- const thumb = document.querySelector('w-slider-thumb');
247
+ const thumb = document.querySelector("w-slider-thumb");
231
248
  await thumb.updateComplete;
232
- const fromMarker = thumb.shadowRoot.querySelector('.w-slider-thumb__from-marker');
233
- const toMarker = thumb.shadowRoot.querySelector('.w-slider-thumb__to-marker');
234
- expect(fromMarker.textContent.trim()).toBe('');
235
- expect(toMarker.textContent.trim()).toBe('');
249
+ const fromMarker = thumb.shadowRoot.querySelector(".w-slider-thumb__from-marker");
250
+ const toMarker = thumb.shadowRoot.querySelector(".w-slider-thumb__to-marker");
251
+ expect(fromMarker.textContent.trim()).toBe("");
252
+ expect(toMarker.textContent.trim()).toBe("");
236
253
  });
237
254
  // valueFormatter tests
238
- test('valueFormatter formats tooltip display value', async () => {
255
+ test("valueFormatter formats tooltip display value", async () => {
239
256
  const component = html `
240
- <w-slider label="Price" min="0" max="100000">
241
- <w-slider-thumb name="price" value="50000"></w-slider-thumb>
242
- </w-slider>
243
- `;
257
+ <w-slider label="Price" min="0" max="100000">
258
+ <w-slider-thumb name="price" value="50000"></w-slider-thumb>
259
+ </w-slider>
260
+ `;
244
261
  render(component);
245
- const slider = document.querySelector('w-slider');
262
+ const slider = document.querySelector("w-slider");
246
263
  // Format with custom suffix
247
264
  slider.valueFormatter = (value) => {
248
265
  if (!value)
249
- return '0';
266
+ return "0";
250
267
  return `${value} formatted`;
251
268
  };
252
269
  await slider.updateComplete;
253
- const thumb = document.querySelector('w-slider-thumb');
270
+ const thumb = document.querySelector("w-slider-thumb");
254
271
  await thumb.updateComplete;
255
272
  // Check the tooltip message content in w-attention
256
273
  const tooltipMessage = thumb.shadowRoot.querySelector('w-attention span[slot="message"]');
257
- expect(tooltipMessage.textContent.trim()).toBe('50000 formatted');
274
+ expect(tooltipMessage.textContent.trim()).toBe("50000 formatted");
258
275
  });
259
276
  // tooltipFormatter tests
260
- test('tooltipFormatter formats tooltip display value', async () => {
277
+ test("tooltipFormatter formats tooltip display value", async () => {
261
278
  const component = html `
262
- <w-slider label="Hestekrefter" min="50" max="300" open-ended suffix="hk">
263
- <w-slider-thumb slot="from" name="from-power" value="50"></w-slider-thumb>
264
- <w-slider-thumb slot="to" name="to-power" value=""></w-slider-thumb>
265
- </w-slider>
266
- `;
279
+ <w-slider label="Hestekrefter" min="50" max="300" open-ended suffix="hk">
280
+ <w-slider-thumb slot="from" name="from-power" value="50"></w-slider-thumb>
281
+ <w-slider-thumb slot="to" name="to-power" value=""></w-slider-thumb>
282
+ </w-slider>
283
+ `;
267
284
  render(component);
268
- const slider = document.querySelector('w-slider');
285
+ const slider = document.querySelector("w-slider");
269
286
  slider.valueFormatter = (value, slot) => {
270
- if (slot === 'from' && value === '') {
271
- return 'Min';
287
+ if (slot === "from" && value === "") {
288
+ return "Min";
272
289
  }
273
- if (slot === 'to' && value === '') {
274
- return 'Max';
290
+ if (slot === "to" && value === "") {
291
+ return "Max";
275
292
  }
276
293
  return value;
277
294
  };
278
295
  // Use 300+ hk in the tooltip
279
296
  slider.tooltipFormatter = (value, slot) => {
280
- if (slot === 'to' && value === '') {
297
+ if (slot === "to" && value === "") {
281
298
  return `${300}+`;
282
299
  }
283
300
  return value;
@@ -287,76 +304,87 @@ test('tooltipFormatter formats tooltip display value', async () => {
287
304
  await thumb.updateComplete;
288
305
  // Check the tooltip message content in w-attention
289
306
  const tooltipMessage = thumb.shadowRoot.querySelector('w-attention span[slot="message"]');
290
- expect(tooltipMessage.textContent.trim()).toBe('300+ hk');
307
+ expect(tooltipMessage.textContent.trim()).toBe("300+ hk");
291
308
  });
292
309
  // WCAG 2.1 Accessibility Tests
293
310
  // Fieldset and legend tests (WCAG 1.3.1 Info and Relationships, 4.1.2 Name, Role, Value)
294
- test('slider uses fieldset with legend for proper grouping', async () => {
311
+ test("slider uses fieldset with legend for proper grouping", async () => {
295
312
  const component = html `
296
- <w-slider label="Volume control" min="0" max="100">
297
- <w-slider-thumb name="volume"></w-slider-thumb>
298
- </w-slider>
299
- `;
313
+ <w-slider label="Volume control" min="0" max="100">
314
+ <w-slider-thumb name="volume"></w-slider-thumb>
315
+ </w-slider>
316
+ `;
300
317
  render(component);
301
- const slider = document.querySelector('w-slider');
318
+ const slider = document.querySelector("w-slider");
302
319
  await slider.updateComplete;
303
- const fieldset = slider.shadowRoot.querySelector('fieldset');
304
- const legend = fieldset.querySelector('legend');
320
+ const fieldset = slider.shadowRoot.querySelector("fieldset");
321
+ const legend = fieldset.querySelector("legend");
305
322
  expect(fieldset).not.toBeNull();
306
323
  expect(legend).not.toBeNull();
307
- expect(legend.textContent.trim()).toBe('Volume control');
324
+ expect(legend.textContent.trim()).toBe("Volume control");
308
325
  });
309
- test('range slider fieldset groups both thumbs together', async () => {
326
+ test("range slider fieldset groups both thumbs together", async () => {
310
327
  const component = html `
311
- <w-slider label="Price range" min="0" max="1000">
312
- <w-slider-thumb slot="from" aria-label="Minimum price" name="min"></w-slider-thumb>
313
- <w-slider-thumb slot="to" aria-label="Maximum price" name="max"></w-slider-thumb>
314
- </w-slider>
315
- `;
328
+ <w-slider label="Price range" min="0" max="1000">
329
+ <w-slider-thumb
330
+ slot="from"
331
+ aria-label="Minimum price"
332
+ name="min"
333
+ ></w-slider-thumb>
334
+ <w-slider-thumb
335
+ slot="to"
336
+ aria-label="Maximum price"
337
+ name="max"
338
+ ></w-slider-thumb>
339
+ </w-slider>
340
+ `;
316
341
  render(component);
317
- const slider = document.querySelector('w-slider');
342
+ const slider = document.querySelector("w-slider");
318
343
  await slider.updateComplete;
319
- const fieldset = slider.shadowRoot.querySelector('fieldset');
320
- const legend = fieldset.querySelector('legend');
344
+ const fieldset = slider.shadowRoot.querySelector("fieldset");
345
+ const legend = fieldset.querySelector("legend");
321
346
  expect(fieldset).not.toBeNull();
322
- expect(legend.textContent.trim()).toBe('Price range');
347
+ expect(legend.textContent.trim()).toBe("Price range");
323
348
  // Both thumbs should be slotted within the fieldset
324
- const slots = fieldset.querySelectorAll('slot');
349
+ const slots = fieldset.querySelectorAll("slot");
325
350
  expect(slots.length).toBeGreaterThan(0);
326
351
  });
327
352
  // Input type range accessibility (WCAG 4.1.2 Name, Role, Value)
328
- test('range input has proper aria-label', async () => {
353
+ test("range input has proper aria-label", async () => {
329
354
  const component = html `
330
- <w-slider label="Brightness" min="0" max="100">
331
- <w-slider-thumb name="brightness"></w-slider-thumb>
332
- </w-slider>
333
- `;
355
+ <w-slider label="Brightness" min="0" max="100">
356
+ <w-slider-thumb name="brightness"></w-slider-thumb>
357
+ </w-slider>
358
+ `;
334
359
  render(component);
335
- const thumb = document.querySelector('w-slider-thumb');
360
+ const thumb = document.querySelector("w-slider-thumb");
336
361
  await thumb.updateComplete;
337
362
  const rangeInput = thumb.shadowRoot.querySelector('input[type="range"]');
338
- expect(rangeInput.getAttribute('aria-label')).toBe('Brightness');
363
+ expect(rangeInput.getAttribute("aria-label")).toBe("Brightness");
339
364
  });
340
- test('range input uses explicit aria-label when provided', async () => {
365
+ test("range input uses explicit aria-label when provided", async () => {
341
366
  const component = html `
342
- <w-slider label="Volume" min="0" max="100">
343
- <w-slider-thumb aria-label="Custom volume control" name="volume"></w-slider-thumb>
344
- </w-slider>
345
- `;
367
+ <w-slider label="Volume" min="0" max="100">
368
+ <w-slider-thumb
369
+ aria-label="Custom volume control"
370
+ name="volume"
371
+ ></w-slider-thumb>
372
+ </w-slider>
373
+ `;
346
374
  render(component);
347
- const thumb = document.querySelector('w-slider-thumb');
375
+ const thumb = document.querySelector("w-slider-thumb");
348
376
  await thumb.updateComplete;
349
377
  const rangeInput = thumb.shadowRoot.querySelector('input[type="range"]');
350
- expect(rangeInput.getAttribute('aria-label')).toBe('Custom volume control');
378
+ expect(rangeInput.getAttribute("aria-label")).toBe("Custom volume control");
351
379
  });
352
380
  // Range slider accessibility for from/to labels
353
- test('range slider thumbs get appropriate aria-labels when not explicitly set', async () => {
381
+ test("range slider thumbs get appropriate aria-labels when not explicitly set", async () => {
354
382
  const component = html `
355
- <w-slider label="Year range" min="2000" max="2025">
356
- <w-slider-thumb slot="from" name="from-year"></w-slider-thumb>
357
- <w-slider-thumb slot="to" name="to-year"></w-slider-thumb>
358
- </w-slider>
359
- `;
383
+ <w-slider label="Year range" min="2000" max="2025">
384
+ <w-slider-thumb slot="from" name="from-year"></w-slider-thumb>
385
+ <w-slider-thumb slot="to" name="to-year"></w-slider-thumb>
386
+ </w-slider>
387
+ `;
360
388
  render(component);
361
389
  const fromThumb = document.querySelector('w-slider-thumb[slot="from"]');
362
390
  const toThumb = document.querySelector('w-slider-thumb[slot="to"]');
@@ -365,171 +393,283 @@ test('range slider thumbs get appropriate aria-labels when not explicitly set',
365
393
  const fromRange = fromThumb.shadowRoot.querySelector('input[type="range"]');
366
394
  const toRange = toThumb.shadowRoot.querySelector('input[type="range"]');
367
395
  // Should append min/max to the parent label
368
- expect(fromRange.getAttribute('aria-label')).toBe('Year range min');
369
- expect(toRange.getAttribute('aria-label')).toBe('Year range max');
396
+ expect(fromRange.getAttribute("aria-label")).toBe("Year range min");
397
+ expect(toRange.getAttribute("aria-label")).toBe("Year range max");
370
398
  });
371
399
  // Input type number accessibility (WCAG 4.1.2 Name, Role, Value)
372
- test('number input (textfield) has proper aria-label', async () => {
400
+ test("number input (textfield) has proper aria-label", async () => {
373
401
  const component = html `
374
- <w-slider label="Quantity" min="0" max="100">
375
- <w-slider-thumb name="qty"></w-slider-thumb>
376
- </w-slider>
377
- `;
402
+ <w-slider label="Quantity" min="0" max="100">
403
+ <w-slider-thumb name="qty"></w-slider-thumb>
404
+ </w-slider>
405
+ `;
378
406
  render(component);
379
- const thumb = document.querySelector('w-slider-thumb');
407
+ const thumb = document.querySelector("w-slider-thumb");
380
408
  await thumb.updateComplete;
381
- const textfield = thumb.shadowRoot.querySelector('w-textfield');
382
- expect(textfield.getAttribute('aria-label')).toBe('Quantity');
409
+ const textfield = thumb.shadowRoot.querySelector("w-textfield");
410
+ expect(textfield.getAttribute("aria-label")).toBe("Quantity");
383
411
  });
384
412
  // Disabled state accessibility
385
- test('disabled slider marks all inputs as disabled', async () => {
413
+ test("disabled slider marks all inputs as disabled", async () => {
386
414
  const component = html `
387
- <w-slider label="Disabled slider" min="0" max="100" disabled>
388
- <w-slider-thumb name="value"></w-slider-thumb>
389
- </w-slider>
390
- `;
415
+ <w-slider label="Disabled slider" min="0" max="100" disabled>
416
+ <w-slider-thumb name="value"></w-slider-thumb>
417
+ </w-slider>
418
+ `;
391
419
  render(component);
392
- const thumb = document.querySelector('w-slider-thumb');
420
+ const thumb = document.querySelector("w-slider-thumb");
393
421
  await thumb.updateComplete;
394
422
  const rangeInput = thumb.shadowRoot.querySelector('input[type="range"]');
395
- const textfield = thumb.shadowRoot.querySelector('w-textfield');
423
+ const textfield = thumb.shadowRoot.querySelector("w-textfield");
396
424
  expect(rangeInput.disabled).toBe(true);
397
- expect(textfield.hasAttribute('disabled')).toBe(true);
425
+ expect(textfield.hasAttribute("disabled")).toBe(true);
398
426
  });
399
- test('disabled fieldset communicates disabled state', async () => {
427
+ test("disabled fieldset communicates disabled state", async () => {
400
428
  const component = html `
401
- <w-slider label="Disabled control" min="0" max="100" disabled>
402
- <w-slider-thumb name="value"></w-slider-thumb>
403
- </w-slider>
404
- `;
429
+ <w-slider label="Disabled control" min="0" max="100" disabled>
430
+ <w-slider-thumb name="value"></w-slider-thumb>
431
+ </w-slider>
432
+ `;
405
433
  render(component);
406
- const slider = document.querySelector('w-slider');
434
+ const slider = document.querySelector("w-slider");
407
435
  await slider.updateComplete;
408
- const fieldset = slider.shadowRoot.querySelector('fieldset');
436
+ const fieldset = slider.shadowRoot.querySelector("fieldset");
409
437
  expect(fieldset.disabled).toBe(true);
410
438
  });
411
439
  // Error state accessibility (WCAG 3.3.1 Error Identification)
412
- test('invalid slider sets aria-invalid on fieldset', async () => {
440
+ test("invalid slider sets aria-invalid on fieldset", async () => {
413
441
  const component = html `
414
- <w-slider label="Invalid slider" min="0" max="100" invalid error="Please select a value">
415
- <w-slider-thumb name="value"></w-slider-thumb>
416
- </w-slider>
417
- `;
442
+ <w-slider
443
+ label="Invalid slider"
444
+ min="0"
445
+ max="100"
446
+ invalid
447
+ error="Please select a value"
448
+ >
449
+ <w-slider-thumb name="value"></w-slider-thumb>
450
+ </w-slider>
451
+ `;
418
452
  render(component);
419
- const slider = document.querySelector('w-slider');
453
+ const slider = document.querySelector("w-slider");
420
454
  await slider.updateComplete;
421
455
  // Wait for the state update triggered in connectedCallback
422
456
  await slider.updateComplete;
423
- const fieldset = slider.shadowRoot.querySelector('fieldset');
424
- expect(fieldset.getAttribute('aria-invalid')).toBe('true');
457
+ const fieldset = slider.shadowRoot.querySelector("fieldset");
458
+ expect(fieldset.getAttribute("aria-invalid")).toBe("true");
425
459
  });
426
- test('error message is visible when slider is invalid', async () => {
460
+ test("error message is visible when slider is invalid", async () => {
427
461
  const component = html `
428
- <w-slider label="Error slider" min="0" max="100" invalid error="Value is required">
429
- <w-slider-thumb name="value"></w-slider-thumb>
430
- </w-slider>
431
- `;
462
+ <w-slider
463
+ label="Error slider"
464
+ min="0"
465
+ max="100"
466
+ invalid
467
+ error="Value is required"
468
+ >
469
+ <w-slider-thumb name="value"></w-slider-thumb>
470
+ </w-slider>
471
+ `;
432
472
  render(component);
433
- const slider = document.querySelector('w-slider');
473
+ const slider = document.querySelector("w-slider");
434
474
  await slider.updateComplete;
435
475
  // Wait for the state update triggered in connectedCallback
436
476
  await slider.updateComplete;
437
- const errorMessage = slider.shadowRoot.querySelector('.w-slider__error');
477
+ const errorMessage = slider.shadowRoot.querySelector(".w-slider__error");
438
478
  expect(errorMessage).not.toBeNull();
439
- expect(errorMessage.textContent.trim()).toBe('Value is required');
479
+ expect(errorMessage.textContent.trim()).toBe("Value is required");
440
480
  });
441
481
  // Screen reader min/max range announcement
442
- test('screen reader can access min and max range values', async () => {
482
+ test("screen reader can access min and max range values", async () => {
443
483
  const component = html `
444
- <w-slider label="Range with bounds" min="10" max="90">
445
- <w-slider-thumb name="value"></w-slider-thumb>
446
- </w-slider>
447
- `;
484
+ <w-slider label="Range with bounds" min="10" max="90">
485
+ <w-slider-thumb name="value"></w-slider-thumb>
486
+ </w-slider>
487
+ `;
448
488
  render(component);
449
- const slider = document.querySelector('w-slider');
489
+ const slider = document.querySelector("w-slider");
450
490
  await slider.updateComplete;
451
- const thumb = document.querySelector('w-slider-thumb');
491
+ const thumb = document.querySelector("w-slider-thumb");
452
492
  await thumb.updateComplete;
453
493
  // Screen reader only text should contain min and max info
454
- const srOnlyText = thumb.shadowRoot.querySelector('.sr-only');
494
+ const srOnlyText = thumb.shadowRoot.querySelector(".sr-only");
455
495
  expect(srOnlyText).not.toBeNull();
456
- expect(srOnlyText.textContent).toContain('10');
457
- expect(srOnlyText.textContent).toContain('90');
496
+ expect(srOnlyText.textContent).toContain("10");
497
+ expect(srOnlyText.textContent).toContain("90");
458
498
  });
459
- test('screen reader range announcement uses labelFormatter values', async () => {
499
+ test("screen reader range announcement uses labelFormatter values", async () => {
460
500
  const component = html `
461
- <w-slider label="Formatted range" min="0" max="100">
462
- <w-slider-thumb name="value"></w-slider-thumb>
463
- </w-slider>
464
- `;
501
+ <w-slider label="Formatted range" min="0" max="100">
502
+ <w-slider-thumb name="value"></w-slider-thumb>
503
+ </w-slider>
504
+ `;
465
505
  render(component);
466
- const slider = document.querySelector('w-slider');
506
+ const slider = document.querySelector("w-slider");
467
507
  slider.labelFormatter = (slot) => {
468
- if (slot === 'from')
469
- return 'Zero';
470
- return 'One hundred';
508
+ if (slot === "from")
509
+ return "Zero";
510
+ return "One hundred";
471
511
  };
472
512
  await slider.updateComplete;
473
- const thumb = document.querySelector('w-slider-thumb');
513
+ const thumb = document.querySelector("w-slider-thumb");
474
514
  await thumb.updateComplete;
475
- const srOnlyText = thumb.shadowRoot.querySelector('.sr-only');
476
- expect(srOnlyText.textContent).toContain('Zero');
477
- expect(srOnlyText.textContent).toContain('One hundred');
515
+ const srOnlyText = thumb.shadowRoot.querySelector(".sr-only");
516
+ expect(srOnlyText.textContent).toContain("Zero");
517
+ expect(srOnlyText.textContent).toContain("One hundred");
478
518
  });
479
519
  // Required field accessibility (WCAG 3.3.2 Labels or Instructions)
480
- test('required slider passes required state to thumb', async () => {
520
+ test("required slider passes required state to thumb", async () => {
481
521
  render(html `
482
- <w-slider label="Required slider" min="0" max="100" required>
483
- <w-slider-thumb name="value"></w-slider-thumb>
484
- </w-slider>
485
- `);
486
- const slider = document.querySelector('w-slider');
522
+ <w-slider label="Required slider" min="0" max="100" required>
523
+ <w-slider-thumb name="value"></w-slider-thumb>
524
+ </w-slider>
525
+ `);
526
+ const slider = document.querySelector("w-slider");
487
527
  await slider.updateComplete;
488
- const thumb = document.querySelector('w-slider-thumb');
528
+ const thumb = document.querySelector("w-slider-thumb");
489
529
  await thumb.updateComplete;
490
530
  // The required state should be synced from slider to thumb
491
531
  expect(thumb.required).toBe(true);
492
532
  // Verify the slider has required attribute in HTML
493
- expect(slider.hasAttribute('required')).toBe(true);
533
+ expect(slider.hasAttribute("required")).toBe(true);
494
534
  });
495
535
  // Hydration mismatch prevention tests
496
- test('aria-label is not set as host attribute (to avoid hydration mismatch)', async () => {
536
+ test("aria-label is not set as host attribute (to avoid hydration mismatch)", async () => {
497
537
  const component = html `
498
- <w-slider label="Slider label" min="0" max="100">
499
- <w-slider-thumb name="value"></w-slider-thumb>
500
- </w-slider>
501
- `;
538
+ <w-slider label="Slider label" min="0" max="100">
539
+ <w-slider-thumb name="value"></w-slider-thumb>
540
+ </w-slider>
541
+ `;
502
542
  render(component);
503
- const slider = document.querySelector('w-slider');
543
+ const slider = document.querySelector("w-slider");
504
544
  await slider.updateComplete;
505
- const thumb = document.querySelector('w-slider-thumb');
545
+ const thumb = document.querySelector("w-slider-thumb");
506
546
  await thumb.updateComplete;
507
547
  // aria-label should NOT be a host attribute (to avoid hydration mismatch)
508
- expect(thumb.hasAttribute('aria-label')).toBe(false);
548
+ expect(thumb.hasAttribute("aria-label")).toBe(false);
509
549
  // But the property should be set by the parent
510
- expect(thumb.ariaLabel).toBe('Slider label');
550
+ expect(thumb.ariaLabel).toBe("Slider label");
511
551
  // And the internal input should have the aria-label
512
552
  const rangeInput = thumb.shadowRoot.querySelector('input[type="range"]');
513
- expect(rangeInput.getAttribute('aria-label')).toBe('Slider label');
553
+ expect(rangeInput.getAttribute("aria-label")).toBe("Slider label");
514
554
  });
515
- test('aria-description is not set as host attribute (to avoid hydration mismatch)', async () => {
555
+ test("aria-description is not set as host attribute (to avoid hydration mismatch)", async () => {
516
556
  const component = html `
517
- <w-slider label="Range" min="0" max="100">
518
- <w-slider-thumb slot="from" name="from"></w-slider-thumb>
519
- <w-slider-thumb slot="to" name="to"></w-slider-thumb>
520
- </w-slider>
521
- `;
557
+ <w-slider label="Range" min="0" max="100">
558
+ <w-slider-thumb slot="from" name="from"></w-slider-thumb>
559
+ <w-slider-thumb slot="to" name="to"></w-slider-thumb>
560
+ </w-slider>
561
+ `;
522
562
  render(component);
523
- const slider = document.querySelector('w-slider');
563
+ const slider = document.querySelector("w-slider");
524
564
  await slider.updateComplete;
525
565
  const fromThumb = document.querySelector('w-slider-thumb[slot="from"]');
526
566
  const toThumb = document.querySelector('w-slider-thumb[slot="to"]');
527
567
  await fromThumb.updateComplete;
528
568
  await toThumb.updateComplete;
529
569
  // aria-description should NOT be a host attribute (to avoid hydration mismatch)
530
- expect(fromThumb.hasAttribute('aria-description')).toBe(false);
531
- expect(toThumb.hasAttribute('aria-description')).toBe(false);
570
+ expect(fromThumb.hasAttribute("aria-description")).toBe(false);
571
+ expect(toThumb.hasAttribute("aria-description")).toBe(false);
532
572
  // But the properties should be set
533
573
  expect(fromThumb.ariaDescription).toBeTruthy();
534
574
  expect(toThumb.ariaDescription).toBeTruthy();
535
575
  });
576
+ test("renders optional indicator as 'Optional' without parentheses", async () => {
577
+ const page = render(html `
578
+ <w-slider label="Price" min="0" max="100" optional>
579
+ <w-slider-thumb name="price"></w-slider-thumb>
580
+ </w-slider>
581
+ `);
582
+ await expect.element(page.getByText("Optional")).toBeVisible();
583
+ expect(page.getByText("(optional)").query()).toBeNull();
584
+ });
585
+ test("does not render optional indicator when both required and optional are set", async () => {
586
+ const page = render(html `
587
+ <w-slider label="Price" min="0" max="100" required optional>
588
+ <w-slider-thumb name="price"></w-slider-thumb>
589
+ </w-slider>
590
+ `);
591
+ await expect.element(page.getByText("Price")).toBeVisible();
592
+ expect(page.getByText("Optional").query()).toBeNull();
593
+ });
594
+ test("includes optional indicator in the slider legend", async () => {
595
+ render(html `
596
+ <w-slider label="Price" min="0" max="100" optional>
597
+ <w-slider-thumb name="price"></w-slider-thumb>
598
+ </w-slider>
599
+ `);
600
+ const slider = document.querySelector("w-slider");
601
+ await slider.updateComplete;
602
+ await new Promise((resolve) => setTimeout(resolve, 0)); // Wait for the next microtask to ensure the legend is rendered
603
+ const legend = slider.shadowRoot.querySelector("legend");
604
+ expect(legend).not.toBeNull();
605
+ console.log("Legend text content:", legend.textContent);
606
+ expect(legend.textContent).toContain("Price");
607
+ expect(legend.textContent).toContain("Optional");
608
+ });
609
+ test("removes optional indicator when required is added dynamically", async () => {
610
+ const page = render(html `
611
+ <w-slider label="Price" min="0" max="100" optional data-testid="slider">
612
+ <w-slider-thumb name="price"></w-slider-thumb>
613
+ </w-slider>
614
+ `);
615
+ await expect.element(page.getByText("Optional")).toBeVisible();
616
+ const slider = document.querySelector("w-slider");
617
+ slider.required = true;
618
+ await slider.updateComplete;
619
+ expect(page.getByText("Optional").query()).toBeNull();
620
+ });
621
+ test("shows optional indicator when required is removed dynamically", async () => {
622
+ const page = render(html `
623
+ <w-slider
624
+ label="Price"
625
+ min="0"
626
+ max="100"
627
+ required
628
+ optional
629
+ data-testid="slider"
630
+ >
631
+ <w-slider-thumb name="price"></w-slider-thumb>
632
+ </w-slider>
633
+ `);
634
+ expect(page.getByText("Optional").query()).toBeNull();
635
+ const slider = document.querySelector("w-slider");
636
+ slider.required = false;
637
+ await slider.updateComplete;
638
+ await expect.element(page.getByText("Optional")).toBeVisible();
639
+ });
640
+ test("does not render optional indicator when there is no label", async () => {
641
+ const page = render(html `
642
+ <w-slider aria-label="Price" min="0" max="100" optional>
643
+ <w-slider-thumb name="price"></w-slider-thumb>
644
+ </w-slider>
645
+ `);
646
+ const slider = document.querySelector("w-slider");
647
+ await slider.updateComplete;
648
+ expect(page.getByText("Optional").query()).toBeNull();
649
+ });
650
+ test("excludes optional indicator from legend when required suppresses it", async () => {
651
+ render(html `
652
+ <w-slider label="Price" min="0" max="100" required optional>
653
+ <w-slider-thumb name="price"></w-slider-thumb>
654
+ </w-slider>
655
+ `);
656
+ const slider = document.querySelector("w-slider");
657
+ await slider.updateComplete;
658
+ const legend = slider.shadowRoot.querySelector("legend");
659
+ expect(legend).not.toBeNull();
660
+ expect(legend.textContent).toContain("Price");
661
+ expect(legend.textContent).not.toContain("Optional");
662
+ });
663
+ test("renders localized optional text based on active locale", async () => {
664
+ const originalLang = document.documentElement.lang;
665
+ document.documentElement.lang = "nb";
666
+ const page = render(html `
667
+ <w-slider label="Price" min="0" max="100" optional>
668
+ <w-slider-thumb name="price"></w-slider-thumb>
669
+ </w-slider>
670
+ `);
671
+ const slider = document.querySelector("w-slider");
672
+ await slider.updateComplete;
673
+ await expect.element(page.getByText("Valgfri")).toBeVisible();
674
+ document.documentElement.lang = originalLang;
675
+ });