@wordpress/block-editor 15.16.1-next.v.202604091042.0 → 15.18.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 (303) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/build/components/autocomplete/index.cjs.map +3 -3
  3. package/build/components/background-image-control/index.cjs +2 -1
  4. package/build/components/background-image-control/index.cjs.map +2 -2
  5. package/build/components/block-allowed-blocks/modal.cjs.map +2 -2
  6. package/build/components/block-bindings/attribute-control.cjs.map +3 -3
  7. package/build/components/block-card/index.cjs +2 -2
  8. package/build/components/block-card/index.cjs.map +3 -3
  9. package/build/components/block-mover/button.cjs +9 -3
  10. package/build/components/block-mover/button.cjs.map +2 -2
  11. package/build/components/block-pattern-setup/index.cjs +3 -2
  12. package/build/components/block-pattern-setup/index.cjs.map +2 -2
  13. package/build/components/block-patterns-list/index.cjs +2 -1
  14. package/build/components/block-patterns-list/index.cjs.map +2 -2
  15. package/build/components/block-patterns-paging/index.cjs.map +3 -3
  16. package/build/components/block-settings-menu/block-settings-dropdown.cjs +2 -2
  17. package/build/components/block-settings-menu/block-settings-dropdown.cjs.map +3 -3
  18. package/build/components/block-settings-menu/index.cjs +2 -2
  19. package/build/components/block-settings-menu/index.cjs.map +3 -3
  20. package/build/components/block-styles/menu-items.cjs.map +3 -3
  21. package/build/components/block-switcher/index.cjs.map +3 -3
  22. package/build/components/block-switcher/pattern-transformations-menu.cjs +2 -1
  23. package/build/components/block-switcher/pattern-transformations-menu.cjs.map +2 -2
  24. package/build/components/block-toolbar/pattern-overrides-dropdown.cjs.map +3 -3
  25. package/build/components/block-variation-transforms/index.cjs +2 -1
  26. package/build/components/block-variation-transforms/index.cjs.map +2 -2
  27. package/build/components/block-visibility/viewport-visibility-info.cjs +4 -4
  28. package/build/components/block-visibility/viewport-visibility-info.cjs.map +3 -3
  29. package/build/components/collab/{block-comment-icon-slot.cjs → note-icon-slot.cjs} +8 -8
  30. package/build/components/collab/note-icon-slot.cjs.map +7 -0
  31. package/build/components/collab/{block-comment-icon-toolbar-slot.cjs → note-icon-toolbar-slot.cjs} +9 -9
  32. package/build/components/collab/note-icon-toolbar-slot.cjs.map +7 -0
  33. package/build/components/copy-handler/index.cjs.map +2 -2
  34. package/build/components/date-format-picker/index.cjs +2 -1
  35. package/build/components/date-format-picker/index.cjs.map +2 -2
  36. package/build/components/global-styles/color-panel.cjs.map +2 -2
  37. package/build/components/global-styles/dimensions-panel.cjs +87 -62
  38. package/build/components/global-styles/dimensions-panel.cjs.map +2 -2
  39. package/build/components/global-styles/filters-panel.cjs.map +2 -2
  40. package/build/components/global-styles/hooks.cjs +9 -7
  41. package/build/components/global-styles/hooks.cjs.map +2 -2
  42. package/build/components/grid/grid-item-movers.cjs +2 -1
  43. package/build/components/grid/grid-item-movers.cjs.map +2 -2
  44. package/build/components/inserter/block-patterns-tab/pattern-category-previews.cjs.map +2 -2
  45. package/build/components/inserter/menu.cjs +2 -1
  46. package/build/components/inserter/menu.cjs.map +2 -2
  47. package/build/components/inserter/search-results.cjs +3 -3
  48. package/build/components/inserter/search-results.cjs.map +2 -2
  49. package/build/components/inspector-popover-header/index.cjs.map +3 -3
  50. package/build/components/link-control/link-preview.cjs +5 -3
  51. package/build/components/link-control/link-preview.cjs.map +2 -2
  52. package/build/components/link-control/settings.cjs +2 -1
  53. package/build/components/link-control/settings.cjs.map +2 -2
  54. package/build/components/link-picker/link-picker.cjs +3 -2
  55. package/build/components/link-picker/link-picker.cjs.map +2 -2
  56. package/build/components/link-picker/link-preview.cjs +2 -2
  57. package/build/components/link-picker/link-preview.cjs.map +2 -2
  58. package/build/components/list-view/block-select-button.cjs +2 -2
  59. package/build/components/list-view/block-select-button.cjs.map +2 -2
  60. package/build/components/list-view/index.cjs +2 -1
  61. package/build/components/list-view/index.cjs.map +2 -2
  62. package/build/components/preset-input-control/index.cjs +7 -4
  63. package/build/components/preset-input-control/index.cjs.map +2 -2
  64. package/build/components/provider/index.cjs +80 -7
  65. package/build/components/provider/index.cjs.map +2 -2
  66. package/build/components/responsive-block-control/label.cjs +9 -2
  67. package/build/components/responsive-block-control/label.cjs.map +2 -2
  68. package/build/components/rich-text/event-listeners/index.cjs.map +2 -2
  69. package/build/components/rich-text/event-listeners/paste-handler.cjs +12 -5
  70. package/build/components/rich-text/event-listeners/paste-handler.cjs.map +3 -3
  71. package/build/components/spacing-sizes-control/utils.cjs +1 -1
  72. package/build/components/spacing-sizes-control/utils.cjs.map +2 -2
  73. package/build/components/url-popover/image-url-input-ui.cjs +1 -1
  74. package/build/components/url-popover/image-url-input-ui.cjs.map +2 -2
  75. package/build/components/writing-flow/use-arrow-nav.cjs +1 -1
  76. package/build/components/writing-flow/use-arrow-nav.cjs.map +2 -2
  77. package/build/components/writing-flow/use-selection-observer.cjs +23 -1
  78. package/build/components/writing-flow/use-selection-observer.cjs.map +2 -2
  79. package/build/hooks/block-bindings.cjs.map +3 -3
  80. package/build/hooks/block-fields/link/index.cjs +1 -1
  81. package/build/hooks/block-fields/link/index.cjs.map +1 -1
  82. package/build/hooks/custom-css.cjs +21 -0
  83. package/build/hooks/custom-css.cjs.map +3 -3
  84. package/build/hooks/dimensions.cjs +5 -1
  85. package/build/hooks/dimensions.cjs.map +2 -2
  86. package/build/hooks/grid-visualizer.cjs +1 -1
  87. package/build/hooks/grid-visualizer.cjs.map +1 -1
  88. package/build/hooks/layout-child.cjs +1 -1
  89. package/build/hooks/layout-child.cjs.map +1 -1
  90. package/build/hooks/style.cjs +54 -52
  91. package/build/hooks/style.cjs.map +2 -2
  92. package/build/hooks/utils.cjs +4 -0
  93. package/build/hooks/utils.cjs.map +2 -2
  94. package/build/layouts/flex.cjs +5 -8
  95. package/build/layouts/flex.cjs.map +3 -3
  96. package/build/layouts/grid.cjs +5 -5
  97. package/build/layouts/grid.cjs.map +2 -2
  98. package/build/private-apis.cjs +5 -4
  99. package/build/private-apis.cjs.map +3 -3
  100. package/build/store/private-keys.cjs +3 -0
  101. package/build/store/private-keys.cjs.map +2 -2
  102. package/build/utils/dom.cjs +3 -1
  103. package/build/utils/dom.cjs.map +2 -2
  104. package/build-module/components/autocomplete/index.mjs +2 -2
  105. package/build-module/components/autocomplete/index.mjs.map +2 -2
  106. package/build-module/components/background-image-control/index.mjs +2 -2
  107. package/build-module/components/background-image-control/index.mjs.map +2 -2
  108. package/build-module/components/block-allowed-blocks/modal.mjs +2 -2
  109. package/build-module/components/block-allowed-blocks/modal.mjs.map +2 -2
  110. package/build-module/components/block-bindings/attribute-control.mjs +3 -3
  111. package/build-module/components/block-bindings/attribute-control.mjs.map +2 -2
  112. package/build-module/components/block-card/index.mjs +4 -4
  113. package/build-module/components/block-card/index.mjs.map +2 -2
  114. package/build-module/components/block-mover/button.mjs +11 -5
  115. package/build-module/components/block-mover/button.mjs.map +2 -2
  116. package/build-module/components/block-pattern-setup/index.mjs +2 -1
  117. package/build-module/components/block-pattern-setup/index.mjs.map +2 -2
  118. package/build-module/components/block-patterns-list/index.mjs +1 -1
  119. package/build-module/components/block-patterns-list/index.mjs.map +2 -2
  120. package/build-module/components/block-patterns-paging/index.mjs +3 -3
  121. package/build-module/components/block-patterns-paging/index.mjs.map +2 -2
  122. package/build-module/components/block-settings-menu/block-settings-dropdown.mjs +2 -2
  123. package/build-module/components/block-settings-menu/block-settings-dropdown.mjs.map +2 -2
  124. package/build-module/components/block-settings-menu/index.mjs +2 -2
  125. package/build-module/components/block-settings-menu/index.mjs.map +2 -2
  126. package/build-module/components/block-styles/menu-items.mjs +2 -2
  127. package/build-module/components/block-styles/menu-items.mjs.map +2 -2
  128. package/build-module/components/block-switcher/index.mjs +2 -2
  129. package/build-module/components/block-switcher/index.mjs.map +2 -2
  130. package/build-module/components/block-switcher/pattern-transformations-menu.mjs +2 -7
  131. package/build-module/components/block-switcher/pattern-transformations-menu.mjs.map +2 -2
  132. package/build-module/components/block-toolbar/pattern-overrides-dropdown.mjs +2 -2
  133. package/build-module/components/block-toolbar/pattern-overrides-dropdown.mjs.map +2 -2
  134. package/build-module/components/block-variation-transforms/index.mjs +2 -2
  135. package/build-module/components/block-variation-transforms/index.mjs.map +2 -2
  136. package/build-module/components/block-visibility/viewport-visibility-info.mjs +6 -6
  137. package/build-module/components/block-visibility/viewport-visibility-info.mjs.map +2 -2
  138. package/build-module/components/collab/note-icon-slot.mjs +8 -0
  139. package/build-module/components/collab/note-icon-slot.mjs.map +7 -0
  140. package/build-module/components/collab/note-icon-toolbar-slot.mjs +10 -0
  141. package/build-module/components/collab/note-icon-toolbar-slot.mjs.map +7 -0
  142. package/build-module/components/copy-handler/index.mjs.map +2 -2
  143. package/build-module/components/date-format-picker/index.mjs +2 -2
  144. package/build-module/components/date-format-picker/index.mjs.map +2 -2
  145. package/build-module/components/global-styles/color-panel.mjs.map +2 -2
  146. package/build-module/components/global-styles/dimensions-panel.mjs +87 -62
  147. package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
  148. package/build-module/components/global-styles/filters-panel.mjs.map +2 -2
  149. package/build-module/components/global-styles/hooks.mjs +9 -7
  150. package/build-module/components/global-styles/hooks.mjs.map +2 -2
  151. package/build-module/components/grid/grid-item-movers.mjs +2 -5
  152. package/build-module/components/grid/grid-item-movers.mjs.map +2 -2
  153. package/build-module/components/inserter/block-patterns-tab/pattern-category-previews.mjs +3 -3
  154. package/build-module/components/inserter/block-patterns-tab/pattern-category-previews.mjs.map +1 -1
  155. package/build-module/components/inserter/menu.mjs +3 -2
  156. package/build-module/components/inserter/menu.mjs.map +2 -2
  157. package/build-module/components/inserter/search-results.mjs +1 -1
  158. package/build-module/components/inserter/search-results.mjs.map +1 -1
  159. package/build-module/components/inspector-popover-header/index.mjs +2 -2
  160. package/build-module/components/inspector-popover-header/index.mjs.map +2 -2
  161. package/build-module/components/link-control/link-preview.mjs +5 -3
  162. package/build-module/components/link-control/link-preview.mjs.map +2 -2
  163. package/build-module/components/link-control/settings.mjs +3 -2
  164. package/build-module/components/link-control/settings.mjs.map +2 -2
  165. package/build-module/components/link-picker/link-picker.mjs +1 -1
  166. package/build-module/components/link-picker/link-picker.mjs.map +2 -2
  167. package/build-module/components/link-picker/link-preview.mjs +2 -2
  168. package/build-module/components/link-picker/link-preview.mjs.map +2 -2
  169. package/build-module/components/list-view/block-select-button.mjs +2 -2
  170. package/build-module/components/list-view/block-select-button.mjs.map +2 -2
  171. package/build-module/components/list-view/index.mjs +2 -4
  172. package/build-module/components/list-view/index.mjs.map +2 -2
  173. package/build-module/components/preset-input-control/index.mjs +7 -4
  174. package/build-module/components/preset-input-control/index.mjs.map +2 -2
  175. package/build-module/components/provider/index.mjs +82 -8
  176. package/build-module/components/provider/index.mjs.map +2 -2
  177. package/build-module/components/responsive-block-control/label.mjs +9 -2
  178. package/build-module/components/responsive-block-control/label.mjs.map +2 -2
  179. package/build-module/components/rich-text/event-listeners/index.mjs.map +2 -2
  180. package/build-module/components/rich-text/event-listeners/paste-handler.mjs +12 -5
  181. package/build-module/components/rich-text/event-listeners/paste-handler.mjs.map +2 -2
  182. package/build-module/components/spacing-sizes-control/utils.mjs +1 -1
  183. package/build-module/components/spacing-sizes-control/utils.mjs.map +2 -2
  184. package/build-module/components/url-popover/image-url-input-ui.mjs +1 -1
  185. package/build-module/components/url-popover/image-url-input-ui.mjs.map +2 -2
  186. package/build-module/components/writing-flow/use-arrow-nav.mjs +1 -1
  187. package/build-module/components/writing-flow/use-arrow-nav.mjs.map +2 -2
  188. package/build-module/components/writing-flow/use-selection-observer.mjs +23 -1
  189. package/build-module/components/writing-flow/use-selection-observer.mjs.map +2 -2
  190. package/build-module/hooks/block-bindings.mjs +2 -2
  191. package/build-module/hooks/block-bindings.mjs.map +2 -2
  192. package/build-module/hooks/block-fields/link/index.mjs +1 -1
  193. package/build-module/hooks/block-fields/link/index.mjs.map +1 -1
  194. package/build-module/hooks/custom-css.mjs +23 -2
  195. package/build-module/hooks/custom-css.mjs.map +2 -2
  196. package/build-module/hooks/dimensions.mjs +5 -1
  197. package/build-module/hooks/dimensions.mjs.map +2 -2
  198. package/build-module/hooks/grid-visualizer.mjs +1 -1
  199. package/build-module/hooks/grid-visualizer.mjs.map +1 -1
  200. package/build-module/hooks/layout-child.mjs +1 -1
  201. package/build-module/hooks/layout-child.mjs.map +1 -1
  202. package/build-module/hooks/style.mjs +54 -52
  203. package/build-module/hooks/style.mjs.map +2 -2
  204. package/build-module/hooks/utils.mjs +4 -0
  205. package/build-module/hooks/utils.mjs.map +2 -2
  206. package/build-module/layouts/flex.mjs +4 -7
  207. package/build-module/layouts/flex.mjs.map +2 -2
  208. package/build-module/layouts/grid.mjs +4 -4
  209. package/build-module/layouts/grid.mjs.map +2 -2
  210. package/build-module/private-apis.mjs +7 -5
  211. package/build-module/private-apis.mjs.map +2 -2
  212. package/build-module/store/private-keys.mjs +2 -0
  213. package/build-module/store/private-keys.mjs.map +2 -2
  214. package/build-module/utils/dom.mjs +2 -1
  215. package/build-module/utils/dom.mjs.map +2 -2
  216. package/build-style/content-rtl.css +1 -4
  217. package/build-style/content.css +1 -4
  218. package/build-style/style-rtl.css +12 -12
  219. package/build-style/style.css +12 -12
  220. package/build-types/utils/dom.d.ts +7 -0
  221. package/build-types/utils/dom.d.ts.map +1 -1
  222. package/package.json +39 -38
  223. package/src/components/autocomplete/index.js +4 -2
  224. package/src/components/background-image-control/index.js +2 -2
  225. package/src/components/background-image-control/style.scss +1 -1
  226. package/src/components/block-allowed-blocks/modal.js +3 -3
  227. package/src/components/block-bindings/attribute-control.js +4 -4
  228. package/src/components/block-card/index.js +5 -5
  229. package/src/components/block-list/content.scss +0 -4
  230. package/src/components/block-mover/button.js +17 -7
  231. package/src/components/block-pattern-setup/index.js +2 -1
  232. package/src/components/block-pattern-setup/style.scss +2 -2
  233. package/src/components/block-patterns-list/index.js +1 -1
  234. package/src/components/block-patterns-list/style.scss +1 -1
  235. package/src/components/block-patterns-paging/index.js +5 -6
  236. package/src/components/block-settings-menu/block-settings-dropdown.js +2 -2
  237. package/src/components/block-settings-menu/index.js +2 -2
  238. package/src/components/block-styles/menu-items.js +3 -3
  239. package/src/components/block-switcher/index.js +3 -3
  240. package/src/components/block-switcher/pattern-transformations-menu.js +2 -7
  241. package/src/components/block-switcher/style.scss +2 -2
  242. package/src/components/block-toolbar/pattern-overrides-dropdown.js +2 -2
  243. package/src/components/block-variation-transforms/index.js +2 -2
  244. package/src/components/block-visibility/viewport-visibility-info.js +7 -7
  245. package/src/components/collab/note-icon-slot.js +8 -0
  246. package/src/components/collab/note-icon-toolbar-slot.js +10 -0
  247. package/src/components/copy-handler/index.js +1 -0
  248. package/src/components/date-format-picker/index.js +4 -2
  249. package/src/components/global-styles/color-panel.js +0 -2
  250. package/src/components/global-styles/dimensions-panel.js +100 -73
  251. package/src/components/global-styles/filters-panel.js +0 -2
  252. package/src/components/global-styles/hooks.js +9 -7
  253. package/src/components/global-styles/style.scss +1 -1
  254. package/src/components/grid/grid-item-movers.js +2 -5
  255. package/src/components/inserter/block-patterns-tab/pattern-category-previews.js +5 -5
  256. package/src/components/inserter/menu.js +3 -2
  257. package/src/components/inserter/search-results.js +1 -1
  258. package/src/components/inserter/style.scss +2 -2
  259. package/src/components/inserter-list-item/style.scss +1 -1
  260. package/src/components/inspector-popover-header/index.js +2 -2
  261. package/src/components/link-control/link-preview.js +6 -4
  262. package/src/components/link-control/settings.js +3 -2
  263. package/src/components/link-picker/link-picker.js +1 -1
  264. package/src/components/link-picker/link-preview.js +3 -3
  265. package/src/components/list-view/block-select-button.js +3 -3
  266. package/src/components/list-view/index.js +2 -4
  267. package/src/components/list-view/style.scss +1 -1
  268. package/src/components/media-placeholder/content.scss +1 -1
  269. package/src/components/preset-input-control/index.js +10 -4
  270. package/src/components/preset-input-control/test/index.js +70 -0
  271. package/src/components/provider/index.js +149 -8
  272. package/src/components/responsive-block-control/label.js +5 -2
  273. package/src/components/rich-text/event-listeners/index.js +1 -0
  274. package/src/components/rich-text/event-listeners/paste-handler.js +18 -4
  275. package/src/components/spacing-sizes-control/utils.js +1 -1
  276. package/src/components/url-input/style.scss +1 -1
  277. package/src/components/url-popover/image-url-input-ui.js +1 -1
  278. package/src/components/writing-flow/use-arrow-nav.js +9 -2
  279. package/src/components/writing-flow/use-selection-observer.js +39 -1
  280. package/src/hooks/block-bindings.js +3 -3
  281. package/src/hooks/block-fields/link/index.js +1 -1
  282. package/src/hooks/custom-css.js +30 -9
  283. package/src/hooks/dimensions.js +6 -1
  284. package/src/hooks/grid-visualizer.js +1 -1
  285. package/src/hooks/layout-child.js +1 -1
  286. package/src/hooks/style.js +75 -61
  287. package/src/hooks/test/dimensions.js +16 -0
  288. package/src/hooks/test/style.js +2 -0
  289. package/src/hooks/utils.js +4 -0
  290. package/src/layouts/flex.js +7 -9
  291. package/src/layouts/grid.js +7 -4
  292. package/src/private-apis.js +6 -4
  293. package/src/store/private-keys.js +1 -0
  294. package/src/utils/dom.js +3 -3
  295. package/src/utils/test/dom.js +47 -4
  296. package/build/components/collab/block-comment-icon-slot.cjs.map +0 -7
  297. package/build/components/collab/block-comment-icon-toolbar-slot.cjs.map +0 -7
  298. package/build-module/components/collab/block-comment-icon-slot.mjs +0 -8
  299. package/build-module/components/collab/block-comment-icon-slot.mjs.map +0 -7
  300. package/build-module/components/collab/block-comment-icon-toolbar-slot.mjs +0 -10
  301. package/build-module/components/collab/block-comment-icon-toolbar-slot.mjs.map +0 -7
  302. package/src/components/collab/block-comment-icon-slot.js +0 -8
  303. package/src/components/collab/block-comment-icon-toolbar-slot.js +0 -10
@@ -7,11 +7,8 @@ import clsx from 'clsx';
7
7
  * WordPress dependencies
8
8
  */
9
9
  import { __, isRTL } from '@wordpress/i18n';
10
- import {
11
- VisuallyHidden,
12
- ToolbarButton,
13
- ToolbarGroup,
14
- } from '@wordpress/components';
10
+ import { ToolbarButton, ToolbarGroup } from '@wordpress/components';
11
+ import { VisuallyHidden } from '@wordpress/ui';
15
12
  import {
16
13
  chevronLeft,
17
14
  chevronUp,
@@ -14,7 +14,7 @@ import {
14
14
  __experimentalHStack as HStack,
15
15
  __experimentalVStack as VStack,
16
16
  __experimentalHeading as Heading,
17
- __experimentalText as Text,
17
+ __experimentalText as WCText,
18
18
  FlexBlock,
19
19
  } from '@wordpress/components';
20
20
 
@@ -162,23 +162,23 @@ export function PatternCategoryPreviews( {
162
162
  />
163
163
  </HStack>
164
164
  { ! currentCategoryPatterns.length && (
165
- <Text
165
+ <WCText
166
166
  variant="muted"
167
167
  className="block-editor-inserter__patterns-category-no-results"
168
168
  >
169
169
  { __( 'No results found' ) }
170
- </Text>
170
+ </WCText>
171
171
  ) }
172
172
  </VStack>
173
173
  { currentCategoryPatterns.length > 0 && (
174
174
  <>
175
- <Text
175
+ <WCText
176
176
  size="12"
177
177
  as="p"
178
178
  className="block-editor-inserter__help-text"
179
179
  >
180
180
  { __( 'Drag and drop patterns into the canvas.' ) }
181
- </Text>
181
+ </WCText>
182
182
  <BlockPatternsList
183
183
  ref={ scrollContainerRef }
184
184
  blockPatterns={ pagingProps.categoryPatterns }
@@ -14,7 +14,8 @@ import {
14
14
  useRef,
15
15
  useLayoutEffect,
16
16
  } from '@wordpress/element';
17
- import { VisuallyHidden, SearchControl, Popover } from '@wordpress/components';
17
+ import { SearchControl, Popover } from '@wordpress/components';
18
+ import { VisuallyHidden } from '@wordpress/ui';
18
19
  import { __ } from '@wordpress/i18n';
19
20
  import { useDebouncedInput, useViewportMatch } from '@wordpress/compose';
20
21
  import { useSelect } from '@wordpress/data';
@@ -235,7 +236,7 @@ function InserterMenu(
235
236
  </div>
236
237
  { showInserterHelpPanel && (
237
238
  <div className="block-editor-inserter__tips">
238
- <VisuallyHidden as="h2">
239
+ <VisuallyHidden render={ <h2 /> }>
239
240
  { __( 'A tip for using the block editor' ) }
240
241
  </VisuallyHidden>
241
242
  <Tips />
@@ -3,7 +3,7 @@
3
3
  */
4
4
  import { useMemo, useEffect } from '@wordpress/element';
5
5
  import { __, _n, sprintf } from '@wordpress/i18n';
6
- import { VisuallyHidden } from '@wordpress/components';
6
+ import { VisuallyHidden } from '@wordpress/ui';
7
7
  import { useDebounce, useAsyncList } from '@wordpress/compose';
8
8
  import { speak } from '@wordpress/a11y';
9
9
  import { useSelect } from '@wordpress/data';
@@ -85,7 +85,7 @@ $block-inserter-tabs-height: 44px;
85
85
  .block-editor-inserter__toggle.components-button {
86
86
  display: inline-flex;
87
87
  align-items: center;
88
- cursor: pointer;
88
+ cursor: var(--wpds-cursor-control);
89
89
  border: none;
90
90
  outline: none;
91
91
  padding: 0;
@@ -482,7 +482,7 @@ $block-inserter-tabs-height: 44px;
482
482
 
483
483
  .block-editor-inserter__media-list__list-item {
484
484
  position: relative;
485
- cursor: pointer;
485
+ cursor: var(--wpds-cursor-control);
486
486
  margin-bottom: $grid-unit-30;
487
487
 
488
488
  &.is-placeholder {
@@ -42,7 +42,7 @@
42
42
  padding: $grid-unit-10;
43
43
  align-items: stretch;
44
44
  justify-content: center;
45
- cursor: pointer;
45
+ cursor: var(--wpds-cursor-control);
46
46
  background: transparent;
47
47
  word-break: break-word;
48
48
  @media not ( prefers-reduced-motion ) {
@@ -7,7 +7,7 @@ import {
7
7
  __experimentalHeading as Heading,
8
8
  __experimentalSpacer as Spacer,
9
9
  Button,
10
- __experimentalText as Text,
10
+ __experimentalText as WCText,
11
11
  } from '@wordpress/components';
12
12
  import { closeSmall } from '@wordpress/icons';
13
13
  import { __ } from '@wordpress/i18n';
@@ -52,7 +52,7 @@ export default function InspectorPopoverHeader( {
52
52
  />
53
53
  ) }
54
54
  </HStack>
55
- { help && <Text>{ help }</Text> }
55
+ { help && <WCText>{ help }</WCText> }
56
56
  </VStack>
57
57
  );
58
58
  }
@@ -36,7 +36,7 @@ import { store as preferencesStore } from '@wordpress/preferences';
36
36
  import { unlock } from '../../lock-unlock';
37
37
  import { ViewerSlot } from './viewer-slot';
38
38
 
39
- const { Badge } = unlock( componentsPrivateApis );
39
+ const { Badge: WCBadge } = unlock( componentsPrivateApis );
40
40
 
41
41
  import useRichUrlData from './use-rich-url-data';
42
42
 
@@ -70,7 +70,9 @@ export default function LinkPreview( {
70
70
 
71
71
  const displayTitle =
72
72
  ! isEmptyURL &&
73
- stripHTML( richData?.title || value?.title || displayURL );
73
+ stripHTML(
74
+ value?.entityTitle || richData?.title || value?.title || displayURL
75
+ );
74
76
 
75
77
  let icon;
76
78
 
@@ -162,12 +164,12 @@ export default function LinkPreview( {
162
164
  >
163
165
  { value.badges.map(
164
166
  ( badge, index ) => (
165
- <Badge
167
+ <WCBadge
166
168
  key={ `${ badge.label }|${ badge.intent }|${ index }` }
167
169
  intent={ badge.intent }
168
170
  >
169
171
  { badge.label }
170
- </Badge>
172
+ </WCBadge>
171
173
  )
172
174
  ) }
173
175
  </HStack>
@@ -2,7 +2,8 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { __ } from '@wordpress/i18n';
5
- import { CheckboxControl, VisuallyHidden } from '@wordpress/components';
5
+ import { CheckboxControl } from '@wordpress/components';
6
+ import { VisuallyHidden } from '@wordpress/ui';
6
7
 
7
8
  const noop = () => {};
8
9
 
@@ -58,7 +59,7 @@ const LinkControlSettings = ( { value, onChange = noop, settings } ) => {
58
59
 
59
60
  return (
60
61
  <fieldset className="block-editor-link-control__settings">
61
- <VisuallyHidden as="legend">
62
+ <VisuallyHidden render={ <legend /> }>
62
63
  { __( 'Currently selected link settings' ) }
63
64
  </VisuallyHidden>
64
65
  { theSettings }
@@ -5,9 +5,9 @@ import {
5
5
  BaseControl,
6
6
  Button,
7
7
  Popover,
8
- VisuallyHidden,
9
8
  useBaseControlProps,
10
9
  } from '@wordpress/components';
10
+ import { VisuallyHidden } from '@wordpress/ui';
11
11
  import { useState, useId, useRef } from '@wordpress/element';
12
12
  import { __ } from '@wordpress/i18n';
13
13
 
@@ -16,7 +16,7 @@ import { __unstableStripHTML as stripHTML } from '@wordpress/dom';
16
16
  */
17
17
  import { unlock } from '../../lock-unlock';
18
18
 
19
- const { Badge } = unlock( componentsPrivateApis );
19
+ const { Badge: WCBadge } = unlock( componentsPrivateApis );
20
20
 
21
21
  /**
22
22
  * Link preview component that displays the current link information.
@@ -67,12 +67,12 @@ export function LinkPreview( { title, url, image, badges } ) {
67
67
  alignment="left"
68
68
  >
69
69
  { badges.map( ( badge ) => (
70
- <Badge
70
+ <WCBadge
71
71
  key={ `${ badge.label }|${ badge.intent }` }
72
72
  intent={ badge.intent }
73
73
  >
74
74
  { badge.label }
75
- </Badge>
75
+ </WCBadge>
76
76
  ) ) }
77
77
  </HStack>
78
78
  ) }
@@ -36,7 +36,7 @@ import { store as blockEditorStore } from '../../store';
36
36
  import { unlock } from '../../lock-unlock';
37
37
  import { getBlockVisibilityLabel } from '../block-visibility';
38
38
 
39
- const { Badge } = unlock( componentsPrivateApis );
39
+ const { Badge: WCBadge } = unlock( componentsPrivateApis );
40
40
 
41
41
  function ListViewBlockSelectButton(
42
42
  {
@@ -136,9 +136,9 @@ function ListViewBlockSelectButton(
136
136
  </span>
137
137
  { blockInformation?.anchor && (
138
138
  <span className="block-editor-list-view-block-select-button__anchor-wrapper">
139
- <Badge className="block-editor-list-view-block-select-button__anchor">
139
+ <WCBadge className="block-editor-list-view-block-select-button__anchor">
140
140
  { blockInformation.anchor }
141
- </Badge>
141
+ </WCBadge>
142
142
  </span>
143
143
  ) }
144
144
  { isSticky && (
@@ -11,10 +11,8 @@ import {
11
11
  useMergeRefs,
12
12
  __experimentalUseFixedWindowList as useFixedWindowList,
13
13
  } from '@wordpress/compose';
14
- import {
15
- __experimentalTreeGrid as TreeGrid,
16
- VisuallyHidden,
17
- } from '@wordpress/components';
14
+ import { __experimentalTreeGrid as TreeGrid } from '@wordpress/components';
15
+ import { VisuallyHidden } from '@wordpress/ui';
18
16
  import { AsyncModeProvider, useSelect } from '@wordpress/data';
19
17
  import deprecated from '@wordpress/deprecated';
20
18
  import {
@@ -469,7 +469,7 @@ $block-navigation-max-indent: 8;
469
469
  .block-editor-list-view__expander {
470
470
  height: $icon-size;
471
471
  width: $icon-size;
472
- cursor: pointer;
472
+ cursor: var(--wpds-cursor-control);
473
473
  }
474
474
 
475
475
  .block-editor-list-view-leaf[aria-level] .block-editor-list-view__expander {
@@ -7,7 +7,7 @@
7
7
  min-height: 0;
8
8
 
9
9
  &:hover {
10
- cursor: pointer;
10
+ cursor: var(--wpds-cursor-control);
11
11
  box-shadow: 0 0 0 1px var(--wp-admin-theme-color);
12
12
  }
13
13
  }
@@ -168,12 +168,18 @@ export default function PresetInputControl( {
168
168
  unitConfig?.max ?? customValueSettings[ computedUnit ]?.max ?? 10;
169
169
 
170
170
  const handleCustomValueChange = ( newValue ) => {
171
- const isNumeric = ! isNaN( parseFloat( newValue ) );
172
- const newCustomValue = isNumeric ? newValue : undefined;
171
+ // Treat empty or undefined as an explicit clear and propagate undefined.
172
+ if ( newValue === undefined || newValue === '' ) {
173
+ onChange( undefined );
174
+ return;
175
+ }
173
176
 
174
- if ( newCustomValue !== undefined ) {
175
- onChange( newCustomValue );
177
+ // Ignore non-numeric intermediate input (e.g. just a unit).
178
+ if ( isNaN( parseFloat( newValue ) ) ) {
179
+ return;
176
180
  }
181
+
182
+ onChange( newValue );
177
183
  };
178
184
  const handleCustomValueSliderChange = ( next ) => {
179
185
  onChange( [ next, computedUnit ].join( '' ) );
@@ -92,6 +92,76 @@ describe( 'PresetInputControl', () => {
92
92
  expect( mockOnChange ).toHaveBeenCalledWith( '25px' );
93
93
  } );
94
94
 
95
+ it( 'clears value with undefined when input is fully erased via backspace', () => {
96
+ render(
97
+ <PresetInputControl
98
+ { ...defaultProps }
99
+ presets={ presets }
100
+ value="60px"
101
+ disableCustomValues={ false }
102
+ />
103
+ );
104
+
105
+ const input = screen.getByRole( 'spinbutton' );
106
+
107
+ // Simulate the bug scenario: backspace through "60" one character
108
+ // at a time. fireEvent.change is used here (rather than userEvent
109
+ // keyboard interactions) because the controlled UnitControl input
110
+ // does not respond to synthesised key events in jsdom. The
111
+ // intermediate "6" forwarding is expected and correct; the bug
112
+ // was that the final clear silently failed to propagate, leaving
113
+ // the parent stuck on the partial value.
114
+ fireEvent.change( input, { target: { value: '6' } } );
115
+ fireEvent.change( input, { target: { value: '' } } );
116
+
117
+ // The final clear must propagate as undefined, not be swallowed,
118
+ // and never be persisted as an empty string.
119
+ expect( mockOnChange ).toHaveBeenLastCalledWith( undefined );
120
+ expect( mockOnChange ).not.toHaveBeenCalledWith( '' );
121
+ } );
122
+
123
+ it( 'clears value with undefined when input is cleared in one shot', async () => {
124
+ const user = userEvent.setup();
125
+
126
+ render(
127
+ <PresetInputControl
128
+ { ...defaultProps }
129
+ presets={ presets }
130
+ value="25px"
131
+ disableCustomValues={ false }
132
+ />
133
+ );
134
+
135
+ const input = screen.getByRole( 'spinbutton' );
136
+ await user.clear( input );
137
+
138
+ expect( mockOnChange ).toHaveBeenCalledWith( undefined );
139
+ expect( mockOnChange ).not.toHaveBeenCalledWith( '' );
140
+ } );
141
+
142
+ it( 'does not call onChange for non-numeric intermediate input', async () => {
143
+ const user = userEvent.setup();
144
+
145
+ render(
146
+ <PresetInputControl
147
+ { ...defaultProps }
148
+ presets={ presets }
149
+ value="15px"
150
+ disableCustomValues={ false }
151
+ />
152
+ );
153
+
154
+ const input = screen.getByRole( 'spinbutton' );
155
+ await user.clear( input );
156
+ mockOnChange.mockClear();
157
+
158
+ // Typing a stray non-numeric character should not propagate a change.
159
+ await user.type( input, 'a' );
160
+
161
+ expect( mockOnChange ).not.toHaveBeenCalledWith( 'a' );
162
+ expect( mockOnChange ).not.toHaveBeenCalledWith( 'apx' );
163
+ } );
164
+
95
165
  it( 'uses select dropdown for many presets', async () => {
96
166
  const manyPresets = Array.from( { length: 12 }, ( _, i ) => ( {
97
167
  name: `Preset ${ i + 1 }`,
@@ -8,6 +8,7 @@ import {
8
8
  MediaUploadProvider,
9
9
  store as uploadStore,
10
10
  detectClientSideMediaSupport,
11
+ isHeicCanvasSupported,
11
12
  } from '@wordpress/upload-media';
12
13
 
13
14
  /**
@@ -38,6 +39,17 @@ let hasLoggedFallback = false;
38
39
  */
39
40
  let isClientSideMediaEnabledCache = null;
40
41
 
42
+ /**
43
+ * Cached result of whether HEIC-only canvas processing should be enabled.
44
+ */
45
+ let isHeicCanvasEnabledCache = null;
46
+
47
+ /**
48
+ * HEIC MIME types that should be routed through the upload-media pipeline
49
+ * when in HEIC-only mode.
50
+ */
51
+ const HEIC_MIME_TYPES = [ 'image/heic', 'image/heif' ];
52
+
41
53
  /**
42
54
  * Checks if client-side media processing should be enabled.
43
55
  *
@@ -85,6 +97,44 @@ function shouldEnableClientSideMediaProcessing() {
85
97
  return true;
86
98
  }
87
99
 
100
+ /**
101
+ * Checks if HEIC-only canvas processing should be enabled.
102
+ *
103
+ * Returns true when:
104
+ * 1. Full client-side processing is NOT available (otherwise it handles HEIC already)
105
+ * 2. The server has set the __heicUploadSupport flag
106
+ * 3. The browser supports createImageBitmap + OffscreenCanvas (e.g. Safari)
107
+ *
108
+ * @return {boolean} Whether HEIC-only canvas processing should be enabled.
109
+ */
110
+ function shouldEnableHeicCanvasProcessing() {
111
+ if ( isHeicCanvasEnabledCache !== null ) {
112
+ return isHeicCanvasEnabledCache;
113
+ }
114
+
115
+ // If full client-side processing is enabled, it already handles HEIC.
116
+ if ( shouldEnableClientSideMediaProcessing() ) {
117
+ isHeicCanvasEnabledCache = false;
118
+ return false;
119
+ }
120
+
121
+ if ( ! window.__heicUploadSupport ) {
122
+ isHeicCanvasEnabledCache = false;
123
+ return false;
124
+ }
125
+
126
+ if (
127
+ typeof isHeicCanvasSupported !== 'function' ||
128
+ ! isHeicCanvasSupported()
129
+ ) {
130
+ isHeicCanvasEnabledCache = false;
131
+ return false;
132
+ }
133
+
134
+ isHeicCanvasEnabledCache = true;
135
+ return true;
136
+ }
137
+
88
138
  /**
89
139
  * Upload a media file when the file upload button is activated
90
140
  * or when adding a file to the editor via drag & drop.
@@ -128,6 +178,92 @@ function mediaUpload(
128
178
  } );
129
179
  }
130
180
 
181
+ /**
182
+ * Upload interceptor for HEIC-only mode.
183
+ *
184
+ * Routes HEIC files through the upload-media pipeline for canvas-based
185
+ * conversion, while passing non-HEIC files to the original mediaUpload
186
+ * function for standard server-side processing.
187
+ *
188
+ * @param {WPDataRegistry} registry
189
+ * @param {Object} settings Block editor settings.
190
+ * @param {Object} $3 Parameters object passed to the function.
191
+ * @param {Array} $3.allowedTypes Array with the types of media that can be uploaded, if unset all types are allowed.
192
+ * @param {Object} $3.additionalData Additional data to include in the request.
193
+ * @param {Array<File>} $3.filesList List of files.
194
+ * @param {Function} $3.onError Function called when an error happens.
195
+ * @param {Function} $3.onFileChange Function called each time a file or a temporary representation of the file is available.
196
+ * @param {Function} $3.onSuccess Function called once a file has completely finished uploading, including thumbnails.
197
+ * @param {Function} $3.onBatchSuccess Function called once all files in a group have completely finished uploading, including thumbnails.
198
+ */
199
+ function heicMediaUpload(
200
+ registry,
201
+ settings,
202
+ {
203
+ allowedTypes,
204
+ additionalData = {},
205
+ filesList,
206
+ onError = noop,
207
+ onFileChange,
208
+ onSuccess,
209
+ onBatchSuccess,
210
+ }
211
+ ) {
212
+ const files = Array.from( filesList );
213
+ const heicFiles = files.filter( ( file ) =>
214
+ HEIC_MIME_TYPES.includes( file.type )
215
+ );
216
+ const otherFiles = files.filter(
217
+ ( file ) => ! HEIC_MIME_TYPES.includes( file.type )
218
+ );
219
+
220
+ // When the batch contains both HEIC and non-HEIC files, coordinate
221
+ // onBatchSuccess so it fires only after *both* paths have completed.
222
+ const hasBothPaths =
223
+ heicFiles.length > 0 && otherFiles.length > 0 && settings?.mediaUpload;
224
+ let pathsRemaining = hasBothPaths ? 2 : 1;
225
+ const coordinatedBatchSuccess = hasBothPaths
226
+ ? () => {
227
+ pathsRemaining--;
228
+ if ( pathsRemaining <= 0 ) {
229
+ onBatchSuccess?.();
230
+ }
231
+ }
232
+ : onBatchSuccess;
233
+
234
+ // Route HEIC files through the upload-media pipeline.
235
+ if ( heicFiles.length > 0 ) {
236
+ void registry.dispatch( uploadStore ).addItems( {
237
+ files: heicFiles,
238
+ onChange: onFileChange,
239
+ onSuccess: ( attachments ) => {
240
+ settings?.[ mediaUploadOnSuccessKey ]?.( attachments );
241
+ onSuccess?.( attachments );
242
+ },
243
+ onBatchSuccess: coordinatedBatchSuccess,
244
+ onError: ( error ) =>
245
+ onError(
246
+ typeof error === 'string' ? error : error?.message ?? ''
247
+ ),
248
+ additionalData,
249
+ allowedTypes,
250
+ } );
251
+ }
252
+
253
+ // Pass non-HEIC files to the original server-side upload function.
254
+ if ( otherFiles.length > 0 && settings?.mediaUpload ) {
255
+ settings.mediaUpload( {
256
+ allowedTypes,
257
+ additionalData,
258
+ filesList: otherFiles,
259
+ onError,
260
+ onFileChange,
261
+ onSuccess,
262
+ onBatchSuccess: coordinatedBatchSuccess,
263
+ } );
264
+ }
265
+ }
266
+
131
267
  /**
132
268
  * Calls useBlockSync as a child of SelectionContext.Provider so that the
133
269
  * hook can read selection state from the context provided by this tree
@@ -152,6 +288,9 @@ export const ExperimentalBlockEditorProvider = withRegistryProvider(
152
288
 
153
289
  const isClientSideMediaEnabled =
154
290
  shouldEnableClientSideMediaProcessing();
291
+ const isHeicCanvasEnabled = shouldEnableHeicCanvasProcessing();
292
+ const useUploadMediaPipeline =
293
+ isClientSideMediaEnabled || isHeicCanvasEnabled;
155
294
 
156
295
  // Nested providers (e.g. from useBlockPreview) inherit settings
157
296
  // where mediaUpload has already been replaced with the
@@ -162,16 +301,17 @@ export const ExperimentalBlockEditorProvider = withRegistryProvider(
162
301
 
163
302
  const settings = useMemo( () => {
164
303
  if (
165
- isClientSideMediaEnabled &&
304
+ useUploadMediaPipeline &&
166
305
  _settings?.mediaUpload &&
167
306
  ! isMediaUploadIntercepted
168
307
  ) {
169
- // Create a new object so that the original props.settings.mediaUpload is not modified.
170
- const interceptor = mediaUpload.bind(
171
- null,
172
- registry,
173
- _settings
174
- );
308
+ // Choose the right interceptor:
309
+ // - Full mode: all uploads go through upload-media pipeline.
310
+ // - HEIC-only mode: only HEIC files go through, rest use legacy path.
311
+ const uploadFn = isClientSideMediaEnabled
312
+ ? mediaUpload
313
+ : heicMediaUpload;
314
+ const interceptor = uploadFn.bind( null, registry, _settings );
175
315
  interceptor.__isMediaUploadInterceptor = true;
176
316
  return {
177
317
  ..._settings,
@@ -182,6 +322,7 @@ export const ExperimentalBlockEditorProvider = withRegistryProvider(
182
322
  }, [
183
323
  _settings,
184
324
  registry,
325
+ useUploadMediaPipeline,
185
326
  isClientSideMediaEnabled,
186
327
  isMediaUploadIntercepted,
187
328
  ] );
@@ -258,7 +399,7 @@ export const ExperimentalBlockEditorProvider = withRegistryProvider(
258
399
  // overwrite the store's server-side function with the
259
400
  // interceptor, causing uploads to loop instead of reaching
260
401
  // the server.
261
- if ( isClientSideMediaEnabled && ! isMediaUploadIntercepted ) {
402
+ if ( useUploadMediaPipeline && ! isMediaUploadIntercepted ) {
262
403
  return (
263
404
  <MediaUploadProvider
264
405
  settings={ mediaUploadSettings }
@@ -2,7 +2,7 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { useInstanceId } from '@wordpress/compose';
5
- import { VisuallyHidden } from '@wordpress/components';
5
+ import { VisuallyHidden } from '@wordpress/ui';
6
6
  import { _x, sprintf } from '@wordpress/i18n';
7
7
 
8
8
  export default function ResponsiveBlockControlLabel( {
@@ -27,7 +27,10 @@ export default function ResponsiveBlockControlLabel( {
27
27
  <span aria-describedby={ `rbc-desc-${ instanceId }` }>
28
28
  { viewport.label }
29
29
  </span>
30
- <VisuallyHidden as="span" id={ `rbc-desc-${ instanceId }` }>
30
+ <VisuallyHidden
31
+ id={ `rbc-desc-${ instanceId }` }
32
+ render={ <span /> }
33
+ >
31
34
  { accessibleLabel }
32
35
  </VisuallyHidden>
33
36
  </>
@@ -36,6 +36,7 @@ const allEventListeners = [
36
36
  export function useEventListeners( props ) {
37
37
  const propsRef = useRef( props );
38
38
  useInsertionEffect( () => {
39
+ // eslint-disable-next-line react-compiler/react-compiler -- false positive, see https://github.com/facebook/react/issues/29196
39
40
  propsRef.current = props;
40
41
  } );
41
42
  const refEffects = useMemo(
@@ -8,6 +8,7 @@ import { isURL } from '@wordpress/url';
8
8
  /**
9
9
  * Internal dependencies
10
10
  */
11
+ import { store as blockEditorStore } from '../../../store';
11
12
  import { addActiveFormats } from '../utils';
12
13
  import { getPasteEventData } from '../../../utils/pasting';
13
14
 
@@ -25,6 +26,7 @@ export default ( props ) => ( element ) => {
25
26
  __unstableEmbedURLOnPaste,
26
27
  preserveWhiteSpace,
27
28
  pastePlainText,
29
+ registry,
28
30
  } = props.current;
29
31
 
30
32
  // The event listener is attached to the window, so we need to check if
@@ -116,11 +118,23 @@ export default ( props ) => ( element ) => {
116
118
 
117
119
  if ( typeof content === 'string' ) {
118
120
  pasteInline( content );
119
- } else if ( content.length > 0 ) {
120
- if ( onReplace && isEmpty( value ) ) {
121
- onReplace( content, content.length - 1, -1 );
122
- }
121
+ return;
122
+ }
123
+
124
+ if ( ! content.length || ! onReplace || ! isEmpty( value ) ) {
125
+ return;
123
126
  }
127
+
128
+ // Record an intermediate paragraph-with-URL state so a single undo
129
+ // after the URL → block transformation restores the pasted link.
130
+ if ( mode === 'BLOCKS' ) {
131
+ pasteInline( html );
132
+ registry
133
+ .dispatch( blockEditorStore )
134
+ .__unstableMarkLastChangeAsPersistent();
135
+ }
136
+
137
+ onReplace( content, content.length - 1, -1 );
124
138
  }
125
139
 
126
140
  const { defaultView } = element.ownerDocument;
@@ -14,7 +14,7 @@ import {
14
14
 
15
15
  export const RANGE_CONTROL_MAX_SIZE = 8;
16
16
 
17
- export const ALL_SIDES = [ 'top', 'right', 'bottom', 'left' ];
17
+ export const ALL_SIDES = [ 'top', 'bottom', 'left', 'right' ];
18
18
 
19
19
  export const DEFAULT_VALUES = {
20
20
  top: undefined,