@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 { sleepAsync } from '@furystack/utils'
3
+ import { sleepAsync, usingAsync } from '@furystack/utils'
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
5
5
  import { ThemeProviderService } from '../../services/theme-provider-service.js'
6
6
  import { Form, FormService } from '../form.js'
@@ -17,792 +17,828 @@ describe('Input', () => {
17
17
  })
18
18
 
19
19
  it('should render with shadow DOM', async () => {
20
- const injector = new Injector()
21
- const rootElement = document.getElementById('root') as HTMLDivElement
20
+ await usingAsync(new Injector(), async (injector) => {
21
+ const rootElement = document.getElementById('root') as HTMLDivElement
22
22
 
23
- initializeShadeRoot({
24
- injector,
25
- rootElement,
26
- jsxElement: <Input />,
27
- })
23
+ initializeShadeRoot({
24
+ injector,
25
+ rootElement,
26
+ jsxElement: <Input />,
27
+ })
28
28
 
29
- await sleepAsync(50)
29
+ await sleepAsync(50)
30
30
 
31
- const input = document.querySelector('shade-input')
32
- expect(input).not.toBeNull()
31
+ const input = document.querySelector('shade-input')
32
+ expect(input).not.toBeNull()
33
+ })
33
34
  })
34
35
 
35
36
  it('should render the inner input element', async () => {
36
- const injector = new Injector()
37
- const rootElement = document.getElementById('root') as HTMLDivElement
37
+ await usingAsync(new Injector(), async (injector) => {
38
+ const rootElement = document.getElementById('root') as HTMLDivElement
38
39
 
39
- initializeShadeRoot({
40
- injector,
41
- rootElement,
42
- jsxElement: <Input name="testField" />,
43
- })
40
+ initializeShadeRoot({
41
+ injector,
42
+ rootElement,
43
+ jsxElement: <Input name="testField" />,
44
+ })
44
45
 
45
- await sleepAsync(50)
46
+ await sleepAsync(50)
46
47
 
47
- const input = document.querySelector('shade-input input') as HTMLInputElement
48
- expect(input).not.toBeNull()
49
- expect(input.name).toBe('testField')
48
+ const input = document.querySelector('shade-input input') as HTMLInputElement
49
+ expect(input).not.toBeNull()
50
+ expect(input.name).toBe('testField')
51
+ })
50
52
  })
51
53
 
52
54
  it('should render the label title', async () => {
53
- const injector = new Injector()
54
- const rootElement = document.getElementById('root') as HTMLDivElement
55
+ await usingAsync(new Injector(), async (injector) => {
56
+ const rootElement = document.getElementById('root') as HTMLDivElement
55
57
 
56
- initializeShadeRoot({
57
- injector,
58
- rootElement,
59
- jsxElement: <Input labelTitle="Test Label" />,
60
- })
58
+ initializeShadeRoot({
59
+ injector,
60
+ rootElement,
61
+ jsxElement: <Input labelTitle="Test Label" />,
62
+ })
61
63
 
62
- await sleepAsync(50)
64
+ await sleepAsync(50)
63
65
 
64
- const label = document.querySelector('shade-input label') as HTMLLabelElement
65
- expect(label).not.toBeNull()
66
- expect(label.textContent).toContain('Test Label')
66
+ const label = document.querySelector('shade-input label') as HTMLLabelElement
67
+ expect(label).not.toBeNull()
68
+ expect(label.textContent).toContain('Test Label')
69
+ })
67
70
  })
68
71
 
69
72
  describe('variants', () => {
70
73
  it('should set data-variant attribute for outlined variant', async () => {
71
- const injector = new Injector()
72
- const rootElement = document.getElementById('root') as HTMLDivElement
74
+ await usingAsync(new Injector(), async (injector) => {
75
+ const rootElement = document.getElementById('root') as HTMLDivElement
73
76
 
74
- initializeShadeRoot({
75
- injector,
76
- rootElement,
77
- jsxElement: <Input variant="outlined" />,
78
- })
77
+ initializeShadeRoot({
78
+ injector,
79
+ rootElement,
80
+ jsxElement: <Input variant="outlined" />,
81
+ })
79
82
 
80
- await sleepAsync(50)
83
+ await sleepAsync(50)
81
84
 
82
- const input = document.querySelector('shade-input') as HTMLElement
83
- expect(input).not.toBeNull()
84
- expect(input.getAttribute('data-variant')).toBe('outlined')
85
+ const input = document.querySelector('shade-input') as HTMLElement
86
+ expect(input).not.toBeNull()
87
+ expect(input.getAttribute('data-variant')).toBe('outlined')
88
+ })
85
89
  })
86
90
 
87
91
  it('should set data-variant attribute for contained variant', async () => {
88
- const injector = new Injector()
89
- const rootElement = document.getElementById('root') as HTMLDivElement
92
+ await usingAsync(new Injector(), async (injector) => {
93
+ const rootElement = document.getElementById('root') as HTMLDivElement
90
94
 
91
- initializeShadeRoot({
92
- injector,
93
- rootElement,
94
- jsxElement: <Input variant="contained" />,
95
- })
95
+ initializeShadeRoot({
96
+ injector,
97
+ rootElement,
98
+ jsxElement: <Input variant="contained" />,
99
+ })
96
100
 
97
- await sleepAsync(50)
101
+ await sleepAsync(50)
98
102
 
99
- const input = document.querySelector('shade-input') as HTMLElement
100
- expect(input).not.toBeNull()
101
- expect(input.getAttribute('data-variant')).toBe('contained')
103
+ const input = document.querySelector('shade-input') as HTMLElement
104
+ expect(input).not.toBeNull()
105
+ expect(input.getAttribute('data-variant')).toBe('contained')
106
+ })
102
107
  })
103
108
 
104
109
  it('should not have data-variant when variant is not specified', async () => {
105
- const injector = new Injector()
106
- const rootElement = document.getElementById('root') as HTMLDivElement
110
+ await usingAsync(new Injector(), async (injector) => {
111
+ const rootElement = document.getElementById('root') as HTMLDivElement
107
112
 
108
- initializeShadeRoot({
109
- injector,
110
- rootElement,
111
- jsxElement: <Input />,
112
- })
113
+ initializeShadeRoot({
114
+ injector,
115
+ rootElement,
116
+ jsxElement: <Input />,
117
+ })
113
118
 
114
- await sleepAsync(50)
119
+ await sleepAsync(50)
115
120
 
116
- const input = document.querySelector('shade-input') as HTMLElement
117
- expect(input).not.toBeNull()
118
- expect(input.hasAttribute('data-variant')).toBe(false)
121
+ const input = document.querySelector('shade-input') as HTMLElement
122
+ expect(input).not.toBeNull()
123
+ expect(input.hasAttribute('data-variant')).toBe(false)
124
+ })
119
125
  })
120
126
  })
121
127
 
122
128
  describe('disabled state', () => {
123
129
  it('should set data-disabled attribute when disabled', async () => {
124
- const injector = new Injector()
125
- const rootElement = document.getElementById('root') as HTMLDivElement
130
+ await usingAsync(new Injector(), async (injector) => {
131
+ const rootElement = document.getElementById('root') as HTMLDivElement
126
132
 
127
- initializeShadeRoot({
128
- injector,
129
- rootElement,
130
- jsxElement: <Input disabled />,
131
- })
133
+ initializeShadeRoot({
134
+ injector,
135
+ rootElement,
136
+ jsxElement: <Input disabled />,
137
+ })
132
138
 
133
- await sleepAsync(50)
139
+ await sleepAsync(50)
134
140
 
135
- const input = document.querySelector('shade-input') as HTMLElement
136
- expect(input).not.toBeNull()
137
- expect(input.hasAttribute('data-disabled')).toBe(true)
141
+ const input = document.querySelector('shade-input') as HTMLElement
142
+ expect(input).not.toBeNull()
143
+ expect(input.hasAttribute('data-disabled')).toBe(true)
144
+ })
138
145
  })
139
146
 
140
147
  it('should not have data-disabled attribute when not disabled', async () => {
141
- const injector = new Injector()
142
- const rootElement = document.getElementById('root') as HTMLDivElement
148
+ await usingAsync(new Injector(), async (injector) => {
149
+ const rootElement = document.getElementById('root') as HTMLDivElement
143
150
 
144
- initializeShadeRoot({
145
- injector,
146
- rootElement,
147
- jsxElement: <Input disabled={false} />,
148
- })
151
+ initializeShadeRoot({
152
+ injector,
153
+ rootElement,
154
+ jsxElement: <Input disabled={false} />,
155
+ })
149
156
 
150
- await sleepAsync(50)
157
+ await sleepAsync(50)
151
158
 
152
- const input = document.querySelector('shade-input') as HTMLElement
153
- expect(input).not.toBeNull()
154
- expect(input.hasAttribute('data-disabled')).toBe(false)
159
+ const input = document.querySelector('shade-input') as HTMLElement
160
+ expect(input).not.toBeNull()
161
+ expect(input.hasAttribute('data-disabled')).toBe(false)
162
+ })
155
163
  })
156
164
  })
157
165
 
158
166
  describe('validation', () => {
159
167
  it('should call custom validation callback', async () => {
160
- const injector = new Injector()
161
- const rootElement = document.getElementById('root') as HTMLDivElement
162
- const getValidationResult = vi.fn().mockReturnValue({ isValid: true })
168
+ await usingAsync(new Injector(), async (injector) => {
169
+ const rootElement = document.getElementById('root') as HTMLDivElement
170
+ const getValidationResult = vi.fn().mockReturnValue({ isValid: true })
163
171
 
164
- initializeShadeRoot({
165
- injector,
166
- rootElement,
167
- jsxElement: <Input name="email" getValidationResult={getValidationResult} />,
168
- })
172
+ initializeShadeRoot({
173
+ injector,
174
+ rootElement,
175
+ jsxElement: <Input name="email" getValidationResult={getValidationResult} />,
176
+ })
169
177
 
170
- await sleepAsync(50)
178
+ await sleepAsync(50)
171
179
 
172
- const input = document.querySelector('shade-input input') as HTMLInputElement
173
- input.value = 'test@example.com'
174
- input.dispatchEvent(new Event('change', { bubbles: true }))
180
+ const input = document.querySelector('shade-input input') as HTMLInputElement
181
+ input.value = 'test@example.com'
182
+ input.dispatchEvent(new Event('change', { bubbles: true }))
175
183
 
176
- await sleepAsync(50)
184
+ await sleepAsync(50)
177
185
 
178
- expect(getValidationResult).toHaveBeenCalled()
186
+ expect(getValidationResult).toHaveBeenCalled()
187
+ })
179
188
  })
180
189
 
181
190
  it('should set data-invalid when validation fails', async () => {
182
- const injector = new Injector()
183
- const rootElement = document.getElementById('root') as HTMLDivElement
191
+ await usingAsync(new Injector(), async (injector) => {
192
+ const rootElement = document.getElementById('root') as HTMLDivElement
184
193
 
185
- initializeShadeRoot({
186
- injector,
187
- rootElement,
188
- jsxElement: (
189
- <Input
190
- name="email"
191
- getValidationResult={() => ({ isValid: false, message: 'Invalid email' })}
192
- value="invalid"
193
- />
194
- ),
195
- })
194
+ initializeShadeRoot({
195
+ injector,
196
+ rootElement,
197
+ jsxElement: (
198
+ <Input
199
+ name="email"
200
+ getValidationResult={() => ({ isValid: false, message: 'Invalid email' })}
201
+ value="invalid"
202
+ />
203
+ ),
204
+ })
196
205
 
197
- await sleepAsync(50)
206
+ await sleepAsync(50)
198
207
 
199
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
200
- const input = inputWrapper.querySelector('input') as HTMLInputElement
201
- input.value = 'invalid'
202
- input.dispatchEvent(new Event('change', { bubbles: true }))
208
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
209
+ const input = inputWrapper.querySelector('input') as HTMLInputElement
210
+ input.value = 'invalid'
211
+ input.dispatchEvent(new Event('change', { bubbles: true }))
203
212
 
204
- await sleepAsync(50)
213
+ await sleepAsync(50)
205
214
 
206
- expect(inputWrapper.hasAttribute('data-invalid')).toBe(true)
215
+ expect(inputWrapper.hasAttribute('data-invalid')).toBe(true)
216
+ })
207
217
  })
208
218
 
209
219
  it('should not have data-invalid when validation passes', async () => {
210
- const injector = new Injector()
211
- const rootElement = document.getElementById('root') as HTMLDivElement
220
+ await usingAsync(new Injector(), async (injector) => {
221
+ const rootElement = document.getElementById('root') as HTMLDivElement
212
222
 
213
- initializeShadeRoot({
214
- injector,
215
- rootElement,
216
- jsxElement: <Input name="email" getValidationResult={() => ({ isValid: true })} value="valid@email.com" />,
217
- })
223
+ initializeShadeRoot({
224
+ injector,
225
+ rootElement,
226
+ jsxElement: <Input name="email" getValidationResult={() => ({ isValid: true })} value="valid@email.com" />,
227
+ })
218
228
 
219
- await sleepAsync(50)
229
+ await sleepAsync(50)
220
230
 
221
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
222
- const input = inputWrapper.querySelector('input') as HTMLInputElement
223
- input.value = 'valid@email.com'
224
- input.dispatchEvent(new Event('change', { bubbles: true }))
231
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
232
+ const input = inputWrapper.querySelector('input') as HTMLInputElement
233
+ input.value = 'valid@email.com'
234
+ input.dispatchEvent(new Event('change', { bubbles: true }))
225
235
 
226
- await sleepAsync(50)
236
+ await sleepAsync(50)
227
237
 
228
- expect(inputWrapper.hasAttribute('data-invalid')).toBe(false)
238
+ expect(inputWrapper.hasAttribute('data-invalid')).toBe(false)
239
+ })
229
240
  })
230
241
 
231
242
  it('should display validation message in helper text when validation fails', async () => {
232
- const injector = new Injector()
233
- const rootElement = document.getElementById('root') as HTMLDivElement
243
+ await usingAsync(new Injector(), async (injector) => {
244
+ const rootElement = document.getElementById('root') as HTMLDivElement
234
245
 
235
- initializeShadeRoot({
236
- injector,
237
- rootElement,
238
- jsxElement: (
239
- <Input name="email" getValidationResult={() => ({ isValid: false, message: 'Email is required' })} />
240
- ),
241
- })
246
+ initializeShadeRoot({
247
+ injector,
248
+ rootElement,
249
+ jsxElement: (
250
+ <Input name="email" getValidationResult={() => ({ isValid: false, message: 'Email is required' })} />
251
+ ),
252
+ })
242
253
 
243
- await sleepAsync(50)
254
+ await sleepAsync(50)
244
255
 
245
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
246
- const input = inputWrapper.querySelector('input') as HTMLInputElement
247
- input.value = ''
248
- input.dispatchEvent(new Event('change', { bubbles: true }))
256
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
257
+ const input = inputWrapper.querySelector('input') as HTMLInputElement
258
+ input.value = ''
259
+ input.dispatchEvent(new Event('change', { bubbles: true }))
249
260
 
250
- await sleepAsync(50)
261
+ await sleepAsync(50)
251
262
 
252
- const helperText = inputWrapper.querySelector('.helperText') as HTMLElement
253
- expect(helperText.textContent).toBe('Email is required')
263
+ const helperText = inputWrapper.querySelector('.helperText') as HTMLElement
264
+ expect(helperText.textContent).toBe('Email is required')
265
+ })
254
266
  })
255
267
 
256
268
  it('should show default validation message for required field', async () => {
257
- const injector = new Injector()
258
- const rootElement = document.getElementById('root') as HTMLDivElement
269
+ await usingAsync(new Injector(), async (injector) => {
270
+ const rootElement = document.getElementById('root') as HTMLDivElement
259
271
 
260
- initializeShadeRoot({
261
- injector,
262
- rootElement,
263
- jsxElement: <Input name="field" required />,
264
- })
272
+ initializeShadeRoot({
273
+ injector,
274
+ rootElement,
275
+ jsxElement: <Input name="field" required />,
276
+ })
265
277
 
266
- await sleepAsync(50)
278
+ await sleepAsync(50)
267
279
 
268
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
269
- const input = inputWrapper.querySelector('input') as HTMLInputElement
280
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
281
+ const input = inputWrapper.querySelector('input') as HTMLInputElement
270
282
 
271
- const invalidEvent = new Event('invalid', { bubbles: true, cancelable: true })
272
- input.dispatchEvent(invalidEvent)
283
+ const invalidEvent = new Event('invalid', { bubbles: true, cancelable: true })
284
+ input.dispatchEvent(invalidEvent)
273
285
 
274
- await sleepAsync(50)
286
+ await sleepAsync(50)
275
287
 
276
- const helperText = inputWrapper.querySelector('.helperText') as HTMLElement
277
- expect(helperText.textContent).toBe('Value is required')
288
+ const helperText = inputWrapper.querySelector('.helperText') as HTMLElement
289
+ expect(helperText.textContent).toBe('Value is required')
290
+ })
278
291
  })
279
292
  })
280
293
 
281
294
  describe('helper text', () => {
282
295
  it('should render custom helper text', async () => {
283
- const injector = new Injector()
284
- const rootElement = document.getElementById('root') as HTMLDivElement
296
+ await usingAsync(new Injector(), async (injector) => {
297
+ const rootElement = document.getElementById('root') as HTMLDivElement
285
298
 
286
- initializeShadeRoot({
287
- injector,
288
- rootElement,
289
- jsxElement: <Input name="email" getHelperText={() => 'Enter your email address'} />,
290
- })
299
+ initializeShadeRoot({
300
+ injector,
301
+ rootElement,
302
+ jsxElement: <Input name="email" getHelperText={() => 'Enter your email address'} />,
303
+ })
291
304
 
292
- await sleepAsync(50)
305
+ await sleepAsync(50)
293
306
 
294
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
295
- const helperText = inputWrapper.querySelector('.helperText') as HTMLElement
307
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
308
+ const helperText = inputWrapper.querySelector('.helperText') as HTMLElement
296
309
 
297
- expect(helperText.textContent).toBe('Enter your email address')
310
+ expect(helperText.textContent).toBe('Enter your email address')
311
+ })
298
312
  })
299
313
 
300
314
  it('should call getHelperText with state and validation result when validation passes', async () => {
301
- const injector = new Injector()
302
- const rootElement = document.getElementById('root') as HTMLDivElement
303
- const getHelperText = vi.fn().mockReturnValue('Helper text')
315
+ await usingAsync(new Injector(), async (injector) => {
316
+ const rootElement = document.getElementById('root') as HTMLDivElement
317
+ const getHelperText = vi.fn().mockReturnValue('Helper text')
304
318
 
305
- initializeShadeRoot({
306
- injector,
307
- rootElement,
308
- jsxElement: (
309
- <Input name="email" getHelperText={getHelperText} getValidationResult={() => ({ isValid: true })} />
310
- ),
311
- })
319
+ initializeShadeRoot({
320
+ injector,
321
+ rootElement,
322
+ jsxElement: (
323
+ <Input name="email" getHelperText={getHelperText} getValidationResult={() => ({ isValid: true })} />
324
+ ),
325
+ })
312
326
 
313
- await sleepAsync(50)
327
+ await sleepAsync(50)
314
328
 
315
- const input = document.querySelector('shade-input input') as HTMLInputElement
316
- input.value = 'test'
317
- input.dispatchEvent(new Event('change', { bubbles: true }))
329
+ const input = document.querySelector('shade-input input') as HTMLInputElement
330
+ input.value = 'test'
331
+ input.dispatchEvent(new Event('change', { bubbles: true }))
318
332
 
319
- await sleepAsync(50)
333
+ await sleepAsync(50)
320
334
 
321
- expect(getHelperText).toHaveBeenCalled()
335
+ expect(getHelperText).toHaveBeenCalled()
322
336
 
323
- const { calls } = getHelperText.mock
324
- const callWithValidation = calls.find(
325
- (call: Array<{ validationResult?: unknown }>) => call[0].validationResult !== undefined,
326
- )
327
- expect(callWithValidation).toBeDefined()
328
- expect((callWithValidation as [{ validationResult: unknown; state: unknown }])[0].validationResult).toEqual({
329
- isValid: true,
337
+ const { calls } = getHelperText.mock
338
+ const callWithValidation = calls.find(
339
+ (call: Array<{ validationResult?: unknown }>) => call[0].validationResult !== undefined,
340
+ )
341
+ expect(callWithValidation).toBeDefined()
342
+ expect((callWithValidation as [{ validationResult: unknown; state: unknown }])[0].validationResult).toEqual({
343
+ isValid: true,
344
+ })
345
+ expect((callWithValidation as [{ validationResult: unknown; state: unknown }])[0].state).toBeDefined()
330
346
  })
331
- expect((callWithValidation as [{ validationResult: unknown; state: unknown }])[0].state).toBeDefined()
332
347
  })
333
348
 
334
349
  it('should use validation message instead of getHelperText when validation fails with message', async () => {
335
- const injector = new Injector()
336
- const rootElement = document.getElementById('root') as HTMLDivElement
337
- const getHelperText = vi.fn().mockReturnValue('Fallback helper')
338
-
339
- initializeShadeRoot({
340
- injector,
341
- rootElement,
342
- jsxElement: (
343
- <Input
344
- name="email"
345
- getHelperText={getHelperText}
346
- getValidationResult={() => ({ isValid: false, message: 'Validation error message' })}
347
- />
348
- ),
349
- })
350
+ await usingAsync(new Injector(), async (injector) => {
351
+ const rootElement = document.getElementById('root') as HTMLDivElement
352
+ const getHelperText = vi.fn().mockReturnValue('Fallback helper')
353
+
354
+ initializeShadeRoot({
355
+ injector,
356
+ rootElement,
357
+ jsxElement: (
358
+ <Input
359
+ name="email"
360
+ getHelperText={getHelperText}
361
+ getValidationResult={() => ({ isValid: false, message: 'Validation error message' })}
362
+ />
363
+ ),
364
+ })
350
365
 
351
- await sleepAsync(50)
366
+ await sleepAsync(50)
352
367
 
353
- const input = document.querySelector('shade-input input') as HTMLInputElement
354
- input.value = 'test'
355
- input.dispatchEvent(new Event('change', { bubbles: true }))
368
+ const input = document.querySelector('shade-input input') as HTMLInputElement
369
+ input.value = 'test'
370
+ input.dispatchEvent(new Event('change', { bubbles: true }))
356
371
 
357
- await sleepAsync(50)
372
+ await sleepAsync(50)
358
373
 
359
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
360
- const helperText = inputWrapper.querySelector('.helperText') as HTMLElement
374
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
375
+ const helperText = inputWrapper.querySelector('.helperText') as HTMLElement
361
376
 
362
- expect(helperText.textContent).toBe('Validation error message')
377
+ expect(helperText.textContent).toBe('Validation error message')
378
+ })
363
379
  })
364
380
  })
365
381
 
366
382
  describe('icons', () => {
367
383
  it('should render start icon when getStartIcon is provided', async () => {
368
- const injector = new Injector()
369
- const rootElement = document.getElementById('root') as HTMLDivElement
384
+ await usingAsync(new Injector(), async (injector) => {
385
+ const rootElement = document.getElementById('root') as HTMLDivElement
370
386
 
371
- initializeShadeRoot({
372
- injector,
373
- rootElement,
374
- jsxElement: <Input name="search" getStartIcon={() => '🔍'} />,
375
- })
387
+ initializeShadeRoot({
388
+ injector,
389
+ rootElement,
390
+ jsxElement: <Input name="search" getStartIcon={() => '🔍'} />,
391
+ })
376
392
 
377
- await sleepAsync(50)
393
+ await sleepAsync(50)
378
394
 
379
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
380
- const startIcon = inputWrapper.querySelector('.startIcon') as HTMLElement
395
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
396
+ const startIcon = inputWrapper.querySelector('.startIcon') as HTMLElement
381
397
 
382
- expect(startIcon).not.toBeNull()
383
- expect(startIcon.textContent).toBe('🔍')
398
+ expect(startIcon).not.toBeNull()
399
+ expect(startIcon.textContent).toBe('🔍')
400
+ })
384
401
  })
385
402
 
386
403
  it('should render end icon when getEndIcon is provided', async () => {
387
- const injector = new Injector()
388
- const rootElement = document.getElementById('root') as HTMLDivElement
404
+ await usingAsync(new Injector(), async (injector) => {
405
+ const rootElement = document.getElementById('root') as HTMLDivElement
389
406
 
390
- initializeShadeRoot({
391
- injector,
392
- rootElement,
393
- jsxElement: <Input name="password" getEndIcon={() => '👁️'} />,
394
- })
407
+ initializeShadeRoot({
408
+ injector,
409
+ rootElement,
410
+ jsxElement: <Input name="password" getEndIcon={() => '👁️'} />,
411
+ })
395
412
 
396
- await sleepAsync(50)
413
+ await sleepAsync(50)
397
414
 
398
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
399
- const endIcon = inputWrapper.querySelector('.endIcon') as HTMLElement
415
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
416
+ const endIcon = inputWrapper.querySelector('.endIcon') as HTMLElement
400
417
 
401
- expect(endIcon).not.toBeNull()
402
- expect(endIcon.textContent).toBe('👁️')
418
+ expect(endIcon).not.toBeNull()
419
+ expect(endIcon.textContent).toBe('👁️')
420
+ })
403
421
  })
404
422
 
405
423
  it('should not render icon container when getStartIcon is not provided', async () => {
406
- const injector = new Injector()
407
- const rootElement = document.getElementById('root') as HTMLDivElement
424
+ await usingAsync(new Injector(), async (injector) => {
425
+ const rootElement = document.getElementById('root') as HTMLDivElement
408
426
 
409
- initializeShadeRoot({
410
- injector,
411
- rootElement,
412
- jsxElement: <Input name="field" />,
413
- })
427
+ initializeShadeRoot({
428
+ injector,
429
+ rootElement,
430
+ jsxElement: <Input name="field" />,
431
+ })
414
432
 
415
- await sleepAsync(50)
433
+ await sleepAsync(50)
416
434
 
417
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
418
- const startIcon = inputWrapper.querySelector('.startIcon')
435
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
436
+ const startIcon = inputWrapper.querySelector('.startIcon')
419
437
 
420
- expect(startIcon).toBeNull()
438
+ expect(startIcon).toBeNull()
439
+ })
421
440
  })
422
441
 
423
442
  it('should update icons on state change', async () => {
424
- const injector = new Injector()
425
- const rootElement = document.getElementById('root') as HTMLDivElement
443
+ await usingAsync(new Injector(), async (injector) => {
444
+ const rootElement = document.getElementById('root') as HTMLDivElement
426
445
 
427
- initializeShadeRoot({
428
- injector,
429
- rootElement,
430
- jsxElement: <Input name="field" getEndIcon={({ state }) => (state.focused ? '✓' : '○')} />,
431
- })
446
+ initializeShadeRoot({
447
+ injector,
448
+ rootElement,
449
+ jsxElement: <Input name="field" getEndIcon={({ state }) => (state.focused ? '✓' : '○')} />,
450
+ })
432
451
 
433
- await sleepAsync(50)
452
+ await sleepAsync(50)
434
453
 
435
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
436
- const input = inputWrapper.querySelector('input') as HTMLInputElement
437
- const endIcon = inputWrapper.querySelector('.endIcon') as HTMLElement
454
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
455
+ const input = inputWrapper.querySelector('input') as HTMLInputElement
456
+ const endIcon = inputWrapper.querySelector('.endIcon') as HTMLElement
438
457
 
439
- expect(endIcon.textContent).toBe('○')
458
+ expect(endIcon.textContent).toBe('○')
440
459
 
441
- input.dispatchEvent(new FocusEvent('focus'))
442
- await sleepAsync(50)
460
+ input.dispatchEvent(new FocusEvent('focus'))
461
+ await sleepAsync(50)
443
462
 
444
- expect(endIcon.textContent).toBe('✓')
463
+ expect(endIcon.textContent).toBe('✓')
464
+ })
445
465
  })
446
466
  })
447
467
 
448
468
  describe('theme integration', () => {
449
469
  it('should set CSS color variables from theme', async () => {
450
- const injector = new Injector()
451
- const rootElement = document.getElementById('root') as HTMLDivElement
470
+ await usingAsync(new Injector(), async (injector) => {
471
+ const rootElement = document.getElementById('root') as HTMLDivElement
452
472
 
453
- initializeShadeRoot({
454
- injector,
455
- rootElement,
456
- jsxElement: <Input name="field" />,
457
- })
473
+ initializeShadeRoot({
474
+ injector,
475
+ rootElement,
476
+ jsxElement: <Input name="field" />,
477
+ })
458
478
 
459
- await sleepAsync(50)
479
+ await sleepAsync(50)
460
480
 
461
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
481
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
462
482
 
463
- const themeService = injector.getInstance(ThemeProviderService)
464
- expect(inputWrapper.style.getPropertyValue('--input-primary-color')).toBe(themeService.theme.palette.primary.main)
465
- expect(inputWrapper.style.getPropertyValue('--input-error-color')).toBe(themeService.theme.palette.error.main)
483
+ const themeService = injector.getInstance(ThemeProviderService)
484
+ expect(inputWrapper.style.getPropertyValue('--input-primary-color')).toBe(
485
+ themeService.theme.palette.primary.main,
486
+ )
487
+ expect(inputWrapper.style.getPropertyValue('--input-error-color')).toBe(themeService.theme.palette.error.main)
488
+ })
466
489
  })
467
490
 
468
491
  it('should use custom color from defaultColor prop', async () => {
469
- const injector = new Injector()
470
- const rootElement = document.getElementById('root') as HTMLDivElement
492
+ await usingAsync(new Injector(), async (injector) => {
493
+ const rootElement = document.getElementById('root') as HTMLDivElement
471
494
 
472
- initializeShadeRoot({
473
- injector,
474
- rootElement,
475
- jsxElement: <Input name="field" defaultColor="secondary" />,
476
- })
495
+ initializeShadeRoot({
496
+ injector,
497
+ rootElement,
498
+ jsxElement: <Input name="field" defaultColor="secondary" />,
499
+ })
477
500
 
478
- await sleepAsync(50)
501
+ await sleepAsync(50)
479
502
 
480
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
503
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
481
504
 
482
- const themeService = injector.getInstance(ThemeProviderService)
483
- expect(inputWrapper.style.getPropertyValue('--input-primary-color')).toBe(
484
- themeService.theme.palette.secondary.main,
485
- )
505
+ const themeService = injector.getInstance(ThemeProviderService)
506
+ expect(inputWrapper.style.getPropertyValue('--input-primary-color')).toBe(
507
+ themeService.theme.palette.secondary.main,
508
+ )
509
+ })
486
510
  })
487
511
  })
488
512
 
489
513
  describe('callbacks', () => {
490
514
  it('should call onTextChange when input value changes', async () => {
491
- const injector = new Injector()
492
- const rootElement = document.getElementById('root') as HTMLDivElement
493
- const onTextChange = vi.fn()
515
+ await usingAsync(new Injector(), async (injector) => {
516
+ const rootElement = document.getElementById('root') as HTMLDivElement
517
+ const onTextChange = vi.fn()
494
518
 
495
- initializeShadeRoot({
496
- injector,
497
- rootElement,
498
- jsxElement: <Input name="field" onTextChange={onTextChange} />,
499
- })
519
+ initializeShadeRoot({
520
+ injector,
521
+ rootElement,
522
+ jsxElement: <Input name="field" onTextChange={onTextChange} />,
523
+ })
500
524
 
501
- await sleepAsync(50)
525
+ await sleepAsync(50)
502
526
 
503
- const input = document.querySelector('shade-input input') as HTMLInputElement
504
- input.value = 'new value'
505
- input.dispatchEvent(new Event('change', { bubbles: true }))
527
+ const input = document.querySelector('shade-input input') as HTMLInputElement
528
+ input.value = 'new value'
529
+ input.dispatchEvent(new Event('change', { bubbles: true }))
506
530
 
507
- await sleepAsync(50)
531
+ await sleepAsync(50)
508
532
 
509
- expect(onTextChange).toHaveBeenCalledWith('new value')
533
+ expect(onTextChange).toHaveBeenCalledWith('new value')
534
+ })
510
535
  })
511
536
 
512
537
  it('should call onchange when input value changes', async () => {
513
- const injector = new Injector()
514
- const rootElement = document.getElementById('root') as HTMLDivElement
515
- const onchange = vi.fn()
538
+ await usingAsync(new Injector(), async (injector) => {
539
+ const rootElement = document.getElementById('root') as HTMLDivElement
540
+ const onchange = vi.fn()
516
541
 
517
- initializeShadeRoot({
518
- injector,
519
- rootElement,
520
- jsxElement: <Input name="field" onchange={onchange} />,
521
- })
542
+ initializeShadeRoot({
543
+ injector,
544
+ rootElement,
545
+ jsxElement: <Input name="field" onchange={onchange} />,
546
+ })
522
547
 
523
- await sleepAsync(50)
548
+ await sleepAsync(50)
524
549
 
525
- const input = document.querySelector('shade-input input') as HTMLInputElement
526
- input.value = 'test'
527
- input.dispatchEvent(new Event('change', { bubbles: true }))
550
+ const input = document.querySelector('shade-input input') as HTMLInputElement
551
+ input.value = 'test'
552
+ input.dispatchEvent(new Event('change', { bubbles: true }))
528
553
 
529
- await sleepAsync(50)
554
+ await sleepAsync(50)
530
555
 
531
- expect(onchange).toHaveBeenCalled()
556
+ expect(onchange).toHaveBeenCalled()
557
+ })
532
558
  })
533
559
  })
534
560
 
535
561
  describe('focus and blur', () => {
536
562
  it('should update state on focus', async () => {
537
- const injector = new Injector()
538
- const rootElement = document.getElementById('root') as HTMLDivElement
539
- const getEndIcon = vi.fn().mockReturnValue('icon')
563
+ await usingAsync(new Injector(), async (injector) => {
564
+ const rootElement = document.getElementById('root') as HTMLDivElement
565
+ const getEndIcon = vi.fn().mockReturnValue('icon')
540
566
 
541
- initializeShadeRoot({
542
- injector,
543
- rootElement,
544
- jsxElement: <Input name="field" getEndIcon={getEndIcon} />,
545
- })
567
+ initializeShadeRoot({
568
+ injector,
569
+ rootElement,
570
+ jsxElement: <Input name="field" getEndIcon={getEndIcon} />,
571
+ })
546
572
 
547
- await sleepAsync(50)
573
+ await sleepAsync(50)
548
574
 
549
- const input = document.querySelector('shade-input input') as HTMLInputElement
550
- input.dispatchEvent(new FocusEvent('focus'))
575
+ const input = document.querySelector('shade-input input') as HTMLInputElement
576
+ input.dispatchEvent(new FocusEvent('focus'))
551
577
 
552
- await sleepAsync(50)
578
+ await sleepAsync(50)
553
579
 
554
- expect(getEndIcon).toHaveBeenLastCalledWith(
555
- expect.objectContaining({
556
- state: expect.objectContaining({
557
- focused: true,
558
- }) as unknown,
559
- }),
560
- )
580
+ expect(getEndIcon).toHaveBeenLastCalledWith(
581
+ expect.objectContaining({
582
+ state: expect.objectContaining({
583
+ focused: true,
584
+ }) as unknown,
585
+ }),
586
+ )
587
+ })
561
588
  })
562
589
 
563
590
  it('should update state on blur', async () => {
564
- const injector = new Injector()
565
- const rootElement = document.getElementById('root') as HTMLDivElement
566
- const getEndIcon = vi.fn().mockReturnValue('icon')
591
+ await usingAsync(new Injector(), async (injector) => {
592
+ const rootElement = document.getElementById('root') as HTMLDivElement
593
+ const getEndIcon = vi.fn().mockReturnValue('icon')
567
594
 
568
- initializeShadeRoot({
569
- injector,
570
- rootElement,
571
- jsxElement: <Input name="field" getEndIcon={getEndIcon} />,
572
- })
595
+ initializeShadeRoot({
596
+ injector,
597
+ rootElement,
598
+ jsxElement: <Input name="field" getEndIcon={getEndIcon} />,
599
+ })
573
600
 
574
- await sleepAsync(50)
601
+ await sleepAsync(50)
575
602
 
576
- const input = document.querySelector('shade-input input') as HTMLInputElement
603
+ const input = document.querySelector('shade-input input') as HTMLInputElement
577
604
 
578
- input.dispatchEvent(new FocusEvent('focus'))
579
- await sleepAsync(50)
605
+ input.dispatchEvent(new FocusEvent('focus'))
606
+ await sleepAsync(50)
580
607
 
581
- input.dispatchEvent(new FocusEvent('blur'))
582
- await sleepAsync(50)
608
+ input.dispatchEvent(new FocusEvent('blur'))
609
+ await sleepAsync(50)
583
610
 
584
- expect(getEndIcon).toHaveBeenLastCalledWith(
585
- expect.objectContaining({
586
- state: expect.objectContaining({
587
- focused: false,
588
- }) as unknown,
589
- }),
590
- )
611
+ expect(getEndIcon).toHaveBeenLastCalledWith(
612
+ expect.objectContaining({
613
+ state: expect.objectContaining({
614
+ focused: false,
615
+ }) as unknown,
616
+ }),
617
+ )
618
+ })
591
619
  })
592
620
  })
593
621
 
594
622
  describe('autofocus', () => {
595
623
  it('should set initial focused state based on autofocus prop', async () => {
596
- const injector = new Injector()
597
- const rootElement = document.getElementById('root') as HTMLDivElement
598
- const getEndIcon = vi.fn().mockReturnValue('icon')
624
+ await usingAsync(new Injector(), async (injector) => {
625
+ const rootElement = document.getElementById('root') as HTMLDivElement
626
+ const getEndIcon = vi.fn().mockReturnValue('icon')
599
627
 
600
- initializeShadeRoot({
601
- injector,
602
- rootElement,
603
- jsxElement: <Input name="field" autofocus getEndIcon={getEndIcon} />,
604
- })
628
+ initializeShadeRoot({
629
+ injector,
630
+ rootElement,
631
+ jsxElement: <Input name="field" autofocus getEndIcon={getEndIcon} />,
632
+ })
605
633
 
606
- await sleepAsync(50)
634
+ await sleepAsync(50)
607
635
 
608
- expect(getEndIcon).toHaveBeenCalledWith(
609
- expect.objectContaining({
610
- state: expect.objectContaining({
611
- focused: true,
612
- }) as unknown,
613
- }),
614
- )
636
+ expect(getEndIcon).toHaveBeenCalledWith(
637
+ expect.objectContaining({
638
+ state: expect.objectContaining({
639
+ focused: true,
640
+ }) as unknown,
641
+ }),
642
+ )
643
+ })
615
644
  })
616
645
  })
617
646
 
618
647
  describe('FormService integration', () => {
619
648
  it('should register input with FormService when inside a Form', async () => {
620
- const injector = new Injector()
621
- const rootElement = document.getElementById('root') as HTMLDivElement
649
+ await usingAsync(new Injector(), async (injector) => {
650
+ const rootElement = document.getElementById('root') as HTMLDivElement
622
651
 
623
- type TestFormData = { email: string }
652
+ type TestFormData = { email: string }
624
653
 
625
- initializeShadeRoot({
626
- injector,
627
- rootElement,
628
- jsxElement: (
629
- <Form<TestFormData> onSubmit={() => {}} validate={(_data): _data is TestFormData => true}>
630
- <Input name="email" labelTitle="Email" />
631
- </Form>
632
- ),
633
- })
654
+ initializeShadeRoot({
655
+ injector,
656
+ rootElement,
657
+ jsxElement: (
658
+ <Form<TestFormData> onSubmit={() => {}} validate={(_data): _data is TestFormData => true}>
659
+ <Input name="email" labelTitle="Email" />
660
+ </Form>
661
+ ),
662
+ })
634
663
 
635
- await sleepAsync(50)
664
+ await sleepAsync(50)
636
665
 
637
- const form = document.querySelector('form[is="shade-form"]') as HTMLFormElement
638
- const formInjector = (form as unknown as { injector: Injector }).injector
639
- const formService = formInjector.getInstance(FormService)
666
+ const form = document.querySelector('form[is="shade-form"]') as HTMLFormElement
667
+ const formInjector = (form as unknown as { injector: Injector }).injector
668
+ const formService = formInjector.getInstance(FormService)
640
669
 
641
- expect(formService.inputs.size).toBe(1)
670
+ expect(formService.inputs.size).toBe(1)
671
+ })
642
672
  })
643
673
 
644
674
  it('should update FormService field state on validation', async () => {
645
- const injector = new Injector()
646
- const rootElement = document.getElementById('root') as HTMLDivElement
675
+ await usingAsync(new Injector(), async (injector) => {
676
+ const rootElement = document.getElementById('root') as HTMLDivElement
647
677
 
648
- type TestFormData = { email: string }
678
+ type TestFormData = { email: string }
649
679
 
650
- initializeShadeRoot({
651
- injector,
652
- rootElement,
653
- jsxElement: (
654
- <Form<TestFormData> onSubmit={() => {}} validate={(_data): _data is TestFormData => true}>
655
- <Input
656
- name="email"
657
- labelTitle="Email"
658
- getValidationResult={({ state }) => {
659
- if (state.value.includes('@')) {
660
- return { isValid: true }
661
- }
662
- return { isValid: false, message: 'Invalid email format' }
663
- }}
664
- />
665
- </Form>
666
- ),
667
- })
680
+ initializeShadeRoot({
681
+ injector,
682
+ rootElement,
683
+ jsxElement: (
684
+ <Form<TestFormData> onSubmit={() => {}} validate={(_data): _data is TestFormData => true}>
685
+ <Input
686
+ name="email"
687
+ labelTitle="Email"
688
+ getValidationResult={({ state }) => {
689
+ if (state.value.includes('@')) {
690
+ return { isValid: true }
691
+ }
692
+ return { isValid: false, message: 'Invalid email format' }
693
+ }}
694
+ />
695
+ </Form>
696
+ ),
697
+ })
668
698
 
669
- await sleepAsync(50)
699
+ await sleepAsync(50)
670
700
 
671
- const form = document.querySelector('form[is="shade-form"]') as HTMLFormElement
672
- const inputWrapper = form.querySelector('shade-input') as HTMLElement
673
- const input = inputWrapper.querySelector('input') as HTMLInputElement
701
+ const form = document.querySelector('form[is="shade-form"]') as HTMLFormElement
702
+ const inputWrapper = form.querySelector('shade-input') as HTMLElement
703
+ const input = inputWrapper.querySelector('input') as HTMLInputElement
674
704
 
675
- input.value = 'invalid'
676
- input.dispatchEvent(new Event('change', { bubbles: true }))
705
+ input.value = 'invalid'
706
+ input.dispatchEvent(new Event('change', { bubbles: true }))
677
707
 
678
- await sleepAsync(50)
708
+ await sleepAsync(50)
679
709
 
680
- const formInjector = (form as unknown as { injector: Injector }).injector
681
- const formService = formInjector.getInstance(FormService)
682
- const fieldErrors = formService.fieldErrors.getValue()
710
+ const formInjector = (form as unknown as { injector: Injector }).injector
711
+ const formService = formInjector.getInstance(FormService)
712
+ const fieldErrors = formService.fieldErrors.getValue()
683
713
 
684
- expect(fieldErrors.email).toBeDefined()
685
- expect(fieldErrors.email?.validationResult).toEqual({
686
- isValid: false,
687
- message: 'Invalid email format',
714
+ expect(fieldErrors.email).toBeDefined()
715
+ expect(fieldErrors.email?.validationResult).toEqual({
716
+ isValid: false,
717
+ message: 'Invalid email format',
718
+ })
688
719
  })
689
720
  })
690
721
 
691
722
  it('should unregister input from FormService on cleanup', async () => {
692
- const injector = new Injector()
693
- const rootElement = document.getElementById('root') as HTMLDivElement
723
+ await usingAsync(new Injector(), async (injector) => {
724
+ const rootElement = document.getElementById('root') as HTMLDivElement
694
725
 
695
- type TestFormData = { email: string }
726
+ type TestFormData = { email: string }
696
727
 
697
- initializeShadeRoot({
698
- injector,
699
- rootElement,
700
- jsxElement: (
701
- <Form<TestFormData> onSubmit={() => {}} validate={(_data): _data is TestFormData => true}>
702
- <Input name="email" labelTitle="Email" />
703
- </Form>
704
- ),
705
- })
728
+ initializeShadeRoot({
729
+ injector,
730
+ rootElement,
731
+ jsxElement: (
732
+ <Form<TestFormData> onSubmit={() => {}} validate={(_data): _data is TestFormData => true}>
733
+ <Input name="email" labelTitle="Email" />
734
+ </Form>
735
+ ),
736
+ })
706
737
 
707
- await sleepAsync(50)
738
+ await sleepAsync(50)
708
739
 
709
- const form = document.querySelector('form[is="shade-form"]') as HTMLFormElement
710
- const formInjector = (form as unknown as { injector: Injector }).injector
711
- const formService = formInjector.getInstance(FormService)
740
+ const form = document.querySelector('form[is="shade-form"]') as HTMLFormElement
741
+ const formInjector = (form as unknown as { injector: Injector }).injector
742
+ const formService = formInjector.getInstance(FormService)
712
743
 
713
- expect(formService.inputs.size).toBe(1)
744
+ expect(formService.inputs.size).toBe(1)
714
745
 
715
- rootElement.innerHTML = ''
746
+ rootElement.innerHTML = ''
716
747
 
717
- await sleepAsync(50)
748
+ await sleepAsync(50)
749
+ })
718
750
  })
719
751
  })
720
752
 
721
753
  describe('default validation messages', () => {
722
754
  it('should show message for typeMismatch', async () => {
723
- const injector = new Injector()
724
- const rootElement = document.getElementById('root') as HTMLDivElement
755
+ await usingAsync(new Injector(), async (injector) => {
756
+ const rootElement = document.getElementById('root') as HTMLDivElement
725
757
 
726
- initializeShadeRoot({
727
- injector,
728
- rootElement,
729
- jsxElement: <Input name="email" type="email" />,
730
- })
758
+ initializeShadeRoot({
759
+ injector,
760
+ rootElement,
761
+ jsxElement: <Input name="email" type="email" />,
762
+ })
731
763
 
732
- await sleepAsync(50)
764
+ await sleepAsync(50)
733
765
 
734
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
735
- const input = inputWrapper.querySelector('input') as HTMLInputElement
766
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
767
+ const input = inputWrapper.querySelector('input') as HTMLInputElement
736
768
 
737
- input.value = 'not-an-email'
738
- const invalidEvent = new Event('invalid', { bubbles: true, cancelable: true })
739
- input.dispatchEvent(invalidEvent)
769
+ input.value = 'not-an-email'
770
+ const invalidEvent = new Event('invalid', { bubbles: true, cancelable: true })
771
+ input.dispatchEvent(invalidEvent)
740
772
 
741
- await sleepAsync(50)
773
+ await sleepAsync(50)
742
774
 
743
- const helperText = inputWrapper.querySelector('.helperText') as HTMLElement
744
- expect(helperText.textContent).toBe('Value is not valid')
775
+ const helperText = inputWrapper.querySelector('.helperText') as HTMLElement
776
+ expect(helperText.textContent).toBe('Value is not valid')
777
+ })
745
778
  })
746
779
 
747
780
  it('should handle pattern mismatch validation', async () => {
748
- const injector = new Injector()
749
- const rootElement = document.getElementById('root') as HTMLDivElement
781
+ await usingAsync(new Injector(), async (injector) => {
782
+ const rootElement = document.getElementById('root') as HTMLDivElement
750
783
 
751
- initializeShadeRoot({
752
- injector,
753
- rootElement,
754
- jsxElement: <Input name="code" pattern="[A-Z]{3}" />,
755
- })
784
+ initializeShadeRoot({
785
+ injector,
786
+ rootElement,
787
+ jsxElement: <Input name="code" pattern="[A-Z]{3}" />,
788
+ })
756
789
 
757
- await sleepAsync(50)
790
+ await sleepAsync(50)
758
791
 
759
- const inputWrapper = document.querySelector('shade-input') as HTMLElement
760
- const input = inputWrapper.querySelector('input') as HTMLInputElement
792
+ const inputWrapper = document.querySelector('shade-input') as HTMLElement
793
+ const input = inputWrapper.querySelector('input') as HTMLInputElement
761
794
 
762
- input.value = '123'
763
- const invalidEvent = new Event('invalid', { bubbles: true, cancelable: true })
764
- input.dispatchEvent(invalidEvent)
795
+ input.value = '123'
796
+ const invalidEvent = new Event('invalid', { bubbles: true, cancelable: true })
797
+ input.dispatchEvent(invalidEvent)
765
798
 
766
- await sleepAsync(50)
799
+ await sleepAsync(50)
767
800
 
768
- const helperText = inputWrapper.querySelector('.helperText') as HTMLElement
769
- expect(helperText.textContent).toBe('Value does not match the pattern')
801
+ const helperText = inputWrapper.querySelector('.helperText') as HTMLElement
802
+ expect(helperText.textContent).toBe('Value does not match the pattern')
803
+ })
770
804
  })
771
805
  })
772
806
 
773
807
  describe('value handling', () => {
774
808
  it('should use initial value prop', async () => {
775
- const injector = new Injector()
776
- const rootElement = document.getElementById('root') as HTMLDivElement
809
+ await usingAsync(new Injector(), async (injector) => {
810
+ const rootElement = document.getElementById('root') as HTMLDivElement
777
811
 
778
- initializeShadeRoot({
779
- injector,
780
- rootElement,
781
- jsxElement: <Input name="field" value="initial value" />,
782
- })
812
+ initializeShadeRoot({
813
+ injector,
814
+ rootElement,
815
+ jsxElement: <Input name="field" value="initial value" />,
816
+ })
783
817
 
784
- await sleepAsync(50)
818
+ await sleepAsync(50)
785
819
 
786
- const input = document.querySelector('shade-input input') as HTMLInputElement
787
- expect(input.value).toBe('initial value')
820
+ const input = document.querySelector('shade-input input') as HTMLInputElement
821
+ expect(input.value).toBe('initial value')
822
+ })
788
823
  })
789
824
  })
790
825
 
791
826
  describe('labelProps', () => {
792
827
  it('should pass labelProps to the label element', async () => {
793
- const injector = new Injector()
794
- const rootElement = document.getElementById('root') as HTMLDivElement
828
+ await usingAsync(new Injector(), async (injector) => {
829
+ const rootElement = document.getElementById('root') as HTMLDivElement
795
830
 
796
- initializeShadeRoot({
797
- injector,
798
- rootElement,
799
- jsxElement: <Input name="field" labelProps={{ className: 'custom-label' }} />,
800
- })
831
+ initializeShadeRoot({
832
+ injector,
833
+ rootElement,
834
+ jsxElement: <Input name="field" labelProps={{ className: 'custom-label' }} />,
835
+ })
801
836
 
802
- await sleepAsync(50)
837
+ await sleepAsync(50)
803
838
 
804
- const label = document.querySelector('shade-input label') as HTMLLabelElement
805
- expect(label.className).toContain('custom-label')
839
+ const label = document.querySelector('shade-input label') as HTMLLabelElement
840
+ expect(label.className).toContain('custom-label')
841
+ })
806
842
  })
807
843
  })
808
844
  })