@wordpress/block-editor 13.3.0 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (554) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +11 -5
  3. package/build/components/alignment-control/ui.js +2 -2
  4. package/build/components/alignment-control/ui.js.map +1 -1
  5. package/build/components/block-alignment-control/ui.js +1 -1
  6. package/build/components/block-alignment-control/ui.js.map +1 -1
  7. package/build/components/block-alignment-control/ui.native.js +1 -1
  8. package/build/components/block-alignment-control/ui.native.js.map +1 -1
  9. package/build/components/block-breadcrumb/index.js +3 -1
  10. package/build/components/block-breadcrumb/index.js.map +1 -1
  11. package/build/components/block-draggable/index.js +2 -2
  12. package/build/components/block-draggable/index.js.map +1 -1
  13. package/build/components/block-inspector/index.js +6 -3
  14. package/build/components/block-inspector/index.js.map +1 -1
  15. package/build/components/block-list/use-block-props/index.js +3 -1
  16. package/build/components/block-list/use-block-props/index.js.map +1 -1
  17. package/build/components/block-list/use-block-props/use-block-refs.js +26 -27
  18. package/build/components/block-list/use-block-props/use-block-refs.js.map +1 -1
  19. package/build/components/block-list/use-block-props/use-is-hovered.js +25 -9
  20. package/build/components/block-list/use-block-props/use-is-hovered.js.map +1 -1
  21. package/build/components/block-list/use-in-between-inserter.js +3 -2
  22. package/build/components/block-list/use-in-between-inserter.js.map +1 -1
  23. package/build/components/block-lock/modal.js +2 -0
  24. package/build/components/block-lock/modal.js.map +1 -1
  25. package/build/components/block-mover/index.js +1 -2
  26. package/build/components/block-mover/index.js.map +1 -1
  27. package/build/components/block-popover/cover.js +1 -1
  28. package/build/components/block-popover/cover.js.map +1 -1
  29. package/build/components/block-popover/inbetween.js +2 -2
  30. package/build/components/block-popover/inbetween.js.map +1 -1
  31. package/build/components/block-popover/index.js +2 -2
  32. package/build/components/block-popover/index.js.map +1 -1
  33. package/build/components/block-removal-warning-modal/index.js +2 -0
  34. package/build/components/block-removal-warning-modal/index.js.map +1 -1
  35. package/build/components/block-switcher/index.js +1 -1
  36. package/build/components/block-switcher/index.js.map +1 -1
  37. package/build/components/block-switcher/pattern-transformations-menu.js +11 -12
  38. package/build/components/block-switcher/pattern-transformations-menu.js.map +1 -1
  39. package/build/components/block-switcher/preview-block-popover.js +20 -17
  40. package/build/components/block-switcher/preview-block-popover.js.map +1 -1
  41. package/build/components/block-toolbar/shuffle.js +5 -2
  42. package/build/components/block-toolbar/shuffle.js.map +1 -1
  43. package/build/components/block-tools/block-selection-button.js +1 -2
  44. package/build/components/block-tools/block-selection-button.js.map +1 -1
  45. package/build/components/block-tools/index.js +1 -1
  46. package/build/components/block-tools/index.js.map +1 -1
  47. package/build/components/block-tools/use-block-toolbar-popover-props.js +1 -1
  48. package/build/components/block-tools/use-block-toolbar-popover-props.js.map +1 -1
  49. package/build/components/block-tools/use-show-block-tools.js +7 -8
  50. package/build/components/block-tools/use-show-block-tools.js.map +1 -1
  51. package/build/components/block-tools/zoom-out-mode-inserter-button.js +45 -0
  52. package/build/components/block-tools/zoom-out-mode-inserter-button.js.map +1 -0
  53. package/build/components/block-tools/zoom-out-mode-inserters.js +35 -36
  54. package/build/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  55. package/build/components/block-tools/zoom-out-popover.js +2 -1
  56. package/build/components/block-tools/zoom-out-popover.js.map +1 -1
  57. package/build/components/block-tools/zoom-out-toolbar.js +1 -2
  58. package/build/components/block-tools/zoom-out-toolbar.js.map +1 -1
  59. package/build/components/child-layout-control/index.js +3 -1
  60. package/build/components/child-layout-control/index.js.map +1 -1
  61. package/build/components/date-format-picker/index.js +2 -11
  62. package/build/components/date-format-picker/index.js.map +1 -1
  63. package/build/components/default-block-appender/index.js +7 -4
  64. package/build/components/default-block-appender/index.js.map +1 -1
  65. package/build/components/dimensions-tool/scale-tool.js +1 -0
  66. package/build/components/dimensions-tool/scale-tool.js.map +1 -1
  67. package/build/components/font-appearance-control/index.js +2 -7
  68. package/build/components/font-appearance-control/index.js.map +1 -1
  69. package/build/components/font-family/index.js +12 -0
  70. package/build/components/font-family/index.js.map +1 -1
  71. package/build/components/global-styles/background-panel.js +63 -52
  72. package/build/components/global-styles/background-panel.js.map +1 -1
  73. package/build/components/global-styles/hooks.js +5 -1
  74. package/build/components/global-styles/hooks.js.map +1 -1
  75. package/build/components/global-styles/image-settings-panel.js +1 -0
  76. package/build/components/global-styles/image-settings-panel.js.map +1 -1
  77. package/build/components/global-styles/theme-file-uri-utils.js +0 -59
  78. package/build/components/global-styles/theme-file-uri-utils.js.map +1 -1
  79. package/build/components/global-styles/typography-panel.js +26 -44
  80. package/build/components/global-styles/typography-panel.js.map +1 -1
  81. package/build/components/global-styles/typography-utils.js +78 -7
  82. package/build/components/global-styles/typography-utils.js.map +1 -1
  83. package/build/components/global-styles/use-global-styles-output.js +82 -44
  84. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  85. package/build/components/global-styles/utils.js +96 -0
  86. package/build/components/global-styles/utils.js.map +1 -1
  87. package/build/components/grid/grid-item-movers.js +93 -44
  88. package/build/components/grid/grid-item-movers.js.map +1 -1
  89. package/build/components/grid/grid-item-resizer.js +14 -15
  90. package/build/components/grid/grid-item-resizer.js.map +1 -1
  91. package/build/components/grid/grid-visualizer.js +2 -2
  92. package/build/components/grid/grid-visualizer.js.map +1 -1
  93. package/build/components/grid/use-grid-layout-sync.js +93 -45
  94. package/build/components/grid/use-grid-layout-sync.js.map +1 -1
  95. package/build/components/iframe/index.js +4 -8
  96. package/build/components/iframe/index.js.map +1 -1
  97. package/build/components/index.js +1 -9
  98. package/build/components/index.js.map +1 -1
  99. package/build/components/inner-blocks/index.js +1 -1
  100. package/build/components/inner-blocks/index.js.map +1 -1
  101. package/build/components/inserter/block-patterns-tab/patterns-filter.js +20 -23
  102. package/build/components/inserter/block-patterns-tab/patterns-filter.js.map +1 -1
  103. package/build/components/inserter/category-tabs/index.js +29 -2
  104. package/build/components/inserter/category-tabs/index.js.map +1 -1
  105. package/build/components/inserter/media-tab/media-panel.js +1 -0
  106. package/build/components/inserter/media-tab/media-panel.js.map +1 -1
  107. package/build/components/inserter/menu.js +3 -3
  108. package/build/components/inserter/menu.js.map +1 -1
  109. package/build/components/inserter/preview-panel.js +20 -3
  110. package/build/components/inserter/preview-panel.js.map +1 -1
  111. package/build/components/inserter-draggable-blocks/index.js +10 -3
  112. package/build/components/inserter-draggable-blocks/index.js.map +1 -1
  113. package/build/components/inspector-controls-tabs/settings-tab.js +1 -2
  114. package/build/components/inspector-controls-tabs/settings-tab.js.map +1 -1
  115. package/build/components/line-height-control/index.js +0 -15
  116. package/build/components/line-height-control/index.js.map +1 -1
  117. package/build/components/link-control/search-input.js +0 -1
  118. package/build/components/link-control/search-input.js.map +1 -1
  119. package/build/components/list-view/block-select-button.js +2 -6
  120. package/build/components/list-view/block-select-button.js.map +1 -1
  121. package/build/components/list-view/block.js +2 -2
  122. package/build/components/list-view/block.js.map +1 -1
  123. package/build/components/list-view/utils.js +3 -1
  124. package/build/components/list-view/utils.js.map +1 -1
  125. package/build/components/media-replace-flow/index.js +3 -1
  126. package/build/components/media-replace-flow/index.js.map +1 -1
  127. package/build/components/resolution-tool/index.js +1 -0
  128. package/build/components/resolution-tool/index.js.map +1 -1
  129. package/build/components/rich-text/format-toolbar/index.js +1 -1
  130. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  131. package/build/components/rich-text/index.js +1 -1
  132. package/build/components/rich-text/index.js.map +1 -1
  133. package/build/components/skip-to-selected-block/index.js +4 -2
  134. package/build/components/skip-to-selected-block/index.js.map +1 -1
  135. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js +8 -8
  136. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  137. package/build/components/url-input/button.js +0 -1
  138. package/build/components/url-input/button.js.map +1 -1
  139. package/build/components/url-input/index.js +1 -11
  140. package/build/components/url-input/index.js.map +1 -1
  141. package/build/components/url-popover/image-url-input-ui.js +3 -3
  142. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  143. package/build/components/url-popover/link-editor.js +0 -1
  144. package/build/components/url-popover/link-editor.js.map +1 -1
  145. package/build/components/use-block-drop-zone/index.js +30 -4
  146. package/build/components/use-block-drop-zone/index.js.map +1 -1
  147. package/build/components/use-on-block-drop/index.js +3 -6
  148. package/build/components/use-on-block-drop/index.js.map +1 -1
  149. package/build/components/use-resize-canvas/index.js +1 -3
  150. package/build/components/use-resize-canvas/index.js.map +1 -1
  151. package/build/components/use-settings/index.js +2 -1
  152. package/build/components/use-settings/index.js.map +1 -1
  153. package/build/hooks/block-bindings.js +248 -36
  154. package/build/hooks/block-bindings.js.map +1 -1
  155. package/build/hooks/block-hooks.js +1 -0
  156. package/build/hooks/block-hooks.js.map +1 -1
  157. package/build/hooks/block-style-variation.js +2 -2
  158. package/build/hooks/block-style-variation.js.map +1 -1
  159. package/build/hooks/contrast-checker.js +6 -6
  160. package/build/hooks/contrast-checker.js.map +1 -1
  161. package/build/hooks/duotone.js +3 -3
  162. package/build/hooks/duotone.js.map +1 -1
  163. package/build/hooks/grid-visualizer.js +5 -8
  164. package/build/hooks/grid-visualizer.js.map +1 -1
  165. package/build/hooks/index.js +7 -1
  166. package/build/hooks/index.js.map +1 -1
  167. package/build/hooks/layout-child.js +9 -2
  168. package/build/hooks/layout-child.js.map +1 -1
  169. package/build/hooks/line-height.js +0 -1
  170. package/build/hooks/line-height.js.map +1 -1
  171. package/build/hooks/position.js +3 -7
  172. package/build/hooks/position.js.map +1 -1
  173. package/build/hooks/spacing-visualizer.js +1 -1
  174. package/build/hooks/spacing-visualizer.js.map +1 -1
  175. package/build/hooks/use-bindings-attributes.js +85 -50
  176. package/build/hooks/use-bindings-attributes.js.map +1 -1
  177. package/build/hooks/use-zoom-out.js +1 -1
  178. package/build/hooks/use-zoom-out.js.map +1 -1
  179. package/build/hooks/utils.js +20 -0
  180. package/build/hooks/utils.js.map +1 -1
  181. package/build/index.js +7 -0
  182. package/build/index.js.map +1 -1
  183. package/build/layouts/constrained.js +6 -2
  184. package/build/layouts/constrained.js.map +1 -1
  185. package/build/layouts/grid.js +2 -0
  186. package/build/layouts/grid.js.map +1 -1
  187. package/build/private-apis.js +0 -4
  188. package/build/private-apis.js.map +1 -1
  189. package/build/store/actions.js +27 -2
  190. package/build/store/actions.js.map +1 -1
  191. package/build/store/reducer.js +19 -1
  192. package/build/store/reducer.js.map +1 -1
  193. package/build/store/selectors.js +17 -5
  194. package/build/store/selectors.js.map +1 -1
  195. package/build/utils/get-editor-region.js +1 -1
  196. package/build/utils/get-editor-region.js.map +1 -1
  197. package/build/utils/get-px-from-css-unit.js +1 -1
  198. package/build/utils/get-px-from-css-unit.js.map +1 -1
  199. package/build-module/components/alignment-control/ui.js +2 -2
  200. package/build-module/components/alignment-control/ui.js.map +1 -1
  201. package/build-module/components/block-alignment-control/ui.js +1 -1
  202. package/build-module/components/block-alignment-control/ui.js.map +1 -1
  203. package/build-module/components/block-alignment-control/ui.native.js +1 -1
  204. package/build-module/components/block-alignment-control/ui.native.js.map +1 -1
  205. package/build-module/components/block-breadcrumb/index.js +4 -2
  206. package/build-module/components/block-breadcrumb/index.js.map +1 -1
  207. package/build-module/components/block-draggable/index.js +3 -3
  208. package/build-module/components/block-draggable/index.js.map +1 -1
  209. package/build-module/components/block-inspector/index.js +6 -3
  210. package/build-module/components/block-inspector/index.js.map +1 -1
  211. package/build-module/components/block-list/use-block-props/index.js +3 -1
  212. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  213. package/build-module/components/block-list/use-block-props/use-block-refs.js +27 -30
  214. package/build-module/components/block-list/use-block-props/use-block-refs.js.map +1 -1
  215. package/build-module/components/block-list/use-block-props/use-is-hovered.js +26 -9
  216. package/build-module/components/block-list/use-block-props/use-is-hovered.js.map +1 -1
  217. package/build-module/components/block-list/use-in-between-inserter.js +3 -2
  218. package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
  219. package/build-module/components/block-lock/modal.js +2 -0
  220. package/build-module/components/block-lock/modal.js.map +1 -1
  221. package/build-module/components/block-mover/index.js +1 -2
  222. package/build-module/components/block-mover/index.js.map +1 -1
  223. package/build-module/components/block-popover/cover.js +1 -1
  224. package/build-module/components/block-popover/cover.js.map +1 -1
  225. package/build-module/components/block-popover/inbetween.js +1 -1
  226. package/build-module/components/block-popover/inbetween.js.map +1 -1
  227. package/build-module/components/block-popover/index.js +1 -1
  228. package/build-module/components/block-popover/index.js.map +1 -1
  229. package/build-module/components/block-removal-warning-modal/index.js +2 -0
  230. package/build-module/components/block-removal-warning-modal/index.js.map +1 -1
  231. package/build-module/components/block-switcher/index.js +1 -1
  232. package/build-module/components/block-switcher/index.js.map +1 -1
  233. package/build-module/components/block-switcher/pattern-transformations-menu.js +12 -13
  234. package/build-module/components/block-switcher/pattern-transformations-menu.js.map +1 -1
  235. package/build-module/components/block-switcher/preview-block-popover.js +20 -17
  236. package/build-module/components/block-switcher/preview-block-popover.js.map +1 -1
  237. package/build-module/components/block-toolbar/shuffle.js +5 -2
  238. package/build-module/components/block-toolbar/shuffle.js.map +1 -1
  239. package/build-module/components/block-tools/block-selection-button.js +1 -2
  240. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  241. package/build-module/components/block-tools/index.js +1 -1
  242. package/build-module/components/block-tools/index.js.map +1 -1
  243. package/build-module/components/block-tools/use-block-toolbar-popover-props.js +1 -1
  244. package/build-module/components/block-tools/use-block-toolbar-popover-props.js.map +1 -1
  245. package/build-module/components/block-tools/use-show-block-tools.js +7 -8
  246. package/build-module/components/block-tools/use-show-block-tools.js.map +1 -1
  247. package/build-module/components/block-tools/zoom-out-mode-inserter-button.js +37 -0
  248. package/build-module/components/block-tools/zoom-out-mode-inserter-button.js.map +1 -0
  249. package/build-module/components/block-tools/zoom-out-mode-inserters.js +37 -38
  250. package/build-module/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  251. package/build-module/components/block-tools/zoom-out-popover.js +2 -1
  252. package/build-module/components/block-tools/zoom-out-popover.js.map +1 -1
  253. package/build-module/components/block-tools/zoom-out-toolbar.js +1 -2
  254. package/build-module/components/block-tools/zoom-out-toolbar.js.map +1 -1
  255. package/build-module/components/child-layout-control/index.js +3 -1
  256. package/build-module/components/child-layout-control/index.js.map +1 -1
  257. package/build-module/components/date-format-picker/index.js +4 -12
  258. package/build-module/components/date-format-picker/index.js.map +1 -1
  259. package/build-module/components/default-block-appender/index.js +7 -4
  260. package/build-module/components/default-block-appender/index.js.map +1 -1
  261. package/build-module/components/dimensions-tool/scale-tool.js +1 -0
  262. package/build-module/components/dimensions-tool/scale-tool.js.map +1 -1
  263. package/build-module/components/font-appearance-control/index.js +3 -6
  264. package/build-module/components/font-appearance-control/index.js.map +1 -1
  265. package/build-module/components/font-family/index.js +11 -0
  266. package/build-module/components/font-family/index.js.map +1 -1
  267. package/build-module/components/global-styles/background-panel.js +63 -52
  268. package/build-module/components/global-styles/background-panel.js.map +1 -1
  269. package/build-module/components/global-styles/hooks.js +5 -1
  270. package/build-module/components/global-styles/hooks.js.map +1 -1
  271. package/build-module/components/global-styles/image-settings-panel.js +1 -0
  272. package/build-module/components/global-styles/image-settings-panel.js.map +1 -1
  273. package/build-module/components/global-styles/theme-file-uri-utils.js +0 -58
  274. package/build-module/components/global-styles/theme-file-uri-utils.js.map +1 -1
  275. package/build-module/components/global-styles/typography-panel.js +27 -45
  276. package/build-module/components/global-styles/typography-panel.js.map +1 -1
  277. package/build-module/components/global-styles/typography-utils.js +76 -7
  278. package/build-module/components/global-styles/typography-utils.js.map +1 -1
  279. package/build-module/components/global-styles/use-global-styles-output.js +81 -43
  280. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  281. package/build-module/components/global-styles/utils.js +92 -0
  282. package/build-module/components/global-styles/utils.js.map +1 -1
  283. package/build-module/components/grid/grid-item-movers.js +96 -46
  284. package/build-module/components/grid/grid-item-movers.js.map +1 -1
  285. package/build-module/components/grid/grid-item-resizer.js +14 -15
  286. package/build-module/components/grid/grid-item-resizer.js.map +1 -1
  287. package/build-module/components/grid/grid-visualizer.js +2 -2
  288. package/build-module/components/grid/grid-visualizer.js.map +1 -1
  289. package/build-module/components/grid/use-grid-layout-sync.js +94 -46
  290. package/build-module/components/grid/use-grid-layout-sync.js.map +1 -1
  291. package/build-module/components/iframe/index.js +4 -8
  292. package/build-module/components/iframe/index.js.map +1 -1
  293. package/build-module/components/index.js +0 -5
  294. package/build-module/components/index.js.map +1 -1
  295. package/build-module/components/inner-blocks/index.js +1 -1
  296. package/build-module/components/inner-blocks/index.js.map +1 -1
  297. package/build-module/components/inserter/block-patterns-tab/patterns-filter.js +20 -23
  298. package/build-module/components/inserter/block-patterns-tab/patterns-filter.js.map +1 -1
  299. package/build-module/components/inserter/category-tabs/index.js +30 -3
  300. package/build-module/components/inserter/category-tabs/index.js.map +1 -1
  301. package/build-module/components/inserter/media-tab/media-panel.js +1 -0
  302. package/build-module/components/inserter/media-tab/media-panel.js.map +1 -1
  303. package/build-module/components/inserter/menu.js +3 -3
  304. package/build-module/components/inserter/menu.js.map +1 -1
  305. package/build-module/components/inserter/preview-panel.js +20 -3
  306. package/build-module/components/inserter/preview-panel.js.map +1 -1
  307. package/build-module/components/inserter-draggable-blocks/index.js +10 -3
  308. package/build-module/components/inserter-draggable-blocks/index.js.map +1 -1
  309. package/build-module/components/inspector-controls-tabs/settings-tab.js +1 -2
  310. package/build-module/components/inspector-controls-tabs/settings-tab.js.map +1 -1
  311. package/build-module/components/line-height-control/index.js +0 -14
  312. package/build-module/components/line-height-control/index.js.map +1 -1
  313. package/build-module/components/link-control/search-input.js +0 -1
  314. package/build-module/components/link-control/search-input.js.map +1 -1
  315. package/build-module/components/list-view/block-select-button.js +3 -7
  316. package/build-module/components/list-view/block-select-button.js.map +1 -1
  317. package/build-module/components/list-view/block.js +2 -2
  318. package/build-module/components/list-view/block.js.map +1 -1
  319. package/build-module/components/list-view/utils.js +3 -1
  320. package/build-module/components/list-view/utils.js.map +1 -1
  321. package/build-module/components/media-replace-flow/index.js +3 -1
  322. package/build-module/components/media-replace-flow/index.js.map +1 -1
  323. package/build-module/components/resolution-tool/index.js +1 -0
  324. package/build-module/components/resolution-tool/index.js.map +1 -1
  325. package/build-module/components/rich-text/format-toolbar/index.js +1 -1
  326. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  327. package/build-module/components/rich-text/index.js +1 -1
  328. package/build-module/components/rich-text/index.js.map +1 -1
  329. package/build-module/components/skip-to-selected-block/index.js +5 -3
  330. package/build-module/components/skip-to-selected-block/index.js.map +1 -1
  331. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js +8 -8
  332. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  333. package/build-module/components/url-input/button.js +0 -1
  334. package/build-module/components/url-input/button.js.map +1 -1
  335. package/build-module/components/url-input/index.js +1 -11
  336. package/build-module/components/url-input/index.js.map +1 -1
  337. package/build-module/components/url-popover/image-url-input-ui.js +3 -3
  338. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  339. package/build-module/components/url-popover/link-editor.js +0 -1
  340. package/build-module/components/url-popover/link-editor.js.map +1 -1
  341. package/build-module/components/use-block-drop-zone/index.js +30 -4
  342. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  343. package/build-module/components/use-on-block-drop/index.js +3 -6
  344. package/build-module/components/use-on-block-drop/index.js.map +1 -1
  345. package/build-module/components/use-resize-canvas/index.js +1 -3
  346. package/build-module/components/use-resize-canvas/index.js.map +1 -1
  347. package/build-module/components/use-settings/index.js +2 -1
  348. package/build-module/components/use-settings/index.js.map +1 -1
  349. package/build-module/hooks/block-bindings.js +253 -40
  350. package/build-module/hooks/block-bindings.js.map +1 -1
  351. package/build-module/hooks/block-hooks.js +1 -0
  352. package/build-module/hooks/block-hooks.js.map +1 -1
  353. package/build-module/hooks/block-style-variation.js +3 -3
  354. package/build-module/hooks/block-style-variation.js.map +1 -1
  355. package/build-module/hooks/contrast-checker.js +7 -7
  356. package/build-module/hooks/contrast-checker.js.map +1 -1
  357. package/build-module/hooks/duotone.js +4 -4
  358. package/build-module/hooks/duotone.js.map +1 -1
  359. package/build-module/hooks/grid-visualizer.js +5 -8
  360. package/build-module/hooks/grid-visualizer.js.map +1 -1
  361. package/build-module/hooks/index.js +2 -1
  362. package/build-module/hooks/index.js.map +1 -1
  363. package/build-module/hooks/layout-child.js +9 -2
  364. package/build-module/hooks/layout-child.js.map +1 -1
  365. package/build-module/hooks/line-height.js +0 -1
  366. package/build-module/hooks/line-height.js.map +1 -1
  367. package/build-module/hooks/position.js +3 -7
  368. package/build-module/hooks/position.js.map +1 -1
  369. package/build-module/hooks/spacing-visualizer.js +1 -1
  370. package/build-module/hooks/spacing-visualizer.js.map +1 -1
  371. package/build-module/hooks/use-bindings-attributes.js +84 -51
  372. package/build-module/hooks/use-bindings-attributes.js.map +1 -1
  373. package/build-module/hooks/use-zoom-out.js +1 -1
  374. package/build-module/hooks/use-zoom-out.js.map +1 -1
  375. package/build-module/hooks/utils.js +19 -0
  376. package/build-module/hooks/utils.js.map +1 -1
  377. package/build-module/index.js +1 -1
  378. package/build-module/index.js.map +1 -1
  379. package/build-module/layouts/constrained.js +6 -2
  380. package/build-module/layouts/constrained.js.map +1 -1
  381. package/build-module/layouts/grid.js +2 -0
  382. package/build-module/layouts/grid.js.map +1 -1
  383. package/build-module/private-apis.js +1 -5
  384. package/build-module/private-apis.js.map +1 -1
  385. package/build-module/store/actions.js +24 -1
  386. package/build-module/store/actions.js.map +1 -1
  387. package/build-module/store/reducer.js +18 -1
  388. package/build-module/store/reducer.js.map +1 -1
  389. package/build-module/store/selectors.js +14 -4
  390. package/build-module/store/selectors.js.map +1 -1
  391. package/build-module/utils/get-editor-region.js +1 -1
  392. package/build-module/utils/get-editor-region.js.map +1 -1
  393. package/build-module/utils/get-px-from-css-unit.js +1 -1
  394. package/build-module/utils/get-px-from-css-unit.js.map +1 -1
  395. package/build-style/content-rtl.css +11 -18
  396. package/build-style/content.css +11 -18
  397. package/build-style/default-editor-styles-rtl.css +3 -0
  398. package/build-style/default-editor-styles.css +3 -0
  399. package/build-style/style-rtl.css +242 -136
  400. package/build-style/style.css +242 -136
  401. package/build-types/components/block-context/index.d.ts +2 -2
  402. package/build-types/components/block-context/index.d.ts.map +1 -1
  403. package/build-types/utils/dom.d.ts.map +1 -1
  404. package/package.json +31 -31
  405. package/src/autocompleters/style.scss +4 -0
  406. package/src/components/alignment-control/ui.js +2 -2
  407. package/src/components/block-alignment-control/ui.js +1 -1
  408. package/src/components/block-alignment-control/ui.native.js +1 -1
  409. package/src/components/block-breadcrumb/index.js +4 -2
  410. package/src/components/block-canvas/style.scss +1 -0
  411. package/src/components/block-context/README.md +4 -4
  412. package/src/components/block-draggable/index.js +3 -3
  413. package/src/components/block-inspector/index.js +8 -4
  414. package/src/components/block-list/content.scss +2 -16
  415. package/src/components/block-list/use-block-props/index.js +1 -1
  416. package/src/components/block-list/use-block-props/use-block-refs.js +30 -30
  417. package/src/components/block-list/use-block-props/use-is-hovered.js +26 -11
  418. package/src/components/block-list/use-in-between-inserter.js +5 -1
  419. package/src/components/block-lock/modal.js +10 -2
  420. package/src/components/block-lock/style.scss +4 -8
  421. package/src/components/block-mover/index.js +5 -2
  422. package/src/components/block-patterns-paging/style.scss +0 -23
  423. package/src/components/block-popover/cover.js +1 -1
  424. package/src/components/block-popover/inbetween.js +1 -1
  425. package/src/components/block-popover/index.js +1 -1
  426. package/src/components/block-removal-warning-modal/index.js +10 -2
  427. package/src/components/block-switcher/index.js +1 -1
  428. package/src/components/block-switcher/pattern-transformations-menu.js +17 -15
  429. package/src/components/block-switcher/preview-block-popover.js +20 -14
  430. package/src/components/block-switcher/style.scss +8 -17
  431. package/src/components/block-toolbar/shuffle.js +8 -1
  432. package/src/components/block-tools/block-selection-button.js +1 -2
  433. package/src/components/block-tools/index.js +5 -6
  434. package/src/components/block-tools/style.scss +8 -0
  435. package/src/components/block-tools/use-block-toolbar-popover-props.js +1 -1
  436. package/src/components/block-tools/use-show-block-tools.js +12 -9
  437. package/src/components/block-tools/zoom-out-mode-inserter-button.js +47 -0
  438. package/src/components/block-tools/zoom-out-mode-inserters.js +48 -42
  439. package/src/components/block-tools/zoom-out-popover.js +1 -0
  440. package/src/components/block-tools/zoom-out-toolbar.js +1 -2
  441. package/src/components/button-block-appender/content.scss +1 -1
  442. package/src/components/child-layout-control/index.js +2 -0
  443. package/src/components/color-palette/test/__snapshots__/control.js.snap +2 -2
  444. package/src/components/colors-gradients/test/control.js +3 -2
  445. package/src/components/date-format-picker/index.js +2 -11
  446. package/src/components/default-block-appender/index.js +11 -4
  447. package/src/components/dimensions-tool/scale-tool.js +1 -0
  448. package/src/components/font-appearance-control/index.js +1 -5
  449. package/src/components/font-family/README.md +8 -0
  450. package/src/components/font-family/index.js +16 -0
  451. package/src/components/font-family/stories/index.story.js +54 -0
  452. package/src/components/global-styles/background-panel.js +90 -62
  453. package/src/components/global-styles/hooks.js +5 -1
  454. package/src/components/global-styles/image-settings-panel.js +1 -0
  455. package/src/components/global-styles/style.scss +11 -9
  456. package/src/components/global-styles/test/theme-file-uri-utils.js +1 -26
  457. package/src/components/global-styles/test/typography-utils.js +325 -0
  458. package/src/components/global-styles/test/use-global-styles-output.js +52 -5
  459. package/src/components/global-styles/test/utils.js +120 -0
  460. package/src/components/global-styles/theme-file-uri-utils.js +0 -59
  461. package/src/components/global-styles/typography-panel.js +36 -45
  462. package/src/components/global-styles/typography-utils.js +103 -7
  463. package/src/components/global-styles/use-global-styles-output.js +89 -50
  464. package/src/components/global-styles/utils.js +112 -0
  465. package/src/components/grid/grid-item-movers.js +141 -69
  466. package/src/components/grid/grid-item-resizer.js +11 -17
  467. package/src/components/grid/grid-visualizer.js +2 -2
  468. package/src/components/grid/style.scss +164 -0
  469. package/src/components/grid/use-grid-layout-sync.js +133 -40
  470. package/src/components/iframe/content.scss +3 -3
  471. package/src/components/iframe/index.js +3 -7
  472. package/src/components/index.js +0 -5
  473. package/src/components/inner-blocks/index.js +4 -1
  474. package/src/components/inserter/block-patterns-tab/patterns-filter.js +40 -44
  475. package/src/components/inserter/category-tabs/index.js +35 -2
  476. package/src/components/inserter/media-tab/media-panel.js +1 -0
  477. package/src/components/inserter/menu.js +3 -3
  478. package/src/components/inserter/preview-panel.js +27 -4
  479. package/src/components/inserter/style.scss +66 -47
  480. package/src/components/inserter-draggable-blocks/index.js +11 -3
  481. package/src/components/inspector-controls/README.md +5 -0
  482. package/src/components/inspector-controls-tabs/settings-tab.js +0 -2
  483. package/src/components/inspector-controls-tabs/style.scss +0 -21
  484. package/src/components/line-height-control/README.md +0 -8
  485. package/src/components/line-height-control/index.js +1 -21
  486. package/src/components/line-height-control/stories/index.story.js +0 -1
  487. package/src/components/line-height-control/test/index.js +1 -7
  488. package/src/components/link-control/search-input.js +0 -1
  489. package/src/components/list-view/block-select-button.js +3 -13
  490. package/src/components/list-view/block.js +10 -3
  491. package/src/components/list-view/style.scss +2 -1
  492. package/src/components/list-view/utils.js +13 -2
  493. package/src/components/media-replace-flow/README.md +7 -0
  494. package/src/components/media-replace-flow/index.js +3 -1
  495. package/src/components/resolution-tool/index.js +1 -0
  496. package/src/components/responsive-block-control/test/index.js +5 -1
  497. package/src/components/rich-text/format-toolbar/index.js +1 -1
  498. package/src/components/rich-text/index.js +1 -1
  499. package/src/components/skip-to-selected-block/index.js +5 -3
  500. package/src/components/spacing-sizes-control/input-controls/spacing-input-control.js +6 -7
  501. package/src/components/tabbed-sidebar/style.scss +1 -19
  502. package/src/components/url-input/README.md +0 -5
  503. package/src/components/url-input/button.js +0 -1
  504. package/src/components/url-input/index.js +1 -15
  505. package/src/components/url-popover/image-url-input-ui.js +3 -3
  506. package/src/components/url-popover/link-editor.js +0 -1
  507. package/src/components/url-popover/style.scss +1 -0
  508. package/src/components/use-block-drop-zone/index.js +66 -14
  509. package/src/components/use-on-block-drop/index.js +1 -9
  510. package/src/components/use-resize-canvas/index.js +1 -3
  511. package/src/components/use-settings/index.js +2 -1
  512. package/src/hooks/block-bindings.js +303 -52
  513. package/src/hooks/block-bindings.scss +13 -2
  514. package/src/hooks/block-hooks.js +1 -0
  515. package/src/hooks/block-hooks.scss +1 -0
  516. package/src/hooks/block-style-variation.js +3 -3
  517. package/src/hooks/contrast-checker.js +7 -7
  518. package/src/hooks/duotone.js +4 -4
  519. package/src/hooks/grid-visualizer.js +5 -7
  520. package/src/hooks/index.js +2 -1
  521. package/src/hooks/layout-child.js +12 -3
  522. package/src/hooks/line-height.js +0 -1
  523. package/src/hooks/position.js +3 -13
  524. package/src/hooks/spacing-visualizer.js +1 -1
  525. package/src/hooks/use-bindings-attributes.js +93 -59
  526. package/src/hooks/use-editor-wrapper-styles.native.scss +1 -0
  527. package/src/hooks/use-zoom-out.js +1 -1
  528. package/src/hooks/utils.js +14 -1
  529. package/src/index.js +1 -0
  530. package/src/layouts/constrained.js +10 -2
  531. package/src/layouts/grid.js +2 -0
  532. package/src/private-apis.js +1 -8
  533. package/src/store/actions.js +28 -5
  534. package/src/store/reducer.js +18 -0
  535. package/src/store/selectors.js +14 -4
  536. package/src/style.scss +1 -1
  537. package/src/utils/get-editor-region.js +1 -1
  538. package/src/utils/get-px-from-css-unit.js +1 -1
  539. package/tsconfig.tsbuildinfo +1 -1
  540. package/build/components/inserter/block-patterns-tab/pattern-category-preview-panel.js +0 -30
  541. package/build/components/inserter/block-patterns-tab/pattern-category-preview-panel.js.map +0 -1
  542. package/build/components/inserter/reusable-block-rename-hint.js +0 -71
  543. package/build/components/inserter/reusable-block-rename-hint.js.map +0 -1
  544. package/build/components/inspector-controls-tabs/settings-tab-hint.js +0 -53
  545. package/build/components/inspector-controls-tabs/settings-tab-hint.js.map +0 -1
  546. package/build-module/components/inserter/block-patterns-tab/pattern-category-preview-panel.js +0 -23
  547. package/build-module/components/inserter/block-patterns-tab/pattern-category-preview-panel.js.map +0 -1
  548. package/build-module/components/inserter/reusable-block-rename-hint.js +0 -64
  549. package/build-module/components/inserter/reusable-block-rename-hint.js.map +0 -1
  550. package/build-module/components/inspector-controls-tabs/settings-tab-hint.js +0 -47
  551. package/build-module/components/inspector-controls-tabs/settings-tab-hint.js.map +0 -1
  552. package/src/components/inserter/block-patterns-tab/pattern-category-preview-panel.js +0 -25
  553. package/src/components/inserter/reusable-block-rename-hint.js +0 -69
  554. package/src/components/inspector-controls-tabs/settings-tab-hint.js +0 -52
@@ -130,10 +130,6 @@ When hiding the URLInput using CSS (as is sometimes done for accessibility purpo
130
130
 
131
131
  This prop allows the suggestions list to be programmatically not rendered by passing a boolean—it can be `true` to make sure suggestions aren't rendered, or `false`/`undefined` to fall back to the default behaviour of showing suggestions when matching autocompletion items are found.
132
132
 
133
- ### `__nextHasNoMarginBottom: Boolean`
134
-
135
- Start opting into the new margin-free styles that will become the default in a future version, currently scheduled to be WordPress 6.4. (The prop can be safely removed once this happens.)
136
-
137
133
  ## Example
138
134
 
139
135
 
@@ -156,7 +152,6 @@ registerBlockType( /* ... */, {
156
152
  edit( { className, attributes, setAttributes } ) {
157
153
  return (
158
154
  <URLInput
159
- __nextHasNoMarginBottom
160
155
  className={ className }
161
156
  value={ attributes.url }
162
157
  onChange={ ( url, post ) => setAttributes( { url, text: (post && post.title) || 'Click here' } ) }
@@ -57,7 +57,6 @@ class URLInputButton extends Component {
57
57
  onClick={ this.toggle }
58
58
  />
59
59
  <URLInput
60
- __nextHasNoMarginBottom
61
60
  value={ url || '' }
62
61
  onChange={ onChange }
63
62
  />
@@ -6,7 +6,6 @@ import clsx from 'clsx';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import deprecated from '@wordpress/deprecated';
10
9
  import { __, sprintf, _n } from '@wordpress/i18n';
11
10
  import { Component, createRef } from '@wordpress/element';
12
11
  import { UP, DOWN, ENTER, TAB } from '@wordpress/keycodes';
@@ -416,8 +415,6 @@ class URLInput extends Component {
416
415
 
417
416
  renderControl() {
418
417
  const {
419
- /** Start opting into the new margin-free styles that will become the default in a future version. */
420
- __nextHasNoMarginBottom = false,
421
418
  label = null,
422
419
  className,
423
420
  isFullWidth,
@@ -473,19 +470,8 @@ class URLInput extends Component {
473
470
  return renderControl( controlProps, inputProps, loading );
474
471
  }
475
472
 
476
- if ( ! __nextHasNoMarginBottom ) {
477
- deprecated( 'Bottom margin styles for wp.blockEditor.URLInput', {
478
- since: '6.2',
479
- version: '6.5',
480
- hint: 'Set the `__nextHasNoMarginBottom` prop to true to start opting into the new styles, which will become the default in a future version',
481
- } );
482
- }
483
-
484
473
  return (
485
- <BaseControl
486
- __nextHasNoMarginBottom={ __nextHasNoMarginBottom }
487
- { ...controlProps }
488
- >
474
+ <BaseControl __nextHasNoMarginBottom { ...controlProps }>
489
475
  <input { ...inputProps } />
490
476
  { loading && <Spinner /> }
491
477
  </BaseControl>
@@ -272,7 +272,7 @@ const ImageURLInputUI = ( {
272
272
  icon={ linkOff }
273
273
  label={ __( 'Disable expand on click' ) }
274
274
  onClick={ () => {
275
- onSetLightbox( false );
275
+ onSetLightbox?.( false );
276
276
  } }
277
277
  size="compact"
278
278
  />
@@ -302,7 +302,7 @@ const ImageURLInputUI = ( {
302
302
  label={ __( 'Remove link' ) }
303
303
  onClick={ () => {
304
304
  onLinkRemove();
305
- resetLightbox();
305
+ resetLightbox?.();
306
306
  } }
307
307
  size="compact"
308
308
  />
@@ -366,7 +366,7 @@ const ImageURLInputUI = ( {
366
366
  LINK_DESTINATION_NONE,
367
367
  href: '',
368
368
  } );
369
- onSetLightbox( true );
369
+ onSetLightbox?.( true );
370
370
  stopEditLink();
371
371
  } }
372
372
  >
@@ -31,7 +31,6 @@ export default function LinkEditor( {
31
31
  { ...props }
32
32
  >
33
33
  <URLInput
34
- __nextHasNoMarginBottom
35
34
  value={ value }
36
35
  onChange={ onChangeInputValue }
37
36
  autocompleteRef={ autocompleteRef }
@@ -10,6 +10,7 @@
10
10
  .block-editor-url-popover__row {
11
11
  display: flex;
12
12
  gap: $grid-unit-05;
13
+ align-items: center;
13
14
  }
14
15
 
15
16
  // Any children of the popover-row that are not the settings-toggle
@@ -301,8 +301,10 @@ export default function useBlockDropZone( {
301
301
  operation: 'insert',
302
302
  } );
303
303
 
304
- const { getBlockType } = useSelect( blocksStore );
304
+ const { getBlockType, getBlockVariations, getGroupingBlockName } =
305
+ useSelect( blocksStore );
305
306
  const {
307
+ canInsertBlockType,
306
308
  getBlockListSettings,
307
309
  getBlocks,
308
310
  getBlockIndex,
@@ -310,6 +312,7 @@ export default function useBlockDropZone( {
310
312
  getBlockNamesByClientId,
311
313
  getAllowedBlocks,
312
314
  isDragging,
315
+ isGroupable,
313
316
  } = unlock( useSelect( blockEditorStore ) );
314
317
  const {
315
318
  showInsertionPoint,
@@ -385,21 +388,66 @@ export default function useBlockDropZone( {
385
388
  };
386
389
  } );
387
390
 
391
+ const dropTargetPosition = getDropTargetPosition(
392
+ blocksData,
393
+ { x: event.clientX, y: event.clientY },
394
+ getBlockListSettings( targetRootClientId )?.orientation,
395
+ {
396
+ dropZoneElement,
397
+ parentBlockClientId,
398
+ parentBlockOrientation: parentBlockClientId
399
+ ? getBlockListSettings( parentBlockClientId )
400
+ ?.orientation
401
+ : undefined,
402
+ rootBlockIndex: getBlockIndex( targetRootClientId ),
403
+ }
404
+ );
405
+
388
406
  const [ targetIndex, operation, nearestSide ] =
389
- getDropTargetPosition(
390
- blocksData,
391
- { x: event.clientX, y: event.clientY },
392
- getBlockListSettings( targetRootClientId )?.orientation,
393
- {
394
- dropZoneElement,
395
- parentBlockClientId,
396
- parentBlockOrientation: parentBlockClientId
397
- ? getBlockListSettings( parentBlockClientId )
398
- ?.orientation
399
- : undefined,
400
- rootBlockIndex: getBlockIndex( targetRootClientId ),
401
- }
407
+ dropTargetPosition;
408
+
409
+ if ( operation === 'group' ) {
410
+ const targetBlock = blocks[ targetIndex ];
411
+ const areAllImages = [
412
+ targetBlock.name,
413
+ ...draggedBlockNames,
414
+ ].every( ( name ) => name === 'core/image' );
415
+ const canInsertGalleryBlock = canInsertBlockType(
416
+ 'core/gallery',
417
+ targetRootClientId
402
418
  );
419
+ const areGroupableBlocks = isGroupable( [
420
+ targetBlock.clientId,
421
+ getDraggedBlockClientIds(),
422
+ ] );
423
+ const groupBlockVariations = getBlockVariations(
424
+ getGroupingBlockName(),
425
+ 'block'
426
+ );
427
+ const canInsertRow =
428
+ groupBlockVariations &&
429
+ groupBlockVariations.find(
430
+ ( { name } ) => name === 'group-row'
431
+ );
432
+
433
+ // If the dragged blocks and the target block are all images,
434
+ // check if it is creatable either a Row variation or a Gallery block.
435
+ if (
436
+ areAllImages &&
437
+ ! canInsertGalleryBlock &&
438
+ ( ! areGroupableBlocks || ! canInsertRow )
439
+ ) {
440
+ return;
441
+ }
442
+ // If the dragged blocks and the target block are not all images,
443
+ // check if it is creatable a Row variation.
444
+ if (
445
+ ! areAllImages &&
446
+ ( ! areGroupableBlocks || ! canInsertRow )
447
+ ) {
448
+ return;
449
+ }
450
+ }
403
451
 
404
452
  registry.batch( () => {
405
453
  setDropTarget( {
@@ -436,6 +484,10 @@ export default function useBlockDropZone( {
436
484
  showInsertionPoint,
437
485
  isDragging,
438
486
  startDragging,
487
+ canInsertBlockType,
488
+ getBlockVariations,
489
+ getGroupingBlockName,
490
+ isGroupable,
439
491
  ]
440
492
  ),
441
493
  200
@@ -232,7 +232,6 @@ export default function useOnBlockDrop(
232
232
  getBlocksByClientId,
233
233
  getSettings,
234
234
  getBlock,
235
- isGroupable,
236
235
  } = useSelect( blockEditorStore );
237
236
  const { getGroupingBlockName } = useSelect( blocksStore );
238
237
  const {
@@ -255,17 +254,11 @@ export default function useOnBlockDrop(
255
254
  if ( ! Array.isArray( blocks ) ) {
256
255
  blocks = [ blocks ];
257
256
  }
258
-
259
257
  const clientIds = getBlockOrder( targetRootClientId );
260
258
  const clientId = clientIds[ targetBlockIndex ];
261
- const blocksClientIds = blocks.map( ( block ) => block.clientId );
262
- const areGroupableBlocks = isGroupable( [
263
- ...blocksClientIds,
264
- clientId,
265
- ] );
266
259
  if ( operation === 'replace' ) {
267
260
  replaceBlocks( clientId, blocks, undefined, initialPosition );
268
- } else if ( operation === 'group' && areGroupableBlocks ) {
261
+ } else if ( operation === 'group' ) {
269
262
  const targetBlock = getBlock( clientId );
270
263
  if ( nearestSide === 'left' ) {
271
264
  blocks.push( targetBlock );
@@ -325,7 +318,6 @@ export default function useOnBlockDrop(
325
318
  getBlockOrder,
326
319
  targetRootClientId,
327
320
  targetBlockIndex,
328
- isGroupable,
329
321
  operation,
330
322
  replaceBlocks,
331
323
  getBlock,
@@ -43,7 +43,7 @@ export default function useResizeCanvas( deviceType ) {
43
43
  return deviceWidth < actualWidth ? deviceWidth : actualWidth;
44
44
  };
45
45
 
46
- const marginValue = () => ( window.innerHeight < 800 ? 36 : 72 );
46
+ const marginValue = () => ( window.innerHeight < 800 ? 36 : 64 );
47
47
 
48
48
  const contentInlineStyles = ( device ) => {
49
49
  const height = device === 'Mobile' ? '768px' : '1024px';
@@ -62,8 +62,6 @@ export default function useResizeCanvas( deviceType ) {
62
62
  marginLeft: marginHorizontal,
63
63
  marginRight: marginHorizontal,
64
64
  height,
65
- borderRadius: '2px 2px 2px 2px',
66
- border: '1px solid #ddd',
67
65
  overflowY: 'auto',
68
66
  };
69
67
  default:
@@ -43,9 +43,10 @@ export function useSettings( ...paths ) {
43
43
  * It looks up the setting first in the block instance hierarchy.
44
44
  * If none is found, it'll look it up in the block editor settings.
45
45
  *
46
+ * @deprecated 6.5.0 Use useSettings instead.
47
+ *
46
48
  * @param {string} path The path to the setting.
47
49
  * @return {any} Returns the value defined for the setting.
48
- * @deprecated 6.5.0 Use useSettings instead.
49
50
  * @example
50
51
  * ```js
51
52
  * const isEnabled = useSetting( 'typography.dropCap' );
@@ -2,42 +2,199 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { __ } from '@wordpress/i18n';
5
- import { store as blocksStore } from '@wordpress/blocks';
5
+ import { privateApis as blocksPrivateApis } from '@wordpress/blocks';
6
6
  import {
7
- BaseControl,
8
- PanelBody,
9
- __experimentalHStack as HStack,
10
7
  __experimentalItemGroup as ItemGroup,
11
8
  __experimentalItem as Item,
9
+ __experimentalText as Text,
10
+ __experimentalToolsPanel as ToolsPanel,
11
+ __experimentalToolsPanelItem as ToolsPanelItem,
12
+ __experimentalTruncate as Truncate,
13
+ __experimentalVStack as VStack,
14
+ privateApis as componentsPrivateApis,
12
15
  } from '@wordpress/components';
13
- import { useSelect } from '@wordpress/data';
16
+ import { useSelect, useDispatch, useRegistry } from '@wordpress/data';
17
+ import { useContext, Fragment } from '@wordpress/element';
18
+ import { useViewportMatch } from '@wordpress/compose';
14
19
 
15
20
  /**
16
21
  * Internal dependencies
17
22
  */
18
- import { canBindAttribute } from '../hooks/use-bindings-attributes';
23
+ import {
24
+ canBindAttribute,
25
+ getBindableAttributes,
26
+ } from '../hooks/use-bindings-attributes';
27
+ import { store as blockEditorStore } from '../store';
19
28
  import { unlock } from '../lock-unlock';
20
29
  import InspectorControls from '../components/inspector-controls';
30
+ import BlockContext from '../components/block-context';
31
+
32
+ const {
33
+ DropdownMenuV2: DropdownMenu,
34
+ DropdownMenuGroupV2: DropdownMenuGroup,
35
+ DropdownMenuRadioItemV2: DropdownMenuRadioItem,
36
+ DropdownMenuItemLabelV2: DropdownMenuItemLabel,
37
+ DropdownMenuItemHelpTextV2: DropdownMenuItemHelpText,
38
+ DropdownMenuSeparatorV2: DropdownMenuSeparator,
39
+ } = unlock( componentsPrivateApis );
40
+
41
+ const useToolsPanelDropdownMenuProps = () => {
42
+ const isMobile = useViewportMatch( 'medium', '<' );
43
+ return ! isMobile
44
+ ? {
45
+ popoverProps: {
46
+ placement: 'left-start',
47
+ // For non-mobile, inner sidebar width (248px) - button width (24px) - border (1px) + padding (16px) + spacing (20px)
48
+ offset: 259,
49
+ },
50
+ }
51
+ : {};
52
+ };
53
+
54
+ function BlockBindingsPanelDropdown( {
55
+ fieldsList,
56
+ addConnection,
57
+ attribute,
58
+ binding,
59
+ } ) {
60
+ const currentKey = binding?.args?.key;
61
+ return (
62
+ <>
63
+ { Object.entries( fieldsList ).map( ( [ label, fields ], i ) => (
64
+ <Fragment key={ label }>
65
+ <DropdownMenuGroup>
66
+ { Object.keys( fieldsList ).length > 1 && (
67
+ <Text
68
+ className="block-editor-bindings__source-label"
69
+ upperCase
70
+ variant="muted"
71
+ aria-hidden
72
+ >
73
+ { label }
74
+ </Text>
75
+ ) }
76
+ { Object.entries( fields ).map( ( [ key, value ] ) => (
77
+ <DropdownMenuRadioItem
78
+ key={ key }
79
+ onChange={ () =>
80
+ addConnection( key, attribute )
81
+ }
82
+ name={ attribute + '-binding' }
83
+ value={ key }
84
+ checked={ key === currentKey }
85
+ >
86
+ <DropdownMenuItemLabel>
87
+ { key }
88
+ </DropdownMenuItemLabel>
89
+ <DropdownMenuItemHelpText>
90
+ { value }
91
+ </DropdownMenuItemHelpText>
92
+ </DropdownMenuRadioItem>
93
+ ) ) }
94
+ </DropdownMenuGroup>
95
+ { i !== Object.keys( fieldsList ).length - 1 && (
96
+ <DropdownMenuSeparator />
97
+ ) }
98
+ </Fragment>
99
+ ) ) }
100
+ </>
101
+ );
102
+ }
103
+
104
+ function BlockBindingsAttribute( { attribute, binding } ) {
105
+ const { source: sourceName, args } = binding || {};
106
+ const sourceProps =
107
+ unlock( blocksPrivateApis ).getBlockBindingsSource( sourceName );
108
+ return (
109
+ <VStack>
110
+ <Truncate>{ attribute }</Truncate>
111
+ { !! binding && (
112
+ <Text
113
+ variant="muted"
114
+ className="block-editor-bindings__item-explanation"
115
+ >
116
+ <Truncate>
117
+ { args?.key || sourceProps?.label || sourceName }
118
+ </Truncate>
119
+ </Text>
120
+ ) }
121
+ </VStack>
122
+ );
123
+ }
124
+
125
+ function ReadOnlyBlockBindingsPanelItems( { bindings } ) {
126
+ return (
127
+ <>
128
+ { Object.entries( bindings ).map( ( [ attribute, binding ] ) => (
129
+ <Item key={ attribute }>
130
+ <BlockBindingsAttribute
131
+ attribute={ attribute }
132
+ binding={ binding }
133
+ />
134
+ </Item>
135
+ ) ) }
136
+ </>
137
+ );
138
+ }
139
+
140
+ function EditableBlockBindingsPanelItems( {
141
+ attributes,
142
+ bindings,
143
+ fieldsList,
144
+ addConnection,
145
+ removeConnection,
146
+ } ) {
147
+ const isMobile = useViewportMatch( 'medium', '<' );
148
+ return (
149
+ <>
150
+ { attributes.map( ( attribute ) => {
151
+ const binding = bindings[ attribute ];
152
+ return (
153
+ <ToolsPanelItem
154
+ key={ attribute }
155
+ hasValue={ () => !! binding }
156
+ label={ attribute }
157
+ onDeselect={ () => {
158
+ removeConnection( attribute );
159
+ } }
160
+ >
161
+ <DropdownMenu
162
+ placement={
163
+ isMobile ? 'bottom-start' : 'left-start'
164
+ }
165
+ gutter={ isMobile ? 8 : 36 }
166
+ className="block-editor-bindings__popover"
167
+ trigger={
168
+ <Item>
169
+ <BlockBindingsAttribute
170
+ attribute={ attribute }
171
+ binding={ binding }
172
+ />
173
+ </Item>
174
+ }
175
+ >
176
+ <BlockBindingsPanelDropdown
177
+ fieldsList={ fieldsList }
178
+ addConnection={ addConnection }
179
+ attribute={ attribute }
180
+ binding={ binding }
181
+ />
182
+ </DropdownMenu>
183
+ </ToolsPanelItem>
184
+ );
185
+ } ) }
186
+ </>
187
+ );
188
+ }
21
189
 
22
190
  export const BlockBindingsPanel = ( { name, metadata } ) => {
191
+ const registry = useRegistry();
192
+ const blockContext = useContext( BlockContext );
23
193
  const { bindings } = metadata || {};
24
- const { sources } = useSelect( ( select ) => {
25
- const _sources = unlock(
26
- select( blocksStore )
27
- ).getAllBlockBindingsSources();
28
194
 
29
- return {
30
- sources: _sources,
31
- };
32
- }, [] );
33
-
34
- if ( ! bindings ) {
35
- return null;
36
- }
195
+ const bindableAttributes = getBindableAttributes( name );
196
+ const dropdownMenuProps = useToolsPanelDropdownMenuProps();
37
197
 
38
- // Don't show not allowed attributes.
39
- // Don't show the bindings connected to pattern overrides in the inspectors panel.
40
- // TODO: Explore if this should be abstracted to let other sources decide.
41
198
  const filteredBindings = { ...bindings };
42
199
  Object.keys( filteredBindings ).forEach( ( key ) => {
43
200
  if (
@@ -48,43 +205,137 @@ export const BlockBindingsPanel = ( { name, metadata } ) => {
48
205
  }
49
206
  } );
50
207
 
51
- if ( Object.keys( filteredBindings ).length === 0 ) {
208
+ const { updateBlockAttributes } = useDispatch( blockEditorStore );
209
+
210
+ const { _id } = useSelect( ( select ) => {
211
+ const { getSelectedBlockClientId } = select( blockEditorStore );
212
+
213
+ return {
214
+ _id: getSelectedBlockClientId(),
215
+ };
216
+ }, [] );
217
+
218
+ if ( ! bindableAttributes || bindableAttributes.length === 0 ) {
219
+ return null;
220
+ }
221
+
222
+ const removeAllConnections = () => {
223
+ const newMetadata = { ...metadata };
224
+ delete newMetadata.bindings;
225
+ updateBlockAttributes( _id, {
226
+ metadata:
227
+ Object.keys( newMetadata ).length === 0
228
+ ? undefined
229
+ : newMetadata,
230
+ } );
231
+ };
232
+
233
+ const addConnection = ( value, attribute ) => {
234
+ // Assuming the block expects a flat structure for its metadata attribute
235
+ const newMetadata = {
236
+ ...metadata,
237
+ // Adjust this according to the actual structure expected by your block
238
+ bindings: {
239
+ ...metadata?.bindings,
240
+ [ attribute ]: {
241
+ source: 'core/post-meta',
242
+ args: { key: value },
243
+ },
244
+ },
245
+ };
246
+ // Update the block's attributes with the new metadata
247
+ updateBlockAttributes( _id, {
248
+ metadata: newMetadata,
249
+ } );
250
+ };
251
+
252
+ const removeConnection = ( key ) => {
253
+ const newMetadata = { ...metadata };
254
+ if ( ! newMetadata.bindings ) {
255
+ return;
256
+ }
257
+
258
+ delete newMetadata.bindings[ key ];
259
+ if ( Object.keys( newMetadata.bindings ).length === 0 ) {
260
+ delete newMetadata.bindings;
261
+ }
262
+ updateBlockAttributes( _id, {
263
+ metadata:
264
+ Object.keys( newMetadata ).length === 0
265
+ ? undefined
266
+ : newMetadata,
267
+ } );
268
+ };
269
+
270
+ const fieldsList = {};
271
+ const { getBlockBindingsSources } = unlock( blocksPrivateApis );
272
+ const registeredSources = getBlockBindingsSources();
273
+ Object.values( registeredSources ).forEach(
274
+ ( { getFieldsList, label, usesContext } ) => {
275
+ if ( getFieldsList ) {
276
+ // Populate context.
277
+ const context = {};
278
+ if ( usesContext?.length ) {
279
+ for ( const key of usesContext ) {
280
+ context[ key ] = blockContext[ key ];
281
+ }
282
+ }
283
+ const sourceList = getFieldsList( {
284
+ registry,
285
+ context,
286
+ } );
287
+ // Only add source if the list is not empty.
288
+ if ( sourceList ) {
289
+ fieldsList[ label ] = { ...sourceList };
290
+ }
291
+ }
292
+ }
293
+ );
294
+ // Remove empty sources.
295
+ Object.entries( fieldsList ).forEach( ( [ key, value ] ) => {
296
+ if ( ! Object.keys( value ).length ) {
297
+ delete fieldsList[ key ];
298
+ }
299
+ } );
300
+
301
+ // Lock the UI when the experiment is not enabled or there are no fields to connect to.
302
+ const readOnly =
303
+ ! window.__experimentalBlockBindingsUI ||
304
+ ! Object.keys( fieldsList ).length;
305
+
306
+ if ( readOnly && Object.keys( filteredBindings ).length === 0 ) {
52
307
  return null;
53
308
  }
54
309
 
55
310
  return (
56
311
  <InspectorControls>
57
- <PanelBody
58
- title={ __( 'Attributes' ) }
59
- className="components-panel__block-bindings-panel"
312
+ <ToolsPanel
313
+ label={ __( 'Attributes' ) }
314
+ resetAll={ () => {
315
+ removeAllConnections();
316
+ } }
317
+ dropdownMenuProps={ dropdownMenuProps }
318
+ className="block-editor-bindings__panel"
60
319
  >
61
- <BaseControl
62
- help={ __( 'Attributes connected to various sources.' ) }
63
- >
64
- <ItemGroup isBordered isSeparated size="large">
65
- { Object.keys( filteredBindings ).map( ( key ) => {
66
- return (
67
- <Item key={ key }>
68
- <HStack>
69
- <span>{ key }</span>
70
- <span className="components-item__block-bindings-source">
71
- { sources[
72
- filteredBindings[ key ].source
73
- ]
74
- ? sources[
75
- filteredBindings[ key ]
76
- .source
77
- ].label
78
- : filteredBindings[ key ]
79
- .source }
80
- </span>
81
- </HStack>
82
- </Item>
83
- );
84
- } ) }
85
- </ItemGroup>
86
- </BaseControl>
87
- </PanelBody>
320
+ <ItemGroup isBordered isSeparated>
321
+ { readOnly ? (
322
+ <ReadOnlyBlockBindingsPanelItems
323
+ bindings={ filteredBindings }
324
+ />
325
+ ) : (
326
+ <EditableBlockBindingsPanelItems
327
+ attributes={ bindableAttributes }
328
+ bindings={ filteredBindings }
329
+ fieldsList={ fieldsList }
330
+ addConnection={ addConnection }
331
+ removeConnection={ removeConnection }
332
+ />
333
+ ) }
334
+ </ItemGroup>
335
+ <Text variant="muted">
336
+ { __( 'Attributes connected to various sources.' ) }
337
+ </Text>
338
+ </ToolsPanel>
88
339
  </InspectorControls>
89
340
  );
90
341
  };
@@ -1,3 +1,14 @@
1
- .components-panel__block-bindings-panel .components-item__block-bindings-source {
2
- color: $gray-700;
1
+ div.block-editor-bindings__panel {
2
+ grid-template-columns: auto;
3
+ button:hover .block-editor-bindings__item-explanation {
4
+ color: inherit;
5
+ }
6
+ }
7
+
8
+ .block-editor-bindings__popover {
9
+ // This won't be needed if `DropdownMenuGroup` component handles the label.
10
+ .block-editor-bindings__source-label {
11
+ grid-column: 2;
12
+ margin: $grid-unit-10 0;
13
+ }
3
14
  }