@wordpress/block-editor 14.8.0 → 14.8.1-next.cd6172eb0.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 (249) hide show
  1. package/build/autocompleters/block.js +2 -4
  2. package/build/autocompleters/block.js.map +1 -1
  3. package/build/autocompleters/link.js +2 -4
  4. package/build/autocompleters/link.js.map +1 -1
  5. package/build/components/block-canvas/index.js +3 -6
  6. package/build/components/block-canvas/index.js.map +1 -1
  7. package/build/components/block-list/block.js +6 -5
  8. package/build/components/block-list/block.js.map +1 -1
  9. package/build/components/block-list/index.js +0 -1
  10. package/build/components/block-list/index.js.map +1 -1
  11. package/build/components/block-list/use-block-props/index.js +7 -2
  12. package/build/components/block-list/use-block-props/index.js.map +1 -1
  13. package/build/components/block-list/use-block-props/use-firefox-draggable-compatibility.js +34 -0
  14. package/build/components/block-list/use-block-props/use-firefox-draggable-compatibility.js.map +1 -0
  15. package/build/components/block-list/use-block-props/use-selected-block-event-handlers.js +98 -5
  16. package/build/components/block-list/use-block-props/use-selected-block-event-handlers.js.map +1 -1
  17. package/build/components/block-patterns-list/index.js +13 -4
  18. package/build/components/block-patterns-list/index.js.map +1 -1
  19. package/build/components/block-popover/inbetween.js +4 -0
  20. package/build/components/block-popover/inbetween.js.map +1 -1
  21. package/build/components/block-settings-menu/block-settings-dropdown.js +7 -4
  22. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  23. package/build/components/block-settings-menu-controls/index.js +1 -1
  24. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  25. package/build/components/block-switcher/index.js +12 -22
  26. package/build/components/block-switcher/index.js.map +1 -1
  27. package/build/components/block-switcher/use-transformed-patterns.js +0 -1
  28. package/build/components/block-switcher/use-transformed-patterns.js.map +1 -1
  29. package/build/components/block-switcher/utils.js +0 -1
  30. package/build/components/block-switcher/utils.js.map +1 -1
  31. package/build/components/block-toolbar/index.js +7 -6
  32. package/build/components/block-toolbar/index.js.map +1 -1
  33. package/build/components/block-variation-transforms/index.js +0 -1
  34. package/build/components/block-variation-transforms/index.js.map +1 -1
  35. package/build/components/date-format-picker/index.js +0 -1
  36. package/build/components/date-format-picker/index.js.map +1 -1
  37. package/build/components/font-appearance-control/index.js +1 -0
  38. package/build/components/font-appearance-control/index.js.map +1 -1
  39. package/build/components/font-family/index.js +10 -0
  40. package/build/components/font-family/index.js.map +1 -1
  41. package/build/components/global-styles/dimensions-panel.js +17 -16
  42. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  43. package/build/components/global-styles/get-global-styles-changes.js +0 -1
  44. package/build/components/global-styles/get-global-styles-changes.js.map +1 -1
  45. package/build/components/iframe/use-scale-canvas.js +68 -47
  46. package/build/components/iframe/use-scale-canvas.js.map +1 -1
  47. package/build/components/inserter/block-patterns-tab/index.js +0 -10
  48. package/build/components/inserter/block-patterns-tab/index.js.map +1 -1
  49. package/build/components/inserter/menu.js +2 -1
  50. package/build/components/inserter/menu.js.map +1 -1
  51. package/build/components/inserter-draggable-blocks/index.js +19 -10
  52. package/build/components/inserter-draggable-blocks/index.js.map +1 -1
  53. package/build/components/letter-spacing-control/index.js +10 -0
  54. package/build/components/letter-spacing-control/index.js.map +1 -1
  55. package/build/components/line-height-control/index.js +1 -0
  56. package/build/components/line-height-control/index.js.map +1 -1
  57. package/build/components/media-placeholder/index.js +18 -18
  58. package/build/components/media-placeholder/index.js.map +1 -1
  59. package/build/components/observe-typing/index.js +0 -1
  60. package/build/components/observe-typing/index.js.map +1 -1
  61. package/build/components/recursion-provider/index.js +0 -1
  62. package/build/components/recursion-provider/index.js.map +1 -1
  63. package/build/components/rich-text/index.js +5 -1
  64. package/build/components/rich-text/index.js.map +1 -1
  65. package/build/components/rich-text/native/use-format-types.js +0 -1
  66. package/build/components/rich-text/native/use-format-types.js.map +1 -1
  67. package/build/components/rich-text/use-format-types.js +0 -1
  68. package/build/components/rich-text/use-format-types.js.map +1 -1
  69. package/build/components/spacing-sizes-control/utils.js +0 -1
  70. package/build/components/spacing-sizes-control/utils.js.map +1 -1
  71. package/build/components/typewriter/index.js +0 -1
  72. package/build/components/typewriter/index.js.map +1 -1
  73. package/build/components/use-block-drop-zone/index.js +11 -2
  74. package/build/components/use-block-drop-zone/index.js.map +1 -1
  75. package/build/components/use-moving-animation/index.js +15 -2
  76. package/build/components/use-moving-animation/index.js.map +1 -1
  77. package/build/components/use-resize-canvas/index.js +1 -1
  78. package/build/components/use-resize-canvas/index.js.map +1 -1
  79. package/build/components/writing-flow/use-drag-selection.js +11 -0
  80. package/build/components/writing-flow/use-drag-selection.js.map +1 -1
  81. package/build/components/writing-flow/use-tab-nav.js +6 -2
  82. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  83. package/build/hooks/block-bindings.js +4 -3
  84. package/build/hooks/block-bindings.js.map +1 -1
  85. package/build/hooks/gap.js +1 -1
  86. package/build/hooks/gap.js.map +1 -1
  87. package/build/hooks/generated-class-name.js +0 -1
  88. package/build/hooks/generated-class-name.js.map +1 -1
  89. package/build/store/private-selectors.js +1 -7
  90. package/build/store/private-selectors.js.map +1 -1
  91. package/build/store/reducer.js +478 -2
  92. package/build/store/reducer.js.map +1 -1
  93. package/build/store/selectors.js +12 -55
  94. package/build/store/selectors.js.map +1 -1
  95. package/build/utils/object.js +0 -1
  96. package/build/utils/object.js.map +1 -1
  97. package/build-module/autocompleters/block.js +2 -4
  98. package/build-module/autocompleters/block.js.map +1 -1
  99. package/build-module/autocompleters/link.js +2 -4
  100. package/build-module/autocompleters/link.js.map +1 -1
  101. package/build-module/components/block-canvas/index.js +3 -6
  102. package/build-module/components/block-canvas/index.js.map +1 -1
  103. package/build-module/components/block-list/block.js +8 -7
  104. package/build-module/components/block-list/block.js.map +1 -1
  105. package/build-module/components/block-list/index.js +0 -1
  106. package/build-module/components/block-list/index.js.map +1 -1
  107. package/build-module/components/block-list/use-block-props/index.js +7 -2
  108. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  109. package/build-module/components/block-list/use-block-props/use-firefox-draggable-compatibility.js +28 -0
  110. package/build-module/components/block-list/use-block-props/use-firefox-draggable-compatibility.js.map +1 -0
  111. package/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js +97 -5
  112. package/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js.map +1 -1
  113. package/build-module/components/block-patterns-list/index.js +13 -4
  114. package/build-module/components/block-patterns-list/index.js.map +1 -1
  115. package/build-module/components/block-popover/inbetween.js +4 -0
  116. package/build-module/components/block-popover/inbetween.js.map +1 -1
  117. package/build-module/components/block-settings-menu/block-settings-dropdown.js +7 -4
  118. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  119. package/build-module/components/block-settings-menu-controls/index.js +1 -1
  120. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  121. package/build-module/components/block-switcher/index.js +13 -23
  122. package/build-module/components/block-switcher/index.js.map +1 -1
  123. package/build-module/components/block-switcher/use-transformed-patterns.js +0 -1
  124. package/build-module/components/block-switcher/use-transformed-patterns.js.map +1 -1
  125. package/build-module/components/block-switcher/utils.js +0 -1
  126. package/build-module/components/block-switcher/utils.js.map +1 -1
  127. package/build-module/components/block-toolbar/index.js +7 -6
  128. package/build-module/components/block-toolbar/index.js.map +1 -1
  129. package/build-module/components/block-variation-transforms/index.js +0 -1
  130. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  131. package/build-module/components/date-format-picker/index.js +0 -1
  132. package/build-module/components/date-format-picker/index.js.map +1 -1
  133. package/build-module/components/font-appearance-control/index.js +1 -0
  134. package/build-module/components/font-appearance-control/index.js.map +1 -1
  135. package/build-module/components/font-family/index.js +10 -0
  136. package/build-module/components/font-family/index.js.map +1 -1
  137. package/build-module/components/global-styles/dimensions-panel.js +17 -16
  138. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  139. package/build-module/components/global-styles/get-global-styles-changes.js +0 -1
  140. package/build-module/components/global-styles/get-global-styles-changes.js.map +1 -1
  141. package/build-module/components/iframe/use-scale-canvas.js +68 -47
  142. package/build-module/components/iframe/use-scale-canvas.js.map +1 -1
  143. package/build-module/components/inserter/block-patterns-tab/index.js +1 -11
  144. package/build-module/components/inserter/block-patterns-tab/index.js.map +1 -1
  145. package/build-module/components/inserter/menu.js +2 -1
  146. package/build-module/components/inserter/menu.js.map +1 -1
  147. package/build-module/components/inserter-draggable-blocks/index.js +20 -11
  148. package/build-module/components/inserter-draggable-blocks/index.js.map +1 -1
  149. package/build-module/components/letter-spacing-control/index.js +9 -0
  150. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  151. package/build-module/components/line-height-control/index.js +1 -0
  152. package/build-module/components/line-height-control/index.js.map +1 -1
  153. package/build-module/components/media-placeholder/index.js +18 -18
  154. package/build-module/components/media-placeholder/index.js.map +1 -1
  155. package/build-module/components/observe-typing/index.js +0 -1
  156. package/build-module/components/observe-typing/index.js.map +1 -1
  157. package/build-module/components/recursion-provider/index.js +0 -1
  158. package/build-module/components/recursion-provider/index.js.map +1 -1
  159. package/build-module/components/rich-text/index.js +5 -1
  160. package/build-module/components/rich-text/index.js.map +1 -1
  161. package/build-module/components/rich-text/native/use-format-types.js +0 -1
  162. package/build-module/components/rich-text/native/use-format-types.js.map +1 -1
  163. package/build-module/components/rich-text/use-format-types.js +0 -1
  164. package/build-module/components/rich-text/use-format-types.js.map +1 -1
  165. package/build-module/components/spacing-sizes-control/utils.js +0 -1
  166. package/build-module/components/spacing-sizes-control/utils.js.map +1 -1
  167. package/build-module/components/typewriter/index.js +0 -1
  168. package/build-module/components/typewriter/index.js.map +1 -1
  169. package/build-module/components/use-block-drop-zone/index.js +11 -2
  170. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  171. package/build-module/components/use-moving-animation/index.js +15 -2
  172. package/build-module/components/use-moving-animation/index.js.map +1 -1
  173. package/build-module/components/use-resize-canvas/index.js +1 -1
  174. package/build-module/components/use-resize-canvas/index.js.map +1 -1
  175. package/build-module/components/writing-flow/use-drag-selection.js +11 -0
  176. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -1
  177. package/build-module/components/writing-flow/use-tab-nav.js +6 -2
  178. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  179. package/build-module/hooks/block-bindings.js +4 -3
  180. package/build-module/hooks/block-bindings.js.map +1 -1
  181. package/build-module/hooks/gap.js +1 -1
  182. package/build-module/hooks/gap.js.map +1 -1
  183. package/build-module/hooks/generated-class-name.js +0 -1
  184. package/build-module/hooks/generated-class-name.js.map +1 -1
  185. package/build-module/store/private-selectors.js +1 -6
  186. package/build-module/store/private-selectors.js.map +1 -1
  187. package/build-module/store/reducer.js +479 -3
  188. package/build-module/store/reducer.js.map +1 -1
  189. package/build-module/store/selectors.js +12 -55
  190. package/build-module/store/selectors.js.map +1 -1
  191. package/build-module/utils/object.js +0 -1
  192. package/build-module/utils/object.js.map +1 -1
  193. package/build-style/content-rtl.css +17 -4
  194. package/build-style/content.css +17 -4
  195. package/build-style/style-rtl.css +21 -16
  196. package/build-style/style.css +21 -16
  197. package/package.json +32 -32
  198. package/src/autocompleters/block.js +2 -4
  199. package/src/autocompleters/link.js +2 -4
  200. package/src/components/alignment-control/stories/aliginment-toolbar.story.js +47 -0
  201. package/src/components/alignment-control/stories/index.story.js +51 -0
  202. package/src/components/alignment-control/test/__snapshots__/index.js.snap +5 -5
  203. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +4 -4
  204. package/src/components/block-canvas/index.js +3 -5
  205. package/src/components/block-draggable/content.scss +11 -5
  206. package/src/components/block-list/block.js +7 -13
  207. package/src/components/block-list/content.scss +6 -0
  208. package/src/components/block-list/use-block-props/index.js +7 -0
  209. package/src/components/block-list/use-block-props/use-firefox-draggable-compatibility.js +25 -0
  210. package/src/components/block-list/use-block-props/use-selected-block-event-handlers.js +112 -8
  211. package/src/components/block-patterns-list/index.js +12 -1
  212. package/src/components/block-patterns-list/style.scss +16 -5
  213. package/src/components/block-popover/inbetween.js +4 -0
  214. package/src/components/block-settings-menu/block-settings-dropdown.js +6 -1
  215. package/src/components/block-settings-menu-controls/index.js +2 -1
  216. package/src/components/block-switcher/index.js +19 -21
  217. package/src/components/block-switcher/style.scss +0 -9
  218. package/src/components/block-title/test/index.js +2 -0
  219. package/src/components/block-toolbar/index.js +8 -6
  220. package/src/components/block-tools/style.scss +5 -0
  221. package/src/components/block-vertical-alignment-control/test/__snapshots__/index.js.snap +3 -3
  222. package/src/components/font-appearance-control/index.js +1 -0
  223. package/src/components/font-family/index.js +10 -0
  224. package/src/components/font-family/style.scss +5 -0
  225. package/src/components/global-styles/dimensions-panel.js +16 -16
  226. package/src/components/iframe/content.scss +6 -1
  227. package/src/components/iframe/use-scale-canvas.js +103 -81
  228. package/src/components/inserter/block-patterns-tab/index.js +1 -17
  229. package/src/components/inserter/menu.js +8 -1
  230. package/src/components/inserter-draggable-blocks/index.js +19 -29
  231. package/src/components/letter-spacing-control/README.md +2 -1
  232. package/src/components/letter-spacing-control/index.js +17 -0
  233. package/src/components/line-height-control/index.js +1 -0
  234. package/src/components/media-placeholder/index.js +25 -28
  235. package/src/components/rich-text/index.js +5 -0
  236. package/src/components/use-block-drop-zone/index.js +18 -1
  237. package/src/components/use-moving-animation/index.js +15 -0
  238. package/src/components/use-resize-canvas/index.js +1 -1
  239. package/src/components/writing-flow/use-drag-selection.js +11 -0
  240. package/src/components/writing-flow/use-tab-nav.js +9 -6
  241. package/src/hooks/block-bindings.js +8 -4
  242. package/src/hooks/gap.js +1 -1
  243. package/src/store/private-selectors.js +2 -17
  244. package/src/store/reducer.js +639 -2
  245. package/src/store/selectors.js +19 -69
  246. package/src/store/test/private-selectors.js +1 -0
  247. package/src/store/test/reducer.js +849 -0
  248. package/src/store/test/selectors.js +4 -110
  249. package/src/style.scss +1 -0
@@ -0,0 +1,5 @@
1
+ .block-editor-font-family-control {
2
+ &:not(.is-next-has-no-margin-bottom) {
3
+ margin-bottom: $grid-unit-10;
4
+ }
5
+ }
@@ -444,17 +444,6 @@ export default function DimensionsPanel( {
444
444
 
445
445
  const onMouseLeaveControls = () => onVisualize( false );
446
446
 
447
- const inputProps = {
448
- min: minMarginValue,
449
- onDragStart: () => {
450
- //Reset to 0 in case the value was negative.
451
- setMinMarginValue( 0 );
452
- },
453
- onDragEnd: () => {
454
- setMinMarginValue( minimumMargin );
455
- },
456
- };
457
-
458
447
  return (
459
448
  <Wrapper
460
449
  resetAllFilter={ resetAllFilter }
@@ -545,8 +534,10 @@ export default function DimensionsPanel( {
545
534
  units={ units }
546
535
  allowReset={ false }
547
536
  splitOnAxis={ isAxialPadding }
548
- onMouseOver={ onMouseOverPadding }
549
- onMouseOut={ onMouseLeaveControls }
537
+ inputProps={ {
538
+ onMouseOver: onMouseOverPadding,
539
+ onMouseOut: onMouseLeaveControls,
540
+ } }
550
541
  />
551
542
  ) }
552
543
  { showSpacingPresetsControl && (
@@ -581,14 +572,23 @@ export default function DimensionsPanel( {
581
572
  __next40pxDefaultSize
582
573
  values={ marginValues }
583
574
  onChange={ setMarginValues }
584
- inputProps={ inputProps }
575
+ inputProps={ {
576
+ min: minMarginValue,
577
+ onDragStart: () => {
578
+ // Reset to 0 in case the value was negative.
579
+ setMinMarginValue( 0 );
580
+ },
581
+ onDragEnd: () => {
582
+ setMinMarginValue( minimumMargin );
583
+ },
584
+ onMouseOver: onMouseOverMargin,
585
+ onMouseOut: onMouseLeaveControls,
586
+ } }
585
587
  label={ __( 'Margin' ) }
586
588
  sides={ marginSides }
587
589
  units={ units }
588
590
  allowReset={ false }
589
591
  splitOnAxis={ isAxialMargin }
590
- onMouseOver={ onMouseOverMargin }
591
- onMouseOut={ onMouseLeaveControls }
592
592
  />
593
593
  ) }
594
594
  { showSpacingPresetsControl && (
@@ -10,6 +10,7 @@
10
10
  &.zoom-out-animation {
11
11
  $scroll-top: var(--wp-block-editor-iframe-zoom-out-scroll-top, 0);
12
12
  $scroll-top-next: var(--wp-block-editor-iframe-zoom-out-scroll-top-next, 0);
13
+ $overflow-behavior: var(--wp-block-editor-iframe-zoom-out-overflow-behavior, scroll);
13
14
 
14
15
  position: fixed;
15
16
  left: 0;
@@ -18,7 +19,7 @@
18
19
  bottom: 0;
19
20
  // Force preserving a scrollbar gutter as scrollbar-gutter isn't supported in all browsers yet,
20
21
  // and removing the scrollbar causes the content to shift.
21
- overflow-y: scroll;
22
+ overflow-y: $overflow-behavior;
22
23
  }
23
24
 
24
25
  &.is-zoomed-out {
@@ -60,5 +61,9 @@
60
61
  }
61
62
  }
62
63
  }
64
+
65
+ .wp-block[draggable] {
66
+ cursor: grab;
67
+ }
63
68
  }
64
69
  }
@@ -6,11 +6,11 @@ import { useReducedMotion, useResizeObserver } from '@wordpress/compose';
6
6
 
7
7
  /**
8
8
  * @typedef {Object} TransitionState
9
- * @property {number} scaleValue Scale of the canvas.
10
- * @property {number} frameSize Size of the frame/offset around the canvas.
11
- * @property {number} clientHeight ClientHeight of the iframe.
12
- * @property {number} scrollTop ScrollTop of the iframe.
13
- * @property {number} scrollHeight ScrollHeight of the iframe.
9
+ * @property {number} scaleValue Scale of the canvas.
10
+ * @property {number} frameSize Size of the frame/offset around the canvas.
11
+ * @property {number} containerHeight containerHeight of the iframe.
12
+ * @property {number} scrollTop ScrollTop of the iframe.
13
+ * @property {number} scrollHeight ScrollHeight of the iframe.
14
14
  */
15
15
 
16
16
  /**
@@ -35,6 +35,21 @@ function calculateScale( {
35
35
  );
36
36
  }
37
37
 
38
+ /**
39
+ * Compute the next scrollHeight based on the transition states.
40
+ *
41
+ * @param {TransitionState} transitionFrom Starting point of the transition
42
+ * @param {TransitionState} transitionTo Ending state of the transition
43
+ * @return {number} Next scrollHeight based on scale and frame value changes.
44
+ */
45
+ function computeScrollHeightNext( transitionFrom, transitionTo ) {
46
+ const { scaleValue: prevScale, scrollHeight: prevScrollHeight } =
47
+ transitionFrom;
48
+ const { frameSize, scaleValue } = transitionTo;
49
+
50
+ return prevScrollHeight * ( scaleValue / prevScale ) + frameSize * 2;
51
+ }
52
+
38
53
  /**
39
54
  * Compute the next scrollTop position after scaling the iframe content.
40
55
  *
@@ -44,41 +59,39 @@ function calculateScale( {
44
59
  */
45
60
  function computeScrollTopNext( transitionFrom, transitionTo ) {
46
61
  const {
47
- clientHeight: prevClientHeight,
62
+ containerHeight: prevContainerHeight,
48
63
  frameSize: prevFrameSize,
49
64
  scaleValue: prevScale,
50
- scrollTop,
51
- scrollHeight,
65
+ scrollTop: prevScrollTop,
52
66
  } = transitionFrom;
53
- const { clientHeight, frameSize, scaleValue } = transitionTo;
67
+ const { containerHeight, frameSize, scaleValue, scrollHeight } =
68
+ transitionTo;
54
69
  // Step 0: Start with the current scrollTop.
55
- let scrollTopNext = scrollTop;
70
+ let scrollTopNext = prevScrollTop;
56
71
  // Step 1: Undo the effects of the previous scale and frame around the
57
72
  // midpoint of the visible area.
58
73
  scrollTopNext =
59
- ( scrollTopNext + prevClientHeight / 2 - prevFrameSize ) / prevScale -
60
- prevClientHeight / 2;
74
+ ( scrollTopNext + prevContainerHeight / 2 - prevFrameSize ) /
75
+ prevScale -
76
+ prevContainerHeight / 2;
61
77
 
62
78
  // Step 2: Apply the new scale and frame around the midpoint of the
63
79
  // visible area.
64
80
  scrollTopNext =
65
- ( scrollTopNext + clientHeight / 2 ) * scaleValue +
81
+ ( scrollTopNext + containerHeight / 2 ) * scaleValue +
66
82
  frameSize -
67
- clientHeight / 2;
83
+ containerHeight / 2;
68
84
 
69
85
  // Step 3: Handle an edge case so that you scroll to the top of the
70
86
  // iframe if the top of the iframe content is visible in the container.
71
87
  // The same edge case for the bottom is skipped because changing content
72
88
  // makes calculating it impossible.
73
- scrollTopNext = scrollTop <= prevFrameSize ? 0 : scrollTopNext;
89
+ scrollTopNext = prevScrollTop <= prevFrameSize ? 0 : scrollTopNext;
74
90
 
75
91
  // This is the scrollTop value if you are scrolled to the bottom of the
76
92
  // iframe. We can't just let the browser handle it because we need to
77
93
  // animate the scaling.
78
- const maxScrollTop =
79
- scrollHeight * ( scaleValue / prevScale ) +
80
- frameSize * 2 -
81
- clientHeight;
94
+ const maxScrollTop = scrollHeight - containerHeight;
82
95
 
83
96
  // Step 4: Clamp the scrollTopNext between the minimum and maximum
84
97
  // possible scrollTop positions. Round the value to avoid subpixel
@@ -146,8 +159,10 @@ export function useScaleCanvas( {
146
159
  } ) {
147
160
  const [ contentResizeListener, { height: contentHeight } ] =
148
161
  useResizeObserver();
149
- const [ containerResizeListener, { width: containerWidth } ] =
150
- useResizeObserver();
162
+ const [
163
+ containerResizeListener,
164
+ { width: containerWidth, height: containerHeight },
165
+ ] = useResizeObserver();
151
166
 
152
167
  const initialContainerWidthRef = useRef( 0 );
153
168
  const isZoomedOut = scale !== 1;
@@ -186,7 +201,7 @@ export function useScaleCanvas( {
186
201
  const transitionFromRef = useRef( {
187
202
  scaleValue,
188
203
  frameSize,
189
- clientHeight: 0,
204
+ containerHeight: 0,
190
205
  scrollTop: 0,
191
206
  scrollHeight: 0,
192
207
  } );
@@ -198,7 +213,7 @@ export function useScaleCanvas( {
198
213
  const transitionToRef = useRef( {
199
214
  scaleValue,
200
215
  frameSize,
201
- clientHeight: 0,
216
+ containerHeight: 0,
202
217
  scrollTop: 0,
203
218
  scrollHeight: 0,
204
219
  } );
@@ -223,6 +238,15 @@ export function useScaleCanvas( {
223
238
  `${ scrollTopNext }px`
224
239
  );
225
240
 
241
+ // If the container has a scrolllbar, force a scrollbar to prevent the content from shifting while animating.
242
+ iframeDocument.documentElement.style.setProperty(
243
+ '--wp-block-editor-iframe-zoom-out-overflow-behavior',
244
+ transitionFromRef.current.scrollHeight ===
245
+ transitionFromRef.current.containerHeight
246
+ ? 'auto'
247
+ : 'scroll'
248
+ );
249
+
226
250
  iframeDocument.documentElement.classList.add( 'zoom-out-animation' );
227
251
 
228
252
  return iframeDocument.documentElement.animate(
@@ -275,11 +299,16 @@ export function useScaleCanvas( {
275
299
  iframeDocument.documentElement.style.removeProperty(
276
300
  '--wp-block-editor-iframe-zoom-out-scroll-top-next'
277
301
  );
302
+ iframeDocument.documentElement.style.removeProperty(
303
+ '--wp-block-editor-iframe-zoom-out-overflow-behavior'
304
+ );
278
305
 
279
306
  // Update previous values.
280
307
  transitionFromRef.current = transitionToRef.current;
281
308
  }, [ iframeDocument ] );
282
309
 
310
+ const previousIsZoomedOut = useRef( false );
311
+
283
312
  /**
284
313
  * Runs when zoom out mode is toggled, and sets the startAnimation flag
285
314
  * so the animation will start when the next useEffect runs. We _only_
@@ -287,16 +316,22 @@ export function useScaleCanvas( {
287
316
  * changes due to the container resizing.
288
317
  */
289
318
  useEffect( () => {
290
- if ( ! iframeDocument ) {
291
- return;
292
- }
319
+ const trigger =
320
+ iframeDocument && previousIsZoomedOut.current !== isZoomedOut;
321
+
322
+ previousIsZoomedOut.current = isZoomedOut;
293
323
 
294
- if ( isZoomedOut ) {
295
- iframeDocument.documentElement.classList.add( 'is-zoomed-out' );
324
+ if ( ! trigger ) {
325
+ return;
296
326
  }
297
327
 
298
328
  startAnimationRef.current = true;
299
329
 
330
+ if ( ! isZoomedOut ) {
331
+ return;
332
+ }
333
+
334
+ iframeDocument.documentElement.classList.add( 'is-zoomed-out' );
300
335
  return () => {
301
336
  iframeDocument.documentElement.classList.remove( 'is-zoomed-out' );
302
337
  };
@@ -325,40 +360,41 @@ export function useScaleCanvas( {
325
360
  } );
326
361
  }
327
362
 
328
- // If we are not going to animate the transition, set the scale and frame size directly.
329
- // If we are animating, these values will be set when the animation is finished.
330
- // Example: Opening sidebars that reduce the scale of the canvas, but we don't want to
331
- // animate the transition.
332
- if ( ! startAnimationRef.current ) {
363
+ if ( scaleValue < 1 ) {
364
+ // If we are not going to animate the transition, set the scale and frame size directly.
365
+ // If we are animating, these values will be set when the animation is finished.
366
+ // Example: Opening sidebars that reduce the scale of the canvas, but we don't want to
367
+ // animate the transition.
368
+ if ( ! startAnimationRef.current ) {
369
+ iframeDocument.documentElement.style.setProperty(
370
+ '--wp-block-editor-iframe-zoom-out-scale',
371
+ scaleValue
372
+ );
373
+ iframeDocument.documentElement.style.setProperty(
374
+ '--wp-block-editor-iframe-zoom-out-frame-size',
375
+ `${ frameSize }px`
376
+ );
377
+ }
378
+
333
379
  iframeDocument.documentElement.style.setProperty(
334
- '--wp-block-editor-iframe-zoom-out-scale',
335
- scaleValue
380
+ '--wp-block-editor-iframe-zoom-out-content-height',
381
+ `${ contentHeight }px`
336
382
  );
383
+
337
384
  iframeDocument.documentElement.style.setProperty(
338
- '--wp-block-editor-iframe-zoom-out-frame-size',
339
- `${ frameSize }px`
385
+ '--wp-block-editor-iframe-zoom-out-inner-height',
386
+ `${ containerHeight }px`
340
387
  );
341
- }
342
-
343
- iframeDocument.documentElement.style.setProperty(
344
- '--wp-block-editor-iframe-zoom-out-content-height',
345
- `${ contentHeight }px`
346
- );
347
-
348
- const clientHeight = iframeDocument.documentElement.clientHeight;
349
- iframeDocument.documentElement.style.setProperty(
350
- '--wp-block-editor-iframe-zoom-out-inner-height',
351
- `${ clientHeight }px`
352
- );
353
388
 
354
- iframeDocument.documentElement.style.setProperty(
355
- '--wp-block-editor-iframe-zoom-out-container-width',
356
- `${ containerWidth }px`
357
- );
358
- iframeDocument.documentElement.style.setProperty(
359
- '--wp-block-editor-iframe-zoom-out-scale-container-width',
360
- `${ scaleContainerWidth }px`
361
- );
389
+ iframeDocument.documentElement.style.setProperty(
390
+ '--wp-block-editor-iframe-zoom-out-container-width',
391
+ `${ containerWidth }px`
392
+ );
393
+ iframeDocument.documentElement.style.setProperty(
394
+ '--wp-block-editor-iframe-zoom-out-scale-container-width',
395
+ `${ scaleContainerWidth }px`
396
+ );
397
+ }
362
398
 
363
399
  /**
364
400
  * Handle the zoom out animation:
@@ -397,18 +433,24 @@ export function useScaleCanvas( {
397
433
  // the iframe at this point when we're about to animate the zoom out.
398
434
  // The iframe scrollTop, scrollHeight, and clientHeight will all be
399
435
  // the most accurate.
400
- transitionFromRef.current.clientHeight =
401
- transitionFromRef.current.clientHeight ?? clientHeight;
402
436
  transitionFromRef.current.scrollTop =
403
437
  iframeDocument.documentElement.scrollTop;
404
438
  transitionFromRef.current.scrollHeight =
405
439
  iframeDocument.documentElement.scrollHeight;
440
+ // Use containerHeight, as it's the previous container height before the zoom out animation starts.
441
+ transitionFromRef.current.containerHeight = containerHeight;
406
442
 
407
443
  transitionToRef.current = {
408
444
  scaleValue,
409
445
  frameSize,
410
- clientHeight,
446
+ containerHeight:
447
+ iframeDocument.documentElement.clientHeight, // use clientHeight to get the actual height of the new container after zoom state changes have rendered, as it will be the most up-to-date.
411
448
  };
449
+
450
+ transitionToRef.current.scrollHeight = computeScrollHeightNext(
451
+ transitionFromRef.current,
452
+ transitionToRef.current
453
+ );
412
454
  transitionToRef.current.scrollTop = computeScrollTopNext(
413
455
  transitionFromRef.current,
414
456
  transitionToRef.current
@@ -424,27 +466,6 @@ export function useScaleCanvas( {
424
466
  }
425
467
  }
426
468
  }
427
-
428
- return () => {
429
- iframeDocument.documentElement.style.removeProperty(
430
- '--wp-block-editor-iframe-zoom-out-scale'
431
- );
432
- iframeDocument.documentElement.style.removeProperty(
433
- '--wp-block-editor-iframe-zoom-out-frame-size'
434
- );
435
- iframeDocument.documentElement.style.removeProperty(
436
- '--wp-block-editor-iframe-zoom-out-content-height'
437
- );
438
- iframeDocument.documentElement.style.removeProperty(
439
- '--wp-block-editor-iframe-zoom-out-inner-height'
440
- );
441
- iframeDocument.documentElement.style.removeProperty(
442
- '--wp-block-editor-iframe-zoom-out-container-width'
443
- );
444
- iframeDocument.documentElement.style.removeProperty(
445
- '--wp-block-editor-iframe-zoom-out-scale-container-width'
446
- );
447
- };
448
469
  }, [
449
470
  startZoomOutAnimation,
450
471
  finishZoomOutAnimation,
@@ -455,6 +476,7 @@ export function useScaleCanvas( {
455
476
  iframeDocument,
456
477
  contentHeight,
457
478
  containerWidth,
479
+ containerHeight,
458
480
  maxContainerWidth,
459
481
  scaleContainerWidth,
460
482
  ] );
@@ -3,9 +3,8 @@
3
3
  */
4
4
  import { useState } from '@wordpress/element';
5
5
  import { useViewportMatch } from '@wordpress/compose';
6
- import { Button, Spinner } from '@wordpress/components';
6
+ import { Button } from '@wordpress/components';
7
7
  import { __ } from '@wordpress/i18n';
8
- import { useSelect } from '@wordpress/data';
9
8
 
10
9
  /**
11
10
  * Internal dependencies
@@ -16,8 +15,6 @@ import { PatternCategoryPreviews } from './pattern-category-previews';
16
15
  import { usePatternCategories } from './use-pattern-categories';
17
16
  import CategoryTabs from '../category-tabs';
18
17
  import InserterNoResults from '../no-results';
19
- import { store as blockEditorStore } from '../../../store';
20
- import { unlock } from '../../../lock-unlock';
21
18
 
22
19
  function BlockPatternsTab( {
23
20
  onSelectCategory,
@@ -31,19 +28,6 @@ function BlockPatternsTab( {
31
28
  const categories = usePatternCategories( rootClientId );
32
29
 
33
30
  const isMobile = useViewportMatch( 'medium', '<' );
34
- const isResolvingPatterns = useSelect(
35
- ( select ) =>
36
- unlock( select( blockEditorStore ) ).isResolvingPatterns(),
37
- []
38
- );
39
-
40
- if ( isResolvingPatterns ) {
41
- return (
42
- <div className="block-editor-inserter__patterns-loading">
43
- <Spinner />
44
- </div>
45
- );
46
- }
47
31
 
48
32
  if ( ! categories.length ) {
49
33
  return <InserterNoResults />;
@@ -58,6 +58,11 @@ function InserterMenu(
58
58
  ( select ) => unlock( select( blockEditorStore ) ).isZoomOut(),
59
59
  []
60
60
  );
61
+ const hasSectionRootClientId = useSelect(
62
+ ( select ) =>
63
+ !! unlock( select( blockEditorStore ) ).getSectionRootClientId(),
64
+ []
65
+ );
61
66
  const [ filterValue, setFilterValue, delayedFilterValue ] =
62
67
  useDebouncedInput( __experimentalFilterValue );
63
68
  const [ hoveredItem, setHoveredItem ] = useState( null );
@@ -81,7 +86,9 @@ function InserterMenu(
81
86
  const [ selectedTab, setSelectedTab ] = useState( getInitialTab() );
82
87
 
83
88
  const shouldUseZoomOut =
84
- selectedTab === 'patterns' || selectedTab === 'media';
89
+ hasSectionRootClientId &&
90
+ ( selectedTab === 'patterns' || selectedTab === 'media' );
91
+
85
92
  useZoomOut( shouldUseZoomOut && isLargeViewport );
86
93
 
87
94
  const [ destinationRootClientId, onInsertBlocks, onToggleInsertionPoint ] =
@@ -2,12 +2,9 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { Draggable } from '@wordpress/components';
5
- import {
6
- createBlock,
7
- serialize,
8
- store as blocksStore,
9
- } from '@wordpress/blocks';
5
+ import { createBlock, store as blocksStore } from '@wordpress/blocks';
10
6
  import { useDispatch, useSelect } from '@wordpress/data';
7
+ import { useMemo } from '@wordpress/element';
11
8
 
12
9
  /**
13
10
  * Internal dependencies
@@ -24,20 +21,6 @@ const InserterDraggableBlocks = ( {
24
21
  children,
25
22
  pattern,
26
23
  } ) => {
27
- const transferData = {
28
- type: 'inserter',
29
- blocks,
30
- };
31
-
32
- const blocksContainMedia =
33
- blocks.filter(
34
- ( block ) =>
35
- ( block.name === 'core/image' ||
36
- block.name === 'core/audio' ||
37
- block.name === 'core/video' ) &&
38
- ( block.attributes.url || block.attributes.src )
39
- ).length > 0;
40
-
41
24
  const blockTypeIcon = useSelect(
42
25
  ( select ) => {
43
26
  const { getBlockType } = select( blocksStore );
@@ -52,6 +35,13 @@ const InserterDraggableBlocks = ( {
52
35
  useDispatch( blockEditorStore )
53
36
  );
54
37
 
38
+ const patternBlock = useMemo( () => {
39
+ return pattern?.type === INSERTER_PATTERN_TYPES.user &&
40
+ pattern?.syncStatus !== 'unsynced'
41
+ ? [ createBlock( 'core/block', { ref: pattern.id } ) ]
42
+ : undefined;
43
+ }, [ pattern?.type, pattern?.syncStatus, pattern?.id ] );
44
+
55
45
  if ( ! isEnabled ) {
56
46
  return children( {
57
47
  draggable: false,
@@ -60,21 +50,21 @@ const InserterDraggableBlocks = ( {
60
50
  } );
61
51
  }
62
52
 
53
+ const draggableBlocks = patternBlock ?? blocks;
63
54
  return (
64
55
  <Draggable
65
56
  __experimentalTransferDataType="wp-blocks"
66
- transferData={ transferData }
57
+ transferData={ { type: 'inserter', blocks: draggableBlocks } }
67
58
  onDragStart={ ( event ) => {
68
59
  startDragging();
69
- const parsedBlocks =
70
- pattern?.type === INSERTER_PATTERN_TYPES.user &&
71
- pattern?.syncStatus !== 'unsynced'
72
- ? [ createBlock( 'core/block', { ref: pattern.id } ) ]
73
- : blocks;
74
- event.dataTransfer.setData(
75
- blocksContainMedia ? 'default' : 'text/html',
76
- serialize( parsedBlocks )
77
- );
60
+ for ( const block of draggableBlocks ) {
61
+ const type = `wp-block:${ block.name }`;
62
+ // This will fill in the dataTransfer.types array so that
63
+ // the drop zone can check if the draggable is eligible.
64
+ // Unfortuantely, on drag start, we don't have access to the
65
+ // actual data, only the data keys/types.
66
+ event.dataTransfer.items.add( '', type );
67
+ }
78
68
  } }
79
69
  onDragEnd={ () => {
80
70
  stopDragging();
@@ -12,13 +12,14 @@ This component is used for blocks that display text, commonly inside a
12
12
  Renders a letter spacing control.
13
13
 
14
14
  ```jsx
15
- import { LetterSpacingControl } from '@wordpress/block-editor';
15
+ import { __experimentalLetterSpacingControl as LetterSpacingControl } from '@wordpress/block-editor';
16
16
 
17
17
  const MyLetterSpacingControl = () => (
18
18
  <LetterSpacingControl
19
19
  value={ value }
20
20
  onChange={ onChange }
21
21
  __unstableInputWidth="auto"
22
+ __next40pxDefaultSize
22
23
  />
23
24
  );
24
25
  ```
@@ -5,6 +5,7 @@ import {
5
5
  __experimentalUnitControl as UnitControl,
6
6
  __experimentalUseCustomUnits as useCustomUnits,
7
7
  } from '@wordpress/components';
8
+ import deprecated from '@wordpress/deprecated';
8
9
  import { __ } from '@wordpress/i18n';
9
10
 
10
11
  /**
@@ -35,9 +36,25 @@ export default function LetterSpacingControl( {
35
36
  availableUnits: availableUnits || [ 'px', 'em', 'rem' ],
36
37
  defaultValues: { px: 2, em: 0.2, rem: 0.2 },
37
38
  } );
39
+
40
+ if (
41
+ ! __next40pxDefaultSize &&
42
+ ( otherProps.size === undefined || otherProps.size === 'default' )
43
+ ) {
44
+ deprecated(
45
+ `36px default size for wp.blockEditor.__experimentalLetterSpacingControl`,
46
+ {
47
+ since: '6.8',
48
+ version: '7.1',
49
+ hint: 'Set the `__next40pxDefaultSize` prop to true to start opting into the new default size, which will become the default in a future version.',
50
+ }
51
+ );
52
+ }
53
+
38
54
  return (
39
55
  <UnitControl
40
56
  __next40pxDefaultSize={ __next40pxDefaultSize }
57
+ __shouldNotWarnDeprecated36pxSize
41
58
  { ...otherProps }
42
59
  label={ __( 'Letter spacing' ) }
43
60
  value={ value }
@@ -93,6 +93,7 @@ const LineHeightControl = ( {
93
93
  <div className="block-editor-line-height-control">
94
94
  <NumberControl
95
95
  { ...otherProps }
96
+ __shouldNotWarnDeprecated36pxSize
96
97
  __next40pxDefaultSize={ __next40pxDefaultSize }
97
98
  __unstableInputWidth={ __unstableInputWidth }
98
99
  __unstableStateReducer={ stateReducer }