@wordpress/block-editor 15.22.1 → 16.0.1-next.v.202607070741.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 (379) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/build/autocompleters/block.cjs +10 -2
  3. package/build/autocompleters/block.cjs.map +2 -2
  4. package/build/components/background-image-control/index.cjs +0 -2
  5. package/build/components/background-image-control/index.cjs.map +2 -2
  6. package/build/components/block-inspector/edit-contents.cjs +3 -0
  7. package/build/components/block-inspector/edit-contents.cjs.map +3 -3
  8. package/build/components/block-inspector/index.cjs +18 -36
  9. package/build/components/block-inspector/index.cjs.map +2 -2
  10. package/build/components/block-list/block-invalid-warning.cjs +8 -19
  11. package/build/components/block-list/block-invalid-warning.cjs.map +2 -2
  12. package/build/components/block-styles/use-styles-for-block.cjs +2 -1
  13. package/build/components/block-styles/use-styles-for-block.cjs.map +2 -2
  14. package/build/components/block-title/use-block-display-title.cjs +7 -2
  15. package/build/components/block-title/use-block-display-title.cjs.map +2 -2
  16. package/build/components/block-toolbar/block-toolbar-icon.cjs +10 -14
  17. package/build/components/block-toolbar/block-toolbar-icon.cjs.map +2 -2
  18. package/build/components/block-variation-transforms/index.cjs +0 -1
  19. package/build/components/block-variation-transforms/index.cjs.map +2 -2
  20. package/build/components/child-layout-control/index.cjs +0 -2
  21. package/build/components/child-layout-control/index.cjs.map +2 -2
  22. package/build/components/colors-gradients/control.cjs +5 -5
  23. package/build/components/colors-gradients/control.cjs.map +2 -2
  24. package/build/components/date-format-picker/index.cjs +0 -1
  25. package/build/components/date-format-picker/index.cjs.map +2 -2
  26. package/build/components/dimensions-tool/aspect-ratio-tool.cjs +1 -2
  27. package/build/components/dimensions-tool/aspect-ratio-tool.cjs.map +2 -2
  28. package/build/components/dimensions-tool/scale-tool.cjs +0 -1
  29. package/build/components/dimensions-tool/scale-tool.cjs.map +2 -2
  30. package/build/components/dimensions-tool/width-height-tool.cjs +2 -4
  31. package/build/components/dimensions-tool/width-height-tool.cjs.map +2 -2
  32. package/build/components/font-appearance-control/index.cjs +6 -25
  33. package/build/components/font-appearance-control/index.cjs.map +3 -3
  34. package/build/components/font-family/index.cjs +6 -15
  35. package/build/components/font-family/index.cjs.map +3 -3
  36. package/build/components/font-sizes/font-size-picker.cjs +1 -2
  37. package/build/components/font-sizes/font-size-picker.cjs.map +2 -2
  38. package/build/components/global-styles/border-panel.cjs +0 -1
  39. package/build/components/global-styles/border-panel.cjs.map +2 -2
  40. package/build/components/global-styles/dimensions-panel.cjs +0 -3
  41. package/build/components/global-styles/dimensions-panel.cjs.map +2 -2
  42. package/build/components/global-styles/typography-panel.cjs +4 -10
  43. package/build/components/global-styles/typography-panel.cjs.map +2 -2
  44. package/build/components/height-control/index.cjs +0 -2
  45. package/build/components/height-control/index.cjs.map +2 -2
  46. package/build/components/html-element-control/index.cjs +0 -1
  47. package/build/components/html-element-control/index.cjs.map +2 -2
  48. package/build/components/image-editor/index.cjs +5 -0
  49. package/build/components/image-editor/index.cjs.map +3 -3
  50. package/build/components/image-editor/zoom-dropdown.cjs +0 -1
  51. package/build/components/image-editor/zoom-dropdown.cjs.map +2 -2
  52. package/build/components/image-size-control/index.cjs +1 -3
  53. package/build/components/image-size-control/index.cjs.map +2 -2
  54. package/build/components/inner-content/index.cjs +107 -0
  55. package/build/components/inner-content/index.cjs.map +7 -0
  56. package/build/components/inserter/hooks/use-block-types-state.cjs +10 -2
  57. package/build/components/inserter/hooks/use-block-types-state.cjs.map +2 -2
  58. package/build/components/inserter/media-tab/hooks.cjs +34 -6
  59. package/build/components/inserter/media-tab/hooks.cjs.map +2 -2
  60. package/build/components/inserter/media-tab/media-list.cjs +3 -1
  61. package/build/components/inserter/media-tab/media-list.cjs.map +2 -2
  62. package/build/components/inserter/media-tab/media-panel.cjs +224 -27
  63. package/build/components/inserter/media-tab/media-panel.cjs.map +3 -3
  64. package/build/components/inserter/media-tab/media-preview.cjs +32 -17
  65. package/build/components/inserter/media-tab/media-preview.cjs.map +2 -2
  66. package/build/components/inserter/media-tab/media-tab.cjs +26 -6
  67. package/build/components/inserter/media-tab/media-tab.cjs.map +2 -2
  68. package/build/components/inserter/mobile-tab-navigation.cjs +6 -1
  69. package/build/components/inserter/mobile-tab-navigation.cjs.map +2 -2
  70. package/build/components/inserter/no-results.cjs +2 -2
  71. package/build/components/inserter/no-results.cjs.map +2 -2
  72. package/build/components/inserter/preview-panel.cjs +2 -1
  73. package/build/components/inserter/preview-panel.cjs.map +2 -2
  74. package/build/components/inserter-list-item/index.cjs +8 -2
  75. package/build/components/inserter-list-item/index.cjs.map +2 -2
  76. package/build/components/letter-spacing-control/index.cjs +0 -24
  77. package/build/components/letter-spacing-control/index.cjs.map +3 -3
  78. package/build/components/line-height-control/index.cjs +7 -22
  79. package/build/components/line-height-control/index.cjs.map +3 -3
  80. package/build/components/list-view/block-select-button.cjs +90 -84
  81. package/build/components/list-view/block-select-button.cjs.map +2 -2
  82. package/build/components/list-view/block.cjs +51 -20
  83. package/build/components/list-view/block.cjs.map +2 -2
  84. package/build/components/list-view/expander.cjs +1 -1
  85. package/build/components/list-view/expander.cjs.map +2 -2
  86. package/build/components/list-view/use-list-view-client-ids.cjs +2 -2
  87. package/build/components/list-view/use-list-view-client-ids.cjs.map +2 -2
  88. package/build/components/observe-typing/index.cjs +4 -3
  89. package/build/components/observe-typing/index.cjs.map +2 -2
  90. package/build/components/preset-input-control/custom-value-controls.cjs +1 -3
  91. package/build/components/preset-input-control/custom-value-controls.cjs.map +2 -2
  92. package/build/components/preset-input-control/index.cjs +1 -3
  93. package/build/components/preset-input-control/index.cjs.map +2 -2
  94. package/build/components/resolution-tool/index.cjs +1 -2
  95. package/build/components/resolution-tool/index.cjs.map +2 -2
  96. package/build/components/text-alignment-control/index.cjs +0 -1
  97. package/build/components/text-alignment-control/index.cjs.map +2 -2
  98. package/build/components/text-decoration-control/index.cjs +0 -1
  99. package/build/components/text-decoration-control/index.cjs.map +2 -2
  100. package/build/components/text-indent-control/index.cjs +0 -8
  101. package/build/components/text-indent-control/index.cjs.map +2 -2
  102. package/build/components/text-transform-control/index.cjs +0 -1
  103. package/build/components/text-transform-control/index.cjs.map +2 -2
  104. package/build/components/use-block-display-information/index.cjs +10 -8
  105. package/build/components/use-block-display-information/index.cjs.map +2 -2
  106. package/build/components/use-on-block-drop/index.cjs +3 -7
  107. package/build/components/use-on-block-drop/index.cjs.map +2 -2
  108. package/build/components/use-resize-canvas/index.cjs +16 -53
  109. package/build/components/use-resize-canvas/index.cjs.map +3 -3
  110. package/build/components/writing-mode-control/index.cjs +0 -1
  111. package/build/components/writing-mode-control/index.cjs.map +2 -2
  112. package/build/hooks/font-size.cjs +1 -2
  113. package/build/hooks/font-size.cjs.map +2 -2
  114. package/build/hooks/layout.cjs +5 -3
  115. package/build/hooks/layout.cjs.map +2 -2
  116. package/build/hooks/position.cjs +36 -16
  117. package/build/hooks/position.cjs.map +2 -2
  118. package/build/hooks/states.cjs +10 -21
  119. package/build/hooks/states.cjs.map +2 -2
  120. package/build/layouts/constrained.cjs +21 -21
  121. package/build/layouts/constrained.cjs.map +2 -2
  122. package/build/layouts/flex.cjs +0 -3
  123. package/build/layouts/flex.cjs.map +2 -2
  124. package/build/layouts/grid.cjs +51 -9
  125. package/build/layouts/grid.cjs.map +2 -2
  126. package/build/private-apis.cjs +4 -2
  127. package/build/private-apis.cjs.map +3 -3
  128. package/build/store/actions.cjs.map +2 -2
  129. package/build/store/private-actions.cjs +16 -0
  130. package/build/store/private-actions.cjs.map +2 -2
  131. package/build/store/private-keys.cjs +3 -3
  132. package/build/store/private-keys.cjs.map +2 -2
  133. package/build/store/private-selectors.cjs +96 -10
  134. package/build/store/private-selectors.cjs.map +2 -2
  135. package/build/store/reducer.cjs +19 -3
  136. package/build/store/reducer.cjs.map +2 -2
  137. package/build/store/selectors.cjs +13 -0
  138. package/build/store/selectors.cjs.map +2 -2
  139. package/build-module/autocompleters/block.mjs +10 -2
  140. package/build-module/autocompleters/block.mjs.map +2 -2
  141. package/build-module/components/background-image-control/index.mjs +0 -2
  142. package/build-module/components/background-image-control/index.mjs.map +2 -2
  143. package/build-module/components/block-inspector/edit-contents.mjs +4 -1
  144. package/build-module/components/block-inspector/edit-contents.mjs.map +2 -2
  145. package/build-module/components/block-inspector/index.mjs +18 -36
  146. package/build-module/components/block-inspector/index.mjs.map +2 -2
  147. package/build-module/components/block-list/block-invalid-warning.mjs +8 -19
  148. package/build-module/components/block-list/block-invalid-warning.mjs.map +2 -2
  149. package/build-module/components/block-styles/use-styles-for-block.mjs +2 -1
  150. package/build-module/components/block-styles/use-styles-for-block.mjs.map +2 -2
  151. package/build-module/components/block-title/use-block-display-title.mjs +7 -2
  152. package/build-module/components/block-title/use-block-display-title.mjs.map +2 -2
  153. package/build-module/components/block-toolbar/block-toolbar-icon.mjs +10 -14
  154. package/build-module/components/block-toolbar/block-toolbar-icon.mjs.map +2 -2
  155. package/build-module/components/block-variation-transforms/index.mjs +0 -1
  156. package/build-module/components/block-variation-transforms/index.mjs.map +2 -2
  157. package/build-module/components/child-layout-control/index.mjs +0 -2
  158. package/build-module/components/child-layout-control/index.mjs.map +2 -2
  159. package/build-module/components/colors-gradients/control.mjs +5 -5
  160. package/build-module/components/colors-gradients/control.mjs.map +2 -2
  161. package/build-module/components/date-format-picker/index.mjs +0 -1
  162. package/build-module/components/date-format-picker/index.mjs.map +2 -2
  163. package/build-module/components/dimensions-tool/aspect-ratio-tool.mjs +1 -2
  164. package/build-module/components/dimensions-tool/aspect-ratio-tool.mjs.map +2 -2
  165. package/build-module/components/dimensions-tool/scale-tool.mjs +0 -1
  166. package/build-module/components/dimensions-tool/scale-tool.mjs.map +2 -2
  167. package/build-module/components/dimensions-tool/width-height-tool.mjs +2 -4
  168. package/build-module/components/dimensions-tool/width-height-tool.mjs.map +2 -2
  169. package/build-module/components/font-appearance-control/index.mjs +6 -15
  170. package/build-module/components/font-appearance-control/index.mjs.map +2 -2
  171. package/build-module/components/font-family/index.mjs +6 -15
  172. package/build-module/components/font-family/index.mjs.map +2 -2
  173. package/build-module/components/font-sizes/font-size-picker.mjs +1 -2
  174. package/build-module/components/font-sizes/font-size-picker.mjs.map +2 -2
  175. package/build-module/components/global-styles/border-panel.mjs +0 -1
  176. package/build-module/components/global-styles/border-panel.mjs.map +2 -2
  177. package/build-module/components/global-styles/dimensions-panel.mjs +0 -3
  178. package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
  179. package/build-module/components/global-styles/typography-panel.mjs +4 -10
  180. package/build-module/components/global-styles/typography-panel.mjs.map +2 -2
  181. package/build-module/components/height-control/index.mjs +0 -2
  182. package/build-module/components/height-control/index.mjs.map +2 -2
  183. package/build-module/components/html-element-control/index.mjs +0 -1
  184. package/build-module/components/html-element-control/index.mjs.map +2 -2
  185. package/build-module/components/image-editor/index.mjs +5 -0
  186. package/build-module/components/image-editor/index.mjs.map +2 -2
  187. package/build-module/components/image-editor/zoom-dropdown.mjs +0 -1
  188. package/build-module/components/image-editor/zoom-dropdown.mjs.map +2 -2
  189. package/build-module/components/image-size-control/index.mjs +1 -3
  190. package/build-module/components/image-size-control/index.mjs.map +2 -2
  191. package/build-module/components/inner-content/index.mjs +82 -0
  192. package/build-module/components/inner-content/index.mjs.map +7 -0
  193. package/build-module/components/inserter/hooks/use-block-types-state.mjs +10 -2
  194. package/build-module/components/inserter/hooks/use-block-types-state.mjs.map +2 -2
  195. package/build-module/components/inserter/media-tab/hooks.mjs +33 -6
  196. package/build-module/components/inserter/media-tab/hooks.mjs.map +2 -2
  197. package/build-module/components/inserter/media-tab/media-list.mjs +3 -1
  198. package/build-module/components/inserter/media-tab/media-list.mjs.map +2 -2
  199. package/build-module/components/inserter/media-tab/media-panel.mjs +227 -30
  200. package/build-module/components/inserter/media-tab/media-panel.mjs.map +2 -2
  201. package/build-module/components/inserter/media-tab/media-preview.mjs +33 -18
  202. package/build-module/components/inserter/media-tab/media-preview.mjs.map +2 -2
  203. package/build-module/components/inserter/media-tab/media-tab.mjs +27 -7
  204. package/build-module/components/inserter/media-tab/media-tab.mjs.map +2 -2
  205. package/build-module/components/inserter/mobile-tab-navigation.mjs +6 -1
  206. package/build-module/components/inserter/mobile-tab-navigation.mjs.map +2 -2
  207. package/build-module/components/inserter/no-results.mjs +2 -2
  208. package/build-module/components/inserter/no-results.mjs.map +2 -2
  209. package/build-module/components/inserter/preview-panel.mjs +2 -1
  210. package/build-module/components/inserter/preview-panel.mjs.map +2 -2
  211. package/build-module/components/inserter-list-item/index.mjs +8 -2
  212. package/build-module/components/inserter-list-item/index.mjs.map +2 -2
  213. package/build-module/components/letter-spacing-control/index.mjs +0 -14
  214. package/build-module/components/letter-spacing-control/index.mjs.map +2 -2
  215. package/build-module/components/line-height-control/index.mjs +7 -12
  216. package/build-module/components/line-height-control/index.mjs.map +2 -2
  217. package/build-module/components/list-view/block-select-button.mjs +90 -84
  218. package/build-module/components/list-view/block-select-button.mjs.map +2 -2
  219. package/build-module/components/list-view/block.mjs +51 -20
  220. package/build-module/components/list-view/block.mjs.map +2 -2
  221. package/build-module/components/list-view/expander.mjs +1 -1
  222. package/build-module/components/list-view/expander.mjs.map +2 -2
  223. package/build-module/components/list-view/use-list-view-client-ids.mjs +2 -2
  224. package/build-module/components/list-view/use-list-view-client-ids.mjs.map +2 -2
  225. package/build-module/components/observe-typing/index.mjs +4 -3
  226. package/build-module/components/observe-typing/index.mjs.map +2 -2
  227. package/build-module/components/preset-input-control/custom-value-controls.mjs +1 -3
  228. package/build-module/components/preset-input-control/custom-value-controls.mjs.map +2 -2
  229. package/build-module/components/preset-input-control/index.mjs +1 -3
  230. package/build-module/components/preset-input-control/index.mjs.map +2 -2
  231. package/build-module/components/resolution-tool/index.mjs +1 -2
  232. package/build-module/components/resolution-tool/index.mjs.map +2 -2
  233. package/build-module/components/text-alignment-control/index.mjs +0 -1
  234. package/build-module/components/text-alignment-control/index.mjs.map +2 -2
  235. package/build-module/components/text-decoration-control/index.mjs +0 -1
  236. package/build-module/components/text-decoration-control/index.mjs.map +2 -2
  237. package/build-module/components/text-indent-control/index.mjs +0 -8
  238. package/build-module/components/text-indent-control/index.mjs.map +2 -2
  239. package/build-module/components/text-transform-control/index.mjs +0 -1
  240. package/build-module/components/text-transform-control/index.mjs.map +2 -2
  241. package/build-module/components/use-block-display-information/index.mjs +10 -8
  242. package/build-module/components/use-block-display-information/index.mjs.map +2 -2
  243. package/build-module/components/use-on-block-drop/index.mjs +4 -7
  244. package/build-module/components/use-on-block-drop/index.mjs.map +2 -2
  245. package/build-module/components/use-resize-canvas/index.mjs +6 -53
  246. package/build-module/components/use-resize-canvas/index.mjs.map +2 -2
  247. package/build-module/components/writing-mode-control/index.mjs +0 -1
  248. package/build-module/components/writing-mode-control/index.mjs.map +2 -2
  249. package/build-module/hooks/font-size.mjs +1 -2
  250. package/build-module/hooks/font-size.mjs.map +2 -2
  251. package/build-module/hooks/layout.mjs +4 -3
  252. package/build-module/hooks/layout.mjs.map +2 -2
  253. package/build-module/hooks/position.mjs +38 -18
  254. package/build-module/hooks/position.mjs.map +2 -2
  255. package/build-module/hooks/states.mjs +10 -21
  256. package/build-module/hooks/states.mjs.map +2 -2
  257. package/build-module/layouts/constrained.mjs +21 -21
  258. package/build-module/layouts/constrained.mjs.map +2 -2
  259. package/build-module/layouts/flex.mjs +0 -3
  260. package/build-module/layouts/flex.mjs.map +2 -2
  261. package/build-module/layouts/grid.mjs +52 -9
  262. package/build-module/layouts/grid.mjs.map +2 -2
  263. package/build-module/private-apis.mjs +5 -3
  264. package/build-module/private-apis.mjs.map +2 -2
  265. package/build-module/store/actions.mjs.map +2 -2
  266. package/build-module/store/private-actions.mjs +14 -0
  267. package/build-module/store/private-actions.mjs.map +2 -2
  268. package/build-module/store/private-keys.mjs +2 -2
  269. package/build-module/store/private-keys.mjs.map +2 -2
  270. package/build-module/store/private-selectors.mjs +93 -10
  271. package/build-module/store/private-selectors.mjs.map +2 -2
  272. package/build-module/store/reducer.mjs +17 -3
  273. package/build-module/store/reducer.mjs.map +2 -2
  274. package/build-module/store/selectors.mjs +13 -0
  275. package/build-module/store/selectors.mjs.map +2 -2
  276. package/build-style/content-rtl.css +11 -5
  277. package/build-style/content.css +11 -5
  278. package/build-style/style-rtl.css +113 -3
  279. package/build-style/style.css +113 -3
  280. package/package.json +43 -41
  281. package/src/autocompleters/block.js +10 -3
  282. package/src/autocompleters/test/block.js +53 -0
  283. package/src/components/background-image-control/index.js +0 -2
  284. package/src/components/block-inspector/edit-contents.js +5 -1
  285. package/src/components/block-inspector/index.js +25 -44
  286. package/src/components/block-list/block-invalid-warning.js +8 -19
  287. package/src/components/block-patterns-list/stories/index.story.jsx +1 -1
  288. package/src/components/block-styles/use-styles-for-block.js +1 -0
  289. package/src/components/block-title/use-block-display-title.js +7 -2
  290. package/src/components/block-toolbar/block-toolbar-icon.js +11 -16
  291. package/src/components/block-toolbar/test/block-toolbar-icon.js +32 -9
  292. package/src/components/block-variation-transforms/index.js +0 -1
  293. package/src/components/child-layout-control/index.js +0 -2
  294. package/src/components/color-palette/test/__snapshots__/control.js.snap +11 -106
  295. package/src/components/colors-gradients/control.js +4 -4
  296. package/src/components/colors-gradients/style.scss +2 -2
  297. package/src/components/date-format-picker/index.js +0 -1
  298. package/src/components/dimensions-tool/aspect-ratio-tool.js +0 -1
  299. package/src/components/dimensions-tool/scale-tool.js +0 -1
  300. package/src/components/dimensions-tool/width-height-tool.js +0 -2
  301. package/src/components/font-appearance-control/index.js +6 -19
  302. package/src/components/font-family/README.md +0 -9
  303. package/src/components/font-family/index.js +6 -19
  304. package/src/components/font-family/stories/index.story.jsx +0 -1
  305. package/src/components/font-sizes/font-size-picker.js +0 -1
  306. package/src/components/global-styles/border-panel.js +0 -1
  307. package/src/components/global-styles/dimensions-panel.js +0 -3
  308. package/src/components/global-styles/typography-panel.js +0 -6
  309. package/src/components/height-control/index.js +0 -2
  310. package/src/components/html-element-control/index.js +0 -1
  311. package/src/components/iframe/content.scss +3 -3
  312. package/src/components/image-editor/index.js +22 -0
  313. package/src/components/image-editor/zoom-dropdown.js +0 -1
  314. package/src/components/image-size-control/index.js +0 -2
  315. package/src/components/inner-content/index.js +119 -0
  316. package/src/components/inner-content/test/index.js +81 -0
  317. package/src/components/inserter/hooks/use-block-types-state.js +10 -2
  318. package/src/components/inserter/media-tab/hooks.js +59 -9
  319. package/src/components/inserter/media-tab/media-list.js +2 -0
  320. package/src/components/inserter/media-tab/media-panel.js +256 -17
  321. package/src/components/inserter/media-tab/media-preview.js +34 -17
  322. package/src/components/inserter/media-tab/media-tab.js +20 -2
  323. package/src/components/inserter/media-tab/test/hooks.js +204 -0
  324. package/src/components/inserter/mobile-tab-navigation.js +6 -1
  325. package/src/components/inserter/no-results.js +2 -2
  326. package/src/components/inserter/preview-panel.js +1 -0
  327. package/src/components/inserter/style.scss +110 -1
  328. package/src/components/inserter-list-item/index.js +8 -2
  329. package/src/components/letter-spacing-control/README.md +0 -8
  330. package/src/components/letter-spacing-control/index.js +5 -23
  331. package/src/components/letter-spacing-control/stories/index.story.jsx +0 -12
  332. package/src/components/line-height-control/README.md +0 -8
  333. package/src/components/line-height-control/index.js +7 -16
  334. package/src/components/line-height-control/stories/index.story.jsx +0 -1
  335. package/src/components/line-height-control/test/index.js +1 -7
  336. package/src/components/link-picker/test/index.js +3 -1
  337. package/src/components/list-view/block-select-button.js +5 -1
  338. package/src/components/list-view/block.js +57 -20
  339. package/src/components/list-view/expander.js +5 -1
  340. package/src/components/list-view/style.scss +19 -0
  341. package/src/components/list-view/use-list-view-client-ids.js +2 -2
  342. package/src/components/observe-typing/index.js +9 -4
  343. package/src/components/preset-input-control/custom-value-controls.js +0 -2
  344. package/src/components/preset-input-control/index.js +0 -2
  345. package/src/components/resolution-tool/index.js +0 -1
  346. package/src/components/responsive-block-control/test/index.js +1 -5
  347. package/src/components/text-alignment-control/index.js +0 -1
  348. package/src/components/text-decoration-control/index.js +0 -1
  349. package/src/components/text-indent-control/index.js +7 -16
  350. package/src/components/text-transform-control/index.js +0 -1
  351. package/src/components/use-block-display-information/index.js +9 -13
  352. package/src/components/use-block-display-information/test/index.js +47 -9
  353. package/src/components/use-on-block-drop/index.js +4 -7
  354. package/src/components/use-resize-canvas/index.js +10 -71
  355. package/src/components/writing-mode-control/index.js +0 -1
  356. package/src/hooks/block-hooks.scss +15 -0
  357. package/src/hooks/font-size.js +0 -1
  358. package/src/hooks/layout.js +5 -4
  359. package/src/hooks/position.js +44 -23
  360. package/src/hooks/states.js +24 -26
  361. package/src/hooks/test/cross-origin-isolation.js +0 -4
  362. package/src/hooks/test/layout.js +75 -1
  363. package/src/layouts/constrained.js +51 -28
  364. package/src/layouts/flex.js +0 -3
  365. package/src/layouts/grid.js +59 -7
  366. package/src/layouts/test/constrained.js +91 -0
  367. package/src/layouts/test/grid.js +71 -0
  368. package/src/private-apis.js +4 -2
  369. package/src/store/actions.js +1 -0
  370. package/src/store/private-actions.js +31 -0
  371. package/src/store/private-keys.js +1 -1
  372. package/src/store/private-selectors.js +184 -11
  373. package/src/store/reducer.js +37 -2
  374. package/src/store/selectors.js +41 -0
  375. package/src/store/test/private-selectors.js +436 -10
  376. package/src/store/test/reducer.js +41 -13
  377. package/src/store/test/selectors.js +133 -0
  378. package/src/style.scss +1 -0
  379. package/src/components/use-resize-canvas/README.md +0 -37
@@ -8,6 +8,7 @@ import {
8
8
  Flex,
9
9
  FlexItem,
10
10
  RangeControl,
11
+ ToggleControl,
11
12
  __experimentalNumberControl as NumberControl,
12
13
  __experimentalToggleGroupControl as ToggleGroupControl,
13
14
  __experimentalToggleGroupControlOption as ToggleGroupControlOption,
@@ -81,6 +82,9 @@ export default {
81
82
  const showMinWidthControl =
82
83
  ! layout?.isManualPlacement ||
83
84
  window.__experimentalEnableGridInteractivity;
85
+ // Auto-fit/auto-fill only applies when grid items are placed
86
+ // automatically, so the control is irrelevant in manual placement mode.
87
+ const showFillControl = ! layout?.isManualPlacement;
84
88
  const defaultColumnCount = layout.isManualPlacement ? 3 : undefined;
85
89
  const hasLayoutValue = ( key, defaultValue ) =>
86
90
  ( layout?.[ key ] ?? defaultValue ) !==
@@ -92,6 +96,7 @@ export default {
92
96
  hasLayoutValue( 'rowCount' );
93
97
  const hasMinimumColumnWidthValue = () =>
94
98
  hasLayoutValue( 'minimumColumnWidth' );
99
+ const hasFillValue = () => hasLayoutValue( 'autoFit', false );
95
100
  const resetGridType = () =>
96
101
  onChange(
97
102
  cleanEmptyObject( {
@@ -116,6 +121,13 @@ export default {
116
121
  minimumColumnWidth: resetLayout?.minimumColumnWidth,
117
122
  } )
118
123
  );
124
+ const resetFill = () =>
125
+ onChange(
126
+ cleanEmptyObject( {
127
+ ...layout,
128
+ autoFit: resetLayout?.autoFit,
129
+ } )
130
+ );
119
131
 
120
132
  return (
121
133
  <>
@@ -162,6 +174,19 @@ export default {
162
174
  />
163
175
  </ToolsPanelItem>
164
176
  ) }
177
+ { showFillControl && (
178
+ <ToolsPanelItem
179
+ label={ __( 'Fill available space' ) }
180
+ hasValue={ hasFillValue }
181
+ onDeselect={ resetFill }
182
+ panelId={ clientId }
183
+ >
184
+ <GridLayoutFillControl
185
+ layout={ layout }
186
+ onChange={ onChange }
187
+ />
188
+ </ToolsPanelItem>
189
+ ) }
165
190
  </>
166
191
  );
167
192
  },
@@ -188,8 +213,13 @@ export default {
188
213
  minimumColumnWidth = null,
189
214
  columnCount = null,
190
215
  rowCount = null,
216
+ autoFit = false,
191
217
  } = effectiveLayout;
192
218
 
219
+ // When enabled, columns stretch to fill the available space using
220
+ // `auto-fit`; otherwise empty tracks are preserved with `auto-fill`.
221
+ const autoPlacement = autoFit ? 'auto-fit' : 'auto-fill';
222
+
193
223
  // Check that the grid layout attributes are of the correct type, so that we don't accidentally
194
224
  // write code that stores a string attribute instead of a number.
195
225
  if ( process.env.NODE_ENV === 'development' ) {
@@ -205,6 +235,9 @@ export default {
205
235
  if ( rowCount && typeof rowCount !== 'number' ) {
206
236
  throw new Error( 'rowCount must be a number' );
207
237
  }
238
+ if ( autoFit && typeof autoFit !== 'boolean' ) {
239
+ throw new Error( 'autoFit must be a boolean' );
240
+ }
208
241
  }
209
242
 
210
243
  // Use the global blockGap value as fallback when available.
@@ -236,6 +269,7 @@ export default {
236
269
  ! hasViewportOverrides ||
237
270
  hasViewportOverride( 'minimumColumnWidth' ) ||
238
271
  hasViewportOverride( 'columnCount' ) ||
272
+ hasViewportOverride( 'autoFit' ) ||
239
273
  ( hasBlockGapOverride && minimumColumnWidth && columnCount > 0 );
240
274
  const shouldOutputGridRows =
241
275
  ( ! hasViewportOverrides || hasViewportOverride( 'rowCount' ) ) &&
@@ -256,7 +290,7 @@ export default {
256
290
  columnCount - 1
257
291
  }) ) / ${ columnCount })`;
258
292
  rules.push(
259
- `grid-template-columns: repeat(auto-fill, minmax(${ maxValue }, 1fr))`
293
+ `grid-template-columns: repeat(${ autoPlacement }, minmax(${ maxValue }, 1fr))`
260
294
  );
261
295
  } else if ( shouldOutputGridColumns && columnCount ) {
262
296
  rules.push(
@@ -264,7 +298,7 @@ export default {
264
298
  );
265
299
  } else if ( shouldOutputGridColumns ) {
266
300
  rules.push(
267
- `grid-template-columns: repeat(auto-fill, minmax(min(${
301
+ `grid-template-columns: repeat(${ autoPlacement }, minmax(min(${
268
302
  minimumColumnWidth || '12rem'
269
303
  }, 100%), 1fr))`
270
304
  );
@@ -357,7 +391,6 @@ function GridLayoutMinimumWidthControl( { layout, onChange } ) {
357
391
  <Flex gap={ 4 }>
358
392
  <FlexItem isBlock>
359
393
  <UnitControl
360
- size="__unstable-large"
361
394
  onChange={ ( newValue ) => {
362
395
  onChange( {
363
396
  ...layout,
@@ -375,7 +408,6 @@ function GridLayoutMinimumWidthControl( { layout, onChange } ) {
375
408
  </FlexItem>
376
409
  <FlexItem isBlock>
377
410
  <RangeControl
378
- __next40pxDefaultSize
379
411
  onChange={ handleSliderChange }
380
412
  value={ quantity || 0 }
381
413
  min={ 0 }
@@ -435,7 +467,7 @@ function GridLayoutColumnsAndRowsControl( {
435
467
  columnCount: newColumnCount,
436
468
  } );
437
469
  } }
438
- value={ columnCount }
470
+ value={ columnCount ?? '' }
439
471
  min={ 1 }
440
472
  label={ __( 'Columns' ) }
441
473
  hideLabelFromVision={ ! isManualPlacement }
@@ -463,7 +495,6 @@ function GridLayoutColumnsAndRowsControl( {
463
495
  />
464
496
  ) : (
465
497
  <RangeControl
466
- __next40pxDefaultSize
467
498
  value={ columnCount ?? 1 }
468
499
  onChange={ ( value ) =>
469
500
  onChange( {
@@ -488,6 +519,28 @@ function GridLayoutColumnsAndRowsControl( {
488
519
  );
489
520
  }
490
521
 
522
+ // Enables stretching grid columns to fill the available space (auto-fit)
523
+ // instead of leaving empty tracks at the end of a row (auto-fill).
524
+ function GridLayoutFillControl( { layout, onChange } ) {
525
+ const { autoFit = false } = layout;
526
+
527
+ return (
528
+ <ToggleControl
529
+ label={ __( 'Fill available space' ) }
530
+ help={ __(
531
+ 'Stretch columns to fill the available space, instead of leaving gaps when there are too few items to fill a row.'
532
+ ) }
533
+ checked={ autoFit }
534
+ onChange={ ( value ) =>
535
+ onChange( {
536
+ ...layout,
537
+ autoFit: value,
538
+ } )
539
+ }
540
+ />
541
+ );
542
+ }
543
+
491
544
  // Enables switching between grid types
492
545
  function GridLayoutTypeControl( { layout, onChange } ) {
493
546
  const { columnCount, rowCount, minimumColumnWidth, isManualPlacement } =
@@ -535,7 +588,6 @@ function GridLayoutTypeControl( { layout, onChange } ) {
535
588
 
536
589
  return (
537
590
  <ToggleGroupControl
538
- __next40pxDefaultSize
539
591
  label={ __( 'Grid item position' ) }
540
592
  value={ gridPlacement }
541
593
  onChange={ onChangeType }
@@ -1,8 +1,35 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render, screen } from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
6
+
7
+ /**
8
+ * WordPress dependencies
9
+ */
10
+ import { __experimentalToolsPanel as ToolsPanel } from '@wordpress/components';
11
+
1
12
  /**
2
13
  * Internal dependencies
3
14
  */
4
15
  import constrained from '../constrained';
5
16
 
17
+ const ConstrainedLayoutInspectorControls = constrained.inspectorControls;
18
+ const PANEL_ID = 'test-panel';
19
+
20
+ function renderInspectorControls( props = {} ) {
21
+ return render(
22
+ <ToolsPanel label="Layout" resetAll={ jest.fn() } panelId={ PANEL_ID }>
23
+ <ConstrainedLayoutInspectorControls
24
+ clientId={ PANEL_ID }
25
+ layout={ {} }
26
+ onChange={ jest.fn() }
27
+ { ...props }
28
+ />
29
+ </ToolsPanel>
30
+ );
31
+ }
32
+
6
33
  describe( 'getLayoutStyle', () => {
7
34
  it( 'should return an empty string if no non-default params are provided', () => {
8
35
  const expected = '';
@@ -18,4 +45,68 @@ describe( 'getLayoutStyle', () => {
18
45
 
19
46
  expect( result ).toBe( expected );
20
47
  } );
48
+
49
+ it( 'should reset constrained sizes when content width is unset in a viewport', () => {
50
+ const result = constrained.getLayoutStyle( {
51
+ selector: '.my-container',
52
+ layout: { type: 'constrained', contentSize: '800px' },
53
+ viewportOverrides: { contentSize: null },
54
+ style: {},
55
+ blockName: 'test-block',
56
+ hasBlockGapSupport: false,
57
+ layoutDefinitions: undefined,
58
+ } );
59
+
60
+ expect( result ).toContain(
61
+ 'max-width: var(--wp--style--global--content-size, none);'
62
+ );
63
+ expect( result ).toContain(
64
+ 'max-width: var(--wp--style--global--wide-size, none);'
65
+ );
66
+ } );
67
+ } );
68
+
69
+ describe( 'ConstrainedLayoutInspectorControls', () => {
70
+ it( 'renders an unset content width as an empty control value', () => {
71
+ renderInspectorControls( {
72
+ layout: { type: 'constrained', contentSize: null },
73
+ resetLayout: { type: 'constrained', contentSize: '800px' },
74
+ } );
75
+
76
+ expect(
77
+ screen.getByRole( 'spinbutton', { name: 'Content width' } )
78
+ ).toHaveDisplayValue( '' );
79
+ } );
80
+
81
+ it.each( [
82
+ [ 'Content width', 'contentSize' ],
83
+ [ 'Wide width', 'wideSize' ],
84
+ ] )(
85
+ 'preserves a cleared %s value for viewport layout overrides',
86
+ async ( label, layoutKey ) => {
87
+ const user = userEvent.setup();
88
+ const onChange = jest.fn();
89
+ renderInspectorControls( {
90
+ layout: { type: 'constrained', [ layoutKey ]: '800px' },
91
+ resetLayout: { type: 'constrained', [ layoutKey ]: '800px' },
92
+ onChange,
93
+ } );
94
+
95
+ await user.click(
96
+ screen.getByRole( 'button', { name: /Layout options/i } )
97
+ );
98
+ await user.click(
99
+ screen.getByRole( 'menuitemcheckbox', {
100
+ name: `Show ${ label }`,
101
+ } )
102
+ );
103
+ await user.clear(
104
+ screen.getByRole( 'spinbutton', { name: label } )
105
+ );
106
+
107
+ const nextLayout = onChange.mock.lastCall?.[ 0 ];
108
+ expect( Object.hasOwn( nextLayout, layoutKey ) ).toBe( true );
109
+ expect( nextLayout[ layoutKey ] ).toBeUndefined();
110
+ }
111
+ );
21
112
  } );
@@ -1,8 +1,34 @@
1
+ /**
2
+ * External dependencies
3
+ */
4
+ import { render, screen } from '@testing-library/react';
5
+
6
+ /**
7
+ * WordPress dependencies
8
+ */
9
+ import { __experimentalToolsPanel as ToolsPanel } from '@wordpress/components';
10
+
1
11
  /**
2
12
  * Internal dependencies
3
13
  */
4
14
  import grid from '../grid';
5
15
 
16
+ const GridLayoutInspectorControls = grid.inspectorControls;
17
+ const PANEL_ID = 'test-panel';
18
+
19
+ function renderInspectorControls( props = {} ) {
20
+ return render(
21
+ <ToolsPanel label="Layout" resetAll={ jest.fn() } panelId={ PANEL_ID }>
22
+ <GridLayoutInspectorControls
23
+ clientId={ PANEL_ID }
24
+ layout={ {} }
25
+ onChange={ jest.fn() }
26
+ { ...props }
27
+ />
28
+ </ToolsPanel>
29
+ );
30
+ }
31
+
6
32
  describe( 'getLayoutStyle', () => {
7
33
  it( 'should return only `grid-template-columns` and `container-type` properties if no non-default params are provided', () => {
8
34
  const expected = `.my-container { grid-template-columns: repeat(auto-fill, minmax(min(12rem, 100%), 1fr)); container-type: inline-size; }`;
@@ -46,4 +72,49 @@ describe( 'getLayoutStyle', () => {
46
72
 
47
73
  expect( result ).toBe( expected );
48
74
  } );
75
+ it( 'should use `auto-fit` instead of `auto-fill` when autoFit is enabled', () => {
76
+ const expected = `.my-container { grid-template-columns: repeat(auto-fit, minmax(min(12rem, 100%), 1fr)); container-type: inline-size; }`;
77
+
78
+ const result = grid.getLayoutStyle( {
79
+ selector: '.my-container',
80
+ layout: { autoFit: true },
81
+ style: {},
82
+ blockName: 'test-block',
83
+ hasBlockGapSupport: false,
84
+ layoutDefinitions: undefined,
85
+ } );
86
+
87
+ expect( result ).toBe( expected );
88
+ } );
89
+ it( 'should use `auto-fit` with max() function when autoFit is enabled and both minimumColumnWidth and columnCount are provided', () => {
90
+ const expected = `.my-container { grid-template-columns: repeat(auto-fit, minmax(max(min( 12rem, 100%), ( 100% - (1.2rem*2) ) / 3), 1fr)); container-type: inline-size; }`;
91
+
92
+ const result = grid.getLayoutStyle( {
93
+ selector: '.my-container',
94
+ layout: {
95
+ minimumColumnWidth: '12rem',
96
+ columnCount: 3,
97
+ autoFit: true,
98
+ },
99
+ style: {},
100
+ blockName: 'test-block',
101
+ hasBlockGapSupport: false,
102
+ layoutDefinitions: undefined,
103
+ } );
104
+
105
+ expect( result ).toBe( expected );
106
+ } );
107
+ } );
108
+
109
+ describe( 'GridLayoutInspectorControls', () => {
110
+ it( 'renders an unset column count as an empty control value', () => {
111
+ renderInspectorControls( {
112
+ layout: { type: 'grid', columnCount: null },
113
+ resetLayout: { type: 'grid', columnCount: 3 },
114
+ } );
115
+
116
+ expect(
117
+ screen.getByRole( 'spinbutton', { name: 'Columns' } )
118
+ ).toHaveDisplayValue( '' );
119
+ } );
49
120
  } );
@@ -52,11 +52,11 @@ import {
52
52
  mediaEditKey,
53
53
  getMediaSelectKey,
54
54
  deviceTypeKey,
55
- onViewportStateChangeKey,
56
55
  isIsolatedEditorKey,
57
56
  isNavigationOverlayContextKey,
58
57
  isNavigationPostEditorKey,
59
58
  mediaUploadOnSuccessKey,
59
+ mediaSideloadFromUrlKey,
60
60
  openMediaEditorModalKey,
61
61
  } from './store/private-keys';
62
62
  import { requiresWrapperOnCopy } from './components/writing-flow/utils';
@@ -78,6 +78,7 @@ import { LinkPicker } from './components/link-picker';
78
78
  import useRemoteUrlData from './components/link-control/use-rich-url-data';
79
79
  import { PrivateBlockContext } from './components/block-list/private-block-context';
80
80
  import useListViewPanelState from './components/use-list-view-panel-state';
81
+ import InnerContent from './components/inner-content';
81
82
  import {
82
83
  isHashLink,
83
84
  isRelativePath,
@@ -141,11 +142,11 @@ lock( privateApis, {
141
142
  mediaEditKey,
142
143
  getMediaSelectKey,
143
144
  deviceTypeKey,
144
- onViewportStateChangeKey,
145
145
  isIsolatedEditorKey,
146
146
  isNavigationOverlayContextKey,
147
147
  isNavigationPostEditorKey,
148
148
  mediaUploadOnSuccessKey,
149
+ mediaSideloadFromUrlKey,
149
150
  openMediaEditorModalKey,
150
151
  useBlockElement,
151
152
  useBlockElementRef,
@@ -155,4 +156,5 @@ lock( privateApis, {
155
156
  useListViewPanelState,
156
157
  isHashLink,
157
158
  isRelativePath,
159
+ InnerContent,
158
160
  } );
@@ -2051,6 +2051,7 @@ export function __unstableSetTemporarilyEditingAsBlocks( clientId ) {
2051
2051
  * the report url for the media item. It accepts the `InserterMediaItem` as an argument.
2052
2052
  * @property {boolean} [isExternalResource] If the media category is an external resource, this should be set to true.
2053
2053
  * This is used to avoid making a request to the external resource when the user
2054
+ * @property {string} [emptyMessage] Optional message shown in place of the generic "No results found." when the source has no items and there is no active search. Providing it also keeps the source in the tab list while empty, so the message stays reachable.
2054
2055
  */
2055
2056
  export const registerInserterMediaCategory =
2056
2057
  ( category ) =>
@@ -558,3 +558,34 @@ export function setSelectedBlockStyleStateCanvasPreview( clientId, value ) {
558
558
  value,
559
559
  };
560
560
  }
561
+
562
+ /**
563
+ * Sets the globally selected viewport style state. When set to a value other
564
+ * than 'default', block style edits in the inspector apply to that viewport.
565
+ * Driven by the editor's device preview while Responsive editing is enabled.
566
+ *
567
+ * @param {string} viewport The selected viewport state (e.g. 'default', 'tablet', 'mobile').
568
+ *
569
+ * @return {Object} Action object.
570
+ */
571
+ export function setStyleStateViewport( viewport ) {
572
+ return {
573
+ type: 'SET_STYLE_STATE_VIEWPORT',
574
+ viewport,
575
+ };
576
+ }
577
+
578
+ /**
579
+ * Sets whether Responsive editing is enabled. When enabled, the device preview
580
+ * also drives which viewport block style edits are applied to. Session-only.
581
+ *
582
+ * @param {boolean} enabled Whether Responsive editing is enabled.
583
+ *
584
+ * @return {Object} Action object.
585
+ */
586
+ export function setResponsiveEditing( enabled ) {
587
+ return {
588
+ type: 'SET_RESPONSIVE_EDITING',
589
+ enabled,
590
+ };
591
+ }
@@ -10,10 +10,10 @@ export const mediaEditKey = Symbol( 'mediaEditKey' );
10
10
  export const getMediaSelectKey = Symbol( 'getMediaSelect' );
11
11
  export const isIsolatedEditorKey = Symbol( 'isIsolatedEditor' );
12
12
  export const deviceTypeKey = Symbol( 'deviceTypeKey' );
13
- export const onViewportStateChangeKey = Symbol( 'onViewportStateChangeKey' );
14
13
  export const isNavigationOverlayContextKey = Symbol(
15
14
  'isNavigationOverlayContext'
16
15
  );
17
16
  export const isNavigationPostEditorKey = Symbol( 'isNavigationPostEditor' );
18
17
  export const mediaUploadOnSuccessKey = Symbol( 'mediaUploadOnSuccess' );
18
+ export const mediaSideloadFromUrlKey = Symbol( 'mediaSideloadFromUrl' );
19
19
  export const openMediaEditorModalKey = Symbol( 'openMediaEditorModal' );
@@ -159,16 +159,31 @@ export const getClientIdsTree = createSelector(
159
159
  ( state ) => [ state.blocks.order ]
160
160
  );
161
161
 
162
- function getEnabledClientIdsTreeUnmemoized( state, rootClientId ) {
162
+ /**
163
+ * Returns a tree of block objects filtered by a block inclusion callback.
164
+ * Excluded blocks are replaced by any included descendants.
165
+ *
166
+ * @param {Object} state Global application state.
167
+ * @param {?string} rootClientId Optional root client ID of block list.
168
+ * @param {Function} includesBlock Callback that returns whether to include a block.
169
+ *
170
+ * @return {Object[]} Tree of block objects with only clientID and innerBlocks set.
171
+ */
172
+ function getFilteredClientIdsTreeUnmemoized(
173
+ state,
174
+ rootClientId,
175
+ includesBlock
176
+ ) {
163
177
  const blockOrder = getBlockOrder( state, rootClientId );
164
178
  const result = [];
165
179
 
166
180
  for ( const clientId of blockOrder ) {
167
- const innerBlocks = getEnabledClientIdsTreeUnmemoized(
181
+ const innerBlocks = getFilteredClientIdsTreeUnmemoized(
168
182
  state,
169
- clientId
183
+ clientId,
184
+ includesBlock
170
185
  );
171
- if ( getBlockEditingMode( state, clientId ) !== 'disabled' ) {
186
+ if ( includesBlock( state, clientId ) ) {
172
187
  result.push( { clientId, innerBlocks } );
173
188
  } else {
174
189
  result.push( ...innerBlocks );
@@ -178,6 +193,100 @@ function getEnabledClientIdsTreeUnmemoized( state, rootClientId ) {
178
193
  return result;
179
194
  }
180
195
 
196
+ function getEnabledClientIdsTreeUnmemoized( state, rootClientId ) {
197
+ return getFilteredClientIdsTreeUnmemoized(
198
+ state,
199
+ rootClientId,
200
+ ( _state, clientId ) =>
201
+ getBlockEditingMode( _state, clientId ) !== 'disabled'
202
+ );
203
+ }
204
+
205
+ /**
206
+ * Returns whether the nearest explicit block editing mode in the block's
207
+ * ancestry is disabled.
208
+ *
209
+ * @param {Object} state Global application state.
210
+ * @param {string} clientId The block client ID.
211
+ *
212
+ * @return {boolean} Whether an explicit parent block editing mode disables this
213
+ * block.
214
+ */
215
+ function hasExplicitDisabledParent( state, clientId ) {
216
+ let parent = state.blocks.parents.get( clientId );
217
+
218
+ while ( parent !== undefined ) {
219
+ const parentBlockEditingMode =
220
+ state.blocks.blockEditingModes.get( parent );
221
+
222
+ if ( parentBlockEditingMode ) {
223
+ return parentBlockEditingMode === 'disabled';
224
+ }
225
+
226
+ parent = state.blocks.parents.get( parent );
227
+ }
228
+
229
+ return false;
230
+ }
231
+
232
+ /**
233
+ * Returns the block tree displayed by List View.
234
+ *
235
+ * @param {Object} state Global application state.
236
+ * @param {?string} rootClientId Optional root client ID of block list.
237
+ *
238
+ * @return {Object[]} Tree of block objects with only clientID and innerBlocks set.
239
+ */
240
+ function getListViewClientIdsTreeUnmemoized( state, rootClientId ) {
241
+ return getFilteredClientIdsTreeUnmemoized(
242
+ state,
243
+ rootClientId,
244
+ ( _state, clientId ) => {
245
+ // Non-disabled blocks are always shown in List view.
246
+ if ( getBlockEditingMode( _state, clientId ) !== 'disabled' ) {
247
+ return true;
248
+ }
249
+
250
+ const explicitBlockEditingMode =
251
+ _state.blocks.blockEditingModes.get( clientId );
252
+ if ( explicitBlockEditingMode ) {
253
+ return explicitBlockEditingMode !== 'disabled';
254
+ }
255
+
256
+ if ( hasExplicitDisabledParent( _state, clientId ) ) {
257
+ return false;
258
+ }
259
+
260
+ // When a contentOnly section is being edited, there's some special handling.
261
+ if ( _state.editedContentOnlySection ) {
262
+ // Blocks within the edited content only section generally have their block
263
+ // editing mode flipped from disabled to default for editing, any disabled
264
+ // blocks can still be excluded.
265
+ if ( isWithinEditedContentOnlySection( _state, clientId ) ) {
266
+ return false;
267
+ }
268
+
269
+ // Blocks that are not in another section but are disabled are shown.
270
+ // These are blocks that would usually be visible.
271
+ const parentSectionBlock = getParentSectionBlock(
272
+ _state,
273
+ clientId
274
+ );
275
+ if ( ! parentSectionBlock ) {
276
+ return true;
277
+ }
278
+
279
+ // If a block is in another section, then it is only visible if its a content block.
280
+ if ( isContentBlock( getBlockName( _state, clientId ) ) ) {
281
+ return true;
282
+ }
283
+ }
284
+
285
+ return false;
286
+ }
287
+ );
288
+ }
289
+
181
290
  /**
182
291
  * Returns a tree of block objects with only clientID and innerBlocks set.
183
292
  * Blocks with a 'disabled' editing mode are not included.
@@ -195,6 +304,34 @@ export const getEnabledClientIdsTree = createRegistrySelector( () =>
195
304
  ] )
196
305
  );
197
306
 
307
+ /**
308
+ * Returns the block tree displayed by List View.
309
+ *
310
+ * Blocks with a 'disabled' editing mode are usually not included. When a
311
+ * content-only section is being edited, List View keeps visible outside-section
312
+ * context blocks in the tree so they can be faded. Blocks that were already
313
+ * hidden because they are non-content blocks inside another content-only section
314
+ * remain hidden.
315
+ *
316
+ * @param {Object} state Global application state.
317
+ * @param {?string} rootClientId Optional root client ID of block list.
318
+ *
319
+ * @return {Object[]} Tree of block objects with only clientID and innerBlocks set.
320
+ */
321
+ export const getListViewClientIdsTree = createRegistrySelector( () =>
322
+ createSelector( getListViewClientIdsTreeUnmemoized, ( state ) => [
323
+ state.blocks.order,
324
+ state.derivedBlockEditingModes,
325
+ state.blocks.blockEditingModes,
326
+ state.blocks.parents,
327
+ state.blocks.byClientId,
328
+ state.blocks.attributes,
329
+ state.blockListSettings,
330
+ state.editedContentOnlySection,
331
+ state.settings,
332
+ ] )
333
+ );
334
+
198
335
  /**
199
336
  * Returns a list of a given block's ancestors, from top to bottom. Blocks with
200
337
  * a 'disabled' editing mode are excluded.
@@ -1152,6 +1289,30 @@ const DEFAULT_BLOCK_STYLE_STATE = {
1152
1289
  pseudo: 'default',
1153
1290
  };
1154
1291
 
1292
+ /**
1293
+ * Returns the globally selected viewport style state. When set to a value other
1294
+ * than 'default', block style edits in the inspector apply to that viewport.
1295
+ *
1296
+ * @param {Object} state Global application state.
1297
+ *
1298
+ * @return {string} The selected viewport style state.
1299
+ */
1300
+ export function getStyleStateViewport( state ) {
1301
+ return state.styleStateViewport ?? DEFAULT_BLOCK_STYLE_STATE.viewport;
1302
+ }
1303
+
1304
+ /**
1305
+ * Returns whether Responsive editing is enabled. When enabled, the device
1306
+ * preview also drives which viewport block style edits are applied to.
1307
+ *
1308
+ * @param {Object} state Global application state.
1309
+ *
1310
+ * @return {boolean} Whether Responsive editing is enabled.
1311
+ */
1312
+ export function isResponsiveEditing( state ) {
1313
+ return state.isResponsiveEditing;
1314
+ }
1315
+
1155
1316
  /**
1156
1317
  * Returns the selected style state for a block's style controls.
1157
1318
  *
@@ -1160,13 +1321,25 @@ const DEFAULT_BLOCK_STYLE_STATE = {
1160
1321
  *
1161
1322
  * @return {Object} The selected block style state.
1162
1323
  */
1163
- export function getSelectedBlockStyleState( state, clientId ) {
1164
- if ( state.selectedBlockStyleState?.clientId !== clientId ) {
1165
- return DEFAULT_BLOCK_STYLE_STATE;
1166
- }
1167
-
1168
- return state.selectedBlockStyleState.value ?? DEFAULT_BLOCK_STYLE_STATE;
1169
- }
1324
+ export const getSelectedBlockStyleState = createSelector(
1325
+ ( state, clientId ) => {
1326
+ const perBlockState =
1327
+ state.selectedBlockStyleState?.clientId === clientId
1328
+ ? state.selectedBlockStyleState.value ??
1329
+ DEFAULT_BLOCK_STYLE_STATE
1330
+ : DEFAULT_BLOCK_STYLE_STATE;
1331
+
1332
+ return {
1333
+ ...perBlockState,
1334
+ // The viewport is tracked globally, so inject it here. This way
1335
+ // consumers receive a single combined state object instead of
1336
+ // merging the global viewport themselves, and selectors derived
1337
+ // from this stay consistent.
1338
+ viewport: getStyleStateViewport( state ),
1339
+ };
1340
+ },
1341
+ ( state ) => [ state.styleStateViewport, state.selectedBlockStyleState ]
1342
+ );
1170
1343
 
1171
1344
  /**
1172
1345
  * Returns whether a non-default style state is selected for a block.