@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
@@ -1,5 +1,6 @@
1
1
  import { Injector } from '@furystack/inject'
2
2
  import { createComponent, initializeShadeRoot } from '@furystack/shades'
3
+ import { usingAsync } from '@furystack/utils'
3
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
4
5
  import { Suggest } from './index.js'
5
6
  import type { SuggestionResult } from './suggestion-result.js'
@@ -68,794 +69,817 @@ describe('Suggest', () => {
68
69
 
69
70
  describe('rendering', () => {
70
71
  it('should render with shadow DOM', async () => {
71
- const injector = new Injector()
72
- const rootElement = document.getElementById('root') as HTMLDivElement
73
- const onSelectSuggestion = vi.fn()
74
-
75
- initializeShadeRoot({
76
- injector,
77
- rootElement,
78
- jsxElement: (
79
- <Suggest<TestEntry>
80
- defaultPrefix="🔍"
81
- getEntries={getTestEntries}
82
- getSuggestionEntry={getSuggestionEntry}
83
- onSelectSuggestion={onSelectSuggestion}
84
- />
85
- ),
86
- })
72
+ await usingAsync(new Injector(), async (injector) => {
73
+ const rootElement = document.getElementById('root') as HTMLDivElement
74
+ const onSelectSuggestion = vi.fn()
75
+
76
+ initializeShadeRoot({
77
+ injector,
78
+ rootElement,
79
+ jsxElement: (
80
+ <Suggest<TestEntry>
81
+ defaultPrefix="🔍"
82
+ getEntries={getTestEntries}
83
+ getSuggestionEntry={getSuggestionEntry}
84
+ onSelectSuggestion={onSelectSuggestion}
85
+ />
86
+ ),
87
+ })
87
88
 
88
- await advanceTimers(50)
89
+ await advanceTimers(50)
89
90
 
90
- const suggest = document.querySelector('shade-suggest')
91
- expect(suggest).not.toBeNull()
91
+ const suggest = document.querySelector('shade-suggest')
92
+ expect(suggest).not.toBeNull()
93
+ })
92
94
  })
93
95
 
94
96
  it('should render the default prefix', async () => {
95
- const injector = new Injector()
96
- const rootElement = document.getElementById('root') as HTMLDivElement
97
- const onSelectSuggestion = vi.fn()
98
-
99
- initializeShadeRoot({
100
- injector,
101
- rootElement,
102
- jsxElement: (
103
- <Suggest<TestEntry>
104
- defaultPrefix="Search:"
105
- getEntries={getTestEntries}
106
- getSuggestionEntry={getSuggestionEntry}
107
- onSelectSuggestion={onSelectSuggestion}
108
- />
109
- ),
110
- })
97
+ await usingAsync(new Injector(), async (injector) => {
98
+ const rootElement = document.getElementById('root') as HTMLDivElement
99
+ const onSelectSuggestion = vi.fn()
100
+
101
+ initializeShadeRoot({
102
+ injector,
103
+ rootElement,
104
+ jsxElement: (
105
+ <Suggest<TestEntry>
106
+ defaultPrefix="Search:"
107
+ getEntries={getTestEntries}
108
+ getSuggestionEntry={getSuggestionEntry}
109
+ onSelectSuggestion={onSelectSuggestion}
110
+ />
111
+ ),
112
+ })
111
113
 
112
- await advanceTimers(50)
114
+ await advanceTimers(50)
113
115
 
114
- const suggest = document.querySelector('shade-suggest') as HTMLElement
115
- const termIcon = suggest?.querySelector('.term-icon')
116
- expect(termIcon?.textContent).toBe('Search:')
116
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
117
+ const termIcon = suggest?.querySelector('.term-icon')
118
+ expect(termIcon?.textContent).toBe('Search:')
119
+ })
117
120
  })
118
121
 
119
122
  it('should render the input container', async () => {
120
- const injector = new Injector()
121
- const rootElement = document.getElementById('root') as HTMLDivElement
122
- const onSelectSuggestion = vi.fn()
123
-
124
- initializeShadeRoot({
125
- injector,
126
- rootElement,
127
- jsxElement: (
128
- <Suggest<TestEntry>
129
- defaultPrefix="🔍"
130
- getEntries={getTestEntries}
131
- getSuggestionEntry={getSuggestionEntry}
132
- onSelectSuggestion={onSelectSuggestion}
133
- />
134
- ),
135
- })
123
+ await usingAsync(new Injector(), async (injector) => {
124
+ const rootElement = document.getElementById('root') as HTMLDivElement
125
+ const onSelectSuggestion = vi.fn()
126
+
127
+ initializeShadeRoot({
128
+ injector,
129
+ rootElement,
130
+ jsxElement: (
131
+ <Suggest<TestEntry>
132
+ defaultPrefix="🔍"
133
+ getEntries={getTestEntries}
134
+ getSuggestionEntry={getSuggestionEntry}
135
+ onSelectSuggestion={onSelectSuggestion}
136
+ />
137
+ ),
138
+ })
136
139
 
137
- await advanceTimers(50)
140
+ await advanceTimers(50)
138
141
 
139
- const suggest = document.querySelector('shade-suggest') as HTMLElement
140
- const inputContainer = suggest?.querySelector('.input-container')
141
- expect(inputContainer).not.toBeNull()
142
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
143
+ const inputContainer = suggest?.querySelector('.input-container')
144
+ expect(inputContainer).not.toBeNull()
145
+ })
142
146
  })
143
147
 
144
148
  it('should apply custom styles', async () => {
145
- const injector = new Injector()
146
- const rootElement = document.getElementById('root') as HTMLDivElement
147
- const onSelectSuggestion = vi.fn()
148
-
149
- initializeShadeRoot({
150
- injector,
151
- rootElement,
152
- jsxElement: (
153
- <Suggest<TestEntry>
154
- defaultPrefix="🔍"
155
- getEntries={getTestEntries}
156
- getSuggestionEntry={getSuggestionEntry}
157
- onSelectSuggestion={onSelectSuggestion}
158
- style={{ backgroundColor: 'red' }}
159
- />
160
- ),
161
- })
149
+ await usingAsync(new Injector(), async (injector) => {
150
+ const rootElement = document.getElementById('root') as HTMLDivElement
151
+ const onSelectSuggestion = vi.fn()
152
+
153
+ initializeShadeRoot({
154
+ injector,
155
+ rootElement,
156
+ jsxElement: (
157
+ <Suggest<TestEntry>
158
+ defaultPrefix="🔍"
159
+ getEntries={getTestEntries}
160
+ getSuggestionEntry={getSuggestionEntry}
161
+ onSelectSuggestion={onSelectSuggestion}
162
+ style={{ backgroundColor: 'red' }}
163
+ />
164
+ ),
165
+ })
162
166
 
163
- await advanceTimers(50)
167
+ await advanceTimers(50)
164
168
 
165
- const suggest = document.querySelector('shade-suggest') as HTMLElement
166
- const inputContainer = suggest?.querySelector('.input-container') as HTMLElement
167
- expect(inputContainer?.style.backgroundColor).toBe('red')
169
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
170
+ const inputContainer = suggest?.querySelector('.input-container') as HTMLElement
171
+ expect(inputContainer?.style.backgroundColor).toBe('red')
172
+ })
168
173
  })
169
174
  })
170
175
 
171
176
  describe('keyboard navigation', () => {
172
177
  it('should handle ArrowDown to move selection down', async () => {
173
- const injector = new Injector()
174
- const rootElement = document.getElementById('root') as HTMLDivElement
175
- const onSelectSuggestion = vi.fn()
176
-
177
- initializeShadeRoot({
178
- injector,
179
- rootElement,
180
- jsxElement: (
181
- <Suggest<TestEntry>
182
- defaultPrefix="🔍"
183
- getEntries={getTestEntries}
184
- getSuggestionEntry={getSuggestionEntry}
185
- onSelectSuggestion={onSelectSuggestion}
186
- />
187
- ),
188
- })
178
+ await usingAsync(new Injector(), async (injector) => {
179
+ const rootElement = document.getElementById('root') as HTMLDivElement
180
+ const onSelectSuggestion = vi.fn()
181
+
182
+ initializeShadeRoot({
183
+ injector,
184
+ rootElement,
185
+ jsxElement: (
186
+ <Suggest<TestEntry>
187
+ defaultPrefix="🔍"
188
+ getEntries={getTestEntries}
189
+ getSuggestionEntry={getSuggestionEntry}
190
+ onSelectSuggestion={onSelectSuggestion}
191
+ />
192
+ ),
193
+ })
189
194
 
190
- await advanceTimers(50)
195
+ await advanceTimers(50)
191
196
 
192
- const suggest = document.querySelector('shade-suggest') as HTMLElement
193
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
197
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
198
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
194
199
 
195
- const input = suggest?.querySelector('input') as HTMLInputElement
196
- input.value = 'test'
200
+ const input = suggest?.querySelector('input') as HTMLInputElement
201
+ input.value = 'test'
197
202
 
198
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
199
- Object.defineProperty(keyupEvent, 'target', { value: input })
200
- wrapper?.dispatchEvent(keyupEvent)
203
+ const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
204
+ Object.defineProperty(keyupEvent, 'target', { value: input })
205
+ wrapper?.dispatchEvent(keyupEvent)
201
206
 
202
- await advanceTimers(300)
207
+ await advanceTimers(300)
203
208
 
204
- const arrowDownEvent = new KeyboardEvent('keyup', { key: 'ArrowDown', bubbles: true })
205
- Object.defineProperty(arrowDownEvent, 'target', { value: input })
206
- wrapper?.dispatchEvent(arrowDownEvent)
209
+ const arrowDownEvent = new KeyboardEvent('keyup', { key: 'ArrowDown', bubbles: true })
210
+ Object.defineProperty(arrowDownEvent, 'target', { value: input })
211
+ wrapper?.dispatchEvent(arrowDownEvent)
207
212
 
208
- await advanceTimers(50)
213
+ await advanceTimers(50)
209
214
 
210
- const selectedItems = suggest?.querySelectorAll('.suggestion-item.selected')
211
- expect(selectedItems?.length).toBeGreaterThanOrEqual(0)
215
+ const selectedItems = suggest?.querySelectorAll('.suggestion-item.selected')
216
+ expect(selectedItems?.length).toBeGreaterThanOrEqual(0)
217
+ })
212
218
  })
213
219
 
214
220
  it('should handle ArrowUp to move selection up', async () => {
215
- const injector = new Injector()
216
- const rootElement = document.getElementById('root') as HTMLDivElement
217
- const onSelectSuggestion = vi.fn()
218
-
219
- initializeShadeRoot({
220
- injector,
221
- rootElement,
222
- jsxElement: (
223
- <Suggest<TestEntry>
224
- defaultPrefix="🔍"
225
- getEntries={getTestEntries}
226
- getSuggestionEntry={getSuggestionEntry}
227
- onSelectSuggestion={onSelectSuggestion}
228
- />
229
- ),
230
- })
221
+ await usingAsync(new Injector(), async (injector) => {
222
+ const rootElement = document.getElementById('root') as HTMLDivElement
223
+ const onSelectSuggestion = vi.fn()
224
+
225
+ initializeShadeRoot({
226
+ injector,
227
+ rootElement,
228
+ jsxElement: (
229
+ <Suggest<TestEntry>
230
+ defaultPrefix="🔍"
231
+ getEntries={getTestEntries}
232
+ getSuggestionEntry={getSuggestionEntry}
233
+ onSelectSuggestion={onSelectSuggestion}
234
+ />
235
+ ),
236
+ })
231
237
 
232
- await advanceTimers(50)
238
+ await advanceTimers(50)
233
239
 
234
- const suggest = document.querySelector('shade-suggest') as HTMLElement
235
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
240
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
241
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
236
242
 
237
- const input = suggest?.querySelector('input') as HTMLInputElement
238
- input.value = 'test'
243
+ const input = suggest?.querySelector('input') as HTMLInputElement
244
+ input.value = 'test'
239
245
 
240
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
241
- Object.defineProperty(keyupEvent, 'target', { value: input })
242
- wrapper?.dispatchEvent(keyupEvent)
246
+ const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
247
+ Object.defineProperty(keyupEvent, 'target', { value: input })
248
+ wrapper?.dispatchEvent(keyupEvent)
243
249
 
244
- await advanceTimers(300)
250
+ await advanceTimers(300)
245
251
 
246
- const arrowDownEvent = new KeyboardEvent('keyup', { key: 'ArrowDown', bubbles: true })
247
- Object.defineProperty(arrowDownEvent, 'target', { value: input })
248
- wrapper?.dispatchEvent(arrowDownEvent)
249
- wrapper?.dispatchEvent(arrowDownEvent)
252
+ const arrowDownEvent = new KeyboardEvent('keyup', { key: 'ArrowDown', bubbles: true })
253
+ Object.defineProperty(arrowDownEvent, 'target', { value: input })
254
+ wrapper?.dispatchEvent(arrowDownEvent)
255
+ wrapper?.dispatchEvent(arrowDownEvent)
250
256
 
251
- const arrowUpEvent = new KeyboardEvent('keyup', { key: 'ArrowUp', bubbles: true })
252
- Object.defineProperty(arrowUpEvent, 'target', { value: input })
253
- wrapper?.dispatchEvent(arrowUpEvent)
257
+ const arrowUpEvent = new KeyboardEvent('keyup', { key: 'ArrowUp', bubbles: true })
258
+ Object.defineProperty(arrowUpEvent, 'target', { value: input })
259
+ wrapper?.dispatchEvent(arrowUpEvent)
254
260
 
255
- await advanceTimers(50)
261
+ await advanceTimers(50)
256
262
 
257
- expect(suggest).not.toBeNull()
263
+ expect(suggest).not.toBeNull()
264
+ })
258
265
  })
259
266
 
260
267
  it('should handle Enter to select current suggestion', async () => {
261
- const injector = new Injector()
262
- const rootElement = document.getElementById('root') as HTMLDivElement
263
- const onSelectSuggestion = vi.fn()
264
-
265
- initializeShadeRoot({
266
- injector,
267
- rootElement,
268
- jsxElement: (
269
- <Suggest<TestEntry>
270
- defaultPrefix="🔍"
271
- getEntries={getTestEntries}
272
- getSuggestionEntry={getSuggestionEntry}
273
- onSelectSuggestion={onSelectSuggestion}
274
- />
275
- ),
276
- })
268
+ await usingAsync(new Injector(), async (injector) => {
269
+ const rootElement = document.getElementById('root') as HTMLDivElement
270
+ const onSelectSuggestion = vi.fn()
271
+
272
+ initializeShadeRoot({
273
+ injector,
274
+ rootElement,
275
+ jsxElement: (
276
+ <Suggest<TestEntry>
277
+ defaultPrefix="🔍"
278
+ getEntries={getTestEntries}
279
+ getSuggestionEntry={getSuggestionEntry}
280
+ onSelectSuggestion={onSelectSuggestion}
281
+ />
282
+ ),
283
+ })
277
284
 
278
- await advanceTimers(50)
285
+ await advanceTimers(50)
279
286
 
280
- const suggest = document.querySelector('shade-suggest') as HTMLElement
281
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
287
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
288
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
282
289
 
283
- const input = suggest?.querySelector('input') as HTMLInputElement
284
- input.value = 'First'
290
+ const input = suggest?.querySelector('input') as HTMLInputElement
291
+ input.value = 'First'
285
292
 
286
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
287
- Object.defineProperty(keyupEvent, 'target', { value: input })
288
- wrapper?.dispatchEvent(keyupEvent)
293
+ const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
294
+ Object.defineProperty(keyupEvent, 'target', { value: input })
295
+ wrapper?.dispatchEvent(keyupEvent)
289
296
 
290
- await advanceTimers(300)
297
+ await advanceTimers(300)
291
298
 
292
- const enterEvent = new KeyboardEvent('keyup', { key: 'Enter', bubbles: true })
293
- Object.defineProperty(enterEvent, 'target', { value: input })
294
- wrapper?.dispatchEvent(enterEvent)
299
+ const enterEvent = new KeyboardEvent('keyup', { key: 'Enter', bubbles: true })
300
+ Object.defineProperty(enterEvent, 'target', { value: input })
301
+ wrapper?.dispatchEvent(enterEvent)
295
302
 
296
- await advanceTimers(50)
303
+ await advanceTimers(50)
297
304
 
298
- expect(onSelectSuggestion).toHaveBeenCalled()
305
+ expect(onSelectSuggestion).toHaveBeenCalled()
306
+ })
299
307
  })
300
308
 
301
309
  it('should prevent default on Enter key', async () => {
302
- const injector = new Injector()
303
- const rootElement = document.getElementById('root') as HTMLDivElement
304
- const onSelectSuggestion = vi.fn()
305
-
306
- initializeShadeRoot({
307
- injector,
308
- rootElement,
309
- jsxElement: (
310
- <Suggest<TestEntry>
311
- defaultPrefix="🔍"
312
- getEntries={getTestEntries}
313
- getSuggestionEntry={getSuggestionEntry}
314
- onSelectSuggestion={onSelectSuggestion}
315
- />
316
- ),
317
- })
310
+ await usingAsync(new Injector(), async (injector) => {
311
+ const rootElement = document.getElementById('root') as HTMLDivElement
312
+ const onSelectSuggestion = vi.fn()
313
+
314
+ initializeShadeRoot({
315
+ injector,
316
+ rootElement,
317
+ jsxElement: (
318
+ <Suggest<TestEntry>
319
+ defaultPrefix="🔍"
320
+ getEntries={getTestEntries}
321
+ getSuggestionEntry={getSuggestionEntry}
322
+ onSelectSuggestion={onSelectSuggestion}
323
+ />
324
+ ),
325
+ })
318
326
 
319
- await advanceTimers(50)
327
+ await advanceTimers(50)
320
328
 
321
- const suggest = document.querySelector('shade-suggest') as HTMLElement
322
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
329
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
330
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
323
331
 
324
- const input = suggest?.querySelector('input') as HTMLInputElement
325
- input.value = 'First'
332
+ const input = suggest?.querySelector('input') as HTMLInputElement
333
+ input.value = 'First'
326
334
 
327
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
328
- Object.defineProperty(keyupEvent, 'target', { value: input })
329
- wrapper?.dispatchEvent(keyupEvent)
335
+ const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
336
+ Object.defineProperty(keyupEvent, 'target', { value: input })
337
+ wrapper?.dispatchEvent(keyupEvent)
330
338
 
331
- await advanceTimers(300)
339
+ await advanceTimers(300)
332
340
 
333
- const enterEvent = new KeyboardEvent('keyup', { key: 'Enter', bubbles: true, cancelable: true })
334
- Object.defineProperty(enterEvent, 'target', { value: input })
341
+ const enterEvent = new KeyboardEvent('keyup', { key: 'Enter', bubbles: true, cancelable: true })
342
+ Object.defineProperty(enterEvent, 'target', { value: input })
335
343
 
336
- const preventDefaultSpy = vi.spyOn(enterEvent, 'preventDefault')
337
- wrapper?.dispatchEvent(enterEvent)
344
+ const preventDefaultSpy = vi.spyOn(enterEvent, 'preventDefault')
345
+ wrapper?.dispatchEvent(enterEvent)
338
346
 
339
- expect(preventDefaultSpy).toHaveBeenCalled()
347
+ expect(preventDefaultSpy).toHaveBeenCalled()
348
+ })
340
349
  })
341
350
 
342
351
  it('should prevent default on ArrowUp key', async () => {
343
- const injector = new Injector()
344
- const rootElement = document.getElementById('root') as HTMLDivElement
345
- const onSelectSuggestion = vi.fn()
346
-
347
- initializeShadeRoot({
348
- injector,
349
- rootElement,
350
- jsxElement: (
351
- <Suggest<TestEntry>
352
- defaultPrefix="🔍"
353
- getEntries={getTestEntries}
354
- getSuggestionEntry={getSuggestionEntry}
355
- onSelectSuggestion={onSelectSuggestion}
356
- />
357
- ),
358
- })
352
+ await usingAsync(new Injector(), async (injector) => {
353
+ const rootElement = document.getElementById('root') as HTMLDivElement
354
+ const onSelectSuggestion = vi.fn()
355
+
356
+ initializeShadeRoot({
357
+ injector,
358
+ rootElement,
359
+ jsxElement: (
360
+ <Suggest<TestEntry>
361
+ defaultPrefix="🔍"
362
+ getEntries={getTestEntries}
363
+ getSuggestionEntry={getSuggestionEntry}
364
+ onSelectSuggestion={onSelectSuggestion}
365
+ />
366
+ ),
367
+ })
359
368
 
360
- await advanceTimers(50)
369
+ await advanceTimers(50)
361
370
 
362
- const suggest = document.querySelector('shade-suggest') as HTMLElement
363
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
371
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
372
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
364
373
 
365
- const input = suggest?.querySelector('input') as HTMLInputElement
374
+ const input = suggest?.querySelector('input') as HTMLInputElement
366
375
 
367
- const arrowUpEvent = new KeyboardEvent('keyup', { key: 'ArrowUp', bubbles: true, cancelable: true })
368
- Object.defineProperty(arrowUpEvent, 'target', { value: input })
376
+ const arrowUpEvent = new KeyboardEvent('keyup', { key: 'ArrowUp', bubbles: true, cancelable: true })
377
+ Object.defineProperty(arrowUpEvent, 'target', { value: input })
369
378
 
370
- const preventDefaultSpy = vi.spyOn(arrowUpEvent, 'preventDefault')
371
- wrapper?.dispatchEvent(arrowUpEvent)
379
+ const preventDefaultSpy = vi.spyOn(arrowUpEvent, 'preventDefault')
380
+ wrapper?.dispatchEvent(arrowUpEvent)
372
381
 
373
- expect(preventDefaultSpy).toHaveBeenCalled()
382
+ expect(preventDefaultSpy).toHaveBeenCalled()
383
+ })
374
384
  })
375
385
 
376
386
  it('should prevent default on ArrowDown key', async () => {
377
- const injector = new Injector()
378
- const rootElement = document.getElementById('root') as HTMLDivElement
379
- const onSelectSuggestion = vi.fn()
380
-
381
- initializeShadeRoot({
382
- injector,
383
- rootElement,
384
- jsxElement: (
385
- <Suggest<TestEntry>
386
- defaultPrefix="🔍"
387
- getEntries={getTestEntries}
388
- getSuggestionEntry={getSuggestionEntry}
389
- onSelectSuggestion={onSelectSuggestion}
390
- />
391
- ),
392
- })
387
+ await usingAsync(new Injector(), async (injector) => {
388
+ const rootElement = document.getElementById('root') as HTMLDivElement
389
+ const onSelectSuggestion = vi.fn()
390
+
391
+ initializeShadeRoot({
392
+ injector,
393
+ rootElement,
394
+ jsxElement: (
395
+ <Suggest<TestEntry>
396
+ defaultPrefix="🔍"
397
+ getEntries={getTestEntries}
398
+ getSuggestionEntry={getSuggestionEntry}
399
+ onSelectSuggestion={onSelectSuggestion}
400
+ />
401
+ ),
402
+ })
393
403
 
394
- await advanceTimers(50)
404
+ await advanceTimers(50)
395
405
 
396
- const suggest = document.querySelector('shade-suggest') as HTMLElement
397
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
406
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
407
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
398
408
 
399
- const input = suggest?.querySelector('input') as HTMLInputElement
409
+ const input = suggest?.querySelector('input') as HTMLInputElement
400
410
 
401
- const arrowDownEvent = new KeyboardEvent('keyup', { key: 'ArrowDown', bubbles: true, cancelable: true })
402
- Object.defineProperty(arrowDownEvent, 'target', { value: input })
411
+ const arrowDownEvent = new KeyboardEvent('keyup', { key: 'ArrowDown', bubbles: true, cancelable: true })
412
+ Object.defineProperty(arrowDownEvent, 'target', { value: input })
403
413
 
404
- const preventDefaultSpy = vi.spyOn(arrowDownEvent, 'preventDefault')
405
- wrapper?.dispatchEvent(arrowDownEvent)
414
+ const preventDefaultSpy = vi.spyOn(arrowDownEvent, 'preventDefault')
415
+ wrapper?.dispatchEvent(arrowDownEvent)
406
416
 
407
- expect(preventDefaultSpy).toHaveBeenCalled()
417
+ expect(preventDefaultSpy).toHaveBeenCalled()
418
+ })
408
419
  })
409
420
 
410
421
  it('should not move selection below 0', async () => {
411
- const injector = new Injector()
412
- const rootElement = document.getElementById('root') as HTMLDivElement
413
- const onSelectSuggestion = vi.fn()
414
-
415
- initializeShadeRoot({
416
- injector,
417
- rootElement,
418
- jsxElement: (
419
- <Suggest<TestEntry>
420
- defaultPrefix="🔍"
421
- getEntries={getTestEntries}
422
- getSuggestionEntry={getSuggestionEntry}
423
- onSelectSuggestion={onSelectSuggestion}
424
- />
425
- ),
426
- })
422
+ await usingAsync(new Injector(), async (injector) => {
423
+ const rootElement = document.getElementById('root') as HTMLDivElement
424
+ const onSelectSuggestion = vi.fn()
425
+
426
+ initializeShadeRoot({
427
+ injector,
428
+ rootElement,
429
+ jsxElement: (
430
+ <Suggest<TestEntry>
431
+ defaultPrefix="🔍"
432
+ getEntries={getTestEntries}
433
+ getSuggestionEntry={getSuggestionEntry}
434
+ onSelectSuggestion={onSelectSuggestion}
435
+ />
436
+ ),
437
+ })
427
438
 
428
- await advanceTimers(50)
439
+ await advanceTimers(50)
429
440
 
430
- const suggest = document.querySelector('shade-suggest') as HTMLElement
431
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
441
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
442
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
432
443
 
433
- const input = suggest?.querySelector('input') as HTMLInputElement
444
+ const input = suggest?.querySelector('input') as HTMLInputElement
434
445
 
435
- for (let i = 0; i < 5; i++) {
436
- const arrowUpEvent = new KeyboardEvent('keyup', { key: 'ArrowUp', bubbles: true })
437
- Object.defineProperty(arrowUpEvent, 'target', { value: input })
438
- wrapper?.dispatchEvent(arrowUpEvent)
439
- }
446
+ for (let i = 0; i < 5; i++) {
447
+ const arrowUpEvent = new KeyboardEvent('keyup', { key: 'ArrowUp', bubbles: true })
448
+ Object.defineProperty(arrowUpEvent, 'target', { value: input })
449
+ wrapper?.dispatchEvent(arrowUpEvent)
450
+ }
440
451
 
441
- await advanceTimers(50)
452
+ await advanceTimers(50)
442
453
 
443
- expect(suggest).not.toBeNull()
454
+ expect(suggest).not.toBeNull()
455
+ })
444
456
  })
445
457
  })
446
458
 
447
459
  describe('open/close behavior', () => {
448
460
  it('should open when clicking term icon', async () => {
449
- const injector = new Injector()
450
- const rootElement = document.getElementById('root') as HTMLDivElement
451
- const onSelectSuggestion = vi.fn()
452
-
453
- initializeShadeRoot({
454
- injector,
455
- rootElement,
456
- jsxElement: (
457
- <Suggest<TestEntry>
458
- defaultPrefix="🔍"
459
- getEntries={getTestEntries}
460
- getSuggestionEntry={getSuggestionEntry}
461
- onSelectSuggestion={onSelectSuggestion}
462
- />
463
- ),
464
- })
461
+ await usingAsync(new Injector(), async (injector) => {
462
+ const rootElement = document.getElementById('root') as HTMLDivElement
463
+ const onSelectSuggestion = vi.fn()
464
+
465
+ initializeShadeRoot({
466
+ injector,
467
+ rootElement,
468
+ jsxElement: (
469
+ <Suggest<TestEntry>
470
+ defaultPrefix="🔍"
471
+ getEntries={getTestEntries}
472
+ getSuggestionEntry={getSuggestionEntry}
473
+ onSelectSuggestion={onSelectSuggestion}
474
+ />
475
+ ),
476
+ })
465
477
 
466
- await advanceTimers(50)
478
+ await advanceTimers(50)
467
479
 
468
- const suggest = document.querySelector('shade-suggest') as HTMLElement
469
- const termIcon = suggest?.querySelector('.term-icon') as HTMLElement
480
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
481
+ const termIcon = suggest?.querySelector('.term-icon') as HTMLElement
470
482
 
471
- termIcon?.click()
483
+ termIcon?.click()
472
484
 
473
- await advanceTimers(50)
485
+ await advanceTimers(50)
474
486
 
475
- expect(suggest?.classList.contains('opened')).toBe(true)
487
+ expect(suggest?.hasAttribute('data-opened')).toBe(true)
488
+ })
476
489
  })
477
490
 
478
491
  it('should close when clicking close button', async () => {
479
- const injector = new Injector()
480
- const rootElement = document.getElementById('root') as HTMLDivElement
481
- const onSelectSuggestion = vi.fn()
482
-
483
- initializeShadeRoot({
484
- injector,
485
- rootElement,
486
- jsxElement: (
487
- <Suggest<TestEntry>
488
- defaultPrefix="🔍"
489
- getEntries={getTestEntries}
490
- getSuggestionEntry={getSuggestionEntry}
491
- onSelectSuggestion={onSelectSuggestion}
492
- />
493
- ),
494
- })
492
+ await usingAsync(new Injector(), async (injector) => {
493
+ const rootElement = document.getElementById('root') as HTMLDivElement
494
+ const onSelectSuggestion = vi.fn()
495
+
496
+ initializeShadeRoot({
497
+ injector,
498
+ rootElement,
499
+ jsxElement: (
500
+ <Suggest<TestEntry>
501
+ defaultPrefix="🔍"
502
+ getEntries={getTestEntries}
503
+ getSuggestionEntry={getSuggestionEntry}
504
+ onSelectSuggestion={onSelectSuggestion}
505
+ />
506
+ ),
507
+ })
495
508
 
496
- await advanceTimers(50)
509
+ await advanceTimers(50)
497
510
 
498
- const suggest = document.querySelector('shade-suggest') as HTMLElement
499
- const termIcon = suggest?.querySelector('.term-icon') as HTMLElement
500
- termIcon?.click()
511
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
512
+ const termIcon = suggest?.querySelector('.term-icon') as HTMLElement
513
+ termIcon?.click()
501
514
 
502
- await advanceTimers(50)
515
+ await advanceTimers(50)
503
516
 
504
- const closeButton = suggest?.querySelector('.close-suggestions') as HTMLElement
505
- closeButton?.click()
517
+ const closeButton = suggest?.querySelector('.close-suggestions') as HTMLElement
518
+ closeButton?.click()
506
519
 
507
- await advanceTimers(50)
520
+ await advanceTimers(50)
508
521
 
509
- expect(suggest?.classList.contains('opened')).toBe(false)
522
+ expect(suggest?.hasAttribute('data-opened')).toBe(false)
523
+ })
510
524
  })
511
525
 
512
526
  it('should trigger animation when opening', async () => {
513
- const injector = new Injector()
514
- const rootElement = document.getElementById('root') as HTMLDivElement
515
- const onSelectSuggestion = vi.fn()
516
-
517
- initializeShadeRoot({
518
- injector,
519
- rootElement,
520
- jsxElement: (
521
- <Suggest<TestEntry>
522
- defaultPrefix="🔍"
523
- getEntries={getTestEntries}
524
- getSuggestionEntry={getSuggestionEntry}
525
- onSelectSuggestion={onSelectSuggestion}
526
- />
527
- ),
528
- })
527
+ await usingAsync(new Injector(), async (injector) => {
528
+ const rootElement = document.getElementById('root') as HTMLDivElement
529
+ const onSelectSuggestion = vi.fn()
530
+
531
+ initializeShadeRoot({
532
+ injector,
533
+ rootElement,
534
+ jsxElement: (
535
+ <Suggest<TestEntry>
536
+ defaultPrefix="🔍"
537
+ getEntries={getTestEntries}
538
+ getSuggestionEntry={getSuggestionEntry}
539
+ onSelectSuggestion={onSelectSuggestion}
540
+ />
541
+ ),
542
+ })
529
543
 
530
- await advanceTimers(50)
544
+ await advanceTimers(50)
531
545
 
532
- const initialAnimationCount = animateCalls.length
546
+ const initialAnimationCount = animateCalls.length
533
547
 
534
- const suggest = document.querySelector('shade-suggest') as HTMLElement
535
- const termIcon = suggest?.querySelector('.term-icon') as HTMLElement
536
- termIcon?.click()
548
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
549
+ const termIcon = suggest?.querySelector('.term-icon') as HTMLElement
550
+ termIcon?.click()
537
551
 
538
- await advanceTimers(50)
552
+ await advanceTimers(50)
539
553
 
540
- expect(animateCalls.length).toBeGreaterThan(initialAnimationCount)
554
+ expect(animateCalls.length).toBeGreaterThan(initialAnimationCount)
555
+ })
541
556
  })
542
557
 
543
558
  it('should trigger animation when closing', async () => {
544
- const injector = new Injector()
545
- const rootElement = document.getElementById('root') as HTMLDivElement
546
- const onSelectSuggestion = vi.fn()
547
-
548
- initializeShadeRoot({
549
- injector,
550
- rootElement,
551
- jsxElement: (
552
- <Suggest<TestEntry>
553
- defaultPrefix="🔍"
554
- getEntries={getTestEntries}
555
- getSuggestionEntry={getSuggestionEntry}
556
- onSelectSuggestion={onSelectSuggestion}
557
- />
558
- ),
559
- })
559
+ await usingAsync(new Injector(), async (injector) => {
560
+ const rootElement = document.getElementById('root') as HTMLDivElement
561
+ const onSelectSuggestion = vi.fn()
562
+
563
+ initializeShadeRoot({
564
+ injector,
565
+ rootElement,
566
+ jsxElement: (
567
+ <Suggest<TestEntry>
568
+ defaultPrefix="🔍"
569
+ getEntries={getTestEntries}
570
+ getSuggestionEntry={getSuggestionEntry}
571
+ onSelectSuggestion={onSelectSuggestion}
572
+ />
573
+ ),
574
+ })
560
575
 
561
- await advanceTimers(50)
576
+ await advanceTimers(50)
562
577
 
563
- const suggest = document.querySelector('shade-suggest') as HTMLElement
564
- const termIcon = suggest?.querySelector('.term-icon') as HTMLElement
565
- termIcon?.click()
578
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
579
+ const termIcon = suggest?.querySelector('.term-icon') as HTMLElement
580
+ termIcon?.click()
566
581
 
567
- await advanceTimers(50)
582
+ await advanceTimers(50)
568
583
 
569
- const animationCountAfterOpen = animateCalls.length
584
+ const animationCountAfterOpen = animateCalls.length
570
585
 
571
- const closeButton = suggest?.querySelector('.close-suggestions') as HTMLElement
572
- closeButton?.click()
586
+ const closeButton = suggest?.querySelector('.close-suggestions') as HTMLElement
587
+ closeButton?.click()
573
588
 
574
- await advanceTimers(50)
589
+ await advanceTimers(50)
575
590
 
576
- expect(animateCalls.length).toBeGreaterThan(animationCountAfterOpen)
591
+ expect(animateCalls.length).toBeGreaterThan(animationCountAfterOpen)
592
+ })
577
593
  })
578
594
  })
579
595
 
580
596
  describe('suggestions loading', () => {
581
597
  it('should fetch suggestions when typing', async () => {
582
- const injector = new Injector()
583
- const rootElement = document.getElementById('root') as HTMLDivElement
584
- const onSelectSuggestion = vi.fn()
585
- const getEntriesSpy = vi.fn(getTestEntries)
586
-
587
- initializeShadeRoot({
588
- injector,
589
- rootElement,
590
- jsxElement: (
591
- <Suggest<TestEntry>
592
- defaultPrefix="🔍"
593
- getEntries={getEntriesSpy}
594
- getSuggestionEntry={getSuggestionEntry}
595
- onSelectSuggestion={onSelectSuggestion}
596
- />
597
- ),
598
- })
598
+ await usingAsync(new Injector(), async (injector) => {
599
+ const rootElement = document.getElementById('root') as HTMLDivElement
600
+ const onSelectSuggestion = vi.fn()
601
+ const getEntriesSpy = vi.fn(getTestEntries)
602
+
603
+ initializeShadeRoot({
604
+ injector,
605
+ rootElement,
606
+ jsxElement: (
607
+ <Suggest<TestEntry>
608
+ defaultPrefix="🔍"
609
+ getEntries={getEntriesSpy}
610
+ getSuggestionEntry={getSuggestionEntry}
611
+ onSelectSuggestion={onSelectSuggestion}
612
+ />
613
+ ),
614
+ })
599
615
 
600
- await advanceTimers(50)
616
+ await advanceTimers(50)
601
617
 
602
- const suggest = document.querySelector('shade-suggest') as HTMLElement
603
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
618
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
619
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
604
620
 
605
- const input = suggest?.querySelector('input') as HTMLInputElement
606
- input.value = 'First'
621
+ const input = suggest?.querySelector('input') as HTMLInputElement
622
+ input.value = 'First'
607
623
 
608
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
609
- Object.defineProperty(keyupEvent, 'target', { value: input })
610
- wrapper?.dispatchEvent(keyupEvent)
624
+ const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
625
+ Object.defineProperty(keyupEvent, 'target', { value: input })
626
+ wrapper?.dispatchEvent(keyupEvent)
611
627
 
612
- await advanceTimers(300)
628
+ await advanceTimers(300)
613
629
 
614
- expect(getEntriesSpy).toHaveBeenCalledWith('First')
630
+ expect(getEntriesSpy).toHaveBeenCalledWith('First')
631
+ })
615
632
  })
616
633
 
617
634
  it('should show loader animation while loading', async () => {
618
- const injector = new Injector()
619
- const rootElement = document.getElementById('root') as HTMLDivElement
620
- const onSelectSuggestion = vi.fn()
621
-
622
- const resolveHolder: { resolve: ((entries: TestEntry[]) => void) | null } = { resolve: null }
623
- const slowGetEntries = () =>
624
- new Promise<TestEntry[]>((resolve) => {
625
- resolveHolder.resolve = resolve
635
+ await usingAsync(new Injector(), async (injector) => {
636
+ const rootElement = document.getElementById('root') as HTMLDivElement
637
+ const onSelectSuggestion = vi.fn()
638
+
639
+ const resolveHolder: { resolve: ((entries: TestEntry[]) => void) | null } = { resolve: null }
640
+ const slowGetEntries = () =>
641
+ new Promise<TestEntry[]>((resolve) => {
642
+ resolveHolder.resolve = resolve
643
+ })
644
+
645
+ initializeShadeRoot({
646
+ injector,
647
+ rootElement,
648
+ jsxElement: (
649
+ <Suggest<TestEntry>
650
+ defaultPrefix="🔍"
651
+ getEntries={slowGetEntries}
652
+ getSuggestionEntry={getSuggestionEntry}
653
+ onSelectSuggestion={onSelectSuggestion}
654
+ />
655
+ ),
626
656
  })
627
657
 
628
- initializeShadeRoot({
629
- injector,
630
- rootElement,
631
- jsxElement: (
632
- <Suggest<TestEntry>
633
- defaultPrefix="🔍"
634
- getEntries={slowGetEntries}
635
- getSuggestionEntry={getSuggestionEntry}
636
- onSelectSuggestion={onSelectSuggestion}
637
- />
638
- ),
639
- })
640
-
641
- await advanceTimers(50)
658
+ await advanceTimers(50)
642
659
 
643
- const suggest = document.querySelector('shade-suggest') as HTMLElement
644
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
660
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
661
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
645
662
 
646
- const input = suggest?.querySelector('input') as HTMLInputElement
647
- input.value = 'test'
663
+ const input = suggest?.querySelector('input') as HTMLInputElement
664
+ input.value = 'test'
648
665
 
649
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
650
- Object.defineProperty(keyupEvent, 'target', { value: input })
651
- wrapper?.dispatchEvent(keyupEvent)
666
+ const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
667
+ Object.defineProperty(keyupEvent, 'target', { value: input })
668
+ wrapper?.dispatchEvent(keyupEvent)
652
669
 
653
- await advanceTimers(300)
670
+ await advanceTimers(300)
654
671
 
655
- const loader = suggest?.querySelector('shade-loader')
656
- expect(loader).not.toBeNull()
672
+ const loader = suggest?.querySelector('shade-loader')
673
+ expect(loader).not.toBeNull()
657
674
 
658
- resolveHolder.resolve?.(createTestEntries())
659
- await advanceTimers(50)
675
+ resolveHolder.resolve?.(createTestEntries())
676
+ await advanceTimers(50)
677
+ })
660
678
  })
661
679
 
662
680
  it('should render suggestions after loading', async () => {
663
- const injector = new Injector()
664
- const rootElement = document.getElementById('root') as HTMLDivElement
665
- const onSelectSuggestion = vi.fn()
666
-
667
- initializeShadeRoot({
668
- injector,
669
- rootElement,
670
- jsxElement: (
671
- <Suggest<TestEntry>
672
- defaultPrefix="🔍"
673
- getEntries={getTestEntries}
674
- getSuggestionEntry={getSuggestionEntry}
675
- onSelectSuggestion={onSelectSuggestion}
676
- />
677
- ),
678
- })
681
+ await usingAsync(new Injector(), async (injector) => {
682
+ const rootElement = document.getElementById('root') as HTMLDivElement
683
+ const onSelectSuggestion = vi.fn()
684
+
685
+ initializeShadeRoot({
686
+ injector,
687
+ rootElement,
688
+ jsxElement: (
689
+ <Suggest<TestEntry>
690
+ defaultPrefix="🔍"
691
+ getEntries={getTestEntries}
692
+ getSuggestionEntry={getSuggestionEntry}
693
+ onSelectSuggestion={onSelectSuggestion}
694
+ />
695
+ ),
696
+ })
679
697
 
680
- await advanceTimers(50)
698
+ await advanceTimers(50)
681
699
 
682
- const suggest = document.querySelector('shade-suggest') as HTMLElement
683
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
700
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
701
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
684
702
 
685
- const input = suggest?.querySelector('input') as HTMLInputElement
686
- input.value = 'test'
703
+ const input = suggest?.querySelector('input') as HTMLInputElement
704
+ input.value = 'test'
687
705
 
688
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
689
- Object.defineProperty(keyupEvent, 'target', { value: input })
690
- wrapper?.dispatchEvent(keyupEvent)
706
+ const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
707
+ Object.defineProperty(keyupEvent, 'target', { value: input })
708
+ wrapper?.dispatchEvent(keyupEvent)
691
709
 
692
- await advanceTimers(300)
710
+ await advanceTimers(300)
693
711
 
694
- const suggestionList = suggest?.querySelector('shade-suggest-suggestion-list')
695
- expect(suggestionList).not.toBeNull()
712
+ const suggestionList = suggest?.querySelector('shade-suggest-suggestion-list')
713
+ expect(suggestionList).not.toBeNull()
714
+ })
696
715
  })
697
716
  })
698
717
 
699
718
  describe('suggestion selection', () => {
700
719
  it('should call onSelectSuggestion when selecting via Enter', async () => {
701
- const injector = new Injector()
702
- const rootElement = document.getElementById('root') as HTMLDivElement
703
- const onSelectSuggestion = vi.fn()
704
-
705
- initializeShadeRoot({
706
- injector,
707
- rootElement,
708
- jsxElement: (
709
- <Suggest<TestEntry>
710
- defaultPrefix="🔍"
711
- getEntries={getTestEntries}
712
- getSuggestionEntry={getSuggestionEntry}
713
- onSelectSuggestion={onSelectSuggestion}
714
- />
715
- ),
716
- })
720
+ await usingAsync(new Injector(), async (injector) => {
721
+ const rootElement = document.getElementById('root') as HTMLDivElement
722
+ const onSelectSuggestion = vi.fn()
723
+
724
+ initializeShadeRoot({
725
+ injector,
726
+ rootElement,
727
+ jsxElement: (
728
+ <Suggest<TestEntry>
729
+ defaultPrefix="🔍"
730
+ getEntries={getTestEntries}
731
+ getSuggestionEntry={getSuggestionEntry}
732
+ onSelectSuggestion={onSelectSuggestion}
733
+ />
734
+ ),
735
+ })
717
736
 
718
- await advanceTimers(50)
737
+ await advanceTimers(50)
719
738
 
720
- const suggest = document.querySelector('shade-suggest') as HTMLElement
721
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
739
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
740
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
722
741
 
723
- const input = suggest?.querySelector('input') as HTMLInputElement
724
- input.value = 'First'
742
+ const input = suggest?.querySelector('input') as HTMLInputElement
743
+ input.value = 'First'
725
744
 
726
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
727
- Object.defineProperty(keyupEvent, 'target', { value: input })
728
- wrapper?.dispatchEvent(keyupEvent)
745
+ const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
746
+ Object.defineProperty(keyupEvent, 'target', { value: input })
747
+ wrapper?.dispatchEvent(keyupEvent)
729
748
 
730
- await advanceTimers(300)
749
+ await advanceTimers(300)
731
750
 
732
- const enterEvent = new KeyboardEvent('keyup', { key: 'Enter', bubbles: true })
733
- Object.defineProperty(enterEvent, 'target', { value: input })
734
- wrapper?.dispatchEvent(enterEvent)
751
+ const enterEvent = new KeyboardEvent('keyup', { key: 'Enter', bubbles: true })
752
+ Object.defineProperty(enterEvent, 'target', { value: input })
753
+ wrapper?.dispatchEvent(enterEvent)
735
754
 
736
- await advanceTimers(50)
755
+ await advanceTimers(50)
737
756
 
738
- expect(onSelectSuggestion).toHaveBeenCalledWith(expect.objectContaining({ name: 'First' }))
757
+ expect(onSelectSuggestion).toHaveBeenCalledWith(expect.objectContaining({ name: 'First' }))
758
+ })
739
759
  })
740
760
 
741
761
  it('should close after selecting a suggestion', async () => {
742
- const injector = new Injector()
743
- const rootElement = document.getElementById('root') as HTMLDivElement
744
- const onSelectSuggestion = vi.fn()
745
-
746
- initializeShadeRoot({
747
- injector,
748
- rootElement,
749
- jsxElement: (
750
- <Suggest<TestEntry>
751
- defaultPrefix="🔍"
752
- getEntries={getTestEntries}
753
- getSuggestionEntry={getSuggestionEntry}
754
- onSelectSuggestion={onSelectSuggestion}
755
- />
756
- ),
757
- })
762
+ await usingAsync(new Injector(), async (injector) => {
763
+ const rootElement = document.getElementById('root') as HTMLDivElement
764
+ const onSelectSuggestion = vi.fn()
765
+
766
+ initializeShadeRoot({
767
+ injector,
768
+ rootElement,
769
+ jsxElement: (
770
+ <Suggest<TestEntry>
771
+ defaultPrefix="🔍"
772
+ getEntries={getTestEntries}
773
+ getSuggestionEntry={getSuggestionEntry}
774
+ onSelectSuggestion={onSelectSuggestion}
775
+ />
776
+ ),
777
+ })
758
778
 
759
- await advanceTimers(50)
779
+ await advanceTimers(50)
760
780
 
761
- const suggest = document.querySelector('shade-suggest') as HTMLElement
762
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
781
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
782
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
763
783
 
764
- const input = suggest?.querySelector('input') as HTMLInputElement
765
- input.value = 'First'
784
+ const input = suggest?.querySelector('input') as HTMLInputElement
785
+ input.value = 'First'
766
786
 
767
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
768
- Object.defineProperty(keyupEvent, 'target', { value: input })
769
- wrapper?.dispatchEvent(keyupEvent)
787
+ const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
788
+ Object.defineProperty(keyupEvent, 'target', { value: input })
789
+ wrapper?.dispatchEvent(keyupEvent)
770
790
 
771
- await advanceTimers(300)
791
+ await advanceTimers(300)
772
792
 
773
- expect(suggest?.classList.contains('opened')).toBe(true)
793
+ expect(suggest?.hasAttribute('data-opened')).toBe(true)
774
794
 
775
- const enterEvent = new KeyboardEvent('keyup', { key: 'Enter', bubbles: true })
776
- Object.defineProperty(enterEvent, 'target', { value: input })
777
- wrapper?.dispatchEvent(enterEvent)
795
+ const enterEvent = new KeyboardEvent('keyup', { key: 'Enter', bubbles: true })
796
+ Object.defineProperty(enterEvent, 'target', { value: input })
797
+ wrapper?.dispatchEvent(enterEvent)
778
798
 
779
- await advanceTimers(50)
799
+ await advanceTimers(50)
780
800
 
781
- expect(suggest?.classList.contains('opened')).toBe(false)
801
+ expect(suggest?.hasAttribute('data-opened')).toBe(false)
802
+ })
782
803
  })
783
804
  })
784
805
 
785
806
  describe('sub-components', () => {
786
807
  it('should render SuggestInput component', async () => {
787
- const injector = new Injector()
788
- const rootElement = document.getElementById('root') as HTMLDivElement
789
- const onSelectSuggestion = vi.fn()
790
-
791
- initializeShadeRoot({
792
- injector,
793
- rootElement,
794
- jsxElement: (
795
- <Suggest<TestEntry>
796
- defaultPrefix="🔍"
797
- getEntries={getTestEntries}
798
- getSuggestionEntry={getSuggestionEntry}
799
- onSelectSuggestion={onSelectSuggestion}
800
- />
801
- ),
802
- })
808
+ await usingAsync(new Injector(), async (injector) => {
809
+ const rootElement = document.getElementById('root') as HTMLDivElement
810
+ const onSelectSuggestion = vi.fn()
811
+
812
+ initializeShadeRoot({
813
+ injector,
814
+ rootElement,
815
+ jsxElement: (
816
+ <Suggest<TestEntry>
817
+ defaultPrefix="🔍"
818
+ getEntries={getTestEntries}
819
+ getSuggestionEntry={getSuggestionEntry}
820
+ onSelectSuggestion={onSelectSuggestion}
821
+ />
822
+ ),
823
+ })
803
824
 
804
- await advanceTimers(50)
825
+ await advanceTimers(50)
805
826
 
806
- const suggest = document.querySelector('shade-suggest') as HTMLElement
807
- const suggestInput = suggest?.querySelector('shades-suggest-input')
808
- expect(suggestInput).not.toBeNull()
827
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
828
+ const suggestInput = suggest?.querySelector('shades-suggest-input')
829
+ expect(suggestInput).not.toBeNull()
830
+ })
809
831
  })
810
832
 
811
833
  it('should render SuggestionList component', async () => {
812
- const injector = new Injector()
813
- const rootElement = document.getElementById('root') as HTMLDivElement
814
- const onSelectSuggestion = vi.fn()
815
-
816
- initializeShadeRoot({
817
- injector,
818
- rootElement,
819
- jsxElement: (
820
- <Suggest<TestEntry>
821
- defaultPrefix="🔍"
822
- getEntries={getTestEntries}
823
- getSuggestionEntry={getSuggestionEntry}
824
- onSelectSuggestion={onSelectSuggestion}
825
- />
826
- ),
827
- })
834
+ await usingAsync(new Injector(), async (injector) => {
835
+ const rootElement = document.getElementById('root') as HTMLDivElement
836
+ const onSelectSuggestion = vi.fn()
837
+
838
+ initializeShadeRoot({
839
+ injector,
840
+ rootElement,
841
+ jsxElement: (
842
+ <Suggest<TestEntry>
843
+ defaultPrefix="🔍"
844
+ getEntries={getTestEntries}
845
+ getSuggestionEntry={getSuggestionEntry}
846
+ onSelectSuggestion={onSelectSuggestion}
847
+ />
848
+ ),
849
+ })
828
850
 
829
- await advanceTimers(50)
851
+ await advanceTimers(50)
830
852
 
831
- const suggest = document.querySelector('shade-suggest') as HTMLElement
832
- const suggestionList = suggest?.querySelector('shade-suggest-suggestion-list')
833
- expect(suggestionList).not.toBeNull()
853
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
854
+ const suggestionList = suggest?.querySelector('shade-suggest-suggestion-list')
855
+ expect(suggestionList).not.toBeNull()
856
+ })
834
857
  })
835
858
 
836
859
  it('should render Loader component', async () => {
837
- const injector = new Injector()
838
- const rootElement = document.getElementById('root') as HTMLDivElement
839
- const onSelectSuggestion = vi.fn()
840
-
841
- initializeShadeRoot({
842
- injector,
843
- rootElement,
844
- jsxElement: (
845
- <Suggest<TestEntry>
846
- defaultPrefix="🔍"
847
- getEntries={getTestEntries}
848
- getSuggestionEntry={getSuggestionEntry}
849
- onSelectSuggestion={onSelectSuggestion}
850
- />
851
- ),
852
- })
860
+ await usingAsync(new Injector(), async (injector) => {
861
+ const rootElement = document.getElementById('root') as HTMLDivElement
862
+ const onSelectSuggestion = vi.fn()
863
+
864
+ initializeShadeRoot({
865
+ injector,
866
+ rootElement,
867
+ jsxElement: (
868
+ <Suggest<TestEntry>
869
+ defaultPrefix="🔍"
870
+ getEntries={getTestEntries}
871
+ getSuggestionEntry={getSuggestionEntry}
872
+ onSelectSuggestion={onSelectSuggestion}
873
+ />
874
+ ),
875
+ })
853
876
 
854
- await advanceTimers(50)
877
+ await advanceTimers(50)
855
878
 
856
- const suggest = document.querySelector('shade-suggest') as HTMLElement
857
- const loader = suggest?.querySelector('shade-loader')
858
- expect(loader).not.toBeNull()
879
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
880
+ const loader = suggest?.querySelector('shade-loader')
881
+ expect(loader).not.toBeNull()
882
+ })
859
883
  })
860
884
  })
861
885
  })