@wordpress/block-editor 14.9.0 → 14.10.1

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 (370) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/LICENSE.md +1 -1
  3. package/README.md +40 -0
  4. package/build/components/audio-player/index.native.js +1 -1
  5. package/build/components/audio-player/index.native.js.map +1 -1
  6. package/build/components/background-image-control/index.js +4 -0
  7. package/build/components/background-image-control/index.js.map +1 -1
  8. package/build/components/block-alignment-matrix-control/index.js +32 -0
  9. package/build/components/block-alignment-matrix-control/index.js.map +1 -1
  10. package/build/components/block-card/index.js +45 -8
  11. package/build/components/block-card/index.js.map +1 -1
  12. package/build/components/block-edit/edit.js +147 -10
  13. package/build/components/block-edit/edit.js.map +1 -1
  14. package/build/components/block-list/index.js +1 -2
  15. package/build/components/block-list/index.js.map +1 -1
  16. package/build/components/block-list/use-block-props/index.js +2 -2
  17. package/build/components/block-list/use-block-props/index.js.map +1 -1
  18. package/build/components/block-list/zoom-out-separator.js +20 -3
  19. package/build/components/block-list/zoom-out-separator.js.map +1 -1
  20. package/build/components/block-settings-menu/block-settings-dropdown.js +5 -8
  21. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  22. package/build/components/block-styles/utils.js +3 -3
  23. package/build/components/block-styles/utils.js.map +1 -1
  24. package/build/components/block-tools/zoom-out-mode-inserters.js +19 -6
  25. package/build/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  26. package/build/components/button-block-appender/index.js +1 -5
  27. package/build/components/button-block-appender/index.js.map +1 -1
  28. package/build/components/child-layout-control/index.js +6 -0
  29. package/build/components/child-layout-control/index.js.map +1 -1
  30. package/build/components/colors-gradients/dropdown.js +51 -11
  31. package/build/components/colors-gradients/dropdown.js.map +1 -1
  32. package/build/components/contrast-checker/index.native.js +1 -1
  33. package/build/components/contrast-checker/index.native.js.map +1 -1
  34. package/build/components/date-format-picker/index.js +7 -16
  35. package/build/components/date-format-picker/index.js.map +1 -1
  36. package/build/components/font-appearance-control/index.js +9 -0
  37. package/build/components/font-appearance-control/index.js.map +1 -1
  38. package/build/components/font-family/index.js +10 -1
  39. package/build/components/font-family/index.js.map +1 -1
  40. package/build/components/global-styles/color-panel.js +3 -0
  41. package/build/components/global-styles/color-panel.js.map +1 -1
  42. package/build/components/global-styles/typography-utils.js +1 -1
  43. package/build/components/global-styles/typography-utils.js.map +1 -1
  44. package/build/components/global-styles/use-global-styles-output.js +2 -2
  45. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  46. package/build/components/grid/grid-visualizer.js +9 -0
  47. package/build/components/grid/grid-visualizer.js.map +1 -1
  48. package/build/components/grid/utils.js +12 -1
  49. package/build/components/grid/utils.js.map +1 -1
  50. package/build/components/iframe/index.js +1 -1
  51. package/build/components/iframe/index.js.map +1 -1
  52. package/build/components/inner-blocks/use-inner-block-template-sync.js +11 -11
  53. package/build/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  54. package/build/components/inserter/block-patterns-explorer/index.js +1 -1
  55. package/build/components/inserter/block-patterns-explorer/index.js.map +1 -1
  56. package/build/components/inserter/block-patterns-tab/index.js +1 -1
  57. package/build/components/inserter/block-patterns-tab/index.js.map +1 -1
  58. package/build/components/inserter/block-patterns-tab/pattern-category-previews.js +4 -4
  59. package/build/components/inserter/block-patterns-tab/pattern-category-previews.js.map +1 -1
  60. package/build/components/inserter/block-patterns-tab/patterns-filter.js +2 -2
  61. package/build/components/inserter/block-patterns-tab/patterns-filter.js.map +1 -1
  62. package/build/components/inserter/category-tabs/index.js +1 -2
  63. package/build/components/inserter/category-tabs/index.js.map +1 -1
  64. package/build/components/inserter/index.js +6 -15
  65. package/build/components/inserter/index.js.map +1 -1
  66. package/build/components/inserter/quick-inserter.js +2 -13
  67. package/build/components/inserter/quick-inserter.js.map +1 -1
  68. package/build/components/keyboard-shortcuts/index.js +2 -2
  69. package/build/components/keyboard-shortcuts/index.js.map +1 -1
  70. package/build/components/line-height-control/index.js +9 -0
  71. package/build/components/line-height-control/index.js.map +1 -1
  72. package/build/components/media-placeholder/index.js +2 -2
  73. package/build/components/media-placeholder/index.js.map +1 -1
  74. package/build/components/media-replace-flow/index.js +26 -26
  75. package/build/components/media-replace-flow/index.js.map +1 -1
  76. package/build/components/plain-text/index.js +34 -0
  77. package/build/components/plain-text/index.js.map +1 -1
  78. package/build/components/provider/index.js +61 -5
  79. package/build/components/provider/index.js.map +1 -1
  80. package/build/components/provider/use-media-upload-settings.js +28 -0
  81. package/build/components/provider/use-media-upload-settings.js.map +1 -0
  82. package/build/components/resolution-tool/index.js +3 -1
  83. package/build/components/resolution-tool/index.js.map +1 -1
  84. package/build/components/responsive-block-control/index.js +1 -1
  85. package/build/components/responsive-block-control/index.js.map +1 -1
  86. package/build/components/rich-text/event-listeners/delete.js +7 -1
  87. package/build/components/rich-text/event-listeners/delete.js.map +1 -1
  88. package/build/components/rich-text/index.js +2 -2
  89. package/build/components/rich-text/index.js.map +1 -1
  90. package/build/components/use-block-drop-zone/index.js +2 -1
  91. package/build/components/use-block-drop-zone/index.js.map +1 -1
  92. package/build/hooks/background.js +2 -0
  93. package/build/hooks/background.js.map +1 -1
  94. package/build/hooks/block-bindings.js +15 -14
  95. package/build/hooks/block-bindings.js.map +1 -1
  96. package/build/hooks/border.js +3 -3
  97. package/build/hooks/border.js.map +1 -1
  98. package/build/hooks/color.js +1 -1
  99. package/build/hooks/color.js.map +1 -1
  100. package/build/hooks/dimensions.js +2 -2
  101. package/build/hooks/dimensions.js.map +1 -1
  102. package/build/hooks/font-family.js +1 -1
  103. package/build/hooks/font-family.js.map +1 -1
  104. package/build/hooks/gap.js +2 -2
  105. package/build/hooks/gap.js.map +1 -1
  106. package/build/hooks/index.js +0 -1
  107. package/build/hooks/index.js.map +1 -1
  108. package/build/hooks/index.native.js +7 -0
  109. package/build/hooks/index.native.js.map +1 -1
  110. package/build/hooks/style.js +7 -7
  111. package/build/hooks/style.js.map +1 -1
  112. package/build/hooks/supports.js +7 -7
  113. package/build/hooks/supports.js.map +1 -1
  114. package/build/hooks/typography.js +6 -6
  115. package/build/hooks/typography.js.map +1 -1
  116. package/build/hooks/use-zoom-out.js +12 -1
  117. package/build/hooks/use-zoom-out.js.map +1 -1
  118. package/build/hooks/utils.js +1 -1
  119. package/build/hooks/utils.js.map +1 -1
  120. package/build/store/private-actions.js +1 -1
  121. package/build/store/private-actions.js.map +1 -1
  122. package/build/store/private-selectors.js +11 -1
  123. package/build/store/private-selectors.js.map +1 -1
  124. package/build/store/reducer.js +93 -12
  125. package/build/store/reducer.js.map +1 -1
  126. package/build/store/selectors.js +6 -8
  127. package/build/store/selectors.js.map +1 -1
  128. package/build/utils/block-bindings.js +95 -0
  129. package/build/utils/block-bindings.js.map +1 -1
  130. package/build-module/components/audio-player/index.native.js +2 -2
  131. package/build-module/components/audio-player/index.native.js.map +1 -1
  132. package/build-module/components/background-image-control/index.js +5 -1
  133. package/build-module/components/background-image-control/index.js.map +1 -1
  134. package/build-module/components/block-alignment-matrix-control/index.js +32 -0
  135. package/build-module/components/block-alignment-matrix-control/index.js.map +1 -1
  136. package/build-module/components/block-card/index.js +45 -8
  137. package/build-module/components/block-card/index.js.map +1 -1
  138. package/build-module/components/block-edit/edit.js +148 -11
  139. package/build-module/components/block-edit/edit.js.map +1 -1
  140. package/build-module/components/block-list/index.js +2 -3
  141. package/build-module/components/block-list/index.js.map +1 -1
  142. package/build-module/components/block-list/use-block-props/index.js +1 -1
  143. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  144. package/build-module/components/block-list/zoom-out-separator.js +20 -3
  145. package/build-module/components/block-list/zoom-out-separator.js.map +1 -1
  146. package/build-module/components/block-settings-menu/block-settings-dropdown.js +5 -8
  147. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  148. package/build-module/components/block-styles/utils.js +3 -3
  149. package/build-module/components/block-styles/utils.js.map +1 -1
  150. package/build-module/components/block-tools/zoom-out-mode-inserters.js +19 -6
  151. package/build-module/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  152. package/build-module/components/button-block-appender/index.js +2 -6
  153. package/build-module/components/button-block-appender/index.js.map +1 -1
  154. package/build-module/components/child-layout-control/index.js +7 -1
  155. package/build-module/components/child-layout-control/index.js.map +1 -1
  156. package/build-module/components/colors-gradients/dropdown.js +51 -11
  157. package/build-module/components/colors-gradients/dropdown.js.map +1 -1
  158. package/build-module/components/contrast-checker/index.native.js +2 -2
  159. package/build-module/components/contrast-checker/index.native.js.map +1 -1
  160. package/build-module/components/date-format-picker/index.js +7 -16
  161. package/build-module/components/date-format-picker/index.js.map +1 -1
  162. package/build-module/components/font-appearance-control/index.js +8 -0
  163. package/build-module/components/font-appearance-control/index.js.map +1 -1
  164. package/build-module/components/font-family/index.js +10 -1
  165. package/build-module/components/font-family/index.js.map +1 -1
  166. package/build-module/components/global-styles/color-panel.js +3 -0
  167. package/build-module/components/global-styles/color-panel.js.map +1 -1
  168. package/build-module/components/global-styles/typography-utils.js +1 -1
  169. package/build-module/components/global-styles/typography-utils.js.map +1 -1
  170. package/build-module/components/global-styles/use-global-styles-output.js +2 -2
  171. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  172. package/build-module/components/grid/grid-visualizer.js +9 -0
  173. package/build-module/components/grid/grid-visualizer.js.map +1 -1
  174. package/build-module/components/grid/utils.js +12 -1
  175. package/build-module/components/grid/utils.js.map +1 -1
  176. package/build-module/components/iframe/index.js +1 -1
  177. package/build-module/components/iframe/index.js.map +1 -1
  178. package/build-module/components/inner-blocks/use-inner-block-template-sync.js +12 -12
  179. package/build-module/components/inner-blocks/use-inner-block-template-sync.js.map +1 -1
  180. package/build-module/components/inserter/block-patterns-explorer/index.js +1 -1
  181. package/build-module/components/inserter/block-patterns-explorer/index.js.map +1 -1
  182. package/build-module/components/inserter/block-patterns-tab/index.js +1 -1
  183. package/build-module/components/inserter/block-patterns-tab/index.js.map +1 -1
  184. package/build-module/components/inserter/block-patterns-tab/pattern-category-previews.js +4 -4
  185. package/build-module/components/inserter/block-patterns-tab/pattern-category-previews.js.map +1 -1
  186. package/build-module/components/inserter/block-patterns-tab/patterns-filter.js +2 -2
  187. package/build-module/components/inserter/block-patterns-tab/patterns-filter.js.map +1 -1
  188. package/build-module/components/inserter/category-tabs/index.js +1 -2
  189. package/build-module/components/inserter/category-tabs/index.js.map +1 -1
  190. package/build-module/components/inserter/index.js +6 -15
  191. package/build-module/components/inserter/index.js.map +1 -1
  192. package/build-module/components/inserter/quick-inserter.js +2 -13
  193. package/build-module/components/inserter/quick-inserter.js.map +1 -1
  194. package/build-module/components/keyboard-shortcuts/index.js +2 -2
  195. package/build-module/components/keyboard-shortcuts/index.js.map +1 -1
  196. package/build-module/components/line-height-control/index.js +8 -0
  197. package/build-module/components/line-height-control/index.js.map +1 -1
  198. package/build-module/components/media-placeholder/index.js +3 -3
  199. package/build-module/components/media-placeholder/index.js.map +1 -1
  200. package/build-module/components/media-replace-flow/index.js +28 -28
  201. package/build-module/components/media-replace-flow/index.js.map +1 -1
  202. package/build-module/components/plain-text/index.js +34 -0
  203. package/build-module/components/plain-text/index.js.map +1 -1
  204. package/build-module/components/provider/index.js +62 -5
  205. package/build-module/components/provider/index.js.map +1 -1
  206. package/build-module/components/provider/use-media-upload-settings.js +22 -0
  207. package/build-module/components/provider/use-media-upload-settings.js.map +1 -0
  208. package/build-module/components/resolution-tool/index.js +3 -1
  209. package/build-module/components/resolution-tool/index.js.map +1 -1
  210. package/build-module/components/responsive-block-control/index.js +1 -1
  211. package/build-module/components/responsive-block-control/index.js.map +1 -1
  212. package/build-module/components/rich-text/event-listeners/delete.js +7 -1
  213. package/build-module/components/rich-text/event-listeners/delete.js.map +1 -1
  214. package/build-module/components/rich-text/index.js +1 -1
  215. package/build-module/components/rich-text/index.js.map +1 -1
  216. package/build-module/components/use-block-drop-zone/index.js +2 -1
  217. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  218. package/build-module/hooks/background.js +2 -0
  219. package/build-module/hooks/background.js.map +1 -1
  220. package/build-module/hooks/block-bindings.js +13 -12
  221. package/build-module/hooks/block-bindings.js.map +1 -1
  222. package/build-module/hooks/border.js +3 -3
  223. package/build-module/hooks/border.js.map +1 -1
  224. package/build-module/hooks/color.js +1 -1
  225. package/build-module/hooks/color.js.map +1 -1
  226. package/build-module/hooks/dimensions.js +2 -2
  227. package/build-module/hooks/dimensions.js.map +1 -1
  228. package/build-module/hooks/font-family.js +1 -1
  229. package/build-module/hooks/font-family.js.map +1 -1
  230. package/build-module/hooks/gap.js +2 -2
  231. package/build-module/hooks/gap.js.map +1 -1
  232. package/build-module/hooks/index.js +0 -1
  233. package/build-module/hooks/index.js.map +1 -1
  234. package/build-module/hooks/index.native.js +1 -0
  235. package/build-module/hooks/index.native.js.map +1 -1
  236. package/build-module/hooks/style.js +7 -7
  237. package/build-module/hooks/style.js.map +1 -1
  238. package/build-module/hooks/supports.js +7 -7
  239. package/build-module/hooks/supports.js.map +1 -1
  240. package/build-module/hooks/typography.js +6 -6
  241. package/build-module/hooks/typography.js.map +1 -1
  242. package/build-module/hooks/use-zoom-out.js +12 -2
  243. package/build-module/hooks/use-zoom-out.js.map +1 -1
  244. package/build-module/hooks/utils.js +1 -1
  245. package/build-module/hooks/utils.js.map +1 -1
  246. package/build-module/store/private-actions.js +1 -1
  247. package/build-module/store/private-actions.js.map +1 -1
  248. package/build-module/store/private-selectors.js +11 -1
  249. package/build-module/store/private-selectors.js.map +1 -1
  250. package/build-module/store/reducer.js +93 -12
  251. package/build-module/store/reducer.js.map +1 -1
  252. package/build-module/store/selectors.js +6 -8
  253. package/build-module/store/selectors.js.map +1 -1
  254. package/build-module/utils/block-bindings.js +90 -0
  255. package/build-module/utils/block-bindings.js.map +1 -1
  256. package/build-style/style-rtl.css +27 -9
  257. package/build-style/style.css +27 -9
  258. package/package.json +33 -33
  259. package/src/components/audio-player/index.native.js +2 -2
  260. package/src/components/background-image-control/index.js +4 -0
  261. package/src/components/background-image-control/style.scss +4 -2
  262. package/src/components/block-alignment-matrix-control/README.md +29 -6
  263. package/src/components/block-alignment-matrix-control/index.js +31 -0
  264. package/src/components/block-alignment-matrix-control/stories/index.story.js +78 -0
  265. package/src/components/block-card/README.md +7 -0
  266. package/src/components/block-card/index.js +41 -12
  267. package/src/components/block-card/stories/index.story.js +79 -0
  268. package/src/components/block-card/style.scss +9 -1
  269. package/src/components/block-edit/edit.js +218 -11
  270. package/src/components/block-list/index.js +2 -7
  271. package/src/components/block-list/use-block-props/index.js +1 -1
  272. package/src/components/block-list/zoom-out-separator.js +30 -0
  273. package/src/components/block-settings-menu/block-settings-dropdown.js +17 -20
  274. package/src/components/block-styles/utils.js +3 -3
  275. package/src/components/block-title/stories/index.story.js +76 -0
  276. package/src/components/block-tools/style.scss +1 -0
  277. package/src/components/block-tools/zoom-out-mode-inserters.js +21 -3
  278. package/src/components/border-radius-control/README.md +59 -0
  279. package/src/components/border-radius-control/stories/index.story.js +58 -0
  280. package/src/components/button-block-appender/index.js +2 -7
  281. package/src/components/child-layout-control/index.js +14 -0
  282. package/src/components/colors-gradients/dropdown.js +57 -8
  283. package/src/components/colors-gradients/style.scss +5 -0
  284. package/src/components/contrast-checker/index.native.js +2 -2
  285. package/src/components/contrast-checker/stories/index.story.js +117 -0
  286. package/src/components/date-format-picker/README.md +6 -13
  287. package/src/components/date-format-picker/index.js +10 -17
  288. package/src/components/date-format-picker/stories/index.story.js +69 -0
  289. package/src/components/date-format-picker/style.scss +3 -1
  290. package/src/components/default-block-appender/content.scss +1 -0
  291. package/src/components/dimensions-tool/stories/aspect-ratio-tool.story.js +2 -1
  292. package/src/components/dimensions-tool/stories/index.story.js +2 -1
  293. package/src/components/dimensions-tool/stories/scale-tool.story.js +2 -1
  294. package/src/components/dimensions-tool/stories/width-height-tool.story.js +2 -1
  295. package/src/components/font-appearance-control/index.js +15 -0
  296. package/src/components/font-family/README.md +1 -0
  297. package/src/components/font-family/index.js +17 -1
  298. package/src/components/font-family/stories/index.story.js +1 -0
  299. package/src/components/global-styles/color-panel.js +3 -0
  300. package/src/components/global-styles/test/use-global-styles-output.js +1 -1
  301. package/src/components/global-styles/typography-utils.js +1 -1
  302. package/src/components/global-styles/use-global-styles-output.js +2 -2
  303. package/src/components/grid/grid-visualizer.js +11 -0
  304. package/src/components/grid/utils.js +19 -1
  305. package/src/components/iframe/index.js +1 -1
  306. package/src/components/inner-blocks/use-inner-block-template-sync.js +17 -10
  307. package/src/components/inserter/block-patterns-explorer/index.js +2 -3
  308. package/src/components/inserter/block-patterns-tab/index.js +3 -1
  309. package/src/components/inserter/block-patterns-tab/pattern-category-previews.js +4 -4
  310. package/src/components/inserter/block-patterns-tab/patterns-filter.js +2 -2
  311. package/src/components/inserter/category-tabs/index.js +3 -2
  312. package/src/components/inserter/index.js +1 -13
  313. package/src/components/inserter/quick-inserter.js +2 -25
  314. package/src/components/keyboard-shortcuts/index.js +2 -2
  315. package/src/components/line-height-control/README.md +1 -0
  316. package/src/components/line-height-control/index.js +12 -0
  317. package/src/components/line-height-control/stories/index.story.js +1 -0
  318. package/src/components/line-height-control/test/index.js +7 -1
  319. package/src/components/list-view/style.scss +10 -5
  320. package/src/components/media-placeholder/index.js +3 -3
  321. package/src/components/media-replace-flow/README.md +7 -0
  322. package/src/components/media-replace-flow/index.js +28 -36
  323. package/src/components/media-replace-flow/style.scss +6 -6
  324. package/src/components/plain-text/README.md +2 -2
  325. package/src/components/plain-text/index.js +34 -0
  326. package/src/components/plain-text/stories/index.story.js +75 -0
  327. package/src/components/provider/index.js +81 -4
  328. package/src/components/provider/use-media-upload-settings.js +25 -0
  329. package/src/components/resolution-tool/index.js +2 -0
  330. package/src/components/resolution-tool/stories/index.story.js +36 -8
  331. package/src/components/responsive-block-control/index.js +1 -1
  332. package/src/components/rich-text/event-listeners/delete.js +6 -1
  333. package/src/components/rich-text/index.js +1 -1
  334. package/src/components/text-alignment-control/README.md +49 -0
  335. package/src/components/text-alignment-control/stories/index.story.js +56 -18
  336. package/src/components/text-decoration-control/README.md +0 -1
  337. package/src/components/text-decoration-control/stories/index.story.js +51 -16
  338. package/src/components/text-transform-control/README.md +3 -4
  339. package/src/components/text-transform-control/stories/index.story.js +53 -16
  340. package/src/components/use-block-drop-zone/index.js +8 -1
  341. package/src/components/warning/stories/index.story.js +86 -0
  342. package/src/hooks/background.js +6 -0
  343. package/src/hooks/block-bindings.js +17 -18
  344. package/src/hooks/border.js +9 -3
  345. package/src/hooks/color.js +1 -1
  346. package/src/hooks/dimensions.js +2 -2
  347. package/src/hooks/font-family.js +1 -1
  348. package/src/hooks/gap.js +2 -2
  349. package/src/hooks/index.js +0 -1
  350. package/src/hooks/index.native.js +1 -0
  351. package/src/hooks/style.js +13 -7
  352. package/src/hooks/supports.js +7 -7
  353. package/src/hooks/test/style.js +2 -1
  354. package/src/hooks/typography.js +6 -6
  355. package/src/hooks/use-zoom-out.js +10 -2
  356. package/src/hooks/utils.js +1 -1
  357. package/src/store/private-actions.js +1 -0
  358. package/src/store/private-selectors.js +15 -5
  359. package/src/store/reducer.js +112 -19
  360. package/src/store/selectors.js +6 -8
  361. package/src/store/test/private-selectors.js +53 -9
  362. package/src/store/test/reducer.js +172 -166
  363. package/src/store/test/selectors.js +23 -0
  364. package/src/utils/block-bindings.js +95 -0
  365. package/tsconfig.json +2 -5
  366. package/build/hooks/use-bindings-attributes.js +0 -262
  367. package/build/hooks/use-bindings-attributes.js.map +0 -1
  368. package/build-module/hooks/use-bindings-attributes.js +0 -253
  369. package/build-module/hooks/use-bindings-attributes.js.map +0 -1
  370. package/src/hooks/use-bindings-attributes.js +0 -322
@@ -12,8 +12,7 @@ import {
12
12
  createBlock,
13
13
  privateApis,
14
14
  } from '@wordpress/blocks';
15
- import { combineReducers, select } from '@wordpress/data';
16
- import { store as preferencesStore } from '@wordpress/preferences';
15
+ import { combineReducers } from '@wordpress/data';
17
16
 
18
17
  /**
19
18
  * Internal dependencies
@@ -3576,6 +3575,7 @@ describe( 'state', () => {
3576
3575
  blocks,
3577
3576
  settings,
3578
3577
  zoomLevel,
3578
+ blockEditingModes,
3579
3579
  } )
3580
3580
  );
3581
3581
 
@@ -3598,15 +3598,6 @@ describe( 'state', () => {
3598
3598
  describe( 'edit mode', () => {
3599
3599
  let initialState;
3600
3600
  beforeAll( () => {
3601
- select.mockImplementation( ( storeName ) => {
3602
- if ( storeName === preferencesStore ) {
3603
- return {
3604
- get: jest.fn( () => 'edit' ),
3605
- };
3606
- }
3607
- return select( storeName );
3608
- } );
3609
-
3610
3601
  initialState = dispatchActions(
3611
3602
  [
3612
3603
  {
@@ -3651,10 +3642,6 @@ describe( 'state', () => {
3651
3642
  );
3652
3643
  } );
3653
3644
 
3654
- afterAll( () => {
3655
- select.mockRestore();
3656
- } );
3657
-
3658
3645
  it( 'returns no block editing modes when zoomed out / navigation mode are not active and there are no synced patterns', () => {
3659
3646
  expect( initialState.derivedBlockEditingModes ).toEqual(
3660
3647
  new Map()
@@ -3665,15 +3652,6 @@ describe( 'state', () => {
3665
3652
  describe( 'synced patterns', () => {
3666
3653
  let initialState;
3667
3654
  beforeAll( () => {
3668
- select.mockImplementation( ( storeName ) => {
3669
- if ( storeName === preferencesStore ) {
3670
- return {
3671
- get: jest.fn( () => 'edit' ),
3672
- };
3673
- }
3674
- return select( storeName );
3675
- } );
3676
-
3677
3655
  // Simulates how the editor typically inserts controlled blocks,
3678
3656
  // - first the pattern is inserted with no inner blocks.
3679
3657
  // - next the pattern is marked as a controlled block.
@@ -3818,10 +3796,6 @@ describe( 'state', () => {
3818
3796
  );
3819
3797
  } );
3820
3798
 
3821
- afterAll( () => {
3822
- select.mockRestore();
3823
- } );
3824
-
3825
3799
  it( 'returns the expected block editing modes for synced patterns', () => {
3826
3800
  // Only the parent pattern and its own children that have bindings
3827
3801
  // are in contentOnly mode. All other blocks are disabled.
@@ -3840,60 +3814,8 @@ describe( 'state', () => {
3840
3814
  );
3841
3815
  } );
3842
3816
 
3843
- it( 'removes block editing modes when synced patterns are removed', () => {
3844
- const { derivedBlockEditingModes } = dispatchActions(
3845
- [
3846
- {
3847
- type: 'REMOVE_BLOCKS',
3848
- clientIds: [ 'root-pattern' ],
3849
- },
3850
- ],
3851
- testReducer,
3852
- initialState
3853
- );
3854
-
3855
- expect( derivedBlockEditingModes ).toEqual( new Map() );
3856
- } );
3857
-
3858
- it( 'returns the expected block editing modes for synced patterns when switching to navigation mode', () => {
3859
- select.mockImplementation( ( storeName ) => {
3860
- if ( storeName === preferencesStore ) {
3861
- return {
3862
- get: jest.fn( () => 'navigation' ),
3863
- };
3864
- }
3865
- return select( storeName );
3866
- } );
3867
-
3868
- const {
3869
- derivedBlockEditingModes,
3870
- derivedNavModeBlockEditingModes,
3871
- } = dispatchActions(
3872
- [
3873
- {
3874
- type: 'SET_EDITOR_MODE',
3875
- mode: 'navigation',
3876
- },
3877
- ],
3878
- testReducer,
3879
- initialState
3880
- );
3881
-
3882
- expect( derivedBlockEditingModes ).toEqual(
3883
- new Map(
3884
- Object.entries( {
3885
- 'pattern-paragraph': 'disabled',
3886
- 'pattern-group': 'disabled',
3887
- 'pattern-paragraph-with-overrides': 'contentOnly', // Pattern child with bindings.
3888
- 'nested-pattern': 'disabled',
3889
- 'nested-paragraph': 'disabled',
3890
- 'nested-group': 'disabled',
3891
- 'nested-paragraph-with-overrides': 'disabled',
3892
- } )
3893
- )
3894
- );
3895
-
3896
- expect( derivedNavModeBlockEditingModes ).toEqual(
3817
+ it( 'returns the expected block editing modes for synced patterns in navigation mode', () => {
3818
+ expect( initialState.derivedNavModeBlockEditingModes ).toEqual(
3897
3819
  new Map(
3898
3820
  Object.entries( {
3899
3821
  '': 'contentOnly', // Section root.
@@ -3912,15 +3834,21 @@ describe( 'state', () => {
3912
3834
  } )
3913
3835
  )
3914
3836
  );
3837
+ } );
3915
3838
 
3916
- select.mockImplementation( ( storeName ) => {
3917
- if ( storeName === preferencesStore ) {
3918
- return {
3919
- get: jest.fn( () => 'edit' ),
3920
- };
3921
- }
3922
- return select( storeName );
3923
- } );
3839
+ it( 'removes block editing modes when synced patterns are removed', () => {
3840
+ const { derivedBlockEditingModes } = dispatchActions(
3841
+ [
3842
+ {
3843
+ type: 'REMOVE_BLOCKS',
3844
+ clientIds: [ 'root-pattern' ],
3845
+ },
3846
+ ],
3847
+ testReducer,
3848
+ initialState
3849
+ );
3850
+
3851
+ expect( derivedBlockEditingModes ).toEqual( new Map() );
3924
3852
  } );
3925
3853
 
3926
3854
  it( 'returns the expected block editing modes for synced patterns when switching to zoomed out mode', () => {
@@ -3961,52 +3889,104 @@ describe( 'state', () => {
3961
3889
  let initialState;
3962
3890
 
3963
3891
  beforeAll( () => {
3964
- select.mockImplementation( ( storeName ) => {
3965
- if ( storeName === preferencesStore ) {
3966
- return {
3967
- get: jest.fn( () => 'navigation' ),
3968
- };
3969
- }
3970
- return select( storeName );
3971
- } );
3972
-
3973
3892
  initialState = dispatchActions(
3974
3893
  [
3975
3894
  {
3976
3895
  type: 'UPDATE_SETTINGS',
3977
3896
  settings: {
3978
- [ sectionRootClientIdKey ]: '',
3897
+ [ sectionRootClientIdKey ]: 'section-root',
3979
3898
  },
3980
3899
  },
3981
3900
  {
3982
3901
  type: 'RESET_BLOCKS',
3983
3902
  blocks: [
3903
+ {
3904
+ name: 'core/template-part',
3905
+ clientId: 'header',
3906
+ attributes: {},
3907
+ innerBlocks: [],
3908
+ },
3984
3909
  {
3985
3910
  name: 'core/group',
3986
- clientId: 'group-1',
3911
+ clientId: 'section-root',
3987
3912
  attributes: {},
3988
3913
  innerBlocks: [
3989
- {
3990
- name: 'core/paragraph',
3991
- clientId: 'paragraph-1',
3992
- attributes: {},
3993
- innerBlocks: [],
3994
- },
3995
3914
  {
3996
3915
  name: 'core/group',
3997
- clientId: 'group-2',
3916
+ clientId: 'group-1',
3998
3917
  attributes: {},
3999
3918
  innerBlocks: [
4000
3919
  {
4001
3920
  name: 'core/paragraph',
4002
- clientId: 'paragraph-2',
3921
+ clientId: 'paragraph-1',
4003
3922
  attributes: {},
4004
3923
  innerBlocks: [],
4005
3924
  },
3925
+ {
3926
+ name: 'core/group',
3927
+ clientId: 'group-2',
3928
+ attributes: {},
3929
+ innerBlocks: [
3930
+ {
3931
+ name: 'core/paragraph',
3932
+ clientId:
3933
+ 'paragraph-2',
3934
+ attributes: {},
3935
+ innerBlocks: [],
3936
+ },
3937
+ ],
3938
+ },
4006
3939
  ],
4007
3940
  },
4008
3941
  ],
4009
3942
  },
3943
+ {
3944
+ name: 'core/template-part',
3945
+ clientId: 'footer',
3946
+ attributes: {},
3947
+ innerBlocks: [],
3948
+ },
3949
+ ],
3950
+ },
3951
+ {
3952
+ type: 'SET_HAS_CONTROLLED_INNER_BLOCKS',
3953
+ clientId: 'header',
3954
+ hasControlledInnerBlocks: true,
3955
+ },
3956
+ {
3957
+ type: 'REPLACE_INNER_BLOCKS',
3958
+ rootClientId: 'header',
3959
+ blocks: [
3960
+ {
3961
+ name: 'core/group',
3962
+ clientId: 'header-group',
3963
+ attributes: {},
3964
+ innerBlocks: [
3965
+ {
3966
+ name: 'core/paragraph',
3967
+ clientId: 'header-paragraph',
3968
+ attributes: {},
3969
+ innerBlocks: [],
3970
+ },
3971
+ ],
3972
+ },
3973
+ ],
3974
+ },
3975
+ {
3976
+ type: 'SET_HAS_CONTROLLED_INNER_BLOCKS',
3977
+ clientId: 'footer',
3978
+ hasControlledInnerBlocks: true,
3979
+ },
3980
+ {
3981
+ type: 'REPLACE_INNER_BLOCKS',
3982
+ rootClientId: 'footer',
3983
+ blocks: [
3984
+ {
3985
+ name: 'core/paragraph',
3986
+ clientId: 'footer-paragraph',
3987
+ attributes: {},
3988
+ innerBlocks: [],
3989
+ },
4010
3990
  ],
4011
3991
  },
4012
3992
  ],
@@ -4014,15 +3994,17 @@ describe( 'state', () => {
4014
3994
  );
4015
3995
  } );
4016
3996
 
4017
- afterAll( () => {
4018
- select.mockRestore();
4019
- } );
4020
-
4021
3997
  it( 'returns the expected block editing modes', () => {
4022
3998
  expect( initialState.derivedNavModeBlockEditingModes ).toEqual(
4023
3999
  new Map(
4024
4000
  Object.entries( {
4025
- '': 'contentOnly', // Section root.
4001
+ '': 'disabled',
4002
+ header: 'contentOnly', // Template part.
4003
+ 'header-group': 'disabled', // Content block in template part.
4004
+ 'header-paragraph': 'contentOnly', // Content block in template part.
4005
+ footer: 'contentOnly', // Template part.
4006
+ 'footer-paragraph': 'contentOnly', // Content block in template part.
4007
+ 'section-root': 'contentOnly', // Section root.
4026
4008
  'group-1': 'contentOnly', // Section block.
4027
4009
  'paragraph-1': 'contentOnly', // Content block in section.
4028
4010
  'group-2': 'disabled', // Non-content block in section.
@@ -4032,6 +4014,49 @@ describe( 'state', () => {
4032
4014
  );
4033
4015
  } );
4034
4016
 
4017
+ it( 'allows content blocks to be disabled explicitly using the block editing mode', () => {
4018
+ const {
4019
+ derivedNavModeBlockEditingModes,
4020
+ blockEditingModes: _blockEditingModes,
4021
+ } = dispatchActions(
4022
+ [
4023
+ {
4024
+ type: 'SET_BLOCK_EDITING_MODE',
4025
+ clientId: 'paragraph-1',
4026
+ mode: 'disabled',
4027
+ },
4028
+ ],
4029
+ testReducer,
4030
+ initialState
4031
+ );
4032
+
4033
+ // Paragraph 1 is explicitly disabled and omitted from the
4034
+ // derived block editing modes.
4035
+ expect( _blockEditingModes ).toEqual(
4036
+ new Map(
4037
+ Object.entries( {
4038
+ 'paragraph-1': 'disabled',
4039
+ } )
4040
+ )
4041
+ );
4042
+ expect( derivedNavModeBlockEditingModes ).toEqual(
4043
+ new Map(
4044
+ Object.entries( {
4045
+ '': 'disabled',
4046
+ header: 'contentOnly',
4047
+ 'header-group': 'disabled',
4048
+ 'header-paragraph': 'contentOnly',
4049
+ footer: 'contentOnly',
4050
+ 'footer-paragraph': 'contentOnly',
4051
+ 'section-root': 'contentOnly',
4052
+ 'group-1': 'contentOnly',
4053
+ 'group-2': 'disabled',
4054
+ 'paragraph-2': 'contentOnly',
4055
+ } )
4056
+ )
4057
+ );
4058
+ } );
4059
+
4035
4060
  it( 'removes block editing modes when blocks are removed', () => {
4036
4061
  const { derivedNavModeBlockEditingModes } = dispatchActions(
4037
4062
  [
@@ -4047,7 +4072,13 @@ describe( 'state', () => {
4047
4072
  expect( derivedNavModeBlockEditingModes ).toEqual(
4048
4073
  new Map(
4049
4074
  Object.entries( {
4050
- '': 'contentOnly',
4075
+ '': 'disabled',
4076
+ header: 'contentOnly', // Template part.
4077
+ 'header-group': 'disabled', // Content block in template part.
4078
+ 'header-paragraph': 'contentOnly', // Content block in template part.
4079
+ footer: 'contentOnly', // Template part.
4080
+ 'footer-paragraph': 'contentOnly', // Content block in template part.
4081
+ 'section-root': 'contentOnly',
4051
4082
  'group-1': 'contentOnly',
4052
4083
  'paragraph-1': 'contentOnly',
4053
4084
  } )
@@ -4060,7 +4091,7 @@ describe( 'state', () => {
4060
4091
  [
4061
4092
  {
4062
4093
  type: 'INSERT_BLOCKS',
4063
- rootClientId: '',
4094
+ rootClientId: 'section-root',
4064
4095
  blocks: [
4065
4096
  {
4066
4097
  name: 'core/group',
@@ -4091,7 +4122,13 @@ describe( 'state', () => {
4091
4122
  expect( derivedNavModeBlockEditingModes ).toEqual(
4092
4123
  new Map(
4093
4124
  Object.entries( {
4094
- '': 'contentOnly', // Section root.
4125
+ '': 'disabled', // Section root.
4126
+ header: 'contentOnly', // Template part.
4127
+ 'header-group': 'disabled', // Content block in template part.
4128
+ 'header-paragraph': 'contentOnly', // Content block in template part.
4129
+ footer: 'contentOnly', // Template part.
4130
+ 'footer-paragraph': 'contentOnly', // Content block in template part.
4131
+ 'section-root': 'contentOnly', // Section root.
4095
4132
  'group-1': 'contentOnly', // Section block.
4096
4133
  'paragraph-1': 'contentOnly', // Content block in section.
4097
4134
  'group-2': 'disabled', // Non-content block in section.
@@ -4111,7 +4148,7 @@ describe( 'state', () => {
4111
4148
  type: 'MOVE_BLOCKS_TO_POSITION',
4112
4149
  clientIds: [ 'group-2' ],
4113
4150
  fromRootClientId: 'group-1',
4114
- toRootClientId: '',
4151
+ toRootClientId: 'section-root',
4115
4152
  },
4116
4153
  ],
4117
4154
  testReducer,
@@ -4120,7 +4157,13 @@ describe( 'state', () => {
4120
4157
  expect( derivedNavModeBlockEditingModes ).toEqual(
4121
4158
  new Map(
4122
4159
  Object.entries( {
4123
- '': 'contentOnly', // Section root.
4160
+ '': 'disabled', // Section root.
4161
+ header: 'contentOnly', // Template part.
4162
+ 'header-group': 'disabled', // Content block in template part.
4163
+ 'header-paragraph': 'contentOnly', // Content block in template part.
4164
+ footer: 'contentOnly', // Template part.
4165
+ 'footer-paragraph': 'contentOnly', // Content block in template part.
4166
+ 'section-root': 'contentOnly', // Section root.
4124
4167
  'group-1': 'contentOnly', // Section block.
4125
4168
  'paragraph-1': 'contentOnly', // Content block in section.
4126
4169
  'group-2': 'contentOnly', // New section block.
@@ -4148,10 +4191,16 @@ describe( 'state', () => {
4148
4191
  new Map(
4149
4192
  Object.entries( {
4150
4193
  '': 'disabled',
4151
- 'group-1': 'contentOnly',
4152
- 'paragraph-1': 'contentOnly',
4153
- 'group-2': 'contentOnly',
4154
- 'paragraph-2': 'contentOnly',
4194
+ header: 'contentOnly', // Template part.
4195
+ 'header-group': 'disabled', // Content block in template part.
4196
+ 'header-paragraph': 'contentOnly', // Content block in template part.
4197
+ footer: 'contentOnly', // Template part.
4198
+ 'footer-paragraph': 'contentOnly', // Content block in template part.
4199
+ 'section-root': 'disabled',
4200
+ 'group-1': 'contentOnly', // New section root.
4201
+ 'paragraph-1': 'contentOnly', // Section and content block
4202
+ 'group-2': 'contentOnly', // Section.
4203
+ 'paragraph-2': 'contentOnly', // Content block.
4155
4204
  } )
4156
4205
  )
4157
4206
  );
@@ -4224,49 +4273,6 @@ describe( 'state', () => {
4224
4273
  );
4225
4274
  } );
4226
4275
 
4227
- it( 'overrides navigation mode', () => {
4228
- select.mockImplementation( ( storeName ) => {
4229
- if ( storeName === preferencesStore ) {
4230
- return {
4231
- get: jest.fn( () => 'navigation' ),
4232
- };
4233
- }
4234
- return select( storeName );
4235
- } );
4236
-
4237
- const { derivedBlockEditingModes } = dispatchActions(
4238
- [
4239
- {
4240
- type: 'SET_EDITOR_MODE',
4241
- mode: 'navigation',
4242
- },
4243
- ],
4244
- testReducer,
4245
- initialState
4246
- );
4247
-
4248
- expect( derivedBlockEditingModes ).toEqual(
4249
- new Map(
4250
- Object.entries( {
4251
- '': 'contentOnly', // Section root.
4252
- 'group-1': 'contentOnly', // Section block.
4253
- 'paragraph-1': 'disabled',
4254
- 'group-2': 'disabled',
4255
- 'paragraph-2': 'disabled',
4256
- } )
4257
- )
4258
- );
4259
-
4260
- select.mockImplementation( ( storeName ) => {
4261
- if ( storeName === preferencesStore ) {
4262
- return {
4263
- get: jest.fn( () => 'edit' ),
4264
- };
4265
- }
4266
- return select( storeName );
4267
- } );
4268
- } );
4269
-
4270
4276
  it( 'removes block editing modes when blocks are removed', () => {
4271
4277
  const { derivedBlockEditingModes } = dispatchActions(
4272
4278
  [
@@ -4465,6 +4465,7 @@ describe( 'getBlockEditingMode', () => {
4465
4465
  '9b9c5c3f-2e46-4f02-9e14-9fe9515b958f': {},
4466
4466
  },
4467
4467
  blockEditingModes: new Map( [] ),
4468
+ derivedBlockEditingModes: new Map( [] ),
4468
4469
  };
4469
4470
 
4470
4471
  const hasContentRoleAttribute = jest.fn( () => false );
@@ -4519,6 +4520,13 @@ describe( 'getBlockEditingMode', () => {
4519
4520
  blockEditingModes: new Map( [
4520
4521
  [ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
4521
4522
  ] ),
4523
+ derivedBlockEditingModes: new Map( [
4524
+ [ 'b26fc763-417d-4f01-b81c-2ec61e14a972', 'disabled' ],
4525
+ [ '9b9c5c3f-2e46-4f02-9e14-9fe9515b958f', 'disabled' ],
4526
+ [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'disabled' ],
4527
+ [ 'e178812d-ce5e-48c7-a945-8ae4ffcbbb7c', 'disabled' ],
4528
+ [ '9b9c5c3f-2e46-4f02-9e14-9fed515b958s', 'disabled' ],
4529
+ ] ),
4522
4530
  };
4523
4531
  expect(
4524
4532
  getBlockEditingMode( state, 'b3247f75-fd94-4fef-97f9-5bfd162cc416' )
@@ -4545,6 +4553,12 @@ describe( 'getBlockEditingMode', () => {
4545
4553
  [ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'default' ],
4546
4554
  [ '9b9c5c3f-2e46-4f02-9e14-9fe9515b958f', 'disabled' ],
4547
4555
  ] ),
4556
+ derivedBlockEditingModes: new Map( [
4557
+ [ '6cf70164-9097-4460-bcbf-200560546988', 'disabled' ],
4558
+ [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'disabled' ],
4559
+ [ 'e178812d-ce5e-48c7-a945-8ae4ffcbbb7c', 'disabled' ],
4560
+ [ '9b9c5c3f-2e46-4f02-9e14-9fed515b958s', 'disabled' ],
4561
+ ] ),
4548
4562
  };
4549
4563
  expect(
4550
4564
  getBlockEditingMode( state, 'b3247f75-fd94-4fef-97f9-5bfd162cc416' )
@@ -4555,6 +4569,15 @@ describe( 'getBlockEditingMode', () => {
4555
4569
  const state = {
4556
4570
  ...baseState,
4557
4571
  blockEditingModes: new Map( [ [ '', 'disabled' ] ] ),
4572
+ derivedBlockEditingModes: new Map( [
4573
+ [ '6cf70164-9097-4460-bcbf-200560546988', 'disabled' ],
4574
+ [ 'ef45d5fd-5234-4fd5-ac4f-c3736c7f9337', 'disabled' ],
4575
+ [ 'b26fc763-417d-4f01-b81c-2ec61e14a972', 'disabled' ],
4576
+ [ '9b9c5c3f-2e46-4f02-9e14-9fe9515b958f', 'disabled' ],
4577
+ [ 'b3247f75-fd94-4fef-97f9-5bfd162cc416', 'disabled' ],
4578
+ [ 'e178812d-ce5e-48c7-a945-8ae4ffcbbb7c', 'disabled' ],
4579
+ [ '9b9c5c3f-2e46-4f02-9e14-9fed515b958s', 'disabled' ],
4580
+ ] ),
4558
4581
  };
4559
4582
  expect(
4560
4583
  getBlockEditingMode( state, 'b3247f75-fd94-4fef-97f9-5bfd162cc416' )
@@ -9,10 +9,105 @@ import { useDispatch, useRegistry } from '@wordpress/data';
9
9
  import { store as blockEditorStore } from '../store';
10
10
  import { useBlockEditContext } from '../components/block-edit';
11
11
 
12
+ const DEFAULT_ATTRIBUTE = '__default';
13
+ const PATTERN_OVERRIDES_SOURCE = 'core/pattern-overrides';
14
+ const BLOCK_BINDINGS_ALLOWED_BLOCKS = {
15
+ 'core/paragraph': [ 'content' ],
16
+ 'core/heading': [ 'content' ],
17
+ 'core/image': [ 'id', 'url', 'title', 'alt' ],
18
+ 'core/button': [ 'url', 'text', 'linkTarget', 'rel' ],
19
+ };
20
+
21
+ /**
22
+ * Checks if the given object is empty.
23
+ *
24
+ * @param {?Object} object The object to check.
25
+ *
26
+ * @return {boolean} Whether the object is empty.
27
+ */
12
28
  function isObjectEmpty( object ) {
13
29
  return ! object || Object.keys( object ).length === 0;
14
30
  }
15
31
 
32
+ /**
33
+ * Based on the given block name, checks if it is possible to bind the block.
34
+ *
35
+ * @param {string} blockName The name of the block.
36
+ *
37
+ * @return {boolean} Whether it is possible to bind the block to sources.
38
+ */
39
+ export function canBindBlock( blockName ) {
40
+ return blockName in BLOCK_BINDINGS_ALLOWED_BLOCKS;
41
+ }
42
+
43
+ /**
44
+ * Based on the given block name and attribute name, checks if it is possible to bind the block attribute.
45
+ *
46
+ * @param {string} blockName The name of the block.
47
+ * @param {string} attributeName The name of attribute.
48
+ *
49
+ * @return {boolean} Whether it is possible to bind the block attribute.
50
+ */
51
+ export function canBindAttribute( blockName, attributeName ) {
52
+ return (
53
+ canBindBlock( blockName ) &&
54
+ BLOCK_BINDINGS_ALLOWED_BLOCKS[ blockName ].includes( attributeName )
55
+ );
56
+ }
57
+
58
+ /**
59
+ * Gets the bindable attributes for a given block.
60
+ *
61
+ * @param {string} blockName The name of the block.
62
+ *
63
+ * @return {string[]} The bindable attributes for the block.
64
+ */
65
+ export function getBindableAttributes( blockName ) {
66
+ return BLOCK_BINDINGS_ALLOWED_BLOCKS[ blockName ];
67
+ }
68
+
69
+ /**
70
+ * Checks if the block has the `__default` binding for pattern overrides.
71
+ *
72
+ * @param {?Record<string, object>} bindings A block's bindings from the metadata attribute.
73
+ *
74
+ * @return {boolean} Whether the block has the `__default` binding for pattern overrides.
75
+ */
76
+ export function hasPatternOverridesDefaultBinding( bindings ) {
77
+ return bindings?.[ DEFAULT_ATTRIBUTE ]?.source === PATTERN_OVERRIDES_SOURCE;
78
+ }
79
+
80
+ /**
81
+ * Returns the bindings with the `__default` binding for pattern overrides
82
+ * replaced with the full-set of supported attributes. e.g.:
83
+ *
84
+ * - bindings passed in: `{ __default: { source: 'core/pattern-overrides' } }`
85
+ * - bindings returned: `{ content: { source: 'core/pattern-overrides' } }`
86
+ *
87
+ * @param {string} blockName The block name (e.g. 'core/paragraph').
88
+ * @param {?Record<string, object>} bindings A block's bindings from the metadata attribute.
89
+ *
90
+ * @return {Object} The bindings with default replaced for pattern overrides.
91
+ */
92
+ export function replacePatternOverridesDefaultBinding( blockName, bindings ) {
93
+ // The `__default` binding currently only works for pattern overrides.
94
+ if ( hasPatternOverridesDefaultBinding( bindings ) ) {
95
+ const supportedAttributes = BLOCK_BINDINGS_ALLOWED_BLOCKS[ blockName ];
96
+ const bindingsWithDefaults = {};
97
+ for ( const attributeName of supportedAttributes ) {
98
+ // If the block has mixed binding sources, retain any non pattern override bindings.
99
+ const bindingSource = bindings[ attributeName ]
100
+ ? bindings[ attributeName ]
101
+ : { source: PATTERN_OVERRIDES_SOURCE };
102
+ bindingsWithDefaults[ attributeName ] = bindingSource;
103
+ }
104
+
105
+ return bindingsWithDefaults;
106
+ }
107
+
108
+ return bindings;
109
+ }
110
+
16
111
  /**
17
112
  * Contains utils to update the block `bindings` metadata.
18
113
  *
package/tsconfig.json CHANGED
@@ -1,10 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/tsconfig.json",
3
3
  "extends": "../../tsconfig.base.json",
4
- "compilerOptions": {
5
- "rootDir": "src",
6
- "declarationDir": "build-types"
7
- },
8
4
  "references": [
9
5
  { "path": "../a11y" },
10
6
  { "path": "../api-fetch" },
@@ -37,5 +33,6 @@
37
33
  // NOTE: This package is being progressively typed. You are encouraged to
38
34
  // expand this array with files which can be type-checked. At some point in
39
35
  // the future, this can be simplified to an `includes` of `src/**/*`.
40
- "files": [ "src/components/block-context/index.js", "src/utils/dom.js" ]
36
+ "files": [ "src/components/block-context/index.js", "src/utils/dom.js" ],
37
+ "include": []
41
38
  }