@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,866 @@
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 { Rating } from './rating.js'
7
+
8
+ describe('Rating', () => {
9
+ beforeEach(() => {
10
+ document.body.innerHTML = '<div id="root"></div>'
11
+ })
12
+
13
+ afterEach(() => {
14
+ document.body.innerHTML = ''
15
+ vi.restoreAllMocks()
16
+ })
17
+
18
+ it('should render with shadow DOM', async () => {
19
+ await usingAsync(new Injector(), async (injector) => {
20
+ const rootElement = document.getElementById('root') as HTMLDivElement
21
+
22
+ initializeShadeRoot({
23
+ injector,
24
+ rootElement,
25
+ jsxElement: <Rating />,
26
+ })
27
+
28
+ await sleepAsync(50)
29
+
30
+ const rating = document.querySelector('shade-rating')
31
+ expect(rating).not.toBeNull()
32
+ })
33
+ })
34
+
35
+ it('should render 5 stars by default', async () => {
36
+ await usingAsync(new Injector(), async (injector) => {
37
+ const rootElement = document.getElementById('root') as HTMLDivElement
38
+
39
+ initializeShadeRoot({
40
+ injector,
41
+ rootElement,
42
+ jsxElement: <Rating />,
43
+ })
44
+
45
+ await sleepAsync(50)
46
+
47
+ const stars = document.querySelectorAll('shade-rating .rating-star')
48
+ expect(stars.length).toBe(5)
49
+ })
50
+ })
51
+
52
+ it('should render custom number of stars with max prop', async () => {
53
+ await usingAsync(new Injector(), async (injector) => {
54
+ const rootElement = document.getElementById('root') as HTMLDivElement
55
+
56
+ initializeShadeRoot({
57
+ injector,
58
+ rootElement,
59
+ jsxElement: <Rating max={10} />,
60
+ })
61
+
62
+ await sleepAsync(50)
63
+
64
+ const stars = document.querySelectorAll('shade-rating .rating-star')
65
+ expect(stars.length).toBe(10)
66
+ })
67
+ })
68
+
69
+ describe('value display', () => {
70
+ it('should show filled stars based on value', async () => {
71
+ await usingAsync(new Injector(), async (injector) => {
72
+ const rootElement = document.getElementById('root') as HTMLDivElement
73
+
74
+ initializeShadeRoot({
75
+ injector,
76
+ rootElement,
77
+ jsxElement: <Rating value={3} />,
78
+ })
79
+
80
+ await sleepAsync(50)
81
+
82
+ const filledSpans = document.querySelectorAll('shade-rating .star-filled')
83
+ expect((filledSpans[0] as HTMLElement).style.width).toBe('100%')
84
+ expect((filledSpans[1] as HTMLElement).style.width).toBe('100%')
85
+ expect((filledSpans[2] as HTMLElement).style.width).toBe('100%')
86
+ expect((filledSpans[3] as HTMLElement).style.width).toBe('0%')
87
+ expect((filledSpans[4] as HTMLElement).style.width).toBe('0%')
88
+ })
89
+ })
90
+
91
+ it('should show half-filled stars with precision=0.5', async () => {
92
+ await usingAsync(new Injector(), async (injector) => {
93
+ const rootElement = document.getElementById('root') as HTMLDivElement
94
+
95
+ initializeShadeRoot({
96
+ injector,
97
+ rootElement,
98
+ jsxElement: <Rating value={2.5} precision={0.5} />,
99
+ })
100
+
101
+ await sleepAsync(50)
102
+
103
+ const filledSpans = document.querySelectorAll('shade-rating .star-filled')
104
+ expect((filledSpans[0] as HTMLElement).style.width).toBe('100%')
105
+ expect((filledSpans[1] as HTMLElement).style.width).toBe('100%')
106
+ expect((filledSpans[2] as HTMLElement).style.width).toBe('50%')
107
+ expect((filledSpans[3] as HTMLElement).style.width).toBe('0%')
108
+ expect((filledSpans[4] as HTMLElement).style.width).toBe('0%')
109
+ })
110
+ })
111
+
112
+ it('should show no filled stars when value is 0', async () => {
113
+ await usingAsync(new Injector(), async (injector) => {
114
+ const rootElement = document.getElementById('root') as HTMLDivElement
115
+
116
+ initializeShadeRoot({
117
+ injector,
118
+ rootElement,
119
+ jsxElement: <Rating value={0} />,
120
+ })
121
+
122
+ await sleepAsync(50)
123
+
124
+ const filledSpans = document.querySelectorAll('shade-rating .star-filled')
125
+ expect(filledSpans.length).toBe(5)
126
+ for (const span of filledSpans) {
127
+ expect((span as HTMLElement).style.width).toBe('0%')
128
+ }
129
+ })
130
+ })
131
+ })
132
+
133
+ describe('interaction', () => {
134
+ it('should call onchange when a star is clicked', async () => {
135
+ await usingAsync(new Injector(), async (injector) => {
136
+ const rootElement = document.getElementById('root') as HTMLDivElement
137
+ const onchange = vi.fn()
138
+
139
+ initializeShadeRoot({
140
+ injector,
141
+ rootElement,
142
+ jsxElement: <Rating value={0} onValueChange={onchange} />,
143
+ })
144
+
145
+ await sleepAsync(50)
146
+
147
+ const stars = document.querySelectorAll('shade-rating .rating-star')
148
+ ;(stars[2] as HTMLElement).dispatchEvent(new MouseEvent('click', { bubbles: true }))
149
+
150
+ await sleepAsync(50)
151
+
152
+ expect(onchange).toHaveBeenCalledWith(3)
153
+ })
154
+ })
155
+
156
+ it('should not call onchange when disabled', async () => {
157
+ await usingAsync(new Injector(), async (injector) => {
158
+ const rootElement = document.getElementById('root') as HTMLDivElement
159
+ const onchange = vi.fn()
160
+
161
+ initializeShadeRoot({
162
+ injector,
163
+ rootElement,
164
+ jsxElement: <Rating value={0} onValueChange={onchange} disabled />,
165
+ })
166
+
167
+ await sleepAsync(50)
168
+
169
+ const stars = document.querySelectorAll('shade-rating .rating-star')
170
+ ;(stars[2] as HTMLElement).dispatchEvent(new MouseEvent('click', { bubbles: true }))
171
+
172
+ await sleepAsync(50)
173
+
174
+ expect(onchange).not.toHaveBeenCalled()
175
+ })
176
+ })
177
+
178
+ it('should not call onchange when readOnly', async () => {
179
+ await usingAsync(new Injector(), async (injector) => {
180
+ const rootElement = document.getElementById('root') as HTMLDivElement
181
+ const onchange = vi.fn()
182
+
183
+ initializeShadeRoot({
184
+ injector,
185
+ rootElement,
186
+ jsxElement: <Rating value={3} onValueChange={onchange} readOnly />,
187
+ })
188
+
189
+ await sleepAsync(50)
190
+
191
+ const stars = document.querySelectorAll('shade-rating .rating-star')
192
+ ;(stars[0] as HTMLElement).dispatchEvent(new MouseEvent('click', { bubbles: true }))
193
+
194
+ await sleepAsync(50)
195
+
196
+ expect(onchange).not.toHaveBeenCalled()
197
+ })
198
+ })
199
+ })
200
+
201
+ describe('keyboard navigation', () => {
202
+ it('should increase value with ArrowRight', async () => {
203
+ await usingAsync(new Injector(), async (injector) => {
204
+ const rootElement = document.getElementById('root') as HTMLDivElement
205
+ const onchange = vi.fn()
206
+
207
+ initializeShadeRoot({
208
+ injector,
209
+ rootElement,
210
+ jsxElement: <Rating value={3} onValueChange={onchange} />,
211
+ })
212
+
213
+ await sleepAsync(50)
214
+
215
+ const ratingEl = document.querySelector('shade-rating') as HTMLElement
216
+ ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
217
+
218
+ await sleepAsync(50)
219
+
220
+ expect(onchange).toHaveBeenCalledWith(4)
221
+ })
222
+ })
223
+
224
+ it('should decrease value with ArrowLeft', async () => {
225
+ await usingAsync(new Injector(), async (injector) => {
226
+ const rootElement = document.getElementById('root') as HTMLDivElement
227
+ const onchange = vi.fn()
228
+
229
+ initializeShadeRoot({
230
+ injector,
231
+ rootElement,
232
+ jsxElement: <Rating value={3} onValueChange={onchange} />,
233
+ })
234
+
235
+ await sleepAsync(50)
236
+
237
+ const ratingEl = document.querySelector('shade-rating') as HTMLElement
238
+ ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true }))
239
+
240
+ await sleepAsync(50)
241
+
242
+ expect(onchange).toHaveBeenCalledWith(2)
243
+ })
244
+ })
245
+
246
+ it('should use 0.5 step with precision=0.5', async () => {
247
+ await usingAsync(new Injector(), async (injector) => {
248
+ const rootElement = document.getElementById('root') as HTMLDivElement
249
+ const onchange = vi.fn()
250
+
251
+ initializeShadeRoot({
252
+ injector,
253
+ rootElement,
254
+ jsxElement: <Rating value={3} precision={0.5} onValueChange={onchange} />,
255
+ })
256
+
257
+ await sleepAsync(50)
258
+
259
+ const ratingEl = document.querySelector('shade-rating') as HTMLElement
260
+ ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
261
+
262
+ await sleepAsync(50)
263
+
264
+ expect(onchange).toHaveBeenCalledWith(3.5)
265
+ })
266
+ })
267
+
268
+ it('should not exceed max value', async () => {
269
+ await usingAsync(new Injector(), async (injector) => {
270
+ const rootElement = document.getElementById('root') as HTMLDivElement
271
+ const onchange = vi.fn()
272
+
273
+ initializeShadeRoot({
274
+ injector,
275
+ rootElement,
276
+ jsxElement: <Rating value={5} onValueChange={onchange} />,
277
+ })
278
+
279
+ await sleepAsync(50)
280
+
281
+ const ratingEl = document.querySelector('shade-rating') as HTMLElement
282
+ ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
283
+
284
+ await sleepAsync(50)
285
+
286
+ expect(onchange).not.toHaveBeenCalled()
287
+ })
288
+ })
289
+
290
+ it('should not go below 0', async () => {
291
+ await usingAsync(new Injector(), async (injector) => {
292
+ const rootElement = document.getElementById('root') as HTMLDivElement
293
+ const onchange = vi.fn()
294
+
295
+ initializeShadeRoot({
296
+ injector,
297
+ rootElement,
298
+ jsxElement: <Rating value={0} onValueChange={onchange} />,
299
+ })
300
+
301
+ await sleepAsync(50)
302
+
303
+ const ratingEl = document.querySelector('shade-rating') as HTMLElement
304
+ ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true }))
305
+
306
+ await sleepAsync(50)
307
+
308
+ expect(onchange).not.toHaveBeenCalled()
309
+ })
310
+ })
311
+ })
312
+
313
+ describe('disabled state', () => {
314
+ it('should set data-disabled attribute when disabled', async () => {
315
+ await usingAsync(new Injector(), async (injector) => {
316
+ const rootElement = document.getElementById('root') as HTMLDivElement
317
+
318
+ initializeShadeRoot({
319
+ injector,
320
+ rootElement,
321
+ jsxElement: <Rating disabled />,
322
+ })
323
+
324
+ await sleepAsync(50)
325
+
326
+ const wrapper = document.querySelector('shade-rating') as HTMLElement
327
+ expect(wrapper.hasAttribute('data-disabled')).toBe(true)
328
+ expect(wrapper.getAttribute('aria-disabled')).toBe('true')
329
+ })
330
+ })
331
+
332
+ it('should not have data-disabled when not disabled', async () => {
333
+ await usingAsync(new Injector(), async (injector) => {
334
+ const rootElement = document.getElementById('root') as HTMLDivElement
335
+
336
+ initializeShadeRoot({
337
+ injector,
338
+ rootElement,
339
+ jsxElement: <Rating />,
340
+ })
341
+
342
+ await sleepAsync(50)
343
+
344
+ const wrapper = document.querySelector('shade-rating') as HTMLElement
345
+ expect(wrapper.hasAttribute('data-disabled')).toBe(false)
346
+ })
347
+ })
348
+ })
349
+
350
+ describe('readOnly state', () => {
351
+ it('should set data-readonly attribute when readOnly', async () => {
352
+ await usingAsync(new Injector(), async (injector) => {
353
+ const rootElement = document.getElementById('root') as HTMLDivElement
354
+
355
+ initializeShadeRoot({
356
+ injector,
357
+ rootElement,
358
+ jsxElement: <Rating readOnly />,
359
+ })
360
+
361
+ await sleepAsync(50)
362
+
363
+ const wrapper = document.querySelector('shade-rating') as HTMLElement
364
+ expect(wrapper.hasAttribute('data-readonly')).toBe(true)
365
+ expect(wrapper.getAttribute('role')).toBe('img')
366
+ })
367
+ })
368
+ })
369
+
370
+ describe('custom icons', () => {
371
+ it('should use custom filled and empty icons', async () => {
372
+ await usingAsync(new Injector(), async (injector) => {
373
+ const rootElement = document.getElementById('root') as HTMLDivElement
374
+
375
+ initializeShadeRoot({
376
+ injector,
377
+ rootElement,
378
+ jsxElement: <Rating value={1} icon="❤️" emptyIcon="🤍" />,
379
+ })
380
+
381
+ await sleepAsync(50)
382
+
383
+ const emptySpans = document.querySelectorAll('shade-rating .star-empty')
384
+ const filledSpans = document.querySelectorAll('shade-rating .star-filled')
385
+
386
+ expect(emptySpans[0]?.textContent).toBe('🤍')
387
+ expect(filledSpans[0]?.textContent).toBe('❤️')
388
+ })
389
+ })
390
+ })
391
+
392
+ describe('size', () => {
393
+ it('should set data-size attribute', async () => {
394
+ await usingAsync(new Injector(), async (injector) => {
395
+ const rootElement = document.getElementById('root') as HTMLDivElement
396
+
397
+ initializeShadeRoot({
398
+ injector,
399
+ rootElement,
400
+ jsxElement: <Rating size="large" />,
401
+ })
402
+
403
+ await sleepAsync(50)
404
+
405
+ const wrapper = document.querySelector('shade-rating') as HTMLElement
406
+ expect(wrapper.getAttribute('data-size')).toBe('large')
407
+ })
408
+ })
409
+
410
+ it('should default to medium size', async () => {
411
+ await usingAsync(new Injector(), async (injector) => {
412
+ const rootElement = document.getElementById('root') as HTMLDivElement
413
+
414
+ initializeShadeRoot({
415
+ injector,
416
+ rootElement,
417
+ jsxElement: <Rating />,
418
+ })
419
+
420
+ await sleepAsync(50)
421
+
422
+ const wrapper = document.querySelector('shade-rating') as HTMLElement
423
+ expect(wrapper.getAttribute('data-size')).toBe('medium')
424
+ })
425
+ })
426
+ })
427
+
428
+ describe('theme integration', () => {
429
+ it('should set CSS color variable from theme (default warning)', async () => {
430
+ await usingAsync(new Injector(), async (injector) => {
431
+ const rootElement = document.getElementById('root') as HTMLDivElement
432
+
433
+ initializeShadeRoot({
434
+ injector,
435
+ rootElement,
436
+ jsxElement: <Rating />,
437
+ })
438
+
439
+ await sleepAsync(50)
440
+
441
+ const wrapper = document.querySelector('shade-rating') as HTMLElement
442
+ const themeService = injector.getInstance(ThemeProviderService)
443
+ expect(wrapper.style.getPropertyValue('--rating-color')).toBe(themeService.theme.palette.warning.main)
444
+ })
445
+ })
446
+
447
+ it('should use custom color from color prop', async () => {
448
+ await usingAsync(new Injector(), async (injector) => {
449
+ const rootElement = document.getElementById('root') as HTMLDivElement
450
+
451
+ initializeShadeRoot({
452
+ injector,
453
+ rootElement,
454
+ jsxElement: <Rating color="primary" />,
455
+ })
456
+
457
+ await sleepAsync(50)
458
+
459
+ const wrapper = document.querySelector('shade-rating') as HTMLElement
460
+ const themeService = injector.getInstance(ThemeProviderService)
461
+ expect(wrapper.style.getPropertyValue('--rating-color')).toBe(themeService.theme.palette.primary.main)
462
+ })
463
+ })
464
+ })
465
+
466
+ describe('accessibility', () => {
467
+ it('should have slider role when interactive', async () => {
468
+ await usingAsync(new Injector(), async (injector) => {
469
+ const rootElement = document.getElementById('root') as HTMLDivElement
470
+
471
+ initializeShadeRoot({
472
+ injector,
473
+ rootElement,
474
+ jsxElement: <Rating value={3} max={5} />,
475
+ })
476
+
477
+ await sleepAsync(50)
478
+
479
+ const wrapper = document.querySelector('shade-rating') as HTMLElement
480
+ expect(wrapper.getAttribute('role')).toBe('slider')
481
+ expect(wrapper.getAttribute('aria-valuenow')).toBe('3')
482
+ expect(wrapper.getAttribute('aria-valuemin')).toBe('0')
483
+ expect(wrapper.getAttribute('aria-valuemax')).toBe('5')
484
+ expect(wrapper.getAttribute('tabindex')).toBe('0')
485
+ })
486
+ })
487
+
488
+ it('should have img role when readOnly', async () => {
489
+ await usingAsync(new Injector(), async (injector) => {
490
+ const rootElement = document.getElementById('root') as HTMLDivElement
491
+
492
+ initializeShadeRoot({
493
+ injector,
494
+ rootElement,
495
+ jsxElement: <Rating value={3} max={5} readOnly />,
496
+ })
497
+
498
+ await sleepAsync(50)
499
+
500
+ const wrapper = document.querySelector('shade-rating') as HTMLElement
501
+ expect(wrapper.getAttribute('role')).toBe('img')
502
+ expect(wrapper.getAttribute('aria-label')).toBe('Rating: 3 out of 5')
503
+ expect(wrapper.hasAttribute('tabindex')).toBe(false)
504
+ })
505
+ })
506
+ })
507
+
508
+ describe('hidden input', () => {
509
+ it('should render hidden input with name and value', async () => {
510
+ await usingAsync(new Injector(), async (injector) => {
511
+ const rootElement = document.getElementById('root') as HTMLDivElement
512
+
513
+ initializeShadeRoot({
514
+ injector,
515
+ rootElement,
516
+ jsxElement: <Rating name="userRating" value={4} />,
517
+ })
518
+
519
+ await sleepAsync(50)
520
+
521
+ const input = document.querySelector('shade-rating input[type="hidden"]') as HTMLInputElement
522
+ expect(input).not.toBeNull()
523
+ expect(input.name).toBe('userRating')
524
+ expect(input.value).toBe('4')
525
+ })
526
+ })
527
+
528
+ it('should not render hidden input without name', async () => {
529
+ await usingAsync(new Injector(), async (injector) => {
530
+ const rootElement = document.getElementById('root') as HTMLDivElement
531
+
532
+ initializeShadeRoot({
533
+ injector,
534
+ rootElement,
535
+ jsxElement: <Rating value={4} />,
536
+ })
537
+
538
+ await sleepAsync(50)
539
+
540
+ const input = document.querySelector('shade-rating input[type="hidden"]')
541
+ expect(input).toBeNull()
542
+ })
543
+ })
544
+ })
545
+
546
+ describe('additional keyboard navigation', () => {
547
+ it('should jump to max on End', async () => {
548
+ await usingAsync(new Injector(), async (injector) => {
549
+ const rootElement = document.getElementById('root') as HTMLDivElement
550
+ const onchange = vi.fn()
551
+
552
+ initializeShadeRoot({
553
+ injector,
554
+ rootElement,
555
+ jsxElement: <Rating value={3} max={5} onValueChange={onchange} />,
556
+ })
557
+
558
+ await sleepAsync(50)
559
+
560
+ const ratingEl = document.querySelector('shade-rating') as HTMLElement
561
+ ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'End', bubbles: true }))
562
+
563
+ await sleepAsync(50)
564
+
565
+ expect(onchange).toHaveBeenCalledWith(5)
566
+ })
567
+ })
568
+
569
+ it('should jump to 0 on Home', async () => {
570
+ await usingAsync(new Injector(), async (injector) => {
571
+ const rootElement = document.getElementById('root') as HTMLDivElement
572
+ const onchange = vi.fn()
573
+
574
+ initializeShadeRoot({
575
+ injector,
576
+ rootElement,
577
+ jsxElement: <Rating value={3} onValueChange={onchange} />,
578
+ })
579
+
580
+ await sleepAsync(50)
581
+
582
+ const ratingEl = document.querySelector('shade-rating') as HTMLElement
583
+ ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'Home', bubbles: true }))
584
+
585
+ await sleepAsync(50)
586
+
587
+ expect(onchange).toHaveBeenCalledWith(0)
588
+ })
589
+ })
590
+
591
+ it('should increase value with ArrowUp', async () => {
592
+ await usingAsync(new Injector(), async (injector) => {
593
+ const rootElement = document.getElementById('root') as HTMLDivElement
594
+ const onchange = vi.fn()
595
+
596
+ initializeShadeRoot({
597
+ injector,
598
+ rootElement,
599
+ jsxElement: <Rating value={2} onValueChange={onchange} />,
600
+ })
601
+
602
+ await sleepAsync(50)
603
+
604
+ const ratingEl = document.querySelector('shade-rating') as HTMLElement
605
+ ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true }))
606
+
607
+ await sleepAsync(50)
608
+
609
+ expect(onchange).toHaveBeenCalledWith(3)
610
+ })
611
+ })
612
+
613
+ it('should decrease value with ArrowDown', async () => {
614
+ await usingAsync(new Injector(), async (injector) => {
615
+ const rootElement = document.getElementById('root') as HTMLDivElement
616
+ const onchange = vi.fn()
617
+
618
+ initializeShadeRoot({
619
+ injector,
620
+ rootElement,
621
+ jsxElement: <Rating value={3} onValueChange={onchange} />,
622
+ })
623
+
624
+ await sleepAsync(50)
625
+
626
+ const ratingEl = document.querySelector('shade-rating') as HTMLElement
627
+ ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
628
+
629
+ await sleepAsync(50)
630
+
631
+ expect(onchange).toHaveBeenCalledWith(2)
632
+ })
633
+ })
634
+
635
+ it('should not fire onValueChange for unrecognized keys', async () => {
636
+ await usingAsync(new Injector(), async (injector) => {
637
+ const rootElement = document.getElementById('root') as HTMLDivElement
638
+ const onchange = vi.fn()
639
+
640
+ initializeShadeRoot({
641
+ injector,
642
+ rootElement,
643
+ jsxElement: <Rating value={3} onValueChange={onchange} />,
644
+ })
645
+
646
+ await sleepAsync(50)
647
+
648
+ const ratingEl = document.querySelector('shade-rating') as HTMLElement
649
+ ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'a', bubbles: true }))
650
+
651
+ await sleepAsync(50)
652
+
653
+ expect(onchange).not.toHaveBeenCalled()
654
+ })
655
+ })
656
+
657
+ it('should not handle keyboard when disabled', async () => {
658
+ await usingAsync(new Injector(), async (injector) => {
659
+ const rootElement = document.getElementById('root') as HTMLDivElement
660
+ const onchange = vi.fn()
661
+
662
+ initializeShadeRoot({
663
+ injector,
664
+ rootElement,
665
+ jsxElement: <Rating value={3} disabled onValueChange={onchange} />,
666
+ })
667
+
668
+ await sleepAsync(50)
669
+
670
+ const ratingEl = document.querySelector('shade-rating') as HTMLElement
671
+ ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
672
+
673
+ await sleepAsync(50)
674
+
675
+ expect(onchange).not.toHaveBeenCalled()
676
+ })
677
+ })
678
+
679
+ it('should not handle keyboard when readOnly', async () => {
680
+ await usingAsync(new Injector(), async (injector) => {
681
+ const rootElement = document.getElementById('root') as HTMLDivElement
682
+ const onchange = vi.fn()
683
+
684
+ initializeShadeRoot({
685
+ injector,
686
+ rootElement,
687
+ jsxElement: <Rating value={3} readOnly onValueChange={onchange} />,
688
+ })
689
+
690
+ await sleepAsync(50)
691
+
692
+ const ratingEl = document.querySelector('shade-rating') as HTMLElement
693
+ ratingEl.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
694
+
695
+ await sleepAsync(50)
696
+
697
+ expect(onchange).not.toHaveBeenCalled()
698
+ })
699
+ })
700
+ })
701
+
702
+ describe('hover visuals', () => {
703
+ it('should restore star visuals on mouse leave', async () => {
704
+ await usingAsync(new Injector(), async (injector) => {
705
+ const rootElement = document.getElementById('root') as HTMLDivElement
706
+
707
+ initializeShadeRoot({
708
+ injector,
709
+ rootElement,
710
+ jsxElement: <Rating value={2} />,
711
+ })
712
+
713
+ await sleepAsync(50)
714
+
715
+ const container = document.querySelector('shade-rating .rating-container') as HTMLElement
716
+ container.dispatchEvent(new MouseEvent('mouseleave', { bubbles: true }))
717
+
718
+ await sleepAsync(50)
719
+
720
+ const filledSpans = document.querySelectorAll('shade-rating .star-filled')
721
+ expect((filledSpans[0] as HTMLElement).style.width).toBe('100%')
722
+ expect((filledSpans[1] as HTMLElement).style.width).toBe('100%')
723
+ expect((filledSpans[2] as HTMLElement).style.width).toBe('0%')
724
+ })
725
+ })
726
+
727
+ it('should update star visuals on hover', async () => {
728
+ await usingAsync(new Injector(), async (injector) => {
729
+ const rootElement = document.getElementById('root') as HTMLDivElement
730
+
731
+ initializeShadeRoot({
732
+ injector,
733
+ rootElement,
734
+ jsxElement: <Rating value={1} />,
735
+ })
736
+
737
+ await sleepAsync(50)
738
+
739
+ const stars = document.querySelectorAll('shade-rating .rating-star')
740
+ const star4 = stars[3] as HTMLElement
741
+
742
+ // Simulate mouse move on 4th star
743
+ const rect = star4.getBoundingClientRect()
744
+ star4.dispatchEvent(
745
+ new MouseEvent('mousemove', {
746
+ bubbles: true,
747
+ clientX: rect.left + rect.width / 2 + 1,
748
+ }),
749
+ )
750
+
751
+ await sleepAsync(50)
752
+
753
+ const filledSpans = document.querySelectorAll('shade-rating .star-filled')
754
+ // Stars 0-3 should be filled (hover value = 4)
755
+ expect((filledSpans[0] as HTMLElement).style.width).toBe('100%')
756
+ expect((filledSpans[1] as HTMLElement).style.width).toBe('100%')
757
+ expect((filledSpans[2] as HTMLElement).style.width).toBe('100%')
758
+ expect((filledSpans[3] as HTMLElement).style.width).toBe('100%')
759
+ expect((filledSpans[4] as HTMLElement).style.width).toBe('0%')
760
+ })
761
+ })
762
+
763
+ it('should not update star visuals on hover when disabled', async () => {
764
+ await usingAsync(new Injector(), async (injector) => {
765
+ const rootElement = document.getElementById('root') as HTMLDivElement
766
+
767
+ initializeShadeRoot({
768
+ injector,
769
+ rootElement,
770
+ jsxElement: <Rating value={1} disabled />,
771
+ })
772
+
773
+ await sleepAsync(50)
774
+
775
+ const stars = document.querySelectorAll('shade-rating .rating-star')
776
+ ;(stars[3] as HTMLElement).dispatchEvent(new MouseEvent('mousemove', { bubbles: true, clientX: 100 }))
777
+
778
+ await sleepAsync(50)
779
+
780
+ const filledSpans = document.querySelectorAll('shade-rating .star-filled')
781
+ // Only first star should be filled (no hover effect)
782
+ expect((filledSpans[0] as HTMLElement).style.width).toBe('100%')
783
+ expect((filledSpans[1] as HTMLElement).style.width).toBe('0%')
784
+ })
785
+ })
786
+
787
+ it('should not update star visuals on mouse leave when disabled', async () => {
788
+ await usingAsync(new Injector(), async (injector) => {
789
+ const rootElement = document.getElementById('root') as HTMLDivElement
790
+
791
+ initializeShadeRoot({
792
+ injector,
793
+ rootElement,
794
+ jsxElement: <Rating value={2} disabled />,
795
+ })
796
+
797
+ await sleepAsync(50)
798
+
799
+ const container = document.querySelector('shade-rating .rating-container') as HTMLElement
800
+ container.dispatchEvent(new MouseEvent('mouseleave', { bubbles: true }))
801
+
802
+ await sleepAsync(50)
803
+
804
+ const filledSpans = document.querySelectorAll('shade-rating .star-filled')
805
+ expect((filledSpans[0] as HTMLElement).style.width).toBe('100%')
806
+ expect((filledSpans[1] as HTMLElement).style.width).toBe('100%')
807
+ expect((filledSpans[2] as HTMLElement).style.width).toBe('0%')
808
+ })
809
+ })
810
+ })
811
+
812
+ describe('small size', () => {
813
+ it('should set data-size to small', async () => {
814
+ await usingAsync(new Injector(), async (injector) => {
815
+ const rootElement = document.getElementById('root') as HTMLDivElement
816
+
817
+ initializeShadeRoot({
818
+ injector,
819
+ rootElement,
820
+ jsxElement: <Rating size="small" />,
821
+ })
822
+
823
+ await sleepAsync(50)
824
+
825
+ const wrapper = document.querySelector('shade-rating') as HTMLElement
826
+ expect(wrapper.getAttribute('data-size')).toBe('small')
827
+ })
828
+ })
829
+ })
830
+
831
+ describe('aria-readonly', () => {
832
+ it('should set aria-readonly when readOnly', async () => {
833
+ await usingAsync(new Injector(), async (injector) => {
834
+ const rootElement = document.getElementById('root') as HTMLDivElement
835
+
836
+ initializeShadeRoot({
837
+ injector,
838
+ rootElement,
839
+ jsxElement: <Rating readOnly value={3} />,
840
+ })
841
+
842
+ await sleepAsync(50)
843
+
844
+ const wrapper = document.querySelector('shade-rating') as HTMLElement
845
+ expect(wrapper.getAttribute('aria-readonly')).toBe('true')
846
+ })
847
+ })
848
+
849
+ it('should not have aria-readonly when interactive', async () => {
850
+ await usingAsync(new Injector(), async (injector) => {
851
+ const rootElement = document.getElementById('root') as HTMLDivElement
852
+
853
+ initializeShadeRoot({
854
+ injector,
855
+ rootElement,
856
+ jsxElement: <Rating value={3} />,
857
+ })
858
+
859
+ await sleepAsync(50)
860
+
861
+ const wrapper = document.querySelector('shade-rating') as HTMLElement
862
+ expect(wrapper.hasAttribute('aria-readonly')).toBe(false)
863
+ })
864
+ })
865
+ })
866
+ })