@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
@@ -1,9 +1,19 @@
1
- import { createComponent } from '@furystack/shades'
2
- import { describe, expect, it, vi } from 'vitest'
1
+ import { Injector } from '@furystack/inject'
2
+ import { createComponent, flushUpdates, initializeShadeRoot, SpatialNavigationService } from '@furystack/shades'
3
+ import { usingAsync } from '@furystack/utils'
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
3
5
  import type { DialogProps } from './dialog.js'
4
6
  import { ConfirmDialog, Dialog } from './dialog.js'
5
7
 
6
8
  describe('Dialog', () => {
9
+ beforeEach(() => {
10
+ document.body.innerHTML = '<div id="root"></div>'
11
+ })
12
+
13
+ afterEach(() => {
14
+ document.body.innerHTML = ''
15
+ })
16
+
7
17
  it('should be defined', () => {
8
18
  expect(Dialog).toBeDefined()
9
19
  expect(typeof Dialog).toBe('function')
@@ -55,6 +65,71 @@ describe('Dialog', () => {
55
65
  const el = (<Dialog isVisible={false} />) as unknown as { props: DialogProps }
56
66
  expect(el.props.isVisible).toBe(false)
57
67
  })
68
+
69
+ it('should forward trapFocus to the underlying Modal', async () => {
70
+ await usingAsync(new Injector(), async (injector) => {
71
+ const spatialNav = injector.getInstance(SpatialNavigationService)
72
+ const pushSpy = vi.spyOn(spatialNav, 'pushFocusTrap')
73
+ const rootElement = document.getElementById('root') as HTMLDivElement
74
+
75
+ initializeShadeRoot({
76
+ injector,
77
+ rootElement,
78
+ jsxElement: (
79
+ <Dialog isVisible={true} trapFocus={true} navSection="dialog-trap">
80
+ <div>Content</div>
81
+ </Dialog>
82
+ ),
83
+ })
84
+
85
+ await flushUpdates()
86
+
87
+ expect(pushSpy).toHaveBeenCalledWith('dialog-trap')
88
+ })
89
+ })
90
+
91
+ it('should forward navSection to the underlying Modal', async () => {
92
+ await usingAsync(new Injector(), async (injector) => {
93
+ const rootElement = document.getElementById('root') as HTMLDivElement
94
+
95
+ initializeShadeRoot({
96
+ injector,
97
+ rootElement,
98
+ jsxElement: (
99
+ <Dialog isVisible={true} navSection="my-dialog">
100
+ <div>Content</div>
101
+ </Dialog>
102
+ ),
103
+ })
104
+
105
+ await flushUpdates()
106
+
107
+ const backdrop = document.querySelector('.shade-backdrop')
108
+ expect(backdrop?.getAttribute('data-nav-section')).toBe('my-dialog')
109
+ })
110
+ })
111
+
112
+ it('should not push focus trap when trapFocus is false', async () => {
113
+ await usingAsync(new Injector(), async (injector) => {
114
+ const spatialNav = injector.getInstance(SpatialNavigationService)
115
+ const pushSpy = vi.spyOn(spatialNav, 'pushFocusTrap')
116
+ const rootElement = document.getElementById('root') as HTMLDivElement
117
+
118
+ initializeShadeRoot({
119
+ injector,
120
+ rootElement,
121
+ jsxElement: (
122
+ <Dialog isVisible={true} trapFocus={false}>
123
+ <div>Content</div>
124
+ </Dialog>
125
+ ),
126
+ })
127
+
128
+ await flushUpdates()
129
+
130
+ expect(pushSpy).not.toHaveBeenCalled()
131
+ })
132
+ })
58
133
  })
59
134
 
60
135
  describe('ConfirmDialog', () => {
@@ -13,6 +13,17 @@ export type DialogProps = {
13
13
  actions?: JSX.Element
14
14
  maxWidth?: string
15
15
  fullWidth?: boolean
16
+ /**
17
+ * When true, traps spatial navigation within the dialog's bounds.
18
+ * Forwarded to the underlying Modal component.
19
+ */
20
+ trapFocus?: boolean
21
+ /**
22
+ * Section name for spatial navigation scoping.
23
+ * Forwarded to the underlying Modal component.
24
+ * @default 'modal'
25
+ */
26
+ navSection?: string
16
27
  }
17
28
 
18
29
  const showAnimation = async (el: Element | null) => {
@@ -52,7 +63,7 @@ const hideAnimation = async (el: Element | null) => {
52
63
  }
53
64
 
54
65
  export const Dialog = Shade<DialogProps>({
55
- shadowDomName: 'shade-dialog',
66
+ customElementName: 'shade-dialog',
56
67
  css: {
57
68
  fontFamily: cssVariableTheme.typography.fontFamily,
58
69
  '& .dialog-panel': {
@@ -127,7 +138,7 @@ export const Dialog = Shade<DialogProps>({
127
138
  },
128
139
  },
129
140
  render: ({ props, children }) => {
130
- const { isVisible, title, onClose, actions, maxWidth = '560px', fullWidth } = props
141
+ const { isVisible, title, onClose, actions, maxWidth = '560px', fullWidth, trapFocus = true, navSection } = props
131
142
 
132
143
  const handleClose = () => {
133
144
  onClose?.()
@@ -139,6 +150,8 @@ export const Dialog = Shade<DialogProps>({
139
150
  onClose={handleClose}
140
151
  showAnimation={showAnimation}
141
152
  hideAnimation={hideAnimation}
153
+ trapFocus={trapFocus}
154
+ navSection={navSection}
142
155
  backdropStyle={{
143
156
  display: 'flex',
144
157
  alignItems: 'center',
@@ -12,7 +12,7 @@ export type DividerProps = PartialElement<HTMLElement> & {
12
12
  }
13
13
 
14
14
  export const Divider = Shade<DividerProps>({
15
- shadowDomName: 'shade-divider',
15
+ customElementName: 'shade-divider',
16
16
  css: {
17
17
  display: 'flex',
18
18
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -34,7 +34,7 @@ export type DrawerToggleButtonProps = {
34
34
  * ```
35
35
  */
36
36
  export const DrawerToggleButton = Shade<DrawerToggleButtonProps>({
37
- shadowDomName: 'shade-drawer-toggle-button',
37
+ customElementName: 'shade-drawer-toggle-button',
38
38
  css: {
39
39
  display: 'inline-block',
40
40
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -57,7 +57,7 @@ const DEFAULT_DRAWER_WIDTH = '240px'
57
57
  * ```
58
58
  */
59
59
  export const Drawer = Shade<DrawerProps>({
60
- shadowDomName: 'shade-drawer',
60
+ customElementName: 'shade-drawer',
61
61
  css: {
62
62
  display: 'block',
63
63
 
@@ -416,6 +416,15 @@ describe('Dropdown', () => {
416
416
  })
417
417
  })
418
418
 
419
+ describe('spatial navigation', () => {
420
+ it('should have data-spatial-nav-passthrough on the backdrop', async () => {
421
+ await usingAsync(await renderDropdown({}), async ({ dropdown }) => {
422
+ const backdrop = dropdown.querySelector('.dropdown-backdrop') as HTMLElement
423
+ expect(backdrop.hasAttribute('data-spatial-nav-passthrough')).toBe(true)
424
+ })
425
+ })
426
+ })
427
+
419
428
  describe('placement', () => {
420
429
  it('should accept bottomRight placement', async () => {
421
430
  await usingAsync(await renderDropdown({ placement: 'bottomRight' }), async ({ dropdown }) => {
@@ -57,7 +57,7 @@ const renderDropdownItems = (items: MenuEntry[], onSelect: (key: string) => void
57
57
  }
58
58
 
59
59
  export const Dropdown: (props: DropdownProps, children: ChildrenList) => JSX.Element<any> = Shade<DropdownProps>({
60
- shadowDomName: 'shade-dropdown',
60
+ customElementName: 'shade-dropdown',
61
61
  css: {
62
62
  display: 'inline-flex',
63
63
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -309,6 +309,7 @@ export const Dropdown: (props: DropdownProps, children: ChildrenList) => JSX.Ele
309
309
  <div
310
310
  ref={backdropRef}
311
311
  className="dropdown-backdrop"
312
+ data-spatial-nav-passthrough=""
312
313
  style={{
313
314
  position: 'fixed',
314
315
  top: '0',
@@ -9,7 +9,7 @@ export type FabProps = PartialElement<HTMLButtonElement> & {
9
9
  }
10
10
 
11
11
  export const Fab = Shade<FabProps>({
12
- shadowDomName: 'shade-fab',
12
+ customElementName: 'shade-fab',
13
13
  elementBase: HTMLButtonElement,
14
14
  elementBaseName: 'button',
15
15
  css: {
@@ -56,7 +56,7 @@ type FormProps<T> = {
56
56
  } & PartialElement<Omit<HTMLFormElement, 'onsubmit' | 'onchange' | 'onreset'>>
57
57
 
58
58
  export const Form: <T>(props: FormProps<T>, children: ChildrenList) => JSX.Element = Shade({
59
- shadowDomName: 'shade-form',
59
+ customElementName: 'shade-form',
60
60
  elementBase: HTMLFormElement,
61
61
  elementBaseName: 'form',
62
62
  css: { fontFamily: cssVariableTheme.typography.fontFamily },
@@ -28,7 +28,7 @@ export type RowCells<T, Columns extends string> = {
28
28
  */
29
29
  export const Grid: <T, Column extends string>(props: GridProps<T, Column>, children: ChildrenList) => JSX.Element<any> =
30
30
  Shade({
31
- shadowDomName: 'shade-grid',
31
+ customElementName: 'shade-grid',
32
32
  css: {
33
33
  display: 'block',
34
34
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -37,7 +37,7 @@ export type IconProps = PartialElement<HTMLElement> & {
37
37
  }
38
38
 
39
39
  export const Icon = Shade<IconProps>({
40
- shadowDomName: 'shade-icon',
40
+ customElementName: 'shade-icon',
41
41
  css: {
42
42
  display: 'inline-flex',
43
43
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -345,6 +345,88 @@ describe('Image component', () => {
345
345
  })
346
346
  })
347
347
 
348
+ it('should be focusable when preview is enabled', async () => {
349
+ await usingAsync(new Injector(), async (injector) => {
350
+ const rootElement = document.getElementById('root') as HTMLDivElement
351
+
352
+ initializeShadeRoot({
353
+ injector,
354
+ rootElement,
355
+ jsxElement: <Image src="https://example.com/photo.jpg" preview />,
356
+ })
357
+
358
+ await flushUpdates()
359
+
360
+ const imageComponent = document.querySelector('shade-image') as HTMLElement
361
+ expect(imageComponent.getAttribute('tabindex')).toBe('0')
362
+ })
363
+ })
364
+
365
+ it('should not be focusable when preview is disabled', async () => {
366
+ await usingAsync(new Injector(), async (injector) => {
367
+ const rootElement = document.getElementById('root') as HTMLDivElement
368
+
369
+ initializeShadeRoot({
370
+ injector,
371
+ rootElement,
372
+ jsxElement: <Image src="https://example.com/photo.jpg" />,
373
+ })
374
+
375
+ await flushUpdates()
376
+
377
+ const imageComponent = document.querySelector('shade-image') as HTMLElement
378
+ expect(imageComponent.hasAttribute('tabindex')).toBe(false)
379
+ })
380
+ })
381
+
382
+ it('should open lightbox when pressing Enter on a preview-enabled image', async () => {
383
+ await usingAsync(new Injector(), async (injector) => {
384
+ const rootElement = document.getElementById('root') as HTMLDivElement
385
+
386
+ initializeShadeRoot({
387
+ injector,
388
+ rootElement,
389
+ jsxElement: <Image src="https://example.com/photo.jpg" alt="My photo" preview />,
390
+ })
391
+
392
+ await flushUpdates()
393
+
394
+ const imageComponent = document.querySelector('shade-image') as HTMLElement
395
+ imageComponent.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }))
396
+
397
+ await flushUpdates()
398
+
399
+ const lightbox = document.querySelector('.lightbox-backdrop')
400
+ expect(lightbox).not.toBeNull()
401
+
402
+ lightbox?.remove()
403
+ })
404
+ })
405
+
406
+ it('should open lightbox when pressing Space on a preview-enabled image', async () => {
407
+ await usingAsync(new Injector(), async (injector) => {
408
+ const rootElement = document.getElementById('root') as HTMLDivElement
409
+
410
+ initializeShadeRoot({
411
+ injector,
412
+ rootElement,
413
+ jsxElement: <Image src="https://example.com/photo.jpg" alt="My photo" preview />,
414
+ })
415
+
416
+ await flushUpdates()
417
+
418
+ const imageComponent = document.querySelector('shade-image') as HTMLElement
419
+ imageComponent.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true }))
420
+
421
+ await flushUpdates()
422
+
423
+ const lightbox = document.querySelector('.lightbox-backdrop')
424
+ expect(lightbox).not.toBeNull()
425
+
426
+ lightbox?.remove()
427
+ })
428
+ })
429
+
348
430
  it('should store src and alt as data attributes', async () => {
349
431
  await usingAsync(new Injector(), async (injector) => {
350
432
  const rootElement = document.getElementById('root') as HTMLDivElement
@@ -355,7 +355,7 @@ const navButtonStyle = (): Partial<CSSStyleDeclaration> => ({
355
355
  * Image component with preview lightbox, zoom/rotate, fallback, and lazy loading support.
356
356
  */
357
357
  export const Image = Shade<ImageProps>({
358
- shadowDomName: 'shade-image',
358
+ customElementName: 'shade-image',
359
359
  css: {
360
360
  display: 'inline-block',
361
361
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -438,13 +438,6 @@ export const Image = Shade<ImageProps>({
438
438
  style: styleOverrides,
439
439
  } = props
440
440
 
441
- useHostProps({
442
- 'data-preview': preview ? '' : undefined,
443
- 'data-src': src,
444
- 'data-alt': alt,
445
- ...(styleOverrides ? { style: styleOverrides as Record<string, string> } : {}),
446
- })
447
-
448
441
  const [hasError, setHasError] = useState('hasError', false)
449
442
 
450
443
  const handleClick = () => {
@@ -466,6 +459,22 @@ export const Image = Shade<ImageProps>({
466
459
  createLightbox(src, alt)
467
460
  }
468
461
 
462
+ useHostProps({
463
+ 'data-preview': preview ? '' : undefined,
464
+ 'data-src': src,
465
+ 'data-alt': alt,
466
+ tabIndex: preview ? 0 : undefined,
467
+ onkeydown: preview
468
+ ? (ev: KeyboardEvent) => {
469
+ if (ev.key === 'Enter' || ev.key === ' ') {
470
+ ev.preventDefault()
471
+ handleClick()
472
+ }
473
+ }
474
+ : undefined,
475
+ ...(styleOverrides ? { style: styleOverrides as Record<string, string> } : {}),
476
+ })
477
+
469
478
  return (
470
479
  <div ref={imageHostRef} style={{ display: 'contents' }}>
471
480
  <img
@@ -506,7 +515,7 @@ export const Image = Shade<ImageProps>({
506
515
  * When one image is clicked, the lightbox shows navigation controls to browse all images in the group.
507
516
  */
508
517
  export const ImageGroup = Shade<ImageGroupProps>({
509
- shadowDomName: 'shade-image-group',
518
+ customElementName: 'shade-image-group',
510
519
  css: {
511
520
  display: 'flex',
512
521
  flexWrap: 'wrap',
@@ -12,7 +12,7 @@ export const Autocomplete = Shade<{
12
12
  strict?: boolean
13
13
  onchange?: (value: string) => void
14
14
  }>({
15
- shadowDomName: 'shade-autocomplete',
15
+ customElementName: 'shade-autocomplete',
16
16
  css: { fontFamily: cssVariableTheme.typography.fontFamily },
17
17
  render: ({ props, useState, useDisposable, useRef }) => {
18
18
  const wrapperRef = useRef<HTMLDivElement>('wrapper')
@@ -16,7 +16,7 @@ describe('Checkbox', () => {
16
16
  vi.restoreAllMocks()
17
17
  })
18
18
 
19
- it('should render with shadow DOM', async () => {
19
+ it('should render as custom element', async () => {
20
20
  await usingAsync(new Injector(), async (injector) => {
21
21
  const rootElement = document.getElementById('root') as HTMLDivElement
22
22
 
@@ -49,7 +49,7 @@ export type CheckboxProps = {
49
49
  }
50
50
 
51
51
  export const Checkbox = Shade<CheckboxProps>({
52
- shadowDomName: 'shade-checkbox',
52
+ customElementName: 'shade-checkbox',
53
53
  css: {
54
54
  display: 'inline-flex',
55
55
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -95,6 +95,7 @@ export const Checkbox = Shade<CheckboxProps>({
95
95
  },
96
96
 
97
97
  '& input[type="checkbox"]:focus-visible': {
98
+ outline: 'none',
98
99
  boxShadow: cssVariableTheme.action.focusRing,
99
100
  },
100
101
 
@@ -14,7 +14,7 @@ describe('InputNumber', () => {
14
14
  vi.restoreAllMocks()
15
15
  })
16
16
 
17
- it('should render with shadow DOM', async () => {
17
+ it('should render as custom element', async () => {
18
18
  await usingAsync(new Injector(), async (injector) => {
19
19
  const rootElement = document.getElementById('root') as HTMLDivElement
20
20
 
@@ -124,7 +124,7 @@ const parseValue = (text: string, parser?: InputNumberProps['parser']): number |
124
124
  }
125
125
 
126
126
  export const InputNumber = Shade<InputNumberProps>({
127
- shadowDomName: 'shade-input-number',
127
+ customElementName: 'shade-input-number',
128
128
  css: {
129
129
  display: 'block',
130
130
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -16,7 +16,7 @@ describe('Input', () => {
16
16
  vi.restoreAllMocks()
17
17
  })
18
18
 
19
- it('should render with shadow DOM', async () => {
19
+ it('should render as custom element', async () => {
20
20
  await usingAsync(new Injector(), async (injector) => {
21
21
  const rootElement = document.getElementById('root') as HTMLDivElement
22
22
 
@@ -108,7 +108,7 @@ const getDefaultMessagesForValidityState = (state: ValidityState) => {
108
108
  }
109
109
 
110
110
  export const Input = Shade<TextInputProps>({
111
- shadowDomName: 'shade-input',
111
+ customElementName: 'shade-input',
112
112
  css: {
113
113
  display: 'block',
114
114
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -15,7 +15,7 @@ describe('RadioGroup', () => {
15
15
  vi.restoreAllMocks()
16
16
  })
17
17
 
18
- it('should render with shadow DOM', async () => {
18
+ it('should render as custom element', async () => {
19
19
  await usingAsync(new Injector(), async (injector) => {
20
20
  const rootElement = document.getElementById('root') as HTMLDivElement
21
21
 
@@ -39,7 +39,7 @@ export type RadioGroupProps = {
39
39
  }
40
40
 
41
41
  export const RadioGroup: (props: RadioGroupProps, children: ChildrenList) => JSX.Element = Shade<RadioGroupProps>({
42
- shadowDomName: 'shade-radio-group',
42
+ customElementName: 'shade-radio-group',
43
43
  css: {
44
44
  display: 'block',
45
45
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -16,7 +16,7 @@ describe('Radio', () => {
16
16
  vi.restoreAllMocks()
17
17
  })
18
18
 
19
- it('should render with shadow DOM', async () => {
19
+ it('should render as custom element', async () => {
20
20
  await usingAsync(new Injector(), async (injector) => {
21
21
  const rootElement = document.getElementById('root') as HTMLDivElement
22
22
 
@@ -41,7 +41,7 @@ export type RadioProps = {
41
41
  }
42
42
 
43
43
  export const Radio = Shade<RadioProps>({
44
- shadowDomName: 'shade-radio',
44
+ customElementName: 'shade-radio',
45
45
  css: {
46
46
  display: 'inline-flex',
47
47
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -87,6 +87,7 @@ export const Radio = Shade<RadioProps>({
87
87
  },
88
88
 
89
89
  '& input[type="radio"]:focus-visible': {
90
+ outline: 'none',
90
91
  boxShadow: cssVariableTheme.action.focusRing,
91
92
  },
92
93
 
@@ -77,7 +77,7 @@ const defaultFilterOption = (searchText: string, option: SelectOption): boolean
77
77
  }
78
78
 
79
79
  export const Select = Shade<SelectProps>({
80
- shadowDomName: 'shade-select',
80
+ customElementName: 'shade-select',
81
81
  css: {
82
82
  display: 'block',
83
83
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -180,7 +180,7 @@ const syncVisuals = (
180
180
  }
181
181
 
182
182
  export const Slider = Shade<SliderProps>({
183
- shadowDomName: 'shade-slider',
183
+ customElementName: 'shade-slider',
184
184
  css: {
185
185
  display: 'block',
186
186
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -293,6 +293,7 @@ export const Slider = Shade<SliderProps>({
293
293
  },
294
294
 
295
295
  '& .slider-thumb:focus-visible': {
296
+ outline: 'none',
296
297
  boxShadow: '0 0 0 4px color-mix(in srgb, var(--slider-color) 30%, transparent)',
297
298
  },
298
299
 
@@ -16,7 +16,7 @@ describe('Switch', () => {
16
16
  vi.restoreAllMocks()
17
17
  })
18
18
 
19
- it('should render with shadow DOM', async () => {
19
+ it('should render as custom element', async () => {
20
20
  await usingAsync(new Injector(), async (injector) => {
21
21
  const rootElement = document.getElementById('root') as HTMLDivElement
22
22
 
@@ -49,7 +49,7 @@ export type SwitchProps = {
49
49
  }
50
50
 
51
51
  export const Switch = Shade<SwitchProps>({
52
- shadowDomName: 'shade-switch',
52
+ customElementName: 'shade-switch',
53
53
  css: {
54
54
  display: 'inline-flex',
55
55
  fontFamily: cssVariableTheme.typography.fontFamily,
@@ -154,6 +154,7 @@ export const Switch = Shade<SwitchProps>({
154
154
 
155
155
  // Focus state
156
156
  '& input[type="checkbox"]:focus-visible + .switch-track': {
157
+ outline: 'none',
157
158
  boxShadow: cssVariableTheme.action.focusRing,
158
159
  },
159
160
 
@@ -13,7 +13,7 @@ describe('TextArea', () => {
13
13
  document.body.innerHTML = ''
14
14
  })
15
15
 
16
- it('should render with shadow DOM', async () => {
16
+ it('should render as custom element', async () => {
17
17
  await usingAsync(new Injector(), async (injector) => {
18
18
  const rootElement = document.getElementById('root') as HTMLDivElement
19
19
 
@@ -10,7 +10,7 @@ export interface TextAreaProps extends PartialElement<HTMLTextAreaElement> {
10
10
  }
11
11
 
12
12
  export const TextArea = Shade<TextAreaProps>({
13
- shadowDomName: 'shade-text-area',
13
+ customElementName: 'shade-text-area',
14
14
  css: {
15
15
  display: 'block',
16
16
  fontFamily: cssVariableTheme.typography.fontFamily,