@wordpress/block-editor 12.20.0 → 12.21.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 (471) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/block-actions/index.js +45 -32
  3. package/build/components/block-actions/index.js.map +1 -1
  4. package/build/components/block-bindings-toolbar-indicator/index.js +25 -0
  5. package/build/components/block-bindings-toolbar-indicator/index.js.map +1 -0
  6. package/build/components/block-edit/context.js +2 -1
  7. package/build/components/block-edit/context.js.map +1 -1
  8. package/build/components/block-edit/index.js +8 -3
  9. package/build/components/block-edit/index.js.map +1 -1
  10. package/build/components/block-inspector/index.js +5 -4
  11. package/build/components/block-inspector/index.js.map +1 -1
  12. package/build/components/block-list/block-invalid-warning.native.js.map +1 -1
  13. package/build/components/block-list/block-list-item.native.js +1 -1
  14. package/build/components/block-list/block-list-item.native.js.map +1 -1
  15. package/build/components/block-list/block-outline.native.js +23 -7
  16. package/build/components/block-list/block-outline.native.js.map +1 -1
  17. package/build/components/block-list/block-selection-button.native.js.map +1 -1
  18. package/build/components/block-list/block.native.js +0 -3
  19. package/build/components/block-list/block.native.js.map +1 -1
  20. package/build/components/block-list/use-block-props/index.js +8 -1
  21. package/build/components/block-list/use-block-props/index.js.map +1 -1
  22. package/build/components/block-list/use-block-props/use-selected-block-event-handlers.js +3 -3
  23. package/build/components/block-list/use-block-props/use-selected-block-event-handlers.js.map +1 -1
  24. package/build/components/block-mover/index.native.js.map +1 -1
  25. package/build/components/block-popover/cover.js +68 -0
  26. package/build/components/block-popover/cover.js.map +1 -0
  27. package/build/components/block-popover/drop-zone.js +2 -3
  28. package/build/components/block-popover/drop-zone.js.map +1 -1
  29. package/build/components/block-popover/index.js +1 -19
  30. package/build/components/block-popover/index.js.map +1 -1
  31. package/build/components/block-preview/index.js +2 -1
  32. package/build/components/block-preview/index.js.map +1 -1
  33. package/build/components/block-removal-warning-modal/index.js +2 -4
  34. package/build/components/block-removal-warning-modal/index.js.map +1 -1
  35. package/build/components/block-rename/modal.js.map +1 -1
  36. package/build/components/block-settings-menu/block-settings-dropdown.js +12 -10
  37. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  38. package/build/components/block-switcher/block-transformations-menu.native.js.map +1 -1
  39. package/build/components/block-toolbar/block-toolbar-menu.native.js.map +1 -1
  40. package/build/components/block-toolbar/index.js +21 -10
  41. package/build/components/block-toolbar/index.js.map +1 -1
  42. package/build/components/block-toolbar/shuffle.js +89 -0
  43. package/build/components/block-toolbar/shuffle.js.map +1 -0
  44. package/build/components/block-toolbar/use-has-block-toolbar.js +43 -0
  45. package/build/components/block-toolbar/use-has-block-toolbar.js.map +1 -0
  46. package/build/components/block-tools/block-selection-button.js +5 -1
  47. package/build/components/block-tools/block-selection-button.js.map +1 -1
  48. package/build/components/block-tools/empty-block-inserter.js +2 -5
  49. package/build/components/block-tools/empty-block-inserter.js.map +1 -1
  50. package/build/components/block-tools/index.js +9 -26
  51. package/build/components/block-tools/index.js.map +1 -1
  52. package/build/components/block-tools/use-show-block-tools.js +60 -0
  53. package/build/components/block-tools/use-show-block-tools.js.map +1 -0
  54. package/build/components/caption/index.native.js.map +1 -1
  55. package/build/components/child-layout-control/index.js.map +1 -1
  56. package/build/components/color-palette/control.js.map +1 -1
  57. package/build/components/colors-gradients/control.js +1 -1
  58. package/build/components/colors-gradients/control.js.map +1 -1
  59. package/build/components/global-styles/border-panel.js +21 -8
  60. package/build/components/global-styles/border-panel.js.map +1 -1
  61. package/build/components/global-styles/color-panel.js +1 -1
  62. package/build/components/global-styles/color-panel.js.map +1 -1
  63. package/build/components/global-styles/image-settings-panel.js.map +1 -1
  64. package/build/components/global-styles/index.js +6 -0
  65. package/build/components/global-styles/index.js.map +1 -1
  66. package/build/components/global-styles/shadow-panel-components.js +80 -23
  67. package/build/components/global-styles/shadow-panel-components.js.map +1 -1
  68. package/build/components/global-styles/typography-utils.js +7 -5
  69. package/build/components/global-styles/typography-utils.js.map +1 -1
  70. package/build/components/global-styles/use-global-styles-output.js +15 -15
  71. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  72. package/build/components/global-styles/utils.js +1 -1
  73. package/build/components/global-styles/utils.js.map +1 -1
  74. package/build/components/grid-visualizer/grid-item-resizer.js +77 -0
  75. package/build/components/grid-visualizer/grid-item-resizer.js.map +1 -0
  76. package/build/components/grid-visualizer/grid-visualizer.js +81 -0
  77. package/build/components/grid-visualizer/grid-visualizer.js.map +1 -0
  78. package/build/components/grid-visualizer/index.js +20 -0
  79. package/build/components/grid-visualizer/index.js.map +1 -0
  80. package/build/components/grid-visualizer/utils.js +10 -0
  81. package/build/components/grid-visualizer/utils.js.map +1 -0
  82. package/build/components/iframe/index.js +61 -16
  83. package/build/components/iframe/index.js.map +1 -1
  84. package/build/components/index.native.js +7 -0
  85. package/build/components/index.native.js.map +1 -1
  86. package/build/components/inner-blocks/use-nested-settings-update.js +8 -2
  87. package/build/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  88. package/build/components/inserter/media-tab/media-preview.js.map +1 -1
  89. package/build/components/inserter/menu.js +9 -3
  90. package/build/components/inserter/menu.js.map +1 -1
  91. package/build/components/inserter/menu.native.js.map +1 -1
  92. package/build/components/inserter/mobile-tab-navigation.js +1 -1
  93. package/build/components/inserter/mobile-tab-navigation.js.map +1 -1
  94. package/build/components/inserter/search-results.js +3 -2
  95. package/build/components/inserter/search-results.js.map +1 -1
  96. package/build/components/inserter/tabs.js +2 -1
  97. package/build/components/inserter/tabs.js.map +1 -1
  98. package/build/components/inspector-controls/block-support-tools-panel.js.map +1 -1
  99. package/build/components/inspector-controls-tabs/index.js +1 -1
  100. package/build/components/inspector-controls-tabs/index.js.map +1 -1
  101. package/build/components/inspector-controls-tabs/styles-tab.js +1 -1
  102. package/build/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  103. package/build/components/link-control/link-preview.js +4 -1
  104. package/build/components/link-control/link-preview.js.map +1 -1
  105. package/build/components/link-control/search-input.js.map +1 -1
  106. package/build/components/list-view/block-select-button.js +10 -2
  107. package/build/components/list-view/block-select-button.js.map +1 -1
  108. package/build/components/list-view/branch.js.map +1 -1
  109. package/build/components/list-view/drop-indicator.js.map +1 -1
  110. package/build/components/list-view/index.js.map +1 -1
  111. package/build/components/list-view/use-clipboard-handler.js +2 -1
  112. package/build/components/list-view/use-clipboard-handler.js.map +1 -1
  113. package/build/components/panel-color-settings/index.js.map +1 -1
  114. package/build/components/provider/index.js.map +1 -1
  115. package/build/components/resizable-box-popover/index.js +3 -5
  116. package/build/components/resizable-box-popover/index.js.map +1 -1
  117. package/build/components/responsive-block-control/index.js +1 -1
  118. package/build/components/responsive-block-control/index.js.map +1 -1
  119. package/build/components/rich-text/index.js +46 -26
  120. package/build/components/rich-text/index.js.map +1 -1
  121. package/build/components/rich-text/use-enter.js +3 -0
  122. package/build/components/rich-text/use-enter.js.map +1 -1
  123. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  124. package/build/components/url-popover/index.js +3 -3
  125. package/build/components/url-popover/index.js.map +1 -1
  126. package/build/components/writing-flow/use-clipboard-handler.js +2 -1
  127. package/build/components/writing-flow/use-clipboard-handler.js.map +1 -1
  128. package/build/components/writing-flow/utils.js +23 -6
  129. package/build/components/writing-flow/utils.js.map +1 -1
  130. package/build/hooks/background.js.map +1 -1
  131. package/build/hooks/block-hooks.js +34 -8
  132. package/build/hooks/block-hooks.js.map +1 -1
  133. package/build/hooks/border.js +6 -4
  134. package/build/hooks/border.js.map +1 -1
  135. package/build/hooks/dimensions.js +3 -4
  136. package/build/hooks/dimensions.js.map +1 -1
  137. package/build/hooks/font-size.js +6 -7
  138. package/build/hooks/font-size.js.map +1 -1
  139. package/build/hooks/index.js +1 -1
  140. package/build/hooks/index.js.map +1 -1
  141. package/build/hooks/layout-child.js +39 -0
  142. package/build/hooks/layout-child.js.map +1 -1
  143. package/build/hooks/layout.js +11 -4
  144. package/build/hooks/layout.js.map +1 -1
  145. package/build/hooks/line-height.js.map +1 -1
  146. package/build/hooks/spacing-visualizer.js +115 -0
  147. package/build/hooks/spacing-visualizer.js.map +1 -0
  148. package/build/hooks/use-bindings-attributes.js +171 -48
  149. package/build/hooks/use-bindings-attributes.js.map +1 -1
  150. package/build/hooks/use-typography-props.js +1 -2
  151. package/build/hooks/use-typography-props.js.map +1 -1
  152. package/build/layouts/grid.js +6 -2
  153. package/build/layouts/grid.js.map +1 -1
  154. package/build/private-apis.js +7 -3
  155. package/build/private-apis.js.map +1 -1
  156. package/build/store/actions.js +42 -12
  157. package/build/store/actions.js.map +1 -1
  158. package/build/store/private-actions.js +29 -55
  159. package/build/store/private-actions.js.map +1 -1
  160. package/build/store/private-selectors.js +0 -8
  161. package/build/store/private-selectors.js.map +1 -1
  162. package/build/store/reducer.js +3 -20
  163. package/build/store/reducer.js.map +1 -1
  164. package/build/store/selectors.js +27 -15
  165. package/build/store/selectors.js.map +1 -1
  166. package/build/utils/calculate-scale.js +17 -0
  167. package/build/utils/calculate-scale.js.map +1 -0
  168. package/build-module/components/block-actions/index.js +45 -32
  169. package/build-module/components/block-actions/index.js.map +1 -1
  170. package/build-module/components/block-bindings-toolbar-indicator/index.js +18 -0
  171. package/build-module/components/block-bindings-toolbar-indicator/index.js.map +1 -0
  172. package/build-module/components/block-edit/context.js +1 -0
  173. package/build-module/components/block-edit/context.js.map +1 -1
  174. package/build-module/components/block-edit/index.js +9 -4
  175. package/build-module/components/block-edit/index.js.map +1 -1
  176. package/build-module/components/block-inspector/index.js +6 -5
  177. package/build-module/components/block-inspector/index.js.map +1 -1
  178. package/build-module/components/block-list/block-invalid-warning.native.js.map +1 -1
  179. package/build-module/components/block-list/block-list-item.native.js +1 -1
  180. package/build-module/components/block-list/block-list-item.native.js.map +1 -1
  181. package/build-module/components/block-list/block-outline.native.js +23 -7
  182. package/build-module/components/block-list/block-outline.native.js.map +1 -1
  183. package/build-module/components/block-list/block-selection-button.native.js.map +1 -1
  184. package/build-module/components/block-list/block.native.js +0 -3
  185. package/build-module/components/block-list/block.native.js.map +1 -1
  186. package/build-module/components/block-list/use-block-props/index.js +9 -2
  187. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  188. package/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js +3 -3
  189. package/build-module/components/block-list/use-block-props/use-selected-block-event-handlers.js.map +1 -1
  190. package/build-module/components/block-mover/index.native.js.map +1 -1
  191. package/build-module/components/block-popover/cover.js +60 -0
  192. package/build-module/components/block-popover/cover.js.map +1 -0
  193. package/build-module/components/block-popover/drop-zone.js +2 -3
  194. package/build-module/components/block-popover/drop-zone.js.map +1 -1
  195. package/build-module/components/block-popover/index.js +1 -19
  196. package/build-module/components/block-popover/index.js.map +1 -1
  197. package/build-module/components/block-preview/index.js +2 -1
  198. package/build-module/components/block-preview/index.js.map +1 -1
  199. package/build-module/components/block-removal-warning-modal/index.js +3 -5
  200. package/build-module/components/block-removal-warning-modal/index.js.map +1 -1
  201. package/build-module/components/block-rename/modal.js.map +1 -1
  202. package/build-module/components/block-settings-menu/block-settings-dropdown.js +12 -10
  203. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  204. package/build-module/components/block-switcher/block-transformations-menu.native.js.map +1 -1
  205. package/build-module/components/block-toolbar/block-toolbar-menu.native.js.map +1 -1
  206. package/build-module/components/block-toolbar/index.js +21 -11
  207. package/build-module/components/block-toolbar/index.js.map +1 -1
  208. package/build-module/components/block-toolbar/shuffle.js +82 -0
  209. package/build-module/components/block-toolbar/shuffle.js.map +1 -0
  210. package/build-module/components/block-toolbar/use-has-block-toolbar.js +36 -0
  211. package/build-module/components/block-toolbar/use-has-block-toolbar.js.map +1 -0
  212. package/build-module/components/block-tools/block-selection-button.js +5 -1
  213. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  214. package/build-module/components/block-tools/empty-block-inserter.js +2 -5
  215. package/build-module/components/block-tools/empty-block-inserter.js.map +1 -1
  216. package/build-module/components/block-tools/index.js +9 -26
  217. package/build-module/components/block-tools/index.js.map +1 -1
  218. package/build-module/components/block-tools/use-show-block-tools.js +54 -0
  219. package/build-module/components/block-tools/use-show-block-tools.js.map +1 -0
  220. package/build-module/components/caption/index.native.js.map +1 -1
  221. package/build-module/components/child-layout-control/index.js.map +1 -1
  222. package/build-module/components/color-palette/control.js.map +1 -1
  223. package/build-module/components/colors-gradients/control.js +1 -1
  224. package/build-module/components/colors-gradients/control.js.map +1 -1
  225. package/build-module/components/global-styles/border-panel.js +22 -10
  226. package/build-module/components/global-styles/border-panel.js.map +1 -1
  227. package/build-module/components/global-styles/color-panel.js +1 -1
  228. package/build-module/components/global-styles/color-panel.js.map +1 -1
  229. package/build-module/components/global-styles/image-settings-panel.js.map +1 -1
  230. package/build-module/components/global-styles/index.js +1 -1
  231. package/build-module/components/global-styles/index.js.map +1 -1
  232. package/build-module/components/global-styles/shadow-panel-components.js +82 -24
  233. package/build-module/components/global-styles/shadow-panel-components.js.map +1 -1
  234. package/build-module/components/global-styles/typography-utils.js +7 -5
  235. package/build-module/components/global-styles/typography-utils.js.map +1 -1
  236. package/build-module/components/global-styles/use-global-styles-output.js +16 -16
  237. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  238. package/build-module/components/global-styles/utils.js +2 -2
  239. package/build-module/components/global-styles/utils.js.map +1 -1
  240. package/build-module/components/grid-visualizer/grid-item-resizer.js +69 -0
  241. package/build-module/components/grid-visualizer/grid-item-resizer.js.map +1 -0
  242. package/build-module/components/grid-visualizer/grid-visualizer.js +73 -0
  243. package/build-module/components/grid-visualizer/grid-visualizer.js.map +1 -0
  244. package/build-module/components/grid-visualizer/index.js +3 -0
  245. package/build-module/components/grid-visualizer/index.js.map +1 -0
  246. package/build-module/components/grid-visualizer/utils.js +4 -0
  247. package/build-module/components/grid-visualizer/utils.js.map +1 -0
  248. package/build-module/components/iframe/index.js +61 -16
  249. package/build-module/components/iframe/index.js.map +1 -1
  250. package/build-module/components/index.native.js +1 -1
  251. package/build-module/components/index.native.js.map +1 -1
  252. package/build-module/components/inner-blocks/use-nested-settings-update.js +8 -2
  253. package/build-module/components/inner-blocks/use-nested-settings-update.js.map +1 -1
  254. package/build-module/components/inserter/media-tab/media-preview.js.map +1 -1
  255. package/build-module/components/inserter/menu.js +9 -3
  256. package/build-module/components/inserter/menu.js.map +1 -1
  257. package/build-module/components/inserter/menu.native.js.map +1 -1
  258. package/build-module/components/inserter/mobile-tab-navigation.js +1 -1
  259. package/build-module/components/inserter/mobile-tab-navigation.js.map +1 -1
  260. package/build-module/components/inserter/search-results.js +3 -2
  261. package/build-module/components/inserter/search-results.js.map +1 -1
  262. package/build-module/components/inserter/tabs.js +2 -1
  263. package/build-module/components/inserter/tabs.js.map +1 -1
  264. package/build-module/components/inspector-controls/block-support-tools-panel.js.map +1 -1
  265. package/build-module/components/inspector-controls-tabs/index.js +1 -1
  266. package/build-module/components/inspector-controls-tabs/index.js.map +1 -1
  267. package/build-module/components/inspector-controls-tabs/styles-tab.js +2 -2
  268. package/build-module/components/inspector-controls-tabs/styles-tab.js.map +1 -1
  269. package/build-module/components/link-control/link-preview.js +5 -2
  270. package/build-module/components/link-control/link-preview.js.map +1 -1
  271. package/build-module/components/link-control/search-input.js.map +1 -1
  272. package/build-module/components/list-view/block-select-button.js +11 -3
  273. package/build-module/components/list-view/block-select-button.js.map +1 -1
  274. package/build-module/components/list-view/branch.js.map +1 -1
  275. package/build-module/components/list-view/drop-indicator.js.map +1 -1
  276. package/build-module/components/list-view/index.js.map +1 -1
  277. package/build-module/components/list-view/use-clipboard-handler.js +3 -2
  278. package/build-module/components/list-view/use-clipboard-handler.js.map +1 -1
  279. package/build-module/components/panel-color-settings/index.js.map +1 -1
  280. package/build-module/components/provider/index.js.map +1 -1
  281. package/build-module/components/resizable-box-popover/index.js +3 -5
  282. package/build-module/components/resizable-box-popover/index.js.map +1 -1
  283. package/build-module/components/responsive-block-control/index.js +1 -1
  284. package/build-module/components/responsive-block-control/index.js.map +1 -1
  285. package/build-module/components/rich-text/index.js +47 -28
  286. package/build-module/components/rich-text/index.js.map +1 -1
  287. package/build-module/components/rich-text/use-enter.js +3 -0
  288. package/build-module/components/rich-text/use-enter.js.map +1 -1
  289. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  290. package/build-module/components/url-popover/index.js +3 -3
  291. package/build-module/components/url-popover/index.js.map +1 -1
  292. package/build-module/components/writing-flow/use-clipboard-handler.js +3 -2
  293. package/build-module/components/writing-flow/use-clipboard-handler.js.map +1 -1
  294. package/build-module/components/writing-flow/utils.js +22 -7
  295. package/build-module/components/writing-flow/utils.js.map +1 -1
  296. package/build-module/hooks/background.js.map +1 -1
  297. package/build-module/hooks/block-hooks.js +34 -8
  298. package/build-module/hooks/block-hooks.js.map +1 -1
  299. package/build-module/hooks/border.js +7 -5
  300. package/build-module/hooks/border.js.map +1 -1
  301. package/build-module/hooks/dimensions.js +1 -2
  302. package/build-module/hooks/dimensions.js.map +1 -1
  303. package/build-module/hooks/font-size.js +7 -8
  304. package/build-module/hooks/font-size.js.map +1 -1
  305. package/build-module/hooks/index.js +1 -1
  306. package/build-module/hooks/index.js.map +1 -1
  307. package/build-module/hooks/layout-child.js +39 -0
  308. package/build-module/hooks/layout-child.js.map +1 -1
  309. package/build-module/hooks/layout.js +11 -4
  310. package/build-module/hooks/layout.js.map +1 -1
  311. package/build-module/hooks/line-height.js.map +1 -1
  312. package/build-module/hooks/spacing-visualizer.js +106 -0
  313. package/build-module/hooks/spacing-visualizer.js.map +1 -0
  314. package/build-module/hooks/use-bindings-attributes.js +172 -49
  315. package/build-module/hooks/use-bindings-attributes.js.map +1 -1
  316. package/build-module/hooks/use-typography-props.js +2 -3
  317. package/build-module/hooks/use-typography-props.js.map +1 -1
  318. package/build-module/layouts/grid.js +6 -2
  319. package/build-module/layouts/grid.js.map +1 -1
  320. package/build-module/private-apis.js +7 -3
  321. package/build-module/private-apis.js.map +1 -1
  322. package/build-module/store/actions.js +42 -12
  323. package/build-module/store/actions.js.map +1 -1
  324. package/build-module/store/private-actions.js +29 -54
  325. package/build-module/store/private-actions.js.map +1 -1
  326. package/build-module/store/private-selectors.js +0 -6
  327. package/build-module/store/private-selectors.js.map +1 -1
  328. package/build-module/store/reducer.js +3 -20
  329. package/build-module/store/reducer.js.map +1 -1
  330. package/build-module/store/selectors.js +23 -13
  331. package/build-module/store/selectors.js.map +1 -1
  332. package/build-module/utils/calculate-scale.js +11 -0
  333. package/build-module/utils/calculate-scale.js.map +1 -0
  334. package/build-style/content-rtl.css +8 -2
  335. package/build-style/content.css +8 -2
  336. package/build-style/default-editor-styles-rtl.css +1 -0
  337. package/build-style/default-editor-styles.css +1 -0
  338. package/build-style/style-rtl.css +113 -22
  339. package/build-style/style.css +113 -22
  340. package/package.json +31 -31
  341. package/src/components/block-actions/index.js +57 -47
  342. package/src/components/block-bindings-toolbar-indicator/index.js +20 -0
  343. package/src/components/block-bindings-toolbar-indicator/style.scss +14 -0
  344. package/src/components/block-draggable/test/index.native.js +2 -2
  345. package/src/components/block-edit/context.js +1 -0
  346. package/src/components/block-edit/index.js +5 -1
  347. package/src/components/block-inspector/index.js +7 -5
  348. package/src/components/block-list/block-invalid-warning.native.js +1 -1
  349. package/src/components/block-list/block-list-item.native.js +1 -1
  350. package/src/components/block-list/block-outline.native.js +36 -21
  351. package/src/components/block-list/block-selection-button.native.js +1 -3
  352. package/src/components/block-list/block.native.js +0 -3
  353. package/src/components/block-list/content.scss +5 -1
  354. package/src/components/block-list/test/block-outline.native.js +255 -0
  355. package/src/components/block-list/use-block-props/index.js +12 -2
  356. package/src/components/block-list/use-block-props/use-selected-block-event-handlers.js +3 -7
  357. package/src/components/block-mover/index.native.js +1 -1
  358. package/src/components/block-popover/cover.js +63 -0
  359. package/src/components/block-popover/drop-zone.js +3 -4
  360. package/src/components/block-popover/index.js +1 -28
  361. package/src/components/block-preview/index.js +3 -1
  362. package/src/components/block-removal-warning-modal/index.js +5 -19
  363. package/src/components/block-rename/modal.js +1 -1
  364. package/src/components/block-settings-menu/block-settings-dropdown.js +12 -9
  365. package/src/components/block-switcher/block-transformations-menu.native.js +1 -1
  366. package/src/components/block-toolbar/block-toolbar-menu.native.js +2 -2
  367. package/src/components/block-toolbar/index.js +19 -15
  368. package/src/components/block-toolbar/shuffle.js +93 -0
  369. package/src/components/block-toolbar/use-has-block-toolbar.js +49 -0
  370. package/src/components/block-tools/block-selection-button.js +4 -0
  371. package/src/components/block-tools/empty-block-inserter.js +3 -6
  372. package/src/components/block-tools/index.js +13 -36
  373. package/src/components/block-tools/use-show-block-tools.js +73 -0
  374. package/src/components/caption/index.native.js +1 -1
  375. package/src/components/child-layout-control/index.js +1 -1
  376. package/src/components/color-palette/control.js +1 -1
  377. package/src/components/colors-gradients/control.js +1 -1
  378. package/src/components/colors-gradients/test/control.js +2 -2
  379. package/src/components/contrast-checker/test/index.js +10 -10
  380. package/src/components/default-block-appender/content.scss +5 -2
  381. package/src/components/global-styles/border-panel.js +35 -24
  382. package/src/components/global-styles/color-panel.js +1 -1
  383. package/src/components/global-styles/image-settings-panel.js +1 -1
  384. package/src/components/global-styles/index.js +5 -1
  385. package/src/components/global-styles/shadow-panel-components.js +92 -23
  386. package/src/components/global-styles/style.scss +33 -10
  387. package/src/components/global-styles/test/typography-utils.js +231 -81
  388. package/src/components/global-styles/typography-utils.js +10 -7
  389. package/src/components/global-styles/use-global-styles-output.js +14 -16
  390. package/src/components/global-styles/utils.js +2 -8
  391. package/src/components/grid-visualizer/grid-item-resizer.js +100 -0
  392. package/src/components/grid-visualizer/grid-visualizer.js +81 -0
  393. package/src/components/grid-visualizer/index.js +2 -0
  394. package/src/components/grid-visualizer/style.scss +33 -0
  395. package/src/components/grid-visualizer/utils.js +5 -0
  396. package/src/components/iframe/index.js +78 -31
  397. package/src/components/index.native.js +1 -0
  398. package/src/components/inner-blocks/use-nested-settings-update.js +12 -2
  399. package/src/components/inserter/media-tab/media-preview.js +1 -1
  400. package/src/components/inserter/menu.js +10 -4
  401. package/src/components/inserter/menu.native.js +3 -3
  402. package/src/components/inserter/mobile-tab-navigation.js +1 -1
  403. package/src/components/inserter/search-results.js +2 -1
  404. package/src/components/inserter/style.scss +10 -0
  405. package/src/components/inserter/tabs.js +2 -1
  406. package/src/components/inspector-controls/block-support-tools-panel.js +2 -2
  407. package/src/components/inspector-controls-tabs/index.js +1 -1
  408. package/src/components/inspector-controls-tabs/styles-tab.js +2 -2
  409. package/src/components/line-height-control/test/index.js +1 -1
  410. package/src/components/link-control/link-preview.js +9 -2
  411. package/src/components/link-control/search-input.js +1 -1
  412. package/src/components/link-control/style.scss +9 -0
  413. package/src/components/list-view/block-select-button.js +16 -2
  414. package/src/components/list-view/branch.js +1 -1
  415. package/src/components/list-view/drop-indicator.js +1 -1
  416. package/src/components/list-view/index.js +1 -1
  417. package/src/components/list-view/style.scss +8 -0
  418. package/src/components/list-view/use-clipboard-handler.js +3 -2
  419. package/src/components/panel-color-settings/index.js +1 -1
  420. package/src/components/panel-color-settings/test/index.js +3 -3
  421. package/src/components/provider/index.js +1 -4
  422. package/src/components/resizable-box-popover/index.js +4 -6
  423. package/src/components/responsive-block-control/README.md +4 -4
  424. package/src/components/responsive-block-control/index.js +1 -1
  425. package/src/components/responsive-block-control/test/index.js +5 -5
  426. package/src/components/rich-text/index.js +76 -53
  427. package/src/components/rich-text/use-enter.js +4 -0
  428. package/src/components/spacing-sizes-control/input-controls/spacing-input-control.js +4 -4
  429. package/src/components/url-popover/index.js +5 -5
  430. package/src/components/url-popover/style.scss +1 -0
  431. package/src/components/writing-flow/use-clipboard-handler.js +3 -2
  432. package/src/components/writing-flow/utils.js +31 -16
  433. package/src/hooks/background.js +1 -1
  434. package/src/hooks/block-hooks.js +47 -9
  435. package/src/hooks/block-hooks.scss +6 -0
  436. package/src/hooks/border.js +16 -4
  437. package/src/hooks/dimensions.js +1 -2
  438. package/src/hooks/font-size.js +7 -12
  439. package/src/hooks/index.js +1 -0
  440. package/src/hooks/layout-child.js +38 -0
  441. package/src/hooks/layout.js +12 -1
  442. package/src/hooks/line-height.js +1 -1
  443. package/src/hooks/spacing-visualizer.js +126 -0
  444. package/src/hooks/{padding.scss → spacing.scss} +1 -1
  445. package/src/hooks/use-bindings-attributes.js +215 -65
  446. package/src/hooks/use-typography-props.js +2 -8
  447. package/src/layouts/grid.js +8 -3
  448. package/src/private-apis.js +6 -2
  449. package/src/store/actions.js +56 -18
  450. package/src/store/private-actions.js +34 -79
  451. package/src/store/private-selectors.js +0 -8
  452. package/src/store/reducer.js +2 -23
  453. package/src/store/selectors.js +41 -46
  454. package/src/store/test/actions.js +0 -4
  455. package/src/style.scss +3 -1
  456. package/src/utils/calculate-scale.js +20 -0
  457. package/build/hooks/margin.js +0 -86
  458. package/build/hooks/margin.js.map +0 -1
  459. package/build/hooks/padding.js +0 -78
  460. package/build/hooks/padding.js.map +0 -1
  461. package/build/utils/use-can-block-toolbar-be-focused.js +0 -46
  462. package/build/utils/use-can-block-toolbar-be-focused.js.map +0 -1
  463. package/build-module/hooks/margin.js +0 -78
  464. package/build-module/hooks/margin.js.map +0 -1
  465. package/build-module/hooks/padding.js +0 -70
  466. package/build-module/hooks/padding.js.map +0 -1
  467. package/build-module/utils/use-can-block-toolbar-be-focused.js +0 -40
  468. package/build-module/utils/use-can-block-toolbar-be-focused.js.map +0 -1
  469. package/src/hooks/margin.js +0 -91
  470. package/src/hooks/padding.js +0 -82
  471. package/src/utils/use-can-block-toolbar-be-focused.js +0 -48
@@ -6,7 +6,7 @@ import classnames from 'classnames';
6
6
  /**
7
7
  * Internal dependencies
8
8
  */
9
- import BlockPopover from '../block-popover';
9
+ import BlockPopoverCover from '../block-popover/cover';
10
10
  import useBlockToolbarPopoverProps from './use-block-toolbar-popover-props';
11
11
  import Inserter from '../inserter';
12
12
  import useSelectedBlockToolProps from './use-selected-block-tool-props';
@@ -28,9 +28,8 @@ export default function EmptyBlockInserter( {
28
28
  } );
29
29
 
30
30
  return (
31
- <BlockPopover
31
+ <BlockPopoverCover
32
32
  clientId={ capturingClientId || clientId }
33
- __unstableCoverTarget
34
33
  bottomClientId={ lastClientId }
35
34
  className={ classnames(
36
35
  'block-editor-block-list__block-side-inserter-popover',
@@ -39,8 +38,6 @@ export default function EmptyBlockInserter( {
39
38
  }
40
39
  ) }
41
40
  __unstableContentRef={ __unstableContentRef }
42
- resize={ false }
43
- shift={ false }
44
41
  { ...popoverProps }
45
42
  >
46
43
  <div className="block-editor-block-list__empty-block-inserter">
@@ -51,6 +48,6 @@ export default function EmptyBlockInserter( {
51
48
  __experimentalIsQuick
52
49
  />
53
50
  </div>
54
- </BlockPopover>
51
+ </BlockPopoverCover>
55
52
  );
56
53
  }
@@ -5,7 +5,6 @@ import { useSelect, useDispatch } from '@wordpress/data';
5
5
  import { Popover } from '@wordpress/components';
6
6
  import { __unstableUseShortcutEventMatch as useShortcutEventMatch } from '@wordpress/keyboard-shortcuts';
7
7
  import { useRef } from '@wordpress/element';
8
- import { isUnmodifiedDefaultBlock } from '@wordpress/blocks';
9
8
 
10
9
  /**
11
10
  * Internal dependencies
@@ -20,14 +19,13 @@ import BlockToolbarBreadcrumb from './block-toolbar-breadcrumb';
20
19
  import { store as blockEditorStore } from '../../store';
21
20
  import usePopoverScroll from '../block-popover/use-popover-scroll';
22
21
  import ZoomOutModeInserters from './zoom-out-mode-inserters';
22
+ import { useShowBlockTools } from './use-show-block-tools';
23
23
 
24
24
  function selector( select ) {
25
25
  const {
26
26
  getSelectedBlockClientId,
27
27
  getFirstMultiSelectedBlockClientId,
28
- getBlock,
29
28
  getSettings,
30
- hasMultiSelection,
31
29
  __unstableGetEditorMode,
32
30
  isTyping,
33
31
  } = select( blockEditorStore );
@@ -35,36 +33,13 @@ function selector( select ) {
35
33
  const clientId =
36
34
  getSelectedBlockClientId() || getFirstMultiSelectedBlockClientId();
37
35
 
38
- const { name = '', attributes = {} } = getBlock( clientId ) || {};
39
36
  const editorMode = __unstableGetEditorMode();
40
- const hasSelectedBlock = clientId && name;
41
- const isEmptyDefaultBlock = isUnmodifiedDefaultBlock( {
42
- name,
43
- attributes,
44
- } );
45
- const _showEmptyBlockSideInserter =
46
- clientId &&
47
- ! isTyping() &&
48
- editorMode === 'edit' &&
49
- isUnmodifiedDefaultBlock( { name, attributes } );
50
- const maybeShowBreadcrumb =
51
- hasSelectedBlock &&
52
- ! hasMultiSelection() &&
53
- ( editorMode === 'navigation' || editorMode === 'zoom-out' );
54
37
 
55
38
  return {
56
39
  clientId,
57
40
  hasFixedToolbar: getSettings().hasFixedToolbar,
58
41
  isTyping: isTyping(),
59
42
  isZoomOutMode: editorMode === 'zoom-out',
60
- showEmptyBlockSideInserter: _showEmptyBlockSideInserter,
61
- showBreadcrumb: ! _showEmptyBlockSideInserter && maybeShowBreadcrumb,
62
- showBlockToolbar:
63
- ! getSettings().hasFixedToolbar &&
64
- ! _showEmptyBlockSideInserter &&
65
- hasSelectedBlock &&
66
- ! isEmptyDefaultBlock &&
67
- ! maybeShowBreadcrumb,
68
43
  };
69
44
  }
70
45
 
@@ -82,18 +57,20 @@ export default function BlockTools( {
82
57
  __unstableContentRef,
83
58
  ...props
84
59
  } ) {
85
- const {
86
- clientId,
87
- hasFixedToolbar,
88
- isTyping,
89
- isZoomOutMode,
90
- showEmptyBlockSideInserter,
91
- showBreadcrumb,
92
- showBlockToolbar,
93
- } = useSelect( selector, [] );
60
+ const { clientId, hasFixedToolbar, isTyping, isZoomOutMode } = useSelect(
61
+ selector,
62
+ []
63
+ );
94
64
  const isMatch = useShortcutEventMatch();
95
65
  const { getSelectedBlockClientIds, getBlockRootClientId } =
96
66
  useSelect( blockEditorStore );
67
+
68
+ const {
69
+ showEmptyBlockSideInserter,
70
+ showBreadcrumb,
71
+ showBlockToolbarPopover,
72
+ } = useShowBlockTools();
73
+
97
74
  const {
98
75
  duplicateBlocks,
99
76
  removeBlocks,
@@ -186,7 +163,7 @@ export default function BlockTools( {
186
163
  />
187
164
  ) }
188
165
 
189
- { showBlockToolbar && (
166
+ { showBlockToolbarPopover && (
190
167
  <BlockToolbarPopover
191
168
  __unstableContentRef={ __unstableContentRef }
192
169
  clientId={ clientId }
@@ -0,0 +1,73 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useSelect } from '@wordpress/data';
5
+ import { isUnmodifiedDefaultBlock } from '@wordpress/blocks';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { store as blockEditorStore } from '../../store';
11
+ import { useHasBlockToolbar } from '../block-toolbar/use-has-block-toolbar';
12
+
13
+ /**
14
+ * Source of truth for which block tools are showing in the block editor.
15
+ *
16
+ * @return {Object} Object of which block tools will be shown.
17
+ */
18
+ export function useShowBlockTools() {
19
+ const hasBlockToolbar = useHasBlockToolbar();
20
+
21
+ return useSelect(
22
+ ( select ) => {
23
+ const {
24
+ getSelectedBlockClientId,
25
+ getFirstMultiSelectedBlockClientId,
26
+ getBlock,
27
+ getSettings,
28
+ hasMultiSelection,
29
+ __unstableGetEditorMode,
30
+ isTyping,
31
+ } = select( blockEditorStore );
32
+
33
+ const clientId =
34
+ getSelectedBlockClientId() ||
35
+ getFirstMultiSelectedBlockClientId();
36
+
37
+ const { name = '', attributes = {} } = getBlock( clientId ) || {};
38
+ const editorMode = __unstableGetEditorMode();
39
+ const hasSelectedBlock = clientId && name;
40
+ const isEmptyDefaultBlock = isUnmodifiedDefaultBlock( {
41
+ name,
42
+ attributes,
43
+ } );
44
+ const _showEmptyBlockSideInserter =
45
+ clientId &&
46
+ ! isTyping() &&
47
+ editorMode === 'edit' &&
48
+ isUnmodifiedDefaultBlock( { name, attributes } );
49
+ const maybeShowBreadcrumb =
50
+ hasSelectedBlock &&
51
+ ! hasMultiSelection() &&
52
+ ( editorMode === 'navigation' || editorMode === 'zoom-out' );
53
+
54
+ return {
55
+ showEmptyBlockSideInserter: _showEmptyBlockSideInserter,
56
+ showBreadcrumb:
57
+ ! _showEmptyBlockSideInserter && maybeShowBreadcrumb,
58
+ showBlockToolbarPopover:
59
+ hasBlockToolbar &&
60
+ ! getSettings().hasFixedToolbar &&
61
+ ! _showEmptyBlockSideInserter &&
62
+ hasSelectedBlock &&
63
+ ! isEmptyDefaultBlock &&
64
+ ! maybeShowBreadcrumb,
65
+ showFixedToolbar:
66
+ editorMode !== 'zoom-out' &&
67
+ hasBlockToolbar &&
68
+ getSettings().hasFixedToolbar,
69
+ };
70
+ },
71
+ [ hasBlockToolbar ]
72
+ );
73
+ }
@@ -53,7 +53,7 @@ const Caption = ( {
53
53
  __unstableOnSplitAtEnd={ () =>
54
54
  insertBlocksAfter( createBlock( 'core/paragraph' ) )
55
55
  }
56
- deleteEnter={ true }
56
+ deleteEnter
57
57
  />
58
58
  </View>
59
59
  );
@@ -74,7 +74,7 @@ export default function ChildLayoutControl( {
74
74
  flexSize: newFlexSize,
75
75
  } );
76
76
  } }
77
- isBlock={ true }
77
+ isBlock
78
78
  >
79
79
  <ToggleGroupControlOption
80
80
  key={ 'fit' }
@@ -14,7 +14,7 @@ export default function ColorPaletteControl( {
14
14
  onColorChange={ onChange }
15
15
  colorValue={ value }
16
16
  gradients={ [] }
17
- disableCustomGradients={ true }
17
+ disableCustomGradients
18
18
  />
19
19
  );
20
20
  }
@@ -133,7 +133,7 @@ function ColorGradientControlInner( {
133
133
  { canChooseAColor && canChooseAGradient && (
134
134
  <div>
135
135
  <Tabs
136
- initialTabId={
136
+ defaultTabId={
137
137
  gradientValue
138
138
  ? TAB_IDS.gradient
139
139
  : !! canChooseAColor && TAB_IDS.color
@@ -64,7 +64,7 @@ describe( 'ColorPaletteControl', () => {
64
64
  ] }
65
65
  gradients={ [] }
66
66
  disableCustomColors={ false }
67
- disableCustomGradients={ true }
67
+ disableCustomGradients
68
68
  onColorChange={ noop }
69
69
  onGradientChange={ noop }
70
70
  />
@@ -102,7 +102,7 @@ describe( 'ColorPaletteControl', () => {
102
102
  slug: 'light-green-cyan-to-vivid-green-cyan',
103
103
  },
104
104
  ] }
105
- disableCustomColors={ true }
105
+ disableCustomColors
106
106
  disableCustomGradients={ false }
107
107
  onColorChange={ noop }
108
108
  onGradientChange={ noop }
@@ -221,7 +221,7 @@ describe( 'ContrastChecker', () => {
221
221
  <ContrastChecker
222
222
  backgroundColor="#C44B4B"
223
223
  textColor="#000000"
224
- isLargeText={ true }
224
+ isLargeText
225
225
  />
226
226
  );
227
227
 
@@ -263,7 +263,7 @@ describe( 'ContrastChecker', () => {
263
263
  backgroundColor="#C44B4B"
264
264
  textColor="#000000"
265
265
  fontSize={ 23 }
266
- isLargeText={ true }
266
+ isLargeText
267
267
  />
268
268
  );
269
269
 
@@ -363,7 +363,7 @@ describe( 'ContrastChecker', () => {
363
363
  backgroundColor={ backgroundColor }
364
364
  textColor={ textColor }
365
365
  isLargeText={ isLargeText }
366
- enableAlphaChecker={ true }
366
+ enableAlphaChecker
367
367
  />
368
368
  );
369
369
 
@@ -378,7 +378,7 @@ describe( 'ContrastChecker', () => {
378
378
  textColor={ 'rgba(0,0,0,0.9)' }
379
379
  linkColor={ linkColor }
380
380
  isLargeText={ isLargeText }
381
- enableAlphaChecker={ true }
381
+ enableAlphaChecker
382
382
  />
383
383
  );
384
384
 
@@ -399,7 +399,7 @@ describe( 'ContrastChecker', () => {
399
399
  linkColor={ 'rgba(0,0,0,0.9)' }
400
400
  textColor={ textColor }
401
401
  isLargeText={ isLargeText }
402
- enableAlphaChecker={ true }
402
+ enableAlphaChecker
403
403
  />
404
404
  );
405
405
 
@@ -420,7 +420,7 @@ describe( 'ContrastChecker', () => {
420
420
  textColor={ textColor }
421
421
  linkColor={ linkColor }
422
422
  isLargeText={ isLargeText }
423
- enableAlphaChecker={ true }
423
+ enableAlphaChecker
424
424
  />
425
425
  );
426
426
 
@@ -437,7 +437,7 @@ describe( 'ContrastChecker', () => {
437
437
  isLargeText={ isLargeText }
438
438
  fallbackBackgroundColor={ fallbackBackgroundColor }
439
439
  fallbackTextColor={ fallbackTextColor }
440
- enableAlphaChecker={ true }
440
+ enableAlphaChecker
441
441
  />
442
442
  );
443
443
 
@@ -454,7 +454,7 @@ describe( 'ContrastChecker', () => {
454
454
  isLargeText={ isLargeText }
455
455
  fallbackBackgroundColor={ fallbackBackgroundColor }
456
456
  fallbackTextColor={ fallbackTextColor }
457
- enableAlphaChecker={ true }
457
+ enableAlphaChecker
458
458
  />
459
459
  );
460
460
 
@@ -477,7 +477,7 @@ describe( 'ContrastChecker', () => {
477
477
  isLargeText={ isLargeText }
478
478
  fallbackBackgroundColor={ fallbackBackgroundColor }
479
479
  fallbackTextColor={ fallbackTextColor }
480
- enableAlphaChecker={ true }
480
+ enableAlphaChecker
481
481
  />
482
482
  );
483
483
 
@@ -498,7 +498,7 @@ describe( 'ContrastChecker', () => {
498
498
  linkColor={ 'rgba(0,0,0,0.7)' }
499
499
  textColor={ 'rgba(0,0,0,0.7)' }
500
500
  isLargeText={ isLargeText }
501
- enableAlphaChecker={ true }
501
+ enableAlphaChecker
502
502
  />
503
503
  );
504
504
 
@@ -29,12 +29,15 @@
29
29
  // In "constrained" layout containers, the first and last paragraphs have their margins zeroed out.
30
30
  // In the case of this appender, it needs to apply those same rules to avoid layout shifts.
31
31
  // Such shifts happen when the bottom margin of the Title block has been set to less than the default 1em margin of paragraphs.
32
- :where(body .is-layout-constrained) & {
32
+ :where(body .is-layout-constrained) &,
33
+ :where(.wp-site-blocks) & {
33
34
  > :first-child:first-child {
34
35
  margin-block-start: 0;
36
+ margin-block-end: 0;
35
37
  }
36
38
 
37
- // Since this particular appender will only ever appear on an entirely empty document, we don't account for last-child.
39
+ // Since this appender will only ever appear on an entirely empty document, we don't account for last-child.
40
+ // This is also because it will never be the last child, the block inserter that sits in this appender is the last child.
38
41
  }
39
42
 
40
43
  // Dropzone.
@@ -21,23 +21,24 @@ import { useColorsPerOrigin } from './hooks';
21
21
  import { getValueFromVariable, TOOLSPANEL_DROPDOWNMENU_PROPS } from './utils';
22
22
  import { overrideOrigins } from '../../store/get-block-settings';
23
23
  import { setImmutably } from '../../utils/object';
24
- import { getBorderPanelLabel } from '../../hooks/border';
25
- import { ShadowPopover } from './shadow-panel-components';
24
+ import { useBorderPanelLabel } from '../../hooks/border';
25
+ import { ShadowPopover, useShadowPresets } from './shadow-panel-components';
26
26
 
27
- function useHasShadowControl( settings ) {
28
- return !! settings?.shadow;
27
+ export function useHasBorderPanel( settings ) {
28
+ const controls = Object.values( useHasBorderPanelControls( settings ) );
29
+ return controls.some( Boolean );
29
30
  }
30
31
 
31
- export function useHasBorderPanel( settings ) {
32
- const controls = [
33
- useHasBorderColorControl( settings ),
34
- useHasBorderRadiusControl( settings ),
35
- useHasBorderStyleControl( settings ),
36
- useHasBorderWidthControl( settings ),
37
- useHasShadowControl( settings ),
38
- ];
32
+ export function useHasBorderPanelControls( settings ) {
33
+ const controls = {
34
+ hasBorderColor: useHasBorderColorControl( settings ),
35
+ hasBorderRadius: useHasBorderRadiusControl( settings ),
36
+ hasBorderStyle: useHasBorderStyleControl( settings ),
37
+ hasBorderWidth: useHasBorderWidthControl( settings ),
38
+ hasShadow: useHasShadowControl( settings ),
39
+ };
39
40
 
40
- return controls.some( Boolean );
41
+ return controls;
41
42
  }
42
43
 
43
44
  function useHasBorderColorControl( settings ) {
@@ -56,6 +57,11 @@ function useHasBorderWidthControl( settings ) {
56
57
  return settings?.border?.width;
57
58
  }
58
59
 
60
+ function useHasShadowControl( settings ) {
61
+ const shadows = useShadowPresets( settings );
62
+ return !! settings?.shadow && shadows.length > 0;
63
+ }
64
+
59
65
  function BorderToolsPanel( {
60
66
  resetAllFilter,
61
67
  onChange,
@@ -215,14 +221,16 @@ export default function BorderPanel( {
215
221
  const showBorderByDefault =
216
222
  defaultControls?.color || defaultControls?.width;
217
223
 
218
- const label = getBorderPanelLabel( {
224
+ const hasBorderControl =
225
+ showBorderColor ||
226
+ showBorderStyle ||
227
+ showBorderWidth ||
228
+ showBorderRadius;
229
+
230
+ const label = useBorderPanelLabel( {
219
231
  blockName: name,
220
232
  hasShadowControl,
221
- hasBorderControl:
222
- showBorderColor ||
223
- showBorderStyle ||
224
- showBorderWidth ||
225
- showBorderRadius,
233
+ hasBorderControl,
226
234
  } );
227
235
 
228
236
  return (
@@ -243,13 +251,13 @@ export default function BorderPanel( {
243
251
  >
244
252
  <BorderBoxControl
245
253
  colors={ colors }
246
- enableAlpha={ true }
254
+ enableAlpha
247
255
  enableStyle={ showBorderStyle }
248
256
  onChange={ onBorderChange }
249
257
  popoverOffset={ 40 }
250
258
  popoverPlacement="left-start"
251
259
  value={ border }
252
- __experimentalIsRenderedInSidebar={ true }
260
+ __experimentalIsRenderedInSidebar
253
261
  size={ '__unstable-large' }
254
262
  hideLabelFromVision={ ! hasShadowControl }
255
263
  label={ __( 'Border' ) }
@@ -280,9 +288,12 @@ export default function BorderPanel( {
280
288
  isShownByDefault={ defaultControls.shadow }
281
289
  panelId={ panelId }
282
290
  >
283
- <BaseControl.VisualLabel as="legend">
284
- { __( 'Shadow' ) }
285
- </BaseControl.VisualLabel>
291
+ { hasBorderControl ? (
292
+ <BaseControl.VisualLabel as="legend">
293
+ { __( 'Shadow' ) }
294
+ </BaseControl.VisualLabel>
295
+ ) : null }
296
+
286
297
  <ItemGroup isBordered isSeparated>
287
298
  <ShadowPopover
288
299
  shadow={ shadow }
@@ -259,7 +259,7 @@ function ColorPanelDropdown( {
259
259
  />
260
260
  ) }
261
261
  { tabs.length > 1 && (
262
- <Tabs initialTabId={ currentTab?.key }>
262
+ <Tabs defaultTabId={ currentTab?.key }>
263
263
  <Tabs.TabList>
264
264
  { tabs.map( ( tab ) => (
265
265
  <Tabs.Tab
@@ -62,7 +62,7 @@ export default function ImageSettingsPanel( {
62
62
  hasValue={ () => !! value?.lightbox }
63
63
  label={ __( 'Expand on click' ) }
64
64
  onDeselect={ resetLightbox }
65
- isShownByDefault={ true }
65
+ isShownByDefault
66
66
  panelId={ panelId }
67
67
  >
68
68
  <ToggleControl
@@ -19,7 +19,11 @@ export {
19
19
  default as DimensionsPanel,
20
20
  useHasDimensionsPanel,
21
21
  } from './dimensions-panel';
22
- export { default as BorderPanel, useHasBorderPanel } from './border-panel';
22
+ export {
23
+ default as BorderPanel,
24
+ useHasBorderPanel,
25
+ useHasBorderPanelControls,
26
+ } from './border-panel';
23
27
  export { default as ColorPanel, useHasColorPanel } from './color-panel';
24
28
  export { default as FiltersPanel, useHasFiltersPanel } from './filters-panel';
25
29
  export {
@@ -5,28 +5,36 @@ import { __ } from '@wordpress/i18n';
5
5
  import {
6
6
  __experimentalVStack as VStack,
7
7
  __experimentalHeading as Heading,
8
- __experimentalGrid as Grid,
9
8
  __experimentalHStack as HStack,
10
9
  __experimentalDropdownContentWrapper as DropdownContentWrapper,
11
10
  Button,
12
11
  FlexItem,
13
12
  Dropdown,
13
+ privateApis as componentsPrivateApis,
14
14
  } from '@wordpress/components';
15
+ import { useMemo } from '@wordpress/element';
15
16
  import { shadow as shadowIcon, Icon, check } from '@wordpress/icons';
17
+
16
18
  /**
17
19
  * External dependencies
18
20
  */
19
21
  import classNames from 'classnames';
20
22
 
21
- export function ShadowPopoverContainer( { shadow, onShadowChange, settings } ) {
22
- const defaultShadows = settings?.shadow?.presets?.default || [];
23
- const themeShadows = settings?.shadow?.presets?.theme || [];
24
- const defaultPresetsEnabled = settings?.shadow?.defaultPresets;
23
+ /**
24
+ * Internal dependencies
25
+ */
26
+ import { unlock } from '../../lock-unlock';
25
27
 
26
- const shadows = [
27
- ...( defaultPresetsEnabled ? defaultShadows : [] ),
28
- ...themeShadows,
29
- ];
28
+ /**
29
+ * Shared reference to an empty array for cases where it is important to avoid
30
+ * returning a new array reference on every invocation.
31
+ *
32
+ * @type {Array}
33
+ */
34
+ const EMPTY_ARRAY = [];
35
+
36
+ export function ShadowPopoverContainer( { shadow, onShadowChange, settings } ) {
37
+ const shadows = useShadowPresets( settings );
30
38
 
31
39
  return (
32
40
  <div className="block-editor-global-styles__shadow-popover-container">
@@ -37,42 +45,76 @@ export function ShadowPopoverContainer( { shadow, onShadowChange, settings } ) {
37
45
  activeShadow={ shadow }
38
46
  onSelect={ onShadowChange }
39
47
  />
48
+ <div className="block-editor-global-styles__clear-shadow">
49
+ <Button
50
+ variant="tertiary"
51
+ onClick={ () => onShadowChange( undefined ) }
52
+ >
53
+ { __( 'Clear' ) }
54
+ </Button>
55
+ </div>
40
56
  </VStack>
41
57
  </div>
42
58
  );
43
59
  }
44
60
 
45
61
  export function ShadowPresets( { presets, activeShadow, onSelect } ) {
62
+ const { CompositeV2: Composite, useCompositeStoreV2: useCompositeStore } =
63
+ unlock( componentsPrivateApis );
64
+ const compositeStore = useCompositeStore();
46
65
  return ! presets ? null : (
47
- <Grid columns={ 6 } gap={ 0 } align="center" justify="center">
66
+ <Composite
67
+ store={ compositeStore }
68
+ role="listbox"
69
+ className="block-editor-global-styles__shadow__list"
70
+ aria-label={ __( 'Drop shadows' ) }
71
+ >
48
72
  { presets.map( ( { name, slug, shadow } ) => (
49
73
  <ShadowIndicator
50
74
  key={ slug }
51
75
  label={ name }
52
76
  isActive={ shadow === activeShadow }
77
+ type={ slug === 'unset' ? 'unset' : 'preset' }
53
78
  onSelect={ () =>
54
79
  onSelect( shadow === activeShadow ? undefined : shadow )
55
80
  }
56
81
  shadow={ shadow }
57
82
  />
58
83
  ) ) }
59
- </Grid>
84
+ </Composite>
60
85
  );
61
86
  }
62
87
 
63
- export function ShadowIndicator( { label, isActive, onSelect, shadow } ) {
88
+ export function ShadowIndicator( { type, label, isActive, onSelect, shadow } ) {
89
+ const { CompositeItemV2: CompositeItem } = unlock( componentsPrivateApis );
64
90
  return (
65
- <div className="block-editor-global-styles__shadow-indicator-wrapper">
66
- <Button
67
- className="block-editor-global-styles__shadow-indicator"
68
- onClick={ onSelect }
69
- label={ label }
70
- style={ { boxShadow: shadow } }
71
- showTooltip
72
- >
73
- { isActive && <Icon icon={ check } /> }
74
- </Button>
75
- </div>
91
+ <CompositeItem
92
+ role="option"
93
+ aria-label={ label }
94
+ aria-selected={ isActive }
95
+ className={ classNames(
96
+ 'block-editor-global-styles__shadow__item',
97
+ {
98
+ 'is-active': isActive,
99
+ }
100
+ ) }
101
+ render={
102
+ <Button
103
+ className={ classNames(
104
+ 'block-editor-global-styles__shadow-indicator',
105
+ {
106
+ unset: type === 'unset',
107
+ }
108
+ ) }
109
+ onClick={ onSelect }
110
+ label={ label }
111
+ style={ { boxShadow: shadow } }
112
+ showTooltip
113
+ >
114
+ { isActive && <Icon icon={ check } /> }
115
+ </Button>
116
+ }
117
+ />
76
118
  );
77
119
  }
78
120
 
@@ -123,3 +165,30 @@ function renderShadowToggle() {
123
165
  );
124
166
  };
125
167
  }
168
+
169
+ export function useShadowPresets( settings ) {
170
+ return useMemo( () => {
171
+ if ( ! settings?.shadow ) {
172
+ return EMPTY_ARRAY;
173
+ }
174
+
175
+ const defaultPresetsEnabled = settings?.shadow?.defaultPresets;
176
+ const { default: defaultShadows, theme: themeShadows } =
177
+ settings?.shadow?.presets ?? {};
178
+ const unsetShadow = {
179
+ name: __( 'Unset' ),
180
+ slug: 'unset',
181
+ shadow: 'none',
182
+ };
183
+
184
+ const shadowPresets = [
185
+ ...( ( defaultPresetsEnabled && defaultShadows ) || EMPTY_ARRAY ),
186
+ ...( themeShadows || EMPTY_ARRAY ),
187
+ ];
188
+ if ( shadowPresets.length ) {
189
+ shadowPresets.unshift( unsetShadow );
190
+ }
191
+
192
+ return shadowPresets;
193
+ }, [ settings ] );
194
+ }