@wordpress/block-editor 14.8.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 (290) 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 +6 -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 +87 -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-lock/modal.js +4 -4
  18. package/build/components/block-lock/modal.js.map +1 -1
  19. package/build/components/block-parent-selector/index.js +2 -15
  20. package/build/components/block-parent-selector/index.js.map +1 -1
  21. package/build/components/block-patterns-list/index.js +13 -4
  22. package/build/components/block-patterns-list/index.js.map +1 -1
  23. package/build/components/block-popover/inbetween.js +4 -0
  24. package/build/components/block-popover/inbetween.js.map +1 -1
  25. package/build/components/block-settings-menu/block-settings-dropdown.js +7 -4
  26. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  27. package/build/components/block-settings-menu-controls/index.js +1 -1
  28. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  29. package/build/components/block-switcher/index.js +12 -22
  30. package/build/components/block-switcher/index.js.map +1 -1
  31. package/build/components/block-switcher/use-transformed-patterns.js +0 -1
  32. package/build/components/block-switcher/use-transformed-patterns.js.map +1 -1
  33. package/build/components/block-switcher/utils.js +0 -1
  34. package/build/components/block-switcher/utils.js.map +1 -1
  35. package/build/components/block-toolbar/index.js +7 -6
  36. package/build/components/block-toolbar/index.js.map +1 -1
  37. package/build/components/block-variation-transforms/index.js +0 -1
  38. package/build/components/block-variation-transforms/index.js.map +1 -1
  39. package/build/components/date-format-picker/index.js +0 -1
  40. package/build/components/date-format-picker/index.js.map +1 -1
  41. package/build/components/font-appearance-control/index.js +1 -0
  42. package/build/components/font-appearance-control/index.js.map +1 -1
  43. package/build/components/font-family/index.js +10 -0
  44. package/build/components/font-family/index.js.map +1 -1
  45. package/build/components/global-styles/dimensions-panel.js +17 -16
  46. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  47. package/build/components/global-styles/get-global-styles-changes.js +0 -1
  48. package/build/components/global-styles/get-global-styles-changes.js.map +1 -1
  49. package/build/components/iframe/use-scale-canvas.js +68 -47
  50. package/build/components/iframe/use-scale-canvas.js.map +1 -1
  51. package/build/components/inserter/block-patterns-tab/index.js +0 -10
  52. package/build/components/inserter/block-patterns-tab/index.js.map +1 -1
  53. package/build/components/inserter/menu.js +2 -1
  54. package/build/components/inserter/menu.js.map +1 -1
  55. package/build/components/inserter-draggable-blocks/index.js +19 -10
  56. package/build/components/inserter-draggable-blocks/index.js.map +1 -1
  57. package/build/components/inspector-controls/slot.js +2 -13
  58. package/build/components/inspector-controls/slot.js.map +1 -1
  59. package/build/components/letter-spacing-control/index.js +10 -0
  60. package/build/components/letter-spacing-control/index.js.map +1 -1
  61. package/build/components/line-height-control/index.js +1 -0
  62. package/build/components/line-height-control/index.js.map +1 -1
  63. package/build/components/media-placeholder/index.js +18 -18
  64. package/build/components/media-placeholder/index.js.map +1 -1
  65. package/build/components/multi-selection-inspector/index.js +9 -25
  66. package/build/components/multi-selection-inspector/index.js.map +1 -1
  67. package/build/components/observe-typing/index.js +0 -1
  68. package/build/components/observe-typing/index.js.map +1 -1
  69. package/build/components/recursion-provider/index.js +0 -1
  70. package/build/components/recursion-provider/index.js.map +1 -1
  71. package/build/components/rich-text/index.js +5 -1
  72. package/build/components/rich-text/index.js.map +1 -1
  73. package/build/components/rich-text/native/use-format-types.js +0 -1
  74. package/build/components/rich-text/native/use-format-types.js.map +1 -1
  75. package/build/components/rich-text/use-format-types.js +0 -1
  76. package/build/components/rich-text/use-format-types.js.map +1 -1
  77. package/build/components/spacing-sizes-control/utils.js +0 -1
  78. package/build/components/spacing-sizes-control/utils.js.map +1 -1
  79. package/build/components/typewriter/index.js +0 -1
  80. package/build/components/typewriter/index.js.map +1 -1
  81. package/build/components/use-block-drop-zone/index.js +11 -2
  82. package/build/components/use-block-drop-zone/index.js.map +1 -1
  83. package/build/components/use-moving-animation/index.js +15 -2
  84. package/build/components/use-moving-animation/index.js.map +1 -1
  85. package/build/components/use-resize-canvas/index.js +1 -1
  86. package/build/components/use-resize-canvas/index.js.map +1 -1
  87. package/build/components/warning/index.js +2 -3
  88. package/build/components/warning/index.js.map +1 -1
  89. package/build/components/writing-flow/use-drag-selection.js +11 -0
  90. package/build/components/writing-flow/use-drag-selection.js.map +1 -1
  91. package/build/components/writing-flow/use-tab-nav.js +6 -2
  92. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  93. package/build/hooks/block-bindings.js +4 -3
  94. package/build/hooks/block-bindings.js.map +1 -1
  95. package/build/hooks/gap.js +1 -1
  96. package/build/hooks/gap.js.map +1 -1
  97. package/build/hooks/generated-class-name.js +0 -1
  98. package/build/hooks/generated-class-name.js.map +1 -1
  99. package/build/hooks/use-zoom-out.js +47 -14
  100. package/build/hooks/use-zoom-out.js.map +1 -1
  101. package/build/store/private-selectors.js +1 -7
  102. package/build/store/private-selectors.js.map +1 -1
  103. package/build/store/reducer.js +478 -2
  104. package/build/store/reducer.js.map +1 -1
  105. package/build/store/selectors.js +12 -55
  106. package/build/store/selectors.js.map +1 -1
  107. package/build/utils/object.js +0 -1
  108. package/build/utils/object.js.map +1 -1
  109. package/build-module/autocompleters/block.js +2 -4
  110. package/build-module/autocompleters/block.js.map +1 -1
  111. package/build-module/autocompleters/link.js +2 -4
  112. package/build-module/autocompleters/link.js.map +1 -1
  113. package/build-module/components/block-canvas/index.js +3 -6
  114. package/build-module/components/block-canvas/index.js.map +1 -1
  115. package/build-module/components/block-list/block.js +8 -7
  116. package/build-module/components/block-list/block.js.map +1 -1
  117. package/build-module/components/block-list/index.js +0 -1
  118. package/build-module/components/block-list/index.js.map +1 -1
  119. package/build-module/components/block-list/use-block-props/index.js +6 -2
  120. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  121. package/build-module/components/block-list/use-block-props/use-firefox-draggable-compatibility.js +80 -0
  122. package/build-module/components/block-list/use-block-props/use-firefox-draggable-compatibility.js.map +1 -0
  123. package/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js +97 -5
  124. package/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js.map +1 -1
  125. package/build-module/components/block-lock/modal.js +4 -4
  126. package/build-module/components/block-lock/modal.js.map +1 -1
  127. package/build-module/components/block-parent-selector/index.js +2 -15
  128. package/build-module/components/block-parent-selector/index.js.map +1 -1
  129. package/build-module/components/block-patterns-list/index.js +13 -4
  130. package/build-module/components/block-patterns-list/index.js.map +1 -1
  131. package/build-module/components/block-popover/inbetween.js +4 -0
  132. package/build-module/components/block-popover/inbetween.js.map +1 -1
  133. package/build-module/components/block-settings-menu/block-settings-dropdown.js +7 -4
  134. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  135. package/build-module/components/block-settings-menu-controls/index.js +1 -1
  136. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  137. package/build-module/components/block-switcher/index.js +13 -23
  138. package/build-module/components/block-switcher/index.js.map +1 -1
  139. package/build-module/components/block-switcher/use-transformed-patterns.js +0 -1
  140. package/build-module/components/block-switcher/use-transformed-patterns.js.map +1 -1
  141. package/build-module/components/block-switcher/utils.js +0 -1
  142. package/build-module/components/block-switcher/utils.js.map +1 -1
  143. package/build-module/components/block-toolbar/index.js +7 -6
  144. package/build-module/components/block-toolbar/index.js.map +1 -1
  145. package/build-module/components/block-variation-transforms/index.js +0 -1
  146. package/build-module/components/block-variation-transforms/index.js.map +1 -1
  147. package/build-module/components/date-format-picker/index.js +0 -1
  148. package/build-module/components/date-format-picker/index.js.map +1 -1
  149. package/build-module/components/font-appearance-control/index.js +1 -0
  150. package/build-module/components/font-appearance-control/index.js.map +1 -1
  151. package/build-module/components/font-family/index.js +10 -0
  152. package/build-module/components/font-family/index.js.map +1 -1
  153. package/build-module/components/global-styles/dimensions-panel.js +17 -16
  154. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  155. package/build-module/components/global-styles/get-global-styles-changes.js +0 -1
  156. package/build-module/components/global-styles/get-global-styles-changes.js.map +1 -1
  157. package/build-module/components/iframe/use-scale-canvas.js +68 -47
  158. package/build-module/components/iframe/use-scale-canvas.js.map +1 -1
  159. package/build-module/components/inserter/block-patterns-tab/index.js +1 -11
  160. package/build-module/components/inserter/block-patterns-tab/index.js.map +1 -1
  161. package/build-module/components/inserter/menu.js +2 -1
  162. package/build-module/components/inserter/menu.js.map +1 -1
  163. package/build-module/components/inserter-draggable-blocks/index.js +20 -11
  164. package/build-module/components/inserter-draggable-blocks/index.js.map +1 -1
  165. package/build-module/components/inspector-controls/slot.js +3 -14
  166. package/build-module/components/inspector-controls/slot.js.map +1 -1
  167. package/build-module/components/letter-spacing-control/index.js +9 -0
  168. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  169. package/build-module/components/line-height-control/index.js +1 -0
  170. package/build-module/components/line-height-control/index.js.map +1 -1
  171. package/build-module/components/media-placeholder/index.js +18 -18
  172. package/build-module/components/media-placeholder/index.js.map +1 -1
  173. package/build-module/components/multi-selection-inspector/index.js +9 -25
  174. package/build-module/components/multi-selection-inspector/index.js.map +1 -1
  175. package/build-module/components/observe-typing/index.js +0 -1
  176. package/build-module/components/observe-typing/index.js.map +1 -1
  177. package/build-module/components/recursion-provider/index.js +0 -1
  178. package/build-module/components/recursion-provider/index.js.map +1 -1
  179. package/build-module/components/rich-text/index.js +5 -1
  180. package/build-module/components/rich-text/index.js.map +1 -1
  181. package/build-module/components/rich-text/native/use-format-types.js +0 -1
  182. package/build-module/components/rich-text/native/use-format-types.js.map +1 -1
  183. package/build-module/components/rich-text/use-format-types.js +0 -1
  184. package/build-module/components/rich-text/use-format-types.js.map +1 -1
  185. package/build-module/components/spacing-sizes-control/utils.js +0 -1
  186. package/build-module/components/spacing-sizes-control/utils.js.map +1 -1
  187. package/build-module/components/typewriter/index.js +0 -1
  188. package/build-module/components/typewriter/index.js.map +1 -1
  189. package/build-module/components/use-block-drop-zone/index.js +11 -2
  190. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  191. package/build-module/components/use-moving-animation/index.js +15 -2
  192. package/build-module/components/use-moving-animation/index.js.map +1 -1
  193. package/build-module/components/use-resize-canvas/index.js +1 -1
  194. package/build-module/components/use-resize-canvas/index.js.map +1 -1
  195. package/build-module/components/warning/index.js +2 -3
  196. package/build-module/components/warning/index.js.map +1 -1
  197. package/build-module/components/writing-flow/use-drag-selection.js +11 -0
  198. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -1
  199. package/build-module/components/writing-flow/use-tab-nav.js +6 -2
  200. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  201. package/build-module/hooks/block-bindings.js +4 -3
  202. package/build-module/hooks/block-bindings.js.map +1 -1
  203. package/build-module/hooks/gap.js +1 -1
  204. package/build-module/hooks/gap.js.map +1 -1
  205. package/build-module/hooks/generated-class-name.js +0 -1
  206. package/build-module/hooks/generated-class-name.js.map +1 -1
  207. package/build-module/hooks/use-zoom-out.js +48 -15
  208. package/build-module/hooks/use-zoom-out.js.map +1 -1
  209. package/build-module/store/private-selectors.js +1 -6
  210. package/build-module/store/private-selectors.js.map +1 -1
  211. package/build-module/store/reducer.js +479 -3
  212. package/build-module/store/reducer.js.map +1 -1
  213. package/build-module/store/selectors.js +12 -55
  214. package/build-module/store/selectors.js.map +1 -1
  215. package/build-module/utils/object.js +0 -1
  216. package/build-module/utils/object.js.map +1 -1
  217. package/build-style/content-rtl.css +18 -5
  218. package/build-style/content.css +18 -5
  219. package/build-style/style-rtl.css +25 -64
  220. package/build-style/style.css +25 -64
  221. package/package.json +32 -32
  222. package/src/autocompleters/block.js +2 -4
  223. package/src/autocompleters/link.js +2 -4
  224. package/src/components/alignment-control/stories/aliginment-toolbar.story.js +47 -0
  225. package/src/components/alignment-control/stories/index.story.js +51 -0
  226. package/src/components/alignment-control/test/__snapshots__/index.js.snap +5 -5
  227. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +4 -4
  228. package/src/components/block-canvas/index.js +3 -5
  229. package/src/components/block-draggable/content.scss +11 -5
  230. package/src/components/block-list/block.js +7 -13
  231. package/src/components/block-list/content.scss +6 -0
  232. package/src/components/block-list/use-block-props/index.js +5 -0
  233. package/src/components/block-list/use-block-props/use-firefox-draggable-compatibility.js +83 -0
  234. package/src/components/block-list/use-block-props/use-selected-block-event-handlers.js +112 -8
  235. package/src/components/block-lock/modal.js +4 -6
  236. package/src/components/block-parent-selector/index.js +1 -19
  237. package/src/components/block-patterns-list/index.js +12 -1
  238. package/src/components/block-patterns-list/stories/fixtures.js +1 -0
  239. package/src/components/block-patterns-list/style.scss +16 -5
  240. package/src/components/block-popover/inbetween.js +4 -0
  241. package/src/components/block-settings-menu/block-settings-dropdown.js +6 -1
  242. package/src/components/block-settings-menu-controls/index.js +2 -1
  243. package/src/components/block-switcher/index.js +19 -21
  244. package/src/components/block-switcher/style.scss +0 -9
  245. package/src/components/block-title/test/index.js +2 -0
  246. package/src/components/block-toolbar/index.js +9 -6
  247. package/src/components/block-tools/style.scss +5 -0
  248. package/src/components/block-vertical-alignment-control/test/__snapshots__/index.js.snap +3 -3
  249. package/src/components/dimensions-tool/stories/aspect-ratio-tool.story.js +1 -1
  250. package/src/components/dimensions-tool/stories/index.story.js +1 -1
  251. package/src/components/dimensions-tool/stories/scale-tool.story.js +1 -1
  252. package/src/components/dimensions-tool/stories/width-height-tool.story.js +1 -1
  253. package/src/components/font-appearance-control/index.js +1 -0
  254. package/src/components/font-family/index.js +10 -0
  255. package/src/components/font-family/style.scss +5 -0
  256. package/src/components/global-styles/dimensions-panel.js +16 -16
  257. package/src/components/iframe/content.scss +6 -1
  258. package/src/components/iframe/use-scale-canvas.js +103 -81
  259. package/src/components/inserter/block-patterns-tab/index.js +1 -17
  260. package/src/components/inserter/menu.js +8 -1
  261. package/src/components/inserter-draggable-blocks/index.js +19 -29
  262. package/src/components/inspector-controls/slot.js +3 -22
  263. package/src/components/letter-spacing-control/README.md +2 -1
  264. package/src/components/letter-spacing-control/index.js +17 -0
  265. package/src/components/line-height-control/index.js +1 -0
  266. package/src/components/media-placeholder/index.js +25 -28
  267. package/src/components/multi-selection-inspector/index.js +17 -27
  268. package/src/components/multi-selection-inspector/style.scss +0 -12
  269. package/src/components/resolution-tool/stories/index.story.js +1 -1
  270. package/src/components/rich-text/index.js +5 -0
  271. package/src/components/spacing-sizes-control/style.scss +0 -29
  272. package/src/components/text-alignment-control/stories/index.story.js +1 -1
  273. package/src/components/use-block-drop-zone/index.js +18 -1
  274. package/src/components/use-moving-animation/index.js +15 -0
  275. package/src/components/use-resize-canvas/index.js +1 -1
  276. package/src/components/warning/index.js +3 -4
  277. package/src/components/warning/test/index.js +3 -1
  278. package/src/components/writing-flow/use-drag-selection.js +11 -0
  279. package/src/components/writing-flow/use-tab-nav.js +9 -6
  280. package/src/hooks/block-bindings.js +8 -4
  281. package/src/hooks/gap.js +1 -1
  282. package/src/hooks/use-zoom-out.js +48 -16
  283. package/src/store/private-selectors.js +2 -17
  284. package/src/store/reducer.js +639 -2
  285. package/src/store/selectors.js +19 -69
  286. package/src/store/test/private-selectors.js +1 -0
  287. package/src/store/test/reducer.js +849 -0
  288. package/src/store/test/selectors.js +4 -110
  289. package/src/style.scss +1 -0
  290. package/tsconfig.tsbuildinfo +1 -1
@@ -1,4 +1,3 @@
1
- /* wp:polyfill */
2
1
  "use strict";
3
2
 
4
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
@@ -37,6 +36,7 @@ exports.styleOverrides = styleOverrides;
37
36
  exports.template = template;
38
37
  exports.temporarilyEditingAsBlocks = temporarilyEditingAsBlocks;
39
38
  exports.temporarilyEditingFocusModeRevert = temporarilyEditingFocusModeRevert;
39
+ exports.withDerivedBlockEditingModes = withDerivedBlockEditingModes;
40
40
  exports.zoomLevel = zoomLevel;
41
41
  var _es = _interopRequireDefault(require("fast-deep-equal/es6"));
42
42
  var _compose = require("@wordpress/compose");
@@ -45,6 +45,8 @@ var _deprecated = _interopRequireDefault(require("@wordpress/deprecated"));
45
45
  var _blocks = require("@wordpress/blocks");
46
46
  var _defaults = require("./defaults");
47
47
  var _array = require("./array");
48
+ var _privateKeys = require("./private-keys");
49
+ var _lockUnlock = require("../lock-unlock");
48
50
  /**
49
51
  * External dependencies
50
52
  */
@@ -57,6 +59,9 @@ var _array = require("./array");
57
59
  * Internal dependencies
58
60
  */
59
61
 
62
+ const {
63
+ isContentBlock
64
+ } = (0, _lockUnlock.unlock)(_blocks.privateApis);
60
65
  const identity = x => x;
61
66
 
62
67
  /**
@@ -1941,6 +1946,477 @@ const combinedReducers = (0, _data.combineReducers)({
1941
1946
  hoveredBlockClientId,
1942
1947
  zoomLevel
1943
1948
  });
1949
+
1950
+ /**
1951
+ * Retrieves a block's tree structure, handling both controlled and uncontrolled inner blocks.
1952
+ *
1953
+ * @param {Object} state The current state object.
1954
+ * @param {string} clientId The client ID of the block to retrieve.
1955
+ *
1956
+ * @return {Object|undefined} The block tree object, or undefined if not found. For controlled blocks,
1957
+ * returns a merged tree with controlled inner blocks.
1958
+ */
1959
+ function getBlockTreeBlock(state, clientId) {
1960
+ if (clientId === '') {
1961
+ const rootBlock = state.blocks.tree.get(clientId);
1962
+ if (!rootBlock) {
1963
+ return;
1964
+ }
1965
+
1966
+ // Patch the root block to have a clientId property.
1967
+ // TODO - consider updating the blocks reducer so that the root block has this property.
1968
+ return {
1969
+ clientId: '',
1970
+ ...rootBlock
1971
+ };
1972
+ }
1973
+ if (!state.blocks.controlledInnerBlocks[clientId]) {
1974
+ return state.blocks.tree.get(clientId);
1975
+ }
1976
+ const controlledTree = state.blocks.tree.get(`controlled||${clientId}`);
1977
+ const regularTree = state.blocks.tree.get(clientId);
1978
+ return {
1979
+ ...regularTree,
1980
+ innerBlocks: controlledTree?.innerBlocks
1981
+ };
1982
+ }
1983
+
1984
+ /**
1985
+ * Recursively traverses through a block tree of a given block and executes a callback for each block.
1986
+ *
1987
+ * @param {Object} state The store state.
1988
+ * @param {string} clientId The clientId of the block to start traversing from.
1989
+ * @param {Function} callback Function to execute for each block encountered during traversal.
1990
+ * The callback receives the current block as its argument.
1991
+ */
1992
+ function traverseBlockTree(state, clientId, callback) {
1993
+ const parentTree = getBlockTreeBlock(state, clientId);
1994
+ if (!parentTree) {
1995
+ return;
1996
+ }
1997
+ callback(parentTree);
1998
+ if (!parentTree?.innerBlocks?.length) {
1999
+ return;
2000
+ }
2001
+ for (const block of parentTree?.innerBlocks) {
2002
+ traverseBlockTree(state, block.clientId, callback);
2003
+ }
2004
+ }
2005
+
2006
+ /**
2007
+ * Checks if a block has a parent in a list of client IDs, and if so returns the client ID of the parent.
2008
+ *
2009
+ * @param {Object} state The current state object.
2010
+ * @param {string} clientId The client ID of the block to search the parents of.
2011
+ * @param {Array} clientIds The client IDs of the blocks to check.
2012
+ *
2013
+ * @return {string|undefined} The client ID of the parent block if found, undefined otherwise.
2014
+ */
2015
+ function findParentInClientIdsList(state, clientId, clientIds) {
2016
+ let parent = state.blocks.parents.get(clientId);
2017
+ while (parent) {
2018
+ if (clientIds.includes(parent)) {
2019
+ return parent;
2020
+ }
2021
+ parent = state.blocks.parents.get(parent);
2022
+ }
2023
+ }
2024
+
2025
+ /**
2026
+ * Checks if a block has any bindings in its metadata attributes.
2027
+ *
2028
+ * @param {Object} block The block object to check for bindings.
2029
+ * @return {boolean} True if the block has bindings, false otherwise.
2030
+ */
2031
+ function hasBindings(block) {
2032
+ return block?.attributes?.metadata?.bindings && Object.keys(block?.attributes?.metadata?.bindings).length;
2033
+ }
2034
+
2035
+ /**
2036
+ * Computes and returns derived block editing modes for a given block tree.
2037
+ *
2038
+ * This function calculates the editing modes for each block in the tree, taking into account
2039
+ * various factors such as zoom level, navigation mode, sections, and synced patterns.
2040
+ *
2041
+ * @param {Object} state The current state object.
2042
+ * @param {boolean} isNavMode Whether the navigation mode is active.
2043
+ * @param {string} treeClientId The client ID of the root block for the tree. Defaults to an empty string.
2044
+ * @return {Map} A Map containing the derived block editing modes, keyed by block client ID.
2045
+ */
2046
+ function getDerivedBlockEditingModesForTree(state, isNavMode = false, treeClientId = '') {
2047
+ const isZoomedOut = state?.zoomLevel < 100 || state?.zoomLevel === 'auto-scaled';
2048
+ const derivedBlockEditingModes = new Map();
2049
+
2050
+ // When there are sections, the majority of blocks are disabled,
2051
+ // so the default block editing mode is set to disabled.
2052
+ const sectionRootClientId = state.settings?.[_privateKeys.sectionRootClientIdKey];
2053
+ const sectionClientIds = state.blocks.order.get(sectionRootClientId);
2054
+ const syncedPatternClientIds = Object.keys(state.blocks.controlledInnerBlocks).filter(clientId => state.blocks.byClientId?.get(clientId)?.name === 'core/block');
2055
+ traverseBlockTree(state, treeClientId, block => {
2056
+ const {
2057
+ clientId,
2058
+ name: blockName
2059
+ } = block;
2060
+ if (isZoomedOut || isNavMode) {
2061
+ // If the root block is the section root set its editing mode to contentOnly.
2062
+ if (clientId === sectionRootClientId) {
2063
+ derivedBlockEditingModes.set(clientId, 'contentOnly');
2064
+ return;
2065
+ }
2066
+
2067
+ // There are no sections, so everything else is disabled.
2068
+ if (!sectionClientIds?.length) {
2069
+ derivedBlockEditingModes.set(clientId, 'disabled');
2070
+ return;
2071
+ }
2072
+ if (sectionClientIds.includes(clientId)) {
2073
+ derivedBlockEditingModes.set(clientId, 'contentOnly');
2074
+ return;
2075
+ }
2076
+
2077
+ // If zoomed out, all blocks that aren't sections or the section root are
2078
+ // disabled.
2079
+ // If the tree root is not in a section, set its editing mode to disabled.
2080
+ if (isZoomedOut || !findParentInClientIdsList(state, clientId, sectionClientIds)) {
2081
+ derivedBlockEditingModes.set(clientId, 'disabled');
2082
+ return;
2083
+ }
2084
+
2085
+ // Handle synced pattern content so the inner blocks of a synced pattern are
2086
+ // properly disabled.
2087
+ if (syncedPatternClientIds.length) {
2088
+ const parentPatternClientId = findParentInClientIdsList(state, clientId, syncedPatternClientIds);
2089
+ if (parentPatternClientId) {
2090
+ // This is a pattern nested in another pattern, it should be disabled.
2091
+ if (findParentInClientIdsList(state, parentPatternClientId, syncedPatternClientIds)) {
2092
+ derivedBlockEditingModes.set(clientId, 'disabled');
2093
+ return;
2094
+ }
2095
+ if (hasBindings(block)) {
2096
+ derivedBlockEditingModes.set(clientId, 'contentOnly');
2097
+ return;
2098
+ }
2099
+
2100
+ // Synced pattern content without a binding isn't editable
2101
+ // from the instance, the user has to edit the pattern source,
2102
+ // so return 'disabled'.
2103
+ derivedBlockEditingModes.set(clientId, 'disabled');
2104
+ return;
2105
+ }
2106
+ }
2107
+ if (blockName && isContentBlock(blockName)) {
2108
+ derivedBlockEditingModes.set(clientId, 'contentOnly');
2109
+ return;
2110
+ }
2111
+ derivedBlockEditingModes.set(clientId, 'disabled');
2112
+ return;
2113
+ }
2114
+ if (syncedPatternClientIds.length) {
2115
+ // Synced pattern blocks (core/block).
2116
+ if (syncedPatternClientIds.includes(clientId)) {
2117
+ // This is a pattern nested in another pattern, it should be disabled.
2118
+ if (findParentInClientIdsList(state, clientId, syncedPatternClientIds)) {
2119
+ derivedBlockEditingModes.set(clientId, 'disabled');
2120
+ return;
2121
+ }
2122
+
2123
+ // Else do nothing, use the default block editing mode.
2124
+ return;
2125
+ }
2126
+
2127
+ // Inner blocks of synced patterns.
2128
+ const parentPatternClientId = findParentInClientIdsList(state, clientId, syncedPatternClientIds);
2129
+ if (parentPatternClientId) {
2130
+ // This is a pattern nested in another pattern, it should be disabled.
2131
+ if (findParentInClientIdsList(state, parentPatternClientId, syncedPatternClientIds)) {
2132
+ derivedBlockEditingModes.set(clientId, 'disabled');
2133
+ return;
2134
+ }
2135
+ if (hasBindings(block)) {
2136
+ derivedBlockEditingModes.set(clientId, 'contentOnly');
2137
+ return;
2138
+ }
2139
+
2140
+ // Synced pattern content without a binding isn't editable
2141
+ // from the instance, the user has to edit the pattern source,
2142
+ // so return 'disabled'.
2143
+ derivedBlockEditingModes.set(clientId, 'disabled');
2144
+ }
2145
+ }
2146
+ });
2147
+ return derivedBlockEditingModes;
2148
+ }
2149
+
2150
+ /**
2151
+ * Updates the derived block editing modes based on added and removed blocks.
2152
+ *
2153
+ * This function handles the updating of block editing modes when blocks are added,
2154
+ * removed, or moved within the editor.
2155
+ *
2156
+ * It only returns a value when modifications are made to the block editing modes.
2157
+ *
2158
+ * @param {Object} options The options for updating derived block editing modes.
2159
+ * @param {Object} options.prevState The previous state object.
2160
+ * @param {Object} options.nextState The next state object.
2161
+ * @param {Array} [options.addedBlocks] An array of blocks that were added.
2162
+ * @param {Array} [options.removedClientIds] An array of client IDs of blocks that were removed.
2163
+ * @param {boolean} [options.isNavMode] Whether the navigation mode is active.
2164
+ * @return {Map|undefined} The updated derived block editing modes, or undefined if no changes were made.
2165
+ */
2166
+ function getDerivedBlockEditingModesUpdates({
2167
+ prevState,
2168
+ nextState,
2169
+ addedBlocks,
2170
+ removedClientIds,
2171
+ isNavMode = false
2172
+ }) {
2173
+ const prevDerivedBlockEditingModes = isNavMode ? prevState.derivedNavModeBlockEditingModes : prevState.derivedBlockEditingModes;
2174
+ let nextDerivedBlockEditingModes;
2175
+
2176
+ // Perform removals before additions to handle cases like the `MOVE_BLOCKS_TO_POSITION` action.
2177
+ // That action removes a set of clientIds, but adds the same blocks back in a different location.
2178
+ // If removals were performed after additions, those moved clientIds would be removed incorrectly.
2179
+ removedClientIds?.forEach(clientId => {
2180
+ // The actions only receive parent block IDs for removal.
2181
+ // Recurse through the block tree to ensure all blocks are removed.
2182
+ // Specifically use the previous state, before the blocks were removed.
2183
+ traverseBlockTree(prevState, clientId, block => {
2184
+ if (prevDerivedBlockEditingModes.has(block.clientId)) {
2185
+ if (!nextDerivedBlockEditingModes) {
2186
+ nextDerivedBlockEditingModes = new Map(prevDerivedBlockEditingModes);
2187
+ }
2188
+ nextDerivedBlockEditingModes.delete(block.clientId);
2189
+ }
2190
+ });
2191
+ });
2192
+ addedBlocks?.forEach(addedBlock => {
2193
+ traverseBlockTree(nextState, addedBlock.clientId, block => {
2194
+ const updates = getDerivedBlockEditingModesForTree(nextState, isNavMode, block.clientId);
2195
+ if (updates.size) {
2196
+ if (!nextDerivedBlockEditingModes) {
2197
+ nextDerivedBlockEditingModes = new Map([...(prevDerivedBlockEditingModes?.size ? prevDerivedBlockEditingModes : []), ...updates]);
2198
+ } else {
2199
+ nextDerivedBlockEditingModes = new Map([...(nextDerivedBlockEditingModes?.size ? nextDerivedBlockEditingModes : []), ...updates]);
2200
+ }
2201
+ }
2202
+ });
2203
+ });
2204
+ return nextDerivedBlockEditingModes;
2205
+ }
2206
+
2207
+ /**
2208
+ * Higher-order reducer that adds derived block editing modes to the state.
2209
+ *
2210
+ * This function wraps a reducer and enhances it to handle actions that affect
2211
+ * block editing modes. It updates the derivedBlockEditingModes in the state
2212
+ * based on various actions such as adding, removing, or moving blocks, or changing
2213
+ * the editor mode.
2214
+ *
2215
+ * @param {Function} reducer The original reducer function to be wrapped.
2216
+ * @return {Function} A new reducer function that includes derived block editing modes handling.
2217
+ */
2218
+ function withDerivedBlockEditingModes(reducer) {
2219
+ return (state, action) => {
2220
+ var _state$derivedBlockEd, _state$derivedNavMode;
2221
+ const nextState = reducer(state, action);
2222
+
2223
+ // An exception is needed here to still recompute the block editing modes when
2224
+ // the editor mode changes since the editor mode isn't stored within the
2225
+ // block editor state and changing it won't trigger an altered new state.
2226
+ if (action.type !== 'SET_EDITOR_MODE' && nextState === state) {
2227
+ return state;
2228
+ }
2229
+ switch (action.type) {
2230
+ case 'REMOVE_BLOCKS':
2231
+ {
2232
+ const nextDerivedBlockEditingModes = getDerivedBlockEditingModesUpdates({
2233
+ prevState: state,
2234
+ nextState,
2235
+ removedClientIds: action.clientIds,
2236
+ isNavMode: false
2237
+ });
2238
+ const nextDerivedNavModeBlockEditingModes = getDerivedBlockEditingModesUpdates({
2239
+ prevState: state,
2240
+ nextState,
2241
+ removedClientIds: action.clientIds,
2242
+ isNavMode: true
2243
+ });
2244
+ if (nextDerivedBlockEditingModes || nextDerivedNavModeBlockEditingModes) {
2245
+ return {
2246
+ ...nextState,
2247
+ derivedBlockEditingModes: nextDerivedBlockEditingModes !== null && nextDerivedBlockEditingModes !== void 0 ? nextDerivedBlockEditingModes : state.derivedBlockEditingModes,
2248
+ derivedNavModeBlockEditingModes: nextDerivedNavModeBlockEditingModes !== null && nextDerivedNavModeBlockEditingModes !== void 0 ? nextDerivedNavModeBlockEditingModes : state.derivedNavModeBlockEditingModes
2249
+ };
2250
+ }
2251
+ break;
2252
+ }
2253
+ case 'RECEIVE_BLOCKS':
2254
+ case 'INSERT_BLOCKS':
2255
+ {
2256
+ const nextDerivedBlockEditingModes = getDerivedBlockEditingModesUpdates({
2257
+ prevState: state,
2258
+ nextState,
2259
+ addedBlocks: action.blocks,
2260
+ isNavMode: false
2261
+ });
2262
+ const nextDerivedNavModeBlockEditingModes = getDerivedBlockEditingModesUpdates({
2263
+ prevState: state,
2264
+ nextState,
2265
+ addedBlocks: action.blocks,
2266
+ isNavMode: true
2267
+ });
2268
+ if (nextDerivedBlockEditingModes || nextDerivedNavModeBlockEditingModes) {
2269
+ return {
2270
+ ...nextState,
2271
+ derivedBlockEditingModes: nextDerivedBlockEditingModes !== null && nextDerivedBlockEditingModes !== void 0 ? nextDerivedBlockEditingModes : state.derivedBlockEditingModes,
2272
+ derivedNavModeBlockEditingModes: nextDerivedNavModeBlockEditingModes !== null && nextDerivedNavModeBlockEditingModes !== void 0 ? nextDerivedNavModeBlockEditingModes : state.derivedNavModeBlockEditingModes
2273
+ };
2274
+ }
2275
+ break;
2276
+ }
2277
+ case 'SET_HAS_CONTROLLED_INNER_BLOCKS':
2278
+ {
2279
+ const updatedBlock = nextState.blocks.tree.get(action.clientId);
2280
+ // The block might have been removed.
2281
+ if (!updatedBlock) {
2282
+ break;
2283
+ }
2284
+ const nextDerivedBlockEditingModes = getDerivedBlockEditingModesUpdates({
2285
+ prevState: state,
2286
+ nextState,
2287
+ addedBlocks: [updatedBlock],
2288
+ isNavMode: false
2289
+ });
2290
+ const nextDerivedNavModeBlockEditingModes = getDerivedBlockEditingModesUpdates({
2291
+ prevState: state,
2292
+ nextState,
2293
+ addedBlocks: [updatedBlock],
2294
+ isNavMode: true
2295
+ });
2296
+ if (nextDerivedBlockEditingModes || nextDerivedNavModeBlockEditingModes) {
2297
+ return {
2298
+ ...nextState,
2299
+ derivedBlockEditingModes: nextDerivedBlockEditingModes !== null && nextDerivedBlockEditingModes !== void 0 ? nextDerivedBlockEditingModes : state.derivedBlockEditingModes,
2300
+ derivedNavModeBlockEditingModes: nextDerivedNavModeBlockEditingModes !== null && nextDerivedNavModeBlockEditingModes !== void 0 ? nextDerivedNavModeBlockEditingModes : state.derivedNavModeBlockEditingModes
2301
+ };
2302
+ }
2303
+ break;
2304
+ }
2305
+ case 'REPLACE_BLOCKS':
2306
+ {
2307
+ const nextDerivedBlockEditingModes = getDerivedBlockEditingModesUpdates({
2308
+ prevState: state,
2309
+ nextState,
2310
+ addedBlocks: action.blocks,
2311
+ removedClientIds: action.clientIds,
2312
+ isNavMode: false
2313
+ });
2314
+ const nextDerivedNavModeBlockEditingModes = getDerivedBlockEditingModesUpdates({
2315
+ prevState: state,
2316
+ nextState,
2317
+ addedBlocks: action.blocks,
2318
+ removedClientIds: action.clientIds,
2319
+ isNavMode: true
2320
+ });
2321
+ if (nextDerivedBlockEditingModes || nextDerivedNavModeBlockEditingModes) {
2322
+ return {
2323
+ ...nextState,
2324
+ derivedBlockEditingModes: nextDerivedBlockEditingModes !== null && nextDerivedBlockEditingModes !== void 0 ? nextDerivedBlockEditingModes : state.derivedBlockEditingModes,
2325
+ derivedNavModeBlockEditingModes: nextDerivedNavModeBlockEditingModes !== null && nextDerivedNavModeBlockEditingModes !== void 0 ? nextDerivedNavModeBlockEditingModes : state.derivedNavModeBlockEditingModes
2326
+ };
2327
+ }
2328
+ break;
2329
+ }
2330
+ case 'REPLACE_INNER_BLOCKS':
2331
+ {
2332
+ // Get the clientIds of the blocks that are being replaced
2333
+ // from the old state, before they were removed.
2334
+ const removedClientIds = state.blocks.order.get(action.rootClientId);
2335
+ const nextDerivedBlockEditingModes = getDerivedBlockEditingModesUpdates({
2336
+ prevState: state,
2337
+ nextState,
2338
+ addedBlocks: action.blocks,
2339
+ removedClientIds,
2340
+ isNavMode: false
2341
+ });
2342
+ const nextDerivedNavModeBlockEditingModes = getDerivedBlockEditingModesUpdates({
2343
+ prevState: state,
2344
+ nextState,
2345
+ addedBlocks: action.blocks,
2346
+ removedClientIds,
2347
+ isNavMode: true
2348
+ });
2349
+ if (nextDerivedBlockEditingModes || nextDerivedNavModeBlockEditingModes) {
2350
+ return {
2351
+ ...nextState,
2352
+ derivedBlockEditingModes: nextDerivedBlockEditingModes !== null && nextDerivedBlockEditingModes !== void 0 ? nextDerivedBlockEditingModes : state.derivedBlockEditingModes,
2353
+ derivedNavModeBlockEditingModes: nextDerivedNavModeBlockEditingModes !== null && nextDerivedNavModeBlockEditingModes !== void 0 ? nextDerivedNavModeBlockEditingModes : state.derivedNavModeBlockEditingModes
2354
+ };
2355
+ }
2356
+ break;
2357
+ }
2358
+ case 'MOVE_BLOCKS_TO_POSITION':
2359
+ {
2360
+ const addedBlocks = action.clientIds.map(clientId => {
2361
+ return nextState.blocks.byClientId.get(clientId);
2362
+ });
2363
+ const nextDerivedBlockEditingModes = getDerivedBlockEditingModesUpdates({
2364
+ prevState: state,
2365
+ nextState,
2366
+ addedBlocks,
2367
+ removedClientIds: action.clientIds,
2368
+ isNavMode: false
2369
+ });
2370
+ const nextDerivedNavModeBlockEditingModes = getDerivedBlockEditingModesUpdates({
2371
+ prevState: state,
2372
+ nextState,
2373
+ addedBlocks,
2374
+ removedClientIds: action.clientIds,
2375
+ isNavMode: true
2376
+ });
2377
+ if (nextDerivedBlockEditingModes || nextDerivedNavModeBlockEditingModes) {
2378
+ return {
2379
+ ...nextState,
2380
+ derivedBlockEditingModes: nextDerivedBlockEditingModes !== null && nextDerivedBlockEditingModes !== void 0 ? nextDerivedBlockEditingModes : state.derivedBlockEditingModes,
2381
+ derivedNavModeBlockEditingModes: nextDerivedNavModeBlockEditingModes !== null && nextDerivedNavModeBlockEditingModes !== void 0 ? nextDerivedNavModeBlockEditingModes : state.derivedNavModeBlockEditingModes
2382
+ };
2383
+ }
2384
+ break;
2385
+ }
2386
+ case 'UPDATE_SETTINGS':
2387
+ {
2388
+ // Recompute the entire tree if the section root changes.
2389
+ if (state?.settings?.[_privateKeys.sectionRootClientIdKey] !== nextState?.settings?.[_privateKeys.sectionRootClientIdKey]) {
2390
+ return {
2391
+ ...nextState,
2392
+ derivedBlockEditingModes: getDerivedBlockEditingModesForTree(nextState, false /* Nav mode off */),
2393
+ derivedNavModeBlockEditingModes: getDerivedBlockEditingModesForTree(nextState, true /* Nav mode on */)
2394
+ };
2395
+ }
2396
+ break;
2397
+ }
2398
+ case 'RESET_BLOCKS':
2399
+ case 'SET_EDITOR_MODE':
2400
+ case 'RESET_ZOOM_LEVEL':
2401
+ case 'SET_ZOOM_LEVEL':
2402
+ {
2403
+ // Recompute the entire tree if the editor mode or zoom level changes,
2404
+ // or if all the blocks are reset.
2405
+ return {
2406
+ ...nextState,
2407
+ derivedBlockEditingModes: getDerivedBlockEditingModesForTree(nextState, false /* Nav mode off */),
2408
+ derivedNavModeBlockEditingModes: getDerivedBlockEditingModesForTree(nextState, true /* Nav mode on */)
2409
+ };
2410
+ }
2411
+ }
2412
+
2413
+ // If there's no change, the derivedBlockEditingModes from the previous
2414
+ // state need to be preserved.
2415
+ nextState.derivedBlockEditingModes = (_state$derivedBlockEd = state?.derivedBlockEditingModes) !== null && _state$derivedBlockEd !== void 0 ? _state$derivedBlockEd : new Map();
2416
+ nextState.derivedNavModeBlockEditingModes = (_state$derivedNavMode = state?.derivedNavModeBlockEditingModes) !== null && _state$derivedNavMode !== void 0 ? _state$derivedNavMode : new Map();
2417
+ return nextState;
2418
+ };
2419
+ }
1944
2420
  function withAutomaticChangeReset(reducer) {
1945
2421
  return (state, action) => {
1946
2422
  const nextState = reducer(state, action);
@@ -1981,5 +2457,5 @@ function withAutomaticChangeReset(reducer) {
1981
2457
  };
1982
2458
  };
1983
2459
  }
1984
- var _default = exports.default = withAutomaticChangeReset(combinedReducers);
2460
+ var _default = exports.default = (0, _compose.pipe)(withDerivedBlockEditingModes, withAutomaticChangeReset)(combinedReducers);
1985
2461
  //# sourceMappingURL=reducer.js.map