@warp-ds/elements 2.10.0-next.15 → 2.10.0-next.18

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