@wordpress/block-editor 14.7.1-next.082ed6819.0 → 14.8.1-next.a9f418477.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/autocompleters/block.js +2 -4
  3. package/build/autocompleters/block.js.map +1 -1
  4. package/build/autocompleters/link.js +2 -4
  5. package/build/autocompleters/link.js.map +1 -1
  6. package/build/components/block-canvas/index.js +3 -6
  7. package/build/components/block-canvas/index.js.map +1 -1
  8. package/build/components/block-list/block.js +6 -5
  9. package/build/components/block-list/block.js.map +1 -1
  10. package/build/components/block-list/index.js +0 -1
  11. package/build/components/block-list/index.js.map +1 -1
  12. package/build/components/block-list/use-block-props/index.js +6 -2
  13. package/build/components/block-list/use-block-props/index.js.map +1 -1
  14. package/build/components/block-list/use-block-props/use-firefox-draggable-compatibility.js +87 -0
  15. package/build/components/block-list/use-block-props/use-firefox-draggable-compatibility.js.map +1 -0
  16. package/build/components/block-list/use-block-props/use-selected-block-event-handlers.js +98 -5
  17. package/build/components/block-list/use-block-props/use-selected-block-event-handlers.js.map +1 -1
  18. package/build/components/block-lock/modal.js +4 -4
  19. package/build/components/block-lock/modal.js.map +1 -1
  20. package/build/components/block-parent-selector/index.js +2 -15
  21. package/build/components/block-parent-selector/index.js.map +1 -1
  22. package/build/components/block-patterns-list/index.js +13 -4
  23. package/build/components/block-patterns-list/index.js.map +1 -1
  24. package/build/components/block-popover/inbetween.js +4 -0
  25. package/build/components/block-popover/inbetween.js.map +1 -1
  26. package/build/components/block-settings-menu/block-settings-dropdown.js +7 -4
  27. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  28. package/build/components/block-settings-menu-controls/index.js +1 -1
  29. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  30. package/build/components/block-switcher/index.js +12 -22
  31. package/build/components/block-switcher/index.js.map +1 -1
  32. package/build/components/block-switcher/use-transformed-patterns.js +0 -1
  33. package/build/components/block-switcher/use-transformed-patterns.js.map +1 -1
  34. package/build/components/block-switcher/utils.js +0 -1
  35. package/build/components/block-switcher/utils.js.map +1 -1
  36. package/build/components/block-toolbar/index.js +17 -9
  37. package/build/components/block-toolbar/index.js.map +1 -1
  38. package/build/components/block-variation-transforms/index.js +0 -1
  39. package/build/components/block-variation-transforms/index.js.map +1 -1
  40. package/build/components/date-format-picker/index.js +0 -1
  41. package/build/components/date-format-picker/index.js.map +1 -1
  42. package/build/components/font-appearance-control/index.js +1 -0
  43. package/build/components/font-appearance-control/index.js.map +1 -1
  44. package/build/components/font-family/index.js +10 -0
  45. package/build/components/font-family/index.js.map +1 -1
  46. package/build/components/global-styles/dimensions-panel.js +17 -16
  47. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  48. package/build/components/global-styles/get-global-styles-changes.js +0 -1
  49. package/build/components/global-styles/get-global-styles-changes.js.map +1 -1
  50. package/build/components/iframe/index.js +12 -216
  51. package/build/components/iframe/index.js.map +1 -1
  52. package/build/components/iframe/use-scale-canvas.js +398 -0
  53. package/build/components/iframe/use-scale-canvas.js.map +1 -0
  54. package/build/components/image-editor/use-save-image.js +22 -3
  55. package/build/components/image-editor/use-save-image.js.map +1 -1
  56. package/build/components/inserter/block-patterns-tab/index.js +0 -10
  57. package/build/components/inserter/block-patterns-tab/index.js.map +1 -1
  58. package/build/components/inserter/menu.js +2 -1
  59. package/build/components/inserter/menu.js.map +1 -1
  60. package/build/components/inserter-draggable-blocks/index.js +19 -10
  61. package/build/components/inserter-draggable-blocks/index.js.map +1 -1
  62. package/build/components/inspector-controls/slot.js +2 -13
  63. package/build/components/inspector-controls/slot.js.map +1 -1
  64. package/build/components/letter-spacing-control/index.js +10 -0
  65. package/build/components/letter-spacing-control/index.js.map +1 -1
  66. package/build/components/line-height-control/index.js +1 -0
  67. package/build/components/line-height-control/index.js.map +1 -1
  68. package/build/components/media-placeholder/index.js +18 -18
  69. package/build/components/media-placeholder/index.js.map +1 -1
  70. package/build/components/multi-selection-inspector/index.js +9 -25
  71. package/build/components/multi-selection-inspector/index.js.map +1 -1
  72. package/build/components/observe-typing/index.js +0 -1
  73. package/build/components/observe-typing/index.js.map +1 -1
  74. package/build/components/recursion-provider/index.js +0 -1
  75. package/build/components/recursion-provider/index.js.map +1 -1
  76. package/build/components/rich-text/index.js +5 -1
  77. package/build/components/rich-text/index.js.map +1 -1
  78. package/build/components/rich-text/native/use-format-types.js +0 -1
  79. package/build/components/rich-text/native/use-format-types.js.map +1 -1
  80. package/build/components/rich-text/use-format-types.js +0 -1
  81. package/build/components/rich-text/use-format-types.js.map +1 -1
  82. package/build/components/spacing-sizes-control/utils.js +0 -1
  83. package/build/components/spacing-sizes-control/utils.js.map +1 -1
  84. package/build/components/typewriter/index.js +0 -1
  85. package/build/components/typewriter/index.js.map +1 -1
  86. package/build/components/use-block-drop-zone/index.js +11 -2
  87. package/build/components/use-block-drop-zone/index.js.map +1 -1
  88. package/build/components/use-moving-animation/index.js +15 -2
  89. package/build/components/use-moving-animation/index.js.map +1 -1
  90. package/build/components/use-resize-canvas/index.js +1 -1
  91. package/build/components/use-resize-canvas/index.js.map +1 -1
  92. package/build/components/warning/index.js +2 -3
  93. package/build/components/warning/index.js.map +1 -1
  94. package/build/components/writing-flow/use-drag-selection.js +11 -0
  95. package/build/components/writing-flow/use-drag-selection.js.map +1 -1
  96. package/build/components/writing-flow/use-tab-nav.js +6 -2
  97. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  98. package/build/hooks/block-bindings.js +4 -3
  99. package/build/hooks/block-bindings.js.map +1 -1
  100. package/build/hooks/gap.js +1 -1
  101. package/build/hooks/gap.js.map +1 -1
  102. package/build/hooks/generated-class-name.js +0 -1
  103. package/build/hooks/generated-class-name.js.map +1 -1
  104. package/build/hooks/use-zoom-out.js +47 -14
  105. package/build/hooks/use-zoom-out.js.map +1 -1
  106. package/build/store/private-selectors.js +1 -7
  107. package/build/store/private-selectors.js.map +1 -1
  108. package/build/store/reducer.js +478 -2
  109. package/build/store/reducer.js.map +1 -1
  110. package/build/store/selectors.js +12 -55
  111. package/build/store/selectors.js.map +1 -1
  112. package/build/utils/object.js +0 -1
  113. package/build/utils/object.js.map +1 -1
  114. package/build-module/autocompleters/block.js +2 -4
  115. package/build-module/autocompleters/block.js.map +1 -1
  116. package/build-module/autocompleters/link.js +2 -4
  117. package/build-module/autocompleters/link.js.map +1 -1
  118. package/build-module/components/block-canvas/index.js +3 -6
  119. package/build-module/components/block-canvas/index.js.map +1 -1
  120. package/build-module/components/block-list/block.js +8 -7
  121. package/build-module/components/block-list/block.js.map +1 -1
  122. package/build-module/components/block-list/index.js +0 -1
  123. package/build-module/components/block-list/index.js.map +1 -1
  124. package/build-module/components/block-list/use-block-props/index.js +6 -2
  125. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  126. package/build-module/components/block-list/use-block-props/use-firefox-draggable-compatibility.js +80 -0
  127. package/build-module/components/block-list/use-block-props/use-firefox-draggable-compatibility.js.map +1 -0
  128. package/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js +97 -5
  129. package/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js.map +1 -1
  130. package/build-module/components/block-lock/modal.js +4 -4
  131. package/build-module/components/block-lock/modal.js.map +1 -1
  132. package/build-module/components/block-parent-selector/index.js +2 -15
  133. package/build-module/components/block-parent-selector/index.js.map +1 -1
  134. package/build-module/components/block-patterns-list/index.js +13 -4
  135. package/build-module/components/block-patterns-list/index.js.map +1 -1
  136. package/build-module/components/block-popover/inbetween.js +4 -0
  137. package/build-module/components/block-popover/inbetween.js.map +1 -1
  138. package/build-module/components/block-settings-menu/block-settings-dropdown.js +7 -4
  139. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  140. package/build-module/components/block-settings-menu-controls/index.js +1 -1
  141. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  142. package/build-module/components/block-switcher/index.js +13 -23
  143. package/build-module/components/block-switcher/index.js.map +1 -1
  144. package/build-module/components/block-switcher/use-transformed-patterns.js +0 -1
  145. package/build-module/components/block-switcher/use-transformed-patterns.js.map +1 -1
  146. package/build-module/components/block-switcher/utils.js +0 -1
  147. package/build-module/components/block-switcher/utils.js.map +1 -1
  148. package/build-module/components/block-toolbar/index.js +17 -9
  149. package/build-module/components/block-toolbar/index.js.map +1 -1
  150. package/build-module/components/block-variation-transforms/index.js +0 -1
  151. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  152. package/build-module/components/date-format-picker/index.js +0 -1
  153. package/build-module/components/date-format-picker/index.js.map +1 -1
  154. package/build-module/components/font-appearance-control/index.js +1 -0
  155. package/build-module/components/font-appearance-control/index.js.map +1 -1
  156. package/build-module/components/font-family/index.js +10 -0
  157. package/build-module/components/font-family/index.js.map +1 -1
  158. package/build-module/components/global-styles/dimensions-panel.js +17 -16
  159. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  160. package/build-module/components/global-styles/get-global-styles-changes.js +0 -1
  161. package/build-module/components/global-styles/get-global-styles-changes.js.map +1 -1
  162. package/build-module/components/iframe/index.js +14 -218
  163. package/build-module/components/iframe/index.js.map +1 -1
  164. package/build-module/components/iframe/use-scale-canvas.js +392 -0
  165. package/build-module/components/iframe/use-scale-canvas.js.map +1 -0
  166. package/build-module/components/image-editor/use-save-image.js +22 -3
  167. package/build-module/components/image-editor/use-save-image.js.map +1 -1
  168. package/build-module/components/inserter/block-patterns-tab/index.js +1 -11
  169. package/build-module/components/inserter/block-patterns-tab/index.js.map +1 -1
  170. package/build-module/components/inserter/menu.js +2 -1
  171. package/build-module/components/inserter/menu.js.map +1 -1
  172. package/build-module/components/inserter-draggable-blocks/index.js +20 -11
  173. package/build-module/components/inserter-draggable-blocks/index.js.map +1 -1
  174. package/build-module/components/inspector-controls/slot.js +3 -14
  175. package/build-module/components/inspector-controls/slot.js.map +1 -1
  176. package/build-module/components/letter-spacing-control/index.js +9 -0
  177. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  178. package/build-module/components/line-height-control/index.js +1 -0
  179. package/build-module/components/line-height-control/index.js.map +1 -1
  180. package/build-module/components/media-placeholder/index.js +18 -18
  181. package/build-module/components/media-placeholder/index.js.map +1 -1
  182. package/build-module/components/multi-selection-inspector/index.js +9 -25
  183. package/build-module/components/multi-selection-inspector/index.js.map +1 -1
  184. package/build-module/components/observe-typing/index.js +0 -1
  185. package/build-module/components/observe-typing/index.js.map +1 -1
  186. package/build-module/components/recursion-provider/index.js +0 -1
  187. package/build-module/components/recursion-provider/index.js.map +1 -1
  188. package/build-module/components/rich-text/index.js +5 -1
  189. package/build-module/components/rich-text/index.js.map +1 -1
  190. package/build-module/components/rich-text/native/use-format-types.js +0 -1
  191. package/build-module/components/rich-text/native/use-format-types.js.map +1 -1
  192. package/build-module/components/rich-text/use-format-types.js +0 -1
  193. package/build-module/components/rich-text/use-format-types.js.map +1 -1
  194. package/build-module/components/spacing-sizes-control/utils.js +0 -1
  195. package/build-module/components/spacing-sizes-control/utils.js.map +1 -1
  196. package/build-module/components/typewriter/index.js +0 -1
  197. package/build-module/components/typewriter/index.js.map +1 -1
  198. package/build-module/components/use-block-drop-zone/index.js +11 -2
  199. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  200. package/build-module/components/use-moving-animation/index.js +15 -2
  201. package/build-module/components/use-moving-animation/index.js.map +1 -1
  202. package/build-module/components/use-resize-canvas/index.js +1 -1
  203. package/build-module/components/use-resize-canvas/index.js.map +1 -1
  204. package/build-module/components/warning/index.js +2 -3
  205. package/build-module/components/warning/index.js.map +1 -1
  206. package/build-module/components/writing-flow/use-drag-selection.js +11 -0
  207. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -1
  208. package/build-module/components/writing-flow/use-tab-nav.js +6 -2
  209. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  210. package/build-module/hooks/block-bindings.js +4 -3
  211. package/build-module/hooks/block-bindings.js.map +1 -1
  212. package/build-module/hooks/gap.js +1 -1
  213. package/build-module/hooks/gap.js.map +1 -1
  214. package/build-module/hooks/generated-class-name.js +0 -1
  215. package/build-module/hooks/generated-class-name.js.map +1 -1
  216. package/build-module/hooks/use-zoom-out.js +48 -15
  217. package/build-module/hooks/use-zoom-out.js.map +1 -1
  218. package/build-module/store/private-selectors.js +1 -6
  219. package/build-module/store/private-selectors.js.map +1 -1
  220. package/build-module/store/reducer.js +479 -3
  221. package/build-module/store/reducer.js.map +1 -1
  222. package/build-module/store/selectors.js +12 -55
  223. package/build-module/store/selectors.js.map +1 -1
  224. package/build-module/utils/object.js +0 -1
  225. package/build-module/utils/object.js.map +1 -1
  226. package/build-style/content-rtl.css +25 -27
  227. package/build-style/content.css +25 -27
  228. package/build-style/style-rtl.css +55 -64
  229. package/build-style/style.css +55 -64
  230. package/package.json +32 -32
  231. package/src/autocompleters/block.js +2 -4
  232. package/src/autocompleters/link.js +2 -4
  233. package/src/components/alignment-control/stories/aliginment-toolbar.story.js +47 -0
  234. package/src/components/alignment-control/stories/index.story.js +51 -0
  235. package/src/components/alignment-control/test/__snapshots__/index.js.snap +5 -5
  236. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +4 -4
  237. package/src/components/block-canvas/index.js +3 -5
  238. package/src/components/block-canvas/style.scss +2 -1
  239. package/src/components/block-draggable/content.scss +11 -5
  240. package/src/components/block-list/block.js +7 -13
  241. package/src/components/block-list/content.scss +6 -0
  242. package/src/components/block-list/use-block-props/index.js +5 -0
  243. package/src/components/block-list/use-block-props/use-firefox-draggable-compatibility.js +83 -0
  244. package/src/components/block-list/use-block-props/use-selected-block-event-handlers.js +112 -8
  245. package/src/components/block-lock/modal.js +4 -6
  246. package/src/components/block-parent-selector/index.js +1 -19
  247. package/src/components/block-patterns-list/index.js +12 -1
  248. package/src/components/block-patterns-list/stories/fixtures.js +1 -0
  249. package/src/components/block-patterns-list/style.scss +16 -5
  250. package/src/components/block-popover/inbetween.js +4 -0
  251. package/src/components/block-settings-menu/block-settings-dropdown.js +6 -1
  252. package/src/components/block-settings-menu-controls/index.js +2 -1
  253. package/src/components/block-switcher/index.js +19 -21
  254. package/src/components/block-switcher/style.scss +0 -9
  255. package/src/components/block-title/test/index.js +2 -0
  256. package/src/components/block-toolbar/index.js +17 -6
  257. package/src/components/block-tools/style.scss +44 -0
  258. package/src/components/block-vertical-alignment-control/test/__snapshots__/index.js.snap +3 -3
  259. package/src/components/color-palette/test/__snapshots__/control.js.snap +2 -2
  260. package/src/components/dimensions-tool/stories/aspect-ratio-tool.story.js +1 -1
  261. package/src/components/dimensions-tool/stories/index.story.js +1 -1
  262. package/src/components/dimensions-tool/stories/scale-tool.story.js +1 -1
  263. package/src/components/dimensions-tool/stories/width-height-tool.story.js +1 -1
  264. package/src/components/font-appearance-control/index.js +1 -0
  265. package/src/components/font-family/index.js +10 -0
  266. package/src/components/font-family/style.scss +5 -0
  267. package/src/components/global-styles/dimensions-panel.js +16 -16
  268. package/src/components/iframe/content.scss +40 -42
  269. package/src/components/iframe/index.js +13 -313
  270. package/src/components/iframe/use-scale-canvas.js +490 -0
  271. package/src/components/image-editor/use-save-image.js +27 -2
  272. package/src/components/inserter/block-patterns-tab/index.js +1 -17
  273. package/src/components/inserter/menu.js +8 -1
  274. package/src/components/inserter-draggable-blocks/index.js +19 -29
  275. package/src/components/inspector-controls/slot.js +3 -22
  276. package/src/components/letter-spacing-control/README.md +2 -1
  277. package/src/components/letter-spacing-control/index.js +17 -0
  278. package/src/components/line-height-control/index.js +1 -0
  279. package/src/components/media-placeholder/index.js +25 -28
  280. package/src/components/multi-selection-inspector/index.js +17 -27
  281. package/src/components/multi-selection-inspector/style.scss +0 -12
  282. package/src/components/resolution-tool/stories/index.story.js +1 -1
  283. package/src/components/rich-text/index.js +5 -0
  284. package/src/components/spacing-sizes-control/style.scss +0 -29
  285. package/src/components/text-alignment-control/stories/index.story.js +1 -1
  286. package/src/components/use-block-drop-zone/index.js +18 -1
  287. package/src/components/use-moving-animation/index.js +15 -0
  288. package/src/components/use-resize-canvas/index.js +1 -1
  289. package/src/components/warning/index.js +3 -4
  290. package/src/components/warning/test/index.js +3 -1
  291. package/src/components/writing-flow/use-drag-selection.js +11 -0
  292. package/src/components/writing-flow/use-tab-nav.js +9 -6
  293. package/src/hooks/block-bindings.js +8 -4
  294. package/src/hooks/gap.js +1 -1
  295. package/src/hooks/use-zoom-out.js +48 -16
  296. package/src/store/private-selectors.js +2 -17
  297. package/src/store/reducer.js +639 -2
  298. package/src/store/selectors.js +19 -69
  299. package/src/store/test/private-selectors.js +1 -0
  300. package/src/store/test/reducer.js +849 -0
  301. package/src/store/test/selectors.js +4 -110
  302. package/src/style.scss +1 -0
  303. package/tsconfig.tsbuildinfo +1 -1
@@ -5,12 +5,15 @@ import { isTextField } from '@wordpress/dom';
5
5
  import { ENTER, BACKSPACE, DELETE } from '@wordpress/keycodes';
6
6
  import { useSelect, useDispatch } from '@wordpress/data';
7
7
  import { useRefEffect } from '@wordpress/compose';
8
+ import { createRoot } from '@wordpress/element';
9
+ import { store as blocksStore } from '@wordpress/blocks';
8
10
 
9
11
  /**
10
12
  * Internal dependencies
11
13
  */
12
14
  import { store as blockEditorStore } from '../../../store';
13
15
  import { unlock } from '../../../lock-unlock';
16
+ import BlockDraggableChip from '../../../components/block-draggable/draggable-chip';
14
17
 
15
18
  /**
16
19
  * Adds block behaviour:
@@ -21,12 +24,16 @@ import { unlock } from '../../../lock-unlock';
21
24
  * @param {string} clientId Block client ID.
22
25
  */
23
26
  export function useEventHandlers( { clientId, isSelected } ) {
24
- const { getBlockRootClientId, getBlockIndex, isZoomOut } = unlock(
25
- useSelect( blockEditorStore )
26
- );
27
- const { insertAfterBlock, removeBlock, resetZoomLevel } = unlock(
28
- useDispatch( blockEditorStore )
29
- );
27
+ const { getBlockType } = useSelect( blocksStore );
28
+ const { getBlockRootClientId, isZoomOut, hasMultiSelection, getBlockName } =
29
+ unlock( useSelect( blockEditorStore ) );
30
+ const {
31
+ insertAfterBlock,
32
+ removeBlock,
33
+ resetZoomLevel,
34
+ startDraggingBlocks,
35
+ stopDraggingBlocks,
36
+ } = unlock( useDispatch( blockEditorStore ) );
30
37
 
31
38
  return useRefEffect(
32
39
  ( node ) => {
@@ -76,7 +83,102 @@ export function useEventHandlers( { clientId, isSelected } ) {
76
83
  * @param {DragEvent} event Drag event.
77
84
  */
78
85
  function onDragStart( event ) {
79
- event.preventDefault();
86
+ if (
87
+ node !== event.target ||
88
+ node.isContentEditable ||
89
+ node.ownerDocument.activeElement !== node ||
90
+ hasMultiSelection()
91
+ ) {
92
+ event.preventDefault();
93
+ return;
94
+ }
95
+ const data = JSON.stringify( {
96
+ type: 'block',
97
+ srcClientIds: [ clientId ],
98
+ srcRootClientId: getBlockRootClientId( clientId ),
99
+ } );
100
+ event.dataTransfer.effectAllowed = 'move'; // remove "+" cursor
101
+ event.dataTransfer.clearData();
102
+ event.dataTransfer.setData( 'wp-blocks', data );
103
+ const { ownerDocument } = node;
104
+ const { defaultView } = ownerDocument;
105
+ const selection = defaultView.getSelection();
106
+ selection.removeAllRanges();
107
+
108
+ const domNode = document.createElement( 'div' );
109
+ const root = createRoot( domNode );
110
+ root.render(
111
+ <BlockDraggableChip
112
+ icon={ getBlockType( getBlockName( clientId ) ).icon }
113
+ />
114
+ );
115
+ document.body.appendChild( domNode );
116
+ domNode.style.position = 'absolute';
117
+ domNode.style.top = '0';
118
+ domNode.style.left = '0';
119
+ domNode.style.zIndex = '1000';
120
+ domNode.style.pointerEvents = 'none';
121
+
122
+ // Setting the drag chip as the drag image actually works, but
123
+ // the behaviour is slightly different in every browser. In
124
+ // Safari, it animates, in Firefox it's slightly transparent...
125
+ // So we set a fake drag image and have to reposition it
126
+ // ourselves.
127
+ const dragElement = ownerDocument.createElement( 'div' );
128
+ // Chrome will show a globe icon if the drag element does not
129
+ // have dimensions.
130
+ dragElement.style.width = '1px';
131
+ dragElement.style.height = '1px';
132
+ dragElement.style.position = 'fixed';
133
+ dragElement.style.visibility = 'hidden';
134
+ ownerDocument.body.appendChild( dragElement );
135
+ event.dataTransfer.setDragImage( dragElement, 0, 0 );
136
+
137
+ let offset = { x: 0, y: 0 };
138
+
139
+ if ( document !== ownerDocument ) {
140
+ const frame = defaultView.frameElement;
141
+ if ( frame ) {
142
+ const rect = frame.getBoundingClientRect();
143
+ offset = { x: rect.left, y: rect.top };
144
+ }
145
+ }
146
+
147
+ // chip handle offset
148
+ offset.x -= 58;
149
+
150
+ function over( e ) {
151
+ domNode.style.transform = `translate( ${
152
+ e.clientX + offset.x
153
+ }px, ${ e.clientY + offset.y }px )`;
154
+ }
155
+
156
+ over( event );
157
+
158
+ function end() {
159
+ ownerDocument.removeEventListener( 'dragover', over );
160
+ ownerDocument.removeEventListener( 'dragend', end );
161
+ domNode.remove();
162
+ dragElement.remove();
163
+ stopDraggingBlocks();
164
+ document.body.classList.remove(
165
+ 'is-dragging-components-draggable'
166
+ );
167
+ ownerDocument.documentElement.classList.remove(
168
+ 'is-dragging'
169
+ );
170
+ }
171
+
172
+ ownerDocument.addEventListener( 'dragover', over );
173
+ ownerDocument.addEventListener( 'dragend', end );
174
+ ownerDocument.addEventListener( 'drop', end );
175
+
176
+ startDraggingBlocks( [ clientId ] );
177
+ // Important because it hides the block toolbar.
178
+ document.body.classList.add(
179
+ 'is-dragging-components-draggable'
180
+ );
181
+ ownerDocument.documentElement.classList.add( 'is-dragging' );
80
182
  }
81
183
 
82
184
  node.addEventListener( 'keydown', onKeyDown );
@@ -91,11 +193,13 @@ export function useEventHandlers( { clientId, isSelected } ) {
91
193
  clientId,
92
194
  isSelected,
93
195
  getBlockRootClientId,
94
- getBlockIndex,
95
196
  insertAfterBlock,
96
197
  removeBlock,
97
198
  isZoomOut,
98
199
  resetZoomLevel,
200
+ hasMultiSelection,
201
+ startDraggingBlocks,
202
+ stopDraggingBlocks,
99
203
  ]
100
204
  );
101
205
  }
@@ -99,9 +99,7 @@ export default function BlockLockModal( { clientId, onClose } ) {
99
99
  >
100
100
  <fieldset className="block-editor-block-lock-modal__options">
101
101
  <legend>
102
- { __(
103
- 'Choose specific attributes to restrict or lock all available options.'
104
- ) }
102
+ { __( 'Select the features you want to lock' ) }
105
103
  </legend>
106
104
  { /*
107
105
  * Disable reason: The `list` ARIA role is redundant but
@@ -137,7 +135,7 @@ export default function BlockLockModal( { clientId, onClose } ) {
137
135
  <li className="block-editor-block-lock-modal__checklist-item">
138
136
  <CheckboxControl
139
137
  __nextHasNoMarginBottom
140
- label={ __( 'Restrict editing' ) }
138
+ label={ __( 'Lock editing' ) }
141
139
  checked={ !! lock.edit }
142
140
  onChange={ ( edit ) =>
143
141
  setLock( ( prevLock ) => ( {
@@ -159,7 +157,7 @@ export default function BlockLockModal( { clientId, onClose } ) {
159
157
  <li className="block-editor-block-lock-modal__checklist-item">
160
158
  <CheckboxControl
161
159
  __nextHasNoMarginBottom
162
- label={ __( 'Disable movement' ) }
160
+ label={ __( 'Lock movement' ) }
163
161
  checked={ lock.move }
164
162
  onChange={ ( move ) =>
165
163
  setLock( ( prevLock ) => ( {
@@ -178,7 +176,7 @@ export default function BlockLockModal( { clientId, onClose } ) {
178
176
  <li className="block-editor-block-lock-modal__checklist-item">
179
177
  <CheckboxControl
180
178
  __nextHasNoMarginBottom
181
- label={ __( 'Prevent removal' ) }
179
+ label={ __( 'Lock removal' ) }
182
180
  checked={ lock.remove }
183
181
  onChange={ ( remove ) =>
184
182
  setLock( ( prevLock ) => ( {
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { getBlockType, store as blocksStore } from '@wordpress/blocks';
5
4
  import { ToolbarButton } from '@wordpress/components';
6
5
  import { useSelect, useDispatch } from '@wordpress/data';
7
6
  import { __, sprintf } from '@wordpress/i18n';
@@ -24,31 +23,18 @@ import { unlock } from '../../lock-unlock';
24
23
  */
25
24
  export default function BlockParentSelector() {
26
25
  const { selectBlock } = useDispatch( blockEditorStore );
27
- const { parentClientId, isVisible } = useSelect( ( select ) => {
26
+ const { parentClientId } = useSelect( ( select ) => {
28
27
  const {
29
- getBlockName,
30
28
  getBlockParents,
31
29
  getSelectedBlockClientId,
32
- getBlockEditingMode,
33
30
  getParentSectionBlock,
34
31
  } = unlock( select( blockEditorStore ) );
35
- const { hasBlockSupport } = select( blocksStore );
36
32
  const selectedBlockClientId = getSelectedBlockClientId();
37
33
  const parentSection = getParentSectionBlock( selectedBlockClientId );
38
34
  const parents = getBlockParents( selectedBlockClientId );
39
35
  const _parentClientId = parentSection ?? parents[ parents.length - 1 ];
40
- const parentBlockName = getBlockName( _parentClientId );
41
- const _parentBlockType = getBlockType( parentBlockName );
42
36
  return {
43
37
  parentClientId: _parentClientId,
44
- isVisible:
45
- _parentClientId &&
46
- getBlockEditingMode( _parentClientId ) !== 'disabled' &&
47
- hasBlockSupport(
48
- _parentBlockType,
49
- '__experimentalParentSelector',
50
- true
51
- ),
52
38
  };
53
39
  }, [] );
54
40
  const blockInformation = useBlockDisplayInformation( parentClientId );
@@ -61,10 +47,6 @@ export default function BlockParentSelector() {
61
47
  highlightParent: true,
62
48
  } );
63
49
 
64
- if ( ! isVisible ) {
65
- return null;
66
- }
67
-
68
50
  return (
69
51
  <div
70
52
  className="block-editor-block-parent-selector"
@@ -41,6 +41,7 @@ function BlockPattern( {
41
41
  onHover,
42
42
  showTitlesAsTooltip,
43
43
  category,
44
+ isSelected,
44
45
  } ) {
45
46
  const [ isDragging, setIsDragging ] = useState( false );
46
47
  const { blocks, viewportWidth } = pattern;
@@ -114,6 +115,7 @@ function BlockPattern( {
114
115
  pattern.type ===
115
116
  INSERTER_PATTERN_TYPES.user &&
116
117
  ! pattern.syncStatus,
118
+ 'is-selected': isSelected,
117
119
  }
118
120
  ) }
119
121
  />
@@ -192,6 +194,7 @@ function BlockPatternsList(
192
194
  ref
193
195
  ) {
194
196
  const [ activeCompositeId, setActiveCompositeId ] = useState( undefined );
197
+ const [ activePattern, setActivePattern ] = useState( null ); // State to track active pattern
195
198
 
196
199
  useEffect( () => {
197
200
  // Reset the active composite item whenever the available patterns change,
@@ -201,6 +204,11 @@ function BlockPatternsList(
201
204
  setActiveCompositeId( firstCompositeItemId );
202
205
  }, [ blockPatterns ] );
203
206
 
207
+ const handleClickPattern = ( pattern, blocks ) => {
208
+ setActivePattern( pattern.name );
209
+ onClickPattern( pattern, blocks );
210
+ };
211
+
204
212
  return (
205
213
  <Composite
206
214
  orientation={ orientation }
@@ -216,11 +224,14 @@ function BlockPatternsList(
216
224
  key={ pattern.name }
217
225
  id={ pattern.name }
218
226
  pattern={ pattern }
219
- onClick={ onClickPattern }
227
+ onClick={ handleClickPattern }
220
228
  onHover={ onHover }
221
229
  isDraggable={ isDraggable }
222
230
  showTitlesAsTooltip={ showTitlesAsTooltip }
223
231
  category={ category }
232
+ isSelected={
233
+ !! activePattern && activePattern === pattern.name
234
+ }
224
235
  />
225
236
  ) ) }
226
237
  { pagingProps && <BlockPatternsPaging { ...pagingProps } /> }
@@ -530,6 +530,7 @@ export default [
530
530
  background: '#000000',
531
531
  },
532
532
  },
533
+ tagName: 'hr',
533
534
  },
534
535
  innerBlocks: [],
535
536
  originalContent:
@@ -44,19 +44,29 @@
44
44
  outline: $border-width solid rgba($black, 0.1);
45
45
  outline-offset: -$border-width;
46
46
  border-radius: $radius-medium;
47
+
48
+ transition: outline 0.1s linear;
49
+ @include reduce-motion("transition");
47
50
  }
48
51
  }
49
52
 
50
- &:hover:not(:focus) .block-editor-block-preview__container::after {
53
+ // Selected
54
+ &.is-selected .block-editor-block-preview__container::after {
55
+ outline-color: $gray-900;
56
+ outline-width: var(--wp-admin-border-width-focus);
57
+ outline-offset: calc(-1 * var(--wp-admin-border-width-focus));
58
+ }
59
+
60
+ // Hover state
61
+ &:hover .block-editor-block-preview__container::after {
51
62
  outline-color: rgba($black, 0.3);
52
63
  }
53
64
 
54
- &:focus .block-editor-block-preview__container::after {
65
+ // Focused state
66
+ &[data-focus-visible] .block-editor-block-preview__container::after {
55
67
  outline-color: var(--wp-admin-theme-color);
56
68
  outline-width: var(--wp-admin-border-width-focus);
57
- outline-offset: calc((-1 * var(--wp-admin-border-width-focus)));
58
- transition: outline 0.1s linear;
59
- @include reduce-motion("transition");
69
+ outline-offset: calc(-1 * var(--wp-admin-border-width-focus));
60
70
  }
61
71
 
62
72
  .block-editor-patterns__pattern-details:not(:empty) {
@@ -68,6 +78,7 @@
68
78
  .block-editor-patterns__pattern-icon-wrapper {
69
79
  min-width: 24px;
70
80
  height: 24px;
81
+
71
82
  .block-editor-patterns__pattern-icon {
72
83
  fill: var(--wp-block-synced-color);
73
84
  }
@@ -148,6 +148,10 @@ function BlockPopoverInbetween( {
148
148
  ? nextRect.left - previousRect.right
149
149
  : 0;
150
150
  }
151
+
152
+ // Avoid a negative width which happens when the next rect
153
+ // is on the next line.
154
+ width = Math.max( width, 0 );
151
155
  }
152
156
 
153
157
  return new window.DOMRect( left, top, width, height );
@@ -57,6 +57,7 @@ export function BlockSettingsDropdown( {
57
57
  const currentClientId = block?.clientId;
58
58
  const count = clientIds.length;
59
59
  const firstBlockClientId = clientIds[ 0 ];
60
+
60
61
  const {
61
62
  firstParentClientId,
62
63
  parentBlockType,
@@ -64,6 +65,7 @@ export function BlockSettingsDropdown( {
64
65
  selectedBlockClientIds,
65
66
  openedBlockSettingsMenu,
66
67
  isContentOnly,
68
+ isZoomOut,
67
69
  } = useSelect(
68
70
  ( select ) => {
69
71
  const {
@@ -74,6 +76,7 @@ export function BlockSettingsDropdown( {
74
76
  getBlockAttributes,
75
77
  getOpenedBlockSettingsMenu,
76
78
  getBlockEditingMode,
79
+ isZoomOut: _isZoomOut,
77
80
  } = unlock( select( blockEditorStore ) );
78
81
 
79
82
  const { getActiveBlockVariation } = select( blocksStore );
@@ -98,10 +101,12 @@ export function BlockSettingsDropdown( {
98
101
  openedBlockSettingsMenu: getOpenedBlockSettingsMenu(),
99
102
  isContentOnly:
100
103
  getBlockEditingMode( firstBlockClientId ) === 'contentOnly',
104
+ isZoomOut: _isZoomOut(),
101
105
  };
102
106
  },
103
107
  [ firstBlockClientId ]
104
108
  );
109
+
105
110
  const { getBlockOrder, getSelectedBlockClientIds } =
106
111
  useSelect( blockEditorStore );
107
112
 
@@ -248,7 +253,7 @@ export function BlockSettingsDropdown( {
248
253
  clientId={ firstBlockClientId }
249
254
  />
250
255
  ) }
251
- { ! isContentOnly && (
256
+ { ( ! isContentOnly || isZoomOut ) && (
252
257
  <CopyMenuItem
253
258
  clientIds={ clientIds }
254
259
  onCopy={ onCopy }
@@ -55,7 +55,8 @@ const BlockSettingsMenuControlsSlot = ( { fillProps, clientIds = null } ) => {
55
55
  const convertToGroupButtonProps =
56
56
  useConvertToGroupButtonProps( selectedClientIds );
57
57
  const { isGroupable, isUngroupable } = convertToGroupButtonProps;
58
- const showConvertToGroupButton = isGroupable || isUngroupable;
58
+ const showConvertToGroupButton =
59
+ ( isGroupable || isUngroupable ) && ! isContentOnly;
59
60
 
60
61
  return (
61
62
  <Slot
@@ -18,6 +18,7 @@ import {
18
18
  } from '@wordpress/blocks';
19
19
  import { useSelect, useDispatch } from '@wordpress/data';
20
20
  import { copy } from '@wordpress/icons';
21
+ import { store as preferencesStore } from '@wordpress/preferences';
21
22
 
22
23
  /**
23
24
  * Internal dependencies
@@ -185,21 +186,6 @@ function BlockSwitcherDropdownMenuContents( {
185
186
  );
186
187
  }
187
188
 
188
- const BlockIndicator = ( { icon, showTitle, blockTitle } ) => (
189
- <>
190
- <BlockIcon
191
- className="block-editor-block-switcher__toggle"
192
- icon={ icon }
193
- showColors
194
- />
195
- { showTitle && blockTitle && (
196
- <span className="block-editor-block-switcher__toggle-text">
197
- { blockTitle }
198
- </span>
199
- ) }
200
- </>
201
- );
202
-
203
189
  export const BlockSwitcher = ( { clientIds } ) => {
204
190
  const {
205
191
  hasContentOnlyLocking,
@@ -272,6 +258,11 @@ export const BlockSwitcher = ( { clientIds } ) => {
272
258
  clientId: clientIds?.[ 0 ],
273
259
  maximumLength: 35,
274
260
  } );
261
+ const showIconLabels = useSelect(
262
+ ( select ) =>
263
+ select( preferencesStore ).get( 'core', 'showIconLabels' ),
264
+ []
265
+ );
275
266
 
276
267
  if ( invalidBlocks ) {
277
268
  return null;
@@ -282,6 +273,11 @@ export const BlockSwitcher = ( { clientIds } ) => {
282
273
  ? blockTitle
283
274
  : __( 'Multiple blocks selected' );
284
275
 
276
+ const blockIndicatorText =
277
+ ( isReusable || isTemplate ) && ! showIconLabels && blockTitle
278
+ ? blockTitle
279
+ : undefined;
280
+
285
281
  const hideDropdown =
286
282
  isDisabled ||
287
283
  ( ! hasBlockStyles && ! canRemove ) ||
@@ -295,12 +291,13 @@ export const BlockSwitcher = ( { clientIds } ) => {
295
291
  className="block-editor-block-switcher__no-switcher-icon"
296
292
  title={ blockSwitcherLabel }
297
293
  icon={
298
- <BlockIndicator
294
+ <BlockIcon
295
+ className="block-editor-block-switcher__toggle"
299
296
  icon={ icon }
300
- showTitle={ isReusable || isTemplate }
301
- blockTitle={ blockTitle }
297
+ showColors
302
298
  />
303
299
  }
300
+ text={ blockIndicatorText }
304
301
  />
305
302
  </ToolbarGroup>
306
303
  );
@@ -329,12 +326,13 @@ export const BlockSwitcher = ( { clientIds } ) => {
329
326
  className: 'block-editor-block-switcher__popover',
330
327
  } }
331
328
  icon={
332
- <BlockIndicator
329
+ <BlockIcon
330
+ className="block-editor-block-switcher__toggle"
333
331
  icon={ icon }
334
- showTitle={ isReusable || isTemplate }
335
- blockTitle={ blockTitle }
332
+ showColors
336
333
  />
337
334
  }
335
+ text={ blockIndicatorText }
338
336
  toggleProps={ {
339
337
  description: blockSwitcherDescription,
340
338
  ...toggleProps,
@@ -26,15 +26,6 @@
26
26
  }
27
27
  }
28
28
 
29
- .block-editor-block-switcher__toggle-text {
30
- margin-left: $grid-unit-10;
31
-
32
- // Account for double label when show-text-buttons is set.
33
- .show-icon-labels & {
34
- display: none;
35
- }
36
- }
37
-
38
29
  .components-button.block-editor-block-switcher__no-switcher-icon {
39
30
  display: flex;
40
31
 
@@ -31,7 +31,9 @@ const blockLabelMap = {
31
31
  };
32
32
 
33
33
  jest.mock( '@wordpress/blocks', () => {
34
+ const actualImplementation = jest.requireActual( '@wordpress/blocks' );
34
35
  return {
36
+ ...actualImplementation,
35
37
  isReusableBlock( { title } ) {
36
38
  return title === 'Reusable Block';
37
39
  },
@@ -74,6 +74,8 @@ export function PrivateBlockToolbar( {
74
74
  showGroupButtons,
75
75
  showLockButtons,
76
76
  showSwitchSectionStyleButton,
77
+ hasFixedToolbar,
78
+ isNavigationMode,
77
79
  } = useSelect( ( select ) => {
78
80
  const {
79
81
  getBlockName,
@@ -85,8 +87,10 @@ export function PrivateBlockToolbar( {
85
87
  getBlockAttributes,
86
88
  getBlockParentsByBlockName,
87
89
  getTemplateLock,
90
+ getSettings,
88
91
  getParentSectionBlock,
89
92
  isZoomOut,
93
+ isNavigationMode: _isNavigationMode,
90
94
  } = unlock( select( blockEditorStore ) );
91
95
  const selectedBlockClientIds = getSelectedBlockClientIds();
92
96
  const selectedBlockClientId = selectedBlockClientIds[ 0 ];
@@ -119,6 +123,9 @@ export function PrivateBlockToolbar( {
119
123
  const _hasTemplateLock = selectedBlockClientIds.some(
120
124
  ( id ) => getTemplateLock( id ) === 'contentOnly'
121
125
  );
126
+
127
+ const _isZoomOut = isZoomOut();
128
+
122
129
  return {
123
130
  blockClientId: selectedBlockClientId,
124
131
  blockClientIds: selectedBlockClientIds,
@@ -127,8 +134,9 @@ export function PrivateBlockToolbar( {
127
134
  shouldShowVisualToolbar: isValid && isVisual,
128
135
  toolbarKey: `${ selectedBlockClientId }${ parentClientId }`,
129
136
  showParentSelector:
130
- ! isZoomOut() &&
137
+ ! _isZoomOut &&
131
138
  parentBlockType &&
139
+ editingMode !== 'contentOnly' &&
132
140
  getBlockEditingMode( parentClientId ) !== 'disabled' &&
133
141
  hasBlockSupport(
134
142
  parentBlockType,
@@ -139,11 +147,13 @@ export function PrivateBlockToolbar( {
139
147
  isUsingBindings: _isUsingBindings,
140
148
  hasParentPattern: _hasParentPattern,
141
149
  hasContentOnlyLocking: _hasTemplateLock,
142
- showShuffleButton: isZoomOut(),
143
- showSlots: ! isZoomOut(),
144
- showGroupButtons: ! isZoomOut(),
145
- showLockButtons: ! isZoomOut(),
146
- showSwitchSectionStyleButton: isZoomOut(),
150
+ showShuffleButton: _isZoomOut,
151
+ showSlots: ! _isZoomOut,
152
+ showGroupButtons: ! _isZoomOut,
153
+ showLockButtons: ! _isZoomOut,
154
+ showSwitchSectionStyleButton: _isZoomOut,
155
+ hasFixedToolbar: getSettings().hasFixedToolbar,
156
+ isNavigationMode: _isNavigationMode(),
147
157
  };
148
158
  }, [] );
149
159
 
@@ -170,6 +180,7 @@ export function PrivateBlockToolbar( {
170
180
  // Shifts the toolbar to make room for the parent block selector.
171
181
  const classes = clsx( 'block-editor-block-contextual-toolbar', {
172
182
  'has-parent': showParentSelector,
183
+ 'is-inverted-toolbar': isNavigationMode && ! hasFixedToolbar,
173
184
  } );
174
185
 
175
186
  const innerClasses = clsx( 'block-editor-block-toolbar', {
@@ -139,6 +139,50 @@
139
139
  border-right-color: $gray-900;
140
140
  }
141
141
 
142
+ .is-inverted-toolbar {
143
+ background-color: $gray-900;
144
+ color: $gray-100;
145
+
146
+ &.block-editor-block-contextual-toolbar {
147
+ border-color: $gray-800;
148
+ }
149
+
150
+ button {
151
+ color: $gray-300;
152
+
153
+ &:hover {
154
+ color: $white;
155
+ }
156
+
157
+ &:focus::before {
158
+ box-shadow: inset 0 0 0 1px $gray-900, 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
159
+ }
160
+
161
+ &:disabled,
162
+ &[aria-disabled="true"] {
163
+ color: $gray-700;
164
+ }
165
+ }
166
+
167
+ .block-editor-block-parent-selector .block-editor-block-parent-selector__button {
168
+ border-color: $gray-800;
169
+ background-color: $gray-900;
170
+ }
171
+
172
+ .block-editor-block-switcher__toggle {
173
+ color: $gray-100;
174
+ }
175
+
176
+ .components-toolbar-group,
177
+ .components-toolbar {
178
+ border-right-color: $gray-800 !important;
179
+ }
180
+
181
+ .is-pressed {
182
+ color: var(--wp-admin-theme-color);
183
+ }
184
+ }
185
+
142
186
  // Hide the block toolbar if the insertion point is shown.
143
187
  &.is-insertion-point-visible {
144
188
  visibility: hidden;
@@ -42,7 +42,7 @@ exports[`BlockVerticalAlignmentUI should match snapshot when controls are visibl
42
42
  <button
43
43
  aria-label="Align top"
44
44
  aria-pressed="true"
45
- class="components-button components-toolbar__control is-pressed has-icon"
45
+ class="components-button components-toolbar__control is-compact is-pressed has-icon"
46
46
  data-toolbar-item="true"
47
47
  type="button"
48
48
  >
@@ -64,7 +64,7 @@ exports[`BlockVerticalAlignmentUI should match snapshot when controls are visibl
64
64
  <button
65
65
  aria-label="Align middle"
66
66
  aria-pressed="false"
67
- class="components-button components-toolbar__control has-icon"
67
+ class="components-button components-toolbar__control is-compact has-icon"
68
68
  data-toolbar-item="true"
69
69
  type="button"
70
70
  >
@@ -86,7 +86,7 @@ exports[`BlockVerticalAlignmentUI should match snapshot when controls are visibl
86
86
  <button
87
87
  aria-label="Align bottom"
88
88
  aria-pressed="false"
89
- class="components-button components-toolbar__control has-icon"
89
+ class="components-button components-toolbar__control is-compact has-icon"
90
90
  data-toolbar-item="true"
91
91
  type="button"
92
92
  >