@wordpress/block-editor 11.7.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +56 -57
  3. package/build/components/block-info-slot-fill/index.js +47 -0
  4. package/build/components/block-info-slot-fill/index.js.map +1 -0
  5. package/build/components/block-inspector/index.js +4 -2
  6. package/build/components/block-inspector/index.js.map +1 -1
  7. package/build/components/block-list/index.native.js +11 -21
  8. package/build/components/block-list/index.native.js.map +1 -1
  9. package/build/components/block-list/use-in-between-inserter.js +3 -1
  10. package/build/components/block-list/use-in-between-inserter.js.map +1 -1
  11. package/build/components/block-popover/inbetween.js +2 -9
  12. package/build/components/block-popover/inbetween.js.map +1 -1
  13. package/build/components/block-settings-menu/block-settings-dropdown.js +1 -10
  14. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  15. package/build/components/block-toolbar/index.js +2 -1
  16. package/build/components/block-toolbar/index.js.map +1 -1
  17. package/build/components/block-tools/block-contextual-toolbar.js +83 -9
  18. package/build/components/block-tools/block-contextual-toolbar.js.map +1 -1
  19. package/build/components/block-tools/selected-block-popover.js +11 -28
  20. package/build/components/block-tools/selected-block-popover.js.map +1 -1
  21. package/build/components/caption/index.native.js +0 -1
  22. package/build/components/caption/index.native.js.map +1 -1
  23. package/build/components/date-format-picker/index.js +1 -1
  24. package/build/components/date-format-picker/index.js.map +1 -1
  25. package/build/components/editor-styles/index.js +4 -3
  26. package/build/components/editor-styles/index.js.map +1 -1
  27. package/build/components/font-sizes/fluid-utils.js +21 -14
  28. package/build/components/font-sizes/fluid-utils.js.map +1 -1
  29. package/build/components/global-styles/border-panel.js +15 -59
  30. package/build/components/global-styles/border-panel.js.map +1 -1
  31. package/build/components/global-styles/color-panel.js +12 -12
  32. package/build/components/global-styles/color-panel.js.map +1 -1
  33. package/build/components/global-styles/color-panel.native.js +174 -0
  34. package/build/components/global-styles/color-panel.native.js.map +1 -0
  35. package/build/components/global-styles/dimensions-panel.js +21 -20
  36. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  37. package/build/components/global-styles/effects-panel.js +244 -0
  38. package/build/components/global-styles/effects-panel.js.map +1 -0
  39. package/build/components/global-styles/filters-panel.js +215 -0
  40. package/build/components/global-styles/filters-panel.js.map +1 -0
  41. package/build/components/global-styles/get-block-css-selector.js +1 -12
  42. package/build/components/global-styles/get-block-css-selector.js.map +1 -1
  43. package/build/components/global-styles/hooks.js +7 -0
  44. package/build/components/global-styles/hooks.js.map +1 -1
  45. package/build/components/global-styles/index.js +28 -0
  46. package/build/components/global-styles/index.js.map +1 -1
  47. package/build/components/global-styles/typography-panel.js +9 -9
  48. package/build/components/global-styles/typography-panel.js.map +1 -1
  49. package/build/components/global-styles/use-global-styles-output.js +100 -82
  50. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  51. package/build/components/iframe/index.js +1 -1
  52. package/build/components/iframe/index.js.map +1 -1
  53. package/build/components/image-size-control/use-dimension-handler.js +5 -3
  54. package/build/components/image-size-control/use-dimension-handler.js.map +1 -1
  55. package/build/components/index.js +23 -0
  56. package/build/components/index.js.map +1 -1
  57. package/build/components/inserter/block-patterns-tab.js +4 -2
  58. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  59. package/build/components/inserter/block-types-tab.js +12 -7
  60. package/build/components/inserter/block-types-tab.js.map +1 -1
  61. package/build/components/inserter/index.js +2 -1
  62. package/build/components/inserter/index.js.map +1 -1
  63. package/build/components/inspector-controls/groups.js +2 -0
  64. package/build/components/inspector-controls/groups.js.map +1 -1
  65. package/build/components/inspector-controls-tabs/styles-tab.js +2 -0
  66. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  67. package/build/components/inspector-controls-tabs/utils.js +5 -3
  68. package/build/components/inspector-controls-tabs/utils.js.map +1 -1
  69. package/build/components/list-view/block-select-button.js +7 -2
  70. package/build/components/list-view/block-select-button.js.map +1 -1
  71. package/build/components/list-view/block.js +13 -21
  72. package/build/components/list-view/block.js.map +1 -1
  73. package/build/components/list-view/drop-indicator.js +37 -10
  74. package/build/components/list-view/drop-indicator.js.map +1 -1
  75. package/build/components/list-view/index.js +31 -7
  76. package/build/components/list-view/index.js.map +1 -1
  77. package/build/components/list-view/leaf.js +2 -1
  78. package/build/components/list-view/leaf.js.map +1 -1
  79. package/build/components/list-view/use-block-selection.js +1 -1
  80. package/build/components/list-view/use-block-selection.js.map +1 -1
  81. package/build/components/list-view/use-list-view-client-ids.js +7 -3
  82. package/build/components/list-view/use-list-view-client-ids.js.map +1 -1
  83. package/build/components/list-view/use-list-view-drop-zone.js +8 -2
  84. package/build/components/list-view/use-list-view-drop-zone.js.map +1 -1
  85. package/build/components/media-replace-flow/index.js +5 -5
  86. package/build/components/media-replace-flow/index.js.map +1 -1
  87. package/build/components/navigable-toolbar/index.js +12 -4
  88. package/build/components/navigable-toolbar/index.js.map +1 -1
  89. package/build/components/off-canvas-editor/appender.js +2 -7
  90. package/build/components/off-canvas-editor/appender.js.map +1 -1
  91. package/build/components/off-canvas-editor/block-contents.js +6 -1
  92. package/build/components/off-canvas-editor/block-contents.js.map +1 -1
  93. package/build/components/off-canvas-editor/index.js +17 -14
  94. package/build/components/off-canvas-editor/index.js.map +1 -1
  95. package/build/components/resizable-box-popover/index.js +38 -0
  96. package/build/components/resizable-box-popover/index.js.map +1 -0
  97. package/build/components/rich-text/index.js +0 -1
  98. package/build/components/rich-text/index.js.map +1 -1
  99. package/build/components/rich-text/index.native.js +7 -11
  100. package/build/components/rich-text/index.native.js.map +1 -1
  101. package/build/components/spacing-sizes-control/spacing-input-control.js +8 -0
  102. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  103. package/build/hooks/anchor.js +1 -1
  104. package/build/hooks/anchor.js.map +1 -1
  105. package/build/hooks/border.js +1 -1
  106. package/build/hooks/border.js.map +1 -1
  107. package/build/hooks/duotone.js +121 -70
  108. package/build/hooks/duotone.js.map +1 -1
  109. package/build/hooks/margin.js +27 -17
  110. package/build/hooks/margin.js.map +1 -1
  111. package/build/hooks/padding.js +19 -9
  112. package/build/hooks/padding.js.map +1 -1
  113. package/build/hooks/utils.js +22 -7
  114. package/build/hooks/utils.js.map +1 -1
  115. package/build/layouts/utils.js +3 -2
  116. package/build/layouts/utils.js.map +1 -1
  117. package/build/private-apis.js +13 -1
  118. package/build/private-apis.js.map +1 -1
  119. package/build/store/actions.js +8 -1
  120. package/build/store/actions.js.map +1 -1
  121. package/build/utils/object.js +6 -6
  122. package/build/utils/object.js.map +1 -1
  123. package/build/utils/transform-styles/index.js +2 -2
  124. package/build/utils/transform-styles/index.js.map +1 -1
  125. package/build/utils/use-should-contextual-toolbar-show.js +68 -0
  126. package/build/utils/use-should-contextual-toolbar-show.js.map +1 -0
  127. package/build-module/components/block-info-slot-fill/index.js +34 -0
  128. package/build-module/components/block-info-slot-fill/index.js.map +1 -0
  129. package/build-module/components/block-inspector/index.js +3 -2
  130. package/build-module/components/block-inspector/index.js.map +1 -1
  131. package/build-module/components/block-list/index.native.js +11 -19
  132. package/build-module/components/block-list/index.native.js.map +1 -1
  133. package/build-module/components/block-list/use-in-between-inserter.js +2 -1
  134. package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
  135. package/build-module/components/block-popover/inbetween.js +2 -9
  136. package/build-module/components/block-popover/inbetween.js.map +1 -1
  137. package/build-module/components/block-settings-menu/block-settings-dropdown.js +1 -9
  138. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  139. package/build-module/components/block-toolbar/index.js +2 -1
  140. package/build-module/components/block-toolbar/index.js.map +1 -1
  141. package/build-module/components/block-tools/block-contextual-toolbar.js +79 -9
  142. package/build-module/components/block-tools/block-contextual-toolbar.js.map +1 -1
  143. package/build-module/components/block-tools/selected-block-popover.js +10 -27
  144. package/build-module/components/block-tools/selected-block-popover.js.map +1 -1
  145. package/build-module/components/caption/index.native.js +0 -1
  146. package/build-module/components/caption/index.native.js.map +1 -1
  147. package/build-module/components/date-format-picker/index.js +1 -1
  148. package/build-module/components/date-format-picker/index.js.map +1 -1
  149. package/build-module/components/editor-styles/index.js +4 -3
  150. package/build-module/components/editor-styles/index.js.map +1 -1
  151. package/build-module/components/font-sizes/fluid-utils.js +21 -14
  152. package/build-module/components/font-sizes/fluid-utils.js.map +1 -1
  153. package/build-module/components/global-styles/border-panel.js +15 -59
  154. package/build-module/components/global-styles/border-panel.js.map +1 -1
  155. package/build-module/components/global-styles/color-panel.js +13 -13
  156. package/build-module/components/global-styles/color-panel.js.map +1 -1
  157. package/build-module/components/global-styles/color-panel.native.js +150 -0
  158. package/build-module/components/global-styles/color-panel.native.js.map +1 -0
  159. package/build-module/components/global-styles/dimensions-panel.js +22 -21
  160. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  161. package/build-module/components/global-styles/effects-panel.js +228 -0
  162. package/build-module/components/global-styles/effects-panel.js.map +1 -0
  163. package/build-module/components/global-styles/filters-panel.js +201 -0
  164. package/build-module/components/global-styles/filters-panel.js.map +1 -0
  165. package/build-module/components/global-styles/get-block-css-selector.js +1 -12
  166. package/build-module/components/global-styles/get-block-css-selector.js.map +1 -1
  167. package/build-module/components/global-styles/hooks.js +7 -0
  168. package/build-module/components/global-styles/hooks.js.map +1 -1
  169. package/build-module/components/global-styles/index.js +2 -0
  170. package/build-module/components/global-styles/index.js.map +1 -1
  171. package/build-module/components/global-styles/typography-panel.js +10 -10
  172. package/build-module/components/global-styles/typography-panel.js.map +1 -1
  173. package/build-module/components/global-styles/use-global-styles-output.js +101 -83
  174. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  175. package/build-module/components/iframe/index.js +1 -1
  176. package/build-module/components/iframe/index.js.map +1 -1
  177. package/build-module/components/image-size-control/use-dimension-handler.js +5 -3
  178. package/build-module/components/image-size-control/use-dimension-handler.js.map +1 -1
  179. package/build-module/components/index.js +1 -0
  180. package/build-module/components/index.js.map +1 -1
  181. package/build-module/components/inserter/block-patterns-tab.js +5 -2
  182. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  183. package/build-module/components/inserter/block-types-tab.js +12 -6
  184. package/build-module/components/inserter/block-types-tab.js.map +1 -1
  185. package/build-module/components/inserter/index.js +2 -1
  186. package/build-module/components/inserter/index.js.map +1 -1
  187. package/build-module/components/inspector-controls/groups.js +2 -0
  188. package/build-module/components/inspector-controls/groups.js.map +1 -1
  189. package/build-module/components/inspector-controls-tabs/styles-tab.js +2 -0
  190. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  191. package/build-module/components/inspector-controls-tabs/utils.js +4 -3
  192. package/build-module/components/inspector-controls-tabs/utils.js.map +1 -1
  193. package/build-module/components/list-view/block-select-button.js +7 -2
  194. package/build-module/components/list-view/block-select-button.js.map +1 -1
  195. package/build-module/components/list-view/block.js +15 -22
  196. package/build-module/components/list-view/block.js.map +1 -1
  197. package/build-module/components/list-view/drop-indicator.js +36 -10
  198. package/build-module/components/list-view/drop-indicator.js.map +1 -1
  199. package/build-module/components/list-view/index.js +31 -8
  200. package/build-module/components/list-view/index.js.map +1 -1
  201. package/build-module/components/list-view/leaf.js +2 -1
  202. package/build-module/components/list-view/leaf.js.map +1 -1
  203. package/build-module/components/list-view/use-block-selection.js +1 -1
  204. package/build-module/components/list-view/use-block-selection.js.map +1 -1
  205. package/build-module/components/list-view/use-list-view-client-ids.js +7 -3
  206. package/build-module/components/list-view/use-list-view-client-ids.js.map +1 -1
  207. package/build-module/components/list-view/use-list-view-drop-zone.js +8 -4
  208. package/build-module/components/list-view/use-list-view-drop-zone.js.map +1 -1
  209. package/build-module/components/media-replace-flow/index.js +5 -5
  210. package/build-module/components/media-replace-flow/index.js.map +1 -1
  211. package/build-module/components/navigable-toolbar/index.js +12 -4
  212. package/build-module/components/navigable-toolbar/index.js.map +1 -1
  213. package/build-module/components/off-canvas-editor/appender.js +1 -5
  214. package/build-module/components/off-canvas-editor/appender.js.map +1 -1
  215. package/build-module/components/off-canvas-editor/block-contents.js +5 -1
  216. package/build-module/components/off-canvas-editor/block-contents.js.map +1 -1
  217. package/build-module/components/off-canvas-editor/index.js +17 -14
  218. package/build-module/components/off-canvas-editor/index.js.map +1 -1
  219. package/build-module/components/resizable-box-popover/index.js +26 -0
  220. package/build-module/components/resizable-box-popover/index.js.map +1 -0
  221. package/build-module/components/rich-text/index.js +0 -1
  222. package/build-module/components/rich-text/index.js.map +1 -1
  223. package/build-module/components/rich-text/index.native.js +7 -10
  224. package/build-module/components/rich-text/index.native.js.map +1 -1
  225. package/build-module/components/spacing-sizes-control/spacing-input-control.js +7 -0
  226. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  227. package/build-module/hooks/anchor.js +1 -1
  228. package/build-module/hooks/anchor.js.map +1 -1
  229. package/build-module/hooks/border.js +1 -1
  230. package/build-module/hooks/border.js.map +1 -1
  231. package/build-module/hooks/duotone.js +118 -71
  232. package/build-module/hooks/duotone.js.map +1 -1
  233. package/build-module/hooks/margin.js +29 -18
  234. package/build-module/hooks/margin.js.map +1 -1
  235. package/build-module/hooks/padding.js +21 -10
  236. package/build-module/hooks/padding.js.map +1 -1
  237. package/build-module/hooks/utils.js +24 -9
  238. package/build-module/hooks/utils.js.map +1 -1
  239. package/build-module/layouts/utils.js +3 -2
  240. package/build-module/layouts/utils.js.map +1 -1
  241. package/build-module/private-apis.js +9 -1
  242. package/build-module/private-apis.js.map +1 -1
  243. package/build-module/store/actions.js +8 -1
  244. package/build-module/store/actions.js.map +1 -1
  245. package/build-module/utils/object.js +5 -5
  246. package/build-module/utils/object.js.map +1 -1
  247. package/build-module/utils/transform-styles/index.js +2 -2
  248. package/build-module/utils/transform-styles/index.js.map +1 -1
  249. package/build-module/utils/use-should-contextual-toolbar-show.js +56 -0
  250. package/build-module/utils/use-should-contextual-toolbar-show.js.map +1 -0
  251. package/build-style/content-rtl.css +9 -6
  252. package/build-style/content.css +9 -6
  253. package/build-style/style-rtl.css +272 -54
  254. package/build-style/style.css +272 -54
  255. package/package.json +32 -32
  256. package/src/components/block-info-slot-fill/index.js +24 -0
  257. package/src/components/block-inspector/index.js +3 -0
  258. package/src/components/block-inspector/style.scss +6 -4
  259. package/src/components/block-list/content.scss +16 -15
  260. package/src/components/block-list/index.native.js +19 -38
  261. package/src/components/block-list/use-in-between-inserter.js +4 -1
  262. package/src/components/block-mobile-toolbar/test/block-actions-menu.native.js +9 -9
  263. package/src/components/block-mover/style.scss +10 -4
  264. package/src/components/block-mover/test/index.native.js +4 -4
  265. package/src/components/block-popover/inbetween.js +2 -13
  266. package/src/components/block-settings-menu/block-settings-dropdown.js +2 -12
  267. package/src/components/block-toolbar/index.js +4 -3
  268. package/src/components/block-toolbar/style.scss +56 -33
  269. package/src/components/block-tools/block-contextual-toolbar.js +94 -11
  270. package/src/components/block-tools/selected-block-popover.js +11 -44
  271. package/src/components/block-tools/style.scss +157 -3
  272. package/src/components/caption/index.native.js +0 -1
  273. package/src/components/date-format-picker/index.js +1 -1
  274. package/src/components/editor-styles/index.js +9 -5
  275. package/src/components/font-sizes/fluid-utils.js +31 -14
  276. package/src/components/font-sizes/test/fluid-utils.js +5 -16
  277. package/src/components/global-styles/README.md +129 -16
  278. package/src/components/global-styles/border-panel.js +13 -61
  279. package/src/components/global-styles/color-panel.js +13 -13
  280. package/src/components/global-styles/color-panel.native.js +207 -0
  281. package/src/components/global-styles/dimensions-panel.js +47 -20
  282. package/src/components/global-styles/effects-panel.js +228 -0
  283. package/src/components/global-styles/filters-panel.js +230 -0
  284. package/src/components/global-styles/get-block-css-selector.js +0 -11
  285. package/src/components/global-styles/hooks.js +10 -0
  286. package/src/components/global-styles/index.js +2 -0
  287. package/src/components/global-styles/style.scss +43 -0
  288. package/src/components/global-styles/test/typography-utils.js +63 -22
  289. package/src/components/global-styles/test/use-global-styles-output.js +130 -8
  290. package/src/components/global-styles/typography-panel.js +37 -11
  291. package/src/components/global-styles/use-global-styles-output.js +88 -72
  292. package/src/components/iframe/index.js +1 -1
  293. package/src/components/image-size-control/use-dimension-handler.js +4 -3
  294. package/src/components/index.js +5 -1
  295. package/src/components/inserter/block-patterns-tab.js +3 -1
  296. package/src/components/inserter/block-types-tab.js +9 -6
  297. package/src/components/inserter/index.js +1 -1
  298. package/src/components/inspector-controls/groups.js +2 -0
  299. package/src/components/inspector-controls-tabs/styles-tab.js +1 -0
  300. package/src/components/inspector-controls-tabs/utils.js +4 -3
  301. package/src/components/list-view/README.md +2 -0
  302. package/src/components/list-view/block-select-button.js +6 -1
  303. package/src/components/list-view/block.js +24 -31
  304. package/src/components/list-view/drop-indicator.js +67 -22
  305. package/src/components/list-view/index.js +26 -3
  306. package/src/components/list-view/leaf.js +1 -0
  307. package/src/components/list-view/style.scss +18 -4
  308. package/src/components/list-view/test/use-list-view-drop-zone.js +188 -0
  309. package/src/components/list-view/use-block-selection.js +1 -1
  310. package/src/components/list-view/use-list-view-client-ids.js +5 -3
  311. package/src/components/list-view/use-list-view-drop-zone.js +9 -3
  312. package/src/components/media-replace-flow/README.md +3 -2
  313. package/src/components/media-replace-flow/index.js +4 -5
  314. package/src/components/navigable-toolbar/index.js +12 -3
  315. package/src/components/off-canvas-editor/appender.js +1 -4
  316. package/src/components/off-canvas-editor/block-contents.js +4 -0
  317. package/src/components/off-canvas-editor/index.js +15 -11
  318. package/src/components/resizable-box-popover/index.js +27 -0
  319. package/src/components/rich-text/index.js +0 -1
  320. package/src/components/rich-text/index.native.js +2 -5
  321. package/src/components/spacing-sizes-control/spacing-input-control.js +10 -0
  322. package/src/components/spacing-sizes-control/style.scss +7 -7
  323. package/src/components/url-popover/test/__snapshots__/index.js.snap +3 -3
  324. package/src/hooks/anchor.js +1 -1
  325. package/src/hooks/border.js +1 -1
  326. package/src/hooks/duotone.js +162 -99
  327. package/src/hooks/margin.js +31 -26
  328. package/src/hooks/padding.js +24 -18
  329. package/src/hooks/test/anchor.js +113 -0
  330. package/src/hooks/test/color.js +0 -9
  331. package/src/hooks/test/use-typography-props.js +2 -2
  332. package/src/hooks/test/utils.js +20 -101
  333. package/src/hooks/utils.js +23 -6
  334. package/src/layouts/utils.js +2 -2
  335. package/src/private-apis.js +8 -0
  336. package/src/store/actions.js +8 -1
  337. package/src/style.scss +1 -0
  338. package/src/utils/object.js +5 -5
  339. package/src/utils/test/object.js +53 -15
  340. package/src/utils/transform-styles/index.js +2 -2
  341. package/src/utils/use-should-contextual-toolbar-show.js +75 -0
  342. package/tsconfig.json +1 -0
  343. package/build/components/rich-text/use-native-props.js +0 -11
  344. package/build/components/rich-text/use-native-props.js.map +0 -1
  345. package/build/components/rich-text/use-native-props.native.js +0 -24
  346. package/build/components/rich-text/use-native-props.native.js.map +0 -1
  347. package/build/hooks/color-panel.native.js +0 -77
  348. package/build/hooks/color-panel.native.js.map +0 -1
  349. package/build-module/components/rich-text/use-native-props.js +0 -4
  350. package/build-module/components/rich-text/use-native-props.js.map +0 -1
  351. package/build-module/components/rich-text/use-native-props.native.js +0 -15
  352. package/build-module/components/rich-text/use-native-props.native.js.map +0 -1
  353. package/build-module/hooks/color-panel.native.js +0 -62
  354. package/build-module/hooks/color-panel.native.js.map +0 -1
  355. package/src/components/rich-text/use-native-props.js +0 -3
  356. package/src/components/rich-text/use-native-props.native.js +0 -17
  357. package/src/hooks/color-panel.native.js +0 -63
@@ -54,17 +54,18 @@ export const BLOCK_LIST_ITEM_HEIGHT = 36;
54
54
  /**
55
55
  * Show a hierarchical list of blocks.
56
56
  *
57
- * @param {Object} props Components props.
58
- * @param {string} props.id An HTML element id for the root element of ListView.
59
- * @param {string} props.parentClientId The client id of the parent block.
60
- * @param {Array} props.blocks Custom subset of block client IDs to be used instead of the default hierarchy.
61
- * @param {boolean} props.showBlockMovers Flag to enable block movers
62
- * @param {boolean} props.isExpanded Flag to determine whether nested levels are expanded by default.
63
- * @param {Object} props.LeafMoreMenu Optional more menu substitution.
64
- * @param {string} props.description Optional accessible description for the tree grid component.
65
- * @param {string} props.onSelect Optional callback to be invoked when a block is selected.
66
- * @param {string} props.showAppender Flag to show or hide the block appender.
67
- * @param {Object} ref Forwarded ref
57
+ * @param {Object} props Components props.
58
+ * @param {string} props.id An HTML element id for the root element of ListView.
59
+ * @param {string} props.parentClientId The client id of the parent block.
60
+ * @param {Array} props.blocks Custom subset of block client IDs to be used instead of the default hierarchy.
61
+ * @param {boolean} props.showBlockMovers Flag to enable block movers
62
+ * @param {boolean} props.isExpanded Flag to determine whether nested levels are expanded by default.
63
+ * @param {Object} props.LeafMoreMenu Optional more menu substitution.
64
+ * @param {string} props.description Optional accessible description for the tree grid component.
65
+ * @param {string} props.onSelect Optional callback to be invoked when a block is selected.
66
+ * @param {string} props.showAppender Flag to show or hide the block appender.
67
+ * @param {Function} props.renderAdditionalBlockUI Function that renders additional block content UI.
68
+ * @param {Object} ref Forwarded ref.
68
69
  */
69
70
  function OffCanvasEditor(
70
71
  {
@@ -77,6 +78,7 @@ function OffCanvasEditor(
77
78
  LeafMoreMenu,
78
79
  description = __( 'Block navigation structure' ),
79
80
  onSelect,
81
+ renderAdditionalBlockUI,
80
82
  },
81
83
  ref
82
84
  ) {
@@ -200,6 +202,7 @@ function OffCanvasEditor(
200
202
  expand,
201
203
  collapse,
202
204
  LeafMoreMenu,
205
+ renderAdditionalBlockUI,
203
206
  } ),
204
207
  [
205
208
  isMounted.current,
@@ -208,6 +211,7 @@ function OffCanvasEditor(
208
211
  expand,
209
212
  collapse,
210
213
  LeafMoreMenu,
214
+ renderAdditionalBlockUI,
211
215
  ]
212
216
  );
213
217
 
@@ -0,0 +1,27 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { ResizableBox } from '@wordpress/components';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import BlockPopover from '../block-popover';
10
+
11
+ export default function ResizableBoxPopover( {
12
+ clientId,
13
+ resizableBoxProps,
14
+ ...props
15
+ } ) {
16
+ return (
17
+ <BlockPopover
18
+ clientId={ clientId }
19
+ __unstableCoverTarget
20
+ __unstablePopoverSlot="block-toolbar"
21
+ shift={ false }
22
+ { ...props }
23
+ >
24
+ <ResizableBox { ...resizableBoxProps } />
25
+ </BlockPopover>
26
+ );
27
+ }
@@ -66,7 +66,6 @@ function removeNativeProps( props ) {
66
66
  textAlign,
67
67
  selectionColor,
68
68
  tagsToEliminate,
69
- rootTagsToEliminate,
70
69
  disableEditingMenu,
71
70
  fontSize,
72
71
  fontFamily,
@@ -46,7 +46,6 @@ import { useBlockEditContext } from '../block-edit';
46
46
  import { RemoveBrowserShortcuts } from './remove-browser-shortcuts';
47
47
  import { filePasteHandler } from './file-paste-handler';
48
48
  import FormatToolbarContainer from './format-toolbar-container';
49
- import { useNativeProps } from './use-native-props';
50
49
  import { store as blockEditorStore } from '../../store';
51
50
  import {
52
51
  addActiveFormats,
@@ -97,7 +96,6 @@ function RichTextWrapper(
97
96
  textAlign,
98
97
  selectionColor,
99
98
  tagsToEliminate,
100
- rootTagsToEliminate,
101
99
  disableEditingMenu,
102
100
  fontSize,
103
101
  fontFamily,
@@ -121,7 +119,6 @@ function RichTextWrapper(
121
119
 
122
120
  const fallbackRef = useRef();
123
121
  const { clientId, isSelected: blockIsSelected } = useBlockEditContext();
124
- const nativeProps = useNativeProps();
125
122
  const embedHandlerPickerRef = useRef();
126
123
  const selector = ( select ) => {
127
124
  const {
@@ -220,6 +217,7 @@ function RichTextWrapper(
220
217
  selectionChangeEnd
221
218
  );
222
219
  },
220
+ // eslint-disable-next-line react-hooks/exhaustive-deps
223
221
  [ clientId, identifier ]
224
222
  );
225
223
 
@@ -373,6 +371,7 @@ function RichTextWrapper(
373
371
  }
374
372
  }
375
373
  },
374
+ // eslint-disable-next-line react-hooks/exhaustive-deps
376
375
  [
377
376
  onReplace,
378
377
  onSplit,
@@ -615,7 +614,6 @@ function RichTextWrapper(
615
614
  }
616
615
  __unstableMultilineRootTag={ __unstableMultilineRootTag }
617
616
  // Native props.
618
- { ...nativeProps }
619
617
  blockIsSelected={
620
618
  originalIsSelected !== undefined
621
619
  ? originalIsSelected
@@ -628,7 +626,6 @@ function RichTextWrapper(
628
626
  textAlign={ textAlign }
629
627
  selectionColor={ selectionColor }
630
628
  tagsToEliminate={ tagsToEliminate }
631
- rootTagsToEliminate={ rootTagsToEliminate }
632
629
  disableEditingMenu={ disableEditingMenu }
633
630
  fontSize={ fontSize }
634
631
  fontFamily={ fontFamily }
@@ -20,6 +20,7 @@ import {
20
20
  } from '@wordpress/components';
21
21
  import { __, sprintf } from '@wordpress/i18n';
22
22
  import { settings } from '@wordpress/icons';
23
+ import { usePrevious } from '@wordpress/compose';
23
24
 
24
25
  /**
25
26
  * Internal dependencies
@@ -71,6 +72,15 @@ export default function SpacingInputControl( {
71
72
  ! isValueSpacingPreset( value )
72
73
  );
73
74
 
75
+ const previousValue = usePrevious( value );
76
+ if (
77
+ previousValue !== value &&
78
+ ! isValueSpacingPreset( value ) &&
79
+ showCustomValueControl !== true
80
+ ) {
81
+ setShowCustomValueControl( true );
82
+ }
83
+
74
84
  const units = useCustomUnits( {
75
85
  availableUnits: useSetting( 'spacing.units' ) || [ 'px', 'em', 'rem' ],
76
86
  } );
@@ -2,7 +2,7 @@
2
2
  display: grid;
3
3
  grid-template-columns: auto 1fr auto;
4
4
  align-items: center;
5
- grid-template-rows: 16px auto;
5
+ grid-template-rows: $grid-unit-30 auto;
6
6
  }
7
7
 
8
8
  .component-spacing-sizes-control {
@@ -19,7 +19,7 @@
19
19
  }
20
20
 
21
21
  .components-base-control__label {
22
- margin-bottom: 0;
22
+ margin-bottom: $grid-unit-10;
23
23
  height: $grid-unit-20;
24
24
  }
25
25
 
@@ -55,6 +55,7 @@
55
55
  grid-row: 1 / 1;
56
56
  align-self: center;
57
57
  margin-left: $grid-unit-05;
58
+ margin-bottom: $grid-unit-10;
58
59
  }
59
60
 
60
61
  .components-spacing-sizes-control__custom-toggle-all {
@@ -85,20 +86,20 @@
85
86
  .components-spacing-sizes-control__custom-value-range {
86
87
  grid-column: span 2;
87
88
  margin-left: $grid-unit-20;
88
- margin-top: 8px;
89
89
  }
90
90
 
91
- .components-spacing-sizes-control__custom-value-input {
91
+ .components-base-control.components-spacing-sizes-control__custom-value-input {
92
92
  width: 124px;
93
- margin-top: 8px;
94
93
  grid-column: 1;
94
+ margin-bottom: 0;
95
95
  }
96
96
 
97
- .components-range-control {
97
+ .components-base-control.components-range-control {
98
98
  height: 40px;
99
99
  /* Vertically center the RangeControl until it has true 40px height. */
100
100
  display: flex;
101
101
  align-items: center;
102
+ margin-bottom: 0;
102
103
 
103
104
  > .components-base-control__field {
104
105
  /* Fixes RangeControl contents when the outer wrapper is flex */
@@ -108,7 +109,6 @@
108
109
 
109
110
  .components-spacing-sizes-control__range-control {
110
111
  grid-column: span 3;
111
- margin-top: 8px;
112
112
  }
113
113
 
114
114
  .components-range-control__mark {
@@ -5,7 +5,7 @@ exports[`URLPopover matches the snapshot in its default state 1`] = `
5
5
  <span>
6
6
  <div
7
7
  class="components-popover block-editor-url-popover is-positioned"
8
- style="position: absolute; top: 0px; left: 0px; transform: none;"
8
+ style="position: absolute; top: 0px; left: 0px; transform: translateZ(0);"
9
9
  tabindex="-1"
10
10
  >
11
11
  <div
@@ -53,7 +53,7 @@ exports[`URLPopover matches the snapshot when the settings are toggled open 1`]
53
53
  <span>
54
54
  <div
55
55
  class="components-popover block-editor-url-popover is-positioned"
56
- style="position: absolute; top: 0px; left: 0px; transform: none;"
56
+ style="position: absolute; top: 0px; left: 0px; transform: translateZ(0);"
57
57
  tabindex="-1"
58
58
  >
59
59
  <div
@@ -108,7 +108,7 @@ exports[`URLPopover matches the snapshot when there are no settings 1`] = `
108
108
  <span>
109
109
  <div
110
110
  class="components-popover block-editor-url-popover is-positioned"
111
- style="position: absolute; top: 0px; left: 0px; transform: none;"
111
+ style="position: absolute; top: 0px; left: 0px; transform: translateZ(0);"
112
112
  tabindex="-1"
113
113
  >
114
114
  <div
@@ -80,7 +80,7 @@ export const withInspectorControl = createHigherOrderComponent(
80
80
  { isWeb && (
81
81
  <ExternalLink
82
82
  href={ __(
83
- 'https://wordpress.org/support/article/page-jumps/'
83
+ 'https://wordpress.org/documentation/article/page-jumps/'
84
84
  ) }
85
85
  >
86
86
  { __( 'Learn more about anchors' ) }
@@ -84,7 +84,7 @@ function styleToAttributes( style ) {
84
84
 
85
85
  const borderColorValue = style?.border?.color;
86
86
  const borderColorSlug = borderColorValue?.startsWith( 'var:preset|color|' )
87
- ? borderColorSlug.substring( 'var:preset|color|'.length )
87
+ ? borderColorValue.substring( 'var:preset|color|'.length )
88
88
  : undefined;
89
89
  const updatedStyle = { ...style };
90
90
  updatedStyle.border = {
@@ -23,6 +23,7 @@ import { useSelect } from '@wordpress/data';
23
23
  */
24
24
  import {
25
25
  BlockControls,
26
+ InspectorControls,
26
27
  __experimentalDuotoneControl as DuotoneControl,
27
28
  useSetting,
28
29
  } from '../components';
@@ -32,7 +33,11 @@ import {
32
33
  __unstableDuotoneStylesheet as DuotoneStylesheet,
33
34
  __unstableDuotoneUnsetStylesheet as DuotoneUnsetStylesheet,
34
35
  } from '../components/duotone';
36
+ import { getBlockCSSSelector } from '../components/global-styles/get-block-css-selector';
37
+ import { scopeSelector } from '../components/global-styles/utils';
38
+ import { useBlockSettings } from './utils';
35
39
  import { store as blockEditorStore } from '../store';
40
+ import { default as StylesFiltersPanel } from '../components/global-styles/filters-panel';
36
41
 
37
42
  const EMPTY_ARRAY = [];
38
43
 
@@ -104,9 +109,10 @@ export function getDuotonePresetFromColors( colors, duotonePalette ) {
104
109
  return preset ? `var:preset|duotone|${ preset.slug }` : undefined;
105
110
  }
106
111
 
107
- function DuotonePanel( { attributes, setAttributes } ) {
112
+ function DuotonePanel( { attributes, setAttributes, name } ) {
108
113
  const style = attributes?.style;
109
114
  const duotoneStyle = style?.color?.duotone;
115
+ const settings = useBlockSettings( name );
110
116
 
111
117
  const duotonePalette = useMultiOriginPresets( {
112
118
  presetSetting: 'color.duotone',
@@ -130,30 +136,47 @@ function DuotonePanel( { attributes, setAttributes } ) {
130
136
  : duotoneStyle;
131
137
 
132
138
  return (
133
- <BlockControls group="block" __experimentalShareWithChildBlocks>
134
- <DuotoneControl
135
- duotonePalette={ duotonePalette }
136
- colorPalette={ colorPalette }
137
- disableCustomDuotone={ disableCustomDuotone }
138
- disableCustomColors={ disableCustomColors }
139
- value={ duotonePresetOrColors }
140
- onChange={ ( newDuotone ) => {
141
- const maybePreset = getDuotonePresetFromColors(
142
- newDuotone,
143
- duotonePalette
144
- );
145
-
146
- const newStyle = {
147
- ...style,
148
- color: {
149
- ...style?.color,
150
- duotone: maybePreset ?? newDuotone, // use preset or fallback to custom colors.
151
- },
152
- };
153
- setAttributes( { style: newStyle } );
154
- } }
155
- />
156
- </BlockControls>
139
+ <>
140
+ <InspectorControls group="filter">
141
+ <StylesFiltersPanel
142
+ value={ { filter: { duotone: duotonePresetOrColors } } }
143
+ onChange={ ( newDuotone ) => {
144
+ const newStyle = {
145
+ color: {
146
+ ...newDuotone?.filter,
147
+ },
148
+ };
149
+ setAttributes( { style: newStyle } );
150
+ } }
151
+ settings={ settings }
152
+ />
153
+ </InspectorControls>
154
+ <BlockControls group="block" __experimentalShareWithChildBlocks>
155
+ <DuotoneControl
156
+ duotonePalette={ duotonePalette }
157
+ colorPalette={ colorPalette }
158
+ disableCustomDuotone={ disableCustomDuotone }
159
+ disableCustomColors={ disableCustomColors }
160
+ value={ duotonePresetOrColors }
161
+ onChange={ ( newDuotone ) => {
162
+ const maybePreset = getDuotonePresetFromColors(
163
+ newDuotone,
164
+ duotonePalette
165
+ );
166
+
167
+ const newStyle = {
168
+ ...style,
169
+ color: {
170
+ ...style?.color,
171
+ duotone: maybePreset ?? newDuotone, // use preset or fallback to custom colors.
172
+ },
173
+ };
174
+ setAttributes( { style: newStyle } );
175
+ } }
176
+ settings={ settings }
177
+ />
178
+ </BlockControls>
179
+ </>
157
180
  );
158
181
  }
159
182
 
@@ -166,7 +189,9 @@ function DuotonePanel( { attributes, setAttributes } ) {
166
189
  * @return {Object} Filtered block settings.
167
190
  */
168
191
  function addDuotoneAttributes( settings ) {
169
- if ( ! hasBlockSupport( settings, 'color.__experimentalDuotone' ) ) {
192
+ // Previous `color.__experimentalDuotone` support flag is migrated via
193
+ // block_type_metadata_settings filter in `lib/block-supports/duotone.php`.
194
+ if ( ! hasBlockSupport( settings, 'filter.duotone' ) ) {
170
195
  return settings;
171
196
  }
172
197
 
@@ -193,10 +218,13 @@ function addDuotoneAttributes( settings ) {
193
218
  */
194
219
  const withDuotoneControls = createHigherOrderComponent(
195
220
  ( BlockEdit ) => ( props ) => {
221
+ // Previous `color.__experimentalDuotone` support flag is migrated via
222
+ // block_type_metadata_settings filter in `lib/block-supports/duotone.php`.
196
223
  const hasDuotoneSupport = hasBlockSupport(
197
224
  props.name,
198
- 'color.__experimentalDuotone'
225
+ 'filter.duotone'
199
226
  );
227
+
200
228
  const isContentLocked = useSelect(
201
229
  ( select ) => {
202
230
  return select(
@@ -222,76 +250,71 @@ const withDuotoneControls = createHigherOrderComponent(
222
250
  'withDuotoneControls'
223
251
  );
224
252
 
225
- /**
226
- * Function that scopes a selector with another one. This works a bit like
227
- * SCSS nesting except the `&` operator isn't supported.
228
- *
229
- * @example
230
- * ```js
231
- * const scope = '.a, .b .c';
232
- * const selector = '> .x, .y';
233
- * const merged = scopeSelector( scope, selector );
234
- * // merged is '.a > .x, .a .y, .b .c > .x, .b .c .y'
235
- * ```
236
- *
237
- * @param {string} scope Selector to scope to.
238
- * @param {string} selector Original selector.
239
- *
240
- * @return {string} Scoped selector.
241
- */
242
- function scopeSelector( scope, selector ) {
243
- const scopes = scope.split( ',' );
244
- const selectors = selector.split( ',' );
245
-
246
- const selectorsScoped = [];
247
- scopes.forEach( ( outer ) => {
248
- selectors.forEach( ( inner ) => {
249
- selectorsScoped.push( `${ outer.trim() } ${ inner.trim() }` );
250
- } );
251
- } );
252
-
253
- return selectorsScoped.join( ', ' );
254
- }
253
+ function DuotoneStyles( {
254
+ id: filterId,
255
+ selector: duotoneSelector,
256
+ attribute: duotoneAttr,
257
+ } ) {
258
+ const element = useContext( BlockList.__unstableElementContext );
255
259
 
256
- function BlockDuotoneStyles( { name, duotoneStyle, id } ) {
257
260
  const duotonePalette = useMultiOriginPresets( {
258
261
  presetSetting: 'color.duotone',
259
262
  defaultSetting: 'color.defaultDuotone',
260
263
  } );
261
264
 
262
- const element = useContext( BlockList.__unstableElementContext );
263
-
264
- // Portals cannot exist without a container.
265
- // Guard against empty Duotone styles.
266
- if ( ! element || ! duotoneStyle ) {
267
- return null;
265
+ // Possible values for duotone attribute:
266
+ // 1. Array of colors - e.g. ['#000000', '#ffffff'].
267
+ // 2. Variable for an existing Duotone preset - e.g. 'var:preset|duotone|green-blue' or 'var(--wp--preset--duotone--green-blue)''
268
+ // 3. A CSS string - e.g. 'unset' to remove globally applied duotone.
269
+ const isCustom = Array.isArray( duotoneAttr );
270
+ const duotonePreset = isCustom
271
+ ? undefined
272
+ : getColorsFromDuotonePreset( duotoneAttr, duotonePalette );
273
+ const isPreset = typeof duotoneAttr === 'string' && duotonePreset;
274
+ const isCSS = typeof duotoneAttr === 'string' && ! isPreset;
275
+
276
+ // Match the structure of WP_Duotone_Gutenberg::render_duotone_support() in PHP.
277
+ let colors = null;
278
+ if ( isPreset ) {
279
+ // Array of colors.
280
+ colors = duotonePreset;
281
+ } else if ( isCSS ) {
282
+ // CSS filter property string (e.g. 'unset').
283
+ colors = duotoneAttr;
284
+ } else if ( isCustom ) {
285
+ // Array of colors.
286
+ colors = duotoneAttr;
268
287
  }
269
288
 
270
- let colors = duotoneStyle;
289
+ // Build the CSS selectors to which the filter will be applied.
290
+ const selectors = duotoneSelector.split( ',' );
271
291
 
272
- if ( ! Array.isArray( colors ) && colors !== 'unset' ) {
273
- colors = getColorsFromDuotonePreset( colors, duotonePalette );
274
- }
292
+ const selectorsScoped = selectors.map( ( selectorPart ) => {
293
+ // Extra .editor-styles-wrapper specificity is needed in the editor
294
+ // since we're not using inline styles to apply the filter. We need to
295
+ // override duotone applied by global styles and theme.json.
296
+
297
+ // Assuming the selector part is a subclass selector (not a tag name)
298
+ // so we can prepend the filter id class. If we want to support elements
299
+ // such as `img` or namespaces, we'll need to add a case for that here.
300
+ return `.editor-styles-wrapper .${ filterId }${ selectorPart.trim() }`;
301
+ } );
275
302
 
276
- const duotoneSupportSelectors =
277
- getBlockType( name ).selectors?.filter?.duotone ||
278
- getBlockSupport( name, 'color.__experimentalDuotone' );
303
+ const selector = selectorsScoped.join( ', ' );
279
304
 
280
- // Extra .editor-styles-wrapper specificity is needed in the editor
281
- // since we're not using inline styles to apply the filter. We need to
282
- // override duotone applied by global styles and theme.json.
283
- const selectorsGroup = scopeSelector(
284
- `.editor-styles-wrapper .${ id }`,
285
- duotoneSupportSelectors
286
- );
305
+ const isValidFilter = Array.isArray( colors ) || colors === 'unset';
287
306
 
288
- return createPortal(
289
- <InlineDuotone
290
- selector={ selectorsGroup }
291
- id={ id }
292
- colors={ colors }
293
- />,
294
- element
307
+ return (
308
+ element &&
309
+ isValidFilter &&
310
+ createPortal(
311
+ <InlineDuotone
312
+ selector={ selector }
313
+ id={ filterId }
314
+ colors={ colors }
315
+ />,
316
+ element
317
+ )
295
318
  );
296
319
  }
297
320
 
@@ -304,16 +327,56 @@ function BlockDuotoneStyles( { name, duotoneStyle, id } ) {
304
327
  */
305
328
  const withDuotoneStyles = createHigherOrderComponent(
306
329
  ( BlockListBlock ) => ( props ) => {
307
- const duotoneSupport = getBlockSupport(
308
- props.name,
309
- 'color.__experimentalDuotone'
310
- );
311
-
312
- const id = `wp-duotone-${ useInstanceId( BlockListBlock ) }`;
313
- const className = duotoneSupport
314
- ? classnames( props?.className, id )
330
+ const id = useInstanceId( BlockListBlock );
331
+
332
+ const selector = useMemo( () => {
333
+ const blockType = getBlockType( props.name );
334
+
335
+ if ( blockType ) {
336
+ // Backwards compatibility for `supports.color.__experimentalDuotone`
337
+ // is provided via the `block_type_metadata_settings` filter. If
338
+ // `supports.filter.duotone` has not been set and the
339
+ // experimental property has been, the experimental property
340
+ // value is copied into `supports.filter.duotone`.
341
+ const duotoneSupport = getBlockSupport(
342
+ blockType,
343
+ 'filter.duotone',
344
+ false
345
+ );
346
+ if ( ! duotoneSupport ) {
347
+ return null;
348
+ }
349
+
350
+ // If the experimental duotone support was set, that value is
351
+ // to be treated as a selector and requires scoping.
352
+ const experimentalDuotone = getBlockSupport(
353
+ blockType,
354
+ 'color.__experimentalDuotone',
355
+ false
356
+ );
357
+ if ( experimentalDuotone ) {
358
+ const rootSelector = getBlockCSSSelector( blockType );
359
+ return typeof experimentalDuotone === 'string'
360
+ ? scopeSelector( rootSelector, experimentalDuotone )
361
+ : rootSelector;
362
+ }
363
+
364
+ // Regular filter.duotone support uses filter.duotone selectors with fallbacks.
365
+ return getBlockCSSSelector( blockType, 'filter.duotone', {
366
+ fallback: true,
367
+ } );
368
+ }
369
+ }, [ props.name ] );
370
+
371
+ const attribute = props?.attributes?.style?.color?.duotone;
372
+
373
+ const filterClass = `wp-duotone-${ id }`;
374
+
375
+ const shouldRender = selector && attribute;
376
+
377
+ const className = shouldRender
378
+ ? classnames( props?.className, filterClass )
315
379
  : props?.className;
316
- const duotoneStyle = props?.attributes?.style?.color?.duotone;
317
380
 
318
381
  // CAUTION: code added before this line will be executed
319
382
  // for all blocks, not just those that support duotone. Code added
@@ -321,11 +384,11 @@ const withDuotoneStyles = createHigherOrderComponent(
321
384
  // performance.
322
385
  return (
323
386
  <>
324
- { duotoneSupport && duotoneStyle && (
325
- <BlockDuotoneStyles
326
- name={ props?.name }
327
- duotoneStyle={ duotoneStyle }
328
- id={ id }
387
+ { shouldRender && (
388
+ <DuotoneStyles
389
+ id={ filterClass }
390
+ selector={ selector }
391
+ attribute={ attribute }
329
392
  />
330
393
  ) }
331
394
  <BlockListBlock { ...props } className={ className } />