@wordpress/components 40.0.0 → 40.1.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 (472) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/CONTRIBUTING.md +2 -0
  3. package/build/border-box-control/border-box-control/component.cjs +37 -5
  4. package/build/border-box-control/border-box-control/component.cjs.map +3 -3
  5. package/build/border-box-control/border-box-control/hook.cjs +24 -3
  6. package/build/border-box-control/border-box-control/hook.cjs.map +3 -3
  7. package/build/border-box-control/border-box-control-linked-button/hook.cjs +2 -2
  8. package/build/border-box-control/border-box-control-linked-button/hook.cjs.map +2 -2
  9. package/build/border-box-control/border-box-control-split-controls/hook.cjs +2 -2
  10. package/build/border-box-control/border-box-control-split-controls/hook.cjs.map +2 -2
  11. package/build/border-box-control/border-box-control-visualizer/hook.cjs +2 -2
  12. package/build/border-box-control/border-box-control-visualizer/hook.cjs.map +2 -2
  13. package/build/color-palette/index.cjs +1 -1
  14. package/build/color-palette/index.cjs.map +2 -2
  15. package/build/composite/context.cjs +9 -2
  16. package/build/composite/context.cjs.map +2 -2
  17. package/build/composite/group-label.cjs +4 -0
  18. package/build/composite/group-label.cjs.map +2 -2
  19. package/build/composite/group.cjs +10 -2
  20. package/build/composite/group.cjs.map +2 -2
  21. package/build/composite/item.cjs +4 -0
  22. package/build/composite/item.cjs.map +3 -3
  23. package/build/context/context-system-provider.cjs +2 -5
  24. package/build/context/context-system-provider.cjs.map +3 -3
  25. package/build/context/use-context-system.cjs +7 -2
  26. package/build/context/use-context-system.cjs.map +2 -2
  27. package/build/disabled/index.cjs +1 -1
  28. package/build/disabled/index.cjs.map +2 -2
  29. package/build/draggable/index.cjs.map +1 -1
  30. package/build/form-token-field/index.cjs +1 -1
  31. package/build/form-token-field/index.cjs.map +2 -2
  32. package/build/icon/index.cjs +30 -12
  33. package/build/icon/index.cjs.map +2 -2
  34. package/build/input-control/styles/input-control-styles.cjs +42 -27
  35. package/build/input-control/styles/input-control-styles.cjs.map +2 -2
  36. package/build/item-group/context.cjs +1 -0
  37. package/build/item-group/context.cjs.map +2 -2
  38. package/build/item-group/item/component.cjs +12 -0
  39. package/build/item-group/item/component.cjs.map +3 -3
  40. package/build/item-group/item/hook.cjs +7 -6
  41. package/build/item-group/item/hook.cjs.map +2 -2
  42. package/build/item-group/item-group/component.cjs +1 -0
  43. package/build/item-group/item-group/component.cjs.map +2 -2
  44. package/build/item-group/item-group/hook.cjs +1 -1
  45. package/build/item-group/item-group/hook.cjs.map +2 -2
  46. package/build/progress-bar/index.cjs +1 -1
  47. package/build/progress-bar/index.cjs.map +2 -2
  48. package/build/resizable-box/index.cjs.map +1 -1
  49. package/build/snackbar/index.cjs +8 -5
  50. package/build/snackbar/index.cjs.map +2 -2
  51. package/build/textarea-control/index.cjs +1 -1
  52. package/build/textarea-control/index.cjs.map +2 -2
  53. package/build/toggle-group-control/context.cjs +8 -2
  54. package/build/toggle-group-control/context.cjs.map +2 -2
  55. package/build/toggle-group-control/toggle-group-control/as-button-group.cjs +5 -2
  56. package/build/toggle-group-control/toggle-group-control/as-button-group.cjs.map +2 -2
  57. package/build/toggle-group-control/toggle-group-control/as-radio-group.cjs +5 -2
  58. package/build/toggle-group-control/toggle-group-control/as-radio-group.cjs.map +2 -2
  59. package/build/toggle-group-control/toggle-group-control/component.cjs +3 -1
  60. package/build/toggle-group-control/toggle-group-control/component.cjs.map +2 -2
  61. package/build/toggle-group-control/toggle-group-control-option/component.cjs +2 -0
  62. package/build/toggle-group-control/toggle-group-control-option/component.cjs.map +2 -2
  63. package/build/toggle-group-control/toggle-group-control-option-base/component.cjs +2 -1
  64. package/build/toggle-group-control/toggle-group-control-option-base/component.cjs.map +2 -2
  65. package/build/toggle-group-control/toggle-group-control-option-icon/component.cjs +2 -0
  66. package/build/toggle-group-control/toggle-group-control-option-icon/component.cjs.map +2 -2
  67. package/build/tools-panel/tools-panel/hook.cjs +102 -106
  68. package/build/tools-panel/tools-panel/hook.cjs.map +2 -2
  69. package/build/tools-panel/tools-panel-item/hook.cjs +33 -33
  70. package/build/tools-panel/tools-panel-item/hook.cjs.map +2 -2
  71. package/build/tree-grid/cell.cjs +4 -0
  72. package/build/tree-grid/cell.cjs.map +2 -2
  73. package/build/tree-grid/roving-tab-index-item.cjs +5 -1
  74. package/build/tree-grid/roving-tab-index-item.cjs.map +2 -2
  75. package/build/tree-grid/row.cjs +6 -1
  76. package/build/tree-grid/row.cjs.map +2 -2
  77. package/build/tree-grid/use-validate-tree-grid-structure.cjs +81 -0
  78. package/build/tree-grid/use-validate-tree-grid-structure.cjs.map +7 -0
  79. package/build/utils/colors-values.cjs +3 -2
  80. package/build/utils/colors-values.cjs.map +2 -2
  81. package/build-module/border-box-control/border-box-control/component.mjs +38 -6
  82. package/build-module/border-box-control/border-box-control/component.mjs.map +2 -2
  83. package/build-module/border-box-control/border-box-control/hook.mjs +14 -3
  84. package/build-module/border-box-control/border-box-control/hook.mjs.map +2 -2
  85. package/build-module/border-box-control/border-box-control-linked-button/hook.mjs +2 -2
  86. package/build-module/border-box-control/border-box-control-linked-button/hook.mjs.map +2 -2
  87. package/build-module/border-box-control/border-box-control-split-controls/hook.mjs +2 -2
  88. package/build-module/border-box-control/border-box-control-split-controls/hook.mjs.map +2 -2
  89. package/build-module/border-box-control/border-box-control-visualizer/hook.mjs +2 -2
  90. package/build-module/border-box-control/border-box-control-visualizer/hook.mjs.map +2 -2
  91. package/build-module/color-palette/index.mjs +1 -1
  92. package/build-module/color-palette/index.mjs.map +2 -2
  93. package/build-module/composite/context.mjs +6 -1
  94. package/build-module/composite/context.mjs.map +2 -2
  95. package/build-module/composite/group-label.mjs +5 -1
  96. package/build-module/composite/group-label.mjs.map +2 -2
  97. package/build-module/composite/group.mjs +11 -3
  98. package/build-module/composite/group.mjs.map +2 -2
  99. package/build-module/composite/item.mjs +4 -0
  100. package/build-module/composite/item.mjs.map +2 -2
  101. package/build-module/context/context-system-provider.mjs +2 -5
  102. package/build-module/context/context-system-provider.mjs.map +3 -3
  103. package/build-module/context/use-context-system.mjs +7 -2
  104. package/build-module/context/use-context-system.mjs.map +2 -2
  105. package/build-module/disabled/index.mjs +1 -1
  106. package/build-module/disabled/index.mjs.map +2 -2
  107. package/build-module/draggable/index.mjs.map +1 -1
  108. package/build-module/form-token-field/index.mjs +1 -1
  109. package/build-module/form-token-field/index.mjs.map +2 -2
  110. package/build-module/icon/index.mjs +30 -12
  111. package/build-module/icon/index.mjs.map +2 -2
  112. package/build-module/input-control/styles/input-control-styles.mjs +42 -27
  113. package/build-module/input-control/styles/input-control-styles.mjs.map +2 -2
  114. package/build-module/item-group/context.mjs +1 -0
  115. package/build-module/item-group/context.mjs.map +2 -2
  116. package/build-module/item-group/item/component.mjs +12 -0
  117. package/build-module/item-group/item/component.mjs.map +2 -2
  118. package/build-module/item-group/item/hook.mjs +7 -6
  119. package/build-module/item-group/item/hook.mjs.map +2 -2
  120. package/build-module/item-group/item-group/component.mjs +1 -0
  121. package/build-module/item-group/item-group/component.mjs.map +2 -2
  122. package/build-module/item-group/item-group/hook.mjs +1 -1
  123. package/build-module/item-group/item-group/hook.mjs.map +2 -2
  124. package/build-module/progress-bar/index.mjs +1 -1
  125. package/build-module/progress-bar/index.mjs.map +2 -2
  126. package/build-module/resizable-box/index.mjs.map +1 -1
  127. package/build-module/snackbar/index.mjs +8 -5
  128. package/build-module/snackbar/index.mjs.map +2 -2
  129. package/build-module/textarea-control/index.mjs +1 -1
  130. package/build-module/textarea-control/index.mjs.map +2 -2
  131. package/build-module/toggle-group-control/context.mjs +8 -2
  132. package/build-module/toggle-group-control/context.mjs.map +2 -2
  133. package/build-module/toggle-group-control/toggle-group-control/as-button-group.mjs +5 -2
  134. package/build-module/toggle-group-control/toggle-group-control/as-button-group.mjs.map +2 -2
  135. package/build-module/toggle-group-control/toggle-group-control/as-radio-group.mjs +5 -2
  136. package/build-module/toggle-group-control/toggle-group-control/as-radio-group.mjs.map +2 -2
  137. package/build-module/toggle-group-control/toggle-group-control/component.mjs +3 -1
  138. package/build-module/toggle-group-control/toggle-group-control/component.mjs.map +2 -2
  139. package/build-module/toggle-group-control/toggle-group-control-option/component.mjs +2 -0
  140. package/build-module/toggle-group-control/toggle-group-control-option/component.mjs.map +2 -2
  141. package/build-module/toggle-group-control/toggle-group-control-option-base/component.mjs +2 -1
  142. package/build-module/toggle-group-control/toggle-group-control-option-base/component.mjs.map +2 -2
  143. package/build-module/toggle-group-control/toggle-group-control-option-icon/component.mjs +2 -0
  144. package/build-module/toggle-group-control/toggle-group-control-option-icon/component.mjs.map +2 -2
  145. package/build-module/tools-panel/tools-panel/hook.mjs +103 -107
  146. package/build-module/tools-panel/tools-panel/hook.mjs.map +2 -2
  147. package/build-module/tools-panel/tools-panel-item/hook.mjs +35 -35
  148. package/build-module/tools-panel/tools-panel-item/hook.mjs.map +2 -2
  149. package/build-module/tree-grid/cell.mjs +5 -1
  150. package/build-module/tree-grid/cell.mjs.map +2 -2
  151. package/build-module/tree-grid/roving-tab-index-item.mjs +5 -1
  152. package/build-module/tree-grid/roving-tab-index-item.mjs.map +2 -2
  153. package/build-module/tree-grid/row.mjs +7 -2
  154. package/build-module/tree-grid/row.mjs.map +2 -2
  155. package/build-module/tree-grid/use-validate-tree-grid-structure.mjs +56 -0
  156. package/build-module/tree-grid/use-validate-tree-grid-structure.mjs.map +7 -0
  157. package/build-module/utils/colors-values.mjs +3 -2
  158. package/build-module/utils/colors-values.mjs.map +2 -2
  159. package/build-style/style-rtl.css +27 -85
  160. package/build-style/style.css +27 -85
  161. package/build-types/border-box-control/border-box-control/component.d.ts +4 -0
  162. package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -1
  163. package/build-types/border-box-control/border-box-control/hook.d.ts +4 -2
  164. package/build-types/border-box-control/border-box-control/hook.d.ts.map +1 -1
  165. package/build-types/border-box-control/types.d.ts +6 -2
  166. package/build-types/border-box-control/types.d.ts.map +1 -1
  167. package/build-types/composite/context.d.ts +2 -0
  168. package/build-types/composite/context.d.ts.map +1 -1
  169. package/build-types/composite/group-label.d.ts.map +1 -1
  170. package/build-types/composite/group.d.ts.map +1 -1
  171. package/build-types/composite/item.d.ts.map +1 -1
  172. package/build-types/composite/types.d.ts +1 -1
  173. package/build-types/context/context-system-provider.d.ts +8 -6
  174. package/build-types/context/context-system-provider.d.ts.map +1 -1
  175. package/build-types/context/use-context-system.d.ts.map +1 -1
  176. package/build-types/icon/index.d.ts.map +1 -1
  177. package/build-types/input-control/styles/input-control-styles.d.ts.map +1 -1
  178. package/build-types/item-group/context.d.ts.map +1 -1
  179. package/build-types/item-group/item/component.d.ts.map +1 -1
  180. package/build-types/item-group/item/hook.d.ts +1 -1
  181. package/build-types/item-group/item/hook.d.ts.map +1 -1
  182. package/build-types/item-group/item-group/component.d.ts.map +1 -1
  183. package/build-types/item-group/types.d.ts +4 -0
  184. package/build-types/item-group/types.d.ts.map +1 -1
  185. package/build-types/popover/types.d.ts +6 -2
  186. package/build-types/popover/types.d.ts.map +1 -1
  187. package/build-types/snackbar/index.d.ts.map +1 -1
  188. package/build-types/toggle-group-control/context.d.ts +2 -2
  189. package/build-types/toggle-group-control/context.d.ts.map +1 -1
  190. package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts +1 -1
  191. package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts.map +1 -1
  192. package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts +1 -1
  193. package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts.map +1 -1
  194. package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
  195. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts +2 -2
  196. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts.map +1 -1
  197. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -1
  198. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts +2 -2
  199. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts.map +1 -1
  200. package/build-types/toggle-group-control/types.d.ts +12 -3
  201. package/build-types/toggle-group-control/types.d.ts.map +1 -1
  202. package/build-types/tools-panel/tools-panel/hook.d.ts +4 -4
  203. package/build-types/tools-panel/tools-panel/hook.d.ts.map +1 -1
  204. package/build-types/tools-panel/tools-panel-item/hook.d.ts.map +1 -1
  205. package/build-types/tools-panel/types.d.ts +52 -9
  206. package/build-types/tools-panel/types.d.ts.map +1 -1
  207. package/build-types/tree-grid/cell.d.ts.map +1 -1
  208. package/build-types/tree-grid/roving-tab-index-item.d.ts.map +1 -1
  209. package/build-types/tree-grid/row.d.ts.map +1 -1
  210. package/build-types/tree-grid/use-validate-tree-grid-structure.d.ts +2 -0
  211. package/build-types/tree-grid/use-validate-tree-grid-structure.d.ts.map +1 -0
  212. package/build-types/utils/colors-values.d.ts.map +1 -1
  213. package/emotion-to-scss-modules.md +149 -0
  214. package/package.json +28 -27
  215. package/src/alignment-matrix-control/test/{index.tsx → index.jsdom.test.tsx} +5 -4
  216. package/src/angle-picker-control/style.module.scss +1 -1
  217. package/src/autocomplete/test/get-autocomplete-match.ts +2 -1
  218. package/src/autocomplete/test/{index.tsx → index.jsdom.test.tsx} +2 -1
  219. package/src/badge/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  220. package/src/base-control/stories/index.story.tsx +2 -2
  221. package/src/base-control/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  222. package/src/border-box-control/border-box-control/README.md +5 -3
  223. package/src/border-box-control/border-box-control/component.tsx +83 -15
  224. package/src/border-box-control/border-box-control/hook.ts +19 -1
  225. package/src/border-box-control/stories/index.story.tsx +10 -0
  226. package/src/border-box-control/style.module.scss +34 -3
  227. package/src/border-box-control/test/{index.tsx → index.jsdom.test.tsx} +138 -2
  228. package/src/border-box-control/test/utils.ts +11 -0
  229. package/src/border-box-control/types.ts +6 -2
  230. package/src/border-control/test/{index.js → index.jsdom.test.tsx} +44 -24
  231. package/src/box-control/test/{index.tsx → index.jsdom.test.tsx} +6 -3
  232. package/src/button/style.scss +0 -6
  233. package/src/button/test/{index.tsx → index.jsdom.test.tsx} +6 -2
  234. package/src/checkbox-control/stories/index.story.tsx +1 -1
  235. package/src/checkbox-control/style.scss +2 -2
  236. package/src/checkbox-control/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +10 -7
  237. package/src/checkbox-control/test/{index.tsx → index.jsdom.test.tsx} +4 -1
  238. package/src/circular-option-picker/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  239. package/src/color-indicator/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +2 -2
  240. package/src/color-indicator/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  241. package/src/color-palette/index.tsx +1 -1
  242. package/src/color-palette/test/{index.tsx → index.jsdom.test.tsx} +25 -22
  243. package/src/color-palette/test/{utils.ts → utils.jsdom.test.ts} +1 -0
  244. package/src/combobox-control/test/{index.tsx → index.jsdom.test.tsx} +12 -7
  245. package/src/composite/README.md +1 -1
  246. package/src/composite/context.tsx +6 -0
  247. package/src/composite/group-label.tsx +8 -1
  248. package/src/composite/group.tsx +9 -2
  249. package/src/composite/item.tsx +6 -0
  250. package/src/composite/legacy/test/{index.tsx → index.jsdom.test.tsx} +6 -13
  251. package/src/composite/test/{index.tsx → index.jsdom.test.tsx} +60 -17
  252. package/src/composite/types.ts +1 -1
  253. package/src/confirm-dialog/test/{index.tsx → index.jsdom.test.tsx} +16 -14
  254. package/src/content-editable-control/test/{index.tsx → index.jsdom.test.tsx} +4 -3
  255. package/src/context/{context-system-provider.js → context-system-provider.tsx} +19 -5
  256. package/src/context/stories/{ComponentsProvider.stories.jsx → ComponentsProvider.stories.tsx} +2 -2
  257. package/src/context/test/context-connect.tsx +1 -2
  258. package/src/context/test/{context-system-provider.js → context-system-provider.jsdom.test.tsx} +93 -51
  259. package/src/context/test/wordpress-component.tsx +1 -2
  260. package/src/context/use-context-system.js +13 -4
  261. package/src/custom-gradient-picker/gradient-bar/test/{utils.ts → utils.jsdom.test.ts} +6 -5
  262. package/src/custom-gradient-picker/test/serializer.ts +1 -0
  263. package/src/custom-select-control-v2/test/{index.tsx → index.jsdom.test.tsx} +4 -1
  264. package/src/date-time/date-picker/test/{index.tsx → index.jsdom.test.tsx} +6 -3
  265. package/src/date-time/date-picker/test/{use-lilius.ts → use-lilius.jsdom.test.ts} +1 -0
  266. package/src/date-time/date-time/test/{index.tsx → index.jsdom.test.tsx} +20 -11
  267. package/src/date-time/test/utils.test.ts +9 -0
  268. package/src/date-time/time-picker/test/{index.tsx → index.jsdom.test.tsx} +37 -27
  269. package/src/date-time/time-picker/time-input/test/{index.tsx → index.jsdom.test.tsx} +8 -3
  270. package/src/disabled/index.tsx +7 -7
  271. package/src/disabled/test/{index.tsx → index.jsdom.test.tsx} +26 -0
  272. package/src/draggable/index.tsx +1 -1
  273. package/src/draggable/style.module.scss +1 -1
  274. package/src/dropdown/style.module.scss +2 -2
  275. package/src/dropdown/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  276. package/src/dropdown-menu/test/{index.tsx → index.jsdom.test.tsx} +5 -4
  277. package/src/duotone-picker/test/{custom-duotone-bar.tsx → custom-duotone-bar.jsdom.test.tsx} +11 -8
  278. package/src/duotone-picker/test/{index.tsx → index.jsdom.test.tsx} +11 -10
  279. package/src/external-link/test/{index.tsx → index.jsdom.test.tsx} +5 -4
  280. package/src/focal-point-picker/test/{index.tsx → index.jsdom.test.tsx} +12 -9
  281. package/src/focal-point-picker/test/{media.tsx → media.jsdom.test.tsx} +1 -0
  282. package/src/font-size-picker/test/{font-size-picker-select.tsx → font-size-picker-select.jsdom.test.tsx} +19 -16
  283. package/src/font-size-picker/test/{font-size-picker-toggle-group.tsx → font-size-picker-toggle-group.jsdom.test.tsx} +13 -11
  284. package/src/font-size-picker/test/{index.tsx → index.jsdom.test.tsx} +19 -14
  285. package/src/font-size-picker/test/utils.ts +1 -0
  286. package/src/form-toggle/style.scss +1 -1
  287. package/src/form-toggle/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +4 -4
  288. package/src/form-toggle/test/{index.tsx → index.jsdom.test.tsx} +2 -1
  289. package/src/form-token-field/index.tsx +1 -1
  290. package/src/form-token-field/test/{index.tsx → index.jsdom.test.tsx} +86 -44
  291. package/src/gradient-picker/test/{index.tsx → index.jsdom.test.tsx} +12 -9
  292. package/src/guide/test/{index.tsx → index.jsdom.test.tsx} +4 -2
  293. package/src/h-stack/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +4 -4
  294. package/src/h-stack/test/{index.tsx → index.jsdom.test.tsx} +3 -0
  295. package/src/higher-order/with-fallback-styles/test/{index.tsx → index.jsdom.test.tsx} +3 -2
  296. package/src/higher-order/with-filters/test/__snapshots__/index.jsdom.test.tsx.snap +87 -0
  297. package/src/higher-order/with-filters/test/{index.tsx → index.jsdom.test.tsx} +6 -5
  298. package/src/higher-order/with-focus-outside/test/{index.tsx → index.jsdom.test.tsx} +2 -1
  299. package/src/higher-order/with-focus-return/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  300. package/src/higher-order/with-notices/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  301. package/src/higher-order/with-spoken-messages/test/{index.tsx → index.jsdom.test.tsx} +3 -2
  302. package/src/icon/index.tsx +28 -12
  303. package/src/icon/test/{index.tsx → index.jsdom.test.tsx} +66 -0
  304. package/src/input-control/styles/input-control-styles.tsx +38 -7
  305. package/src/input-control/test/{index.js → index.jsdom.test.tsx} +16 -10
  306. package/src/isolated-event-container/test/{index.tsx → index.jsdom.test.tsx} +4 -3
  307. package/src/item-group/context.ts +1 -0
  308. package/src/item-group/item/component.tsx +19 -1
  309. package/src/item-group/item/hook.ts +2 -3
  310. package/src/item-group/item-group/component.tsx +1 -0
  311. package/src/item-group/style.module.scss +1 -2
  312. package/src/item-group/test/__snapshots__/{index.js.snap → index.jsdom.test.tsx.snap} +9 -9
  313. package/src/item-group/test/{index.js → index.jsdom.test.tsx} +99 -2
  314. package/src/item-group/types.ts +4 -0
  315. package/src/keyboard-shortcuts/test/{index.tsx → index.jsdom.test.tsx} +5 -4
  316. package/src/menu/test/{index.tsx → index.jsdom.test.tsx} +67 -23
  317. package/src/menu-group/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  318. package/src/menu-item/test/__snapshots__/{index.js.snap → index.jsdom.test.tsx.snap} +5 -5
  319. package/src/menu-item/test/{index.js → index.jsdom.test.tsx} +1 -0
  320. package/src/modal/test/{aria-helper.ts → aria-helper.jsdom.test.ts} +1 -0
  321. package/src/modal/test/{index.tsx → index.jsdom.test.tsx} +9 -5
  322. package/src/navigable-container/test/{navigable-menu.tsx → navigable-menu.jsdom.test.tsx} +7 -5
  323. package/src/navigable-container/test/{tababble-container.tsx → tababble-container.jsdom.test.tsx} +5 -3
  324. package/src/navigator/test/{index.tsx → index.jsdom.test.tsx} +5 -2
  325. package/src/navigator/test/router.ts +1 -0
  326. package/src/notice/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +7 -4
  327. package/src/notice/test/{index.tsx → index.jsdom.test.tsx} +8 -4
  328. package/src/notice/test/{list.tsx → list.jsdom.test.tsx} +1 -0
  329. package/src/number-control/test/{index.tsx → index.jsdom.test.tsx} +9 -6
  330. package/src/palette-edit/test/{index.tsx → index.jsdom.test.tsx} +16 -13
  331. package/src/panel/test/__snapshots__/body.jsdom.test.tsx.snap +9 -0
  332. package/src/panel/test/__snapshots__/header.jsdom.test.tsx.snap +9 -0
  333. package/src/panel/test/__snapshots__/index.jsdom.test.tsx.snap +17 -0
  334. package/src/panel/test/__snapshots__/row.jsdom.test.tsx.snap +17 -0
  335. package/src/panel/test/{body.tsx → body.jsdom.test.tsx} +2 -1
  336. package/src/panel/test/{header.tsx → header.jsdom.test.tsx} +1 -0
  337. package/src/panel/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  338. package/src/panel/test/{row.tsx → row.jsdom.test.tsx} +1 -0
  339. package/src/placeholder/style.scss +0 -5
  340. package/src/placeholder/test/{index.tsx → index.jsdom.test.tsx} +19 -14
  341. package/src/popover/README.md +2 -2
  342. package/src/popover/test/{index.tsx → index.jsdom.test.tsx} +23 -0
  343. package/src/popover/types.ts +9 -3
  344. package/src/progress-bar/style.module.scss +9 -1
  345. package/src/query-controls/test/terms.ts +1 -0
  346. package/src/radio-control/test/{index.tsx → index.jsdom.test.tsx} +14 -11
  347. package/src/range-control/test/{index.tsx → index.jsdom.test.tsx} +10 -7
  348. package/src/resizable-box/index.tsx +1 -1
  349. package/src/sandbox/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  350. package/src/scroll-lock/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  351. package/src/shortcut/test/__snapshots__/index.jsdom.test.tsx.snap +15 -0
  352. package/src/shortcut/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  353. package/src/slot-fill/test/{index.js → index.jsdom.test.tsx} +4 -3
  354. package/src/slot-fill/test/{slot.js → slot.jsdom.test.tsx} +17 -9
  355. package/src/snackbar/index.tsx +10 -6
  356. package/src/snackbar/test/{index.tsx → index.jsdom.test.tsx} +41 -11
  357. package/src/snackbar/test/list.jsdom.test.tsx +100 -0
  358. package/src/style-provider/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  359. package/src/surface/style.module.scss +2 -2
  360. package/src/surface/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  361. package/src/tab-panel/style.scss +4 -23
  362. package/src/tab-panel/test/{index.tsx → index.jsdom.test.tsx} +22 -21
  363. package/src/tabs/test/{index.tsx → index.jsdom.test.tsx} +21 -19
  364. package/src/text-control/test/{text-control.tsx → text-control.jsdom.test.tsx} +1 -0
  365. package/src/text-highlight/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  366. package/src/textarea-control/style.module.scss +9 -4
  367. package/src/tip/style.scss +1 -1
  368. package/src/toggle-control/test/{index.tsx → index.jsdom.test.tsx} +4 -1
  369. package/src/toggle-group-control/context.ts +14 -5
  370. package/src/toggle-group-control/stories/index.story.tsx +15 -2
  371. package/src/toggle-group-control/test/{index.tsx → index.jsdom.test.tsx} +283 -9
  372. package/src/toggle-group-control/toggle-group-control/README.md +8 -5
  373. package/src/toggle-group-control/toggle-group-control/as-button-group.tsx +4 -0
  374. package/src/toggle-group-control/toggle-group-control/as-radio-group.tsx +4 -0
  375. package/src/toggle-group-control/toggle-group-control/component.tsx +2 -0
  376. package/src/toggle-group-control/toggle-group-control/style.module.scss +8 -2
  377. package/src/toggle-group-control/toggle-group-control-option/README.md +8 -5
  378. package/src/toggle-group-control/toggle-group-control-option/component.tsx +2 -0
  379. package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +4 -1
  380. package/src/toggle-group-control/toggle-group-control-option-icon/README.md +7 -0
  381. package/src/toggle-group-control/toggle-group-control-option-icon/component.tsx +2 -0
  382. package/src/toggle-group-control/types.ts +12 -3
  383. package/src/toolbar/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  384. package/src/toolbar/test/{toolbar-group.tsx → toolbar-group.jsdom.test.tsx} +2 -1
  385. package/src/tools-panel/test/{index.tsx → index.jsdom.test.tsx} +595 -47
  386. package/src/tools-panel/tools-panel/hook.ts +195 -180
  387. package/src/tools-panel/tools-panel-item/README.md +42 -1
  388. package/src/tools-panel/tools-panel-item/hook.ts +97 -69
  389. package/src/tools-panel/types.ts +54 -9
  390. package/src/tooltip/test/{index.tsx → index.jsdom.test.tsx} +5 -3
  391. package/src/tree-grid/cell.tsx +6 -2
  392. package/src/tree-grid/roving-tab-index-item.tsx +7 -3
  393. package/src/tree-grid/row.tsx +8 -2
  394. package/src/tree-grid/test/__snapshots__/{cell.tsx.snap → cell.jsdom.test.tsx.snap} +2 -2
  395. package/src/tree-grid/test/__snapshots__/index.jsdom.test.tsx.snap +3 -0
  396. package/src/tree-grid/test/__snapshots__/roving-tab-index-item.jsdom.test.tsx.snap +27 -0
  397. package/src/tree-grid/test/__snapshots__/roving-tab-index.jsdom.test.tsx.snap +9 -0
  398. package/src/tree-grid/test/__snapshots__/{row.tsx.snap → row.jsdom.test.tsx.snap} +9 -5
  399. package/src/tree-grid/test/cell.jsdom.test.tsx +149 -0
  400. package/src/tree-grid/test/{index.tsx → index.jsdom.test.tsx} +9 -7
  401. package/src/tree-grid/test/{roving-tab-index-item.tsx → roving-tab-index-item.jsdom.test.tsx} +4 -1
  402. package/src/tree-grid/test/{roving-tab-index.tsx → roving-tab-index.jsdom.test.tsx} +1 -0
  403. package/src/tree-grid/test/row.jsdom.test.tsx +132 -0
  404. package/src/tree-grid/use-validate-tree-grid-structure.ts +104 -0
  405. package/src/truncate/style.module.scss +0 -1
  406. package/src/truncate/test/{index.tsx → index.jsdom.test.tsx} +1 -0
  407. package/src/unit-control/test/{index.tsx → index.jsdom.test.tsx} +22 -19
  408. package/src/unit-control/test/utils.ts +1 -0
  409. package/src/utils/colors-values.js +5 -4
  410. package/src/utils/hooks/test/{use-controlled-state.js → use-controlled-state.jsdom.test.tsx} +22 -7
  411. package/src/utils/hooks/test/{use-controlled-value.js → use-controlled-value.jsdom.test.tsx} +6 -3
  412. package/src/utils/hooks/test/{use-cx.js → use-cx.jsdom.test.tsx} +8 -5
  413. package/src/utils/test/colors.js +1 -0
  414. package/src/utils/test/{get-node-text.js → get-node-text.tsx} +1 -0
  415. package/src/utils/test/math.js +1 -0
  416. package/src/utils/test/rtl.js +1 -0
  417. package/src/utils/test/space.js +1 -0
  418. package/src/utils/test/strings.js +1 -0
  419. package/src/utils/test/unit-values.js +1 -0
  420. package/src/v-stack/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +4 -4
  421. package/src/v-stack/test/{index.tsx → index.jsdom.test.tsx} +3 -0
  422. package/src/validated-form-controls/style.scss +11 -15
  423. package/src/validated-form-controls/test/{content-editable-control.tsx → content-editable-control.jsdom.test.tsx} +1 -1
  424. package/src/validated-form-controls/test/{custom-select-control.tsx → custom-select-control.jsdom.test.tsx} +3 -0
  425. package/src/validated-form-controls/test/{input-control.tsx → input-control.jsdom.test.tsx} +3 -0
  426. package/src/validated-form-controls/test/{range-control.tsx → range-control.jsdom.test.tsx} +3 -0
  427. package/src/validated-form-controls/test/{textarea-control.tsx → textarea-control.jsdom.test.tsx} +1 -0
  428. package/src/view/test/__snapshots__/{index.js.snap → index.jsdom.test.tsx.snap} +7 -7
  429. package/src/view/test/{index.js → index.jsdom.test.tsx} +7 -2
  430. package/src/context/test/__snapshots__/context-system-provider.js.snap +0 -35
  431. package/src/higher-order/with-filters/test/__snapshots__/index.tsx.snap +0 -87
  432. package/src/panel/test/__snapshots__/body.tsx.snap +0 -9
  433. package/src/panel/test/__snapshots__/header.tsx.snap +0 -9
  434. package/src/panel/test/__snapshots__/index.tsx.snap +0 -17
  435. package/src/panel/test/__snapshots__/row.tsx.snap +0 -17
  436. package/src/shortcut/test/__snapshots__/index.tsx.snap +0 -15
  437. package/src/snackbar/test/list.tsx +0 -39
  438. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +0 -359
  439. package/src/tree-grid/test/__snapshots__/index.tsx.snap +0 -3
  440. package/src/tree-grid/test/__snapshots__/roving-tab-index-item.tsx.snap +0 -27
  441. package/src/tree-grid/test/__snapshots__/roving-tab-index.tsx.snap +0 -9
  442. package/src/tree-grid/test/cell.tsx +0 -46
  443. package/src/tree-grid/test/row.tsx +0 -37
  444. /package/src/card/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
  445. /package/src/card/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  446. /package/src/color-picker/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  447. /package/src/custom-gradient-picker/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  448. /package/src/custom-select-control/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
  449. /package/src/custom-select-control/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  450. /package/src/divider/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  451. /package/src/elevation/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
  452. /package/src/elevation/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  453. /package/src/flex/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
  454. /package/src/flex/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  455. /package/src/form-file-upload/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  456. /package/src/grid/test/{grid.tsx → grid.jsdom.test.tsx} +0 -0
  457. /package/src/heading/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
  458. /package/src/heading/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  459. /package/src/input-control/test/__snapshots__/{index.js.snap → index.jsdom.test.tsx.snap} +0 -0
  460. /package/src/progress-bar/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  461. /package/src/resizable-box/resize-tooltip/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  462. /package/src/resizable-box/resize-tooltip/test/{label.tsx → label.jsdom.test.tsx} +0 -0
  463. /package/src/scrollable/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  464. /package/src/search-control/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  465. /package/src/select-control/test/__snapshots__/{select-control.tsx.snap → select-control.jsdom.test.tsx.snap} +0 -0
  466. /package/src/select-control/test/{select-control.tsx → select-control.jsdom.test.tsx} +0 -0
  467. /package/src/slot-fill/test/__snapshots__/{slot.js.snap → slot.jsdom.test.tsx.snap} +0 -0
  468. /package/src/spacer/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
  469. /package/src/spacer/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  470. /package/src/text/test/__snapshots__/{index.tsx.snap → index.jsdom.test.tsx.snap} +0 -0
  471. /package/src/text/test/{index.tsx → index.jsdom.test.tsx} +0 -0
  472. /package/src/utils/test/{polymorphic-element.tsx → polymorphic-element.jsdom.test.tsx} +0 -0
@@ -45,6 +45,10 @@ export interface ItemProps {
45
45
  }
46
46
 
47
47
  export type ItemGroupContext = {
48
+ /**
49
+ * Whether items should use list semantics.
50
+ */
51
+ isList: boolean;
48
52
  /**
49
53
  * When true, each `Item` will be styled as an individual item (e.g. with rounded
50
54
  * borders), instead of being part of the same UI block with the rest of the items.
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { createEvent, fireEvent, render, screen } from '@testing-library/react';
2
3
  import KeyboardShortcuts from '..';
3
4
 
@@ -22,7 +23,7 @@ describe( 'KeyboardShortcuts', () => {
22
23
  }
23
24
 
24
25
  it( 'should capture key events', async () => {
25
- const spy = jest.fn();
26
+ const spy = vi.fn();
26
27
 
27
28
  render(
28
29
  <KeyboardShortcuts
@@ -38,7 +39,7 @@ describe( 'KeyboardShortcuts', () => {
38
39
  } );
39
40
 
40
41
  it( 'should capture key events globally', () => {
41
- const spy = jest.fn();
42
+ const spy = vi.fn();
42
43
 
43
44
  render(
44
45
  <div>
@@ -58,7 +59,7 @@ describe( 'KeyboardShortcuts', () => {
58
59
  } );
59
60
 
60
61
  it( 'should capture key events on specific event', () => {
61
- const spy = jest.fn();
62
+ const spy = vi.fn();
62
63
 
63
64
  render(
64
65
  <div>
@@ -78,7 +79,7 @@ describe( 'KeyboardShortcuts', () => {
78
79
  } );
79
80
 
80
81
  it( 'should capture key events on children', () => {
81
- const spy = jest.fn();
82
+ const spy = vi.fn();
82
83
 
83
84
  render(
84
85
  <div>
@@ -1,8 +1,18 @@
1
- import { act, render, screen, waitFor } from '@testing-library/react';
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import {
3
+ act,
4
+ fireEvent,
5
+ render,
6
+ screen,
7
+ waitFor,
8
+ } from '@testing-library/react';
2
9
  import userEvent from '@testing-library/user-event';
3
10
  import { useState } from '@wordpress/element';
4
11
  import { Menu } from '..';
5
12
  import Modal from '../../modal';
13
+ globalThis.wpVitest.mockCSSSupports();
14
+ globalThis.wpVitest.mockScrollIntoView();
15
+ globalThis.wpVitest.mockVisibleElements();
6
16
 
7
17
  const waitForFocusedMenu = () =>
8
18
  waitFor( () => expect( screen.getByRole( 'menu' ) ).toHaveFocus() );
@@ -30,7 +40,7 @@ const isBodyScrollLocked = () =>
30
40
  document.body.classList.contains( 'modal-open' );
31
41
 
32
42
  const resetTypeahead = () => {
33
- act( () => jest.advanceTimersByTime( 500 ) );
43
+ act( () => vi.advanceTimersByTime( 500 ) );
34
44
  };
35
45
 
36
46
  const MenuWithModal = ( { nested = false }: { nested?: boolean } ) => {
@@ -443,7 +453,7 @@ describe( 'Menu', () => {
443
453
  } );
444
454
 
445
455
  it( 'should use a `hideOnClick` callback to decide whether to close', async () => {
446
- const hideOnClick = jest.fn( () => false );
456
+ const hideOnClick = vi.fn( () => false );
447
457
  render(
448
458
  <Menu defaultOpen>
449
459
  <Menu.TriggerButton>Open dropdown</Menu.TriggerButton>
@@ -462,7 +472,7 @@ describe( 'Menu', () => {
462
472
  } );
463
473
 
464
474
  it( 'should close when a `hideOnClick` callback returns `true`', async () => {
465
- const hideOnClick = jest.fn( () => true );
475
+ const hideOnClick = vi.fn( () => true );
466
476
  render(
467
477
  <Menu defaultOpen>
468
478
  <Menu.TriggerButton>Open dropdown</Menu.TriggerButton>
@@ -755,7 +765,7 @@ describe( 'Menu', () => {
755
765
  } );
756
766
 
757
767
  it( 'should check radio items and keep the menu open when clicking (controlled)', async () => {
758
- const onRadioValueChangeSpy = jest.fn();
768
+ const onRadioValueChangeSpy = vi.fn();
759
769
 
760
770
  const ControlledRadioGroup = () => {
761
771
  const [ radioValue, setRadioValue ] = useState( 'two' );
@@ -843,7 +853,7 @@ describe( 'Menu', () => {
843
853
  } );
844
854
 
845
855
  it( 'should check radio items and keep the menu open when clicking (uncontrolled)', async () => {
846
- const onRadioValueChangeSpy = jest.fn();
856
+ const onRadioValueChangeSpy = vi.fn();
847
857
  render(
848
858
  <Menu>
849
859
  <Menu.TriggerButton>Open dropdown</Menu.TriggerButton>
@@ -923,7 +933,7 @@ describe( 'Menu', () => {
923
933
  } );
924
934
 
925
935
  it( 'should check checkbox items and keep the menu open when clicking (controlled)', async () => {
926
- const onCheckboxValueChangeSpy = jest.fn();
936
+ const onCheckboxValueChangeSpy = vi.fn();
927
937
 
928
938
  const ControlledRadioGroup = () => {
929
939
  const [ itemOneChecked, setItemOneChecked ] =
@@ -1055,7 +1065,7 @@ describe( 'Menu', () => {
1055
1065
  } );
1056
1066
 
1057
1067
  it( 'should check checkbox items and keep the menu open when clicking (uncontrolled)', async () => {
1058
- const onCheckboxValueChangeSpy = jest.fn();
1068
+ const onCheckboxValueChangeSpy = vi.fn();
1059
1069
 
1060
1070
  render(
1061
1071
  <Menu>
@@ -1239,7 +1249,7 @@ describe( 'Menu', () => {
1239
1249
  // The outer button can be focused by pressing tab. Doing so will cause
1240
1250
  // the Menu to close.
1241
1251
  await user.tab();
1242
- expect( outerButton ).toHaveFocus();
1252
+ await waitFor( () => expect( outerButton ).toHaveFocus() );
1243
1253
  await waitFor( () =>
1244
1254
  expect( screen.queryByRole( 'menu' ) ).not.toBeInTheDocument()
1245
1255
  );
@@ -1365,15 +1375,8 @@ describe( 'Menu', () => {
1365
1375
  } );
1366
1376
 
1367
1377
  describe( 'typeahead', () => {
1368
- beforeEach( () => {
1369
- jest.useFakeTimers();
1370
- user = userEvent.setup( {
1371
- advanceTimers: jest.advanceTimersByTime,
1372
- } );
1373
- } );
1374
-
1375
1378
  afterEach( () => {
1376
- jest.useRealTimers();
1379
+ vi.useRealTimers();
1377
1380
  } );
1378
1381
 
1379
1382
  it( 'should highlight matching item', async () => {
@@ -1394,9 +1397,17 @@ describe( 'Menu', () => {
1394
1397
  } )
1395
1398
  );
1396
1399
  await waitForFocusedMenu();
1400
+ vi.useFakeTimers();
1397
1401
 
1398
1402
  // Type "tw", it should match and focus the item with content "Two"
1399
- await user.keyboard( 'tw' );
1403
+ fireEvent.keyDown( screen.getByRole( 'menu' ), {
1404
+ code: 'KeyT',
1405
+ key: 't',
1406
+ } );
1407
+ fireEvent.keyDown( screen.getByRole( 'menu' ), {
1408
+ code: 'KeyW',
1409
+ key: 'w',
1410
+ } );
1400
1411
  expect(
1401
1412
  screen.getByRole( 'menuitem', { name: 'Two' } )
1402
1413
  ).toHaveFocus();
@@ -1405,7 +1416,18 @@ describe( 'Menu', () => {
1405
1416
  resetTypeahead();
1406
1417
 
1407
1418
  // Type "on", it should match and focus the item with content "One"
1408
- await user.keyboard( 'on' );
1419
+ fireEvent.keyDown(
1420
+ screen.getByRole( 'menuitem', { name: 'Two' } ),
1421
+ {
1422
+ key: 'o',
1423
+ }
1424
+ );
1425
+ fireEvent.keyDown(
1426
+ screen.getByRole( 'menuitem', { name: 'Two' } ),
1427
+ {
1428
+ key: 'n',
1429
+ }
1430
+ );
1409
1431
  expect(
1410
1432
  screen.getByRole( 'menuitem', { name: 'One' } )
1411
1433
  ).toHaveFocus();
@@ -1429,16 +1451,20 @@ describe( 'Menu', () => {
1429
1451
  } )
1430
1452
  );
1431
1453
  await waitForFocusedMenu();
1454
+ vi.useFakeTimers();
1432
1455
 
1433
1456
  // Type a string that doesn't match any items. Focus shouldn't move.
1434
- await user.keyboard( 'abc' );
1457
+ fireEvent.keyDown( screen.getByRole( 'menu' ), { key: 'a' } );
1458
+ fireEvent.keyDown( screen.getByRole( 'menu' ), { key: 'b' } );
1459
+ fireEvent.keyDown( screen.getByRole( 'menu' ), { key: 'c' } );
1435
1460
  expect( screen.getByRole( 'menu' ) ).toHaveFocus();
1436
1461
 
1437
1462
  // Reset the typeahead search so the next keystrokes start a new query.
1438
1463
  resetTypeahead();
1439
1464
 
1440
1465
  // Type "on", it should match and focus the item with content "One"
1441
- await user.keyboard( 'on' );
1466
+ fireEvent.keyDown( screen.getByRole( 'menu' ), { key: 'o' } );
1467
+ fireEvent.keyDown( screen.getByRole( 'menu' ), { key: 'n' } );
1442
1468
  expect(
1443
1469
  screen.getByRole( 'menuitem', { name: 'One' } )
1444
1470
  ).toHaveFocus();
@@ -1447,7 +1473,18 @@ describe( 'Menu', () => {
1447
1473
  resetTypeahead();
1448
1474
 
1449
1475
  // Type a string that doesn't match any items. Focus shouldn't move.
1450
- await user.keyboard( 'abc' );
1476
+ fireEvent.keyDown(
1477
+ screen.getByRole( 'menuitem', { name: 'One' } ),
1478
+ { key: 'a' }
1479
+ );
1480
+ fireEvent.keyDown(
1481
+ screen.getByRole( 'menuitem', { name: 'One' } ),
1482
+ { key: 'b' }
1483
+ );
1484
+ fireEvent.keyDown(
1485
+ screen.getByRole( 'menuitem', { name: 'One' } ),
1486
+ { key: 'c' }
1487
+ );
1451
1488
  expect(
1452
1489
  screen.getByRole( 'menuitem', { name: 'One' } )
1453
1490
  ).toHaveFocus();
@@ -1456,7 +1493,14 @@ describe( 'Menu', () => {
1456
1493
  resetTypeahead();
1457
1494
 
1458
1495
  // Type "tw", it should match and focus the item with content "Two"
1459
- await user.keyboard( 'tw' );
1496
+ fireEvent.keyDown(
1497
+ screen.getByRole( 'menuitem', { name: 'One' } ),
1498
+ { key: 't' }
1499
+ );
1500
+ fireEvent.keyDown(
1501
+ screen.getByRole( 'menuitem', { name: 'One' } ),
1502
+ { key: 'w' }
1503
+ );
1460
1504
  expect(
1461
1505
  screen.getByRole( 'menuitem', { name: 'Two' } )
1462
1506
  ).toHaveFocus();
@@ -1,3 +1,4 @@
1
+ import { describe, expect, test } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import { MenuGroup } from '../';
3
4
 
@@ -1,6 +1,6 @@
1
- // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`MenuItem should match snapshot when all props provided 1`] = `
3
+ exports[`MenuItem > should match snapshot when all props provided 1`] = `
4
4
  <button
5
5
  aria-checked="true"
6
6
  class="components-button components-menu-item__button my-class is-compact"
@@ -34,7 +34,7 @@ exports[`MenuItem should match snapshot when all props provided 1`] = `
34
34
  </button>
35
35
  `;
36
36
 
37
- exports[`MenuItem should match snapshot when info is provided 1`] = `
37
+ exports[`MenuItem > should match snapshot when info is provided 1`] = `
38
38
  <button
39
39
  class="components-button components-menu-item__button is-compact"
40
40
  role="menuitem"
@@ -61,7 +61,7 @@ exports[`MenuItem should match snapshot when info is provided 1`] = `
61
61
  </button>
62
62
  `;
63
63
 
64
- exports[`MenuItem should match snapshot when isSelected and role are optionally provided 1`] = `
64
+ exports[`MenuItem > should match snapshot when isSelected and role are optionally provided 1`] = `
65
65
  <button
66
66
  class="components-button components-menu-item__button my-class is-compact"
67
67
  role="menuitem"
@@ -94,7 +94,7 @@ exports[`MenuItem should match snapshot when isSelected and role are optionally
94
94
  </button>
95
95
  `;
96
96
 
97
- exports[`MenuItem should match snapshot when only label provided 1`] = `
97
+ exports[`MenuItem > should match snapshot when only label provided 1`] = `
98
98
  <button
99
99
  class="components-button components-menu-item__button is-compact"
100
100
  role="menuitem"
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import { more } from '@wordpress/icons';
3
4
  import MenuItem from '../';
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { elementShouldBeHidden } from '../aria-helper';
2
3
 
3
4
  describe( 'aria-helper', () => {
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { render, screen, within } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { useEffect, useState } from '@wordpress/element';
@@ -7,6 +8,9 @@ import {
7
8
  } from '@wordpress/ui';
8
9
  import Modal from '../';
9
10
  import type { ModalProps } from '../types';
11
+ globalThis.wpVitest.mockCSSSupports();
12
+ globalThis.wpVitest.mockMatchMedia();
13
+ globalThis.wpVitest.mockVisibleElements();
10
14
 
11
15
  const noop = () => {};
12
16
 
@@ -72,7 +76,7 @@ describe( 'Modal', () => {
72
76
 
73
77
  it( 'should call onRequestClose when the escape key is pressed', async () => {
74
78
  const user = userEvent.setup();
75
- const onRequestClose = jest.fn();
79
+ const onRequestClose = vi.fn();
76
80
  render(
77
81
  <Modal onRequestClose={ onRequestClose }>
78
82
  <p>Modal content</p>
@@ -84,7 +88,7 @@ describe( 'Modal', () => {
84
88
 
85
89
  it( 'should stop an Escape key press from propagating when it dismisses the modal', async () => {
86
90
  const user = userEvent.setup();
87
- const documentKeyDownHandler = jest.fn();
91
+ const documentKeyDownHandler = vi.fn();
88
92
  document.addEventListener( 'keydown', documentKeyDownHandler );
89
93
 
90
94
  try {
@@ -131,7 +135,7 @@ describe( 'Modal', () => {
131
135
 
132
136
  it( 'should request closing of any non nested modal when opened', async () => {
133
137
  const user = userEvent.setup();
134
- const onRequestClose = jest.fn();
138
+ const onRequestClose = vi.fn();
135
139
 
136
140
  const DismissAdjacent = () => {
137
141
  const [ isShown, setIsShown ] = useState( false );
@@ -156,7 +160,7 @@ describe( 'Modal', () => {
156
160
 
157
161
  it( 'should support nested modals', async () => {
158
162
  const user = userEvent.setup();
159
- const onRequestClose = jest.fn();
163
+ const onRequestClose = vi.fn();
160
164
 
161
165
  const NestSupport = () => {
162
166
  const [ isShown, setIsShown ] = useState( false );
@@ -181,7 +185,7 @@ describe( 'Modal', () => {
181
185
 
182
186
  it( 'should request closing of nested modal when outer modal unmounts', async () => {
183
187
  const user = userEvent.setup();
184
- const onRequestClose = jest.fn();
188
+ const onRequestClose = vi.fn();
185
189
 
186
190
  const RequestCloseOfNested = () => {
187
191
  const [ isShown, setIsShown ] = useState( true );
@@ -1,7 +1,9 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { NavigableMenu } from '../menu';
4
5
  import type { NavigableMenuProps } from '../types';
6
+ globalThis.wpVitest.mockVisibleElements();
5
7
 
6
8
  const NavigableMenuTestCase = ( props: NavigableMenuProps ) => (
7
9
  <NavigableMenu { ...props }>
@@ -25,7 +27,7 @@ describe( 'NavigableMenu', () => {
25
27
  it( 'moves focus on its focusable children by using the up/down arrow keys', async () => {
26
28
  const user = userEvent.setup();
27
29
 
28
- const onNavigateSpy = jest.fn();
30
+ const onNavigateSpy = vi.fn();
29
31
 
30
32
  render( <NavigableMenuTestCase onNavigate={ onNavigateSpy } /> );
31
33
 
@@ -64,7 +66,7 @@ describe( 'NavigableMenu', () => {
64
66
  it( 'moves focus on its focusable children by using the left/right arrow keys when the `orientation`prop is set to `horizontal', async () => {
65
67
  const user = userEvent.setup();
66
68
 
67
- const onNavigateSpy = jest.fn();
69
+ const onNavigateSpy = vi.fn();
68
70
 
69
71
  render(
70
72
  <NavigableMenuTestCase
@@ -108,7 +110,7 @@ describe( 'NavigableMenu', () => {
108
110
  it( 'should stop at the edges when the `cycle` prop is set to `false`', async () => {
109
111
  const user = userEvent.setup();
110
112
 
111
- const onNavigateSpy = jest.fn();
113
+ const onNavigateSpy = vi.fn();
112
114
 
113
115
  const { rerender } = render(
114
116
  <NavigableMenuTestCase onNavigate={ onNavigateSpy } />
@@ -166,7 +168,7 @@ describe( 'NavigableMenu', () => {
166
168
  it( 'stops keydown event propagation when arrow keys are pressed, regardless of the `orientation` prop', async () => {
167
169
  const user = userEvent.setup();
168
170
 
169
- const externalWrapperOnKeyDownSpy = jest.fn();
171
+ const externalWrapperOnKeyDownSpy = vi.fn();
170
172
 
171
173
  render(
172
174
  // Disable reason: this is only for test purposes.
@@ -193,7 +195,7 @@ describe( 'NavigableMenu', () => {
193
195
  } );
194
196
 
195
197
  it( 'should keep forwarded callback refs stable across rerenders', () => {
196
- const refSpy = jest.fn();
198
+ const refSpy = vi.fn();
197
199
 
198
200
  const { rerender } = render(
199
201
  <NavigableMenu ref={ refSpy }>
@@ -1,7 +1,9 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { TabbableContainer } from '../tabbable';
4
5
  import type { TabbableContainerProps } from '../types';
6
+ globalThis.wpVitest.mockVisibleElements();
5
7
 
6
8
  const TabbableContainerTestCase = ( props: TabbableContainerProps ) => (
7
9
  <>
@@ -32,7 +34,7 @@ describe( 'TabbableContainer', () => {
32
34
  it( 'moves focus on its tabbable children by using the tab key', async () => {
33
35
  const user = userEvent.setup();
34
36
 
35
- const onNavigateSpy = jest.fn();
37
+ const onNavigateSpy = vi.fn();
36
38
 
37
39
  render( <TabbableContainerTestCase onNavigate={ onNavigateSpy } /> );
38
40
 
@@ -65,7 +67,7 @@ describe( 'TabbableContainer', () => {
65
67
  it( 'should stop at the edges when the `cycle` prop is set to `false`', async () => {
66
68
  const user = userEvent.setup();
67
69
 
68
- const onNavigateSpy = jest.fn();
70
+ const onNavigateSpy = vi.fn();
69
71
 
70
72
  const { rerender } = render(
71
73
  <TabbableContainerTestCase onNavigate={ onNavigateSpy } />
@@ -137,7 +139,7 @@ describe( 'TabbableContainer', () => {
137
139
  it( 'stops keydown event propagation when the tab key is pressed', async () => {
138
140
  const user = userEvent.setup();
139
141
 
140
- const externalWrapperOnKeyDownSpy = jest.fn();
142
+ const externalWrapperOnKeyDownSpy = vi.fn();
141
143
 
142
144
  render(
143
145
  // Disable reason: this is only for test purposes.
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import type { ComponentPropsWithoutRef } from 'react';
2
3
  import { render, screen } from '@testing-library/react';
3
4
  import userEvent from '@testing-library/user-event';
@@ -6,6 +7,8 @@ import Button from '../../button';
6
7
  import { Navigator, useNavigator } from '..';
7
8
  import { NavigatorToParentButton } from '../legacy';
8
9
  import type { NavigateOptions } from '../types';
10
+ globalThis.wpVitest.mockMatchMedia();
11
+ globalThis.wpVitest.mockVisibleElements();
9
12
 
10
13
  const INVALID_HTML_ATTRIBUTE = {
11
14
  raw: '/ "\'><=invalid_path',
@@ -497,7 +500,7 @@ describe( 'Navigator', () => {
497
500
  } );
498
501
 
499
502
  it( 'should navigate across screens', async () => {
500
- const spy = jest.fn();
503
+ const spy = vi.fn();
501
504
 
502
505
  const user = userEvent.setup();
503
506
 
@@ -567,7 +570,7 @@ describe( 'Navigator', () => {
567
570
  } );
568
571
 
569
572
  it( 'should not render anything if the path does not match any available screen', async () => {
570
- const spy = jest.fn();
573
+ const spy = vi.fn();
571
574
 
572
575
  const user = userEvent.setup();
573
576
 
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { patternMatch, findParent } from '../utils/router';
2
3
 
3
4
  describe( 'patternMatch', () => {
@@ -1,6 +1,6 @@
1
- // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
- exports[`Notice should match snapshot 1`] = `
3
+ exports[`Notice > should match snapshot 1`] = `
4
4
  <div>
5
5
  <div
6
6
  class="components-notice is-success"
@@ -48,15 +48,18 @@ exports[`Notice should match snapshot 1`] = `
48
48
  >
49
49
  <svg
50
50
  aria-hidden="true"
51
- fill="currentColor"
52
51
  focusable="false"
53
52
  height="24"
53
+ stroke="currentColor"
54
+ stroke-width="1.5"
55
+ style="fill: none;"
54
56
  viewBox="0 0 24 24"
55
57
  width="24"
56
58
  xmlns="http://www.w3.org/2000/svg"
57
59
  >
58
60
  <path
59
- d="M12 13.06l3.712 3.713 1.061-1.06L13.061 12l3.712-3.712-1.06-1.06L12 10.938 8.288 7.227l-1.061 1.06L10.939 12l-3.712 3.712 1.06 1.061L12 13.061z"
61
+ d="M7.75 16.25L16.25 7.75M16.25 16.25L7.75 7.75"
62
+ vector-effect="non-scaling-stroke"
60
63
  />
61
64
  </svg>
62
65
  </button>
@@ -1,10 +1,14 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { speak } from '@wordpress/a11y';
4
5
  import Notice from '../index';
5
6
 
6
- jest.mock( '@wordpress/a11y', () => ( { speak: jest.fn() } ) );
7
- const mockedSpeak = jest.mocked( speak );
7
+ vi.mock( import( '@wordpress/a11y' ), async ( importOriginal ) => ( {
8
+ ...( await importOriginal() ),
9
+ speak: vi.fn(),
10
+ } ) );
11
+ const mockedSpeak = vi.mocked( speak );
8
12
 
9
13
  function getNoticeWrapper( container: HTMLElement ) {
10
14
  return container.firstChild;
@@ -118,7 +122,7 @@ describe( 'Notice', () => {
118
122
  actions={ [
119
123
  {
120
124
  label: 'Disabled action',
121
- onClick: jest.fn(),
125
+ onClick: vi.fn(),
122
126
  disabled: true,
123
127
  },
124
128
  ] }
@@ -136,7 +140,7 @@ describe( 'Notice', () => {
136
140
 
137
141
  it( 'should call onClick when action with url is clicked', async () => {
138
142
  const user = userEvent.setup();
139
- const onClick = jest.fn( ( e ) => e.preventDefault() );
143
+ const onClick = vi.fn( ( e ) => e.preventDefault() );
140
144
 
141
145
  render(
142
146
  <Notice
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import NoticeList from '../list';
3
4
 
@@ -1,9 +1,12 @@
1
+ import { describe, expect, it, test, vi } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { useState } from '@wordpress/element';
4
5
  import _NumberControl from '..';
5
6
  import type { NumberControlProps } from '../types';
6
7
 
8
+ globalThis.wpVitest.mockMatchMedia();
9
+
7
10
  const NumberControl = (
8
11
  props: React.ComponentProps< typeof _NumberControl >
9
12
  ) => <_NumberControl { ...props } />;
@@ -50,7 +53,7 @@ describe( 'NumberControl', () => {
50
53
  describe( 'onChange handling', () => {
51
54
  it( 'should provide onChange callback with number value', async () => {
52
55
  const user = userEvent.setup();
53
- const spy = jest.fn();
56
+ const spy = vi.fn();
54
57
 
55
58
  render(
56
59
  <NumberControl value={ 5 } onChange={ ( v ) => spy( v ) } />
@@ -65,7 +68,7 @@ describe( 'NumberControl', () => {
65
68
 
66
69
  it( 'should call onChange callback when value is clamped on blur', async () => {
67
70
  const user = userEvent.setup();
68
- const onChangeSpy = jest.fn();
71
+ const onChangeSpy = vi.fn();
69
72
 
70
73
  render(
71
74
  <NumberControl
@@ -108,7 +111,7 @@ describe( 'NumberControl', () => {
108
111
 
109
112
  it( 'should call onChange callback when value is not valid', async () => {
110
113
  const user = userEvent.setup();
111
- const onChangeSpy = jest.fn();
114
+ const onChangeSpy = vi.fn();
112
115
 
113
116
  render(
114
117
  <NumberControl
@@ -251,7 +254,7 @@ describe( 'NumberControl', () => {
251
254
  it( 'should fire onKeyDown callback', async () => {
252
255
  const user = userEvent.setup();
253
256
 
254
- const spy = jest.fn();
257
+ const spy = vi.fn();
255
258
 
256
259
  render( <StatefulNumberControl value={ 5 } onKeyDown={ spy } /> );
257
260
 
@@ -404,7 +407,7 @@ describe( 'NumberControl', () => {
404
407
  describe( 'Key DOWN interactions', () => {
405
408
  it( 'should fire onKeyDown callback', async () => {
406
409
  const user = userEvent.setup();
407
- const spy = jest.fn();
410
+ const spy = vi.fn();
408
411
 
409
412
  render( <StatefulNumberControl value={ 5 } onKeyDown={ spy } /> );
410
413
 
@@ -587,7 +590,7 @@ describe( 'NumberControl', () => {
587
590
  'should spin %s to %s when props = %o',
588
591
  async ( direction, expectedValue, props ) => {
589
592
  const user = userEvent.setup();
590
- const onChange = jest.fn();
593
+ const onChange = vi.fn();
591
594
  render(
592
595
  <NumberControl
593
596
  { ...props }