@furystack/shades-common-components 13.5.0 → 15.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (540) hide show
  1. package/CHANGELOG.md +109 -0
  2. package/README.md +3 -3
  3. package/esm/components/accordion/accordion-item.d.ts.map +1 -1
  4. package/esm/components/accordion/accordion-item.js +7 -10
  5. package/esm/components/accordion/accordion-item.js.map +1 -1
  6. package/esm/components/accordion/accordion.d.ts +7 -0
  7. package/esm/components/accordion/accordion.d.ts.map +1 -1
  8. package/esm/components/accordion/accordion.js +5 -2
  9. package/esm/components/accordion/accordion.js.map +1 -1
  10. package/esm/components/accordion/accordion.spec.js +91 -50
  11. package/esm/components/accordion/accordion.spec.js.map +1 -1
  12. package/esm/components/alert.js +1 -1
  13. package/esm/components/alert.js.map +1 -1
  14. package/esm/components/app-bar-link.js +1 -1
  15. package/esm/components/app-bar-link.js.map +1 -1
  16. package/esm/components/app-bar.js +1 -1
  17. package/esm/components/app-bar.js.map +1 -1
  18. package/esm/components/avatar.js +1 -1
  19. package/esm/components/avatar.js.map +1 -1
  20. package/esm/components/badge.js +1 -1
  21. package/esm/components/badge.js.map +1 -1
  22. package/esm/components/breadcrumb.js +1 -1
  23. package/esm/components/breadcrumb.js.map +1 -1
  24. package/esm/components/breadcrumb.spec.js +3 -3
  25. package/esm/components/breadcrumb.spec.js.map +1 -1
  26. package/esm/components/button-group.js +4 -4
  27. package/esm/components/button-group.js.map +1 -1
  28. package/esm/components/button.js +1 -1
  29. package/esm/components/button.js.map +1 -1
  30. package/esm/components/button.spec.js +1 -1
  31. package/esm/components/button.spec.js.map +1 -1
  32. package/esm/components/cache-view.js +1 -1
  33. package/esm/components/cache-view.js.map +1 -1
  34. package/esm/components/cache-view.spec.js +2 -2
  35. package/esm/components/cache-view.spec.js.map +1 -1
  36. package/esm/components/card.js +5 -5
  37. package/esm/components/card.js.map +1 -1
  38. package/esm/components/carousel.js +2 -2
  39. package/esm/components/carousel.js.map +1 -1
  40. package/esm/components/chip.d.ts.map +1 -1
  41. package/esm/components/chip.js +5 -3
  42. package/esm/components/chip.js.map +1 -1
  43. package/esm/components/chip.spec.js +42 -0
  44. package/esm/components/chip.spec.js.map +1 -1
  45. package/esm/components/circular-progress.d.ts +2 -4
  46. package/esm/components/circular-progress.d.ts.map +1 -1
  47. package/esm/components/circular-progress.js +3 -6
  48. package/esm/components/circular-progress.js.map +1 -1
  49. package/esm/components/circular-progress.spec.js +19 -14
  50. package/esm/components/circular-progress.spec.js.map +1 -1
  51. package/esm/components/command-palette/command-palette-input.js +1 -1
  52. package/esm/components/command-palette/command-palette-input.js.map +1 -1
  53. package/esm/components/command-palette/command-palette-suggestion-list.js +1 -1
  54. package/esm/components/command-palette/command-palette-suggestion-list.js.map +1 -1
  55. package/esm/components/command-palette/command-palette-suggestion-list.spec.js +1 -1
  56. package/esm/components/command-palette/command-palette-suggestion-list.spec.js.map +1 -1
  57. package/esm/components/command-palette/index.d.ts.map +1 -1
  58. package/esm/components/command-palette/index.js +15 -2
  59. package/esm/components/command-palette/index.js.map +1 -1
  60. package/esm/components/command-palette/index.spec.js +78 -33
  61. package/esm/components/command-palette/index.spec.js.map +1 -1
  62. package/esm/components/context-menu/context-menu-item.js +1 -1
  63. package/esm/components/context-menu/context-menu-item.js.map +1 -1
  64. package/esm/components/context-menu/context-menu.js +1 -1
  65. package/esm/components/context-menu/context-menu.js.map +1 -1
  66. package/esm/components/data-grid/body.js +1 -1
  67. package/esm/components/data-grid/body.js.map +1 -1
  68. package/esm/components/data-grid/data-grid-row.d.ts.map +1 -1
  69. package/esm/components/data-grid/data-grid-row.js +19 -3
  70. package/esm/components/data-grid/data-grid-row.js.map +1 -1
  71. package/esm/components/data-grid/data-grid.d.ts +12 -2
  72. package/esm/components/data-grid/data-grid.d.ts.map +1 -1
  73. package/esm/components/data-grid/data-grid.js +33 -13
  74. package/esm/components/data-grid/data-grid.js.map +1 -1
  75. package/esm/components/data-grid/data-grid.spec.js +170 -90
  76. package/esm/components/data-grid/data-grid.spec.js.map +1 -1
  77. package/esm/components/data-grid/filters/boolean-filter.d.ts +2 -2
  78. package/esm/components/data-grid/filters/boolean-filter.d.ts.map +1 -1
  79. package/esm/components/data-grid/filters/boolean-filter.js +4 -4
  80. package/esm/components/data-grid/filters/boolean-filter.js.map +1 -1
  81. package/esm/components/data-grid/filters/boolean-filter.spec.js +18 -17
  82. package/esm/components/data-grid/filters/boolean-filter.spec.js.map +1 -1
  83. package/esm/components/data-grid/filters/date-filter.d.ts +2 -2
  84. package/esm/components/data-grid/filters/date-filter.d.ts.map +1 -1
  85. package/esm/components/data-grid/filters/date-filter.js +6 -6
  86. package/esm/components/data-grid/filters/date-filter.js.map +1 -1
  87. package/esm/components/data-grid/filters/date-filter.spec.js +26 -21
  88. package/esm/components/data-grid/filters/date-filter.spec.js.map +1 -1
  89. package/esm/components/data-grid/filters/enum-filter.d.ts +2 -2
  90. package/esm/components/data-grid/filters/enum-filter.d.ts.map +1 -1
  91. package/esm/components/data-grid/filters/enum-filter.js +5 -5
  92. package/esm/components/data-grid/filters/enum-filter.js.map +1 -1
  93. package/esm/components/data-grid/filters/enum-filter.spec.js +21 -19
  94. package/esm/components/data-grid/filters/enum-filter.spec.js.map +1 -1
  95. package/esm/components/data-grid/filters/filter-dropdown.js +1 -1
  96. package/esm/components/data-grid/filters/filter-dropdown.js.map +1 -1
  97. package/esm/components/data-grid/filters/number-filter.d.ts +2 -2
  98. package/esm/components/data-grid/filters/number-filter.d.ts.map +1 -1
  99. package/esm/components/data-grid/filters/number-filter.js +5 -5
  100. package/esm/components/data-grid/filters/number-filter.js.map +1 -1
  101. package/esm/components/data-grid/filters/number-filter.spec.js +23 -21
  102. package/esm/components/data-grid/filters/number-filter.spec.js.map +1 -1
  103. package/esm/components/data-grid/filters/string-filter.d.ts +2 -2
  104. package/esm/components/data-grid/filters/string-filter.d.ts.map +1 -1
  105. package/esm/components/data-grid/filters/string-filter.js +5 -5
  106. package/esm/components/data-grid/filters/string-filter.js.map +1 -1
  107. package/esm/components/data-grid/filters/string-filter.spec.js +21 -19
  108. package/esm/components/data-grid/filters/string-filter.spec.js.map +1 -1
  109. package/esm/components/data-grid/footer.d.ts +2 -2
  110. package/esm/components/data-grid/footer.d.ts.map +1 -1
  111. package/esm/components/data-grid/footer.js +8 -13
  112. package/esm/components/data-grid/footer.js.map +1 -1
  113. package/esm/components/data-grid/footer.spec.js +38 -27
  114. package/esm/components/data-grid/footer.spec.js.map +1 -1
  115. package/esm/components/data-grid/header.d.ts +6 -6
  116. package/esm/components/data-grid/header.d.ts.map +1 -1
  117. package/esm/components/data-grid/header.js +16 -17
  118. package/esm/components/data-grid/header.js.map +1 -1
  119. package/esm/components/data-grid/header.spec.js +66 -60
  120. package/esm/components/data-grid/header.spec.js.map +1 -1
  121. package/esm/components/data-grid/selection-cell.d.ts.map +1 -1
  122. package/esm/components/data-grid/selection-cell.js +2 -2
  123. package/esm/components/data-grid/selection-cell.js.map +1 -1
  124. package/esm/components/dialog.d.ts +11 -0
  125. package/esm/components/dialog.d.ts.map +1 -1
  126. package/esm/components/dialog.js +3 -3
  127. package/esm/components/dialog.js.map +1 -1
  128. package/esm/components/dialog.spec.js +54 -2
  129. package/esm/components/dialog.spec.js.map +1 -1
  130. package/esm/components/divider.js +1 -1
  131. package/esm/components/divider.js.map +1 -1
  132. package/esm/components/drawer/drawer-toggle-button.js +1 -1
  133. package/esm/components/drawer/drawer-toggle-button.js.map +1 -1
  134. package/esm/components/drawer/index.js +1 -1
  135. package/esm/components/drawer/index.js.map +1 -1
  136. package/esm/components/dropdown.d.ts.map +1 -1
  137. package/esm/components/dropdown.js +2 -2
  138. package/esm/components/dropdown.js.map +1 -1
  139. package/esm/components/dropdown.spec.js +8 -0
  140. package/esm/components/dropdown.spec.js.map +1 -1
  141. package/esm/components/fab.js +1 -1
  142. package/esm/components/fab.js.map +1 -1
  143. package/esm/components/form.js +1 -1
  144. package/esm/components/form.js.map +1 -1
  145. package/esm/components/grid.js +1 -1
  146. package/esm/components/grid.js.map +1 -1
  147. package/esm/components/icons/icon.js +1 -1
  148. package/esm/components/icons/icon.js.map +1 -1
  149. package/esm/components/image.d.ts.map +1 -1
  150. package/esm/components/image.js +17 -8
  151. package/esm/components/image.js.map +1 -1
  152. package/esm/components/image.spec.js +60 -0
  153. package/esm/components/image.spec.js.map +1 -1
  154. package/esm/components/inputs/autocomplete.js +1 -1
  155. package/esm/components/inputs/autocomplete.js.map +1 -1
  156. package/esm/components/inputs/checkbox.d.ts.map +1 -1
  157. package/esm/components/inputs/checkbox.js +2 -1
  158. package/esm/components/inputs/checkbox.js.map +1 -1
  159. package/esm/components/inputs/checkbox.spec.js +1 -1
  160. package/esm/components/inputs/checkbox.spec.js.map +1 -1
  161. package/esm/components/inputs/input-number.js +1 -1
  162. package/esm/components/inputs/input-number.js.map +1 -1
  163. package/esm/components/inputs/input-number.spec.js +1 -1
  164. package/esm/components/inputs/input-number.spec.js.map +1 -1
  165. package/esm/components/inputs/input.js +1 -1
  166. package/esm/components/inputs/input.js.map +1 -1
  167. package/esm/components/inputs/input.spec.js +1 -1
  168. package/esm/components/inputs/input.spec.js.map +1 -1
  169. package/esm/components/inputs/radio-group.js +1 -1
  170. package/esm/components/inputs/radio-group.js.map +1 -1
  171. package/esm/components/inputs/radio-group.spec.js +1 -1
  172. package/esm/components/inputs/radio-group.spec.js.map +1 -1
  173. package/esm/components/inputs/radio.d.ts.map +1 -1
  174. package/esm/components/inputs/radio.js +2 -1
  175. package/esm/components/inputs/radio.js.map +1 -1
  176. package/esm/components/inputs/radio.spec.js +1 -1
  177. package/esm/components/inputs/radio.spec.js.map +1 -1
  178. package/esm/components/inputs/select.js +1 -1
  179. package/esm/components/inputs/select.js.map +1 -1
  180. package/esm/components/inputs/slider.d.ts.map +1 -1
  181. package/esm/components/inputs/slider.js +2 -1
  182. package/esm/components/inputs/slider.js.map +1 -1
  183. package/esm/components/inputs/switch.d.ts.map +1 -1
  184. package/esm/components/inputs/switch.js +2 -1
  185. package/esm/components/inputs/switch.js.map +1 -1
  186. package/esm/components/inputs/switch.spec.js +1 -1
  187. package/esm/components/inputs/switch.spec.js.map +1 -1
  188. package/esm/components/inputs/text-area.js +1 -1
  189. package/esm/components/inputs/text-area.js.map +1 -1
  190. package/esm/components/inputs/text-area.spec.js +1 -1
  191. package/esm/components/inputs/text-area.spec.js.map +1 -1
  192. package/esm/components/linear-progress.d.ts +2 -4
  193. package/esm/components/linear-progress.d.ts.map +1 -1
  194. package/esm/components/linear-progress.js +3 -6
  195. package/esm/components/linear-progress.js.map +1 -1
  196. package/esm/components/linear-progress.spec.js +21 -18
  197. package/esm/components/linear-progress.spec.js.map +1 -1
  198. package/esm/components/list/list-item.d.ts.map +1 -1
  199. package/esm/components/list/list-item.js +22 -6
  200. package/esm/components/list/list-item.js.map +1 -1
  201. package/esm/components/list/list.d.ts +7 -0
  202. package/esm/components/list/list.d.ts.map +1 -1
  203. package/esm/components/list/list.js +29 -9
  204. package/esm/components/list/list.js.map +1 -1
  205. package/esm/components/list/list.spec.js +117 -23
  206. package/esm/components/list/list.spec.js.map +1 -1
  207. package/esm/components/loader.js +1 -1
  208. package/esm/components/loader.js.map +1 -1
  209. package/esm/components/loader.spec.js +1 -1
  210. package/esm/components/loader.spec.js.map +1 -1
  211. package/esm/components/markdown/markdown-display.d.ts.map +1 -1
  212. package/esm/components/markdown/markdown-display.js +12 -2
  213. package/esm/components/markdown/markdown-display.js.map +1 -1
  214. package/esm/components/markdown/markdown-display.spec.js +98 -1
  215. package/esm/components/markdown/markdown-display.spec.js.map +1 -1
  216. package/esm/components/markdown/markdown-editor.js +1 -1
  217. package/esm/components/markdown/markdown-editor.js.map +1 -1
  218. package/esm/components/markdown/markdown-editor.spec.js +88 -1
  219. package/esm/components/markdown/markdown-editor.spec.js.map +1 -1
  220. package/esm/components/markdown/markdown-input.js +1 -1
  221. package/esm/components/markdown/markdown-input.js.map +1 -1
  222. package/esm/components/markdown/markdown-input.spec.js +1 -1
  223. package/esm/components/markdown/markdown-input.spec.js.map +1 -1
  224. package/esm/components/menu/menu.js +2 -2
  225. package/esm/components/menu/menu.js.map +1 -1
  226. package/esm/components/modal.d.ts +10 -0
  227. package/esm/components/modal.d.ts.map +1 -1
  228. package/esm/components/modal.js +25 -5
  229. package/esm/components/modal.js.map +1 -1
  230. package/esm/components/modal.spec.js +89 -4
  231. package/esm/components/modal.spec.js.map +1 -1
  232. package/esm/components/noty-list.js +2 -2
  233. package/esm/components/noty-list.js.map +1 -1
  234. package/esm/components/page-container/index.js +1 -1
  235. package/esm/components/page-container/index.js.map +1 -1
  236. package/esm/components/page-container/page-header.js +1 -1
  237. package/esm/components/page-container/page-header.js.map +1 -1
  238. package/esm/components/page-layout/index.js +2 -2
  239. package/esm/components/page-layout/index.js.map +1 -1
  240. package/esm/components/page-layout/index.spec.js +14 -0
  241. package/esm/components/page-layout/index.spec.js.map +1 -1
  242. package/esm/components/pagination.js +1 -1
  243. package/esm/components/pagination.js.map +1 -1
  244. package/esm/components/paper.js +1 -1
  245. package/esm/components/paper.js.map +1 -1
  246. package/esm/components/rating.d.ts.map +1 -1
  247. package/esm/components/rating.js +29 -22
  248. package/esm/components/rating.js.map +1 -1
  249. package/esm/components/rating.spec.js +152 -5
  250. package/esm/components/rating.spec.js.map +1 -1
  251. package/esm/components/result.js +1 -1
  252. package/esm/components/result.js.map +1 -1
  253. package/esm/components/skeleton.js +1 -1
  254. package/esm/components/skeleton.js.map +1 -1
  255. package/esm/components/suggest/index.d.ts.map +1 -1
  256. package/esm/components/suggest/index.js +15 -2
  257. package/esm/components/suggest/index.js.map +1 -1
  258. package/esm/components/suggest/index.spec.js +99 -44
  259. package/esm/components/suggest/index.spec.js.map +1 -1
  260. package/esm/components/suggest/suggest-input.js +1 -1
  261. package/esm/components/suggest/suggest-input.js.map +1 -1
  262. package/esm/components/suggest/suggest-input.spec.js +1 -1
  263. package/esm/components/suggest/suggest-input.spec.js.map +1 -1
  264. package/esm/components/suggest/suggestion-list.js +1 -1
  265. package/esm/components/suggest/suggestion-list.js.map +1 -1
  266. package/esm/components/suggest/suggestion-list.spec.js +1 -1
  267. package/esm/components/suggest/suggestion-list.spec.js.map +1 -1
  268. package/esm/components/tabs.d.ts.map +1 -1
  269. package/esm/components/tabs.js +6 -2
  270. package/esm/components/tabs.js.map +1 -1
  271. package/esm/components/timeline.js +2 -2
  272. package/esm/components/timeline.js.map +1 -1
  273. package/esm/components/tooltip.js +1 -1
  274. package/esm/components/tooltip.js.map +1 -1
  275. package/esm/components/tree/tree-item.d.ts.map +1 -1
  276. package/esm/components/tree/tree-item.js +19 -6
  277. package/esm/components/tree/tree-item.js.map +1 -1
  278. package/esm/components/tree/tree.d.ts +7 -0
  279. package/esm/components/tree/tree.d.ts.map +1 -1
  280. package/esm/components/tree/tree.js +13 -4
  281. package/esm/components/tree/tree.js.map +1 -1
  282. package/esm/components/tree/tree.spec.js +64 -2
  283. package/esm/components/tree/tree.spec.js.map +1 -1
  284. package/esm/components/typography.js +1 -1
  285. package/esm/components/typography.js.map +1 -1
  286. package/esm/components/wizard/index.js +1 -1
  287. package/esm/components/wizard/index.js.map +1 -1
  288. package/esm/components/wizard/index.spec.js +3 -3
  289. package/esm/components/wizard/index.spec.js.map +1 -1
  290. package/esm/services/collection-service.d.ts +9 -0
  291. package/esm/services/collection-service.d.ts.map +1 -1
  292. package/esm/services/collection-service.js +33 -11
  293. package/esm/services/collection-service.js.map +1 -1
  294. package/esm/services/collection-service.spec.js +33 -24
  295. package/esm/services/collection-service.spec.js.map +1 -1
  296. package/esm/services/css-variable-theme.d.ts +7 -0
  297. package/esm/services/css-variable-theme.d.ts.map +1 -1
  298. package/esm/services/css-variable-theme.js +23 -0
  299. package/esm/services/css-variable-theme.js.map +1 -1
  300. package/esm/services/css-variable-theme.spec.js +1 -0
  301. package/esm/services/css-variable-theme.spec.js.map +1 -1
  302. package/esm/services/list-service.d.ts +9 -0
  303. package/esm/services/list-service.d.ts.map +1 -1
  304. package/esm/services/list-service.js +13 -13
  305. package/esm/services/list-service.js.map +1 -1
  306. package/esm/services/list-service.spec.js +13 -33
  307. package/esm/services/list-service.spec.js.map +1 -1
  308. package/esm/services/theme-provider-service.d.ts +3 -0
  309. package/esm/services/theme-provider-service.d.ts.map +1 -1
  310. package/esm/services/theme-provider-service.js.map +1 -1
  311. package/esm/services/tree-service.d.ts.map +1 -1
  312. package/esm/services/tree-service.js +5 -9
  313. package/esm/services/tree-service.js.map +1 -1
  314. package/esm/services/tree-service.spec.js +12 -9
  315. package/esm/services/tree-service.spec.js.map +1 -1
  316. package/esm/themes/architect-theme.d.ts +1 -0
  317. package/esm/themes/architect-theme.d.ts.map +1 -1
  318. package/esm/themes/architect-theme.js +1 -0
  319. package/esm/themes/architect-theme.js.map +1 -1
  320. package/esm/themes/auditore-theme.d.ts +1 -0
  321. package/esm/themes/auditore-theme.d.ts.map +1 -1
  322. package/esm/themes/auditore-theme.js +1 -0
  323. package/esm/themes/auditore-theme.js.map +1 -1
  324. package/esm/themes/black-mesa-theme.d.ts +1 -0
  325. package/esm/themes/black-mesa-theme.d.ts.map +1 -1
  326. package/esm/themes/black-mesa-theme.js +1 -0
  327. package/esm/themes/black-mesa-theme.js.map +1 -1
  328. package/esm/themes/chieftain-theme.d.ts +1 -0
  329. package/esm/themes/chieftain-theme.d.ts.map +1 -1
  330. package/esm/themes/chieftain-theme.js +1 -0
  331. package/esm/themes/chieftain-theme.js.map +1 -1
  332. package/esm/themes/default-dark-theme.d.ts +1 -0
  333. package/esm/themes/default-dark-theme.d.ts.map +1 -1
  334. package/esm/themes/default-dark-theme.js +1 -0
  335. package/esm/themes/default-dark-theme.js.map +1 -1
  336. package/esm/themes/default-light-theme.d.ts +1 -0
  337. package/esm/themes/default-light-theme.d.ts.map +1 -1
  338. package/esm/themes/default-light-theme.js +1 -0
  339. package/esm/themes/default-light-theme.js.map +1 -1
  340. package/esm/themes/dragonborn-theme.d.ts +1 -0
  341. package/esm/themes/dragonborn-theme.d.ts.map +1 -1
  342. package/esm/themes/dragonborn-theme.js +1 -0
  343. package/esm/themes/dragonborn-theme.js.map +1 -1
  344. package/esm/themes/hawkins-theme.d.ts +1 -0
  345. package/esm/themes/hawkins-theme.d.ts.map +1 -1
  346. package/esm/themes/hawkins-theme.js +1 -0
  347. package/esm/themes/hawkins-theme.js.map +1 -1
  348. package/esm/themes/jedi-theme.d.ts +1 -0
  349. package/esm/themes/jedi-theme.d.ts.map +1 -1
  350. package/esm/themes/jedi-theme.js +1 -0
  351. package/esm/themes/jedi-theme.js.map +1 -1
  352. package/esm/themes/neon-runner-theme.d.ts +1 -0
  353. package/esm/themes/neon-runner-theme.d.ts.map +1 -1
  354. package/esm/themes/neon-runner-theme.js +1 -0
  355. package/esm/themes/neon-runner-theme.js.map +1 -1
  356. package/esm/themes/paladin-theme.d.ts +1 -0
  357. package/esm/themes/paladin-theme.d.ts.map +1 -1
  358. package/esm/themes/paladin-theme.js +1 -0
  359. package/esm/themes/paladin-theme.js.map +1 -1
  360. package/esm/themes/plumber-theme.d.ts +1 -0
  361. package/esm/themes/plumber-theme.d.ts.map +1 -1
  362. package/esm/themes/plumber-theme.js +1 -0
  363. package/esm/themes/plumber-theme.js.map +1 -1
  364. package/esm/themes/replicant-theme.d.ts +1 -0
  365. package/esm/themes/replicant-theme.d.ts.map +1 -1
  366. package/esm/themes/replicant-theme.js +1 -0
  367. package/esm/themes/replicant-theme.js.map +1 -1
  368. package/esm/themes/sandworm-theme.d.ts +1 -0
  369. package/esm/themes/sandworm-theme.d.ts.map +1 -1
  370. package/esm/themes/sandworm-theme.js +1 -0
  371. package/esm/themes/sandworm-theme.js.map +1 -1
  372. package/esm/themes/shadow-broker-theme.d.ts +1 -0
  373. package/esm/themes/shadow-broker-theme.d.ts.map +1 -1
  374. package/esm/themes/shadow-broker-theme.js +1 -0
  375. package/esm/themes/shadow-broker-theme.js.map +1 -1
  376. package/esm/themes/sith-theme.d.ts +1 -0
  377. package/esm/themes/sith-theme.d.ts.map +1 -1
  378. package/esm/themes/sith-theme.js +1 -0
  379. package/esm/themes/sith-theme.js.map +1 -1
  380. package/esm/themes/vault-dweller-theme.d.ts +1 -0
  381. package/esm/themes/vault-dweller-theme.d.ts.map +1 -1
  382. package/esm/themes/vault-dweller-theme.js +1 -0
  383. package/esm/themes/vault-dweller-theme.js.map +1 -1
  384. package/esm/themes/wild-hunt-theme.d.ts +1 -0
  385. package/esm/themes/wild-hunt-theme.d.ts.map +1 -1
  386. package/esm/themes/wild-hunt-theme.js +1 -0
  387. package/esm/themes/wild-hunt-theme.js.map +1 -1
  388. package/esm/themes/xenomorph-theme.d.ts +1 -0
  389. package/esm/themes/xenomorph-theme.d.ts.map +1 -1
  390. package/esm/themes/xenomorph-theme.js +1 -0
  391. package/esm/themes/xenomorph-theme.js.map +1 -1
  392. package/package.json +3 -3
  393. package/src/components/accordion/accordion-item.tsx +10 -15
  394. package/src/components/accordion/accordion.spec.tsx +134 -79
  395. package/src/components/accordion/accordion.tsx +14 -2
  396. package/src/components/alert.tsx +1 -1
  397. package/src/components/app-bar-link.tsx +1 -1
  398. package/src/components/app-bar.tsx +1 -1
  399. package/src/components/avatar.tsx +1 -1
  400. package/src/components/badge.tsx +1 -1
  401. package/src/components/breadcrumb.spec.tsx +3 -3
  402. package/src/components/breadcrumb.tsx +1 -1
  403. package/src/components/button-group.tsx +4 -4
  404. package/src/components/button.spec.tsx +1 -1
  405. package/src/components/button.tsx +1 -1
  406. package/src/components/cache-view.spec.tsx +2 -2
  407. package/src/components/cache-view.tsx +3 -3
  408. package/src/components/card.tsx +5 -5
  409. package/src/components/carousel.tsx +2 -2
  410. package/src/components/chip.spec.tsx +64 -0
  411. package/src/components/chip.tsx +5 -2
  412. package/src/components/circular-progress.spec.tsx +20 -14
  413. package/src/components/circular-progress.tsx +5 -11
  414. package/src/components/command-palette/command-palette-input.tsx +1 -1
  415. package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +1 -1
  416. package/src/components/command-palette/command-palette-suggestion-list.tsx +1 -1
  417. package/src/components/command-palette/index.spec.tsx +95 -33
  418. package/src/components/command-palette/index.tsx +16 -4
  419. package/src/components/context-menu/context-menu-item.tsx +1 -1
  420. package/src/components/context-menu/context-menu.tsx +1 -1
  421. package/src/components/data-grid/body.tsx +1 -1
  422. package/src/components/data-grid/data-grid-row.tsx +21 -3
  423. package/src/components/data-grid/data-grid.spec.tsx +246 -92
  424. package/src/components/data-grid/data-grid.tsx +52 -21
  425. package/src/components/data-grid/filters/boolean-filter.spec.tsx +29 -18
  426. package/src/components/data-grid/filters/boolean-filter.tsx +6 -6
  427. package/src/components/data-grid/filters/date-filter.spec.tsx +35 -22
  428. package/src/components/data-grid/filters/date-filter.tsx +8 -8
  429. package/src/components/data-grid/filters/enum-filter.spec.tsx +35 -20
  430. package/src/components/data-grid/filters/enum-filter.tsx +7 -7
  431. package/src/components/data-grid/filters/filter-dropdown.tsx +1 -1
  432. package/src/components/data-grid/filters/number-filter.spec.tsx +32 -22
  433. package/src/components/data-grid/filters/number-filter.tsx +7 -7
  434. package/src/components/data-grid/filters/string-filter.spec.tsx +32 -20
  435. package/src/components/data-grid/filters/string-filter.tsx +7 -7
  436. package/src/components/data-grid/footer.spec.tsx +79 -31
  437. package/src/components/data-grid/footer.tsx +10 -15
  438. package/src/components/data-grid/header.spec.tsx +152 -68
  439. package/src/components/data-grid/header.tsx +64 -27
  440. package/src/components/data-grid/selection-cell.tsx +2 -1
  441. package/src/components/dialog.spec.tsx +77 -2
  442. package/src/components/dialog.tsx +15 -2
  443. package/src/components/divider.tsx +1 -1
  444. package/src/components/drawer/drawer-toggle-button.tsx +1 -1
  445. package/src/components/drawer/index.tsx +1 -1
  446. package/src/components/dropdown.spec.tsx +9 -0
  447. package/src/components/dropdown.tsx +2 -1
  448. package/src/components/fab.tsx +1 -1
  449. package/src/components/form.tsx +1 -1
  450. package/src/components/grid.tsx +1 -1
  451. package/src/components/icons/icon.tsx +1 -1
  452. package/src/components/image.spec.tsx +82 -0
  453. package/src/components/image.tsx +18 -9
  454. package/src/components/inputs/autocomplete.tsx +1 -1
  455. package/src/components/inputs/checkbox.spec.tsx +1 -1
  456. package/src/components/inputs/checkbox.tsx +2 -1
  457. package/src/components/inputs/input-number.spec.tsx +1 -1
  458. package/src/components/inputs/input-number.tsx +1 -1
  459. package/src/components/inputs/input.spec.tsx +1 -1
  460. package/src/components/inputs/input.tsx +1 -1
  461. package/src/components/inputs/radio-group.spec.tsx +1 -1
  462. package/src/components/inputs/radio-group.tsx +1 -1
  463. package/src/components/inputs/radio.spec.tsx +1 -1
  464. package/src/components/inputs/radio.tsx +2 -1
  465. package/src/components/inputs/select.tsx +1 -1
  466. package/src/components/inputs/slider.tsx +2 -1
  467. package/src/components/inputs/switch.spec.tsx +1 -1
  468. package/src/components/inputs/switch.tsx +2 -1
  469. package/src/components/inputs/text-area.spec.tsx +1 -1
  470. package/src/components/inputs/text-area.tsx +1 -1
  471. package/src/components/linear-progress.spec.tsx +22 -18
  472. package/src/components/linear-progress.tsx +5 -11
  473. package/src/components/list/list-item.tsx +23 -5
  474. package/src/components/list/list.spec.tsx +165 -32
  475. package/src/components/list/list.tsx +38 -11
  476. package/src/components/loader.spec.tsx +1 -1
  477. package/src/components/loader.tsx +1 -1
  478. package/src/components/markdown/markdown-display.spec.tsx +133 -1
  479. package/src/components/markdown/markdown-display.tsx +13 -2
  480. package/src/components/markdown/markdown-editor.spec.tsx +124 -1
  481. package/src/components/markdown/markdown-editor.tsx +1 -1
  482. package/src/components/markdown/markdown-input.spec.tsx +1 -1
  483. package/src/components/markdown/markdown-input.tsx +1 -1
  484. package/src/components/menu/menu.tsx +2 -2
  485. package/src/components/modal.spec.tsx +127 -4
  486. package/src/components/modal.tsx +42 -4
  487. package/src/components/noty-list.tsx +2 -2
  488. package/src/components/page-container/index.tsx +1 -1
  489. package/src/components/page-container/page-header.tsx +1 -1
  490. package/src/components/page-layout/index.spec.tsx +20 -0
  491. package/src/components/page-layout/index.tsx +2 -2
  492. package/src/components/pagination.tsx +1 -1
  493. package/src/components/paper.tsx +1 -1
  494. package/src/components/rating.spec.tsx +200 -5
  495. package/src/components/rating.tsx +29 -23
  496. package/src/components/result.tsx +1 -1
  497. package/src/components/skeleton.tsx +1 -1
  498. package/src/components/suggest/index.spec.tsx +148 -44
  499. package/src/components/suggest/index.tsx +16 -3
  500. package/src/components/suggest/suggest-input.spec.tsx +1 -1
  501. package/src/components/suggest/suggest-input.tsx +1 -1
  502. package/src/components/suggest/suggestion-list.spec.tsx +1 -1
  503. package/src/components/suggest/suggestion-list.tsx +1 -1
  504. package/src/components/tabs.tsx +6 -2
  505. package/src/components/timeline.tsx +2 -2
  506. package/src/components/tooltip.tsx +1 -1
  507. package/src/components/tree/tree-item.tsx +20 -5
  508. package/src/components/tree/tree.spec.tsx +101 -2
  509. package/src/components/tree/tree.tsx +22 -4
  510. package/src/components/typography.tsx +1 -1
  511. package/src/components/wizard/index.spec.tsx +3 -3
  512. package/src/components/wizard/index.tsx +1 -1
  513. package/src/services/collection-service.spec.ts +33 -24
  514. package/src/services/collection-service.ts +35 -13
  515. package/src/services/css-variable-theme.spec.ts +1 -0
  516. package/src/services/css-variable-theme.ts +25 -0
  517. package/src/services/list-service.spec.ts +13 -42
  518. package/src/services/list-service.ts +15 -13
  519. package/src/services/theme-provider-service.ts +2 -0
  520. package/src/services/tree-service.spec.ts +12 -9
  521. package/src/services/tree-service.ts +5 -8
  522. package/src/themes/architect-theme.ts +1 -0
  523. package/src/themes/auditore-theme.ts +1 -0
  524. package/src/themes/black-mesa-theme.ts +1 -0
  525. package/src/themes/chieftain-theme.ts +1 -0
  526. package/src/themes/default-dark-theme.ts +1 -0
  527. package/src/themes/default-light-theme.ts +1 -0
  528. package/src/themes/dragonborn-theme.ts +1 -0
  529. package/src/themes/hawkins-theme.ts +1 -0
  530. package/src/themes/jedi-theme.ts +1 -0
  531. package/src/themes/neon-runner-theme.ts +1 -0
  532. package/src/themes/paladin-theme.ts +1 -0
  533. package/src/themes/plumber-theme.ts +1 -0
  534. package/src/themes/replicant-theme.ts +1 -0
  535. package/src/themes/sandworm-theme.ts +1 -0
  536. package/src/themes/shadow-broker-theme.ts +1 -0
  537. package/src/themes/sith-theme.ts +1 -0
  538. package/src/themes/vault-dweller-theme.ts +1 -0
  539. package/src/themes/wild-hunt-theme.ts +1 -0
  540. package/src/themes/xenomorph-theme.ts +1 -0
@@ -68,7 +68,7 @@ describe('Suggest', () => {
68
68
  })
69
69
 
70
70
  describe('rendering', () => {
71
- it('should render with shadow DOM', async () => {
71
+ it('should render as custom element', async () => {
72
72
  await usingAsync(new Injector(), async (injector) => {
73
73
  const rootElement = document.getElementById('root') as HTMLDivElement
74
74
  const onSelectSuggestion = vi.fn()
@@ -200,13 +200,11 @@ describe('Suggest', () => {
200
200
  const input = suggest?.querySelector('input') as HTMLInputElement
201
201
  input.value = 'test'
202
202
 
203
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
204
- Object.defineProperty(keyupEvent, 'target', { value: input })
205
- wrapper?.dispatchEvent(keyupEvent)
203
+ input.dispatchEvent(new Event('input', { bubbles: true }))
206
204
 
207
205
  await advanceTimers(300)
208
206
 
209
- const arrowDownEvent = new KeyboardEvent('keyup', { key: 'ArrowDown', bubbles: true })
207
+ const arrowDownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true })
210
208
  Object.defineProperty(arrowDownEvent, 'target', { value: input })
211
209
  wrapper?.dispatchEvent(arrowDownEvent)
212
210
 
@@ -243,18 +241,16 @@ describe('Suggest', () => {
243
241
  const input = suggest?.querySelector('input') as HTMLInputElement
244
242
  input.value = 'test'
245
243
 
246
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
247
- Object.defineProperty(keyupEvent, 'target', { value: input })
248
- wrapper?.dispatchEvent(keyupEvent)
244
+ input.dispatchEvent(new Event('input', { bubbles: true }))
249
245
 
250
246
  await advanceTimers(300)
251
247
 
252
- const arrowDownEvent = new KeyboardEvent('keyup', { key: 'ArrowDown', bubbles: true })
248
+ const arrowDownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true })
253
249
  Object.defineProperty(arrowDownEvent, 'target', { value: input })
254
250
  wrapper?.dispatchEvent(arrowDownEvent)
255
251
  wrapper?.dispatchEvent(arrowDownEvent)
256
252
 
257
- const arrowUpEvent = new KeyboardEvent('keyup', { key: 'ArrowUp', bubbles: true })
253
+ const arrowUpEvent = new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true })
258
254
  Object.defineProperty(arrowUpEvent, 'target', { value: input })
259
255
  wrapper?.dispatchEvent(arrowUpEvent)
260
256
 
@@ -290,13 +286,11 @@ describe('Suggest', () => {
290
286
  const input = suggest?.querySelector('input') as HTMLInputElement
291
287
  input.value = 'First'
292
288
 
293
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
294
- Object.defineProperty(keyupEvent, 'target', { value: input })
295
- wrapper?.dispatchEvent(keyupEvent)
289
+ input.dispatchEvent(new Event('input', { bubbles: true }))
296
290
 
297
291
  await advanceTimers(300)
298
292
 
299
- const enterEvent = new KeyboardEvent('keyup', { key: 'Enter', bubbles: true })
293
+ const enterEvent = new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })
300
294
  Object.defineProperty(enterEvent, 'target', { value: input })
301
295
  wrapper?.dispatchEvent(enterEvent)
302
296
 
@@ -332,13 +326,11 @@ describe('Suggest', () => {
332
326
  const input = suggest?.querySelector('input') as HTMLInputElement
333
327
  input.value = 'First'
334
328
 
335
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
336
- Object.defineProperty(keyupEvent, 'target', { value: input })
337
- wrapper?.dispatchEvent(keyupEvent)
329
+ input.dispatchEvent(new Event('input', { bubbles: true }))
338
330
 
339
331
  await advanceTimers(300)
340
332
 
341
- const enterEvent = new KeyboardEvent('keyup', { key: 'Enter', bubbles: true, cancelable: true })
333
+ const enterEvent = new KeyboardEvent('keydown', { key: 'Enter', bubbles: true, cancelable: true })
342
334
  Object.defineProperty(enterEvent, 'target', { value: input })
343
335
 
344
336
  const preventDefaultSpy = vi.spyOn(enterEvent, 'preventDefault')
@@ -348,7 +340,7 @@ describe('Suggest', () => {
348
340
  })
349
341
  })
350
342
 
351
- it('should prevent default on ArrowUp key', async () => {
343
+ it('should prevent default on ArrowUp key when suggestions are open', async () => {
352
344
  await usingAsync(new Injector(), async (injector) => {
353
345
  const rootElement = document.getElementById('root') as HTMLDivElement
354
346
  const onSelectSuggestion = vi.fn()
@@ -372,8 +364,11 @@ describe('Suggest', () => {
372
364
  const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
373
365
 
374
366
  const input = suggest?.querySelector('input') as HTMLInputElement
367
+ input.value = 'First'
368
+ input.dispatchEvent(new Event('input', { bubbles: true }))
369
+ await advanceTimers(300)
375
370
 
376
- const arrowUpEvent = new KeyboardEvent('keyup', { key: 'ArrowUp', bubbles: true, cancelable: true })
371
+ const arrowUpEvent = new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true, cancelable: true })
377
372
  Object.defineProperty(arrowUpEvent, 'target', { value: input })
378
373
 
379
374
  const preventDefaultSpy = vi.spyOn(arrowUpEvent, 'preventDefault')
@@ -383,7 +378,7 @@ describe('Suggest', () => {
383
378
  })
384
379
  })
385
380
 
386
- it('should prevent default on ArrowDown key', async () => {
381
+ it('should prevent default on ArrowDown key when suggestions are open', async () => {
387
382
  await usingAsync(new Injector(), async (injector) => {
388
383
  const rootElement = document.getElementById('root') as HTMLDivElement
389
384
  const onSelectSuggestion = vi.fn()
@@ -407,8 +402,11 @@ describe('Suggest', () => {
407
402
  const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
408
403
 
409
404
  const input = suggest?.querySelector('input') as HTMLInputElement
405
+ input.value = 'First'
406
+ input.dispatchEvent(new Event('input', { bubbles: true }))
407
+ await advanceTimers(300)
410
408
 
411
- const arrowDownEvent = new KeyboardEvent('keyup', { key: 'ArrowDown', bubbles: true, cancelable: true })
409
+ const arrowDownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true, cancelable: true })
412
410
  Object.defineProperty(arrowDownEvent, 'target', { value: input })
413
411
 
414
412
  const preventDefaultSpy = vi.spyOn(arrowDownEvent, 'preventDefault')
@@ -418,6 +416,39 @@ describe('Suggest', () => {
418
416
  })
419
417
  })
420
418
 
419
+ it('should not prevent default on arrow keys when dropdown is closed', async () => {
420
+ await usingAsync(new Injector(), async (injector) => {
421
+ const rootElement = document.getElementById('root') as HTMLDivElement
422
+ const onSelectSuggestion = vi.fn()
423
+
424
+ initializeShadeRoot({
425
+ injector,
426
+ rootElement,
427
+ jsxElement: (
428
+ <Suggest<TestEntry>
429
+ defaultPrefix="🔍"
430
+ getEntries={getTestEntries}
431
+ getSuggestionEntry={getSuggestionEntry}
432
+ onSelectSuggestion={onSelectSuggestion}
433
+ />
434
+ ),
435
+ })
436
+
437
+ await advanceTimers(50)
438
+
439
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
440
+ const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
441
+ const input = suggest?.querySelector('input') as HTMLInputElement
442
+
443
+ const arrowDownEvent = new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true, cancelable: true })
444
+ Object.defineProperty(arrowDownEvent, 'target', { value: input })
445
+ const preventDefaultSpy = vi.spyOn(arrowDownEvent, 'preventDefault')
446
+ wrapper?.dispatchEvent(arrowDownEvent)
447
+
448
+ expect(preventDefaultSpy).not.toHaveBeenCalled()
449
+ })
450
+ })
451
+
421
452
  it('should not move selection below 0', async () => {
422
453
  await usingAsync(new Injector(), async (injector) => {
423
454
  const rootElement = document.getElementById('root') as HTMLDivElement
@@ -442,9 +473,12 @@ describe('Suggest', () => {
442
473
  const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
443
474
 
444
475
  const input = suggest?.querySelector('input') as HTMLInputElement
476
+ input.value = 'test'
477
+ input.dispatchEvent(new Event('input', { bubbles: true }))
478
+ await advanceTimers(300)
445
479
 
446
480
  for (let i = 0; i < 5; i++) {
447
- const arrowUpEvent = new KeyboardEvent('keyup', { key: 'ArrowUp', bubbles: true })
481
+ const arrowUpEvent = new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true })
448
482
  Object.defineProperty(arrowUpEvent, 'target', { value: input })
449
483
  wrapper?.dispatchEvent(arrowUpEvent)
450
484
  }
@@ -616,14 +650,11 @@ describe('Suggest', () => {
616
650
  await advanceTimers(50)
617
651
 
618
652
  const suggest = document.querySelector('shade-suggest') as HTMLElement
619
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
620
653
 
621
654
  const input = suggest?.querySelector('input') as HTMLInputElement
622
655
  input.value = 'First'
623
656
 
624
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
625
- Object.defineProperty(keyupEvent, 'target', { value: input })
626
- wrapper?.dispatchEvent(keyupEvent)
657
+ input.dispatchEvent(new Event('input', { bubbles: true }))
627
658
 
628
659
  await advanceTimers(300)
629
660
 
@@ -658,14 +689,11 @@ describe('Suggest', () => {
658
689
  await advanceTimers(50)
659
690
 
660
691
  const suggest = document.querySelector('shade-suggest') as HTMLElement
661
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
662
692
 
663
693
  const input = suggest?.querySelector('input') as HTMLInputElement
664
694
  input.value = 'test'
665
695
 
666
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
667
- Object.defineProperty(keyupEvent, 'target', { value: input })
668
- wrapper?.dispatchEvent(keyupEvent)
696
+ input.dispatchEvent(new Event('input', { bubbles: true }))
669
697
 
670
698
  await advanceTimers(300)
671
699
 
@@ -698,14 +726,11 @@ describe('Suggest', () => {
698
726
  await advanceTimers(50)
699
727
 
700
728
  const suggest = document.querySelector('shade-suggest') as HTMLElement
701
- const wrapper = suggest?.querySelector('.suggest-wrapper') as HTMLElement
702
729
 
703
730
  const input = suggest?.querySelector('input') as HTMLInputElement
704
731
  input.value = 'test'
705
732
 
706
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
707
- Object.defineProperty(keyupEvent, 'target', { value: input })
708
- wrapper?.dispatchEvent(keyupEvent)
733
+ input.dispatchEvent(new Event('input', { bubbles: true }))
709
734
 
710
735
  await advanceTimers(300)
711
736
 
@@ -742,13 +767,11 @@ describe('Suggest', () => {
742
767
  const input = suggest?.querySelector('input') as HTMLInputElement
743
768
  input.value = 'First'
744
769
 
745
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
746
- Object.defineProperty(keyupEvent, 'target', { value: input })
747
- wrapper?.dispatchEvent(keyupEvent)
770
+ input.dispatchEvent(new Event('input', { bubbles: true }))
748
771
 
749
772
  await advanceTimers(300)
750
773
 
751
- const enterEvent = new KeyboardEvent('keyup', { key: 'Enter', bubbles: true })
774
+ const enterEvent = new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })
752
775
  Object.defineProperty(enterEvent, 'target', { value: input })
753
776
  wrapper?.dispatchEvent(enterEvent)
754
777
 
@@ -784,15 +807,13 @@ describe('Suggest', () => {
784
807
  const input = suggest?.querySelector('input') as HTMLInputElement
785
808
  input.value = 'First'
786
809
 
787
- const keyupEvent = new KeyboardEvent('keyup', { key: 'a', bubbles: true })
788
- Object.defineProperty(keyupEvent, 'target', { value: input })
789
- wrapper?.dispatchEvent(keyupEvent)
810
+ input.dispatchEvent(new Event('input', { bubbles: true }))
790
811
 
791
812
  await advanceTimers(300)
792
813
 
793
814
  expect(suggest?.hasAttribute('data-opened')).toBe(true)
794
815
 
795
- const enterEvent = new KeyboardEvent('keyup', { key: 'Enter', bubbles: true })
816
+ const enterEvent = new KeyboardEvent('keydown', { key: 'Enter', bubbles: true })
796
817
  Object.defineProperty(enterEvent, 'target', { value: input })
797
818
  wrapper?.dispatchEvent(enterEvent)
798
819
 
@@ -883,6 +904,89 @@ describe('Suggest', () => {
883
904
  })
884
905
  })
885
906
 
907
+ describe('spatial navigation attributes', () => {
908
+ it('should have data-spatial-nav-target on the host element', async () => {
909
+ await usingAsync(new Injector(), async (injector) => {
910
+ const rootElement = document.getElementById('root') as HTMLDivElement
911
+ const onSelectSuggestion = vi.fn()
912
+
913
+ initializeShadeRoot({
914
+ injector,
915
+ rootElement,
916
+ jsxElement: (
917
+ <Suggest<TestEntry>
918
+ defaultPrefix="🔍"
919
+ getEntries={getTestEntries}
920
+ getSuggestionEntry={getSuggestionEntry}
921
+ onSelectSuggestion={onSelectSuggestion}
922
+ />
923
+ ),
924
+ })
925
+
926
+ await advanceTimers(50)
927
+
928
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
929
+ expect(suggest.hasAttribute('data-spatial-nav-target')).toBe(true)
930
+ })
931
+ })
932
+
933
+ it('should have tabIndex of -1 on the host element', async () => {
934
+ await usingAsync(new Injector(), async (injector) => {
935
+ const rootElement = document.getElementById('root') as HTMLDivElement
936
+ const onSelectSuggestion = vi.fn()
937
+
938
+ initializeShadeRoot({
939
+ injector,
940
+ rootElement,
941
+ jsxElement: (
942
+ <Suggest<TestEntry>
943
+ defaultPrefix="🔍"
944
+ getEntries={getTestEntries}
945
+ getSuggestionEntry={getSuggestionEntry}
946
+ onSelectSuggestion={onSelectSuggestion}
947
+ />
948
+ ),
949
+ })
950
+
951
+ await advanceTimers(50)
952
+
953
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
954
+ expect(suggest.tabIndex).toBe(-1)
955
+ })
956
+ })
957
+
958
+ it('should delegate focus to the inner input when the host is focused', async () => {
959
+ await usingAsync(new Injector(), async (injector) => {
960
+ const rootElement = document.getElementById('root') as HTMLDivElement
961
+ const onSelectSuggestion = vi.fn()
962
+
963
+ initializeShadeRoot({
964
+ injector,
965
+ rootElement,
966
+ jsxElement: (
967
+ <Suggest<TestEntry>
968
+ defaultPrefix="🔍"
969
+ getEntries={getTestEntries}
970
+ getSuggestionEntry={getSuggestionEntry}
971
+ onSelectSuggestion={onSelectSuggestion}
972
+ />
973
+ ),
974
+ })
975
+
976
+ await advanceTimers(50)
977
+
978
+ const suggest = document.querySelector('shade-suggest') as HTMLElement
979
+ const input = suggest.querySelector('input') as HTMLInputElement
980
+
981
+ suggest.dispatchEvent(new FocusEvent('focus', { bubbles: false }))
982
+
983
+ await advanceTimers(10)
984
+
985
+ expect(document.activeElement).toBe(input)
986
+ })
987
+ })
988
+ })
989
+
886
990
  describe('synchronous suggestions mode', () => {
887
991
  it('should render with string[] suggestions', async () => {
888
992
  await usingAsync(new Injector(), async (injector) => {
@@ -956,7 +1060,7 @@ describe('Suggest', () => {
956
1060
  const input = suggest?.querySelector('input') as HTMLInputElement
957
1061
 
958
1062
  input.value = 'ap'
959
- input.dispatchEvent(new KeyboardEvent('keyup', { key: 'p', bubbles: true }))
1063
+ input.dispatchEvent(new Event('input', { bubbles: true }))
960
1064
 
961
1065
  await advanceTimers(300)
962
1066
 
@@ -41,7 +41,7 @@ const isSyncProps = (props: SuggestProps<unknown>): props is SuggestSyncProps =>
41
41
  export const Suggest: <T>(props: SuggestProps<T>, children: ChildrenList) => JSX.Element<any> = Shade<
42
42
  SuggestProps<any>
43
43
  >({
44
- shadowDomName: 'shade-suggest',
44
+ customElementName: 'shade-suggest',
45
45
  css: {
46
46
  ...searchableInputStyles,
47
47
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -82,6 +82,15 @@ export const Suggest: <T>(props: SuggestProps<T>, children: ChildrenList) => JSX
82
82
 
83
83
  useHostProps({
84
84
  'data-opened': isOpened ? '' : undefined,
85
+ tabIndex: -1,
86
+ 'data-spatial-nav-target': '',
87
+ onfocus: (ev: FocusEvent) => {
88
+ const host = ev.currentTarget as HTMLElement
89
+ const input = host.querySelector('input')
90
+ if (input) {
91
+ input.focus()
92
+ }
93
+ },
85
94
  })
86
95
  useDisposable('isLoadingSubscription', () =>
87
96
  manager.isLoading.subscribe((isLoading) => {
@@ -107,7 +116,10 @@ export const Suggest: <T>(props: SuggestProps<T>, children: ChildrenList) => JSX
107
116
  <div
108
117
  ref={wrapperRef}
109
118
  className="suggest-wrapper"
110
- onkeyup={(ev) => {
119
+ onkeydown={(ev) => {
120
+ const hasSuggestions = manager.isOpened.getValue() && manager.currentSuggestions.getValue().length > 0
121
+ if (!hasSuggestions) return
122
+
111
123
  if (ev.key === 'Enter') {
112
124
  ev.preventDefault()
113
125
  manager.selectSuggestion()
@@ -123,7 +135,8 @@ export const Suggest: <T>(props: SuggestProps<T>, children: ChildrenList) => JSX
123
135
  Math.min(manager.selectedIndex.getValue() + 1, manager.currentSuggestions.getValue().length - 1),
124
136
  )
125
137
  }
126
-
138
+ }}
139
+ oninput={(ev) => {
127
140
  void manager.getSuggestion({ injector, term: (ev.target as HTMLInputElement).value })
128
141
  }}
129
142
  >
@@ -47,7 +47,7 @@ describe('SuggestInput', () => {
47
47
  return new SuggestManager<TestEntry>(getEntries, getSuggestionEntry)
48
48
  }
49
49
 
50
- it('should render with shadow DOM', async () => {
50
+ it('should render as custom element', async () => {
51
51
  await usingAsync(new Injector(), async (injector) => {
52
52
  const rootElement = document.getElementById('root') as HTMLDivElement
53
53
  const manager = createManager()
@@ -3,7 +3,7 @@ import { cssVariableTheme } from '../../services/css-variable-theme.js'
3
3
  import type { SuggestManager } from './suggest-manager.js'
4
4
 
5
5
  export const SuggestInput = Shade<{ manager: SuggestManager<any> }>({
6
- shadowDomName: 'shades-suggest-input',
6
+ customElementName: 'shades-suggest-input',
7
7
  css: {
8
8
  width: '100%',
9
9
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -55,7 +55,7 @@ describe('SuggestionList', () => {
55
55
  return new SuggestManager<TestEntry>(getEntries, getSuggestionEntry)
56
56
  }
57
57
 
58
- it('should render with shadow DOM', async () => {
58
+ it('should render as custom element', async () => {
59
59
  await usingAsync(new Injector(), async (injector) => {
60
60
  const rootElement = document.getElementById('root') as HTMLDivElement
61
61
  const manager = createManager()
@@ -6,7 +6,7 @@ import type { SuggestManager } from './suggest-manager.js'
6
6
 
7
7
  export const SuggestionList: <T>(props: { manager: SuggestManager<T> }, children: ChildrenList) => JSX.Element<any> =
8
8
  Shade<{ manager: SuggestManager<any> }>({
9
- shadowDomName: 'shade-suggest-suggestion-list',
9
+ customElementName: 'shade-suggest-suggestion-list',
10
10
  css: {
11
11
  fontFamily: cssVariableTheme.typography.fontFamily,
12
12
  '& .suggestion-items-container': {
@@ -13,7 +13,7 @@ export type Tab = {
13
13
  }
14
14
 
15
15
  const TabHeader = Shade<{ hash: string }>({
16
- shadowDomName: 'shade-tab-header',
16
+ customElementName: 'shade-tab-header',
17
17
  css: {
18
18
  padding: `${cssVariableTheme.spacing.md} 40px`,
19
19
  cursor: 'pointer',
@@ -74,7 +74,7 @@ export const Tabs = Shade<{
74
74
  onAdd?: () => void
75
75
  viewTransition?: boolean | ViewTransitionConfig
76
76
  }>({
77
- shadowDomName: 'shade-tabs',
77
+ customElementName: 'shade-tabs',
78
78
  css: {
79
79
  fontFamily: cssVariableTheme.typography.fontFamily,
80
80
  width: '100%',
@@ -115,6 +115,10 @@ export const Tabs = Shade<{
115
115
  color: cssVariableTheme.text.primary,
116
116
  boxShadow: `inset 0 -2px 0 ${cssVariableTheme.palette.primary.main}`,
117
117
  },
118
+ '& .shade-tab-btn:focus-visible': {
119
+ outline: cssVariableTheme.action.focusOutline,
120
+ outlineOffset: '-2px',
121
+ },
118
122
 
119
123
  // Close button (span with role="button" via event delegation)
120
124
  '& .shade-tab-close': {
@@ -21,7 +21,7 @@ export type TimelineItemProps = PartialElement<HTMLElement> & {
21
21
  * Renders a dot, a connector tail, and the item's content (children).
22
22
  */
23
23
  export const TimelineItem = Shade<TimelineItemProps>({
24
- shadowDomName: 'shade-timeline-item',
24
+ customElementName: 'shade-timeline-item',
25
25
  css: {
26
26
  display: 'flex',
27
27
  position: 'relative',
@@ -157,7 +157,7 @@ export type TimelineProps = PartialElement<HTMLElement> & {
157
157
  * Supports left, right, and alternate layout modes with optional pending state.
158
158
  */
159
159
  export const Timeline = Shade<TimelineProps>({
160
- shadowDomName: 'shade-timeline',
160
+ customElementName: 'shade-timeline',
161
161
  css: {
162
162
  display: 'flex',
163
163
  flexDirection: 'column',
@@ -23,7 +23,7 @@ export type TooltipProps = {
23
23
  }
24
24
 
25
25
  export const Tooltip = Shade<TooltipProps>({
26
- shadowDomName: 'shade-tooltip',
26
+ customElementName: 'shade-tooltip',
27
27
  css: {
28
28
  position: 'relative',
29
29
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -20,7 +20,7 @@ const INDENT_PX = 20
20
20
  const EXPAND_ICON_WIDTH = 20
21
21
 
22
22
  export const TreeItem: <T>(props: TreeItemProps<T>, children: ChildrenList) => JSX.Element<any> = Shade({
23
- shadowDomName: 'shade-tree-item',
23
+ customElementName: 'shade-tree-item',
24
24
  css: {
25
25
  display: 'flex',
26
26
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -69,10 +69,20 @@ export const TreeItem: <T>(props: TreeItemProps<T>, children: ChildrenList) => J
69
69
  const isSelected = selection.includes(item)
70
70
 
71
71
  useHostProps({
72
+ tabIndex: isFocused ? 0 : -1,
73
+ 'data-spatial-nav-target': '',
72
74
  role: 'treeitem',
73
75
  'aria-level': (level + 1).toString(),
74
76
  'aria-selected': isSelected.toString(),
75
77
  ...(hasChildren ? { 'aria-expanded': isExpanded.toString() } : {}),
78
+ onfocus: () => {
79
+ if (treeService.focusedItem.getValue() !== item) {
80
+ treeService.focusedItem.setValue(item)
81
+ }
82
+ if (!treeService.hasFocus.getValue()) {
83
+ treeService.hasFocus.setValue(true)
84
+ }
85
+ },
76
86
  onclick: (ev: MouseEvent) => {
77
87
  treeService.handleItemClick(item, ev)
78
88
  },
@@ -93,10 +103,15 @@ export const TreeItem: <T>(props: TreeItemProps<T>, children: ChildrenList) => J
93
103
  queueMicrotask(() => {
94
104
  const el = wrapperRef.current
95
105
  if (!el) return
106
+ const hostEl = el.closest('shade-tree-item') as HTMLElement
107
+ if (!hostEl) return
108
+
109
+ if (document.activeElement !== hostEl) {
110
+ hostEl.focus({ preventScroll: true })
111
+ }
112
+
96
113
  const scrollContainer = el.closest('shade-tree') as HTMLElement
97
114
  if (scrollContainer) {
98
- const hostEl = el.closest('shade-tree-item') as HTMLElement
99
- if (!hostEl) return
100
115
  const containerRect = scrollContainer.getBoundingClientRect()
101
116
  const itemRect = hostEl.getBoundingClientRect()
102
117
  const itemTopInContainer = itemRect.top - containerRect.top
@@ -105,12 +120,12 @@ export const TreeItem: <T>(props: TreeItemProps<T>, children: ChildrenList) => J
105
120
  if (itemTopInContainer < 0) {
106
121
  scrollContainer.scrollTo({
107
122
  top: scrollContainer.scrollTop + itemTopInContainer,
108
- behavior: 'smooth',
123
+ behavior: 'instant',
109
124
  })
110
125
  } else if (itemBottomInContainer > scrollContainer.clientHeight) {
111
126
  scrollContainer.scrollTo({
112
127
  top: scrollContainer.scrollTop + (itemBottomInContainer - scrollContainer.clientHeight),
113
- behavior: 'smooth',
128
+ behavior: 'instant',
114
129
  })
115
130
  }
116
131
  }