@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,14 +1,28 @@
1
+ import {
2
+ afterAll,
3
+ afterEach,
4
+ beforeAll,
5
+ beforeEach,
6
+ describe,
7
+ expect,
8
+ it,
9
+ vi,
10
+ } from 'vitest';
1
11
  import { render, screen } from '@testing-library/react';
2
12
  import userEvent from '@testing-library/user-event';
3
13
  import timezoneMock from 'timezone-mock';
4
14
  import { getSettings, setSettings, type DateSettings } from '@wordpress/date';
5
15
  import TimePicker from '..';
6
16
 
17
+ globalThis.wpVitest.mockMatchMedia();
18
+
19
+ globalThis.wpVitest.mockResizeObserver();
20
+
7
21
  describe( 'TimePicker', () => {
8
22
  it( 'should call onChange with updated date values', async () => {
9
23
  const user = userEvent.setup();
10
24
 
11
- const onChangeSpy = jest.fn();
25
+ const onChangeSpy = vi.fn();
12
26
 
13
27
  render(
14
28
  <TimePicker
@@ -62,7 +76,7 @@ describe( 'TimePicker', () => {
62
76
  it( 'should call onChange with an updated hour (12-hour clock)', async () => {
63
77
  const user = userEvent.setup();
64
78
 
65
- const onChangeSpy = jest.fn();
79
+ const onChangeSpy = vi.fn();
66
80
 
67
81
  render(
68
82
  <TimePicker
@@ -84,7 +98,7 @@ describe( 'TimePicker', () => {
84
98
  it( 'should call onChange with a bounded hour (12-hour clock) if the hour is out of bounds', async () => {
85
99
  const user = userEvent.setup();
86
100
 
87
- const onChangeSpy = jest.fn();
101
+ const onChangeSpy = vi.fn();
88
102
 
89
103
  render(
90
104
  <TimePicker
@@ -106,7 +120,7 @@ describe( 'TimePicker', () => {
106
120
  it( 'should call onChange with an updated hour (24-hour clock)', async () => {
107
121
  const user = userEvent.setup();
108
122
 
109
- const onChangeSpy = jest.fn();
123
+ const onChangeSpy = vi.fn();
110
124
 
111
125
  render(
112
126
  <TimePicker
@@ -128,7 +142,7 @@ describe( 'TimePicker', () => {
128
142
  it( 'should call onChange with a bounded minute if out of bounds', async () => {
129
143
  const user = userEvent.setup();
130
144
 
131
- const onChangeSpy = jest.fn();
145
+ const onChangeSpy = vi.fn();
132
146
 
133
147
  render(
134
148
  <TimePicker
@@ -150,7 +164,7 @@ describe( 'TimePicker', () => {
150
164
  it( 'should call onChange with a bounded day if out of bounds', async () => {
151
165
  const user = userEvent.setup();
152
166
 
153
- const onChangeSpy = jest.fn();
167
+ const onChangeSpy = vi.fn();
154
168
 
155
169
  render(
156
170
  <TimePicker
@@ -173,7 +187,7 @@ describe( 'TimePicker', () => {
173
187
  it( 'should clamp day when switching months', async () => {
174
188
  const user = userEvent.setup();
175
189
 
176
- const onChangeSpy = jest.fn();
190
+ const onChangeSpy = vi.fn();
177
191
 
178
192
  render(
179
193
  <TimePicker
@@ -195,7 +209,7 @@ describe( 'TimePicker', () => {
195
209
  it( 'should clamp day when switching year from leap to non-leap', async () => {
196
210
  const user = userEvent.setup();
197
211
 
198
- const onChangeSpy = jest.fn();
212
+ const onChangeSpy = vi.fn();
199
213
 
200
214
  render(
201
215
  <TimePicker
@@ -219,7 +233,7 @@ describe( 'TimePicker', () => {
219
233
  it( 'should switch to PM correctly', async () => {
220
234
  const user = userEvent.setup();
221
235
 
222
- const onChangeSpy = jest.fn();
236
+ const onChangeSpy = vi.fn();
223
237
 
224
238
  render(
225
239
  <TimePicker
@@ -239,7 +253,7 @@ describe( 'TimePicker', () => {
239
253
  it( 'should switch to AM correctly', async () => {
240
254
  const user = userEvent.setup();
241
255
 
242
- const onChangeSpy = jest.fn();
256
+ const onChangeSpy = vi.fn();
243
257
 
244
258
  render(
245
259
  <TimePicker
@@ -259,7 +273,7 @@ describe( 'TimePicker', () => {
259
273
  it( 'should allow to set the time correctly when the PM period is selected', async () => {
260
274
  const user = userEvent.setup();
261
275
 
262
- const onChangeSpy = jest.fn();
276
+ const onChangeSpy = vi.fn();
263
277
 
264
278
  render(
265
279
  <TimePicker
@@ -292,7 +306,7 @@ describe( 'TimePicker', () => {
292
306
  it( 'should truncate at the minutes on change', async () => {
293
307
  const user = userEvent.setup();
294
308
 
295
- const onChangeSpy = jest.fn();
309
+ const onChangeSpy = vi.fn();
296
310
 
297
311
  render(
298
312
  <TimePicker
@@ -312,7 +326,7 @@ describe( 'TimePicker', () => {
312
326
  } );
313
327
 
314
328
  it( 'should reset the date when currentTime changed', () => {
315
- const onChangeSpy = jest.fn();
329
+ const onChangeSpy = vi.fn();
316
330
 
317
331
  const { rerender } = render(
318
332
  <TimePicker
@@ -351,7 +365,7 @@ describe( 'TimePicker', () => {
351
365
  } );
352
366
 
353
367
  it( 'should have different layouts/orders for 12/24 hour formats', () => {
354
- const onChangeSpy = jest.fn();
368
+ const onChangeSpy = vi.fn();
355
369
 
356
370
  const { rerender } = render(
357
371
  <form aria-label="form">
@@ -395,7 +409,7 @@ describe( 'TimePicker', () => {
395
409
  } );
396
410
 
397
411
  it( 'Should change layouts/orders when `dateOrder` prop is passed', () => {
398
- const onChangeSpy = jest.fn();
412
+ const onChangeSpy = vi.fn();
399
413
 
400
414
  render(
401
415
  <form aria-label="form">
@@ -425,7 +439,7 @@ describe( 'TimePicker', () => {
425
439
  } );
426
440
 
427
441
  it( 'Should ignore `is12Hour` prop setting when `dateOrder` prop is explicitly passed', () => {
428
- const onChangeSpy = jest.fn();
442
+ const onChangeSpy = vi.fn();
429
443
 
430
444
  render(
431
445
  <form aria-label="form">
@@ -456,7 +470,7 @@ describe( 'TimePicker', () => {
456
470
  } );
457
471
 
458
472
  it( 'Should set a time when passed a null currentTime', () => {
459
- const onChangeSpy = jest.fn();
473
+ const onChangeSpy = vi.fn();
460
474
 
461
475
  render(
462
476
  <TimePicker
@@ -505,7 +519,7 @@ describe( 'TimePicker', () => {
505
519
  } );
506
520
 
507
521
  afterEach( () => {
508
- jest.useRealTimers();
522
+ vi.useRealTimers();
509
523
  timezoneMock.unregister();
510
524
  } );
511
525
 
@@ -576,19 +590,15 @@ describe( 'TimePicker', () => {
576
590
  // For undefined, set fake system time to get a known current time
577
591
  let user: ReturnType< typeof userEvent.setup >;
578
592
  if ( initialTime === undefined ) {
579
- jest.useFakeTimers();
593
+ vi.useFakeTimers( { toFake: [ 'Date' ] } );
580
594
  // Set system time to 12:00 UTC
581
- jest.setSystemTime(
582
- Date.UTC( 2025, 11, 18, 12, 0, 0 )
583
- );
584
- user = userEvent.setup( {
585
- advanceTimers: jest.advanceTimersByTime,
586
- } );
595
+ vi.setSystemTime( Date.UTC( 2025, 11, 18, 12, 0, 0 ) );
596
+ user = userEvent.setup();
587
597
  } else {
588
598
  user = userEvent.setup();
589
599
  }
590
600
 
591
- const onChange = jest.fn();
601
+ const onChange = vi.fn();
592
602
 
593
603
  const { rerender } = render(
594
604
  <TimePicker
@@ -653,7 +663,7 @@ describe( 'TimePicker', () => {
653
663
  describe( 'ISO 8601 compliance', () => {
654
664
  it( 'should handle years below 1000 with zero-padded output', async () => {
655
665
  const user = userEvent.setup();
656
- const onChangeSpy = jest.fn();
666
+ const onChangeSpy = vi.fn();
657
667
 
658
668
  render(
659
669
  <TimePicker
@@ -1,13 +1,18 @@
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 TimeInput from '..';
4
5
 
6
+ globalThis.wpVitest.mockMatchMedia();
7
+
8
+ globalThis.wpVitest.mockResizeObserver();
9
+
5
10
  describe( 'TimeInput', () => {
6
11
  it( 'should call onChange with updated values | 24-hours format', async () => {
7
12
  const user = userEvent.setup();
8
13
 
9
14
  const timeInputValue = { hours: 0, minutes: 0 };
10
- const onChangeSpy = jest.fn();
15
+ const onChangeSpy = vi.fn();
11
16
 
12
17
  render(
13
18
  <TimeInput
@@ -59,7 +64,7 @@ describe( 'TimeInput', () => {
59
64
  const user = userEvent.setup();
60
65
 
61
66
  const timeInputValue = { hours: 0, minutes: 0 };
62
- const onChangeSpy = jest.fn();
67
+ const onChangeSpy = vi.fn();
63
68
 
64
69
  render(
65
70
  <TimeInput
@@ -106,7 +111,7 @@ describe( 'TimeInput', () => {
106
111
  const user = userEvent.setup();
107
112
 
108
113
  const timeInputValue = { hours: 0, minutes: 0 };
109
- const onChangeSpy = jest.fn();
114
+ const onChangeSpy = vi.fn();
110
115
 
111
116
  render(
112
117
  <TimeInput
@@ -59,14 +59,14 @@ function Disabled( {
59
59
  <div
60
60
  // @ts-expect-error `inert` is not declared in React 18's HTML attribute types.
61
61
  inert={ isDisabled ? 'true' : undefined }
62
+ // Only the disabled styling is conditional. The consumer's own
63
+ // className has to stick around so the wrapper stays targetable
64
+ // whether or not it is currently disabled.
62
65
  className={
63
- isDisabled
64
- ? clsx(
65
- styles.disabled,
66
- className,
67
- 'components-disabled'
68
- )
69
- : undefined
66
+ clsx(
67
+ className,
68
+ isDisabled && [ styles.disabled, 'components-disabled' ]
69
+ ) || undefined
70
70
  }
71
71
  { ...props }
72
72
  >
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it, test } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import Disabled from '../';
@@ -67,6 +68,31 @@ describe( 'Disabled', () => {
67
68
  );
68
69
  } );
69
70
 
71
+ it( 'keeps the consumer className and toggles only the disabled classes', () => {
72
+ const MaybeDisable = ( { isDisabled = true } ) => (
73
+ <Disabled
74
+ isDisabled={ isDisabled }
75
+ className="my-wrapper"
76
+ data-testid="disabled-wrapper"
77
+ >
78
+ <Form />
79
+ </Disabled>
80
+ );
81
+
82
+ const { rerender } = render( <MaybeDisable /> );
83
+
84
+ const wrapper = screen.getByTestId( 'disabled-wrapper' );
85
+ expect( wrapper ).toHaveClass( 'my-wrapper' );
86
+ expect( wrapper ).toHaveClass( 'components-disabled' );
87
+ expect( wrapper ).toHaveClass( styles.disabled );
88
+
89
+ rerender( <MaybeDisable isDisabled={ false } /> );
90
+
91
+ expect( wrapper ).toHaveClass( 'my-wrapper' );
92
+ expect( wrapper ).not.toHaveClass( 'components-disabled' );
93
+ expect( wrapper ).not.toHaveClass( styles.disabled );
94
+ } );
95
+
70
96
  it( 'should preserve input values when toggling the isDisabled prop', async () => {
71
97
  const user = userEvent.setup();
72
98
 
@@ -6,7 +6,7 @@ import type { DraggableProps } from './types';
6
6
  import styles from './style.module.scss';
7
7
 
8
8
  // Legacy class names preserved alongside the CSS-module hashed ones for
9
- // backwards compatibility. `filter(Boolean)` strips `undefined` from Jest's
9
+ // backwards compatibility. `filter(Boolean)` strips `undefined` from the
10
10
  // CSS-module mock.
11
11
  const dragImageClasses = [
12
12
  styles[ 'invisible-drag-image' ],
@@ -2,7 +2,7 @@
2
2
 
3
3
  .invisible-drag-image {
4
4
  position: fixed;
5
- /* stylelint-disable-next-line plugin/use-logical-properties-and-values -- Offscreen drag-image stand-in; flipping with writing direction has no benefit. */
5
+ /* stylelint-disable-next-line logical-css/require-logical-properties -- Offscreen drag-image stand-in; flipping with writing direction has no benefit. */
6
6
  left: -1000px;
7
7
  height: 50px;
8
8
  width: 50px;
@@ -2,7 +2,7 @@
2
2
 
3
3
  .content-wrapper {
4
4
  // Negative margin to reset (offset) the default padding on .components-popover__content.
5
- /* stylelint-disable plugin/use-logical-properties-and-values -- Preserve the previous physical offsets against Popover padding. */
5
+ /* stylelint-disable logical-css/require-logical-properties -- Preserve the previous physical offsets against Popover padding. */
6
6
  margin-left: -$grid-unit-10;
7
7
  margin-right: -$grid-unit-10;
8
8
 
@@ -13,7 +13,7 @@
13
13
  &:last-of-type {
14
14
  margin-bottom: -$grid-unit-10;
15
15
  }
16
- /* stylelint-enable plugin/use-logical-properties-and-values */
16
+ /* stylelint-enable logical-css/require-logical-properties */
17
17
  }
18
18
 
19
19
  .padding-small {
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { render, screen, waitFor } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import Dropdown from '..';
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { render, screen, waitFor, within } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { arrowLeft, arrowRight, arrowUp, arrowDown } from '@wordpress/icons';
@@ -26,22 +27,22 @@ describe( 'DropdownMenu', () => {
26
27
  {
27
28
  title: 'Up',
28
29
  icon: arrowUp,
29
- onClick: jest.fn(),
30
+ onClick: vi.fn(),
30
31
  },
31
32
  {
32
33
  title: 'Right',
33
34
  icon: arrowRight,
34
- onClick: jest.fn(),
35
+ onClick: vi.fn(),
35
36
  },
36
37
  {
37
38
  title: 'Down',
38
39
  icon: arrowDown,
39
- onClick: jest.fn(),
40
+ onClick: vi.fn(),
40
41
  },
41
42
  {
42
43
  title: 'Left',
43
44
  icon: arrowLeft,
44
- onClick: jest.fn(),
45
+ onClick: vi.fn(),
45
46
  },
46
47
  ];
47
48
 
@@ -1,12 +1,15 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { fireEvent, render, screen } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import CustomDuotoneBar from '../custom-duotone-bar';
4
5
 
6
+ globalThis.wpVitest.mockMatchMedia();
7
+
5
8
  const VALUE = [ '#000000', '#ffffff' ];
6
9
 
7
10
  describe( 'CustomDuotoneBar', () => {
8
11
  it( 'does not offer to reposition control points, since a duotone has no positions to save', () => {
9
- render( <CustomDuotoneBar value={ VALUE } onChange={ jest.fn() } /> );
12
+ render( <CustomDuotoneBar value={ VALUE } onChange={ vi.fn() } /> );
10
13
 
11
14
  const [ firstPoint ] = screen.getAllByRole( 'button', {
12
15
  name: /Gradient control point/,
@@ -22,7 +25,7 @@ describe( 'CustomDuotoneBar', () => {
22
25
 
23
26
  it( 'ignores arrow keys on a control point', async () => {
24
27
  const user = userEvent.setup();
25
- const onChange = jest.fn();
28
+ const onChange = vi.fn();
26
29
 
27
30
  render( <CustomDuotoneBar value={ VALUE } onChange={ onChange } /> );
28
31
 
@@ -36,7 +39,7 @@ describe( 'CustomDuotoneBar', () => {
36
39
  } );
37
40
 
38
41
  it( 'ignores dragging a control point', () => {
39
- const onChange = jest.fn();
42
+ const onChange = vi.fn();
40
43
 
41
44
  render( <CustomDuotoneBar value={ VALUE } onChange={ onChange } /> );
42
45
 
@@ -56,12 +59,12 @@ describe( 'CustomDuotoneBar', () => {
56
59
  // gradient bar's own `stopPropagation` guards against.
57
60
  it( 'does not let arrow keys bubble out of the control', async () => {
58
61
  const user = userEvent.setup();
59
- const onAncestorKeyDown = jest.fn();
62
+ const onAncestorKeyDown = vi.fn();
60
63
 
61
64
  render(
62
65
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions
63
66
  <div onKeyDown={ onAncestorKeyDown }>
64
- <CustomDuotoneBar value={ VALUE } onChange={ jest.fn() } />
67
+ <CustomDuotoneBar value={ VALUE } onChange={ vi.fn() } />
65
68
  </div>
66
69
  );
67
70
 
@@ -79,7 +82,7 @@ describe( 'CustomDuotoneBar', () => {
79
82
  it( 'still opens the color picker when a control point is clicked', async () => {
80
83
  const user = userEvent.setup();
81
84
 
82
- render( <CustomDuotoneBar value={ VALUE } onChange={ jest.fn() } /> );
85
+ render( <CustomDuotoneBar value={ VALUE } onChange={ vi.fn() } /> );
83
86
 
84
87
  await user.click(
85
88
  screen.getAllByRole( 'button', {
@@ -94,12 +97,12 @@ describe( 'CustomDuotoneBar', () => {
94
97
 
95
98
  it( 'still lets other keys bubble', async () => {
96
99
  const user = userEvent.setup();
97
- const onAncestorKeyDown = jest.fn();
100
+ const onAncestorKeyDown = vi.fn();
98
101
 
99
102
  render(
100
103
  // eslint-disable-next-line jsx-a11y/no-static-element-interactions
101
104
  <div onKeyDown={ onAncestorKeyDown }>
102
- <CustomDuotoneBar value={ VALUE } onChange={ jest.fn() } />
105
+ <CustomDuotoneBar value={ VALUE } onChange={ vi.fn() } />
103
106
  </div>
104
107
  );
105
108
 
@@ -1,3 +1,4 @@
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';
@@ -23,7 +24,7 @@ const COLOR_PALETTE = [
23
24
  describe( 'DuotonePicker', () => {
24
25
  it( 'should use matching values only for display in command button presentation', async () => {
25
26
  const user = userEvent.setup();
26
- const onChange = jest.fn();
27
+ const onChange = vi.fn();
27
28
  render(
28
29
  <DuotonePicker
29
30
  aria-label="Duotones"
@@ -63,7 +64,7 @@ describe( 'DuotonePicker', () => {
63
64
  aria-label="Duotones"
64
65
  duotonePalette={ DUPLICATE_DUOTONES }
65
66
  colorPalette={ COLOR_PALETTE }
66
- onChange={ jest.fn() }
67
+ onChange={ vi.fn() }
67
68
  asButtons={ false }
68
69
  presentation="command-buttons"
69
70
  disableCustomDuotone
@@ -89,7 +90,7 @@ describe( 'DuotonePicker', () => {
89
90
  colorPalette={ COLOR_PALETTE }
90
91
  value={ COLORS_A }
91
92
  selectedSlug="dark-background"
92
- onChange={ jest.fn() }
93
+ onChange={ vi.fn() }
93
94
  asButtons
94
95
  unsetable={ false }
95
96
  clearable={ false }
@@ -120,7 +121,7 @@ describe( 'DuotonePicker', () => {
120
121
  duotonePalette={ DUPLICATE_DUOTONES }
121
122
  colorPalette={ COLOR_PALETTE }
122
123
  value={ undefined }
123
- onChange={ jest.fn() }
124
+ onChange={ vi.fn() }
124
125
  disableCustomDuotone
125
126
  disableCustomColors
126
127
  />
@@ -137,7 +138,7 @@ describe( 'DuotonePicker', () => {
137
138
  colorPalette={ COLOR_PALETTE }
138
139
  value={ COLORS_A }
139
140
  selectedSlug="dark-text"
140
- onChange={ jest.fn() }
141
+ onChange={ vi.fn() }
141
142
  unsetable={ false }
142
143
  disableCustomDuotone
143
144
  disableCustomColors
@@ -157,7 +158,7 @@ describe( 'DuotonePicker', () => {
157
158
  duotonePalette={ DUPLICATE_DUOTONES }
158
159
  colorPalette={ COLOR_PALETTE }
159
160
  value={ COLORS_A }
160
- onChange={ jest.fn() }
161
+ onChange={ vi.fn() }
161
162
  unsetable={ false }
162
163
  disableCustomDuotone
163
164
  disableCustomColors
@@ -177,7 +178,7 @@ describe( 'DuotonePicker', () => {
177
178
  colorPalette={ COLOR_PALETTE }
178
179
  value={ COLORS_A }
179
180
  selectedSlug=""
180
- onChange={ jest.fn() }
181
+ onChange={ vi.fn() }
181
182
  unsetable={ false }
182
183
  disableCustomDuotone
183
184
  disableCustomColors
@@ -191,7 +192,7 @@ describe( 'DuotonePicker', () => {
191
192
 
192
193
  it( 'should pass index and slug to onChange when a swatch is clicked', async () => {
193
194
  const user = userEvent.setup();
194
- const onChange = jest.fn();
195
+ const onChange = vi.fn();
195
196
 
196
197
  render(
197
198
  <DuotonePicker
@@ -215,7 +216,7 @@ describe( 'DuotonePicker', () => {
215
216
 
216
217
  it( 'should clear only the selected preset, identified by slug', async () => {
217
218
  const user = userEvent.setup();
218
- const onChange = jest.fn();
219
+ const onChange = vi.fn();
219
220
 
220
221
  render(
221
222
  <DuotonePicker
@@ -331,7 +332,7 @@ describe( 'DuotonePicker', () => {
331
332
  ] }
332
333
  colorPalette={ COLOR_PALETTE }
333
334
  value={ COLORS_B }
334
- onChange={ jest.fn() }
335
+ onChange={ vi.fn() }
335
336
  unsetable={ false }
336
337
  disableCustomDuotone
337
338
  disableCustomColors
@@ -1,3 +1,4 @@
1
+ import { describe, expect, 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 { ExternalLink } from '..';
@@ -5,7 +6,7 @@ import { ExternalLink } from '..';
5
6
  describe( 'ExternalLink', () => {
6
7
  test( 'should call function passed in onClick handler when clicking the link', async () => {
7
8
  const user = await userEvent.setup();
8
- const onClickMock = jest.fn();
9
+ const onClickMock = vi.fn();
9
10
 
10
11
  render(
11
12
  <ExternalLink href="https://wordpress.org" onClick={ onClickMock }>
@@ -35,7 +36,7 @@ describe( 'ExternalLink', () => {
35
36
 
36
37
  // We are using this approach so we can test the defaultPrevented
37
38
  // without passing an onClick prop to the component.
38
- const onClickMock = jest.fn();
39
+ const onClickMock = vi.fn();
39
40
  link.onclick = onClickMock;
40
41
 
41
42
  await user.click( link );
@@ -47,7 +48,7 @@ describe( 'ExternalLink', () => {
47
48
 
48
49
  test( 'should call function passed in onClick handler and prevent default action when clicking an internal anchor link', async () => {
49
50
  const user = await userEvent.setup();
50
- const onClickMock = jest.fn();
51
+ const onClickMock = vi.fn();
51
52
 
52
53
  render(
53
54
  <ExternalLink href="#test" onClick={ onClickMock }>
@@ -81,7 +82,7 @@ describe( 'ExternalLink', () => {
81
82
 
82
83
  // We are using this approach so we can test the defaultPrevented
83
84
  // without passing an onClick prop to the component.
84
- const onClickMock = jest.fn();
85
+ const onClickMock = vi.fn();
85
86
  link.onclick = onClickMock;
86
87
 
87
88
  await user.click( link );
@@ -1,8 +1,11 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { fireEvent, render, screen } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import _Picker from '..';
4
5
  import type { FocalPointPickerProps } from '../types';
5
6
 
7
+ globalThis.wpVitest.mockMatchMedia();
8
+
6
9
  type Log = { name: string; args: unknown[] };
7
10
  type EventLogger = ( name: string, args: unknown[] ) => void;
8
11
 
@@ -11,7 +14,7 @@ const Picker = ( props: React.ComponentProps< typeof _Picker > ) => {
11
14
  };
12
15
 
13
16
  const props: FocalPointPickerProps = {
14
- onChange: jest.fn(),
17
+ onChange: vi.fn(),
15
18
  url: 'test-url',
16
19
  value: {
17
20
  x: 0,
@@ -24,7 +27,7 @@ describe( 'FocalPointPicker', () => {
24
27
  it( 'clicking the draggable area should focus it', async () => {
25
28
  const user = userEvent.setup();
26
29
 
27
- const mockOnChange = jest.fn();
30
+ const mockOnChange = vi.fn();
28
31
 
29
32
  render( <Picker { ...props } onChange={ mockOnChange } /> );
30
33
 
@@ -36,9 +39,9 @@ describe( 'FocalPointPicker', () => {
36
39
  } );
37
40
 
38
41
  it( 'should stop a drag operation when focus is lost', () => {
39
- const mockOnDrag = jest.fn();
40
- const mockOnDragEnd = jest.fn();
41
- const mockOnChange = jest.fn();
42
+ const mockOnDrag = vi.fn();
43
+ const mockOnDragEnd = vi.fn();
44
+ const mockOnChange = vi.fn();
42
45
 
43
46
  render(
44
47
  <Picker
@@ -99,8 +102,8 @@ describe( 'FocalPointPicker', () => {
99
102
  it( 'should allow value altering', async () => {
100
103
  const user = userEvent.setup();
101
104
 
102
- const spyChange = jest.fn();
103
- const spy = jest.fn();
105
+ const spyChange = vi.fn();
106
+ const spy = vi.fn();
104
107
 
105
108
  render(
106
109
  <Picker
@@ -142,7 +145,7 @@ describe( 'FocalPointPicker', () => {
142
145
  it( 'call onChange with the expected values', async () => {
143
146
  const user = userEvent.setup();
144
147
 
145
- const spyChange = jest.fn();
148
+ const spyChange = vi.fn();
146
149
  render(
147
150
  <Picker
148
151
  { ...props }
@@ -165,7 +168,7 @@ describe( 'FocalPointPicker', () => {
165
168
 
166
169
  describe( 'value handling', () => {
167
170
  it( 'should handle legacy string values', () => {
168
- const onChangeSpy = jest.fn();
171
+ const onChangeSpy = vi.fn();
169
172
  render(
170
173
  <Picker
171
174
  { ...props }
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import Media from '../media';
3
4
  import type { FocalPointPickerMediaProps } from '../types';