@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
@@ -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[`ColorIndicator matches the snapshot 1`] = `
3
+ exports[`ColorIndicator > matches the snapshot 1`] = `
4
4
  <div>
5
5
  <span
6
6
  aria-label="sample label"
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { render } from '@testing-library/react';
2
3
  import ColorIndicator from '..';
3
4
 
@@ -65,7 +65,7 @@ function SinglePalette( {
65
65
  selectedIconProps={
66
66
  isSelected
67
67
  ? {
68
- fill:
68
+ color:
69
69
  colordColor.contrast() >
70
70
  colordColor.contrast( '#000' )
71
71
  ? '#fff'
@@ -1,8 +1,11 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { render, screen, waitFor } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { useState } from '@wordpress/element';
4
5
  import ColorPalette from '..';
5
6
 
7
+ globalThis.wpVitest.mockMatchMedia();
8
+
6
9
  const EXAMPLE_COLORS = [
7
10
  { name: 'red', color: '#f00' },
8
11
  { name: 'green', color: '#0f0' },
@@ -36,7 +39,7 @@ const ControlledColorPalette = ( {
36
39
  describe( 'ColorPalette', () => {
37
40
  it( 'should use matching values only for display in command button presentation', async () => {
38
41
  const user = userEvent.setup();
39
- const onChange = jest.fn();
42
+ const onChange = vi.fn();
40
43
  render(
41
44
  <ColorPalette
42
45
  aria-label="Colors"
@@ -66,7 +69,7 @@ describe( 'ColorPalette', () => {
66
69
  <ColorPalette
67
70
  aria-label="Colors"
68
71
  colors={ EXAMPLE_COLORS }
69
- onChange={ jest.fn() }
72
+ onChange={ vi.fn() }
70
73
  asButtons={ false }
71
74
  presentation="command-buttons"
72
75
  disableCustomColors
@@ -89,7 +92,7 @@ describe( 'ColorPalette', () => {
89
92
  colors={ DUPLICATE_COLOR_PALETTE }
90
93
  value="#000"
91
94
  selectedSlug="dark-background"
92
- onChange={ jest.fn() }
95
+ onChange={ vi.fn() }
93
96
  asButtons
94
97
  disableCustomColors
95
98
  clearable={ false }
@@ -111,7 +114,7 @@ describe( 'ColorPalette', () => {
111
114
  } );
112
115
 
113
116
  it( 'should render three color button options', () => {
114
- const onChange = jest.fn();
117
+ const onChange = vi.fn();
115
118
 
116
119
  render(
117
120
  <ColorPalette
@@ -126,7 +129,7 @@ describe( 'ColorPalette', () => {
126
129
 
127
130
  it( 'should call onClick on an active button with undefined', async () => {
128
131
  const user = userEvent.setup();
129
- const onChange = jest.fn();
132
+ const onChange = vi.fn();
130
133
 
131
134
  render(
132
135
  <ColorPalette
@@ -144,7 +147,7 @@ describe( 'ColorPalette', () => {
144
147
 
145
148
  it( 'should call onClick on an inactive button', async () => {
146
149
  const user = userEvent.setup();
147
- const onChange = jest.fn();
150
+ const onChange = vi.fn();
148
151
 
149
152
  render(
150
153
  <ColorPalette
@@ -173,7 +176,7 @@ describe( 'ColorPalette', () => {
173
176
 
174
177
  it( 'should call onClick with undefined, when the clearButton onClick is triggered', async () => {
175
178
  const user = userEvent.setup();
176
- const onChange = jest.fn();
179
+ const onChange = vi.fn();
177
180
 
178
181
  render(
179
182
  <ColorPalette
@@ -190,7 +193,7 @@ describe( 'ColorPalette', () => {
190
193
  } );
191
194
 
192
195
  it( 'should render custom color picker', () => {
193
- const onChange = jest.fn();
196
+ const onChange = vi.fn();
194
197
 
195
198
  render(
196
199
  <ColorPalette
@@ -206,7 +209,7 @@ describe( 'ColorPalette', () => {
206
209
  } );
207
210
 
208
211
  it( 'should allow disabling custom color picker', () => {
209
- const onChange = jest.fn();
212
+ const onChange = vi.fn();
210
213
 
211
214
  render(
212
215
  <ColorPalette
@@ -223,7 +226,7 @@ describe( 'ColorPalette', () => {
223
226
  } );
224
227
 
225
228
  it( 'should render nothing when custom colors are disabled, there are no colors, and it is not clearable', () => {
226
- const onChange = jest.fn();
229
+ const onChange = vi.fn();
227
230
  const { container } = render(
228
231
  <ColorPalette
229
232
  colors={ [] }
@@ -238,7 +241,7 @@ describe( 'ColorPalette', () => {
238
241
 
239
242
  it( 'should render dropdown and its content', async () => {
240
243
  const user = userEvent.setup();
241
- const onChange = jest.fn();
244
+ const onChange = vi.fn();
242
245
 
243
246
  render(
244
247
  <ColorPalette
@@ -277,7 +280,7 @@ describe( 'ColorPalette', () => {
277
280
  } );
278
281
 
279
282
  it( 'should show the clear button by default', () => {
280
- const onChange = jest.fn();
283
+ const onChange = vi.fn();
281
284
 
282
285
  render(
283
286
  <ColorPalette
@@ -293,7 +296,7 @@ describe( 'ColorPalette', () => {
293
296
  } );
294
297
 
295
298
  it( 'should show the clear button even when `colors` is an empty array', () => {
296
- const onChange = jest.fn();
299
+ const onChange = vi.fn();
297
300
 
298
301
  render( <ColorPalette colors={ [] } onChange={ onChange } /> );
299
302
 
@@ -303,7 +306,7 @@ describe( 'ColorPalette', () => {
303
306
  } );
304
307
 
305
308
  it( 'should still show the clear button when colors is empty and custom colors are disabled', () => {
306
- const onChange = jest.fn();
309
+ const onChange = vi.fn();
307
310
 
308
311
  render(
309
312
  <ColorPalette
@@ -374,7 +377,7 @@ describe( 'ColorPalette', () => {
374
377
  <ColorPalette
375
378
  colors={ DUPLICATE_COLOR_PALETTE }
376
379
  value={ undefined }
377
- onChange={ jest.fn() }
380
+ onChange={ vi.fn() }
378
381
  />
379
382
  );
380
383
 
@@ -387,7 +390,7 @@ describe( 'ColorPalette', () => {
387
390
  colors={ DUPLICATE_COLOR_PALETTE }
388
391
  value="#000"
389
392
  selectedSlug="dark-text"
390
- onChange={ jest.fn() }
393
+ onChange={ vi.fn() }
391
394
  />
392
395
  );
393
396
 
@@ -403,7 +406,7 @@ describe( 'ColorPalette', () => {
403
406
  <ColorPalette
404
407
  colors={ DUPLICATE_COLOR_PALETTE }
405
408
  value="#000"
406
- onChange={ jest.fn() }
409
+ onChange={ vi.fn() }
407
410
  />
408
411
  );
409
412
 
@@ -420,7 +423,7 @@ describe( 'ColorPalette', () => {
420
423
  colors={ DUPLICATE_COLOR_PALETTE }
421
424
  value="#000"
422
425
  selectedSlug=""
423
- onChange={ jest.fn() }
426
+ onChange={ vi.fn() }
424
427
  />
425
428
  );
426
429
 
@@ -435,7 +438,7 @@ describe( 'ColorPalette', () => {
435
438
  colors={ DUPLICATE_COLOR_PALETTE }
436
439
  value="#000"
437
440
  selectedSlug="dark-text"
438
- onChange={ jest.fn() }
441
+ onChange={ vi.fn() }
439
442
  />
440
443
  );
441
444
 
@@ -448,7 +451,7 @@ describe( 'ColorPalette', () => {
448
451
 
449
452
  it( 'should pass slug as third argument to onChange when a swatch is clicked', async () => {
450
453
  const user = userEvent.setup();
451
- const onChange = jest.fn();
454
+ const onChange = vi.fn();
452
455
 
453
456
  render(
454
457
  <ColorPalette
@@ -466,7 +469,7 @@ describe( 'ColorPalette', () => {
466
469
 
467
470
  it( 'should clear the selection when the selected swatch is clicked', async () => {
468
471
  const user = userEvent.setup();
469
- const onChange = jest.fn();
472
+ const onChange = vi.fn();
470
473
 
471
474
  render(
472
475
  <ColorPalette
@@ -496,7 +499,7 @@ describe( 'ColorPalette', () => {
496
499
  colors={ MIXED_PALETTE }
497
500
  value="#fff"
498
501
  selectedSlug="brand-white"
499
- onChange={ jest.fn() }
502
+ onChange={ vi.fn() }
500
503
  />
501
504
  );
502
505
 
@@ -1,3 +1,4 @@
1
+ import { describe, expect, test } from 'vitest';
1
2
  import {
2
3
  extractColorNameFromCurrentValue,
3
4
  normalizeColorValue,
@@ -1,9 +1,14 @@
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 { useState } from '@wordpress/element';
4
5
  import _ComboboxControl from '..';
5
6
  import type { ComboboxControlOption, ComboboxControlProps } from '../types';
6
7
 
8
+ globalThis.wpVitest.mockMatchMedia();
9
+
10
+ globalThis.wpVitest.mockScrollIntoView();
11
+
7
12
  const timezones = [
8
13
  { label: 'Greenwich Mean Time', value: 'GMT' },
9
14
  { label: 'Universal Coordinated Time', value: 'UTC' },
@@ -120,7 +125,7 @@ describe.each( [
120
125
  it( 'should select the correct option via click events', async () => {
121
126
  const user = await userEvent.setup();
122
127
  const targetOption = timezones[ 2 ];
123
- const onChangeSpy = jest.fn();
128
+ const onChangeSpy = vi.fn();
124
129
  render(
125
130
  <Component
126
131
  options={ timezones }
@@ -145,7 +150,7 @@ describe.each( [
145
150
  const user = await userEvent.setup();
146
151
  const targetIndex = 4;
147
152
  const targetOption = timezones[ targetIndex ];
148
- const onChangeSpy = jest.fn();
153
+ const onChangeSpy = vi.fn();
149
154
  render(
150
155
  <Component
151
156
  options={ timezones }
@@ -173,7 +178,7 @@ describe.each( [
173
178
 
174
179
  it( 'calls onFilterValueChange whenever the textbox changes', async () => {
175
180
  const user = userEvent.setup();
176
- const onFilterValueChangeSpy = jest.fn();
181
+ const onFilterValueChangeSpy = vi.fn();
177
182
  render(
178
183
  <Component
179
184
  options={ timezones }
@@ -190,7 +195,7 @@ describe.each( [
190
195
 
191
196
  it( 'clears the textbox value if there is no selected value on blur', async () => {
192
197
  const user = userEvent.setup();
193
- const onFilterValueChangeSpy = jest.fn();
198
+ const onFilterValueChangeSpy = vi.fn();
194
199
  render(
195
200
  <Component
196
201
  options={ timezones }
@@ -214,7 +219,7 @@ describe.each( [
214
219
  it( 'should select the correct option from a search', async () => {
215
220
  const user = await userEvent.setup();
216
221
  const targetOption = timezones[ 13 ];
217
- const onChangeSpy = jest.fn();
222
+ const onChangeSpy = vi.fn();
218
223
  render(
219
224
  <Component
220
225
  options={ timezones }
@@ -241,7 +246,7 @@ describe.each( [
241
246
  it( 'should render aria-live announcement upon selection', async () => {
242
247
  const user = await userEvent.setup();
243
248
  const targetOption = timezones[ 9 ];
244
- const onChangeSpy = jest.fn();
249
+ const onChangeSpy = vi.fn();
245
250
  render(
246
251
  <Component
247
252
  options={ timezones }
@@ -270,7 +275,7 @@ describe.each( [
270
275
  const user = await userEvent.setup();
271
276
  const unmatchedString = 'Mordor';
272
277
  const targetOption = timezones[ 6 ];
273
- const onChangeSpy = jest.fn();
278
+ const onChangeSpy = vi.fn();
274
279
  render(
275
280
  <Component
276
281
  options={ timezones }
@@ -136,7 +136,7 @@ Allows the component to be rendered as a different HTML element or React compone
136
136
 
137
137
  Makes the component a focusable element. When this element gains keyboard focus, it gets a `data-focus-visible` attribute and triggers the `onFocusVisible` prop.
138
138
 
139
- The component supports the `disabled` prop even for those elements not supporting the native `disabled` attribute. Disabled elements may be still accessible via keyboard by using the the `accessibleWhenDisabled` prop.
139
+ The component supports the `disabled` prop even for those elements not supporting the native `disabled` attribute. Disabled elements may be still accessible via keyboard by using the `accessibleWhenDisabled` prop.
140
140
 
141
141
  Non-native focusable elements will lose their focusability entirely. However, native focusable elements will retain their inherent focusability.
142
142
 
@@ -5,3 +5,9 @@ export const CompositeContext = createContext< CompositeContextProps >( {} );
5
5
  CompositeContext.displayName = 'CompositeContext';
6
6
 
7
7
  export const useCompositeContext = () => useContext( CompositeContext );
8
+
9
+ export const CompositeGroupContext = createContext( false );
10
+ CompositeGroupContext.displayName = 'CompositeGroupContext';
11
+
12
+ export const useCompositeGroupContext = () =>
13
+ useContext( CompositeGroupContext );
@@ -1,7 +1,7 @@
1
1
  import * as Ariakit from '@ariakit/react';
2
2
  import { forwardRef } from '@wordpress/element';
3
3
  import type { WordPressComponentProps } from '../context';
4
- import { useCompositeContext } from './context';
4
+ import { useCompositeContext, useCompositeGroupContext } from './context';
5
5
  import type { CompositeGroupLabelProps } from './types';
6
6
 
7
7
  export const CompositeGroupLabel = forwardRef<
@@ -9,6 +9,13 @@ export const CompositeGroupLabel = forwardRef<
9
9
  WordPressComponentProps< CompositeGroupLabelProps, 'div', false >
10
10
  >( function CompositeGroupLabel( props, ref ) {
11
11
  const context = useCompositeContext();
12
+ const isWithinGroup = useCompositeGroupContext();
13
+
14
+ if ( ! isWithinGroup ) {
15
+ throw new Error(
16
+ 'Composite.GroupLabel can only be rendered inside Composite.Group.'
17
+ );
18
+ }
12
19
 
13
20
  // @ts-expect-error The store prop is undocumented and only used by the
14
21
  // legacy compat layer. The `store` prop is documented, but its type is
@@ -1,7 +1,7 @@
1
1
  import * as Ariakit from '@ariakit/react';
2
2
  import { forwardRef } from '@wordpress/element';
3
3
  import type { WordPressComponentProps } from '../context';
4
- import { useCompositeContext } from './context';
4
+ import { CompositeGroupContext, useCompositeContext } from './context';
5
5
  import type { CompositeGroupProps } from './types';
6
6
 
7
7
  export const CompositeGroup = forwardRef<
@@ -9,11 +9,18 @@ export const CompositeGroup = forwardRef<
9
9
  WordPressComponentProps< CompositeGroupProps, 'div', false >
10
10
  >( function CompositeGroup( props, ref ) {
11
11
  const context = useCompositeContext();
12
+ const { children, ...restProps } = props;
12
13
 
13
14
  // @ts-expect-error The store prop is undocumented and only used by the
14
15
  // legacy compat layer. The `store` prop is documented, but its type is
15
16
  // obfuscated to discourage its use outside of the component's internals.
16
17
  const store = ( props.store ?? context.store ) as Ariakit.CompositeStore;
17
18
 
18
- return <Ariakit.CompositeGroup store={ store } { ...props } ref={ ref } />;
19
+ return (
20
+ <Ariakit.CompositeGroup store={ store } { ...restProps } ref={ ref }>
21
+ <CompositeGroupContext.Provider value>
22
+ { children }
23
+ </CompositeGroupContext.Provider>
24
+ </Ariakit.CompositeGroup>
25
+ );
19
26
  } );
@@ -1,5 +1,6 @@
1
1
  import * as Ariakit from '@ariakit/react';
2
2
  import { forwardRef } from '@wordpress/element';
3
+ import warning from '@wordpress/warning';
3
4
  import type { WordPressComponentProps } from '../context';
4
5
  import { useCompositeContext } from './context';
5
6
  import type { CompositeItemProps } from './types';
@@ -14,6 +15,11 @@ export const CompositeItem = forwardRef<
14
15
  // legacy compat layer. The `store` prop is documented, but its type is
15
16
  // obfuscated to discourage its use outside of the component's internals.
16
17
  const store = ( props.store ?? context.store ) as Ariakit.CompositeStore;
18
+ if ( ! store ) {
19
+ warning(
20
+ 'Composite.Item: Missing composite state. Render inside Composite to enable composite keyboard behavior.'
21
+ );
22
+ }
17
23
 
18
24
  return <Ariakit.CompositeItem store={ store } { ...props } ref={ ref } />;
19
25
  } );
@@ -1,3 +1,4 @@
1
+ import { beforeEach, describe, expect, it, test, vi } from 'vitest';
1
2
  import {
2
3
  queryByAttribute,
3
4
  render,
@@ -16,23 +17,15 @@ import {
16
17
  // page down. Without this, nothing has a height, and so paging up
17
18
  // and down doesn't behave as expected in tests.
18
19
 
19
- let clientHeightSpy: jest.SpiedGetter<
20
- typeof HTMLElement.prototype.clientHeight
21
- >;
22
-
23
- beforeAll( () => {
24
- clientHeightSpy = jest
25
- .spyOn( HTMLElement.prototype, 'clientHeight', 'get' )
26
- .mockImplementation( function getClientHeight( this: HTMLElement ) {
20
+ beforeEach( () => {
21
+ vi.spyOn( HTMLElement.prototype, 'clientHeight', 'get' ).mockImplementation(
22
+ function getClientHeight( this: HTMLElement ) {
27
23
  if ( this.tagName === 'BODY' ) {
28
24
  return window.outerHeight;
29
25
  }
30
26
  return 50;
31
- } );
32
- } );
33
-
34
- afterAll( () => {
35
- clientHeightSpy?.mockRestore();
27
+ }
28
+ );
36
29
  } );
37
30
 
38
31
  type InitialState = Parameters< typeof useCompositeState >[ 0 ];
@@ -1,5 +1,7 @@
1
+ import { beforeEach, describe, expect, it, test, vi } from 'vitest';
1
2
  import { queryByAttribute, render, screen } from '@testing-library/react';
2
3
  import { click, press, waitFor } from '@ariakit/test';
4
+ import * as Ariakit from '@ariakit/react';
3
5
  import type { ComponentProps } from 'react';
4
6
  import { useState } from '@wordpress/element';
5
7
  import { Composite } from '..';
@@ -18,26 +20,20 @@ async function renderAndValidate( ...args: Parameters< typeof render > ) {
18
20
  }
19
21
 
20
22
  describe( 'Composite', () => {
21
- let clientHeightSpy: jest.SpiedGetter<
22
- typeof HTMLElement.prototype.clientHeight
23
- >;
24
-
25
- beforeAll( () => {
23
+ beforeEach( () => {
26
24
  // This is necessary because of how Ariakit calculates page up and
27
25
  // page down. Without this, nothing has a height, and so paging up
28
26
  // and down doesn't behave as expected in tests.
29
- clientHeightSpy = jest
30
- .spyOn( HTMLElement.prototype, 'clientHeight', 'get' )
31
- .mockImplementation( function getClientHeight( this: HTMLElement ) {
32
- if ( this.tagName === 'BODY' ) {
33
- return window.outerHeight;
34
- }
35
- return 50;
36
- } );
37
- } );
38
-
39
- afterAll( () => {
40
- clientHeightSpy?.mockRestore();
27
+ vi.spyOn(
28
+ HTMLElement.prototype,
29
+ 'clientHeight',
30
+ 'get'
31
+ ).mockImplementation( function getClientHeight( this: HTMLElement ) {
32
+ if ( this.tagName === 'BODY' ) {
33
+ return window.outerHeight;
34
+ }
35
+ return 50;
36
+ } );
41
37
  } );
42
38
 
43
39
  test( 'Renders as a single tab stop', async () => {
@@ -700,4 +696,51 @@ describe( 'Composite', () => {
700
696
  } );
701
697
  } );
702
698
  } );
699
+
700
+ describe( 'required context', () => {
701
+ it( 'warns when Composite.Item has no composite state', () => {
702
+ render( <Composite.Item>Item</Composite.Item> );
703
+
704
+ expect(
705
+ screen.getByRole( 'button', { name: 'Item' } )
706
+ ).toBeVisible();
707
+ expect( console ).toHaveWarnedWith(
708
+ 'Composite.Item: Missing composite state. Render inside Composite to enable composite keyboard behavior.'
709
+ );
710
+ } );
711
+
712
+ it( 'supports an explicit store prop for Composite.Item', () => {
713
+ function ItemWithStore() {
714
+ const store = Ariakit.useCompositeStore();
715
+
716
+ return (
717
+ <Composite.Item
718
+ // @ts-expect-error The store prop is intentionally omitted from the public types.
719
+ store={ store }
720
+ >
721
+ Item
722
+ </Composite.Item>
723
+ );
724
+ }
725
+
726
+ render( <ItemWithStore /> );
727
+
728
+ expect(
729
+ screen.getByRole( 'button', { name: 'Item' } )
730
+ ).toBeVisible();
731
+ } );
732
+
733
+ it( 'throws when Composite.GroupLabel is outside Composite.Group', () => {
734
+ expect( () =>
735
+ render(
736
+ <Composite>
737
+ <Composite.GroupLabel>Label</Composite.GroupLabel>
738
+ </Composite>
739
+ )
740
+ ).toThrow(
741
+ 'Composite.GroupLabel can only be rendered inside Composite.Group.'
742
+ );
743
+ expect( console ).toHaveErrored();
744
+ } );
745
+ } );
703
746
  } );
@@ -141,7 +141,7 @@ export type CompositeProps = CompositeStoreProps & {
141
141
  * `onFocusVisible` prop.
142
142
  * The component supports the `disabled` prop even for those elements not
143
143
  * supporting the native `disabled` attribute. Disabled elements may be
144
- * still accessible via keyboard by using the the `accessibleWhenDisabled`
144
+ * still accessible via keyboard by using the `accessibleWhenDisabled`
145
145
  * prop.
146
146
  * Non-native focusable elements will lose their focusability entirely.
147
147
  * However, native focusable elements will retain their inherent focusability.
@@ -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 { ConfirmDialog } from '..';
4
5
  import styles from '../style.module.scss';
6
+ globalThis.wpVitest.mockMatchMedia();
5
7
 
6
8
  const noop = () => {};
7
9
 
@@ -115,7 +117,7 @@ describe( 'Confirm', () => {
115
117
  it( 'should not render if closed by clicking `OK`, and the `onConfirm` callback should be called', async () => {
116
118
  const user = userEvent.setup();
117
119
 
118
- const onConfirm = jest.fn().mockName( 'onConfirm()' );
120
+ const onConfirm = vi.fn().mockName( 'onConfirm()' );
119
121
 
120
122
  render(
121
123
  <ConfirmDialog onConfirm={ onConfirm }>
@@ -135,7 +137,7 @@ describe( 'Confirm', () => {
135
137
  it( 'should not render if closed by clicking `Cancel`, and the `onCancel` callback should be called', async () => {
136
138
  const user = userEvent.setup();
137
139
 
138
- const onCancel = jest.fn().mockName( 'onCancel()' );
140
+ const onCancel = vi.fn().mockName( 'onCancel()' );
139
141
 
140
142
  render(
141
143
  <ConfirmDialog onConfirm={ noop } onCancel={ onCancel }>
@@ -171,7 +173,7 @@ describe( 'Confirm', () => {
171
173
 
172
174
  it( 'should not render if dialog is closed by clicking the overlay, and the `onCancel` callback should be called', async () => {
173
175
  const user = userEvent.setup();
174
- const onCancel = jest.fn().mockName( 'onCancel()' );
176
+ const onCancel = vi.fn().mockName( 'onCancel()' );
175
177
 
176
178
  render(
177
179
  <ConfirmDialog onConfirm={ noop } onCancel={ onCancel }>
@@ -192,7 +194,7 @@ describe( 'Confirm', () => {
192
194
  it( 'should not render if dialog is closed by pressing `Escape`, and the `onCancel` callback should be called', async () => {
193
195
  const user = userEvent.setup();
194
196
 
195
- const onCancel = jest.fn().mockName( 'onCancel()' );
197
+ const onCancel = vi.fn().mockName( 'onCancel()' );
196
198
 
197
199
  render(
198
200
  <ConfirmDialog onConfirm={ noop } onCancel={ onCancel }>
@@ -211,7 +213,7 @@ describe( 'Confirm', () => {
211
213
  it( 'should not render if dialog is closed by pressing `Enter`, and the `onConfirm` callback should be called', async () => {
212
214
  const user = userEvent.setup();
213
215
 
214
- const onConfirm = jest.fn().mockName( 'onConfirm()' );
216
+ const onConfirm = vi.fn().mockName( 'onConfirm()' );
215
217
 
216
218
  render(
217
219
  <ConfirmDialog onConfirm={ onConfirm }>
@@ -230,8 +232,8 @@ describe( 'Confirm', () => {
230
232
  it( 'calls only the `onCancel` callback and not the `onConfirm` callback when the cancel button is submitted using the keyboard', async () => {
231
233
  const user = userEvent.setup();
232
234
 
233
- const onConfirm = jest.fn().mockName( 'onConfirm()' );
234
- const onCancel = jest.fn().mockName( 'onCancel()' );
235
+ const onConfirm = vi.fn().mockName( 'onConfirm()' );
236
+ const onCancel = vi.fn().mockName( 'onCancel()' );
235
237
 
236
238
  render(
237
239
  <ConfirmDialog
@@ -251,8 +253,8 @@ describe( 'Confirm', () => {
251
253
  it( 'calls only the `onConfirm` callback when the confirm button is submitted using the keyboard', async () => {
252
254
  const user = userEvent.setup();
253
255
 
254
- const onConfirm = jest.fn().mockName( 'onConfirm()' );
255
- const onCancel = jest.fn().mockName( 'onCancel()' );
256
+ const onConfirm = vi.fn().mockName( 'onConfirm()' );
257
+ const onCancel = vi.fn().mockName( 'onCancel()' );
256
258
 
257
259
  render(
258
260
  <ConfirmDialog
@@ -305,7 +307,7 @@ describe( 'Confirm', () => {
305
307
  it( 'should call the `onConfirm` callback if `OK`', async () => {
306
308
  const user = userEvent.setup();
307
309
 
308
- const onConfirm = jest.fn().mockName( 'onConfirm()' );
310
+ const onConfirm = vi.fn().mockName( 'onConfirm()' );
309
311
 
310
312
  render(
311
313
  <ConfirmDialog isOpen onConfirm={ onConfirm }>
@@ -323,7 +325,7 @@ describe( 'Confirm', () => {
323
325
  it( 'should call the `onCancel` callback if `Cancel` is clicked', async () => {
324
326
  const user = userEvent.setup();
325
327
 
326
- const onCancel = jest.fn().mockName( 'onCancel()' );
328
+ const onCancel = vi.fn().mockName( 'onCancel()' );
327
329
 
328
330
  render(
329
331
  <ConfirmDialog isOpen onConfirm={ noop } onCancel={ onCancel }>
@@ -340,7 +342,7 @@ describe( 'Confirm', () => {
340
342
 
341
343
  it( 'should call the `onCancel` callback if the overlay is clicked', async () => {
342
344
  const user = userEvent.setup();
343
- const onCancel = jest.fn().mockName( 'onCancel()' );
345
+ const onCancel = vi.fn().mockName( 'onCancel()' );
344
346
 
345
347
  render(
346
348
  <ConfirmDialog isOpen onConfirm={ noop } onCancel={ onCancel }>
@@ -360,7 +362,7 @@ describe( 'Confirm', () => {
360
362
  it( 'should call the `onCancel` callback if the `Escape` key is pressed', async () => {
361
363
  const user = userEvent.setup();
362
364
 
363
- const onCancel = jest.fn().mockName( 'onCancel()' );
365
+ const onCancel = vi.fn().mockName( 'onCancel()' );
364
366
 
365
367
  render(
366
368
  <ConfirmDialog onConfirm={ noop } onCancel={ onCancel }>
@@ -376,7 +378,7 @@ describe( 'Confirm', () => {
376
378
  it( 'should call the `onConfirm` callback if the `Enter` key is pressed', async () => {
377
379
  const user = userEvent.setup();
378
380
 
379
- const onConfirm = jest.fn().mockName( 'onConfirm()' );
381
+ const onConfirm = vi.fn().mockName( 'onConfirm()' );
380
382
 
381
383
  render(
382
384
  <ConfirmDialog isOpen onConfirm={ onConfirm } onCancel={ noop }>