@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 { screen, waitFor } from '@testing-library/react';
2
3
  import { press, click } from '@ariakit/test';
3
4
  import { render } from '@ariakit/test/react';
@@ -5,16 +6,17 @@ import { useEffect, useState } from '@wordpress/element';
5
6
  import { isRTL } from '@wordpress/i18n';
6
7
  import { Tabs } from '..';
7
8
  import type { TabsProps } from '../types';
9
+ globalThis.wpVitest.mockResizeObserver();
8
10
 
9
11
  // Setup mocking the `isRTL` function to test arrow key navigation behavior.
10
- jest.mock( '@wordpress/i18n', () => {
11
- const original = jest.requireActual( '@wordpress/i18n' );
12
+ vi.mock( import( '@wordpress/i18n' ), async ( importOriginal ) => {
13
+ const original = await importOriginal();
12
14
  return {
13
15
  ...original,
14
- isRTL: jest.fn( () => false ),
16
+ isRTL: vi.fn( () => false ),
15
17
  };
16
18
  } );
17
- const mockedIsRTL = isRTL as jest.Mock;
19
+ const mockedIsRTL = vi.mocked( isRTL );
18
20
 
19
21
  type Tab = {
20
22
  tabId: string;
@@ -335,7 +337,7 @@ describe( 'Tabs', () => {
335
337
 
336
338
  describe( 'pointer interactions', () => {
337
339
  it( 'should select a tab when clicked', async () => {
338
- const mockOnSelect = jest.fn();
340
+ const mockOnSelect = vi.fn();
339
341
 
340
342
  await render(
341
343
  <UncontrolledTabs tabs={ TABS } onSelect={ mockOnSelect } />
@@ -385,7 +387,7 @@ describe( 'Tabs', () => {
385
387
  } );
386
388
 
387
389
  it( 'should not select a disabled tab when clicked', async () => {
388
- const mockOnSelect = jest.fn();
390
+ const mockOnSelect = vi.fn();
389
391
 
390
392
  await render(
391
393
  <UncontrolledTabs
@@ -641,7 +643,7 @@ describe( 'Tabs', () => {
641
643
  } );
642
644
 
643
645
  it( 'should ignore any changes to the `defaultTabId` prop after the first render', async () => {
644
- const mockOnSelect = jest.fn();
646
+ const mockOnSelect = vi.fn();
645
647
 
646
648
  const { rerender } = await render(
647
649
  <UncontrolledTabs
@@ -929,7 +931,7 @@ describe( 'Tabs', () => {
929
931
  } );
930
932
 
931
933
  it( 'should select tabs in the tablist when using the left and right arrow keys by default (automatic tab activation)', async () => {
932
- const mockOnSelect = jest.fn();
934
+ const mockOnSelect = vi.fn();
933
935
 
934
936
  await render(
935
937
  <Component tabs={ TABS } onSelect={ mockOnSelect } />
@@ -1008,7 +1010,7 @@ describe( 'Tabs', () => {
1008
1010
  } );
1009
1011
 
1010
1012
  it( 'should not automatically select tabs in the tablist when pressing the left and right arrow keys if the `selectOnMove` prop is set to `false` (manual tab activation)', async () => {
1011
- const mockOnSelect = jest.fn();
1013
+ const mockOnSelect = vi.fn();
1012
1014
 
1013
1015
  await render(
1014
1016
  <Component
@@ -1081,7 +1083,7 @@ describe( 'Tabs', () => {
1081
1083
  } );
1082
1084
 
1083
1085
  it( 'should not select tabs in the tablist when using the up and down arrow keys, unless the `orientation` prop is set to `vertical`', async () => {
1084
- const mockOnSelect = jest.fn();
1086
+ const mockOnSelect = vi.fn();
1085
1087
 
1086
1088
  const { rerender } = await render(
1087
1089
  <Component tabs={ TABS } onSelect={ mockOnSelect } />
@@ -1185,7 +1187,7 @@ describe( 'Tabs', () => {
1185
1187
  } );
1186
1188
 
1187
1189
  it( 'should loop tab focus at the end of the tablist when using arrow keys', async () => {
1188
- const mockOnSelect = jest.fn();
1190
+ const mockOnSelect = vi.fn();
1189
1191
 
1190
1192
  await render(
1191
1193
  <Component tabs={ TABS } onSelect={ mockOnSelect } />
@@ -1250,7 +1252,7 @@ describe( 'Tabs', () => {
1250
1252
  // For this test only, mock the writing direction to RTL.
1251
1253
  mockedIsRTL.mockImplementation( () => true );
1252
1254
 
1253
- const mockOnSelect = jest.fn();
1255
+ const mockOnSelect = vi.fn();
1254
1256
 
1255
1257
  await render(
1256
1258
  <Component tabs={ TABS } onSelect={ mockOnSelect } />
@@ -1332,7 +1334,7 @@ describe( 'Tabs', () => {
1332
1334
  } );
1333
1335
 
1334
1336
  it( 'should focus tabs in the tablist even if disabled', async () => {
1335
- const mockOnSelect = jest.fn();
1337
+ const mockOnSelect = vi.fn();
1336
1338
 
1337
1339
  await render(
1338
1340
  <Component
@@ -1534,7 +1536,7 @@ describe( 'Tabs', () => {
1534
1536
  describe( 'removing a tab', () => {
1535
1537
  describe( 'with no explicitly set initial tab', () => {
1536
1538
  it( 'should not select a new tab when the selected tab is removed', async () => {
1537
- const mockOnSelect = jest.fn();
1539
+ const mockOnSelect = vi.fn();
1538
1540
 
1539
1541
  const { rerender } = await render(
1540
1542
  <UncontrolledTabs
@@ -1600,7 +1602,7 @@ describe( 'Tabs', () => {
1600
1602
  'when using the `%s` prop [%s]',
1601
1603
  ( propName, _mode, Component ) => {
1602
1604
  it( 'should not select a new tab when the selected tab is removed', async () => {
1603
- const mockOnSelect = jest.fn();
1605
+ const mockOnSelect = vi.fn();
1604
1606
 
1605
1607
  const initialComponentProps = {
1606
1608
  tabs: TABS,
@@ -1662,7 +1664,7 @@ describe( 'Tabs', () => {
1662
1664
  } );
1663
1665
 
1664
1666
  it( `should not select the tab matching the \`${ propName }\` prop as a fallback when the selected tab is removed`, async () => {
1665
- const mockOnSelect = jest.fn();
1667
+ const mockOnSelect = vi.fn();
1666
1668
 
1667
1669
  const initialComponentProps = {
1668
1670
  tabs: TABS,
@@ -1758,7 +1760,7 @@ describe( 'Tabs', () => {
1758
1760
  'when using the `%s` prop [%s]',
1759
1761
  ( propName, _mode, Component ) => {
1760
1762
  it( `should select a newly added tab if it matches the \`${ propName }\` prop`, async () => {
1761
- const mockOnSelect = jest.fn();
1763
+ const mockOnSelect = vi.fn();
1762
1764
 
1763
1765
  const initialComponentProps = {
1764
1766
  tabs: TABS,
@@ -1812,7 +1814,7 @@ describe( 'Tabs', () => {
1812
1814
  'when using the `%s` prop [%s]',
1813
1815
  ( propName, _mode, Component ) => {
1814
1816
  it( `should keep the initial tab matching the \`${ propName }\` prop as selected even if it becomes disabled`, async () => {
1815
- const mockOnSelect = jest.fn();
1817
+ const mockOnSelect = vi.fn();
1816
1818
 
1817
1819
  const initialComponentProps = {
1818
1820
  tabs: TABS,
@@ -1874,7 +1876,7 @@ describe( 'Tabs', () => {
1874
1876
  } );
1875
1877
 
1876
1878
  it( 'should keep the current tab selected by the user as selected even if it becomes disabled', async () => {
1877
- const mockOnSelect = jest.fn();
1879
+ const mockOnSelect = vi.fn();
1878
1880
 
1879
1881
  const { rerender } = await render(
1880
1882
  <Component
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import TextControl from '..';
3
4
 
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { render } from '@testing-library/react';
2
3
  import TextHighlight from '..';
3
4
 
@@ -6,7 +6,7 @@
6
6
  display: block;
7
7
  background: $components-color-background;
8
8
  color: $components-color-foreground;
9
- /* stylelint-disable-next-line plugin/use-logical-properties-and-values -- Preserve Emotion `resize: vertical`; `block` is not equivalent in vertical writing modes. */
9
+ /* stylelint-disable-next-line logical-css/require-logical-keywords -- Preserve Emotion `resize: vertical`; `block` is not equivalent in vertical writing modes. */
10
10
  resize: vertical;
11
11
 
12
12
  @include input-control;
@@ -21,9 +21,10 @@
21
21
  min-height: 38px;
22
22
 
23
23
  &:disabled {
24
- background: $components-color-gray-100;
25
- border-color: $components-color-gray-400;
26
- color: $components-color-gray-600;
24
+ border-color: var(--wpds-color-stroke-interactive-neutral-disabled);
25
+ color: var(--wpds-color-foreground-interactive-neutral-disabled);
26
+ // Core's `form.css` sets its own background on disabled textareas.
27
+ background: $components-color-background;
27
28
  }
28
29
 
29
30
  // Use opacity to work in various editor styles.
@@ -53,4 +54,8 @@
53
54
  color: $components-color-light-gray-placeholder;
54
55
  }
55
56
  }
57
+
58
+ &:disabled::placeholder {
59
+ color: var(--wpds-color-foreground-interactive-neutral-disabled);
60
+ }
56
61
  }
@@ -7,7 +7,7 @@
7
7
 
8
8
  svg {
9
9
  align-self: center;
10
- fill: $alert-yellow;
10
+ color: $alert-yellow;
11
11
  flex-shrink: 0;
12
12
  margin-right: $grid-unit-20;
13
13
  }
@@ -1,6 +1,9 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import ToggleControl from '..';
3
4
 
5
+ globalThis.wpVitest.mockMatchMedia();
6
+
4
7
  describe( 'ToggleControl', () => {
5
8
  it( 'should label the toggle', () => {
6
9
  render( <ToggleControl label="My toggle" onChange={ () => {} } /> );
@@ -11,7 +14,7 @@ describe( 'ToggleControl', () => {
11
14
  } );
12
15
 
13
16
  it( 'triggers change callback with boolean', () => {
14
- const onChange = jest.fn();
17
+ const onChange = vi.fn();
15
18
 
16
19
  render( <ToggleControl label="My toggle" onChange={ onChange } /> );
17
20
 
@@ -1,11 +1,20 @@
1
1
  import { createContext, useContext } from '@wordpress/element';
2
2
  import type { ToggleGroupControlContextProps } from './types';
3
3
 
4
- const ToggleGroupControlContext = createContext(
5
- {} as ToggleGroupControlContextProps
6
- );
4
+ const ToggleGroupControlContext = createContext<
5
+ ToggleGroupControlContextProps | undefined
6
+ >( undefined );
7
7
  ToggleGroupControlContext.displayName = 'ToggleGroupControlContext';
8
8
 
9
- export const useToggleGroupControlContext = () =>
10
- useContext( ToggleGroupControlContext );
9
+ export const useToggleGroupControlContext = (
10
+ componentName = 'ToggleGroupControlOptionBase'
11
+ ) => {
12
+ const context = useContext( ToggleGroupControlContext );
13
+ if ( ! context ) {
14
+ throw new Error(
15
+ `${ componentName } can only be rendered inside ToggleGroupControl.`
16
+ );
17
+ }
18
+ return context;
19
+ };
11
20
  export default ToggleGroupControlContext;
@@ -39,8 +39,9 @@ const Template: StoryFn< typeof ToggleGroupControl > = ( {
39
39
  onChange,
40
40
  ...props
41
41
  } ) => {
42
- const [ value, setValue ] =
43
- useState< ToggleGroupControlProps[ 'value' ] >();
42
+ const [ value, setValue ] = useState< ToggleGroupControlProps[ 'value' ] >(
43
+ props.value
44
+ );
44
45
 
45
46
  return (
46
47
  <ToggleGroupControl
@@ -135,3 +136,15 @@ Deselectable.args = {
135
136
  ...WithIcons.args,
136
137
  isDeselectable: true,
137
138
  };
139
+
140
+ /**
141
+ * When the `disabled` prop is true, the control is unselectable.
142
+ */
143
+ export const Disabled: StoryFn< typeof ToggleGroupControl > = Template.bind(
144
+ {}
145
+ );
146
+ Disabled.args = {
147
+ ...Default.args,
148
+ disabled: true,
149
+ value: 'left',
150
+ };
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it, test, vi } from 'vitest';
1
2
  import { render, screen, waitFor } from '@testing-library/react';
2
3
  import { press, click, hover, sleep } from '@ariakit/test';
3
4
  import { useState } from '@wordpress/element';
@@ -12,12 +13,22 @@ import { TOOLTIP_DELAY } from '../../tooltip';
12
13
  import type { ToggleGroupControlProps } from '../types';
13
14
  import controlStyles from '../toggle-group-control/style.module.scss';
14
15
  import optionStyles from '../toggle-group-control-option-base/style.module.scss';
16
+ globalThis.wpVitest.mockResizeObserver();
15
17
 
16
18
  const hoverOutside = async () => {
17
19
  await hover( document.body );
18
20
  await hover( document.body, { clientX: 10, clientY: 10 } );
19
21
  };
20
22
 
23
+ const expectGroupChromeDisabled = ( group: HTMLElement ) => {
24
+ expect( group ).toBeVisible();
25
+ expect( group ).toHaveAttribute( 'aria-disabled', 'true' );
26
+ // `toBeEnabled()` treats aria-disabled as disabled, so it cannot
27
+ // catch an HTML `disabled` leak onto this div.
28
+ // eslint-disable-next-line jest-dom/prefer-enabled-disabled
29
+ expect( group ).not.toHaveAttribute( 'disabled' );
30
+ };
31
+
21
32
  const getGeneratedEmotionClassNames = ( element: HTMLElement ) =>
22
33
  Array.from( element.classList ).filter( ( className ) =>
23
34
  /^(css|emotion)-/.test( className )
@@ -90,6 +101,32 @@ const optionsWithDisabledOption = (
90
101
  </>
91
102
  );
92
103
 
104
+ describe( 'required context', () => {
105
+ it( 'throws when ToggleGroupControlOption is outside ToggleGroupControl', () => {
106
+ expect( () =>
107
+ render( <ToggleGroupControlOption value="value" label="Label" /> )
108
+ ).toThrow(
109
+ 'ToggleGroupControlOption can only be rendered inside ToggleGroupControl.'
110
+ );
111
+ expect( console ).toHaveErrored();
112
+ } );
113
+
114
+ it( 'throws when ToggleGroupControlOptionIcon is outside ToggleGroupControl', () => {
115
+ expect( () =>
116
+ render(
117
+ <ToggleGroupControlOptionIcon
118
+ value="value"
119
+ label="Label"
120
+ icon={ formatUppercase }
121
+ />
122
+ )
123
+ ).toThrow(
124
+ 'ToggleGroupControlOptionIcon can only be rendered inside ToggleGroupControl.'
125
+ );
126
+ expect( console ).toHaveErrored();
127
+ } );
128
+ } );
129
+
93
130
  describe.each( [
94
131
  [ 'uncontrolled', ToggleGroupControl ],
95
132
  [ 'controlled', ControlledToggleGroupControl ],
@@ -98,17 +135,27 @@ describe.each( [
98
135
 
99
136
  describe( 'should render correctly', () => {
100
137
  it( 'with text options', () => {
101
- const { container } = render(
138
+ render(
102
139
  <Component label="Test Toggle Group Control">
103
140
  { options }
104
141
  </Component>
105
142
  );
106
143
 
107
- expect( container ).toMatchSnapshot();
144
+ expect(
145
+ screen.getByRole( 'radiogroup', {
146
+ name: 'Test Toggle Group Control',
147
+ } )
148
+ ).toBeInTheDocument();
149
+ expect(
150
+ screen.getByRole( 'radio', { name: 'R' } )
151
+ ).toBeInTheDocument();
152
+ expect(
153
+ screen.getByRole( 'radio', { name: 'J' } )
154
+ ).toBeInTheDocument();
108
155
  } );
109
156
 
110
157
  it( 'with icons', () => {
111
- const { container } = render(
158
+ render(
112
159
  <Component value="uppercase" label="Test Toggle Group Control">
113
160
  <ToggleGroupControlOptionIcon
114
161
  value="uppercase"
@@ -123,7 +170,12 @@ describe.each( [
123
170
  </Component>
124
171
  );
125
172
 
126
- expect( container ).toMatchSnapshot();
173
+ expect(
174
+ screen.getByRole( 'radio', { name: 'Uppercase' } )
175
+ ).toBeChecked();
176
+ expect(
177
+ screen.getByRole( 'radio', { name: 'Lowercase' } )
178
+ ).not.toBeChecked();
127
179
  } );
128
180
  } );
129
181
  it( 'should render with the correct option initially selected when `value` is defined', () => {
@@ -143,7 +195,7 @@ describe.each( [
143
195
  expect( screen.getByRole( 'radio', { name: 'J' } ) ).not.toBeChecked();
144
196
  } );
145
197
  it( 'should call onChange with proper value', async () => {
146
- const mockOnChange = jest.fn();
198
+ const mockOnChange = vi.fn();
147
199
 
148
200
  render(
149
201
  <Component
@@ -402,7 +454,7 @@ describe.each( [
402
454
  describe( 'isDeselectable', () => {
403
455
  describe( 'isDeselectable = false', () => {
404
456
  it( 'should not be deselectable', async () => {
405
- const mockOnChange = jest.fn();
457
+ const mockOnChange = vi.fn();
406
458
 
407
459
  render(
408
460
  <Component
@@ -453,7 +505,7 @@ describe.each( [
453
505
  } );
454
506
 
455
507
  it( 'should ignore disabled radio options', async () => {
456
- const mockOnChange = jest.fn();
508
+ const mockOnChange = vi.fn();
457
509
 
458
510
  render(
459
511
  <Component
@@ -501,7 +553,7 @@ describe.each( [
501
553
 
502
554
  describe( 'isDeselectable = true', () => {
503
555
  it( 'should be deselectable', async () => {
504
- const mockOnChange = jest.fn();
556
+ const mockOnChange = vi.fn();
505
557
 
506
558
  render(
507
559
  <Component
@@ -567,7 +619,7 @@ describe.each( [
567
619
  } );
568
620
 
569
621
  it( 'should ignore disabled options', async () => {
570
- const mockOnChange = jest.fn();
622
+ const mockOnChange = vi.fn();
571
623
 
572
624
  render(
573
625
  <Component
@@ -626,6 +678,228 @@ describe.each( [
626
678
  } );
627
679
  } );
628
680
  } );
681
+
682
+ describe( 'disabled', () => {
683
+ it( 'should not select another option when the control is disabled', async () => {
684
+ const mockOnChange = vi.fn();
685
+
686
+ render(
687
+ <Component
688
+ value="rigas"
689
+ label="Test"
690
+ disabled
691
+ onChange={ mockOnChange }
692
+ >
693
+ { options }
694
+ </Component>
695
+ );
696
+
697
+ expectGroupChromeDisabled(
698
+ screen.getByRole( 'radiogroup', { name: 'Test' } )
699
+ );
700
+
701
+ expect( screen.getByRole( 'radio', { name: 'R' } ) ).toBeChecked();
702
+
703
+ await click( screen.getByRole( 'radio', { name: 'J' } ) );
704
+
705
+ expect( screen.getByRole( 'radio', { name: 'R' } ) ).toBeChecked();
706
+ expect(
707
+ screen.getByRole( 'radio', { name: 'J' } )
708
+ ).not.toBeChecked();
709
+ expect( mockOnChange ).not.toHaveBeenCalled();
710
+
711
+ await press.ArrowRight();
712
+ expect( mockOnChange ).not.toHaveBeenCalled();
713
+ } );
714
+
715
+ it( 'should skip the disabled control when tabbing', async () => {
716
+ render(
717
+ <>
718
+ <button>Before ToggleGroupControl</button>
719
+ <Component value="rigas" label="Test" disabled>
720
+ { options }
721
+ </Component>
722
+ <button>After ToggleGroupControl</button>
723
+ </>
724
+ );
725
+
726
+ await press.Tab();
727
+ expect(
728
+ screen.getByRole( 'button', {
729
+ name: 'Before ToggleGroupControl',
730
+ } )
731
+ ).toHaveFocus();
732
+
733
+ await press.Tab();
734
+
735
+ const expectedFocusTarget =
736
+ mode === 'uncontrolled'
737
+ ? screen.getByRole( 'button', {
738
+ name: 'After ToggleGroupControl',
739
+ } )
740
+ : screen.getByRole( 'button', { name: 'Reset' } );
741
+
742
+ expect( expectedFocusTarget ).toHaveFocus();
743
+ } );
744
+
745
+ it( 'should keep the selected option when the control is disabled', () => {
746
+ render(
747
+ <Component value="jack" label="Test" disabled>
748
+ { options }
749
+ </Component>
750
+ );
751
+
752
+ expect( screen.getByRole( 'radio', { name: 'J' } ) ).toBeChecked();
753
+ expect(
754
+ screen.getByRole( 'radio', { name: 'R' } )
755
+ ).not.toBeChecked();
756
+ } );
757
+
758
+ it( 'should not call onChange when a disabled control is clicked', async () => {
759
+ const mockOnChange = vi.fn();
760
+
761
+ render(
762
+ <Component
763
+ value="rigas"
764
+ label="Test"
765
+ disabled
766
+ onChange={ mockOnChange }
767
+ >
768
+ { options }
769
+ </Component>
770
+ );
771
+
772
+ await click( screen.getByRole( 'radio', { name: 'J' } ) );
773
+ await click( screen.getByRole( 'radio', { name: 'R' } ) );
774
+
775
+ expect( mockOnChange ).not.toHaveBeenCalled();
776
+ } );
777
+
778
+ it( 'should disable every option when the control is disabled, including options without their own disabled prop', () => {
779
+ render(
780
+ <Component value="pizza" label="Test" disabled>
781
+ { optionsWithDisabledOption }
782
+ </Component>
783
+ );
784
+
785
+ expectGroupChromeDisabled(
786
+ screen.getByRole( 'radiogroup', { name: 'Test' } )
787
+ );
788
+
789
+ expect(
790
+ screen.getByRole( 'radio', { name: 'Pizza' } )
791
+ ).toBeDisabled();
792
+ expect(
793
+ screen.getByRole( 'radio', { name: 'Rice' } )
794
+ ).toBeDisabled();
795
+ expect(
796
+ screen.getByRole( 'radio', { name: 'Pasta' } )
797
+ ).toBeDisabled();
798
+ } );
799
+
800
+ it( 'should not deselect the pressed option when the control is disabled', async () => {
801
+ const mockOnChange = vi.fn();
802
+
803
+ render(
804
+ <Component
805
+ value="rigas"
806
+ label="Test"
807
+ onChange={ mockOnChange }
808
+ isDeselectable
809
+ disabled
810
+ >
811
+ { options }
812
+ </Component>
813
+ );
814
+
815
+ expectGroupChromeDisabled(
816
+ screen.getByRole( 'group', { name: 'Test' } )
817
+ );
818
+
819
+ const pressed = screen.getByRole( 'button', {
820
+ name: 'R',
821
+ pressed: true,
822
+ } );
823
+ expect( pressed ).toBeVisible();
824
+ expect( pressed ).toBeDisabled();
825
+
826
+ await click( pressed );
827
+
828
+ expect(
829
+ screen.getByRole( 'button', {
830
+ name: 'R',
831
+ pressed: true,
832
+ } )
833
+ ).toBeVisible();
834
+ expect( mockOnChange ).not.toHaveBeenCalled();
835
+ } );
836
+
837
+ it( 'should skip a deselectable disabled control when tabbing', async () => {
838
+ render(
839
+ <>
840
+ <button>Before ToggleGroupControl</button>
841
+ <Component
842
+ isDeselectable
843
+ value="rigas"
844
+ label="Test"
845
+ disabled
846
+ >
847
+ { options }
848
+ </Component>
849
+ <button>After ToggleGroupControl</button>
850
+ </>
851
+ );
852
+
853
+ await press.Tab();
854
+ expect(
855
+ screen.getByRole( 'button', {
856
+ name: 'Before ToggleGroupControl',
857
+ } )
858
+ ).toHaveFocus();
859
+
860
+ await press.Tab();
861
+
862
+ const expectedFocusTarget =
863
+ mode === 'uncontrolled'
864
+ ? screen.getByRole( 'button', {
865
+ name: 'After ToggleGroupControl',
866
+ } )
867
+ : screen.getByRole( 'button', { name: 'Reset' } );
868
+
869
+ expect( expectedFocusTarget ).toHaveFocus();
870
+ } );
871
+
872
+ it( 'should not call onChange when a deselectable disabled control is clicked', async () => {
873
+ const mockOnChange = vi.fn();
874
+
875
+ render(
876
+ <Component
877
+ value="rigas"
878
+ label="Test"
879
+ onChange={ mockOnChange }
880
+ isDeselectable
881
+ disabled
882
+ >
883
+ { options }
884
+ </Component>
885
+ );
886
+
887
+ await click(
888
+ screen.getByRole( 'button', {
889
+ name: 'R',
890
+ pressed: true,
891
+ } )
892
+ );
893
+ await click(
894
+ screen.getByRole( 'button', {
895
+ name: 'J',
896
+ pressed: false,
897
+ } )
898
+ );
899
+
900
+ expect( mockOnChange ).not.toHaveBeenCalled();
901
+ } );
902
+ } );
629
903
  } );
630
904
 
631
905
  test( 'should render block styles without Emotion-generated classes', () => {
@@ -18,11 +18,7 @@ import {
18
18
 
19
19
  function Example() {
20
20
  return (
21
- <ToggleGroupControl
22
- label="my label"
23
- value="vertical"
24
- isBlock
25
- >
21
+ <ToggleGroupControl label="my label" value="vertical" isBlock>
26
22
  <ToggleGroupControlOption value="horizontal" label="Horizontal" />
27
23
  <ToggleGroupControlOption value="vertical" label="Vertical" />
28
24
  </ToggleGroupControl>
@@ -84,3 +80,10 @@ Callback when a segment is selected.
84
80
  The value of the `ToggleGroupControl`.
85
81
 
86
82
  - Required: No
83
+
84
+ ### `disabled`: `boolean`
85
+
86
+ If true, every option is unselectable. The selected value is left as-is.
87
+
88
+ - Required: No
89
+ - Default: `false`