@wordpress/block-editor 16.0.1-next.v.202607070741.0 → 16.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 (679) hide show
  1. package/CHANGELOG.md +27 -1
  2. package/README.md +8 -0
  3. package/build/components/alignment-control/ui.cjs +2 -4
  4. package/build/components/alignment-control/ui.cjs.map +2 -2
  5. package/build/components/background-image-control/index.cjs +40 -10
  6. package/build/components/background-image-control/index.cjs.map +2 -2
  7. package/build/components/block-alignment-control/ui.cjs +5 -3
  8. package/build/components/block-alignment-control/ui.cjs.map +2 -2
  9. package/build/components/block-canvas/index.cjs +6 -1
  10. package/build/components/block-canvas/index.cjs.map +2 -2
  11. package/build/components/block-controls/groups.cjs +3 -1
  12. package/build/components/block-controls/groups.cjs.map +2 -2
  13. package/build/components/block-edit/edit.cjs +10 -18
  14. package/build/components/block-edit/edit.cjs.map +2 -2
  15. package/build/components/block-inspector/index.cjs +73 -46
  16. package/build/components/block-inspector/index.cjs.map +2 -2
  17. package/build/components/block-list/block-html.cjs +4 -1
  18. package/build/components/block-list/block-html.cjs.map +2 -2
  19. package/build/components/block-list/block.cjs +9 -3
  20. package/build/components/block-list/block.cjs.map +3 -3
  21. package/build/components/block-list/index.cjs +1 -3
  22. package/build/components/block-list/index.cjs.map +2 -2
  23. package/build/components/block-list/use-block-props/index.cjs +7 -2
  24. package/build/components/block-list/use-block-props/index.cjs.map +2 -2
  25. package/build/components/block-list/use-block-props/use-focus-first-element.cjs +9 -4
  26. package/build/components/block-list/use-block-props/use-focus-first-element.cjs.map +2 -2
  27. package/build/components/block-list/use-block-props/use-focus-handler.cjs +11 -4
  28. package/build/components/block-list/use-block-props/use-focus-handler.cjs.map +2 -2
  29. package/build/components/block-list/use-block-props/use-register-block-event-handlers.cjs +48 -0
  30. package/build/components/block-list/use-block-props/use-register-block-event-handlers.cjs.map +7 -0
  31. package/build/components/block-parent-selector/index.cjs +2 -2
  32. package/build/components/block-parent-selector/index.cjs.map +2 -2
  33. package/build/components/block-toolbar/index.cjs +43 -24
  34. package/build/components/block-toolbar/index.cjs.map +2 -2
  35. package/build/components/block-toolbar/switch-section-style.cjs +4 -2
  36. package/build/components/block-toolbar/switch-section-style.cjs.map +3 -3
  37. package/build/components/block-tools/empty-block-inserter.cjs +2 -7
  38. package/build/components/block-tools/empty-block-inserter.cjs.map +2 -2
  39. package/build/components/block-tools/index.cjs +7 -2
  40. package/build/components/block-tools/index.cjs.map +2 -2
  41. package/build/components/block-vertical-alignment-control/ui.cjs +3 -5
  42. package/build/components/block-vertical-alignment-control/ui.cjs.map +2 -2
  43. package/build/components/block-visibility/modal.cjs +20 -6
  44. package/build/components/block-visibility/modal.cjs.map +2 -2
  45. package/build/components/block-visibility/use-block-visibility.cjs +16 -6
  46. package/build/components/block-visibility/use-block-visibility.cjs.map +3 -3
  47. package/build/components/block-visibility/utils.cjs +15 -2
  48. package/build/components/block-visibility/utils.cjs.map +3 -3
  49. package/build/components/block-visibility/viewport-menu-item.cjs +7 -1
  50. package/build/components/block-visibility/viewport-menu-item.cjs.map +2 -2
  51. package/build/components/block-visibility/viewport-toolbar.cjs +5 -0
  52. package/build/components/block-visibility/viewport-toolbar.cjs.map +2 -2
  53. package/build/components/block-visibility/viewport-visibility-info.cjs +5 -1
  54. package/build/components/block-visibility/viewport-visibility-info.cjs.map +2 -2
  55. package/build/components/border-radius-control/utils.cjs +8 -58
  56. package/build/components/border-radius-control/utils.cjs.map +2 -2
  57. package/build/components/child-layout-control/index.cjs +0 -4
  58. package/build/components/child-layout-control/index.cjs.map +2 -2
  59. package/build/components/colors-gradients/control.cjs +5 -3
  60. package/build/components/colors-gradients/control.cjs.map +2 -2
  61. package/build/components/dimension-control/index.cjs +30 -20
  62. package/build/components/dimension-control/index.cjs.map +3 -3
  63. package/build/components/dimensions-tool/aspect-ratio-tool.cjs +9 -2
  64. package/build/components/dimensions-tool/aspect-ratio-tool.cjs.map +3 -3
  65. package/build/components/editor-styles/index.cjs +9 -1
  66. package/build/components/editor-styles/index.cjs.map +2 -2
  67. package/build/components/global-styles/background-panel.cjs +66 -25
  68. package/build/components/global-styles/background-panel.cjs.map +3 -3
  69. package/build/components/global-styles/border-panel.cjs +153 -55
  70. package/build/components/global-styles/border-panel.cjs.map +3 -3
  71. package/build/components/global-styles/color-gradient-dropdown-item.cjs +46 -14
  72. package/build/components/global-styles/color-gradient-dropdown-item.cjs.map +3 -3
  73. package/build/components/global-styles/color-panel.cjs +63 -17
  74. package/build/components/global-styles/color-panel.cjs.map +2 -2
  75. package/build/components/global-styles/dimensions-panel.cjs +242 -64
  76. package/build/components/global-styles/dimensions-panel.cjs.map +3 -3
  77. package/build/components/global-styles/filters-panel.cjs +59 -20
  78. package/build/components/global-styles/filters-panel.cjs.map +3 -3
  79. package/build/components/global-styles/hooks.cjs +4 -1
  80. package/build/components/global-styles/hooks.cjs.map +2 -2
  81. package/build/components/global-styles/inheritance/index.cjs +142 -0
  82. package/build/components/global-styles/inheritance/index.cjs.map +7 -0
  83. package/build/components/global-styles/inherited-value-context.cjs +173 -0
  84. package/build/components/global-styles/inherited-value-context.cjs.map +7 -0
  85. package/build/components/global-styles/shadow-panel-components.cjs +38 -20
  86. package/build/components/global-styles/shadow-panel-components.cjs.map +2 -2
  87. package/build/components/global-styles/state-control-badges.cjs +39 -3
  88. package/build/components/global-styles/state-control-badges.cjs.map +2 -2
  89. package/build/components/global-styles/state-control.cjs +1 -1
  90. package/build/components/global-styles/state-control.cjs.map +2 -2
  91. package/build/components/global-styles/typography-panel.cjs +271 -79
  92. package/build/components/global-styles/typography-panel.cjs.map +3 -3
  93. package/build/components/image-size-control/index.cjs +2 -4
  94. package/build/components/image-size-control/index.cjs.map +2 -2
  95. package/build/components/inserter/media-tab/hooks.cjs +33 -6
  96. package/build/components/inserter/media-tab/hooks.cjs.map +2 -2
  97. package/build/components/inserter/media-tab/media-panel.cjs +78 -16
  98. package/build/components/inserter/media-tab/media-panel.cjs.map +3 -3
  99. package/build/components/inspector-controls-tabs/styles-tab.cjs +10 -1
  100. package/build/components/inspector-controls-tabs/styles-tab.cjs.map +2 -2
  101. package/build/components/keyboard-shortcuts/index.cjs +19 -11
  102. package/build/components/keyboard-shortcuts/index.cjs.map +2 -2
  103. package/build/components/line-height-control/index.cjs +1 -2
  104. package/build/components/line-height-control/index.cjs.map +2 -2
  105. package/build/components/link-control/index.cjs +3 -1
  106. package/build/components/link-control/index.cjs.map +2 -2
  107. package/build/components/list-view/block.cjs +13 -4
  108. package/build/components/list-view/block.cjs.map +2 -2
  109. package/build/components/media-placeholder/index.cjs +0 -1
  110. package/build/components/media-placeholder/index.cjs.map +2 -2
  111. package/build/components/preset-input-control/index.cjs +2 -1
  112. package/build/components/preset-input-control/index.cjs.map +2 -2
  113. package/build/components/provider/block-refs-provider.cjs +8 -2
  114. package/build/components/provider/block-refs-provider.cjs.map +2 -2
  115. package/build/components/provider/index.cjs +1 -1
  116. package/build/components/provider/index.cjs.map +2 -2
  117. package/build/components/provider/use-block-sync.cjs +18 -6
  118. package/build/components/provider/use-block-sync.cjs.map +2 -2
  119. package/build/components/provider/use-media-upload-settings.cjs +3 -1
  120. package/build/components/provider/use-media-upload-settings.cjs.map +2 -2
  121. package/build/components/rich-text/event-listeners/before-input-rules.cjs +3 -4
  122. package/build/components/rich-text/event-listeners/before-input-rules.cjs.map +3 -3
  123. package/build/components/rich-text/event-listeners/delete.cjs +2 -3
  124. package/build/components/rich-text/event-listeners/delete.cjs.map +3 -3
  125. package/build/components/rich-text/event-listeners/enter.cjs +3 -2
  126. package/build/components/rich-text/event-listeners/enter.cjs.map +3 -3
  127. package/build/components/rich-text/event-listeners/input-events.cjs +3 -3
  128. package/build/components/rich-text/event-listeners/input-events.cjs.map +3 -3
  129. package/build/components/rich-text/event-listeners/input-rules.cjs +3 -4
  130. package/build/components/rich-text/event-listeners/input-rules.cjs.map +3 -3
  131. package/build/components/rich-text/event-listeners/insert-replacement-text.cjs +3 -3
  132. package/build/components/rich-text/event-listeners/insert-replacement-text.cjs.map +3 -3
  133. package/build/components/rich-text/event-listeners/paste-handler.cjs +2 -1
  134. package/build/components/rich-text/event-listeners/paste-handler.cjs.map +3 -3
  135. package/build/components/rich-text/event-listeners/remove-browser-shortcuts.cjs +3 -3
  136. package/build/components/rich-text/event-listeners/remove-browser-shortcuts.cjs.map +3 -3
  137. package/build/components/rich-text/event-listeners/shortcuts.cjs +3 -3
  138. package/build/components/rich-text/event-listeners/shortcuts.cjs.map +3 -3
  139. package/build/components/rich-text/event-listeners/undo-automatic-change.cjs +3 -3
  140. package/build/components/rich-text/event-listeners/undo-automatic-change.cjs.map +3 -3
  141. package/build/components/rich-text/index.cjs +76 -17
  142. package/build/components/rich-text/index.cjs.map +2 -2
  143. package/build/components/spacing-sizes-control/utils.cjs +6 -19
  144. package/build/components/spacing-sizes-control/utils.cjs.map +2 -2
  145. package/build/components/text-indent-control/index.cjs +8 -2
  146. package/build/components/text-indent-control/index.cjs.map +2 -2
  147. package/build/components/typewriter/index.cjs +129 -136
  148. package/build/components/typewriter/index.cjs.map +3 -3
  149. package/build/components/url-input/index.cjs +303 -344
  150. package/build/components/url-input/index.cjs.map +3 -3
  151. package/build/components/use-block-commands/index.cjs +21 -17
  152. package/build/components/use-block-commands/index.cjs.map +2 -2
  153. package/build/components/use-on-block-drop/index.cjs +1 -1
  154. package/build/components/use-on-block-drop/index.cjs.map +2 -2
  155. package/build/components/writing-flow/index.cjs +14 -1
  156. package/build/components/writing-flow/index.cjs.map +3 -3
  157. package/build/components/writing-flow/use-arrow-nav.cjs +42 -6
  158. package/build/components/writing-flow/use-arrow-nav.cjs.map +2 -2
  159. package/build/components/writing-flow/use-click-selection.cjs +29 -3
  160. package/build/components/writing-flow/use-click-selection.cjs.map +2 -2
  161. package/build/components/writing-flow/use-clipboard-handler.cjs +4 -1
  162. package/build/components/writing-flow/use-clipboard-handler.cjs.map +2 -2
  163. package/build/components/writing-flow/use-drag-selection.cjs +3 -8
  164. package/build/components/writing-flow/use-drag-selection.cjs.map +2 -2
  165. package/build/components/writing-flow/use-editable-root-event-handlers.cjs +179 -0
  166. package/build/components/writing-flow/use-editable-root-event-handlers.cjs.map +7 -0
  167. package/build/components/writing-flow/use-editable-root.cjs +75 -0
  168. package/build/components/writing-flow/use-editable-root.cjs.map +7 -0
  169. package/build/components/writing-flow/use-home-end.cjs +64 -0
  170. package/build/components/writing-flow/use-home-end.cjs.map +7 -0
  171. package/build/components/writing-flow/use-input.cjs +15 -5
  172. package/build/components/writing-flow/use-input.cjs.map +2 -2
  173. package/build/components/writing-flow/use-multi-selection.cjs +2 -2
  174. package/build/components/writing-flow/use-multi-selection.cjs.map +2 -2
  175. package/build/components/writing-flow/use-select-all.cjs +14 -2
  176. package/build/components/writing-flow/use-select-all.cjs.map +2 -2
  177. package/build/components/writing-flow/use-selection-observer.cjs +132 -22
  178. package/build/components/writing-flow/use-selection-observer.cjs.map +3 -3
  179. package/build/components/writing-flow/utils.cjs +28 -2
  180. package/build/components/writing-flow/utils.cjs.map +2 -2
  181. package/build/hooks/background.cjs +14 -10
  182. package/build/hooks/background.cjs.map +2 -2
  183. package/build/hooks/block-fields/rich-text/index.cjs +2 -3
  184. package/build/hooks/block-fields/rich-text/index.cjs.map +3 -3
  185. package/build/hooks/block-style-variation.cjs +4 -45
  186. package/build/hooks/block-style-variation.cjs.map +3 -3
  187. package/build/hooks/border.cjs +19 -4
  188. package/build/hooks/border.cjs.map +2 -2
  189. package/build/hooks/custom-css.cjs +6 -2
  190. package/build/hooks/custom-css.cjs.map +2 -2
  191. package/build/hooks/dimensions.cjs +15 -4
  192. package/build/hooks/dimensions.cjs.map +2 -2
  193. package/build/hooks/duotone.cjs +26 -14
  194. package/build/hooks/duotone.cjs.map +3 -3
  195. package/build/hooks/elements.cjs +15 -5
  196. package/build/hooks/elements.cjs.map +2 -2
  197. package/build/hooks/grid-visualizer.cjs +5 -3
  198. package/build/hooks/grid-visualizer.cjs.map +2 -2
  199. package/build/hooks/layout-child.cjs +22 -12
  200. package/build/hooks/layout-child.cjs.map +3 -3
  201. package/build/hooks/layout.cjs +28 -13
  202. package/build/hooks/layout.cjs.map +3 -3
  203. package/build/hooks/line-height.cjs +1 -2
  204. package/build/hooks/line-height.cjs.map +2 -2
  205. package/build/hooks/states.cjs +27 -7
  206. package/build/hooks/states.cjs.map +3 -3
  207. package/build/hooks/style.cjs +31 -9
  208. package/build/hooks/style.cjs.map +3 -3
  209. package/build/hooks/text-align.cjs +36 -6
  210. package/build/hooks/text-align.cjs.map +3 -3
  211. package/build/hooks/typography.cjs +14 -5
  212. package/build/hooks/typography.cjs.map +2 -2
  213. package/build/layouts/constrained.cjs +14 -6
  214. package/build/layouts/constrained.cjs.map +2 -2
  215. package/build/layouts/flex.cjs +27 -19
  216. package/build/layouts/flex.cjs.map +2 -2
  217. package/build/layouts/grid.cjs +0 -2
  218. package/build/layouts/grid.cjs.map +2 -2
  219. package/build/private-apis.cjs +9 -5
  220. package/build/private-apis.cjs.map +3 -3
  221. package/build/store/actions.cjs +11 -6
  222. package/build/store/actions.cjs.map +2 -2
  223. package/build/store/private-selectors.cjs +41 -3
  224. package/build/store/private-selectors.cjs.map +3 -3
  225. package/build/store/reducer.cjs +6 -6
  226. package/build/store/reducer.cjs.map +2 -2
  227. package/build/store/selectors.cjs +23 -0
  228. package/build/store/selectors.cjs.map +2 -2
  229. package/build/utils/block-bindings.cjs +29 -0
  230. package/build/utils/block-bindings.cjs.map +2 -2
  231. package/build/utils/dom.cjs +14 -0
  232. package/build/utils/dom.cjs.map +2 -2
  233. package/build/{components/rich-text/input-event.cjs → utils/native-undo.cjs} +29 -24
  234. package/build/utils/native-undo.cjs.map +7 -0
  235. package/build-module/components/alignment-control/ui.mjs +2 -4
  236. package/build-module/components/alignment-control/ui.mjs.map +2 -2
  237. package/build-module/components/background-image-control/index.mjs +43 -10
  238. package/build-module/components/background-image-control/index.mjs.map +2 -2
  239. package/build-module/components/block-alignment-control/ui.mjs +5 -3
  240. package/build-module/components/block-alignment-control/ui.mjs.map +2 -2
  241. package/build-module/components/block-canvas/index.mjs +7 -2
  242. package/build-module/components/block-canvas/index.mjs.map +2 -2
  243. package/build-module/components/block-controls/groups.mjs +3 -1
  244. package/build-module/components/block-controls/groups.mjs.map +2 -2
  245. package/build-module/components/block-edit/edit.mjs +11 -18
  246. package/build-module/components/block-edit/edit.mjs.map +2 -2
  247. package/build-module/components/block-inspector/index.mjs +74 -46
  248. package/build-module/components/block-inspector/index.mjs.map +2 -2
  249. package/build-module/components/block-list/block-html.mjs +4 -1
  250. package/build-module/components/block-list/block-html.mjs.map +2 -2
  251. package/build-module/components/block-list/block.mjs +9 -3
  252. package/build-module/components/block-list/block.mjs.map +3 -3
  253. package/build-module/components/block-list/index.mjs +1 -3
  254. package/build-module/components/block-list/index.mjs.map +2 -2
  255. package/build-module/components/block-list/use-block-props/index.mjs +7 -2
  256. package/build-module/components/block-list/use-block-props/index.mjs.map +2 -2
  257. package/build-module/components/block-list/use-block-props/use-focus-first-element.mjs +9 -4
  258. package/build-module/components/block-list/use-block-props/use-focus-first-element.mjs.map +2 -2
  259. package/build-module/components/block-list/use-block-props/use-focus-handler.mjs +11 -4
  260. package/build-module/components/block-list/use-block-props/use-focus-handler.mjs.map +2 -2
  261. package/build-module/components/block-list/use-block-props/use-register-block-event-handlers.mjs +28 -0
  262. package/build-module/components/block-list/use-block-props/use-register-block-event-handlers.mjs.map +7 -0
  263. package/build-module/components/block-parent-selector/index.mjs +2 -2
  264. package/build-module/components/block-parent-selector/index.mjs.map +2 -2
  265. package/build-module/components/block-toolbar/index.mjs +43 -24
  266. package/build-module/components/block-toolbar/index.mjs.map +2 -2
  267. package/build-module/components/block-toolbar/switch-section-style.mjs +4 -2
  268. package/build-module/components/block-toolbar/switch-section-style.mjs.map +2 -2
  269. package/build-module/components/block-tools/empty-block-inserter.mjs +2 -7
  270. package/build-module/components/block-tools/empty-block-inserter.mjs.map +2 -2
  271. package/build-module/components/block-tools/index.mjs +7 -2
  272. package/build-module/components/block-tools/index.mjs.map +2 -2
  273. package/build-module/components/block-vertical-alignment-control/ui.mjs +4 -6
  274. package/build-module/components/block-vertical-alignment-control/ui.mjs.map +2 -2
  275. package/build-module/components/block-visibility/modal.mjs +22 -10
  276. package/build-module/components/block-visibility/modal.mjs.map +2 -2
  277. package/build-module/components/block-visibility/use-block-visibility.mjs +17 -7
  278. package/build-module/components/block-visibility/use-block-visibility.mjs.map +2 -2
  279. package/build-module/components/block-visibility/utils.mjs +18 -3
  280. package/build-module/components/block-visibility/utils.mjs.map +2 -2
  281. package/build-module/components/block-visibility/viewport-menu-item.mjs +7 -1
  282. package/build-module/components/block-visibility/viewport-menu-item.mjs.map +2 -2
  283. package/build-module/components/block-visibility/viewport-toolbar.mjs +5 -0
  284. package/build-module/components/block-visibility/viewport-toolbar.mjs.map +2 -2
  285. package/build-module/components/block-visibility/viewport-visibility-info.mjs +5 -1
  286. package/build-module/components/block-visibility/viewport-visibility-info.mjs.map +2 -2
  287. package/build-module/components/border-radius-control/utils.mjs +11 -53
  288. package/build-module/components/border-radius-control/utils.mjs.map +2 -2
  289. package/build-module/components/child-layout-control/index.mjs +0 -4
  290. package/build-module/components/child-layout-control/index.mjs.map +2 -2
  291. package/build-module/components/colors-gradients/control.mjs +5 -3
  292. package/build-module/components/colors-gradients/control.mjs.map +2 -2
  293. package/build-module/components/dimension-control/index.mjs +30 -20
  294. package/build-module/components/dimension-control/index.mjs.map +2 -2
  295. package/build-module/components/dimensions-tool/aspect-ratio-tool.mjs +10 -6
  296. package/build-module/components/dimensions-tool/aspect-ratio-tool.mjs.map +2 -2
  297. package/build-module/components/editor-styles/index.mjs +9 -1
  298. package/build-module/components/editor-styles/index.mjs.map +2 -2
  299. package/build-module/components/global-styles/background-panel.mjs +71 -29
  300. package/build-module/components/global-styles/background-panel.mjs.map +2 -2
  301. package/build-module/components/global-styles/border-panel.mjs +157 -56
  302. package/build-module/components/global-styles/border-panel.mjs.map +2 -2
  303. package/build-module/components/global-styles/color-gradient-dropdown-item.mjs +51 -15
  304. package/build-module/components/global-styles/color-gradient-dropdown-item.mjs.map +2 -2
  305. package/build-module/components/global-styles/color-panel.mjs +63 -17
  306. package/build-module/components/global-styles/color-panel.mjs.map +2 -2
  307. package/build-module/components/global-styles/dimensions-panel.mjs +248 -66
  308. package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
  309. package/build-module/components/global-styles/filters-panel.mjs +64 -21
  310. package/build-module/components/global-styles/filters-panel.mjs.map +2 -2
  311. package/build-module/components/global-styles/hooks.mjs +4 -1
  312. package/build-module/components/global-styles/hooks.mjs.map +2 -2
  313. package/build-module/components/global-styles/inheritance/index.mjs +108 -0
  314. package/build-module/components/global-styles/inheritance/index.mjs.map +7 -0
  315. package/build-module/components/global-styles/inherited-value-context.mjs +141 -0
  316. package/build-module/components/global-styles/inherited-value-context.mjs.map +7 -0
  317. package/build-module/components/global-styles/shadow-panel-components.mjs +38 -20
  318. package/build-module/components/global-styles/shadow-panel-components.mjs.map +2 -2
  319. package/build-module/components/global-styles/state-control-badges.mjs +41 -5
  320. package/build-module/components/global-styles/state-control-badges.mjs.map +2 -2
  321. package/build-module/components/global-styles/state-control.mjs +1 -1
  322. package/build-module/components/global-styles/state-control.mjs.map +2 -2
  323. package/build-module/components/global-styles/typography-panel.mjs +276 -80
  324. package/build-module/components/global-styles/typography-panel.mjs.map +2 -2
  325. package/build-module/components/image-size-control/index.mjs +2 -4
  326. package/build-module/components/image-size-control/index.mjs.map +2 -2
  327. package/build-module/components/inserter/media-tab/hooks.mjs +33 -6
  328. package/build-module/components/inserter/media-tab/hooks.mjs.map +2 -2
  329. package/build-module/components/inserter/media-tab/media-panel.mjs +86 -18
  330. package/build-module/components/inserter/media-tab/media-panel.mjs.map +2 -2
  331. package/build-module/components/inspector-controls-tabs/styles-tab.mjs +6 -1
  332. package/build-module/components/inspector-controls-tabs/styles-tab.mjs.map +2 -2
  333. package/build-module/components/keyboard-shortcuts/index.mjs +19 -11
  334. package/build-module/components/keyboard-shortcuts/index.mjs.map +2 -2
  335. package/build-module/components/line-height-control/index.mjs +1 -2
  336. package/build-module/components/line-height-control/index.mjs.map +2 -2
  337. package/build-module/components/link-control/index.mjs +4 -2
  338. package/build-module/components/link-control/index.mjs.map +2 -2
  339. package/build-module/components/list-view/block.mjs +13 -4
  340. package/build-module/components/list-view/block.mjs.map +2 -2
  341. package/build-module/components/media-placeholder/index.mjs +0 -1
  342. package/build-module/components/media-placeholder/index.mjs.map +2 -2
  343. package/build-module/components/preset-input-control/index.mjs +2 -1
  344. package/build-module/components/preset-input-control/index.mjs.map +2 -2
  345. package/build-module/components/provider/block-refs-provider.mjs +8 -2
  346. package/build-module/components/provider/block-refs-provider.mjs.map +2 -2
  347. package/build-module/components/provider/index.mjs +1 -1
  348. package/build-module/components/provider/index.mjs.map +2 -2
  349. package/build-module/components/provider/use-block-sync.mjs +18 -6
  350. package/build-module/components/provider/use-block-sync.mjs.map +2 -2
  351. package/build-module/components/provider/use-media-upload-settings.mjs +3 -1
  352. package/build-module/components/provider/use-media-upload-settings.mjs.map +2 -2
  353. package/build-module/components/rich-text/event-listeners/before-input-rules.mjs +8 -5
  354. package/build-module/components/rich-text/event-listeners/before-input-rules.mjs.map +2 -2
  355. package/build-module/components/rich-text/event-listeners/delete.mjs +7 -4
  356. package/build-module/components/rich-text/event-listeners/delete.mjs.map +2 -2
  357. package/build-module/components/rich-text/event-listeners/enter.mjs +8 -3
  358. package/build-module/components/rich-text/event-listeners/enter.mjs.map +2 -2
  359. package/build-module/components/rich-text/event-listeners/input-events.mjs +3 -3
  360. package/build-module/components/rich-text/event-listeners/input-events.mjs.map +2 -2
  361. package/build-module/components/rich-text/event-listeners/input-rules.mjs +8 -5
  362. package/build-module/components/rich-text/event-listeners/input-rules.mjs.map +2 -2
  363. package/build-module/components/rich-text/event-listeners/insert-replacement-text.mjs +3 -3
  364. package/build-module/components/rich-text/event-listeners/insert-replacement-text.mjs.map +2 -2
  365. package/build-module/components/rich-text/event-listeners/paste-handler.mjs +8 -2
  366. package/build-module/components/rich-text/event-listeners/paste-handler.mjs.map +2 -2
  367. package/build-module/components/rich-text/event-listeners/remove-browser-shortcuts.mjs +3 -3
  368. package/build-module/components/rich-text/event-listeners/remove-browser-shortcuts.mjs.map +2 -2
  369. package/build-module/components/rich-text/event-listeners/shortcuts.mjs +3 -3
  370. package/build-module/components/rich-text/event-listeners/shortcuts.mjs.map +2 -2
  371. package/build-module/components/rich-text/event-listeners/undo-automatic-change.mjs +3 -3
  372. package/build-module/components/rich-text/event-listeners/undo-automatic-change.mjs.map +2 -2
  373. package/build-module/components/rich-text/index.mjs +79 -14
  374. package/build-module/components/rich-text/index.mjs.map +2 -2
  375. package/build-module/components/spacing-sizes-control/utils.mjs +6 -18
  376. package/build-module/components/spacing-sizes-control/utils.mjs.map +2 -2
  377. package/build-module/components/text-indent-control/index.mjs +8 -2
  378. package/build-module/components/text-indent-control/index.mjs.map +2 -2
  379. package/build-module/components/typewriter/index.mjs +129 -136
  380. package/build-module/components/typewriter/index.mjs.map +2 -2
  381. package/build-module/components/url-input/index.mjs +306 -353
  382. package/build-module/components/url-input/index.mjs.map +2 -2
  383. package/build-module/components/use-block-commands/index.mjs +21 -17
  384. package/build-module/components/use-block-commands/index.mjs.map +2 -2
  385. package/build-module/components/use-on-block-drop/index.mjs +2 -2
  386. package/build-module/components/use-on-block-drop/index.mjs.map +2 -2
  387. package/build-module/components/writing-flow/index.mjs +14 -1
  388. package/build-module/components/writing-flow/index.mjs.map +2 -2
  389. package/build-module/components/writing-flow/use-arrow-nav.mjs +43 -7
  390. package/build-module/components/writing-flow/use-arrow-nav.mjs.map +2 -2
  391. package/build-module/components/writing-flow/use-click-selection.mjs +29 -3
  392. package/build-module/components/writing-flow/use-click-selection.mjs.map +2 -2
  393. package/build-module/components/writing-flow/use-clipboard-handler.mjs +5 -2
  394. package/build-module/components/writing-flow/use-clipboard-handler.mjs.map +2 -2
  395. package/build-module/components/writing-flow/use-drag-selection.mjs +1 -6
  396. package/build-module/components/writing-flow/use-drag-selection.mjs.map +2 -2
  397. package/build-module/components/writing-flow/use-editable-root-event-handlers.mjs +154 -0
  398. package/build-module/components/writing-flow/use-editable-root-event-handlers.mjs.map +7 -0
  399. package/build-module/components/writing-flow/use-editable-root.mjs +54 -0
  400. package/build-module/components/writing-flow/use-editable-root.mjs.map +7 -0
  401. package/build-module/components/writing-flow/use-home-end.mjs +43 -0
  402. package/build-module/components/writing-flow/use-home-end.mjs.map +7 -0
  403. package/build-module/components/writing-flow/use-input.mjs +15 -5
  404. package/build-module/components/writing-flow/use-input.mjs.map +2 -2
  405. package/build-module/components/writing-flow/use-multi-selection.mjs +2 -2
  406. package/build-module/components/writing-flow/use-multi-selection.mjs.map +2 -2
  407. package/build-module/components/writing-flow/use-select-all.mjs +19 -3
  408. package/build-module/components/writing-flow/use-select-all.mjs.map +2 -2
  409. package/build-module/components/writing-flow/use-selection-observer.mjs +134 -21
  410. package/build-module/components/writing-flow/use-selection-observer.mjs.map +2 -2
  411. package/build-module/components/writing-flow/utils.mjs +26 -1
  412. package/build-module/components/writing-flow/utils.mjs.map +2 -2
  413. package/build-module/hooks/background.mjs +14 -10
  414. package/build-module/hooks/background.mjs.map +2 -2
  415. package/build-module/hooks/block-fields/rich-text/index.mjs +2 -6
  416. package/build-module/hooks/block-fields/rich-text/index.mjs.map +2 -2
  417. package/build-module/hooks/block-style-variation.mjs +8 -44
  418. package/build-module/hooks/block-style-variation.mjs.map +2 -2
  419. package/build-module/hooks/border.mjs +19 -4
  420. package/build-module/hooks/border.mjs.map +2 -2
  421. package/build-module/hooks/custom-css.mjs +7 -3
  422. package/build-module/hooks/custom-css.mjs.map +2 -2
  423. package/build-module/hooks/dimensions.mjs +15 -4
  424. package/build-module/hooks/dimensions.mjs.map +2 -2
  425. package/build-module/hooks/duotone.mjs +20 -9
  426. package/build-module/hooks/duotone.mjs.map +2 -2
  427. package/build-module/hooks/elements.mjs +15 -5
  428. package/build-module/hooks/elements.mjs.map +2 -2
  429. package/build-module/hooks/grid-visualizer.mjs +5 -3
  430. package/build-module/hooks/grid-visualizer.mjs.map +2 -2
  431. package/build-module/hooks/layout-child.mjs +22 -12
  432. package/build-module/hooks/layout-child.mjs.map +2 -2
  433. package/build-module/hooks/layout.mjs +28 -13
  434. package/build-module/hooks/layout.mjs.map +2 -2
  435. package/build-module/hooks/line-height.mjs +1 -2
  436. package/build-module/hooks/line-height.mjs.map +2 -2
  437. package/build-module/hooks/states.mjs +27 -7
  438. package/build-module/hooks/states.mjs.map +2 -2
  439. package/build-module/hooks/style.mjs +40 -11
  440. package/build-module/hooks/style.mjs.map +2 -2
  441. package/build-module/hooks/text-align.mjs +39 -10
  442. package/build-module/hooks/text-align.mjs.map +2 -2
  443. package/build-module/hooks/typography.mjs +14 -5
  444. package/build-module/hooks/typography.mjs.map +2 -2
  445. package/build-module/layouts/constrained.mjs +14 -6
  446. package/build-module/layouts/constrained.mjs.map +2 -2
  447. package/build-module/layouts/flex.mjs +27 -19
  448. package/build-module/layouts/flex.mjs.map +2 -2
  449. package/build-module/layouts/grid.mjs +0 -2
  450. package/build-module/layouts/grid.mjs.map +2 -2
  451. package/build-module/private-apis.mjs +7 -3
  452. package/build-module/private-apis.mjs.map +2 -2
  453. package/build-module/store/actions.mjs +12 -7
  454. package/build-module/store/actions.mjs.map +2 -2
  455. package/build-module/store/private-selectors.mjs +42 -3
  456. package/build-module/store/private-selectors.mjs.map +2 -2
  457. package/build-module/store/reducer.mjs +6 -6
  458. package/build-module/store/reducer.mjs.map +2 -2
  459. package/build-module/store/selectors.mjs +23 -0
  460. package/build-module/store/selectors.mjs.map +2 -2
  461. package/build-module/utils/block-bindings.mjs +28 -0
  462. package/build-module/utils/block-bindings.mjs.map +2 -2
  463. package/build-module/utils/dom.mjs +13 -0
  464. package/build-module/utils/dom.mjs.map +2 -2
  465. package/build-module/utils/native-undo.mjs +29 -0
  466. package/build-module/utils/native-undo.mjs.map +7 -0
  467. package/build-style/content-rtl.css +14 -27
  468. package/build-style/content.css +14 -27
  469. package/build-style/default-editor-styles-rtl.css +1 -1
  470. package/build-style/default-editor-styles.css +1 -1
  471. package/build-style/style-rtl.css +191 -61
  472. package/build-style/style.css +191 -61
  473. package/build-types/components/block-context/index.d.ts +7 -0
  474. package/build-types/components/block-context/index.d.ts.map +1 -1
  475. package/build-types/utils/block-bindings.d.ts +19 -0
  476. package/build-types/utils/block-bindings.d.ts.map +1 -1
  477. package/build-types/utils/dom.d.ts +11 -0
  478. package/build-types/utils/dom.d.ts.map +1 -1
  479. package/build-types/utils/get-px-from-css-unit.d.ts +2 -2
  480. package/build-types/utils/get-px-from-css-unit.d.ts.map +1 -1
  481. package/build-types/utils/pasting.d.ts +1 -1
  482. package/build-types/utils/pasting.d.ts.map +1 -1
  483. package/package.json +43 -44
  484. package/src/components/alignment-control/test/__snapshots__/index.js.snap +1 -1
  485. package/src/components/alignment-control/ui.js +2 -4
  486. package/src/components/background-image-control/index.js +74 -37
  487. package/src/components/background-image-control/style.scss +13 -4
  488. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +3 -3
  489. package/src/components/block-alignment-control/test/index.js +1 -1
  490. package/src/components/block-alignment-control/ui.js +4 -2
  491. package/src/components/block-breadcrumb/test/__snapshots__/index.js.snap +1 -1
  492. package/src/components/block-canvas/index.js +9 -2
  493. package/src/components/block-card/style.scss +1 -1
  494. package/src/components/block-compare/test/__snapshots__/block-view.js.snap +1 -1
  495. package/src/components/block-controls/groups.js +2 -0
  496. package/src/components/block-edit/edit.js +13 -31
  497. package/src/components/block-icon/test/__snapshots__/index.js.snap +1 -1
  498. package/src/components/block-inspector/index.js +60 -31
  499. package/src/components/block-list/block-html.js +5 -0
  500. package/src/components/block-list/block.js +6 -0
  501. package/src/components/block-list/content.scss +1 -11
  502. package/src/components/block-list/index.js +0 -2
  503. package/src/components/block-list/use-block-props/index.js +7 -1
  504. package/src/components/block-list/use-block-props/use-focus-first-element.js +23 -4
  505. package/src/components/block-list/use-block-props/use-focus-handler.js +35 -9
  506. package/src/components/block-list/use-block-props/use-register-block-event-handlers.js +45 -0
  507. package/src/components/block-lock/style.scss +1 -1
  508. package/src/components/block-manager/style.scss +1 -1
  509. package/src/components/block-navigation/style.scss +1 -1
  510. package/src/components/block-parent-selector/index.js +5 -2
  511. package/src/components/block-quick-navigation/style.scss +1 -3
  512. package/src/components/block-styles/style.scss +2 -2
  513. package/src/components/block-toolbar/index.js +41 -18
  514. package/src/components/block-toolbar/switch-section-style.js +5 -2
  515. package/src/components/block-tools/empty-block-inserter.js +3 -7
  516. package/src/components/block-tools/index.js +7 -0
  517. package/src/components/block-types-list/style.scss +0 -1
  518. package/src/components/block-vertical-alignment-control/test/__snapshots__/index.js.snap +3 -3
  519. package/src/components/block-vertical-alignment-control/test/index.js +18 -2
  520. package/src/components/block-vertical-alignment-control/ui.js +3 -5
  521. package/src/components/block-visibility/modal.js +24 -10
  522. package/src/components/block-visibility/style.scss +1 -1
  523. package/src/components/block-visibility/test/use-block-visibility.js +128 -35
  524. package/src/components/block-visibility/test/utils.js +11 -0
  525. package/src/components/block-visibility/use-block-visibility.js +33 -11
  526. package/src/components/block-visibility/utils.js +31 -6
  527. package/src/components/block-visibility/viewport-menu-item.js +10 -1
  528. package/src/components/block-visibility/viewport-toolbar.js +6 -0
  529. package/src/components/block-visibility/viewport-visibility-info.js +5 -1
  530. package/src/components/border-radius-control/test/utils.js +0 -41
  531. package/src/components/border-radius-control/utils.js +16 -107
  532. package/src/components/button-block-appender/content.scss +7 -9
  533. package/src/components/child-layout-control/index.js +0 -4
  534. package/src/components/color-palette/test/__snapshots__/control.js.snap +3 -3
  535. package/src/components/colors-gradients/control.js +6 -3
  536. package/src/components/default-block-appender/test/__snapshots__/index.js.snap +1 -1
  537. package/src/components/dimension-control/index.js +13 -1
  538. package/src/components/dimensions-tool/aspect-ratio-tool.js +13 -6
  539. package/src/components/editor-styles/index.js +16 -1
  540. package/src/components/font-family/stories/index.story.jsx +1 -1
  541. package/src/components/global-styles/background-panel.js +107 -34
  542. package/src/components/global-styles/border-panel.js +219 -48
  543. package/src/components/global-styles/color-gradient-dropdown-item.js +93 -28
  544. package/src/components/global-styles/color-panel.js +92 -11
  545. package/src/components/global-styles/dimensions-panel.js +422 -71
  546. package/src/components/global-styles/filters-panel.js +88 -28
  547. package/src/components/global-styles/hooks.js +8 -1
  548. package/src/components/global-styles/inheritance/index.js +204 -0
  549. package/src/components/global-styles/inheritance/style.scss +184 -0
  550. package/src/components/global-styles/inheritance/test/index.js +281 -0
  551. package/src/components/global-styles/inherited-value-context.js +271 -0
  552. package/src/components/global-styles/shadow-panel-components.js +48 -26
  553. package/src/components/global-styles/state-control-badges.js +45 -6
  554. package/src/components/global-styles/state-control.js +2 -2
  555. package/src/components/global-styles/style.scss +5 -0
  556. package/src/components/global-styles/test/background-panel.js +338 -1
  557. package/src/components/global-styles/test/border-panel.js +441 -0
  558. package/src/components/global-styles/test/color-panel.js +182 -2
  559. package/src/components/global-styles/test/dimensions-panel.js +753 -0
  560. package/src/components/global-styles/test/filters-panel.js +194 -0
  561. package/src/components/global-styles/test/inherited-value-context-core.js +98 -0
  562. package/src/components/global-styles/test/inherited-value-context.js +454 -0
  563. package/src/components/global-styles/test/state-control-badges.js +65 -0
  564. package/src/components/global-styles/test/typography-panel-core.js +185 -0
  565. package/src/components/global-styles/test/typography-panel.js +849 -12
  566. package/src/components/global-styles/typography-panel.js +449 -101
  567. package/src/components/image-editor/style.scss +33 -0
  568. package/src/components/image-size-control/index.js +0 -2
  569. package/src/components/inner-blocks/test/__snapshots__/index.js.snap +1 -1
  570. package/src/components/inserter/media-tab/hooks.js +55 -7
  571. package/src/components/inserter/media-tab/media-panel.js +117 -21
  572. package/src/components/inserter/media-tab/test/hooks.js +63 -0
  573. package/src/components/inserter/media-tab/test/media-panel.js +127 -0
  574. package/src/components/inserter/style.scss +19 -16
  575. package/src/components/inserter-list-item/style.scss +0 -15
  576. package/src/components/inspector-controls-tabs/styles-tab.js +5 -1
  577. package/src/components/keyboard-shortcuts/index.js +28 -11
  578. package/src/components/line-height-control/index.js +1 -2
  579. package/src/components/link-control/index.js +7 -2
  580. package/src/components/link-control/style.scss +2 -2
  581. package/src/components/link-control/test/index.js +6 -6
  582. package/src/components/link-picker/style.scss +1 -2
  583. package/src/components/list-view/block.js +13 -4
  584. package/src/components/list-view/style.scss +4 -5
  585. package/src/components/media-placeholder/index.js +0 -1
  586. package/src/components/multi-selection-inspector/style.scss +1 -1
  587. package/src/components/preset-input-control/index.js +4 -1
  588. package/src/components/provider/block-refs-provider.js +12 -2
  589. package/src/components/provider/index.js +2 -2
  590. package/src/components/provider/use-block-sync.js +18 -6
  591. package/src/components/provider/use-media-upload-settings.js +2 -0
  592. package/src/components/responsive-block-control/style.scss +1 -1
  593. package/src/components/rich-text/event-listeners/before-input-rules.js +8 -5
  594. package/src/components/rich-text/event-listeners/delete.js +7 -4
  595. package/src/components/rich-text/event-listeners/enter.js +10 -4
  596. package/src/components/rich-text/event-listeners/input-events.js +4 -3
  597. package/src/components/rich-text/event-listeners/input-rules.js +8 -5
  598. package/src/components/rich-text/event-listeners/insert-replacement-text.js +4 -3
  599. package/src/components/rich-text/event-listeners/paste-handler.js +15 -3
  600. package/src/components/rich-text/event-listeners/remove-browser-shortcuts.js +4 -3
  601. package/src/components/rich-text/event-listeners/shortcuts.js +4 -3
  602. package/src/components/rich-text/event-listeners/undo-automatic-change.js +4 -3
  603. package/src/components/rich-text/index.js +116 -26
  604. package/src/components/skip-to-selected-block/style.scss +1 -1
  605. package/src/components/spacing-sizes-control/test/utils.js +16 -5
  606. package/src/components/spacing-sizes-control/utils.js +11 -28
  607. package/src/components/text-indent-control/index.js +8 -0
  608. package/src/components/typewriter/index.js +228 -224
  609. package/src/components/url-input/index.js +363 -431
  610. package/src/components/url-input/test/index.js +592 -0
  611. package/src/components/use-block-commands/index.js +27 -17
  612. package/src/components/use-on-block-drop/index.js +2 -2
  613. package/src/components/warning/test/__snapshots__/index.js.snap +1 -1
  614. package/src/components/writing-flow/index.js +17 -1
  615. package/src/components/writing-flow/use-arrow-nav.js +90 -13
  616. package/src/components/writing-flow/use-click-selection.js +55 -5
  617. package/src/components/writing-flow/use-clipboard-handler.js +5 -2
  618. package/src/components/writing-flow/use-drag-selection.js +1 -14
  619. package/src/components/writing-flow/use-editable-root-event-handlers.js +266 -0
  620. package/src/components/writing-flow/use-editable-root.js +112 -0
  621. package/src/components/writing-flow/use-home-end.js +71 -0
  622. package/src/components/writing-flow/use-input.js +25 -8
  623. package/src/components/writing-flow/use-multi-selection.js +2 -3
  624. package/src/components/writing-flow/use-select-all.js +33 -3
  625. package/src/components/writing-flow/use-selection-observer.js +218 -42
  626. package/src/components/writing-flow/utils.js +62 -0
  627. package/src/hooks/background.js +27 -24
  628. package/src/hooks/block-fields/link/styles.scss +1 -6
  629. package/src/hooks/block-fields/media/styles.scss +1 -6
  630. package/src/hooks/block-fields/rich-text/index.js +6 -9
  631. package/src/hooks/block-fields/rich-text/styles.scss +1 -1
  632. package/src/hooks/block-style-variation.js +8 -74
  633. package/src/hooks/border.js +19 -4
  634. package/src/hooks/custom-css.js +15 -6
  635. package/src/hooks/dimensions.js +17 -4
  636. package/src/hooks/duotone.js +26 -8
  637. package/src/hooks/elements.js +14 -4
  638. package/src/hooks/grid-visualizer.js +40 -36
  639. package/src/hooks/layout-child.js +19 -9
  640. package/src/hooks/layout.js +48 -31
  641. package/src/hooks/line-height.js +0 -1
  642. package/src/hooks/states.js +38 -9
  643. package/src/hooks/style.js +67 -17
  644. package/src/hooks/test/inherited-value-wiring.js +411 -0
  645. package/src/hooks/test/preset-round-trip.js +456 -0
  646. package/src/hooks/test/style.js +29 -0
  647. package/src/hooks/test/text-align.js +34 -1
  648. package/src/hooks/text-align.js +41 -10
  649. package/src/hooks/typography.js +35 -24
  650. package/src/layouts/constrained.js +5 -1
  651. package/src/layouts/flex.js +5 -1
  652. package/src/layouts/grid.js +0 -2
  653. package/src/private-apis.js +11 -2
  654. package/src/store/actions.js +53 -19
  655. package/src/store/private-selectors.js +82 -6
  656. package/src/store/reducer.js +9 -9
  657. package/src/store/selectors.js +56 -8
  658. package/src/store/test/actions.js +1 -1
  659. package/src/store/test/private-selectors.js +271 -1
  660. package/src/style.scss +2 -0
  661. package/src/utils/block-bindings.ts +50 -0
  662. package/src/utils/dom.ts +33 -0
  663. package/src/utils/native-undo.js +56 -0
  664. package/src/utils/test/block-bindings.js +181 -0
  665. package/build/components/duotone/utils.cjs +0 -87
  666. package/build/components/duotone/utils.cjs.map +0 -7
  667. package/build/components/rich-text/input-event.cjs.map +0 -7
  668. package/build/components/rich-text/shortcut.cjs +0 -51
  669. package/build/components/rich-text/shortcut.cjs.map +0 -7
  670. package/build-module/components/duotone/utils.mjs +0 -59
  671. package/build-module/components/duotone/utils.mjs.map +0 -7
  672. package/build-module/components/rich-text/input-event.mjs +0 -25
  673. package/build-module/components/rich-text/input-event.mjs.map +0 -7
  674. package/build-module/components/rich-text/shortcut.mjs +0 -26
  675. package/build-module/components/rich-text/shortcut.mjs.map +0 -7
  676. package/src/components/duotone/utils.js +0 -90
  677. package/src/components/rich-text/input-event.js +0 -31
  678. package/src/components/rich-text/shortcut.js +0 -32
  679. package/src/hooks/test/get-variation-styles-with-ref-values.js +0 -91
@@ -14,6 +14,8 @@ import { forwardRef } from '@wordpress/element';
14
14
  /**
15
15
  * Internal dependencies
16
16
  */
17
+ import useEditableRoot from './use-editable-root';
18
+ import useHomeEnd from './use-home-end';
17
19
  import useMultiSelection from './use-multi-selection';
18
20
  import useTabNav from './use-tab-nav';
19
21
  import useArrowNav from './use-arrow-nav';
@@ -21,6 +23,7 @@ import { usePreviewModeNav } from './use-preview-mode-nav';
21
23
  import useSelectAll from './use-select-all';
22
24
  import useDragSelection from './use-drag-selection';
23
25
  import useSelectionObserver from './use-selection-observer';
26
+ import useEditableRootEventHandlers from './use-editable-root-event-handlers';
24
27
  import useClickSelection from './use-click-selection';
25
28
  import useInput from './use-input';
26
29
  import useClipboardHandler from './use-clipboard-handler';
@@ -37,8 +40,11 @@ export function useWritingFlow() {
37
40
  before,
38
41
  useMergeRefs( [
39
42
  ref,
43
+ useEditableRootEventHandlers(),
40
44
  useClipboardHandler(),
41
45
  useInput(),
46
+ useEditableRoot(),
47
+ useHomeEnd(),
42
48
  useDragSelection(),
43
49
  useSelectionObserver(),
44
50
  useClickSelection(),
@@ -64,7 +70,17 @@ export function useWritingFlow() {
64
70
 
65
71
  return () => {
66
72
  delete node.dataset.hasMultiSelection;
67
- node.removeAttribute( 'aria-label' );
73
+ // The wrapper may remain the editing host (the
74
+ // collapsed block supports `editableRoot`): keep it
75
+ // named, as the textbox role requires.
76
+ if ( node.contentEditable === 'true' ) {
77
+ node.setAttribute(
78
+ 'aria-label',
79
+ __( 'Editor canvas' )
80
+ );
81
+ } else {
82
+ node.removeAttribute( 'aria-label' );
83
+ }
68
84
  };
69
85
  },
70
86
  [ hasMultiSelection ]
@@ -18,8 +18,9 @@ import { useRefEffect } from '@wordpress/compose';
18
18
  /**
19
19
  * Internal dependencies
20
20
  */
21
- import { getBlockClientId } from '../../utils/dom';
21
+ import { getBlockClientId, getSelectionEditableElement } from '../../utils/dom';
22
22
  import { store as blockEditorStore } from '../../store';
23
+ import { setContentEditableWrapper } from './utils';
23
24
 
24
25
  /**
25
26
  * Returns true if the element should consider edge navigation upon a keyboard
@@ -141,8 +142,16 @@ export function getClosestTabbable(
141
142
  return false;
142
143
  }
143
144
 
144
- // Skip focusable elements such as links within content editable nodes.
145
- if ( node.isContentEditable && node.contentEditable !== 'true' ) {
145
+ // Skip focusable elements such as links within content editable
146
+ // nodes: nodes whose closest editable host is an editable element
147
+ // within a block. When an editable root (e.g. the canvas wrapper)
148
+ // is the editing host, everything within it is content editable,
149
+ // but focusables like block wrappers are not text content.
150
+ if (
151
+ node.isContentEditable &&
152
+ node.contentEditable !== 'true' &&
153
+ getBlockClientId( node.closest( '[contenteditable="true"]' ) )
154
+ ) {
146
155
  return false;
147
156
  }
148
157
 
@@ -167,11 +176,15 @@ export default function useArrowNav() {
167
176
  const {
168
177
  getMultiSelectedBlocksStartClientId,
169
178
  getMultiSelectedBlocksEndClientId,
179
+ getNextBlockClientId,
180
+ getPreviousBlockClientId,
181
+ getSelectedBlockClientId,
182
+ getSelectionStart,
170
183
  getSettings,
171
184
  hasMultiSelection,
172
185
  __unstableIsFullySelected,
173
186
  } = useSelect( blockEditorStore );
174
- const { selectBlock } = useDispatch( blockEditorStore );
187
+ const { selectBlock, multiSelect } = useDispatch( blockEditorStore );
175
188
  return useRefEffect( ( node ) => {
176
189
  // Here a DOMRect is stored while moving the caret vertically so
177
190
  // vertical position of the start position can be restored. This is to
@@ -198,8 +211,17 @@ export default function useArrowNav() {
198
211
  return;
199
212
  }
200
213
 
201
- const { keyCode, target, shiftKey, ctrlKey, altKey, metaKey } =
202
- event;
214
+ const { keyCode, shiftKey, ctrlKey, altKey, metaKey } = event;
215
+ // When the wrapper is contentEditable and holds focus (the
216
+ // selected block supports `editableRoot`), the event targets the
217
+ // wrapper; resolve the editable element containing the selection.
218
+ const target =
219
+ ( event.target === node &&
220
+ getSelectionEditableElement(
221
+ node.ownerDocument.defaultView.getSelection(),
222
+ node
223
+ ) ) ||
224
+ event.target;
203
225
  const isUp = keyCode === UP;
204
226
  const isDown = keyCode === DOWN;
205
227
  const isLeft = keyCode === LEFT;
@@ -226,6 +248,32 @@ export default function useArrowNav() {
226
248
  // selection to the start or end of the selection.
227
249
  if ( hasMultiSelection() ) {
228
250
  if ( shiftKey ) {
251
+ // A fully selected multi-selection has no native
252
+ // selection to extend (use-multi-selection cleared it),
253
+ // so grow or shrink it by one block at the focus end.
254
+ // Only without a usable native selection: a selection
255
+ // that is fully selected because it resolves to a
256
+ // nesting ancestor keeps its native selection, which
257
+ // the browser extends natively (and the observer
258
+ // promotes to the common level).
259
+ const selection = defaultView.getSelection();
260
+ if (
261
+ __unstableIsFullySelected() &&
262
+ ( ! selection.rangeCount || selection.isCollapsed )
263
+ ) {
264
+ const anchorClientId =
265
+ getMultiSelectedBlocksStartClientId();
266
+ const focusClientId =
267
+ getMultiSelectedBlocksEndClientId();
268
+ const nextClientId = isReverse
269
+ ? getPreviousBlockClientId( focusClientId )
270
+ : getNextBlockClientId( focusClientId );
271
+
272
+ if ( nextClientId ) {
273
+ multiSelect( anchorClientId, nextClientId );
274
+ event.preventDefault();
275
+ }
276
+ }
229
277
  return;
230
278
  }
231
279
 
@@ -246,6 +294,26 @@ export default function useArrowNav() {
246
294
  return;
247
295
  }
248
296
 
297
+ // A block selected without a text selection within it (e.g. an
298
+ // image or spacer) has no native selection to extend: start a
299
+ // block multi-selection with the adjacent block.
300
+ if (
301
+ shiftKey &&
302
+ getSelectedBlockClientId() &&
303
+ ! getSelectionStart().attributeKey
304
+ ) {
305
+ const selectedClientId = getSelectedBlockClientId();
306
+ const nextClientId = isReverse
307
+ ? getPreviousBlockClientId( selectedClientId )
308
+ : getNextBlockClientId( selectedClientId );
309
+
310
+ if ( nextClientId ) {
311
+ multiSelect( selectedClientId, nextClientId );
312
+ event.preventDefault();
313
+ }
314
+ return;
315
+ }
316
+
249
317
  // Abort if our current target is not a candidate for navigation
250
318
  // (e.g. preserve native input behaviors).
251
319
  if ( ! isNavigationCandidate( target, keyCode, hasModifier ) ) {
@@ -271,13 +339,22 @@ export default function useArrowNav() {
271
339
  const { keepCaretInsideBlock } = getSettings();
272
340
 
273
341
  if ( shiftKey ) {
274
- if (
275
- isClosestTabbableABlock( target, isReverse ) &&
276
- isNavEdge( target, isReverse )
277
- ) {
278
- node.contentEditable = true;
279
- // Firefox doesn't automatically move focus.
280
- node.focus();
342
+ if ( isNavEdge( target, isReverse ) ) {
343
+ if ( isClosestTabbableABlock( target, isReverse ) ) {
344
+ setContentEditableWrapper( node, true );
345
+ } else if ( node.contentEditable === 'true' ) {
346
+ // There is no block to extend the selection into.
347
+ // Within an editable wrapper the selection could
348
+ // natively escape into surrounding editable elements
349
+ // (e.g. the post title), so keep it inside the block
350
+ // by extending it to the block's edge.
351
+ const selection = defaultView.getSelection();
352
+ selection.extend(
353
+ target,
354
+ isReverse ? 0 : target.childNodes.length
355
+ );
356
+ event.preventDefault();
357
+ }
281
358
  }
282
359
  } else if (
283
360
  isVertical &&
@@ -8,12 +8,17 @@ import { useRefEffect } from '@wordpress/compose';
8
8
  * Internal dependencies
9
9
  */
10
10
  import { store as blockEditorStore } from '../../store';
11
+ import { setContentEditableWrapper } from './utils';
11
12
  import { getBlockClientId } from '../../utils/dom';
12
13
 
13
14
  export default function useClickSelection() {
14
15
  const { selectBlock } = useDispatch( blockEditorStore );
15
- const { isSelectionEnabled, getBlockSelectionStart, hasMultiSelection } =
16
- useSelect( blockEditorStore );
16
+ const {
17
+ isSelectionEnabled,
18
+ getBlockSelectionStart,
19
+ getSelectionStart,
20
+ hasMultiSelection,
21
+ } = useSelect( blockEditorStore );
17
22
  return useRefEffect(
18
23
  ( node ) => {
19
24
  function onMouseDown( event ) {
@@ -30,9 +35,53 @@ export default function useClickSelection() {
30
35
  // When selecting a single block in a document by holding the shift key,
31
36
  // don't mark this action as multiselection.
32
37
  if ( startClientId && startClientId !== clickedClientId ) {
33
- node.contentEditable = true;
34
- // Firefox doesn't automatically move focus.
35
- node.focus();
38
+ // When the selected block has no text selection
39
+ // within it (e.g. an image or spacer), there is no
40
+ // native selection for the wrapper to adopt when it
41
+ // is focused, so Safari inserts a caret at the start
42
+ // of the wrapper and asynchronously reveals it,
43
+ // scrolling a scrolled-down viewport back up, which
44
+ // `preventScroll` does not cover. Leave focus alone
45
+ // in that case: the click moves it.
46
+ const { clientId, attributeKey } = getSelectionStart();
47
+ setContentEditableWrapper( node, true, {
48
+ focus: !! attributeKey,
49
+ } );
50
+
51
+ // The browser extends the selection from the native
52
+ // anchor. When a block is selected without a text
53
+ // selection within it, there is no native anchor,
54
+ // and browsers synthesize one at the nearest text
55
+ // instead, excluding the block itself. Give the
56
+ // browser the right anchor before it acts on the
57
+ // click: the near edge of the selected block, so the
58
+ // whole block ends up within the extended selection.
59
+ const { ownerDocument } = node;
60
+ const selection =
61
+ ownerDocument.defaultView.getSelection();
62
+ const blockElement =
63
+ ! attributeKey &&
64
+ ownerDocument.getElementById(
65
+ `block-${ clientId }`
66
+ );
67
+
68
+ if (
69
+ blockElement &&
70
+ ! (
71
+ selection.anchorNode &&
72
+ blockElement.contains( selection.anchorNode )
73
+ )
74
+ ) {
75
+ const isForward =
76
+ // eslint-disable-next-line no-bitwise
77
+ blockElement.compareDocumentPosition(
78
+ event.target
79
+ ) & node.DOCUMENT_POSITION_FOLLOWING;
80
+ selection.setPosition(
81
+ blockElement,
82
+ isForward ? 0 : blockElement.childNodes.length
83
+ );
84
+ }
36
85
  }
37
86
  } else if ( hasMultiSelection() ) {
38
87
  // Allow user to escape out of a multi-selection to a
@@ -55,6 +104,7 @@ export default function useClickSelection() {
55
104
  selectBlock,
56
105
  isSelectionEnabled,
57
106
  getBlockSelectionStart,
107
+ getSelectionStart,
58
108
  hasMultiSelection,
59
109
  ]
60
110
  );
@@ -20,7 +20,7 @@ import { useRefEffect } from '@wordpress/compose';
20
20
  */
21
21
  import { store as blockEditorStore } from '../../store';
22
22
  import { useNotifyCopy } from '../../utils/use-notify-copy';
23
- import { setClipboardBlocks } from './utils';
23
+ import { setClipboardBlocks, setContentEditableWrapper } from './utils';
24
24
  import { getPasteEventData } from '../../utils/pasting';
25
25
 
26
26
  export default function useClipboardHandler() {
@@ -130,7 +130,10 @@ export default function useClipboardHandler() {
130
130
  if ( shouldHandleWholeBlocks && ! expandSelectionIsNeeded ) {
131
131
  removeBlocks( selectedBlockClientIds );
132
132
  } else {
133
- event.target.ownerDocument.activeElement.contentEditable = false;
133
+ setContentEditableWrapper(
134
+ event.target.ownerDocument.activeElement,
135
+ false
136
+ );
134
137
  __unstableDeleteSelection();
135
138
  }
136
139
  } else if ( event.type === 'paste' ) {
@@ -8,20 +8,7 @@ import { useRefEffect } from '@wordpress/compose';
8
8
  * Internal dependencies
9
9
  */
10
10
  import { store as blockEditorStore } from '../../store';
11
-
12
- /**
13
- * Sets the `contenteditable` wrapper element to `value`.
14
- *
15
- * @param {HTMLElement} node Block element.
16
- * @param {boolean} value `contentEditable` value (true or false)
17
- */
18
- function setContentEditableWrapper( node, value ) {
19
- node.contentEditable = value;
20
- // Firefox doesn't automatically move focus.
21
- if ( value ) {
22
- node.focus();
23
- }
24
- }
11
+ import { setContentEditableWrapper } from './utils';
25
12
 
26
13
  /**
27
14
  * Sets a multi-selection based on the native selection across blocks.
@@ -0,0 +1,266 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useSelect } from '@wordpress/data';
5
+ import { useRefEffect } from '@wordpress/compose';
6
+ import { useContext } from '@wordpress/element';
7
+
8
+ /**
9
+ * Internal dependencies
10
+ */
11
+ import { store as blockEditorStore } from '../../store';
12
+ import { getBlockClientId, getSelectionEditableElement } from '../../utils/dom';
13
+ import { BlockRefs } from '../provider/block-refs-provider';
14
+
15
+ // The React `on*` props the host bridges, mapped to their DOM event type. Only
16
+ // editing events are redirected under `editableRoot` (the wrapper becomes the
17
+ // editing host, so keyboard, input and composition events target it instead of
18
+ // the block); pointer and other events still reach the block and need no
19
+ // bridging. React prop names don't map to DOM types by lowercasing in general
20
+ // (onChange is `input`, onDoubleClick is `dblclick`), so the mapping is
21
+ // explicit, which also locks the bridged surface to events React actually fires.
22
+ const SUPPORTED_EVENTS = {
23
+ onKeyDown: 'keydown',
24
+ onKeyUp: 'keyup',
25
+ onBeforeInput: 'beforeinput',
26
+ onInput: 'input',
27
+ onCompositionStart: 'compositionstart',
28
+ onCompositionUpdate: 'compositionupdate',
29
+ onCompositionEnd: 'compositionend',
30
+ };
31
+
32
+ // The DOM event types the host listens for. Fixed, so the host attaches these
33
+ // listeners once rather than tracking which types are in use.
34
+ const EVENT_TYPES = Object.values( SUPPORTED_EVENTS );
35
+
36
+ /**
37
+ * Collects the supported `on*` event handlers from a set of props, e.g. a
38
+ * block's merged `wrapperProps`, keyed by DOM event type. Used by the block to
39
+ * register them (see `useRegisterBlockEventHandlers`).
40
+ *
41
+ * @param {Object} props Props to read handlers from.
42
+ *
43
+ * @return {Object|undefined} The handlers by event type, or undefined when
44
+ * there are none.
45
+ */
46
+ export function getEventHandlers( props ) {
47
+ let handlers;
48
+
49
+ for ( const name in SUPPORTED_EVENTS ) {
50
+ if ( typeof props[ name ] === 'function' ) {
51
+ handlers = handlers || {};
52
+ handlers[ SUPPORTED_EVENTS[ name ] ] = props[ name ];
53
+ }
54
+ }
55
+
56
+ return handlers;
57
+ }
58
+
59
+ // The native properties React copies onto its SyntheticEvent for each event
60
+ // type (the *EventInterface tables in react-dom), so the wrapper exposes exactly
61
+ // what a React handler would see and nothing more. Values are copied straight
62
+ // from the native event; React's normalizers only paper over browsers we don't
63
+ // support, and anything omitted stays reachable through `nativeEvent`, as in
64
+ // React (e.g. `getTargetRanges` on a `beforeinput`).
65
+ const EVENT_INTERFACE = [
66
+ 'eventPhase',
67
+ 'bubbles',
68
+ 'cancelable',
69
+ 'timeStamp',
70
+ 'defaultPrevented',
71
+ 'isTrusted',
72
+ ];
73
+ const KEYBOARD_EVENT_INTERFACE = [
74
+ ...EVENT_INTERFACE,
75
+ 'view',
76
+ 'detail',
77
+ 'key',
78
+ 'code',
79
+ 'location',
80
+ 'ctrlKey',
81
+ 'shiftKey',
82
+ 'altKey',
83
+ 'metaKey',
84
+ 'repeat',
85
+ 'locale',
86
+ 'getModifierState',
87
+ 'charCode',
88
+ 'keyCode',
89
+ 'which',
90
+ ];
91
+ const INPUT_EVENT_INTERFACE = [ ...EVENT_INTERFACE, 'data' ];
92
+ const EVENT_INTERFACES = {
93
+ keydown: KEYBOARD_EVENT_INTERFACE,
94
+ keyup: KEYBOARD_EVENT_INTERFACE,
95
+ beforeinput: INPUT_EVENT_INTERFACE,
96
+ input: INPUT_EVENT_INTERFACE,
97
+ compositionstart: INPUT_EVENT_INTERFACE,
98
+ compositionupdate: INPUT_EVENT_INTERFACE,
99
+ compositionend: INPUT_EVENT_INTERFACE,
100
+ };
101
+
102
+ /**
103
+ * Builds a React `SyntheticEvent`-like object for an extension handler, which
104
+ * expects one. It mirrors what react-dom does: a plain object wrapping the real
105
+ * native event, eagerly copying the same interface properties React exposes for
106
+ * the event type, so a handler sees exactly React's surface and nothing more.
107
+ *
108
+ * `preventDefault` and `stopPropagation` forward to the native event, so they
109
+ * behave as through React; `stopPropagation` also flags the walk through block
110
+ * ancestors to stop. `target` is the editable inside the block rather than the
111
+ * real target (the editing host above it), and `currentTarget` is reassigned as
112
+ * the event bubbles from block to block.
113
+ *
114
+ * @param {Event} nativeEvent The event to wrap.
115
+ * @param {HTMLElement} target The element to report as the target.
116
+ *
117
+ * @return {Object} The synthetic event.
118
+ */
119
+ function createBlockSyntheticEvent( nativeEvent, target ) {
120
+ let propagationStopped = false;
121
+
122
+ const syntheticEvent = {
123
+ nativeEvent,
124
+ type: nativeEvent.type,
125
+ target,
126
+ currentTarget: null,
127
+ preventDefault() {
128
+ nativeEvent.preventDefault();
129
+ syntheticEvent.defaultPrevented = true;
130
+ },
131
+ isDefaultPrevented() {
132
+ return syntheticEvent.defaultPrevented;
133
+ },
134
+ stopPropagation() {
135
+ nativeEvent.stopPropagation();
136
+ propagationStopped = true;
137
+ },
138
+ isPropagationStopped() {
139
+ return propagationStopped;
140
+ },
141
+ // The modern event system doesn't pool, so persistence is a no-op.
142
+ persist() {},
143
+ isPersistent() {
144
+ return true;
145
+ },
146
+ };
147
+
148
+ for ( const property of EVENT_INTERFACES[ nativeEvent.type ] ) {
149
+ const value = nativeEvent[ property ];
150
+ syntheticEvent[ property ] =
151
+ typeof value === 'function' ? value.bind( nativeEvent ) : value;
152
+ }
153
+
154
+ return syntheticEvent;
155
+ }
156
+
157
+ /**
158
+ * Backwards compatibility for block event handlers under `editableRoot`.
159
+ *
160
+ * When a block supports `editableRoot`, the writing flow wrapper is the
161
+ * contentEditable editing host, so keyboard, input and composition events
162
+ * target the wrapper instead of the block. React `on*` handlers a third party
163
+ * added to a block through `wrapperProps` (e.g. via an `editor.BlockListBlock`
164
+ * filter) are on the block element, below the target, so they stop firing.
165
+ *
166
+ * The block registers those handlers (see `useBlockProps`), and this hook
167
+ * calls them from the host: it resolves the block that owns the selection and
168
+ * every block ancestor, and invokes each registered handler with a synthetic
169
+ * event, innermost first, like a bubbling event. The listeners are attached
170
+ * where React attaches its own (the portal container, the iframe's document
171
+ * element), so a block's handler runs and its `preventDefault` /
172
+ * `stopPropagation` behave as they would through React, without editableRoot.
173
+ *
174
+ * This does not cover handlers a filter puts on its own wrapping element rather
175
+ * than the block's `wrapperProps`; the block element is the supported event
176
+ * surface. It can be removed once input handling is lifted to the host.
177
+ */
178
+ export default function useEditableRootEventHandlers() {
179
+ const { hasMultiSelection, getBlockParents } =
180
+ useSelect( blockEditorStore );
181
+ const { refsMap, eventHandlers } = useContext( BlockRefs );
182
+ return useRefEffect(
183
+ ( node ) => {
184
+ function onEvent( event ) {
185
+ // Only act on real events targeting the host itself, while it
186
+ // is the editing host for a single block and some block has a
187
+ // handler to call.
188
+ if (
189
+ ! eventHandlers.size ||
190
+ event.target !== node ||
191
+ ! event.isTrusted ||
192
+ node.contentEditable !== 'true' ||
193
+ hasMultiSelection()
194
+ ) {
195
+ return;
196
+ }
197
+
198
+ const selection = node.ownerDocument.defaultView.getSelection();
199
+
200
+ if ( ! selection.rangeCount ) {
201
+ return;
202
+ }
203
+
204
+ const editable = getSelectionEditableElement( selection, node );
205
+ const clientId = getBlockClientId( editable );
206
+
207
+ if ( ! clientId ) {
208
+ return;
209
+ }
210
+
211
+ // Call the handler on the block that owns the selection and each
212
+ // of its block ancestors, innermost first, like a bubbling
213
+ // event. The hierarchy comes from the store rather than the DOM,
214
+ // and one synthetic event, wrapping the real event, is reused
215
+ // for the whole chain, its currentTarget moved from block to
216
+ // block. The element is only resolved for blocks with a handler.
217
+ const clientIds = [
218
+ clientId,
219
+ ...getBlockParents( clientId, true ),
220
+ ];
221
+
222
+ let syntheticEvent;
223
+ for ( const ancestorClientId of clientIds ) {
224
+ const handler =
225
+ eventHandlers.get( ancestorClientId )?.current?.[
226
+ event.type
227
+ ];
228
+ const element = handler && refsMap.get( ancestorClientId );
229
+
230
+ if ( ! element ) {
231
+ continue;
232
+ }
233
+
234
+ if ( ! syntheticEvent ) {
235
+ syntheticEvent = createBlockSyntheticEvent(
236
+ event,
237
+ editable
238
+ );
239
+ }
240
+
241
+ syntheticEvent.currentTarget = element;
242
+ handler( syntheticEvent );
243
+
244
+ if ( syntheticEvent.isPropagationStopped() ) {
245
+ break;
246
+ }
247
+ }
248
+ }
249
+
250
+ // Attach where React attaches its own event system: the portal
251
+ // container, which for the iframed canvas is the document element
252
+ // (see `preparePortalMount` in react-dom). Listening at the same
253
+ // node, non-capture, means a block's handler runs in the bubbling
254
+ // phase after core, and its stopPropagation stops at the same point
255
+ // React's would, as its `on*` handler would without editableRoot.
256
+ const root = node.ownerDocument.documentElement;
257
+ const unsubscribers = EVENT_TYPES.map( ( type ) => {
258
+ root.addEventListener( type, onEvent );
259
+ return () => root.removeEventListener( type, onEvent );
260
+ } );
261
+ return () =>
262
+ unsubscribers.forEach( ( unsubscribe ) => unsubscribe() );
263
+ },
264
+ [ hasMultiSelection, getBlockParents, refsMap, eventHandlers ]
265
+ );
266
+ }