@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,9 +1,11 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { fireEvent, render, screen } from '@testing-library/react';
2
3
  import { LEFT, RIGHT, UP, DOWN, HOME, END } from '@wordpress/keycodes';
3
4
  import { forwardRef } from '@wordpress/element';
4
5
  import TreeGrid from '..';
5
6
  import TreeGridRow from '../row';
6
7
  import TreeGridCell from '../cell';
8
+ globalThis.wpVitest.mockVisibleElements();
7
9
 
8
10
  const TestButton = forwardRef(
9
11
  (
@@ -29,7 +31,7 @@ describe( 'TreeGrid', () => {
29
31
 
30
32
  describe( 'onExpandRow', () => {
31
33
  it( 'should call onExpandRow when pressing Right Arrow on a collapsed row', () => {
32
- const onExpandRow = jest.fn();
34
+ const onExpandRow = vi.fn();
33
35
 
34
36
  render(
35
37
  <TreeGrid onExpandRow={ onExpandRow }>
@@ -81,7 +83,7 @@ describe( 'TreeGrid', () => {
81
83
 
82
84
  describe( 'onCollapseRow', () => {
83
85
  it( 'should call onCollapseRow when pressing Left Arrow on an expanded row', () => {
84
- const onCollapseRow = jest.fn();
86
+ const onCollapseRow = vi.fn();
85
87
 
86
88
  render(
87
89
  <TreeGrid onCollapseRow={ onCollapseRow }>
@@ -157,7 +159,7 @@ describe( 'TreeGrid', () => {
157
159
  );
158
160
 
159
161
  it( 'should call onFocusRow with event, start and end nodes when pressing Down Arrow', () => {
160
- const onFocusRow = jest.fn();
162
+ const onFocusRow = vi.fn();
161
163
  render( <TestTree onFocusRow={ onFocusRow } /> );
162
164
 
163
165
  screen.getByText( 'Row 2' ).focus();
@@ -179,7 +181,7 @@ describe( 'TreeGrid', () => {
179
181
  } );
180
182
 
181
183
  it( 'should call onFocusRow with event, start and end nodes when pressing End', () => {
182
- const onFocusRow = jest.fn();
184
+ const onFocusRow = vi.fn();
183
185
  render( <TestTree onFocusRow={ onFocusRow } /> );
184
186
 
185
187
  screen.getByText( 'Row 1' ).focus();
@@ -201,7 +203,7 @@ describe( 'TreeGrid', () => {
201
203
  } );
202
204
 
203
205
  it( 'should call onFocusRow with event, start and end nodes when pressing Up Arrow', () => {
204
- const onFocusRow = jest.fn();
206
+ const onFocusRow = vi.fn();
205
207
  render( <TestTree onFocusRow={ onFocusRow } /> );
206
208
 
207
209
  screen.getByText( 'Row 2' ).focus();
@@ -223,7 +225,7 @@ describe( 'TreeGrid', () => {
223
225
  } );
224
226
 
225
227
  it( 'should call onFocusRow with event, start and end nodes when pressing Home', () => {
226
- const onFocusRow = jest.fn();
228
+ const onFocusRow = vi.fn();
227
229
  render( <TestTree onFocusRow={ onFocusRow } /> );
228
230
 
229
231
  screen.getByText( 'Row 3' ).focus();
@@ -245,7 +247,7 @@ describe( 'TreeGrid', () => {
245
247
  } );
246
248
 
247
249
  it( 'should call onFocusRow when shift key is held', () => {
248
- const onFocusRow = jest.fn();
250
+ const onFocusRow = vi.fn();
249
251
  render( <TestTree onFocusRow={ onFocusRow } /> );
250
252
 
251
253
  screen.getByText( 'Row 2' ).focus();
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { render } from '@testing-library/react';
2
3
  import { forwardRef } from '@wordpress/element';
3
4
  import RovingTabIndex from '../roving-tab-index';
@@ -14,7 +15,9 @@ describe( 'RovingTabIndexItem', () => {
14
15
  it( 'requires RovingTabIndex to be declared as a parent component somewhere in the component hierarchy', () => {
15
16
  expect( () =>
16
17
  render( <RovingTabIndexItem as={ TestButton } /> )
17
- ).toThrow();
18
+ ).toThrow(
19
+ 'TreeGridItem can only be rendered inside a TreeGrid component.'
20
+ );
18
21
  expect( console ).toHaveErrored();
19
22
  } );
20
23
 
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { render } from '@testing-library/react';
2
3
  import RovingTabIndex from '../roving-tab-index';
3
4
 
@@ -0,0 +1,132 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ /* eslint-disable jsx-a11y/no-noninteractive-element-to-interactive-role */
3
+ import { render, screen } from '@testing-library/react';
4
+ import { createPortal, useId } from '@wordpress/element';
5
+ import TreeGridRow from '../row';
6
+ import TreeGrid from '..';
7
+
8
+ describe( 'TreeGridRow', () => {
9
+ it( 'throws outside a treegrid', () => {
10
+ expect( () =>
11
+ render(
12
+ <table>
13
+ <tbody>
14
+ <TreeGridRow
15
+ level={ 1 }
16
+ positionInSet={ 1 }
17
+ setSize={ 1 }
18
+ >
19
+ <td>Test</td>
20
+ </TreeGridRow>
21
+ </tbody>
22
+ </table>
23
+ )
24
+ ).toThrow(
25
+ 'TreeGridRow must be rendered inside an element with role="treegrid".'
26
+ );
27
+ expect( console ).toHaveErrored();
28
+ } );
29
+
30
+ it( 'accepts a row explicitly owned by the treegrid', () => {
31
+ const portalTable = document.createElement( 'table' );
32
+ const portalBody = document.createElement( 'tbody' );
33
+ portalTable.append( portalBody );
34
+ document.body.append( portalTable );
35
+
36
+ function AriaOwnedRow() {
37
+ const rowId = useId();
38
+
39
+ return (
40
+ <TreeGrid aria-owns={ rowId }>
41
+ { createPortal(
42
+ <TreeGridRow
43
+ id={ rowId }
44
+ level={ 1 }
45
+ positionInSet={ 1 }
46
+ setSize={ 1 }
47
+ >
48
+ <td>Test</td>
49
+ </TreeGridRow>,
50
+ portalBody
51
+ ) }
52
+ </TreeGrid>
53
+ );
54
+ }
55
+
56
+ try {
57
+ render( <AriaOwnedRow /> );
58
+
59
+ expect( screen.getByRole( 'row' ) ).toHaveTextContent( 'Test' );
60
+ } finally {
61
+ portalTable.remove();
62
+ }
63
+ } );
64
+
65
+ it( 'accepts a row inside a rowgroup explicitly owned by the treegrid', () => {
66
+ const portalTable = document.createElement( 'table' );
67
+ document.body.append( portalTable );
68
+
69
+ function AriaOwnedRowGroup() {
70
+ const rowGroupId = useId();
71
+
72
+ return (
73
+ <TreeGrid aria-owns={ rowGroupId }>
74
+ { createPortal(
75
+ <tbody id={ rowGroupId }>
76
+ <TreeGridRow
77
+ level={ 1 }
78
+ positionInSet={ 1 }
79
+ setSize={ 1 }
80
+ >
81
+ <td>Test</td>
82
+ </TreeGridRow>
83
+ </tbody>,
84
+ portalTable
85
+ ) }
86
+ </TreeGrid>
87
+ );
88
+ }
89
+
90
+ try {
91
+ render( <AriaOwnedRowGroup /> );
92
+
93
+ expect( screen.getByRole( 'row' ) ).toHaveTextContent( 'Test' );
94
+ } finally {
95
+ portalTable.remove();
96
+ }
97
+ } );
98
+
99
+ it( 'renders a tr with support for level, positionInSet and setSize props', () => {
100
+ const { container } = render(
101
+ <table role="treegrid">
102
+ <tbody>
103
+ <TreeGridRow level={ 1 } positionInSet={ 1 } setSize={ 1 }>
104
+ <td>Test</td>
105
+ </TreeGridRow>
106
+ </tbody>
107
+ </table>
108
+ );
109
+
110
+ expect( container ).toMatchSnapshot();
111
+ } );
112
+
113
+ it( 'forwards other props to the rendered tr element', () => {
114
+ const { container } = render(
115
+ <table role="treegrid">
116
+ <tbody>
117
+ <TreeGridRow
118
+ className="my-row"
119
+ level={ 1 }
120
+ positionInSet={ 1 }
121
+ setSize={ 1 }
122
+ >
123
+ <td>Test</td>
124
+ </TreeGridRow>
125
+ </tbody>
126
+ </table>
127
+ );
128
+
129
+ expect( container ).toMatchSnapshot();
130
+ } );
131
+ } );
132
+ /* eslint-enable jsx-a11y/no-noninteractive-element-to-interactive-role */
@@ -0,0 +1,104 @@
1
+ import { useEffect } from '@wordpress/element';
2
+
3
+ const ROW_SELECTOR = 'tr:not([role]), [role="row"]';
4
+ const TREE_GRID_SELECTOR = '[role="treegrid"]';
5
+
6
+ function getAriaOwners( element: HTMLElement ) {
7
+ if ( ! element.id ) {
8
+ return [];
9
+ }
10
+
11
+ const escapedId = element.id
12
+ .replaceAll( '\\', '\\\\' )
13
+ .replaceAll( '"', '\\"' );
14
+
15
+ return Array.from(
16
+ element.ownerDocument.querySelectorAll< HTMLElement >(
17
+ `[aria-owns~="${ escapedId }"]`
18
+ )
19
+ );
20
+ }
21
+
22
+ function isContainedInOrOwnedBy(
23
+ element: HTMLElement,
24
+ selector: string,
25
+ visited = new Set< HTMLElement >()
26
+ ): boolean {
27
+ if ( visited.has( element ) ) {
28
+ return false;
29
+ }
30
+ visited.add( element );
31
+
32
+ if ( element.parentElement?.closest( selector ) ) {
33
+ return true;
34
+ }
35
+
36
+ const hasValidOwner = getAriaOwners( element ).some(
37
+ ( owner ) =>
38
+ owner.matches( selector ) ||
39
+ isContainedInOrOwnedBy( owner, selector, visited )
40
+ );
41
+ if ( hasValidOwner ) {
42
+ return true;
43
+ }
44
+
45
+ return element.parentElement
46
+ ? isContainedInOrOwnedBy( element.parentElement, selector, visited )
47
+ : false;
48
+ }
49
+
50
+ function isOwnedByRowInTreeGrid(
51
+ element: HTMLElement,
52
+ visited = new Set< HTMLElement >()
53
+ ): boolean {
54
+ if ( visited.has( element ) ) {
55
+ return false;
56
+ }
57
+ visited.add( element );
58
+
59
+ const hasValidOwner = getAriaOwners( element ).some( ( owner ) => {
60
+ const row = owner.matches( ROW_SELECTOR )
61
+ ? owner
62
+ : owner.closest< HTMLElement >( ROW_SELECTOR );
63
+
64
+ return row
65
+ ? isContainedInOrOwnedBy( row, TREE_GRID_SELECTOR )
66
+ : isOwnedByRowInTreeGrid( owner, visited );
67
+ } );
68
+ if ( hasValidOwner ) {
69
+ return true;
70
+ }
71
+
72
+ return element.parentElement
73
+ ? isOwnedByRowInTreeGrid( element.parentElement, visited )
74
+ : false;
75
+ }
76
+
77
+ export function useValidateTreeGridStructure(
78
+ componentName: 'TreeGridRow' | 'TreeGridCell',
79
+ elementRef: React.RefObject< HTMLElement >
80
+ ) {
81
+ useEffect( () => {
82
+ const element = elementRef.current;
83
+ if ( ! element ) {
84
+ return;
85
+ }
86
+
87
+ const row =
88
+ element.parentElement?.closest< HTMLElement >( ROW_SELECTOR );
89
+ const hasValidStructure =
90
+ componentName === 'TreeGridRow'
91
+ ? isContainedInOrOwnedBy( element, TREE_GRID_SELECTOR )
92
+ : ( row &&
93
+ isContainedInOrOwnedBy( row, TREE_GRID_SELECTOR ) ) ||
94
+ isOwnedByRowInTreeGrid( element );
95
+
96
+ if ( ! hasValidStructure ) {
97
+ throw new Error(
98
+ componentName === 'TreeGridRow'
99
+ ? 'TreeGridRow must be rendered inside an element with role="treegrid".'
100
+ : 'TreeGridCell must be rendered as a cell in a row that belongs to an element with role="treegrid".'
101
+ );
102
+ }
103
+ }, [ componentName, elementRef ] );
104
+ }
@@ -6,7 +6,6 @@
6
6
  }
7
7
 
8
8
  .is-line-clamp {
9
- /* stylelint-disable-next-line plugin/use-logical-properties-and-values -- -webkit-line-clamp requires this legacy physical value. */
10
9
  -webkit-box-orient: vertical;
11
10
  -webkit-line-clamp: var(--wp-components-truncate-lines);
12
11
  display: -webkit-box;
@@ -1,3 +1,4 @@
1
+ import { describe, expect, test } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import { Truncate } from '..';
3
4
 
@@ -1,9 +1,12 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { useState } from '@wordpress/element';
4
5
  import UnitControl from '..';
5
6
  import { CSS_UNITS, parseQuantityAndUnitFromRawValue } from '../utils';
6
7
 
8
+ globalThis.wpVitest.mockMatchMedia();
9
+
7
10
  const getInput = ( {
8
11
  isInputTypeText = false,
9
12
  }: {
@@ -125,7 +128,7 @@ describe( 'UnitControl', () => {
125
128
  describe( 'Value', () => {
126
129
  it( 'should update value on change', async () => {
127
130
  const user = userEvent.setup();
128
- const onChangeSpy = jest.fn();
131
+ const onChangeSpy = vi.fn();
129
132
 
130
133
  render( <UnitControl value="50px" onChange={ onChangeSpy } /> );
131
134
 
@@ -146,7 +149,7 @@ describe( 'UnitControl', () => {
146
149
 
147
150
  it( 'should increment value on UP press', async () => {
148
151
  const user = userEvent.setup();
149
- const onChangeSpy = jest.fn();
152
+ const onChangeSpy = vi.fn();
150
153
 
151
154
  render( <UnitControl value="50px" onChange={ onChangeSpy } /> );
152
155
 
@@ -162,7 +165,7 @@ describe( 'UnitControl', () => {
162
165
 
163
166
  it( 'should increment value on UP + SHIFT press, with step', async () => {
164
167
  const user = userEvent.setup();
165
- const onChangeSpy = jest.fn();
168
+ const onChangeSpy = vi.fn();
166
169
 
167
170
  render( <UnitControl value="50px" onChange={ onChangeSpy } /> );
168
171
 
@@ -178,7 +181,7 @@ describe( 'UnitControl', () => {
178
181
 
179
182
  it( 'should decrement value on DOWN press', async () => {
180
183
  const user = userEvent.setup();
181
- const onChangeSpy = jest.fn();
184
+ const onChangeSpy = vi.fn();
182
185
 
183
186
  render( <UnitControl value={ 50 } onChange={ onChangeSpy } /> );
184
187
 
@@ -194,7 +197,7 @@ describe( 'UnitControl', () => {
194
197
 
195
198
  it( 'should decrement value on DOWN + SHIFT press, with step', async () => {
196
199
  const user = userEvent.setup();
197
- const onChangeSpy = jest.fn();
200
+ const onChangeSpy = vi.fn();
198
201
 
199
202
  render( <UnitControl value={ 50 } onChange={ onChangeSpy } /> );
200
203
 
@@ -210,7 +213,7 @@ describe( 'UnitControl', () => {
210
213
 
211
214
  it( 'should cancel change when ESCAPE key is pressed', async () => {
212
215
  const user = userEvent.setup();
213
- const onChangeSpy = jest.fn();
216
+ const onChangeSpy = vi.fn();
214
217
 
215
218
  render(
216
219
  <UnitControl
@@ -237,8 +240,8 @@ describe( 'UnitControl', () => {
237
240
  it( 'should run onBlur callback when quantity input is blurred', async () => {
238
241
  const user = userEvent.setup();
239
242
 
240
- const onChangeSpy = jest.fn();
241
- const onBlurSpy = jest.fn();
243
+ const onChangeSpy = vi.fn();
244
+ const onBlurSpy = vi.fn();
242
245
 
243
246
  render(
244
247
  <UnitControl
@@ -267,7 +270,7 @@ describe( 'UnitControl', () => {
267
270
  it( 'should invoke onChange when isPressEnterToChange is true and the input is blurred with an uncommitted value', async () => {
268
271
  const user = userEvent.setup();
269
272
 
270
- const onChangeSpy = jest.fn();
273
+ const onChangeSpy = vi.fn();
271
274
 
272
275
  render(
273
276
  <UnitControl
@@ -299,7 +302,7 @@ describe( 'UnitControl', () => {
299
302
  it( 'should update value correctly when typed and blurred when a single unit is passed', async () => {
300
303
  const user = userEvent.setup();
301
304
 
302
- const onChangeSpy = jest.fn();
305
+ const onChangeSpy = vi.fn();
303
306
  render(
304
307
  <>
305
308
  <button>Click me</button>
@@ -332,8 +335,8 @@ describe( 'UnitControl', () => {
332
335
  describe( 'Unit', () => {
333
336
  it( 'should update unit value on change', async () => {
334
337
  const user = userEvent.setup();
335
- const onChangeSpy = jest.fn();
336
- const onUnitChangeSpy = jest.fn();
338
+ const onChangeSpy = vi.fn();
339
+ const onUnitChangeSpy = vi.fn();
337
340
 
338
341
  render(
339
342
  <UnitControl
@@ -381,7 +384,7 @@ describe( 'UnitControl', () => {
381
384
 
382
385
  it( 'should reset value on unit change, if unit has default value', async () => {
383
386
  const user = userEvent.setup();
384
- const onChangeSpy = jest.fn();
387
+ const onChangeSpy = vi.fn();
385
388
 
386
389
  const units = [
387
390
  { value: 'pt', label: 'pt', default: 25 },
@@ -417,7 +420,7 @@ describe( 'UnitControl', () => {
417
420
 
418
421
  it( 'should not reset value on unit change, if disabled', async () => {
419
422
  const user = userEvent.setup();
420
- const onChangeSpy = jest.fn();
423
+ const onChangeSpy = vi.fn();
421
424
 
422
425
  const units = [
423
426
  { value: 'pt', label: 'pt', default: 25 },
@@ -453,7 +456,7 @@ describe( 'UnitControl', () => {
453
456
 
454
457
  it( 'should set correct unit if single units', async () => {
455
458
  const user = userEvent.setup();
456
- const onChangeSpy = jest.fn();
459
+ const onChangeSpy = vi.fn();
457
460
 
458
461
  render(
459
462
  <UnitControl
@@ -530,8 +533,8 @@ describe( 'UnitControl', () => {
530
533
  it( 'should run onBlur callback when the unit select is blurred', async () => {
531
534
  const user = userEvent.setup();
532
535
 
533
- const onUnitChangeSpy = jest.fn();
534
- const onBlurSpy = jest.fn();
536
+ const onUnitChangeSpy = vi.fn();
537
+ const onBlurSpy = vi.fn();
535
538
 
536
539
  render(
537
540
  <UnitControl
@@ -600,8 +603,8 @@ describe( 'UnitControl', () => {
600
603
  'should move focus from the input to the unit select when typing the first character of %p',
601
604
  async ( testUnit ) => {
602
605
  const user = userEvent.setup();
603
- const onChangeSpy = jest.fn();
604
- const onUnitChangeSpy = jest.fn();
606
+ const onChangeSpy = vi.fn();
607
+ const onUnitChangeSpy = vi.fn();
605
608
 
606
609
  render(
607
610
  <UnitControl
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it, test } from 'vitest';
1
2
  import {
2
3
  filterUnitsWithSettings,
3
4
  useCustomUnits,
@@ -72,22 +72,23 @@ const THEME = {
72
72
  },
73
73
  };
74
74
 
75
- /* eslint-enable @wordpress/no-ds-tokens */
76
-
77
75
  const UI = {
78
76
  background: THEME.background,
79
77
  backgroundDisabled: THEME.gray[ 100 ],
80
78
  border: THEME.gray[ 600 ],
81
79
  borderHover: THEME.gray[ 700 ],
82
80
  borderFocus: THEME.accent,
83
- borderDisabled: THEME.gray[ 400 ],
84
- textDisabled: THEME.gray[ 600 ],
81
+ // The gray ramp above has no disabled step to map these through.
82
+ borderDisabled: `var(--wpds-color-stroke-interactive-neutral-disabled, #dbdbdb)`,
83
+ textDisabled: `var(--wpds-color-foreground-interactive-neutral-disabled, #8d8d8d)`,
85
84
 
86
85
  // Matches @wordpress/base-styles
87
86
  darkGrayPlaceholder: `color-mix(in srgb, ${ THEME.foreground }, transparent 38%)`,
88
87
  lightGrayPlaceholder: `color-mix(in srgb, ${ THEME.background }, transparent 35%)`,
89
88
  };
90
89
 
90
+ /* eslint-enable @wordpress/no-ds-tokens */
91
+
91
92
  export const COLORS = Object.freeze( {
92
93
  /**
93
94
  * The main gray color object.
@@ -1,18 +1,33 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { render, fireEvent, screen } from '@testing-library/react';
3
+ import type { ChangeEvent } from 'react';
2
4
  import useControlledState from '../use-controlled-state';
3
5
 
4
6
  const noop = () => {};
5
7
 
6
8
  describe( 'hooks', () => {
7
- const getInput = () => screen.getByTestId( 'input' );
9
+ const getInput = () => screen.getByTestId< HTMLInputElement >( 'input' );
8
10
 
9
11
  describe( 'useControlledState', () => {
10
- const Example = ( { initial, value: valueProp, onChange = noop } ) => {
12
+ type ExampleProps = {
13
+ initial?: string;
14
+ value?: string;
15
+ onChange?: ( value: string ) => void;
16
+ };
17
+
18
+ const Example = ( {
19
+ initial,
20
+ value: valueProp,
21
+ onChange = noop,
22
+ }: ExampleProps ) => {
11
23
  const [ state, setState ] = useControlledState( valueProp, {
12
24
  initial,
25
+ fallback: '',
13
26
  } );
14
27
 
15
- const handleOnChange = ( event ) => {
28
+ const handleOnChange = (
29
+ event: ChangeEvent< HTMLInputElement >
30
+ ) => {
16
31
  const nextValue = event.target.value;
17
32
  setState( nextValue );
18
33
  onChange( nextValue );
@@ -29,7 +44,7 @@ describe( 'hooks', () => {
29
44
  };
30
45
 
31
46
  it( 'should use incoming prop as state on initial render', () => {
32
- const spy = jest.fn();
47
+ const spy = vi.fn();
33
48
  render( <Example value="Hello" onChange={ spy } /> );
34
49
 
35
50
  const input = getInput();
@@ -39,7 +54,7 @@ describe( 'hooks', () => {
39
54
  } );
40
55
 
41
56
  it( 'should update rendered value onChange', () => {
42
- const spy = jest.fn();
57
+ const spy = vi.fn();
43
58
  render( <Example onChange={ spy } /> );
44
59
 
45
60
  const input = getInput();
@@ -67,7 +82,7 @@ describe( 'hooks', () => {
67
82
  * be updated if a new incoming prop value is changed.
68
83
  */
69
84
  it( 'should update changed value with new incoming prop value', () => {
70
- const spy = jest.fn();
85
+ const spy = vi.fn();
71
86
 
72
87
  /**
73
88
  * The <input /> value starts with "Hello", since it is passed down
@@ -97,7 +112,7 @@ describe( 'hooks', () => {
97
112
  } );
98
113
 
99
114
  it( 'should render with initial value and be controllable', () => {
100
- const spy = jest.fn();
115
+ const spy = vi.fn();
101
116
  // Input starts off as being uncontrolled / self-managed.
102
117
  const { rerender } = render(
103
118
  <Example onChange={ spy } initial="Hello" />
@@ -1,7 +1,10 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { fireEvent, render, screen } from '@testing-library/react';
2
3
  import { useControlledValue } from '../use-controlled-value';
3
4
 
4
- function Input( props ) {
5
+ type InputProps = Parameters< typeof useControlledValue< string > >[ 0 ];
6
+
7
+ function Input( props: InputProps ) {
5
8
  const [ value, setValue ] = useControlledValue( props );
6
9
  return (
7
10
  <input
@@ -32,7 +35,7 @@ describe( 'useControlledValue', () => {
32
35
  } );
33
36
 
34
37
  it( 'should call onChange only when there is no value being passed in', () => {
35
- const onChange = jest.fn();
38
+ const onChange = vi.fn();
36
39
  render( <Input defaultValue="WordPress.org" onChange={ onChange } /> );
37
40
 
38
41
  expect( getInput() ).toHaveValue( 'WordPress.org' );
@@ -44,7 +47,7 @@ describe( 'useControlledValue', () => {
44
47
  } );
45
48
 
46
49
  it( 'should call onChange when there is a value passed in', () => {
47
- const onChange = jest.fn();
50
+ const onChange = vi.fn();
48
51
  const { rerender } = render(
49
52
  <Input
50
53
  defaultValue="WordPress.org"
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  // eslint-disable-next-line no-restricted-imports
2
3
  import { cx as innerCx } from '@emotion/css';
3
4
  import { insertStyles } from '@emotion/utils';
@@ -6,15 +7,17 @@ import { css, CacheProvider } from '@emotion/react';
6
7
  import createCache from '@emotion/cache';
7
8
  import { useCx } from '..';
8
9
 
9
- jest.mock( '@emotion/css', () => ( {
10
- cx: jest.fn(),
10
+ vi.mock( import( '@emotion/css' ), () => ( {
11
+ cx: vi.fn(),
11
12
  } ) );
12
13
 
13
- jest.mock( '@emotion/utils', () => ( {
14
- insertStyles: jest.fn(),
14
+ vi.mock( import( '@emotion/utils' ), () => ( {
15
+ insertStyles: vi.fn(),
15
16
  } ) );
16
17
 
17
- function Example( { args } ) {
18
+ type CxArg = Parameters< ReturnType< typeof useCx > >[ number ];
19
+
20
+ function Example( { args }: { args: CxArg[] } ) {
18
21
  const cx = useCx();
19
22
 
20
23
  return <div className={ cx( ...args ) } />;
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it, test } from 'vitest';
1
2
  import { getOptimalTextColor, getOptimalTextShade, rgba } from '../colors';
2
3
 
3
4
  describe( 'rbga', () => {
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import getNodeText from '../get-node-text';
2
3
 
3
4
  describe( 'getNodeText', () => {
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { add, subtract, clamp, ensureValidStep } from '../math';
2
3
 
3
4
  describe( 'add', () => {
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { convertLTRToRTL } from '../rtl';
2
3
 
3
4
  describe( 'convertLTRToRTL', () => {