@wordpress/block-editor 7.0.2 → 8.0.1

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 (801) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +45 -1
  3. package/build/components/autocomplete/index.js +1 -1
  4. package/build/components/autocomplete/index.js.map +1 -1
  5. package/build/components/block-actions/index.js +8 -4
  6. package/build/components/block-actions/index.js.map +1 -1
  7. package/build/components/block-alignment-control/ui.js +61 -14
  8. package/build/components/block-alignment-control/ui.js.map +1 -1
  9. package/build/components/block-alignment-control/use-available-alignments.js +25 -3
  10. package/build/components/block-alignment-control/use-available-alignments.js.map +1 -1
  11. package/build/components/block-controls/fill.js +2 -2
  12. package/build/components/block-controls/fill.js.map +1 -1
  13. package/build/components/block-controls/hook.js +3 -3
  14. package/build/components/block-controls/hook.js.map +1 -1
  15. package/build/components/block-icon/index.js +5 -1
  16. package/build/components/block-icon/index.js.map +1 -1
  17. package/build/components/block-icon/index.native.js +9 -11
  18. package/build/components/block-icon/index.native.js.map +1 -1
  19. package/build/components/block-inspector/index.js +8 -0
  20. package/build/components/block-inspector/index.js.map +1 -1
  21. package/build/components/block-list/block-html.js +5 -0
  22. package/build/components/block-list/block-html.js.map +1 -1
  23. package/build/components/block-list/block.js +12 -5
  24. package/build/components/block-list/block.js.map +1 -1
  25. package/build/components/block-list/block.native.js +4 -3
  26. package/build/components/block-list/block.native.js.map +1 -1
  27. package/build/components/block-list/index.native.js +1 -1
  28. package/build/components/block-list/index.native.js.map +1 -1
  29. package/build/components/block-list/use-block-props/use-multi-selection.js +21 -8
  30. package/build/components/block-list/use-block-props/use-multi-selection.js.map +1 -1
  31. package/build/components/block-list-appender/index.js +9 -1
  32. package/build/components/block-list-appender/index.js.map +1 -1
  33. package/build/components/block-mover/index.js +4 -4
  34. package/build/components/block-mover/index.js.map +1 -1
  35. package/build/components/block-mover/index.native.js +4 -4
  36. package/build/components/block-mover/index.native.js.map +1 -1
  37. package/build/components/block-navigation/dropdown.js +0 -1
  38. package/build/components/block-navigation/dropdown.js.map +1 -1
  39. package/build/components/block-patterns-list/index.js +1 -8
  40. package/build/components/block-patterns-list/index.js.map +1 -1
  41. package/build/components/block-preview/auto.js +1 -1
  42. package/build/components/block-preview/auto.js.map +1 -1
  43. package/build/components/block-settings/container.native.js +5 -2
  44. package/build/components/block-settings/container.native.js.map +1 -1
  45. package/build/components/block-settings-menu/block-settings-dropdown.js +26 -5
  46. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  47. package/build/components/block-settings-menu-controls/index.js +10 -3
  48. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  49. package/build/components/block-styles/preview.native.js +2 -2
  50. package/build/components/block-styles/preview.native.js.map +1 -1
  51. package/build/components/block-switcher/block-styles-menu.js +1 -1
  52. package/build/components/block-switcher/block-styles-menu.js.map +1 -1
  53. package/build/components/block-switcher/index.js +10 -3
  54. package/build/components/block-switcher/index.js.map +1 -1
  55. package/build/components/block-title/index.js +3 -2
  56. package/build/components/block-title/index.js.map +1 -1
  57. package/build/components/block-tools/block-popover.js +2 -4
  58. package/build/components/block-tools/block-popover.js.map +1 -1
  59. package/build/components/block-tools/index.js +4 -1
  60. package/build/components/block-tools/index.js.map +1 -1
  61. package/build/components/block-tools/insertion-point.js +96 -7
  62. package/build/components/block-tools/insertion-point.js.map +1 -1
  63. package/build/components/border-radius-control/index.js.map +1 -1
  64. package/build/components/border-radius-control/utils.js +17 -8
  65. package/build/components/border-radius-control/utils.js.map +1 -1
  66. package/build/components/colors/utils.js +11 -3
  67. package/build/components/colors/utils.js.map +1 -1
  68. package/build/components/colors-gradients/control.js +22 -57
  69. package/build/components/colors-gradients/control.js.map +1 -1
  70. package/build/components/colors-gradients/panel-color-gradient-settings.js +83 -7
  71. package/build/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  72. package/build/components/contrast-checker/index.js +18 -12
  73. package/build/components/contrast-checker/index.js.map +1 -1
  74. package/build/components/copy-handler/index.js +9 -3
  75. package/build/components/copy-handler/index.js.map +1 -1
  76. package/build/components/default-block-appender/index.js +2 -2
  77. package/build/components/default-block-appender/index.js.map +1 -1
  78. package/build/components/duotone-control/index.js +41 -39
  79. package/build/components/duotone-control/index.js.map +1 -1
  80. package/build/components/editor-styles/index.js +9 -3
  81. package/build/components/editor-styles/index.js.map +1 -1
  82. package/build/components/font-appearance-control/index.js +32 -21
  83. package/build/components/font-appearance-control/index.js.map +1 -1
  84. package/build/components/iframe/index.js +6 -4
  85. package/build/components/iframe/index.js.map +1 -1
  86. package/build/components/image-editor/aspect-ratio-dropdown.js +126 -0
  87. package/build/components/image-editor/aspect-ratio-dropdown.js.map +1 -0
  88. package/build/components/image-editor/constants.js +16 -0
  89. package/build/components/image-editor/constants.js.map +1 -0
  90. package/build/components/image-editor/context.js +59 -0
  91. package/build/components/image-editor/context.js.map +1 -0
  92. package/build/components/image-editor/cropper.js +83 -0
  93. package/build/components/image-editor/cropper.js.map +1 -0
  94. package/build/components/image-editor/form-controls.js +36 -0
  95. package/build/components/image-editor/form-controls.js.map +1 -0
  96. package/build/components/image-editor/index.js +60 -0
  97. package/build/components/image-editor/index.js.map +1 -0
  98. package/build/components/image-editor/rotation-button.js +37 -0
  99. package/build/components/image-editor/rotation-button.js.map +1 -0
  100. package/build/components/image-editor/use-save-image.js +84 -0
  101. package/build/components/image-editor/use-save-image.js.map +1 -0
  102. package/build/components/image-editor/use-transform-image.js +135 -0
  103. package/build/components/image-editor/use-transform-image.js.map +1 -0
  104. package/build/components/image-editor/zoom-dropdown.js +55 -0
  105. package/build/components/image-editor/zoom-dropdown.js.map +1 -0
  106. package/build/components/image-size-control/use-dimension-handler.js +14 -3
  107. package/build/components/image-size-control/use-dimension-handler.js.map +1 -1
  108. package/build/components/index.js +36 -20
  109. package/build/components/index.js.map +1 -1
  110. package/build/components/index.native.js +2 -2
  111. package/build/components/index.native.js.map +1 -1
  112. package/build/components/inner-blocks/button-block-appender.js +11 -1
  113. package/build/components/inner-blocks/button-block-appender.js.map +1 -1
  114. package/build/components/inner-blocks/index.js +8 -5
  115. package/build/components/inner-blocks/index.js.map +1 -1
  116. package/build/components/inner-blocks/index.native.js +4 -3
  117. package/build/components/inner-blocks/index.native.js.map +1 -1
  118. package/build/components/inner-blocks/use-nested-settings-update.js +24 -13
  119. package/build/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  120. package/build/components/inserter/block-patterns-explorer/explorer.js +62 -0
  121. package/build/components/inserter/block-patterns-explorer/explorer.js.map +1 -0
  122. package/build/components/inserter/block-patterns-explorer/patterns-list.js +111 -0
  123. package/build/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -0
  124. package/build/components/inserter/block-patterns-explorer/sidebar.js +78 -0
  125. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -0
  126. package/build/components/inserter/block-patterns-tab.js +74 -35
  127. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  128. package/build/components/inserter/block-types-tab.native.js +3 -11
  129. package/build/components/inserter/block-types-tab.native.js.map +1 -1
  130. package/build/components/inserter/hooks/use-block-type-impressions.native.js +4 -7
  131. package/build/components/inserter/hooks/use-block-type-impressions.native.js.map +1 -1
  132. package/build/components/inserter/hooks/use-clipboard-block.native.js +5 -4
  133. package/build/components/inserter/hooks/use-clipboard-block.native.js.map +1 -1
  134. package/build/components/inserter/index.js +12 -4
  135. package/build/components/inserter/index.js.map +1 -1
  136. package/build/components/inserter/index.native.js +1 -7
  137. package/build/components/inserter/index.native.js.map +1 -1
  138. package/build/components/inserter/library.js +2 -0
  139. package/build/components/inserter/library.js.map +1 -1
  140. package/build/components/inserter/menu.js +2 -1
  141. package/build/components/inserter/menu.js.map +1 -1
  142. package/build/components/inserter/menu.native.js +11 -15
  143. package/build/components/inserter/menu.native.js.map +1 -1
  144. package/build/components/inserter/pattern-panel.js +19 -10
  145. package/build/components/inserter/pattern-panel.js.map +1 -1
  146. package/build/components/inserter/preview-panel.js +1 -1
  147. package/build/components/inserter/preview-panel.js.map +1 -1
  148. package/build/components/inserter/quick-inserter.js +2 -1
  149. package/build/components/inserter/quick-inserter.js.map +1 -1
  150. package/build/components/inserter/reusable-blocks-tab.native.js +5 -6
  151. package/build/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  152. package/build/components/inserter/search-results.native.js +6 -11
  153. package/build/components/inserter/search-results.native.js.map +1 -1
  154. package/build/components/inserter/utils.native.js +44 -0
  155. package/build/components/inserter/utils.native.js.map +1 -0
  156. package/build/components/inspector-controls/block-support-slot-container.js +28 -0
  157. package/build/components/inspector-controls/block-support-slot-container.js.map +1 -0
  158. package/build/components/inspector-controls/block-support-tools-panel.js +78 -0
  159. package/build/components/inspector-controls/block-support-tools-panel.js.map +1 -0
  160. package/build/components/inspector-controls/fill.js +16 -1
  161. package/build/components/inspector-controls/fill.js.map +1 -1
  162. package/build/components/inspector-controls/groups.js +5 -1
  163. package/build/components/inspector-controls/groups.js.map +1 -1
  164. package/build/components/inspector-controls/slot.js +15 -0
  165. package/build/components/inspector-controls/slot.js.map +1 -1
  166. package/build/components/letter-spacing-control/index.js +9 -6
  167. package/build/components/letter-spacing-control/index.js.map +1 -1
  168. package/build/components/link-control/index.js +93 -34
  169. package/build/components/link-control/index.js.map +1 -1
  170. package/build/components/link-control/link-preview.js +45 -15
  171. package/build/components/link-control/link-preview.js.map +1 -1
  172. package/build/components/link-control/search-input.js +25 -7
  173. package/build/components/link-control/search-input.js.map +1 -1
  174. package/build/components/list-view/block-contents.js +1 -20
  175. package/build/components/list-view/block-contents.js.map +1 -1
  176. package/build/components/list-view/block.js +54 -69
  177. package/build/components/list-view/block.js.map +1 -1
  178. package/build/components/list-view/branch.js +102 -76
  179. package/build/components/list-view/branch.js.map +1 -1
  180. package/build/components/list-view/index.js +45 -20
  181. package/build/components/list-view/index.js.map +1 -1
  182. package/build/components/list-view/leaf.js +2 -2
  183. package/build/components/list-view/leaf.js.map +1 -1
  184. package/build/components/list-view/list-item.js +3 -2
  185. package/build/components/list-view/list-item.js.map +1 -1
  186. package/build/components/list-view/use-list-view-client-ids.js +13 -54
  187. package/build/components/list-view/use-list-view-client-ids.js.map +1 -1
  188. package/build/components/media-placeholder/index.js +29 -20
  189. package/build/components/media-placeholder/index.js.map +1 -1
  190. package/build/components/media-replace-flow/index.js +5 -3
  191. package/build/components/media-replace-flow/index.js.map +1 -1
  192. package/build/components/navigable-toolbar/index.js +1 -4
  193. package/build/components/navigable-toolbar/index.js.map +1 -1
  194. package/build/components/observe-typing/index.js +1 -1
  195. package/build/components/observe-typing/index.js.map +1 -1
  196. package/build/components/plain-text/index.native.js +30 -1
  197. package/build/components/plain-text/index.native.js.map +1 -1
  198. package/build/components/rich-text/embed-handler-picker.native.js +66 -0
  199. package/build/components/rich-text/embed-handler-picker.native.js.map +1 -0
  200. package/build/components/rich-text/format-edit.js +28 -2
  201. package/build/components/rich-text/format-edit.js.map +1 -1
  202. package/build/components/rich-text/format-toolbar/index.js +32 -11
  203. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  204. package/build/components/rich-text/index.js +5 -1
  205. package/build/components/rich-text/index.js.map +1 -1
  206. package/build/components/rich-text/index.native.js +41 -2
  207. package/build/components/rich-text/index.native.js.map +1 -1
  208. package/build/components/rich-text/use-paste-handler.js +28 -9
  209. package/build/components/rich-text/use-paste-handler.js.map +1 -1
  210. package/build/components/rich-text/utils.js +22 -0
  211. package/build/components/rich-text/utils.js.map +1 -1
  212. package/build/components/typewriter/index.js +1 -1
  213. package/build/components/typewriter/index.js.map +1 -1
  214. package/build/components/url-input/index.js +25 -11
  215. package/build/components/url-input/index.js.map +1 -1
  216. package/build/components/use-moving-animation/index.js +13 -10
  217. package/build/components/use-moving-animation/index.js.map +1 -1
  218. package/build/components/use-on-block-drop/index.js +2 -1
  219. package/build/components/use-on-block-drop/index.js.map +1 -1
  220. package/build/components/use-setting/index.js +48 -9
  221. package/build/components/use-setting/index.js.map +1 -1
  222. package/build/components/writing-flow/use-multi-selection.js +6 -0
  223. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  224. package/build/components/writing-flow/use-tab-nav.js +10 -1
  225. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  226. package/build/hooks/align.js +13 -10
  227. package/build/hooks/align.js.map +1 -1
  228. package/build/hooks/anchor.js +1 -1
  229. package/build/hooks/anchor.js.map +1 -1
  230. package/build/hooks/border.js +5 -5
  231. package/build/hooks/border.js.map +1 -1
  232. package/build/hooks/color-panel.js +5 -2
  233. package/build/hooks/color-panel.js.map +1 -1
  234. package/build/hooks/color.js +1 -1
  235. package/build/hooks/color.js.map +1 -1
  236. package/build/hooks/dimensions.js +23 -27
  237. package/build/hooks/dimensions.js.map +1 -1
  238. package/build/hooks/duotone.js +60 -16
  239. package/build/hooks/duotone.js.map +1 -1
  240. package/build/hooks/font-appearance.js +49 -6
  241. package/build/hooks/font-appearance.js.map +1 -1
  242. package/build/hooks/font-family.js +123 -32
  243. package/build/hooks/font-family.js.map +1 -1
  244. package/build/hooks/font-size.js +51 -9
  245. package/build/hooks/font-size.js.map +1 -1
  246. package/build/hooks/gap.js +2 -1
  247. package/build/hooks/gap.js.map +1 -1
  248. package/build/hooks/index.js +10 -0
  249. package/build/hooks/index.js.map +1 -1
  250. package/build/hooks/index.native.js +8 -0
  251. package/build/hooks/index.native.js.map +1 -1
  252. package/build/hooks/letter-spacing.js +44 -7
  253. package/build/hooks/letter-spacing.js.map +1 -1
  254. package/build/hooks/line-height.js +45 -8
  255. package/build/hooks/line-height.js.map +1 -1
  256. package/build/hooks/lock.js +43 -0
  257. package/build/hooks/lock.js.map +1 -0
  258. package/build/hooks/margin.js +1 -1
  259. package/build/hooks/margin.js.map +1 -1
  260. package/build/hooks/padding.js +1 -1
  261. package/build/hooks/padding.js.map +1 -1
  262. package/build/hooks/style.js +7 -4
  263. package/build/hooks/style.js.map +1 -1
  264. package/build/hooks/text-decoration.js +42 -6
  265. package/build/hooks/text-decoration.js.map +1 -1
  266. package/build/hooks/text-transform.js +42 -6
  267. package/build/hooks/text-transform.js.map +1 -1
  268. package/build/hooks/typography.js +108 -8
  269. package/build/hooks/typography.js.map +1 -1
  270. package/build/hooks/use-cached-truthy.js +29 -0
  271. package/build/hooks/use-cached-truthy.js.map +1 -0
  272. package/build/index.js +7 -0
  273. package/build/index.js.map +1 -1
  274. package/build/layouts/flex.js +160 -34
  275. package/build/layouts/flex.js.map +1 -1
  276. package/build/layouts/flow.js +75 -8
  277. package/build/layouts/flow.js.map +1 -1
  278. package/build/store/actions.js +323 -265
  279. package/build/store/actions.js.map +1 -1
  280. package/build/store/defaults.native.js +13 -1
  281. package/build/store/defaults.native.js.map +1 -1
  282. package/build/store/index.js +1 -3
  283. package/build/store/index.js.map +1 -1
  284. package/build/store/reducer.js +33 -22
  285. package/build/store/reducer.js.map +1 -1
  286. package/build/store/selectors.js +172 -38
  287. package/build/store/selectors.js.map +1 -1
  288. package/build/utils/index.js +10 -1
  289. package/build/utils/index.js.map +1 -1
  290. package/build/utils/parse-css-unit-to-px.js +51 -1
  291. package/build/utils/parse-css-unit-to-px.js.map +1 -1
  292. package/build/utils/transform-styles/transforms/wrap.js +16 -0
  293. package/build/utils/transform-styles/transforms/wrap.js.map +1 -1
  294. package/build-module/components/autocomplete/index.js +2 -2
  295. package/build-module/components/autocomplete/index.js.map +1 -1
  296. package/build-module/components/block-actions/index.js +8 -4
  297. package/build-module/components/block-actions/index.js.map +1 -1
  298. package/build-module/components/block-alignment-control/ui.js +64 -17
  299. package/build-module/components/block-alignment-control/ui.js.map +1 -1
  300. package/build-module/components/block-alignment-control/use-available-alignments.js +25 -3
  301. package/build-module/components/block-alignment-control/use-available-alignments.js.map +1 -1
  302. package/build-module/components/block-controls/fill.js +2 -2
  303. package/build-module/components/block-controls/fill.js.map +1 -1
  304. package/build-module/components/block-controls/hook.js +3 -3
  305. package/build-module/components/block-controls/hook.js.map +1 -1
  306. package/build-module/components/block-icon/index.js +5 -1
  307. package/build-module/components/block-icon/index.js.map +1 -1
  308. package/build-module/components/block-icon/index.native.js +10 -11
  309. package/build-module/components/block-icon/index.native.js.map +1 -1
  310. package/build-module/components/block-inspector/index.js +8 -0
  311. package/build-module/components/block-inspector/index.js.map +1 -1
  312. package/build-module/components/block-list/block-html.js +5 -0
  313. package/build-module/components/block-list/block-html.js.map +1 -1
  314. package/build-module/components/block-list/block.js +12 -5
  315. package/build-module/components/block-list/block.js.map +1 -1
  316. package/build-module/components/block-list/block.native.js +4 -3
  317. package/build-module/components/block-list/block.native.js.map +1 -1
  318. package/build-module/components/block-list/index.native.js +1 -1
  319. package/build-module/components/block-list/index.native.js.map +1 -1
  320. package/build-module/components/block-list/use-block-props/use-multi-selection.js +21 -8
  321. package/build-module/components/block-list/use-block-props/use-multi-selection.js.map +1 -1
  322. package/build-module/components/block-list-appender/index.js +9 -1
  323. package/build-module/components/block-list-appender/index.js.map +1 -1
  324. package/build-module/components/block-mover/index.js +4 -4
  325. package/build-module/components/block-mover/index.js.map +1 -1
  326. package/build-module/components/block-mover/index.native.js +4 -4
  327. package/build-module/components/block-mover/index.native.js.map +1 -1
  328. package/build-module/components/block-navigation/dropdown.js +0 -1
  329. package/build-module/components/block-navigation/dropdown.js.map +1 -1
  330. package/build-module/components/block-patterns-list/index.js +1 -6
  331. package/build-module/components/block-patterns-list/index.js.map +1 -1
  332. package/build-module/components/block-preview/auto.js +1 -1
  333. package/build-module/components/block-preview/auto.js.map +1 -1
  334. package/build-module/components/block-settings/container.native.js +6 -3
  335. package/build-module/components/block-settings/container.native.js.map +1 -1
  336. package/build-module/components/block-settings-menu/block-settings-dropdown.js +28 -7
  337. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  338. package/build-module/components/block-settings-menu-controls/index.js +10 -3
  339. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  340. package/build-module/components/block-styles/preview.native.js +2 -2
  341. package/build-module/components/block-styles/preview.native.js.map +1 -1
  342. package/build-module/components/block-switcher/block-styles-menu.js +1 -1
  343. package/build-module/components/block-switcher/block-styles-menu.js.map +1 -1
  344. package/build-module/components/block-switcher/index.js +10 -3
  345. package/build-module/components/block-switcher/index.js.map +1 -1
  346. package/build-module/components/block-title/index.js +3 -2
  347. package/build-module/components/block-title/index.js.map +1 -1
  348. package/build-module/components/block-tools/block-popover.js +3 -5
  349. package/build-module/components/block-tools/block-popover.js.map +1 -1
  350. package/build-module/components/block-tools/index.js +4 -1
  351. package/build-module/components/block-tools/index.js.map +1 -1
  352. package/build-module/components/block-tools/insertion-point.js +96 -8
  353. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  354. package/build-module/components/border-radius-control/index.js.map +1 -1
  355. package/build-module/components/border-radius-control/utils.js +16 -9
  356. package/build-module/components/border-radius-control/utils.js.map +1 -1
  357. package/build-module/components/colors/utils.js +9 -3
  358. package/build-module/components/colors/utils.js.map +1 -1
  359. package/build-module/components/colors-gradients/control.js +26 -63
  360. package/build-module/components/colors-gradients/control.js.map +1 -1
  361. package/build-module/components/colors-gradients/panel-color-gradient-settings.js +84 -7
  362. package/build-module/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  363. package/build-module/components/contrast-checker/index.js +13 -10
  364. package/build-module/components/contrast-checker/index.js.map +1 -1
  365. package/build-module/components/copy-handler/index.js +9 -3
  366. package/build-module/components/copy-handler/index.js.map +1 -1
  367. package/build-module/components/default-block-appender/index.js +2 -2
  368. package/build-module/components/default-block-appender/index.js.map +1 -1
  369. package/build-module/components/duotone-control/index.js +43 -39
  370. package/build-module/components/duotone-control/index.js.map +1 -1
  371. package/build-module/components/editor-styles/index.js +7 -3
  372. package/build-module/components/editor-styles/index.js.map +1 -1
  373. package/build-module/components/font-appearance-control/index.js +28 -21
  374. package/build-module/components/font-appearance-control/index.js.map +1 -1
  375. package/build-module/components/iframe/index.js +6 -4
  376. package/build-module/components/iframe/index.js.map +1 -1
  377. package/build-module/components/image-editor/aspect-ratio-dropdown.js +115 -0
  378. package/build-module/components/image-editor/aspect-ratio-dropdown.js.map +1 -0
  379. package/build-module/components/image-editor/constants.js +7 -0
  380. package/build-module/components/image-editor/constants.js.map +1 -0
  381. package/build-module/components/image-editor/context.js +44 -0
  382. package/build-module/components/image-editor/context.js.map +1 -0
  383. package/build-module/components/image-editor/cropper.js +69 -0
  384. package/build-module/components/image-editor/cropper.js.map +1 -0
  385. package/build-module/components/image-editor/form-controls.js +26 -0
  386. package/build-module/components/image-editor/form-controls.js.map +1 -0
  387. package/build-module/components/image-editor/index.js +37 -0
  388. package/build-module/components/image-editor/index.js.map +1 -0
  389. package/build-module/components/image-editor/rotation-button.js +26 -0
  390. package/build-module/components/image-editor/rotation-button.js.map +1 -0
  391. package/build-module/components/image-editor/use-save-image.js +70 -0
  392. package/build-module/components/image-editor/use-save-image.js.map +1 -0
  393. package/build-module/components/image-editor/use-transform-image.js +127 -0
  394. package/build-module/components/image-editor/use-transform-image.js.map +1 -0
  395. package/build-module/components/image-editor/zoom-dropdown.js +43 -0
  396. package/build-module/components/image-editor/zoom-dropdown.js.map +1 -0
  397. package/build-module/components/image-size-control/use-dimension-handler.js +13 -2
  398. package/build-module/components/image-size-control/use-dimension-handler.js.map +1 -1
  399. package/build-module/components/index.js +4 -3
  400. package/build-module/components/index.js.map +1 -1
  401. package/build-module/components/index.native.js +1 -1
  402. package/build-module/components/index.native.js.map +1 -1
  403. package/build-module/components/inner-blocks/button-block-appender.js +10 -1
  404. package/build-module/components/inner-blocks/button-block-appender.js.map +1 -1
  405. package/build-module/components/inner-blocks/index.js +9 -6
  406. package/build-module/components/inner-blocks/index.js.map +1 -1
  407. package/build-module/components/inner-blocks/index.native.js +5 -4
  408. package/build-module/components/inner-blocks/index.native.js.map +1 -1
  409. package/build-module/components/inner-blocks/use-nested-settings-update.js +24 -13
  410. package/build-module/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  411. package/build-module/components/inserter/block-patterns-explorer/explorer.js +50 -0
  412. package/build-module/components/inserter/block-patterns-explorer/explorer.js.map +1 -0
  413. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js +92 -0
  414. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -0
  415. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +69 -0
  416. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -0
  417. package/build-module/components/inserter/block-patterns-tab.js +75 -36
  418. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  419. package/build-module/components/inserter/block-types-tab.native.js +2 -10
  420. package/build-module/components/inserter/block-types-tab.native.js.map +1 -1
  421. package/build-module/components/inserter/hooks/use-block-type-impressions.native.js +4 -7
  422. package/build-module/components/inserter/hooks/use-block-type-impressions.native.js.map +1 -1
  423. package/build-module/components/inserter/hooks/use-clipboard-block.native.js +5 -4
  424. package/build-module/components/inserter/hooks/use-clipboard-block.native.js.map +1 -1
  425. package/build-module/components/inserter/index.js +12 -4
  426. package/build-module/components/inserter/index.js.map +1 -1
  427. package/build-module/components/inserter/index.native.js +1 -7
  428. package/build-module/components/inserter/index.native.js.map +1 -1
  429. package/build-module/components/inserter/library.js +2 -0
  430. package/build-module/components/inserter/library.js.map +1 -1
  431. package/build-module/components/inserter/menu.js +2 -1
  432. package/build-module/components/inserter/menu.js.map +1 -1
  433. package/build-module/components/inserter/menu.native.js +10 -15
  434. package/build-module/components/inserter/menu.native.js.map +1 -1
  435. package/build-module/components/inserter/pattern-panel.js +21 -13
  436. package/build-module/components/inserter/pattern-panel.js.map +1 -1
  437. package/build-module/components/inserter/preview-panel.js +1 -1
  438. package/build-module/components/inserter/preview-panel.js.map +1 -1
  439. package/build-module/components/inserter/quick-inserter.js +2 -1
  440. package/build-module/components/inserter/quick-inserter.js.map +1 -1
  441. package/build-module/components/inserter/reusable-blocks-tab.native.js +4 -5
  442. package/build-module/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  443. package/build-module/components/inserter/search-results.native.js +5 -10
  444. package/build-module/components/inserter/search-results.native.js.map +1 -1
  445. package/build-module/components/inserter/utils.native.js +35 -0
  446. package/build-module/components/inserter/utils.native.js.map +1 -0
  447. package/build-module/components/inspector-controls/block-support-slot-container.js +18 -0
  448. package/build-module/components/inspector-controls/block-support-slot-container.js.map +1 -0
  449. package/build-module/components/inspector-controls/block-support-tools-panel.js +67 -0
  450. package/build-module/components/inspector-controls/block-support-tools-panel.js.map +1 -0
  451. package/build-module/components/inspector-controls/fill.js +16 -2
  452. package/build-module/components/inspector-controls/fill.js.map +1 -1
  453. package/build-module/components/inspector-controls/groups.js +5 -1
  454. package/build-module/components/inspector-controls/groups.js.map +1 -1
  455. package/build-module/components/inspector-controls/slot.js +13 -0
  456. package/build-module/components/inspector-controls/slot.js.map +1 -1
  457. package/build-module/components/letter-spacing-control/index.js +9 -6
  458. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  459. package/build-module/components/link-control/index.js +93 -35
  460. package/build-module/components/link-control/index.js.map +1 -1
  461. package/build-module/components/link-control/link-preview.js +46 -17
  462. package/build-module/components/link-control/link-preview.js.map +1 -1
  463. package/build-module/components/link-control/search-input.js +24 -7
  464. package/build-module/components/link-control/search-input.js.map +1 -1
  465. package/build-module/components/list-view/block-contents.js +1 -18
  466. package/build-module/components/list-view/block-contents.js.map +1 -1
  467. package/build-module/components/list-view/block.js +56 -71
  468. package/build-module/components/list-view/block.js.map +1 -1
  469. package/build-module/components/list-view/branch.js +102 -78
  470. package/build-module/components/list-view/branch.js.map +1 -1
  471. package/build-module/components/list-view/index.js +48 -23
  472. package/build-module/components/list-view/index.js.map +1 -1
  473. package/build-module/components/list-view/leaf.js +2 -2
  474. package/build-module/components/list-view/leaf.js.map +1 -1
  475. package/build-module/components/list-view/list-item.js +3 -2
  476. package/build-module/components/list-view/list-item.js.map +1 -1
  477. package/build-module/components/list-view/use-list-view-client-ids.js +13 -54
  478. package/build-module/components/list-view/use-list-view-client-ids.js.map +1 -1
  479. package/build-module/components/media-placeholder/index.js +29 -20
  480. package/build-module/components/media-placeholder/index.js.map +1 -1
  481. package/build-module/components/media-replace-flow/index.js +5 -3
  482. package/build-module/components/media-replace-flow/index.js.map +1 -1
  483. package/build-module/components/navigable-toolbar/index.js +1 -4
  484. package/build-module/components/navigable-toolbar/index.js.map +1 -1
  485. package/build-module/components/observe-typing/index.js +1 -1
  486. package/build-module/components/observe-typing/index.js.map +1 -1
  487. package/build-module/components/plain-text/index.native.js +29 -2
  488. package/build-module/components/plain-text/index.native.js.map +1 -1
  489. package/build-module/components/rich-text/embed-handler-picker.native.js +54 -0
  490. package/build-module/components/rich-text/embed-handler-picker.native.js.map +1 -0
  491. package/build-module/components/rich-text/format-edit.js +28 -3
  492. package/build-module/components/rich-text/format-edit.js.map +1 -1
  493. package/build-module/components/rich-text/format-toolbar/index.js +29 -11
  494. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  495. package/build-module/components/rich-text/index.js +4 -1
  496. package/build-module/components/rich-text/index.js.map +1 -1
  497. package/build-module/components/rich-text/index.native.js +41 -3
  498. package/build-module/components/rich-text/index.native.js.map +1 -1
  499. package/build-module/components/rich-text/use-paste-handler.js +28 -9
  500. package/build-module/components/rich-text/use-paste-handler.js.map +1 -1
  501. package/build-module/components/rich-text/utils.js +20 -0
  502. package/build-module/components/rich-text/utils.js.map +1 -1
  503. package/build-module/components/typewriter/index.js +1 -1
  504. package/build-module/components/typewriter/index.js.map +1 -1
  505. package/build-module/components/url-input/index.js +25 -11
  506. package/build-module/components/url-input/index.js.map +1 -1
  507. package/build-module/components/use-moving-animation/index.js +13 -10
  508. package/build-module/components/use-moving-animation/index.js.map +1 -1
  509. package/build-module/components/use-on-block-drop/index.js +3 -2
  510. package/build-module/components/use-on-block-drop/index.js.map +1 -1
  511. package/build-module/components/use-setting/index.js +48 -9
  512. package/build-module/components/use-setting/index.js.map +1 -1
  513. package/build-module/components/writing-flow/use-multi-selection.js +6 -0
  514. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  515. package/build-module/components/writing-flow/use-tab-nav.js +10 -1
  516. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  517. package/build-module/hooks/align.js +13 -10
  518. package/build-module/hooks/align.js.map +1 -1
  519. package/build-module/hooks/anchor.js +1 -1
  520. package/build-module/hooks/anchor.js.map +1 -1
  521. package/build-module/hooks/border.js +5 -5
  522. package/build-module/hooks/border.js.map +1 -1
  523. package/build-module/hooks/color-panel.js +6 -3
  524. package/build-module/hooks/color-panel.js.map +1 -1
  525. package/build-module/hooks/color.js +1 -1
  526. package/build-module/hooks/color.js.map +1 -1
  527. package/build-module/hooks/dimensions.js +24 -27
  528. package/build-module/hooks/dimensions.js.map +1 -1
  529. package/build-module/hooks/duotone.js +59 -16
  530. package/build-module/hooks/duotone.js.map +1 -1
  531. package/build-module/hooks/font-appearance.js +45 -6
  532. package/build-module/hooks/font-appearance.js.map +1 -1
  533. package/build-module/hooks/font-family.js +117 -33
  534. package/build-module/hooks/font-family.js.map +1 -1
  535. package/build-module/hooks/font-size.js +47 -9
  536. package/build-module/hooks/font-size.js.map +1 -1
  537. package/build-module/hooks/gap.js +2 -1
  538. package/build-module/hooks/gap.js.map +1 -1
  539. package/build-module/hooks/index.js +2 -0
  540. package/build-module/hooks/index.js.map +1 -1
  541. package/build-module/hooks/index.native.js +1 -0
  542. package/build-module/hooks/index.native.js.map +1 -1
  543. package/build-module/hooks/letter-spacing.js +40 -7
  544. package/build-module/hooks/letter-spacing.js.map +1 -1
  545. package/build-module/hooks/line-height.js +41 -8
  546. package/build-module/hooks/line-height.js.map +1 -1
  547. package/build-module/hooks/lock.js +33 -0
  548. package/build-module/hooks/lock.js.map +1 -0
  549. package/build-module/hooks/margin.js +1 -1
  550. package/build-module/hooks/margin.js.map +1 -1
  551. package/build-module/hooks/padding.js +1 -1
  552. package/build-module/hooks/padding.js.map +1 -1
  553. package/build-module/hooks/style.js +7 -4
  554. package/build-module/hooks/style.js.map +1 -1
  555. package/build-module/hooks/text-decoration.js +38 -6
  556. package/build-module/hooks/text-decoration.js.map +1 -1
  557. package/build-module/hooks/text-transform.js +38 -6
  558. package/build-module/hooks/text-transform.js.map +1 -1
  559. package/build-module/hooks/typography.js +117 -17
  560. package/build-module/hooks/typography.js.map +1 -1
  561. package/build-module/hooks/use-cached-truthy.js +21 -0
  562. package/build-module/hooks/use-cached-truthy.js.map +1 -0
  563. package/build-module/index.js +1 -1
  564. package/build-module/index.js.map +1 -1
  565. package/build-module/layouts/flex.js +163 -38
  566. package/build-module/layouts/flex.js.map +1 -1
  567. package/build-module/layouts/flow.js +74 -8
  568. package/build-module/layouts/flow.js.map +1 -1
  569. package/build-module/store/actions.js +286 -241
  570. package/build-module/store/actions.js.map +1 -1
  571. package/build-module/store/defaults.native.js +12 -1
  572. package/build-module/store/defaults.native.js.map +1 -1
  573. package/build-module/store/index.js +1 -2
  574. package/build-module/store/index.js.map +1 -1
  575. package/build-module/store/reducer.js +33 -22
  576. package/build-module/store/reducer.js.map +1 -1
  577. package/build-module/store/selectors.js +160 -34
  578. package/build-module/store/selectors.js.map +1 -1
  579. package/build-module/utils/index.js +1 -0
  580. package/build-module/utils/index.js.map +1 -1
  581. package/build-module/utils/parse-css-unit-to-px.js +48 -1
  582. package/build-module/utils/parse-css-unit-to-px.js.map +1 -1
  583. package/build-module/utils/transform-styles/transforms/wrap.js +16 -0
  584. package/build-module/utils/transform-styles/transforms/wrap.js.map +1 -1
  585. package/build-style/style-rtl.css +267 -144
  586. package/build-style/style.css +267 -144
  587. package/package.json +28 -27
  588. package/src/components/autocomplete/index.js +5 -2
  589. package/src/components/block-actions/index.js +9 -5
  590. package/src/components/block-alignment-control/style.scss +5 -0
  591. package/src/components/block-alignment-control/test/__snapshots__/index.js.snap +15 -1
  592. package/src/components/block-alignment-control/test/index.native.js +37 -0
  593. package/src/components/block-alignment-control/ui.js +98 -27
  594. package/src/components/block-alignment-control/use-available-alignments.js +31 -10
  595. package/src/components/block-controls/fill.js +5 -2
  596. package/src/components/block-controls/hook.js +3 -3
  597. package/src/components/block-draggable/style.scss +19 -4
  598. package/src/components/block-icon/index.js +4 -1
  599. package/src/components/block-icon/index.native.js +10 -16
  600. package/src/components/block-inspector/index.js +10 -0
  601. package/src/components/block-list/block-html.js +5 -0
  602. package/src/components/block-list/block.js +11 -3
  603. package/src/components/block-list/block.native.js +5 -3
  604. package/src/components/block-list/index.native.js +1 -1
  605. package/src/components/block-list/style.scss +15 -0
  606. package/src/components/block-list/use-block-props/use-multi-selection.js +27 -7
  607. package/src/components/block-list-appender/index.js +8 -0
  608. package/src/components/block-mover/index.js +4 -4
  609. package/src/components/block-mover/index.native.js +4 -4
  610. package/src/components/block-mover/test/__snapshots__/index.native.js.snap +10 -6
  611. package/src/components/block-mover/test/index.native.js +26 -28
  612. package/src/components/block-navigation/dropdown.js +0 -1
  613. package/src/components/block-patterns-list/index.js +1 -8
  614. package/src/components/block-patterns-list/style.scss +22 -12
  615. package/src/components/block-preview/README.md +1 -1
  616. package/src/components/block-preview/auto.js +1 -1
  617. package/src/components/block-preview/style.scss +0 -17
  618. package/src/components/block-settings/container.native.js +7 -0
  619. package/src/components/block-settings-menu/block-settings-dropdown.js +26 -13
  620. package/src/components/block-settings-menu-controls/index.js +9 -6
  621. package/src/components/block-styles/preview.native.js +2 -2
  622. package/src/components/block-switcher/block-styles-menu.js +1 -1
  623. package/src/components/block-switcher/index.js +7 -3
  624. package/src/components/block-switcher/test/__snapshots__/index.js.snap +1 -1
  625. package/src/components/block-switcher/test/index.js +3 -0
  626. package/src/components/block-title/index.js +5 -2
  627. package/src/components/block-tools/block-popover.js +3 -5
  628. package/src/components/block-tools/index.js +5 -2
  629. package/src/components/block-tools/insertion-point.js +97 -9
  630. package/src/components/block-tools/style.scss +4 -35
  631. package/src/components/block-types-list/style.scss +0 -3
  632. package/src/components/border-radius-control/index.js +1 -0
  633. package/src/components/border-radius-control/test/utils.js +216 -0
  634. package/src/components/border-radius-control/utils.js +18 -10
  635. package/src/components/color-palette/test/__snapshots__/control.js.snap +128 -71
  636. package/src/components/colors/test/utils.js +41 -0
  637. package/src/components/colors/utils.js +9 -5
  638. package/src/components/colors-gradients/control.js +70 -110
  639. package/src/components/colors-gradients/panel-color-gradient-settings.js +79 -7
  640. package/src/components/colors-gradients/style.scss +10 -18
  641. package/src/components/colors-gradients/test/control.js +41 -66
  642. package/src/components/contrast-checker/index.js +14 -10
  643. package/src/components/copy-handler/index.js +6 -1
  644. package/src/components/default-block-appender/index.js +2 -2
  645. package/src/components/default-block-appender/test/__snapshots__/index.js.snap +3 -3
  646. package/src/components/duotone-control/index.js +49 -41
  647. package/src/components/duotone-control/style.scss +27 -12
  648. package/src/components/editor-styles/index.js +7 -4
  649. package/src/components/font-appearance-control/index.js +41 -33
  650. package/src/components/font-appearance-control/style.scss +1 -1
  651. package/src/components/iframe/index.js +4 -4
  652. package/src/components/image-editor/aspect-ratio-dropdown.js +129 -0
  653. package/src/components/image-editor/constants.js +6 -0
  654. package/src/components/image-editor/context.js +56 -0
  655. package/src/components/image-editor/cropper.js +74 -0
  656. package/src/components/image-editor/form-controls.js +22 -0
  657. package/src/components/image-editor/index.js +52 -0
  658. package/src/components/image-editor/rotation-button.js +24 -0
  659. package/src/components/image-editor/use-save-image.js +97 -0
  660. package/src/components/image-editor/use-transform-image.js +162 -0
  661. package/src/components/image-editor/zoom-dropdown.js +40 -0
  662. package/src/components/image-size-control/use-dimension-handler.js +18 -1
  663. package/src/components/index.js +7 -6
  664. package/src/components/index.native.js +1 -4
  665. package/src/components/inner-blocks/button-block-appender.js +9 -0
  666. package/src/components/inner-blocks/index.js +8 -4
  667. package/src/components/inner-blocks/index.native.js +7 -4
  668. package/src/components/inner-blocks/use-nested-settings-update.js +26 -11
  669. package/src/components/inserter/block-patterns-explorer/explorer.js +50 -0
  670. package/src/components/inserter/block-patterns-explorer/patterns-list.js +122 -0
  671. package/src/components/inserter/block-patterns-explorer/sidebar.js +73 -0
  672. package/src/components/inserter/block-patterns-tab.js +107 -73
  673. package/src/components/inserter/block-types-tab.native.js +3 -15
  674. package/src/components/inserter/hooks/use-block-type-impressions.native.js +14 -21
  675. package/src/components/inserter/hooks/use-clipboard-block.native.js +3 -2
  676. package/src/components/inserter/index.js +15 -3
  677. package/src/components/inserter/index.native.js +2 -19
  678. package/src/components/inserter/library.js +2 -0
  679. package/src/components/inserter/menu.js +4 -1
  680. package/src/components/inserter/menu.native.js +9 -14
  681. package/src/components/inserter/pattern-panel.js +33 -16
  682. package/src/components/inserter/preview-panel.js +1 -1
  683. package/src/components/inserter/quick-inserter.js +1 -1
  684. package/src/components/inserter/reusable-blocks-tab.native.js +4 -6
  685. package/src/components/inserter/search-results.native.js +5 -15
  686. package/src/components/inserter/style.scss +80 -16
  687. package/src/components/inserter/test/block-types-tab.native.js +1 -1
  688. package/src/components/inserter/test/fixtures/index.native.js +12 -0
  689. package/src/components/inserter/utils.native.js +35 -0
  690. package/src/components/inserter-list-item/style.scss +4 -2
  691. package/src/components/inspector-controls/block-support-slot-container.js +10 -0
  692. package/src/components/inspector-controls/block-support-tools-panel.js +60 -0
  693. package/src/components/inspector-controls/fill.js +23 -2
  694. package/src/components/inspector-controls/groups.js +8 -0
  695. package/src/components/inspector-controls/slot.js +15 -0
  696. package/src/components/letter-spacing-control/index.js +12 -6
  697. package/src/components/link-control/README.md +47 -14
  698. package/src/components/link-control/index.js +102 -31
  699. package/src/components/link-control/link-preview.js +53 -20
  700. package/src/components/link-control/search-input.js +21 -7
  701. package/src/components/link-control/style.scss +66 -19
  702. package/src/components/link-control/test/index.js +311 -4
  703. package/src/components/list-view/block-contents.js +17 -38
  704. package/src/components/list-view/block.js +73 -84
  705. package/src/components/list-view/branch.js +123 -94
  706. package/src/components/list-view/index.js +82 -30
  707. package/src/components/list-view/leaf.js +2 -2
  708. package/src/components/list-view/list-item.js +5 -4
  709. package/src/components/list-view/style.scss +70 -33
  710. package/src/components/list-view/use-list-view-client-ids.js +9 -68
  711. package/src/components/media-placeholder/index.js +26 -19
  712. package/src/components/media-replace-flow/README.md +7 -0
  713. package/src/components/media-replace-flow/index.js +4 -1
  714. package/src/components/media-upload/README.md +1 -1
  715. package/src/components/navigable-toolbar/index.js +1 -4
  716. package/src/components/observe-typing/index.js +3 -2
  717. package/src/components/plain-text/index.native.js +26 -4
  718. package/src/components/rich-text/embed-handler-picker.native.js +68 -0
  719. package/src/components/rich-text/format-edit.js +36 -2
  720. package/src/components/rich-text/format-toolbar/index.js +25 -6
  721. package/src/components/rich-text/index.js +12 -8
  722. package/src/components/rich-text/index.native.js +35 -1
  723. package/src/components/rich-text/use-paste-handler.js +30 -12
  724. package/src/components/rich-text/utils.js +16 -0
  725. package/src/components/skip-to-selected-block/README.md +39 -0
  726. package/src/components/typewriter/index.js +3 -2
  727. package/src/components/url-input/index.js +26 -10
  728. package/src/components/use-moving-animation/index.js +9 -8
  729. package/src/components/use-on-block-drop/index.js +5 -1
  730. package/src/components/use-setting/index.js +49 -11
  731. package/src/components/writing-flow/use-multi-selection.js +6 -0
  732. package/src/components/writing-flow/use-tab-nav.js +17 -3
  733. package/src/hooks/align.js +19 -10
  734. package/src/hooks/anchor.js +2 -2
  735. package/src/hooks/border.js +8 -11
  736. package/src/hooks/color-panel.js +4 -1
  737. package/src/hooks/color.js +7 -4
  738. package/src/hooks/dimensions.js +48 -59
  739. package/src/hooks/duotone.js +68 -19
  740. package/src/hooks/font-appearance.js +38 -7
  741. package/src/hooks/font-family.js +129 -33
  742. package/src/hooks/font-size.js +42 -6
  743. package/src/hooks/gap.js +2 -1
  744. package/src/hooks/index.js +2 -0
  745. package/src/hooks/index.native.js +1 -0
  746. package/src/hooks/layout.scss +8 -0
  747. package/src/hooks/letter-spacing.js +35 -7
  748. package/src/hooks/line-height.js +37 -9
  749. package/src/hooks/lock.js +34 -0
  750. package/src/hooks/margin.js +1 -1
  751. package/src/hooks/padding.js +1 -1
  752. package/src/hooks/style.js +15 -11
  753. package/src/hooks/text-decoration.js +34 -6
  754. package/src/hooks/text-transform.js +34 -6
  755. package/src/hooks/typography.js +165 -15
  756. package/src/hooks/typography.scss +16 -0
  757. package/src/hooks/use-cached-truthy.js +20 -0
  758. package/src/index.js +1 -0
  759. package/src/layouts/flex.js +179 -50
  760. package/src/layouts/flow.js +54 -8
  761. package/src/store/actions.js +239 -377
  762. package/src/store/defaults.native.js +12 -0
  763. package/src/store/index.js +1 -2
  764. package/src/store/reducer.js +54 -18
  765. package/src/store/selectors.js +173 -47
  766. package/src/store/test/actions.js +407 -705
  767. package/src/store/test/reducer.js +22 -54
  768. package/src/store/test/selectors.js +79 -21
  769. package/src/style.scss +2 -1
  770. package/src/utils/index.js +1 -0
  771. package/src/utils/parse-css-unit-to-px.js +43 -1
  772. package/src/utils/test/parse-css-unit-to-px.js +148 -165
  773. package/src/utils/transform-styles/transforms/test/wrap.js +1 -1
  774. package/src/utils/transform-styles/transforms/wrap.js +16 -0
  775. package/tsconfig.tsbuildinfo +1 -1
  776. package/build/components/duotone-control/duotone-picker-popover.js +0 -44
  777. package/build/components/duotone-control/duotone-picker-popover.js.map +0 -1
  778. package/build/components/list-view/block-slot.js +0 -121
  779. package/build/components/list-view/block-slot.js.map +0 -1
  780. package/build/components/list-view/editor.js +0 -35
  781. package/build/components/list-view/editor.js.map +0 -1
  782. package/build/components/text-decoration-and-transform/index.js +0 -39
  783. package/build/components/text-decoration-and-transform/index.js.map +0 -1
  784. package/build/store/controls.js +0 -44
  785. package/build/store/controls.js.map +0 -1
  786. package/build-module/components/duotone-control/duotone-picker-popover.js +0 -35
  787. package/build-module/components/duotone-control/duotone-picker-popover.js.map +0 -1
  788. package/build-module/components/list-view/block-slot.js +0 -96
  789. package/build-module/components/list-view/block-slot.js.map +0 -1
  790. package/build-module/components/list-view/editor.js +0 -25
  791. package/build-module/components/list-view/editor.js.map +0 -1
  792. package/build-module/components/text-decoration-and-transform/index.js +0 -30
  793. package/build-module/components/text-decoration-and-transform/index.js.map +0 -1
  794. package/build-module/store/controls.js +0 -32
  795. package/build-module/store/controls.js.map +0 -1
  796. package/src/components/duotone-control/duotone-picker-popover.js +0 -36
  797. package/src/components/list-view/block-slot.js +0 -120
  798. package/src/components/list-view/editor.js +0 -29
  799. package/src/components/text-decoration-and-transform/index.js +0 -36
  800. package/src/components/text-decoration-and-transform/style.scss +0 -3
  801. package/src/store/controls.js +0 -39
@@ -7,7 +7,7 @@ import deepFreeze from 'deep-freeze';
7
7
  /**
8
8
  * WordPress dependencies
9
9
  */
10
- import { controls, createRegistry } from '@wordpress/data';
10
+ import { createRegistry } from '@wordpress/data';
11
11
  import {
12
12
  getBlockTypes,
13
13
  unregisterBlockType,
@@ -41,7 +41,6 @@ const {
41
41
  replaceInnerBlocks,
42
42
  resetBlocks,
43
43
  selectBlock,
44
- selectPreviousBlock,
45
44
  showInsertionPoint,
46
45
  startMultiSelect,
47
46
  startTyping,
@@ -55,7 +54,6 @@ const {
55
54
  updateBlockAttributes,
56
55
  updateBlockListSettings,
57
56
  updateSettings,
58
- selectionChange,
59
57
  validateBlocksToTemplate,
60
58
  } = actions;
61
59
 
@@ -70,10 +68,11 @@ describe( 'actions', () => {
70
68
  };
71
69
 
72
70
  describe( 'resetBlocks', () => {
73
- it( 'should yield the RESET_BLOCKS actions', () => {
71
+ it( 'should dispatch the RESET_BLOCKS action', () => {
72
+ const dispatch = jest.fn();
74
73
  const blocks = [];
75
- const fulfillment = resetBlocks( blocks );
76
- expect( fulfillment.next().value ).toEqual( {
74
+ resetBlocks( blocks )( { dispatch } );
75
+ expect( dispatch ).toHaveBeenCalledWith( {
77
76
  type: 'RESET_BLOCKS',
78
77
  blocks,
79
78
  } );
@@ -147,59 +146,51 @@ describe( 'actions', () => {
147
146
  } );
148
147
  } );
149
148
  describe( 'multiSelect', () => {
150
- it( 'should return MULTI_SELECT action if blocks have the same root client id', () => {
149
+ it( 'should dispatch MULTI_SELECT action if blocks have the same root client id', () => {
151
150
  const start = 'start';
152
151
  const end = 'end';
153
- const multiSelectGenerator = multiSelect( start, end );
152
+ const select = {
153
+ getBlockRootClientId() {
154
+ return 'parent'; // for all client IDs
155
+ },
156
+ getSelectedBlockCount() {
157
+ return 0;
158
+ },
159
+ };
160
+ const dispatch = jest.fn();
154
161
 
155
- expect( multiSelectGenerator.next().value ).toEqual(
156
- controls.select(
157
- blockEditorStoreName,
158
- 'getBlockRootClientId',
159
- start
160
- )
161
- );
162
+ multiSelect( start, end )( { select, dispatch } );
162
163
 
163
- expect( multiSelectGenerator.next( 'parent' ).value ).toEqual(
164
- controls.select(
165
- blockEditorStoreName,
166
- 'getBlockRootClientId',
167
- end
168
- )
169
- );
170
-
171
- expect( multiSelectGenerator.next( 'parent' ).value ).toEqual( {
164
+ expect( dispatch ).toHaveBeenCalledWith( {
172
165
  type: 'MULTI_SELECT',
173
166
  start,
174
167
  end,
175
168
  } );
176
169
  } );
177
170
 
178
- it( 'should return undefined if blocks have different root client ids', () => {
171
+ it( 'should do nothing if blocks have different root client ids', () => {
179
172
  const start = 'start';
180
173
  const end = 'end';
181
- const multiSelectGenerator = multiSelect( start, end );
182
-
183
- expect( multiSelectGenerator.next().value ).toEqual(
184
- controls.select(
185
- blockEditorStoreName,
186
- 'getBlockRootClientId',
187
- start
188
- )
189
- );
174
+ const select = {
175
+ getBlockRootClientId( clientId ) {
176
+ switch ( clientId ) {
177
+ case start:
178
+ return 'parent';
179
+ case end:
180
+ return 'another parent';
181
+ default:
182
+ return null;
183
+ }
184
+ },
185
+ getSelectedBlockCount() {
186
+ return 0;
187
+ },
188
+ };
189
+ const dispatch = jest.fn();
190
190
 
191
- expect( multiSelectGenerator.next( 'parent' ).value ).toEqual(
192
- controls.select(
193
- blockEditorStoreName,
194
- 'getBlockRootClientId',
195
- end
196
- )
197
- );
191
+ multiSelect( start, end )( { select, dispatch } );
198
192
 
199
- expect( multiSelectGenerator.next( 'another parent' ) ).toEqual( {
200
- done: true,
201
- value: undefined,
202
- } );
193
+ expect( dispatch ).not.toHaveBeenCalled();
203
194
  } );
204
195
  } );
205
196
 
@@ -212,55 +203,34 @@ describe( 'actions', () => {
212
203
  } );
213
204
 
214
205
  describe( 'replaceBlock', () => {
215
- it( 'should yield the REPLACE_BLOCKS action if the new block can be inserted in the destination root block', () => {
206
+ it( 'should dispatch the REPLACE_BLOCKS action if the new block can be inserted in the destination root block', () => {
216
207
  const block = {
217
208
  clientId: 'ribs',
218
209
  name: 'core/test-block',
219
210
  };
220
211
 
221
- const replaceBlockGenerator = replaceBlock( 'chicken', block );
222
-
223
- // Skip getSettings select.
224
- replaceBlockGenerator.next();
225
-
226
- expect( replaceBlockGenerator.next().value ).toEqual(
227
- controls.select(
228
- blockEditorStoreName,
229
- 'getBlockRootClientId',
230
- 'chicken'
231
- )
232
- );
212
+ const select = {
213
+ getSettings: () => null,
214
+ getBlockRootClientId: () => null,
215
+ canInsertBlockType: () => true,
216
+ getBlockCount: () => 1,
217
+ };
218
+ const dispatch = jest.fn();
233
219
 
234
- expect( replaceBlockGenerator.next().value ).toEqual(
235
- controls.select(
236
- blockEditorStoreName,
237
- 'canInsertBlockType',
238
- 'core/test-block',
239
- undefined
240
- )
241
- );
220
+ replaceBlock( 'chicken', block )( { select, dispatch } );
242
221
 
243
- expect( replaceBlockGenerator.next( true ).value ).toEqual( {
222
+ expect( dispatch ).toHaveBeenCalledWith( {
244
223
  type: 'REPLACE_BLOCKS',
245
224
  clientIds: [ 'chicken' ],
246
225
  blocks: [ block ],
247
226
  time: expect.any( Number ),
248
227
  initialPosition: 0,
249
228
  } );
250
-
251
- expect( replaceBlockGenerator.next().value ).toEqual(
252
- controls.select( blockEditorStoreName, 'getBlockCount' )
253
- );
254
-
255
- expect( replaceBlockGenerator.next( 1 ) ).toEqual( {
256
- value: undefined,
257
- done: true,
258
- } );
259
229
  } );
260
230
  } );
261
231
 
262
232
  describe( 'replaceBlocks', () => {
263
- it( 'should not yield the REPLACE_BLOCKS action if the replacement is not possible', () => {
233
+ it( 'should not dispatch the REPLACE_BLOCKS action if the replacement is not possible', () => {
264
234
  const blocks = [
265
235
  {
266
236
  clientId: 'ribs',
@@ -272,48 +242,27 @@ describe( 'actions', () => {
272
242
  },
273
243
  ];
274
244
 
275
- const replaceBlockGenerator = replaceBlocks(
276
- [ 'chicken' ],
277
- blocks
278
- );
279
-
280
- expect( replaceBlockGenerator.next().value ).toEqual(
281
- controls.select( blockEditorStoreName, 'getSettings' )
282
- );
283
-
284
- expect( replaceBlockGenerator.next().value ).toEqual(
285
- controls.select(
286
- blockEditorStoreName,
287
- 'getBlockRootClientId',
288
- 'chicken'
289
- )
290
- );
245
+ const select = {
246
+ getSettings: () => null,
247
+ getBlockRootClientId: () => null,
248
+ canInsertBlockType: ( clientId ) => {
249
+ switch ( clientId ) {
250
+ case 'core/test-ribs':
251
+ return true;
252
+ case 'core/test-chicken':
253
+ default:
254
+ return false;
255
+ }
256
+ },
257
+ };
258
+ const dispatch = jest.fn();
291
259
 
292
- expect( replaceBlockGenerator.next().value ).toEqual(
293
- controls.select(
294
- blockEditorStoreName,
295
- 'canInsertBlockType',
296
- 'core/test-ribs',
297
- undefined
298
- )
299
- );
260
+ replaceBlocks( [ 'chicken' ], blocks )( { select, dispatch } );
300
261
 
301
- expect( replaceBlockGenerator.next( true ).value ).toEqual(
302
- controls.select(
303
- blockEditorStoreName,
304
- 'canInsertBlockType',
305
- 'core/test-chicken',
306
- undefined
307
- )
308
- );
309
-
310
- expect( replaceBlockGenerator.next( false ) ).toEqual( {
311
- value: undefined,
312
- done: true,
313
- } );
262
+ expect( dispatch ).not.toHaveBeenCalled();
314
263
  } );
315
264
 
316
- it( 'should yield the REPLACE_BLOCKS action if the all the replacement blocks can be inserted in the parent block', () => {
265
+ it( 'should dispatch the REPLACE_BLOCKS action if the all the replacement blocks can be inserted in the parent block', () => {
317
266
  const blocks = [
318
267
  {
319
268
  clientId: 'ribs',
@@ -325,56 +274,23 @@ describe( 'actions', () => {
325
274
  },
326
275
  ];
327
276
 
328
- const replaceBlockGenerator = replaceBlocks(
329
- [ 'chicken' ],
330
- blocks
331
- );
332
-
333
- // Skip getSettings select.
334
- replaceBlockGenerator.next();
335
-
336
- expect( replaceBlockGenerator.next().value ).toEqual(
337
- controls.select(
338
- blockEditorStoreName,
339
- 'getBlockRootClientId',
340
- 'chicken'
341
- )
342
- );
343
-
344
- expect( replaceBlockGenerator.next().value ).toEqual(
345
- controls.select(
346
- blockEditorStoreName,
347
- 'canInsertBlockType',
348
- 'core/test-ribs',
349
- undefined
350
- )
351
- );
277
+ const select = {
278
+ getSettings: () => null,
279
+ getBlockRootClientId: () => null,
280
+ canInsertBlockType: () => true,
281
+ getBlockCount: () => 1,
282
+ };
283
+ const dispatch = jest.fn();
352
284
 
353
- expect( replaceBlockGenerator.next( true ).value ).toEqual(
354
- controls.select(
355
- blockEditorStoreName,
356
- 'canInsertBlockType',
357
- 'core/test-chicken',
358
- undefined
359
- )
360
- );
285
+ replaceBlocks( [ 'chicken' ], blocks )( { select, dispatch } );
361
286
 
362
- expect( replaceBlockGenerator.next( true ).value ).toEqual( {
287
+ expect( dispatch ).toHaveBeenCalledWith( {
363
288
  type: 'REPLACE_BLOCKS',
364
289
  clientIds: [ 'chicken' ],
365
290
  blocks,
366
291
  time: expect.any( Number ),
367
292
  initialPosition: 0,
368
293
  } );
369
-
370
- expect( replaceBlockGenerator.next().value ).toEqual(
371
- controls.select( blockEditorStoreName, 'getBlockCount' )
372
- );
373
-
374
- expect( replaceBlockGenerator.next( 1 ) ).toEqual( {
375
- value: undefined,
376
- done: true,
377
- } );
378
294
  } );
379
295
 
380
296
  it( 'should pass patternName through metadata to REPLACE_BLOCKS action', () => {
@@ -391,21 +307,23 @@ describe( 'actions', () => {
391
307
 
392
308
  const meta = { patternName: 'core/chicken-ribs-pattern' };
393
309
 
394
- const replaceBlockGenerator = replaceBlocks(
310
+ const select = {
311
+ getSettings: () => null,
312
+ getBlockRootClientId: () => null,
313
+ canInsertBlockType: () => true,
314
+ getBlockCount: () => 1,
315
+ };
316
+ const dispatch = jest.fn();
317
+
318
+ replaceBlocks(
395
319
  [ 'chicken' ],
396
320
  blocks,
397
321
  null,
398
322
  null,
399
323
  meta
400
- );
401
-
402
- // Skip to action yield.
403
- replaceBlockGenerator.next();
404
- replaceBlockGenerator.next();
405
- replaceBlockGenerator.next();
406
- replaceBlockGenerator.next( true );
324
+ )( { select, dispatch } );
407
325
 
408
- expect( replaceBlockGenerator.next( true ).value ).toEqual( {
326
+ expect( dispatch ).toHaveBeenCalledWith( {
409
327
  type: 'REPLACE_BLOCKS',
410
328
  clientIds: [ 'chicken' ],
411
329
  blocks,
@@ -425,36 +343,27 @@ describe( 'actions', () => {
425
343
  };
426
344
  const index = 5;
427
345
 
428
- const insertBlockGenerator = insertBlock(
346
+ const select = {
347
+ getSettings: () => null,
348
+ canInsertBlockType: () => true,
349
+ };
350
+ const dispatch = jest.fn();
351
+
352
+ insertBlock(
429
353
  block,
430
354
  index,
431
355
  'testclientid',
432
356
  true
433
- );
357
+ )( { select, dispatch } );
434
358
 
435
- // Skip getSettings select.
436
- insertBlockGenerator.next();
437
-
438
- expect( insertBlockGenerator.next().value ).toEqual(
439
- controls.select(
440
- blockEditorStoreName,
441
- 'canInsertBlockType',
442
- 'core/test-block',
443
- 'testclientid'
444
- )
445
- );
446
-
447
- expect( insertBlockGenerator.next( true ) ).toEqual( {
448
- done: true,
449
- value: {
450
- type: 'INSERT_BLOCKS',
451
- blocks: [ block ],
452
- index,
453
- rootClientId: 'testclientid',
454
- time: expect.any( Number ),
455
- updateSelection: true,
456
- initialPosition: 0,
457
- },
359
+ expect( dispatch ).toHaveBeenCalledWith( {
360
+ type: 'INSERT_BLOCKS',
361
+ blocks: [ block ],
362
+ index,
363
+ rootClientId: 'testclientid',
364
+ time: expect.any( Number ),
365
+ updateSelection: true,
366
+ initialPosition: 0,
458
367
  } );
459
368
  } );
460
369
  } );
@@ -475,74 +384,44 @@ describe( 'actions', () => {
475
384
  };
476
385
  const blocks = [ ribsBlock, chickenBlock, chickenRibsBlock ];
477
386
 
478
- const insertBlocksGenerator = insertBlocks(
479
- blocks,
480
- 5,
481
- 'testrootid',
482
- false
483
- );
484
-
485
- expect( insertBlocksGenerator.next().value ).toEqual(
486
- controls.select( blockEditorStoreName, 'getSettings' )
487
- );
488
-
489
- expect(
490
- insertBlocksGenerator.next( {
387
+ const select = {
388
+ getSettings: () => ( {
491
389
  __experimentalPreferredStyleVariations: {
492
390
  value: {
493
391
  'core/test-ribs': 'squared',
494
392
  'core/test-chicken-ribs': 'colorful',
495
393
  },
496
394
  },
497
- } ).value
498
- ).toEqual(
499
- controls.select(
500
- blockEditorStoreName,
501
- 'canInsertBlockType',
502
- 'core/test-ribs',
503
- 'testrootid'
504
- )
505
- );
506
-
507
- expect( insertBlocksGenerator.next( true ).value ).toEqual(
508
- controls.select(
509
- blockEditorStoreName,
510
- 'canInsertBlockType',
511
- 'core/test-chicken',
512
- 'testrootid'
513
- )
514
- );
395
+ } ),
396
+ canInsertBlockType: () => true,
397
+ };
398
+ const dispatch = jest.fn();
515
399
 
516
- expect( insertBlocksGenerator.next( true ).value ).toEqual(
517
- controls.select(
518
- blockEditorStoreName,
519
- 'canInsertBlockType',
520
- 'core/test-chicken-ribs',
521
- 'testrootid'
522
- )
523
- );
400
+ insertBlocks(
401
+ blocks,
402
+ 5,
403
+ 'testrootid',
404
+ false
405
+ )( { select, dispatch } );
524
406
 
525
- expect( insertBlocksGenerator.next( true ) ).toEqual( {
526
- done: true,
527
- value: {
528
- type: 'INSERT_BLOCKS',
529
- blocks: [
530
- {
531
- ...ribsBlock,
532
- attributes: { className: 'is-style-squared' },
533
- },
534
- chickenBlock,
535
- {
536
- ...chickenRibsBlock,
537
- attributes: { className: 'is-style-colorful' },
538
- },
539
- ],
540
- index: 5,
541
- rootClientId: 'testrootid',
542
- time: expect.any( Number ),
543
- updateSelection: false,
544
- initialPosition: null,
545
- },
407
+ expect( dispatch ).toHaveBeenCalledWith( {
408
+ type: 'INSERT_BLOCKS',
409
+ blocks: [
410
+ {
411
+ ...ribsBlock,
412
+ attributes: { className: 'is-style-squared' },
413
+ },
414
+ chickenBlock,
415
+ {
416
+ ...chickenRibsBlock,
417
+ attributes: { className: 'is-style-colorful' },
418
+ },
419
+ ],
420
+ index: 5,
421
+ rootClientId: 'testrootid',
422
+ time: expect.any( Number ),
423
+ updateSelection: false,
424
+ initialPosition: null,
546
425
  } );
547
426
  } );
548
427
 
@@ -556,52 +435,41 @@ describe( 'actions', () => {
556
435
  };
557
436
  const blocks = [ ribsWithStyleBlock ];
558
437
 
559
- const insertBlocksGenerator = insertBlocks(
560
- blocks,
561
- 5,
562
- 'testrootid',
563
- false
564
- );
565
-
566
- expect( insertBlocksGenerator.next().value ).toEqual(
567
- controls.select( blockEditorStoreName, 'getSettings' )
568
- );
569
-
570
- expect(
571
- insertBlocksGenerator.next( {
438
+ const select = {
439
+ getSettings: () => ( {
572
440
  __experimentalPreferredStyleVariations: {
573
441
  value: {
574
442
  'core/test-ribs': 'squared',
575
443
  },
576
444
  },
577
- } ).value
578
- ).toEqual(
579
- controls.select(
580
- blockEditorStoreName,
581
- 'canInsertBlockType',
582
- 'core/test-ribs',
583
- 'testrootid'
584
- )
585
- );
445
+ } ),
446
+ canInsertBlockType: () => true,
447
+ };
448
+ const dispatch = jest.fn();
586
449
 
587
- expect( insertBlocksGenerator.next( true ) ).toEqual( {
588
- done: true,
589
- value: {
590
- type: 'INSERT_BLOCKS',
591
- blocks: [
592
- {
593
- ...ribsWithStyleBlock,
594
- attributes: { className: 'is-style-colorful' },
595
- },
596
- ],
597
- index: 5,
598
- rootClientId: 'testrootid',
599
- time: expect.any( Number ),
600
- updateSelection: false,
601
- initialPosition: null,
602
- },
450
+ insertBlocks(
451
+ blocks,
452
+ 5,
453
+ 'testrootid',
454
+ false
455
+ )( { select, dispatch } );
456
+
457
+ expect( dispatch ).toHaveBeenCalledWith( {
458
+ type: 'INSERT_BLOCKS',
459
+ blocks: [
460
+ {
461
+ ...ribsWithStyleBlock,
462
+ attributes: { className: 'is-style-colorful' },
463
+ },
464
+ ],
465
+ index: 5,
466
+ rootClientId: 'testrootid',
467
+ time: expect.any( Number ),
468
+ updateSelection: false,
469
+ initialPosition: null,
603
470
  } );
604
471
  } );
472
+
605
473
  it( 'should filter the allowed blocks in INSERT_BLOCKS action', () => {
606
474
  const ribsBlock = {
607
475
  clientId: 'ribs',
@@ -617,58 +485,42 @@ describe( 'actions', () => {
617
485
  };
618
486
  const blocks = [ ribsBlock, chickenBlock, chickenRibsBlock ];
619
487
 
620
- const insertBlocksGenerator = insertBlocks(
488
+ const select = {
489
+ getSettings: () => null,
490
+ canInsertBlockType: ( clientId ) => {
491
+ switch ( clientId ) {
492
+ case 'core/test-ribs':
493
+ return true;
494
+ case 'core/test-chicken':
495
+ return false;
496
+ case 'core/test-chicken-ribs':
497
+ return true;
498
+ default:
499
+ return false;
500
+ }
501
+ },
502
+ };
503
+ const dispatch = jest.fn();
504
+
505
+ insertBlocks(
621
506
  blocks,
622
507
  5,
623
508
  'testrootid',
624
509
  false
625
- );
626
-
627
- // Skip getSettings select.
628
- insertBlocksGenerator.next();
629
-
630
- expect( insertBlocksGenerator.next().value ).toEqual(
631
- controls.select(
632
- blockEditorStoreName,
633
- 'canInsertBlockType',
634
- 'core/test-ribs',
635
- 'testrootid'
636
- )
637
- );
638
-
639
- expect( insertBlocksGenerator.next( true ).value ).toEqual(
640
- controls.select(
641
- blockEditorStoreName,
642
- 'canInsertBlockType',
643
- 'core/test-chicken',
644
- 'testrootid'
645
- )
646
- );
647
-
648
- expect( insertBlocksGenerator.next( false ).value ).toEqual(
649
- controls.select(
650
- blockEditorStoreName,
651
- 'canInsertBlockType',
652
- 'core/test-chicken-ribs',
653
- 'testrootid'
654
- )
655
- );
510
+ )( { select, dispatch } );
656
511
 
657
- expect( insertBlocksGenerator.next( true ) ).toEqual( {
658
- done: true,
659
- value: {
660
- type: 'INSERT_BLOCKS',
661
- blocks: [ ribsBlock, chickenRibsBlock ],
662
- index: 5,
663
- rootClientId: 'testrootid',
664
- time: expect.any( Number ),
665
- updateSelection: false,
666
- initialPosition: null,
667
- },
512
+ expect( dispatch ).toHaveBeenCalledWith( {
513
+ type: 'INSERT_BLOCKS',
514
+ blocks: [ ribsBlock, chickenRibsBlock ],
515
+ index: 5,
516
+ rootClientId: 'testrootid',
517
+ time: expect.any( Number ),
518
+ updateSelection: false,
519
+ initialPosition: null,
668
520
  } );
669
521
  } );
670
522
 
671
- it( 'does not yield INSERT_BLOCKS action if all the blocks are impossible to insert', () => {
523
+ it( 'does not dispatch INSERT_BLOCKS action if all the blocks are impossible to insert', () => {
672
524
  const ribsBlock = {
673
525
  clientId: 'ribs',
674
526
  name: 'core/test-ribs',
@@ -679,38 +531,20 @@ describe( 'actions', () => {
679
531
  };
680
532
  const blocks = [ ribsBlock, chickenBlock ];
681
533
 
682
- const insertBlocksGenerator = insertBlocks(
534
+ const select = {
535
+ getSettings: () => null,
536
+ canInsertBlockType: () => false,
537
+ };
538
+ const dispatch = jest.fn();
539
+
540
+ insertBlocks(
683
541
  blocks,
684
542
  5,
685
543
  'testrootid',
686
544
  false
687
- );
545
+ )( { select, dispatch } );
688
546
 
689
- // Skip getSettings select.
690
- insertBlocksGenerator.next();
691
-
692
- expect( insertBlocksGenerator.next().value ).toEqual(
693
- controls.select(
694
- blockEditorStoreName,
695
- 'canInsertBlockType',
696
- 'core/test-ribs',
697
- 'testrootid'
698
- )
699
- );
700
-
701
- expect( insertBlocksGenerator.next( false ).value ).toEqual(
702
- controls.select(
703
- blockEditorStoreName,
704
- 'canInsertBlockType',
705
- 'core/test-chicken',
706
- 'testrootid'
707
- )
708
- );
709
-
710
- expect( insertBlocksGenerator.next( false ) ).toEqual( {
711
- done: true,
712
- value: undefined,
713
- } );
547
+ expect( dispatch ).not.toHaveBeenCalled();
714
548
  } );
715
549
 
716
550
  it( 'should pass patternName through metadata to INSERT_BLOCKS action', () => {
@@ -729,57 +563,41 @@ describe( 'actions', () => {
729
563
  const blocks = [ ribsBlock, chickenBlock, chickenRibsBlock ];
730
564
  const meta = { patternName: 'core/chicken-ribs-pattern' };
731
565
 
732
- const insertBlocksGenerator = insertBlocks(
566
+ const select = {
567
+ getSettings: () => null,
568
+ canInsertBlockType: ( clientId ) => {
569
+ switch ( clientId ) {
570
+ case 'core/test-ribs':
571
+ return true;
572
+ case 'core/test-chicken':
573
+ return false;
574
+ case 'core/test-chicken-ribs':
575
+ return true;
576
+ default:
577
+ return false;
578
+ }
579
+ },
580
+ };
581
+ const dispatch = jest.fn();
582
+
583
+ insertBlocks(
733
584
  blocks,
734
585
  5,
735
586
  'testrootid',
736
587
  false,
737
588
  0,
738
589
  meta
739
- );
740
-
741
- // Skip getSettings select.
742
- insertBlocksGenerator.next();
590
+ )( { select, dispatch } );
743
591
 
744
- expect( insertBlocksGenerator.next().value ).toEqual(
745
- controls.select(
746
- blockEditorStoreName,
747
- 'canInsertBlockType',
748
- 'core/test-ribs',
749
- 'testrootid'
750
- )
751
- );
752
-
753
- expect( insertBlocksGenerator.next( true ).value ).toEqual(
754
- controls.select(
755
- blockEditorStoreName,
756
- 'canInsertBlockType',
757
- 'core/test-chicken',
758
- 'testrootid'
759
- )
760
- );
761
-
762
- expect( insertBlocksGenerator.next( false ).value ).toEqual(
763
- controls.select(
764
- blockEditorStoreName,
765
- 'canInsertBlockType',
766
- 'core/test-chicken-ribs',
767
- 'testrootid'
768
- )
769
- );
770
-
771
- expect( insertBlocksGenerator.next( true ) ).toEqual( {
772
- done: true,
773
- value: {
774
- type: 'INSERT_BLOCKS',
775
- blocks: [ ribsBlock, chickenRibsBlock ],
776
- index: 5,
777
- rootClientId: 'testrootid',
778
- time: expect.any( Number ),
779
- updateSelection: false,
780
- initialPosition: null,
781
- meta: { patternName: 'core/chicken-ribs-pattern' },
782
- },
592
+ expect( dispatch ).toHaveBeenCalledWith( {
593
+ type: 'INSERT_BLOCKS',
594
+ blocks: [ ribsBlock, chickenRibsBlock ],
595
+ index: 5,
596
+ rootClientId: 'testrootid',
597
+ time: expect.any( Number ),
598
+ updateSelection: false,
599
+ initialPosition: null,
600
+ meta: { patternName: 'core/chicken-ribs-pattern' },
783
601
  } );
784
602
  } );
785
603
  } );
@@ -801,260 +619,158 @@ describe( 'actions', () => {
801
619
  } );
802
620
 
803
621
  describe( 'removeBlocks', () => {
804
- it( 'should return REMOVE_BLOCKS action', () => {
622
+ it( 'should dispatch REMOVE_BLOCKS action', () => {
805
623
  const clientId = 'clientId';
806
624
  const clientIds = [ clientId ];
807
625
 
808
- const result = Array.from( removeBlocks( clientIds ) );
809
-
810
- expect( result ).toEqual( [
811
- controls.select(
812
- blockEditorStoreName,
813
- 'getBlockRootClientId',
814
- clientId
815
- ),
816
- controls.select(
817
- blockEditorStoreName,
818
- 'getTemplateLock',
819
- undefined
820
- ),
821
- selectPreviousBlock( clientId ),
822
- {
823
- type: 'REMOVE_BLOCKS',
824
- clientIds,
825
- },
826
- controls.select( blockEditorStoreName, 'getBlockCount' ),
827
- ] );
828
- } );
829
- } );
626
+ const select = {
627
+ getBlockRootClientId: () => undefined,
628
+ canRemoveBlocks: () => true,
629
+ };
630
+ const dispatch = Object.assign( jest.fn(), {
631
+ selectPreviousBlock: jest.fn(),
632
+ } );
830
633
 
831
- describe( 'moveBlocksToPosition', () => {
832
- it( 'should yield MOVE_BLOCKS_TO_POSITION action if locking is insert and move is not changing the root block', () => {
833
- const moveBlockToPositionGenerator = moveBlocksToPosition(
834
- [ 'chicken' ],
835
- 'ribs',
836
- 'ribs',
837
- 5
838
- );
634
+ removeBlocks( clientIds )( { select, dispatch } );
839
635
 
840
- expect( moveBlockToPositionGenerator.next().value ).toEqual(
841
- controls.select(
842
- blockEditorStoreName,
843
- 'getTemplateLock',
844
- 'ribs'
845
- )
636
+ expect( dispatch.selectPreviousBlock ).toHaveBeenCalledWith(
637
+ clientId
846
638
  );
847
639
 
848
- expect(
849
- moveBlockToPositionGenerator.next( 'insert' ).value
850
- ).toEqual( {
851
- type: 'MOVE_BLOCKS_TO_POSITION',
852
- fromRootClientId: 'ribs',
853
- toRootClientId: 'ribs',
854
- clientIds: [ 'chicken' ],
855
- index: 5,
640
+ expect( dispatch ).toHaveBeenCalledWith( {
641
+ type: 'REMOVE_BLOCKS',
642
+ clientIds,
856
643
  } );
857
-
858
- expect( moveBlockToPositionGenerator.next().done ).toBe( true );
859
644
  } );
645
+ } );
646
+
647
+ describe( 'moveBlocksToPosition', () => {
648
+ it( 'should not dispatch MOVE_BLOCKS_TO_POSITION action if locking is all', () => {
649
+ const select = {
650
+ canMoveBlocks: () => false,
651
+ };
652
+ const dispatch = jest.fn();
860
653
 
861
- it( 'should not yield MOVE_BLOCKS_TO_POSITION action if locking is all', () => {
862
- const moveBlockToPositionGenerator = moveBlocksToPosition(
654
+ moveBlocksToPosition(
863
655
  [ 'chicken' ],
864
656
  'ribs',
865
657
  'ribs',
866
658
  5
867
- );
868
-
869
- expect( moveBlockToPositionGenerator.next().value ).toEqual(
870
- controls.select(
871
- blockEditorStoreName,
872
- 'getTemplateLock',
873
- 'ribs'
874
- )
875
- );
659
+ )( { select, dispatch } );
876
660
 
877
- expect( moveBlockToPositionGenerator.next( 'all' ) ).toEqual( {
878
- done: true,
879
- value: undefined,
880
- } );
661
+ expect( dispatch ).not.toHaveBeenCalled();
881
662
  } );
882
663
 
883
- it( 'should not yield MOVE_BLOCKS_TO_POSITION action if locking is insert and move is changing the root block', () => {
884
- const moveBlockToPositionGenerator = moveBlocksToPosition(
885
- [ 'chicken' ],
886
- 'ribs',
887
- 'chicken-ribs',
888
- 5
889
- );
890
-
891
- expect( moveBlockToPositionGenerator.next().value ).toEqual(
892
- controls.select(
893
- blockEditorStoreName,
894
- 'getTemplateLock',
895
- 'ribs'
896
- )
897
- );
898
-
899
- expect( moveBlockToPositionGenerator.next( 'insert' ) ).toEqual( {
900
- done: true,
901
- value: undefined,
902
- } );
903
- } );
664
+ it( 'should dispatch MOVE_BLOCKS_TO_POSITION action if there is not locking in the original root block and block can be inserted in the destination', () => {
665
+ const select = {
666
+ canMoveBlocks: () => true,
667
+ canRemoveBlocks: () => true,
668
+ canInsertBlocks: () => true,
669
+ };
670
+ const dispatch = jest.fn();
904
671
 
905
- it( 'should yield MOVE_BLOCKS_TO_POSITION action if there is not locking in the original root block and block can be inserted in the destination', () => {
906
- const moveBlockToPositionGenerator = moveBlocksToPosition(
672
+ moveBlocksToPosition(
907
673
  [ 'chicken' ],
908
674
  'ribs',
909
675
  'chicken-ribs',
910
676
  5
911
- );
912
-
913
- expect( moveBlockToPositionGenerator.next().value ).toEqual(
914
- controls.select(
915
- blockEditorStoreName,
916
- 'getTemplateLock',
917
- 'ribs'
918
- )
919
- );
920
-
921
- expect( moveBlockToPositionGenerator.next().value ).toEqual(
922
- controls.select(
923
- blockEditorStoreName,
924
- 'canInsertBlocks',
925
- [ 'chicken' ],
926
- 'chicken-ribs'
927
- )
928
- );
677
+ )( { select, dispatch } );
929
678
 
930
- expect( moveBlockToPositionGenerator.next( true ).value ).toEqual( {
679
+ expect( dispatch ).toHaveBeenCalledWith( {
931
680
  type: 'MOVE_BLOCKS_TO_POSITION',
932
681
  fromRootClientId: 'ribs',
933
682
  toRootClientId: 'chicken-ribs',
934
683
  clientIds: [ 'chicken' ],
935
684
  index: 5,
936
685
  } );
937
-
938
- expect( moveBlockToPositionGenerator.next() ).toEqual( {
939
- done: true,
940
- value: undefined,
941
- } );
942
686
  } );
943
687
 
944
- it( 'should not yield MOVE_BLOCKS_TO_POSITION action if there is not locking in the original root block and block can be inserted in the destination', () => {
945
- const moveBlockToPositionGenerator = moveBlocksToPosition(
688
+ it( 'should not dispatch MOVE_BLOCKS_TO_POSITION action if there is not locking in the original root block and block can be inserted in the destination', () => {
689
+ const select = {
690
+ canMoveBlocks: () => true,
691
+ canRemoveBlocks: () => true,
692
+ canInsertBlocks: () => false,
693
+ };
694
+ const dispatch = jest.fn();
695
+
696
+ moveBlocksToPosition(
946
697
  [ 'chicken' ],
947
698
  'ribs',
948
699
  'chicken-ribs',
949
700
  5
950
- );
951
-
952
- expect( moveBlockToPositionGenerator.next().value ).toEqual(
953
- controls.select(
954
- blockEditorStoreName,
955
- 'getTemplateLock',
956
- 'ribs'
957
- )
958
- );
959
-
960
- expect( moveBlockToPositionGenerator.next().value ).toEqual(
961
- controls.select(
962
- blockEditorStoreName,
963
- 'canInsertBlocks',
964
- [ 'chicken' ],
965
- 'chicken-ribs'
966
- )
967
- );
701
+ )( { select, dispatch } );
968
702
 
969
- expect( moveBlockToPositionGenerator.next( false ) ).toEqual( {
970
- done: true,
971
- value: undefined,
972
- } );
703
+ expect( dispatch ).not.toHaveBeenCalled();
973
704
  } );
974
705
  } );
975
706
 
976
707
  describe( 'moveBlockToPosition', () => {
977
- it( 'should yield MOVE_BLOCKS_TO_POSITION action with a single block', () => {
978
- const moveBlockToPositionGenerator = moveBlocksToPosition(
708
+ it( 'should dispatch MOVE_BLOCKS_TO_POSITION action with a single block', () => {
709
+ const select = {
710
+ canMoveBlocks: () => true,
711
+ };
712
+ const dispatch = jest.fn();
713
+
714
+ moveBlocksToPosition(
979
715
  'chicken',
980
716
  'ribs',
981
717
  'ribs',
982
718
  5
983
- );
719
+ )( { select, dispatch } );
984
720
 
985
- expect( moveBlockToPositionGenerator.next().value ).toEqual(
986
- controls.select(
987
- blockEditorStoreName,
988
- 'getTemplateLock',
989
- 'ribs'
990
- )
991
- );
992
-
993
- expect( moveBlockToPositionGenerator.next().value ).toEqual( {
721
+ expect( dispatch ).toHaveBeenCalledWith( {
994
722
  type: 'MOVE_BLOCKS_TO_POSITION',
995
723
  fromRootClientId: 'ribs',
996
724
  toRootClientId: 'ribs',
997
725
  clientIds: 'chicken',
998
726
  index: 5,
999
727
  } );
1000
-
1001
- expect( moveBlockToPositionGenerator.next().done ).toBe( true );
1002
728
  } );
1003
729
  } );
1004
730
 
1005
731
  describe( 'removeBlock', () => {
1006
- it( 'should return REMOVE_BLOCKS action', () => {
732
+ it( 'should dispatch REMOVE_BLOCKS action', () => {
1007
733
  const clientId = 'myclientid';
1008
734
 
1009
- const result = Array.from( removeBlock( clientId ) );
1010
-
1011
- expect( result ).toEqual( [
1012
- controls.select(
1013
- blockEditorStoreName,
1014
- 'getBlockRootClientId',
1015
- clientId
1016
- ),
1017
- controls.select(
1018
- blockEditorStoreName,
1019
- 'getTemplateLock',
1020
- undefined
1021
- ),
1022
- selectPreviousBlock( clientId ),
1023
- {
1024
- type: 'REMOVE_BLOCKS',
1025
- clientIds: [ clientId ],
1026
- },
1027
- controls.select( blockEditorStoreName, 'getBlockCount' ),
1028
- ] );
735
+ const select = {
736
+ getBlockRootClientId: () => null,
737
+ canRemoveBlocks: () => true,
738
+ };
739
+ const dispatch = Object.assign( jest.fn(), {
740
+ selectPreviousBlock: jest.fn(),
741
+ } );
742
+
743
+ removeBlock( clientId )( { select, dispatch } );
744
+
745
+ expect( dispatch.selectPreviousBlock ).toHaveBeenCalledWith(
746
+ clientId
747
+ );
748
+
749
+ expect( dispatch ).toHaveBeenCalledWith( {
750
+ type: 'REMOVE_BLOCKS',
751
+ clientIds: [ clientId ],
752
+ } );
1029
753
  } );
1030
754
 
1031
- it( 'should return REMOVE_BLOCKS action, opting out of select previous', () => {
755
+ it( 'should dispatch REMOVE_BLOCKS action, opting out of select previous', () => {
1032
756
  const clientId = 'myclientid';
1033
757
 
1034
- const result = Array.from( removeBlock( clientId, false ) );
1035
-
1036
- expect( result ).toEqual( [
1037
- controls.select(
1038
- blockEditorStoreName,
1039
- 'getBlockRootClientId',
1040
- clientId
1041
- ),
1042
- controls.select(
1043
- blockEditorStoreName,
1044
- 'getTemplateLock',
1045
- undefined
1046
- ),
1047
- controls.select(
1048
- blockEditorStoreName,
1049
- 'getPreviousBlockClientId',
1050
- 'myclientid'
1051
- ),
1052
- {
1053
- type: 'REMOVE_BLOCKS',
1054
- clientIds: [ clientId ],
1055
- },
1056
- controls.select( blockEditorStoreName, 'getBlockCount' ),
1057
- ] );
758
+ const select = {
759
+ getBlockRootClientId: () => null,
760
+ canRemoveBlocks: () => true,
761
+ };
762
+ const dispatch = Object.assign( jest.fn(), {
763
+ selectPreviousBlock: jest.fn(),
764
+ } );
765
+
766
+ removeBlocks( [ clientId ], false )( { select, dispatch } );
767
+
768
+ expect( dispatch.selectPreviousBlock ).not.toHaveBeenCalled();
769
+
770
+ expect( dispatch ).toHaveBeenCalledWith( {
771
+ type: 'REMOVE_BLOCKS',
772
+ clientIds: [ clientId ],
773
+ } );
1058
774
  } );
1059
775
  } );
1060
776
 
@@ -1196,19 +912,6 @@ describe( 'actions', () => {
1196
912
  } );
1197
913
  } );
1198
914
 
1199
- it( 'should return MERGE_BLOCKS action', () => {
1200
- const firstBlockClientId = 'blockA';
1201
- const secondBlockClientId = 'blockB';
1202
- const fulfillment = mergeBlocks(
1203
- firstBlockClientId,
1204
- secondBlockClientId
1205
- );
1206
- expect( fulfillment.next().value ).toEqual( {
1207
- type: 'MERGE_BLOCKS',
1208
- blocks: [ firstBlockClientId, secondBlockClientId ],
1209
- } );
1210
- } );
1211
-
1212
915
  it( 'should only focus the blockA if the blockA has no merge function', () => {
1213
916
  registerBlockType( 'core/test-block', defaultBlockSettings );
1214
917
  const blockA = deepFreeze( {
@@ -1220,20 +923,24 @@ describe( 'actions', () => {
1220
923
  name: 'core/test-block',
1221
924
  } );
1222
925
 
1223
- const fulfillment = mergeBlocks( blockA.clientId, blockB.clientId );
1224
- expect( fulfillment.next() ).toEqual( {
1225
- done: false,
1226
- value: {
1227
- type: 'MERGE_BLOCKS',
1228
- blocks: [ blockA.clientId, blockB.clientId ],
1229
- },
926
+ const select = {
927
+ getBlock: ( clientId ) =>
928
+ [ blockA, blockB ].find( ( b ) => b.clientId === clientId ),
929
+ };
930
+ const dispatch = Object.assign( jest.fn(), {
931
+ selectBlock: jest.fn(),
1230
932
  } );
1231
- fulfillment.next();
1232
- expect( fulfillment.next( blockA ) ).toEqual( {
1233
- done: false,
1234
- value: selectBlock( 'chicken' ),
933
+
934
+ mergeBlocks(
935
+ blockA.clientId,
936
+ blockB.clientId
937
+ )( { select, dispatch } );
938
+
939
+ expect( dispatch ).toHaveBeenCalledWith( {
940
+ type: 'MERGE_BLOCKS',
941
+ blocks: [ blockA.clientId, blockB.clientId ],
1235
942
  } );
1236
- expect( fulfillment.next( blockA ).done ).toEqual( true );
943
+ expect( dispatch.selectBlock ).toHaveBeenCalledWith( 'chicken' );
1237
944
  } );
1238
945
 
1239
946
  it( 'should merge the blocks if blocks of the same type', () => {
@@ -1266,42 +973,43 @@ describe( 'actions', () => {
1266
973
  innerBlocks: [],
1267
974
  } );
1268
975
 
1269
- const fulfillment = mergeBlocks( blockA.clientId, blockB.clientId );
1270
- // MERGE_BLOCKS
1271
- fulfillment.next();
1272
- // getBlock A
1273
- fulfillment.next();
1274
- fulfillment.next( blockA );
1275
- // getBlock B
1276
- fulfillment.next( blockB );
1277
- // getSelectionStart
1278
- fulfillment.next( {
1279
- clientId: blockB.clientId,
1280
- attributeKey: 'content',
1281
- offset: 0,
976
+ const select = {
977
+ getBlock: ( clientId ) =>
978
+ [ blockA, blockB ].find( ( b ) => b.clientId === clientId ),
979
+ getSelectionStart: () => ( {
980
+ clientId: blockB.clientId,
981
+ attributeKey: 'content',
982
+ offset: 0,
983
+ } ),
984
+ };
985
+ const dispatch = Object.assign( jest.fn(), {
986
+ replaceBlocks: jest.fn(),
987
+ selectionChange: jest.fn(),
1282
988
  } );
1283
- // selectionChange
1284
- fulfillment.next(
1285
- selectionChange(
1286
- blockA.clientId,
1287
- 'content',
1288
- 'chicken'.length + 1,
1289
- 'chicken'.length + 1
1290
- )
989
+
990
+ mergeBlocks(
991
+ blockA.clientId,
992
+ blockB.clientId
993
+ )( { select, dispatch } );
994
+
995
+ expect( dispatch.selectionChange ).toHaveBeenCalledWith(
996
+ blockA.clientId,
997
+ 'content',
998
+ 'chicken'.length + 1,
999
+ 'chicken'.length + 1
1291
1000
  );
1292
- fulfillment.next();
1293
- fulfillment.next();
1294
- expect( fulfillment.next( blockA ).value ).toMatchObject( {
1295
- type: 'REPLACE_BLOCKS',
1296
- clientIds: [ 'chicken', 'ribs' ],
1297
- blocks: [
1298
- {
1001
+
1002
+ expect( dispatch.replaceBlocks ).toHaveBeenCalledWith(
1003
+ [ 'chicken', 'ribs' ],
1004
+ [
1005
+ expect.objectContaining( {
1299
1006
  clientId: 'chicken',
1300
1007
  name: 'core/test-block',
1301
1008
  attributes: { content: 'chicken ribs' },
1302
- },
1009
+ } ),
1303
1010
  ],
1304
- } );
1011
+ 0
1012
+ );
1305
1013
  } );
1306
1014
 
1307
1015
  it( 'should not merge the blocks have different types without transformation', () => {
@@ -1335,27 +1043,25 @@ describe( 'actions', () => {
1335
1043
  innerBlocks: [],
1336
1044
  } );
1337
1045
 
1338
- const fulfillment = mergeBlocks( blockA.clientId, blockB.clientId );
1339
- // MERGE_BLOCKS
1340
- fulfillment.next();
1341
- // getBlock A
1342
- fulfillment.next();
1343
- fulfillment.next( blockA );
1344
- // getBlock B
1345
- expect( fulfillment.next( blockB ).value ).toEqual( {
1346
- args: [],
1347
- selectorName: 'getSelectionStart',
1348
- storeKey: blockEditorStoreName,
1349
- type: '@@data/SELECT',
1350
- } );
1351
- // getSelectionStart
1352
- const next = fulfillment.next( {
1353
- clientId: blockB.clientId,
1354
- attributeKey: 'content',
1355
- offset: 0,
1046
+ const select = {
1047
+ getBlock: ( clientId ) =>
1048
+ [ blockA, blockB ].find( ( b ) => b.clientId === clientId ),
1049
+ getSelectionStart: () => ( {
1050
+ clientId: blockB.clientId,
1051
+ attributeKey: 'content',
1052
+ offset: 0,
1053
+ } ),
1054
+ };
1055
+ const dispatch = Object.assign( jest.fn(), {
1056
+ replaceBlocks: jest.fn(),
1356
1057
  } );
1357
- expect( next.value ).toEqual( undefined );
1358
- expect( next.done ).toBe( true );
1058
+
1059
+ mergeBlocks(
1060
+ blockA.clientId,
1061
+ blockB.clientId
1062
+ )( { select, dispatch } );
1063
+
1064
+ expect( dispatch.replaceBlocks ).not.toHaveBeenCalled();
1359
1065
  } );
1360
1066
 
1361
1067
  it( 'should transform and merge the blocks', () => {
@@ -1413,48 +1119,43 @@ describe( 'actions', () => {
1413
1119
  innerBlocks: [],
1414
1120
  } );
1415
1121
 
1416
- const fulfillment = mergeBlocks( blockA.clientId, blockB.clientId );
1417
- // MERGE_BLOCKS
1418
- fulfillment.next();
1419
- // getBlock A
1420
- fulfillment.next();
1421
- fulfillment.next( blockA );
1422
- // getBlock B
1423
- expect( fulfillment.next( blockB ).value ).toEqual( {
1424
- args: [],
1425
- selectorName: 'getSelectionStart',
1426
- storeKey: blockEditorStoreName,
1427
- type: '@@data/SELECT',
1428
- } );
1429
- expect(
1430
- fulfillment.next( {
1122
+ const select = {
1123
+ getBlock: ( clientId ) =>
1124
+ [ blockA, blockB ].find( ( b ) => b.clientId === clientId ),
1125
+ getSelectionStart: () => ( {
1431
1126
  clientId: blockB.clientId,
1432
1127
  attributeKey: 'content2',
1433
1128
  offset: 0,
1434
- } ).value
1435
- ).toEqual(
1436
- selectionChange(
1437
- blockA.clientId,
1438
- 'content',
1439
- 'chicken'.length + 1,
1440
- 'chicken'.length + 1
1441
- )
1129
+ } ),
1130
+ };
1131
+ const dispatch = Object.assign( jest.fn(), {
1132
+ replaceBlocks: jest.fn(),
1133
+ selectionChange: jest.fn(),
1134
+ } );
1135
+
1136
+ mergeBlocks(
1137
+ blockA.clientId,
1138
+ blockB.clientId
1139
+ )( { select, dispatch } );
1140
+
1141
+ expect( dispatch.selectionChange ).toHaveBeenCalledWith(
1142
+ blockA.clientId,
1143
+ 'content',
1144
+ 'chicken'.length + 1,
1145
+ 'chicken'.length + 1
1442
1146
  );
1443
1147
 
1444
- fulfillment.next();
1445
- fulfillment.next();
1446
- fulfillment.next();
1447
- expect( fulfillment.next( blockA ).value ).toMatchObject( {
1448
- type: 'REPLACE_BLOCKS',
1449
- clientIds: [ 'chicken', 'ribs' ],
1450
- blocks: [
1451
- {
1148
+ expect( dispatch.replaceBlocks ).toHaveBeenCalledWith(
1149
+ [ 'chicken', 'ribs' ],
1150
+ [
1151
+ expect.objectContaining( {
1452
1152
  clientId: 'chicken',
1453
1153
  name: 'core/test-block',
1454
1154
  attributes: { content: 'chicken ribs' },
1455
- },
1155
+ } ),
1456
1156
  ],
1457
- } );
1157
+ 0
1158
+ );
1458
1159
  } );
1459
1160
  } );
1460
1161
 
@@ -1465,6 +1166,7 @@ describe( 'actions', () => {
1465
1166
  actions,
1466
1167
  selectors,
1467
1168
  reducer,
1169
+ __experimentalUseThunks: true,
1468
1170
  } );
1469
1171
 
1470
1172
  registerBlockType( 'core/test-block', defaultBlockSettings );