@wordpress/block-editor 10.4.0 → 11.0.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 (638) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +0 -1
  3. package/build/autocompleters/block.js +2 -6
  4. package/build/autocompleters/block.js.map +1 -1
  5. package/build/autocompleters/link.js +2 -0
  6. package/build/autocompleters/link.js.map +1 -1
  7. package/build/components/block-card/index.js +51 -3
  8. package/build/components/block-card/index.js.map +1 -1
  9. package/build/components/block-draggable/index.native.js +46 -39
  10. package/build/components/block-draggable/index.native.js.map +1 -1
  11. package/build/components/block-edit/edit.js +4 -3
  12. package/build/components/block-edit/edit.js.map +1 -1
  13. package/build/components/block-edit/edit.native.js +4 -7
  14. package/build/components/block-edit/edit.native.js.map +1 -1
  15. package/build/components/block-inspector/index.js +35 -33
  16. package/build/components/block-inspector/index.js.map +1 -1
  17. package/build/components/block-list/block-list-context.native.js +5 -8
  18. package/build/components/block-list/block-list-context.native.js.map +1 -1
  19. package/build/components/block-list/block.js +55 -24
  20. package/build/components/block-list/block.js.map +1 -1
  21. package/build/components/block-list/block.native.js +61 -28
  22. package/build/components/block-list/block.native.js.map +1 -1
  23. package/build/components/block-lock/menu-item.js +1 -1
  24. package/build/components/block-lock/menu-item.js.map +1 -1
  25. package/build/components/block-lock/modal.js +16 -9
  26. package/build/components/block-lock/modal.js.map +1 -1
  27. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +12 -4
  28. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  29. package/build/components/block-pattern-setup/index.js +3 -2
  30. package/build/components/block-pattern-setup/index.js.map +1 -1
  31. package/build/components/block-patterns-list/index.js +33 -11
  32. package/build/components/block-patterns-list/index.js.map +1 -1
  33. package/build/components/block-preview/auto.js +9 -3
  34. package/build/components/block-preview/auto.js.map +1 -1
  35. package/build/components/block-preview/index.js +5 -9
  36. package/build/components/block-preview/index.js.map +1 -1
  37. package/build/components/block-settings-menu/block-settings-dropdown.js +5 -2
  38. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  39. package/build/components/block-styles/utils.js +3 -3
  40. package/build/components/block-styles/utils.js.map +1 -1
  41. package/build/components/block-switcher/index.js +19 -4
  42. package/build/components/block-switcher/index.js.map +1 -1
  43. package/build/components/block-toolbar/index.js +5 -1
  44. package/build/components/block-toolbar/index.js.map +1 -1
  45. package/build/components/block-tools/insertion-point.js +8 -49
  46. package/build/components/block-tools/insertion-point.js.map +1 -1
  47. package/build/components/block-tools/selected-block-popover.js +27 -4
  48. package/build/components/block-tools/selected-block-popover.js.map +1 -1
  49. package/build/components/block-variation-picker/index.js +1 -2
  50. package/build/components/block-variation-picker/index.js.map +1 -1
  51. package/build/components/colors/with-colors.js +4 -3
  52. package/build/components/colors/with-colors.js.map +1 -1
  53. package/build/components/font-sizes/fluid-utils.js +24 -40
  54. package/build/components/font-sizes/fluid-utils.js.map +1 -1
  55. package/build/components/font-sizes/with-font-sizes.js +7 -5
  56. package/build/components/font-sizes/with-font-sizes.js.map +1 -1
  57. package/build/components/height-control/index.js +115 -0
  58. package/build/components/height-control/index.js.map +1 -0
  59. package/build/components/iframe/index.js +11 -8
  60. package/build/components/iframe/index.js.map +1 -1
  61. package/build/components/image-editor/use-save-image.js +2 -0
  62. package/build/components/image-editor/use-save-image.js.map +1 -1
  63. package/build/components/image-editor/zoom-dropdown.js +1 -0
  64. package/build/components/image-editor/zoom-dropdown.js.map +1 -1
  65. package/build/components/index.js +18 -0
  66. package/build/components/index.js.map +1 -1
  67. package/build/components/inner-blocks/index.js +25 -9
  68. package/build/components/inner-blocks/index.js.map +1 -1
  69. package/build/components/inner-blocks/use-inner-block-template-sync.js +25 -10
  70. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  71. package/build/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  72. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  73. package/build/components/inserter/block-patterns-tab.js +25 -46
  74. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  75. package/build/components/inserter/block-types-tab.js +3 -1
  76. package/build/components/inserter/block-types-tab.js.map +1 -1
  77. package/build/components/inserter/hooks/use-debounced-input.js +27 -0
  78. package/build/components/inserter/hooks/use-debounced-input.js.map +1 -0
  79. package/build/components/inserter/index.js +8 -3
  80. package/build/components/inserter/index.js.map +1 -1
  81. package/build/components/inserter/index.native.js +3 -4
  82. package/build/components/inserter/index.native.js.map +1 -1
  83. package/build/components/inserter/media-tab/hooks.js +103 -0
  84. package/build/components/inserter/media-tab/hooks.js.map +1 -0
  85. package/build/components/inserter/media-tab/index.js +32 -0
  86. package/build/components/inserter/media-tab/index.js.map +1 -0
  87. package/build/components/inserter/media-tab/media-list.js +100 -0
  88. package/build/components/inserter/media-tab/media-list.js.map +1 -0
  89. package/build/components/inserter/media-tab/media-panel.js +96 -0
  90. package/build/components/inserter/media-tab/media-panel.js.map +1 -0
  91. package/build/components/inserter/media-tab/media-tab.js +120 -0
  92. package/build/components/inserter/media-tab/media-tab.js.map +1 -0
  93. package/build/components/inserter/media-tab/utils.js +54 -0
  94. package/build/components/inserter/media-tab/utils.js.map +1 -0
  95. package/build/components/inserter/menu.js +35 -12
  96. package/build/components/inserter/menu.js.map +1 -1
  97. package/build/components/inserter/mobile-tab-navigation.js +70 -0
  98. package/build/components/inserter/mobile-tab-navigation.js.map +1 -0
  99. package/build/components/inserter/quick-inserter.js +1 -0
  100. package/build/components/inserter/quick-inserter.js.map +1 -1
  101. package/build/components/inserter/reusable-blocks-tab.js +4 -1
  102. package/build/components/inserter/reusable-blocks-tab.js.map +1 -1
  103. package/build/components/inserter/search-results.js +3 -1
  104. package/build/components/inserter/search-results.js.map +1 -1
  105. package/build/components/inserter/tabs.js +16 -2
  106. package/build/components/inserter/tabs.js.map +1 -1
  107. package/build/components/inserter-list-item/index.js +4 -1
  108. package/build/components/inserter-list-item/index.js.map +1 -1
  109. package/build/components/inspector-controls/groups.js +2 -0
  110. package/build/components/inspector-controls/groups.js.map +1 -1
  111. package/build/components/inspector-controls-tabs/advanced-controls-panel.js +46 -0
  112. package/build/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -0
  113. package/build/components/inspector-controls-tabs/index.js +71 -0
  114. package/build/components/inspector-controls-tabs/index.js.map +1 -0
  115. package/build/components/inspector-controls-tabs/settings-tab.js +28 -0
  116. package/build/components/inspector-controls-tabs/settings-tab.js.map +1 -0
  117. package/build/components/inspector-controls-tabs/styles-tab.js +61 -0
  118. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -0
  119. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js +97 -0
  120. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -0
  121. package/build/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +18 -0
  122. package/build/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js.map +1 -0
  123. package/build/components/inspector-controls-tabs/utils.js +37 -0
  124. package/build/components/inspector-controls-tabs/utils.js.map +1 -0
  125. package/build/components/link-control/index.js +19 -34
  126. package/build/components/link-control/index.js.map +1 -1
  127. package/build/components/link-control/search-input.js +1 -2
  128. package/build/components/link-control/search-input.js.map +1 -1
  129. package/build/components/link-control/use-internal-input-value.js +26 -0
  130. package/build/components/link-control/use-internal-input-value.js.map +1 -0
  131. package/build/components/list-view/block.js +10 -5
  132. package/build/components/list-view/block.js.map +1 -1
  133. package/build/components/list-view/branch.js +22 -15
  134. package/build/components/list-view/branch.js.map +1 -1
  135. package/build/components/media-upload/index.native.js +2 -3
  136. package/build/components/media-upload/index.native.js.map +1 -1
  137. package/build/components/off-canvas-editor/appender.js +104 -0
  138. package/build/components/off-canvas-editor/appender.js.map +1 -0
  139. package/build/components/off-canvas-editor/block-contents.js +100 -0
  140. package/build/components/off-canvas-editor/block-contents.js.map +1 -0
  141. package/build/components/off-canvas-editor/block-edit-button.js +50 -0
  142. package/build/components/off-canvas-editor/block-edit-button.js.map +1 -0
  143. package/build/components/off-canvas-editor/block-select-button.js +119 -0
  144. package/build/components/off-canvas-editor/block-select-button.js.map +1 -0
  145. package/build/components/off-canvas-editor/block.js +324 -0
  146. package/build/components/off-canvas-editor/block.js.map +1 -0
  147. package/build/components/off-canvas-editor/branch.js +179 -0
  148. package/build/components/off-canvas-editor/branch.js.map +1 -0
  149. package/build/components/off-canvas-editor/context.js +19 -0
  150. package/build/components/off-canvas-editor/context.js.map +1 -0
  151. package/build/components/off-canvas-editor/drop-indicator.js +118 -0
  152. package/build/components/off-canvas-editor/drop-indicator.js.map +1 -0
  153. package/build/components/off-canvas-editor/expander.js +41 -0
  154. package/build/components/off-canvas-editor/expander.js.map +1 -0
  155. package/build/components/off-canvas-editor/index.js +213 -0
  156. package/build/components/off-canvas-editor/index.js.map +1 -0
  157. package/build/components/off-canvas-editor/leaf.js +60 -0
  158. package/build/components/off-canvas-editor/leaf.js.map +1 -0
  159. package/build/components/off-canvas-editor/link-ui.js +185 -0
  160. package/build/components/off-canvas-editor/link-ui.js.map +1 -0
  161. package/build/components/off-canvas-editor/update-attributes.js +108 -0
  162. package/build/components/off-canvas-editor/update-attributes.js.map +1 -0
  163. package/build/components/off-canvas-editor/use-block-selection.js +139 -0
  164. package/build/components/off-canvas-editor/use-block-selection.js.map +1 -0
  165. package/build/components/off-canvas-editor/use-list-view-client-ids.js +33 -0
  166. package/build/components/off-canvas-editor/use-list-view-client-ids.js.map +1 -0
  167. package/build/components/off-canvas-editor/use-list-view-drop-zone.js +235 -0
  168. package/build/components/off-canvas-editor/use-list-view-drop-zone.js.map +1 -0
  169. package/build/components/off-canvas-editor/use-list-view-expand-selected-item.js +60 -0
  170. package/build/components/off-canvas-editor/use-list-view-expand-selected-item.js.map +1 -0
  171. package/build/components/off-canvas-editor/utils.js +60 -0
  172. package/build/components/off-canvas-editor/utils.js.map +1 -0
  173. package/build/components/rich-text/format-toolbar/index.js +8 -4
  174. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  175. package/build/components/rich-text/index.js +3 -3
  176. package/build/components/rich-text/index.js.map +1 -1
  177. package/build/components/rich-text/index.native.js +0 -2
  178. package/build/components/rich-text/index.native.js.map +1 -1
  179. package/build/components/rich-text/use-insert-replacement-text.js +43 -0
  180. package/build/components/rich-text/use-insert-replacement-text.js.map +1 -0
  181. package/build/components/rich-text/use-undo-automatic-change.js +9 -1
  182. package/build/components/rich-text/use-undo-automatic-change.js.map +1 -1
  183. package/build/components/rich-text/utils.js +1 -19
  184. package/build/components/rich-text/utils.js.map +1 -1
  185. package/build/components/spacing-sizes-control/spacing-input-control.js +12 -3
  186. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  187. package/build/components/ungroup-button/index.native.js +4 -2
  188. package/build/components/ungroup-button/index.native.js.map +1 -1
  189. package/build/components/url-input/index.js +46 -43
  190. package/build/components/url-input/index.js.map +1 -1
  191. package/build/components/url-popover/index.js +31 -2
  192. package/build/components/url-popover/index.js.map +1 -1
  193. package/build/components/use-block-display-information/index.js +8 -4
  194. package/build/components/use-block-display-information/index.js.map +1 -1
  195. package/build/components/use-setting/index.js +10 -2
  196. package/build/components/use-setting/index.js.map +1 -1
  197. package/build/hooks/child-layout.js +209 -0
  198. package/build/hooks/child-layout.js.map +1 -0
  199. package/build/hooks/color-panel.js +17 -1
  200. package/build/hooks/color-panel.js.map +1 -1
  201. package/build/hooks/color.js +1 -1
  202. package/build/hooks/color.js.map +1 -1
  203. package/build/hooks/content-lock-ui.js +14 -7
  204. package/build/hooks/content-lock-ui.js.map +1 -1
  205. package/build/hooks/dimensions.js +65 -16
  206. package/build/hooks/dimensions.js.map +1 -1
  207. package/build/hooks/layout.js +59 -3
  208. package/build/hooks/layout.js.map +1 -1
  209. package/build/hooks/margin.js +4 -2
  210. package/build/hooks/margin.js.map +1 -1
  211. package/build/hooks/min-height.js +139 -0
  212. package/build/hooks/min-height.js.map +1 -0
  213. package/build/hooks/padding.js +4 -2
  214. package/build/hooks/padding.js.map +1 -1
  215. package/build/hooks/style.js +3 -2
  216. package/build/hooks/style.js.map +1 -1
  217. package/build/layouts/flex.js +22 -21
  218. package/build/layouts/flex.js.map +1 -1
  219. package/build/store/actions.js +26 -0
  220. package/build/store/actions.js.map +1 -1
  221. package/build/store/reducer.js +420 -265
  222. package/build/store/reducer.js.map +1 -1
  223. package/build/store/selectors.js +73 -49
  224. package/build/store/selectors.js.map +1 -1
  225. package/build/utils/sorting.js +63 -0
  226. package/build/utils/sorting.js.map +1 -0
  227. package/build-module/autocompleters/block.js +2 -6
  228. package/build-module/autocompleters/block.js.map +1 -1
  229. package/build-module/autocompleters/link.js +2 -0
  230. package/build-module/autocompleters/link.js.map +1 -1
  231. package/build-module/components/block-card/index.js +45 -3
  232. package/build-module/components/block-card/index.js.map +1 -1
  233. package/build-module/components/block-draggable/index.native.js +40 -31
  234. package/build-module/components/block-draggable/index.native.js.map +1 -1
  235. package/build-module/components/block-edit/edit.js +4 -2
  236. package/build-module/components/block-edit/edit.js.map +1 -1
  237. package/build-module/components/block-edit/edit.native.js +4 -6
  238. package/build-module/components/block-edit/edit.native.js.map +1 -1
  239. package/build-module/components/block-inspector/index.js +32 -30
  240. package/build-module/components/block-inspector/index.js.map +1 -1
  241. package/build-module/components/block-list/block-list-context.native.js +5 -8
  242. package/build-module/components/block-list/block-list-context.native.js.map +1 -1
  243. package/build-module/components/block-list/block.js +55 -25
  244. package/build-module/components/block-list/block.js.map +1 -1
  245. package/build-module/components/block-list/block.native.js +61 -28
  246. package/build-module/components/block-list/block.native.js.map +1 -1
  247. package/build-module/components/block-lock/menu-item.js +2 -2
  248. package/build-module/components/block-lock/menu-item.js.map +1 -1
  249. package/build-module/components/block-lock/modal.js +17 -10
  250. package/build-module/components/block-lock/modal.js.map +1 -1
  251. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +13 -6
  252. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  253. package/build-module/components/block-pattern-setup/index.js +3 -2
  254. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  255. package/build-module/components/block-patterns-list/index.js +35 -13
  256. package/build-module/components/block-patterns-list/index.js.map +1 -1
  257. package/build-module/components/block-preview/auto.js +9 -3
  258. package/build-module/components/block-preview/auto.js.map +1 -1
  259. package/build-module/components/block-preview/index.js +5 -8
  260. package/build-module/components/block-preview/index.js.map +1 -1
  261. package/build-module/components/block-settings-menu/block-settings-dropdown.js +5 -2
  262. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  263. package/build-module/components/block-styles/utils.js +3 -3
  264. package/build-module/components/block-styles/utils.js.map +1 -1
  265. package/build-module/components/block-switcher/index.js +19 -4
  266. package/build-module/components/block-switcher/index.js.map +1 -1
  267. package/build-module/components/block-toolbar/index.js +6 -2
  268. package/build-module/components/block-toolbar/index.js.map +1 -1
  269. package/build-module/components/block-tools/insertion-point.js +8 -49
  270. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  271. package/build-module/components/block-tools/selected-block-popover.js +27 -5
  272. package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
  273. package/build-module/components/block-variation-picker/index.js +1 -2
  274. package/build-module/components/block-variation-picker/index.js.map +1 -1
  275. package/build-module/components/colors/with-colors.js +5 -4
  276. package/build-module/components/colors/with-colors.js.map +1 -1
  277. package/build-module/components/font-sizes/fluid-utils.js +24 -40
  278. package/build-module/components/font-sizes/fluid-utils.js.map +1 -1
  279. package/build-module/components/font-sizes/with-font-sizes.js +8 -6
  280. package/build-module/components/font-sizes/with-font-sizes.js.map +1 -1
  281. package/build-module/components/height-control/index.js +103 -0
  282. package/build-module/components/height-control/index.js.map +1 -0
  283. package/build-module/components/iframe/index.js +11 -8
  284. package/build-module/components/iframe/index.js.map +1 -1
  285. package/build-module/components/image-editor/use-save-image.js +2 -0
  286. package/build-module/components/image-editor/use-save-image.js.map +1 -1
  287. package/build-module/components/image-editor/zoom-dropdown.js +1 -0
  288. package/build-module/components/image-editor/zoom-dropdown.js.map +1 -1
  289. package/build-module/components/index.js +2 -0
  290. package/build-module/components/index.js.map +1 -1
  291. package/build-module/components/inner-blocks/index.js +27 -11
  292. package/build-module/components/inner-blocks/index.js.map +1 -1
  293. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +23 -10
  294. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  295. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  296. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -1
  297. package/build-module/components/inserter/block-patterns-tab.js +27 -49
  298. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  299. package/build-module/components/inserter/block-types-tab.js +3 -2
  300. package/build-module/components/inserter/block-types-tab.js.map +1 -1
  301. package/build-module/components/inserter/hooks/use-debounced-input.js +18 -0
  302. package/build-module/components/inserter/hooks/use-debounced-input.js.map +1 -0
  303. package/build-module/components/inserter/index.js +8 -3
  304. package/build-module/components/inserter/index.js.map +1 -1
  305. package/build-module/components/inserter/index.native.js +3 -5
  306. package/build-module/components/inserter/index.native.js.map +1 -1
  307. package/build-module/components/inserter/media-tab/hooks.js +89 -0
  308. package/build-module/components/inserter/media-tab/hooks.js.map +1 -0
  309. package/build-module/components/inserter/media-tab/index.js +4 -0
  310. package/build-module/components/inserter/media-tab/index.js.map +1 -0
  311. package/build-module/components/inserter/media-tab/media-list.js +86 -0
  312. package/build-module/components/inserter/media-tab/media-list.js.map +1 -0
  313. package/build-module/components/inserter/media-tab/media-panel.js +77 -0
  314. package/build-module/components/inserter/media-tab/media-panel.js.map +1 -0
  315. package/build-module/components/inserter/media-tab/media-tab.js +100 -0
  316. package/build-module/components/inserter/media-tab/media-tab.js.map +1 -0
  317. package/build-module/components/inserter/media-tab/utils.js +45 -0
  318. package/build-module/components/inserter/media-tab/utils.js.map +1 -0
  319. package/build-module/components/inserter/menu.js +33 -12
  320. package/build-module/components/inserter/menu.js.map +1 -1
  321. package/build-module/components/inserter/mobile-tab-navigation.js +61 -0
  322. package/build-module/components/inserter/mobile-tab-navigation.js.map +1 -0
  323. package/build-module/components/inserter/quick-inserter.js +1 -0
  324. package/build-module/components/inserter/quick-inserter.js.map +1 -1
  325. package/build-module/components/inserter/reusable-blocks-tab.js +3 -1
  326. package/build-module/components/inserter/reusable-blocks-tab.js.map +1 -1
  327. package/build-module/components/inserter/search-results.js +3 -2
  328. package/build-module/components/inserter/search-results.js.map +1 -1
  329. package/build-module/components/inserter/tabs.js +15 -2
  330. package/build-module/components/inserter/tabs.js.map +1 -1
  331. package/build-module/components/inserter-list-item/index.js +5 -2
  332. package/build-module/components/inserter-list-item/index.js.map +1 -1
  333. package/build-module/components/inspector-controls/groups.js +2 -0
  334. package/build-module/components/inspector-controls/groups.js.map +1 -1
  335. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js +32 -0
  336. package/build-module/components/inspector-controls-tabs/advanced-controls-panel.js.map +1 -0
  337. package/build-module/components/inspector-controls-tabs/index.js +56 -0
  338. package/build-module/components/inspector-controls-tabs/index.js.map +1 -0
  339. package/build-module/components/inspector-controls-tabs/settings-tab.js +17 -0
  340. package/build-module/components/inspector-controls-tabs/settings-tab.js.map +1 -0
  341. package/build-module/components/inspector-controls-tabs/styles-tab.js +46 -0
  342. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -0
  343. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js +81 -0
  344. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.js.map +1 -0
  345. package/build-module/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +8 -0
  346. package/build-module/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js.map +1 -0
  347. package/build-module/components/inspector-controls-tabs/utils.js +26 -0
  348. package/build-module/components/inspector-controls-tabs/utils.js.map +1 -0
  349. package/build-module/components/link-control/index.js +18 -34
  350. package/build-module/components/link-control/index.js.map +1 -1
  351. package/build-module/components/link-control/search-input.js +1 -2
  352. package/build-module/components/link-control/search-input.js.map +1 -1
  353. package/build-module/components/link-control/use-internal-input-value.js +18 -0
  354. package/build-module/components/link-control/use-internal-input-value.js.map +1 -0
  355. package/build-module/components/list-view/block.js +10 -5
  356. package/build-module/components/list-view/block.js.map +1 -1
  357. package/build-module/components/list-view/branch.js +21 -14
  358. package/build-module/components/list-view/branch.js.map +1 -1
  359. package/build-module/components/media-upload/index.native.js +2 -4
  360. package/build-module/components/media-upload/index.native.js.map +1 -1
  361. package/build-module/components/off-canvas-editor/appender.js +89 -0
  362. package/build-module/components/off-canvas-editor/appender.js.map +1 -0
  363. package/build-module/components/off-canvas-editor/block-contents.js +85 -0
  364. package/build-module/components/off-canvas-editor/block-contents.js.map +1 -0
  365. package/build-module/components/off-canvas-editor/block-edit-button.js +35 -0
  366. package/build-module/components/off-canvas-editor/block-edit-button.js.map +1 -0
  367. package/build-module/components/off-canvas-editor/block-select-button.js +101 -0
  368. package/build-module/components/off-canvas-editor/block-select-button.js.map +1 -0
  369. package/build-module/components/off-canvas-editor/block.js +298 -0
  370. package/build-module/components/off-canvas-editor/block.js.map +1 -0
  371. package/build-module/components/off-canvas-editor/branch.js +164 -0
  372. package/build-module/components/off-canvas-editor/branch.js.map +1 -0
  373. package/build-module/components/off-canvas-editor/context.js +7 -0
  374. package/build-module/components/off-canvas-editor/context.js.map +1 -0
  375. package/build-module/components/off-canvas-editor/drop-indicator.js +111 -0
  376. package/build-module/components/off-canvas-editor/drop-indicator.js.map +1 -0
  377. package/build-module/components/off-canvas-editor/expander.js +32 -0
  378. package/build-module/components/off-canvas-editor/expander.js.map +1 -0
  379. package/build-module/components/off-canvas-editor/index.js +189 -0
  380. package/build-module/components/off-canvas-editor/index.js.map +1 -0
  381. package/build-module/components/off-canvas-editor/leaf.js +45 -0
  382. package/build-module/components/off-canvas-editor/leaf.js.map +1 -0
  383. package/build-module/components/off-canvas-editor/link-ui.js +165 -0
  384. package/build-module/components/off-canvas-editor/link-ui.js.map +1 -0
  385. package/build-module/components/off-canvas-editor/update-attributes.js +97 -0
  386. package/build-module/components/off-canvas-editor/update-attributes.js.map +1 -0
  387. package/build-module/components/off-canvas-editor/use-block-selection.js +124 -0
  388. package/build-module/components/off-canvas-editor/use-block-selection.js.map +1 -0
  389. package/build-module/components/off-canvas-editor/use-list-view-client-ids.js +24 -0
  390. package/build-module/components/off-canvas-editor/use-list-view-client-ids.js.map +1 -0
  391. package/build-module/components/off-canvas-editor/use-list-view-drop-zone.js +220 -0
  392. package/build-module/components/off-canvas-editor/use-list-view-drop-zone.js.map +1 -0
  393. package/build-module/components/off-canvas-editor/use-list-view-expand-selected-item.js +50 -0
  394. package/build-module/components/off-canvas-editor/use-list-view-expand-selected-item.js.map +1 -0
  395. package/build-module/components/off-canvas-editor/utils.js +44 -0
  396. package/build-module/components/off-canvas-editor/utils.js.map +1 -0
  397. package/build-module/components/rich-text/format-toolbar/index.js +6 -2
  398. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  399. package/build-module/components/rich-text/index.js +2 -3
  400. package/build-module/components/rich-text/index.js.map +1 -1
  401. package/build-module/components/rich-text/index.native.js +0 -2
  402. package/build-module/components/rich-text/index.native.js.map +1 -1
  403. package/build-module/components/rich-text/use-insert-replacement-text.js +33 -0
  404. package/build-module/components/rich-text/use-insert-replacement-text.js.map +1 -0
  405. package/build-module/components/rich-text/use-undo-automatic-change.js +9 -1
  406. package/build-module/components/rich-text/use-undo-automatic-change.js.map +1 -1
  407. package/build-module/components/rich-text/utils.js +1 -16
  408. package/build-module/components/rich-text/utils.js.map +1 -1
  409. package/build-module/components/spacing-sizes-control/spacing-input-control.js +12 -3
  410. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  411. package/build-module/components/ungroup-button/index.native.js +3 -2
  412. package/build-module/components/ungroup-button/index.native.js.map +1 -1
  413. package/build-module/components/url-input/index.js +46 -43
  414. package/build-module/components/url-input/index.js.map +1 -1
  415. package/build-module/components/url-popover/index.js +30 -3
  416. package/build-module/components/url-popover/index.js.map +1 -1
  417. package/build-module/components/use-block-display-information/index.js +9 -5
  418. package/build-module/components/use-block-display-information/index.js.map +1 -1
  419. package/build-module/components/use-setting/index.js +9 -2
  420. package/build-module/components/use-setting/index.js.map +1 -1
  421. package/build-module/hooks/child-layout.js +189 -0
  422. package/build-module/hooks/child-layout.js.map +1 -0
  423. package/build-module/hooks/color-panel.js +17 -1
  424. package/build-module/hooks/color-panel.js.map +1 -1
  425. package/build-module/hooks/color.js +1 -1
  426. package/build-module/hooks/color.js.map +1 -1
  427. package/build-module/hooks/content-lock-ui.js +16 -9
  428. package/build-module/hooks/content-lock-ui.js.map +1 -1
  429. package/build-module/hooks/dimensions.js +60 -16
  430. package/build-module/hooks/dimensions.js.map +1 -1
  431. package/build-module/hooks/layout.js +57 -2
  432. package/build-module/hooks/layout.js.map +1 -1
  433. package/build-module/hooks/margin.js +4 -2
  434. package/build-module/hooks/margin.js.map +1 -1
  435. package/build-module/hooks/min-height.js +116 -0
  436. package/build-module/hooks/min-height.js.map +1 -0
  437. package/build-module/hooks/padding.js +4 -2
  438. package/build-module/hooks/padding.js.map +1 -1
  439. package/build-module/hooks/style.js +4 -3
  440. package/build-module/hooks/style.js.map +1 -1
  441. package/build-module/layouts/flex.js +23 -22
  442. package/build-module/layouts/flex.js.map +1 -1
  443. package/build-module/store/actions.js +22 -0
  444. package/build-module/store/actions.js.map +1 -1
  445. package/build-module/store/reducer.js +415 -265
  446. package/build-module/store/reducer.js.map +1 -1
  447. package/build-module/store/selectors.js +66 -48
  448. package/build-module/store/selectors.js.map +1 -1
  449. package/build-module/utils/sorting.js +56 -0
  450. package/build-module/utils/sorting.js.map +1 -0
  451. package/build-style/content-rtl.css +701 -0
  452. package/build-style/content.css +701 -0
  453. package/build-style/default-editor-styles-rtl.css +14 -0
  454. package/build-style/default-editor-styles.css +14 -0
  455. package/build-style/style-rtl.css +305 -668
  456. package/build-style/style.css +305 -668
  457. package/package.json +32 -30
  458. package/src/autocompleters/block.js +2 -6
  459. package/src/autocompleters/link.js +2 -0
  460. package/src/components/alignment-control/README.md +1 -1
  461. package/src/components/alignment-control/test/index.js +4 -1
  462. package/src/components/block-alignment-control/test/index.js +4 -1
  463. package/src/components/block-alignment-control/test/index.native.js +4 -4
  464. package/src/components/block-card/index.js +46 -2
  465. package/src/components/block-card/style.scss +4 -0
  466. package/src/components/block-content-overlay/{style.scss → content.scss} +7 -1
  467. package/src/components/block-draggable/content.scss +20 -0
  468. package/src/components/block-draggable/index.native.js +54 -40
  469. package/src/components/block-draggable/style.scss +0 -21
  470. package/src/components/block-draggable/test/helpers.native.js +7 -9
  471. package/src/components/block-draggable/test/index.native.js +35 -45
  472. package/src/components/block-edit/edit.js +5 -2
  473. package/src/components/block-edit/edit.native.js +5 -6
  474. package/src/components/block-inspector/index.js +96 -81
  475. package/src/components/block-inspector/style.scss +9 -1
  476. package/src/components/block-list/block-list-context.native.js +5 -8
  477. package/src/components/block-list/block.js +74 -23
  478. package/src/components/block-list/block.native.js +78 -23
  479. package/src/components/block-list/{style.scss → content.scss} +11 -20
  480. package/src/components/block-list-appender/{style.scss → content.scss} +0 -0
  481. package/src/components/block-lock/menu-item.js +5 -2
  482. package/src/components/block-lock/modal.js +19 -36
  483. package/src/components/block-lock/style.scss +8 -17
  484. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +24 -6
  485. package/src/components/block-mover/style.scss +0 -1
  486. package/src/components/block-mover/test/__snapshots__/index.native.js.snap +0 -2
  487. package/src/components/block-pattern-setup/index.js +2 -1
  488. package/src/components/block-patterns-list/index.js +47 -24
  489. package/src/components/block-popover/style.scss +1 -1
  490. package/src/components/block-preview/README.md +15 -10
  491. package/src/components/block-preview/auto.js +7 -1
  492. package/src/components/block-preview/content.scss +4 -0
  493. package/src/components/block-preview/index.js +7 -12
  494. package/src/components/block-preview/style.scss +0 -7
  495. package/src/components/block-preview/test/index.js +18 -35
  496. package/src/components/block-selection-clearer/test/index.js +12 -12
  497. package/src/components/block-settings-menu/block-settings-dropdown.js +32 -20
  498. package/src/components/block-styles/utils.js +3 -3
  499. package/src/components/block-switcher/index.js +19 -4
  500. package/src/components/block-switcher/test/index.js +4 -0
  501. package/src/components/block-toolbar/index.js +12 -5
  502. package/src/components/block-toolbar/style.scss +10 -0
  503. package/src/components/block-tools/insertion-point.js +3 -47
  504. package/src/components/block-tools/selected-block-popover.js +80 -34
  505. package/src/components/block-tools/style.scss +27 -5
  506. package/src/components/block-variation-picker/index.js +1 -4
  507. package/src/components/block-vertical-alignment-control/test/index.js +4 -1
  508. package/src/components/colors/with-colors.js +13 -23
  509. package/src/components/default-block-appender/{style.scss → content.scss} +1 -0
  510. package/src/components/font-sizes/fluid-utils.js +37 -64
  511. package/src/components/font-sizes/test/fluid-utils.js +5 -5
  512. package/src/components/font-sizes/with-font-sizes.js +14 -11
  513. package/src/components/height-control/index.js +123 -0
  514. package/src/components/height-control/stories/index.js +21 -0
  515. package/src/components/height-control/style.scss +5 -0
  516. package/src/components/iframe/index.js +25 -18
  517. package/src/components/image-editor/use-save-image.js +2 -0
  518. package/src/components/image-editor/zoom-dropdown.js +1 -0
  519. package/src/components/index.js +2 -0
  520. package/src/components/inner-blocks/{style.scss → content.scss} +0 -0
  521. package/src/components/inner-blocks/index.js +30 -10
  522. package/src/components/inner-blocks/use-inner-block-template-sync.js +28 -10
  523. package/src/components/inserter/block-patterns-explorer/sidebar.js +1 -0
  524. package/src/components/inserter/block-patterns-tab.js +28 -71
  525. package/src/components/inserter/block-types-tab.js +3 -2
  526. package/src/components/inserter/hooks/use-debounced-input.js +17 -0
  527. package/src/components/inserter/index.js +10 -2
  528. package/src/components/inserter/index.native.js +1 -1
  529. package/src/components/inserter/media-tab/hooks.js +88 -0
  530. package/src/components/inserter/media-tab/index.js +3 -0
  531. package/src/components/inserter/media-tab/media-list.js +93 -0
  532. package/src/components/inserter/media-tab/media-panel.js +83 -0
  533. package/src/components/inserter/media-tab/media-tab.js +135 -0
  534. package/src/components/inserter/media-tab/utils.js +37 -0
  535. package/src/components/inserter/menu.js +55 -13
  536. package/src/components/inserter/mobile-tab-navigation.js +85 -0
  537. package/src/components/inserter/quick-inserter.js +1 -0
  538. package/src/components/inserter/reusable-blocks-tab.js +4 -2
  539. package/src/components/inserter/search-results.js +3 -2
  540. package/src/components/inserter/stories/index.js +1 -1
  541. package/src/components/inserter/stories/{fixtures.js → utils/fixtures.js} +0 -0
  542. package/src/components/inserter/style.scss +184 -18
  543. package/src/components/inserter/tabs.js +12 -1
  544. package/src/components/inserter/test/reusable-blocks-tab.js +14 -57
  545. package/src/components/inserter-list-item/index.js +11 -1
  546. package/src/components/inserter-list-item/style.scss +26 -0
  547. package/src/components/inspector-controls/groups.js +2 -0
  548. package/src/components/inspector-controls-tabs/advanced-controls-panel.js +37 -0
  549. package/src/components/inspector-controls-tabs/index.js +62 -0
  550. package/src/components/inspector-controls-tabs/settings-tab.js +18 -0
  551. package/src/components/inspector-controls-tabs/styles-tab.js +51 -0
  552. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +89 -0
  553. package/src/components/inspector-controls-tabs/use-is-list-view-tab-disabled.js +9 -0
  554. package/src/components/inspector-controls-tabs/utils.js +28 -0
  555. package/src/components/line-height-control/test/index.js +5 -5
  556. package/src/components/link-control/README.md +1 -1
  557. package/src/components/link-control/index.js +24 -39
  558. package/src/components/link-control/search-input.js +1 -2
  559. package/src/components/link-control/test/index.js +400 -582
  560. package/src/components/link-control/use-internal-input-value.js +22 -0
  561. package/src/components/list-view/block.js +7 -3
  562. package/src/components/list-view/branch.js +21 -14
  563. package/src/components/list-view/style.scss +20 -9
  564. package/src/components/media-placeholder/{style.scss → content.scss} +0 -0
  565. package/src/components/media-replace-flow/test/index.js +37 -9
  566. package/src/components/media-upload/test/index.native.js +2 -0
  567. package/src/components/off-canvas-editor/README.md +5 -0
  568. package/src/components/off-canvas-editor/appender.js +93 -0
  569. package/src/components/off-canvas-editor/block-contents.js +89 -0
  570. package/src/components/off-canvas-editor/block-edit-button.js +27 -0
  571. package/src/components/off-canvas-editor/block-select-button.js +113 -0
  572. package/src/components/off-canvas-editor/block.js +401 -0
  573. package/src/components/off-canvas-editor/branch.js +208 -0
  574. package/src/components/off-canvas-editor/context.js +8 -0
  575. package/src/components/off-canvas-editor/drop-indicator.js +126 -0
  576. package/src/components/off-canvas-editor/expander.js +26 -0
  577. package/src/components/off-canvas-editor/index.js +242 -0
  578. package/src/components/off-canvas-editor/leaf.js +52 -0
  579. package/src/components/off-canvas-editor/link-ui.js +166 -0
  580. package/src/components/off-canvas-editor/style.scss +26 -0
  581. package/src/components/off-canvas-editor/test/utils.js +50 -0
  582. package/src/components/off-canvas-editor/update-attributes.js +99 -0
  583. package/src/components/off-canvas-editor/use-block-selection.js +169 -0
  584. package/src/components/off-canvas-editor/use-list-view-client-ids.js +29 -0
  585. package/src/components/off-canvas-editor/use-list-view-drop-zone.js +260 -0
  586. package/src/components/off-canvas-editor/use-list-view-expand-selected-item.js +58 -0
  587. package/src/components/off-canvas-editor/utils.js +58 -0
  588. package/src/components/plain-text/{style.scss → content.scss} +0 -0
  589. package/src/components/recursion-provider/test/index.js +27 -29
  590. package/src/components/responsive-block-control/test/index.js +69 -92
  591. package/src/components/rich-text/content.scss +42 -0
  592. package/src/components/rich-text/format-toolbar/index.js +6 -4
  593. package/src/components/rich-text/index.js +2 -2
  594. package/src/components/rich-text/index.native.js +0 -2
  595. package/src/components/rich-text/style.scss +0 -43
  596. package/src/components/rich-text/use-insert-replacement-text.js +31 -0
  597. package/src/components/rich-text/use-undo-automatic-change.js +7 -1
  598. package/src/components/rich-text/utils.js +2 -21
  599. package/src/components/spacing-sizes-control/spacing-input-control.js +9 -0
  600. package/src/components/ungroup-button/index.native.js +6 -2
  601. package/src/components/url-input/index.js +57 -73
  602. package/src/components/url-popover/README.md +12 -3
  603. package/src/components/url-popover/index.js +33 -3
  604. package/src/components/url-popover/test/__snapshots__/index.js.snap +8 -6
  605. package/src/components/url-popover/test/index.js +21 -9
  606. package/src/components/use-block-display-information/index.js +14 -5
  607. package/src/components/use-setting/index.js +20 -2
  608. package/src/components/use-setting/test/index.js +99 -0
  609. package/src/content.scss +10 -0
  610. package/src/hooks/child-layout.js +190 -0
  611. package/src/hooks/color-panel.js +13 -1
  612. package/src/hooks/color.js +2 -0
  613. package/src/hooks/content-lock-ui.js +47 -35
  614. package/src/hooks/dimensions.js +119 -21
  615. package/src/hooks/layout.js +62 -3
  616. package/src/hooks/margin.js +4 -3
  617. package/src/hooks/min-height.js +104 -0
  618. package/src/hooks/padding.js +4 -3
  619. package/src/hooks/style.js +10 -2
  620. package/src/hooks/test/style.js +4 -0
  621. package/src/hooks/test/use-typography-props.js +1 -1
  622. package/src/layouts/flex.js +43 -38
  623. package/src/store/actions.js +22 -0
  624. package/src/store/reducer.js +480 -434
  625. package/src/store/selectors.js +70 -64
  626. package/src/store/test/actions.js +18 -0
  627. package/src/store/test/performance.js +71 -0
  628. package/src/store/test/reducer.js +662 -490
  629. package/src/store/test/selectors.js +1839 -1306
  630. package/src/style.scss +4 -7
  631. package/src/utils/sorting.js +54 -0
  632. package/src/utils/test/sorting.js +49 -0
  633. package/tsconfig.tsbuildinfo +1 -1
  634. package/build/components/block-preview/live.js +0 -30
  635. package/build/components/block-preview/live.js.map +0 -1
  636. package/build-module/components/block-preview/live.js +0 -20
  637. package/build-module/components/block-preview/live.js.map +0 -1
  638. package/src/components/block-preview/live.js +0 -19
@@ -1,5 +1,7 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
@@ -16,6 +18,7 @@ exports.hasSameKeys = hasSameKeys;
16
18
  exports.highlightedBlock = highlightedBlock;
17
19
  exports.initialPosition = initialPosition;
18
20
  exports.insertionPoint = insertionPoint;
21
+ exports.isBlockInterfaceHidden = isBlockInterfaceHidden;
19
22
  exports.isMultiSelecting = isMultiSelecting;
20
23
  exports.isSelectionEnabled = isSelectionEnabled;
21
24
  exports.isTyping = isTyping;
@@ -28,6 +31,8 @@ exports.settings = settings;
28
31
  exports.template = template;
29
32
  exports.temporarilyEditingAsBlocks = temporarilyEditingAsBlocks;
30
33
 
34
+ var _es = _interopRequireDefault(require("fast-deep-equal/es6"));
35
+
31
36
  var _lodash = require("lodash");
32
37
 
33
38
  var _compose = require("@wordpress/compose");
@@ -66,16 +71,18 @@ const identity = x => x;
66
71
 
67
72
  function mapBlockOrder(blocks) {
68
73
  let rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
69
- const result = {
70
- [rootClientId]: []
71
- };
74
+ const result = new Map();
75
+ const current = [];
76
+ result.set(rootClientId, current);
72
77
  blocks.forEach(block => {
73
78
  const {
74
79
  clientId,
75
80
  innerBlocks
76
81
  } = block;
77
- result[rootClientId].push(clientId);
78
- Object.assign(result, mapBlockOrder(innerBlocks, clientId));
82
+ current.push(clientId);
83
+ mapBlockOrder(innerBlocks, clientId).forEach((order, subClientId) => {
84
+ result.set(subClientId, order);
85
+ });
79
86
  });
80
87
  return result;
81
88
  }
@@ -92,9 +99,25 @@ function mapBlockOrder(blocks) {
92
99
 
93
100
  function mapBlockParents(blocks) {
94
101
  let rootClientId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
95
- return blocks.reduce((result, block) => Object.assign(result, {
96
- [block.clientId]: rootClientId
97
- }, mapBlockParents(block.innerBlocks, block.clientId)), {});
102
+ const result = [];
103
+ const stack = [[rootClientId, blocks]];
104
+
105
+ while (stack.length) {
106
+ const [parent, currentBlocks] = stack.shift();
107
+ currentBlocks.forEach(_ref => {
108
+ let {
109
+ innerBlocks,
110
+ ...block
111
+ } = _ref;
112
+ result.push([block.clientId, parent]);
113
+
114
+ if (innerBlocks !== null && innerBlocks !== void 0 && innerBlocks.length) {
115
+ stack.push([block.clientId, innerBlocks]);
116
+ }
117
+ });
118
+ }
119
+
120
+ return result;
98
121
  }
99
122
  /**
100
123
  * Helper method to iterate through all blocks, recursing into inner blocks,
@@ -104,12 +127,28 @@ function mapBlockParents(blocks) {
104
127
  * @param {Array} blocks Blocks to flatten.
105
128
  * @param {Function} transform Transforming function to be applied to each block.
106
129
  *
107
- * @return {Object} Flattened object.
130
+ * @return {Array} Flattened object.
108
131
  */
109
132
 
110
133
 
111
134
  function flattenBlocks(blocks) {
112
135
  let transform = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : identity;
136
+ const result = [];
137
+ const stack = [...blocks];
138
+
139
+ while (stack.length) {
140
+ const {
141
+ innerBlocks,
142
+ ...block
143
+ } = stack.shift();
144
+ stack.push(...innerBlocks);
145
+ result.push([block.clientId, transform(block)]);
146
+ }
147
+
148
+ return result;
149
+ }
150
+
151
+ function getFlattenedClientIds(blocks) {
113
152
  const result = {};
114
153
  const stack = [...blocks];
115
154
 
@@ -119,7 +158,7 @@ function flattenBlocks(blocks) {
119
158
  ...block
120
159
  } = stack.shift();
121
160
  stack.push(...innerBlocks);
122
- result[block.clientId] = transform(block);
161
+ result[block.clientId] = true;
123
162
  }
124
163
 
125
164
  return result;
@@ -131,7 +170,7 @@ function flattenBlocks(blocks) {
131
170
  *
132
171
  * @param {Array} blocks Blocks to flatten.
133
172
  *
134
- * @return {Object} Flattened block attributes object.
173
+ * @return {Array} Flattened block attributes object.
135
174
  */
136
175
 
137
176
 
@@ -145,32 +184,13 @@ function getFlattenedBlocksWithoutAttributes(blocks) {
145
184
  *
146
185
  * @param {Array} blocks Blocks to flatten.
147
186
  *
148
- * @return {Object} Flattened block attributes object.
187
+ * @return {Array} Flattened block attributes object.
149
188
  */
150
189
 
151
190
 
152
191
  function getFlattenedBlockAttributes(blocks) {
153
192
  return flattenBlocks(blocks, block => block.attributes);
154
193
  }
155
- /**
156
- * Returns an object against which it is safe to perform mutating operations,
157
- * given the original object and its current working copy.
158
- *
159
- * @param {Object} original Original object.
160
- * @param {Object} working Working object.
161
- *
162
- * @return {Object} Mutation-safe object.
163
- */
164
-
165
-
166
- function getMutateSafeObject(original, working) {
167
- if (original === working) {
168
- return { ...original
169
- };
170
- }
171
-
172
- return working;
173
- }
174
194
  /**
175
195
  * Returns true if the two object arguments have the same keys, or false
176
196
  * otherwise.
@@ -183,7 +203,7 @@ function getMutateSafeObject(original, working) {
183
203
 
184
204
 
185
205
  function hasSameKeys(a, b) {
186
- return (0, _lodash.isEqual)(Object.keys(a), Object.keys(b));
206
+ return (0, _es.default)(Object.keys(a), Object.keys(b));
187
207
  }
188
208
  /**
189
209
  * Returns true if, given the currently dispatching action and the previously
@@ -198,11 +218,11 @@ function hasSameKeys(a, b) {
198
218
 
199
219
 
200
220
  function isUpdatingSameBlockAttribute(action, lastAction) {
201
- return action.type === 'UPDATE_BLOCK_ATTRIBUTES' && lastAction !== undefined && lastAction.type === 'UPDATE_BLOCK_ATTRIBUTES' && (0, _lodash.isEqual)(action.clientIds, lastAction.clientIds) && hasSameKeys(action.attributes, lastAction.attributes);
221
+ return action.type === 'UPDATE_BLOCK_ATTRIBUTES' && lastAction !== undefined && lastAction.type === 'UPDATE_BLOCK_ATTRIBUTES' && (0, _es.default)(action.clientIds, lastAction.clientIds) && hasSameKeys(action.attributes, lastAction.attributes);
202
222
  }
203
223
 
204
- function buildBlockTree(state, blocks) {
205
- const result = {};
224
+ function updateBlockTreeForBlocks(state, blocks) {
225
+ const treeToUpdate = state.tree;
206
226
  const stack = [...blocks];
207
227
  const flattenedBlocks = [...blocks];
208
228
 
@@ -214,26 +234,25 @@ function buildBlockTree(state, blocks) {
214
234
 
215
235
 
216
236
  for (const block of flattenedBlocks) {
217
- result[block.clientId] = {};
237
+ treeToUpdate.set(block.clientId, {});
218
238
  }
219
239
 
220
240
  for (const block of flattenedBlocks) {
221
- result[block.clientId] = Object.assign(result[block.clientId], { ...state.byClientId[block.clientId],
222
- attributes: state.attributes[block.clientId],
223
- innerBlocks: block.innerBlocks.map(subBlock => result[subBlock.clientId])
224
- });
241
+ treeToUpdate.set(block.clientId, Object.assign(treeToUpdate.get(block.clientId), { ...state.byClientId.get(block.clientId),
242
+ attributes: state.attributes.get(block.clientId),
243
+ innerBlocks: block.innerBlocks.map(subBlock => treeToUpdate.get(subBlock.clientId))
244
+ }));
225
245
  }
226
-
227
- return result;
228
246
  }
229
247
 
230
- function updateParentInnerBlocksInTree(state, tree, updatedClientIds) {
231
- let updateChildrenOfUpdatedClientIds = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
248
+ function updateParentInnerBlocksInTree(state, updatedClientIds) {
249
+ let updateChildrenOfUpdatedClientIds = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
250
+ const treeToUpdate = state.tree;
232
251
  const uncontrolledParents = new Set([]);
233
252
  const controlledParents = new Set();
234
253
 
235
254
  for (const clientId of updatedClientIds) {
236
- let current = updateChildrenOfUpdatedClientIds ? clientId : state.parents[clientId];
255
+ let current = updateChildrenOfUpdatedClientIds ? clientId : state.parents.get(clientId);
237
256
 
238
257
  do {
239
258
  if (state.controlledInnerBlocks[current]) {
@@ -244,7 +263,7 @@ function updateParentInnerBlocksInTree(state, tree, updatedClientIds) {
244
263
  } else {
245
264
  // Else continue traversing up through parents.
246
265
  uncontrolledParents.add(current);
247
- current = state.parents[current];
266
+ current = state.parents.get(current);
248
267
  }
249
268
  } while (current !== undefined);
250
269
  } // To make sure the order of assignments doesn't matter,
@@ -252,23 +271,21 @@ function updateParentInnerBlocksInTree(state, tree, updatedClientIds) {
252
271
 
253
272
 
254
273
  for (const clientId of uncontrolledParents) {
255
- tree[clientId] = { ...tree[clientId]
256
- };
274
+ treeToUpdate.set(clientId, { ...treeToUpdate.get(clientId)
275
+ });
257
276
  }
258
277
 
259
278
  for (const clientId of uncontrolledParents) {
260
- tree[clientId].innerBlocks = (state.order[clientId] || []).map(subClientId => tree[subClientId]);
279
+ treeToUpdate.get(clientId).innerBlocks = (state.order.get(clientId) || []).map(subClientId => treeToUpdate.get(subClientId));
261
280
  } // Controlled parent blocks, need a dedicated key for their inner blocks
262
281
  // to be used when doing getBlocks( controlledBlockClientId ).
263
282
 
264
283
 
265
284
  for (const clientId of controlledParents) {
266
- tree['controlled||' + clientId] = {
267
- innerBlocks: (state.order[clientId] || []).map(subClientId => tree[subClientId])
268
- };
285
+ treeToUpdate.set('controlled||' + clientId, {
286
+ innerBlocks: (state.order.get(clientId) || []).map(subClientId => treeToUpdate.get(subClientId))
287
+ });
269
288
  }
270
-
271
- return tree;
272
289
  }
273
290
  /**
274
291
  * Higher-order reducer intended to compute full block objects key for each block in the post.
@@ -290,61 +307,61 @@ const withBlockTree = reducer => function () {
290
307
  return state;
291
308
  }
292
309
 
293
- newState.tree = state.tree ? state.tree : {};
310
+ newState.tree = state.tree ? state.tree : new Map();
294
311
 
295
312
  switch (action.type) {
296
313
  case 'RECEIVE_BLOCKS':
297
314
  case 'INSERT_BLOCKS':
298
315
  {
299
- const subTree = buildBlockTree(newState, action.blocks);
300
- newState.tree = updateParentInnerBlocksInTree(newState, { ...newState.tree,
301
- ...subTree
302
- }, action.rootClientId ? [action.rootClientId] : [''], true);
316
+ newState.tree = new Map(newState.tree);
317
+ updateBlockTreeForBlocks(newState, action.blocks);
318
+ updateParentInnerBlocksInTree(newState, action.rootClientId ? [action.rootClientId] : [''], true);
303
319
  break;
304
320
  }
305
321
 
306
322
  case 'UPDATE_BLOCK':
307
- newState.tree = updateParentInnerBlocksInTree(newState, { ...newState.tree,
308
- [action.clientId]: { ...newState.tree[action.clientId],
309
- ...newState.byClientId[action.clientId],
310
- attributes: newState.attributes[action.clientId]
311
- }
312
- }, [action.clientId], false);
323
+ newState.tree = new Map(newState.tree);
324
+ newState.tree.set(action.clientId, { ...newState.tree.get(action.clientId),
325
+ ...newState.byClientId.get(action.clientId),
326
+ attributes: newState.attributes.get(action.clientId)
327
+ });
328
+ updateParentInnerBlocksInTree(newState, [action.clientId], false);
313
329
  break;
314
330
 
315
331
  case 'UPDATE_BLOCK_ATTRIBUTES':
316
332
  {
317
- const newSubTree = action.clientIds.reduce((result, clientId) => {
318
- result[clientId] = { ...newState.tree[clientId],
319
- attributes: newState.attributes[clientId]
320
- };
321
- return result;
322
- }, {});
323
- newState.tree = updateParentInnerBlocksInTree(newState, { ...newState.tree,
324
- ...newSubTree
325
- }, action.clientIds, false);
333
+ newState.tree = new Map(newState.tree);
334
+ action.clientIds.forEach(clientId => {
335
+ newState.tree.set(clientId, { ...newState.tree.get(clientId),
336
+ attributes: newState.attributes.get(clientId)
337
+ });
338
+ });
339
+ updateParentInnerBlocksInTree(newState, action.clientIds, false);
326
340
  break;
327
341
  }
328
342
 
329
343
  case 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN':
330
344
  {
331
- const subTree = buildBlockTree(newState, action.blocks);
332
- newState.tree = updateParentInnerBlocksInTree(newState, { ...(0, _lodash.omit)(newState.tree, action.replacedClientIds.concat( // Controlled inner blocks are only removed
333
- // if the block doesn't move to another position
334
- // otherwise their content will be lost.
335
- action.replacedClientIds.filter(clientId => !subTree[clientId]).map(clientId => 'controlled||' + clientId))),
336
- ...subTree
337
- }, action.blocks.map(b => b.clientId), false); // If there are no replaced blocks, it means we're removing blocks so we need to update their parent.
345
+ const inserterClientIds = getFlattenedClientIds(action.blocks);
346
+ newState.tree = new Map(newState.tree);
347
+ action.replacedClientIds.concat( // Controlled inner blocks are only removed
348
+ // if the block doesn't move to another position
349
+ // otherwise their content will be lost.
350
+ action.replacedClientIds.filter(clientId => !inserterClientIds[clientId]).map(clientId => 'controlled||' + clientId)).forEach(key => {
351
+ newState.tree.delete(key);
352
+ });
353
+ updateBlockTreeForBlocks(newState, action.blocks);
354
+ updateParentInnerBlocksInTree(newState, action.blocks.map(b => b.clientId), false); // If there are no replaced blocks, it means we're removing blocks so we need to update their parent.
338
355
 
339
356
  const parentsOfRemovedBlocks = [];
340
357
 
341
358
  for (const clientId of action.clientIds) {
342
- if (state.parents[clientId] !== undefined && (state.parents[clientId] === '' || newState.byClientId[state.parents[clientId]])) {
343
- parentsOfRemovedBlocks.push(state.parents[clientId]);
359
+ if (state.parents.get(clientId) !== undefined && (state.parents.get(clientId) === '' || newState.byClientId.get(state.parents.get(clientId)))) {
360
+ parentsOfRemovedBlocks.push(state.parents.get(clientId));
344
361
  }
345
362
  }
346
363
 
347
- newState.tree = updateParentInnerBlocksInTree(newState, newState.tree, parentsOfRemovedBlocks, true);
364
+ updateParentInnerBlocksInTree(newState, parentsOfRemovedBlocks, true);
348
365
  break;
349
366
  }
350
367
 
@@ -352,12 +369,16 @@ const withBlockTree = reducer => function () {
352
369
  const parentsOfRemovedBlocks = [];
353
370
 
354
371
  for (const clientId of action.clientIds) {
355
- if (state.parents[clientId] !== undefined && (state.parents[clientId] === '' || newState.byClientId[state.parents[clientId]])) {
356
- parentsOfRemovedBlocks.push(state.parents[clientId]);
372
+ if (state.parents.get(clientId) !== undefined && (state.parents.get(clientId) === '' || newState.byClientId.get(state.parents.get(clientId)))) {
373
+ parentsOfRemovedBlocks.push(state.parents.get(clientId));
357
374
  }
358
375
  }
359
376
 
360
- newState.tree = updateParentInnerBlocksInTree(newState, (0, _lodash.omit)(newState.tree, action.removedClientIds.concat(action.removedClientIds.map(clientId => 'controlled||' + clientId))), parentsOfRemovedBlocks, true);
377
+ newState.tree = new Map(newState.tree);
378
+ action.removedClientIds.concat(action.removedClientIds.map(clientId => 'controlled||' + clientId)).forEach(key => {
379
+ newState.tree.delete(key);
380
+ });
381
+ updateParentInnerBlocksInTree(newState, parentsOfRemovedBlocks, true);
361
382
  break;
362
383
 
363
384
  case 'MOVE_BLOCKS_TO_POSITION':
@@ -374,7 +395,8 @@ const withBlockTree = reducer => function () {
374
395
  updatedBlockUids.push(action.toRootClientId);
375
396
  }
376
397
 
377
- newState.tree = updateParentInnerBlocksInTree(newState, newState.tree, updatedBlockUids, true);
398
+ newState.tree = new Map(newState.tree);
399
+ updateParentInnerBlocksInTree(newState, updatedBlockUids, true);
378
400
  break;
379
401
  }
380
402
 
@@ -382,28 +404,27 @@ const withBlockTree = reducer => function () {
382
404
  case 'MOVE_BLOCKS_DOWN':
383
405
  {
384
406
  const updatedBlockUids = [action.rootClientId ? action.rootClientId : ''];
385
- newState.tree = updateParentInnerBlocksInTree(newState, newState.tree, updatedBlockUids, true);
407
+ newState.tree = new Map(newState.tree);
408
+ updateParentInnerBlocksInTree(newState, updatedBlockUids, true);
386
409
  break;
387
410
  }
388
411
 
389
412
  case 'SAVE_REUSABLE_BLOCK_SUCCESS':
390
413
  {
391
- const updatedBlockUids = Object.entries(newState.attributes).filter(_ref => {
392
- let [clientId, attributes] = _ref;
393
- return newState.byClientId[clientId].name === 'core/block' && attributes.ref === action.updatedId;
394
- }).map(_ref2 => {
395
- let [clientId] = _ref2;
396
- return clientId;
414
+ const updatedBlockUids = [];
415
+ newState.attributes.forEach((attributes, clientId) => {
416
+ if (newState.byClientId.get(clientId).name === 'core/block' && attributes.ref === action.updatedId) {
417
+ updatedBlockUids.push(clientId);
418
+ }
419
+ });
420
+ newState.tree = new Map(newState.tree);
421
+ updatedBlockUids.forEach(clientId => {
422
+ newState.tree.set(clientId, { ...newState.byClientId.get(clientId),
423
+ attributes: newState.attributes.get(clientId),
424
+ innerBlocks: newState.tree.get(clientId).innerBlocks
425
+ });
397
426
  });
398
- newState.tree = updateParentInnerBlocksInTree(newState, { ...newState.tree,
399
- ...updatedBlockUids.reduce((result, clientId) => {
400
- result[clientId] = { ...newState.byClientId[clientId],
401
- attributes: newState.attributes[clientId],
402
- innerBlocks: newState.tree[clientId].innerBlocks
403
- };
404
- return result;
405
- }, {})
406
- }, updatedBlockUids, false);
427
+ updateParentInnerBlocksInTree(newState, updatedBlockUids, false);
407
428
  }
408
429
  }
409
430
 
@@ -500,7 +521,7 @@ const withInnerBlocksRemoveCascade = reducer => (state, action) => {
500
521
  let result = clientIds;
501
522
 
502
523
  for (let i = 0; i < result.length; i++) {
503
- if (!state.order[result[i]] || action.keepControlledInnerBlocks && action.keepControlledInnerBlocks[result[i]]) {
524
+ if (!state.order.get(result[i]) || action.keepControlledInnerBlocks && action.keepControlledInnerBlocks[result[i]]) {
504
525
  continue;
505
526
  }
506
527
 
@@ -508,7 +529,7 @@ const withInnerBlocksRemoveCascade = reducer => (state, action) => {
508
529
  result = [...result];
509
530
  }
510
531
 
511
- result.push(...state.order[result[i]]);
532
+ result.push(...state.order.get(result[i]));
512
533
  }
513
534
 
514
535
  return result;
@@ -549,19 +570,17 @@ const withInnerBlocksRemoveCascade = reducer => (state, action) => {
549
570
  const withBlockReset = reducer => (state, action) => {
550
571
  if (action.type === 'RESET_BLOCKS') {
551
572
  const newState = { ...state,
552
- byClientId: getFlattenedBlocksWithoutAttributes(action.blocks),
553
- attributes: getFlattenedBlockAttributes(action.blocks),
573
+ byClientId: new Map(getFlattenedBlocksWithoutAttributes(action.blocks)),
574
+ attributes: new Map(getFlattenedBlockAttributes(action.blocks)),
554
575
  order: mapBlockOrder(action.blocks),
555
- parents: mapBlockParents(action.blocks),
576
+ parents: new Map(mapBlockParents(action.blocks)),
556
577
  controlledInnerBlocks: {}
557
578
  };
558
- const subTree = buildBlockTree(newState, action.blocks);
559
- newState.tree = { ...subTree,
560
- // Root.
561
- '': {
562
- innerBlocks: action.blocks.map(subBlock => subTree[subBlock.clientId])
563
- }
564
- };
579
+ newState.tree = new Map(state === null || state === void 0 ? void 0 : state.tree);
580
+ updateBlockTreeForBlocks(newState, action.blocks);
581
+ newState.tree.set('', {
582
+ innerBlocks: action.blocks.map(subBlock => newState.tree.get(subBlock.clientId))
583
+ });
565
584
  return newState;
566
585
  }
567
586
 
@@ -614,11 +633,11 @@ const withReplaceInnerBlocks = reducer => (state, action) => {
614
633
 
615
634
  let stateAfterBlocksRemoval = state;
616
635
 
617
- if (state.order[action.rootClientId]) {
636
+ if (state.order.get(action.rootClientId)) {
618
637
  stateAfterBlocksRemoval = reducer(stateAfterBlocksRemoval, {
619
638
  type: 'REMOVE_BLOCKS',
620
639
  keepControlledInnerBlocks: nestedControllers,
621
- clientIds: state.order[action.rootClientId]
640
+ clientIds: state.order.get(action.rootClientId)
622
641
  });
623
642
  }
624
643
 
@@ -632,26 +651,21 @@ const withReplaceInnerBlocks = reducer => (state, action) => {
632
651
  // preserve their block order. Otherwise, an inner block controller's blocks
633
652
  // will be deleted entirely from its entity.
634
653
 
635
- stateAfterInsert.order = { ...stateAfterInsert.order,
636
- ...(0, _lodash.reduce)(nestedControllers, (result, value, key) => {
637
- if (state.order[key]) {
638
- result[key] = state.order[key];
639
- }
640
-
641
- return result;
642
- }, {})
643
- };
644
- stateAfterInsert.tree = { ...stateAfterInsert.tree,
645
- ...(0, _lodash.reduce)(nestedControllers, (result, value, _key) => {
646
- const key = `controlled||${_key}`;
647
-
648
- if (state.tree[key]) {
649
- result[key] = state.tree[key];
650
- }
654
+ const stateAfterInsertOrder = new Map(stateAfterInsert.order);
655
+ Object.keys(nestedControllers).forEach(key => {
656
+ if (state.order.get(key)) {
657
+ stateAfterInsertOrder.set(key, state.order.get(key));
658
+ }
659
+ });
660
+ stateAfterInsert.order = stateAfterInsertOrder;
661
+ stateAfterInsert.tree = new Map(stateAfterInsert.tree);
662
+ Object.keys(nestedControllers).forEach(_key => {
663
+ const key = `controlled||${_key}`;
651
664
 
652
- return result;
653
- }, {})
654
- };
665
+ if (state.tree.has(key)) {
666
+ stateAfterInsert.tree.set(key, state.tree.get(key));
667
+ }
668
+ });
655
669
  }
656
670
 
657
671
  return stateAfterInsert;
@@ -681,18 +695,17 @@ const withSaveReusableBlock = reducer => (state, action) => {
681
695
 
682
696
  state = { ...state
683
697
  };
684
- state.attributes = (0, _lodash.mapValues)(state.attributes, (attributes, clientId) => {
698
+ state.attributes = new Map(state.attributes);
699
+ state.attributes.forEach((attributes, clientId) => {
685
700
  const {
686
701
  name
687
- } = state.byClientId[clientId];
702
+ } = state.byClientId.get(clientId);
688
703
 
689
704
  if (name === 'core/block' && attributes.ref === id) {
690
- return { ...attributes,
705
+ state.attributes.set(clientId, { ...attributes,
691
706
  ref: updatedId
692
- };
707
+ });
693
708
  }
694
-
695
- return attributes;
696
709
  });
697
710
  }
698
711
 
@@ -735,131 +748,202 @@ const blocks = (0, _compose.pipe)(_data.combineReducers, withSaveReusableBlock,
735
748
  withBlockTree, // Needs to be before withInnerBlocksRemoveCascade.
736
749
  withInnerBlocksRemoveCascade, withReplaceInnerBlocks, // Needs to be after withInnerBlocksRemoveCascade.
737
750
  withBlockReset, withPersistentBlockChange, withIgnoredBlockChange, withResetControlledBlocks)({
751
+ // The state is using a Map instead of a plain object for performance reasons.
752
+ // You can run the "./test/performance.js" unit test to check the impact
753
+ // code changes can have on this reducer.
738
754
  byClientId() {
739
- let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
755
+ let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Map();
740
756
  let action = arguments.length > 1 ? arguments[1] : undefined;
741
757
 
742
758
  switch (action.type) {
743
759
  case 'RECEIVE_BLOCKS':
744
760
  case 'INSERT_BLOCKS':
745
- return { ...state,
746
- ...getFlattenedBlocksWithoutAttributes(action.blocks)
747
- };
761
+ {
762
+ const newState = new Map(state);
763
+ getFlattenedBlocksWithoutAttributes(action.blocks).forEach(_ref2 => {
764
+ let [key, value] = _ref2;
765
+ newState.set(key, value);
766
+ });
767
+ return newState;
768
+ }
748
769
 
749
770
  case 'UPDATE_BLOCK':
750
- // Ignore updates if block isn't known.
751
- if (!state[action.clientId]) {
752
- return state;
753
- } // Do nothing if only attributes change.
771
+ {
772
+ // Ignore updates if block isn't known.
773
+ if (!state.has(action.clientId)) {
774
+ return state;
775
+ } // Do nothing if only attributes change.
754
776
 
755
777
 
756
- const changes = (0, _lodash.omit)(action.updates, 'attributes');
778
+ const changes = (0, _lodash.omit)(action.updates, 'attributes');
757
779
 
758
- if ((0, _lodash.isEmpty)(changes)) {
759
- return state;
760
- }
780
+ if ((0, _lodash.isEmpty)(changes)) {
781
+ return state;
782
+ }
761
783
 
762
- return { ...state,
763
- [action.clientId]: { ...state[action.clientId],
784
+ const newState = new Map(state);
785
+ newState.set(action.clientId, { ...state.get(action.clientId),
764
786
  ...changes
765
- }
766
- };
787
+ });
788
+ return newState;
789
+ }
767
790
 
768
791
  case 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN':
769
- if (!action.blocks) {
770
- return state;
771
- }
792
+ {
793
+ if (!action.blocks) {
794
+ return state;
795
+ }
772
796
 
773
- return { ...(0, _lodash.omit)(state, action.replacedClientIds),
774
- ...getFlattenedBlocksWithoutAttributes(action.blocks)
775
- };
797
+ const newState = new Map(state);
798
+ action.replacedClientIds.forEach(clientId => {
799
+ newState.delete(clientId);
800
+ });
801
+ getFlattenedBlocksWithoutAttributes(action.blocks).forEach(_ref3 => {
802
+ let [key, value] = _ref3;
803
+ newState.set(key, value);
804
+ });
805
+ return newState;
806
+ }
776
807
 
777
808
  case 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN':
778
- return (0, _lodash.omit)(state, action.removedClientIds);
809
+ {
810
+ const newState = new Map(state);
811
+ action.removedClientIds.forEach(clientId => {
812
+ newState.delete(clientId);
813
+ });
814
+ return newState;
815
+ }
779
816
  }
780
817
 
781
818
  return state;
782
819
  },
783
820
 
821
+ // The state is using a Map instead of a plain object for performance reasons.
822
+ // You can run the "./test/performance.js" unit test to check the impact
823
+ // code changes can have on this reducer.
784
824
  attributes() {
785
- let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
825
+ let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Map();
786
826
  let action = arguments.length > 1 ? arguments[1] : undefined;
787
827
 
788
828
  switch (action.type) {
789
829
  case 'RECEIVE_BLOCKS':
790
830
  case 'INSERT_BLOCKS':
791
- return { ...state,
792
- ...getFlattenedBlockAttributes(action.blocks)
793
- };
831
+ {
832
+ const newState = new Map(state);
833
+ getFlattenedBlockAttributes(action.blocks).forEach(_ref4 => {
834
+ let [key, value] = _ref4;
835
+ newState.set(key, value);
836
+ });
837
+ return newState;
838
+ }
794
839
 
795
840
  case 'UPDATE_BLOCK':
796
- // Ignore updates if block isn't known or there are no attribute changes.
797
- if (!state[action.clientId] || !action.updates.attributes) {
798
- return state;
799
- }
841
+ {
842
+ // Ignore updates if block isn't known or there are no attribute changes.
843
+ if (!state.get(action.clientId) || !action.updates.attributes) {
844
+ return state;
845
+ }
800
846
 
801
- return { ...state,
802
- [action.clientId]: { ...state[action.clientId],
847
+ const newState = new Map(state);
848
+ newState.set(action.clientId, { ...state.get(action.clientId),
803
849
  ...action.updates.attributes
804
- }
805
- };
850
+ });
851
+ return newState;
852
+ }
806
853
 
807
854
  case 'UPDATE_BLOCK_ATTRIBUTES':
808
855
  {
809
856
  // Avoid a state change if none of the block IDs are known.
810
- if (action.clientIds.every(id => !state[id])) {
857
+ if (action.clientIds.every(id => !state.get(id))) {
811
858
  return state;
812
859
  }
813
860
 
814
- const next = action.clientIds.reduce((accumulator, id) => ({ ...accumulator,
815
- [id]: (0, _lodash.reduce)(action.uniqueByBlock ? action.attributes[id] : action.attributes, (result, value, key) => {
816
- // Consider as updates only changed values.
817
- if (value !== result[key]) {
818
- result = getMutateSafeObject(state[id], result);
819
- result[key] = value;
820
- }
861
+ let hasChange = false;
862
+ const newState = new Map(state);
821
863
 
822
- return result;
823
- }, state[id])
824
- }), {});
864
+ for (const clientId of action.clientIds) {
865
+ var _action$attributes;
825
866
 
826
- if (action.clientIds.every(id => next[id] === state[id])) {
827
- return state;
867
+ const updatedAttributeEntries = Object.entries(action.uniqueByBlock ? action.attributes[clientId] : (_action$attributes = action.attributes) !== null && _action$attributes !== void 0 ? _action$attributes : {});
868
+
869
+ if (updatedAttributeEntries.length === 0) {
870
+ continue;
871
+ }
872
+
873
+ let hasUpdatedAttributes = false;
874
+ const existingAttributes = state.get(clientId);
875
+ const newAttributes = {};
876
+ updatedAttributeEntries.forEach(_ref5 => {
877
+ let [key, value] = _ref5;
878
+
879
+ if (existingAttributes[key] !== value) {
880
+ hasUpdatedAttributes = true;
881
+ newAttributes[key] = value;
882
+ }
883
+ });
884
+ hasChange = hasChange || hasUpdatedAttributes;
885
+
886
+ if (hasUpdatedAttributes) {
887
+ newState.set(clientId, { ...existingAttributes,
888
+ ...newAttributes
889
+ });
890
+ }
828
891
  }
829
892
 
830
- return { ...state,
831
- ...next
832
- };
893
+ return hasChange ? newState : state;
833
894
  }
834
895
 
835
896
  case 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN':
836
- if (!action.blocks) {
837
- return state;
838
- }
897
+ {
898
+ if (!action.blocks) {
899
+ return state;
900
+ }
839
901
 
840
- return { ...(0, _lodash.omit)(state, action.replacedClientIds),
841
- ...getFlattenedBlockAttributes(action.blocks)
842
- };
902
+ const newState = new Map(state);
903
+ action.replacedClientIds.forEach(clientId => {
904
+ newState.delete(clientId);
905
+ });
906
+ getFlattenedBlockAttributes(action.blocks).forEach(_ref6 => {
907
+ let [key, value] = _ref6;
908
+ newState.set(key, value);
909
+ });
910
+ return newState;
911
+ }
843
912
 
844
913
  case 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN':
845
- return (0, _lodash.omit)(state, action.removedClientIds);
914
+ {
915
+ const newState = new Map(state);
916
+ action.removedClientIds.forEach(clientId => {
917
+ newState.delete(clientId);
918
+ });
919
+ return newState;
920
+ }
846
921
  }
847
922
 
848
923
  return state;
849
924
  },
850
925
 
926
+ // The state is using a Map instead of a plain object for performance reasons.
927
+ // You can run the "./test/performance.js" unit test to check the impact
928
+ // code changes can have on this reducer.
851
929
  order() {
852
- let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
930
+ let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Map();
853
931
  let action = arguments.length > 1 ? arguments[1] : undefined;
854
932
 
855
933
  switch (action.type) {
856
934
  case 'RECEIVE_BLOCKS':
857
935
  {
936
+ var _state$get;
937
+
858
938
  const blockOrder = mapBlockOrder(action.blocks);
859
- return { ...state,
860
- ...(0, _lodash.omit)(blockOrder, ''),
861
- '': ((state === null || state === void 0 ? void 0 : state['']) || []).concat(blockOrder[''])
862
- };
939
+ const newState = new Map(state);
940
+ blockOrder.forEach((order, clientId) => {
941
+ if (clientId !== '') {
942
+ newState.set(clientId, order);
943
+ }
944
+ });
945
+ newState.set('', ((_state$get = state.get('')) !== null && _state$get !== void 0 ? _state$get : []).concat(blockOrder['']));
946
+ return newState;
863
947
  }
864
948
 
865
949
  case 'INSERT_BLOCKS':
@@ -867,20 +951,22 @@ withBlockReset, withPersistentBlockChange, withIgnoredBlockChange, withResetCont
867
951
  const {
868
952
  rootClientId = ''
869
953
  } = action;
870
- const subState = state[rootClientId] || [];
954
+ const subState = state.get(rootClientId) || [];
871
955
  const mappedBlocks = mapBlockOrder(action.blocks, rootClientId);
872
956
  const {
873
957
  index = subState.length
874
958
  } = action;
875
- return { ...state,
876
- ...mappedBlocks,
877
- [rootClientId]: (0, _array.insertAt)(subState, mappedBlocks[rootClientId], index)
878
- };
959
+ const newState = new Map(state);
960
+ mappedBlocks.forEach((order, clientId) => {
961
+ newState.set(clientId, order);
962
+ });
963
+ newState.set(rootClientId, (0, _array.insertAt)(subState, mappedBlocks.get(rootClientId), index));
964
+ return newState;
879
965
  }
880
966
 
881
967
  case 'MOVE_BLOCKS_TO_POSITION':
882
968
  {
883
- var _state$fromRootClient, _state$fromRootClient2;
969
+ var _state$get$filter, _state$get2;
884
970
 
885
971
  const {
886
972
  fromRootClientId = '',
@@ -888,22 +974,22 @@ withBlockReset, withPersistentBlockChange, withIgnoredBlockChange, withResetCont
888
974
  clientIds
889
975
  } = action;
890
976
  const {
891
- index = state[toRootClientId].length
977
+ index = state.get(toRootClientId).length
892
978
  } = action; // Moving inside the same parent block.
893
979
 
894
980
  if (fromRootClientId === toRootClientId) {
895
- const subState = state[toRootClientId];
981
+ const subState = state.get(toRootClientId);
896
982
  const fromIndex = subState.indexOf(clientIds[0]);
897
- return { ...state,
898
- [toRootClientId]: (0, _array.moveTo)(state[toRootClientId], fromIndex, index, clientIds.length)
899
- };
983
+ const newState = new Map(state);
984
+ newState.set(toRootClientId, (0, _array.moveTo)(state.get(toRootClientId), fromIndex, index, clientIds.length));
985
+ return newState;
900
986
  } // Moving from a parent block to another.
901
987
 
902
988
 
903
- return { ...state,
904
- [fromRootClientId]: (_state$fromRootClient = (_state$fromRootClient2 = state[fromRootClientId]) === null || _state$fromRootClient2 === void 0 ? void 0 : _state$fromRootClient2.filter(id => !clientIds.includes(id))) !== null && _state$fromRootClient !== void 0 ? _state$fromRootClient : [],
905
- [toRootClientId]: (0, _array.insertAt)(state[toRootClientId], clientIds, index)
906
- };
989
+ const newState = new Map(state);
990
+ newState.set(fromRootClientId, (_state$get$filter = (_state$get2 = state.get(fromRootClientId)) === null || _state$get2 === void 0 ? void 0 : _state$get2.filter(id => !clientIds.includes(id))) !== null && _state$get$filter !== void 0 ? _state$get$filter : []);
991
+ newState.set(toRootClientId, (0, _array.insertAt)(state.get(toRootClientId), clientIds, index));
992
+ return newState;
907
993
  }
908
994
 
909
995
  case 'MOVE_BLOCKS_UP':
@@ -913,16 +999,16 @@ withBlockReset, withPersistentBlockChange, withIgnoredBlockChange, withResetCont
913
999
  rootClientId = ''
914
1000
  } = action;
915
1001
  const firstClientId = clientIds[0];
916
- const subState = state[rootClientId];
1002
+ const subState = state.get(rootClientId);
917
1003
 
918
1004
  if (!subState.length || firstClientId === subState[0]) {
919
1005
  return state;
920
1006
  }
921
1007
 
922
1008
  const firstIndex = subState.indexOf(firstClientId);
923
- return { ...state,
924
- [rootClientId]: (0, _array.moveTo)(subState, firstIndex, firstIndex - 1, clientIds.length)
925
- };
1009
+ const newState = new Map(state);
1010
+ newState.set(rootClientId, (0, _array.moveTo)(subState, firstIndex, firstIndex - 1, clientIds.length));
1011
+ return newState;
926
1012
  }
927
1013
 
928
1014
  case 'MOVE_BLOCKS_DOWN':
@@ -933,16 +1019,16 @@ withBlockReset, withPersistentBlockChange, withIgnoredBlockChange, withResetCont
933
1019
  } = action;
934
1020
  const firstClientId = clientIds[0];
935
1021
  const lastClientId = clientIds[clientIds.length - 1];
936
- const subState = state[rootClientId];
1022
+ const subState = state.get(rootClientId);
937
1023
 
938
1024
  if (!subState.length || lastClientId === subState[subState.length - 1]) {
939
1025
  return state;
940
1026
  }
941
1027
 
942
1028
  const firstIndex = subState.indexOf(firstClientId);
943
- return { ...state,
944
- [rootClientId]: (0, _array.moveTo)(subState, firstIndex, firstIndex + 1, clientIds.length)
945
- };
1029
+ const newState = new Map(state);
1030
+ newState.set(rootClientId, (0, _array.moveTo)(subState, firstIndex, firstIndex + 1, clientIds.length));
1031
+ return newState;
946
1032
  }
947
1033
 
948
1034
  case 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN':
@@ -956,29 +1042,50 @@ withBlockReset, withPersistentBlockChange, withIgnoredBlockChange, withResetCont
956
1042
  }
957
1043
 
958
1044
  const mappedBlocks = mapBlockOrder(action.blocks);
959
- return (0, _compose.pipe)([nextState => (0, _lodash.omit)(nextState, action.replacedClientIds), nextState => ({ ...nextState,
960
- ...(0, _lodash.omit)(mappedBlocks, '')
961
- }), nextState => (0, _lodash.mapValues)(nextState, subState => (0, _lodash.reduce)(subState, (result, clientId) => {
962
- if (clientId === clientIds[0]) {
963
- return [...result, ...mappedBlocks['']];
1045
+ const newState = new Map(state);
1046
+ action.replacedClientIds.forEach(clientId => {
1047
+ newState.delete(clientId);
1048
+ });
1049
+ mappedBlocks.forEach((order, clientId) => {
1050
+ if (clientId !== '') {
1051
+ newState.set(clientId, order);
964
1052
  }
1053
+ });
1054
+ newState.forEach((order, clientId) => {
1055
+ const newSubOrder = Object.values(order).reduce((result, subClientId) => {
1056
+ if (subClientId === clientIds[0]) {
1057
+ return [...result, ...mappedBlocks.get('')];
1058
+ }
965
1059
 
966
- if (clientIds.indexOf(clientId) === -1) {
967
- result.push(clientId);
968
- }
1060
+ if (clientIds.indexOf(subClientId) === -1) {
1061
+ result.push(subClientId);
1062
+ }
969
1063
 
970
- return result;
971
- }, []))])(state);
1064
+ return result;
1065
+ }, []);
1066
+ newState.set(clientId, newSubOrder);
1067
+ });
1068
+ return newState;
972
1069
  }
973
1070
 
974
1071
  case 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN':
975
- return (0, _compose.pipe)([// Remove inner block ordering for removed blocks.
976
- nextState => (0, _lodash.omit)(nextState, action.removedClientIds), // Remove deleted blocks from other blocks' orderings.
977
- nextState => (0, _lodash.mapValues)(nextState, subState => {
978
- var _subState$filter;
1072
+ {
1073
+ const newState = new Map(state); // Remove inner block ordering for removed blocks.
1074
+
1075
+ action.removedClientIds.forEach(clientId => {
1076
+ newState.delete(clientId);
1077
+ });
1078
+ newState.forEach((order, clientId) => {
1079
+ var _order$filter;
1080
+
1081
+ const newSubOrder = (_order$filter = order === null || order === void 0 ? void 0 : order.filter(id => !action.removedClientIds.includes(id))) !== null && _order$filter !== void 0 ? _order$filter : [];
979
1082
 
980
- return (_subState$filter = subState === null || subState === void 0 ? void 0 : subState.filter(id => !action.removedClientIds.includes(id))) !== null && _subState$filter !== void 0 ? _subState$filter : [];
981
- })])(state);
1083
+ if (newSubOrder.length !== order.length) {
1084
+ newState.set(clientId, newSubOrder);
1085
+ }
1086
+ });
1087
+ return newState;
1088
+ }
982
1089
  }
983
1090
 
984
1091
  return state;
@@ -987,37 +1094,60 @@ withBlockReset, withPersistentBlockChange, withIgnoredBlockChange, withResetCont
987
1094
  // While technically redundant data as the inverse of `order`, it serves as
988
1095
  // an optimization for the selectors which derive the ancestry of a block.
989
1096
  parents() {
990
- let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1097
+ let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Map();
991
1098
  let action = arguments.length > 1 ? arguments[1] : undefined;
992
1099
 
993
1100
  switch (action.type) {
994
1101
  case 'RECEIVE_BLOCKS':
995
- return { ...state,
996
- ...mapBlockParents(action.blocks)
997
- };
1102
+ {
1103
+ const newState = new Map(state);
1104
+ mapBlockParents(action.blocks).forEach(_ref7 => {
1105
+ let [key, value] = _ref7;
1106
+ newState.set(key, value);
1107
+ });
1108
+ return newState;
1109
+ }
998
1110
 
999
1111
  case 'INSERT_BLOCKS':
1000
- return { ...state,
1001
- ...mapBlockParents(action.blocks, action.rootClientId || '')
1002
- };
1112
+ {
1113
+ const newState = new Map(state);
1114
+ mapBlockParents(action.blocks, action.rootClientId || '').forEach(_ref8 => {
1115
+ let [key, value] = _ref8;
1116
+ newState.set(key, value);
1117
+ });
1118
+ return newState;
1119
+ }
1003
1120
 
1004
1121
  case 'MOVE_BLOCKS_TO_POSITION':
1005
1122
  {
1006
- return { ...state,
1007
- ...action.clientIds.reduce((accumulator, id) => {
1008
- accumulator[id] = action.toRootClientId || '';
1009
- return accumulator;
1010
- }, {})
1011
- };
1123
+ const newState = new Map(state);
1124
+ action.clientIds.forEach(id => {
1125
+ newState.set(id, action.toRootClientId || '');
1126
+ });
1127
+ return newState;
1012
1128
  }
1013
1129
 
1014
1130
  case 'REPLACE_BLOCKS_AUGMENTED_WITH_CHILDREN':
1015
- return { ...(0, _lodash.omit)(state, action.replacedClientIds),
1016
- ...mapBlockParents(action.blocks, state[action.clientIds[0]])
1017
- };
1131
+ {
1132
+ const newState = new Map(state);
1133
+ action.replacedClientIds.forEach(clientId => {
1134
+ newState.delete(clientId);
1135
+ });
1136
+ mapBlockParents(action.blocks, state.get(action.clientIds[0])).forEach(_ref9 => {
1137
+ let [key, value] = _ref9;
1138
+ newState.set(key, value);
1139
+ });
1140
+ return newState;
1141
+ }
1018
1142
 
1019
1143
  case 'REMOVE_BLOCKS_AUGMENTED_WITH_CHILDREN':
1020
- return (0, _lodash.omit)(state, action.removedClientIds);
1144
+ {
1145
+ const newState = new Map(state);
1146
+ action.removedClientIds.forEach(clientId => {
1147
+ newState.delete(clientId);
1148
+ });
1149
+ return newState;
1150
+ }
1021
1151
  }
1022
1152
 
1023
1153
  return state;
@@ -1042,7 +1172,7 @@ withBlockReset, withPersistentBlockChange, withIgnoredBlockChange, withResetCont
1042
1172
 
1043
1173
  });
1044
1174
  /**
1045
- * Reducer returning typing state.
1175
+ * Reducer returning visibility status of block interface.
1046
1176
  *
1047
1177
  * @param {boolean} state Current state.
1048
1178
  * @param {Object} action Dispatched action.
@@ -1052,6 +1182,30 @@ withBlockReset, withPersistentBlockChange, withIgnoredBlockChange, withResetCont
1052
1182
 
1053
1183
  exports.blocks = blocks;
1054
1184
 
1185
+ function isBlockInterfaceHidden() {
1186
+ let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
1187
+ let action = arguments.length > 1 ? arguments[1] : undefined;
1188
+
1189
+ switch (action.type) {
1190
+ case 'HIDE_BLOCK_INTERFACE':
1191
+ return true;
1192
+
1193
+ case 'SHOW_BLOCK_INTERFACE':
1194
+ return false;
1195
+ }
1196
+
1197
+ return state;
1198
+ }
1199
+ /**
1200
+ * Reducer returning typing state.
1201
+ *
1202
+ * @param {boolean} state Current state.
1203
+ * @param {Object} action Dispatched action.
1204
+ *
1205
+ * @return {boolean} Updated state.
1206
+ */
1207
+
1208
+
1055
1209
  function isTyping() {
1056
1210
  let state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
1057
1211
  let action = arguments.length > 1 ? arguments[1] : undefined;
@@ -1405,7 +1559,7 @@ function insertionPoint() {
1405
1559
  operation
1406
1560
  }; // Bail out updates if the states are the same.
1407
1561
 
1408
- return (0, _lodash.isEqual)(state, nextState) ? state : nextState;
1562
+ return (0, _es.default)(state, nextState) ? state : nextState;
1409
1563
  }
1410
1564
 
1411
1565
  case 'HIDE_INSERTION_POINT':
@@ -1549,7 +1703,7 @@ const blockListSettings = function () {
1549
1703
  return state;
1550
1704
  }
1551
1705
 
1552
- if ((0, _lodash.isEqual)(state[clientId], action.settings)) {
1706
+ if ((0, _es.default)(state[clientId], action.settings)) {
1553
1707
  return state;
1554
1708
  }
1555
1709
 
@@ -1784,6 +1938,7 @@ function temporarilyEditingAsBlocks() {
1784
1938
  var _default = (0, _data.combineReducers)({
1785
1939
  blocks,
1786
1940
  isTyping,
1941
+ isBlockInterfaceHidden,
1787
1942
  draggedBlocks,
1788
1943
  selection,
1789
1944
  isMultiSelecting,