@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, ScreenService } from '@furystack/shades'
3
- import { sleepAsync, usingAsync } from '@furystack/utils'
2
+ import { createComponent, flushUpdates, initializeShadeRoot, ScreenService } from '@furystack/shades'
3
+ import { usingAsync } from '@furystack/utils'
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
5
5
  import { LayoutService } from '../../services/layout-service.js'
6
6
  import { Drawer, type DrawerProps } from './index.js'
@@ -48,7 +48,7 @@ describe('Drawer component', () => {
48
48
  ),
49
49
  })
50
50
 
51
- await sleepAsync(50)
51
+ await flushUpdates()
52
52
 
53
53
  const drawer = document.querySelector('shade-drawer') as HTMLElement
54
54
 
@@ -85,7 +85,7 @@ describe('Drawer component', () => {
85
85
  ),
86
86
  })
87
87
 
88
- await sleepAsync(50)
88
+ await flushUpdates()
89
89
  expect(document.body.innerHTML).toContain('test-content')
90
90
  })
91
91
  })
@@ -106,7 +106,7 @@ describe('Drawer component', () => {
106
106
  ),
107
107
  })
108
108
 
109
- await sleepAsync(50)
109
+ await flushUpdates()
110
110
  const container = document.querySelector('.drawer-left')
111
111
  expect(container).not.toBeNull()
112
112
  })
@@ -128,7 +128,7 @@ describe('Drawer component', () => {
128
128
  ),
129
129
  })
130
130
 
131
- await sleepAsync(50)
131
+ await flushUpdates()
132
132
  const container = document.querySelector('.drawer-right')
133
133
  expect(container).not.toBeNull()
134
134
  })
@@ -164,7 +164,7 @@ describe('Drawer component', () => {
164
164
  ),
165
165
  })
166
166
 
167
- await sleepAsync(50)
167
+ await flushUpdates()
168
168
  const container = document.querySelector('.drawer-container')
169
169
  expect(container?.classList.contains('closed')).toBe(false)
170
170
  })
@@ -186,7 +186,7 @@ describe('Drawer component', () => {
186
186
  ),
187
187
  })
188
188
 
189
- await sleepAsync(50)
189
+ await flushUpdates()
190
190
  const container = document.querySelector('.drawer-container')
191
191
  expect(container?.getAttribute('data-variant')).toBe('permanent')
192
192
  })
@@ -235,7 +235,7 @@ describe('Drawer component', () => {
235
235
  ),
236
236
  })
237
237
 
238
- await sleepAsync(50)
238
+ await flushUpdates()
239
239
  const container = document.querySelector('.drawer-container')
240
240
  expect(container?.classList.contains('closed')).toBe(true)
241
241
  })
@@ -257,7 +257,7 @@ describe('Drawer component', () => {
257
257
  ),
258
258
  })
259
259
 
260
- await sleepAsync(50)
260
+ await flushUpdates()
261
261
 
262
262
  // Initially open
263
263
  let container = document.querySelector('.drawer-container')
@@ -265,7 +265,7 @@ describe('Drawer component', () => {
265
265
 
266
266
  // Close via LayoutService
267
267
  layoutService.setDrawerOpen('left', false)
268
- await sleepAsync(50)
268
+ await flushUpdates()
269
269
 
270
270
  container = document.querySelector('.drawer-container')
271
271
  expect(container?.classList.contains('closed')).toBe(true)
@@ -315,7 +315,7 @@ describe('Drawer component', () => {
315
315
  ),
316
316
  })
317
317
 
318
- await sleepAsync(50)
318
+ await flushUpdates()
319
319
  expect(document.body.innerHTML).toContain('drawer-backdrop')
320
320
  })
321
321
  })
@@ -336,9 +336,9 @@ describe('Drawer component', () => {
336
336
  ),
337
337
  })
338
338
 
339
- await sleepAsync(50)
339
+ await flushUpdates()
340
340
  layoutService.setDrawerOpen('left', true)
341
- await sleepAsync(50)
341
+ await flushUpdates()
342
342
 
343
343
  const backdrop = document.querySelector('.drawer-backdrop')
344
344
  expect(backdrop?.classList.contains('visible')).toBe(true)
@@ -361,13 +361,13 @@ describe('Drawer component', () => {
361
361
  ),
362
362
  })
363
363
 
364
- await sleepAsync(50)
364
+ await flushUpdates()
365
365
  layoutService.setDrawerOpen('left', true)
366
- await sleepAsync(50)
366
+ await flushUpdates()
367
367
 
368
368
  const backdrop = document.querySelector('.drawer-backdrop') as HTMLElement
369
369
  backdrop.click()
370
- await sleepAsync(50)
370
+ await flushUpdates()
371
371
 
372
372
  expect(layoutService.drawerState.getValue().left?.open).toBe(false)
373
373
  })
@@ -389,7 +389,7 @@ describe('Drawer component', () => {
389
389
  ),
390
390
  })
391
391
 
392
- await sleepAsync(50)
392
+ await flushUpdates()
393
393
 
394
394
  // When closed, left drawer should be translated off-screen
395
395
  let container = document.querySelector('.drawer-container') as HTMLElement
@@ -398,7 +398,7 @@ describe('Drawer component', () => {
398
398
 
399
399
  // When opened
400
400
  layoutService.setDrawerOpen('left', true)
401
- await sleepAsync(50)
401
+ await flushUpdates()
402
402
 
403
403
  container = document.querySelector('.drawer-container') as HTMLElement
404
404
  expect(container.style.transform).toBe('translateX(0)')
@@ -451,7 +451,7 @@ describe('Drawer component', () => {
451
451
  ),
452
452
  })
453
453
 
454
- await sleepAsync(50)
454
+ await flushUpdates()
455
455
 
456
456
  // Width should be updated to 300px
457
457
  expect(layoutService.drawerState.getValue().left?.width).toBe('300px')
@@ -493,9 +493,9 @@ describe('Drawer component', () => {
493
493
  ),
494
494
  })
495
495
 
496
- await sleepAsync(50)
496
+ await flushUpdates()
497
497
  layoutService.setDrawerOpen('right', true)
498
- await sleepAsync(50)
498
+ await flushUpdates()
499
499
 
500
500
  const backdrop = document.querySelector('[data-testid="drawer-backdrop-right"]')
501
501
  expect(backdrop).not.toBeNull()
@@ -524,14 +524,14 @@ describe('Drawer component', () => {
524
524
  ),
525
525
  })
526
526
 
527
- await sleepAsync(50)
527
+ await flushUpdates()
528
528
 
529
529
  // Drawer should be open on large screen
530
530
  expect(layoutService.drawerState.getValue().left?.open).toBe(true)
531
531
 
532
532
  // Simulate screen becoming smaller
533
533
  screenService.screenSize.atLeast.md.setValue(false)
534
- await sleepAsync(50)
534
+ await flushUpdates()
535
535
 
536
536
  // Drawer should now be closed
537
537
  expect(layoutService.drawerState.getValue().left?.open).toBe(false)
@@ -558,21 +558,21 @@ describe('Drawer component', () => {
558
558
  ),
559
559
  })
560
560
 
561
- await sleepAsync(50)
561
+ await flushUpdates()
562
562
 
563
563
  // Drawer should be open on large screen
564
564
  expect(layoutService.drawerState.getValue().left?.open).toBe(true)
565
565
 
566
566
  // Simulate screen becoming smaller
567
567
  screenService.screenSize.atLeast.md.setValue(false)
568
- await sleepAsync(50)
568
+ await flushUpdates()
569
569
 
570
570
  // Drawer should now be closed
571
571
  expect(layoutService.drawerState.getValue().left?.open).toBe(false)
572
572
 
573
573
  // Simulate screen becoming larger again
574
574
  screenService.screenSize.atLeast.md.setValue(true)
575
- await sleepAsync(50)
575
+ await flushUpdates()
576
576
 
577
577
  // Drawer should now be open again
578
578
  expect(layoutService.drawerState.getValue().left?.open).toBe(true)
@@ -599,12 +599,12 @@ describe('Drawer component', () => {
599
599
  ),
600
600
  })
601
601
 
602
- await sleepAsync(50)
602
+ await flushUpdates()
603
603
  expect(layoutService.drawerState.getValue().left?.open).toBe(true)
604
604
 
605
605
  // Simulate screen becoming larger
606
606
  screenService.screenSize.atLeast.md.setValue(true)
607
- await sleepAsync(50)
607
+ await flushUpdates()
608
608
 
609
609
  // Temporary drawer should close when screen is large (switch to desktop layout)
610
610
  expect(layoutService.drawerState.getValue().left?.open).toBe(false)
@@ -631,12 +631,12 @@ describe('Drawer component', () => {
631
631
  ),
632
632
  })
633
633
 
634
- await sleepAsync(50)
634
+ await flushUpdates()
635
635
  expect(layoutService.drawerState.getValue().left?.open).toBe(true)
636
636
 
637
637
  // Simulate screen becoming smaller
638
638
  screenService.screenSize.atLeast.md.setValue(false)
639
- await sleepAsync(50)
639
+ await flushUpdates()
640
640
 
641
641
  // Permanent drawer should remain open
642
642
  expect(layoutService.drawerState.getValue().left?.open).toBe(true)
@@ -661,7 +661,7 @@ describe('Drawer component', () => {
661
661
  ),
662
662
  })
663
663
 
664
- await sleepAsync(50)
664
+ await flushUpdates()
665
665
  const container = document.querySelector('.drawer-container')
666
666
  expect(container?.getAttribute('data-variant')).toBe('collapsible')
667
667
  })
@@ -683,12 +683,12 @@ describe('Drawer component', () => {
683
683
  ),
684
684
  })
685
685
 
686
- await sleepAsync(50)
686
+ await flushUpdates()
687
687
  let container = document.querySelector('.drawer-container')
688
688
  expect(container?.getAttribute('data-open')).toBe('true')
689
689
 
690
690
  layoutService.setDrawerOpen('left', false)
691
- await sleepAsync(50)
691
+ await flushUpdates()
692
692
 
693
693
  container = document.querySelector('.drawer-container')
694
694
  expect(container?.getAttribute('data-open')).toBe('false')
@@ -711,7 +711,7 @@ describe('Drawer component', () => {
711
711
  ),
712
712
  })
713
713
 
714
- await sleepAsync(50)
714
+ await flushUpdates()
715
715
  const container = document.querySelector('[data-testid="drawer-left"]')
716
716
  expect(container).not.toBeNull()
717
717
  })
@@ -738,7 +738,7 @@ describe('Drawer component', () => {
738
738
  ),
739
739
  })
740
740
 
741
- await sleepAsync(50)
741
+ await flushUpdates()
742
742
 
743
743
  // Should preserve the closed state, not reset to defaultOpen
744
744
  expect(layoutService.drawerState.getValue().left?.open).toBe(false)
@@ -1,5 +1,5 @@
1
1
  import { Injector } from '@furystack/inject'
2
- import { createComponent, initializeShadeRoot } from '@furystack/shades'
2
+ import { createComponent, flushUpdates, initializeShadeRoot } from '@furystack/shades'
3
3
  import { sleepAsync, usingAsync } from '@furystack/utils'
4
4
  import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
5
5
  import { Dropdown } from './dropdown.js'
@@ -37,7 +37,7 @@ describe('Dropdown', () => {
37
37
  </Dropdown>
38
38
  ),
39
39
  })
40
- await sleepAsync(50)
40
+ await flushUpdates()
41
41
  return {
42
42
  injector,
43
43
  dropdown: root.querySelector('shade-dropdown') as HTMLElement,
@@ -76,7 +76,7 @@ describe('Dropdown', () => {
76
76
  await usingAsync(await renderDropdown({}), async ({ dropdown }) => {
77
77
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
78
78
  trigger.click()
79
- await sleepAsync(50)
79
+ await flushUpdates()
80
80
 
81
81
  const panel = dropdown.querySelector('.dropdown-panel')
82
82
  expect(panel).toBeTruthy()
@@ -87,7 +87,7 @@ describe('Dropdown', () => {
87
87
  await usingAsync(await renderDropdown({}), async ({ dropdown }) => {
88
88
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
89
89
  trigger.click()
90
- await sleepAsync(50)
90
+ await flushUpdates()
91
91
 
92
92
  const items = dropdown.querySelectorAll('[role="menuitem"]')
93
93
  expect(items.length).toBe(3)
@@ -101,7 +101,7 @@ describe('Dropdown', () => {
101
101
  await usingAsync(await renderDropdown({}), async ({ dropdown }) => {
102
102
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
103
103
  trigger.click()
104
- await sleepAsync(50)
104
+ await flushUpdates()
105
105
 
106
106
  const dividers = dropdown.querySelectorAll('[role="separator"]')
107
107
  expect(dividers.length).toBe(1)
@@ -112,11 +112,11 @@ describe('Dropdown', () => {
112
112
  await usingAsync(await renderDropdown({}), async ({ dropdown }) => {
113
113
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
114
114
  trigger.click()
115
- await sleepAsync(50)
115
+ await flushUpdates()
116
116
 
117
117
  const backdrop = dropdown.querySelector('.dropdown-backdrop') as HTMLElement
118
118
  backdrop.click()
119
- await sleepAsync(50)
119
+ await flushUpdates()
120
120
 
121
121
  expect(dropdown.hasAttribute('data-open')).toBe(false)
122
122
  const panel = dropdown.querySelector('.dropdown-panel')
@@ -128,11 +128,12 @@ describe('Dropdown', () => {
128
128
  await usingAsync(await renderDropdown({}), async ({ dropdown }) => {
129
129
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
130
130
  trigger.click()
131
+ await flushUpdates()
131
132
  await sleepAsync(50)
132
133
  expect(dropdown.hasAttribute('data-open')).toBe(true)
133
134
 
134
135
  trigger.click()
135
- await sleepAsync(50)
136
+ await flushUpdates()
136
137
  expect(dropdown.hasAttribute('data-open')).toBe(false)
137
138
  })
138
139
  })
@@ -144,11 +145,11 @@ describe('Dropdown', () => {
144
145
  await usingAsync(await renderDropdown({ onSelect: handleSelect }), async ({ dropdown }) => {
145
146
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
146
147
  trigger.click()
147
- await sleepAsync(50)
148
+ await flushUpdates()
148
149
 
149
150
  const item = dropdown.querySelector('[data-key="copy"]') as HTMLElement
150
151
  item.click()
151
- await sleepAsync(50)
152
+ await flushUpdates()
152
153
 
153
154
  expect(handleSelect).toHaveBeenCalledWith('copy')
154
155
  })
@@ -158,11 +159,11 @@ describe('Dropdown', () => {
158
159
  await usingAsync(await renderDropdown({ onSelect: vi.fn() }), async ({ dropdown }) => {
159
160
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
160
161
  trigger.click()
161
- await sleepAsync(50)
162
+ await flushUpdates()
162
163
 
163
164
  const item = dropdown.querySelector('[data-key="cut"]') as HTMLElement
164
165
  item.click()
165
- await sleepAsync(50)
166
+ await flushUpdates()
166
167
 
167
168
  expect(dropdown.hasAttribute('data-open')).toBe(false)
168
169
  const panel = dropdown.querySelector('.dropdown-panel')
@@ -176,11 +177,11 @@ describe('Dropdown', () => {
176
177
  await usingAsync(await renderDropdown({ items, onSelect: handleSelect }), async ({ dropdown }) => {
177
178
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
178
179
  trigger.click()
179
- await sleepAsync(50)
180
+ await flushUpdates()
180
181
 
181
182
  const item = dropdown.querySelector('[data-key="disabled"]') as HTMLElement
182
183
  item.click()
183
- await sleepAsync(50)
184
+ await flushUpdates()
184
185
 
185
186
  expect(handleSelect).not.toHaveBeenCalled()
186
187
  })
@@ -192,7 +193,7 @@ describe('Dropdown', () => {
192
193
  await usingAsync(await renderDropdown({ disabled: true }), async ({ dropdown }) => {
193
194
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
194
195
  trigger.click()
195
- await sleepAsync(50)
196
+ await flushUpdates()
196
197
 
197
198
  expect(dropdown.hasAttribute('data-open')).toBe(false)
198
199
  const panel = dropdown.querySelector('.dropdown-panel')
@@ -231,7 +232,7 @@ describe('Dropdown', () => {
231
232
  await usingAsync(await renderDropdown({ items }), async ({ dropdown }) => {
232
233
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
233
234
  trigger.click()
234
- await sleepAsync(50)
235
+ await flushUpdates()
235
236
 
236
237
  const group = dropdown.querySelector('[role="group"]')
237
238
  expect(group).toBeTruthy()
@@ -248,7 +249,7 @@ describe('Dropdown', () => {
248
249
  await usingAsync(await renderDropdown({ items }), async ({ dropdown }) => {
249
250
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
250
251
  trigger.click()
251
- await sleepAsync(50)
252
+ await flushUpdates()
252
253
 
253
254
  const icon = dropdown.querySelector('.dropdown-item-icon')
254
255
  expect(icon).toBeTruthy()
@@ -261,7 +262,7 @@ describe('Dropdown', () => {
261
262
  await usingAsync(await renderDropdown({ items }), async ({ dropdown }) => {
262
263
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
263
264
  trigger.click()
264
- await sleepAsync(50)
265
+ await flushUpdates()
265
266
 
266
267
  const icon = dropdown.querySelector('.dropdown-item-icon')
267
268
  expect(icon).toBeTruthy()
@@ -275,11 +276,12 @@ describe('Dropdown', () => {
275
276
  await usingAsync(await renderDropdown({}), async ({ dropdown }) => {
276
277
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
277
278
  trigger.click()
279
+ await flushUpdates()
278
280
  await sleepAsync(50)
279
281
  expect(dropdown.hasAttribute('data-open')).toBe(true)
280
282
 
281
283
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }))
282
- await sleepAsync(50)
284
+ await flushUpdates()
283
285
 
284
286
  expect(dropdown.hasAttribute('data-open')).toBe(false)
285
287
  })
@@ -289,10 +291,11 @@ describe('Dropdown', () => {
289
291
  await usingAsync(await renderDropdown({}), async ({ dropdown }) => {
290
292
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
291
293
  trigger.click()
294
+ await flushUpdates()
292
295
  await sleepAsync(50)
293
296
 
294
297
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
295
- await sleepAsync(50)
298
+ await flushUpdates()
296
299
 
297
300
  const focusedItems = dropdown.querySelectorAll('.dropdown-item.focused')
298
301
  expect(focusedItems.length).toBe(1)
@@ -303,13 +306,14 @@ describe('Dropdown', () => {
303
306
  await usingAsync(await renderDropdown({}), async ({ dropdown }) => {
304
307
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
305
308
  trigger.click()
309
+ await flushUpdates()
306
310
  await sleepAsync(50)
307
311
 
308
312
  // Move down twice then up once
309
313
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
310
314
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
311
315
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true }))
312
- await sleepAsync(50)
316
+ await flushUpdates()
313
317
 
314
318
  const focusedItems = dropdown.querySelectorAll('.dropdown-item.focused')
315
319
  expect(focusedItems.length).toBe(1)
@@ -321,13 +325,14 @@ describe('Dropdown', () => {
321
325
  await usingAsync(await renderDropdown({ onSelect: handleSelect }), async ({ dropdown }) => {
322
326
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
323
327
  trigger.click()
328
+ await flushUpdates()
324
329
  await sleepAsync(50)
325
330
 
326
331
  // Navigate down then press Enter
327
332
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
328
- await sleepAsync(50)
333
+ await flushUpdates()
329
334
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }))
330
- await sleepAsync(50)
335
+ await flushUpdates()
331
336
 
332
337
  expect(handleSelect).toHaveBeenCalled()
333
338
  })
@@ -341,13 +346,14 @@ describe('Dropdown', () => {
341
346
  await usingAsync(await renderDropdown({ items }), async ({ dropdown }) => {
342
347
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
343
348
  trigger.click()
349
+ await flushUpdates()
344
350
  await sleepAsync(50)
345
351
 
346
352
  // Navigate down past the end (2 items + 1 wrap)
347
353
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
348
354
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
349
355
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
350
- await sleepAsync(50)
356
+ await flushUpdates()
351
357
 
352
358
  const focusedItems = dropdown.querySelectorAll('.dropdown-item.focused')
353
359
  expect(focusedItems.length).toBe(1)
@@ -362,10 +368,11 @@ describe('Dropdown', () => {
362
368
  await usingAsync(await renderDropdown({ items }), async ({ dropdown }) => {
363
369
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
364
370
  trigger.click()
371
+ await flushUpdates()
365
372
  await sleepAsync(50)
366
373
 
367
374
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true }))
368
- await sleepAsync(50)
375
+ await flushUpdates()
369
376
 
370
377
  const focusedItems = dropdown.querySelectorAll('.dropdown-item.focused')
371
378
  expect(focusedItems.length).toBe(1)
@@ -378,7 +385,7 @@ describe('Dropdown', () => {
378
385
  // Don't open the dropdown
379
386
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
380
387
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }))
381
- await sleepAsync(50)
388
+ await flushUpdates()
382
389
 
383
390
  expect(handleSelect).not.toHaveBeenCalled()
384
391
  expect(dropdown.hasAttribute('data-open')).toBe(false)
@@ -394,11 +401,12 @@ describe('Dropdown', () => {
394
401
  await usingAsync(await renderDropdown({ items }), async ({ dropdown }) => {
395
402
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
396
403
  trigger.click()
404
+ await flushUpdates()
397
405
  await sleepAsync(50)
398
406
 
399
407
  // Navigate to first enabled item
400
408
  window.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }))
401
- await sleepAsync(50)
409
+ await flushUpdates()
402
410
 
403
411
  const focusedItems = dropdown.querySelectorAll('.dropdown-item.focused')
404
412
  expect(focusedItems.length).toBe(1)
@@ -413,7 +421,7 @@ describe('Dropdown', () => {
413
421
  await usingAsync(await renderDropdown({ placement: 'bottomRight' }), async ({ dropdown }) => {
414
422
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
415
423
  trigger.click()
416
- await sleepAsync(50)
424
+ await flushUpdates()
417
425
 
418
426
  const panel = dropdown.querySelector('.dropdown-panel')
419
427
  expect(panel).toBeTruthy()
@@ -424,7 +432,7 @@ describe('Dropdown', () => {
424
432
  await usingAsync(await renderDropdown({ placement: 'topLeft' }), async ({ dropdown }) => {
425
433
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
426
434
  trigger.click()
427
- await sleepAsync(50)
435
+ await flushUpdates()
428
436
 
429
437
  const panel = dropdown.querySelector('.dropdown-panel')
430
438
  expect(panel).toBeTruthy()
@@ -435,7 +443,7 @@ describe('Dropdown', () => {
435
443
  await usingAsync(await renderDropdown({ placement: 'topRight' }), async ({ dropdown }) => {
436
444
  const trigger = dropdown.querySelector('.dropdown-trigger') as HTMLElement
437
445
  trigger.click()
438
- await sleepAsync(50)
446
+ await flushUpdates()
439
447
 
440
448
  const panel = dropdown.querySelector('.dropdown-panel')
441
449
  expect(panel).toBeTruthy()
@@ -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 { cssVariableTheme } from '../services/css-variable-theme.js'
6
6
  import { Fab } from './fab.js'
@@ -22,7 +22,7 @@ describe('Fab', () => {
22
22
  rootElement: root,
23
23
  jsxElement: <Fab>{children}</Fab>,
24
24
  })
25
- await sleepAsync(50)
25
+ await flushUpdates()
26
26
  return {
27
27
  injector,
28
28
  fab: root.querySelector('button[is="shade-fab"]') as HTMLButtonElement,
@@ -107,7 +107,7 @@ describe('Fab', () => {
107
107
  rootElement: root,
108
108
  jsxElement: <Fab onclick={handleClick}>+</Fab>,
109
109
  })
110
- await sleepAsync(50)
110
+ await flushUpdates()
111
111
  const fab = root.querySelector('button[is="shade-fab"]') as HTMLButtonElement
112
112
 
113
113
  fab.click()