@wordpress/block-editor 11.6.0 → 11.8.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 (350) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +46 -55
  3. package/build/components/block-list/block-html.js +1 -3
  4. package/build/components/block-list/block-html.js.map +1 -1
  5. package/build/components/block-list/block.native.js +4 -3
  6. package/build/components/block-list/block.native.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-preview/auto.js +6 -23
  14. package/build/components/block-preview/auto.js.map +1 -1
  15. package/build/components/block-settings-menu/block-settings-dropdown.js +1 -10
  16. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  17. package/build/components/caption/index.native.js +0 -1
  18. package/build/components/caption/index.native.js.map +1 -1
  19. package/build/components/date-format-picker/index.js +1 -1
  20. package/build/components/date-format-picker/index.js.map +1 -1
  21. package/build/components/editor-styles/index.js +20 -2
  22. package/build/components/editor-styles/index.js.map +1 -1
  23. package/build/components/global-styles/border-panel.js +15 -29
  24. package/build/components/global-styles/border-panel.js.map +1 -1
  25. package/build/components/global-styles/color-panel.js +583 -0
  26. package/build/components/global-styles/color-panel.js.map +1 -0
  27. package/build/components/global-styles/dimensions-panel.js +23 -44
  28. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  29. package/build/components/global-styles/effects-panel.js +244 -0
  30. package/build/components/global-styles/effects-panel.js.map +1 -0
  31. package/build/components/global-styles/filters-panel.js +151 -0
  32. package/build/components/global-styles/filters-panel.js.map +1 -0
  33. package/build/components/global-styles/get-block-css-selector.js +118 -0
  34. package/build/components/global-styles/get-block-css-selector.js.map +1 -0
  35. package/build/components/global-styles/hooks.js +60 -1
  36. package/build/components/global-styles/hooks.js.map +1 -1
  37. package/build/components/global-styles/index.js +46 -2
  38. package/build/components/global-styles/index.js.map +1 -1
  39. package/build/components/global-styles/typography-panel.js +9 -35
  40. package/build/components/global-styles/typography-panel.js.map +1 -1
  41. package/build/components/global-styles/use-global-styles-output.js +173 -91
  42. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  43. package/build/components/global-styles/utils.js +2 -1
  44. package/build/components/global-styles/utils.js.map +1 -1
  45. package/build/components/iframe/index.js +1 -1
  46. package/build/components/iframe/index.js.map +1 -1
  47. package/build/components/image-size-control/index.js +8 -5
  48. package/build/components/image-size-control/index.js.map +1 -1
  49. package/build/components/image-size-control/use-dimension-handler.js +5 -3
  50. package/build/components/image-size-control/use-dimension-handler.js.map +1 -1
  51. package/build/components/index.js +16 -0
  52. package/build/components/index.js.map +1 -1
  53. package/build/components/inserter/block-patterns-tab.js +4 -2
  54. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  55. package/build/components/inspector-controls-tabs/position-controls-panel.js +43 -7
  56. package/build/components/inspector-controls-tabs/position-controls-panel.js.map +1 -1
  57. package/build/components/inspector-controls-tabs/utils.js +5 -3
  58. package/build/components/inspector-controls-tabs/utils.js.map +1 -1
  59. package/build/components/line-height-control/index.js +15 -1
  60. package/build/components/line-height-control/index.js.map +1 -1
  61. package/build/components/list-view/appender.js +105 -0
  62. package/build/components/list-view/appender.js.map +1 -0
  63. package/build/components/list-view/block.js +6 -5
  64. package/build/components/list-view/block.js.map +1 -1
  65. package/build/components/list-view/branch.js +25 -5
  66. package/build/components/list-view/branch.js.map +1 -1
  67. package/build/components/list-view/index.js +56 -14
  68. package/build/components/list-view/index.js.map +1 -1
  69. package/build/components/list-view/use-list-view-client-ids.js +7 -3
  70. package/build/components/list-view/use-list-view-client-ids.js.map +1 -1
  71. package/build/components/list-view/use-list-view-drop-zone.js +8 -2
  72. package/build/components/list-view/use-list-view-drop-zone.js.map +1 -1
  73. package/build/components/media-replace-flow/index.js +13 -4
  74. package/build/components/media-replace-flow/index.js.map +1 -1
  75. package/build/components/off-canvas-editor/block-contents.js +6 -1
  76. package/build/components/off-canvas-editor/block-contents.js.map +1 -1
  77. package/build/components/off-canvas-editor/index.js +17 -14
  78. package/build/components/off-canvas-editor/index.js.map +1 -1
  79. package/build/components/resizable-box-popover/index.js +38 -0
  80. package/build/components/resizable-box-popover/index.js.map +1 -0
  81. package/build/components/rich-text/format-edit.js +2 -30
  82. package/build/components/rich-text/format-edit.js.map +1 -1
  83. package/build/components/rich-text/index.js +0 -1
  84. package/build/components/rich-text/index.js.map +1 -1
  85. package/build/components/rich-text/index.native.js +7 -11
  86. package/build/components/rich-text/index.native.js.map +1 -1
  87. package/build/components/spacing-sizes-control/spacing-input-control.js +8 -0
  88. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  89. package/build/components/writing-flow/use-input.js +4 -8
  90. package/build/components/writing-flow/use-input.js.map +1 -1
  91. package/build/hooks/anchor.js +1 -1
  92. package/build/hooks/anchor.js.map +1 -1
  93. package/build/hooks/border.js +1 -2
  94. package/build/hooks/border.js.map +1 -1
  95. package/build/hooks/color.js +92 -229
  96. package/build/hooks/color.js.map +1 -1
  97. package/build/hooks/content-lock-ui.js +4 -2
  98. package/build/hooks/content-lock-ui.js.map +1 -1
  99. package/build/hooks/{color-panel.js → contrast-checker.js} +11 -49
  100. package/build/hooks/contrast-checker.js.map +1 -0
  101. package/build/hooks/dimensions.js +0 -1
  102. package/build/hooks/dimensions.js.map +1 -1
  103. package/build/hooks/duotone.js +92 -64
  104. package/build/hooks/duotone.js.map +1 -1
  105. package/build/hooks/margin.js +27 -17
  106. package/build/hooks/margin.js.map +1 -1
  107. package/build/hooks/padding.js +19 -9
  108. package/build/hooks/padding.js.map +1 -1
  109. package/build/hooks/position.js +2 -2
  110. package/build/hooks/position.js.map +1 -1
  111. package/build/hooks/style.js +23 -26
  112. package/build/hooks/style.js.map +1 -1
  113. package/build/hooks/typography.js +0 -1
  114. package/build/hooks/typography.js.map +1 -1
  115. package/build/hooks/utils.js +28 -76
  116. package/build/hooks/utils.js.map +1 -1
  117. package/build/layouts/grid.js +165 -0
  118. package/build/layouts/grid.js.map +1 -0
  119. package/build/layouts/index.js +3 -1
  120. package/build/layouts/index.js.map +1 -1
  121. package/build/layouts/utils.js +3 -2
  122. package/build/layouts/utils.js.map +1 -1
  123. package/build/private-apis.js +7 -1
  124. package/build/private-apis.js.map +1 -1
  125. package/build/store/actions.js +1 -1
  126. package/build/store/actions.js.map +1 -1
  127. package/build/utils/object.js +76 -0
  128. package/build/utils/object.js.map +1 -0
  129. package/build-module/components/block-list/block-html.js +1 -3
  130. package/build-module/components/block-list/block-html.js.map +1 -1
  131. package/build-module/components/block-list/block.native.js +4 -3
  132. package/build-module/components/block-list/block.native.js.map +1 -1
  133. package/build-module/components/block-list/index.native.js +11 -19
  134. package/build-module/components/block-list/index.native.js.map +1 -1
  135. package/build-module/components/block-list/use-in-between-inserter.js +2 -1
  136. package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
  137. package/build-module/components/block-popover/inbetween.js +2 -9
  138. package/build-module/components/block-popover/inbetween.js.map +1 -1
  139. package/build-module/components/block-preview/auto.js +6 -22
  140. package/build-module/components/block-preview/auto.js.map +1 -1
  141. package/build-module/components/block-settings-menu/block-settings-dropdown.js +1 -9
  142. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  143. package/build-module/components/caption/index.native.js +0 -1
  144. package/build-module/components/caption/index.native.js.map +1 -1
  145. package/build-module/components/date-format-picker/index.js +1 -1
  146. package/build-module/components/date-format-picker/index.js.map +1 -1
  147. package/build-module/components/editor-styles/index.js +19 -2
  148. package/build-module/components/editor-styles/index.js.map +1 -1
  149. package/build-module/components/global-styles/border-panel.js +15 -29
  150. package/build-module/components/global-styles/border-panel.js.map +1 -1
  151. package/build-module/components/global-styles/color-panel.js +554 -0
  152. package/build-module/components/global-styles/color-panel.js.map +1 -0
  153. package/build-module/components/global-styles/dimensions-panel.js +22 -44
  154. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  155. package/build-module/components/global-styles/effects-panel.js +228 -0
  156. package/build-module/components/global-styles/effects-panel.js.map +1 -0
  157. package/build-module/components/global-styles/filters-panel.js +139 -0
  158. package/build-module/components/global-styles/filters-panel.js.map +1 -0
  159. package/build-module/components/global-styles/get-block-css-selector.js +109 -0
  160. package/build-module/components/global-styles/get-block-css-selector.js.map +1 -0
  161. package/build-module/components/global-styles/hooks.js +58 -1
  162. package/build-module/components/global-styles/hooks.js.map +1 -1
  163. package/build-module/components/global-styles/index.js +5 -1
  164. package/build-module/components/global-styles/index.js.map +1 -1
  165. package/build-module/components/global-styles/typography-panel.js +8 -35
  166. package/build-module/components/global-styles/typography-panel.js.map +1 -1
  167. package/build-module/components/global-styles/use-global-styles-output.js +175 -93
  168. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  169. package/build-module/components/global-styles/utils.js +2 -1
  170. package/build-module/components/global-styles/utils.js.map +1 -1
  171. package/build-module/components/iframe/index.js +1 -1
  172. package/build-module/components/iframe/index.js.map +1 -1
  173. package/build-module/components/image-size-control/index.js +8 -5
  174. package/build-module/components/image-size-control/index.js.map +1 -1
  175. package/build-module/components/image-size-control/use-dimension-handler.js +5 -3
  176. package/build-module/components/image-size-control/use-dimension-handler.js.map +1 -1
  177. package/build-module/components/index.js +1 -0
  178. package/build-module/components/index.js.map +1 -1
  179. package/build-module/components/inserter/block-patterns-tab.js +5 -2
  180. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  181. package/build-module/components/inspector-controls-tabs/position-controls-panel.js +42 -7
  182. package/build-module/components/inspector-controls-tabs/position-controls-panel.js.map +1 -1
  183. package/build-module/components/inspector-controls-tabs/utils.js +4 -3
  184. package/build-module/components/inspector-controls-tabs/utils.js.map +1 -1
  185. package/build-module/components/line-height-control/index.js +15 -1
  186. package/build-module/components/line-height-control/index.js.map +1 -1
  187. package/build-module/components/list-view/appender.js +88 -0
  188. package/build-module/components/list-view/appender.js.map +1 -0
  189. package/build-module/components/list-view/block.js +6 -4
  190. package/build-module/components/list-view/block.js.map +1 -1
  191. package/build-module/components/list-view/branch.js +22 -5
  192. package/build-module/components/list-view/branch.js.map +1 -1
  193. package/build-module/components/list-view/index.js +50 -13
  194. package/build-module/components/list-view/index.js.map +1 -1
  195. package/build-module/components/list-view/use-list-view-client-ids.js +7 -3
  196. package/build-module/components/list-view/use-list-view-client-ids.js.map +1 -1
  197. package/build-module/components/list-view/use-list-view-drop-zone.js +8 -4
  198. package/build-module/components/list-view/use-list-view-drop-zone.js.map +1 -1
  199. package/build-module/components/media-replace-flow/index.js +12 -4
  200. package/build-module/components/media-replace-flow/index.js.map +1 -1
  201. package/build-module/components/off-canvas-editor/block-contents.js +5 -1
  202. package/build-module/components/off-canvas-editor/block-contents.js.map +1 -1
  203. package/build-module/components/off-canvas-editor/index.js +17 -14
  204. package/build-module/components/off-canvas-editor/index.js.map +1 -1
  205. package/build-module/components/resizable-box-popover/index.js +26 -0
  206. package/build-module/components/resizable-box-popover/index.js.map +1 -0
  207. package/build-module/components/rich-text/format-edit.js +3 -31
  208. package/build-module/components/rich-text/format-edit.js.map +1 -1
  209. package/build-module/components/rich-text/index.js +0 -1
  210. package/build-module/components/rich-text/index.js.map +1 -1
  211. package/build-module/components/rich-text/index.native.js +7 -10
  212. package/build-module/components/rich-text/index.native.js.map +1 -1
  213. package/build-module/components/spacing-sizes-control/spacing-input-control.js +7 -0
  214. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  215. package/build-module/components/writing-flow/use-input.js +4 -8
  216. package/build-module/components/writing-flow/use-input.js.map +1 -1
  217. package/build-module/hooks/anchor.js +1 -1
  218. package/build-module/hooks/anchor.js.map +1 -1
  219. package/build-module/hooks/border.js +1 -2
  220. package/build-module/hooks/border.js.map +1 -1
  221. package/build-module/hooks/color.js +90 -232
  222. package/build-module/hooks/color.js.map +1 -1
  223. package/build-module/hooks/content-lock-ui.js +4 -2
  224. package/build-module/hooks/content-lock-ui.js.map +1 -1
  225. package/build-module/hooks/{color-panel.js → contrast-checker.js} +10 -44
  226. package/build-module/hooks/contrast-checker.js.map +1 -0
  227. package/build-module/hooks/dimensions.js +0 -1
  228. package/build-module/hooks/dimensions.js.map +1 -1
  229. package/build-module/hooks/duotone.js +91 -65
  230. package/build-module/hooks/duotone.js.map +1 -1
  231. package/build-module/hooks/margin.js +29 -18
  232. package/build-module/hooks/margin.js.map +1 -1
  233. package/build-module/hooks/padding.js +21 -10
  234. package/build-module/hooks/padding.js.map +1 -1
  235. package/build-module/hooks/position.js +3 -3
  236. package/build-module/hooks/position.js.map +1 -1
  237. package/build-module/hooks/style.js +23 -26
  238. package/build-module/hooks/style.js.map +1 -1
  239. package/build-module/hooks/typography.js +0 -1
  240. package/build-module/hooks/typography.js.map +1 -1
  241. package/build-module/hooks/utils.js +27 -74
  242. package/build-module/hooks/utils.js.map +1 -1
  243. package/build-module/layouts/grid.js +151 -0
  244. package/build-module/layouts/grid.js.map +1 -0
  245. package/build-module/layouts/index.js +2 -1
  246. package/build-module/layouts/index.js.map +1 -1
  247. package/build-module/layouts/utils.js +3 -2
  248. package/build-module/layouts/utils.js.map +1 -1
  249. package/build-module/private-apis.js +5 -1
  250. package/build-module/private-apis.js.map +1 -1
  251. package/build-module/store/actions.js +1 -1
  252. package/build-module/store/actions.js.map +1 -1
  253. package/build-module/utils/object.js +69 -0
  254. package/build-module/utils/object.js.map +1 -0
  255. package/build-style/style-rtl.css +77 -16
  256. package/build-style/style.css +77 -16
  257. package/package.json +31 -31
  258. package/src/components/block-draggable/content.scss +1 -1
  259. package/src/components/block-inspector/style.scss +6 -4
  260. package/src/components/block-list/block-html.js +1 -1
  261. package/src/components/block-list/block.native.js +3 -2
  262. package/src/components/block-list/index.native.js +19 -38
  263. package/src/components/block-list/use-in-between-inserter.js +4 -1
  264. package/src/components/block-popover/inbetween.js +2 -13
  265. package/src/components/block-preview/auto.js +2 -17
  266. package/src/components/block-settings-menu/block-settings-dropdown.js +2 -12
  267. package/src/components/caption/index.native.js +0 -1
  268. package/src/components/colors-gradients/style.scss +8 -8
  269. package/src/components/date-format-picker/index.js +1 -1
  270. package/src/components/editor-styles/index.js +29 -1
  271. package/src/components/global-styles/README.md +129 -16
  272. package/src/components/global-styles/border-panel.js +13 -32
  273. package/src/components/global-styles/color-panel.js +706 -0
  274. package/src/components/global-styles/dimensions-panel.js +43 -55
  275. package/src/components/global-styles/effects-panel.js +228 -0
  276. package/src/components/global-styles/filters-panel.js +157 -0
  277. package/src/components/global-styles/get-block-css-selector.js +118 -0
  278. package/src/components/global-styles/hooks.js +90 -0
  279. package/src/components/global-styles/index.js +4 -1
  280. package/src/components/global-styles/style.scss +42 -0
  281. package/src/components/global-styles/test/use-global-styles-output.js +34 -5
  282. package/src/components/global-styles/typography-panel.js +26 -51
  283. package/src/components/global-styles/use-global-styles-output.js +188 -89
  284. package/src/components/global-styles/utils.js +3 -0
  285. package/src/components/iframe/index.js +1 -1
  286. package/src/components/image-size-control/index.js +4 -3
  287. package/src/components/image-size-control/test/index.js +2 -2
  288. package/src/components/image-size-control/use-dimension-handler.js +4 -3
  289. package/src/components/index.js +4 -1
  290. package/src/components/inner-blocks/README.md +1 -1
  291. package/src/components/inserter/block-patterns-tab.js +3 -1
  292. package/src/components/inspector-controls-tabs/position-controls-panel.js +40 -9
  293. package/src/components/inspector-controls-tabs/utils.js +4 -3
  294. package/src/components/line-height-control/index.js +10 -1
  295. package/src/components/list-view/README.md +2 -0
  296. package/src/components/list-view/appender.js +101 -0
  297. package/src/components/list-view/block.js +6 -4
  298. package/src/components/list-view/branch.js +30 -1
  299. package/src/components/list-view/index.js +60 -11
  300. package/src/components/list-view/style.scss +22 -1
  301. package/src/components/list-view/test/use-list-view-drop-zone.js +188 -0
  302. package/src/components/list-view/use-list-view-client-ids.js +5 -3
  303. package/src/components/list-view/use-list-view-drop-zone.js +9 -3
  304. package/src/components/media-replace-flow/index.js +36 -24
  305. package/src/components/media-replace-flow/style.scss +5 -2
  306. package/src/components/off-canvas-editor/block-contents.js +4 -0
  307. package/src/components/off-canvas-editor/index.js +15 -11
  308. package/src/components/resizable-box-popover/index.js +27 -0
  309. package/src/components/rich-text/format-edit.js +2 -32
  310. package/src/components/rich-text/index.js +0 -1
  311. package/src/components/rich-text/index.native.js +2 -5
  312. package/src/components/spacing-sizes-control/spacing-input-control.js +10 -0
  313. package/src/components/spacing-sizes-control/style.scss +7 -7
  314. package/src/components/writing-flow/use-input.js +4 -5
  315. package/src/hooks/anchor.js +1 -1
  316. package/src/hooks/border.js +1 -2
  317. package/src/hooks/color.js +120 -296
  318. package/src/hooks/content-lock-ui.js +6 -2
  319. package/src/hooks/{color-panel.js → contrast-checker.js} +10 -46
  320. package/src/hooks/dimensions.js +0 -1
  321. package/src/hooks/duotone.js +121 -76
  322. package/src/hooks/margin.js +31 -26
  323. package/src/hooks/padding.js +24 -18
  324. package/src/hooks/position.js +3 -3
  325. package/src/hooks/style.js +29 -28
  326. package/src/hooks/test/utils.js +0 -104
  327. package/src/hooks/typography.js +0 -1
  328. package/src/hooks/utils.js +31 -74
  329. package/src/layouts/grid.js +172 -0
  330. package/src/layouts/index.js +2 -1
  331. package/src/layouts/test/grid.js +21 -0
  332. package/src/layouts/utils.js +2 -2
  333. package/src/private-apis.js +4 -0
  334. package/src/store/actions.js +1 -1
  335. package/src/style.scss +1 -0
  336. package/src/utils/object.js +69 -0
  337. package/src/utils/test/object.js +145 -0
  338. package/tsconfig.tsbuildinfo +1 -1
  339. package/build/components/rich-text/use-native-props.js +0 -11
  340. package/build/components/rich-text/use-native-props.js.map +0 -1
  341. package/build/components/rich-text/use-native-props.native.js +0 -24
  342. package/build/components/rich-text/use-native-props.native.js.map +0 -1
  343. package/build/hooks/color-panel.js.map +0 -1
  344. package/build-module/components/rich-text/use-native-props.js +0 -4
  345. package/build-module/components/rich-text/use-native-props.js.map +0 -1
  346. package/build-module/components/rich-text/use-native-props.native.js +0 -15
  347. package/build-module/components/rich-text/use-native-props.native.js.map +0 -1
  348. package/build-module/hooks/color-panel.js.map +0 -1
  349. package/src/components/rich-text/use-native-props.js +0 -3
  350. package/src/components/rich-text/use-native-props.native.js +0 -17
@@ -28,6 +28,7 @@ import SpacingSizesControl from '../spacing-sizes-control';
28
28
  import HeightControl from '../height-control';
29
29
  import ChildLayoutControl from '../child-layout-control';
30
30
  import { cleanEmptyObject } from '../../hooks/utils';
31
+ import { immutableSet } from '../../utils/object';
31
32
 
32
33
  const AXIAL_SIDES = [ 'horizontal', 'vertical' ];
33
34
 
@@ -183,12 +184,13 @@ function DimensionsToolsPanel( {
183
184
  }
184
185
 
185
186
  const DEFAULT_CONTROLS = {
186
- contentSize: true,
187
- wideSize: true,
188
- padding: true,
189
- margin: true,
190
- blockGap: true,
191
- minHeight: true,
187
+ contentSize: false,
188
+ wideSize: false,
189
+ padding: false,
190
+ margin: false,
191
+ blockGap: false,
192
+ minHeight: false,
193
+ childLayout: true,
192
194
  };
193
195
 
194
196
  export default function DimensionsPanel( {
@@ -223,13 +225,9 @@ export default function DimensionsPanel( {
223
225
  useHasContentSize( settings ) && includeLayoutControls;
224
226
  const contentSizeValue = decodeValue( inheritedValue?.layout?.contentSize );
225
227
  const setContentSizeValue = ( newValue ) => {
226
- onChange( {
227
- ...value,
228
- layout: {
229
- ...value?.layout,
230
- contentSize: newValue,
231
- },
232
- } );
228
+ onChange(
229
+ immutableSet( value, [ 'layout', 'contentSize' ], newValue )
230
+ );
233
231
  };
234
232
  const hasUserSetContentSizeValue = () => !! value?.layout?.contentSize;
235
233
  const resetContentSizeValue = () => setContentSizeValue( undefined );
@@ -239,13 +237,7 @@ export default function DimensionsPanel( {
239
237
  useHasWideSize( settings ) && includeLayoutControls;
240
238
  const wideSizeValue = decodeValue( inheritedValue?.layout?.wideSize );
241
239
  const setWideSizeValue = ( newValue ) => {
242
- onChange( {
243
- ...value,
244
- layout: {
245
- ...value?.layout,
246
- wideSize: newValue,
247
- },
248
- } );
240
+ onChange( immutableSet( value, [ 'layout', 'wideSize' ], newValue ) );
249
241
  };
250
242
  const hasUserSetWideSizeValue = () => !! value?.layout?.wideSize;
251
243
  const resetWideSizeValue = () => setWideSizeValue( undefined );
@@ -262,13 +254,7 @@ export default function DimensionsPanel( {
262
254
  paddingSides.some( ( side ) => AXIAL_SIDES.includes( side ) );
263
255
  const setPaddingValues = ( newPaddingValues ) => {
264
256
  const padding = filterValuesBySides( newPaddingValues, paddingSides );
265
- onChange( {
266
- ...value,
267
- spacing: {
268
- ...value?.spacing,
269
- padding,
270
- },
271
- } );
257
+ onChange( immutableSet( value, [ 'spacing', 'padding' ], padding ) );
272
258
  };
273
259
  const hasPaddingValue = () =>
274
260
  !! value?.spacing?.padding &&
@@ -288,13 +274,7 @@ export default function DimensionsPanel( {
288
274
  marginSides.some( ( side ) => AXIAL_SIDES.includes( side ) );
289
275
  const setMarginValues = ( newMarginValues ) => {
290
276
  const margin = filterValuesBySides( newMarginValues, marginSides );
291
- onChange( {
292
- ...value,
293
- spacing: {
294
- ...value?.spacing,
295
- margin,
296
- },
297
- } );
277
+ onChange( immutableSet( value, [ 'spacing', 'margin' ], margin ) );
298
278
  };
299
279
  const hasMarginValue = () =>
300
280
  !! value?.spacing?.margin &&
@@ -312,13 +292,9 @@ export default function DimensionsPanel( {
312
292
  const isAxialGap =
313
293
  gapSides && gapSides.some( ( side ) => AXIAL_SIDES.includes( side ) );
314
294
  const setGapValue = ( newGapValue ) => {
315
- onChange( {
316
- ...value,
317
- spacing: {
318
- ...value?.spacing,
319
- blockGap: newGapValue,
320
- },
321
- } );
295
+ onChange(
296
+ immutableSet( value, [ 'spacing', 'blockGap' ], newGapValue )
297
+ );
322
298
  };
323
299
  const setGapValues = ( nextBoxGapValue ) => {
324
300
  if ( ! nextBoxGapValue ) {
@@ -341,13 +317,9 @@ export default function DimensionsPanel( {
341
317
  const showMinHeightControl = useHasMinHeight( settings );
342
318
  const minHeightValue = decodeValue( inheritedValue?.dimensions?.minHeight );
343
319
  const setMinHeightValue = ( newValue ) => {
344
- onChange( {
345
- ...value,
346
- dimensions: {
347
- ...value?.dimensions,
348
- minHeight: newValue,
349
- },
350
- } );
320
+ onChange(
321
+ immutableSet( value, [ 'dimensions', 'minHeight' ], newValue )
322
+ );
351
323
  };
352
324
  const resetMinHeightValue = () => {
353
325
  setMinHeightValue( undefined );
@@ -420,7 +392,10 @@ export default function DimensionsPanel( {
420
392
  label={ __( 'Content size' ) }
421
393
  hasValue={ hasUserSetContentSizeValue }
422
394
  onDeselect={ resetContentSizeValue }
423
- isShownByDefault={ defaultControls.contentSize }
395
+ isShownByDefault={
396
+ defaultControls.contentSize ??
397
+ DEFAULT_CONTROLS.contentSize
398
+ }
424
399
  panelId={ panelId }
425
400
  >
426
401
  <HStack alignment="flex-end" justify="flex-start">
@@ -446,7 +421,9 @@ export default function DimensionsPanel( {
446
421
  label={ __( 'Wide size' ) }
447
422
  hasValue={ hasUserSetWideSizeValue }
448
423
  onDeselect={ resetWideSizeValue }
449
- isShownByDefault={ defaultControls.wideSize }
424
+ isShownByDefault={
425
+ defaultControls.wideSize ?? DEFAULT_CONTROLS.wideSize
426
+ }
450
427
  panelId={ panelId }
451
428
  >
452
429
  <HStack alignment="flex-end" justify="flex-start">
@@ -471,7 +448,9 @@ export default function DimensionsPanel( {
471
448
  hasValue={ hasPaddingValue }
472
449
  label={ __( 'Padding' ) }
473
450
  onDeselect={ resetPaddingValue }
474
- isShownByDefault={ defaultControls.padding }
451
+ isShownByDefault={
452
+ defaultControls.padding ?? DEFAULT_CONTROLS.padding
453
+ }
475
454
  className={ classnames( {
476
455
  'tools-panel-item-spacing': showSpacingPresetsControl,
477
456
  } ) }
@@ -510,7 +489,9 @@ export default function DimensionsPanel( {
510
489
  hasValue={ hasMarginValue }
511
490
  label={ __( 'Margin' ) }
512
491
  onDeselect={ resetMarginValue }
513
- isShownByDefault={ defaultControls.margin }
492
+ isShownByDefault={
493
+ defaultControls.margin ?? DEFAULT_CONTROLS.margin
494
+ }
514
495
  className={ classnames( {
515
496
  'tools-panel-item-spacing': showSpacingPresetsControl,
516
497
  } ) }
@@ -549,7 +530,9 @@ export default function DimensionsPanel( {
549
530
  hasValue={ hasGapValue }
550
531
  label={ __( 'Block spacing' ) }
551
532
  onDeselect={ resetGapValue }
552
- isShownByDefault={ defaultControls.blockGap }
533
+ isShownByDefault={
534
+ defaultControls.blockGap ?? DEFAULT_CONTROLS.blockGap
535
+ }
553
536
  className={ classnames( {
554
537
  'tools-panel-item-spacing': showSpacingPresetsControl,
555
538
  } ) }
@@ -595,7 +578,9 @@ export default function DimensionsPanel( {
595
578
  hasValue={ hasMinHeightValue }
596
579
  label={ __( 'Min. height' ) }
597
580
  onDeselect={ resetMinHeightValue }
598
- isShownByDefault={ defaultControls.minHeight }
581
+ isShownByDefault={
582
+ defaultControls.minHeight ?? DEFAULT_CONTROLS.minHeight
583
+ }
599
584
  panelId={ panelId }
600
585
  >
601
586
  <HeightControl
@@ -612,7 +597,10 @@ export default function DimensionsPanel( {
612
597
  hasValue={ hasChildLayoutValue }
613
598
  label={ childLayoutOrientationLabel }
614
599
  onDeselect={ resetChildLayoutValue }
615
- isShownByDefault={ defaultControls.childLayout }
600
+ isShownByDefault={
601
+ defaultControls.childLayout ??
602
+ DEFAULT_CONTROLS.childLayout
603
+ }
616
604
  panelId={ panelId }
617
605
  >
618
606
  <ChildLayoutControl
@@ -0,0 +1,228 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import classnames from 'classnames';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import {
10
+ __experimentalToolsPanel as ToolsPanel,
11
+ __experimentalToolsPanelItem as ToolsPanelItem,
12
+ __experimentalItemGroup as ItemGroup,
13
+ __experimentalHStack as HStack,
14
+ __experimentalVStack as VStack,
15
+ __experimentalGrid as Grid,
16
+ __experimentalHeading as Heading,
17
+ FlexItem,
18
+ Dropdown,
19
+ __experimentalDropdownContentWrapper as DropdownContentWrapper,
20
+ Button,
21
+ } from '@wordpress/components';
22
+ import { __ } from '@wordpress/i18n';
23
+ import { useCallback } from '@wordpress/element';
24
+ import { shadow as shadowIcon, Icon, check } from '@wordpress/icons';
25
+
26
+ /**
27
+ * Internal dependencies
28
+ */
29
+ import { getValueFromVariable } from './utils';
30
+ import { immutableSet } from '../../utils/object';
31
+
32
+ export function useHasEffectsPanel( settings ) {
33
+ const hasShadowControl = useHasShadowControl( settings );
34
+ return hasShadowControl;
35
+ }
36
+
37
+ function useHasShadowControl( settings ) {
38
+ return !! settings?.shadow;
39
+ }
40
+
41
+ function EffectsToolsPanel( {
42
+ resetAllFilter,
43
+ onChange,
44
+ value,
45
+ panelId,
46
+ children,
47
+ } ) {
48
+ const resetAll = () => {
49
+ const updatedValue = resetAllFilter( value );
50
+ onChange( updatedValue );
51
+ };
52
+
53
+ return (
54
+ <ToolsPanel
55
+ label={ __( 'Effects' ) }
56
+ resetAll={ resetAll }
57
+ panelId={ panelId }
58
+ >
59
+ { children }
60
+ </ToolsPanel>
61
+ );
62
+ }
63
+
64
+ const DEFAULT_CONTROLS = {
65
+ shadow: true,
66
+ };
67
+
68
+ export default function EffectsPanel( {
69
+ as: Wrapper = EffectsToolsPanel,
70
+ value,
71
+ onChange,
72
+ inheritedValue = value,
73
+ settings,
74
+ panelId,
75
+ defaultControls = DEFAULT_CONTROLS,
76
+ } ) {
77
+ const decodeValue = ( rawValue ) =>
78
+ getValueFromVariable( { settings }, '', rawValue );
79
+
80
+ // Shadow
81
+ const hasShadowEnabled = useHasShadowControl( settings );
82
+ const shadow = decodeValue( inheritedValue?.shadow );
83
+ const setShadow = ( newValue ) => {
84
+ onChange( immutableSet( value, [ 'shadow' ], newValue ) );
85
+ };
86
+ const hasShadow = () => !! value?.shadow;
87
+ const resetShadow = () => setShadow( undefined );
88
+
89
+ const resetAllFilter = useCallback( ( previousValue ) => {
90
+ return {
91
+ ...previousValue,
92
+ shadow: undefined,
93
+ };
94
+ }, [] );
95
+
96
+ return (
97
+ <Wrapper
98
+ resetAllFilter={ resetAllFilter }
99
+ value={ value }
100
+ onChange={ onChange }
101
+ panelId={ panelId }
102
+ >
103
+ { hasShadowEnabled && (
104
+ <ToolsPanelItem
105
+ label={ __( 'Shadow' ) }
106
+ hasValue={ hasShadow }
107
+ onDeselect={ resetShadow }
108
+ isShownByDefault={ defaultControls.shadow }
109
+ panelId={ panelId }
110
+ >
111
+ <ItemGroup isBordered isSeparated>
112
+ <ShadowPopover
113
+ shadow={ shadow }
114
+ onShadowChange={ setShadow }
115
+ settings={ settings }
116
+ />
117
+ </ItemGroup>
118
+ </ToolsPanelItem>
119
+ ) }
120
+ </Wrapper>
121
+ );
122
+ }
123
+
124
+ const ShadowPopover = ( { shadow, onShadowChange, settings } ) => {
125
+ const popoverProps = {
126
+ placement: 'left-start',
127
+ offset: 36,
128
+ shift: true,
129
+ };
130
+
131
+ return (
132
+ <Dropdown
133
+ popoverProps={ popoverProps }
134
+ className="block-editor-global-styles-effects-panel__shadow-dropdown"
135
+ renderToggle={ renderShadowToggle() }
136
+ renderContent={ () => (
137
+ <DropdownContentWrapper paddingSize="medium">
138
+ <ShadowPopoverContainer
139
+ shadow={ shadow }
140
+ onShadowChange={ onShadowChange }
141
+ settings={ settings }
142
+ />
143
+ </DropdownContentWrapper>
144
+ ) }
145
+ />
146
+ );
147
+ };
148
+
149
+ function renderShadowToggle() {
150
+ return ( { onToggle, isOpen } ) => {
151
+ const toggleProps = {
152
+ onClick: onToggle,
153
+ className: classnames( { 'is-open': isOpen } ),
154
+ 'aria-expanded': isOpen,
155
+ };
156
+
157
+ return (
158
+ <Button { ...toggleProps }>
159
+ <HStack justify="flex-start">
160
+ <Icon
161
+ className="block-editor-global-styles-effects-panel__toggle-icon"
162
+ icon={ shadowIcon }
163
+ size={ 24 }
164
+ />
165
+ <FlexItem>{ __( 'Shadow' ) }</FlexItem>
166
+ </HStack>
167
+ </Button>
168
+ );
169
+ };
170
+ }
171
+
172
+ function ShadowPopoverContainer( { shadow, onShadowChange, settings } ) {
173
+ const defaultShadows = settings?.shadow?.presets?.default;
174
+ const themeShadows = settings?.shadow?.presets?.theme;
175
+ const defaultPresetsEnabled = settings?.shadow?.defaultPresets;
176
+
177
+ const shadows = [
178
+ ...( defaultPresetsEnabled ? defaultShadows : [] ),
179
+ ...( themeShadows || [] ),
180
+ ];
181
+
182
+ return (
183
+ <div className="block-editor-global-styles-effects-panel__shadow-popover-container">
184
+ <VStack spacing={ 4 }>
185
+ <Heading level={ 5 }>{ __( 'Shadow' ) }</Heading>
186
+ <ShadowPresets
187
+ presets={ shadows }
188
+ activeShadow={ shadow }
189
+ onSelect={ onShadowChange }
190
+ />
191
+ </VStack>
192
+ </div>
193
+ );
194
+ }
195
+
196
+ function ShadowPresets( { presets, activeShadow, onSelect } ) {
197
+ return ! presets ? null : (
198
+ <Grid columns={ 6 } gap={ 0 } align="center" justify="center">
199
+ { presets.map( ( { name, slug, shadow } ) => (
200
+ <ShadowIndicator
201
+ key={ slug }
202
+ label={ name }
203
+ isActive={ shadow === activeShadow }
204
+ onSelect={ () =>
205
+ onSelect( shadow === activeShadow ? undefined : shadow )
206
+ }
207
+ shadow={ shadow }
208
+ />
209
+ ) ) }
210
+ </Grid>
211
+ );
212
+ }
213
+
214
+ function ShadowIndicator( { label, isActive, onSelect, shadow } ) {
215
+ return (
216
+ <div className="block-editor-global-styles-effects-panel__shadow-indicator-wrapper">
217
+ <Button
218
+ className="block-editor-global-styles-effects-panel__shadow-indicator"
219
+ onClick={ onSelect }
220
+ label={ label }
221
+ style={ { boxShadow: shadow } }
222
+ showTooltip
223
+ >
224
+ { isActive && <Icon icon={ check } /> }
225
+ </Button>
226
+ </div>
227
+ );
228
+ }
@@ -0,0 +1,157 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ __experimentalToolsPanel as ToolsPanel,
6
+ __experimentalToolsPanelItem as ToolsPanelItem,
7
+ __experimentalVStack as VStack,
8
+ DuotonePicker,
9
+ } from '@wordpress/components';
10
+ import { __ } from '@wordpress/i18n';
11
+ import { useCallback, useMemo } from '@wordpress/element';
12
+
13
+ /**
14
+ * Internal dependencies
15
+ */
16
+ import { getValueFromVariable } from './utils';
17
+ import { immutableSet } from '../../utils/object';
18
+
19
+ const EMPTY_ARRAY = [];
20
+ function useMultiOriginColorPresets(
21
+ settings,
22
+ { presetSetting, defaultSetting }
23
+ ) {
24
+ const disableDefault = ! settings?.color?.[ defaultSetting ];
25
+ const userPresets =
26
+ settings?.color?.[ presetSetting ]?.custom || EMPTY_ARRAY;
27
+ const themePresets =
28
+ settings?.color?.[ presetSetting ]?.theme || EMPTY_ARRAY;
29
+ const defaultPresets =
30
+ settings?.color?.[ presetSetting ]?.default || EMPTY_ARRAY;
31
+ return useMemo(
32
+ () => [
33
+ ...userPresets,
34
+ ...themePresets,
35
+ ...( disableDefault ? EMPTY_ARRAY : defaultPresets ),
36
+ ],
37
+ [ disableDefault, userPresets, themePresets, defaultPresets ]
38
+ );
39
+ }
40
+
41
+ export function useHasFiltersPanel( settings ) {
42
+ const hasDuotone = useHasDuotoneControl( settings );
43
+
44
+ return hasDuotone;
45
+ }
46
+
47
+ function useHasDuotoneControl( settings ) {
48
+ return settings.color.customDuotone || settings.color.defaultDuotone;
49
+ }
50
+
51
+ function FiltersToolsPanel( {
52
+ resetAllFilter,
53
+ onChange,
54
+ value,
55
+ panelId,
56
+ children,
57
+ } ) {
58
+ const resetAll = () => {
59
+ const updatedValue = resetAllFilter( value );
60
+ onChange( updatedValue );
61
+ };
62
+
63
+ return (
64
+ <ToolsPanel
65
+ label={ __( 'Filters' ) }
66
+ resetAll={ resetAll }
67
+ panelId={ panelId }
68
+ >
69
+ { children }
70
+ </ToolsPanel>
71
+ );
72
+ }
73
+
74
+ const DEFAULT_CONTROLS = {
75
+ duotone: true,
76
+ };
77
+
78
+ export default function FiltersPanel( {
79
+ as: Wrapper = FiltersToolsPanel,
80
+ value,
81
+ onChange,
82
+ inheritedValue = value,
83
+ settings,
84
+ panelId,
85
+ defaultControls = DEFAULT_CONTROLS,
86
+ } ) {
87
+ const decodeValue = ( rawValue ) =>
88
+ getValueFromVariable( { settings }, '', rawValue );
89
+
90
+ // Duotone
91
+ const hasDuotoneEnabled = useHasDuotoneControl( settings );
92
+ const duotonePalette = useMultiOriginColorPresets( settings, {
93
+ presetSetting: 'duotone',
94
+ defaultSetting: 'defaultDuotone',
95
+ } );
96
+ const colorPalette = useMultiOriginColorPresets( settings, {
97
+ presetSetting: 'palette',
98
+ defaultSetting: 'defaultPalette',
99
+ } );
100
+ const duotone = decodeValue( inheritedValue?.filter?.duotone );
101
+ const setDuotone = ( newValue ) => {
102
+ const duotonePreset = duotonePalette.find( ( { colors } ) => {
103
+ return colors === newValue;
104
+ } );
105
+ const settedValue = duotonePreset
106
+ ? `var:preset|duotone|${ duotonePreset.slug }`
107
+ : newValue;
108
+ onChange( immutableSet( value, [ 'filter', 'duotone' ], settedValue ) );
109
+ };
110
+ const hasDuotone = () => !! value?.filter?.duotone;
111
+ const resetDuotone = () => setDuotone( undefined );
112
+
113
+ const resetAllFilter = useCallback( ( previousValue ) => {
114
+ return {
115
+ ...previousValue,
116
+ filter: {
117
+ ...previousValue.filter,
118
+ duotone: undefined,
119
+ },
120
+ };
121
+ }, [] );
122
+
123
+ return (
124
+ <Wrapper
125
+ resetAllFilter={ resetAllFilter }
126
+ value={ value }
127
+ onChange={ onChange }
128
+ panelId={ panelId }
129
+ >
130
+ { hasDuotoneEnabled && (
131
+ <ToolsPanelItem
132
+ label={ __( 'Duotone' ) }
133
+ hasValue={ hasDuotone }
134
+ onDeselect={ resetDuotone }
135
+ isShownByDefault={ defaultControls.duotone }
136
+ panelId={ panelId }
137
+ >
138
+ <VStack>
139
+ <p>
140
+ { __(
141
+ 'Create a two-tone color effect without losing your original image.'
142
+ ) }
143
+ </p>
144
+ <DuotonePicker
145
+ colorPalette={ colorPalette }
146
+ duotonePalette={ duotonePalette }
147
+ disableCustomColors={ true }
148
+ disableCustomDuotone={ true }
149
+ value={ duotone }
150
+ onChange={ setDuotone }
151
+ />
152
+ </VStack>
153
+ </ToolsPanelItem>
154
+ ) }
155
+ </Wrapper>
156
+ );
157
+ }
@@ -0,0 +1,118 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { get, isEmpty } from 'lodash';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { scopeSelector } from './utils';
10
+
11
+ /**
12
+ * Determine the CSS selector for the block type and target provided, returning
13
+ * it if available.
14
+ *
15
+ * @param {import('@wordpress/blocks').Block} blockType The block's type.
16
+ * @param {string|string[]} target The desired selector's target e.g. `root`, delimited string, or array path.
17
+ * @param {Object} options Options object.
18
+ * @param {boolean} options.fallback Whether or not to fallback to broader selector.
19
+ *
20
+ * @return {?string} The CSS selector or `null` if no selector available.
21
+ */
22
+ export function getBlockCSSSelector(
23
+ blockType,
24
+ target = 'root',
25
+ options = {}
26
+ ) {
27
+ if ( ! target ) {
28
+ return null;
29
+ }
30
+
31
+ const { fallback = false } = options;
32
+ const { name, selectors, supports } = blockType;
33
+
34
+ const hasSelectors = ! isEmpty( selectors );
35
+ const path = Array.isArray( target ) ? target.join( '.' ) : target;
36
+
37
+ // Root selector.
38
+
39
+ // Calculated before returning as it can be used as a fallback for feature
40
+ // selectors later on.
41
+ let rootSelector = null;
42
+
43
+ if ( hasSelectors && selectors.root ) {
44
+ // Use the selectors API if available.
45
+ rootSelector = selectors?.root;
46
+ } else if ( supports?.__experimentalSelector ) {
47
+ // Use the old experimental selector supports property if set.
48
+ rootSelector = supports.__experimentalSelector;
49
+ } else {
50
+ // If no root selector found, generate default block class selector.
51
+ rootSelector =
52
+ '.wp-block-' + name.replace( 'core/', '' ).replace( '/', '-' );
53
+ }
54
+
55
+ // Return selector if it's the root target we are looking for.
56
+ if ( path === 'root' ) {
57
+ return rootSelector;
58
+ }
59
+
60
+ // If target is not `root` or `duotone` we have a feature or subfeature
61
+ // as the target. If the target is a string convert to an array.
62
+ const pathArray = Array.isArray( target ) ? target : target.split( '.' );
63
+
64
+ // Feature selectors ( may fallback to root selector );
65
+ if ( pathArray.length === 1 ) {
66
+ const fallbackSelector = fallback ? rootSelector : null;
67
+
68
+ // Prefer the selectors API if available.
69
+ if ( hasSelectors ) {
70
+ // Get selector from either `feature.root` or shorthand path.
71
+ const featureSelector =
72
+ get( selectors, `${ path }.root`, null ) ||
73
+ get( selectors, path, null );
74
+
75
+ // Return feature selector if found or any available fallback.
76
+ return featureSelector || fallbackSelector;
77
+ }
78
+
79
+ // Try getting old experimental supports selector value.
80
+ const featureSelector = get(
81
+ supports,
82
+ `${ path }.__experimentalSelector`,
83
+ null
84
+ );
85
+
86
+ // If nothing to work with, provide fallback selector if available.
87
+ if ( ! featureSelector ) {
88
+ return fallbackSelector;
89
+ }
90
+
91
+ // Scope the feature selector by the block's root selector.
92
+ return scopeSelector( rootSelector, featureSelector );
93
+ }
94
+
95
+ // Subfeature selector.
96
+ // This may fallback either to parent feature or root selector.
97
+ let subfeatureSelector;
98
+
99
+ // Use selectors API if available.
100
+ if ( hasSelectors ) {
101
+ subfeatureSelector = get( selectors, path, null );
102
+ }
103
+
104
+ // Only return if we have a subfeature selector.
105
+ if ( subfeatureSelector ) {
106
+ return subfeatureSelector;
107
+ }
108
+
109
+ // To this point we don't have a subfeature selector. If a fallback has been
110
+ // requested, remove subfeature from target path and return results of a
111
+ // call for the parent feature's selector.
112
+ if ( fallback ) {
113
+ return getBlockCSSSelector( blockType, pathArray[ 0 ], options );
114
+ }
115
+
116
+ // We tried.
117
+ return null;
118
+ }