@wordpress/block-editor 9.4.0 → 9.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +1 -8
  3. package/build/components/block-list/block-invalid-warning.native.js +54 -6
  4. package/build/components/block-list/block-invalid-warning.native.js.map +1 -1
  5. package/build/components/block-list/block.js +14 -4
  6. package/build/components/block-list/block.js.map +1 -1
  7. package/build/components/block-list/block.native.js +2 -1
  8. package/build/components/block-list/block.native.js.map +1 -1
  9. package/build/components/block-list/index.native.js +5 -4
  10. package/build/components/block-list/index.native.js.map +1 -1
  11. package/build/components/block-list/layout.js +20 -5
  12. package/build/components/block-list/layout.js.map +1 -1
  13. package/build/components/block-list/use-block-props/use-block-class-names.js +5 -2
  14. package/build/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  15. package/build/components/block-lock/modal.js +37 -7
  16. package/build/components/block-lock/modal.js.map +1 -1
  17. package/build/components/block-mobile-toolbar/block-actions-menu.native.js +1 -1
  18. package/build/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  19. package/build/components/block-mover/mover-description.js +95 -32
  20. package/build/components/block-mover/mover-description.js.map +1 -1
  21. package/build/components/block-pattern-setup/index.js +5 -17
  22. package/build/components/block-pattern-setup/index.js.map +1 -1
  23. package/build/components/block-popover/inbetween.js +2 -2
  24. package/build/components/block-popover/inbetween.js.map +1 -1
  25. package/build/components/block-popover/index.js +1 -1
  26. package/build/components/block-popover/index.js.map +1 -1
  27. package/build/components/block-settings-menu/block-mode-toggle.js +1 -1
  28. package/build/components/block-settings-menu/block-mode-toggle.js.map +1 -1
  29. package/build/components/block-settings-menu/block-settings-dropdown.js +4 -1
  30. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  31. package/build/components/block-settings-menu-controls/index.js +1 -1
  32. package/build/components/block-settings-menu-controls/index.js.map +1 -1
  33. package/build/components/block-styles/index.js +3 -6
  34. package/build/components/block-styles/index.js.map +1 -1
  35. package/build/components/block-styles/preview.native.js.map +1 -1
  36. package/build/components/block-switcher/index.js +7 -1
  37. package/build/components/block-switcher/index.js.map +1 -1
  38. package/build/components/block-title/index.js +8 -2
  39. package/build/components/block-title/index.js.map +1 -1
  40. package/build/components/block-title/use-block-display-title.js +12 -5
  41. package/build/components/block-title/use-block-display-title.js.map +1 -1
  42. package/build/components/block-tools/block-contextual-toolbar.js +1 -1
  43. package/build/components/block-tools/block-contextual-toolbar.js.map +1 -1
  44. package/build/components/block-tools/block-selection-button.js +1 -7
  45. package/build/components/block-tools/block-selection-button.js.map +1 -1
  46. package/build/components/block-tools/index.js +4 -1
  47. package/build/components/block-tools/index.js.map +1 -1
  48. package/build/components/block-types-list/index.js +1 -1
  49. package/build/components/block-types-list/index.js.map +1 -1
  50. package/build/components/block-types-list/index.native.js +65 -23
  51. package/build/components/block-types-list/index.native.js.map +1 -1
  52. package/build/components/border-radius-control/index.js +5 -1
  53. package/build/components/border-radius-control/index.js.map +1 -1
  54. package/build/components/colors/utils.js +6 -2
  55. package/build/components/colors/utils.js.map +1 -1
  56. package/build/components/colors/with-colors.js +1 -1
  57. package/build/components/colors/with-colors.js.map +1 -1
  58. package/build/components/colors-gradients/control.js +49 -39
  59. package/build/components/colors-gradients/control.js.map +1 -1
  60. package/build/components/colors-gradients/dropdown.js +9 -3
  61. package/build/components/colors-gradients/dropdown.js.map +1 -1
  62. package/build/components/date-format-picker/index.js +1 -1
  63. package/build/components/date-format-picker/index.js.map +1 -1
  64. package/build/components/font-appearance-control/index.js +10 -4
  65. package/build/components/font-appearance-control/index.js.map +1 -1
  66. package/build/components/iframe/index.js +19 -6
  67. package/build/components/iframe/index.js.map +1 -1
  68. package/build/components/image-editor/cropper.js +4 -3
  69. package/build/components/image-editor/cropper.js.map +1 -1
  70. package/build/components/image-editor/index.js +3 -1
  71. package/build/components/image-editor/index.js.map +1 -1
  72. package/build/components/image-size-control/index.js +3 -1
  73. package/build/components/image-size-control/index.js.map +1 -1
  74. package/build/components/index.js +13 -6
  75. package/build/components/index.js.map +1 -1
  76. package/build/components/index.native.js +11 -4
  77. package/build/components/index.native.js.map +1 -1
  78. package/build/components/inserter/block-types-tab.native.js +30 -16
  79. package/build/components/inserter/block-types-tab.native.js.map +1 -1
  80. package/build/components/inserter/index.native.js +8 -3
  81. package/build/components/inserter/index.native.js.map +1 -1
  82. package/build/components/inserter/preview-panel.js +8 -8
  83. package/build/components/inserter/preview-panel.js.map +1 -1
  84. package/build/components/inserter/reusable-blocks-tab.native.js +5 -1
  85. package/build/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  86. package/build/components/inserter/search-results.native.js +5 -2
  87. package/build/components/inserter/search-results.native.js.map +1 -1
  88. package/build/components/inserter/utils.native.js +21 -0
  89. package/build/components/inserter/utils.native.js.map +1 -1
  90. package/build/components/inserter-list-item/index.js +7 -20
  91. package/build/components/inserter-list-item/index.js.map +1 -1
  92. package/build/components/letter-spacing-control/index.js +6 -3
  93. package/build/components/letter-spacing-control/index.js.map +1 -1
  94. package/build/components/line-height-control/index.js +6 -3
  95. package/build/components/line-height-control/index.js.map +1 -1
  96. package/build/components/link-control/index.js +1 -1
  97. package/build/components/link-control/index.js.map +1 -1
  98. package/build/components/link-control/is-url-like.js +1 -7
  99. package/build/components/link-control/is-url-like.js.map +1 -1
  100. package/build/components/link-control/use-search-handler.js +1 -7
  101. package/build/components/link-control/use-search-handler.js.map +1 -1
  102. package/build/components/list-view/block-select-button.js +15 -7
  103. package/build/components/list-view/block-select-button.js.map +1 -1
  104. package/build/components/list-view/branch.js +1 -7
  105. package/build/components/list-view/branch.js.map +1 -1
  106. package/build/components/list-view/drop-indicator.js +1 -1
  107. package/build/components/list-view/drop-indicator.js.map +1 -1
  108. package/build/components/list-view/expander.js +3 -1
  109. package/build/components/list-view/expander.js.map +1 -1
  110. package/build/components/media-placeholder/index.js +13 -2
  111. package/build/components/media-placeholder/index.js.map +1 -1
  112. package/build/components/media-replace-flow/index.js +3 -6
  113. package/build/components/media-replace-flow/index.js.map +1 -1
  114. package/build/components/media-upload/index.native.js +8 -3
  115. package/build/components/media-upload/index.native.js.map +1 -1
  116. package/build/components/observe-typing/index.js +22 -8
  117. package/build/components/observe-typing/index.js.map +1 -1
  118. package/build/components/preview-options/index.js +2 -2
  119. package/build/components/preview-options/index.js.map +1 -1
  120. package/build/components/{use-no-recursive-renders → recursion-provider}/index.js +40 -18
  121. package/build/components/recursion-provider/index.js.map +1 -0
  122. package/build/components/rich-text/format-toolbar-container.js +61 -12
  123. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  124. package/build/components/rich-text/index.js +8 -2
  125. package/build/components/rich-text/index.js.map +1 -1
  126. package/build/components/rich-text/index.native.js +3 -1
  127. package/build/components/rich-text/index.native.js.map +1 -1
  128. package/build/components/rich-text/use-before-input-rules.js +110 -0
  129. package/build/components/rich-text/use-before-input-rules.js.map +1 -0
  130. package/build/components/rich-text/use-format-types.js +36 -16
  131. package/build/components/rich-text/use-format-types.js.map +1 -1
  132. package/build/components/text-decoration-control/index.js +3 -1
  133. package/build/components/text-decoration-control/index.js.map +1 -1
  134. package/build/components/text-transform-control/index.js +3 -1
  135. package/build/components/text-transform-control/index.js.map +1 -1
  136. package/build/components/url-popover/image-url-input-ui.js +4 -1
  137. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  138. package/build/components/url-popover/index.js +2 -1
  139. package/build/components/url-popover/index.js.map +1 -1
  140. package/build/components/writing-flow/use-arrow-nav.js +38 -27
  141. package/build/components/writing-flow/use-arrow-nav.js.map +1 -1
  142. package/build/components/writing-flow/use-drag-selection.js +9 -2
  143. package/build/components/writing-flow/use-drag-selection.js.map +1 -1
  144. package/build/components/writing-flow/use-multi-selection.js +3 -47
  145. package/build/components/writing-flow/use-multi-selection.js.map +1 -1
  146. package/build/components/writing-flow/use-select-all.js +3 -1
  147. package/build/components/writing-flow/use-select-all.js.map +1 -1
  148. package/build/components/writing-flow/use-selection-observer.js +1 -3
  149. package/build/components/writing-flow/use-selection-observer.js.map +1 -1
  150. package/build/components/writing-flow/use-tab-nav.js +1 -1
  151. package/build/components/writing-flow/use-tab-nav.js.map +1 -1
  152. package/build/hooks/color.js +2 -4
  153. package/build/hooks/color.js.map +1 -1
  154. package/build/hooks/index.js +8 -0
  155. package/build/hooks/index.js.map +1 -1
  156. package/build/hooks/layout.js +61 -15
  157. package/build/hooks/layout.js.map +1 -1
  158. package/build/hooks/style.js +41 -31
  159. package/build/hooks/style.js.map +1 -1
  160. package/build/hooks/utils.js +5 -3
  161. package/build/hooks/utils.js.map +1 -1
  162. package/build/index.js +7 -0
  163. package/build/index.js.map +1 -1
  164. package/build/layouts/flex.js +40 -36
  165. package/build/layouts/flex.js.map +1 -1
  166. package/build/layouts/flow.js +35 -37
  167. package/build/layouts/flow.js.map +1 -1
  168. package/build/layouts/utils.js +35 -3
  169. package/build/layouts/utils.js.map +1 -1
  170. package/build/store/actions.js +15 -18
  171. package/build/store/actions.js.map +1 -1
  172. package/build/store/index.js +0 -4
  173. package/build/store/index.js.map +1 -1
  174. package/build/store/reducer.js +5 -3
  175. package/build/store/reducer.js.map +1 -1
  176. package/build/store/selectors.js +3 -3
  177. package/build/store/selectors.js.map +1 -1
  178. package/build/utils/block-variation-transforms.js +15 -9
  179. package/build/utils/block-variation-transforms.js.map +1 -1
  180. package/build/utils/pasting.js +9 -1
  181. package/build/utils/pasting.js.map +1 -1
  182. package/build-module/components/block-list/block-invalid-warning.native.js +50 -6
  183. package/build-module/components/block-list/block-invalid-warning.native.js.map +1 -1
  184. package/build-module/components/block-list/block.js +15 -5
  185. package/build-module/components/block-list/block.js.map +1 -1
  186. package/build-module/components/block-list/block.native.js +2 -1
  187. package/build-module/components/block-list/block.native.js.map +1 -1
  188. package/build-module/components/block-list/index.native.js +4 -2
  189. package/build-module/components/block-list/index.native.js.map +1 -1
  190. package/build-module/components/block-list/layout.js +19 -4
  191. package/build-module/components/block-list/layout.js.map +1 -1
  192. package/build-module/components/block-list/use-block-props/use-block-class-names.js +5 -2
  193. package/build-module/components/block-list/use-block-props/use-block-class-names.js.map +1 -1
  194. package/build-module/components/block-lock/modal.js +39 -8
  195. package/build-module/components/block-lock/modal.js.map +1 -1
  196. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js +2 -2
  197. package/build-module/components/block-mobile-toolbar/block-actions-menu.native.js.map +1 -1
  198. package/build-module/components/block-mover/mover-description.js +97 -33
  199. package/build-module/components/block-mover/mover-description.js.map +1 -1
  200. package/build-module/components/block-pattern-setup/index.js +6 -18
  201. package/build-module/components/block-pattern-setup/index.js.map +1 -1
  202. package/build-module/components/block-popover/inbetween.js +2 -2
  203. package/build-module/components/block-popover/inbetween.js.map +1 -1
  204. package/build-module/components/block-popover/index.js +1 -1
  205. package/build-module/components/block-popover/index.js.map +1 -1
  206. package/build-module/components/block-settings-menu/block-mode-toggle.js +1 -1
  207. package/build-module/components/block-settings-menu/block-mode-toggle.js.map +1 -1
  208. package/build-module/components/block-settings-menu/block-settings-dropdown.js +4 -1
  209. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  210. package/build-module/components/block-settings-menu-controls/index.js +2 -2
  211. package/build-module/components/block-settings-menu-controls/index.js.map +1 -1
  212. package/build-module/components/block-styles/index.js +4 -7
  213. package/build-module/components/block-styles/index.js.map +1 -1
  214. package/build-module/components/block-styles/preview.native.js.map +1 -1
  215. package/build-module/components/block-switcher/index.js +7 -1
  216. package/build-module/components/block-switcher/index.js.map +1 -1
  217. package/build-module/components/block-title/index.js +8 -2
  218. package/build-module/components/block-title/index.js.map +1 -1
  219. package/build-module/components/block-title/use-block-display-title.js +12 -5
  220. package/build-module/components/block-title/use-block-display-title.js.map +1 -1
  221. package/build-module/components/block-tools/block-contextual-toolbar.js +1 -1
  222. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  223. package/build-module/components/block-tools/block-selection-button.js +1 -7
  224. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  225. package/build-module/components/block-tools/index.js +4 -1
  226. package/build-module/components/block-tools/index.js.map +1 -1
  227. package/build-module/components/block-types-list/index.js +1 -1
  228. package/build-module/components/block-types-list/index.js.map +1 -1
  229. package/build-module/components/block-types-list/index.native.js +67 -25
  230. package/build-module/components/block-types-list/index.native.js.map +1 -1
  231. package/build-module/components/border-radius-control/index.js +6 -2
  232. package/build-module/components/border-radius-control/index.js.map +1 -1
  233. package/build-module/components/colors/utils.js +7 -3
  234. package/build-module/components/colors/utils.js.map +1 -1
  235. package/build-module/components/colors/with-colors.js +2 -2
  236. package/build-module/components/colors/with-colors.js.map +1 -1
  237. package/build-module/components/colors-gradients/control.js +50 -40
  238. package/build-module/components/colors-gradients/control.js.map +1 -1
  239. package/build-module/components/colors-gradients/dropdown.js +10 -4
  240. package/build-module/components/colors-gradients/dropdown.js.map +1 -1
  241. package/build-module/components/date-format-picker/index.js +1 -1
  242. package/build-module/components/date-format-picker/index.js.map +1 -1
  243. package/build-module/components/font-appearance-control/index.js +7 -4
  244. package/build-module/components/font-appearance-control/index.js.map +1 -1
  245. package/build-module/components/iframe/index.js +19 -6
  246. package/build-module/components/iframe/index.js.map +1 -1
  247. package/build-module/components/image-editor/cropper.js +4 -3
  248. package/build-module/components/image-editor/cropper.js.map +1 -1
  249. package/build-module/components/image-editor/index.js +3 -1
  250. package/build-module/components/image-editor/index.js.map +1 -1
  251. package/build-module/components/image-size-control/index.js +3 -1
  252. package/build-module/components/image-size-control/index.js.map +1 -1
  253. package/build-module/components/index.js +1 -1
  254. package/build-module/components/index.js.map +1 -1
  255. package/build-module/components/index.native.js +1 -1
  256. package/build-module/components/index.native.js.map +1 -1
  257. package/build-module/components/inserter/block-types-tab.native.js +31 -15
  258. package/build-module/components/inserter/block-types-tab.native.js.map +1 -1
  259. package/build-module/components/inserter/index.native.js +9 -2
  260. package/build-module/components/inserter/index.native.js.map +1 -1
  261. package/build-module/components/inserter/preview-panel.js +9 -9
  262. package/build-module/components/inserter/preview-panel.js.map +1 -1
  263. package/build-module/components/inserter/reusable-blocks-tab.native.js +6 -2
  264. package/build-module/components/inserter/reusable-blocks-tab.native.js.map +1 -1
  265. package/build-module/components/inserter/search-results.native.js +6 -3
  266. package/build-module/components/inserter/search-results.native.js.map +1 -1
  267. package/build-module/components/inserter/utils.native.js +19 -0
  268. package/build-module/components/inserter/utils.native.js.map +1 -1
  269. package/build-module/components/inserter-list-item/index.js +5 -18
  270. package/build-module/components/inserter-list-item/index.js.map +1 -1
  271. package/build-module/components/letter-spacing-control/index.js +5 -3
  272. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  273. package/build-module/components/line-height-control/index.js +5 -3
  274. package/build-module/components/line-height-control/index.js.map +1 -1
  275. package/build-module/components/link-control/index.js +1 -1
  276. package/build-module/components/link-control/index.js.map +1 -1
  277. package/build-module/components/link-control/is-url-like.js +1 -6
  278. package/build-module/components/link-control/is-url-like.js.map +1 -1
  279. package/build-module/components/link-control/use-search-handler.js +1 -6
  280. package/build-module/components/link-control/use-search-handler.js.map +1 -1
  281. package/build-module/components/list-view/block-select-button.js +16 -8
  282. package/build-module/components/list-view/block-select-button.js.map +1 -1
  283. package/build-module/components/list-view/branch.js +1 -6
  284. package/build-module/components/list-view/branch.js.map +1 -1
  285. package/build-module/components/list-view/drop-indicator.js +1 -1
  286. package/build-module/components/list-view/drop-indicator.js.map +1 -1
  287. package/build-module/components/list-view/expander.js +3 -2
  288. package/build-module/components/list-view/expander.js.map +1 -1
  289. package/build-module/components/media-placeholder/index.js +13 -2
  290. package/build-module/components/media-placeholder/index.js.map +1 -1
  291. package/build-module/components/media-replace-flow/index.js +4 -7
  292. package/build-module/components/media-replace-flow/index.js.map +1 -1
  293. package/build-module/components/media-upload/index.native.js +9 -2
  294. package/build-module/components/media-upload/index.native.js.map +1 -1
  295. package/build-module/components/observe-typing/index.js +22 -8
  296. package/build-module/components/observe-typing/index.js.map +1 -1
  297. package/build-module/components/preview-options/index.js +2 -2
  298. package/build-module/components/preview-options/index.js.map +1 -1
  299. package/build-module/components/{use-no-recursive-renders → recursion-provider}/index.js +39 -19
  300. package/build-module/components/recursion-provider/index.js.map +1 -0
  301. package/build-module/components/rich-text/format-toolbar-container.js +58 -12
  302. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  303. package/build-module/components/rich-text/index.js +7 -2
  304. package/build-module/components/rich-text/index.js.map +1 -1
  305. package/build-module/components/rich-text/index.native.js +3 -1
  306. package/build-module/components/rich-text/index.native.js.map +1 -1
  307. package/build-module/components/rich-text/use-before-input-rules.js +96 -0
  308. package/build-module/components/rich-text/use-before-input-rules.js.map +1 -0
  309. package/build-module/components/rich-text/use-format-types.js +37 -18
  310. package/build-module/components/rich-text/use-format-types.js.map +1 -1
  311. package/build-module/components/text-decoration-control/index.js +4 -2
  312. package/build-module/components/text-decoration-control/index.js.map +1 -1
  313. package/build-module/components/text-transform-control/index.js +4 -2
  314. package/build-module/components/text-transform-control/index.js.map +1 -1
  315. package/build-module/components/url-popover/image-url-input-ui.js +4 -1
  316. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  317. package/build-module/components/url-popover/index.js +2 -1
  318. package/build-module/components/url-popover/index.js.map +1 -1
  319. package/build-module/components/writing-flow/use-arrow-nav.js +40 -29
  320. package/build-module/components/writing-flow/use-arrow-nav.js.map +1 -1
  321. package/build-module/components/writing-flow/use-drag-selection.js +9 -2
  322. package/build-module/components/writing-flow/use-drag-selection.js.map +1 -1
  323. package/build-module/components/writing-flow/use-multi-selection.js +3 -45
  324. package/build-module/components/writing-flow/use-multi-selection.js.map +1 -1
  325. package/build-module/components/writing-flow/use-select-all.js +3 -1
  326. package/build-module/components/writing-flow/use-select-all.js.map +1 -1
  327. package/build-module/components/writing-flow/use-selection-observer.js +1 -3
  328. package/build-module/components/writing-flow/use-selection-observer.js.map +1 -1
  329. package/build-module/components/writing-flow/use-tab-nav.js +1 -1
  330. package/build-module/components/writing-flow/use-tab-nav.js.map +1 -1
  331. package/build-module/hooks/color.js +2 -3
  332. package/build-module/hooks/color.js.map +1 -1
  333. package/build-module/hooks/index.js +1 -0
  334. package/build-module/hooks/index.js.map +1 -1
  335. package/build-module/hooks/layout.js +62 -16
  336. package/build-module/hooks/layout.js.map +1 -1
  337. package/build-module/hooks/style.js +44 -35
  338. package/build-module/hooks/style.js.map +1 -1
  339. package/build-module/hooks/utils.js +5 -2
  340. package/build-module/hooks/utils.js.map +1 -1
  341. package/build-module/index.js +1 -1
  342. package/build-module/index.js.map +1 -1
  343. package/build-module/layouts/flex.js +41 -33
  344. package/build-module/layouts/flex.js.map +1 -1
  345. package/build-module/layouts/flow.js +35 -38
  346. package/build-module/layouts/flow.js.map +1 -1
  347. package/build-module/layouts/utils.js +33 -3
  348. package/build-module/layouts/utils.js.map +1 -1
  349. package/build-module/store/actions.js +9 -10
  350. package/build-module/store/actions.js.map +1 -1
  351. package/build-module/store/index.js +0 -4
  352. package/build-module/store/index.js.map +1 -1
  353. package/build-module/store/reducer.js +5 -2
  354. package/build-module/store/reducer.js.map +1 -1
  355. package/build-module/store/selectors.js +4 -4
  356. package/build-module/store/selectors.js.map +1 -1
  357. package/build-module/utils/block-variation-transforms.js +14 -7
  358. package/build-module/utils/block-variation-transforms.js.map +1 -1
  359. package/build-module/utils/pasting.js +9 -1
  360. package/build-module/utils/pasting.js.map +1 -1
  361. package/build-style/style-rtl.css +72 -14
  362. package/build-style/style.css +72 -14
  363. package/package.json +28 -28
  364. package/src/components/block-list/block-invalid-warning.native.js +42 -7
  365. package/src/components/block-list/block.js +15 -4
  366. package/src/components/block-list/block.native.js +1 -0
  367. package/src/components/block-list/index.native.js +2 -2
  368. package/src/components/block-list/layout.js +15 -3
  369. package/src/components/block-list/style.scss +1 -1
  370. package/src/components/block-list/use-block-props/use-block-class-names.js +5 -1
  371. package/src/components/block-lock/modal.js +47 -9
  372. package/src/components/block-lock/style.scss +10 -0
  373. package/src/components/block-mobile-toolbar/block-actions-menu.native.js +3 -3
  374. package/src/components/block-mover/mover-description.js +131 -48
  375. package/src/components/block-mover/test/mover-description.js +55 -3
  376. package/src/components/block-pattern-setup/index.js +3 -15
  377. package/src/components/block-pattern-setup/style.scss +4 -2
  378. package/src/components/block-popover/inbetween.js +2 -1
  379. package/src/components/block-popover/index.js +1 -1
  380. package/src/components/block-popover/style.scss +25 -2
  381. package/src/components/block-settings-menu/block-mode-toggle.js +1 -0
  382. package/src/components/block-settings-menu/block-settings-dropdown.js +4 -1
  383. package/src/components/block-settings-menu-controls/index.js +2 -2
  384. package/src/components/block-styles/index.js +4 -7
  385. package/src/components/block-styles/preview.native.js +1 -0
  386. package/src/components/block-styles/style.scss +10 -0
  387. package/src/components/block-switcher/index.js +7 -1
  388. package/src/components/block-title/index.js +3 -2
  389. package/src/components/block-title/use-block-display-title.js +11 -5
  390. package/src/components/block-tools/block-contextual-toolbar.js +3 -1
  391. package/src/components/block-tools/block-selection-button.js +0 -5
  392. package/src/components/block-tools/index.js +4 -1
  393. package/src/components/block-types-list/index.js +1 -1
  394. package/src/components/block-types-list/index.native.js +76 -24
  395. package/src/components/block-types-list/style.native.scss +18 -0
  396. package/src/components/border-radius-control/index.js +6 -1
  397. package/src/components/color-palette/test/__snapshots__/control.js.snap +91 -79
  398. package/src/components/colors/test/__snapshots__/with-colors.js.snap +1 -1
  399. package/src/components/colors/test/with-colors.js +1 -1
  400. package/src/components/colors/utils.js +5 -2
  401. package/src/components/colors/with-colors.js +2 -2
  402. package/src/components/colors-gradients/control.js +82 -65
  403. package/src/components/colors-gradients/dropdown.js +14 -3
  404. package/src/components/colors-gradients/style.scss +34 -9
  405. package/src/components/colors-gradients/test/control.js +16 -23
  406. package/src/components/date-format-picker/index.js +1 -0
  407. package/src/components/font-appearance-control/index.js +3 -0
  408. package/src/components/iframe/index.js +25 -6
  409. package/src/components/image-editor/cropper.js +9 -3
  410. package/src/components/image-editor/index.js +2 -0
  411. package/src/components/image-size-control/README.md +7 -0
  412. package/src/components/image-size-control/index.js +2 -0
  413. package/src/components/index.js +4 -1
  414. package/src/components/index.native.js +4 -1
  415. package/src/components/inserter/block-types-tab.native.js +42 -21
  416. package/src/components/inserter/index.native.js +7 -2
  417. package/src/components/inserter/preview-panel.js +6 -14
  418. package/src/components/inserter/reusable-blocks-tab.native.js +4 -2
  419. package/src/components/inserter/search-results.native.js +4 -2
  420. package/src/components/inserter/style.scss +1 -1
  421. package/src/components/inserter/test/block-types-tab.native.js +2 -0
  422. package/src/components/inserter/test/utils.native.js +37 -0
  423. package/src/components/inserter/utils.native.js +11 -0
  424. package/src/components/inserter-list-item/index.js +5 -18
  425. package/src/components/letter-spacing-control/index.js +2 -0
  426. package/src/components/line-height-control/index.js +2 -0
  427. package/src/components/link-control/index.js +1 -0
  428. package/src/components/link-control/is-url-like.js +1 -6
  429. package/src/components/link-control/test/index.js +6 -4
  430. package/src/components/link-control/use-search-handler.js +1 -6
  431. package/src/components/list-view/block-select-button.js +29 -14
  432. package/src/components/list-view/branch.js +1 -6
  433. package/src/components/list-view/drop-indicator.js +1 -1
  434. package/src/components/list-view/expander.js +4 -2
  435. package/src/components/list-view/style.scss +18 -4
  436. package/src/components/media-placeholder/index.js +19 -0
  437. package/src/components/media-replace-flow/index.js +3 -6
  438. package/src/components/media-replace-flow/test/index.js +14 -4
  439. package/src/components/media-upload/index.native.js +7 -3
  440. package/src/components/observe-typing/index.js +17 -14
  441. package/src/components/preview-options/index.js +2 -2
  442. package/src/components/{use-no-recursive-renders → recursion-provider}/index.js +39 -28
  443. package/src/components/{use-no-recursive-renders/test/use-no-recursive-renders.js → recursion-provider/test/index.js} +5 -6
  444. package/src/components/rich-text/README.md +13 -1
  445. package/src/components/rich-text/format-toolbar-container.js +63 -14
  446. package/src/components/rich-text/index.js +3 -0
  447. package/src/components/rich-text/index.native.js +2 -0
  448. package/src/components/rich-text/use-before-input-rules.js +91 -0
  449. package/src/components/rich-text/use-format-types.js +38 -17
  450. package/src/components/text-decoration-control/index.js +4 -2
  451. package/src/components/text-transform-control/index.js +4 -2
  452. package/src/components/url-popover/image-url-input-ui.js +3 -0
  453. package/src/components/url-popover/index.js +1 -0
  454. package/src/components/url-popover/test/__snapshots__/index.js.snap +3 -0
  455. package/src/components/writing-flow/use-arrow-nav.js +36 -34
  456. package/src/components/writing-flow/use-drag-selection.js +7 -1
  457. package/src/components/writing-flow/use-multi-selection.js +1 -48
  458. package/src/components/writing-flow/use-select-all.js +2 -1
  459. package/src/components/writing-flow/use-selection-observer.js +2 -3
  460. package/src/components/writing-flow/use-tab-nav.js +1 -1
  461. package/src/hooks/color.js +10 -3
  462. package/src/hooks/index.js +1 -0
  463. package/src/hooks/layout.js +66 -23
  464. package/src/hooks/style.js +46 -39
  465. package/src/hooks/utils.js +7 -3
  466. package/src/index.js +1 -0
  467. package/src/layouts/flex.js +47 -41
  468. package/src/layouts/flow.js +35 -34
  469. package/src/layouts/test/flex.js +21 -0
  470. package/src/layouts/test/flow.js +21 -0
  471. package/src/layouts/test/utils.js +138 -0
  472. package/src/layouts/utils.js +44 -3
  473. package/src/store/actions.js +10 -11
  474. package/src/store/index.js +0 -4
  475. package/src/store/reducer.js +3 -2
  476. package/src/store/selectors.js +3 -4
  477. package/src/utils/block-variation-transforms.js +13 -6
  478. package/src/utils/pasting.js +10 -1
  479. package/src/utils/test/block-variation-transforms.js +24 -0
  480. package/src/utils/test/pasting.js +10 -0
  481. package/tsconfig.json +2 -1
  482. package/build/components/use-no-recursive-renders/index.js.map +0 -1
  483. package/build-module/components/use-no-recursive-renders/index.js.map +0 -1
@@ -9,7 +9,11 @@ import { has, kebabCase } from 'lodash';
9
9
  */
10
10
  import { createHigherOrderComponent, useInstanceId } from '@wordpress/compose';
11
11
  import { addFilter } from '@wordpress/hooks';
12
- import { getBlockSupport, hasBlockSupport } from '@wordpress/blocks';
12
+ import {
13
+ getBlockDefaultClassName,
14
+ getBlockSupport,
15
+ hasBlockSupport,
16
+ } from '@wordpress/blocks';
13
17
  import { useSelect } from '@wordpress/data';
14
18
  import {
15
19
  Button,
@@ -40,35 +44,40 @@ const layoutBlockSupportKey = '__experimentalLayout';
40
44
  * have the style engine generate a more extensive list of utility classnames which
41
45
  * will then replace this method.
42
46
  *
43
- * @param { Array } attributes Array of block attributes.
47
+ * @param { Object } layout Layout object.
48
+ * @param { Object } layoutDefinitions An object containing layout definitions, stored in theme.json.
44
49
  *
45
50
  * @return { Array } Array of CSS classname strings.
46
51
  */
47
- function getLayoutClasses( attributes ) {
52
+ function useLayoutClasses( layout, layoutDefinitions ) {
53
+ const rootPaddingAlignment = useSelect( ( select ) => {
54
+ const { getSettings } = select( blockEditorStore );
55
+ return getSettings().__experimentalFeatures
56
+ ?.useRootPaddingAwareAlignments;
57
+ }, [] );
48
58
  const layoutClassnames = [];
49
59
 
50
- if ( ! attributes.layout ) {
51
- return layoutClassnames;
52
- }
53
-
54
- if ( attributes?.layout?.orientation ) {
60
+ if ( layoutDefinitions?.[ layout?.type || 'default' ]?.className ) {
55
61
  layoutClassnames.push(
56
- `is-${ kebabCase( attributes.layout.orientation ) }`
62
+ layoutDefinitions?.[ layout?.type || 'default' ]?.className
57
63
  );
58
64
  }
59
65
 
60
- if ( attributes?.layout?.justifyContent ) {
66
+ if ( ( layout?.inherit || layout?.contentSize ) && rootPaddingAlignment ) {
67
+ layoutClassnames.push( 'has-global-padding' );
68
+ }
69
+
70
+ if ( layout?.orientation ) {
71
+ layoutClassnames.push( `is-${ kebabCase( layout.orientation ) }` );
72
+ }
73
+
74
+ if ( layout?.justifyContent ) {
61
75
  layoutClassnames.push(
62
- `is-content-justification-${ kebabCase(
63
- attributes.layout.justifyContent
64
- ) }`
76
+ `is-content-justification-${ kebabCase( layout.justifyContent ) }`
65
77
  );
66
78
  }
67
79
 
68
- if (
69
- attributes?.layout?.flexWrap &&
70
- attributes.layout.flexWrap === 'nowrap'
71
- ) {
80
+ if ( layout?.flexWrap && layout.flexWrap === 'nowrap' ) {
72
81
  layoutClassnames.push( 'is-nowrap' );
73
82
  }
74
83
 
@@ -136,7 +145,9 @@ function LayoutPanel( { setAttributes, attributes, name: blockName } ) {
136
145
  checked={ ! inherit }
137
146
  onChange={ () =>
138
147
  setAttributes( {
139
- layout: { inherit: ! inherit },
148
+ layout: {
149
+ inherit: ! inherit,
150
+ },
140
151
  } )
141
152
  }
142
153
  />
@@ -253,10 +264,16 @@ export const withInspectorControls = createHigherOrderComponent(
253
264
  export const withLayoutStyles = createHigherOrderComponent(
254
265
  ( BlockListBlock ) => ( props ) => {
255
266
  const { name, attributes } = props;
256
- const shouldRenderLayoutStyles = hasBlockSupport(
267
+ const hasLayoutBlockSupport = hasBlockSupport(
257
268
  name,
258
269
  layoutBlockSupportKey
259
270
  );
271
+ const disableLayoutStyles = useSelect( ( select ) => {
272
+ const { getSettings } = select( blockEditorStore );
273
+ return !! getSettings().disableLayoutStyles;
274
+ } );
275
+ const shouldRenderLayoutStyles =
276
+ hasLayoutBlockSupport && ! disableLayoutStyles;
260
277
  const id = useInstanceId( BlockListBlock );
261
278
  const defaultThemeLayout = useSetting( 'layout' ) || {};
262
279
  const element = useContext( BlockList.__unstableElementContext );
@@ -266,13 +283,37 @@ export const withLayoutStyles = createHigherOrderComponent(
266
283
  const usedLayout = layout?.inherit
267
284
  ? defaultThemeLayout
268
285
  : layout || defaultBlockLayout || {};
269
- const layoutClasses = shouldRenderLayoutStyles
270
- ? getLayoutClasses( attributes )
286
+ const layoutClasses = hasLayoutBlockSupport
287
+ ? useLayoutClasses( usedLayout, defaultThemeLayout?.definitions )
271
288
  : null;
289
+ const selector = `.${ getBlockDefaultClassName(
290
+ name
291
+ ) }.wp-container-${ id }`;
292
+ const blockGapSupport = useSetting( 'spacing.blockGap' );
293
+ const hasBlockGapSupport = blockGapSupport !== null;
294
+
295
+ // Get CSS string for the current layout type.
296
+ // The CSS and `style` element is only output if it is not empty.
297
+ let css;
298
+ if ( shouldRenderLayoutStyles ) {
299
+ const fullLayoutType = getLayoutType(
300
+ usedLayout?.type || 'default'
301
+ );
302
+ css = fullLayoutType?.getLayoutStyle?.( {
303
+ blockName: name,
304
+ selector,
305
+ layout: usedLayout,
306
+ layoutDefinitions: defaultThemeLayout?.definitions,
307
+ style: attributes?.style,
308
+ hasBlockGapSupport,
309
+ } );
310
+ }
311
+
312
+ // Attach a `wp-container-` id-based class name as well as a layout class name such as `is-layout-flex`.
272
313
  const className = classnames(
273
314
  props?.className,
274
315
  {
275
- [ `wp-container-${ id }` ]: shouldRenderLayoutStyles,
316
+ [ `wp-container-${ id }` ]: shouldRenderLayoutStyles && !! css, // Only attach a container class if there is generated CSS to be attached.
276
317
  },
277
318
  layoutClasses
278
319
  );
@@ -281,10 +322,12 @@ export const withLayoutStyles = createHigherOrderComponent(
281
322
  <>
282
323
  { shouldRenderLayoutStyles &&
283
324
  element &&
325
+ !! css &&
284
326
  createPortal(
285
327
  <LayoutStyle
286
328
  blockName={ name }
287
- selector={ `.wp-container-${ id }` }
329
+ selector={ selector }
330
+ css={ css }
288
331
  layout={ usedLayout }
289
332
  style={ attributes?.style }
290
333
  />,
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { get, has, isEmpty, kebabCase, omit } from 'lodash';
4
+ import { get, has, omit } from 'lodash';
5
5
  import classnames from 'classnames';
6
6
 
7
7
  /**
8
8
  * WordPress dependencies
9
9
  */
10
- import { useContext, createPortal } from '@wordpress/element';
10
+ import { useContext, useMemo, createPortal } from '@wordpress/element';
11
11
  import { addFilter } from '@wordpress/hooks';
12
12
  import {
13
13
  getBlockSupport,
@@ -16,7 +16,10 @@ import {
16
16
  __EXPERIMENTAL_ELEMENTS as ELEMENTS,
17
17
  } from '@wordpress/blocks';
18
18
  import { createHigherOrderComponent, useInstanceId } from '@wordpress/compose';
19
- import { getCSSRules } from '@wordpress/style-engine';
19
+ import {
20
+ getCSSRules,
21
+ generate as generateStyles,
22
+ } from '@wordpress/style-engine';
20
23
 
21
24
  /**
22
25
  * Internal dependencies
@@ -68,6 +71,9 @@ export function getInlineStyles( styles = {} ) {
68
71
  const ignoredStyles = [ 'spacing.blockGap' ];
69
72
  const output = {};
70
73
  Object.keys( STYLE_PROPERTY ).forEach( ( propKey ) => {
74
+ if ( STYLE_PROPERTY[ propKey ].rootOnly ) {
75
+ return;
76
+ }
71
77
  const path = STYLE_PROPERTY[ propKey ].value;
72
78
  const subPaths = STYLE_PROPERTY[ propKey ].properties;
73
79
  // Ignore styles on elements because they are handled on the server.
@@ -105,28 +111,6 @@ export function getInlineStyles( styles = {} ) {
105
111
  return output;
106
112
  }
107
113
 
108
- function compileElementsStyles( selector, elements = {} ) {
109
- return Object.entries( elements )
110
- .map( ( [ element, styles ] ) => {
111
- const elementStyles = getInlineStyles( styles );
112
- if ( ! isEmpty( elementStyles ) ) {
113
- // The .editor-styles-wrapper selector is required on elements styles. As it is
114
- // added to all other editor styles, not providing it causes reset and global
115
- // styles to override element styles because of higher specificity.
116
- return [
117
- `.editor-styles-wrapper .${ selector } ${ ELEMENTS[ element ] }{`,
118
- ...Object.entries( elementStyles ).map(
119
- ( [ cssProperty, value ] ) =>
120
- `\t${ kebabCase( cssProperty ) }: ${ value };`
121
- ),
122
- '}',
123
- ].join( '\n' );
124
- }
125
- return '';
126
- } )
127
- .join( '\n' );
128
- }
129
-
130
114
  /**
131
115
  * Filters registered block settings, extending attributes to include `style` attribute.
132
116
  *
@@ -323,23 +307,46 @@ const withElementsStyles = createHigherOrderComponent(
323
307
  'link'
324
308
  );
325
309
 
326
- // The Elements API only supports link colors for now,
327
- // hence the specific omission of `link` in the elements styles.
328
- // This might need to be refactored or removed if the Elements API
329
- // changes or `link` supports styles beyond `color`.
330
- const elements = skipLinkColorSerialization
331
- ? omit( props.attributes.style?.elements, [ 'link' ] )
332
- : props.attributes.style?.elements;
333
-
334
- const styles = compileElementsStyles(
335
- blockElementsContainerIdentifier,
336
- elements
337
- );
310
+ const styles = useMemo( () => {
311
+ const rawElementsStyles = props.attributes.style?.elements;
312
+ const elementCssRules = [];
313
+ if (
314
+ rawElementsStyles &&
315
+ Object.keys( rawElementsStyles ).length > 0
316
+ ) {
317
+ // Remove values based on whether serialization has been skipped for a specific style.
318
+ const filteredElementsStyles = {
319
+ ...rawElementsStyles,
320
+ link: {
321
+ ...rawElementsStyles.link,
322
+ color: ! skipLinkColorSerialization
323
+ ? rawElementsStyles.link?.color
324
+ : undefined,
325
+ },
326
+ };
327
+
328
+ for ( const [ elementName, elementStyles ] of Object.entries(
329
+ filteredElementsStyles
330
+ ) ) {
331
+ const cssRule = generateStyles( elementStyles, {
332
+ // The .editor-styles-wrapper selector is required on elements styles. As it is
333
+ // added to all other editor styles, not providing it causes reset and global
334
+ // styles to override element styles because of higher specificity.
335
+ selector: `.editor-styles-wrapper .${ blockElementsContainerIdentifier } ${ ELEMENTS[ elementName ] }`,
336
+ } );
337
+ if ( !! cssRule ) {
338
+ elementCssRules.push( cssRule );
339
+ }
340
+ }
341
+ }
342
+ return elementCssRules.length > 0 ? elementCssRules : undefined;
343
+ }, [ props.attributes.style?.elements ] );
344
+
338
345
  const element = useContext( BlockList.__unstableElementContext );
339
346
 
340
347
  return (
341
348
  <>
342
- { elements &&
349
+ { styles &&
343
350
  element &&
344
351
  createPortal(
345
352
  <style
@@ -353,7 +360,7 @@ const withElementsStyles = createHigherOrderComponent(
353
360
  <BlockListBlock
354
361
  { ...props }
355
362
  className={
356
- elements
363
+ props.attributes.style?.elements
357
364
  ? classnames(
358
365
  props.className,
359
366
  blockElementsContainerIdentifier
@@ -4,8 +4,6 @@
4
4
  import {
5
5
  pickBy,
6
6
  isEmpty,
7
- isObject,
8
- identity,
9
7
  mapValues,
10
8
  forEach,
11
9
  get,
@@ -19,6 +17,8 @@ import {
19
17
  */
20
18
  import { getBlockSupport } from '@wordpress/blocks';
21
19
 
20
+ const identity = ( x ) => x;
21
+
22
22
  /**
23
23
  * Removed falsy values from nested object.
24
24
  *
@@ -26,7 +26,11 @@ import { getBlockSupport } from '@wordpress/blocks';
26
26
  * @return {*} Object cleaned from falsy values
27
27
  */
28
28
  export const cleanEmptyObject = ( object ) => {
29
- if ( ! isObject( object ) || Array.isArray( object ) ) {
29
+ if (
30
+ object === null ||
31
+ typeof object !== 'object' ||
32
+ Array.isArray( object )
33
+ ) {
30
34
  return object;
31
35
  }
32
36
  const cleanedNestedObjects = pickBy(
package/src/index.js CHANGED
@@ -9,6 +9,7 @@ export {
9
9
  useColorProps as __experimentalUseColorProps,
10
10
  useCustomSides as __experimentalUseCustomSides,
11
11
  getSpacingClassesAndStyles as __experimentalGetSpacingClassesAndStyles,
12
+ getGapCSSValue as __experimentalGetGapCSSValue,
12
13
  useCachedTruthy,
13
14
  } from './hooks';
14
15
  export * from './components';
@@ -11,14 +11,12 @@ import {
11
11
  arrowDown,
12
12
  } from '@wordpress/icons';
13
13
  import { Button, ToggleControl, Flex, FlexItem } from '@wordpress/components';
14
- import { getBlockSupport } from '@wordpress/blocks';
15
14
 
16
15
  /**
17
16
  * Internal dependencies
18
17
  */
19
- import { appendSelectors } from './utils';
18
+ import { appendSelectors, getBlockGapCSS } from './utils';
20
19
  import { getGapCSSValue } from '../hooks/gap';
21
- import useSetting from '../components/use-setting';
22
20
  import {
23
21
  BlockControls,
24
22
  JustifyContentControl,
@@ -107,59 +105,67 @@ export default {
107
105
  </BlockControls>
108
106
  );
109
107
  },
110
- save: function FlexLayoutStyle( { selector, layout, style, blockName } ) {
108
+ getLayoutStyle: function getLayoutStyle( {
109
+ selector,
110
+ layout,
111
+ style,
112
+ blockName,
113
+ hasBlockGapSupport,
114
+ layoutDefinitions,
115
+ } ) {
111
116
  const { orientation = 'horizontal' } = layout;
112
- const blockGapSupport = useSetting( 'spacing.blockGap' );
113
- const fallbackValue =
114
- getBlockSupport( blockName, [
115
- 'spacing',
116
- 'blockGap',
117
- '__experimentalDefault',
118
- ] ) || '0.5em';
119
117
 
120
- const hasBlockGapStylesSupport = blockGapSupport !== null;
121
118
  // If a block's block.json skips serialization for spacing or spacing.blockGap,
122
119
  // don't apply the user-defined value to the styles.
123
120
  const blockGapValue =
124
121
  style?.spacing?.blockGap &&
125
122
  ! shouldSkipSerialization( blockName, 'spacing', 'blockGap' )
126
- ? getGapCSSValue( style?.spacing?.blockGap, fallbackValue )
127
- : `var( --wp--style--block-gap, ${ fallbackValue } )`;
128
- const justifyContent =
129
- justifyContentMap[ layout.justifyContent ] ||
130
- justifyContentMap.left;
123
+ ? getGapCSSValue( style?.spacing?.blockGap )
124
+ : undefined;
125
+ const justifyContent = justifyContentMap[ layout.justifyContent ];
131
126
  const flexWrap = flexWrapOptions.includes( layout.flexWrap )
132
127
  ? layout.flexWrap
133
128
  : 'wrap';
134
129
  const verticalAlignment =
135
- verticalAlignmentMap[ layout.verticalAlignment ] ||
136
- verticalAlignmentMap.center;
137
- const rowOrientation = `
138
- flex-direction: row;
139
- align-items: ${ verticalAlignment };
140
- justify-content: ${ justifyContent };
141
- `;
130
+ verticalAlignmentMap[ layout.verticalAlignment ];
142
131
  const alignItems =
143
132
  alignItemsMap[ layout.justifyContent ] || alignItemsMap.left;
144
- const columnOrientation = `
145
- flex-direction: column;
146
- align-items: ${ alignItems };
147
- `;
148
133
 
149
- return (
150
- <style>{ `
151
- ${ appendSelectors( selector ) } {
152
- display: flex;
153
- flex-wrap: ${ flexWrap };
154
- gap: ${ hasBlockGapStylesSupport ? blockGapValue : fallbackValue };
155
- ${ orientation === 'horizontal' ? rowOrientation : columnOrientation }
156
- }
134
+ let output = '';
135
+ const rules = [];
157
136
 
158
- ${ appendSelectors( selector, '> *' ) } {
159
- margin: 0;
160
- }
161
- ` }</style>
162
- );
137
+ if ( flexWrap && flexWrap !== 'wrap' ) {
138
+ rules.push( `flex-wrap: ${ flexWrap }` );
139
+ }
140
+
141
+ if ( orientation === 'horizontal' ) {
142
+ if ( verticalAlignment ) {
143
+ rules.push( `align-items: ${ verticalAlignment }` );
144
+ }
145
+ if ( justifyContent ) {
146
+ rules.push( `justify-content: ${ justifyContent }` );
147
+ }
148
+ } else {
149
+ rules.push( 'flex-direction: column' );
150
+ rules.push( `align-items: ${ alignItems }` );
151
+ }
152
+
153
+ if ( rules.length ) {
154
+ output = `${ appendSelectors( selector ) } {
155
+ ${ rules.join( '; ' ) };
156
+ }`;
157
+ }
158
+
159
+ // Output blockGap styles based on rules contained in layout definitions in theme.json.
160
+ if ( hasBlockGapSupport && blockGapValue ) {
161
+ output += getBlockGapCSS(
162
+ selector,
163
+ layoutDefinitions,
164
+ 'flex',
165
+ blockGapValue
166
+ );
167
+ }
168
+ return output;
163
169
  },
164
170
  getOrientation( layout ) {
165
171
  const { orientation = 'horizontal' } = layout;
@@ -8,12 +8,13 @@ import {
8
8
  } from '@wordpress/components';
9
9
  import { __, sprintf } from '@wordpress/i18n';
10
10
  import { Icon, positionCenter, stretchWide } from '@wordpress/icons';
11
+ import { getCSSRules } from '@wordpress/style-engine';
11
12
 
12
13
  /**
13
14
  * Internal dependencies
14
15
  */
15
16
  import useSetting from '../components/use-setting';
16
- import { appendSelectors } from './utils';
17
+ import { appendSelectors, getBlockGapCSS } from './utils';
17
18
  import { getGapBoxControlValueFromStyle } from '../hooks/gap';
18
19
  import { shouldSkipSerialization } from '../hooks/utils';
19
20
 
@@ -107,15 +108,15 @@ export default {
107
108
  toolBarControls: function DefaultLayoutToolbarControls() {
108
109
  return null;
109
110
  },
110
- save: function DefaultLayoutStyle( {
111
+ getLayoutStyle: function getLayoutStyle( {
111
112
  selector,
112
113
  layout = {},
113
114
  style,
114
115
  blockName,
116
+ hasBlockGapSupport,
117
+ layoutDefinitions,
115
118
  } ) {
116
119
  const { contentSize, wideSize } = layout;
117
- const blockGapSupport = useSetting( 'spacing.blockGap' );
118
- const hasBlockGapStylesSupport = blockGapSupport !== null;
119
120
  const blockGapStyleValue = getGapBoxControlValueFromStyle(
120
121
  style?.spacing?.blockGap
121
122
  );
@@ -125,14 +126,14 @@ export default {
125
126
  blockGapStyleValue?.top &&
126
127
  ! shouldSkipSerialization( blockName, 'spacing', 'blockGap' )
127
128
  ? blockGapStyleValue?.top
128
- : 'var( --wp--style--block-gap )';
129
+ : '';
129
130
 
130
131
  let output =
131
132
  !! contentSize || !! wideSize
132
133
  ? `
133
134
  ${ appendSelectors(
134
135
  selector,
135
- '> :where(:not(.alignleft):not(.alignright))'
136
+ '> :where(:not(.alignleft):not(.alignright):not(.alignfull))'
136
137
  ) } {
137
138
  max-width: ${ contentSize ?? wideSize };
138
139
  margin-left: auto !important;
@@ -147,37 +148,37 @@ export default {
147
148
  `
148
149
  : '';
149
150
 
150
- output += `
151
- ${ appendSelectors( selector, '> .alignleft' ) } {
152
- float: left;
153
- margin-inline-start: 0;
154
- margin-inline-end: 2em;
155
- }
156
- ${ appendSelectors( selector, '> .alignright' ) } {
157
- float: right;
158
- margin-inline-start: 2em;
159
- margin-inline-end: 0;
160
- }
161
-
162
- ${ appendSelectors( selector, '> .aligncenter' ) } {
163
- margin-left: auto !important;
164
- margin-right: auto !important;
165
- }
166
- `;
167
-
168
- if ( hasBlockGapStylesSupport ) {
169
- output += `
170
- ${ appendSelectors( selector, '> *' ) } {
171
- margin-block-start: 0;
172
- margin-block-end: 0;
173
- }
174
- ${ appendSelectors( selector, '> * + *' ) } {
175
- margin-block-start: ${ blockGapValue };
151
+ // If there is custom padding, add negative margins for alignfull blocks.
152
+ if ( style?.spacing?.padding ) {
153
+ // The style object might be storing a preset so we need to make sure we get a usable value.
154
+ const paddingValues = getCSSRules( style );
155
+ paddingValues.forEach( ( rule ) => {
156
+ if ( rule.key === 'paddingRight' ) {
157
+ output += `
158
+ ${ appendSelectors( selector, '> .alignfull' ) } {
159
+ margin-right: calc(${ rule.value } * -1);
160
+ }
161
+ `;
162
+ } else if ( rule.key === 'paddingLeft' ) {
163
+ output += `
164
+ ${ appendSelectors( selector, '> .alignfull' ) } {
165
+ margin-left: calc(${ rule.value } * -1);
166
+ }
167
+ `;
176
168
  }
177
- `;
169
+ } );
178
170
  }
179
171
 
180
- return <style>{ output }</style>;
172
+ // Output blockGap styles based on rules contained in layout definitions in theme.json.
173
+ if ( hasBlockGapSupport && blockGapValue ) {
174
+ output += getBlockGapCSS(
175
+ selector,
176
+ layoutDefinitions,
177
+ 'default',
178
+ blockGapValue
179
+ );
180
+ }
181
+ return output;
181
182
  },
182
183
  getOrientation() {
183
184
  return 'vertical';
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import flex from '../flex';
5
+
6
+ describe( 'getLayoutStyle', () => {
7
+ it( 'should return an empty string if no non-default params are provided', () => {
8
+ const expected = '';
9
+
10
+ const result = flex.getLayoutStyle( {
11
+ selector: '.my-container',
12
+ layout: {},
13
+ style: {},
14
+ blockName: 'test-block',
15
+ hasBlockGapSupport: false,
16
+ layoutDefinitions: undefined,
17
+ } );
18
+
19
+ expect( result ).toBe( expected );
20
+ } );
21
+ } );
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import flow from '../flow';
5
+
6
+ describe( 'getLayoutStyle', () => {
7
+ it( 'should return an empty string if no non-default params are provided', () => {
8
+ const expected = '';
9
+
10
+ const result = flow.getLayoutStyle( {
11
+ selector: '.my-container',
12
+ layout: {},
13
+ style: {},
14
+ blockName: 'test-block',
15
+ hasBlockGapSupport: false,
16
+ layoutDefinitions: undefined,
17
+ } );
18
+
19
+ expect( result ).toBe( expected );
20
+ } );
21
+ } );