@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,3 +1,4 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { render, screen, fireEvent } from '@testing-library/react';
2
3
  import ContentEditableControl from '..';
3
4
 
@@ -142,15 +143,15 @@ describe( 'ContentEditableControl', () => {
142
143
  it( 'forwards its ref to the contenteditable element', () => {
143
144
  // The rich-text wiring (the `useRichText` ref, event-listener refs,
144
145
  // an anchor ref, …) is injected through this forwarded ref.
145
- const ref = jest.fn();
146
+ const ref = vi.fn();
146
147
  render( <ContentEditableControl label="Note" ref={ ref } /> );
147
148
 
148
149
  expect( ref ).toHaveBeenCalledWith( screen.getByRole( 'textbox' ) );
149
150
  } );
150
151
 
151
152
  it( 'calls consumer-supplied focus and blur handlers', () => {
152
- const onFocus = jest.fn();
153
- const onBlur = jest.fn();
153
+ const onFocus = vi.fn();
154
+ const onBlur = vi.fn();
154
155
  render(
155
156
  <ContentEditableControl
156
157
  label="Field"
@@ -1,6 +1,7 @@
1
1
  import deepmerge from 'deepmerge';
2
2
  import fastDeepEqual from 'fast-deep-equal/es6/index.js';
3
3
  import { isPlainObject } from 'is-plain-object';
4
+ import type { ReactNode } from 'react';
4
5
  import {
5
6
  createContext,
6
7
  useContext,
@@ -11,9 +12,12 @@ import {
11
12
  import warn from '@wordpress/warning';
12
13
  import { useUpdateEffect } from '../utils';
13
14
 
14
- export const ComponentsContext = createContext(
15
- /** @type {Record<string, any>} */ ( {} )
16
- );
15
+ type ContextSystemValue = Record<
16
+ string,
17
+ Record< string, unknown > | undefined
18
+ >;
19
+
20
+ export const ComponentsContext = createContext< ContextSystemValue >( {} );
17
21
  ComponentsContext.displayName = 'ComponentsContext';
18
22
 
19
23
  export const useComponentsContext = () => useContext( ComponentsContext );
@@ -27,7 +31,11 @@ export const useComponentsContext = () => useContext( ComponentsContext );
27
31
  * @param {Record<string, any>} props.value
28
32
  * @return {Record<string, any>} The consolidated value.
29
33
  */
30
- function useContextSystemBridge( { value } ) {
34
+ function useContextSystemBridge( {
35
+ value,
36
+ }: {
37
+ value?: ContextSystemValue;
38
+ } ): ContextSystemValue {
31
39
  const parentContext = useComponentsContext();
32
40
 
33
41
  const valueRef = useRef( value );
@@ -82,7 +90,13 @@ function useContextSystemBridge( { value } ) {
82
90
  * @param {T} options.value Props to render into connected components.
83
91
  * @return {React.JSX.Element} A Provider wrapped component.
84
92
  */
85
- const BaseContextSystemProvider = ( { children, value } ) => {
93
+ const BaseContextSystemProvider = ( {
94
+ children,
95
+ value,
96
+ }: {
97
+ children: ReactNode;
98
+ value?: ContextSystemValue;
99
+ } ) => {
86
100
  const contextValue = useContextSystemBridge( { value } );
87
101
 
88
102
  return (
@@ -4,7 +4,7 @@ import { View } from '../../view';
4
4
  import { Text } from '../../text';
5
5
  import { ContextSystemProvider } from '../index';
6
6
 
7
- const SomeContext = createContext();
7
+ const SomeContext = createContext< number | undefined >( undefined );
8
8
  const useSomeContext = () => useContext( SomeContext );
9
9
 
10
10
  export default {
@@ -39,7 +39,7 @@ const innerContext = {
39
39
 
40
40
  const InnerContent = memo( () => {
41
41
  const state = useSomeContext();
42
- const isEven = state % 2 === 0;
42
+ const isEven = state !== undefined && state % 2 === 0;
43
43
  return (
44
44
  <View style={ { background: isEven ? 'red' : 'initial' } }>
45
45
  <Text>Card (inside innerContext)</Text>
@@ -1,9 +1,9 @@
1
+ import { describe, it } from 'vitest';
1
2
  import type { ForwardedRef } from 'react';
2
3
  import { contextConnect, contextConnectWithoutRef } from '../context-connect';
3
4
  import type { WordPressComponentProps } from '../wordpress-component';
4
5
 
5
6
  // Static TypeScript tests
6
- /* eslint-disable jest/expect-expect */
7
7
  describe( 'ref forwarding', () => {
8
8
  const ComponentWithRef = (
9
9
  props: WordPressComponentProps< {}, 'div' >,
@@ -47,4 +47,3 @@ describe( 'ref forwarding', () => {
47
47
  <NoRef foo={ null } />;
48
48
  } );
49
49
  } );
50
- /* eslint-enable jest/expect-expect */
@@ -1,41 +1,86 @@
1
+ import { describe, expect, test, vi } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import styled from '@emotion/styled';
4
+ import type {
5
+ ComponentPropsWithoutRef,
6
+ ForwardedRef,
7
+ ReactElement,
8
+ ReactNode,
9
+ } from 'react';
3
10
  import { cloneElement } from '@wordpress/element';
11
+ import warn from '@wordpress/warning';
4
12
  import { contextConnect } from '../context-connect';
5
13
  import { ContextSystemProvider } from '../context-system-provider';
6
14
  import { useContextSystem } from '../use-context-system';
7
15
 
16
+ vi.mock( import( '@wordpress/warning' ), () => ( { default: vi.fn() } ) );
17
+
8
18
  const View = styled.div``;
9
19
 
20
+ type TestComponentProps = ComponentPropsWithoutRef< 'div' > & {
21
+ quote?: ReactNode;
22
+ };
23
+
24
+ function TestComponent(
25
+ props: TestComponentProps,
26
+ ref: ForwardedRef< HTMLDivElement >
27
+ ) {
28
+ return <View { ...useContextSystem( props, 'Component' ) } ref={ ref } />;
29
+ }
30
+
31
+ function TestComponentWithQuote(
32
+ props: TestComponentProps,
33
+ ref: ForwardedRef< HTMLDivElement >
34
+ ) {
35
+ const { quote, ...otherProps } = useContextSystem( props, 'Component' );
36
+ return (
37
+ <View { ...otherProps } ref={ ref }>
38
+ { quote }
39
+ </View>
40
+ );
41
+ }
42
+
10
43
  describe( 'props', () => {
11
- test( 'should render correctly', () => {
12
- const Component = ( props, ref ) => (
13
- <View { ...useContextSystem( props, 'Component' ) } ref={ ref } />
44
+ test( 'should not warn when rerendered without a value', () => {
45
+ vi.mocked( warn ).mockClear();
46
+
47
+ const { rerender } = render(
48
+ <ContextSystemProvider>
49
+ <div />
50
+ </ContextSystemProvider>
14
51
  );
15
- const ConnectedComponent = contextConnect( Component, 'Component' );
16
- const { container } = render(
52
+
53
+ rerender(
17
54
  <ContextSystemProvider>
18
- <ConnectedComponent />
55
+ <div />
19
56
  </ContextSystemProvider>
20
57
  );
21
58
 
22
- expect( container ).toMatchSnapshot();
59
+ expect( warn ).not.toHaveBeenCalled();
23
60
  } );
24
61
 
25
- test( 'should render context props', () => {
26
- const Component = ( props, ref ) => {
27
- const { quote, ...otherProps } = useContextSystem(
28
- props,
29
- 'Component'
30
- );
31
- return (
32
- <View { ...otherProps } ref={ ref }>
33
- { quote }
34
- </View>
35
- );
36
- };
62
+ test( 'should render correctly', () => {
63
+ const ConnectedComponent = contextConnect( TestComponent, 'Component' );
64
+ render(
65
+ <ContextSystemProvider>
66
+ <ConnectedComponent data-testid="component" />
67
+ </ContextSystemProvider>
68
+ );
37
69
 
38
- const ConnectedComponent = contextConnect( Component, 'Component' );
70
+ expect( screen.getByTestId( 'component' ) ).toHaveClass(
71
+ 'components-component'
72
+ );
73
+ expect( screen.getByTestId( 'component' ) ).toHaveAttribute(
74
+ 'data-wp-component',
75
+ 'Component'
76
+ );
77
+ } );
78
+
79
+ test( 'should render context props', () => {
80
+ const ConnectedComponent = contextConnect(
81
+ TestComponentWithQuote,
82
+ 'Component'
83
+ );
39
84
 
40
85
  const contextValue = {
41
86
  Component: {
@@ -43,30 +88,20 @@ describe( 'props', () => {
43
88
  },
44
89
  };
45
90
 
46
- const { container } = render(
91
+ render(
47
92
  <ContextSystemProvider value={ contextValue }>
48
93
  <ConnectedComponent />
49
94
  </ContextSystemProvider>
50
95
  );
51
96
 
52
- expect( container ).toMatchSnapshot();
53
97
  expect( screen.getByText( 'Code is Poetry' ) ).toBeVisible();
54
98
  } );
55
99
 
56
100
  test( 'should render _override props', () => {
57
- const Component = ( props, ref ) => {
58
- const { quote, ...otherProps } = useContextSystem(
59
- props,
60
- 'Component'
61
- );
62
- return (
63
- <View { ...otherProps } ref={ ref }>
64
- { quote }
65
- </View>
66
- );
67
- };
68
-
69
- const ConnectedComponent = contextConnect( Component, 'Component' );
101
+ const ConnectedComponent = contextConnect(
102
+ TestComponentWithQuote,
103
+ 'Component'
104
+ );
70
105
 
71
106
  const contextValue = {
72
107
  Component: {
@@ -76,7 +111,7 @@ describe( 'props', () => {
76
111
  },
77
112
  };
78
113
 
79
- const { container } = render(
114
+ render(
80
115
  <>
81
116
  <ContextSystemProvider value={ contextValue }>
82
117
  <ConnectedComponent
@@ -87,8 +122,6 @@ describe( 'props', () => {
87
122
  </>
88
123
  );
89
124
 
90
- expect( container ).toMatchSnapshot();
91
-
92
125
  const element = screen.getByText( 'Code is Poetry' );
93
126
  expect( element ).toBeVisible();
94
127
  expect( element ).toHaveClass( 'test-component' );
@@ -99,10 +132,7 @@ describe( 'props', () => {
99
132
 
100
133
  describe( 'children', () => {
101
134
  test( 'should pass through children', () => {
102
- const Component = ( props, ref ) => (
103
- <View { ...useContextSystem( props, 'Component' ) } ref={ ref } />
104
- );
105
- const ConnectedComponent = contextConnect( Component, 'Component' );
135
+ const ConnectedComponent = contextConnect( TestComponent, 'Component' );
106
136
 
107
137
  render(
108
138
  <ContextSystemProvider>
@@ -114,13 +144,11 @@ describe( 'children', () => {
114
144
  } );
115
145
 
116
146
  test( 'should not accept children via `context`', () => {
117
- const Component = ( props, ref ) => (
118
- <View { ...useContextSystem( props, 'Component' ) } ref={ ref } />
119
- );
120
- const ConnectedComponent = contextConnect( Component, 'Component' );
147
+ const ConnectedComponent = contextConnect( TestComponent, 'Component' );
121
148
 
122
149
  render(
123
150
  <ContextSystemProvider
151
+ // @ts-expect-error Verify that the unsupported `context` prop is ignored.
124
152
  context={ { Component: { children: 'Override' } } }
125
153
  >
126
154
  <ConnectedComponent />
@@ -132,13 +160,18 @@ describe( 'children', () => {
132
160
 
133
161
  // This matches the behavior for normal, non-context-connected components.
134
162
  test( 'should not override inherent children', () => {
135
- const Component = ( props, ref ) => (
163
+ const Component = (
164
+ props: TestComponentProps,
165
+ ref: ForwardedRef< HTMLDivElement >
166
+ ) => (
136
167
  <View { ...useContextSystem( props, 'Component' ) } ref={ ref }>
137
168
  Inherent
138
169
  </View>
139
170
  );
140
171
  const ConnectedComponent = contextConnect( Component, 'Component' );
141
- const NormalComponent = ( props ) => <div { ...props }>Inherent</div>;
172
+ const NormalComponent = (
173
+ props: ComponentPropsWithoutRef< 'div' >
174
+ ) => <div { ...props }>Inherent</div>;
142
175
 
143
176
  render(
144
177
  <ContextSystemProvider>
@@ -153,12 +186,21 @@ describe( 'children', () => {
153
186
  } );
154
187
 
155
188
  describe( 'when connected component does a `cloneElement()`', () => {
156
- // eslint-disable-next-line no-unused-vars
157
- const ComponentThatClones = ( { content, ...props }, _ref ) =>
158
- cloneElement(
189
+ type CloneComponentProps = {
190
+ content: ReactElement;
191
+ children?: ReactNode;
192
+ className?: string;
193
+ };
194
+ const ComponentThatClones = (
195
+ { content, ...props }: CloneComponentProps,
196
+ ref: ForwardedRef< HTMLElement >
197
+ ) => {
198
+ void ref;
199
+ return cloneElement(
159
200
  content,
160
201
  useContextSystem( props, 'ComponentThatClones' )
161
202
  );
203
+ };
162
204
  const ConnectedComponentThatClones = contextConnect(
163
205
  ComponentThatClones,
164
206
  'ComponentThatClones'
@@ -1,9 +1,9 @@
1
+ import { describe, it } from 'vitest';
1
2
  import type { ForwardedRef } from 'react';
2
3
  import { forwardRef } from '@wordpress/element';
3
4
  import type { WordPressComponentProps } from '../wordpress-component';
4
5
 
5
6
  // Static TypeScript checks
6
- /* eslint-disable jest/expect-expect */
7
7
  describe( 'WordPressComponentProps', () => {
8
8
  it( 'should not accept a ref', () => {
9
9
  const Foo = ( props: WordPressComponentProps< {}, 'div' > ) => (
@@ -24,4 +24,3 @@ describe( 'WordPressComponentProps', () => {
24
24
  <ForwardedFoo ref={ null } />;
25
25
  } );
26
26
  } );
27
- /* eslint-enable jest/expect-expect */
@@ -33,11 +33,20 @@ export function useContextSystem( props, namespace ) {
33
33
  ...getNamespace( namespace ),
34
34
  };
35
35
 
36
- const { _overrides: overrideProps, ...otherContextProps } = contextProps;
36
+ const { _overrides, ...otherContextProps } = contextProps;
37
+ /** @type {Record<string, unknown>} */
38
+ const overrideProps = /** @type {Record<string, unknown>} */ ( _overrides );
37
39
 
38
40
  const initialMergedProps = Object.entries( otherContextProps ).length
39
41
  ? Object.assign( {}, otherContextProps, props )
40
42
  : props;
43
+ /**
44
+ * @type {P & {
45
+ * children?: React.ReactNode,
46
+ * renderChildren?: (props: P) => React.ReactNode
47
+ * }}
48
+ */
49
+ const propsWithChildren = initialMergedProps;
41
50
 
42
51
  const cx = useCx();
43
52
 
@@ -48,9 +57,9 @@ export function useContextSystem( props, namespace ) {
48
57
 
49
58
  // Provides the ability to customize the render of the component.
50
59
  const rendered =
51
- typeof initialMergedProps.renderChildren === 'function'
52
- ? initialMergedProps.renderChildren( initialMergedProps )
53
- : initialMergedProps.children;
60
+ typeof propsWithChildren.renderChildren === 'function'
61
+ ? propsWithChildren.renderChildren( initialMergedProps )
62
+ : propsWithChildren.children;
54
63
 
55
64
  for ( const key in initialMergedProps ) {
56
65
  // @ts-expect-error A string key cannot index the merged props type.
@@ -1,8 +1,9 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { getHorizontalRelativeGradientPosition } from '../utils';
2
3
 
3
4
  describe( 'getHorizontalRelativeGradientPosition', () => {
4
5
  it( 'should return relative percentage position', () => {
5
- jest.spyOn(
6
+ vi.spyOn(
6
7
  window.HTMLElement.prototype,
7
8
  'getBoundingClientRect'
8
9
  ).mockImplementationOnce(
@@ -20,7 +21,7 @@ describe( 'getHorizontalRelativeGradientPosition', () => {
20
21
  } );
21
22
 
22
23
  it( 'should subtract the x position of the container from the mouse position', () => {
23
- jest.spyOn(
24
+ vi.spyOn(
24
25
  window.HTMLElement.prototype,
25
26
  'getBoundingClientRect'
26
27
  ).mockImplementationOnce(
@@ -38,7 +39,7 @@ describe( 'getHorizontalRelativeGradientPosition', () => {
38
39
  } );
39
40
 
40
41
  it( 'should clamp to a whole percentage number', () => {
41
- jest.spyOn(
42
+ vi.spyOn(
42
43
  window.HTMLElement.prototype,
43
44
  'getBoundingClientRect'
44
45
  ).mockImplementationOnce(
@@ -57,7 +58,7 @@ describe( 'getHorizontalRelativeGradientPosition', () => {
57
58
  } );
58
59
 
59
60
  it( 'should clamp to zero when mouse position is less the x position', () => {
60
- jest.spyOn(
61
+ vi.spyOn(
61
62
  window.HTMLElement.prototype,
62
63
  'getBoundingClientRect'
63
64
  ).mockImplementationOnce(
@@ -75,7 +76,7 @@ describe( 'getHorizontalRelativeGradientPosition', () => {
75
76
  } );
76
77
 
77
78
  it( 'should clamp to 100 when mouse position is greater than width', () => {
78
- jest.spyOn(
79
+ vi.spyOn(
79
80
  window.HTMLElement.prototype,
80
81
  'getBoundingClientRect'
81
82
  ).mockImplementationOnce(
@@ -1,3 +1,4 @@
1
+ import { describe, expect, test } from 'vitest';
1
2
  import {
2
3
  serializeGradientColor,
3
4
  serializeGradientPosition,
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { screen } from '@testing-library/react';
2
3
  import { click, press, type } from '@ariakit/test';
3
4
  import { render } from '@ariakit/test/react';
@@ -5,6 +6,8 @@ import { useState } from '@wordpress/element';
5
6
  import UncontrolledCustomSelectControlV2 from '..';
6
7
  import type { CustomSelectProps } from '../types';
7
8
 
9
+ globalThis.wpVitest.mockMatchMedia();
10
+
8
11
  const items = [
9
12
  {
10
13
  key: 'flower1',
@@ -222,7 +225,7 @@ describe.each( [
222
225
 
223
226
  describe( 'Multiple selection', () => {
224
227
  it( 'Should be able to select multiple items when provided an array', async () => {
225
- const onChangeMock = jest.fn();
228
+ const onChangeMock = vi.fn();
226
229
 
227
230
  // initial selection as defaultValue
228
231
  const defaultValues = [
@@ -1,8 +1,11 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { format } from 'date-fns';
2
3
  import { render, screen } from '@testing-library/react';
3
4
  import userEvent from '@testing-library/user-event';
4
5
  import DatePicker from '..';
5
6
 
7
+ globalThis.wpVitest.mockMatchMedia();
8
+
6
9
  describe( 'DatePicker', () => {
7
10
  it( 'should highlight the current date', () => {
8
11
  render( <DatePicker currentDate="2022-05-02T11:00:00" /> );
@@ -26,7 +29,7 @@ describe( 'DatePicker', () => {
26
29
  it( 'should call onChange when a day is selected', async () => {
27
30
  const user = userEvent.setup();
28
31
 
29
- const onChange = jest.fn();
32
+ const onChange = vi.fn();
30
33
 
31
34
  render(
32
35
  <DatePicker
@@ -45,8 +48,8 @@ describe( 'DatePicker', () => {
45
48
  it( 'should call onMonthPreviewed and onChange when a day in a different month is selected', async () => {
46
49
  const user = userEvent.setup();
47
50
 
48
- const onMonthPreviewed = jest.fn();
49
- const onChange = jest.fn();
51
+ const onMonthPreviewed = vi.fn();
52
+ const onChange = vi.fn();
50
53
 
51
54
  render(
52
55
  <DatePicker
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { act, renderHook } from '@testing-library/react';
2
3
  import { addYears, getYear, set, startOfToday, subYears } from 'date-fns';
3
4
  import { Month, useLilius } from '../use-lilius';
@@ -1,9 +1,20 @@
1
+ import {
2
+ afterAll,
3
+ afterEach,
4
+ beforeAll,
5
+ describe,
6
+ expect,
7
+ it,
8
+ vi,
9
+ } from 'vitest';
1
10
  import { render, screen } from '@testing-library/react';
2
11
  import userEvent from '@testing-library/user-event';
3
12
  import timezoneMock from 'timezone-mock';
4
13
  import { getSettings, setSettings, type DateSettings } from '@wordpress/date';
5
14
  import DateTimePicker from '..';
6
15
 
16
+ globalThis.wpVitest.mockMatchMedia();
17
+
7
18
  describe( 'DateTimePicker', () => {
8
19
  let originalSettings: DateSettings;
9
20
  beforeAll( () => {
@@ -20,7 +31,7 @@ describe( 'DateTimePicker', () => {
20
31
  } );
21
32
 
22
33
  afterEach( () => {
23
- jest.restoreAllMocks();
34
+ vi.restoreAllMocks();
24
35
  timezoneMock.unregister();
25
36
  } );
26
37
 
@@ -30,7 +41,7 @@ describe( 'DateTimePicker', () => {
30
41
 
31
42
  it( 'should display and select dates correctly when timezones match', async () => {
32
43
  const user = userEvent.setup();
33
- const onChange = jest.fn();
44
+ const onChange = vi.fn();
34
45
 
35
46
  timezoneMock.register( 'US/Eastern' );
36
47
 
@@ -120,7 +131,7 @@ describe( 'DateTimePicker', () => {
120
131
  } ) => {
121
132
  it( 'should display and select dates correctly', async () => {
122
133
  const user = userEvent.setup();
123
- const onChange = jest.fn();
134
+ const onChange = vi.fn();
124
135
 
125
136
  timezoneMock.register( timezone );
126
137
 
@@ -196,7 +207,7 @@ describe( 'DateTimePicker', () => {
196
207
 
197
208
  describe( 'input types with timezone variations', () => {
198
209
  afterEach( () => {
199
- jest.useRealTimers();
210
+ vi.useRealTimers();
200
211
  timezoneMock.unregister();
201
212
  } );
202
213
 
@@ -268,16 +279,14 @@ describe( 'DateTimePicker', () => {
268
279
  // set initial dates.
269
280
  let user: ReturnType< typeof userEvent.setup >;
270
281
  if ( initialDate === undefined ) {
271
- jest.useFakeTimers();
272
- jest.setSystemTime( Date.UTC( 2025, 10, 16, 1, 0, 0 ) );
273
- user = userEvent.setup( {
274
- advanceTimers: jest.advanceTimersByTime,
275
- } );
282
+ vi.useFakeTimers( { toFake: [ 'Date' ] } );
283
+ vi.setSystemTime( Date.UTC( 2025, 10, 16, 1, 0, 0 ) );
284
+ user = userEvent.setup();
276
285
  } else {
277
286
  user = userEvent.setup();
278
287
  }
279
288
 
280
- const onChange = jest.fn();
289
+ const onChange = vi.fn();
281
290
  const { rerender } = render(
282
291
  <DateTimePicker
283
292
  currentDate={ initialDate }
@@ -392,7 +401,7 @@ describe( 'DateTimePicker', () => {
392
401
 
393
402
  it( 'should preserve time when changing date', async () => {
394
403
  const user = userEvent.setup();
395
- const onChange = jest.fn();
404
+ const onChange = vi.fn();
396
405
 
397
406
  timezoneMock.register( 'UTC' );
398
407
 
@@ -1,3 +1,12 @@
1
+ import {
2
+ afterAll,
3
+ afterEach,
4
+ beforeAll,
5
+ beforeEach,
6
+ describe,
7
+ expect,
8
+ it,
9
+ } from 'vitest';
1
10
  import timezoneMock from 'timezone-mock';
2
11
  import { getSettings, setSettings, type DateSettings } from '@wordpress/date';
3
12
  import { inputToDate, getDaysInMonth } from '../utils';