@furystack/shades-common-components 11.0.0 → 12.0.0

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 (765) hide show
  1. package/CHANGELOG.md +430 -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 +332 -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 +454 -429
  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/css-variable-theme.d.ts +167 -1
  547. package/esm/services/css-variable-theme.d.ts.map +1 -1
  548. package/esm/services/css-variable-theme.js +102 -0
  549. package/esm/services/css-variable-theme.js.map +1 -1
  550. package/esm/services/css-variable-theme.spec.js +131 -1
  551. package/esm/services/css-variable-theme.spec.js.map +1 -1
  552. package/esm/services/default-dark-theme.d.ts +107 -2
  553. package/esm/services/default-dark-theme.d.ts.map +1 -1
  554. package/esm/services/default-dark-theme.js +87 -1
  555. package/esm/services/default-dark-theme.js.map +1 -1
  556. package/esm/services/default-light-theme.d.ts +107 -2
  557. package/esm/services/default-light-theme.d.ts.map +1 -1
  558. package/esm/services/default-light-theme.js +86 -0
  559. package/esm/services/default-light-theme.js.map +1 -1
  560. package/esm/services/index.d.ts +6 -2
  561. package/esm/services/index.d.ts.map +1 -1
  562. package/esm/services/index.js +6 -2
  563. package/esm/services/index.js.map +1 -1
  564. package/esm/services/layout-service.d.ts +217 -0
  565. package/esm/services/layout-service.d.ts.map +1 -0
  566. package/esm/services/layout-service.js +331 -0
  567. package/esm/services/layout-service.js.map +1 -0
  568. package/esm/services/layout-service.spec.d.ts +2 -0
  569. package/esm/services/layout-service.spec.d.ts.map +1 -0
  570. package/esm/services/layout-service.spec.js +425 -0
  571. package/esm/services/layout-service.spec.js.map +1 -0
  572. package/esm/services/list-service.d.ts +31 -0
  573. package/esm/services/list-service.d.ts.map +1 -0
  574. package/esm/services/list-service.js +149 -0
  575. package/esm/services/list-service.js.map +1 -0
  576. package/esm/services/list-service.spec.d.ts +2 -0
  577. package/esm/services/list-service.spec.d.ts.map +1 -0
  578. package/esm/services/list-service.spec.js +254 -0
  579. package/esm/services/list-service.spec.js.map +1 -0
  580. package/esm/services/palette-css-vars.d.ts +12 -0
  581. package/esm/services/palette-css-vars.d.ts.map +1 -0
  582. package/esm/services/palette-css-vars.js +44 -0
  583. package/esm/services/palette-css-vars.js.map +1 -0
  584. package/esm/services/theme-provider-service.d.ts +387 -2
  585. package/esm/services/theme-provider-service.d.ts.map +1 -1
  586. package/esm/services/theme-provider-service.js.map +1 -1
  587. package/esm/services/tree-service.d.ts +61 -0
  588. package/esm/services/tree-service.d.ts.map +1 -0
  589. package/esm/services/tree-service.js +149 -0
  590. package/esm/services/tree-service.js.map +1 -0
  591. package/esm/services/tree-service.spec.d.ts +2 -0
  592. package/esm/services/tree-service.spec.d.ts.map +1 -0
  593. package/esm/services/tree-service.spec.js +307 -0
  594. package/esm/services/tree-service.spec.js.map +1 -0
  595. package/esm/utils/promisify-animation.d.ts.map +1 -1
  596. package/esm/utils/promisify-animation.js +6 -1
  597. package/esm/utils/promisify-animation.js.map +1 -1
  598. package/package.json +4 -4
  599. package/src/components/accordion/accordion-item.tsx +197 -0
  600. package/src/components/accordion/accordion.spec.tsx +418 -0
  601. package/src/components/accordion/accordion.tsx +50 -0
  602. package/src/components/accordion/index.ts +2 -0
  603. package/src/components/alert.spec.tsx +256 -0
  604. package/src/components/alert.tsx +186 -0
  605. package/src/components/app-bar-link.spec.tsx +22 -19
  606. package/src/components/app-bar-link.tsx +29 -10
  607. package/src/components/app-bar.spec.tsx +73 -58
  608. package/src/components/app-bar.tsx +19 -12
  609. package/src/components/avatar.tsx +46 -47
  610. package/src/components/badge.spec.tsx +228 -0
  611. package/src/components/badge.tsx +104 -0
  612. package/src/components/breadcrumb.spec.tsx +396 -0
  613. package/src/components/breadcrumb.tsx +188 -0
  614. package/src/components/button-group.spec.tsx +611 -0
  615. package/src/components/button-group.tsx +423 -0
  616. package/src/components/button.spec.tsx +257 -67
  617. package/src/components/button.tsx +130 -80
  618. package/src/components/card.spec.tsx +389 -0
  619. package/src/components/card.tsx +261 -0
  620. package/src/components/carousel.spec.tsx +894 -0
  621. package/src/components/carousel.tsx +376 -0
  622. package/src/components/chip.spec.tsx +200 -0
  623. package/src/components/chip.tsx +188 -0
  624. package/src/components/circular-progress.spec.tsx +289 -0
  625. package/src/components/circular-progress.tsx +145 -0
  626. package/src/components/command-palette/command-palette-input.spec.tsx +209 -198
  627. package/src/components/command-palette/command-palette-input.tsx +25 -9
  628. package/src/components/command-palette/command-palette-manager.spec.ts +132 -117
  629. package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +348 -330
  630. package/src/components/command-palette/command-palette-suggestion-list.tsx +22 -20
  631. package/src/components/command-palette/index.spec.tsx +12 -12
  632. package/src/components/command-palette/index.tsx +25 -102
  633. package/src/components/context-menu/context-menu-item.tsx +85 -0
  634. package/src/components/context-menu/context-menu-manager.spec.ts +478 -0
  635. package/src/components/context-menu/context-menu-manager.ts +148 -0
  636. package/src/components/context-menu/context-menu.spec.tsx +352 -0
  637. package/src/components/context-menu/context-menu.tsx +116 -0
  638. package/src/components/context-menu/index.ts +3 -0
  639. package/src/components/data-grid/body.spec.tsx +292 -278
  640. package/src/components/data-grid/data-grid-row.spec.tsx +165 -140
  641. package/src/components/data-grid/data-grid-row.tsx +72 -55
  642. package/src/components/data-grid/data-grid.spec.tsx +743 -718
  643. package/src/components/data-grid/data-grid.tsx +19 -15
  644. package/src/components/data-grid/footer.spec.tsx +249 -237
  645. package/src/components/data-grid/header.spec.tsx +374 -351
  646. package/src/components/data-grid/header.tsx +58 -39
  647. package/src/components/data-grid/selection-cell.spec.tsx +46 -45
  648. package/src/components/data-grid/selection-cell.tsx +2 -6
  649. package/src/components/dialog.spec.tsx +135 -0
  650. package/src/components/dialog.tsx +277 -0
  651. package/src/components/divider.spec.tsx +197 -0
  652. package/src/components/divider.tsx +147 -0
  653. package/src/components/drawer/drawer-toggle-button.spec.tsx +374 -0
  654. package/src/components/drawer/drawer-toggle-button.tsx +124 -0
  655. package/src/components/drawer/index.spec.tsx +748 -0
  656. package/src/components/drawer/index.tsx +227 -0
  657. package/src/components/dropdown.spec.tsx +445 -0
  658. package/src/components/dropdown.tsx +343 -0
  659. package/src/components/fab.spec.tsx +51 -40
  660. package/src/components/fab.tsx +32 -9
  661. package/src/components/form.spec.tsx +303 -293
  662. package/src/components/form.tsx +10 -7
  663. package/src/components/grid.spec.tsx +276 -183
  664. package/src/components/grid.tsx +10 -10
  665. package/src/components/icons/icon-definitions.spec.ts +68 -0
  666. package/src/components/icons/icon-definitions.ts +509 -0
  667. package/src/components/icons/icon-types.ts +48 -0
  668. package/src/components/icons/icon.spec.tsx +314 -0
  669. package/src/components/icons/icon.tsx +111 -0
  670. package/src/components/icons/index.ts +4 -0
  671. package/src/components/image.spec.tsx +748 -0
  672. package/src/components/image.tsx +520 -0
  673. package/src/components/index.ts +32 -4
  674. package/src/components/inputs/autocomplete.spec.tsx +10 -1
  675. package/src/components/inputs/autocomplete.tsx +13 -7
  676. package/src/components/inputs/checkbox.spec.tsx +377 -0
  677. package/src/components/inputs/checkbox.tsx +198 -0
  678. package/src/components/inputs/index.ts +7 -0
  679. package/src/components/inputs/input-number.spec.tsx +686 -0
  680. package/src/components/inputs/input-number.tsx +387 -0
  681. package/src/components/inputs/input.spec.tsx +544 -508
  682. package/src/components/inputs/input.tsx +91 -132
  683. package/src/components/inputs/radio-group.spec.tsx +281 -0
  684. package/src/components/inputs/radio-group.tsx +108 -0
  685. package/src/components/inputs/radio.spec.tsx +273 -0
  686. package/src/components/inputs/radio.tsx +199 -0
  687. package/src/components/inputs/select.spec.tsx +1237 -0
  688. package/src/components/inputs/select.tsx +775 -0
  689. package/src/components/inputs/slider.spec.tsx +1020 -0
  690. package/src/components/inputs/slider.tsx +696 -0
  691. package/src/components/inputs/switch.spec.tsx +410 -0
  692. package/src/components/inputs/switch.tsx +218 -0
  693. package/src/components/inputs/text-area.spec.tsx +186 -171
  694. package/src/components/inputs/text-area.tsx +13 -19
  695. package/src/components/linear-progress.spec.tsx +320 -0
  696. package/src/components/linear-progress.tsx +127 -0
  697. package/src/components/list/index.ts +2 -0
  698. package/src/components/list/list-item.tsx +106 -0
  699. package/src/components/list/list.spec.tsx +817 -0
  700. package/src/components/list/list.tsx +92 -0
  701. package/src/components/loader.spec.tsx +220 -204
  702. package/src/components/loader.tsx +17 -9
  703. package/src/components/menu/index.ts +2 -0
  704. package/src/components/menu/menu-types.spec.ts +122 -0
  705. package/src/components/menu/menu-types.ts +43 -0
  706. package/src/components/menu/menu.spec.tsx +483 -0
  707. package/src/components/menu/menu.tsx +326 -0
  708. package/src/components/modal.spec.tsx +65 -55
  709. package/src/components/modal.tsx +9 -6
  710. package/src/components/noty-list.spec.tsx +78 -75
  711. package/src/components/noty-list.tsx +76 -68
  712. package/src/components/page-container/index.spec.tsx +274 -0
  713. package/src/components/page-container/index.tsx +82 -0
  714. package/src/components/page-container/page-header.spec.tsx +308 -0
  715. package/src/components/page-container/page-header.tsx +127 -0
  716. package/src/components/page-layout/index.spec.tsx +882 -0
  717. package/src/components/page-layout/index.tsx +392 -0
  718. package/src/components/pagination.spec.tsx +275 -0
  719. package/src/components/pagination.tsx +249 -0
  720. package/src/components/paper.spec.tsx +26 -18
  721. package/src/components/paper.tsx +12 -10
  722. package/src/components/rating.spec.tsx +866 -0
  723. package/src/components/rating.tsx +286 -0
  724. package/src/components/result.spec.tsx +221 -0
  725. package/src/components/result.tsx +155 -0
  726. package/src/components/searchable-input-styles.ts +81 -0
  727. package/src/components/skeleton.spec.tsx +126 -118
  728. package/src/components/skeleton.tsx +23 -6
  729. package/src/components/styles.spec.ts +27 -28
  730. package/src/components/styles.tsx +15 -13
  731. package/src/components/suggest/index.spec.tsx +611 -587
  732. package/src/components/suggest/index.tsx +28 -95
  733. package/src/components/suggest/suggest-input.spec.tsx +95 -81
  734. package/src/components/suggest/suggest-input.tsx +9 -7
  735. package/src/components/suggest/suggest-manager.spec.ts +103 -93
  736. package/src/components/suggest/suggestion-list.spec.tsx +194 -173
  737. package/src/components/suggest/suggestion-list.tsx +23 -22
  738. package/src/components/tabs.spec.tsx +369 -7
  739. package/src/components/tabs.tsx +221 -18
  740. package/src/components/timeline.spec.tsx +294 -0
  741. package/src/components/timeline.tsx +221 -0
  742. package/src/components/tooltip.spec.tsx +223 -0
  743. package/src/components/tooltip.tsx +155 -0
  744. package/src/components/tree/index.ts +2 -0
  745. package/src/components/tree/tree-item.tsx +161 -0
  746. package/src/components/tree/tree.spec.tsx +677 -0
  747. package/src/components/tree/tree.tsx +111 -0
  748. package/src/components/typography.spec.tsx +235 -0
  749. package/src/components/typography.tsx +292 -0
  750. package/src/components/wizard/index.spec.tsx +77 -68
  751. package/src/services/click-away-service.ts +9 -3
  752. package/src/services/css-variable-theme.spec.ts +169 -1
  753. package/src/services/css-variable-theme.ts +107 -2
  754. package/src/services/default-dark-theme.ts +89 -3
  755. package/src/services/default-light-theme.ts +88 -2
  756. package/src/services/index.ts +6 -2
  757. package/src/services/layout-service.spec.ts +535 -0
  758. package/src/services/layout-service.ts +391 -0
  759. package/src/services/list-service.spec.ts +364 -0
  760. package/src/services/list-service.ts +169 -0
  761. package/src/services/palette-css-vars.ts +46 -0
  762. package/src/services/theme-provider-service.ts +246 -1
  763. package/src/services/tree-service.spec.ts +428 -0
  764. package/src/services/tree-service.ts +179 -0
  765. package/src/utils/promisify-animation.ts +7 -1
@@ -1,6 +1,6 @@
1
1
  import { Injector } from '@furystack/inject';
2
2
  import { createComponent, initializeShadeRoot } from '@furystack/shades';
3
- import { ObservableValue, sleepAsync } from '@furystack/utils';
3
+ import { ObservableValue, sleepAsync, usingAsync } from '@furystack/utils';
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
5
  import { CollectionService } from '../../services/collection-service.js';
6
6
  import { DataGrid } from './data-grid.js';
@@ -25,519 +25,544 @@ describe('DataGrid', () => {
25
25
  };
26
26
  describe('rendering', () => {
27
27
  it('should render with columns', async () => {
28
- const injector = new Injector();
29
- const rootElement = document.getElementById('root');
30
- const service = createTestService();
31
- const findOptions = new ObservableValue({});
32
- initializeShadeRoot({
33
- injector,
34
- rootElement,
35
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
28
+ await usingAsync(new Injector(), async (injector) => {
29
+ const rootElement = document.getElementById('root');
30
+ const service = createTestService();
31
+ const findOptions = new ObservableValue({});
32
+ initializeShadeRoot({
33
+ injector,
34
+ rootElement,
35
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
36
+ });
37
+ await sleepAsync(50);
38
+ const grid = document.querySelector('shade-data-grid');
39
+ expect(grid).not.toBeNull();
40
+ const headers = grid?.querySelectorAll('th');
41
+ expect(headers?.length).toBe(2);
42
+ service[Symbol.dispose]();
43
+ findOptions[Symbol.dispose]();
36
44
  });
37
- await sleepAsync(50);
38
- const grid = document.querySelector('shade-data-grid');
39
- expect(grid).not.toBeNull();
40
- const headers = grid?.querySelectorAll('th');
41
- expect(headers?.length).toBe(2);
42
- service[Symbol.dispose]();
43
- findOptions[Symbol.dispose]();
44
45
  });
45
46
  it('should render table structure', async () => {
46
- const injector = new Injector();
47
- const rootElement = document.getElementById('root');
48
- const service = createTestService();
49
- const findOptions = new ObservableValue({});
50
- initializeShadeRoot({
51
- injector,
52
- rootElement,
53
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
47
+ await usingAsync(new Injector(), async (injector) => {
48
+ const rootElement = document.getElementById('root');
49
+ const service = createTestService();
50
+ const findOptions = new ObservableValue({});
51
+ initializeShadeRoot({
52
+ injector,
53
+ rootElement,
54
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
55
+ });
56
+ await sleepAsync(50);
57
+ const grid = document.querySelector('shade-data-grid');
58
+ const table = grid?.querySelector('table');
59
+ const thead = grid?.querySelector('thead');
60
+ const tbody = grid?.querySelector('tbody');
61
+ expect(table).not.toBeNull();
62
+ expect(thead).not.toBeNull();
63
+ expect(tbody).not.toBeNull();
64
+ service[Symbol.dispose]();
65
+ findOptions[Symbol.dispose]();
54
66
  });
55
- await sleepAsync(50);
56
- const grid = document.querySelector('shade-data-grid');
57
- const table = grid?.querySelector('table');
58
- const thead = grid?.querySelector('thead');
59
- const tbody = grid?.querySelector('tbody');
60
- expect(table).not.toBeNull();
61
- expect(thead).not.toBeNull();
62
- expect(tbody).not.toBeNull();
63
- service[Symbol.dispose]();
64
- findOptions[Symbol.dispose]();
65
67
  });
66
68
  it('should render custom header components when provided', async () => {
67
- const injector = new Injector();
68
- const rootElement = document.getElementById('root');
69
- const service = createTestService();
70
- const findOptions = new ObservableValue({});
71
- initializeShadeRoot({
72
- injector,
73
- rootElement,
74
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {
75
- id: () => createComponent("span", { "data-testid": "custom-header-id" }, "Custom ID Header"),
76
- }, rowComponents: {} })),
69
+ await usingAsync(new Injector(), async (injector) => {
70
+ const rootElement = document.getElementById('root');
71
+ const service = createTestService();
72
+ const findOptions = new ObservableValue({});
73
+ initializeShadeRoot({
74
+ injector,
75
+ rootElement,
76
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {
77
+ id: () => createComponent("span", { "data-testid": "custom-header-id" }, "Custom ID Header"),
78
+ }, rowComponents: {} })),
79
+ });
80
+ await sleepAsync(50);
81
+ const grid = document.querySelector('shade-data-grid');
82
+ const customHeader = grid?.querySelector('[data-testid="custom-header-id"]');
83
+ expect(customHeader).not.toBeNull();
84
+ expect(customHeader?.textContent).toBe('Custom ID Header');
85
+ service[Symbol.dispose]();
86
+ findOptions[Symbol.dispose]();
77
87
  });
78
- await sleepAsync(50);
79
- const grid = document.querySelector('shade-data-grid');
80
- const customHeader = grid?.querySelector('[data-testid="custom-header-id"]');
81
- expect(customHeader).not.toBeNull();
82
- expect(customHeader?.textContent).toBe('Custom ID Header');
83
- service[Symbol.dispose]();
84
- findOptions[Symbol.dispose]();
85
88
  });
86
89
  it('should render default header components from headerComponents.default', async () => {
87
- const injector = new Injector();
88
- const rootElement = document.getElementById('root');
89
- const service = createTestService();
90
- const findOptions = new ObservableValue({});
91
- initializeShadeRoot({
92
- injector,
93
- rootElement,
94
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {
95
- default: (name) => createComponent("span", { "data-testid": `default-header-${name}` },
96
- "Default: ",
97
- name),
98
- }, rowComponents: {} })),
90
+ await usingAsync(new Injector(), async (injector) => {
91
+ const rootElement = document.getElementById('root');
92
+ const service = createTestService();
93
+ const findOptions = new ObservableValue({});
94
+ initializeShadeRoot({
95
+ injector,
96
+ rootElement,
97
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {
98
+ default: (name) => createComponent("span", { "data-testid": `default-header-${name}` },
99
+ "Default: ",
100
+ name),
101
+ }, rowComponents: {} })),
102
+ });
103
+ await sleepAsync(50);
104
+ const grid = document.querySelector('shade-data-grid');
105
+ const defaultHeaderId = grid?.querySelector('[data-testid="default-header-id"]');
106
+ const defaultHeaderName = grid?.querySelector('[data-testid="default-header-name"]');
107
+ expect(defaultHeaderId?.textContent).toBe('Default: id');
108
+ expect(defaultHeaderName?.textContent).toBe('Default: name');
109
+ service[Symbol.dispose]();
110
+ findOptions[Symbol.dispose]();
99
111
  });
100
- await sleepAsync(50);
101
- const grid = document.querySelector('shade-data-grid');
102
- const defaultHeaderId = grid?.querySelector('[data-testid="default-header-id"]');
103
- const defaultHeaderName = grid?.querySelector('[data-testid="default-header-name"]');
104
- expect(defaultHeaderId?.textContent).toBe('Default: id');
105
- expect(defaultHeaderName?.textContent).toBe('Default: name');
106
- service[Symbol.dispose]();
107
- findOptions[Symbol.dispose]();
108
112
  });
109
113
  it('should render DataGridHeader when no custom header is provided', async () => {
110
- const injector = new Injector();
111
- const rootElement = document.getElementById('root');
112
- const service = createTestService();
113
- const findOptions = new ObservableValue({});
114
- initializeShadeRoot({
115
- injector,
116
- rootElement,
117
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
114
+ await usingAsync(new Injector(), async (injector) => {
115
+ const rootElement = document.getElementById('root');
116
+ const service = createTestService();
117
+ const findOptions = new ObservableValue({});
118
+ initializeShadeRoot({
119
+ injector,
120
+ rootElement,
121
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
122
+ });
123
+ await sleepAsync(50);
124
+ const grid = document.querySelector('shade-data-grid');
125
+ const defaultHeaders = grid?.querySelectorAll('data-grid-header');
126
+ expect(defaultHeaders?.length).toBe(2);
127
+ service[Symbol.dispose]();
128
+ findOptions[Symbol.dispose]();
118
129
  });
119
- await sleepAsync(50);
120
- const grid = document.querySelector('shade-data-grid');
121
- const defaultHeaders = grid?.querySelectorAll('data-grid-header');
122
- expect(defaultHeaders?.length).toBe(2);
123
- service[Symbol.dispose]();
124
- findOptions[Symbol.dispose]();
125
130
  });
126
131
  });
127
132
  describe('focus management', () => {
128
133
  it('should set focus on click', async () => {
129
- const injector = new Injector();
130
- const rootElement = document.getElementById('root');
131
- const service = createTestService();
132
- const findOptions = new ObservableValue({});
133
- expect(service.hasFocus.getValue()).toBe(false);
134
- initializeShadeRoot({
135
- injector,
136
- rootElement,
137
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
134
+ await usingAsync(new Injector(), async (injector) => {
135
+ const rootElement = document.getElementById('root');
136
+ const service = createTestService();
137
+ const findOptions = new ObservableValue({});
138
+ expect(service.hasFocus.getValue()).toBe(false);
139
+ initializeShadeRoot({
140
+ injector,
141
+ rootElement,
142
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
143
+ });
144
+ await sleepAsync(50);
145
+ const grid = document.querySelector('shade-data-grid');
146
+ const wrapper = grid?.querySelector('.shade-grid-wrapper');
147
+ wrapper?.click();
148
+ expect(service.hasFocus.getValue()).toBe(true);
149
+ service[Symbol.dispose]();
150
+ findOptions[Symbol.dispose]();
138
151
  });
139
- await sleepAsync(50);
140
- const grid = document.querySelector('shade-data-grid');
141
- const wrapper = grid?.querySelector('.shade-grid-wrapper');
142
- wrapper?.click();
143
- expect(service.hasFocus.getValue()).toBe(true);
144
- service[Symbol.dispose]();
145
- findOptions[Symbol.dispose]();
146
152
  });
147
153
  it('should lose focus on click outside', async () => {
148
- const injector = new Injector();
149
- const rootElement = document.getElementById('root');
150
- const service = createTestService();
151
- const findOptions = new ObservableValue({});
152
- initializeShadeRoot({
153
- injector,
154
- rootElement,
155
- jsxElement: (createComponent(createComponent, null,
156
- createComponent("div", { "data-testid": "outside" }, "Outside"),
157
- createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} }))),
154
+ await usingAsync(new Injector(), async (injector) => {
155
+ const rootElement = document.getElementById('root');
156
+ const service = createTestService();
157
+ const findOptions = new ObservableValue({});
158
+ initializeShadeRoot({
159
+ injector,
160
+ rootElement,
161
+ jsxElement: (createComponent(createComponent, null,
162
+ createComponent("div", { "data-testid": "outside" }, "Outside"),
163
+ createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} }))),
164
+ });
165
+ await sleepAsync(50);
166
+ const grid = document.querySelector('shade-data-grid');
167
+ const wrapper = grid?.querySelector('.shade-grid-wrapper');
168
+ wrapper?.click();
169
+ expect(service.hasFocus.getValue()).toBe(true);
170
+ const outside = document.querySelector('[data-testid="outside"]');
171
+ outside?.dispatchEvent(new MouseEvent('click', { bubbles: true }));
172
+ expect(service.hasFocus.getValue()).toBe(false);
173
+ service[Symbol.dispose]();
174
+ findOptions[Symbol.dispose]();
158
175
  });
159
- await sleepAsync(50);
160
- const grid = document.querySelector('shade-data-grid');
161
- const wrapper = grid?.querySelector('.shade-grid-wrapper');
162
- wrapper?.click();
163
- expect(service.hasFocus.getValue()).toBe(true);
164
- const outside = document.querySelector('[data-testid="outside"]');
165
- outside?.dispatchEvent(new MouseEvent('click', { bubbles: true }));
166
- expect(service.hasFocus.getValue()).toBe(false);
167
- service[Symbol.dispose]();
168
- findOptions[Symbol.dispose]();
169
176
  });
170
177
  });
171
178
  describe('keyboard navigation', () => {
172
179
  it('should handle ArrowDown to move focus to next entry', async () => {
173
- const injector = new Injector();
174
- const rootElement = document.getElementById('root');
175
- const service = createTestService();
176
- const findOptions = new ObservableValue({});
177
- service.hasFocus.setValue(true);
178
- service.focusedEntry.setValue(service.data.getValue().entries[0]);
179
- initializeShadeRoot({
180
- injector,
181
- rootElement,
182
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
180
+ await usingAsync(new Injector(), async (injector) => {
181
+ const rootElement = document.getElementById('root');
182
+ const service = createTestService();
183
+ const findOptions = new ObservableValue({});
184
+ service.hasFocus.setValue(true);
185
+ service.focusedEntry.setValue(service.data.getValue().entries[0]);
186
+ initializeShadeRoot({
187
+ injector,
188
+ rootElement,
189
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
190
+ });
191
+ await sleepAsync(50);
192
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true });
193
+ window.dispatchEvent(keydownEvent);
194
+ expect(service.focusedEntry.getValue()).toEqual({ id: 2, name: 'Second' });
195
+ service[Symbol.dispose]();
196
+ findOptions[Symbol.dispose]();
183
197
  });
184
- await sleepAsync(50);
185
- const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true });
186
- window.dispatchEvent(keydownEvent);
187
- expect(service.focusedEntry.getValue()).toEqual({ id: 2, name: 'Second' });
188
- service[Symbol.dispose]();
189
- findOptions[Symbol.dispose]();
190
198
  });
191
199
  it('should handle ArrowUp to move focus to previous entry', async () => {
192
- const injector = new Injector();
193
- const rootElement = document.getElementById('root');
194
- const service = createTestService();
195
- const findOptions = new ObservableValue({});
196
- service.hasFocus.setValue(true);
197
- service.focusedEntry.setValue(service.data.getValue().entries[1]);
198
- initializeShadeRoot({
199
- injector,
200
- rootElement,
201
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
200
+ await usingAsync(new Injector(), async (injector) => {
201
+ const rootElement = document.getElementById('root');
202
+ const service = createTestService();
203
+ const findOptions = new ObservableValue({});
204
+ service.hasFocus.setValue(true);
205
+ service.focusedEntry.setValue(service.data.getValue().entries[1]);
206
+ initializeShadeRoot({
207
+ injector,
208
+ rootElement,
209
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
210
+ });
211
+ await sleepAsync(50);
212
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true });
213
+ window.dispatchEvent(keydownEvent);
214
+ expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' });
215
+ service[Symbol.dispose]();
216
+ findOptions[Symbol.dispose]();
202
217
  });
203
- await sleepAsync(50);
204
- const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true });
205
- window.dispatchEvent(keydownEvent);
206
- expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' });
207
- service[Symbol.dispose]();
208
- findOptions[Symbol.dispose]();
209
218
  });
210
219
  it('should handle Home to move focus to first entry', async () => {
211
- const injector = new Injector();
212
- const rootElement = document.getElementById('root');
213
- const service = createTestService();
214
- const findOptions = new ObservableValue({});
215
- service.hasFocus.setValue(true);
216
- service.focusedEntry.setValue(service.data.getValue().entries[2]);
217
- initializeShadeRoot({
218
- injector,
219
- rootElement,
220
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
220
+ await usingAsync(new Injector(), async (injector) => {
221
+ const rootElement = document.getElementById('root');
222
+ const service = createTestService();
223
+ const findOptions = new ObservableValue({});
224
+ service.hasFocus.setValue(true);
225
+ service.focusedEntry.setValue(service.data.getValue().entries[2]);
226
+ initializeShadeRoot({
227
+ injector,
228
+ rootElement,
229
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
230
+ });
231
+ await sleepAsync(50);
232
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'Home', bubbles: true });
233
+ window.dispatchEvent(keydownEvent);
234
+ expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' });
235
+ service[Symbol.dispose]();
236
+ findOptions[Symbol.dispose]();
221
237
  });
222
- await sleepAsync(50);
223
- const keydownEvent = new KeyboardEvent('keydown', { key: 'Home', bubbles: true });
224
- window.dispatchEvent(keydownEvent);
225
- expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' });
226
- service[Symbol.dispose]();
227
- findOptions[Symbol.dispose]();
228
238
  });
229
239
  it('should handle End to move focus to last entry', async () => {
230
- const injector = new Injector();
231
- const rootElement = document.getElementById('root');
232
- const service = createTestService();
233
- const findOptions = new ObservableValue({});
234
- service.hasFocus.setValue(true);
235
- service.focusedEntry.setValue(service.data.getValue().entries[0]);
236
- initializeShadeRoot({
237
- injector,
238
- rootElement,
239
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
240
+ await usingAsync(new Injector(), async (injector) => {
241
+ const rootElement = document.getElementById('root');
242
+ const service = createTestService();
243
+ const findOptions = new ObservableValue({});
244
+ service.hasFocus.setValue(true);
245
+ service.focusedEntry.setValue(service.data.getValue().entries[0]);
246
+ initializeShadeRoot({
247
+ injector,
248
+ rootElement,
249
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
250
+ });
251
+ await sleepAsync(50);
252
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'End', bubbles: true });
253
+ window.dispatchEvent(keydownEvent);
254
+ expect(service.focusedEntry.getValue()).toEqual({ id: 3, name: 'Third' });
255
+ service[Symbol.dispose]();
256
+ findOptions[Symbol.dispose]();
240
257
  });
241
- await sleepAsync(50);
242
- const keydownEvent = new KeyboardEvent('keydown', { key: 'End', bubbles: true });
243
- window.dispatchEvent(keydownEvent);
244
- expect(service.focusedEntry.getValue()).toEqual({ id: 3, name: 'Third' });
245
- service[Symbol.dispose]();
246
- findOptions[Symbol.dispose]();
247
258
  });
248
259
  it('should handle Tab to toggle focus', async () => {
249
- const injector = new Injector();
250
- const rootElement = document.getElementById('root');
251
- const service = createTestService();
252
- const findOptions = new ObservableValue({});
253
- service.hasFocus.setValue(true);
254
- initializeShadeRoot({
255
- injector,
256
- rootElement,
257
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
260
+ await usingAsync(new Injector(), async (injector) => {
261
+ const rootElement = document.getElementById('root');
262
+ const service = createTestService();
263
+ const findOptions = new ObservableValue({});
264
+ service.hasFocus.setValue(true);
265
+ initializeShadeRoot({
266
+ injector,
267
+ rootElement,
268
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
269
+ });
270
+ await sleepAsync(50);
271
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'Tab', bubbles: true });
272
+ window.dispatchEvent(keydownEvent);
273
+ expect(service.hasFocus.getValue()).toBe(false);
274
+ service[Symbol.dispose]();
275
+ findOptions[Symbol.dispose]();
258
276
  });
259
- await sleepAsync(50);
260
- const keydownEvent = new KeyboardEvent('keydown', { key: 'Tab', bubbles: true });
261
- window.dispatchEvent(keydownEvent);
262
- expect(service.hasFocus.getValue()).toBe(false);
263
- service[Symbol.dispose]();
264
- findOptions[Symbol.dispose]();
265
277
  });
266
278
  it('should handle Escape to clear selection and search', async () => {
267
- const injector = new Injector();
268
- const rootElement = document.getElementById('root');
269
- const service = createTestService();
270
- const findOptions = new ObservableValue({});
271
- const { entries } = service.data.getValue();
272
- service.hasFocus.setValue(true);
273
- service.selection.setValue([entries[0], entries[1]]);
274
- service.searchTerm.setValue('test');
275
- initializeShadeRoot({
276
- injector,
277
- rootElement,
278
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
279
+ await usingAsync(new Injector(), async (injector) => {
280
+ const rootElement = document.getElementById('root');
281
+ const service = createTestService();
282
+ const findOptions = new ObservableValue({});
283
+ const { entries } = service.data.getValue();
284
+ service.hasFocus.setValue(true);
285
+ service.selection.setValue([entries[0], entries[1]]);
286
+ service.searchTerm.setValue('test');
287
+ initializeShadeRoot({
288
+ injector,
289
+ rootElement,
290
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
291
+ });
292
+ await sleepAsync(50);
293
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'Escape', bubbles: true });
294
+ window.dispatchEvent(keydownEvent);
295
+ expect(service.selection.getValue()).toEqual([]);
296
+ expect(service.searchTerm.getValue()).toBe('');
297
+ service[Symbol.dispose]();
298
+ findOptions[Symbol.dispose]();
279
299
  });
280
- await sleepAsync(50);
281
- const keydownEvent = new KeyboardEvent('keydown', { key: 'Escape', bubbles: true });
282
- window.dispatchEvent(keydownEvent);
283
- expect(service.selection.getValue()).toEqual([]);
284
- expect(service.searchTerm.getValue()).toBe('');
285
- service[Symbol.dispose]();
286
- findOptions[Symbol.dispose]();
287
300
  });
288
301
  it('should handle Space to toggle selection of focused entry', async () => {
289
- const injector = new Injector();
290
- const rootElement = document.getElementById('root');
291
- const service = createTestService();
292
- const findOptions = new ObservableValue({});
293
- const { entries } = service.data.getValue();
294
- service.hasFocus.setValue(true);
295
- service.focusedEntry.setValue(entries[0]);
296
- initializeShadeRoot({
297
- injector,
298
- rootElement,
299
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
302
+ await usingAsync(new Injector(), async (injector) => {
303
+ const rootElement = document.getElementById('root');
304
+ const service = createTestService();
305
+ const findOptions = new ObservableValue({});
306
+ const { entries } = service.data.getValue();
307
+ service.hasFocus.setValue(true);
308
+ service.focusedEntry.setValue(entries[0]);
309
+ initializeShadeRoot({
310
+ injector,
311
+ rootElement,
312
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
313
+ });
314
+ await sleepAsync(50);
315
+ const keydownEvent = new KeyboardEvent('keydown', { key: ' ', bubbles: true });
316
+ window.dispatchEvent(keydownEvent);
317
+ expect(service.selection.getValue()).toContain(entries[0]);
318
+ window.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true }));
319
+ expect(service.selection.getValue()).not.toContain(entries[0]);
320
+ service[Symbol.dispose]();
321
+ findOptions[Symbol.dispose]();
300
322
  });
301
- await sleepAsync(50);
302
- const keydownEvent = new KeyboardEvent('keydown', { key: ' ', bubbles: true });
303
- window.dispatchEvent(keydownEvent);
304
- expect(service.selection.getValue()).toContain(entries[0]);
305
- window.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true }));
306
- expect(service.selection.getValue()).not.toContain(entries[0]);
307
- service[Symbol.dispose]();
308
- findOptions[Symbol.dispose]();
309
323
  });
310
324
  it('should handle + to select all entries', async () => {
311
- const injector = new Injector();
312
- const rootElement = document.getElementById('root');
313
- const service = createTestService();
314
- const findOptions = new ObservableValue({});
315
- service.hasFocus.setValue(true);
316
- initializeShadeRoot({
317
- injector,
318
- rootElement,
319
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
325
+ await usingAsync(new Injector(), async (injector) => {
326
+ const rootElement = document.getElementById('root');
327
+ const service = createTestService();
328
+ const findOptions = new ObservableValue({});
329
+ service.hasFocus.setValue(true);
330
+ initializeShadeRoot({
331
+ injector,
332
+ rootElement,
333
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
334
+ });
335
+ await sleepAsync(50);
336
+ const keydownEvent = new KeyboardEvent('keydown', { key: '+', bubbles: true });
337
+ window.dispatchEvent(keydownEvent);
338
+ expect(service.selection.getValue().length).toBe(3);
339
+ service[Symbol.dispose]();
340
+ findOptions[Symbol.dispose]();
320
341
  });
321
- await sleepAsync(50);
322
- const keydownEvent = new KeyboardEvent('keydown', { key: '+', bubbles: true });
323
- window.dispatchEvent(keydownEvent);
324
- expect(service.selection.getValue().length).toBe(3);
325
- service[Symbol.dispose]();
326
- findOptions[Symbol.dispose]();
327
342
  });
328
343
  it('should handle - to deselect all entries', async () => {
329
- const injector = new Injector();
330
- const rootElement = document.getElementById('root');
331
- const service = createTestService();
332
- const findOptions = new ObservableValue({});
333
- const { entries } = service.data.getValue();
334
- service.hasFocus.setValue(true);
335
- service.selection.setValue([...entries]);
336
- initializeShadeRoot({
337
- injector,
338
- rootElement,
339
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
344
+ await usingAsync(new Injector(), async (injector) => {
345
+ const rootElement = document.getElementById('root');
346
+ const service = createTestService();
347
+ const findOptions = new ObservableValue({});
348
+ const { entries } = service.data.getValue();
349
+ service.hasFocus.setValue(true);
350
+ service.selection.setValue([...entries]);
351
+ initializeShadeRoot({
352
+ injector,
353
+ rootElement,
354
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
355
+ });
356
+ await sleepAsync(50);
357
+ const keydownEvent = new KeyboardEvent('keydown', { key: '-', bubbles: true });
358
+ window.dispatchEvent(keydownEvent);
359
+ expect(service.selection.getValue().length).toBe(0);
360
+ service[Symbol.dispose]();
361
+ findOptions[Symbol.dispose]();
340
362
  });
341
- await sleepAsync(50);
342
- const keydownEvent = new KeyboardEvent('keydown', { key: '-', bubbles: true });
343
- window.dispatchEvent(keydownEvent);
344
- expect(service.selection.getValue().length).toBe(0);
345
- service[Symbol.dispose]();
346
- findOptions[Symbol.dispose]();
347
363
  });
348
364
  it('should handle * to invert selection', async () => {
349
- const injector = new Injector();
350
- const rootElement = document.getElementById('root');
351
- const service = createTestService();
352
- const findOptions = new ObservableValue({});
353
- const { entries } = service.data.getValue();
354
- service.hasFocus.setValue(true);
355
- service.selection.setValue([entries[0]]);
356
- initializeShadeRoot({
357
- injector,
358
- rootElement,
359
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
365
+ await usingAsync(new Injector(), async (injector) => {
366
+ const rootElement = document.getElementById('root');
367
+ const service = createTestService();
368
+ const findOptions = new ObservableValue({});
369
+ const { entries } = service.data.getValue();
370
+ service.hasFocus.setValue(true);
371
+ service.selection.setValue([entries[0]]);
372
+ initializeShadeRoot({
373
+ injector,
374
+ rootElement,
375
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
376
+ });
377
+ await sleepAsync(50);
378
+ const keydownEvent = new KeyboardEvent('keydown', { key: '*', bubbles: true });
379
+ window.dispatchEvent(keydownEvent);
380
+ const selection = service.selection.getValue();
381
+ expect(selection).not.toContain(entries[0]);
382
+ expect(selection).toContain(entries[1]);
383
+ expect(selection).toContain(entries[2]);
384
+ service[Symbol.dispose]();
385
+ findOptions[Symbol.dispose]();
360
386
  });
361
- await sleepAsync(50);
362
- const keydownEvent = new KeyboardEvent('keydown', { key: '*', bubbles: true });
363
- window.dispatchEvent(keydownEvent);
364
- const selection = service.selection.getValue();
365
- expect(selection).not.toContain(entries[0]);
366
- expect(selection).toContain(entries[1]);
367
- expect(selection).toContain(entries[2]);
368
- service[Symbol.dispose]();
369
- findOptions[Symbol.dispose]();
370
387
  });
371
388
  it('should not handle keyboard when not focused', async () => {
372
- const injector = new Injector();
373
- const rootElement = document.getElementById('root');
374
- const service = createTestService();
375
- const findOptions = new ObservableValue({});
376
- service.hasFocus.setValue(false);
377
- service.focusedEntry.setValue(service.data.getValue().entries[0]);
378
- initializeShadeRoot({
379
- injector,
380
- rootElement,
381
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
389
+ await usingAsync(new Injector(), async (injector) => {
390
+ const rootElement = document.getElementById('root');
391
+ const service = createTestService();
392
+ const findOptions = new ObservableValue({});
393
+ service.hasFocus.setValue(false);
394
+ service.focusedEntry.setValue(service.data.getValue().entries[0]);
395
+ initializeShadeRoot({
396
+ injector,
397
+ rootElement,
398
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
399
+ });
400
+ await sleepAsync(50);
401
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true });
402
+ window.dispatchEvent(keydownEvent);
403
+ expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' });
404
+ service[Symbol.dispose]();
405
+ findOptions[Symbol.dispose]();
382
406
  });
383
- await sleepAsync(50);
384
- const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true });
385
- window.dispatchEvent(keydownEvent);
386
- expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' });
387
- service[Symbol.dispose]();
388
- findOptions[Symbol.dispose]();
389
407
  });
390
408
  it('should handle Insert to toggle selection and move to next', async () => {
391
- const injector = new Injector();
392
- const rootElement = document.getElementById('root');
393
- const service = createTestService();
394
- const findOptions = new ObservableValue({});
395
- const { entries } = service.data.getValue();
396
- service.hasFocus.setValue(true);
397
- service.focusedEntry.setValue(entries[0]);
398
- initializeShadeRoot({
399
- injector,
400
- rootElement,
401
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
409
+ await usingAsync(new Injector(), async (injector) => {
410
+ const rootElement = document.getElementById('root');
411
+ const service = createTestService();
412
+ const findOptions = new ObservableValue({});
413
+ const { entries } = service.data.getValue();
414
+ service.hasFocus.setValue(true);
415
+ service.focusedEntry.setValue(entries[0]);
416
+ initializeShadeRoot({
417
+ injector,
418
+ rootElement,
419
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
420
+ });
421
+ await sleepAsync(50);
422
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'Insert', bubbles: true });
423
+ window.dispatchEvent(keydownEvent);
424
+ expect(service.selection.getValue()).toContain(entries[0]);
425
+ expect(service.focusedEntry.getValue()).toEqual(entries[1]);
426
+ service[Symbol.dispose]();
427
+ findOptions[Symbol.dispose]();
402
428
  });
403
- await sleepAsync(50);
404
- const keydownEvent = new KeyboardEvent('keydown', { key: 'Insert', bubbles: true });
405
- window.dispatchEvent(keydownEvent);
406
- expect(service.selection.getValue()).toContain(entries[0]);
407
- expect(service.focusedEntry.getValue()).toEqual(entries[1]);
408
- service[Symbol.dispose]();
409
- findOptions[Symbol.dispose]();
410
429
  });
411
430
  });
412
431
  describe('styles', () => {
413
432
  it('should apply wrapper styles when provided', async () => {
414
- const injector = new Injector();
415
- const rootElement = document.getElementById('root');
416
- const service = createTestService();
417
- const findOptions = new ObservableValue({});
418
- initializeShadeRoot({
419
- injector,
420
- rootElement,
421
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {
422
- wrapper: { backgroundColor: 'red' },
423
- }, headerComponents: {}, rowComponents: {} })),
433
+ await usingAsync(new Injector(), async (injector) => {
434
+ const rootElement = document.getElementById('root');
435
+ const service = createTestService();
436
+ const findOptions = new ObservableValue({});
437
+ initializeShadeRoot({
438
+ injector,
439
+ rootElement,
440
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {
441
+ wrapper: { backgroundColor: 'red' },
442
+ }, headerComponents: {}, rowComponents: {} })),
443
+ });
444
+ await sleepAsync(50);
445
+ const grid = document.querySelector('shade-data-grid');
446
+ expect(grid?.style.backgroundColor).toBe('red');
447
+ service[Symbol.dispose]();
448
+ findOptions[Symbol.dispose]();
424
449
  });
425
- await sleepAsync(50);
426
- const grid = document.querySelector('shade-data-grid');
427
- expect(grid?.style.backgroundColor).toBe('red');
428
- service[Symbol.dispose]();
429
- findOptions[Symbol.dispose]();
430
450
  });
431
451
  it('should apply header styles when provided', async () => {
432
- const injector = new Injector();
433
- const rootElement = document.getElementById('root');
434
- const service = createTestService();
435
- const findOptions = new ObservableValue({});
436
- initializeShadeRoot({
437
- injector,
438
- rootElement,
439
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {
440
- header: { color: 'blue' },
441
- }, headerComponents: {}, rowComponents: {} })),
452
+ await usingAsync(new Injector(), async (injector) => {
453
+ const rootElement = document.getElementById('root');
454
+ const service = createTestService();
455
+ const findOptions = new ObservableValue({});
456
+ initializeShadeRoot({
457
+ injector,
458
+ rootElement,
459
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {
460
+ header: { color: 'blue' },
461
+ }, headerComponents: {}, rowComponents: {} })),
462
+ });
463
+ await sleepAsync(50);
464
+ const grid = document.querySelector('shade-data-grid');
465
+ const headers = grid?.querySelectorAll('th');
466
+ expect(headers?.[0]?.style.color).toBe('blue');
467
+ service[Symbol.dispose]();
468
+ findOptions[Symbol.dispose]();
442
469
  });
443
- await sleepAsync(50);
444
- const grid = document.querySelector('shade-data-grid');
445
- const headers = grid?.querySelectorAll('th');
446
- expect(headers?.[0]?.style.color).toBe('blue');
447
- service[Symbol.dispose]();
448
- findOptions[Symbol.dispose]();
449
470
  });
450
471
  });
451
472
  describe('empty and loading states', () => {
452
473
  it('should show empty component when no data', async () => {
453
- const injector = new Injector();
454
- const rootElement = document.getElementById('root');
455
- const service = new CollectionService();
456
- const findOptions = new ObservableValue({});
457
- initializeShadeRoot({
458
- injector,
459
- rootElement,
460
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {}, emptyComponent: createComponent("div", { "data-testid": "empty-state" }, "No data available") })),
474
+ await usingAsync(new Injector(), async (injector) => {
475
+ const rootElement = document.getElementById('root');
476
+ const service = new CollectionService();
477
+ const findOptions = new ObservableValue({});
478
+ initializeShadeRoot({
479
+ injector,
480
+ rootElement,
481
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {}, emptyComponent: createComponent("div", { "data-testid": "empty-state" }, "No data available") })),
482
+ });
483
+ await sleepAsync(50);
484
+ const grid = document.querySelector('shade-data-grid');
485
+ const emptyState = grid?.querySelector('[data-testid="empty-state"]');
486
+ expect(emptyState).not.toBeNull();
487
+ expect(emptyState?.textContent).toBe('No data available');
488
+ service[Symbol.dispose]();
489
+ findOptions[Symbol.dispose]();
461
490
  });
462
- await sleepAsync(50);
463
- const grid = document.querySelector('shade-data-grid');
464
- const emptyState = grid?.querySelector('[data-testid="empty-state"]');
465
- expect(emptyState).not.toBeNull();
466
- expect(emptyState?.textContent).toBe('No data available');
467
- service[Symbol.dispose]();
468
- findOptions[Symbol.dispose]();
469
491
  });
470
492
  });
471
493
  describe('row interactions', () => {
472
494
  it('should pass row click to collectionService', async () => {
473
- const injector = new Injector();
474
- const rootElement = document.getElementById('root');
475
- const onRowClick = vi.fn();
476
- const service = new CollectionService({ onRowClick });
477
- const findOptions = new ObservableValue({});
478
- service.data.setValue({
479
- count: 1,
480
- entries: [{ id: 1, name: 'Test' }],
495
+ await usingAsync(new Injector(), async (injector) => {
496
+ const rootElement = document.getElementById('root');
497
+ const onRowClick = vi.fn();
498
+ const service = new CollectionService({ onRowClick });
499
+ const findOptions = new ObservableValue({});
500
+ service.data.setValue({
501
+ count: 1,
502
+ entries: [{ id: 1, name: 'Test' }],
503
+ });
504
+ initializeShadeRoot({
505
+ injector,
506
+ rootElement,
507
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
508
+ });
509
+ await sleepAsync(50);
510
+ const grid = document.querySelector('shade-data-grid');
511
+ const cell = grid?.querySelector('td');
512
+ cell?.click();
513
+ expect(onRowClick).toHaveBeenCalledWith({ id: 1, name: 'Test' });
514
+ service[Symbol.dispose]();
515
+ findOptions[Symbol.dispose]();
481
516
  });
482
- initializeShadeRoot({
483
- injector,
484
- rootElement,
485
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
486
- });
487
- await sleepAsync(50);
488
- const grid = document.querySelector('shade-data-grid');
489
- const cell = grid?.querySelector('td');
490
- cell?.click();
491
- expect(onRowClick).toHaveBeenCalledWith({ id: 1, name: 'Test' });
492
- service[Symbol.dispose]();
493
- findOptions[Symbol.dispose]();
494
517
  });
495
518
  it('should pass row double click to collectionService', async () => {
496
- const injector = new Injector();
497
- const rootElement = document.getElementById('root');
498
- const onRowDoubleClick = vi.fn();
499
- const service = new CollectionService({ onRowDoubleClick });
500
- const findOptions = new ObservableValue({});
501
- service.data.setValue({
502
- count: 1,
503
- entries: [{ id: 1, name: 'Test' }],
504
- });
505
- initializeShadeRoot({
506
- injector,
507
- rootElement,
508
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
519
+ await usingAsync(new Injector(), async (injector) => {
520
+ const rootElement = document.getElementById('root');
521
+ const onRowDoubleClick = vi.fn();
522
+ const service = new CollectionService({ onRowDoubleClick });
523
+ const findOptions = new ObservableValue({});
524
+ service.data.setValue({
525
+ count: 1,
526
+ entries: [{ id: 1, name: 'Test' }],
527
+ });
528
+ initializeShadeRoot({
529
+ injector,
530
+ rootElement,
531
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
532
+ });
533
+ await sleepAsync(50);
534
+ const grid = document.querySelector('shade-data-grid');
535
+ const cell = grid?.querySelector('td');
536
+ const dblClickEvent = new MouseEvent('dblclick', { bubbles: true });
537
+ cell?.dispatchEvent(dblClickEvent);
538
+ expect(onRowDoubleClick).toHaveBeenCalledWith({ id: 1, name: 'Test' });
539
+ service[Symbol.dispose]();
540
+ findOptions[Symbol.dispose]();
509
541
  });
510
- await sleepAsync(50);
511
- const grid = document.querySelector('shade-data-grid');
512
- const cell = grid?.querySelector('td');
513
- const dblClickEvent = new MouseEvent('dblclick', { bubbles: true });
514
- cell?.dispatchEvent(dblClickEvent);
515
- expect(onRowDoubleClick).toHaveBeenCalledWith({ id: 1, name: 'Test' });
516
- service[Symbol.dispose]();
517
- findOptions[Symbol.dispose]();
518
542
  });
519
543
  });
520
544
  describe('keyboard listener cleanup', () => {
521
545
  it('should remove keyboard listener when component is disconnected', async () => {
522
- const injector = new Injector();
523
- const rootElement = document.getElementById('root');
524
- const service = createTestService();
525
- const findOptions = new ObservableValue({});
526
- service.hasFocus.setValue(true);
527
- service.focusedEntry.setValue(service.data.getValue().entries[0]);
528
- initializeShadeRoot({
529
- injector,
530
- rootElement,
531
- jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
546
+ await usingAsync(new Injector(), async (injector) => {
547
+ const rootElement = document.getElementById('root');
548
+ const service = createTestService();
549
+ const findOptions = new ObservableValue({});
550
+ service.hasFocus.setValue(true);
551
+ service.focusedEntry.setValue(service.data.getValue().entries[0]);
552
+ initializeShadeRoot({
553
+ injector,
554
+ rootElement,
555
+ jsxElement: (createComponent(DataGrid, { columns: ['id', 'name'], collectionService: service, findOptions: findOptions, styles: {}, headerComponents: {}, rowComponents: {} })),
556
+ });
557
+ await sleepAsync(50);
558
+ const grid = document.querySelector('shade-data-grid');
559
+ grid.remove();
560
+ await sleepAsync(10);
561
+ window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }));
562
+ expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' });
563
+ service[Symbol.dispose]();
564
+ findOptions[Symbol.dispose]();
532
565
  });
533
- await sleepAsync(50);
534
- const grid = document.querySelector('shade-data-grid');
535
- grid.remove();
536
- await sleepAsync(10);
537
- window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }));
538
- expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' });
539
- service[Symbol.dispose]();
540
- findOptions[Symbol.dispose]();
541
566
  });
542
567
  });
543
568
  });