@furystack/shades-common-components 12.4.0 → 12.5.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 (263) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/esm/components/app-bar-link.spec.js +16 -19
  3. package/esm/components/app-bar-link.spec.js.map +1 -1
  4. package/esm/components/app-bar.spec.js +6 -4
  5. package/esm/components/app-bar.spec.js.map +1 -1
  6. package/esm/components/avatar.spec.js +9 -9
  7. package/esm/components/avatar.spec.js.map +1 -1
  8. package/esm/components/breadcrumb.spec.js +2 -2
  9. package/esm/components/breadcrumb.spec.js.map +1 -1
  10. package/esm/components/button-group.d.ts +32 -0
  11. package/esm/components/button-group.d.ts.map +1 -1
  12. package/esm/components/button-group.js +26 -2
  13. package/esm/components/button-group.js.map +1 -1
  14. package/esm/components/button-group.spec.js +127 -11
  15. package/esm/components/button-group.spec.js.map +1 -1
  16. package/esm/components/button.spec.js +4 -4
  17. package/esm/components/button.spec.js.map +1 -1
  18. package/esm/components/cache-view.spec.js +2 -3
  19. package/esm/components/cache-view.spec.js.map +1 -1
  20. package/esm/components/carousel.spec.js +47 -47
  21. package/esm/components/carousel.spec.js.map +1 -1
  22. package/esm/components/circular-progress.spec.js +2 -2
  23. package/esm/components/command-palette/command-palette-input.spec.js +23 -19
  24. package/esm/components/command-palette/command-palette-input.spec.js.map +1 -1
  25. package/esm/components/command-palette/command-palette-suggestion-list.spec.js +27 -27
  26. package/esm/components/command-palette/command-palette-suggestion-list.spec.js.map +1 -1
  27. package/esm/components/command-palette/index.spec.js +64 -51
  28. package/esm/components/command-palette/index.spec.js.map +1 -1
  29. package/esm/components/context-menu/context-menu.spec.js +33 -33
  30. package/esm/components/context-menu/context-menu.spec.js.map +1 -1
  31. package/esm/components/data-grid/body.spec.js +13 -13
  32. package/esm/components/data-grid/body.spec.js.map +1 -1
  33. package/esm/components/data-grid/data-grid-row.spec.js +8 -8
  34. package/esm/components/data-grid/data-grid-row.spec.js.map +1 -1
  35. package/esm/components/data-grid/data-grid.d.ts +40 -2
  36. package/esm/components/data-grid/data-grid.d.ts.map +1 -1
  37. package/esm/components/data-grid/data-grid.js +7 -10
  38. package/esm/components/data-grid/data-grid.js.map +1 -1
  39. package/esm/components/data-grid/data-grid.spec.js +71 -28
  40. package/esm/components/data-grid/data-grid.spec.js.map +1 -1
  41. package/esm/components/data-grid/filters/boolean-filter.d.ts +12 -0
  42. package/esm/components/data-grid/filters/boolean-filter.d.ts.map +1 -0
  43. package/esm/components/data-grid/filters/boolean-filter.js +27 -0
  44. package/esm/components/data-grid/filters/boolean-filter.js.map +1 -0
  45. package/esm/components/data-grid/filters/boolean-filter.spec.d.ts +2 -0
  46. package/esm/components/data-grid/filters/boolean-filter.spec.d.ts.map +1 -0
  47. package/esm/components/data-grid/filters/boolean-filter.spec.js +114 -0
  48. package/esm/components/data-grid/filters/boolean-filter.spec.js.map +1 -0
  49. package/esm/components/data-grid/filters/date-filter.d.ts +12 -0
  50. package/esm/components/data-grid/filters/date-filter.d.ts.map +1 -0
  51. package/esm/components/data-grid/filters/date-filter.js +109 -0
  52. package/esm/components/data-grid/filters/date-filter.js.map +1 -0
  53. package/esm/components/data-grid/filters/date-filter.spec.d.ts +2 -0
  54. package/esm/components/data-grid/filters/date-filter.spec.d.ts.map +1 -0
  55. package/esm/components/data-grid/filters/date-filter.spec.js +145 -0
  56. package/esm/components/data-grid/filters/date-filter.spec.js.map +1 -0
  57. package/esm/components/data-grid/filters/enum-filter.d.ts +16 -0
  58. package/esm/components/data-grid/filters/enum-filter.d.ts.map +1 -0
  59. package/esm/components/data-grid/filters/enum-filter.js +72 -0
  60. package/esm/components/data-grid/filters/enum-filter.js.map +1 -0
  61. package/esm/components/data-grid/filters/enum-filter.spec.d.ts +2 -0
  62. package/esm/components/data-grid/filters/enum-filter.spec.d.ts.map +1 -0
  63. package/esm/components/data-grid/filters/enum-filter.spec.js +136 -0
  64. package/esm/components/data-grid/filters/enum-filter.spec.js.map +1 -0
  65. package/esm/components/data-grid/filters/filter-dropdown.d.ts +6 -0
  66. package/esm/components/data-grid/filters/filter-dropdown.d.ts.map +1 -0
  67. package/esm/components/data-grid/filters/filter-dropdown.js +41 -0
  68. package/esm/components/data-grid/filters/filter-dropdown.js.map +1 -0
  69. package/esm/components/data-grid/filters/filter-dropdown.spec.d.ts +2 -0
  70. package/esm/components/data-grid/filters/filter-dropdown.spec.d.ts.map +1 -0
  71. package/esm/components/data-grid/filters/filter-dropdown.spec.js +69 -0
  72. package/esm/components/data-grid/filters/filter-dropdown.spec.js.map +1 -0
  73. package/esm/components/data-grid/filters/filter-styles.d.ts +24 -0
  74. package/esm/components/data-grid/filters/filter-styles.d.ts.map +1 -0
  75. package/esm/components/data-grid/filters/filter-styles.js +25 -0
  76. package/esm/components/data-grid/filters/filter-styles.js.map +1 -0
  77. package/esm/components/data-grid/filters/index.d.ts +7 -0
  78. package/esm/components/data-grid/filters/index.d.ts.map +1 -0
  79. package/esm/components/data-grid/filters/index.js +7 -0
  80. package/esm/components/data-grid/filters/index.js.map +1 -0
  81. package/esm/components/data-grid/filters/number-filter.d.ts +12 -0
  82. package/esm/components/data-grid/filters/number-filter.d.ts.map +1 -0
  83. package/esm/components/data-grid/filters/number-filter.js +65 -0
  84. package/esm/components/data-grid/filters/number-filter.js.map +1 -0
  85. package/esm/components/data-grid/filters/number-filter.spec.d.ts +2 -0
  86. package/esm/components/data-grid/filters/number-filter.spec.d.ts.map +1 -0
  87. package/esm/components/data-grid/filters/number-filter.spec.js +142 -0
  88. package/esm/components/data-grid/filters/number-filter.spec.js.map +1 -0
  89. package/esm/components/data-grid/filters/string-filter.d.ts +12 -0
  90. package/esm/components/data-grid/filters/string-filter.d.ts.map +1 -0
  91. package/esm/components/data-grid/filters/string-filter.js +63 -0
  92. package/esm/components/data-grid/filters/string-filter.js.map +1 -0
  93. package/esm/components/data-grid/filters/string-filter.spec.d.ts +2 -0
  94. package/esm/components/data-grid/filters/string-filter.spec.d.ts.map +1 -0
  95. package/esm/components/data-grid/filters/string-filter.spec.js +128 -0
  96. package/esm/components/data-grid/filters/string-filter.spec.js.map +1 -0
  97. package/esm/components/data-grid/footer.d.ts.map +1 -1
  98. package/esm/components/data-grid/footer.js +24 -9
  99. package/esm/components/data-grid/footer.js.map +1 -1
  100. package/esm/components/data-grid/footer.spec.js +38 -36
  101. package/esm/components/data-grid/footer.spec.js.map +1 -1
  102. package/esm/components/data-grid/header.d.ts +6 -9
  103. package/esm/components/data-grid/header.d.ts.map +1 -1
  104. package/esm/components/data-grid/header.js +51 -117
  105. package/esm/components/data-grid/header.js.map +1 -1
  106. package/esm/components/data-grid/header.spec.js +116 -187
  107. package/esm/components/data-grid/header.spec.js.map +1 -1
  108. package/esm/components/data-grid/index.d.ts +1 -0
  109. package/esm/components/data-grid/index.d.ts.map +1 -1
  110. package/esm/components/data-grid/index.js +1 -0
  111. package/esm/components/data-grid/index.js.map +1 -1
  112. package/esm/components/data-grid/selection-cell.spec.js +8 -8
  113. package/esm/components/data-grid/selection-cell.spec.js.map +1 -1
  114. package/esm/components/drawer/drawer-toggle-button.spec.js +22 -22
  115. package/esm/components/drawer/drawer-toggle-button.spec.js.map +1 -1
  116. package/esm/components/drawer/index.spec.js +36 -36
  117. package/esm/components/drawer/index.spec.js.map +1 -1
  118. package/esm/components/dropdown.spec.js +38 -30
  119. package/esm/components/dropdown.spec.js.map +1 -1
  120. package/esm/components/fab.spec.js +4 -4
  121. package/esm/components/fab.spec.js.map +1 -1
  122. package/esm/components/form.spec.js +37 -37
  123. package/esm/components/form.spec.js.map +1 -1
  124. package/esm/components/grid.spec.js +3 -3
  125. package/esm/components/grid.spec.js.map +1 -1
  126. package/esm/components/image.spec.js +55 -52
  127. package/esm/components/image.spec.js.map +1 -1
  128. package/esm/components/inputs/autocomplete.spec.js +7 -14
  129. package/esm/components/inputs/autocomplete.spec.js.map +1 -1
  130. package/esm/components/inputs/checkbox.spec.js +22 -22
  131. package/esm/components/inputs/checkbox.spec.js.map +1 -1
  132. package/esm/components/inputs/input-number.spec.js +47 -47
  133. package/esm/components/inputs/input-number.spec.js.map +1 -1
  134. package/esm/components/inputs/input.spec.js +53 -53
  135. package/esm/components/inputs/input.spec.js.map +1 -1
  136. package/esm/components/inputs/radio-group.spec.js +14 -14
  137. package/esm/components/inputs/radio-group.spec.js.map +1 -1
  138. package/esm/components/inputs/radio.spec.js +16 -16
  139. package/esm/components/inputs/radio.spec.js.map +1 -1
  140. package/esm/components/inputs/select.spec.js +74 -74
  141. package/esm/components/inputs/select.spec.js.map +1 -1
  142. package/esm/components/inputs/slider.spec.js +16 -16
  143. package/esm/components/inputs/slider.spec.js.map +1 -1
  144. package/esm/components/inputs/switch.spec.js +24 -24
  145. package/esm/components/inputs/switch.spec.js.map +1 -1
  146. package/esm/components/inputs/text-area.spec.js +17 -17
  147. package/esm/components/inputs/text-area.spec.js.map +1 -1
  148. package/esm/components/linear-progress.spec.js +2 -2
  149. package/esm/components/list/list.spec.js +36 -36
  150. package/esm/components/list/list.spec.js.map +1 -1
  151. package/esm/components/markdown/markdown-display.spec.js +15 -15
  152. package/esm/components/markdown/markdown-display.spec.js.map +1 -1
  153. package/esm/components/markdown/markdown-editor.spec.js +8 -8
  154. package/esm/components/markdown/markdown-editor.spec.js.map +1 -1
  155. package/esm/components/markdown/markdown-input.spec.js +17 -17
  156. package/esm/components/markdown/markdown-input.spec.js.map +1 -1
  157. package/esm/components/menu/menu.spec.js +28 -28
  158. package/esm/components/menu/menu.spec.js.map +1 -1
  159. package/esm/components/modal.spec.js +15 -18
  160. package/esm/components/modal.spec.js.map +1 -1
  161. package/esm/components/noty-list.spec.js +25 -23
  162. package/esm/components/noty-list.spec.js.map +1 -1
  163. package/esm/components/page-container/index.spec.js +16 -16
  164. package/esm/components/page-container/index.spec.js.map +1 -1
  165. package/esm/components/page-container/page-header.spec.js +16 -16
  166. package/esm/components/page-container/page-header.spec.js.map +1 -1
  167. package/esm/components/page-layout/index.spec.js +29 -29
  168. package/esm/components/page-layout/index.spec.js.map +1 -1
  169. package/esm/components/paper.spec.js +3 -3
  170. package/esm/components/paper.spec.js.map +1 -1
  171. package/esm/components/rating.spec.js +61 -61
  172. package/esm/components/rating.spec.js.map +1 -1
  173. package/esm/components/skeleton.spec.js +10 -6
  174. package/esm/components/skeleton.spec.js.map +1 -1
  175. package/esm/components/suggest/suggest-input.spec.js +4 -10
  176. package/esm/components/suggest/suggest-input.spec.js.map +1 -1
  177. package/esm/components/tabs.spec.js +30 -30
  178. package/esm/components/tabs.spec.js.map +1 -1
  179. package/esm/components/tree/tree.spec.js +27 -27
  180. package/esm/components/tree/tree.spec.js.map +1 -1
  181. package/esm/components/typography.spec.js +3 -3
  182. package/esm/components/typography.spec.js.map +1 -1
  183. package/esm/components/wizard/index.spec.js +5 -5
  184. package/esm/components/wizard/index.spec.js.map +1 -1
  185. package/esm/utils/promisify-animation.d.ts.map +1 -1
  186. package/esm/utils/promisify-animation.js +3 -0
  187. package/esm/utils/promisify-animation.js.map +1 -1
  188. package/package.json +2 -2
  189. package/src/components/app-bar-link.spec.tsx +16 -19
  190. package/src/components/app-bar.spec.tsx +6 -4
  191. package/src/components/avatar.spec.tsx +9 -9
  192. package/src/components/breadcrumb.spec.tsx +2 -2
  193. package/src/components/button-group.spec.tsx +155 -11
  194. package/src/components/button-group.tsx +49 -2
  195. package/src/components/button.spec.tsx +4 -4
  196. package/src/components/cache-view.spec.tsx +3 -3
  197. package/src/components/carousel.spec.tsx +47 -47
  198. package/src/components/circular-progress.spec.tsx +2 -2
  199. package/src/components/command-palette/command-palette-input.spec.tsx +23 -19
  200. package/src/components/command-palette/command-palette-suggestion-list.spec.tsx +27 -27
  201. package/src/components/command-palette/index.spec.tsx +64 -51
  202. package/src/components/context-menu/context-menu.spec.tsx +33 -33
  203. package/src/components/data-grid/body.spec.tsx +13 -13
  204. package/src/components/data-grid/data-grid-row.spec.tsx +8 -8
  205. package/src/components/data-grid/data-grid.spec.tsx +106 -28
  206. package/src/components/data-grid/data-grid.tsx +44 -11
  207. package/src/components/data-grid/filters/boolean-filter.spec.tsx +142 -0
  208. package/src/components/data-grid/filters/boolean-filter.tsx +45 -0
  209. package/src/components/data-grid/filters/date-filter.spec.tsx +181 -0
  210. package/src/components/data-grid/filters/date-filter.tsx +162 -0
  211. package/src/components/data-grid/filters/enum-filter.spec.tsx +168 -0
  212. package/src/components/data-grid/filters/enum-filter.tsx +119 -0
  213. package/src/components/data-grid/filters/filter-dropdown.spec.tsx +89 -0
  214. package/src/components/data-grid/filters/filter-dropdown.tsx +60 -0
  215. package/src/components/data-grid/filters/filter-styles.ts +26 -0
  216. package/src/components/data-grid/filters/index.ts +6 -0
  217. package/src/components/data-grid/filters/number-filter.spec.tsx +174 -0
  218. package/src/components/data-grid/filters/number-filter.tsx +115 -0
  219. package/src/components/data-grid/filters/string-filter.spec.tsx +157 -0
  220. package/src/components/data-grid/filters/string-filter.tsx +112 -0
  221. package/src/components/data-grid/footer.spec.tsx +38 -36
  222. package/src/components/data-grid/footer.tsx +21 -8
  223. package/src/components/data-grid/header.spec.tsx +128 -212
  224. package/src/components/data-grid/header.tsx +95 -183
  225. package/src/components/data-grid/index.tsx +1 -0
  226. package/src/components/data-grid/selection-cell.spec.tsx +8 -8
  227. package/src/components/drawer/drawer-toggle-button.spec.tsx +22 -22
  228. package/src/components/drawer/index.spec.tsx +36 -36
  229. package/src/components/dropdown.spec.tsx +38 -30
  230. package/src/components/fab.spec.tsx +4 -4
  231. package/src/components/form.spec.tsx +37 -37
  232. package/src/components/grid.spec.tsx +3 -3
  233. package/src/components/image.spec.tsx +55 -52
  234. package/src/components/inputs/autocomplete.spec.tsx +7 -14
  235. package/src/components/inputs/checkbox.spec.tsx +22 -22
  236. package/src/components/inputs/input-number.spec.tsx +47 -47
  237. package/src/components/inputs/input.spec.tsx +53 -53
  238. package/src/components/inputs/radio-group.spec.tsx +14 -14
  239. package/src/components/inputs/radio.spec.tsx +16 -16
  240. package/src/components/inputs/select.spec.tsx +74 -74
  241. package/src/components/inputs/slider.spec.tsx +16 -16
  242. package/src/components/inputs/switch.spec.tsx +24 -24
  243. package/src/components/inputs/text-area.spec.tsx +17 -17
  244. package/src/components/linear-progress.spec.tsx +2 -2
  245. package/src/components/list/list.spec.tsx +36 -36
  246. package/src/components/markdown/markdown-display.spec.tsx +15 -15
  247. package/src/components/markdown/markdown-editor.spec.tsx +8 -8
  248. package/src/components/markdown/markdown-input.spec.tsx +17 -17
  249. package/src/components/menu/menu.spec.tsx +28 -28
  250. package/src/components/modal.spec.tsx +15 -18
  251. package/src/components/noty-list.spec.tsx +25 -23
  252. package/src/components/page-container/index.spec.tsx +16 -16
  253. package/src/components/page-container/page-header.spec.tsx +16 -16
  254. package/src/components/page-layout/index.spec.tsx +29 -29
  255. package/src/components/paper.spec.tsx +3 -3
  256. package/src/components/rating.spec.tsx +61 -61
  257. package/src/components/skeleton.spec.tsx +10 -6
  258. package/src/components/suggest/suggest-input.spec.tsx +4 -10
  259. package/src/components/tabs.spec.tsx +30 -30
  260. package/src/components/tree/tree.spec.tsx +27 -27
  261. package/src/components/typography.spec.tsx +3 -3
  262. package/src/components/wizard/index.spec.tsx +5 -5
  263. package/src/utils/promisify-animation.ts +3 -0
@@ -1,6 +1,6 @@
1
1
  import { Injector } from '@furystack/inject'
2
- import { createComponent, initializeShadeRoot, LocationService } from '@furystack/shades'
3
- import { sleepAsync, usingAsync } from '@furystack/utils'
2
+ import { createComponent, flushUpdates, initializeShadeRoot, LocationService } from '@furystack/shades'
3
+ import { usingAsync } from '@furystack/utils'
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
5
5
  import { Tabs, type Tab } from './tabs.js'
6
6
 
@@ -44,7 +44,7 @@ describe('Tabs', () => {
44
44
  jsxElement: <Tabs tabs={tabs} />,
45
45
  })
46
46
 
47
- await sleepAsync(100)
47
+ await flushUpdates()
48
48
 
49
49
  expect(document.body.innerHTML).toContain('Tab 1')
50
50
  expect(document.body.innerHTML).toContain('Tab 2')
@@ -65,7 +65,7 @@ describe('Tabs', () => {
65
65
  jsxElement: <Tabs tabs={tabs} />,
66
66
  })
67
67
 
68
- await sleepAsync(100)
68
+ await flushUpdates()
69
69
 
70
70
  expect(document.getElementById('content-2')).toBeTruthy()
71
71
  expect(document.getElementById('content-1')).toBeFalsy()
@@ -86,7 +86,7 @@ describe('Tabs', () => {
86
86
  jsxElement: <Tabs tabs={tabs} />,
87
87
  })
88
88
 
89
- await sleepAsync(100)
89
+ await flushUpdates()
90
90
 
91
91
  expect(document.getElementById('content-1')).toBeFalsy()
92
92
  expect(document.getElementById('content-2')).toBeFalsy()
@@ -107,7 +107,7 @@ describe('Tabs', () => {
107
107
  jsxElement: <Tabs tabs={tabs} />,
108
108
  })
109
109
 
110
- await sleepAsync(100)
110
+ await flushUpdates()
111
111
 
112
112
  expect(document.getElementById('content-1')).toBeTruthy()
113
113
 
@@ -115,7 +115,7 @@ describe('Tabs', () => {
115
115
  window.location.hash = '#tab3'
116
116
  injector.getInstance(LocationService).updateState()
117
117
 
118
- await sleepAsync(100)
118
+ await flushUpdates()
119
119
 
120
120
  expect(document.getElementById('content-3')).toBeTruthy()
121
121
  expect(document.getElementById('content-1')).toBeFalsy()
@@ -133,7 +133,7 @@ describe('Tabs', () => {
133
133
  jsxElement: <Tabs tabs={tabs} />,
134
134
  })
135
135
 
136
- await sleepAsync(100)
136
+ await flushUpdates()
137
137
 
138
138
  // Tab headers extend anchor elements
139
139
  const html = document.body.innerHTML
@@ -156,7 +156,7 @@ describe('Tabs', () => {
156
156
  jsxElement: <Tabs tabs={tabs} />,
157
157
  })
158
158
 
159
- await sleepAsync(100)
159
+ await flushUpdates()
160
160
 
161
161
  // Verify the active tab content is shown
162
162
  expect(document.getElementById('content-2')).toBeTruthy()
@@ -181,7 +181,7 @@ describe('Tabs', () => {
181
181
  jsxElement: <Tabs tabs={tabs} />,
182
182
  })
183
183
 
184
- await sleepAsync(100)
184
+ await flushUpdates()
185
185
 
186
186
  // Verify tab1 is active
187
187
  expect(document.getElementById('content-1')).toBeTruthy()
@@ -194,7 +194,7 @@ describe('Tabs', () => {
194
194
  window.location.hash = '#tab2'
195
195
  injector.getInstance(LocationService).updateState()
196
196
 
197
- await sleepAsync(100)
197
+ await flushUpdates()
198
198
 
199
199
  // Verify tab2 is now active
200
200
  expect(document.getElementById('content-2')).toBeTruthy()
@@ -217,7 +217,7 @@ describe('Tabs', () => {
217
217
  jsxElement: <Tabs tabs={tabs} containerStyle={{ maxWidth: '800px' }} />,
218
218
  })
219
219
 
220
- await sleepAsync(100)
220
+ await flushUpdates()
221
221
 
222
222
  const tabsElement = document.querySelector('shade-tabs') as HTMLElement
223
223
  expect(tabsElement.style.maxWidth).toBe('800px')
@@ -234,7 +234,7 @@ describe('Tabs', () => {
234
234
  jsxElement: <Tabs tabs={[]} />,
235
235
  })
236
236
 
237
- await sleepAsync(100)
237
+ await flushUpdates()
238
238
 
239
239
  const tabHeaders = document.querySelectorAll('shade-tab-header')
240
240
  expect(tabHeaders.length).toBe(0)
@@ -253,7 +253,7 @@ describe('Tabs', () => {
253
253
  jsxElement: <Tabs tabs={tabs} activeKey="tab2" />,
254
254
  })
255
255
 
256
- await sleepAsync(100)
256
+ await flushUpdates()
257
257
 
258
258
  expect(document.getElementById('content-2')).toBeTruthy()
259
259
  expect(document.getElementById('content-1')).toBeFalsy()
@@ -272,7 +272,7 @@ describe('Tabs', () => {
272
272
  jsxElement: <Tabs tabs={tabs} activeKey="tab1" />,
273
273
  })
274
274
 
275
- await sleepAsync(100)
275
+ await flushUpdates()
276
276
 
277
277
  const buttons = document.querySelectorAll('.shade-tab-btn')
278
278
  expect(buttons.length).toBe(3)
@@ -293,7 +293,7 @@ describe('Tabs', () => {
293
293
  jsxElement: <Tabs tabs={tabs} activeKey="tab2" />,
294
294
  })
295
295
 
296
- await sleepAsync(100)
296
+ await flushUpdates()
297
297
 
298
298
  const buttons = document.querySelectorAll('.shade-tab-btn')
299
299
  expect(buttons[0].classList.contains('active')).toBe(false)
@@ -314,7 +314,7 @@ describe('Tabs', () => {
314
314
  jsxElement: <Tabs tabs={tabs} activeKey="tab1" onTabChange={onTabChange} />,
315
315
  })
316
316
 
317
- await sleepAsync(100)
317
+ await flushUpdates()
318
318
 
319
319
  const buttons = document.querySelectorAll('.shade-tab-btn')
320
320
  ;(buttons[1] as HTMLButtonElement).click()
@@ -336,7 +336,7 @@ describe('Tabs', () => {
336
336
  jsxElement: <Tabs tabs={tabs} activeKey="tab1" />,
337
337
  })
338
338
 
339
- await sleepAsync(100)
339
+ await flushUpdates()
340
340
 
341
341
  // activeKey takes precedence over URL hash
342
342
  expect(document.getElementById('content-1')).toBeTruthy()
@@ -357,7 +357,7 @@ describe('Tabs', () => {
357
357
  jsxElement: <Tabs tabs={tabs} type="card" />,
358
358
  })
359
359
 
360
- await sleepAsync(100)
360
+ await flushUpdates()
361
361
 
362
362
  const tabsElement = document.querySelector('shade-tabs') as HTMLElement
363
363
  expect(tabsElement.getAttribute('data-type')).toBe('card')
@@ -375,7 +375,7 @@ describe('Tabs', () => {
375
375
  jsxElement: <Tabs tabs={tabs} type="line" />,
376
376
  })
377
377
 
378
- await sleepAsync(100)
378
+ await flushUpdates()
379
379
 
380
380
  const tabsElement = document.querySelector('shade-tabs') as HTMLElement
381
381
  expect(tabsElement.getAttribute('data-type')).toBeNull()
@@ -395,7 +395,7 @@ describe('Tabs', () => {
395
395
  jsxElement: <Tabs tabs={tabs} orientation="vertical" />,
396
396
  })
397
397
 
398
- await sleepAsync(100)
398
+ await flushUpdates()
399
399
 
400
400
  const tabsElement = document.querySelector('shade-tabs') as HTMLElement
401
401
  expect(tabsElement.getAttribute('data-orientation')).toBe('vertical')
@@ -413,7 +413,7 @@ describe('Tabs', () => {
413
413
  jsxElement: <Tabs tabs={tabs} orientation="horizontal" />,
414
414
  })
415
415
 
416
- await sleepAsync(100)
416
+ await flushUpdates()
417
417
 
418
418
  const tabsElement = document.querySelector('shade-tabs') as HTMLElement
419
419
  expect(tabsElement.getAttribute('data-orientation')).toBeNull()
@@ -436,7 +436,7 @@ describe('Tabs', () => {
436
436
  jsxElement: <Tabs tabs={tabs} activeKey="tab1" onClose={() => {}} />,
437
437
  })
438
438
 
439
- await sleepAsync(100)
439
+ await flushUpdates()
440
440
 
441
441
  const closeButtons = document.querySelectorAll('.shade-tab-close')
442
442
  expect(closeButtons.length).toBe(1)
@@ -456,7 +456,7 @@ describe('Tabs', () => {
456
456
  jsxElement: <Tabs tabs={tabs} activeKey="tab1" />,
457
457
  })
458
458
 
459
- await sleepAsync(100)
459
+ await flushUpdates()
460
460
 
461
461
  const closeButtons = document.querySelectorAll('.shade-tab-close')
462
462
  expect(closeButtons.length).toBe(0)
@@ -478,7 +478,7 @@ describe('Tabs', () => {
478
478
  jsxElement: <Tabs tabs={tabs} activeKey="tab1" onClose={onClose} />,
479
479
  })
480
480
 
481
- await sleepAsync(100)
481
+ await flushUpdates()
482
482
 
483
483
  const closeButtons = document.querySelectorAll('.shade-tab-close')
484
484
  ;(closeButtons[1] as HTMLElement).click()
@@ -502,7 +502,7 @@ describe('Tabs', () => {
502
502
  jsxElement: <Tabs tabs={tabs} activeKey="tab1" onClose={onClose} onTabChange={onTabChange} />,
503
503
  })
504
504
 
505
- await sleepAsync(100)
505
+ await flushUpdates()
506
506
 
507
507
  const closeButton = document.querySelector('.shade-tab-close') as HTMLElement
508
508
  closeButton.click()
@@ -525,7 +525,7 @@ describe('Tabs', () => {
525
525
  jsxElement: <Tabs tabs={tabs} onAdd={() => {}} />,
526
526
  })
527
527
 
528
- await sleepAsync(100)
528
+ await flushUpdates()
529
529
 
530
530
  const addButton = document.querySelector('.shade-tab-add')
531
531
  expect(addButton).toBeTruthy()
@@ -544,7 +544,7 @@ describe('Tabs', () => {
544
544
  jsxElement: <Tabs tabs={tabs} />,
545
545
  })
546
546
 
547
- await sleepAsync(100)
547
+ await flushUpdates()
548
548
 
549
549
  const addButton = document.querySelector('.shade-tab-add')
550
550
  expect(addButton).toBeFalsy()
@@ -563,7 +563,7 @@ describe('Tabs', () => {
563
563
  jsxElement: <Tabs tabs={tabs} onAdd={onAdd} />,
564
564
  })
565
565
 
566
- await sleepAsync(100)
566
+ await flushUpdates()
567
567
 
568
568
  const addButton = document.querySelector('.shade-tab-add') as HTMLButtonElement
569
569
  addButton.click()
@@ -586,7 +586,7 @@ describe('Tabs', () => {
586
586
  jsxElement: <Tabs tabs={tabs} onTabChange={onTabChange} />,
587
587
  })
588
588
 
589
- await sleepAsync(100)
589
+ await flushUpdates()
590
590
 
591
591
  const tabHeaders = document.querySelectorAll('a[is="shade-tab-header"]')
592
592
  ;(tabHeaders[1] as HTMLElement).click()
@@ -1,6 +1,6 @@
1
1
  import { Injector } from '@furystack/inject'
2
- import { createComponent, initializeShadeRoot } from '@furystack/shades'
3
- import { sleepAsync, usingAsync } from '@furystack/utils'
2
+ import { createComponent, flushUpdates, initializeShadeRoot } from '@furystack/shades'
3
+ import { usingAsync } from '@furystack/utils'
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
5
5
  import { TreeService } from '../../services/tree-service.js'
6
6
  import { Tree } from './tree.js'
@@ -60,7 +60,7 @@ describe('Tree', () => {
60
60
  ),
61
61
  })
62
62
 
63
- await sleepAsync(50)
63
+ await flushUpdates()
64
64
 
65
65
  const tree = document.querySelector('shade-tree')
66
66
  expect(tree).not.toBeNull()
@@ -87,7 +87,7 @@ describe('Tree', () => {
87
87
  ),
88
88
  })
89
89
 
90
- await sleepAsync(50)
90
+ await flushUpdates()
91
91
 
92
92
  const tree = document.querySelector('shade-tree')
93
93
  const items = tree?.querySelectorAll('shade-tree-item')
@@ -115,7 +115,7 @@ describe('Tree', () => {
115
115
  ),
116
116
  })
117
117
 
118
- await sleepAsync(50)
118
+ await flushUpdates()
119
119
 
120
120
  const tree = document.querySelector('shade-tree')
121
121
  expect(tree).not.toBeNull()
@@ -144,7 +144,7 @@ describe('Tree', () => {
144
144
  ),
145
145
  })
146
146
 
147
- await sleepAsync(50)
147
+ await flushUpdates()
148
148
 
149
149
  const tree = document.querySelector('shade-tree')
150
150
  const treeItems = tree?.querySelectorAll('[role="treeitem"]')
@@ -173,7 +173,7 @@ describe('Tree', () => {
173
173
  ),
174
174
  })
175
175
 
176
- await sleepAsync(50)
176
+ await flushUpdates()
177
177
 
178
178
  const tree = document.querySelector('shade-tree')
179
179
  const icons = tree?.querySelectorAll('[data-testid="icon"]')
@@ -202,7 +202,7 @@ describe('Tree', () => {
202
202
  ),
203
203
  })
204
204
 
205
- await sleepAsync(50)
205
+ await flushUpdates()
206
206
 
207
207
  const tree = document.querySelector('shade-tree') as HTMLElement
208
208
  expect(tree?.getAttribute('data-variant')).toBe('contained')
@@ -229,7 +229,7 @@ describe('Tree', () => {
229
229
  ),
230
230
  })
231
231
 
232
- await sleepAsync(50)
232
+ await flushUpdates()
233
233
 
234
234
  const tree = document.querySelector('shade-tree')
235
235
  const treeItems = tree?.querySelectorAll('shade-tree-item') as NodeListOf<HTMLElement>
@@ -259,7 +259,7 @@ describe('Tree', () => {
259
259
  ),
260
260
  })
261
261
 
262
- await sleepAsync(50)
262
+ await flushUpdates()
263
263
 
264
264
  const tree = document.querySelector('shade-tree')
265
265
  const treeItems = tree?.querySelectorAll('shade-tree-item') as NodeListOf<HTMLElement>
@@ -293,7 +293,7 @@ describe('Tree', () => {
293
293
  ),
294
294
  })
295
295
 
296
- await sleepAsync(50)
296
+ await flushUpdates()
297
297
 
298
298
  const tree = document.querySelector('shade-tree') as HTMLElement
299
299
  tree?.click()
@@ -325,7 +325,7 @@ describe('Tree', () => {
325
325
  ),
326
326
  })
327
327
 
328
- await sleepAsync(50)
328
+ await flushUpdates()
329
329
 
330
330
  const tree = document.querySelector('shade-tree') as HTMLElement
331
331
  tree?.click()
@@ -358,7 +358,7 @@ describe('Tree', () => {
358
358
  ),
359
359
  })
360
360
 
361
- await sleepAsync(50)
361
+ await flushUpdates()
362
362
 
363
363
  const tree = document.querySelector('shade-tree')
364
364
  const treeItems = tree?.querySelectorAll('shade-tree-item') as NodeListOf<HTMLElement>
@@ -388,10 +388,10 @@ describe('Tree', () => {
388
388
  ),
389
389
  })
390
390
 
391
- await sleepAsync(50)
391
+ await flushUpdates()
392
392
 
393
393
  service.focusedItem.setValue(treeData[1])
394
- await sleepAsync(10)
394
+ await flushUpdates()
395
395
 
396
396
  const tree = document.querySelector('shade-tree')
397
397
  const treeItems = tree?.querySelectorAll('shade-tree-item') as NodeListOf<HTMLElement>
@@ -422,10 +422,10 @@ describe('Tree', () => {
422
422
  ),
423
423
  })
424
424
 
425
- await sleepAsync(50)
425
+ await flushUpdates()
426
426
 
427
427
  service.selection.setValue([treeData[0], treeData[2]])
428
- await sleepAsync(10)
428
+ await flushUpdates()
429
429
 
430
430
  const tree = document.querySelector('shade-tree')
431
431
  const treeItems = tree?.querySelectorAll('shade-tree-item') as NodeListOf<HTMLElement>
@@ -455,10 +455,10 @@ describe('Tree', () => {
455
455
  ),
456
456
  })
457
457
 
458
- await sleepAsync(50)
458
+ await flushUpdates()
459
459
 
460
460
  service.selection.setValue([treeData[0]])
461
- await sleepAsync(10)
461
+ await flushUpdates()
462
462
 
463
463
  const tree = document.querySelector('shade-tree')
464
464
  const treeItems = tree?.querySelectorAll('shade-tree-item') as NodeListOf<HTMLElement>
@@ -489,10 +489,10 @@ describe('Tree', () => {
489
489
  ),
490
490
  })
491
491
 
492
- await sleepAsync(50)
492
+ await flushUpdates()
493
493
 
494
494
  service.selection.setValue([treeData[0]])
495
- await sleepAsync(10)
495
+ await flushUpdates()
496
496
 
497
497
  expect(onSelectionChange).toHaveBeenCalledWith([treeData[0]])
498
498
 
@@ -525,7 +525,7 @@ describe('Tree', () => {
525
525
  ),
526
526
  })
527
527
 
528
- await sleepAsync(50)
528
+ await flushUpdates()
529
529
 
530
530
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
531
531
 
@@ -558,7 +558,7 @@ describe('Tree', () => {
558
558
  ),
559
559
  })
560
560
 
561
- await sleepAsync(50)
561
+ await flushUpdates()
562
562
 
563
563
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowRight', bubbles: true }))
564
564
 
@@ -592,7 +592,7 @@ describe('Tree', () => {
592
592
  ),
593
593
  })
594
594
 
595
- await sleepAsync(50)
595
+ await flushUpdates()
596
596
 
597
597
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true }))
598
598
 
@@ -625,7 +625,7 @@ describe('Tree', () => {
625
625
  ),
626
626
  })
627
627
 
628
- await sleepAsync(50)
628
+ await flushUpdates()
629
629
 
630
630
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
631
631
 
@@ -660,12 +660,12 @@ describe('Tree', () => {
660
660
  ),
661
661
  })
662
662
 
663
- await sleepAsync(50)
663
+ await flushUpdates()
664
664
 
665
665
  const tree = document.querySelector('shade-tree') as HTMLElement
666
666
  tree.remove()
667
667
 
668
- await sleepAsync(10)
668
+ await flushUpdates()
669
669
 
670
670
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
671
671
  expect(service.focusedItem.getValue()).toEqual(treeData[0])
@@ -1,6 +1,6 @@
1
1
  import { Injector } from '@furystack/inject'
2
- import { createComponent, initializeShadeRoot } from '@furystack/shades'
3
- import { sleepAsync, usingAsync } from '@furystack/utils'
2
+ import { createComponent, flushUpdates, initializeShadeRoot } from '@furystack/shades'
3
+ import { usingAsync } from '@furystack/utils'
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
5
5
  import type { TypographyProps, TypographyVariant } from './typography.js'
6
6
  import { Typography } from './typography.js'
@@ -22,7 +22,7 @@ describe('Typography', () => {
22
22
  rootElement: root,
23
23
  jsxElement: <Typography {...props}>{children}</Typography>,
24
24
  })
25
- await sleepAsync(50)
25
+ await flushUpdates()
26
26
  return {
27
27
  injector,
28
28
  element: root.querySelector('shade-typography') as HTMLElement,
@@ -1,7 +1,7 @@
1
1
  import { Injector } from '@furystack/inject'
2
2
  import type { ChildrenList } from '@furystack/shades'
3
- import { createComponent, initializeShadeRoot, Shade } from '@furystack/shades'
4
- import { sleepAsync, usingAsync } from '@furystack/utils'
3
+ import { createComponent, flushUpdates, initializeShadeRoot, Shade } from '@furystack/shades'
4
+ import { usingAsync } from '@furystack/utils'
5
5
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
6
6
  import type { WizardStepProps } from './index.js'
7
7
  import { Wizard } from './index.js'
@@ -80,7 +80,7 @@ describe('Wizard', () => {
80
80
  rootElement: root,
81
81
  jsxElement: <Wizard steps={steps} onFinish={onFinish} />,
82
82
  })
83
- await sleepAsync(50)
83
+ await flushUpdates()
84
84
 
85
85
  const wizard = root.querySelector('shades-wizard') as HTMLElement
86
86
 
@@ -96,12 +96,12 @@ describe('Wizard', () => {
96
96
  clickNext: async () => {
97
97
  const btn = getStepElement()?.querySelector('.next-btn') as HTMLButtonElement
98
98
  btn?.click()
99
- await sleepAsync(50)
99
+ await flushUpdates()
100
100
  },
101
101
  clickPrev: async () => {
102
102
  const btn = getStepElement()?.querySelector('.prev-btn') as HTMLButtonElement
103
103
  btn?.click()
104
- await sleepAsync(50)
104
+ await flushUpdates()
105
105
  },
106
106
  [Symbol.asyncDispose]: () => injector[Symbol.asyncDispose](),
107
107
  }
@@ -13,6 +13,9 @@ export const promisifyAnimation = async (
13
13
  if (!el) {
14
14
  return reject(new Error('No element provided'))
15
15
  }
16
+ if (typeof el.animate !== 'function') {
17
+ return resolve({} as AnimationPlaybackEvent)
18
+ }
16
19
  const prefersReducedMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches
17
20
  const resolvedOptions: KeyframeAnimationOptions =
18
21
  typeof options === 'number' ? { duration: options } : { ...options }