@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'
@@ -31,225 +31,194 @@ describe('DataGrid', () => {
31
31
 
32
32
  describe('rendering', () => {
33
33
  it('should render with columns', async () => {
34
- const injector = new Injector()
35
- const rootElement = document.getElementById('root') as HTMLDivElement
36
- const service = createTestService()
37
- const findOptions = new ObservableValue<any>({})
38
-
39
- initializeShadeRoot({
40
- injector,
41
- rootElement,
42
- jsxElement: (
43
- <DataGrid<TestEntry, 'id' | 'name'>
44
- columns={['id', 'name']}
45
- collectionService={service}
46
- findOptions={findOptions}
47
- styles={{}}
48
- headerComponents={{}}
49
- rowComponents={{}}
50
- />
51
- ),
52
- })
34
+ await usingAsync(new Injector(), async (injector) => {
35
+ const rootElement = document.getElementById('root') as HTMLDivElement
36
+ const service = createTestService()
37
+ const findOptions = new ObservableValue<any>({})
38
+
39
+ initializeShadeRoot({
40
+ injector,
41
+ rootElement,
42
+ jsxElement: (
43
+ <DataGrid<TestEntry, 'id' | 'name'>
44
+ columns={['id', 'name']}
45
+ collectionService={service}
46
+ findOptions={findOptions}
47
+ styles={{}}
48
+ headerComponents={{}}
49
+ rowComponents={{}}
50
+ />
51
+ ),
52
+ })
53
53
 
54
- await sleepAsync(50)
54
+ await sleepAsync(50)
55
55
 
56
- const grid = document.querySelector('shade-data-grid')
57
- expect(grid).not.toBeNull()
56
+ const grid = document.querySelector('shade-data-grid')
57
+ expect(grid).not.toBeNull()
58
58
 
59
- const headers = grid?.querySelectorAll('th')
60
- expect(headers?.length).toBe(2)
59
+ const headers = grid?.querySelectorAll('th')
60
+ expect(headers?.length).toBe(2)
61
61
 
62
- service[Symbol.dispose]()
63
- findOptions[Symbol.dispose]()
62
+ service[Symbol.dispose]()
63
+ findOptions[Symbol.dispose]()
64
+ })
64
65
  })
65
66
 
66
67
  it('should render table structure', async () => {
67
- const injector = new Injector()
68
- const rootElement = document.getElementById('root') as HTMLDivElement
69
- const service = createTestService()
70
- const findOptions = new ObservableValue<any>({})
71
-
72
- initializeShadeRoot({
73
- injector,
74
- rootElement,
75
- jsxElement: (
76
- <DataGrid<TestEntry, 'id' | 'name'>
77
- columns={['id', 'name']}
78
- collectionService={service}
79
- findOptions={findOptions}
80
- styles={{}}
81
- headerComponents={{}}
82
- rowComponents={{}}
83
- />
84
- ),
85
- })
68
+ await usingAsync(new Injector(), async (injector) => {
69
+ const rootElement = document.getElementById('root') as HTMLDivElement
70
+ const service = createTestService()
71
+ const findOptions = new ObservableValue<any>({})
72
+
73
+ initializeShadeRoot({
74
+ injector,
75
+ rootElement,
76
+ jsxElement: (
77
+ <DataGrid<TestEntry, 'id' | 'name'>
78
+ columns={['id', 'name']}
79
+ collectionService={service}
80
+ findOptions={findOptions}
81
+ styles={{}}
82
+ headerComponents={{}}
83
+ rowComponents={{}}
84
+ />
85
+ ),
86
+ })
86
87
 
87
- await sleepAsync(50)
88
+ await sleepAsync(50)
88
89
 
89
- const grid = document.querySelector('shade-data-grid')
90
- const table = grid?.querySelector('table')
91
- const thead = grid?.querySelector('thead')
92
- const tbody = grid?.querySelector('tbody')
90
+ const grid = document.querySelector('shade-data-grid')
91
+ const table = grid?.querySelector('table')
92
+ const thead = grid?.querySelector('thead')
93
+ const tbody = grid?.querySelector('tbody')
93
94
 
94
- expect(table).not.toBeNull()
95
- expect(thead).not.toBeNull()
96
- expect(tbody).not.toBeNull()
95
+ expect(table).not.toBeNull()
96
+ expect(thead).not.toBeNull()
97
+ expect(tbody).not.toBeNull()
97
98
 
98
- service[Symbol.dispose]()
99
- findOptions[Symbol.dispose]()
99
+ service[Symbol.dispose]()
100
+ findOptions[Symbol.dispose]()
101
+ })
100
102
  })
101
103
 
102
104
  it('should render custom header components when provided', async () => {
103
- const injector = new Injector()
104
- const rootElement = document.getElementById('root') as HTMLDivElement
105
- const service = createTestService()
106
- const findOptions = new ObservableValue<any>({})
107
-
108
- initializeShadeRoot({
109
- injector,
110
- rootElement,
111
- jsxElement: (
112
- <DataGrid<TestEntry, 'id' | 'name'>
113
- columns={['id', 'name']}
114
- collectionService={service}
115
- findOptions={findOptions}
116
- styles={{}}
117
- headerComponents={{
118
- id: () => <span data-testid="custom-header-id">Custom ID Header</span>,
119
- }}
120
- rowComponents={{}}
121
- />
122
- ),
123
- })
105
+ await usingAsync(new Injector(), async (injector) => {
106
+ const rootElement = document.getElementById('root') as HTMLDivElement
107
+ const service = createTestService()
108
+ const findOptions = new ObservableValue<any>({})
109
+
110
+ initializeShadeRoot({
111
+ injector,
112
+ rootElement,
113
+ jsxElement: (
114
+ <DataGrid<TestEntry, 'id' | 'name'>
115
+ columns={['id', 'name']}
116
+ collectionService={service}
117
+ findOptions={findOptions}
118
+ styles={{}}
119
+ headerComponents={{
120
+ id: () => <span data-testid="custom-header-id">Custom ID Header</span>,
121
+ }}
122
+ rowComponents={{}}
123
+ />
124
+ ),
125
+ })
124
126
 
125
- await sleepAsync(50)
127
+ await sleepAsync(50)
126
128
 
127
- const grid = document.querySelector('shade-data-grid')
128
- const customHeader = grid?.querySelector('[data-testid="custom-header-id"]')
129
- expect(customHeader).not.toBeNull()
130
- expect(customHeader?.textContent).toBe('Custom ID Header')
129
+ const grid = document.querySelector('shade-data-grid')
130
+ const customHeader = grid?.querySelector('[data-testid="custom-header-id"]')
131
+ expect(customHeader).not.toBeNull()
132
+ expect(customHeader?.textContent).toBe('Custom ID Header')
131
133
 
132
- service[Symbol.dispose]()
133
- findOptions[Symbol.dispose]()
134
+ service[Symbol.dispose]()
135
+ findOptions[Symbol.dispose]()
136
+ })
134
137
  })
135
138
 
136
139
  it('should render default header components from headerComponents.default', async () => {
137
- const injector = new Injector()
138
- const rootElement = document.getElementById('root') as HTMLDivElement
139
- const service = createTestService()
140
- const findOptions = new ObservableValue<any>({})
141
-
142
- initializeShadeRoot({
143
- injector,
144
- rootElement,
145
- jsxElement: (
146
- <DataGrid<TestEntry, 'id' | 'name'>
147
- columns={['id', 'name']}
148
- collectionService={service}
149
- findOptions={findOptions}
150
- styles={{}}
151
- headerComponents={{
152
- default: (name) => <span data-testid={`default-header-${name}`}>Default: {name}</span>,
153
- }}
154
- rowComponents={{}}
155
- />
156
- ),
157
- })
140
+ await usingAsync(new Injector(), async (injector) => {
141
+ const rootElement = document.getElementById('root') as HTMLDivElement
142
+ const service = createTestService()
143
+ const findOptions = new ObservableValue<any>({})
144
+
145
+ initializeShadeRoot({
146
+ injector,
147
+ rootElement,
148
+ jsxElement: (
149
+ <DataGrid<TestEntry, 'id' | 'name'>
150
+ columns={['id', 'name']}
151
+ collectionService={service}
152
+ findOptions={findOptions}
153
+ styles={{}}
154
+ headerComponents={{
155
+ default: (name) => <span data-testid={`default-header-${name}`}>Default: {name}</span>,
156
+ }}
157
+ rowComponents={{}}
158
+ />
159
+ ),
160
+ })
158
161
 
159
- await sleepAsync(50)
162
+ await sleepAsync(50)
160
163
 
161
- const grid = document.querySelector('shade-data-grid')
162
- const defaultHeaderId = grid?.querySelector('[data-testid="default-header-id"]')
163
- const defaultHeaderName = grid?.querySelector('[data-testid="default-header-name"]')
164
+ const grid = document.querySelector('shade-data-grid')
165
+ const defaultHeaderId = grid?.querySelector('[data-testid="default-header-id"]')
166
+ const defaultHeaderName = grid?.querySelector('[data-testid="default-header-name"]')
164
167
 
165
- expect(defaultHeaderId?.textContent).toBe('Default: id')
166
- expect(defaultHeaderName?.textContent).toBe('Default: name')
168
+ expect(defaultHeaderId?.textContent).toBe('Default: id')
169
+ expect(defaultHeaderName?.textContent).toBe('Default: name')
167
170
 
168
- service[Symbol.dispose]()
169
- findOptions[Symbol.dispose]()
171
+ service[Symbol.dispose]()
172
+ findOptions[Symbol.dispose]()
173
+ })
170
174
  })
171
175
 
172
176
  it('should render DataGridHeader when no custom header is provided', async () => {
173
- const injector = new Injector()
174
- const rootElement = document.getElementById('root') as HTMLDivElement
175
- const service = createTestService()
176
- const findOptions = new ObservableValue<any>({})
177
-
178
- initializeShadeRoot({
179
- injector,
180
- rootElement,
181
- jsxElement: (
182
- <DataGrid<TestEntry, 'id' | 'name'>
183
- columns={['id', 'name']}
184
- collectionService={service}
185
- findOptions={findOptions}
186
- styles={{}}
187
- headerComponents={{}}
188
- rowComponents={{}}
189
- />
190
- ),
191
- })
177
+ await usingAsync(new Injector(), async (injector) => {
178
+ const rootElement = document.getElementById('root') as HTMLDivElement
179
+ const service = createTestService()
180
+ const findOptions = new ObservableValue<any>({})
181
+
182
+ initializeShadeRoot({
183
+ injector,
184
+ rootElement,
185
+ jsxElement: (
186
+ <DataGrid<TestEntry, 'id' | 'name'>
187
+ columns={['id', 'name']}
188
+ collectionService={service}
189
+ findOptions={findOptions}
190
+ styles={{}}
191
+ headerComponents={{}}
192
+ rowComponents={{}}
193
+ />
194
+ ),
195
+ })
192
196
 
193
- await sleepAsync(50)
197
+ await sleepAsync(50)
194
198
 
195
- const grid = document.querySelector('shade-data-grid')
196
- const defaultHeaders = grid?.querySelectorAll('data-grid-header')
197
- expect(defaultHeaders?.length).toBe(2)
199
+ const grid = document.querySelector('shade-data-grid')
200
+ const defaultHeaders = grid?.querySelectorAll('data-grid-header')
201
+ expect(defaultHeaders?.length).toBe(2)
198
202
 
199
- service[Symbol.dispose]()
200
- findOptions[Symbol.dispose]()
203
+ service[Symbol.dispose]()
204
+ findOptions[Symbol.dispose]()
205
+ })
201
206
  })
202
207
  })
203
208
 
204
209
  describe('focus management', () => {
205
210
  it('should set focus on click', async () => {
206
- const injector = new Injector()
207
- const rootElement = document.getElementById('root') as HTMLDivElement
208
- const service = createTestService()
209
- const findOptions = new ObservableValue<any>({})
210
-
211
- expect(service.hasFocus.getValue()).toBe(false)
212
-
213
- initializeShadeRoot({
214
- injector,
215
- rootElement,
216
- jsxElement: (
217
- <DataGrid<TestEntry, 'id' | 'name'>
218
- columns={['id', 'name']}
219
- collectionService={service}
220
- findOptions={findOptions}
221
- styles={{}}
222
- headerComponents={{}}
223
- rowComponents={{}}
224
- />
225
- ),
226
- })
227
-
228
- await sleepAsync(50)
229
-
230
- const grid = document.querySelector('shade-data-grid')
231
- const wrapper = grid?.querySelector('.shade-grid-wrapper') as HTMLElement
211
+ await usingAsync(new Injector(), async (injector) => {
212
+ const rootElement = document.getElementById('root') as HTMLDivElement
213
+ const service = createTestService()
214
+ const findOptions = new ObservableValue<any>({})
232
215
 
233
- wrapper?.click()
216
+ expect(service.hasFocus.getValue()).toBe(false)
234
217
 
235
- expect(service.hasFocus.getValue()).toBe(true)
236
-
237
- service[Symbol.dispose]()
238
- findOptions[Symbol.dispose]()
239
- })
240
-
241
- it('should lose focus on click outside', async () => {
242
- const injector = new Injector()
243
- const rootElement = document.getElementById('root') as HTMLDivElement
244
- const service = createTestService()
245
- const findOptions = new ObservableValue<any>({})
246
-
247
- initializeShadeRoot({
248
- injector,
249
- rootElement,
250
- jsxElement: (
251
- <>
252
- <div data-testid="outside">Outside</div>
218
+ initializeShadeRoot({
219
+ injector,
220
+ rootElement,
221
+ jsxElement: (
253
222
  <DataGrid<TestEntry, 'id' | 'name'>
254
223
  columns={['id', 'name']}
255
224
  collectionService={service}
@@ -258,682 +227,738 @@ describe('DataGrid', () => {
258
227
  headerComponents={{}}
259
228
  rowComponents={{}}
260
229
  />
261
- </>
262
- ),
263
- })
230
+ ),
231
+ })
264
232
 
265
- await sleepAsync(50)
233
+ await sleepAsync(50)
266
234
 
267
- const grid = document.querySelector('shade-data-grid')
268
- const wrapper = grid?.querySelector('.shade-grid-wrapper') as HTMLElement
269
- wrapper?.click()
235
+ const grid = document.querySelector('shade-data-grid')
236
+ const wrapper = grid?.querySelector('.shade-grid-wrapper') as HTMLElement
270
237
 
271
- expect(service.hasFocus.getValue()).toBe(true)
238
+ wrapper?.click()
272
239
 
273
- const outside = document.querySelector('[data-testid="outside"]') as HTMLElement
274
- outside?.dispatchEvent(new MouseEvent('click', { bubbles: true }))
240
+ expect(service.hasFocus.getValue()).toBe(true)
275
241
 
276
- expect(service.hasFocus.getValue()).toBe(false)
242
+ service[Symbol.dispose]()
243
+ findOptions[Symbol.dispose]()
244
+ })
245
+ })
277
246
 
278
- service[Symbol.dispose]()
279
- findOptions[Symbol.dispose]()
247
+ it('should lose focus on click outside', async () => {
248
+ await usingAsync(new Injector(), async (injector) => {
249
+ const rootElement = document.getElementById('root') as HTMLDivElement
250
+ const service = createTestService()
251
+ const findOptions = new ObservableValue<any>({})
252
+
253
+ initializeShadeRoot({
254
+ injector,
255
+ rootElement,
256
+ jsxElement: (
257
+ <>
258
+ <div data-testid="outside">Outside</div>
259
+ <DataGrid<TestEntry, 'id' | 'name'>
260
+ columns={['id', 'name']}
261
+ collectionService={service}
262
+ findOptions={findOptions}
263
+ styles={{}}
264
+ headerComponents={{}}
265
+ rowComponents={{}}
266
+ />
267
+ </>
268
+ ),
269
+ })
270
+
271
+ await sleepAsync(50)
272
+
273
+ const grid = document.querySelector('shade-data-grid')
274
+ const wrapper = grid?.querySelector('.shade-grid-wrapper') as HTMLElement
275
+ wrapper?.click()
276
+
277
+ expect(service.hasFocus.getValue()).toBe(true)
278
+
279
+ const outside = document.querySelector('[data-testid="outside"]') as HTMLElement
280
+ outside?.dispatchEvent(new MouseEvent('click', { bubbles: true }))
281
+
282
+ expect(service.hasFocus.getValue()).toBe(false)
283
+
284
+ service[Symbol.dispose]()
285
+ findOptions[Symbol.dispose]()
286
+ })
280
287
  })
281
288
  })
282
289
 
283
290
  describe('keyboard navigation', () => {
284
291
  it('should handle ArrowDown to move focus to next entry', async () => {
285
- const injector = new Injector()
286
- const rootElement = document.getElementById('root') as HTMLDivElement
287
- const service = createTestService()
288
- const findOptions = new ObservableValue<any>({})
289
-
290
- service.hasFocus.setValue(true)
291
- service.focusedEntry.setValue(service.data.getValue().entries[0])
292
-
293
- initializeShadeRoot({
294
- injector,
295
- rootElement,
296
- jsxElement: (
297
- <DataGrid<TestEntry, 'id' | 'name'>
298
- columns={['id', 'name']}
299
- collectionService={service}
300
- findOptions={findOptions}
301
- styles={{}}
302
- headerComponents={{}}
303
- rowComponents={{}}
304
- />
305
- ),
306
- })
292
+ await usingAsync(new Injector(), async (injector) => {
293
+ const rootElement = document.getElementById('root') as HTMLDivElement
294
+ const service = createTestService()
295
+ const findOptions = new ObservableValue<any>({})
296
+
297
+ service.hasFocus.setValue(true)
298
+ service.focusedEntry.setValue(service.data.getValue().entries[0])
299
+
300
+ initializeShadeRoot({
301
+ injector,
302
+ rootElement,
303
+ jsxElement: (
304
+ <DataGrid<TestEntry, 'id' | 'name'>
305
+ columns={['id', 'name']}
306
+ collectionService={service}
307
+ findOptions={findOptions}
308
+ styles={{}}
309
+ headerComponents={{}}
310
+ rowComponents={{}}
311
+ />
312
+ ),
313
+ })
307
314
 
308
- await sleepAsync(50)
315
+ await sleepAsync(50)
309
316
 
310
- const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true })
311
- window.dispatchEvent(keydownEvent)
317
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true })
318
+ window.dispatchEvent(keydownEvent)
312
319
 
313
- expect(service.focusedEntry.getValue()).toEqual({ id: 2, name: 'Second' })
320
+ expect(service.focusedEntry.getValue()).toEqual({ id: 2, name: 'Second' })
314
321
 
315
- service[Symbol.dispose]()
316
- findOptions[Symbol.dispose]()
322
+ service[Symbol.dispose]()
323
+ findOptions[Symbol.dispose]()
324
+ })
317
325
  })
318
326
 
319
327
  it('should handle ArrowUp to move focus to previous entry', async () => {
320
- const injector = new Injector()
321
- const rootElement = document.getElementById('root') as HTMLDivElement
322
- const service = createTestService()
323
- const findOptions = new ObservableValue<any>({})
324
-
325
- service.hasFocus.setValue(true)
326
- service.focusedEntry.setValue(service.data.getValue().entries[1])
327
-
328
- initializeShadeRoot({
329
- injector,
330
- rootElement,
331
- jsxElement: (
332
- <DataGrid<TestEntry, 'id' | 'name'>
333
- columns={['id', 'name']}
334
- collectionService={service}
335
- findOptions={findOptions}
336
- styles={{}}
337
- headerComponents={{}}
338
- rowComponents={{}}
339
- />
340
- ),
341
- })
328
+ await usingAsync(new Injector(), async (injector) => {
329
+ const rootElement = document.getElementById('root') as HTMLDivElement
330
+ const service = createTestService()
331
+ const findOptions = new ObservableValue<any>({})
332
+
333
+ service.hasFocus.setValue(true)
334
+ service.focusedEntry.setValue(service.data.getValue().entries[1])
335
+
336
+ initializeShadeRoot({
337
+ injector,
338
+ rootElement,
339
+ jsxElement: (
340
+ <DataGrid<TestEntry, 'id' | 'name'>
341
+ columns={['id', 'name']}
342
+ collectionService={service}
343
+ findOptions={findOptions}
344
+ styles={{}}
345
+ headerComponents={{}}
346
+ rowComponents={{}}
347
+ />
348
+ ),
349
+ })
342
350
 
343
- await sleepAsync(50)
351
+ await sleepAsync(50)
344
352
 
345
- const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true })
346
- window.dispatchEvent(keydownEvent)
353
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true })
354
+ window.dispatchEvent(keydownEvent)
347
355
 
348
- expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' })
356
+ expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' })
349
357
 
350
- service[Symbol.dispose]()
351
- findOptions[Symbol.dispose]()
358
+ service[Symbol.dispose]()
359
+ findOptions[Symbol.dispose]()
360
+ })
352
361
  })
353
362
 
354
363
  it('should handle Home to move focus to first entry', async () => {
355
- const injector = new Injector()
356
- const rootElement = document.getElementById('root') as HTMLDivElement
357
- const service = createTestService()
358
- const findOptions = new ObservableValue<any>({})
359
-
360
- service.hasFocus.setValue(true)
361
- service.focusedEntry.setValue(service.data.getValue().entries[2])
362
-
363
- initializeShadeRoot({
364
- injector,
365
- rootElement,
366
- jsxElement: (
367
- <DataGrid<TestEntry, 'id' | 'name'>
368
- columns={['id', 'name']}
369
- collectionService={service}
370
- findOptions={findOptions}
371
- styles={{}}
372
- headerComponents={{}}
373
- rowComponents={{}}
374
- />
375
- ),
376
- })
364
+ await usingAsync(new Injector(), async (injector) => {
365
+ const rootElement = document.getElementById('root') as HTMLDivElement
366
+ const service = createTestService()
367
+ const findOptions = new ObservableValue<any>({})
368
+
369
+ service.hasFocus.setValue(true)
370
+ service.focusedEntry.setValue(service.data.getValue().entries[2])
371
+
372
+ initializeShadeRoot({
373
+ injector,
374
+ rootElement,
375
+ jsxElement: (
376
+ <DataGrid<TestEntry, 'id' | 'name'>
377
+ columns={['id', 'name']}
378
+ collectionService={service}
379
+ findOptions={findOptions}
380
+ styles={{}}
381
+ headerComponents={{}}
382
+ rowComponents={{}}
383
+ />
384
+ ),
385
+ })
377
386
 
378
- await sleepAsync(50)
387
+ await sleepAsync(50)
379
388
 
380
- const keydownEvent = new KeyboardEvent('keydown', { key: 'Home', bubbles: true })
381
- window.dispatchEvent(keydownEvent)
389
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'Home', bubbles: true })
390
+ window.dispatchEvent(keydownEvent)
382
391
 
383
- expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' })
392
+ expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' })
384
393
 
385
- service[Symbol.dispose]()
386
- findOptions[Symbol.dispose]()
394
+ service[Symbol.dispose]()
395
+ findOptions[Symbol.dispose]()
396
+ })
387
397
  })
388
398
 
389
399
  it('should handle End to move focus to last entry', async () => {
390
- const injector = new Injector()
391
- const rootElement = document.getElementById('root') as HTMLDivElement
392
- const service = createTestService()
393
- const findOptions = new ObservableValue<any>({})
394
-
395
- service.hasFocus.setValue(true)
396
- service.focusedEntry.setValue(service.data.getValue().entries[0])
397
-
398
- initializeShadeRoot({
399
- injector,
400
- rootElement,
401
- jsxElement: (
402
- <DataGrid<TestEntry, 'id' | 'name'>
403
- columns={['id', 'name']}
404
- collectionService={service}
405
- findOptions={findOptions}
406
- styles={{}}
407
- headerComponents={{}}
408
- rowComponents={{}}
409
- />
410
- ),
411
- })
400
+ await usingAsync(new Injector(), async (injector) => {
401
+ const rootElement = document.getElementById('root') as HTMLDivElement
402
+ const service = createTestService()
403
+ const findOptions = new ObservableValue<any>({})
404
+
405
+ service.hasFocus.setValue(true)
406
+ service.focusedEntry.setValue(service.data.getValue().entries[0])
407
+
408
+ initializeShadeRoot({
409
+ injector,
410
+ rootElement,
411
+ jsxElement: (
412
+ <DataGrid<TestEntry, 'id' | 'name'>
413
+ columns={['id', 'name']}
414
+ collectionService={service}
415
+ findOptions={findOptions}
416
+ styles={{}}
417
+ headerComponents={{}}
418
+ rowComponents={{}}
419
+ />
420
+ ),
421
+ })
412
422
 
413
- await sleepAsync(50)
423
+ await sleepAsync(50)
414
424
 
415
- const keydownEvent = new KeyboardEvent('keydown', { key: 'End', bubbles: true })
416
- window.dispatchEvent(keydownEvent)
425
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'End', bubbles: true })
426
+ window.dispatchEvent(keydownEvent)
417
427
 
418
- expect(service.focusedEntry.getValue()).toEqual({ id: 3, name: 'Third' })
428
+ expect(service.focusedEntry.getValue()).toEqual({ id: 3, name: 'Third' })
419
429
 
420
- service[Symbol.dispose]()
421
- findOptions[Symbol.dispose]()
430
+ service[Symbol.dispose]()
431
+ findOptions[Symbol.dispose]()
432
+ })
422
433
  })
423
434
 
424
435
  it('should handle Tab to toggle focus', async () => {
425
- const injector = new Injector()
426
- const rootElement = document.getElementById('root') as HTMLDivElement
427
- const service = createTestService()
428
- const findOptions = new ObservableValue<any>({})
429
-
430
- service.hasFocus.setValue(true)
431
-
432
- initializeShadeRoot({
433
- injector,
434
- rootElement,
435
- jsxElement: (
436
- <DataGrid<TestEntry, 'id' | 'name'>
437
- columns={['id', 'name']}
438
- collectionService={service}
439
- findOptions={findOptions}
440
- styles={{}}
441
- headerComponents={{}}
442
- rowComponents={{}}
443
- />
444
- ),
445
- })
436
+ await usingAsync(new Injector(), async (injector) => {
437
+ const rootElement = document.getElementById('root') as HTMLDivElement
438
+ const service = createTestService()
439
+ const findOptions = new ObservableValue<any>({})
440
+
441
+ service.hasFocus.setValue(true)
442
+
443
+ initializeShadeRoot({
444
+ injector,
445
+ rootElement,
446
+ jsxElement: (
447
+ <DataGrid<TestEntry, 'id' | 'name'>
448
+ columns={['id', 'name']}
449
+ collectionService={service}
450
+ findOptions={findOptions}
451
+ styles={{}}
452
+ headerComponents={{}}
453
+ rowComponents={{}}
454
+ />
455
+ ),
456
+ })
446
457
 
447
- await sleepAsync(50)
458
+ await sleepAsync(50)
448
459
 
449
- const keydownEvent = new KeyboardEvent('keydown', { key: 'Tab', bubbles: true })
450
- window.dispatchEvent(keydownEvent)
460
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'Tab', bubbles: true })
461
+ window.dispatchEvent(keydownEvent)
451
462
 
452
- expect(service.hasFocus.getValue()).toBe(false)
463
+ expect(service.hasFocus.getValue()).toBe(false)
453
464
 
454
- service[Symbol.dispose]()
455
- findOptions[Symbol.dispose]()
465
+ service[Symbol.dispose]()
466
+ findOptions[Symbol.dispose]()
467
+ })
456
468
  })
457
469
 
458
470
  it('should handle Escape to clear selection and search', async () => {
459
- const injector = new Injector()
460
- const rootElement = document.getElementById('root') as HTMLDivElement
461
- const service = createTestService()
462
- const findOptions = new ObservableValue<any>({})
463
-
464
- const { entries } = service.data.getValue()
465
- service.hasFocus.setValue(true)
466
- service.selection.setValue([entries[0], entries[1]])
467
- service.searchTerm.setValue('test')
468
-
469
- initializeShadeRoot({
470
- injector,
471
- rootElement,
472
- jsxElement: (
473
- <DataGrid<TestEntry, 'id' | 'name'>
474
- columns={['id', 'name']}
475
- collectionService={service}
476
- findOptions={findOptions}
477
- styles={{}}
478
- headerComponents={{}}
479
- rowComponents={{}}
480
- />
481
- ),
482
- })
471
+ await usingAsync(new Injector(), async (injector) => {
472
+ const rootElement = document.getElementById('root') as HTMLDivElement
473
+ const service = createTestService()
474
+ const findOptions = new ObservableValue<any>({})
475
+
476
+ const { entries } = service.data.getValue()
477
+ service.hasFocus.setValue(true)
478
+ service.selection.setValue([entries[0], entries[1]])
479
+ service.searchTerm.setValue('test')
480
+
481
+ initializeShadeRoot({
482
+ injector,
483
+ rootElement,
484
+ jsxElement: (
485
+ <DataGrid<TestEntry, 'id' | 'name'>
486
+ columns={['id', 'name']}
487
+ collectionService={service}
488
+ findOptions={findOptions}
489
+ styles={{}}
490
+ headerComponents={{}}
491
+ rowComponents={{}}
492
+ />
493
+ ),
494
+ })
483
495
 
484
- await sleepAsync(50)
496
+ await sleepAsync(50)
485
497
 
486
- const keydownEvent = new KeyboardEvent('keydown', { key: 'Escape', bubbles: true })
487
- window.dispatchEvent(keydownEvent)
498
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'Escape', bubbles: true })
499
+ window.dispatchEvent(keydownEvent)
488
500
 
489
- expect(service.selection.getValue()).toEqual([])
490
- expect(service.searchTerm.getValue()).toBe('')
501
+ expect(service.selection.getValue()).toEqual([])
502
+ expect(service.searchTerm.getValue()).toBe('')
491
503
 
492
- service[Symbol.dispose]()
493
- findOptions[Symbol.dispose]()
504
+ service[Symbol.dispose]()
505
+ findOptions[Symbol.dispose]()
506
+ })
494
507
  })
495
508
 
496
509
  it('should handle Space to toggle selection of focused entry', async () => {
497
- const injector = new Injector()
498
- const rootElement = document.getElementById('root') as HTMLDivElement
499
- const service = createTestService()
500
- const findOptions = new ObservableValue<any>({})
501
-
502
- const { entries } = service.data.getValue()
503
- service.hasFocus.setValue(true)
504
- service.focusedEntry.setValue(entries[0])
505
-
506
- initializeShadeRoot({
507
- injector,
508
- rootElement,
509
- jsxElement: (
510
- <DataGrid<TestEntry, 'id' | 'name'>
511
- columns={['id', 'name']}
512
- collectionService={service}
513
- findOptions={findOptions}
514
- styles={{}}
515
- headerComponents={{}}
516
- rowComponents={{}}
517
- />
518
- ),
519
- })
510
+ await usingAsync(new Injector(), async (injector) => {
511
+ const rootElement = document.getElementById('root') as HTMLDivElement
512
+ const service = createTestService()
513
+ const findOptions = new ObservableValue<any>({})
514
+
515
+ const { entries } = service.data.getValue()
516
+ service.hasFocus.setValue(true)
517
+ service.focusedEntry.setValue(entries[0])
518
+
519
+ initializeShadeRoot({
520
+ injector,
521
+ rootElement,
522
+ jsxElement: (
523
+ <DataGrid<TestEntry, 'id' | 'name'>
524
+ columns={['id', 'name']}
525
+ collectionService={service}
526
+ findOptions={findOptions}
527
+ styles={{}}
528
+ headerComponents={{}}
529
+ rowComponents={{}}
530
+ />
531
+ ),
532
+ })
520
533
 
521
- await sleepAsync(50)
534
+ await sleepAsync(50)
522
535
 
523
- const keydownEvent = new KeyboardEvent('keydown', { key: ' ', bubbles: true })
524
- window.dispatchEvent(keydownEvent)
536
+ const keydownEvent = new KeyboardEvent('keydown', { key: ' ', bubbles: true })
537
+ window.dispatchEvent(keydownEvent)
525
538
 
526
- expect(service.selection.getValue()).toContain(entries[0])
539
+ expect(service.selection.getValue()).toContain(entries[0])
527
540
 
528
- window.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true }))
529
- expect(service.selection.getValue()).not.toContain(entries[0])
541
+ window.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true }))
542
+ expect(service.selection.getValue()).not.toContain(entries[0])
530
543
 
531
- service[Symbol.dispose]()
532
- findOptions[Symbol.dispose]()
544
+ service[Symbol.dispose]()
545
+ findOptions[Symbol.dispose]()
546
+ })
533
547
  })
534
548
 
535
549
  it('should handle + to select all entries', async () => {
536
- const injector = new Injector()
537
- const rootElement = document.getElementById('root') as HTMLDivElement
538
- const service = createTestService()
539
- const findOptions = new ObservableValue<any>({})
540
-
541
- service.hasFocus.setValue(true)
542
-
543
- initializeShadeRoot({
544
- injector,
545
- rootElement,
546
- jsxElement: (
547
- <DataGrid<TestEntry, 'id' | 'name'>
548
- columns={['id', 'name']}
549
- collectionService={service}
550
- findOptions={findOptions}
551
- styles={{}}
552
- headerComponents={{}}
553
- rowComponents={{}}
554
- />
555
- ),
556
- })
550
+ await usingAsync(new Injector(), async (injector) => {
551
+ const rootElement = document.getElementById('root') as HTMLDivElement
552
+ const service = createTestService()
553
+ const findOptions = new ObservableValue<any>({})
557
554
 
558
- await sleepAsync(50)
555
+ service.hasFocus.setValue(true)
559
556
 
560
- const keydownEvent = new KeyboardEvent('keydown', { key: '+', bubbles: true })
561
- window.dispatchEvent(keydownEvent)
557
+ initializeShadeRoot({
558
+ injector,
559
+ rootElement,
560
+ jsxElement: (
561
+ <DataGrid<TestEntry, 'id' | 'name'>
562
+ columns={['id', 'name']}
563
+ collectionService={service}
564
+ findOptions={findOptions}
565
+ styles={{}}
566
+ headerComponents={{}}
567
+ rowComponents={{}}
568
+ />
569
+ ),
570
+ })
571
+
572
+ await sleepAsync(50)
573
+
574
+ const keydownEvent = new KeyboardEvent('keydown', { key: '+', bubbles: true })
575
+ window.dispatchEvent(keydownEvent)
562
576
 
563
- expect(service.selection.getValue().length).toBe(3)
577
+ expect(service.selection.getValue().length).toBe(3)
564
578
 
565
- service[Symbol.dispose]()
566
- findOptions[Symbol.dispose]()
579
+ service[Symbol.dispose]()
580
+ findOptions[Symbol.dispose]()
581
+ })
567
582
  })
568
583
 
569
584
  it('should handle - to deselect all entries', async () => {
570
- const injector = new Injector()
571
- const rootElement = document.getElementById('root') as HTMLDivElement
572
- const service = createTestService()
573
- const findOptions = new ObservableValue<any>({})
574
-
575
- const { entries } = service.data.getValue()
576
- service.hasFocus.setValue(true)
577
- service.selection.setValue([...entries])
578
-
579
- initializeShadeRoot({
580
- injector,
581
- rootElement,
582
- jsxElement: (
583
- <DataGrid<TestEntry, 'id' | 'name'>
584
- columns={['id', 'name']}
585
- collectionService={service}
586
- findOptions={findOptions}
587
- styles={{}}
588
- headerComponents={{}}
589
- rowComponents={{}}
590
- />
591
- ),
592
- })
585
+ await usingAsync(new Injector(), async (injector) => {
586
+ const rootElement = document.getElementById('root') as HTMLDivElement
587
+ const service = createTestService()
588
+ const findOptions = new ObservableValue<any>({})
589
+
590
+ const { entries } = service.data.getValue()
591
+ service.hasFocus.setValue(true)
592
+ service.selection.setValue([...entries])
593
+
594
+ initializeShadeRoot({
595
+ injector,
596
+ rootElement,
597
+ jsxElement: (
598
+ <DataGrid<TestEntry, 'id' | 'name'>
599
+ columns={['id', 'name']}
600
+ collectionService={service}
601
+ findOptions={findOptions}
602
+ styles={{}}
603
+ headerComponents={{}}
604
+ rowComponents={{}}
605
+ />
606
+ ),
607
+ })
593
608
 
594
- await sleepAsync(50)
609
+ await sleepAsync(50)
595
610
 
596
- const keydownEvent = new KeyboardEvent('keydown', { key: '-', bubbles: true })
597
- window.dispatchEvent(keydownEvent)
611
+ const keydownEvent = new KeyboardEvent('keydown', { key: '-', bubbles: true })
612
+ window.dispatchEvent(keydownEvent)
598
613
 
599
- expect(service.selection.getValue().length).toBe(0)
614
+ expect(service.selection.getValue().length).toBe(0)
600
615
 
601
- service[Symbol.dispose]()
602
- findOptions[Symbol.dispose]()
616
+ service[Symbol.dispose]()
617
+ findOptions[Symbol.dispose]()
618
+ })
603
619
  })
604
620
 
605
621
  it('should handle * to invert selection', async () => {
606
- const injector = new Injector()
607
- const rootElement = document.getElementById('root') as HTMLDivElement
608
- const service = createTestService()
609
- const findOptions = new ObservableValue<any>({})
610
-
611
- const { entries } = service.data.getValue()
612
- service.hasFocus.setValue(true)
613
- service.selection.setValue([entries[0]])
614
-
615
- initializeShadeRoot({
616
- injector,
617
- rootElement,
618
- jsxElement: (
619
- <DataGrid<TestEntry, 'id' | 'name'>
620
- columns={['id', 'name']}
621
- collectionService={service}
622
- findOptions={findOptions}
623
- styles={{}}
624
- headerComponents={{}}
625
- rowComponents={{}}
626
- />
627
- ),
628
- })
622
+ await usingAsync(new Injector(), async (injector) => {
623
+ const rootElement = document.getElementById('root') as HTMLDivElement
624
+ const service = createTestService()
625
+ const findOptions = new ObservableValue<any>({})
626
+
627
+ const { entries } = service.data.getValue()
628
+ service.hasFocus.setValue(true)
629
+ service.selection.setValue([entries[0]])
630
+
631
+ initializeShadeRoot({
632
+ injector,
633
+ rootElement,
634
+ jsxElement: (
635
+ <DataGrid<TestEntry, 'id' | 'name'>
636
+ columns={['id', 'name']}
637
+ collectionService={service}
638
+ findOptions={findOptions}
639
+ styles={{}}
640
+ headerComponents={{}}
641
+ rowComponents={{}}
642
+ />
643
+ ),
644
+ })
629
645
 
630
- await sleepAsync(50)
646
+ await sleepAsync(50)
631
647
 
632
- const keydownEvent = new KeyboardEvent('keydown', { key: '*', bubbles: true })
633
- window.dispatchEvent(keydownEvent)
648
+ const keydownEvent = new KeyboardEvent('keydown', { key: '*', bubbles: true })
649
+ window.dispatchEvent(keydownEvent)
634
650
 
635
- const selection = service.selection.getValue()
636
- expect(selection).not.toContain(entries[0])
637
- expect(selection).toContain(entries[1])
638
- expect(selection).toContain(entries[2])
651
+ const selection = service.selection.getValue()
652
+ expect(selection).not.toContain(entries[0])
653
+ expect(selection).toContain(entries[1])
654
+ expect(selection).toContain(entries[2])
639
655
 
640
- service[Symbol.dispose]()
641
- findOptions[Symbol.dispose]()
656
+ service[Symbol.dispose]()
657
+ findOptions[Symbol.dispose]()
658
+ })
642
659
  })
643
660
 
644
661
  it('should not handle keyboard when not focused', async () => {
645
- const injector = new Injector()
646
- const rootElement = document.getElementById('root') as HTMLDivElement
647
- const service = createTestService()
648
- const findOptions = new ObservableValue<any>({})
649
-
650
- service.hasFocus.setValue(false)
651
- service.focusedEntry.setValue(service.data.getValue().entries[0])
652
-
653
- initializeShadeRoot({
654
- injector,
655
- rootElement,
656
- jsxElement: (
657
- <DataGrid<TestEntry, 'id' | 'name'>
658
- columns={['id', 'name']}
659
- collectionService={service}
660
- findOptions={findOptions}
661
- styles={{}}
662
- headerComponents={{}}
663
- rowComponents={{}}
664
- />
665
- ),
666
- })
662
+ await usingAsync(new Injector(), async (injector) => {
663
+ const rootElement = document.getElementById('root') as HTMLDivElement
664
+ const service = createTestService()
665
+ const findOptions = new ObservableValue<any>({})
666
+
667
+ service.hasFocus.setValue(false)
668
+ service.focusedEntry.setValue(service.data.getValue().entries[0])
669
+
670
+ initializeShadeRoot({
671
+ injector,
672
+ rootElement,
673
+ jsxElement: (
674
+ <DataGrid<TestEntry, 'id' | 'name'>
675
+ columns={['id', 'name']}
676
+ collectionService={service}
677
+ findOptions={findOptions}
678
+ styles={{}}
679
+ headerComponents={{}}
680
+ rowComponents={{}}
681
+ />
682
+ ),
683
+ })
667
684
 
668
- await sleepAsync(50)
685
+ await sleepAsync(50)
669
686
 
670
- const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true })
671
- window.dispatchEvent(keydownEvent)
687
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true })
688
+ window.dispatchEvent(keydownEvent)
672
689
 
673
- expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' })
690
+ expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' })
674
691
 
675
- service[Symbol.dispose]()
676
- findOptions[Symbol.dispose]()
692
+ service[Symbol.dispose]()
693
+ findOptions[Symbol.dispose]()
694
+ })
677
695
  })
678
696
 
679
697
  it('should handle Insert to toggle selection and move to next', async () => {
680
- const injector = new Injector()
681
- const rootElement = document.getElementById('root') as HTMLDivElement
682
- const service = createTestService()
683
- const findOptions = new ObservableValue<any>({})
684
-
685
- const { entries } = service.data.getValue()
686
- service.hasFocus.setValue(true)
687
- service.focusedEntry.setValue(entries[0])
688
-
689
- initializeShadeRoot({
690
- injector,
691
- rootElement,
692
- jsxElement: (
693
- <DataGrid<TestEntry, 'id' | 'name'>
694
- columns={['id', 'name']}
695
- collectionService={service}
696
- findOptions={findOptions}
697
- styles={{}}
698
- headerComponents={{}}
699
- rowComponents={{}}
700
- />
701
- ),
702
- })
698
+ await usingAsync(new Injector(), async (injector) => {
699
+ const rootElement = document.getElementById('root') as HTMLDivElement
700
+ const service = createTestService()
701
+ const findOptions = new ObservableValue<any>({})
702
+
703
+ const { entries } = service.data.getValue()
704
+ service.hasFocus.setValue(true)
705
+ service.focusedEntry.setValue(entries[0])
706
+
707
+ initializeShadeRoot({
708
+ injector,
709
+ rootElement,
710
+ jsxElement: (
711
+ <DataGrid<TestEntry, 'id' | 'name'>
712
+ columns={['id', 'name']}
713
+ collectionService={service}
714
+ findOptions={findOptions}
715
+ styles={{}}
716
+ headerComponents={{}}
717
+ rowComponents={{}}
718
+ />
719
+ ),
720
+ })
703
721
 
704
- await sleepAsync(50)
722
+ await sleepAsync(50)
705
723
 
706
- const keydownEvent = new KeyboardEvent('keydown', { key: 'Insert', bubbles: true })
707
- window.dispatchEvent(keydownEvent)
724
+ const keydownEvent = new KeyboardEvent('keydown', { key: 'Insert', bubbles: true })
725
+ window.dispatchEvent(keydownEvent)
708
726
 
709
- expect(service.selection.getValue()).toContain(entries[0])
710
- expect(service.focusedEntry.getValue()).toEqual(entries[1])
727
+ expect(service.selection.getValue()).toContain(entries[0])
728
+ expect(service.focusedEntry.getValue()).toEqual(entries[1])
711
729
 
712
- service[Symbol.dispose]()
713
- findOptions[Symbol.dispose]()
730
+ service[Symbol.dispose]()
731
+ findOptions[Symbol.dispose]()
732
+ })
714
733
  })
715
734
  })
716
735
 
717
736
  describe('styles', () => {
718
737
  it('should apply wrapper styles when provided', async () => {
719
- const injector = new Injector()
720
- const rootElement = document.getElementById('root') as HTMLDivElement
721
- const service = createTestService()
722
- const findOptions = new ObservableValue<any>({})
723
-
724
- initializeShadeRoot({
725
- injector,
726
- rootElement,
727
- jsxElement: (
728
- <DataGrid<TestEntry, 'id' | 'name'>
729
- columns={['id', 'name']}
730
- collectionService={service}
731
- findOptions={findOptions}
732
- styles={{
733
- wrapper: { backgroundColor: 'red' },
734
- }}
735
- headerComponents={{}}
736
- rowComponents={{}}
737
- />
738
- ),
739
- })
738
+ await usingAsync(new Injector(), async (injector) => {
739
+ const rootElement = document.getElementById('root') as HTMLDivElement
740
+ const service = createTestService()
741
+ const findOptions = new ObservableValue<any>({})
742
+
743
+ initializeShadeRoot({
744
+ injector,
745
+ rootElement,
746
+ jsxElement: (
747
+ <DataGrid<TestEntry, 'id' | 'name'>
748
+ columns={['id', 'name']}
749
+ collectionService={service}
750
+ findOptions={findOptions}
751
+ styles={{
752
+ wrapper: { backgroundColor: 'red' },
753
+ }}
754
+ headerComponents={{}}
755
+ rowComponents={{}}
756
+ />
757
+ ),
758
+ })
740
759
 
741
- await sleepAsync(50)
760
+ await sleepAsync(50)
742
761
 
743
- const grid = document.querySelector('shade-data-grid') as HTMLElement
744
- expect(grid?.style.backgroundColor).toBe('red')
762
+ const grid = document.querySelector('shade-data-grid') as HTMLElement
763
+ expect(grid?.style.backgroundColor).toBe('red')
745
764
 
746
- service[Symbol.dispose]()
747
- findOptions[Symbol.dispose]()
765
+ service[Symbol.dispose]()
766
+ findOptions[Symbol.dispose]()
767
+ })
748
768
  })
749
769
 
750
770
  it('should apply header styles when provided', async () => {
751
- const injector = new Injector()
752
- const rootElement = document.getElementById('root') as HTMLDivElement
753
- const service = createTestService()
754
- const findOptions = new ObservableValue<any>({})
755
-
756
- initializeShadeRoot({
757
- injector,
758
- rootElement,
759
- jsxElement: (
760
- <DataGrid<TestEntry, 'id' | 'name'>
761
- columns={['id', 'name']}
762
- collectionService={service}
763
- findOptions={findOptions}
764
- styles={{
765
- header: { color: 'blue' },
766
- }}
767
- headerComponents={{}}
768
- rowComponents={{}}
769
- />
770
- ),
771
- })
771
+ await usingAsync(new Injector(), async (injector) => {
772
+ const rootElement = document.getElementById('root') as HTMLDivElement
773
+ const service = createTestService()
774
+ const findOptions = new ObservableValue<any>({})
775
+
776
+ initializeShadeRoot({
777
+ injector,
778
+ rootElement,
779
+ jsxElement: (
780
+ <DataGrid<TestEntry, 'id' | 'name'>
781
+ columns={['id', 'name']}
782
+ collectionService={service}
783
+ findOptions={findOptions}
784
+ styles={{
785
+ header: { color: 'blue' },
786
+ }}
787
+ headerComponents={{}}
788
+ rowComponents={{}}
789
+ />
790
+ ),
791
+ })
772
792
 
773
- await sleepAsync(50)
793
+ await sleepAsync(50)
774
794
 
775
- const grid = document.querySelector('shade-data-grid')
776
- const headers = grid?.querySelectorAll('th') as NodeListOf<HTMLElement>
777
- expect(headers?.[0]?.style.color).toBe('blue')
795
+ const grid = document.querySelector('shade-data-grid')
796
+ const headers = grid?.querySelectorAll('th') as NodeListOf<HTMLElement>
797
+ expect(headers?.[0]?.style.color).toBe('blue')
778
798
 
779
- service[Symbol.dispose]()
780
- findOptions[Symbol.dispose]()
799
+ service[Symbol.dispose]()
800
+ findOptions[Symbol.dispose]()
801
+ })
781
802
  })
782
803
  })
783
804
 
784
805
  describe('empty and loading states', () => {
785
806
  it('should show empty component when no data', async () => {
786
- const injector = new Injector()
787
- const rootElement = document.getElementById('root') as HTMLDivElement
788
- const service = new CollectionService<TestEntry>()
789
- const findOptions = new ObservableValue<any>({})
790
-
791
- initializeShadeRoot({
792
- injector,
793
- rootElement,
794
- jsxElement: (
795
- <DataGrid<TestEntry, 'id' | 'name'>
796
- columns={['id', 'name']}
797
- collectionService={service}
798
- findOptions={findOptions}
799
- styles={{}}
800
- headerComponents={{}}
801
- rowComponents={{}}
802
- emptyComponent={<div data-testid="empty-state">No data available</div>}
803
- />
804
- ),
805
- })
807
+ await usingAsync(new Injector(), async (injector) => {
808
+ const rootElement = document.getElementById('root') as HTMLDivElement
809
+ const service = new CollectionService<TestEntry>()
810
+ const findOptions = new ObservableValue<any>({})
811
+
812
+ initializeShadeRoot({
813
+ injector,
814
+ rootElement,
815
+ jsxElement: (
816
+ <DataGrid<TestEntry, 'id' | 'name'>
817
+ columns={['id', 'name']}
818
+ collectionService={service}
819
+ findOptions={findOptions}
820
+ styles={{}}
821
+ headerComponents={{}}
822
+ rowComponents={{}}
823
+ emptyComponent={<div data-testid="empty-state">No data available</div>}
824
+ />
825
+ ),
826
+ })
806
827
 
807
- await sleepAsync(50)
828
+ await sleepAsync(50)
808
829
 
809
- const grid = document.querySelector('shade-data-grid')
810
- const emptyState = grid?.querySelector('[data-testid="empty-state"]')
811
- expect(emptyState).not.toBeNull()
812
- expect(emptyState?.textContent).toBe('No data available')
830
+ const grid = document.querySelector('shade-data-grid')
831
+ const emptyState = grid?.querySelector('[data-testid="empty-state"]')
832
+ expect(emptyState).not.toBeNull()
833
+ expect(emptyState?.textContent).toBe('No data available')
813
834
 
814
- service[Symbol.dispose]()
815
- findOptions[Symbol.dispose]()
835
+ service[Symbol.dispose]()
836
+ findOptions[Symbol.dispose]()
837
+ })
816
838
  })
817
839
  })
818
840
 
819
841
  describe('row interactions', () => {
820
842
  it('should pass row click to collectionService', async () => {
821
- const injector = new Injector()
822
- const rootElement = document.getElementById('root') as HTMLDivElement
823
- const onRowClick = vi.fn()
824
- const service = new CollectionService<TestEntry>({ onRowClick })
825
- const findOptions = new ObservableValue<any>({})
826
-
827
- service.data.setValue({
828
- count: 1,
829
- entries: [{ id: 1, name: 'Test' }],
830
- })
831
-
832
- initializeShadeRoot({
833
- injector,
834
- rootElement,
835
- jsxElement: (
836
- <DataGrid<TestEntry, 'id' | 'name'>
837
- columns={['id', 'name']}
838
- collectionService={service}
839
- findOptions={findOptions}
840
- styles={{}}
841
- headerComponents={{}}
842
- rowComponents={{}}
843
- />
844
- ),
845
- })
843
+ await usingAsync(new Injector(), async (injector) => {
844
+ const rootElement = document.getElementById('root') as HTMLDivElement
845
+ const onRowClick = vi.fn()
846
+ const service = new CollectionService<TestEntry>({ onRowClick })
847
+ const findOptions = new ObservableValue<any>({})
848
+
849
+ service.data.setValue({
850
+ count: 1,
851
+ entries: [{ id: 1, name: 'Test' }],
852
+ })
853
+
854
+ initializeShadeRoot({
855
+ injector,
856
+ rootElement,
857
+ jsxElement: (
858
+ <DataGrid<TestEntry, 'id' | 'name'>
859
+ columns={['id', 'name']}
860
+ collectionService={service}
861
+ findOptions={findOptions}
862
+ styles={{}}
863
+ headerComponents={{}}
864
+ rowComponents={{}}
865
+ />
866
+ ),
867
+ })
846
868
 
847
- await sleepAsync(50)
869
+ await sleepAsync(50)
848
870
 
849
- const grid = document.querySelector('shade-data-grid')
850
- const cell = grid?.querySelector('td') as HTMLTableCellElement
851
- cell?.click()
871
+ const grid = document.querySelector('shade-data-grid')
872
+ const cell = grid?.querySelector('td') as HTMLTableCellElement
873
+ cell?.click()
852
874
 
853
- expect(onRowClick).toHaveBeenCalledWith({ id: 1, name: 'Test' })
875
+ expect(onRowClick).toHaveBeenCalledWith({ id: 1, name: 'Test' })
854
876
 
855
- service[Symbol.dispose]()
856
- findOptions[Symbol.dispose]()
877
+ service[Symbol.dispose]()
878
+ findOptions[Symbol.dispose]()
879
+ })
857
880
  })
858
881
 
859
882
  it('should pass row double click to collectionService', async () => {
860
- const injector = new Injector()
861
- const rootElement = document.getElementById('root') as HTMLDivElement
862
- const onRowDoubleClick = vi.fn()
863
- const service = new CollectionService<TestEntry>({ onRowDoubleClick })
864
- const findOptions = new ObservableValue<any>({})
865
-
866
- service.data.setValue({
867
- count: 1,
868
- entries: [{ id: 1, name: 'Test' }],
869
- })
870
-
871
- initializeShadeRoot({
872
- injector,
873
- rootElement,
874
- jsxElement: (
875
- <DataGrid<TestEntry, 'id' | 'name'>
876
- columns={['id', 'name']}
877
- collectionService={service}
878
- findOptions={findOptions}
879
- styles={{}}
880
- headerComponents={{}}
881
- rowComponents={{}}
882
- />
883
- ),
884
- })
883
+ await usingAsync(new Injector(), async (injector) => {
884
+ const rootElement = document.getElementById('root') as HTMLDivElement
885
+ const onRowDoubleClick = vi.fn()
886
+ const service = new CollectionService<TestEntry>({ onRowDoubleClick })
887
+ const findOptions = new ObservableValue<any>({})
888
+
889
+ service.data.setValue({
890
+ count: 1,
891
+ entries: [{ id: 1, name: 'Test' }],
892
+ })
893
+
894
+ initializeShadeRoot({
895
+ injector,
896
+ rootElement,
897
+ jsxElement: (
898
+ <DataGrid<TestEntry, 'id' | 'name'>
899
+ columns={['id', 'name']}
900
+ collectionService={service}
901
+ findOptions={findOptions}
902
+ styles={{}}
903
+ headerComponents={{}}
904
+ rowComponents={{}}
905
+ />
906
+ ),
907
+ })
885
908
 
886
- await sleepAsync(50)
909
+ await sleepAsync(50)
887
910
 
888
- const grid = document.querySelector('shade-data-grid')
889
- const cell = grid?.querySelector('td') as HTMLTableCellElement
890
- const dblClickEvent = new MouseEvent('dblclick', { bubbles: true })
891
- cell?.dispatchEvent(dblClickEvent)
911
+ const grid = document.querySelector('shade-data-grid')
912
+ const cell = grid?.querySelector('td') as HTMLTableCellElement
913
+ const dblClickEvent = new MouseEvent('dblclick', { bubbles: true })
914
+ cell?.dispatchEvent(dblClickEvent)
892
915
 
893
- expect(onRowDoubleClick).toHaveBeenCalledWith({ id: 1, name: 'Test' })
916
+ expect(onRowDoubleClick).toHaveBeenCalledWith({ id: 1, name: 'Test' })
894
917
 
895
- service[Symbol.dispose]()
896
- findOptions[Symbol.dispose]()
918
+ service[Symbol.dispose]()
919
+ findOptions[Symbol.dispose]()
920
+ })
897
921
  })
898
922
  })
899
923
 
900
924
  describe('keyboard listener cleanup', () => {
901
925
  it('should remove keyboard listener when component is disconnected', async () => {
902
- const injector = new Injector()
903
- const rootElement = document.getElementById('root') as HTMLDivElement
904
- const service = createTestService()
905
- const findOptions = new ObservableValue<any>({})
906
-
907
- service.hasFocus.setValue(true)
908
- service.focusedEntry.setValue(service.data.getValue().entries[0])
909
-
910
- initializeShadeRoot({
911
- injector,
912
- rootElement,
913
- jsxElement: (
914
- <DataGrid<TestEntry, 'id' | 'name'>
915
- columns={['id', 'name']}
916
- collectionService={service}
917
- findOptions={findOptions}
918
- styles={{}}
919
- headerComponents={{}}
920
- rowComponents={{}}
921
- />
922
- ),
923
- })
926
+ await usingAsync(new Injector(), async (injector) => {
927
+ const rootElement = document.getElementById('root') as HTMLDivElement
928
+ const service = createTestService()
929
+ const findOptions = new ObservableValue<any>({})
930
+
931
+ service.hasFocus.setValue(true)
932
+ service.focusedEntry.setValue(service.data.getValue().entries[0])
933
+
934
+ initializeShadeRoot({
935
+ injector,
936
+ rootElement,
937
+ jsxElement: (
938
+ <DataGrid<TestEntry, 'id' | 'name'>
939
+ columns={['id', 'name']}
940
+ collectionService={service}
941
+ findOptions={findOptions}
942
+ styles={{}}
943
+ headerComponents={{}}
944
+ rowComponents={{}}
945
+ />
946
+ ),
947
+ })
924
948
 
925
- await sleepAsync(50)
949
+ await sleepAsync(50)
926
950
 
927
- const grid = document.querySelector('shade-data-grid') as HTMLElement
928
- grid.remove()
951
+ const grid = document.querySelector('shade-data-grid') as HTMLElement
952
+ grid.remove()
929
953
 
930
- await sleepAsync(10)
954
+ await sleepAsync(10)
931
955
 
932
- window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
933
- expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' })
956
+ window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
957
+ expect(service.focusedEntry.getValue()).toEqual({ id: 1, name: 'First' })
934
958
 
935
- service[Symbol.dispose]()
936
- findOptions[Symbol.dispose]()
959
+ service[Symbol.dispose]()
960
+ findOptions[Symbol.dispose]()
961
+ })
937
962
  })
938
963
  })
939
964
  })