@wordpress/block-editor 17.0.2-next.v.202608281122.0 → 17.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 (382) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/build/components/background-image-control/index.cjs +18 -1
  3. package/build/components/background-image-control/index.cjs.map +2 -2
  4. package/build/components/block-allowed-blocks/modal.cjs +2 -1
  5. package/build/components/block-allowed-blocks/modal.cjs.map +3 -3
  6. package/build/components/block-edit/edit.cjs.map +1 -1
  7. package/build/components/block-inspector/index.cjs +3 -12
  8. package/build/components/block-inspector/index.cjs.map +2 -2
  9. package/build/components/block-list/use-block-props/use-is-hovered.cjs +17 -4
  10. package/build/components/block-list/use-block-props/use-is-hovered.cjs.map +2 -2
  11. package/build/components/block-preview/index.cjs +1 -2
  12. package/build/components/block-preview/index.cjs.map +2 -2
  13. package/build/components/block-switcher/index.cjs +2 -1
  14. package/build/components/block-switcher/index.cjs.map +3 -3
  15. package/build/components/block-toolbar/pattern-overrides-dropdown.cjs +2 -1
  16. package/build/components/block-toolbar/pattern-overrides-dropdown.cjs.map +3 -3
  17. package/build/components/global-styles/border-panel.cjs +19 -42
  18. package/build/components/global-styles/border-panel.cjs.map +2 -2
  19. package/build/components/global-styles/image-settings-panel.cjs.map +1 -1
  20. package/build/components/iframe/index.cjs.map +1 -1
  21. package/build/components/inserter/hooks/use-patterns-paging.cjs.map +1 -1
  22. package/build/components/inserter-draggable-blocks/index.cjs.map +1 -1
  23. package/build/components/inspector-controls-tabs/content-tab.cjs +2 -3
  24. package/build/components/inspector-controls-tabs/content-tab.cjs.map +2 -2
  25. package/build/components/inspector-controls-tabs/styles-tab.cjs +1 -3
  26. package/build/components/inspector-controls-tabs/styles-tab.cjs.map +2 -2
  27. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs +1 -2
  28. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs.map +2 -2
  29. package/build/components/inspector-popover-header/index.cjs +5 -4
  30. package/build/components/inspector-popover-header/index.cjs.map +3 -3
  31. package/build/components/link-control/index.cjs.map +2 -2
  32. package/build/components/link-control/search-input.cjs.map +1 -1
  33. package/build/components/list-view/block-select-button.cjs +9 -1
  34. package/build/components/list-view/block-select-button.cjs.map +2 -2
  35. package/build/components/list-view/block.cjs +2 -1
  36. package/build/components/list-view/block.cjs.map +2 -2
  37. package/build/components/list-view/use-list-view-drop-zone.cjs.map +1 -1
  38. package/build/components/media-replace-flow/index.cjs +4 -1
  39. package/build/components/media-replace-flow/index.cjs.map +2 -2
  40. package/build/components/navigable-toolbar/index.cjs +3 -0
  41. package/build/components/navigable-toolbar/index.cjs.map +2 -2
  42. package/build/components/rich-text/event-listeners/enter.cjs +23 -11
  43. package/build/components/rich-text/event-listeners/enter.cjs.map +2 -2
  44. package/build/components/rich-text/event-listeners/index.cjs +0 -2
  45. package/build/components/rich-text/event-listeners/index.cjs.map +3 -3
  46. package/build/components/rich-text/event-listeners/input-rules.cjs +4 -2
  47. package/build/components/rich-text/event-listeners/input-rules.cjs.map +2 -2
  48. package/build/components/use-block-drop-zone/index.cjs.map +1 -1
  49. package/build/components/writing-flow/index.cjs +5 -0
  50. package/build/components/writing-flow/index.cjs.map +3 -3
  51. package/build/components/writing-flow/use-arrow-nav.cjs.map +1 -1
  52. package/build/components/writing-flow/use-input.cjs +12 -2
  53. package/build/components/writing-flow/use-input.cjs.map +2 -2
  54. package/build/components/writing-flow/use-tab-nav.cjs +84 -41
  55. package/build/components/writing-flow/use-tab-nav.cjs.map +3 -3
  56. package/build/components/{rich-text/event-listeners/undo-automatic-change.cjs → writing-flow/use-undo-automatic-change.cjs} +18 -15
  57. package/build/components/writing-flow/use-undo-automatic-change.cjs.map +7 -0
  58. package/build/hooks/border.cjs +2 -46
  59. package/build/hooks/border.cjs.map +2 -2
  60. package/build/hooks/generate-fields-from-attributes.cjs.map +1 -1
  61. package/build/hooks/index.cjs +0 -2
  62. package/build/hooks/index.cjs.map +3 -3
  63. package/build/hooks/style.cjs +2 -2
  64. package/build/hooks/style.cjs.map +2 -2
  65. package/build/layouts/flex.cjs +3 -0
  66. package/build/layouts/flex.cjs.map +2 -2
  67. package/build/store/actions.cjs +12 -9
  68. package/build/store/actions.cjs.map +3 -3
  69. package/build-module/components/background-image-control/index.mjs +18 -1
  70. package/build-module/components/background-image-control/index.mjs.map +2 -2
  71. package/build-module/components/block-allowed-blocks/modal.mjs +2 -2
  72. package/build-module/components/block-allowed-blocks/modal.mjs.map +2 -2
  73. package/build-module/components/block-edit/edit.mjs.map +1 -1
  74. package/build-module/components/block-inspector/index.mjs +3 -12
  75. package/build-module/components/block-inspector/index.mjs.map +2 -2
  76. package/build-module/components/block-list/use-block-props/use-is-hovered.mjs +17 -4
  77. package/build-module/components/block-list/use-block-props/use-is-hovered.mjs.map +2 -2
  78. package/build-module/components/block-preview/index.mjs +1 -2
  79. package/build-module/components/block-preview/index.mjs.map +2 -2
  80. package/build-module/components/block-switcher/index.mjs +2 -2
  81. package/build-module/components/block-switcher/index.mjs.map +2 -2
  82. package/build-module/components/block-toolbar/pattern-overrides-dropdown.mjs +3 -6
  83. package/build-module/components/block-toolbar/pattern-overrides-dropdown.mjs.map +2 -2
  84. package/build-module/components/global-styles/border-panel.mjs +19 -42
  85. package/build-module/components/global-styles/border-panel.mjs.map +2 -2
  86. package/build-module/components/global-styles/image-settings-panel.mjs.map +1 -1
  87. package/build-module/components/iframe/index.mjs.map +1 -1
  88. package/build-module/components/inserter/hooks/use-patterns-paging.mjs.map +1 -1
  89. package/build-module/components/inserter-draggable-blocks/index.mjs.map +1 -1
  90. package/build-module/components/inspector-controls-tabs/content-tab.mjs +3 -4
  91. package/build-module/components/inspector-controls-tabs/content-tab.mjs.map +2 -2
  92. package/build-module/components/inspector-controls-tabs/styles-tab.mjs +1 -3
  93. package/build-module/components/inspector-controls-tabs/styles-tab.mjs.map +2 -2
  94. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs +1 -2
  95. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs.map +2 -2
  96. package/build-module/components/inspector-popover-header/index.mjs +6 -7
  97. package/build-module/components/inspector-popover-header/index.mjs.map +2 -2
  98. package/build-module/components/link-control/index.mjs.map +2 -2
  99. package/build-module/components/link-control/search-input.mjs.map +1 -1
  100. package/build-module/components/list-view/block-select-button.mjs +9 -1
  101. package/build-module/components/list-view/block-select-button.mjs.map +2 -2
  102. package/build-module/components/list-view/block.mjs +2 -1
  103. package/build-module/components/list-view/block.mjs.map +2 -2
  104. package/build-module/components/list-view/use-list-view-drop-zone.mjs.map +1 -1
  105. package/build-module/components/media-replace-flow/index.mjs +4 -1
  106. package/build-module/components/media-replace-flow/index.mjs.map +2 -2
  107. package/build-module/components/navigable-toolbar/index.mjs +3 -0
  108. package/build-module/components/navigable-toolbar/index.mjs.map +2 -2
  109. package/build-module/components/rich-text/event-listeners/enter.mjs +23 -11
  110. package/build-module/components/rich-text/event-listeners/enter.mjs.map +2 -2
  111. package/build-module/components/rich-text/event-listeners/index.mjs +0 -2
  112. package/build-module/components/rich-text/event-listeners/index.mjs.map +2 -2
  113. package/build-module/components/rich-text/event-listeners/input-rules.mjs +4 -2
  114. package/build-module/components/rich-text/event-listeners/input-rules.mjs.map +2 -2
  115. package/build-module/components/use-block-drop-zone/index.mjs.map +1 -1
  116. package/build-module/components/writing-flow/index.mjs +5 -0
  117. package/build-module/components/writing-flow/index.mjs.map +2 -2
  118. package/build-module/components/writing-flow/use-arrow-nav.mjs.map +1 -1
  119. package/build-module/components/writing-flow/use-input.mjs +12 -2
  120. package/build-module/components/writing-flow/use-input.mjs.map +2 -2
  121. package/build-module/components/writing-flow/use-tab-nav.mjs +86 -43
  122. package/build-module/components/writing-flow/use-tab-nav.mjs.map +3 -3
  123. package/build-module/components/writing-flow/use-undo-automatic-change.mjs +36 -0
  124. package/build-module/components/writing-flow/use-undo-automatic-change.mjs.map +7 -0
  125. package/build-module/hooks/border.mjs +1 -45
  126. package/build-module/hooks/border.mjs.map +2 -2
  127. package/build-module/hooks/generate-fields-from-attributes.mjs.map +1 -1
  128. package/build-module/hooks/index.mjs +0 -2
  129. package/build-module/hooks/index.mjs.map +2 -2
  130. package/build-module/hooks/style.mjs +3 -2
  131. package/build-module/hooks/style.mjs.map +2 -2
  132. package/build-module/layouts/flex.mjs +3 -0
  133. package/build-module/layouts/flex.mjs.map +2 -2
  134. package/build-module/store/actions.mjs +12 -9
  135. package/build-module/store/actions.mjs.map +2 -2
  136. package/build-style/content-rtl.css +9 -20
  137. package/build-style/content.css +9 -20
  138. package/build-style/style-rtl.css +100 -221
  139. package/build-style/style.css +100 -221
  140. package/package.json +42 -41
  141. package/src/autocompleters/test/block.js +1 -0
  142. package/src/components/alignment-control/test/__snapshots__/{index.jsx.snap → index.jsdom.test.jsx.snap} +34 -16
  143. package/src/components/alignment-control/test/{index.jsx → index.jsdom.test.jsx} +2 -1
  144. package/src/components/background-image-control/index.jsx +32 -1
  145. package/src/components/background-image-control/style.scss +5 -3
  146. package/src/components/background-image-control/test/{index.js → index.jsdom.test.js} +1 -0
  147. package/src/components/block-alignment-control/test/__snapshots__/{index.jsx.snap → index.jsdom.test.jsx.snap} +68 -13
  148. package/src/components/block-alignment-control/test/{index.jsx → index.jsdom.test.jsx} +2 -1
  149. package/src/components/block-allowed-blocks/modal.jsx +3 -3
  150. package/src/components/block-bindings/test/{use-block-bindings-utils.js → use-block-bindings-utils.jsdom.test.js} +2 -1
  151. package/src/components/block-breadcrumb/test/__snapshots__/{index.jsx.snap → index.jsdom.test.jsx.snap} +2 -2
  152. package/src/components/block-breadcrumb/test/{index.jsx → index.jsdom.test.jsx} +1 -0
  153. package/src/components/block-compare/test/__snapshots__/{block-view.jsx.snap → block-view.jsdom.test.jsx.snap} +2 -2
  154. package/src/components/block-compare/test/{block-view.jsx → block-view.jsdom.test.jsx} +1 -0
  155. package/src/components/block-controls/test/{index.jsx → index.jsdom.test.jsx} +1 -0
  156. package/src/components/block-edit/edit.jsx +1 -1
  157. package/src/components/block-edit/test/{edit.jsx → edit.jsdom.test.jsx} +1 -0
  158. package/src/components/block-icon/content.scss +0 -6
  159. package/src/components/block-icon/style.scss +0 -6
  160. package/src/components/block-icon/test/__snapshots__/{index.jsx.snap → index.jsdom.test.jsx.snap} +6 -2
  161. package/src/components/block-inspector/index.jsx +3 -11
  162. package/src/components/block-list/content.scss +4 -1
  163. package/src/components/block-list/use-block-props/use-is-hovered.js +24 -5
  164. package/src/components/block-manager/style.scss +2 -0
  165. package/src/components/block-mover/test/mover-description.js +1 -0
  166. package/src/components/block-preview/index.jsx +1 -2
  167. package/src/components/block-preview/test/{index.jsx → index.jsdom.test.jsx} +10 -6
  168. package/src/components/block-selection-clearer/test/{index.jsx → index.jsdom.test.jsx} +24 -19
  169. package/src/components/block-settings-menu/test/{block-mode-toggle.jsx → block-mode-toggle.jsdom.test.jsx} +5 -1
  170. package/src/components/block-styles/test/utils.js +1 -0
  171. package/src/components/block-switcher/index.jsx +3 -3
  172. package/src/components/block-switcher/test/{index.jsx → index.jsdom.test.jsx} +8 -4
  173. package/src/components/block-switcher/test/use-transformed.patterns.js +1 -0
  174. package/src/components/block-switcher/test/utils.js +1 -0
  175. package/src/components/block-title/test/{index.jsx → index.jsdom.test.jsx} +7 -3
  176. package/src/components/block-toolbar/pattern-overrides-dropdown.jsx +3 -6
  177. package/src/components/block-toolbar/style.scss +1 -1
  178. package/src/components/block-toolbar/test/{block-toolbar-icon.jsx → block-toolbar-icon.jsdom.test.jsx} +25 -21
  179. package/src/components/block-variation-picker/content.scss +5 -3
  180. package/src/components/block-vertical-alignment-control/test/__snapshots__/{index.jsx.snap → index.jsdom.test.jsx.snap} +55 -11
  181. package/src/components/block-vertical-alignment-control/test/{index.jsx → index.jsdom.test.jsx} +2 -1
  182. package/src/components/block-visibility/test/{use-block-visibility.js → use-block-visibility.jsdom.test.js} +6 -5
  183. package/src/components/block-visibility/test/utils.js +2 -1
  184. package/src/components/border-radius-control/test/{index.jsx → index.jsdom.test.jsx} +8 -1
  185. package/src/components/border-radius-control/test/utils.js +1 -0
  186. package/src/components/button-block-appender/content.scss +1 -1
  187. package/src/components/child-layout-control/test/{index.jsx → index.jsdom.test.jsx} +18 -15
  188. package/src/components/color-palette/test/{control.jsx → control.jsdom.test.jsx} +15 -4
  189. package/src/components/colors/test/utils.js +1 -0
  190. package/src/components/colors/test/{with-colors.jsx → with-colors.jsdom.test.jsx} +4 -3
  191. package/src/components/colors-gradients/test/{control.jsx → control.jsdom.test.jsx} +8 -3
  192. package/src/components/contrast-checker/test/{index.jsx → index.jsdom.test.jsx} +2 -1
  193. package/src/components/default-block-appender/test/__snapshots__/{index.jsx.snap → index.jsdom.test.jsx.snap} +4 -4
  194. package/src/components/default-block-appender/test/{index.jsx → index.jsdom.test.jsx} +8 -7
  195. package/src/components/dimensions-tool/test/{index.jsx → index.jsdom.test.jsx} +27 -22
  196. package/src/components/dimensions-tool/test/utils.js +1 -0
  197. package/src/components/duotone-control/test/{index.jsx → index.jsdom.test.jsx} +6 -3
  198. package/src/components/font-sizes/test/fluid-utils.js +1 -0
  199. package/src/components/font-sizes/test/utils.js +1 -0
  200. package/src/components/global-styles/border-panel.jsx +17 -40
  201. package/src/components/global-styles/image-settings-panel.jsx +1 -1
  202. package/src/components/global-styles/inheritance/test/{index.jsx → index.jsdom.test.jsx} +5 -2
  203. package/src/components/global-styles/test/{background-panel.jsx → background-panel.jsdom.test.jsx} +10 -5
  204. package/src/components/global-styles/test/{border-panel.jsx → border-panel.jsdom.test.jsx} +113 -13
  205. package/src/components/global-styles/test/{color-panel.jsx → color-panel.jsdom.test.jsx} +5 -0
  206. package/src/components/global-styles/test/{dimensions-panel.jsx → dimensions-panel.jsdom.test.jsx} +14 -14
  207. package/src/components/global-styles/test/{filters-panel.jsx → filters-panel.jsdom.test.jsx} +7 -4
  208. package/src/components/global-styles/test/{inherited-value-context-core.js → inherited-value-context-core.jsdom.test.js} +10 -9
  209. package/src/components/global-styles/test/{inherited-value-context.jsx → inherited-value-context.jsdom.test.jsx} +18 -17
  210. package/src/components/global-styles/test/{state-control-badges.jsx → state-control-badges.jsdom.test.jsx} +3 -2
  211. package/src/components/global-styles/test/{typography-panel-core.jsx → typography-panel-core.jsdom.test.jsx} +5 -2
  212. package/src/components/global-styles/test/{typography-panel.jsx → typography-panel.jsdom.test.jsx} +17 -12
  213. package/src/components/global-styles/test/typography-utils.js +1 -0
  214. package/src/components/global-styles/test/utils.js +1 -0
  215. package/src/components/grid/style.scss +0 -10
  216. package/src/components/iframe/index.jsx +3 -3
  217. package/src/components/image-editor/test/index.js +1 -0
  218. package/src/components/image-size-control/test/{index.jsx → index.jsdom.test.jsx} +8 -3
  219. package/src/components/inner-blocks/test/__snapshots__/index.jsdom.test.jsx.snap +15 -0
  220. package/src/components/inner-blocks/test/{index.jsx → index.jsdom.test.jsx} +2 -0
  221. package/src/components/inner-content/test/{index.jsx → index.jsdom.test.jsx} +1 -0
  222. package/src/components/inserter/hooks/use-patterns-paging.js +1 -1
  223. package/src/components/inserter/media-tab/test/{hooks.js → hooks.jsdom.test.js} +12 -11
  224. package/src/components/inserter/media-tab/test/{media-panel.jsx → media-panel.jsdom.test.jsx} +15 -12
  225. package/src/components/inserter/style.scss +2 -2
  226. package/src/components/inserter/test/get-appender-label.js +12 -11
  227. package/src/components/inserter/test/search-items.js +1 -0
  228. package/src/components/inserter-draggable-blocks/index.jsx +1 -1
  229. package/src/components/inserter-list-item/style.scss +1 -0
  230. package/src/components/inspector-controls-tabs/content-tab.jsx +7 -14
  231. package/src/components/inspector-controls-tabs/styles-tab.jsx +1 -4
  232. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +1 -8
  233. package/src/components/inspector-popover-header/index.jsx +6 -7
  234. package/src/components/line-height-control/test/{index.jsx → index.jsdom.test.jsx} +3 -0
  235. package/src/components/link-control/index.jsx +3 -0
  236. package/src/components/link-control/search-input.jsx +1 -1
  237. package/src/components/link-control/style.scss +1 -1
  238. package/src/components/link-control/test/{index.jsx → index.jsdom.test.jsx} +52 -42
  239. package/src/components/link-control/test/is-url-like.js +1 -0
  240. package/src/components/link-control/test/{url-normalization.test.jsx → url-normalization.jsdom.test.jsx} +21 -20
  241. package/src/components/link-picker/test/{index.jsx → index.jsdom.test.jsx} +31 -30
  242. package/src/components/list-view/block-select-button.jsx +6 -1
  243. package/src/components/list-view/block.jsx +6 -4
  244. package/src/components/list-view/style.scss +55 -35
  245. package/src/components/list-view/test/use-list-view-drop-zone.js +1 -0
  246. package/src/components/list-view/test/utils.js +1 -0
  247. package/src/components/list-view/use-list-view-drop-zone.js +1 -1
  248. package/src/components/media-placeholder/test/get-computed-accept-attribute.js +1 -0
  249. package/src/components/media-placeholder/test/{index.jsx → index.jsdom.test.jsx} +8 -2
  250. package/src/components/media-replace-flow/index.jsx +6 -1
  251. package/src/components/media-replace-flow/test/{index.jsx → index.jsdom.test.jsx} +3 -0
  252. package/src/components/navigable-toolbar/index.jsx +4 -0
  253. package/src/components/navigable-toolbar/test/index.browser.test.js +50 -0
  254. package/src/components/panel-color-settings/test/{index.jsx → index.jsdom.test.jsx} +3 -0
  255. package/src/components/preset-input-control/test/{index.jsx → index.jsdom.test.jsx} +8 -2
  256. package/src/components/preset-input-control/test/utils.js +1 -0
  257. package/src/components/provider/test/{experimental-provider.jsx → experimental-provider.jsdom.test.jsx} +3 -2
  258. package/src/components/provider/test/{use-block-sync.jsx → use-block-sync.jsdom.test.jsx} +45 -44
  259. package/src/components/recursion-provider/test/{index.jsx → index.jsdom.test.jsx} +1 -0
  260. package/src/components/responsive-block-control/style.scss +1 -0
  261. package/src/components/responsive-block-control/test/{index.jsx → index.jsdom.test.jsx} +6 -3
  262. package/src/components/rich-text/event-listeners/enter.js +29 -14
  263. package/src/components/rich-text/event-listeners/index.js +0 -2
  264. package/src/components/rich-text/event-listeners/input-rules.js +7 -2
  265. package/src/components/spacing-sizes-control/test/{index.jsx → index.jsdom.test.jsx} +23 -20
  266. package/src/components/spacing-sizes-control/test/utils.js +1 -0
  267. package/src/components/url-input/test/{button.jsx → button.jsdom.test.jsx} +4 -1
  268. package/src/components/url-input/test/fixtures/validated-input-control-deprecation.js +2 -0
  269. package/src/components/url-input/test/{index.jsx → index.jsdom.test.jsx} +23 -13
  270. package/src/components/use-block-display-information/test/{index.jsx → index.jsdom.test.jsx} +14 -10
  271. package/src/components/use-block-drop-zone/index.js +2 -2
  272. package/src/components/use-block-drop-zone/test/index.js +1 -0
  273. package/src/components/use-on-block-drop/test/index.js +28 -31
  274. package/src/components/warning/test/__snapshots__/{index.jsx.snap → index.jsdom.test.jsx.snap} +2 -2
  275. package/src/components/warning/test/{index.jsx → index.jsdom.test.jsx} +1 -0
  276. package/src/components/writing-flow/index.jsx +5 -0
  277. package/src/components/writing-flow/style.scss +48 -0
  278. package/src/components/writing-flow/test/{index.js → index.jsdom.test.js} +1 -0
  279. package/src/components/writing-flow/use-arrow-nav.js +2 -2
  280. package/src/components/writing-flow/use-input.js +29 -2
  281. package/src/components/writing-flow/use-tab-nav.jsx +155 -70
  282. package/src/components/writing-flow/use-undo-automatic-change.js +40 -0
  283. package/src/elements/test/{index.js → index.jsdom.test.js} +1 -0
  284. package/src/hooks/border.jsx +0 -53
  285. package/src/hooks/generate-fields-from-attributes.js +1 -1
  286. package/src/hooks/index.js +0 -2
  287. package/src/hooks/style.jsx +3 -2
  288. package/src/hooks/test/{align.jsx → align.jsdom.test.jsx} +1 -0
  289. package/src/hooks/test/allowed-blocks.js +1 -0
  290. package/src/hooks/test/{anchor.js → anchor.jsdom.test.js} +1 -0
  291. package/src/hooks/test/{auto-inspector-controls.js → auto-inspector-controls.jsdom.test.js} +1 -0
  292. package/src/hooks/test/{background.jsx → background.jsdom.test.jsx} +5 -2
  293. package/src/hooks/test/{block-style-state.js → block-style-state.jsdom.test.js} +4 -3
  294. package/src/hooks/test/{cross-origin-isolation.js → cross-origin-isolation.jsdom.test.js} +18 -25
  295. package/src/hooks/test/{custom-class-name.jsx → custom-class-name.jsdom.test.jsx} +1 -0
  296. package/src/hooks/test/{dimensions.js → dimensions.jsdom.test.js} +1 -0
  297. package/src/hooks/test/{duotone.js → duotone.jsdom.test.js} +1 -0
  298. package/src/hooks/test/{font-size.js → font-size.jsdom.test.js} +1 -0
  299. package/src/hooks/test/gap.js +1 -0
  300. package/src/hooks/test/generate-fields-from-attributes.js +1 -0
  301. package/src/hooks/test/generated-class-name.js +1 -0
  302. package/src/hooks/test/{inherited-value-wiring.jsx → inherited-value-wiring.jsdom.test.jsx} +49 -51
  303. package/src/hooks/test/{layout-child.js → layout-child.jsdom.test.js} +1 -0
  304. package/src/hooks/test/{layout.js → layout.jsdom.test.js} +1 -0
  305. package/src/hooks/test/metadata.js +1 -0
  306. package/src/hooks/test/preset-round-trip.js +2 -0
  307. package/src/hooks/test/settings.jsx +1 -0
  308. package/src/hooks/test/state-utils.js +1 -0
  309. package/src/hooks/test/{style.jsx → style.jsdom.test.jsx} +1 -0
  310. package/src/hooks/test/{text-align.jsx → text-align.jsdom.test.jsx} +1 -0
  311. package/src/hooks/test/{use-typography-props.js → use-typography-props.jsdom.test.js} +1 -0
  312. package/src/hooks/test/{utils.js → utils.jsdom.test.js} +1 -0
  313. package/src/layouts/flex.jsx +7 -0
  314. package/src/layouts/test/{constrained.jsx → constrained.jsdom.test.jsx} +6 -3
  315. package/src/layouts/test/{flex.jsx → flex.jsdom.test.jsx} +52 -2
  316. package/src/layouts/test/{flow.js → flow.jsdom.test.js} +1 -0
  317. package/src/layouts/test/{grid.jsx → grid.jsdom.test.jsx} +5 -2
  318. package/src/layouts/test/utils.js +1 -0
  319. package/src/store/actions.js +14 -12
  320. package/src/store/test/{actions.js → actions.jsdom.test.js} +50 -49
  321. package/src/store/test/array.js +1 -0
  322. package/src/store/test/get-block-settings.js +1 -0
  323. package/src/store/test/performance.js +2 -1
  324. package/src/store/test/private-actions.js +1 -0
  325. package/src/store/test/private-selectors.js +13 -3
  326. package/src/store/test/reducer.js +37 -8
  327. package/src/store/test/{registry-selectors.js → registry-selectors.jsdom.test.js} +9 -0
  328. package/src/store/test/{selectors.jsx → selectors.jsdom.test.jsx} +13 -3
  329. package/src/style.scss +1 -1
  330. package/src/utils/test/block-bindings.js +1 -0
  331. package/src/utils/test/color-values.js +1 -0
  332. package/src/utils/test/{dom.jsx → dom.jsdom.test.jsx} +38 -43
  333. package/src/utils/test/format-font-style.js +1 -0
  334. package/src/utils/test/format-font-weight.js +1 -0
  335. package/src/utils/test/get-font-styles-and-weights.js +1 -0
  336. package/src/utils/test/math.js +1 -0
  337. package/src/utils/test/object.js +1 -0
  338. package/src/utils/test/pasting.js +1 -0
  339. package/src/utils/test/selection.js +1 -0
  340. package/src/utils/test/sorting.js +1 -0
  341. package/src/utils/test/transform-styles.js +2 -1
  342. package/build/components/rich-text/event-listeners/undo-automatic-change.cjs.map +0 -7
  343. package/build/hooks/block-fields/fields-dropdown-menu.cjs +0 -67
  344. package/build/hooks/block-fields/fields-dropdown-menu.cjs.map +0 -7
  345. package/build/hooks/block-fields/index.cjs +0 -238
  346. package/build/hooks/block-fields/index.cjs.map +0 -7
  347. package/build/hooks/block-fields/link/index.cjs +0 -174
  348. package/build/hooks/block-fields/link/index.cjs.map +0 -7
  349. package/build/hooks/block-fields/media/index.cjs +0 -262
  350. package/build/hooks/block-fields/media/index.cjs.map +0 -7
  351. package/build/hooks/block-fields/rich-text/index.cjs +0 -146
  352. package/build/hooks/block-fields/rich-text/index.cjs.map +0 -7
  353. package/build/hooks/block-fields/use-inspector-popover-placement.cjs +0 -41
  354. package/build/hooks/block-fields/use-inspector-popover-placement.cjs.map +0 -7
  355. package/build-module/components/rich-text/event-listeners/undo-automatic-change.mjs +0 -33
  356. package/build-module/components/rich-text/event-listeners/undo-automatic-change.mjs.map +0 -7
  357. package/build-module/hooks/block-fields/fields-dropdown-menu.mjs +0 -46
  358. package/build-module/hooks/block-fields/fields-dropdown-menu.mjs.map +0 -7
  359. package/build-module/hooks/block-fields/index.mjs +0 -210
  360. package/build-module/hooks/block-fields/index.mjs.map +0 -7
  361. package/build-module/hooks/block-fields/link/index.mjs +0 -141
  362. package/build-module/hooks/block-fields/link/index.mjs.map +0 -7
  363. package/build-module/hooks/block-fields/media/index.mjs +0 -241
  364. package/build-module/hooks/block-fields/media/index.mjs.map +0 -7
  365. package/build-module/hooks/block-fields/rich-text/index.mjs +0 -115
  366. package/build-module/hooks/block-fields/rich-text/index.mjs.map +0 -7
  367. package/build-module/hooks/block-fields/use-inspector-popover-placement.mjs +0 -16
  368. package/build-module/hooks/block-fields/use-inspector-popover-placement.mjs.map +0 -7
  369. package/src/components/color-palette/test/__snapshots__/control.jsx.snap +0 -143
  370. package/src/components/inner-blocks/test/__snapshots__/index.jsx.snap +0 -15
  371. package/src/components/rich-text/event-listeners/undo-automatic-change.js +0 -39
  372. package/src/hooks/block-fields/fields-dropdown-menu.jsx +0 -47
  373. package/src/hooks/block-fields/index.jsx +0 -302
  374. package/src/hooks/block-fields/link/index.jsx +0 -155
  375. package/src/hooks/block-fields/link/styles.scss +0 -18
  376. package/src/hooks/block-fields/media/index.jsx +0 -269
  377. package/src/hooks/block-fields/media/styles.scss +0 -77
  378. package/src/hooks/block-fields/rich-text/index.jsx +0 -123
  379. package/src/hooks/block-fields/rich-text/styles.scss +0 -24
  380. package/src/hooks/block-fields/styles.scss +0 -33
  381. package/src/hooks/block-fields/use-inspector-popover-placement.js +0 -16
  382. /package/src/components/block-icon/test/{index.jsx → index.jsdom.test.jsx} +0 -0
@@ -1,13 +1,12 @@
1
1
  import {
2
2
  __experimentalVStack as VStack,
3
3
  __experimentalHStack as HStack,
4
- __experimentalHeading as Heading,
5
4
  __experimentalSpacer as Spacer,
6
5
  Button,
7
- __experimentalText as WCText,
8
6
  } from '@wordpress/components';
9
7
  import { closeSmall } from '@wordpress/icons';
10
8
  import { __ } from '@wordpress/i18n';
9
+ import { Text } from '@wordpress/ui';
11
10
 
12
11
  export default function InspectorPopoverHeader( {
13
12
  title,
@@ -18,13 +17,13 @@ export default function InspectorPopoverHeader( {
18
17
  return (
19
18
  <VStack className="block-editor-inspector-popover-header" spacing={ 4 }>
20
19
  <HStack alignment="center">
21
- <Heading
20
+ <Text
21
+ variant="heading-md"
22
+ render={ <h2 /> }
22
23
  className="block-editor-inspector-popover-header__heading"
23
- level={ 2 }
24
- size={ 13 }
25
24
  >
26
25
  { title }
27
- </Heading>
26
+ </Text>
28
27
  <Spacer />
29
28
  { actions.map( ( { label, icon, onClick } ) => (
30
29
  <Button
@@ -49,7 +48,7 @@ export default function InspectorPopoverHeader( {
49
48
  />
50
49
  ) }
51
50
  </HStack>
52
- { help && <WCText>{ help }</WCText> }
51
+ { help && <Text>{ help }</Text> }
53
52
  </VStack>
54
53
  );
55
54
  }
@@ -1,9 +1,12 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { render, screen } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { useState } from '@wordpress/element';
4
5
  import LineHeightControl from '../';
5
6
  import { BASE_DEFAULT_VALUE, SPIN_FACTOR, STEP } from '../utils';
6
7
 
8
+ globalThis.wpVitest.mockMatchMedia();
9
+
7
10
  const SPIN = STEP * SPIN_FACTOR;
8
11
 
9
12
  const ControlledLineHeightControl = () => {
@@ -88,11 +88,14 @@ import normalizeUrl from './normalize-url';
88
88
  * @property {boolean=} forceIsEditingLink If passed as either `true` or `false`, controls the
89
89
  * internal editing state of the component to respective
90
90
  * show or not show the URL input field.
91
+ * @property {string=} searchInputPlaceholder Placeholder text for the search input.
91
92
  * @property {WPLinkControlValue=} value Current link value.
92
93
  * @property {WPLinkControlOnChangeProp=} onChange Value change handler, called with the updated value if
93
94
  * the user selects a new link or updates settings.
94
95
  * @property {Function=} onInputChange Callback fired when the search input value changes.
95
96
  * Use this for observation only (e.g., to track search state).
97
+ * @property {Function=} onRemove Callback invoked when the link is removed.
98
+ * @property {Function=} onCancel Callback invoked when editing is cancelled.
96
99
  * @property {string=} inputValue Initial value for the search input (uncontrolled).
97
100
  * @property {boolean=} noDirectEntry Whether to allow turning a URL-like search query directly into a link.
98
101
  * @property {boolean=} showSuggestions Whether to present suggestions when typing the URL.
@@ -104,7 +104,7 @@ const LinkControlSearchInput = forwardRef(
104
104
  // entity metadata from persisting when switching to a different link type.
105
105
  // For example, when changing from an entity link (kind: 'post-type', type: 'page')
106
106
  // to a custom URL (type: 'link', no kind), we need to ensure the old 'kind'
107
- // doesn't carry over. We do want to preserve other properites like title, though.
107
+ // doesn't carry over. We do want to preserve other properties like title, though.
108
108
  const { id, url, kind, type, ...restLinkProps } =
109
109
  currentLink ?? {};
110
110
  onSelect(
@@ -243,7 +243,7 @@ $block-editor-link-control-number-of-actions: 1;
243
243
  padding: 0;
244
244
  margin: -1px;
245
245
  overflow: hidden;
246
- clip: rect(0, 0, 0, 0); // specifically requested to be removed visually as well.
246
+ clip-path: inset(50%);
247
247
  border: 0;
248
248
  }
249
249
  }
@@ -1,3 +1,13 @@
1
+ import {
2
+ afterAll,
3
+ afterEach,
4
+ beforeAll,
5
+ beforeEach,
6
+ describe,
7
+ expect,
8
+ it,
9
+ vi,
10
+ } from 'vitest';
1
11
  import {
2
12
  fireEvent,
3
13
  render as baseRender,
@@ -9,6 +19,7 @@ import userEvent from '@testing-library/user-event';
9
19
  import { SlotFillProvider } from '@wordpress/components';
10
20
  import { useState, createElement } from '@wordpress/element';
11
21
  import { useSelect } from '@wordpress/data';
22
+ import { useReducedMotion } from '@wordpress/compose';
12
23
  import LinkControl from '../';
13
24
  import {
14
25
  fauxEntitySuggestions,
@@ -17,7 +28,12 @@ import {
17
28
  } from './fixtures';
18
29
  import { expectValidatedInputControlDeprecationIfCalled } from '../../url-input/test/fixtures/validated-input-control-deprecation';
19
30
 
20
- const mockFetchSearchSuggestions = jest.fn();
31
+ globalThis.wpVitest.mockMatchMedia();
32
+
33
+ globalThis.wpVitest.mockScrollIntoView();
34
+ globalThis.wpVitest.mockVisibleElements();
35
+
36
+ const mockFetchSearchSuggestions = vi.fn();
21
37
 
22
38
  function getExpectedVisualTypeName( type ) {
23
39
  const builtInLabels = {
@@ -40,26 +56,22 @@ function getExpectedVisualTypeName( type ) {
40
56
  */
41
57
  let mockFetchRichUrlData;
42
58
 
43
- jest.mock( '@wordpress/data/src/components/use-select', () => {
44
- // This allows us to tweak the returned value on each test.
45
- const mock = jest.fn();
46
- return mock;
47
- } );
48
- useSelect.mockImplementation( () => ( {
49
- fetchSearchSuggestions: mockFetchSearchSuggestions,
50
- fetchRichUrlData: mockFetchRichUrlData,
59
+ vi.mock( import( '@wordpress/data' ), async ( importOriginal ) => ( {
60
+ ...( await importOriginal() ),
61
+ useDispatch: () => ( { saveEntityRecords: vi.fn() } ),
62
+ useSelect: vi.fn(),
51
63
  } ) );
52
-
53
- jest.mock( '@wordpress/data/src/components/use-dispatch', () => ( {
54
- useDispatch: () => ( { saveEntityRecords: jest.fn() } ),
55
- } ) );
56
-
57
- jest.mock( '@wordpress/compose', () => ( {
58
- ...jest.requireActual( '@wordpress/compose' ),
59
- useReducedMotion: jest.fn( () => true ),
64
+ vi.mock( import( '@wordpress/compose' ), async ( importOriginal ) => ( {
65
+ ...( await importOriginal() ),
66
+ useReducedMotion: vi.fn( () => true ),
60
67
  } ) );
61
68
 
62
69
  beforeEach( () => {
70
+ useReducedMotion.mockReturnValue( true );
71
+ useSelect.mockImplementation( () => ( {
72
+ fetchSearchSuggestions: mockFetchSearchSuggestions,
73
+ fetchRichUrlData: mockFetchRichUrlData,
74
+ } ) );
63
75
  // Setup a DOM element as a render target.
64
76
  mockFetchSearchSuggestions.mockImplementation( fetchFauxEntitySuggestions );
65
77
  } );
@@ -404,7 +416,7 @@ describe( 'Basic rendering', () => {
404
416
 
405
417
  it( 'should show "Unlink" button if a onRemove handler is provided', async () => {
406
418
  const user = userEvent.setup();
407
- const mockOnRemove = jest.fn();
419
+ const mockOnRemove = vi.fn();
408
420
 
409
421
  render(
410
422
  <LinkControl
@@ -425,7 +437,7 @@ describe( 'Basic rendering', () => {
425
437
 
426
438
  it( 'should revert to "editing" mode when onRemove is triggered', async () => {
427
439
  const user = userEvent.setup();
428
- const mockOnRemove = jest.fn();
440
+ const mockOnRemove = vi.fn();
429
441
 
430
442
  render(
431
443
  <LinkControl
@@ -812,7 +824,7 @@ describe( 'Manual link entry', () => {
812
824
 
813
825
  describe( 'Handling cancellation', () => {
814
826
  it( 'should not show cancellation button during link creation', async () => {
815
- const mockOnRemove = jest.fn();
827
+ const mockOnRemove = vi.fn();
816
828
 
817
829
  render( <LinkControl onRemove={ mockOnRemove } /> );
818
830
 
@@ -910,7 +922,7 @@ describe( 'Manual link entry', () => {
910
922
 
911
923
  it( 'should call onCancel callback when cancelling if provided', async () => {
912
924
  const user = userEvent.setup();
913
- const mockOnCancel = jest.fn();
925
+ const mockOnCancel = vi.fn();
914
926
 
915
927
  render(
916
928
  <LinkControl
@@ -1054,7 +1066,7 @@ describe( 'Link submission', () => {
1054
1066
 
1055
1067
  it( 'should disable Apply button when URL is cleared', async () => {
1056
1068
  const user = userEvent.setup();
1057
- const mockOnChange = jest.fn();
1069
+ const mockOnChange = vi.fn();
1058
1070
 
1059
1071
  const existingLink = { url: 'https://example.com', title: 'Example' };
1060
1072
  render(
@@ -1457,7 +1469,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => {
1457
1469
  render(
1458
1470
  <LinkControl
1459
1471
  showInitialSuggestions // Should show even if we're not showing initial suggestions.
1460
- createSuggestion={ jest.fn() }
1472
+ createSuggestion={ vi.fn() }
1461
1473
  />
1462
1474
  );
1463
1475
 
@@ -1483,7 +1495,7 @@ describe( 'Creating Entities (eg: Posts, Pages)', () => {
1483
1495
  'should not show option to "Create Page" when text is a form of direct entry (eg: %s)',
1484
1496
  async ( inputText ) => {
1485
1497
  const user = userEvent.setup();
1486
- render( <LinkControl createSuggestion={ jest.fn() } /> );
1498
+ render( <LinkControl createSuggestion={ vi.fn() } /> );
1487
1499
 
1488
1500
  // Search Input UI.
1489
1501
  const searchInput = screen.getByRole( 'combobox', {
@@ -1763,7 +1775,6 @@ describe( 'Selecting links', () => {
1763
1775
  } );
1764
1776
 
1765
1777
  // We should have highlighted the first item using the keyboard
1766
- // eslint-disable-next-line jest/no-conditional-expect
1767
1778
  expect( selectedSearchResultElement ).toBe(
1768
1779
  secondSearchSuggestion
1769
1780
  );
@@ -1776,7 +1787,6 @@ describe( 'Selecting links', () => {
1776
1787
  } );
1777
1788
 
1778
1789
  // We should be back to highlighting the first search result again
1779
- // eslint-disable-next-line jest/no-conditional-expect
1780
1790
  expect( selectedSearchResultElement ).toBe(
1781
1791
  firstSearchSuggestion
1782
1792
  );
@@ -2032,7 +2042,7 @@ describe( 'Addition Settings UI', () => {
2032
2042
  it( 'should require settings changes to be submitted/applied', async () => {
2033
2043
  const user = userEvent.setup();
2034
2044
 
2035
- const mockOnChange = jest.fn();
2045
+ const mockOnChange = vi.fn();
2036
2046
 
2037
2047
  const selectedLink = {
2038
2048
  ...fauxEntitySuggestions[ 0 ],
@@ -2160,11 +2170,11 @@ describe( 'Rich link previews', () => {
2160
2170
  beforeAll( () => {
2161
2171
  /**
2162
2172
  * These tests require that we exercise the `fetchRichUrlData` function.
2163
- * We are therefore overwriting the mock "placeholder" with a true jest mock
2173
+ * We are therefore overwriting the mock "placeholder" with a true vi mock
2164
2174
  * which will cause the code under test to execute the code which fetches
2165
2175
  * rich previews.
2166
2176
  */
2167
- mockFetchRichUrlData = jest.fn();
2177
+ mockFetchRichUrlData = vi.fn();
2168
2178
  } );
2169
2179
 
2170
2180
  it( 'should not fetch or display rich previews by default', async () => {
@@ -2487,7 +2497,7 @@ describe( 'Controlling link title text', () => {
2487
2497
 
2488
2498
  it( "should ensure title value matching the text input's current value is included in onChange handler value on submit", async () => {
2489
2499
  const user = userEvent.setup();
2490
- const mockOnChange = jest.fn();
2500
+ const mockOnChange = vi.fn();
2491
2501
  const textValue = 'My new text value';
2492
2502
 
2493
2503
  render(
@@ -2524,7 +2534,7 @@ describe( 'Controlling link title text', () => {
2524
2534
  it( 'should allow `ENTER` keypress within the text field to trigger submission of value', async () => {
2525
2535
  const user = userEvent.setup();
2526
2536
  const newTextValue = 'My new text value';
2527
- const mockOnChange = jest.fn();
2537
+ const mockOnChange = vi.fn();
2528
2538
 
2529
2539
  render(
2530
2540
  <LinkControl
@@ -2563,7 +2573,7 @@ describe( 'Controlling link title text', () => {
2563
2573
  it( 'should reset state upon controlled value change', async () => {
2564
2574
  const user = userEvent.setup();
2565
2575
  const textValue = 'My new text value';
2566
- const mockOnChange = jest.fn();
2576
+ const mockOnChange = vi.fn();
2567
2577
 
2568
2578
  const { rerender } = render(
2569
2579
  <LinkControl
@@ -2719,7 +2729,7 @@ describe( 'Entity handling', () => {
2719
2729
  type: 'page',
2720
2730
  };
2721
2731
 
2722
- const onChange = jest.fn();
2732
+ const onChange = vi.fn();
2723
2733
 
2724
2734
  render(
2725
2735
  <LinkControl
@@ -2778,7 +2788,7 @@ describe( 'Entity handling', () => {
2778
2788
  kind: 'post-type',
2779
2789
  };
2780
2790
 
2781
- const onChange = jest.fn();
2791
+ const onChange = vi.fn();
2782
2792
 
2783
2793
  render(
2784
2794
  <LinkControl
@@ -2842,7 +2852,7 @@ describe( 'Entity handling', () => {
2842
2852
  kind: 'post-type',
2843
2853
  };
2844
2854
 
2845
- const onChange = jest.fn();
2855
+ const onChange = vi.fn();
2846
2856
 
2847
2857
  // Mock search suggestions to return a custom URL
2848
2858
  // URL suggestions have an id and type but no 'kind' (which indicates entity metadata)
@@ -2912,7 +2922,7 @@ describe( 'Entity handling', () => {
2912
2922
 
2913
2923
  it( 'should clear entity metadata when pressing Enter for direct entry (without clicking suggestion)', async () => {
2914
2924
  const user = userEvent.setup();
2915
- const onChange = jest.fn();
2925
+ const onChange = vi.fn();
2916
2926
 
2917
2927
  const pageLink = {
2918
2928
  id: 123,
@@ -3063,7 +3073,7 @@ describe( 'Entity handling', () => {
3063
3073
  describe( 'Custom settings rendering', () => {
3064
3074
  it( 'renders custom settings with valid render functions', async () => {
3065
3075
  const user = userEvent.setup();
3066
- const mockRender = jest.fn(
3076
+ const mockRender = vi.fn(
3067
3077
  // eslint-disable-next-line no-unused-vars
3068
3078
  ( setting, value, onChange ) =>
3069
3079
  createElement(
@@ -3106,7 +3116,7 @@ describe( 'Custom settings rendering', () => {
3106
3116
 
3107
3117
  it( 'renders only valid settings when mixed with invalid ones', async () => {
3108
3118
  const user = userEvent.setup();
3109
- const validRender = jest.fn(
3119
+ const validRender = vi.fn(
3110
3120
  // eslint-disable-next-line no-unused-vars
3111
3121
  ( setting, value, onChange ) =>
3112
3122
  createElement(
@@ -3184,9 +3194,9 @@ describe( 'Custom settings rendering', () => {
3184
3194
 
3185
3195
  it( 'allows custom render functions to call onChange in LinkControl', async () => {
3186
3196
  const user = userEvent.setup();
3187
- const mockOnChange = jest.fn();
3197
+ const mockOnChange = vi.fn();
3188
3198
 
3189
- const mockRender = jest.fn( ( setting, value, onChange ) => {
3199
+ const mockRender = vi.fn( ( setting, value, onChange ) => {
3190
3200
  return createElement(
3191
3201
  'button',
3192
3202
  {
@@ -3250,7 +3260,7 @@ describe( 'Custom settings rendering', () => {
3250
3260
 
3251
3261
  describe( 'URL validation', () => {
3252
3262
  const user = userEvent.setup();
3253
- const mockOnChange = jest.fn();
3263
+ const mockOnChange = vi.fn();
3254
3264
 
3255
3265
  beforeEach( () => {
3256
3266
  mockOnChange.mockClear();
@@ -3581,7 +3591,7 @@ describe( 'inputValue prop', () => {
3581
3591
 
3582
3592
  it( 'should call onInputChange when user types, with observable pattern', async () => {
3583
3593
  const user = userEvent.setup();
3584
- const onInputChange = jest.fn();
3594
+ const onInputChange = vi.fn();
3585
3595
 
3586
3596
  render(
3587
3597
  <LinkControl
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import isURLLike, { isHashLink, isRelativePath } from '../is-url-like';
2
3
 
3
4
  describe( 'isURLLike', () => {
@@ -1,31 +1,32 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
1
2
  import { render, screen, waitFor } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { SlotFillProvider } from '@wordpress/components';
4
5
  import { useSelect } from '@wordpress/data';
6
+ import { useReducedMotion } from '@wordpress/compose';
5
7
  import LinkControl from '../';
6
8
  import { fetchFauxEntitySuggestions } from './fixtures';
7
9
 
8
- const mockFetchSearchSuggestions = jest.fn();
10
+ globalThis.wpVitest.mockMatchMedia();
9
11
 
10
- jest.mock( '@wordpress/data/src/components/use-select', () => {
11
- const mock = jest.fn();
12
- return mock;
13
- } );
14
-
15
- useSelect.mockImplementation( () => ( {
16
- fetchSearchSuggestions: mockFetchSearchSuggestions,
17
- } ) );
12
+ const mockFetchSearchSuggestions = vi.fn();
18
13
 
19
- jest.mock( '@wordpress/data/src/components/use-dispatch', () => ( {
20
- useDispatch: () => ( { saveEntityRecords: jest.fn() } ),
14
+ vi.mock( import( '@wordpress/data' ), async ( importOriginal ) => ( {
15
+ ...( await importOriginal() ),
16
+ useDispatch: () => ( { saveEntityRecords: vi.fn() } ),
17
+ useSelect: vi.fn(),
21
18
  } ) );
22
19
 
23
- jest.mock( '@wordpress/compose', () => ( {
24
- ...jest.requireActual( '@wordpress/compose' ),
25
- useReducedMotion: jest.fn( () => true ),
20
+ vi.mock( import( '@wordpress/compose' ), async ( importOriginal ) => ( {
21
+ ...( await importOriginal() ),
22
+ useReducedMotion: vi.fn( () => true ),
26
23
  } ) );
27
24
 
28
25
  beforeEach( () => {
26
+ useReducedMotion.mockReturnValue( true );
27
+ useSelect.mockImplementation( () => ( {
28
+ fetchSearchSuggestions: mockFetchSearchSuggestions,
29
+ } ) );
29
30
  mockFetchSearchSuggestions.mockImplementation( fetchFauxEntitySuggestions );
30
31
  } );
31
32
 
@@ -40,7 +41,7 @@ function renderWithProvider( ui ) {
40
41
  describe( 'URL normalization consistency', () => {
41
42
  it( 'should normalize bare domain (wordpress.org) to https:// when clicking Apply', async () => {
42
43
  const user = userEvent.setup();
43
- const mockOnChange = jest.fn();
44
+ const mockOnChange = vi.fn();
44
45
 
45
46
  // Start with existing link to show Apply button
46
47
  renderWithProvider(
@@ -78,7 +79,7 @@ describe( 'URL normalization consistency', () => {
78
79
 
79
80
  it( 'should normalize www domain (www.wordpress.org) to https:// when clicking Apply', async () => {
80
81
  const user = userEvent.setup();
81
- const mockOnChange = jest.fn();
82
+ const mockOnChange = vi.fn();
82
83
 
83
84
  // Start with existing link to show Apply button
84
85
  renderWithProvider(
@@ -116,7 +117,7 @@ describe( 'URL normalization consistency', () => {
116
117
 
117
118
  it( 'should preserve explicit http:// protocol', async () => {
118
119
  const user = userEvent.setup();
119
- const mockOnChange = jest.fn();
120
+ const mockOnChange = vi.fn();
120
121
 
121
122
  renderWithProvider(
122
123
  <LinkControl
@@ -151,7 +152,7 @@ describe( 'URL normalization consistency', () => {
151
152
 
152
153
  it( 'should preserve mailto: links without normalization', async () => {
153
154
  const user = userEvent.setup();
154
- const mockOnChange = jest.fn();
155
+ const mockOnChange = vi.fn();
155
156
 
156
157
  renderWithProvider(
157
158
  <LinkControl
@@ -185,7 +186,7 @@ describe( 'URL normalization consistency', () => {
185
186
 
186
187
  it( 'should preserve relative paths without normalization', async () => {
187
188
  const user = userEvent.setup();
188
- const mockOnChange = jest.fn();
189
+ const mockOnChange = vi.fn();
189
190
 
190
191
  renderWithProvider(
191
192
  <LinkControl
@@ -219,7 +220,7 @@ describe( 'URL normalization consistency', () => {
219
220
 
220
221
  it( 'should preserve hash links without normalization', async () => {
221
222
  const user = userEvent.setup();
222
- const mockOnChange = jest.fn();
223
+ const mockOnChange = vi.fn();
223
224
 
224
225
  renderWithProvider(
225
226
  <LinkControl
@@ -1,27 +1,24 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
1
2
  import { render, screen, within, waitFor } from '@testing-library/react';
2
3
  import userEvent from '@testing-library/user-event';
3
4
  import { useSelect } from '@wordpress/data';
5
+ import { useReducedMotion } from '@wordpress/compose';
4
6
  import { LinkPicker } from '../';
5
7
 
6
- const mockFetchSearchSuggestions = jest.fn();
8
+ globalThis.wpVitest.mockMatchMedia();
7
9
 
8
- // Mock useSelect for search suggestions
9
- jest.mock( '@wordpress/data/src/components/use-select', () => {
10
- const mock = jest.fn();
11
- return mock;
12
- } );
13
-
14
- useSelect.mockImplementation( () => ( {
15
- fetchSearchSuggestions: mockFetchSearchSuggestions,
16
- } ) );
10
+ const mockFetchSearchSuggestions = vi.fn();
17
11
 
18
- jest.mock( '@wordpress/data/src/components/use-dispatch', () => ( {
19
- useDispatch: () => ( { saveEntityRecords: jest.fn() } ),
12
+ // Mock useSelect for search suggestions
13
+ vi.mock( import( '@wordpress/data' ), async ( importOriginal ) => ( {
14
+ ...( await importOriginal() ),
15
+ useDispatch: () => ( { saveEntityRecords: vi.fn() } ),
16
+ useSelect: vi.fn(),
20
17
  } ) );
21
18
 
22
- jest.mock( '@wordpress/compose', () => ( {
23
- ...jest.requireActual( '@wordpress/compose' ),
24
- useReducedMotion: jest.fn( () => true ),
19
+ vi.mock( import( '@wordpress/compose' ), async ( importOriginal ) => ( {
20
+ ...( await importOriginal() ),
21
+ useReducedMotion: vi.fn( () => true ),
25
22
  } ) );
26
23
 
27
24
  // Helper to create mock suggestions
@@ -51,6 +48,10 @@ function createMockPreview( {
51
48
  }
52
49
 
53
50
  beforeEach( () => {
51
+ useReducedMotion.mockReturnValue( true );
52
+ useSelect.mockImplementation( () => ( {
53
+ fetchSearchSuggestions: mockFetchSearchSuggestions,
54
+ } ) );
54
55
  mockFetchSearchSuggestions.mockImplementation( () =>
55
56
  Promise.resolve( createMockSuggestions() )
56
57
  );
@@ -66,7 +67,7 @@ describe( 'LinkPicker', () => {
66
67
  render(
67
68
  <LinkPicker
68
69
  preview={ createMockPreview() }
69
- onSelect={ jest.fn() }
70
+ onSelect={ vi.fn() }
70
71
  label="Link"
71
72
  />
72
73
  );
@@ -85,7 +86,7 @@ describe( 'LinkPicker', () => {
85
86
  url: 'example.com',
86
87
  badges: [],
87
88
  } }
88
- onSelect={ jest.fn() }
89
+ onSelect={ vi.fn() }
89
90
  label="Link"
90
91
  />
91
92
  );
@@ -104,7 +105,7 @@ describe( 'LinkPicker', () => {
104
105
  url: 'example.com',
105
106
  badges: [ { label: 'Page', intent: 'default' } ],
106
107
  } }
107
- onSelect={ jest.fn() }
108
+ onSelect={ vi.fn() }
108
109
  label="Link"
109
110
  />
110
111
  );
@@ -124,7 +125,7 @@ describe( 'LinkPicker', () => {
124
125
  image: 'https://example.com/image.jpg',
125
126
  badges: [ { label: 'Page', intent: 'default' } ],
126
127
  } }
127
- onSelect={ jest.fn() }
128
+ onSelect={ vi.fn() }
128
129
  label="Link"
129
130
  />
130
131
  );
@@ -144,7 +145,7 @@ describe( 'LinkPicker', () => {
144
145
  render(
145
146
  <LinkPicker
146
147
  preview={ createMockPreview( { url: 'example.com' } ) }
147
- onSelect={ jest.fn() }
148
+ onSelect={ vi.fn() }
148
149
  label="Link to"
149
150
  />
150
151
  );
@@ -156,7 +157,7 @@ describe( 'LinkPicker', () => {
156
157
  render(
157
158
  <LinkPicker
158
159
  preview={ createMockPreview( { url: 'example.com' } ) }
159
- onSelect={ jest.fn() }
160
+ onSelect={ vi.fn() }
160
161
  label="Link"
161
162
  help="Synced with the selected page."
162
163
  />
@@ -175,7 +176,7 @@ describe( 'LinkPicker', () => {
175
176
  render(
176
177
  <LinkPicker
177
178
  preview={ createMockPreview( { url: 'example.com' } ) }
178
- onSelect={ jest.fn() }
179
+ onSelect={ vi.fn() }
179
180
  label="Link"
180
181
  />
181
182
  );
@@ -202,7 +203,7 @@ describe( 'LinkPicker', () => {
202
203
  render(
203
204
  <LinkPicker
204
205
  preview={ createMockPreview( { url: 'example.com' } ) }
205
- onSelect={ jest.fn() }
206
+ onSelect={ vi.fn() }
206
207
  label="Link"
207
208
  />
208
209
  );
@@ -226,7 +227,7 @@ describe( 'LinkPicker', () => {
226
227
  render(
227
228
  <LinkPicker
228
229
  preview={ createMockPreview( { url: 'example.com' } ) }
229
- onSelect={ jest.fn() }
230
+ onSelect={ vi.fn() }
230
231
  label="Link"
231
232
  />
232
233
  );
@@ -263,7 +264,7 @@ describe( 'LinkPicker', () => {
263
264
  render(
264
265
  <LinkPicker
265
266
  preview={ createMockPreview( { url: 'example.com' } ) }
266
- onSelect={ jest.fn() }
267
+ onSelect={ vi.fn() }
267
268
  label="Link"
268
269
  help="This is help text"
269
270
  />
@@ -284,7 +285,7 @@ describe( 'LinkPicker', () => {
284
285
  render(
285
286
  <LinkPicker
286
287
  preview={ createMockPreview( { url: 'example.com' } ) }
287
- onSelect={ jest.fn() }
288
+ onSelect={ vi.fn() }
288
289
  label="Link"
289
290
  />
290
291
  );
@@ -299,7 +300,7 @@ describe( 'LinkPicker', () => {
299
300
  describe( 'Selection behavior', () => {
300
301
  it( 'should call onSelect with suggestion data when a suggestion is selected', async () => {
301
302
  const user = userEvent.setup();
302
- const onSelect = jest.fn();
303
+ const onSelect = vi.fn();
303
304
 
304
305
  render(
305
306
  <LinkPicker
@@ -348,7 +349,7 @@ describe( 'LinkPicker', () => {
348
349
  render(
349
350
  <LinkPicker
350
351
  preview={ createMockPreview() }
351
- onSelect={ jest.fn() }
352
+ onSelect={ vi.fn() }
352
353
  label="Link"
353
354
  />
354
355
  );
@@ -392,7 +393,7 @@ describe( 'LinkPicker', () => {
392
393
  render(
393
394
  <LinkPicker
394
395
  preview={ createMockPreview() }
395
- onSelect={ jest.fn() }
396
+ onSelect={ vi.fn() }
396
397
  suggestionsQuery={ customQuery }
397
398
  label="Link"
398
399
  />
@@ -423,7 +424,7 @@ describe( 'LinkPicker', () => {
423
424
  describe( 'Integration scenarios', () => {
424
425
  it( 'should handle changing from empty link to entity link', async () => {
425
426
  const user = userEvent.setup();
426
- const onSelect = jest.fn();
427
+ const onSelect = vi.fn();
427
428
 
428
429
  render(
429
430
  <LinkPicker
@@ -33,6 +33,7 @@ function ListViewBlockSelectButton(
33
33
  onDragEnd,
34
34
  draggable,
35
35
  isExpanded,
36
+ isSelected,
36
37
  ariaDescribedBy,
37
38
  visibilityLabel,
38
39
  isDisabled = false,
@@ -129,7 +130,11 @@ function ListViewBlockSelectButton(
129
130
  aria-expanded={ isExpanded }
130
131
  >
131
132
  <ListViewExpander onClick={ onToggleExpanded } />
132
- <BlockIcon icon={ icon } showColors context="list-view" />
133
+ <BlockIcon
134
+ icon={ icon }
135
+ showColors={ ! isSelected }
136
+ context="list-view"
137
+ />
133
138
  <Stack
134
139
  align="center"
135
140
  className="block-editor-list-view-block-select-button__label-wrapper"