@furystack/shades-common-components 11.0.0 → 12.0.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 (768) hide show
  1. package/CHANGELOG.md +443 -0
  2. package/esm/components/accordion/accordion-item.d.ts +31 -0
  3. package/esm/components/accordion/accordion-item.d.ts.map +1 -0
  4. package/esm/components/accordion/accordion-item.js +147 -0
  5. package/esm/components/accordion/accordion-item.js.map +1 -0
  6. package/esm/components/accordion/accordion.d.ts +27 -0
  7. package/esm/components/accordion/accordion.d.ts.map +1 -0
  8. package/esm/components/accordion/accordion.js +39 -0
  9. package/esm/components/accordion/accordion.js.map +1 -0
  10. package/esm/components/accordion/accordion.spec.d.ts +2 -0
  11. package/esm/components/accordion/accordion.spec.d.ts.map +1 -0
  12. package/esm/components/accordion/accordion.spec.js +284 -0
  13. package/esm/components/accordion/accordion.spec.js.map +1 -0
  14. package/esm/components/accordion/index.d.ts +3 -0
  15. package/esm/components/accordion/index.d.ts.map +1 -0
  16. package/esm/components/accordion/index.js +3 -0
  17. package/esm/components/accordion/index.js.map +1 -0
  18. package/esm/components/alert.d.ts +21 -0
  19. package/esm/components/alert.d.ts.map +1 -0
  20. package/esm/components/alert.js +131 -0
  21. package/esm/components/alert.js.map +1 -0
  22. package/esm/components/alert.spec.d.ts +2 -0
  23. package/esm/components/alert.spec.d.ts.map +1 -0
  24. package/esm/components/alert.spec.js +177 -0
  25. package/esm/components/alert.spec.js.map +1 -0
  26. package/esm/components/app-bar-link.d.ts +22 -2
  27. package/esm/components/app-bar-link.d.ts.map +1 -1
  28. package/esm/components/app-bar-link.js +20 -7
  29. package/esm/components/app-bar-link.js.map +1 -1
  30. package/esm/components/app-bar-link.spec.js +22 -19
  31. package/esm/components/app-bar-link.spec.js.map +1 -1
  32. package/esm/components/app-bar.d.ts +2 -0
  33. package/esm/components/app-bar.d.ts.map +1 -1
  34. package/esm/components/app-bar.js +16 -11
  35. package/esm/components/app-bar.js.map +1 -1
  36. package/esm/components/app-bar.spec.js +67 -52
  37. package/esm/components/app-bar.spec.js.map +1 -1
  38. package/esm/components/avatar.d.ts +2 -0
  39. package/esm/components/avatar.d.ts.map +1 -1
  40. package/esm/components/avatar.js +40 -37
  41. package/esm/components/avatar.js.map +1 -1
  42. package/esm/components/badge.d.ts +35 -0
  43. package/esm/components/badge.d.ts.map +1 -0
  44. package/esm/components/badge.js +68 -0
  45. package/esm/components/badge.js.map +1 -0
  46. package/esm/components/badge.spec.d.ts +2 -0
  47. package/esm/components/badge.spec.d.ts.map +1 -0
  48. package/esm/components/badge.spec.js +157 -0
  49. package/esm/components/badge.spec.js.map +1 -0
  50. package/esm/components/breadcrumb.d.ts +103 -0
  51. package/esm/components/breadcrumb.d.ts.map +1 -0
  52. package/esm/components/breadcrumb.js +121 -0
  53. package/esm/components/breadcrumb.js.map +1 -0
  54. package/esm/components/breadcrumb.spec.d.ts +2 -0
  55. package/esm/components/breadcrumb.spec.d.ts.map +1 -0
  56. package/esm/components/breadcrumb.spec.js +251 -0
  57. package/esm/components/breadcrumb.spec.js.map +1 -0
  58. package/esm/components/button-group.d.ts +85 -0
  59. package/esm/components/button-group.d.ts.map +1 -0
  60. package/esm/components/button-group.js +290 -0
  61. package/esm/components/button-group.js.map +1 -0
  62. package/esm/components/button-group.spec.d.ts +2 -0
  63. package/esm/components/button-group.spec.d.ts.map +1 -0
  64. package/esm/components/button-group.spec.js +502 -0
  65. package/esm/components/button-group.spec.js.map +1 -0
  66. package/esm/components/button.d.ts +44 -2
  67. package/esm/components/button.d.ts.map +1 -1
  68. package/esm/components/button.js +82 -73
  69. package/esm/components/button.js.map +1 -1
  70. package/esm/components/button.spec.js +205 -50
  71. package/esm/components/button.spec.js.map +1 -1
  72. package/esm/components/card.d.ts +117 -0
  73. package/esm/components/card.d.ts.map +1 -0
  74. package/esm/components/card.js +181 -0
  75. package/esm/components/card.js.map +1 -0
  76. package/esm/components/card.spec.d.ts +2 -0
  77. package/esm/components/card.spec.d.ts.map +1 -0
  78. package/esm/components/card.spec.js +278 -0
  79. package/esm/components/card.spec.js.map +1 -0
  80. package/esm/components/carousel.d.ts +50 -0
  81. package/esm/components/carousel.d.ts.map +1 -0
  82. package/esm/components/carousel.js +263 -0
  83. package/esm/components/carousel.js.map +1 -0
  84. package/esm/components/carousel.spec.d.ts +2 -0
  85. package/esm/components/carousel.spec.d.ts.map +1 -0
  86. package/esm/components/carousel.spec.js +677 -0
  87. package/esm/components/carousel.spec.js.map +1 -0
  88. package/esm/components/chip.d.ts +23 -0
  89. package/esm/components/chip.d.ts.map +1 -0
  90. package/esm/components/chip.js +139 -0
  91. package/esm/components/chip.js.map +1 -0
  92. package/esm/components/chip.spec.d.ts +2 -0
  93. package/esm/components/chip.spec.d.ts.map +1 -0
  94. package/esm/components/chip.spec.js +142 -0
  95. package/esm/components/chip.spec.js.map +1 -0
  96. package/esm/components/circular-progress.d.ts +37 -0
  97. package/esm/components/circular-progress.d.ts.map +1 -0
  98. package/esm/components/circular-progress.js +84 -0
  99. package/esm/components/circular-progress.js.map +1 -0
  100. package/esm/components/circular-progress.spec.d.ts +2 -0
  101. package/esm/components/circular-progress.spec.d.ts.map +1 -0
  102. package/esm/components/circular-progress.spec.js +228 -0
  103. package/esm/components/circular-progress.spec.js.map +1 -0
  104. package/esm/components/command-palette/command-palette-input.d.ts +3 -0
  105. package/esm/components/command-palette/command-palette-input.d.ts.map +1 -1
  106. package/esm/components/command-palette/command-palette-input.js +17 -9
  107. package/esm/components/command-palette/command-palette-input.js.map +1 -1
  108. package/esm/components/command-palette/command-palette-input.spec.js +172 -161
  109. package/esm/components/command-palette/command-palette-input.spec.js.map +1 -1
  110. package/esm/components/command-palette/command-palette-manager.spec.js +130 -114
  111. package/esm/components/command-palette/command-palette-manager.spec.js.map +1 -1
  112. package/esm/components/command-palette/command-palette-suggestion-list.d.ts +2 -0
  113. package/esm/components/command-palette/command-palette-suggestion-list.d.ts.map +1 -1
  114. package/esm/components/command-palette/command-palette-suggestion-list.js +20 -20
  115. package/esm/components/command-palette/command-palette-suggestion-list.js.map +1 -1
  116. package/esm/components/command-palette/command-palette-suggestion-list.spec.js +296 -278
  117. package/esm/components/command-palette/command-palette-suggestion-list.spec.js.map +1 -1
  118. package/esm/components/command-palette/index.d.ts +2 -0
  119. package/esm/components/command-palette/index.d.ts.map +1 -1
  120. package/esm/components/command-palette/index.js +25 -94
  121. package/esm/components/command-palette/index.js.map +1 -1
  122. package/esm/components/command-palette/index.spec.js +12 -12
  123. package/esm/components/command-palette/index.spec.js.map +1 -1
  124. package/esm/components/context-menu/context-menu-item.d.ts +9 -0
  125. package/esm/components/context-menu/context-menu-item.d.ts.map +1 -0
  126. package/esm/components/context-menu/context-menu-item.js +56 -0
  127. package/esm/components/context-menu/context-menu-item.js.map +1 -0
  128. package/esm/components/context-menu/context-menu-manager.d.ts +52 -0
  129. package/esm/components/context-menu/context-menu-manager.d.ts.map +1 -0
  130. package/esm/components/context-menu/context-menu-manager.js +128 -0
  131. package/esm/components/context-menu/context-menu-manager.js.map +1 -0
  132. package/esm/components/context-menu/context-menu-manager.spec.d.ts +2 -0
  133. package/esm/components/context-menu/context-menu-manager.spec.d.ts.map +1 -0
  134. package/esm/components/context-menu/context-menu-manager.spec.js +326 -0
  135. package/esm/components/context-menu/context-menu-manager.spec.js.map +1 -0
  136. package/esm/components/context-menu/context-menu.d.ts +8 -0
  137. package/esm/components/context-menu/context-menu.d.ts.map +1 -0
  138. package/esm/components/context-menu/context-menu.js +79 -0
  139. package/esm/components/context-menu/context-menu.js.map +1 -0
  140. package/esm/components/context-menu/context-menu.spec.d.ts +2 -0
  141. package/esm/components/context-menu/context-menu.spec.d.ts.map +1 -0
  142. package/esm/components/context-menu/context-menu.spec.js +282 -0
  143. package/esm/components/context-menu/context-menu.spec.js.map +1 -0
  144. package/esm/components/context-menu/index.d.ts +4 -0
  145. package/esm/components/context-menu/index.d.ts.map +1 -0
  146. package/esm/components/context-menu/index.js +4 -0
  147. package/esm/components/context-menu/index.js.map +1 -0
  148. package/esm/components/data-grid/body.spec.js +194 -184
  149. package/esm/components/data-grid/body.spec.js.map +1 -1
  150. package/esm/components/data-grid/data-grid-row.d.ts.map +1 -1
  151. package/esm/components/data-grid/data-grid-row.js +66 -54
  152. package/esm/components/data-grid/data-grid-row.js.map +1 -1
  153. package/esm/components/data-grid/data-grid-row.spec.js +127 -95
  154. package/esm/components/data-grid/data-grid-row.spec.js.map +1 -1
  155. package/esm/components/data-grid/data-grid.d.ts.map +1 -1
  156. package/esm/components/data-grid/data-grid.js +17 -16
  157. package/esm/components/data-grid/data-grid.js.map +1 -1
  158. package/esm/components/data-grid/data-grid.spec.js +364 -430
  159. package/esm/components/data-grid/data-grid.spec.js.map +1 -1
  160. package/esm/components/data-grid/footer.spec.js +215 -203
  161. package/esm/components/data-grid/footer.spec.js.map +1 -1
  162. package/esm/components/data-grid/header.d.ts +3 -1
  163. package/esm/components/data-grid/header.d.ts.map +1 -1
  164. package/esm/components/data-grid/header.js +42 -30
  165. package/esm/components/data-grid/header.js.map +1 -1
  166. package/esm/components/data-grid/header.spec.js +330 -307
  167. package/esm/components/data-grid/header.spec.js.map +1 -1
  168. package/esm/components/data-grid/selection-cell.d.ts +2 -0
  169. package/esm/components/data-grid/selection-cell.d.ts.map +1 -1
  170. package/esm/components/data-grid/selection-cell.js +2 -7
  171. package/esm/components/data-grid/selection-cell.js.map +1 -1
  172. package/esm/components/data-grid/selection-cell.spec.js +45 -36
  173. package/esm/components/data-grid/selection-cell.spec.js.map +1 -1
  174. package/esm/components/dialog.d.ts +46 -0
  175. package/esm/components/dialog.d.ts.map +1 -0
  176. package/esm/components/dialog.js +178 -0
  177. package/esm/components/dialog.js.map +1 -0
  178. package/esm/components/dialog.spec.d.ts +2 -0
  179. package/esm/components/dialog.spec.d.ts.map +1 -0
  180. package/esm/components/dialog.spec.js +113 -0
  181. package/esm/components/dialog.spec.js.map +1 -0
  182. package/esm/components/divider.d.ts +22 -0
  183. package/esm/components/divider.d.ts.map +1 -0
  184. package/esm/components/divider.js +113 -0
  185. package/esm/components/divider.js.map +1 -0
  186. package/esm/components/divider.spec.d.ts +2 -0
  187. package/esm/components/divider.spec.d.ts.map +1 -0
  188. package/esm/components/divider.spec.js +136 -0
  189. package/esm/components/divider.spec.js.map +1 -0
  190. package/esm/components/drawer/drawer-toggle-button.d.ts +36 -0
  191. package/esm/components/drawer/drawer-toggle-button.d.ts.map +1 -0
  192. package/esm/components/drawer/drawer-toggle-button.js +94 -0
  193. package/esm/components/drawer/drawer-toggle-button.js.map +1 -0
  194. package/esm/components/drawer/drawer-toggle-button.spec.d.ts +2 -0
  195. package/esm/components/drawer/drawer-toggle-button.spec.d.ts.map +1 -0
  196. package/esm/components/drawer/drawer-toggle-button.spec.js +306 -0
  197. package/esm/components/drawer/drawer-toggle-button.spec.js.map +1 -0
  198. package/esm/components/drawer/index.d.ts +56 -0
  199. package/esm/components/drawer/index.d.ts.map +1 -0
  200. package/esm/components/drawer/index.js +172 -0
  201. package/esm/components/drawer/index.js.map +1 -0
  202. package/esm/components/drawer/index.spec.d.ts +2 -0
  203. package/esm/components/drawer/index.spec.d.ts.map +1 -0
  204. package/esm/components/drawer/index.spec.js +538 -0
  205. package/esm/components/drawer/index.spec.js.map +1 -0
  206. package/esm/components/dropdown.d.ts +15 -0
  207. package/esm/components/dropdown.d.ts.map +1 -0
  208. package/esm/components/dropdown.js +262 -0
  209. package/esm/components/dropdown.js.map +1 -0
  210. package/esm/components/dropdown.spec.d.ts +2 -0
  211. package/esm/components/dropdown.spec.d.ts.map +1 -0
  212. package/esm/components/dropdown.spec.js +372 -0
  213. package/esm/components/dropdown.spec.js.map +1 -0
  214. package/esm/components/fab.d.ts +10 -1
  215. package/esm/components/fab.d.ts.map +1 -1
  216. package/esm/components/fab.js +24 -8
  217. package/esm/components/fab.js.map +1 -1
  218. package/esm/components/fab.spec.js +50 -39
  219. package/esm/components/fab.spec.js.map +1 -1
  220. package/esm/components/form.d.ts.map +1 -1
  221. package/esm/components/form.js +9 -7
  222. package/esm/components/form.js.map +1 -1
  223. package/esm/components/form.spec.js +209 -199
  224. package/esm/components/form.spec.js.map +1 -1
  225. package/esm/components/grid.js +10 -10
  226. package/esm/components/grid.js.map +1 -1
  227. package/esm/components/grid.spec.js +109 -85
  228. package/esm/components/grid.spec.js.map +1 -1
  229. package/esm/components/icons/icon-definitions.d.ts +140 -0
  230. package/esm/components/icons/icon-definitions.d.ts.map +1 -0
  231. package/esm/components/icons/icon-definitions.js +432 -0
  232. package/esm/components/icons/icon-definitions.js.map +1 -0
  233. package/esm/components/icons/icon-definitions.spec.d.ts +2 -0
  234. package/esm/components/icons/icon-definitions.spec.d.ts.map +1 -0
  235. package/esm/components/icons/icon-definitions.spec.js +59 -0
  236. package/esm/components/icons/icon-definitions.spec.js.map +1 -0
  237. package/esm/components/icons/icon-types.d.ts +48 -0
  238. package/esm/components/icons/icon-types.d.ts.map +1 -0
  239. package/esm/components/icons/icon-types.js +2 -0
  240. package/esm/components/icons/icon-types.js.map +1 -0
  241. package/esm/components/icons/icon.d.ts +56 -0
  242. package/esm/components/icons/icon.d.ts.map +1 -0
  243. package/esm/components/icons/icon.js +61 -0
  244. package/esm/components/icons/icon.js.map +1 -0
  245. package/esm/components/icons/icon.spec.d.ts +2 -0
  246. package/esm/components/icons/icon.spec.d.ts.map +1 -0
  247. package/esm/components/icons/icon.spec.js +224 -0
  248. package/esm/components/icons/icon.spec.js.map +1 -0
  249. package/esm/components/icons/index.d.ts +5 -0
  250. package/esm/components/icons/index.d.ts.map +1 -0
  251. package/esm/components/icons/index.js +3 -0
  252. package/esm/components/icons/index.js.map +1 -0
  253. package/esm/components/image.d.ts +62 -0
  254. package/esm/components/image.d.ts.map +1 -0
  255. package/esm/components/image.js +348 -0
  256. package/esm/components/image.js.map +1 -0
  257. package/esm/components/image.spec.d.ts +2 -0
  258. package/esm/components/image.spec.d.ts.map +1 -0
  259. package/esm/components/image.spec.js +542 -0
  260. package/esm/components/image.spec.js.map +1 -0
  261. package/esm/components/index.d.ts +32 -4
  262. package/esm/components/index.d.ts.map +1 -1
  263. package/esm/components/index.js +32 -4
  264. package/esm/components/index.js.map +1 -1
  265. package/esm/components/inputs/autocomplete.d.ts +2 -0
  266. package/esm/components/inputs/autocomplete.d.ts.map +1 -1
  267. package/esm/components/inputs/autocomplete.js +10 -6
  268. package/esm/components/inputs/autocomplete.js.map +1 -1
  269. package/esm/components/inputs/autocomplete.spec.js +10 -1
  270. package/esm/components/inputs/autocomplete.spec.js.map +1 -1
  271. package/esm/components/inputs/checkbox.d.ts +50 -0
  272. package/esm/components/inputs/checkbox.d.ts.map +1 -0
  273. package/esm/components/inputs/checkbox.js +126 -0
  274. package/esm/components/inputs/checkbox.js.map +1 -0
  275. package/esm/components/inputs/checkbox.spec.d.ts +2 -0
  276. package/esm/components/inputs/checkbox.spec.d.ts.map +1 -0
  277. package/esm/components/inputs/checkbox.spec.js +287 -0
  278. package/esm/components/inputs/checkbox.spec.js.map +1 -0
  279. package/esm/components/inputs/index.d.ts +7 -0
  280. package/esm/components/inputs/index.d.ts.map +1 -1
  281. package/esm/components/inputs/index.js +7 -0
  282. package/esm/components/inputs/index.js.map +1 -1
  283. package/esm/components/inputs/input-number.d.ts +79 -0
  284. package/esm/components/inputs/input-number.d.ts.map +1 -0
  285. package/esm/components/inputs/input-number.js +232 -0
  286. package/esm/components/inputs/input-number.js.map +1 -0
  287. package/esm/components/inputs/input-number.spec.d.ts +2 -0
  288. package/esm/components/inputs/input-number.spec.d.ts.map +1 -0
  289. package/esm/components/inputs/input-number.spec.js +516 -0
  290. package/esm/components/inputs/input-number.spec.js.map +1 -0
  291. package/esm/components/inputs/input.d.ts +2 -1
  292. package/esm/components/inputs/input.d.ts.map +1 -1
  293. package/esm/components/inputs/input.js +86 -116
  294. package/esm/components/inputs/input.js.map +1 -1
  295. package/esm/components/inputs/input.spec.js +461 -427
  296. package/esm/components/inputs/input.spec.js.map +1 -1
  297. package/esm/components/inputs/radio-group.d.ts +38 -0
  298. package/esm/components/inputs/radio-group.d.ts.map +1 -0
  299. package/esm/components/inputs/radio-group.js +58 -0
  300. package/esm/components/inputs/radio-group.js.map +1 -0
  301. package/esm/components/inputs/radio-group.spec.d.ts +2 -0
  302. package/esm/components/inputs/radio-group.spec.d.ts.map +1 -0
  303. package/esm/components/inputs/radio-group.spec.js +201 -0
  304. package/esm/components/inputs/radio-group.spec.js.map +1 -0
  305. package/esm/components/inputs/radio.d.ts +42 -0
  306. package/esm/components/inputs/radio.d.ts.map +1 -0
  307. package/esm/components/inputs/radio.js +134 -0
  308. package/esm/components/inputs/radio.js.map +1 -0
  309. package/esm/components/inputs/radio.spec.d.ts +2 -0
  310. package/esm/components/inputs/radio.spec.d.ts.map +1 -0
  311. package/esm/components/inputs/radio.spec.js +211 -0
  312. package/esm/components/inputs/radio.spec.js.map +1 -0
  313. package/esm/components/inputs/select.d.ts +67 -0
  314. package/esm/components/inputs/select.d.ts.map +1 -0
  315. package/esm/components/inputs/select.js +581 -0
  316. package/esm/components/inputs/select.js.map +1 -0
  317. package/esm/components/inputs/select.spec.d.ts +2 -0
  318. package/esm/components/inputs/select.spec.d.ts.map +1 -0
  319. package/esm/components/inputs/select.spec.js +1009 -0
  320. package/esm/components/inputs/select.spec.js.map +1 -0
  321. package/esm/components/inputs/slider.d.ts +66 -0
  322. package/esm/components/inputs/slider.d.ts.map +1 -0
  323. package/esm/components/inputs/slider.js +526 -0
  324. package/esm/components/inputs/slider.js.map +1 -0
  325. package/esm/components/inputs/slider.spec.d.ts +2 -0
  326. package/esm/components/inputs/slider.spec.d.ts.map +1 -0
  327. package/esm/components/inputs/slider.spec.js +812 -0
  328. package/esm/components/inputs/slider.spec.js.map +1 -0
  329. package/esm/components/inputs/switch.d.ts +50 -0
  330. package/esm/components/inputs/switch.d.ts.map +1 -0
  331. package/esm/components/inputs/switch.js +138 -0
  332. package/esm/components/inputs/switch.js.map +1 -0
  333. package/esm/components/inputs/switch.spec.d.ts +2 -0
  334. package/esm/components/inputs/switch.spec.d.ts.map +1 -0
  335. package/esm/components/inputs/switch.spec.js +313 -0
  336. package/esm/components/inputs/switch.spec.js.map +1 -0
  337. package/esm/components/inputs/text-area.d.ts +2 -0
  338. package/esm/components/inputs/text-area.d.ts.map +1 -1
  339. package/esm/components/inputs/text-area.js +13 -21
  340. package/esm/components/inputs/text-area.js.map +1 -1
  341. package/esm/components/inputs/text-area.spec.js +171 -156
  342. package/esm/components/inputs/text-area.spec.js.map +1 -1
  343. package/esm/components/linear-progress.d.ts +32 -0
  344. package/esm/components/linear-progress.d.ts.map +1 -0
  345. package/esm/components/linear-progress.js +79 -0
  346. package/esm/components/linear-progress.js.map +1 -0
  347. package/esm/components/linear-progress.spec.d.ts +2 -0
  348. package/esm/components/linear-progress.spec.d.ts.map +1 -0
  349. package/esm/components/linear-progress.spec.js +251 -0
  350. package/esm/components/linear-progress.spec.js.map +1 -0
  351. package/esm/components/list/index.d.ts +3 -0
  352. package/esm/components/list/index.d.ts.map +1 -0
  353. package/esm/components/list/index.js +3 -0
  354. package/esm/components/list/index.js.map +1 -0
  355. package/esm/components/list/list-item.d.ts +13 -0
  356. package/esm/components/list/list-item.d.ts.map +1 -0
  357. package/esm/components/list/list-item.js +81 -0
  358. package/esm/components/list/list-item.js.map +1 -0
  359. package/esm/components/list/list.d.ts +18 -0
  360. package/esm/components/list/list.d.ts.map +1 -0
  361. package/esm/components/list/list.js +42 -0
  362. package/esm/components/list/list.js.map +1 -0
  363. package/esm/components/list/list.spec.d.ts +2 -0
  364. package/esm/components/list/list.spec.d.ts.map +1 -0
  365. package/esm/components/list/list.spec.js +540 -0
  366. package/esm/components/list/list.spec.js.map +1 -0
  367. package/esm/components/loader.d.ts +2 -0
  368. package/esm/components/loader.d.ts.map +1 -1
  369. package/esm/components/loader.js +18 -10
  370. package/esm/components/loader.js.map +1 -1
  371. package/esm/components/loader.spec.js +191 -175
  372. package/esm/components/loader.spec.js.map +1 -1
  373. package/esm/components/menu/index.d.ts +3 -0
  374. package/esm/components/menu/index.d.ts.map +1 -0
  375. package/esm/components/menu/index.js +3 -0
  376. package/esm/components/menu/index.js.map +1 -0
  377. package/esm/components/menu/menu-types.d.ts +27 -0
  378. package/esm/components/menu/menu-types.d.ts.map +1 -0
  379. package/esm/components/menu/menu-types.js +22 -0
  380. package/esm/components/menu/menu-types.js.map +1 -0
  381. package/esm/components/menu/menu-types.spec.d.ts +2 -0
  382. package/esm/components/menu/menu-types.spec.d.ts.map +1 -0
  383. package/esm/components/menu/menu-types.spec.js +103 -0
  384. package/esm/components/menu/menu-types.spec.js.map +1 -0
  385. package/esm/components/menu/menu.d.ts +17 -0
  386. package/esm/components/menu/menu.d.ts.map +1 -0
  387. package/esm/components/menu/menu.js +240 -0
  388. package/esm/components/menu/menu.js.map +1 -0
  389. package/esm/components/menu/menu.spec.d.ts +2 -0
  390. package/esm/components/menu/menu.spec.d.ts.map +1 -0
  391. package/esm/components/menu/menu.spec.js +427 -0
  392. package/esm/components/menu/menu.spec.js.map +1 -0
  393. package/esm/components/modal.d.ts +3 -2
  394. package/esm/components/modal.d.ts.map +1 -1
  395. package/esm/components/modal.js +8 -5
  396. package/esm/components/modal.js.map +1 -1
  397. package/esm/components/modal.spec.js +50 -43
  398. package/esm/components/modal.spec.js.map +1 -1
  399. package/esm/components/noty-list.d.ts +4 -0
  400. package/esm/components/noty-list.d.ts.map +1 -1
  401. package/esm/components/noty-list.js +65 -53
  402. package/esm/components/noty-list.js.map +1 -1
  403. package/esm/components/noty-list.spec.js +71 -68
  404. package/esm/components/noty-list.spec.js.map +1 -1
  405. package/esm/components/page-container/index.d.ts +54 -0
  406. package/esm/components/page-container/index.d.ts.map +1 -0
  407. package/esm/components/page-container/index.js +63 -0
  408. package/esm/components/page-container/index.js.map +1 -0
  409. package/esm/components/page-container/index.spec.d.ts +2 -0
  410. package/esm/components/page-container/index.spec.d.ts.map +1 -0
  411. package/esm/components/page-container/index.spec.js +217 -0
  412. package/esm/components/page-container/index.spec.js.map +1 -0
  413. package/esm/components/page-container/page-header.d.ts +57 -0
  414. package/esm/components/page-container/page-header.d.ts.map +1 -0
  415. package/esm/components/page-container/page-header.js +93 -0
  416. package/esm/components/page-container/page-header.js.map +1 -0
  417. package/esm/components/page-container/page-header.spec.d.ts +2 -0
  418. package/esm/components/page-container/page-header.spec.d.ts.map +1 -0
  419. package/esm/components/page-container/page-header.spec.js +230 -0
  420. package/esm/components/page-container/page-header.spec.js.map +1 -0
  421. package/esm/components/page-layout/index.d.ts +83 -0
  422. package/esm/components/page-layout/index.d.ts.map +1 -0
  423. package/esm/components/page-layout/index.js +288 -0
  424. package/esm/components/page-layout/index.js.map +1 -0
  425. package/esm/components/page-layout/index.spec.d.ts +2 -0
  426. package/esm/components/page-layout/index.spec.d.ts.map +1 -0
  427. package/esm/components/page-layout/index.spec.js +637 -0
  428. package/esm/components/page-layout/index.spec.js.map +1 -0
  429. package/esm/components/pagination.d.ts +43 -0
  430. package/esm/components/pagination.d.ts.map +1 -0
  431. package/esm/components/pagination.js +165 -0
  432. package/esm/components/pagination.js.map +1 -0
  433. package/esm/components/pagination.spec.d.ts +2 -0
  434. package/esm/components/pagination.spec.d.ts.map +1 -0
  435. package/esm/components/pagination.spec.js +195 -0
  436. package/esm/components/pagination.spec.js.map +1 -0
  437. package/esm/components/paper.d.ts +3 -1
  438. package/esm/components/paper.d.ts.map +1 -1
  439. package/esm/components/paper.js +11 -9
  440. package/esm/components/paper.js.map +1 -1
  441. package/esm/components/paper.spec.js +26 -18
  442. package/esm/components/paper.spec.js.map +1 -1
  443. package/esm/components/rating.d.ts +62 -0
  444. package/esm/components/rating.d.ts.map +1 -0
  445. package/esm/components/rating.js +201 -0
  446. package/esm/components/rating.js.map +1 -0
  447. package/esm/components/rating.spec.d.ts +2 -0
  448. package/esm/components/rating.spec.d.ts.map +1 -0
  449. package/esm/components/rating.spec.js +663 -0
  450. package/esm/components/rating.spec.js.map +1 -0
  451. package/esm/components/result.d.ts +37 -0
  452. package/esm/components/result.d.ts.map +1 -0
  453. package/esm/components/result.js +109 -0
  454. package/esm/components/result.js.map +1 -0
  455. package/esm/components/result.spec.d.ts +2 -0
  456. package/esm/components/result.spec.d.ts.map +1 -0
  457. package/esm/components/result.spec.js +159 -0
  458. package/esm/components/result.spec.js.map +1 -0
  459. package/esm/components/searchable-input-styles.d.ts +8 -0
  460. package/esm/components/searchable-input-styles.d.ts.map +1 -0
  461. package/esm/components/searchable-input-styles.js +71 -0
  462. package/esm/components/searchable-input-styles.js.map +1 -0
  463. package/esm/components/skeleton.d.ts +2 -0
  464. package/esm/components/skeleton.d.ts.map +1 -1
  465. package/esm/components/skeleton.js +19 -6
  466. package/esm/components/skeleton.js.map +1 -1
  467. package/esm/components/skeleton.spec.js +103 -95
  468. package/esm/components/skeleton.spec.js.map +1 -1
  469. package/esm/components/styles.d.ts.map +1 -1
  470. package/esm/components/styles.js +14 -13
  471. package/esm/components/styles.js.map +1 -1
  472. package/esm/components/styles.spec.js +27 -26
  473. package/esm/components/styles.spec.js.map +1 -1
  474. package/esm/components/suggest/index.d.ts.map +1 -1
  475. package/esm/components/suggest/index.js +24 -85
  476. package/esm/components/suggest/index.js.map +1 -1
  477. package/esm/components/suggest/index.spec.js +402 -378
  478. package/esm/components/suggest/index.spec.js.map +1 -1
  479. package/esm/components/suggest/suggest-input.d.ts +2 -0
  480. package/esm/components/suggest/suggest-input.d.ts.map +1 -1
  481. package/esm/components/suggest/suggest-input.js +10 -8
  482. package/esm/components/suggest/suggest-input.js.map +1 -1
  483. package/esm/components/suggest/suggest-input.spec.js +83 -71
  484. package/esm/components/suggest/suggest-input.spec.js.map +1 -1
  485. package/esm/components/suggest/suggest-manager.spec.js +102 -92
  486. package/esm/components/suggest/suggest-manager.spec.js.map +1 -1
  487. package/esm/components/suggest/suggestion-list.d.ts.map +1 -1
  488. package/esm/components/suggest/suggestion-list.js +21 -22
  489. package/esm/components/suggest/suggestion-list.js.map +1 -1
  490. package/esm/components/suggest/suggestion-list.spec.js +165 -146
  491. package/esm/components/suggest/suggestion-list.spec.js.map +1 -1
  492. package/esm/components/tabs.d.ts +18 -2
  493. package/esm/components/tabs.d.ts.map +1 -1
  494. package/esm/components/tabs.js +154 -14
  495. package/esm/components/tabs.js.map +1 -1
  496. package/esm/components/tabs.spec.js +295 -7
  497. package/esm/components/tabs.spec.js.map +1 -1
  498. package/esm/components/timeline.d.ts +53 -0
  499. package/esm/components/timeline.d.ts.map +1 -0
  500. package/esm/components/timeline.js +162 -0
  501. package/esm/components/timeline.js.map +1 -0
  502. package/esm/components/timeline.spec.d.ts +2 -0
  503. package/esm/components/timeline.spec.d.ts.map +1 -0
  504. package/esm/components/timeline.spec.js +209 -0
  505. package/esm/components/timeline.spec.js.map +1 -0
  506. package/esm/components/tooltip.d.ts +25 -0
  507. package/esm/components/tooltip.d.ts.map +1 -0
  508. package/esm/components/tooltip.js +113 -0
  509. package/esm/components/tooltip.js.map +1 -0
  510. package/esm/components/tooltip.spec.d.ts +2 -0
  511. package/esm/components/tooltip.spec.d.ts.map +1 -0
  512. package/esm/components/tooltip.spec.js +152 -0
  513. package/esm/components/tooltip.spec.js.map +1 -0
  514. package/esm/components/tree/index.d.ts +3 -0
  515. package/esm/components/tree/index.d.ts.map +1 -0
  516. package/esm/components/tree/index.js +3 -0
  517. package/esm/components/tree/index.js.map +1 -0
  518. package/esm/components/tree/tree-item.d.ts +14 -0
  519. package/esm/components/tree/tree-item.d.ts.map +1 -0
  520. package/esm/components/tree/tree-item.js +118 -0
  521. package/esm/components/tree/tree-item.js.map +1 -0
  522. package/esm/components/tree/tree.d.ts +20 -0
  523. package/esm/components/tree/tree.d.ts.map +1 -0
  524. package/esm/components/tree/tree.js +66 -0
  525. package/esm/components/tree/tree.js.map +1 -0
  526. package/esm/components/tree/tree.spec.d.ts +2 -0
  527. package/esm/components/tree/tree.spec.d.ts.map +1 -0
  528. package/esm/components/tree/tree.spec.js +427 -0
  529. package/esm/components/tree/tree.spec.js.map +1 -0
  530. package/esm/components/typography.d.ts +48 -0
  531. package/esm/components/typography.d.ts.map +1 -0
  532. package/esm/components/typography.js +223 -0
  533. package/esm/components/typography.js.map +1 -0
  534. package/esm/components/typography.spec.d.ts +2 -0
  535. package/esm/components/typography.spec.d.ts.map +1 -0
  536. package/esm/components/typography.spec.js +199 -0
  537. package/esm/components/typography.spec.js.map +1 -0
  538. package/esm/components/wizard/index.d.ts +2 -0
  539. package/esm/components/wizard/index.d.ts.map +1 -1
  540. package/esm/components/wizard/index.spec.js +70 -56
  541. package/esm/components/wizard/index.spec.js.map +1 -1
  542. package/esm/services/click-away-service.d.ts +5 -2
  543. package/esm/services/click-away-service.d.ts.map +1 -1
  544. package/esm/services/click-away-service.js +7 -1
  545. package/esm/services/click-away-service.js.map +1 -1
  546. package/esm/services/click-away-service.spec.js +14 -12
  547. package/esm/services/click-away-service.spec.js.map +1 -1
  548. package/esm/services/css-variable-theme.d.ts +167 -1
  549. package/esm/services/css-variable-theme.d.ts.map +1 -1
  550. package/esm/services/css-variable-theme.js +102 -0
  551. package/esm/services/css-variable-theme.js.map +1 -1
  552. package/esm/services/css-variable-theme.spec.js +131 -1
  553. package/esm/services/css-variable-theme.spec.js.map +1 -1
  554. package/esm/services/default-dark-theme.d.ts +107 -2
  555. package/esm/services/default-dark-theme.d.ts.map +1 -1
  556. package/esm/services/default-dark-theme.js +87 -1
  557. package/esm/services/default-dark-theme.js.map +1 -1
  558. package/esm/services/default-light-theme.d.ts +107 -2
  559. package/esm/services/default-light-theme.d.ts.map +1 -1
  560. package/esm/services/default-light-theme.js +86 -0
  561. package/esm/services/default-light-theme.js.map +1 -1
  562. package/esm/services/index.d.ts +6 -2
  563. package/esm/services/index.d.ts.map +1 -1
  564. package/esm/services/index.js +6 -2
  565. package/esm/services/index.js.map +1 -1
  566. package/esm/services/layout-service.d.ts +217 -0
  567. package/esm/services/layout-service.d.ts.map +1 -0
  568. package/esm/services/layout-service.js +331 -0
  569. package/esm/services/layout-service.js.map +1 -0
  570. package/esm/services/layout-service.spec.d.ts +2 -0
  571. package/esm/services/layout-service.spec.d.ts.map +1 -0
  572. package/esm/services/layout-service.spec.js +425 -0
  573. package/esm/services/layout-service.spec.js.map +1 -0
  574. package/esm/services/list-service.d.ts +31 -0
  575. package/esm/services/list-service.d.ts.map +1 -0
  576. package/esm/services/list-service.js +149 -0
  577. package/esm/services/list-service.js.map +1 -0
  578. package/esm/services/list-service.spec.d.ts +2 -0
  579. package/esm/services/list-service.spec.d.ts.map +1 -0
  580. package/esm/services/list-service.spec.js +283 -0
  581. package/esm/services/list-service.spec.js.map +1 -0
  582. package/esm/services/palette-css-vars.d.ts +12 -0
  583. package/esm/services/palette-css-vars.d.ts.map +1 -0
  584. package/esm/services/palette-css-vars.js +44 -0
  585. package/esm/services/palette-css-vars.js.map +1 -0
  586. package/esm/services/theme-provider-service.d.ts +387 -2
  587. package/esm/services/theme-provider-service.d.ts.map +1 -1
  588. package/esm/services/theme-provider-service.js.map +1 -1
  589. package/esm/services/tree-service.d.ts +61 -0
  590. package/esm/services/tree-service.d.ts.map +1 -0
  591. package/esm/services/tree-service.js +149 -0
  592. package/esm/services/tree-service.js.map +1 -0
  593. package/esm/services/tree-service.spec.d.ts +2 -0
  594. package/esm/services/tree-service.spec.d.ts.map +1 -0
  595. package/esm/services/tree-service.spec.js +338 -0
  596. package/esm/services/tree-service.spec.js.map +1 -0
  597. package/esm/utils/promisify-animation.d.ts.map +1 -1
  598. package/esm/utils/promisify-animation.js +6 -1
  599. package/esm/utils/promisify-animation.js.map +1 -1
  600. package/package.json +7 -8
  601. package/src/components/accordion/accordion-item.tsx +197 -0
  602. package/src/components/accordion/accordion.spec.tsx +418 -0
  603. package/src/components/accordion/accordion.tsx +50 -0
  604. package/src/components/accordion/index.ts +2 -0
  605. package/src/components/alert.spec.tsx +256 -0
  606. package/src/components/alert.tsx +186 -0
  607. package/src/components/app-bar-link.spec.tsx +22 -19
  608. package/src/components/app-bar-link.tsx +29 -10
  609. package/src/components/app-bar.spec.tsx +73 -58
  610. package/src/components/app-bar.tsx +19 -12
  611. package/src/components/avatar.tsx +46 -47
  612. package/src/components/badge.spec.tsx +228 -0
  613. package/src/components/badge.tsx +104 -0
  614. package/src/components/breadcrumb.spec.tsx +396 -0
  615. package/src/components/breadcrumb.tsx +188 -0
  616. package/src/components/button-group.spec.tsx +611 -0
  617. package/src/components/button-group.tsx +423 -0
  618. package/src/components/button.spec.tsx +257 -67
  619. package/src/components/button.tsx +130 -80
  620. package/src/components/card.spec.tsx +389 -0
  621. package/src/components/card.tsx +261 -0
  622. package/src/components/carousel.spec.tsx +894 -0
  623. package/src/components/carousel.tsx +376 -0
  624. package/src/components/chip.spec.tsx +200 -0
  625. package/src/components/chip.tsx +188 -0
  626. package/src/components/circular-progress.spec.tsx +289 -0
  627. package/src/components/circular-progress.tsx +145 -0
  628. package/src/components/command-palette/command-palette-input.spec.tsx +219 -219
  629. package/src/components/command-palette/command-palette-input.tsx +25 -9
  630. package/src/components/command-palette/command-palette-manager.spec.ts +132 -117
  631. package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +358 -358
  632. package/src/components/command-palette/command-palette-suggestion-list.tsx +22 -20
  633. package/src/components/command-palette/index.spec.tsx +12 -12
  634. package/src/components/command-palette/index.tsx +25 -102
  635. package/src/components/context-menu/context-menu-item.tsx +85 -0
  636. package/src/components/context-menu/context-menu-manager.spec.ts +433 -0
  637. package/src/components/context-menu/context-menu-manager.ts +148 -0
  638. package/src/components/context-menu/context-menu.spec.tsx +352 -0
  639. package/src/components/context-menu/context-menu.tsx +116 -0
  640. package/src/components/context-menu/index.ts +3 -0
  641. package/src/components/data-grid/body.spec.tsx +287 -283
  642. package/src/components/data-grid/data-grid-row.spec.tsx +165 -140
  643. package/src/components/data-grid/data-grid-row.tsx +72 -55
  644. package/src/components/data-grid/data-grid.spec.tsx +659 -729
  645. package/src/components/data-grid/data-grid.tsx +19 -15
  646. package/src/components/data-grid/footer.spec.tsx +249 -237
  647. package/src/components/data-grid/header.spec.tsx +374 -351
  648. package/src/components/data-grid/header.tsx +58 -39
  649. package/src/components/data-grid/selection-cell.spec.tsx +46 -45
  650. package/src/components/data-grid/selection-cell.tsx +2 -6
  651. package/src/components/dialog.spec.tsx +135 -0
  652. package/src/components/dialog.tsx +277 -0
  653. package/src/components/divider.spec.tsx +197 -0
  654. package/src/components/divider.tsx +147 -0
  655. package/src/components/drawer/drawer-toggle-button.spec.tsx +374 -0
  656. package/src/components/drawer/drawer-toggle-button.tsx +124 -0
  657. package/src/components/drawer/index.spec.tsx +748 -0
  658. package/src/components/drawer/index.tsx +227 -0
  659. package/src/components/dropdown.spec.tsx +445 -0
  660. package/src/components/dropdown.tsx +343 -0
  661. package/src/components/fab.spec.tsx +51 -40
  662. package/src/components/fab.tsx +32 -9
  663. package/src/components/form.spec.tsx +303 -293
  664. package/src/components/form.tsx +10 -7
  665. package/src/components/grid.spec.tsx +276 -183
  666. package/src/components/grid.tsx +10 -10
  667. package/src/components/icons/icon-definitions.spec.ts +68 -0
  668. package/src/components/icons/icon-definitions.ts +509 -0
  669. package/src/components/icons/icon-types.ts +48 -0
  670. package/src/components/icons/icon.spec.tsx +314 -0
  671. package/src/components/icons/icon.tsx +111 -0
  672. package/src/components/icons/index.ts +4 -0
  673. package/src/components/image.spec.tsx +748 -0
  674. package/src/components/image.tsx +520 -0
  675. package/src/components/index.ts +32 -4
  676. package/src/components/inputs/autocomplete.spec.tsx +10 -1
  677. package/src/components/inputs/autocomplete.tsx +13 -7
  678. package/src/components/inputs/checkbox.spec.tsx +377 -0
  679. package/src/components/inputs/checkbox.tsx +198 -0
  680. package/src/components/inputs/index.ts +7 -0
  681. package/src/components/inputs/input-number.spec.tsx +686 -0
  682. package/src/components/inputs/input-number.tsx +387 -0
  683. package/src/components/inputs/input.spec.tsx +544 -508
  684. package/src/components/inputs/input.tsx +91 -132
  685. package/src/components/inputs/radio-group.spec.tsx +281 -0
  686. package/src/components/inputs/radio-group.tsx +108 -0
  687. package/src/components/inputs/radio.spec.tsx +273 -0
  688. package/src/components/inputs/radio.tsx +199 -0
  689. package/src/components/inputs/select.spec.tsx +1237 -0
  690. package/src/components/inputs/select.tsx +775 -0
  691. package/src/components/inputs/slider.spec.tsx +1020 -0
  692. package/src/components/inputs/slider.tsx +696 -0
  693. package/src/components/inputs/switch.spec.tsx +410 -0
  694. package/src/components/inputs/switch.tsx +218 -0
  695. package/src/components/inputs/text-area.spec.tsx +186 -171
  696. package/src/components/inputs/text-area.tsx +13 -19
  697. package/src/components/linear-progress.spec.tsx +320 -0
  698. package/src/components/linear-progress.tsx +127 -0
  699. package/src/components/list/index.ts +2 -0
  700. package/src/components/list/list-item.tsx +106 -0
  701. package/src/components/list/list.spec.tsx +817 -0
  702. package/src/components/list/list.tsx +92 -0
  703. package/src/components/loader.spec.tsx +220 -204
  704. package/src/components/loader.tsx +17 -9
  705. package/src/components/menu/index.ts +2 -0
  706. package/src/components/menu/menu-types.spec.ts +122 -0
  707. package/src/components/menu/menu-types.ts +43 -0
  708. package/src/components/menu/menu.spec.tsx +483 -0
  709. package/src/components/menu/menu.tsx +326 -0
  710. package/src/components/modal.spec.tsx +65 -55
  711. package/src/components/modal.tsx +9 -6
  712. package/src/components/noty-list.spec.tsx +78 -75
  713. package/src/components/noty-list.tsx +76 -68
  714. package/src/components/page-container/index.spec.tsx +274 -0
  715. package/src/components/page-container/index.tsx +82 -0
  716. package/src/components/page-container/page-header.spec.tsx +308 -0
  717. package/src/components/page-container/page-header.tsx +127 -0
  718. package/src/components/page-layout/index.spec.tsx +882 -0
  719. package/src/components/page-layout/index.tsx +392 -0
  720. package/src/components/pagination.spec.tsx +275 -0
  721. package/src/components/pagination.tsx +249 -0
  722. package/src/components/paper.spec.tsx +26 -18
  723. package/src/components/paper.tsx +12 -10
  724. package/src/components/rating.spec.tsx +866 -0
  725. package/src/components/rating.tsx +286 -0
  726. package/src/components/result.spec.tsx +221 -0
  727. package/src/components/result.tsx +155 -0
  728. package/src/components/searchable-input-styles.ts +81 -0
  729. package/src/components/skeleton.spec.tsx +126 -118
  730. package/src/components/skeleton.tsx +23 -6
  731. package/src/components/styles.spec.ts +27 -28
  732. package/src/components/styles.tsx +15 -13
  733. package/src/components/suggest/index.spec.tsx +611 -587
  734. package/src/components/suggest/index.tsx +28 -95
  735. package/src/components/suggest/suggest-input.spec.tsx +95 -81
  736. package/src/components/suggest/suggest-input.tsx +9 -7
  737. package/src/components/suggest/suggest-manager.spec.ts +103 -93
  738. package/src/components/suggest/suggestion-list.spec.tsx +194 -173
  739. package/src/components/suggest/suggestion-list.tsx +23 -22
  740. package/src/components/tabs.spec.tsx +369 -7
  741. package/src/components/tabs.tsx +221 -18
  742. package/src/components/timeline.spec.tsx +294 -0
  743. package/src/components/timeline.tsx +221 -0
  744. package/src/components/tooltip.spec.tsx +223 -0
  745. package/src/components/tooltip.tsx +155 -0
  746. package/src/components/tree/index.ts +2 -0
  747. package/src/components/tree/tree-item.tsx +161 -0
  748. package/src/components/tree/tree.spec.tsx +677 -0
  749. package/src/components/tree/tree.tsx +111 -0
  750. package/src/components/typography.spec.tsx +235 -0
  751. package/src/components/typography.tsx +292 -0
  752. package/src/components/wizard/index.spec.tsx +77 -68
  753. package/src/services/click-away-service.spec.ts +14 -16
  754. package/src/services/click-away-service.ts +9 -3
  755. package/src/services/css-variable-theme.spec.ts +169 -1
  756. package/src/services/css-variable-theme.ts +107 -2
  757. package/src/services/default-dark-theme.ts +89 -3
  758. package/src/services/default-light-theme.ts +88 -2
  759. package/src/services/index.ts +6 -2
  760. package/src/services/layout-service.spec.ts +535 -0
  761. package/src/services/layout-service.ts +391 -0
  762. package/src/services/list-service.spec.ts +362 -0
  763. package/src/services/list-service.ts +169 -0
  764. package/src/services/palette-css-vars.ts +46 -0
  765. package/src/services/theme-provider-service.ts +246 -1
  766. package/src/services/tree-service.spec.ts +412 -0
  767. package/src/services/tree-service.ts +179 -0
  768. package/src/utils/promisify-animation.ts +7 -1
@@ -0,0 +1,1020 @@
1
+ import { Injector } from '@furystack/inject'
2
+ import { createComponent, initializeShadeRoot } from '@furystack/shades'
3
+ import { sleepAsync, usingAsync } from '@furystack/utils'
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
5
+ import { ThemeProviderService } from '../../services/theme-provider-service.js'
6
+ import { Slider } from './slider.js'
7
+
8
+ describe('Slider', () => {
9
+ beforeEach(() => {
10
+ document.body.innerHTML = '<div id="root"></div>'
11
+ })
12
+
13
+ afterEach(() => {
14
+ document.body.innerHTML = ''
15
+ vi.restoreAllMocks()
16
+ })
17
+
18
+ const renderSlider = async (props: Parameters<typeof Slider>[0] = {}) => {
19
+ const injector = new Injector()
20
+ const root = document.getElementById('root')!
21
+ initializeShadeRoot({
22
+ injector,
23
+ rootElement: root,
24
+ jsxElement: <Slider {...props} />,
25
+ })
26
+ await sleepAsync(100)
27
+ return {
28
+ injector,
29
+ slider: document.querySelector('shade-slider') as HTMLElement,
30
+ [Symbol.asyncDispose]: () => injector[Symbol.asyncDispose](),
31
+ }
32
+ }
33
+
34
+ describe('rendering', () => {
35
+ it('should render as custom element', async () => {
36
+ await usingAsync(await renderSlider(), async ({ slider }) => {
37
+ expect(slider).not.toBeNull()
38
+ })
39
+ })
40
+
41
+ it('should render the rail, track, and thumb', async () => {
42
+ await usingAsync(await renderSlider(), async ({ slider }) => {
43
+ expect(slider.querySelector('.slider-rail')).not.toBeNull()
44
+ expect(slider.querySelector('.slider-track')).not.toBeNull()
45
+ expect(slider.querySelector('.slider-thumb')).not.toBeNull()
46
+ })
47
+ })
48
+
49
+ it('should render a single thumb for non-range slider', async () => {
50
+ await usingAsync(await renderSlider({ value: 50 }), async ({ slider }) => {
51
+ const thumbs = slider.querySelectorAll('.slider-thumb')
52
+ expect(thumbs.length).toBe(1)
53
+ })
54
+ })
55
+
56
+ it('should render two thumbs for range slider', async () => {
57
+ await usingAsync(await renderSlider({ value: [20, 80] }), async ({ slider }) => {
58
+ const thumbs = slider.querySelectorAll('.slider-thumb')
59
+ expect(thumbs.length).toBe(2)
60
+ })
61
+ })
62
+ })
63
+
64
+ describe('value positioning', () => {
65
+ it('should position thumb at 0% when value equals min', async () => {
66
+ await usingAsync(await renderSlider({ value: 0, min: 0, max: 100 }), async ({ slider }) => {
67
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
68
+ expect(thumb.style.left).toBe('0%')
69
+ })
70
+ })
71
+
72
+ it('should position thumb at 50% when value is midpoint', async () => {
73
+ await usingAsync(await renderSlider({ value: 50, min: 0, max: 100 }), async ({ slider }) => {
74
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
75
+ expect(thumb.style.left).toBe('50%')
76
+ })
77
+ })
78
+
79
+ it('should position thumb at 100% when value equals max', async () => {
80
+ await usingAsync(await renderSlider({ value: 100, min: 0, max: 100 }), async ({ slider }) => {
81
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
82
+ expect(thumb.style.left).toBe('100%')
83
+ })
84
+ })
85
+
86
+ it('should set correct track width for single slider', async () => {
87
+ await usingAsync(await renderSlider({ value: 60, min: 0, max: 100 }), async ({ slider }) => {
88
+ const track = slider.querySelector('.slider-track') as HTMLElement
89
+ expect(track.style.left).toBe('0%')
90
+ expect(track.style.width).toBe('60%')
91
+ })
92
+ })
93
+
94
+ it('should set correct track position for range slider', async () => {
95
+ await usingAsync(await renderSlider({ value: [20, 80], min: 0, max: 100 }), async ({ slider }) => {
96
+ const track = slider.querySelector('.slider-track') as HTMLElement
97
+ expect(track.style.left).toBe('20%')
98
+ expect(track.style.width).toBe('60%')
99
+ })
100
+ })
101
+
102
+ it('should position range thumbs correctly', async () => {
103
+ await usingAsync(await renderSlider({ value: [25, 75], min: 0, max: 100 }), async ({ slider }) => {
104
+ const thumbs = slider.querySelectorAll<HTMLElement>('.slider-thumb')
105
+ expect(thumbs[0].style.left).toBe('25%')
106
+ expect(thumbs[1].style.left).toBe('75%')
107
+ })
108
+ })
109
+ })
110
+
111
+ describe('vertical mode', () => {
112
+ it('should set data-vertical attribute', async () => {
113
+ await usingAsync(await renderSlider({ vertical: true }), async ({ slider }) => {
114
+ expect(slider.hasAttribute('data-vertical')).toBe(true)
115
+ })
116
+ })
117
+
118
+ it('should not set data-vertical when horizontal', async () => {
119
+ await usingAsync(await renderSlider({ vertical: false }), async ({ slider }) => {
120
+ expect(slider.hasAttribute('data-vertical')).toBe(false)
121
+ })
122
+ })
123
+
124
+ it('should use bottom for positioning in vertical mode', async () => {
125
+ await usingAsync(await renderSlider({ value: 50, vertical: true }), async ({ slider }) => {
126
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
127
+ expect(thumb.style.bottom).toBe('50%')
128
+ })
129
+ })
130
+
131
+ it('should set vertical track via bottom/height', async () => {
132
+ await usingAsync(await renderSlider({ value: 60, vertical: true }), async ({ slider }) => {
133
+ const track = slider.querySelector('.slider-track') as HTMLElement
134
+ expect(track.style.bottom).toBe('0%')
135
+ expect(track.style.height).toBe('60%')
136
+ })
137
+ })
138
+ })
139
+
140
+ describe('disabled state', () => {
141
+ it('should set data-disabled attribute when disabled', async () => {
142
+ await usingAsync(await renderSlider({ disabled: true }), async ({ slider }) => {
143
+ expect(slider.hasAttribute('data-disabled')).toBe(true)
144
+ })
145
+ })
146
+
147
+ it('should not set data-disabled when not disabled', async () => {
148
+ await usingAsync(await renderSlider({ disabled: false }), async ({ slider }) => {
149
+ expect(slider.hasAttribute('data-disabled')).toBe(false)
150
+ })
151
+ })
152
+
153
+ it('should set tabIndex to -1 on thumb when disabled', async () => {
154
+ await usingAsync(await renderSlider({ disabled: true }), async ({ slider }) => {
155
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
156
+ expect(thumb.tabIndex).toBe(-1)
157
+ })
158
+ })
159
+
160
+ it('should set tabIndex to 0 on thumb when not disabled', async () => {
161
+ await usingAsync(await renderSlider({ disabled: false }), async ({ slider }) => {
162
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
163
+ expect(thumb.tabIndex).toBe(0)
164
+ })
165
+ })
166
+ })
167
+
168
+ describe('ARIA attributes', () => {
169
+ it('should set role="slider" on thumb', async () => {
170
+ await usingAsync(await renderSlider({ value: 50 }), async ({ slider }) => {
171
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
172
+ expect(thumb.getAttribute('role')).toBe('slider')
173
+ })
174
+ })
175
+
176
+ it('should set aria-valuemin and aria-valuemax', async () => {
177
+ await usingAsync(await renderSlider({ value: 50, min: 10, max: 90 }), async ({ slider }) => {
178
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
179
+ expect(thumb.getAttribute('aria-valuemin')).toBe('10')
180
+ expect(thumb.getAttribute('aria-valuemax')).toBe('90')
181
+ })
182
+ })
183
+
184
+ it('should set aria-valuenow to current value', async () => {
185
+ await usingAsync(await renderSlider({ value: 42 }), async ({ slider }) => {
186
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
187
+ expect(thumb.getAttribute('aria-valuenow')).toBe('42')
188
+ })
189
+ })
190
+
191
+ it('should set aria-orientation to horizontal by default', async () => {
192
+ await usingAsync(await renderSlider(), async ({ slider }) => {
193
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
194
+ expect(thumb.getAttribute('aria-orientation')).toBe('horizontal')
195
+ })
196
+ })
197
+
198
+ it('should set aria-orientation to vertical when vertical', async () => {
199
+ await usingAsync(await renderSlider({ vertical: true }), async ({ slider }) => {
200
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
201
+ expect(thumb.getAttribute('aria-orientation')).toBe('vertical')
202
+ })
203
+ })
204
+
205
+ it('should set aria-disabled when disabled', async () => {
206
+ await usingAsync(await renderSlider({ disabled: true }), async ({ slider }) => {
207
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
208
+ expect(thumb.getAttribute('aria-disabled')).toBe('true')
209
+ })
210
+ })
211
+
212
+ it('should set separate aria-valuenow for range thumbs', async () => {
213
+ await usingAsync(await renderSlider({ value: [20, 80] }), async ({ slider }) => {
214
+ const thumbs = slider.querySelectorAll<HTMLElement>('.slider-thumb')
215
+ expect(thumbs[0].getAttribute('aria-valuenow')).toBe('20')
216
+ expect(thumbs[1].getAttribute('aria-valuenow')).toBe('80')
217
+ })
218
+ })
219
+ })
220
+
221
+ describe('marks', () => {
222
+ it('should render mark dots when marks is true', async () => {
223
+ await usingAsync(await renderSlider({ min: 0, max: 10, step: 5, marks: true }), async ({ slider }) => {
224
+ const dots = slider.querySelectorAll('.slider-mark-dot')
225
+ expect(dots.length).toBe(3) // 0, 5, 10
226
+ })
227
+ })
228
+
229
+ it('should render custom marks from an array', async () => {
230
+ const marks = [
231
+ { value: 0, label: 'Min' },
232
+ { value: 50, label: 'Mid' },
233
+ { value: 100, label: 'Max' },
234
+ ]
235
+ await usingAsync(await renderSlider({ marks }), async ({ slider }) => {
236
+ const dots = slider.querySelectorAll('.slider-mark-dot')
237
+ const labels = slider.querySelectorAll('.slider-mark-label')
238
+ expect(dots.length).toBe(3)
239
+ expect(labels.length).toBe(3)
240
+ expect(labels[0].textContent).toBe('Min')
241
+ expect(labels[1].textContent).toBe('Mid')
242
+ expect(labels[2].textContent).toBe('Max')
243
+ })
244
+ })
245
+
246
+ it('should mark active dots for single slider', async () => {
247
+ await usingAsync(
248
+ await renderSlider({ value: 50, min: 0, max: 100, step: 50, marks: true }),
249
+ async ({ slider }) => {
250
+ const dots = slider.querySelectorAll('.slider-mark-dot')
251
+ expect(dots[0].hasAttribute('data-active')).toBe(true) // 0 <= 50
252
+ expect(dots[1].hasAttribute('data-active')).toBe(true) // 50 <= 50
253
+ expect(dots[2].hasAttribute('data-active')).toBe(false) // 100 > 50
254
+ },
255
+ )
256
+ })
257
+
258
+ it('should mark active dots for range slider', async () => {
259
+ await usingAsync(
260
+ await renderSlider({ value: [25, 75] as [number, number], min: 0, max: 100, step: 25, marks: true }),
261
+ async ({ slider }) => {
262
+ const dots = slider.querySelectorAll('.slider-mark-dot')
263
+ expect(dots[0].hasAttribute('data-active')).toBe(false) // 0 < 25
264
+ expect(dots[1].hasAttribute('data-active')).toBe(true) // 25 >= 25 && 25 <= 75
265
+ expect(dots[2].hasAttribute('data-active')).toBe(true) // 50 >= 25 && 50 <= 75
266
+ expect(dots[3].hasAttribute('data-active')).toBe(true) // 75 >= 25 && 75 <= 75
267
+ expect(dots[4].hasAttribute('data-active')).toBe(false) // 100 > 75
268
+ },
269
+ )
270
+ })
271
+
272
+ it('should set data-has-labels when marks have labels', async () => {
273
+ const marks = [{ value: 50, label: 'Half' }]
274
+ await usingAsync(await renderSlider({ marks }), async ({ slider }) => {
275
+ expect(slider.hasAttribute('data-has-labels')).toBe(true)
276
+ })
277
+ })
278
+
279
+ it('should not set data-has-labels when marks have no labels', async () => {
280
+ await usingAsync(await renderSlider({ min: 0, max: 10, step: 5, marks: true }), async ({ slider }) => {
281
+ expect(slider.hasAttribute('data-has-labels')).toBe(false)
282
+ })
283
+ })
284
+
285
+ it('should not render marks when marks is false or undefined', async () => {
286
+ await usingAsync(await renderSlider({ marks: false }), async ({ slider }) => {
287
+ expect(slider.querySelectorAll('.slider-mark-dot').length).toBe(0)
288
+ })
289
+ })
290
+ })
291
+
292
+ describe('theme integration', () => {
293
+ it('should set CSS color variable from theme', async () => {
294
+ await usingAsync(await renderSlider(), async ({ slider, injector }) => {
295
+ const themeService = injector.getInstance(ThemeProviderService)
296
+ expect(slider.style.getPropertyValue('--slider-color')).toBe(themeService.theme.palette.primary.main)
297
+ })
298
+ })
299
+
300
+ it('should use custom color from color prop', async () => {
301
+ await usingAsync(await renderSlider({ color: 'secondary' }), async ({ slider, injector }) => {
302
+ const themeService = injector.getInstance(ThemeProviderService)
303
+ expect(slider.style.getPropertyValue('--slider-color')).toBe(themeService.theme.palette.secondary.main)
304
+ })
305
+ })
306
+ })
307
+
308
+ describe('keyboard navigation', () => {
309
+ it('should increment value on ArrowRight', async () => {
310
+ const onValueChange = vi.fn()
311
+ await usingAsync(await renderSlider({ value: 50, step: 10, onValueChange }), async ({ slider }) => {
312
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
313
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
314
+ expect(onValueChange).toHaveBeenCalledWith(60)
315
+ })
316
+ })
317
+
318
+ it('should decrement value on ArrowLeft', async () => {
319
+ const onValueChange = vi.fn()
320
+ await usingAsync(await renderSlider({ value: 50, step: 10, onValueChange }), async ({ slider }) => {
321
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
322
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true }))
323
+ expect(onValueChange).toHaveBeenCalledWith(40)
324
+ })
325
+ })
326
+
327
+ it('should increment value on ArrowUp', async () => {
328
+ const onValueChange = vi.fn()
329
+ await usingAsync(await renderSlider({ value: 50, step: 5, onValueChange }), async ({ slider }) => {
330
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
331
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true }))
332
+ expect(onValueChange).toHaveBeenCalledWith(55)
333
+ })
334
+ })
335
+
336
+ it('should decrement value on ArrowDown', async () => {
337
+ const onValueChange = vi.fn()
338
+ await usingAsync(await renderSlider({ value: 50, step: 5, onValueChange }), async ({ slider }) => {
339
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
340
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
341
+ expect(onValueChange).toHaveBeenCalledWith(45)
342
+ })
343
+ })
344
+
345
+ it('should jump to min on Home', async () => {
346
+ const onValueChange = vi.fn()
347
+ await usingAsync(await renderSlider({ value: 50, min: 0, max: 100, onValueChange }), async ({ slider }) => {
348
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
349
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'Home', bubbles: true }))
350
+ expect(onValueChange).toHaveBeenCalledWith(0)
351
+ })
352
+ })
353
+
354
+ it('should jump to max on End', async () => {
355
+ const onValueChange = vi.fn()
356
+ await usingAsync(await renderSlider({ value: 50, min: 0, max: 100, onValueChange }), async ({ slider }) => {
357
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
358
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'End', bubbles: true }))
359
+ expect(onValueChange).toHaveBeenCalledWith(100)
360
+ })
361
+ })
362
+
363
+ it('should large-step on PageUp', async () => {
364
+ const onValueChange = vi.fn()
365
+ await usingAsync(await renderSlider({ value: 50, step: 1, onValueChange }), async ({ slider }) => {
366
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
367
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'PageUp', bubbles: true }))
368
+ expect(onValueChange).toHaveBeenCalledWith(60)
369
+ })
370
+ })
371
+
372
+ it('should not exceed max on ArrowRight', async () => {
373
+ const onValueChange = vi.fn()
374
+ await usingAsync(
375
+ await renderSlider({ value: 100, step: 10, min: 0, max: 100, onValueChange }),
376
+ async ({ slider }) => {
377
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
378
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
379
+ expect(onValueChange).toHaveBeenCalledWith(100)
380
+ },
381
+ )
382
+ })
383
+
384
+ it('should not go below min on ArrowLeft', async () => {
385
+ const onValueChange = vi.fn()
386
+ await usingAsync(
387
+ await renderSlider({ value: 0, step: 10, min: 0, max: 100, onValueChange }),
388
+ async ({ slider }) => {
389
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
390
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true }))
391
+ expect(onValueChange).toHaveBeenCalledWith(0)
392
+ },
393
+ )
394
+ })
395
+
396
+ it('should not fire change when disabled', async () => {
397
+ const onValueChange = vi.fn()
398
+ await usingAsync(await renderSlider({ value: 50, disabled: true, onValueChange }), async ({ slider }) => {
399
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
400
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
401
+ expect(onValueChange).not.toHaveBeenCalled()
402
+ })
403
+ })
404
+ })
405
+
406
+ describe('defaults', () => {
407
+ it('should use min=0, max=100, step=1 by default', async () => {
408
+ await usingAsync(await renderSlider(), async ({ slider }) => {
409
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
410
+ expect(thumb.getAttribute('aria-valuemin')).toBe('0')
411
+ expect(thumb.getAttribute('aria-valuemax')).toBe('100')
412
+ expect(thumb.getAttribute('aria-valuenow')).toBe('0')
413
+ })
414
+ })
415
+
416
+ it('should default value to min', async () => {
417
+ await usingAsync(await renderSlider({ min: 20, max: 80 }), async ({ slider }) => {
418
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
419
+ expect(thumb.style.left).toBe('0%')
420
+ })
421
+ })
422
+ })
423
+
424
+ describe('hidden input for form integration', () => {
425
+ it('should render a hidden input when name is provided', async () => {
426
+ await usingAsync(await renderSlider({ name: 'volume', value: 75 }), async ({ slider }) => {
427
+ const input = slider.querySelector('input[type="hidden"]') as HTMLInputElement
428
+ expect(input).not.toBeNull()
429
+ expect(input.name).toBe('volume')
430
+ expect(input.value).toBe('75')
431
+ })
432
+ })
433
+
434
+ it('should not render a hidden input when name is not provided', async () => {
435
+ await usingAsync(await renderSlider({ value: 75 }), async ({ slider }) => {
436
+ const input = slider.querySelector('input[type="hidden"]')
437
+ expect(input).toBeNull()
438
+ })
439
+ })
440
+ })
441
+
442
+ describe('custom min/max/step', () => {
443
+ it('should respect custom min and max', async () => {
444
+ await usingAsync(await renderSlider({ value: 15, min: 10, max: 20 }), async ({ slider }) => {
445
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
446
+ expect(thumb.style.left).toBe('50%')
447
+ })
448
+ })
449
+
450
+ it('should handle step with decimals', async () => {
451
+ const onValueChange = vi.fn()
452
+ await usingAsync(
453
+ await renderSlider({ value: 0.5, min: 0, max: 1, step: 0.1, onValueChange }),
454
+ async ({ slider }) => {
455
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
456
+ expect(thumb.style.left).toBe('50%')
457
+
458
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
459
+ expect(onValueChange).toHaveBeenCalledWith(0.6)
460
+ },
461
+ )
462
+ })
463
+
464
+ it('should handle step=0 (continuous mode) with keyboard using effective step of 1', async () => {
465
+ const onValueChange = vi.fn()
466
+ await usingAsync(
467
+ await renderSlider({ value: 50, min: 0, max: 100, step: 0, onValueChange }),
468
+ async ({ slider }) => {
469
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
470
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
471
+ expect(onValueChange).toHaveBeenCalledWith(51)
472
+ },
473
+ )
474
+ })
475
+ })
476
+
477
+ describe('range keyboard navigation', () => {
478
+ it('should increment first thumb of range with ArrowRight', async () => {
479
+ const onValueChange = vi.fn()
480
+ await usingAsync(
481
+ await renderSlider({ value: [20, 80] as [number, number], step: 5, onValueChange }),
482
+ async ({ slider }) => {
483
+ const thumbs = slider.querySelectorAll<HTMLElement>('.slider-thumb')
484
+ thumbs[0].dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
485
+ expect(onValueChange).toHaveBeenCalledWith([25, 80])
486
+ },
487
+ )
488
+ })
489
+
490
+ it('should decrement second thumb of range with ArrowLeft', async () => {
491
+ const onValueChange = vi.fn()
492
+ await usingAsync(
493
+ await renderSlider({ value: [20, 80] as [number, number], step: 5, onValueChange }),
494
+ async ({ slider }) => {
495
+ const thumbs = slider.querySelectorAll<HTMLElement>('.slider-thumb')
496
+ thumbs[1].dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true }))
497
+ expect(onValueChange).toHaveBeenCalledWith([20, 75])
498
+ },
499
+ )
500
+ })
501
+
502
+ it('should clamp range thumb 0 to not exceed thumb 1', async () => {
503
+ const onValueChange = vi.fn()
504
+ await usingAsync(
505
+ await renderSlider({ value: [50, 50] as [number, number], step: 10, onValueChange }),
506
+ async ({ slider }) => {
507
+ const thumbs = slider.querySelectorAll<HTMLElement>('.slider-thumb')
508
+ thumbs[0].dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
509
+ expect(onValueChange).toHaveBeenCalledWith([50, 50])
510
+ },
511
+ )
512
+ })
513
+
514
+ it('should clamp range thumb 1 to not go below thumb 0', async () => {
515
+ const onValueChange = vi.fn()
516
+ await usingAsync(
517
+ await renderSlider({ value: [50, 50] as [number, number], step: 10, onValueChange }),
518
+ async ({ slider }) => {
519
+ const thumbs = slider.querySelectorAll<HTMLElement>('.slider-thumb')
520
+ thumbs[1].dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true }))
521
+ expect(onValueChange).toHaveBeenCalledWith([50, 50])
522
+ },
523
+ )
524
+ })
525
+
526
+ it('should jump range thumb to min on Home', async () => {
527
+ const onValueChange = vi.fn()
528
+ await usingAsync(
529
+ await renderSlider({ value: [30, 70] as [number, number], min: 0, max: 100, onValueChange }),
530
+ async ({ slider }) => {
531
+ const thumbs = slider.querySelectorAll<HTMLElement>('.slider-thumb')
532
+ thumbs[0].dispatchEvent(new KeyboardEvent('keydown', { key: 'Home', bubbles: true }))
533
+ expect(onValueChange).toHaveBeenCalledWith([0, 70])
534
+ },
535
+ )
536
+ })
537
+
538
+ it('should jump range thumb to max on End', async () => {
539
+ const onValueChange = vi.fn()
540
+ await usingAsync(
541
+ await renderSlider({ value: [30, 70] as [number, number], min: 0, max: 100, onValueChange }),
542
+ async ({ slider }) => {
543
+ const thumbs = slider.querySelectorAll<HTMLElement>('.slider-thumb')
544
+ thumbs[1].dispatchEvent(new KeyboardEvent('keydown', { key: 'End', bubbles: true }))
545
+ expect(onValueChange).toHaveBeenCalledWith([30, 100])
546
+ },
547
+ )
548
+ })
549
+
550
+ it('should use ArrowUp to increment value', async () => {
551
+ const onValueChange = vi.fn()
552
+ await usingAsync(
553
+ await renderSlider({ value: [20, 80] as [number, number], step: 5, onValueChange }),
554
+ async ({ slider }) => {
555
+ const thumbs = slider.querySelectorAll<HTMLElement>('.slider-thumb')
556
+ thumbs[0].dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true }))
557
+ expect(onValueChange).toHaveBeenCalledWith([25, 80])
558
+ },
559
+ )
560
+ })
561
+
562
+ it('should use ArrowDown to decrement value', async () => {
563
+ const onValueChange = vi.fn()
564
+ await usingAsync(
565
+ await renderSlider({ value: [20, 80] as [number, number], step: 5, onValueChange }),
566
+ async ({ slider }) => {
567
+ const thumbs = slider.querySelectorAll<HTMLElement>('.slider-thumb')
568
+ thumbs[1].dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
569
+ expect(onValueChange).toHaveBeenCalledWith([20, 75])
570
+ },
571
+ )
572
+ })
573
+ })
574
+
575
+ describe('PageDown', () => {
576
+ it('should large-step down on PageDown', async () => {
577
+ const onValueChange = vi.fn()
578
+ await usingAsync(await renderSlider({ value: 50, step: 1, onValueChange }), async ({ slider }) => {
579
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
580
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'PageDown', bubbles: true }))
581
+ expect(onValueChange).toHaveBeenCalledWith(40)
582
+ })
583
+ })
584
+ })
585
+
586
+ describe('vertical range positioning', () => {
587
+ it('should use bottom for positioning range thumbs vertically', async () => {
588
+ await usingAsync(
589
+ await renderSlider({ value: [20, 80] as [number, number], vertical: true }),
590
+ async ({ slider }) => {
591
+ const thumbs = slider.querySelectorAll<HTMLElement>('.slider-thumb')
592
+ expect(thumbs[0].style.bottom).toBe('20%')
593
+ expect(thumbs[1].style.bottom).toBe('80%')
594
+ },
595
+ )
596
+ })
597
+
598
+ it('should use bottom/height for range track in vertical mode', async () => {
599
+ await usingAsync(
600
+ await renderSlider({ value: [20, 80] as [number, number], vertical: true }),
601
+ async ({ slider }) => {
602
+ const track = slider.querySelector('.slider-track') as HTMLElement
603
+ expect(track.style.bottom).toBe('20%')
604
+ expect(track.style.height).toBe('60%')
605
+ },
606
+ )
607
+ })
608
+ })
609
+
610
+ describe('marks with step=0', () => {
611
+ it('should not generate auto marks when step is 0', async () => {
612
+ await usingAsync(await renderSlider({ min: 0, max: 100, step: 0, marks: true }), async ({ slider }) => {
613
+ const dots = slider.querySelectorAll('.slider-mark-dot')
614
+ expect(dots.length).toBe(0)
615
+ })
616
+ })
617
+ })
618
+
619
+ describe('non-keyboard events are ignored', () => {
620
+ it('should not fire change when non-slider-thumb receives keyboard event', async () => {
621
+ const onValueChange = vi.fn()
622
+ await usingAsync(await renderSlider({ value: 50, onValueChange }), async ({ slider }) => {
623
+ const rail = slider.querySelector('.slider-rail') as HTMLElement
624
+ rail.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
625
+ expect(onValueChange).not.toHaveBeenCalled()
626
+ })
627
+ })
628
+
629
+ it('should ignore unrecognized keys', async () => {
630
+ const onValueChange = vi.fn()
631
+ await usingAsync(await renderSlider({ value: 50, onValueChange }), async ({ slider }) => {
632
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
633
+ thumb.dispatchEvent(new KeyboardEvent('keydown', { key: 'a', bubbles: true }))
634
+ expect(onValueChange).not.toHaveBeenCalled()
635
+ })
636
+ })
637
+ })
638
+
639
+ describe('marks positioning in vertical mode', () => {
640
+ it('should use bottom for marks in vertical mode', async () => {
641
+ const marks = [{ value: 50, label: 'Half' }]
642
+ await usingAsync(await renderSlider({ marks, vertical: true }), async ({ slider }) => {
643
+ const dot = slider.querySelector('.slider-mark-dot') as HTMLElement
644
+ expect(dot.style.bottom).toBe('50%')
645
+ })
646
+ })
647
+ })
648
+
649
+ describe('mouse interaction', () => {
650
+ const mockSliderRoot = (slider: HTMLElement, rect: Partial<DOMRect>) => {
651
+ const root = slider.querySelector('.slider-root')
652
+ if (root) {
653
+ vi.spyOn(root, 'getBoundingClientRect').mockReturnValue({
654
+ top: 0,
655
+ left: 0,
656
+ width: 200,
657
+ height: 4,
658
+ right: 200,
659
+ bottom: 4,
660
+ x: 0,
661
+ y: 0,
662
+ toJSON: () => ({}),
663
+ ...rect,
664
+ })
665
+ }
666
+ }
667
+
668
+ it('should update slider on mousedown on track (single mode)', async () => {
669
+ const onValueChange = vi.fn()
670
+ await usingAsync(
671
+ await renderSlider({ value: 50, min: 0, max: 100, step: 1, onValueChange }),
672
+ async ({ slider }) => {
673
+ mockSliderRoot(slider, { left: 0, width: 200 })
674
+ const root = slider.querySelector('.slider-root') as HTMLElement
675
+
676
+ root.dispatchEvent(new MouseEvent('mousedown', { clientX: 150, clientY: 2, bubbles: true }))
677
+ document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
678
+ await sleepAsync(50)
679
+
680
+ expect(onValueChange).toHaveBeenCalled()
681
+ const calledWith = onValueChange.mock.calls[0][0] as number
682
+ expect(calledWith).toBe(75)
683
+ },
684
+ )
685
+ })
686
+
687
+ it('should not respond to mousedown when disabled', async () => {
688
+ const onValueChange = vi.fn()
689
+ await usingAsync(await renderSlider({ value: 50, disabled: true, onValueChange }), async ({ slider }) => {
690
+ mockSliderRoot(slider, { left: 0, width: 200 })
691
+
692
+ slider.dispatchEvent(new MouseEvent('mousedown', { clientX: 100, clientY: 2, bubbles: true }))
693
+ document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
694
+ await sleepAsync(50)
695
+
696
+ expect(onValueChange).not.toHaveBeenCalled()
697
+ })
698
+ })
699
+
700
+ it('should set data-dragging during drag and remove after', async () => {
701
+ const onValueChange = vi.fn()
702
+ await usingAsync(
703
+ await renderSlider({ value: 50, min: 0, max: 100, step: 1, onValueChange }),
704
+ async ({ slider }) => {
705
+ mockSliderRoot(slider, { left: 0, width: 200 })
706
+ const root = slider.querySelector('.slider-root') as HTMLElement
707
+
708
+ root.dispatchEvent(new MouseEvent('mousedown', { clientX: 100, clientY: 2, bubbles: true }))
709
+ expect(root.hasAttribute('data-dragging')).toBe(true)
710
+
711
+ document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
712
+ await sleepAsync(50)
713
+
714
+ expect(root.hasAttribute('data-dragging')).toBe(false)
715
+ },
716
+ )
717
+ })
718
+
719
+ it('should update value on mousemove during drag', async () => {
720
+ const onValueChange = vi.fn()
721
+ await usingAsync(
722
+ await renderSlider({ value: 0, min: 0, max: 100, step: 1, onValueChange }),
723
+ async ({ slider }) => {
724
+ mockSliderRoot(slider, { left: 0, width: 200 })
725
+
726
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
727
+ thumb.dispatchEvent(new MouseEvent('mousedown', { clientX: 0, clientY: 2, bubbles: true }))
728
+
729
+ document.dispatchEvent(new MouseEvent('mousemove', { clientX: 100, clientY: 2, bubbles: true }))
730
+ document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
731
+ await sleepAsync(50)
732
+
733
+ expect(onValueChange).toHaveBeenCalled()
734
+ const calledWith = onValueChange.mock.calls[0][0] as number
735
+ expect(calledWith).toBe(50)
736
+ },
737
+ )
738
+ })
739
+
740
+ it('should handle range slider mousedown - picks nearest thumb', async () => {
741
+ const onValueChange = vi.fn()
742
+ await usingAsync(
743
+ await renderSlider({
744
+ value: [20, 80] as [number, number],
745
+ min: 0,
746
+ max: 100,
747
+ step: 1,
748
+ onValueChange,
749
+ }),
750
+ async ({ slider }) => {
751
+ mockSliderRoot(slider, { left: 0, width: 200 })
752
+ const root = slider.querySelector('.slider-root') as HTMLElement
753
+
754
+ // Click at 90% (180px) → closer to thumb at 80%
755
+ root.dispatchEvent(new MouseEvent('mousedown', { clientX: 180, clientY: 2, bubbles: true }))
756
+ document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
757
+ await sleepAsync(50)
758
+
759
+ expect(onValueChange).toHaveBeenCalled()
760
+ const val = onValueChange.mock.calls[0][0] as [number, number]
761
+ expect(val[0]).toBe(20)
762
+ expect(val[1]).toBe(90)
763
+ },
764
+ )
765
+ })
766
+
767
+ it('should handle range slider mousedown - swaps if crossover', async () => {
768
+ const onValueChange = vi.fn()
769
+ await usingAsync(
770
+ await renderSlider({
771
+ value: [40, 60] as [number, number],
772
+ min: 0,
773
+ max: 100,
774
+ step: 1,
775
+ onValueChange,
776
+ }),
777
+ async ({ slider }) => {
778
+ mockSliderRoot(slider, { left: 0, width: 200 })
779
+ const root = slider.querySelector('.slider-root') as HTMLElement
780
+
781
+ // Click at 20% (40px), closer to start thumb at 40%.
782
+ // New val for thumb[0]=20. 20 < 60, no swap.
783
+ root.dispatchEvent(new MouseEvent('mousedown', { clientX: 40, clientY: 2, bubbles: true }))
784
+ document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
785
+ await sleepAsync(50)
786
+
787
+ expect(onValueChange).toHaveBeenCalled()
788
+ const val = onValueChange.mock.calls[0][0] as [number, number]
789
+ expect(val[0]).toBe(20)
790
+ expect(val[1]).toBe(60)
791
+ },
792
+ )
793
+ })
794
+
795
+ it('should handle mousemove with range values', async () => {
796
+ const onValueChange = vi.fn()
797
+ await usingAsync(
798
+ await renderSlider({
799
+ value: [20, 80] as [number, number],
800
+ min: 0,
801
+ max: 100,
802
+ step: 1,
803
+ onValueChange,
804
+ }),
805
+ async ({ slider }) => {
806
+ mockSliderRoot(slider, { left: 0, width: 200 })
807
+
808
+ const thumbs = slider.querySelectorAll('.slider-thumb')
809
+ // Mousedown on first thumb
810
+ ;(thumbs[0] as HTMLElement).dispatchEvent(
811
+ new MouseEvent('mousedown', { clientX: 40, clientY: 2, bubbles: true }),
812
+ )
813
+
814
+ // Move to 60px (30%)
815
+ document.dispatchEvent(new MouseEvent('mousemove', { clientX: 60, clientY: 2, bubbles: true }))
816
+ document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
817
+ await sleepAsync(50)
818
+
819
+ expect(onValueChange).toHaveBeenCalled()
820
+ const val = onValueChange.mock.calls[0][0] as [number, number]
821
+ expect(val[0]).toBe(30)
822
+ expect(val[1]).toBe(80)
823
+ },
824
+ )
825
+ })
826
+
827
+ it('should handle vertical mode mousedown', async () => {
828
+ const onValueChange = vi.fn()
829
+ await usingAsync(
830
+ await renderSlider({ value: 50, min: 0, max: 100, step: 1, vertical: true, onValueChange }),
831
+ async ({ slider }) => {
832
+ mockSliderRoot(slider, { top: 0, height: 200, bottom: 200, left: 0, width: 4 })
833
+ const root = slider.querySelector('.slider-root') as HTMLElement
834
+
835
+ // Click at bottom-50px (bottom=200, clientY=150 → (200-150)/200=25%)
836
+ root.dispatchEvent(new MouseEvent('mousedown', { clientX: 2, clientY: 150, bubbles: true }))
837
+ document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
838
+ await sleepAsync(50)
839
+
840
+ expect(onValueChange).toHaveBeenCalled()
841
+ const calledWith = onValueChange.mock.calls[0][0] as number
842
+ expect(calledWith).toBe(25)
843
+ },
844
+ )
845
+ })
846
+
847
+ it('should clamp pointer values to 0-100 range', async () => {
848
+ const onValueChange = vi.fn()
849
+ await usingAsync(
850
+ await renderSlider({ value: 50, min: 0, max: 100, step: 1, onValueChange }),
851
+ async ({ slider }) => {
852
+ mockSliderRoot(slider, { left: 0, width: 200 })
853
+ const root = slider.querySelector('.slider-root') as HTMLElement
854
+
855
+ // Click far to the right beyond the track
856
+ root.dispatchEvent(new MouseEvent('mousedown', { clientX: 400, clientY: 2, bubbles: true }))
857
+ document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
858
+ await sleepAsync(50)
859
+
860
+ expect(onValueChange).toHaveBeenCalled()
861
+ const calledWith = onValueChange.mock.calls[0][0] as number
862
+ expect(calledWith).toBe(100)
863
+ },
864
+ )
865
+ })
866
+ })
867
+
868
+ describe('touch interaction', () => {
869
+ const mockSliderRoot = (slider: HTMLElement, rect: Partial<DOMRect>) => {
870
+ const root = slider.querySelector('.slider-root')
871
+ if (root) {
872
+ vi.spyOn(root, 'getBoundingClientRect').mockReturnValue({
873
+ top: 0,
874
+ left: 0,
875
+ width: 200,
876
+ height: 4,
877
+ right: 200,
878
+ bottom: 4,
879
+ x: 0,
880
+ y: 0,
881
+ toJSON: () => ({}),
882
+ ...rect,
883
+ })
884
+ }
885
+ }
886
+
887
+ it('should handle touchstart on track', async () => {
888
+ const onValueChange = vi.fn()
889
+ await usingAsync(
890
+ await renderSlider({ value: 50, min: 0, max: 100, step: 1, onValueChange }),
891
+ async ({ slider }) => {
892
+ mockSliderRoot(slider, { left: 0, width: 200 })
893
+ const root = slider.querySelector('.slider-root') as HTMLElement
894
+
895
+ const touch = { clientX: 100, clientY: 2, identifier: 0, target: root }
896
+ root.dispatchEvent(new TouchEvent('touchstart', { touches: [touch as unknown as Touch] }))
897
+ document.dispatchEvent(new TouchEvent('touchend', { changedTouches: [touch as unknown as Touch] }))
898
+ await sleepAsync(50)
899
+
900
+ expect(onValueChange).toHaveBeenCalled()
901
+ const calledWith = onValueChange.mock.calls[0][0] as number
902
+ expect(calledWith).toBe(50)
903
+ },
904
+ )
905
+ })
906
+
907
+ it('should handle touchmove during drag', async () => {
908
+ const onValueChange = vi.fn()
909
+ await usingAsync(
910
+ await renderSlider({ value: 0, min: 0, max: 100, step: 1, onValueChange }),
911
+ async ({ slider }) => {
912
+ mockSliderRoot(slider, { left: 0, width: 200 })
913
+ const root = slider.querySelector('.slider-root') as HTMLElement
914
+
915
+ const startTouch = { clientX: 0, clientY: 2, identifier: 0, target: root }
916
+ root.dispatchEvent(new TouchEvent('touchstart', { touches: [startTouch as unknown as Touch] }))
917
+
918
+ const moveTouch = { clientX: 150, clientY: 2, identifier: 0, target: slider }
919
+ document.dispatchEvent(
920
+ new TouchEvent('touchmove', { touches: [moveTouch as unknown as Touch], cancelable: true }),
921
+ )
922
+
923
+ const endTouch = { clientX: 150, clientY: 2, identifier: 0, target: slider }
924
+ document.dispatchEvent(new TouchEvent('touchend', { changedTouches: [endTouch as unknown as Touch] }))
925
+ await sleepAsync(50)
926
+
927
+ expect(onValueChange).toHaveBeenCalled()
928
+ const calledWith = onValueChange.mock.calls[0][0] as number
929
+ expect(calledWith).toBe(75)
930
+ },
931
+ )
932
+ })
933
+ })
934
+
935
+ describe('syncVisuals for vertical range', () => {
936
+ it('should position range thumbs and track in vertical mode during drag', async () => {
937
+ const onValueChange = vi.fn()
938
+ await usingAsync(
939
+ await renderSlider({
940
+ value: [20, 80] as [number, number],
941
+ min: 0,
942
+ max: 100,
943
+ step: 1,
944
+ vertical: true,
945
+ onValueChange,
946
+ }),
947
+ async ({ slider }) => {
948
+ const root = slider.querySelector('.slider-root')
949
+ if (root) {
950
+ vi.spyOn(root, 'getBoundingClientRect').mockReturnValue({
951
+ top: 0,
952
+ left: 0,
953
+ width: 4,
954
+ height: 200,
955
+ right: 4,
956
+ bottom: 200,
957
+ x: 0,
958
+ y: 0,
959
+ toJSON: () => ({}),
960
+ })
961
+ }
962
+
963
+ const thumbs = slider.querySelectorAll('.slider-thumb')
964
+ // Mousedown on first thumb to start drag
965
+ ;(thumbs[0] as HTMLElement).dispatchEvent(
966
+ new MouseEvent('mousedown', { clientX: 2, clientY: 160, bubbles: true }),
967
+ )
968
+
969
+ // Move to 60% from bottom: clientY = 200 - 120 = 80
970
+ document.dispatchEvent(new MouseEvent('mousemove', { clientX: 2, clientY: 80, bubbles: true }))
971
+
972
+ // During drag, syncVisuals updates positions directly
973
+ expect(slider.querySelector('.slider-track')).not.toBeNull()
974
+ expect(root!.hasAttribute('data-dragging')).toBe(true)
975
+
976
+ document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
977
+ await sleepAsync(50)
978
+
979
+ expect(onValueChange).toHaveBeenCalled()
980
+ },
981
+ )
982
+ })
983
+ })
984
+
985
+ describe('edge cases', () => {
986
+ it('should return null from getValueFromPointer when root has zero dimensions', async () => {
987
+ const onValueChange = vi.fn()
988
+ await usingAsync(await renderSlider({ value: 50, min: 0, max: 100, onValueChange }), async ({ slider }) => {
989
+ const root = slider.querySelector('.slider-root')
990
+ if (root) {
991
+ vi.spyOn(root, 'getBoundingClientRect').mockReturnValue({
992
+ top: 0,
993
+ left: 0,
994
+ width: 0,
995
+ height: 0,
996
+ right: 0,
997
+ bottom: 0,
998
+ x: 0,
999
+ y: 0,
1000
+ toJSON: () => ({}),
1001
+ })
1002
+ }
1003
+
1004
+ slider.dispatchEvent(new MouseEvent('mousedown', { clientX: 100, clientY: 2, bubbles: true }))
1005
+ document.dispatchEvent(new MouseEvent('mouseup', { bubbles: true }))
1006
+ await sleepAsync(50)
1007
+
1008
+ // Should not have fired because getValueFromPointer returned null
1009
+ expect(onValueChange).not.toHaveBeenCalled()
1010
+ })
1011
+ })
1012
+
1013
+ it('should handle valueToPercent when max === min', async () => {
1014
+ await usingAsync(await renderSlider({ value: 5, min: 5, max: 5 }), async ({ slider }) => {
1015
+ const thumb = slider.querySelector('.slider-thumb') as HTMLElement
1016
+ expect(thumb.style.left).toBe('0%')
1017
+ })
1018
+ })
1019
+ })
1020
+ })