@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 } 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 { Select } from './select.js';
6
6
  describe('Select', () => {
@@ -24,7 +24,7 @@ describe('Select', () => {
24
24
  rootElement: root,
25
25
  jsxElement: createComponent(Select, { ...props }),
26
26
  });
27
- await sleepAsync(100);
27
+ await flushUpdates();
28
28
  return {
29
29
  injector,
30
30
  select: document.querySelector('shade-select'),
@@ -278,7 +278,7 @@ describe('Select', () => {
278
278
  await usingAsync(await renderSelect({ options: defaultOptions, disabled: true }), async ({ select }) => {
279
279
  const trigger = select.querySelector('.select-trigger');
280
280
  trigger.click();
281
- await sleepAsync(50);
281
+ await flushUpdates();
282
282
  expect(select.hasAttribute('data-open')).toBe(false);
283
283
  });
284
284
  });
@@ -288,7 +288,7 @@ describe('Select', () => {
288
288
  await usingAsync(await renderSelect(), async ({ select }) => {
289
289
  const trigger = select.querySelector('.select-trigger');
290
290
  trigger.click();
291
- await sleepAsync(50);
291
+ await flushUpdates();
292
292
  expect(select.hasAttribute('data-open')).toBe(true);
293
293
  const dropdown = select.querySelector('.dropdown');
294
294
  expect(dropdown).not.toBeNull();
@@ -298,7 +298,7 @@ describe('Select', () => {
298
298
  await usingAsync(await renderSelect(), async ({ select }) => {
299
299
  const trigger = select.querySelector('.select-trigger');
300
300
  trigger.click();
301
- await sleepAsync(50);
301
+ await flushUpdates();
302
302
  const items = select.querySelectorAll('.dropdown-item');
303
303
  expect(items.length).toBe(3);
304
304
  });
@@ -307,11 +307,11 @@ describe('Select', () => {
307
307
  await usingAsync(await renderSelect(), async ({ select }) => {
308
308
  const trigger = select.querySelector('.select-trigger');
309
309
  trigger.click();
310
- await sleepAsync(50);
310
+ await flushUpdates();
311
311
  expect(select.hasAttribute('data-open')).toBe(true);
312
312
  const backdrop = select.querySelector('.dropdown-backdrop');
313
313
  backdrop.click();
314
- await sleepAsync(50);
314
+ await flushUpdates();
315
315
  expect(select.hasAttribute('data-open')).toBe(false);
316
316
  });
317
317
  });
@@ -319,12 +319,12 @@ describe('Select', () => {
319
319
  await usingAsync(await renderSelect(), async ({ select }) => {
320
320
  const trigger = select.querySelector('.select-trigger');
321
321
  trigger.click();
322
- await sleepAsync(50);
322
+ await flushUpdates();
323
323
  expect(select.hasAttribute('data-open')).toBe(true);
324
324
  // Re-query after re-render
325
325
  const trigger2 = select.querySelector('.select-trigger');
326
326
  trigger2.click();
327
- await sleepAsync(50);
327
+ await flushUpdates();
328
328
  expect(select.hasAttribute('data-open')).toBe(false);
329
329
  });
330
330
  });
@@ -335,10 +335,10 @@ describe('Select', () => {
335
335
  await usingAsync(await renderSelect({ options: defaultOptions, onValueChange }), async ({ select }) => {
336
336
  const trigger = select.querySelector('.select-trigger');
337
337
  trigger.click();
338
- await sleepAsync(50);
338
+ await flushUpdates();
339
339
  const items = select.querySelectorAll('.dropdown-item');
340
340
  items[1].click();
341
- await sleepAsync(50);
341
+ await flushUpdates();
342
342
  expect(onValueChange).toHaveBeenCalledWith('b');
343
343
  });
344
344
  });
@@ -347,10 +347,10 @@ describe('Select', () => {
347
347
  await usingAsync(await renderSelect({ options: defaultOptions, onValueChange }), async ({ select }) => {
348
348
  const trigger = select.querySelector('.select-trigger');
349
349
  trigger.click();
350
- await sleepAsync(50);
350
+ await flushUpdates();
351
351
  const items = select.querySelectorAll('.dropdown-item');
352
352
  items[0].click();
353
- await sleepAsync(50);
353
+ await flushUpdates();
354
354
  expect(select.hasAttribute('data-open')).toBe(false);
355
355
  });
356
356
  });
@@ -363,10 +363,10 @@ describe('Select', () => {
363
363
  await usingAsync(await renderSelect({ options, onValueChange }), async ({ select }) => {
364
364
  const trigger = select.querySelector('.select-trigger');
365
365
  trigger.click();
366
- await sleepAsync(50);
366
+ await flushUpdates();
367
367
  const items = select.querySelectorAll('.dropdown-item');
368
368
  items[1].click();
369
- await sleepAsync(50);
369
+ await flushUpdates();
370
370
  expect(onValueChange).not.toHaveBeenCalled();
371
371
  });
372
372
  });
@@ -374,7 +374,7 @@ describe('Select', () => {
374
374
  await usingAsync(await renderSelect({ options: defaultOptions, value: 'b' }), async ({ select }) => {
375
375
  const trigger = select.querySelector('.select-trigger');
376
376
  trigger.click();
377
- await sleepAsync(50);
377
+ await flushUpdates();
378
378
  const selected = select.querySelector('.dropdown-item[data-selected]');
379
379
  expect(selected).not.toBeNull();
380
380
  expect(selected?.textContent).toContain('Beta');
@@ -411,10 +411,10 @@ describe('Select', () => {
411
411
  }), async ({ select }) => {
412
412
  const trigger = select.querySelector('.select-trigger');
413
413
  trigger.click();
414
- await sleepAsync(50);
414
+ await flushUpdates();
415
415
  const items = select.querySelectorAll('.dropdown-item');
416
416
  items[1].click();
417
- await sleepAsync(50);
417
+ await flushUpdates();
418
418
  expect(onMultiValueChange).toHaveBeenCalledWith(['a', 'b']);
419
419
  });
420
420
  });
@@ -428,10 +428,10 @@ describe('Select', () => {
428
428
  }), async ({ select }) => {
429
429
  const trigger = select.querySelector('.select-trigger');
430
430
  trigger.click();
431
- await sleepAsync(50);
431
+ await flushUpdates();
432
432
  const items = select.querySelectorAll('.dropdown-item');
433
433
  items[0].click();
434
- await sleepAsync(50);
434
+ await flushUpdates();
435
435
  expect(onMultiValueChange).toHaveBeenCalledWith(['b']);
436
436
  });
437
437
  });
@@ -446,7 +446,7 @@ describe('Select', () => {
446
446
  const chipRemoves = select.querySelectorAll('.select-chip-remove');
447
447
  expect(chipRemoves.length).toBe(2);
448
448
  chipRemoves[0].click();
449
- await sleepAsync(50);
449
+ await flushUpdates();
450
450
  expect(onMultiValueChange).toHaveBeenCalledWith(['b']);
451
451
  });
452
452
  });
@@ -462,7 +462,7 @@ describe('Select', () => {
462
462
  await usingAsync(await renderSelect(), async ({ select }) => {
463
463
  const trigger = select.querySelector('.select-trigger');
464
464
  trigger.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }));
465
- await sleepAsync(50);
465
+ await flushUpdates();
466
466
  expect(select.hasAttribute('data-open')).toBe(true);
467
467
  });
468
468
  });
@@ -470,7 +470,7 @@ describe('Select', () => {
470
470
  await usingAsync(await renderSelect(), async ({ select }) => {
471
471
  const trigger = select.querySelector('.select-trigger');
472
472
  trigger.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true }));
473
- await sleepAsync(50);
473
+ await flushUpdates();
474
474
  expect(select.hasAttribute('data-open')).toBe(true);
475
475
  });
476
476
  });
@@ -478,7 +478,7 @@ describe('Select', () => {
478
478
  await usingAsync(await renderSelect(), async ({ select }) => {
479
479
  const trigger = select.querySelector('.select-trigger');
480
480
  trigger.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }));
481
- await sleepAsync(50);
481
+ await flushUpdates();
482
482
  expect(select.hasAttribute('data-open')).toBe(true);
483
483
  });
484
484
  });
@@ -486,7 +486,7 @@ describe('Select', () => {
486
486
  await usingAsync(await renderSelect(), async ({ select }) => {
487
487
  const trigger = select.querySelector('.select-trigger');
488
488
  trigger.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true }));
489
- await sleepAsync(50);
489
+ await flushUpdates();
490
490
  expect(select.hasAttribute('data-open')).toBe(true);
491
491
  });
492
492
  });
@@ -494,10 +494,10 @@ describe('Select', () => {
494
494
  await usingAsync(await renderSelect(), async ({ select }) => {
495
495
  const trigger = select.querySelector('.select-trigger');
496
496
  trigger.click();
497
- await sleepAsync(50);
497
+ await flushUpdates();
498
498
  expect(select.hasAttribute('data-open')).toBe(true);
499
499
  trigger.dispatchEvent(new KeyboardEvent('keydown', { key: 'Escape', bubbles: true }));
500
- await sleepAsync(50);
500
+ await flushUpdates();
501
501
  expect(select.hasAttribute('data-open')).toBe(false);
502
502
  });
503
503
  });
@@ -506,14 +506,14 @@ describe('Select', () => {
506
506
  await usingAsync(await renderSelect({ options: defaultOptions, onValueChange }), async ({ select }) => {
507
507
  const trigger = select.querySelector('.select-trigger');
508
508
  trigger.click();
509
- await sleepAsync(50);
509
+ await flushUpdates();
510
510
  // Re-query trigger after re-render, then navigate and select
511
511
  const trigger2 = select.querySelector('.select-trigger');
512
512
  trigger2.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }));
513
- await sleepAsync(50);
513
+ await flushUpdates();
514
514
  const trigger3 = select.querySelector('.select-trigger');
515
515
  trigger3.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }));
516
- await sleepAsync(50);
516
+ await flushUpdates();
517
517
  expect(onValueChange).toHaveBeenCalled();
518
518
  });
519
519
  });
@@ -522,14 +522,14 @@ describe('Select', () => {
522
522
  await usingAsync(await renderSelect({ options: defaultOptions, onValueChange }), async ({ select }) => {
523
523
  const trigger = select.querySelector('.select-trigger');
524
524
  trigger.click();
525
- await sleepAsync(50);
525
+ await flushUpdates();
526
526
  // Re-query trigger after re-render
527
527
  const trigger2 = select.querySelector('.select-trigger');
528
528
  trigger2.dispatchEvent(new KeyboardEvent('keydown', { key: 'End', bubbles: true }));
529
- await sleepAsync(50);
529
+ await flushUpdates();
530
530
  const trigger3 = select.querySelector('.select-trigger');
531
531
  trigger3.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }));
532
- await sleepAsync(50);
532
+ await flushUpdates();
533
533
  expect(onValueChange).toHaveBeenCalledWith('c');
534
534
  });
535
535
  });
@@ -537,7 +537,7 @@ describe('Select', () => {
537
537
  await usingAsync(await renderSelect({ options: defaultOptions, disabled: true }), async ({ select }) => {
538
538
  const trigger = select.querySelector('.select-trigger');
539
539
  trigger.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }));
540
- await sleepAsync(50);
540
+ await flushUpdates();
541
541
  expect(select.hasAttribute('data-open')).toBe(false);
542
542
  });
543
543
  });
@@ -547,7 +547,7 @@ describe('Select', () => {
547
547
  await usingAsync(await renderSelect({ options: defaultOptions, showSearch: true }), async ({ select }) => {
548
548
  const trigger = select.querySelector('.select-trigger');
549
549
  trigger.click();
550
- await sleepAsync(50);
550
+ await flushUpdates();
551
551
  const searchInput = select.querySelector('.dropdown-search');
552
552
  expect(searchInput).not.toBeNull();
553
553
  });
@@ -556,7 +556,7 @@ describe('Select', () => {
556
556
  await usingAsync(await renderSelect({ options: defaultOptions, showSearch: false }), async ({ select }) => {
557
557
  const trigger = select.querySelector('.select-trigger');
558
558
  trigger.click();
559
- await sleepAsync(50);
559
+ await flushUpdates();
560
560
  const searchInput = select.querySelector('.dropdown-search');
561
561
  expect(searchInput).toBeNull();
562
562
  });
@@ -565,11 +565,11 @@ describe('Select', () => {
565
565
  await usingAsync(await renderSelect({ options: defaultOptions, showSearch: true }), async ({ select }) => {
566
566
  const trigger = select.querySelector('.select-trigger');
567
567
  trigger.click();
568
- await sleepAsync(50);
568
+ await flushUpdates();
569
569
  const searchInput = select.querySelector('.dropdown-search');
570
570
  searchInput.value = 'alp';
571
571
  searchInput.dispatchEvent(new Event('input', { bubbles: true }));
572
- await sleepAsync(100);
572
+ await flushUpdates();
573
573
  const items = select.querySelectorAll('.dropdown-item');
574
574
  expect(items.length).toBe(1);
575
575
  expect(items[0].textContent).toContain('Alpha');
@@ -579,11 +579,11 @@ describe('Select', () => {
579
579
  await usingAsync(await renderSelect({ options: defaultOptions, showSearch: true }), async ({ select }) => {
580
580
  const trigger = select.querySelector('.select-trigger');
581
581
  trigger.click();
582
- await sleepAsync(50);
582
+ await flushUpdates();
583
583
  const searchInput = select.querySelector('.dropdown-search');
584
584
  searchInput.value = 'zzz';
585
585
  searchInput.dispatchEvent(new Event('input', { bubbles: true }));
586
- await sleepAsync(100);
586
+ await flushUpdates();
587
587
  const noResults = select.querySelector('.dropdown-no-results');
588
588
  expect(noResults).not.toBeNull();
589
589
  expect(noResults?.textContent).toContain('No results found');
@@ -594,11 +594,11 @@ describe('Select', () => {
594
594
  await usingAsync(await renderSelect({ options: defaultOptions, showSearch: true, filterOption }), async ({ select }) => {
595
595
  const trigger = select.querySelector('.select-trigger');
596
596
  trigger.click();
597
- await sleepAsync(50);
597
+ await flushUpdates();
598
598
  const searchInput = select.querySelector('.dropdown-search');
599
599
  searchInput.value = 'anything';
600
600
  searchInput.dispatchEvent(new Event('input', { bubbles: true }));
601
- await sleepAsync(100);
601
+ await flushUpdates();
602
602
  const items = select.querySelectorAll('.dropdown-item');
603
603
  expect(items.length).toBe(1);
604
604
  expect(items[0].textContent).toContain('Alpha');
@@ -623,7 +623,7 @@ describe('Select', () => {
623
623
  await usingAsync(await renderSelect({ optionGroups }), async ({ select }) => {
624
624
  const trigger = select.querySelector('.select-trigger');
625
625
  trigger.click();
626
- await sleepAsync(50);
626
+ await flushUpdates();
627
627
  const groupLabels = select.querySelectorAll('.dropdown-group-label');
628
628
  expect(groupLabels.length).toBe(2);
629
629
  expect(groupLabels[0].textContent).toContain('Fruits');
@@ -649,11 +649,11 @@ describe('Select', () => {
649
649
  await usingAsync(await renderSelect({ optionGroups, showSearch: true }), async ({ select }) => {
650
650
  const trigger = select.querySelector('.select-trigger');
651
651
  trigger.click();
652
- await sleepAsync(50);
652
+ await flushUpdates();
653
653
  const searchInput = select.querySelector('.dropdown-search');
654
654
  searchInput.value = 'apple';
655
655
  searchInput.dispatchEvent(new Event('input', { bubbles: true }));
656
- await sleepAsync(100);
656
+ await flushUpdates();
657
657
  const items = select.querySelectorAll('.dropdown-item');
658
658
  expect(items.length).toBe(1);
659
659
  expect(items[0].textContent).toContain('Apple');
@@ -703,7 +703,7 @@ describe('Select', () => {
703
703
  await usingAsync(await renderSelect(), async ({ select }) => {
704
704
  const trigger = select.querySelector('.select-trigger');
705
705
  trigger.dispatchEvent(new FocusEvent('focus', { bubbles: true }));
706
- await sleepAsync(50);
706
+ await flushUpdates();
707
707
  // Focus handler sets data-focused on the inner container div (selectRootRef), not the host
708
708
  const innerContainer = select.querySelector('div');
709
709
  expect(innerContainer.hasAttribute('data-focused')).toBe(true);
@@ -713,11 +713,11 @@ describe('Select', () => {
713
713
  await usingAsync(await renderSelect(), async ({ select }) => {
714
714
  const trigger = select.querySelector('.select-trigger');
715
715
  trigger.dispatchEvent(new FocusEvent('focus', { bubbles: true }));
716
- await sleepAsync(50);
716
+ await flushUpdates();
717
717
  const innerContainer = select.querySelector('div');
718
718
  expect(innerContainer.hasAttribute('data-focused')).toBe(true);
719
719
  trigger.dispatchEvent(new FocusEvent('blur', { bubbles: true }));
720
- await sleepAsync(50);
720
+ await flushUpdates();
721
721
  expect(innerContainer.hasAttribute('data-focused')).toBe(false);
722
722
  });
723
723
  });
@@ -779,7 +779,7 @@ describe('Select', () => {
779
779
  await usingAsync(await renderSelect(), async ({ select }) => {
780
780
  const trigger = select.querySelector('.select-trigger');
781
781
  trigger.click();
782
- await sleepAsync(50);
782
+ await flushUpdates();
783
783
  // Re-query after re-render
784
784
  const trigger2 = select.querySelector('.select-trigger');
785
785
  expect(trigger2.getAttribute('aria-expanded')).toBe('true');
@@ -789,7 +789,7 @@ describe('Select', () => {
789
789
  await usingAsync(await renderSelect(), async ({ select }) => {
790
790
  const trigger = select.querySelector('.select-trigger');
791
791
  trigger.click();
792
- await sleepAsync(50);
792
+ await flushUpdates();
793
793
  const dropdown = select.querySelector('.dropdown');
794
794
  expect(dropdown?.getAttribute('role')).toBe('listbox');
795
795
  });
@@ -798,7 +798,7 @@ describe('Select', () => {
798
798
  await usingAsync(await renderSelect(), async ({ select }) => {
799
799
  const trigger = select.querySelector('.select-trigger');
800
800
  trigger.click();
801
- await sleepAsync(50);
801
+ await flushUpdates();
802
802
  const items = select.querySelectorAll('.dropdown-item');
803
803
  items.forEach((item) => {
804
804
  expect(item.getAttribute('role')).toBe('option');
@@ -809,7 +809,7 @@ describe('Select', () => {
809
809
  await usingAsync(await renderSelect({ options: defaultOptions, mode: 'multiple' }), async ({ select }) => {
810
810
  const trigger = select.querySelector('.select-trigger');
811
811
  trigger.click();
812
- await sleepAsync(50);
812
+ await flushUpdates();
813
813
  const dropdown = select.querySelector('.dropdown');
814
814
  expect(dropdown?.getAttribute('aria-multiselectable')).toBe('true');
815
815
  });
@@ -827,10 +827,10 @@ describe('Select', () => {
827
827
  }), async ({ select }) => {
828
828
  const trigger = select.querySelector('.select-trigger');
829
829
  trigger.click();
830
- await sleepAsync(50);
830
+ await flushUpdates();
831
831
  const searchInput = select.querySelector('.dropdown-search');
832
832
  searchInput.dispatchEvent(new KeyboardEvent('keydown', { key: 'Backspace', bubbles: true }));
833
- await sleepAsync(50);
833
+ await flushUpdates();
834
834
  expect(onMultiValueChange).toHaveBeenCalledWith(['a']);
835
835
  });
836
836
  });
@@ -841,19 +841,19 @@ describe('Select', () => {
841
841
  await usingAsync(await renderSelect({ options: defaultOptions, onValueChange }), async ({ select }) => {
842
842
  const trigger = select.querySelector('.select-trigger');
843
843
  trigger.click();
844
- await sleepAsync(50);
844
+ await flushUpdates();
845
845
  // Navigate to End first
846
846
  const trigger2 = select.querySelector('.select-trigger');
847
847
  trigger2.dispatchEvent(new KeyboardEvent('keydown', { key: 'End', bubbles: true }));
848
- await sleepAsync(50);
848
+ await flushUpdates();
849
849
  // Now ArrowUp
850
850
  const trigger3 = select.querySelector('.select-trigger');
851
851
  trigger3.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowUp', bubbles: true }));
852
- await sleepAsync(50);
852
+ await flushUpdates();
853
853
  // Then select with Enter
854
854
  const trigger4 = select.querySelector('.select-trigger');
855
855
  trigger4.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }));
856
- await sleepAsync(50);
856
+ await flushUpdates();
857
857
  expect(onValueChange).toHaveBeenCalledWith('b');
858
858
  });
859
859
  });
@@ -864,13 +864,13 @@ describe('Select', () => {
864
864
  await usingAsync(await renderSelect({ options: defaultOptions, onValueChange }), async ({ select }) => {
865
865
  const trigger = select.querySelector('.select-trigger');
866
866
  trigger.click();
867
- await sleepAsync(50);
867
+ await flushUpdates();
868
868
  const trigger2 = select.querySelector('.select-trigger');
869
869
  trigger2.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowDown', bubbles: true }));
870
- await sleepAsync(50);
870
+ await flushUpdates();
871
871
  const trigger3 = select.querySelector('.select-trigger');
872
872
  trigger3.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true }));
873
- await sleepAsync(50);
873
+ await flushUpdates();
874
874
  expect(onValueChange).toHaveBeenCalled();
875
875
  });
876
876
  });
@@ -879,10 +879,10 @@ describe('Select', () => {
879
879
  await usingAsync(await renderSelect({ options: defaultOptions, showSearch: true, onValueChange }), async ({ select }) => {
880
880
  const trigger = select.querySelector('.select-trigger');
881
881
  trigger.click();
882
- await sleepAsync(50);
882
+ await flushUpdates();
883
883
  const searchInput = select.querySelector('.dropdown-search');
884
884
  searchInput.dispatchEvent(new KeyboardEvent('keydown', { key: ' ', bubbles: true }));
885
- await sleepAsync(50);
885
+ await flushUpdates();
886
886
  // Space should be ignored as a selection trigger when search is active
887
887
  expect(onValueChange).not.toHaveBeenCalled();
888
888
  });
@@ -894,13 +894,13 @@ describe('Select', () => {
894
894
  await usingAsync(await renderSelect({ options: defaultOptions, onValueChange }), async ({ select }) => {
895
895
  const trigger = select.querySelector('.select-trigger');
896
896
  trigger.click();
897
- await sleepAsync(50);
897
+ await flushUpdates();
898
898
  const trigger2 = select.querySelector('.select-trigger');
899
899
  trigger2.dispatchEvent(new KeyboardEvent('keydown', { key: 'Home', bubbles: true }));
900
- await sleepAsync(50);
900
+ await flushUpdates();
901
901
  const trigger3 = select.querySelector('.select-trigger');
902
902
  trigger3.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', bubbles: true }));
903
- await sleepAsync(50);
903
+ await flushUpdates();
904
904
  expect(onValueChange).toHaveBeenCalledWith('a');
905
905
  });
906
906
  });
@@ -930,10 +930,10 @@ describe('Select', () => {
930
930
  }), async ({ select }) => {
931
931
  const trigger = select.querySelector('.select-trigger');
932
932
  trigger.click();
933
- await sleepAsync(50);
933
+ await flushUpdates();
934
934
  const items = select.querySelectorAll('.dropdown-item');
935
935
  items[1].click();
936
- await sleepAsync(50);
936
+ await flushUpdates();
937
937
  expect(onValueChange).toHaveBeenCalledWith('a,b');
938
938
  });
939
939
  });
@@ -949,7 +949,7 @@ describe('Select', () => {
949
949
  }), async ({ select }) => {
950
950
  const chipRemoves = select.querySelectorAll('.select-chip-remove');
951
951
  chipRemoves[0].click();
952
- await sleepAsync(50);
952
+ await flushUpdates();
953
953
  expect(onValueChange).toHaveBeenCalledWith('b');
954
954
  });
955
955
  });
@@ -979,11 +979,11 @@ describe('Select', () => {
979
979
  await usingAsync(await renderSelect({ optionGroups, showSearch: true }), async ({ select }) => {
980
980
  const trigger = select.querySelector('.select-trigger');
981
981
  trigger.click();
982
- await sleepAsync(50);
982
+ await flushUpdates();
983
983
  const searchInput = select.querySelector('.dropdown-search');
984
984
  searchInput.value = 'zzz';
985
985
  searchInput.dispatchEvent(new Event('input', { bubbles: true }));
986
- await sleepAsync(100);
986
+ await flushUpdates();
987
987
  const noResults = select.querySelector('.dropdown-no-results');
988
988
  expect(noResults).not.toBeNull();
989
989
  expect(noResults?.textContent).toContain('No results found');
@@ -995,12 +995,12 @@ describe('Select', () => {
995
995
  await usingAsync(await renderSelect({ options: defaultOptions, mode: 'multiple' }), async ({ select }) => {
996
996
  const trigger = select.querySelector('.select-trigger');
997
997
  trigger.click();
998
- await sleepAsync(50);
998
+ await flushUpdates();
999
999
  expect(select.hasAttribute('data-open')).toBe(true);
1000
1000
  // In multi mode, clicking trigger again should NOT close (only backdrop closes)
1001
1001
  const trigger2 = select.querySelector('.select-trigger');
1002
1002
  trigger2.click();
1003
- await sleepAsync(50);
1003
+ await flushUpdates();
1004
1004
  // It should still remain open or re-open in multi mode
1005
1005
  });
1006
1006
  });