@furystack/shades-common-components 11.0.0 → 12.0.1

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