@wordpress/block-editor 12.16.0 → 12.17.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 (646) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/LICENSE.md +1 -1
  3. package/README.md +3 -6
  4. package/build/components/block-canvas/index.js +0 -2
  5. package/build/components/block-canvas/index.js.map +1 -1
  6. package/build/components/block-card/index.js +1 -1
  7. package/build/components/block-card/index.js.map +1 -1
  8. package/build/components/block-draggable/draggable-chip.js +6 -1
  9. package/build/components/block-draggable/draggable-chip.js.map +1 -1
  10. package/build/components/block-draggable/index.js +76 -6
  11. package/build/components/block-draggable/index.js.map +1 -1
  12. package/build/components/block-draggable/index.native.js +0 -6
  13. package/build/components/block-draggable/index.native.js.map +1 -1
  14. package/build/components/block-draggable/use-scroll-when-dragging.native.js +1 -1
  15. package/build/components/block-draggable/use-scroll-when-dragging.native.js.map +1 -1
  16. package/build/components/block-editing-mode/index.js +2 -3
  17. package/build/components/block-editing-mode/index.js.map +1 -1
  18. package/build/components/block-inspector/index.js +1 -1
  19. package/build/components/block-inspector/index.js.map +1 -1
  20. package/build/components/block-list/block-list-item-cell.native.js +1 -0
  21. package/build/components/block-list/block-list-item-cell.native.js.map +1 -1
  22. package/build/components/block-list/block.js +245 -102
  23. package/build/components/block-list/block.js.map +1 -1
  24. package/build/components/block-list/block.native.js +46 -20
  25. package/build/components/block-list/block.native.js.map +1 -1
  26. package/build/components/block-list/index.native.js +3 -5
  27. package/build/components/block-list/index.native.js.map +1 -1
  28. package/build/components/block-list/private-block-context.js +14 -0
  29. package/build/components/block-list/private-block-context.js.map +1 -0
  30. package/build/components/block-list/use-block-props/index.js +33 -96
  31. package/build/components/block-list/use-block-props/index.js.map +1 -1
  32. package/build/components/block-list/use-in-between-inserter.js +3 -2
  33. package/build/components/block-list/use-in-between-inserter.js.map +1 -1
  34. package/build/components/block-list/use-scroll-upon-insertion.native.js +41 -0
  35. package/build/components/block-list/use-scroll-upon-insertion.native.js.map +1 -0
  36. package/build/components/block-lock/toolbar.js +15 -27
  37. package/build/components/block-lock/toolbar.js.map +1 -1
  38. package/build/components/block-mover/index.js +2 -1
  39. package/build/components/block-mover/index.js.map +1 -1
  40. package/build/components/block-patterns-list/index.js +4 -4
  41. package/build/components/block-patterns-list/index.js.map +1 -1
  42. package/build/components/block-switcher/index.js +4 -4
  43. package/build/components/block-switcher/index.js.map +1 -1
  44. package/build/components/block-toolbar/index.js +1 -2
  45. package/build/components/block-toolbar/index.js.map +1 -1
  46. package/build/components/block-tools/block-toolbar-popover.js +0 -2
  47. package/build/components/block-tools/block-toolbar-popover.js.map +1 -1
  48. package/build/components/block-variation-transforms/index.js +29 -2
  49. package/build/components/block-variation-transforms/index.js.map +1 -1
  50. package/build/components/border-radius-control/linked-button.js +1 -1
  51. package/build/components/border-radius-control/linked-button.js.map +1 -1
  52. package/build/components/colors/utils.js +10 -2
  53. package/build/components/colors/utils.js.map +1 -1
  54. package/build/components/colors/with-colors.js +6 -2
  55. package/build/components/colors/with-colors.js.map +1 -1
  56. package/build/components/font-sizes/utils.js +10 -2
  57. package/build/components/font-sizes/utils.js.map +1 -1
  58. package/build/components/global-styles/border-panel.js +2 -1
  59. package/build/components/global-styles/border-panel.js.map +1 -1
  60. package/build/components/global-styles/color-panel.js +2 -1
  61. package/build/components/global-styles/color-panel.js.map +1 -1
  62. package/build/components/global-styles/dimensions-panel.js +4 -3
  63. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  64. package/build/components/global-styles/effects-panel.js +2 -1
  65. package/build/components/global-styles/effects-panel.js.map +1 -1
  66. package/build/components/global-styles/filters-panel.js +1 -4
  67. package/build/components/global-styles/filters-panel.js.map +1 -1
  68. package/build/components/global-styles/get-global-styles-changes.js +192 -0
  69. package/build/components/global-styles/get-global-styles-changes.js.map +1 -0
  70. package/build/components/global-styles/hooks.js +1 -1
  71. package/build/components/global-styles/hooks.js.map +1 -1
  72. package/build/components/global-styles/image-settings-panel.js +7 -1
  73. package/build/components/global-styles/image-settings-panel.js.map +1 -1
  74. package/build/components/global-styles/index.js +7 -0
  75. package/build/components/global-styles/index.js.map +1 -1
  76. package/build/components/global-styles/typography-panel.js +2 -1
  77. package/build/components/global-styles/typography-panel.js.map +1 -1
  78. package/build/components/global-styles/use-global-styles-output.js +22 -8
  79. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  80. package/build/components/global-styles/utils.js +8 -1
  81. package/build/components/global-styles/utils.js.map +1 -1
  82. package/build/components/height-control/index.js +6 -2
  83. package/build/components/height-control/index.js.map +1 -1
  84. package/build/components/image-size-control/index.js +2 -2
  85. package/build/components/image-size-control/index.js.map +1 -1
  86. package/build/components/index.native.js +6 -5
  87. package/build/components/index.native.js.map +1 -1
  88. package/build/components/inner-blocks/index.js +61 -22
  89. package/build/components/inner-blocks/index.js.map +1 -1
  90. package/build/components/inner-blocks/index.native.js +18 -4
  91. package/build/components/inner-blocks/index.native.js.map +1 -1
  92. package/build/components/inner-blocks/use-inner-block-template-sync.js +5 -6
  93. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  94. package/build/components/inner-blocks/use-nested-settings-update.js +5 -9
  95. package/build/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  96. package/build/components/inserter/block-patterns-explorer/pattern-list.js +1 -1
  97. package/build/components/inserter/block-patterns-explorer/pattern-list.js.map +1 -1
  98. package/build/components/inserter/block-patterns-tab/pattern-category-previews.js +10 -9
  99. package/build/components/inserter/block-patterns-tab/pattern-category-previews.js.map +1 -1
  100. package/build/components/inserter/block-patterns-tab/patterns-filter.js +10 -10
  101. package/build/components/inserter/block-patterns-tab/patterns-filter.js.map +1 -1
  102. package/build/components/inserter/block-patterns-tab/use-pattern-categories.js +9 -9
  103. package/build/components/inserter/block-patterns-tab/use-pattern-categories.js.map +1 -1
  104. package/build/components/inserter/block-patterns-tab/utils.js +10 -14
  105. package/build/components/inserter/block-patterns-tab/utils.js.map +1 -1
  106. package/build/components/inserter/hooks/use-block-types-state.js +4 -14
  107. package/build/components/inserter/hooks/use-block-types-state.js.map +1 -1
  108. package/build/components/inserter/hooks/use-patterns-state.js +1 -1
  109. package/build/components/inserter/hooks/use-patterns-state.js.map +1 -1
  110. package/build/components/inserter/index.js +1 -2
  111. package/build/components/inserter/index.js.map +1 -1
  112. package/build/components/inserter/library.js +3 -7
  113. package/build/components/inserter/library.js.map +1 -1
  114. package/build/components/inserter/menu.js +14 -28
  115. package/build/components/inserter/menu.js.map +1 -1
  116. package/build/components/inserter/tabs.js +21 -21
  117. package/build/components/inserter/tabs.js.map +1 -1
  118. package/build/components/inserter-draggable-blocks/index.js +1 -1
  119. package/build/components/inserter-draggable-blocks/index.js.map +1 -1
  120. package/build/components/inserter-list-item/index.js +2 -4
  121. package/build/components/inserter-list-item/index.js.map +1 -1
  122. package/build/components/inspector-controls/block-support-tools-panel.js +3 -1
  123. package/build/components/inspector-controls/block-support-tools-panel.js.map +1 -1
  124. package/build/components/inspector-controls-tabs/index.js +34 -23
  125. package/build/components/inspector-controls-tabs/index.js.map +1 -1
  126. package/build/components/list-view/block-select-button.js +4 -0
  127. package/build/components/list-view/block-select-button.js.map +1 -1
  128. package/build/components/list-view/block.js +57 -3
  129. package/build/components/list-view/block.js.map +1 -1
  130. package/build/components/media-upload-progress/constants.js +19 -0
  131. package/build/components/media-upload-progress/constants.js.map +1 -0
  132. package/build/components/media-upload-progress/index.native.js +42 -17
  133. package/build/components/media-upload-progress/index.native.js.map +1 -1
  134. package/build/components/navigable-toolbar/index.js +9 -14
  135. package/build/components/navigable-toolbar/index.js.map +1 -1
  136. package/build/components/plain-text/index.native.js +8 -3
  137. package/build/components/plain-text/index.native.js.map +1 -1
  138. package/build/components/provider/index.js +3 -1
  139. package/build/components/provider/index.js.map +1 -1
  140. package/build/components/provider/use-block-sync.js +7 -1
  141. package/build/components/provider/use-block-sync.js.map +1 -1
  142. package/build/components/rich-text/index.js +17 -7
  143. package/build/components/rich-text/index.js.map +1 -1
  144. package/build/components/rich-text/native/index.native.js +16 -24
  145. package/build/components/rich-text/native/index.native.js.map +1 -1
  146. package/build/components/rich-text/use-input-rules.js +2 -2
  147. package/build/components/rich-text/use-input-rules.js.map +1 -1
  148. package/build/components/rich-text/use-mark-persistent.js +1 -1
  149. package/build/components/rich-text/use-mark-persistent.js.map +1 -1
  150. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js +1 -1
  151. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  152. package/build/components/url-input/index.js +9 -6
  153. package/build/components/url-input/index.js.map +1 -1
  154. package/build/components/use-block-commands/index.js +14 -18
  155. package/build/components/use-block-commands/index.js.map +1 -1
  156. package/build/components/use-block-drop-zone/index.js +51 -22
  157. package/build/components/use-block-drop-zone/index.js.map +1 -1
  158. package/build/components/use-moving-animation/index.js +100 -92
  159. package/build/components/use-moving-animation/index.js.map +1 -1
  160. package/build/components/use-on-block-drop/index.js +8 -11
  161. package/build/components/use-on-block-drop/index.js.map +1 -1
  162. package/build/components/writing-flow/index.js +0 -1
  163. package/build/components/writing-flow/index.js.map +1 -1
  164. package/build/components/writing-flow/use-drag-selection.js +15 -4
  165. package/build/components/writing-flow/use-drag-selection.js.map +1 -1
  166. package/build/components/writing-flow/use-selection-observer.js +73 -27
  167. package/build/components/writing-flow/use-selection-observer.js.map +1 -1
  168. package/build/components/writing-flow/use-tab-nav.js +7 -4
  169. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  170. package/build/hooks/align.js +1 -1
  171. package/build/hooks/align.js.map +1 -1
  172. package/build/hooks/anchor.js +1 -1
  173. package/build/hooks/anchor.js.map +1 -1
  174. package/build/hooks/aria-label.js +9 -1
  175. package/build/hooks/aria-label.js.map +1 -1
  176. package/build/hooks/background.js +185 -20
  177. package/build/hooks/background.js.map +1 -1
  178. package/build/hooks/border.js +5 -10
  179. package/build/hooks/border.js.map +1 -1
  180. package/build/hooks/color.js +13 -11
  181. package/build/hooks/color.js.map +1 -1
  182. package/build/hooks/custom-class-name.js +1 -1
  183. package/build/hooks/custom-class-name.js.map +1 -1
  184. package/build/hooks/custom-class-name.native.js +9 -1
  185. package/build/hooks/custom-class-name.native.js.map +1 -1
  186. package/build/hooks/dimensions.js +4 -9
  187. package/build/hooks/dimensions.js.map +1 -1
  188. package/build/hooks/font-family.js +7 -3
  189. package/build/hooks/font-family.js.map +1 -1
  190. package/build/hooks/font-size.js +1 -1
  191. package/build/hooks/font-size.js.map +1 -1
  192. package/build/hooks/index.js +4 -3
  193. package/build/hooks/index.js.map +1 -1
  194. package/build/hooks/index.native.js +5 -3
  195. package/build/hooks/index.native.js.map +1 -1
  196. package/build/hooks/layout.js +10 -4
  197. package/build/hooks/layout.js.map +1 -1
  198. package/build/hooks/style.js +1 -1
  199. package/build/hooks/style.js.map +1 -1
  200. package/build/hooks/typography.js +4 -9
  201. package/build/hooks/typography.js.map +1 -1
  202. package/build/hooks/typography.native.js +43 -18
  203. package/build/hooks/typography.native.js.map +1 -1
  204. package/build/hooks/use-typography-props.js +10 -2
  205. package/build/hooks/use-typography-props.js.map +1 -1
  206. package/build/hooks/utils.js +44 -4
  207. package/build/hooks/utils.js.map +1 -1
  208. package/build/private-apis.js +2 -4
  209. package/build/private-apis.js.map +1 -1
  210. package/build/private-apis.native.js +0 -2
  211. package/build/private-apis.native.js.map +1 -1
  212. package/build/store/actions.js +0 -16
  213. package/build/store/actions.js.map +1 -1
  214. package/build/store/private-actions.js +51 -5
  215. package/build/store/private-actions.js.map +1 -1
  216. package/build/store/private-selectors.js +12 -0
  217. package/build/store/private-selectors.js.map +1 -1
  218. package/build/store/reducer.js +14 -6
  219. package/build/store/reducer.js.map +1 -1
  220. package/build/store/selectors.js +1 -13
  221. package/build/store/selectors.js.map +1 -1
  222. package/build/store/undo-ignore.js +12 -0
  223. package/build/store/undo-ignore.js.map +1 -0
  224. package/build/store/utils.js +1 -1
  225. package/build/store/utils.js.map +1 -1
  226. package/build/utils/get-px-from-css-unit.js +16 -0
  227. package/build/utils/get-px-from-css-unit.js.map +1 -0
  228. package/build/utils/index.js +2 -2
  229. package/build/utils/index.js.map +1 -1
  230. package/build/utils/object.js +0 -38
  231. package/build/utils/object.js.map +1 -1
  232. package/build/utils/use-can-block-toolbar-be-focused.js +46 -0
  233. package/build/utils/use-can-block-toolbar-be-focused.js.map +1 -0
  234. package/build-module/components/block-canvas/index.js +0 -2
  235. package/build-module/components/block-canvas/index.js.map +1 -1
  236. package/build-module/components/block-card/index.js +1 -1
  237. package/build-module/components/block-card/index.js.map +1 -1
  238. package/build-module/components/block-draggable/draggable-chip.js +6 -1
  239. package/build-module/components/block-draggable/draggable-chip.js.map +1 -1
  240. package/build-module/components/block-draggable/index.js +76 -6
  241. package/build-module/components/block-draggable/index.js.map +1 -1
  242. package/build-module/components/block-draggable/index.native.js +1 -7
  243. package/build-module/components/block-draggable/index.native.js.map +1 -1
  244. package/build-module/components/block-draggable/use-scroll-when-dragging.native.js +1 -1
  245. package/build-module/components/block-draggable/use-scroll-when-dragging.native.js.map +1 -1
  246. package/build-module/components/block-editing-mode/index.js +3 -4
  247. package/build-module/components/block-editing-mode/index.js.map +1 -1
  248. package/build-module/components/block-inspector/index.js +1 -1
  249. package/build-module/components/block-inspector/index.js.map +1 -1
  250. package/build-module/components/block-list/block-list-item-cell.native.js +1 -0
  251. package/build-module/components/block-list/block-list-item-cell.native.js.map +1 -1
  252. package/build-module/components/block-list/block.js +249 -106
  253. package/build-module/components/block-list/block.js.map +1 -1
  254. package/build-module/components/block-list/block.native.js +48 -22
  255. package/build-module/components/block-list/block.native.js.map +1 -1
  256. package/build-module/components/block-list/index.native.js +3 -5
  257. package/build-module/components/block-list/index.native.js.map +1 -1
  258. package/build-module/components/block-list/private-block-context.js +6 -0
  259. package/build-module/components/block-list/private-block-context.js.map +1 -0
  260. package/build-module/components/block-list/use-block-props/index.js +34 -97
  261. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  262. package/build-module/components/block-list/use-in-between-inserter.js +3 -2
  263. package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
  264. package/build-module/components/block-list/use-scroll-upon-insertion.native.js +33 -0
  265. package/build-module/components/block-list/use-scroll-upon-insertion.native.js.map +1 -0
  266. package/build-module/components/block-lock/toolbar.js +16 -28
  267. package/build-module/components/block-lock/toolbar.js.map +1 -1
  268. package/build-module/components/block-mover/index.js +2 -1
  269. package/build-module/components/block-mover/index.js.map +1 -1
  270. package/build-module/components/block-patterns-list/index.js +5 -5
  271. package/build-module/components/block-patterns-list/index.js.map +1 -1
  272. package/build-module/components/block-switcher/index.js +4 -4
  273. package/build-module/components/block-switcher/index.js.map +1 -1
  274. package/build-module/components/block-toolbar/index.js +1 -2
  275. package/build-module/components/block-toolbar/index.js.map +1 -1
  276. package/build-module/components/block-tools/block-toolbar-popover.js +0 -2
  277. package/build-module/components/block-tools/block-toolbar-popover.js.map +1 -1
  278. package/build-module/components/block-variation-transforms/index.js +30 -3
  279. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  280. package/build-module/components/border-radius-control/linked-button.js +1 -1
  281. package/build-module/components/border-radius-control/linked-button.js.map +1 -1
  282. package/build-module/components/colors/utils.js +9 -1
  283. package/build-module/components/colors/utils.js.map +1 -1
  284. package/build-module/components/colors/with-colors.js +5 -1
  285. package/build-module/components/colors/with-colors.js.map +1 -1
  286. package/build-module/components/font-sizes/utils.js +9 -1
  287. package/build-module/components/font-sizes/utils.js.map +1 -1
  288. package/build-module/components/global-styles/border-panel.js +3 -2
  289. package/build-module/components/global-styles/border-panel.js.map +1 -1
  290. package/build-module/components/global-styles/color-panel.js +3 -2
  291. package/build-module/components/global-styles/color-panel.js.map +1 -1
  292. package/build-module/components/global-styles/dimensions-panel.js +5 -4
  293. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  294. package/build-module/components/global-styles/effects-panel.js +3 -2
  295. package/build-module/components/global-styles/effects-panel.js.map +1 -1
  296. package/build-module/components/global-styles/filters-panel.js +2 -5
  297. package/build-module/components/global-styles/filters-panel.js.map +1 -1
  298. package/build-module/components/global-styles/get-global-styles-changes.js +184 -0
  299. package/build-module/components/global-styles/get-global-styles-changes.js.map +1 -0
  300. package/build-module/components/global-styles/hooks.js +1 -1
  301. package/build-module/components/global-styles/hooks.js.map +1 -1
  302. package/build-module/components/global-styles/image-settings-panel.js +7 -1
  303. package/build-module/components/global-styles/image-settings-panel.js.map +1 -1
  304. package/build-module/components/global-styles/index.js +1 -0
  305. package/build-module/components/global-styles/index.js.map +1 -1
  306. package/build-module/components/global-styles/typography-panel.js +3 -2
  307. package/build-module/components/global-styles/typography-panel.js.map +1 -1
  308. package/build-module/components/global-styles/use-global-styles-output.js +15 -1
  309. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  310. package/build-module/components/global-styles/utils.js +7 -0
  311. package/build-module/components/global-styles/utils.js.map +1 -1
  312. package/build-module/components/height-control/index.js +6 -2
  313. package/build-module/components/height-control/index.js.map +1 -1
  314. package/build-module/components/image-size-control/index.js +2 -2
  315. package/build-module/components/image-size-control/index.js.map +1 -1
  316. package/build-module/components/index.native.js +2 -1
  317. package/build-module/components/index.native.js.map +1 -1
  318. package/build-module/components/inner-blocks/index.js +62 -23
  319. package/build-module/components/inner-blocks/index.js.map +1 -1
  320. package/build-module/components/inner-blocks/index.native.js +18 -4
  321. package/build-module/components/inner-blocks/index.native.js.map +1 -1
  322. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +5 -6
  323. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  324. package/build-module/components/inner-blocks/use-nested-settings-update.js +6 -10
  325. package/build-module/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  326. package/build-module/components/inserter/block-patterns-explorer/pattern-list.js +2 -2
  327. package/build-module/components/inserter/block-patterns-explorer/pattern-list.js.map +1 -1
  328. package/build-module/components/inserter/block-patterns-tab/pattern-category-previews.js +11 -10
  329. package/build-module/components/inserter/block-patterns-tab/pattern-category-previews.js.map +1 -1
  330. package/build-module/components/inserter/block-patterns-tab/patterns-filter.js +11 -11
  331. package/build-module/components/inserter/block-patterns-tab/patterns-filter.js.map +1 -1
  332. package/build-module/components/inserter/block-patterns-tab/use-pattern-categories.js +11 -11
  333. package/build-module/components/inserter/block-patterns-tab/use-pattern-categories.js.map +1 -1
  334. package/build-module/components/inserter/block-patterns-tab/utils.js +7 -11
  335. package/build-module/components/inserter/block-patterns-tab/utils.js.map +1 -1
  336. package/build-module/components/inserter/hooks/use-block-types-state.js +4 -14
  337. package/build-module/components/inserter/hooks/use-block-types-state.js.map +1 -1
  338. package/build-module/components/inserter/hooks/use-patterns-state.js +2 -2
  339. package/build-module/components/inserter/hooks/use-patterns-state.js.map +1 -1
  340. package/build-module/components/inserter/index.js +1 -2
  341. package/build-module/components/inserter/index.js.map +1 -1
  342. package/build-module/components/inserter/library.js +3 -7
  343. package/build-module/components/inserter/library.js.map +1 -1
  344. package/build-module/components/inserter/menu.js +14 -28
  345. package/build-module/components/inserter/menu.js.map +1 -1
  346. package/build-module/components/inserter/tabs.js +22 -22
  347. package/build-module/components/inserter/tabs.js.map +1 -1
  348. package/build-module/components/inserter-draggable-blocks/index.js +2 -2
  349. package/build-module/components/inserter-draggable-blocks/index.js.map +1 -1
  350. package/build-module/components/inserter-list-item/index.js +2 -4
  351. package/build-module/components/inserter-list-item/index.js.map +1 -1
  352. package/build-module/components/inspector-controls/block-support-tools-panel.js +3 -1
  353. package/build-module/components/inspector-controls/block-support-tools-panel.js.map +1 -1
  354. package/build-module/components/inspector-controls-tabs/index.js +35 -24
  355. package/build-module/components/inspector-controls-tabs/index.js.map +1 -1
  356. package/build-module/components/list-view/block-select-button.js +4 -0
  357. package/build-module/components/list-view/block-select-button.js.map +1 -1
  358. package/build-module/components/list-view/block.js +58 -4
  359. package/build-module/components/list-view/block.js.map +1 -1
  360. package/build-module/components/media-upload-progress/constants.js +7 -0
  361. package/build-module/components/media-upload-progress/constants.js.map +1 -0
  362. package/build-module/components/media-upload-progress/index.native.js +37 -8
  363. package/build-module/components/media-upload-progress/index.native.js.map +1 -1
  364. package/build-module/components/navigable-toolbar/index.js +9 -14
  365. package/build-module/components/navigable-toolbar/index.js.map +1 -1
  366. package/build-module/components/plain-text/index.native.js +6 -1
  367. package/build-module/components/plain-text/index.native.js.map +1 -1
  368. package/build-module/components/provider/index.js +3 -1
  369. package/build-module/components/provider/index.js.map +1 -1
  370. package/build-module/components/provider/use-block-sync.js +7 -1
  371. package/build-module/components/provider/use-block-sync.js.map +1 -1
  372. package/build-module/components/rich-text/index.js +17 -7
  373. package/build-module/components/rich-text/index.js.map +1 -1
  374. package/build-module/components/rich-text/native/index.native.js +16 -23
  375. package/build-module/components/rich-text/native/index.native.js.map +1 -1
  376. package/build-module/components/rich-text/use-input-rules.js +2 -2
  377. package/build-module/components/rich-text/use-input-rules.js.map +1 -1
  378. package/build-module/components/rich-text/use-mark-persistent.js +1 -1
  379. package/build-module/components/rich-text/use-mark-persistent.js.map +1 -1
  380. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js +1 -1
  381. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  382. package/build-module/components/url-input/index.js +9 -6
  383. package/build-module/components/url-input/index.js.map +1 -1
  384. package/build-module/components/use-block-commands/index.js +14 -18
  385. package/build-module/components/use-block-commands/index.js.map +1 -1
  386. package/build-module/components/use-block-drop-zone/index.js +51 -23
  387. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  388. package/build-module/components/use-moving-animation/index.js +102 -94
  389. package/build-module/components/use-moving-animation/index.js.map +1 -1
  390. package/build-module/components/use-on-block-drop/index.js +8 -11
  391. package/build-module/components/use-on-block-drop/index.js.map +1 -1
  392. package/build-module/components/writing-flow/index.js +0 -1
  393. package/build-module/components/writing-flow/index.js.map +1 -1
  394. package/build-module/components/writing-flow/use-drag-selection.js +15 -4
  395. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -1
  396. package/build-module/components/writing-flow/use-selection-observer.js +73 -27
  397. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -1
  398. package/build-module/components/writing-flow/use-tab-nav.js +7 -4
  399. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  400. package/build-module/hooks/align.js +1 -1
  401. package/build-module/hooks/align.js.map +1 -1
  402. package/build-module/hooks/anchor.js +1 -1
  403. package/build-module/hooks/anchor.js.map +1 -1
  404. package/build-module/hooks/aria-label.js +7 -1
  405. package/build-module/hooks/aria-label.js.map +1 -1
  406. package/build-module/hooks/background.js +181 -19
  407. package/build-module/hooks/background.js.map +1 -1
  408. package/build-module/hooks/border.js +2 -8
  409. package/build-module/hooks/border.js.map +1 -1
  410. package/build-module/hooks/color.js +11 -9
  411. package/build-module/hooks/color.js.map +1 -1
  412. package/build-module/hooks/custom-class-name.js +1 -1
  413. package/build-module/hooks/custom-class-name.js.map +1 -1
  414. package/build-module/hooks/custom-class-name.native.js +7 -1
  415. package/build-module/hooks/custom-class-name.native.js.map +1 -1
  416. package/build-module/hooks/dimensions.js +1 -7
  417. package/build-module/hooks/dimensions.js.map +1 -1
  418. package/build-module/hooks/font-family.js +6 -2
  419. package/build-module/hooks/font-family.js.map +1 -1
  420. package/build-module/hooks/font-size.js +1 -1
  421. package/build-module/hooks/font-size.js.map +1 -1
  422. package/build-module/hooks/index.js +5 -4
  423. package/build-module/hooks/index.js.map +1 -1
  424. package/build-module/hooks/index.native.js +6 -4
  425. package/build-module/hooks/index.native.js.map +1 -1
  426. package/build-module/hooks/layout.js +9 -3
  427. package/build-module/hooks/layout.js.map +1 -1
  428. package/build-module/hooks/style.js +1 -1
  429. package/build-module/hooks/style.js.map +1 -1
  430. package/build-module/hooks/typography.js +1 -7
  431. package/build-module/hooks/typography.js.map +1 -1
  432. package/build-module/hooks/typography.native.js +43 -17
  433. package/build-module/hooks/typography.native.js.map +1 -1
  434. package/build-module/hooks/use-typography-props.js +9 -1
  435. package/build-module/hooks/use-typography-props.js.map +1 -1
  436. package/build-module/hooks/utils.js +43 -4
  437. package/build-module/hooks/utils.js.map +1 -1
  438. package/build-module/private-apis.js +2 -4
  439. package/build-module/private-apis.js.map +1 -1
  440. package/build-module/private-apis.native.js +0 -2
  441. package/build-module/private-apis.native.js.map +1 -1
  442. package/build-module/store/actions.js +0 -15
  443. package/build-module/store/actions.js.map +1 -1
  444. package/build-module/store/private-actions.js +49 -4
  445. package/build-module/store/private-actions.js.map +1 -1
  446. package/build-module/store/private-selectors.js +11 -0
  447. package/build-module/store/private-selectors.js.map +1 -1
  448. package/build-module/store/reducer.js +14 -6
  449. package/build-module/store/reducer.js.map +1 -1
  450. package/build-module/store/selectors.js +1 -12
  451. package/build-module/store/selectors.js.map +1 -1
  452. package/build-module/store/undo-ignore.js +5 -0
  453. package/build-module/store/undo-ignore.js.map +1 -0
  454. package/build-module/store/utils.js +2 -2
  455. package/build-module/store/utils.js.map +1 -1
  456. package/build-module/utils/get-px-from-css-unit.js +9 -0
  457. package/build-module/utils/get-px-from-css-unit.js.map +1 -0
  458. package/build-module/utils/index.js +1 -1
  459. package/build-module/utils/index.js.map +1 -1
  460. package/build-module/utils/object.js +0 -37
  461. package/build-module/utils/object.js.map +1 -1
  462. package/build-module/utils/use-can-block-toolbar-be-focused.js +40 -0
  463. package/build-module/utils/use-can-block-toolbar-be-focused.js.map +1 -0
  464. package/build-style/content-rtl.css +7 -6
  465. package/build-style/content.css +7 -6
  466. package/build-style/style-rtl.css +51 -8
  467. package/build-style/style.css +51 -8
  468. package/package.json +31 -31
  469. package/src/components/alignment-control/README.md +0 -5
  470. package/src/components/block-alignment-control/README.md +0 -5
  471. package/src/components/block-alignment-matrix-control/README.md +0 -10
  472. package/src/components/block-breadcrumb/README.md +0 -5
  473. package/src/components/block-canvas/index.js +0 -2
  474. package/src/components/block-canvas/style.scss +6 -0
  475. package/src/components/block-caption/README.md +0 -5
  476. package/src/components/block-card/README.md +0 -5
  477. package/src/components/block-card/index.js +1 -1
  478. package/src/components/block-draggable/draggable-chip.js +11 -1
  479. package/src/components/block-draggable/index.js +116 -4
  480. package/src/components/block-draggable/index.native.js +0 -5
  481. package/src/components/block-draggable/style.scss +35 -0
  482. package/src/components/block-draggable/test/helpers.native.js +8 -7
  483. package/src/components/block-draggable/use-scroll-when-dragging.native.js +1 -1
  484. package/src/components/block-editing-mode/index.js +3 -3
  485. package/src/components/block-icon/README.md +0 -5
  486. package/src/components/block-inspector/README.md +0 -5
  487. package/src/components/block-inspector/index.js +3 -1
  488. package/src/components/block-list/block-list-item-cell.native.js +5 -1
  489. package/src/components/block-list/block.js +290 -119
  490. package/src/components/block-list/block.native.js +55 -21
  491. package/src/components/block-list/content.scss +14 -10
  492. package/src/components/block-list/index.native.js +3 -5
  493. package/src/components/block-list/{block-list-block-context.js → private-block-context.js} +1 -1
  494. package/src/components/block-list/use-block-props/index.js +32 -128
  495. package/src/components/block-list/use-in-between-inserter.js +4 -1
  496. package/src/components/block-list/use-scroll-upon-insertion.native.js +52 -0
  497. package/src/components/block-lock/toolbar.js +15 -34
  498. package/src/components/block-mover/README.md +0 -5
  499. package/src/components/block-mover/index.js +1 -1
  500. package/src/components/block-parent-selector/README.md +0 -5
  501. package/src/components/block-patterns-list/README.md +0 -5
  502. package/src/components/block-patterns-list/index.js +8 -5
  503. package/src/components/block-switcher/index.js +49 -59
  504. package/src/components/block-toolbar/README.md +0 -5
  505. package/src/components/block-toolbar/index.js +1 -2
  506. package/src/components/block-tools/block-toolbar-popover.js +4 -10
  507. package/src/components/block-types-list/README.md +0 -5
  508. package/src/components/block-variation-picker/README.md +0 -5
  509. package/src/components/block-variation-transforms/README.md +0 -5
  510. package/src/components/block-variation-transforms/index.js +49 -3
  511. package/src/components/border-radius-control/linked-button.js +1 -1
  512. package/src/components/caption/README.md +0 -5
  513. package/src/components/color-palette/test/__snapshots__/control.js.snap +0 -1
  514. package/src/components/colors/utils.js +8 -1
  515. package/src/components/colors/with-colors.js +3 -1
  516. package/src/components/contrast-checker/README.md +0 -4
  517. package/src/components/copy-handler/README.md +0 -10
  518. package/src/components/font-sizes/utils.js +7 -1
  519. package/src/components/global-styles/border-panel.js +2 -1
  520. package/src/components/global-styles/color-panel.js +2 -1
  521. package/src/components/global-styles/dimensions-panel.js +4 -3
  522. package/src/components/global-styles/effects-panel.js +2 -1
  523. package/src/components/global-styles/filters-panel.js +2 -5
  524. package/src/components/global-styles/get-global-styles-changes.js +210 -0
  525. package/src/components/global-styles/hooks.js +3 -0
  526. package/src/components/global-styles/image-settings-panel.js +6 -0
  527. package/src/components/global-styles/index.js +1 -0
  528. package/src/components/global-styles/test/get-global-styles-changes.js +234 -0
  529. package/src/components/global-styles/typography-panel.js +2 -1
  530. package/src/components/global-styles/use-global-styles-output.js +9 -5
  531. package/src/components/global-styles/utils.js +7 -0
  532. package/src/components/height-control/README.md +2 -7
  533. package/src/components/height-control/index.js +4 -0
  534. package/src/components/image-size-control/index.js +5 -2
  535. package/src/components/index.native.js +2 -2
  536. package/src/components/inner-blocks/index.js +68 -29
  537. package/src/components/inner-blocks/index.native.js +19 -7
  538. package/src/components/inner-blocks/use-inner-block-template-sync.js +5 -7
  539. package/src/components/inner-blocks/use-nested-settings-update.js +6 -13
  540. package/src/components/inserter/block-patterns-explorer/pattern-list.js +2 -2
  541. package/src/components/inserter/block-patterns-tab/pattern-category-previews.js +15 -15
  542. package/src/components/inserter/block-patterns-tab/patterns-filter.js +15 -13
  543. package/src/components/inserter/block-patterns-tab/use-pattern-categories.js +15 -18
  544. package/src/components/inserter/block-patterns-tab/utils.js +11 -12
  545. package/src/components/inserter/hooks/use-block-types-state.js +9 -11
  546. package/src/components/inserter/hooks/use-patterns-state.js +2 -2
  547. package/src/components/inserter/index.js +0 -1
  548. package/src/components/inserter/library.js +2 -8
  549. package/src/components/inserter/menu.js +13 -31
  550. package/src/components/inserter/style.scss +6 -4
  551. package/src/components/inserter/tabs.js +34 -25
  552. package/src/components/inserter-draggable-blocks/index.js +2 -2
  553. package/src/components/inserter-list-item/index.js +6 -6
  554. package/src/components/inspector-controls/block-support-tools-panel.js +2 -0
  555. package/src/components/inspector-controls-tabs/index.js +39 -28
  556. package/src/components/inspector-controls-tabs/style.scss +3 -2
  557. package/src/components/letter-spacing-control/README.md +0 -5
  558. package/src/components/line-height-control/README.md +0 -5
  559. package/src/components/list-view/README.md +0 -5
  560. package/src/components/list-view/block-select-button.js +4 -0
  561. package/src/components/list-view/block.js +73 -2
  562. package/src/components/list-view/style.scss +6 -0
  563. package/src/components/media-upload-progress/constants.js +6 -0
  564. package/src/components/media-upload-progress/index.native.js +66 -14
  565. package/src/components/media-upload-progress/test/index.native.js +2 -2
  566. package/src/components/multi-selection-inspector/README.md +0 -5
  567. package/src/components/navigable-toolbar/index.js +13 -11
  568. package/src/components/plain-text/index.native.js +6 -1
  569. package/src/components/provider/index.js +1 -1
  570. package/src/components/provider/test/use-block-sync.js +20 -17
  571. package/src/components/provider/use-block-sync.js +6 -0
  572. package/src/components/rich-text/index.js +18 -6
  573. package/src/components/rich-text/native/index.native.js +16 -24
  574. package/src/components/rich-text/native/test/__snapshots__/index.native.js.snap +3 -3
  575. package/src/components/rich-text/native/test/index.native.js +72 -5
  576. package/src/components/rich-text/use-input-rules.js +2 -2
  577. package/src/components/rich-text/use-mark-persistent.js +1 -2
  578. package/src/components/spacing-sizes-control/input-controls/spacing-input-control.js +1 -1
  579. package/src/components/text-decoration-control/README.md +40 -0
  580. package/src/components/text-transform-control/README.md +0 -4
  581. package/src/components/ungroup-button/README.md +0 -5
  582. package/src/components/unit-control/README.md +0 -4
  583. package/src/components/url-input/index.js +11 -11
  584. package/src/components/use-block-commands/index.js +18 -21
  585. package/src/components/use-block-drop-zone/index.js +85 -34
  586. package/src/components/use-moving-animation/index.js +107 -103
  587. package/src/components/use-on-block-drop/index.js +7 -23
  588. package/src/components/use-on-block-drop/test/index.js +12 -26
  589. package/src/components/use-resize-canvas/README.md +0 -4
  590. package/src/components/use-settings/README.md +0 -4
  591. package/src/components/writing-flow/index.js +0 -1
  592. package/src/components/writing-flow/use-drag-selection.js +18 -4
  593. package/src/components/writing-flow/use-selection-observer.js +99 -37
  594. package/src/components/writing-flow/use-tab-nav.js +7 -7
  595. package/src/hooks/align.js +1 -5
  596. package/src/hooks/anchor.js +1 -5
  597. package/src/hooks/aria-label.js +8 -5
  598. package/src/hooks/background.js +253 -21
  599. package/src/hooks/border.js +2 -13
  600. package/src/hooks/color.js +19 -14
  601. package/src/hooks/custom-class-name.js +1 -5
  602. package/src/hooks/custom-class-name.native.js +8 -5
  603. package/src/hooks/dimensions.js +1 -7
  604. package/src/hooks/font-family.js +4 -7
  605. package/src/hooks/font-size.js +1 -6
  606. package/src/hooks/index.js +19 -3
  607. package/src/hooks/index.native.js +17 -4
  608. package/src/hooks/layout.js +5 -2
  609. package/src/hooks/style.js +1 -6
  610. package/src/hooks/test/anchor.js +4 -9
  611. package/src/hooks/test/custom-class-name.js +3 -8
  612. package/src/hooks/test/style.js +4 -14
  613. package/src/hooks/typography.js +1 -7
  614. package/src/hooks/typography.native.js +31 -33
  615. package/src/hooks/use-typography-props.js +7 -1
  616. package/src/hooks/utils.js +60 -2
  617. package/src/private-apis.js +2 -4
  618. package/src/private-apis.native.js +0 -2
  619. package/src/store/actions.js +0 -15
  620. package/src/store/private-actions.js +44 -4
  621. package/src/store/private-selectors.js +11 -0
  622. package/src/store/reducer.js +16 -5
  623. package/src/store/selectors.js +5 -13
  624. package/src/store/undo-ignore.js +4 -0
  625. package/src/store/utils.js +2 -2
  626. package/src/style.scss +1 -0
  627. package/src/utils/get-px-from-css-unit.js +8 -0
  628. package/src/utils/index.js +1 -1
  629. package/src/utils/object.js +0 -35
  630. package/src/utils/test/object.js +1 -96
  631. package/src/utils/use-can-block-toolbar-be-focused.js +48 -0
  632. package/build/components/block-list/block-list-block-context.js +0 -14
  633. package/build/components/block-list/block-list-block-context.js.map +0 -1
  634. package/build/utils/parse-css-unit-to-px.js +0 -302
  635. package/build/utils/parse-css-unit-to-px.js.map +0 -1
  636. package/build/utils/use-should-contextual-toolbar-show.js +0 -63
  637. package/build/utils/use-should-contextual-toolbar-show.js.map +0 -1
  638. package/build-module/components/block-list/block-list-block-context.js +0 -6
  639. package/build-module/components/block-list/block-list-block-context.js.map +0 -1
  640. package/build-module/utils/parse-css-unit-to-px.js +0 -294
  641. package/build-module/utils/parse-css-unit-to-px.js.map +0 -1
  642. package/build-module/utils/use-should-contextual-toolbar-show.js +0 -57
  643. package/build-module/utils/use-should-contextual-toolbar-show.js.map +0 -1
  644. package/src/utils/parse-css-unit-to-px.js +0 -329
  645. package/src/utils/test/parse-css-unit-to-px.js +0 -172
  646. package/src/utils/use-should-contextual-toolbar-show.js +0 -85
@@ -27,8 +27,12 @@ function setContentEditableWrapper( node, value ) {
27
27
  export default function useDragSelection() {
28
28
  const { startMultiSelect, stopMultiSelect } =
29
29
  useDispatch( blockEditorStore );
30
- const { isSelectionEnabled, hasMultiSelection, isDraggingBlocks } =
31
- useSelect( blockEditorStore );
30
+ const {
31
+ isSelectionEnabled,
32
+ hasSelectedBlock,
33
+ isDraggingBlocks,
34
+ isMultiSelecting,
35
+ } = useSelect( blockEditorStore );
32
36
  return useRefEffect(
33
37
  ( node ) => {
34
38
  const { ownerDocument } = node;
@@ -45,7 +49,7 @@ export default function useDragSelection() {
45
49
  // so wait until the next animation frame to get the browser
46
50
  // selection.
47
51
  rafId = defaultView.requestAnimationFrame( () => {
48
- if ( hasMultiSelection() ) {
52
+ if ( ! hasSelectedBlock() ) {
49
53
  return;
50
54
  }
51
55
 
@@ -84,6 +88,16 @@ export default function useDragSelection() {
84
88
  return;
85
89
  }
86
90
 
91
+ // Abort if we are already multi-selecting.
92
+ if ( isMultiSelecting() ) {
93
+ return;
94
+ }
95
+
96
+ // Abort if selection is leaving writing flow.
97
+ if ( node === target ) {
98
+ return;
99
+ }
100
+
87
101
  // Check the attribute, not the contentEditable attribute. All
88
102
  // child elements of the content editable wrapper are editable
89
103
  // and return true for this property. We only want to start
@@ -127,7 +141,7 @@ export default function useDragSelection() {
127
141
  startMultiSelect,
128
142
  stopMultiSelect,
129
143
  isSelectionEnabled,
130
- hasMultiSelection,
144
+ hasSelectedBlock,
131
145
  ]
132
146
  );
133
147
  }
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { useSelect, useDispatch } from '@wordpress/data';
5
5
  import { useRefEffect } from '@wordpress/compose';
6
+ import { create } from '@wordpress/rich-text';
6
7
 
7
8
  /**
8
9
  * Internal dependencies
@@ -75,10 +76,20 @@ function setContentEditableWrapper( node, value ) {
75
76
  // Since we are calling this on every selection change, check if the value
76
77
  // needs to be updated first because it trigger the browser to recalculate
77
78
  // style.
78
- if ( node.contentEditable !== String( value ) )
79
+ if ( node.contentEditable !== String( value ) ) {
79
80
  node.contentEditable = value;
80
- // Firefox doesn't automatically move focus.
81
- if ( value ) node.focus();
81
+
82
+ // Firefox doesn't automatically move focus.
83
+ if ( value ) {
84
+ node.focus();
85
+ }
86
+ }
87
+ }
88
+
89
+ function getRichTextElement( node ) {
90
+ const element =
91
+ node.nodeType === node.ELEMENT_NODE ? node : node.parentElement;
92
+ return element?.closest( '[data-wp-block-attribute-key]' );
82
93
  }
83
94
 
84
95
  /**
@@ -87,7 +98,7 @@ function setContentEditableWrapper( node, value ) {
87
98
  export default function useSelectionObserver() {
88
99
  const { multiSelect, selectBlock, selectionChange } =
89
100
  useDispatch( blockEditorStore );
90
- const { getBlockParents, getBlockSelectionStart } =
101
+ const { getBlockParents, getBlockSelectionStart, isMultiSelecting } =
91
102
  useSelect( blockEditorStore );
92
103
  return useRefEffect(
93
104
  ( node ) => {
@@ -101,6 +112,16 @@ export default function useSelectionObserver() {
101
112
  return;
102
113
  }
103
114
 
115
+ const startNode = extractSelectionStartNode( selection );
116
+ const endNode = extractSelectionEndNode( selection );
117
+
118
+ if (
119
+ ! node.contains( startNode ) ||
120
+ ! node.contains( endNode )
121
+ ) {
122
+ return;
123
+ }
124
+
104
125
  // If selection is collapsed and we haven't used `shift+click`,
105
126
  // end multi selection and disable the contentEditable wrapper.
106
127
  // We have to check about `shift+click` case because elements
@@ -109,16 +130,24 @@ export default function useSelectionObserver() {
109
130
  // For now we check if the event is a `mouse` event.
110
131
  const isClickShift = event.shiftKey && event.type === 'mouseup';
111
132
  if ( selection.isCollapsed && ! isClickShift ) {
112
- setContentEditableWrapper( node, false );
133
+ if (
134
+ node.contentEditable === 'true' &&
135
+ ! isMultiSelecting()
136
+ ) {
137
+ setContentEditableWrapper( node, false );
138
+ let element =
139
+ startNode.nodeType === startNode.ELEMENT_NODE
140
+ ? startNode
141
+ : startNode.parentElement;
142
+ element = element?.closest( '[contenteditable]' );
143
+ element?.focus();
144
+ }
113
145
  return;
114
146
  }
115
147
 
116
- let startClientId = getBlockClientId(
117
- extractSelectionStartNode( selection )
118
- );
119
- let endClientId = getBlockClientId(
120
- extractSelectionEndNode( selection )
121
- );
148
+ let startClientId = getBlockClientId( startNode );
149
+ let endClientId = getBlockClientId( endNode );
150
+
122
151
  // If the selection has changed and we had pressed `shift+click`,
123
152
  // we need to check if in an element that doesn't support
124
153
  // text selection has been clicked.
@@ -155,7 +184,11 @@ export default function useSelectionObserver() {
155
184
 
156
185
  const isSingularSelection = startClientId === endClientId;
157
186
  if ( isSingularSelection ) {
158
- selectBlock( startClientId );
187
+ if ( ! isMultiSelecting() ) {
188
+ selectBlock( startClientId );
189
+ } else {
190
+ multiSelect( startClientId, startClientId );
191
+ }
159
192
  } else {
160
193
  const startPath = [
161
194
  ...getBlockParents( startClientId ),
@@ -167,39 +200,68 @@ export default function useSelectionObserver() {
167
200
  ];
168
201
  const depth = findDepth( startPath, endPath );
169
202
 
170
- multiSelect( startPath[ depth ], endPath[ depth ] );
171
- }
172
- }
203
+ if (
204
+ startPath[ depth ] !== startClientId ||
205
+ endPath[ depth ] !== endClientId
206
+ ) {
207
+ multiSelect( startPath[ depth ], endPath[ depth ] );
208
+ return;
209
+ }
173
210
 
174
- function addListeners() {
175
- ownerDocument.addEventListener(
176
- 'selectionchange',
177
- onSelectionChange
178
- );
179
- defaultView.addEventListener( 'mouseup', onSelectionChange );
211
+ const richTextElementStart =
212
+ getRichTextElement( startNode );
213
+ const richTextElementEnd = getRichTextElement( endNode );
214
+
215
+ if ( richTextElementStart && richTextElementEnd ) {
216
+ const range = selection.getRangeAt( 0 );
217
+ const richTextDataStart = create( {
218
+ element: richTextElementStart,
219
+ range,
220
+ __unstableIsEditableTree: true,
221
+ } );
222
+ const richTextDataEnd = create( {
223
+ element: richTextElementEnd,
224
+ range,
225
+ __unstableIsEditableTree: true,
226
+ } );
227
+
228
+ const startOffset =
229
+ richTextDataStart.start ?? richTextDataStart.end;
230
+ const endOffset =
231
+ richTextDataEnd.start ?? richTextDataEnd.end;
232
+ selectionChange( {
233
+ start: {
234
+ clientId: startClientId,
235
+ attributeKey:
236
+ richTextElementStart.dataset
237
+ .wpBlockAttributeKey,
238
+ offset: startOffset,
239
+ },
240
+ end: {
241
+ clientId: endClientId,
242
+ attributeKey:
243
+ richTextElementEnd.dataset
244
+ .wpBlockAttributeKey,
245
+ offset: endOffset,
246
+ },
247
+ } );
248
+ } else {
249
+ multiSelect( startClientId, endClientId );
250
+ }
251
+ }
180
252
  }
181
253
 
182
- function removeListeners() {
254
+ ownerDocument.addEventListener(
255
+ 'selectionchange',
256
+ onSelectionChange
257
+ );
258
+ defaultView.addEventListener( 'mouseup', onSelectionChange );
259
+ return () => {
183
260
  ownerDocument.removeEventListener(
184
261
  'selectionchange',
185
262
  onSelectionChange
186
263
  );
187
264
  defaultView.removeEventListener( 'mouseup', onSelectionChange );
188
- }
189
-
190
- function resetListeners() {
191
- removeListeners();
192
- addListeners();
193
- }
194
-
195
- addListeners();
196
- // We must allow rich text to set selection first. This ensures that
197
- // our `selectionchange` listener is always reset to be called after
198
- // the rich text one.
199
- node.addEventListener( 'focusin', resetListeners );
200
- return () => {
201
- removeListeners();
202
- node.removeEventListener( 'focusin', resetListeners );
203
265
  };
204
266
  },
205
267
  [ multiSelect, selectBlock, selectionChange, getBlockParents ]
@@ -12,6 +12,7 @@ import { useRef } from '@wordpress/element';
12
12
  */
13
13
  import { store as blockEditorStore } from '../../store';
14
14
  import { isInSameBlock, isInsideRootBlock } from '../../utils/dom';
15
+ import { unlock } from '../../lock-unlock';
15
16
 
16
17
  export default function useTabNav() {
17
18
  const container = useRef();
@@ -20,16 +21,15 @@ export default function useTabNav() {
20
21
 
21
22
  const { hasMultiSelection, getSelectedBlockClientId, getBlockCount } =
22
23
  useSelect( blockEditorStore );
23
- const { setNavigationMode, setLastFocus } = useDispatch( blockEditorStore );
24
+ const { setNavigationMode, setLastFocus } = unlock(
25
+ useDispatch( blockEditorStore )
26
+ );
24
27
  const isNavigationMode = useSelect(
25
28
  ( select ) => select( blockEditorStore ).isNavigationMode(),
26
29
  []
27
30
  );
28
31
 
29
- const lastFocus = useSelect(
30
- ( select ) => select( blockEditorStore ).getLastFocus(),
31
- []
32
- );
32
+ const { getLastFocus } = unlock( useSelect( blockEditorStore ) );
33
33
 
34
34
  // Don't allow tabbing to this element in Navigation mode.
35
35
  const focusCaptureTabIndex = ! isNavigationMode ? '0' : undefined;
@@ -45,7 +45,7 @@ export default function useTabNav() {
45
45
  } else if ( hasMultiSelection() ) {
46
46
  container.current.focus();
47
47
  } else if ( getSelectedBlockClientId() ) {
48
- lastFocus.current.focus();
48
+ getLastFocus()?.current.focus();
49
49
  } else {
50
50
  setNavigationMode( true );
51
51
 
@@ -163,7 +163,7 @@ export default function useTabNav() {
163
163
  }
164
164
 
165
165
  function onFocusOut( event ) {
166
- setLastFocus( { ...lastFocus, current: event.target } );
166
+ setLastFocus( { ...getLastFocus(), current: event.target } );
167
167
 
168
168
  const { ownerDocument } = node;
169
169
 
@@ -155,6 +155,7 @@ export default {
155
155
  shareWithChildBlocks: true,
156
156
  edit: BlockEditAlignmentToolbarControlsPure,
157
157
  useBlockProps,
158
+ addSaveProps: addAssignedAlign,
158
159
  attributeKeys: [ 'align' ],
159
160
  hasSupport( name ) {
160
161
  return hasBlockSupport( name, 'align', false );
@@ -209,8 +210,3 @@ addFilter(
209
210
  'core/editor/align/addAttribute',
210
211
  addAttribute
211
212
  );
212
- addFilter(
213
- 'blocks.getSaveContent.extraProps',
214
- 'core/editor/align/addAssignedAlign',
215
- addAssignedAlign
216
- );
@@ -120,6 +120,7 @@ function BlockEditAnchorControlPure( {
120
120
  }
121
121
 
122
122
  export default {
123
+ addSaveProps,
123
124
  edit: BlockEditAnchorControlPure,
124
125
  attributeKeys: [ 'anchor' ],
125
126
  hasSupport( name ) {
@@ -147,8 +148,3 @@ export function addSaveProps( extraProps, blockType, attributes ) {
147
148
  }
148
149
 
149
150
  addFilter( 'blocks.registerBlockType', 'core/anchor/attribute', addAttribute );
150
- addFilter(
151
- 'blocks.getSaveContent.extraProps',
152
- 'core/editor/anchor/save-props',
153
- addSaveProps
154
- );
@@ -55,13 +55,16 @@ export function addSaveProps( extraProps, blockType, attributes ) {
55
55
  return extraProps;
56
56
  }
57
57
 
58
+ export default {
59
+ addSaveProps,
60
+ attributeKeys: [ 'ariaLabel' ],
61
+ hasSupport( name ) {
62
+ return hasBlockSupport( name, 'ariaLabel' );
63
+ },
64
+ };
65
+
58
66
  addFilter(
59
67
  'blocks.registerBlockType',
60
68
  'core/ariaLabel/attribute',
61
69
  addAttribute
62
70
  );
63
- addFilter(
64
- 'blocks.getSaveContent.extraProps',
65
- 'core/ariaLabel/save-props',
66
- addSaveProps
67
- );
@@ -10,7 +10,12 @@ import { isBlobURL } from '@wordpress/blob';
10
10
  import { getBlockSupport } from '@wordpress/blocks';
11
11
  import { focus } from '@wordpress/dom';
12
12
  import {
13
+ ToggleControl,
14
+ __experimentalToggleGroupControl as ToggleGroupControl,
15
+ __experimentalToggleGroupControlOption as ToggleGroupControlOption,
13
16
  __experimentalToolsPanelItem as ToolsPanelItem,
17
+ __experimentalUnitControl as UnitControl,
18
+ __experimentalVStack as VStack,
14
19
  DropZone,
15
20
  FlexItem,
16
21
  MenuItem,
@@ -24,7 +29,6 @@ import { Platform, useCallback, useRef } from '@wordpress/element';
24
29
  import { __, sprintf } from '@wordpress/i18n';
25
30
  import { store as noticesStore } from '@wordpress/notices';
26
31
  import { getFilename } from '@wordpress/url';
27
- import { pure } from '@wordpress/compose';
28
32
 
29
33
  /**
30
34
  * Internal dependencies
@@ -53,6 +57,17 @@ export function hasBackgroundImageValue( style ) {
53
57
  return hasValue;
54
58
  }
55
59
 
60
+ /**
61
+ * Checks if there is a current value in the background size block support
62
+ * attributes.
63
+ *
64
+ * @param {Object} style Style attribute.
65
+ * @return {boolean} Whether or not the block has a background size value set.
66
+ */
67
+ export function hasBackgroundSizeValue( style ) {
68
+ return style?.background?.backgroundSize !== undefined;
69
+ }
70
+
56
71
  /**
57
72
  * Determine whether there is block support for background.
58
73
  *
@@ -73,7 +88,11 @@ export function hasBackgroundSupport( blockName, feature = 'any' ) {
73
88
  }
74
89
 
75
90
  if ( feature === 'any' ) {
76
- return !! support?.backgroundImage;
91
+ return (
92
+ !! support?.backgroundImage ||
93
+ !! support?.backgroundSize ||
94
+ !! support?.backgroundRepeat
95
+ );
77
96
  }
78
97
 
79
98
  return !! support?.[ feature ];
@@ -98,6 +117,37 @@ export function resetBackgroundImage( style = {}, setAttributes ) {
98
117
  } );
99
118
  }
100
119
 
120
+ /**
121
+ * Resets the background size block support attributes. This can be used when disabling
122
+ * the background size controls for a block via a `ToolsPanel`.
123
+ *
124
+ * @param {Object} style Style attribute.
125
+ * @param {Function} setAttributes Function to set block's attributes.
126
+ */
127
+ function resetBackgroundSize( style = {}, setAttributes ) {
128
+ setAttributes( {
129
+ style: cleanEmptyObject( {
130
+ ...style,
131
+ background: {
132
+ ...style?.background,
133
+ backgroundRepeat: undefined,
134
+ backgroundSize: undefined,
135
+ },
136
+ } ),
137
+ } );
138
+ }
139
+
140
+ /**
141
+ * Generates a CSS class name if an background image is set.
142
+ *
143
+ * @param {Object} style A block's style attribute.
144
+ *
145
+ * @return {string} CSS class name.
146
+ */
147
+ export function getBackgroundImageClasses( style ) {
148
+ return hasBackgroundImageValue( style ) ? 'has-background' : '';
149
+ }
150
+
101
151
  function InspectorImagePreview( { label, filename, url: imgUrl } ) {
102
152
  const imgLabel = label || getFilename( imgUrl );
103
153
  return (
@@ -143,22 +193,27 @@ function InspectorImagePreview( { label, filename, url: imgUrl } ) {
143
193
  );
144
194
  }
145
195
 
146
- function BackgroundImagePanelItem( { clientId, setAttributes } ) {
147
- const style = useSelect(
148
- ( select ) =>
149
- select( blockEditorStore ).getBlockAttributes( clientId )?.style,
196
+ function BackgroundImagePanelItem( {
197
+ clientId,
198
+ isShownByDefault,
199
+ setAttributes,
200
+ } ) {
201
+ const { style, mediaUpload } = useSelect(
202
+ ( select ) => {
203
+ const { getBlockAttributes, getSettings } =
204
+ select( blockEditorStore );
205
+
206
+ return {
207
+ style: getBlockAttributes( clientId )?.style,
208
+ mediaUpload: getSettings().mediaUpload,
209
+ };
210
+ },
150
211
  [ clientId ]
151
212
  );
152
213
  const { id, title, url } = style?.background?.backgroundImage || {};
153
214
 
154
215
  const replaceContainerRef = useRef();
155
216
 
156
- const { mediaUpload } = useSelect( ( select ) => {
157
- return {
158
- mediaUpload: select( blockEditorStore ).getSettings().mediaUpload,
159
- };
160
- } );
161
-
162
217
  const { createErrorNotice } = useDispatch( noticesStore );
163
218
  const onUploadError = ( message ) => {
164
219
  createErrorNotice( message, { type: 'snackbar' } );
@@ -252,7 +307,7 @@ function BackgroundImagePanelItem( { clientId, setAttributes } ) {
252
307
  hasValue={ () => hasValue }
253
308
  label={ __( 'Background image' ) }
254
309
  onDeselect={ () => resetBackgroundImage( style, setAttributes ) }
255
- isShownByDefault={ true }
310
+ isShownByDefault={ isShownByDefault }
256
311
  resetAllFilter={ resetAllFilter }
257
312
  panelId={ clientId }
258
313
  >
@@ -302,8 +357,172 @@ function BackgroundImagePanelItem( { clientId, setAttributes } ) {
302
357
  );
303
358
  }
304
359
 
305
- function BackgroundImagePanelPure( props ) {
306
- const [ backgroundImage ] = useSettings( 'background.backgroundImage' );
360
+ function backgroundSizeHelpText( value ) {
361
+ if ( value === 'cover' || value === undefined ) {
362
+ return __( 'Stretch image to cover the block.' );
363
+ }
364
+ if ( value === 'contain' ) {
365
+ return __( 'Resize image to fit without cropping.' );
366
+ }
367
+ return __( 'Set a fixed width.' );
368
+ }
369
+
370
+ function BackgroundSizePanelItem( {
371
+ clientId,
372
+ isShownByDefault,
373
+ setAttributes,
374
+ } ) {
375
+ const style = useSelect(
376
+ ( select ) =>
377
+ select( blockEditorStore ).getBlockAttributes( clientId )?.style,
378
+ [ clientId ]
379
+ );
380
+
381
+ const sizeValue = style?.background?.backgroundSize;
382
+ const repeatValue = style?.background?.backgroundRepeat;
383
+
384
+ // An `undefined` value is treated as `cover` by the toggle group control.
385
+ // An empty string is treated as `auto` by the toggle group control. This
386
+ // allows a user to select "Size" and then enter a custom value, with an
387
+ // empty value being treated as `auto`.
388
+ const currentValueForToggle =
389
+ ( sizeValue !== undefined &&
390
+ sizeValue !== 'cover' &&
391
+ sizeValue !== 'contain' ) ||
392
+ sizeValue === ''
393
+ ? 'auto'
394
+ : sizeValue || 'cover';
395
+
396
+ // If the current value is `cover` and the repeat value is `undefined`, then
397
+ // the toggle should be unchecked as the default state. Otherwise, the toggle
398
+ // should reflect the current repeat value.
399
+ const repeatCheckedValue =
400
+ repeatValue === 'no-repeat' ||
401
+ ( currentValueForToggle === 'cover' && repeatValue === undefined )
402
+ ? false
403
+ : true;
404
+
405
+ const hasValue = hasBackgroundSizeValue( style );
406
+
407
+ const resetAllFilter = useCallback( ( previousValue ) => {
408
+ return {
409
+ ...previousValue,
410
+ style: {
411
+ ...previousValue.style,
412
+ background: {
413
+ ...previousValue.style?.background,
414
+ backgroundRepeat: undefined,
415
+ backgroundSize: undefined,
416
+ },
417
+ },
418
+ };
419
+ }, [] );
420
+
421
+ const updateBackgroundSize = ( next ) => {
422
+ // When switching to 'contain' toggle the repeat off.
423
+ let nextRepeat = repeatValue;
424
+
425
+ if ( next === 'contain' ) {
426
+ nextRepeat = 'no-repeat';
427
+ }
428
+
429
+ if (
430
+ ( currentValueForToggle === 'cover' ||
431
+ currentValueForToggle === 'contain' ) &&
432
+ next === 'auto'
433
+ ) {
434
+ nextRepeat = undefined;
435
+ }
436
+
437
+ setAttributes( {
438
+ style: cleanEmptyObject( {
439
+ ...style,
440
+ background: {
441
+ ...style?.background,
442
+ backgroundRepeat: nextRepeat,
443
+ backgroundSize: next,
444
+ },
445
+ } ),
446
+ } );
447
+ };
448
+
449
+ const toggleIsRepeated = () => {
450
+ setAttributes( {
451
+ style: cleanEmptyObject( {
452
+ ...style,
453
+ background: {
454
+ ...style?.background,
455
+ backgroundRepeat:
456
+ repeatCheckedValue === true ? 'no-repeat' : undefined,
457
+ },
458
+ } ),
459
+ } );
460
+ };
461
+
462
+ return (
463
+ <VStack
464
+ as={ ToolsPanelItem }
465
+ spacing={ 2 }
466
+ className="single-column"
467
+ hasValue={ () => hasValue }
468
+ label={ __( 'Size' ) }
469
+ onDeselect={ () => resetBackgroundSize( style, setAttributes ) }
470
+ isShownByDefault={ isShownByDefault }
471
+ resetAllFilter={ resetAllFilter }
472
+ panelId={ clientId }
473
+ >
474
+ <ToggleGroupControl
475
+ __nextHasNoMarginBottom
476
+ size={ '__unstable-large' }
477
+ label={ __( 'Size' ) }
478
+ value={ currentValueForToggle }
479
+ onChange={ updateBackgroundSize }
480
+ isBlock={ true }
481
+ help={ backgroundSizeHelpText( sizeValue ) }
482
+ >
483
+ <ToggleGroupControlOption
484
+ key={ 'cover' }
485
+ value={ 'cover' }
486
+ label={ __( 'Cover' ) }
487
+ />
488
+ <ToggleGroupControlOption
489
+ key={ 'contain' }
490
+ value={ 'contain' }
491
+ label={ __( 'Contain' ) }
492
+ />
493
+ <ToggleGroupControlOption
494
+ key={ 'fixed' }
495
+ value={ 'auto' }
496
+ label={ __( 'Fixed' ) }
497
+ />
498
+ </ToggleGroupControl>
499
+ { sizeValue !== undefined &&
500
+ sizeValue !== 'cover' &&
501
+ sizeValue !== 'contain' ? (
502
+ <UnitControl
503
+ size={ '__unstable-large' }
504
+ onChange={ updateBackgroundSize }
505
+ value={ sizeValue }
506
+ />
507
+ ) : null }
508
+ { currentValueForToggle !== 'cover' && (
509
+ <ToggleControl
510
+ __nextHasNoMarginBottom
511
+ label={ __( 'Repeat image' ) }
512
+ checked={ repeatCheckedValue }
513
+ onChange={ toggleIsRepeated }
514
+ />
515
+ ) }
516
+ </VStack>
517
+ );
518
+ }
519
+
520
+ export function BackgroundImagePanel( props ) {
521
+ const [ backgroundImage, backgroundSize ] = useSettings(
522
+ 'background.backgroundImage',
523
+ 'background.backgroundSize'
524
+ );
525
+
307
526
  if (
308
527
  ! backgroundImage ||
309
528
  ! hasBackgroundSupport( props.name, 'backgroundImage' )
@@ -311,14 +530,27 @@ function BackgroundImagePanelPure( props ) {
311
530
  return null;
312
531
  }
313
532
 
533
+ const showBackgroundSize = !! (
534
+ backgroundSize && hasBackgroundSupport( props.name, 'backgroundSize' )
535
+ );
536
+
537
+ const defaultControls = getBlockSupport( props.name, [
538
+ BACKGROUND_SUPPORT_KEY,
539
+ '__experimentalDefaultControls',
540
+ ] );
541
+
314
542
  return (
315
543
  <InspectorControls group="background">
316
- <BackgroundImagePanelItem { ...props } />
544
+ <BackgroundImagePanelItem
545
+ isShownByDefault={ defaultControls?.backgroundImage }
546
+ { ...props }
547
+ />
548
+ { showBackgroundSize && (
549
+ <BackgroundSizePanelItem
550
+ isShownByDefault={ defaultControls?.backgroundSize }
551
+ { ...props }
552
+ />
553
+ ) }
317
554
  </InspectorControls>
318
555
  );
319
556
  }
320
-
321
- // We don't want block controls to re-render when typing inside a block. `pure`
322
- // will prevent re-renders unless props change, so only pass the needed props
323
- // and not the whole attributes object.
324
- export const BackgroundImagePanel = pure( BackgroundImagePanelPure );