@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,11 +1,12 @@
1
1
  import { render, screen, within } from '@testing-library/react';
2
2
  import userEvent from '@testing-library/user-event';
3
+ import type { ReactNode } from 'react';
3
4
  import { Component, createPortal, useState } from '@wordpress/element';
4
5
  import { registerStyle } from '@wordpress/style-runtime';
5
6
  import { Slot, Fill, Provider, useSlotFills } from '../';
6
7
 
7
- function IframePortal( { children } ) {
8
- const [ iframe, setIframe ] = useState( null );
8
+ function IframePortal( { children }: { children: ReactNode } ) {
9
+ const [ iframe, setIframe ] = useState< HTMLIFrameElement | null >( null );
9
10
  const body = iframe?.contentDocument?.body;
10
11
 
11
12
  return (
@@ -15,9 +16,14 @@ function IframePortal( { children } ) {
15
16
  );
16
17
  }
17
18
 
18
- class Filler extends Component {
19
- constructor() {
20
- super( ...arguments );
19
+ type FillerProps = {
20
+ name: string;
21
+ text?: string;
22
+ };
23
+
24
+ class Filler extends Component< FillerProps, { num: number } > {
25
+ constructor( props: FillerProps ) {
26
+ super( props );
21
27
 
22
28
  this.state = {
23
29
  num: 1,
@@ -121,7 +127,7 @@ describe( 'Slot', () => {
121
127
  <div>
122
128
  <Slot name="chicken">
123
129
  { ( fills ) =>
124
- [ ...fills ].length ? (
130
+ ( fills as ReactNode[] ).length ? (
125
131
  <blockquote>{ fills }</blockquote>
126
132
  ) : null
127
133
  }
@@ -290,7 +296,8 @@ describe( 'Slot', () => {
290
296
 
291
297
  describe( 'cross-document styles', () => {
292
298
  afterEach( () => {
293
- delete globalThis.__wpStyleRuntime;
299
+ delete ( globalThis as { __wpStyleRuntime?: unknown } )
300
+ .__wpStyleRuntime;
294
301
  document.head.innerHTML = '';
295
302
  } );
296
303
 
@@ -315,13 +322,14 @@ describe( 'Slot', () => {
315
322
  </Provider>
316
323
  );
317
324
  const iframeDocument =
318
- screen.getByTitle( 'Slot document' ).contentDocument;
325
+ screen.getByTitle< HTMLIFrameElement >( 'Slot document' )
326
+ .contentDocument!;
319
327
 
320
328
  const styledElement = within( iframeDocument.body ).getByText(
321
329
  'Styled content'
322
330
  );
323
331
  expect(
324
- iframeDocument.defaultView.getComputedStyle( styledElement )
332
+ iframeDocument.defaultView!.getComputedStyle( styledElement )
325
333
  .padding
326
334
  ).toBe( '32px' );
327
335
  } );
@@ -1,5 +1,6 @@
1
1
  import type { ForwardedRef, KeyboardEvent, MouseEvent } from 'react';
2
2
  import clsx from 'clsx';
3
+ import { useIsPresent } from 'framer-motion';
3
4
  import { speak } from '@wordpress/a11y';
4
5
  import {
5
6
  useEffect,
@@ -57,6 +58,8 @@ function UnforwardedSnackbar(
57
58
  }: WordPressComponentProps< SnackbarProps, 'div' >,
58
59
  ref: ForwardedRef< any >
59
60
  ) {
61
+ const isPresent = useIsPresent();
62
+
60
63
  function dismissMe( event: KeyboardEvent | MouseEvent ) {
61
64
  if ( event && event.preventDefault ) {
62
65
  event.preventDefault();
@@ -92,16 +95,17 @@ function UnforwardedSnackbar(
92
95
  } );
93
96
 
94
97
  useEffect( () => {
95
- // Only set up the timeout dismiss if we're not explicitly dismissing.
98
+ if ( explicitDismiss || ! isPresent ) {
99
+ return;
100
+ }
101
+
96
102
  const timeoutHandle = setTimeout( () => {
97
- if ( ! explicitDismiss ) {
98
- callbacksRef.current.onDismiss?.();
99
- callbacksRef.current.onRemove?.();
100
- }
103
+ callbacksRef.current.onDismiss?.();
104
+ callbacksRef.current.onRemove?.();
101
105
  }, NOTICE_TIMEOUT );
102
106
 
103
107
  return () => clearTimeout( timeoutHandle );
104
- }, [ explicitDismiss ] );
108
+ }, [ explicitDismiss, isPresent ] );
105
109
 
106
110
  const classes = clsx( className, 'components-snackbar', {
107
111
  'components-snackbar-explicit-dismiss': !! explicitDismiss,
@@ -1,11 +1,15 @@
1
- import { render, screen, within } from '@testing-library/react';
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { act, fireEvent, render, screen, within } from '@testing-library/react';
2
3
  import { click } from '@ariakit/test';
3
4
  import { speak } from '@wordpress/a11y';
4
5
  import { SVG, Path } from '@wordpress/primitives';
5
6
  import Snackbar from '../index';
6
7
 
7
- jest.mock( '@wordpress/a11y', () => ( { speak: jest.fn() } ) );
8
- const mockedSpeak = jest.mocked( speak );
8
+ vi.mock( import( '@wordpress/a11y' ), async ( importOriginal ) => ( {
9
+ ...( await importOriginal() ),
10
+ speak: vi.fn(),
11
+ } ) );
12
+ const mockedSpeak = vi.mocked( speak );
9
13
 
10
14
  describe( 'Snackbar', () => {
11
15
  const testId = 'snackbar';
@@ -14,6 +18,10 @@ describe( 'Snackbar', () => {
14
18
  mockedSpeak.mockReset();
15
19
  } );
16
20
 
21
+ afterEach( () => {
22
+ vi.useRealTimers();
23
+ } );
24
+
17
25
  it( 'should render correctly', () => {
18
26
  render( <Snackbar>Message</Snackbar> );
19
27
 
@@ -44,9 +52,25 @@ describe( 'Snackbar', () => {
44
52
  expect( icon ).toBeVisible();
45
53
  } );
46
54
 
55
+ it( 'should not restart auto-dismissal after an unrelated rerender', async () => {
56
+ vi.useFakeTimers();
57
+ const removeNotice = vi.fn();
58
+ const { rerender } = render(
59
+ <Snackbar onRemove={ () => removeNotice() }>Message</Snackbar>
60
+ );
61
+
62
+ await act( async () => vi.advanceTimersByTime( 5000 ) );
63
+ rerender(
64
+ <Snackbar onRemove={ () => removeNotice() }>Message</Snackbar>
65
+ );
66
+ await act( async () => vi.advanceTimersByTime( 1000 ) );
67
+
68
+ expect( removeNotice ).toHaveBeenCalledTimes( 1 );
69
+ } );
70
+
47
71
  it( 'should be dismissible by clicking the snackbar', async () => {
48
- const onRemove = jest.fn();
49
- const onDismiss = jest.fn();
72
+ const onRemove = vi.fn();
73
+ const onDismiss = vi.fn();
50
74
 
51
75
  render(
52
76
  <Snackbar onRemove={ onRemove } onDismiss={ onDismiss }>
@@ -69,8 +93,9 @@ describe( 'Snackbar', () => {
69
93
  } );
70
94
 
71
95
  it( 'should not be dismissible by clicking the snackbar when the `explicitDismiss` prop is set to `true`', async () => {
72
- const onRemove = jest.fn();
73
- const onDismiss = jest.fn();
96
+ vi.useFakeTimers();
97
+ const onRemove = vi.fn();
98
+ const onDismiss = vi.fn();
74
99
 
75
100
  render(
76
101
  <Snackbar
@@ -93,15 +118,20 @@ describe( 'Snackbar', () => {
93
118
  'components-snackbar-explicit-dismiss'
94
119
  );
95
120
 
96
- await click( snackbar );
121
+ fireEvent.click( snackbar );
122
+
123
+ expect( onRemove ).not.toHaveBeenCalled();
124
+ expect( onDismiss ).not.toHaveBeenCalled();
125
+
126
+ await act( async () => vi.advanceTimersByTime( 6000 ) );
97
127
 
98
128
  expect( onRemove ).not.toHaveBeenCalled();
99
129
  expect( onDismiss ).not.toHaveBeenCalled();
100
130
  } );
101
131
 
102
132
  it( 'should be dismissible by clicking the close button when the `explicitDismiss` prop is set to `true`', async () => {
103
- const onRemove = jest.fn();
104
- const onDismiss = jest.fn();
133
+ const onRemove = vi.fn();
134
+ const onDismiss = vi.fn();
105
135
 
106
136
  render(
107
137
  <Snackbar
@@ -169,7 +199,7 @@ describe( 'Snackbar', () => {
169
199
  } );
170
200
 
171
201
  it( 'should be rendered as a button and call `onClick` when the `onClick` prop is set', async () => {
172
- const onClick = jest.fn();
202
+ const onClick = vi.fn();
173
203
 
174
204
  render(
175
205
  <Snackbar actions={ [ { label: 'View post', onClick } ] }>
@@ -0,0 +1,100 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import { act, render, screen } from '@testing-library/react';
3
+ import { click } from '@ariakit/test';
4
+ import { useEffect, useState } from '@wordpress/element';
5
+ import SnackbarList from '../list';
6
+
7
+ vi.mock( import( '@wordpress/compose' ), async ( importOriginal ) => ( {
8
+ ...( await importOriginal() ),
9
+ useReducedMotion: () => false,
10
+ } ) );
11
+
12
+ window.scrollTo = vi.fn();
13
+
14
+ describe( 'SnackbarList', () => {
15
+ afterEach( () => {
16
+ vi.resetAllMocks();
17
+ vi.useRealTimers();
18
+ } );
19
+
20
+ it( 'should get focus after a snackbar is dismissed', async () => {
21
+ render(
22
+ <SnackbarList
23
+ notices={ [
24
+ {
25
+ id: 'ID_1',
26
+ content: 'Post published.',
27
+ explicitDismiss: true,
28
+ },
29
+ {
30
+ id: 'ID_2',
31
+ content: 'Post updated.',
32
+ explicitDismiss: true,
33
+ },
34
+ ] }
35
+ onRemove={ () => {} }
36
+ />
37
+ );
38
+
39
+ await click(
40
+ screen.getAllByRole( 'button', {
41
+ name: 'Dismiss this notice',
42
+ } )[ 0 ]
43
+ );
44
+
45
+ expect( screen.getByTestId( 'snackbar-list' ) ).toHaveFocus();
46
+ } );
47
+
48
+ it( 'should restart auto-dismissal when a notice is replaced with the same ID', async () => {
49
+ vi.useFakeTimers();
50
+ const onRemove = vi.fn();
51
+ const notice = {
52
+ id: 'ID_1',
53
+ content: 'A collaborator joined.',
54
+ };
55
+
56
+ function RecreatedNotice() {
57
+ const [ notices, setNotices ] = useState( [ notice ] );
58
+ const [ shouldRecreate, setShouldRecreate ] = useState( false );
59
+
60
+ useEffect( () => {
61
+ if ( ! shouldRecreate ) {
62
+ return;
63
+ }
64
+
65
+ const timeoutHandle = setTimeout( () => {
66
+ setNotices( [ { ...notice } ] );
67
+ setShouldRecreate( false );
68
+ }, 50 );
69
+
70
+ return () => clearTimeout( timeoutHandle );
71
+ }, [ shouldRecreate ] );
72
+
73
+ return (
74
+ <SnackbarList
75
+ notices={ notices }
76
+ onRemove={ ( id ) => {
77
+ onRemove( id );
78
+ setNotices( [] );
79
+ setShouldRecreate( true );
80
+ } }
81
+ />
82
+ );
83
+ }
84
+
85
+ render( <RecreatedNotice /> );
86
+
87
+ await act( async () => vi.advanceTimersByTime( 6000 ) );
88
+ expect( onRemove ).toHaveBeenCalledTimes( 1 );
89
+
90
+ // Recreate the notice before its 100ms exit animation completes.
91
+ await act( async () => vi.advanceTimersByTime( 50 ) );
92
+
93
+ expect( screen.getByTestId( 'snackbar' ) ).toHaveTextContent(
94
+ notice.content
95
+ );
96
+
97
+ await act( async () => vi.advanceTimersByTime( 6000 ) );
98
+ expect( onRemove ).toHaveBeenCalledTimes( 2 );
99
+ } );
100
+ } );
@@ -1,3 +1,4 @@
1
+ import { afterEach, describe, expect, it } from 'vitest';
1
2
  import { render } from '@testing-library/react';
2
3
  import { registerStyle } from '@wordpress/style-runtime';
3
4
  import StyleProvider from '..';
@@ -9,12 +9,12 @@
9
9
  }
10
10
 
11
11
  .border-left {
12
- /* stylelint-disable-next-line plugin/use-logical-properties-and-values -- Surface exposes physical border props. */
12
+ /* stylelint-disable-next-line logical-css/require-logical-properties -- Surface exposes physical border props. */
13
13
  border-left: var(--wpds-border-width-xs) solid var(--wpds-color-stroke-surface-neutral);
14
14
  }
15
15
 
16
16
  .border-right {
17
- /* stylelint-disable-next-line plugin/use-logical-properties-and-values -- Surface exposes physical border props. */
17
+ /* stylelint-disable-next-line logical-css/require-logical-properties -- Surface exposes physical border props. */
18
18
  border-right: var(--wpds-border-width-xs) solid var(--wpds-color-stroke-surface-neutral);
19
19
  }
20
20
 
@@ -1,3 +1,4 @@
1
+ import { describe, expect, test } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import { Surface } from '../index';
3
4
 
@@ -1,4 +1,5 @@
1
1
  @use "@wordpress/base-styles/variables" as *;
2
+ @use "@wordpress/base-styles/mixins" as *;
2
3
 
3
4
  .components-tab-panel__tabs {
4
5
  display: flex;
@@ -16,7 +17,6 @@
16
17
  height: $grid-unit-60 !important; // https://github.com/WordPress/gutenberg/pull/65075#discussion_r1746282734
17
18
  background: transparent;
18
19
  border: none;
19
- box-shadow: none;
20
20
  cursor: var(--wpds-cursor-control);
21
21
  padding: 3px var(--wpds-dimension-padding-lg); // Use padding to offset the is-active border, this benefits Windows High Contrast mode
22
22
  margin-left: 0;
@@ -34,7 +34,6 @@
34
34
 
35
35
  &:focus:not(:disabled) {
36
36
  position: relative;
37
- box-shadow: none;
38
37
  outline: none;
39
38
  }
40
39
 
@@ -73,24 +72,12 @@
73
72
  position: absolute;
74
73
  inset: var(--wpds-dimension-padding-md);
75
74
  pointer-events: none;
76
-
77
- // Draw the indicator.
78
- box-shadow: 0 0 0 0 transparent;
79
75
  border-radius: var(--wpds-border-radius-sm);
80
-
81
- // Animation
82
- @media not (prefers-reduced-motion) {
83
- transition: box-shadow 0.1s linear;
84
- }
85
76
  }
86
77
 
87
78
  &:focus-visible::before {
88
- box-shadow:
89
- 0 0 0 var(--wpds-border-width-focus)
90
- var(--wpds-color-stroke-focus);
91
-
92
- // Windows high contrast mode.
93
- outline: 2px solid transparent;
79
+ @include outset-ring__focus();
80
+ outline-offset: 0;
94
81
  }
95
82
 
96
83
  .components-tab-panel__tabs[aria-orientation="vertical"] & {
@@ -108,17 +95,11 @@
108
95
 
109
96
  .components-tab-panel__tab-content {
110
97
  &:focus {
111
- box-shadow: none;
112
98
  outline: none;
113
99
  }
114
100
 
115
101
  &:focus-visible {
116
- box-shadow:
117
- 0 0 0 var(--wpds-border-width-focus)
118
- var(--wpds-color-stroke-focus);
119
-
120
- // Windows high contrast mode.
121
- outline: 2px solid transparent;
102
+ @include outset-ring__focus();
122
103
  outline-offset: 0;
123
104
  }
124
105
  }
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it, vi } from 'vitest';
1
2
  import { render, screen, waitFor } from '@testing-library/react';
2
3
  import { press, hover, click } from '@ariakit/test';
3
4
  import { wordpress, category, media } from '@wordpress/icons';
@@ -34,7 +35,7 @@ describe.each( [
34
35
 
35
36
  describe( 'Accessibility and semantics', () => {
36
37
  it( 'should use the correct aria attributes', async () => {
37
- const panelRenderFunction = jest.fn();
38
+ const panelRenderFunction = vi.fn();
38
39
 
39
40
  render(
40
41
  <Component tabs={ TABS } children={ panelRenderFunction } />
@@ -66,7 +67,7 @@ describe.each( [
66
67
  } );
67
68
 
68
69
  it( 'should display a tooltip when hovering tabs provided with an icon', async () => {
69
- const panelRenderFunction = jest.fn();
70
+ const panelRenderFunction = vi.fn();
70
71
 
71
72
  const TABS_WITH_ICON = [
72
73
  { ...TABS[ 0 ], icon: wordpress },
@@ -102,8 +103,8 @@ describe.each( [
102
103
  } );
103
104
 
104
105
  it( 'should display a tooltip when moving the selection via the keyboard on tabs provided with an icon', async () => {
105
- const mockOnSelect = jest.fn();
106
- const panelRenderFunction = jest.fn();
106
+ const mockOnSelect = vi.fn();
107
+ const panelRenderFunction = vi.fn();
107
108
 
108
109
  const TABS_WITH_ICON = [
109
110
  { ...TABS[ 0 ], icon: wordpress },
@@ -163,7 +164,7 @@ describe.each( [
163
164
 
164
165
  describe( 'Without `initialTabName`', () => {
165
166
  it( 'should render first tab', async () => {
166
- const panelRenderFunction = jest.fn();
167
+ const panelRenderFunction = vi.fn();
167
168
 
168
169
  render(
169
170
  <Component tabs={ TABS } children={ panelRenderFunction } />
@@ -176,7 +177,7 @@ describe.each( [
176
177
  } );
177
178
 
178
179
  it( 'should fall back to first enabled tab if the active tab is removed', async () => {
179
- const mockOnSelect = jest.fn();
180
+ const mockOnSelect = vi.fn();
180
181
  const { rerender } = render(
181
182
  <Component
182
183
  tabs={ TABS }
@@ -247,7 +248,7 @@ describe.each( [
247
248
  } );
248
249
 
249
250
  it( 'should fall back to the tab associated to `initialTabName` if the currently active tab is removed', async () => {
250
- const mockOnSelect = jest.fn();
251
+ const mockOnSelect = vi.fn();
251
252
 
252
253
  const { rerender } = render(
253
254
  <Component
@@ -279,7 +280,7 @@ describe.each( [
279
280
  } );
280
281
 
281
282
  it( 'should have no active tabs when the tab associated to `initialTabName` is removed while being the active tab', async () => {
282
- const mockOnSelect = jest.fn();
283
+ const mockOnSelect = vi.fn();
283
284
 
284
285
  const { rerender } = render(
285
286
  <Component
@@ -311,7 +312,7 @@ describe.each( [
311
312
  } );
312
313
 
313
314
  it( 'waits for the tab with the `initialTabName` to be present in the `tabs` array before selecting it', async () => {
314
- const mockOnSelect = jest.fn();
315
+ const mockOnSelect = vi.fn();
315
316
  const { rerender } = render(
316
317
  <Component
317
318
  initialTabName="delta"
@@ -349,7 +350,7 @@ describe.each( [
349
350
 
350
351
  describe( 'Disabled Tab', () => {
351
352
  it( 'should disable the tab when `disabled` is `true`', async () => {
352
- const mockOnSelect = jest.fn();
353
+ const mockOnSelect = vi.fn();
353
354
 
354
355
  render(
355
356
  <Component
@@ -381,7 +382,7 @@ describe.each( [
381
382
  } );
382
383
 
383
384
  it( 'should select first enabled tab when the initial tab is disabled', async () => {
384
- const mockOnSelect = jest.fn();
385
+ const mockOnSelect = vi.fn();
385
386
 
386
387
  const { rerender } = render(
387
388
  <Component
@@ -416,7 +417,7 @@ describe.each( [
416
417
  } );
417
418
 
418
419
  it( 'should select first enabled tab when the tab associated to `initialTabName` is disabled', async () => {
419
- const mockOnSelect = jest.fn();
420
+ const mockOnSelect = vi.fn();
420
421
 
421
422
  const { rerender } = render(
422
423
  <Component
@@ -452,7 +453,7 @@ describe.each( [
452
453
  } );
453
454
 
454
455
  it( 'should select the first enabled tab when the selected tab becomes disabled', async () => {
455
- const mockOnSelect = jest.fn();
456
+ const mockOnSelect = vi.fn();
456
457
  const { rerender } = render(
457
458
  <Component
458
459
  tabs={ TABS }
@@ -496,7 +497,7 @@ describe.each( [
496
497
  } );
497
498
 
498
499
  it( 'should select the first enabled tab when the tab associated to `initialTabName` becomes disabled while being the active tab', async () => {
499
- const mockOnSelect = jest.fn();
500
+ const mockOnSelect = vi.fn();
500
501
 
501
502
  const { rerender } = render(
502
503
  <Component
@@ -544,8 +545,8 @@ describe.each( [
544
545
 
545
546
  describe( 'Tab Activation', () => {
546
547
  it( 'defaults to automatic tab activation (pointer clicks)', async () => {
547
- const panelRenderFunction = jest.fn();
548
- const mockOnSelect = jest.fn();
548
+ const panelRenderFunction = vi.fn();
549
+ const mockOnSelect = vi.fn();
549
550
 
550
551
  render(
551
552
  <Component
@@ -582,7 +583,7 @@ describe.each( [
582
583
  } );
583
584
 
584
585
  it( 'defaults to automatic tab activation (arrow keys)', async () => {
585
- const mockOnSelect = jest.fn();
586
+ const mockOnSelect = vi.fn();
586
587
 
587
588
  render(
588
589
  <Component
@@ -619,7 +620,7 @@ describe.each( [
619
620
  } );
620
621
 
621
622
  it( 'wraps around the last/first tab when using arrow keys', async () => {
622
- const mockOnSelect = jest.fn();
623
+ const mockOnSelect = vi.fn();
623
624
 
624
625
  render(
625
626
  <Component
@@ -656,7 +657,7 @@ describe.each( [
656
657
  } );
657
658
 
658
659
  it( 'should not move tab selection when pressing the up/down arrow keys, unless the orientation is changed to `vertical`', async () => {
659
- const mockOnSelect = jest.fn();
660
+ const mockOnSelect = vi.fn();
660
661
 
661
662
  const { rerender } = render(
662
663
  <Component
@@ -743,7 +744,7 @@ describe.each( [
743
744
  } );
744
745
 
745
746
  it( 'should move focus on a tab even if disabled with arrow key, but not with pointer clicks', async () => {
746
- const mockOnSelect = jest.fn();
747
+ const mockOnSelect = vi.fn();
747
748
 
748
749
  render(
749
750
  <Component
@@ -822,7 +823,7 @@ describe.each( [
822
823
  } );
823
824
 
824
825
  it( 'switches to manual tab activation when the `selectOnMove` prop is set to `false`', async () => {
825
- const mockOnSelect = jest.fn();
826
+ const mockOnSelect = vi.fn();
826
827
 
827
828
  render(
828
829
  <Component