@wordpress/block-editor 15.19.1-next.v.202605131006.0 → 15.20.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 (352) hide show
  1. package/CHANGELOG.md +15 -1
  2. package/build/components/block-card/index.cjs +51 -41
  3. package/build/components/block-card/index.cjs.map +3 -3
  4. package/build/components/block-heading-level-dropdown/heading-level-icon.cjs.map +3 -3
  5. package/build/components/block-icon/index.cjs +7 -1
  6. package/build/components/block-icon/index.cjs.map +3 -3
  7. package/build/components/block-inspector/index.cjs +156 -11
  8. package/build/components/block-inspector/index.cjs.map +3 -3
  9. package/build/components/block-inspector/inspector-pre-tabs-slot-fill.cjs +38 -0
  10. package/build/components/block-inspector/inspector-pre-tabs-slot-fill.cjs.map +7 -0
  11. package/build/components/block-list/use-block-props/index.cjs +1 -1
  12. package/build/components/block-list/use-block-props/index.cjs.map +2 -2
  13. package/build/components/block-list/use-block-props/use-focus-handler.cjs +3 -4
  14. package/build/components/block-list/use-block-props/use-focus-handler.cjs.map +3 -3
  15. package/build/components/block-list/use-block-props/use-is-hovered.cjs +24 -14
  16. package/build/components/block-list/use-block-props/use-is-hovered.cjs.map +3 -3
  17. package/build/components/block-lock/modal.cjs.map +3 -3
  18. package/build/components/block-patterns-list/index.cjs +13 -2
  19. package/build/components/block-patterns-list/index.cjs.map +2 -2
  20. package/build/components/block-popover/index.cjs +13 -3
  21. package/build/components/block-popover/index.cjs.map +2 -2
  22. package/build/components/block-toolbar/switch-section-style.cjs.map +3 -3
  23. package/build/components/block-visibility/modal.cjs.map +3 -3
  24. package/build/components/block-visibility/viewport-visibility-info.cjs.map +3 -3
  25. package/build/components/colors-gradients/control.cjs +7 -4
  26. package/build/components/colors-gradients/control.cjs.map +2 -2
  27. package/build/components/global-styles/advanced-panel.cjs +24 -22
  28. package/build/components/global-styles/advanced-panel.cjs.map +3 -3
  29. package/build/components/global-styles/color-panel.cjs +95 -58
  30. package/build/components/global-styles/color-panel.cjs.map +2 -2
  31. package/build/components/global-styles/dimensions-panel.cjs +11 -5
  32. package/build/components/global-styles/dimensions-panel.cjs.map +2 -2
  33. package/build/components/global-styles/index.cjs +3 -0
  34. package/build/components/global-styles/index.cjs.map +2 -2
  35. package/build/components/global-styles/shadow-panel-components.cjs +38 -26
  36. package/build/components/global-styles/shadow-panel-components.cjs.map +2 -2
  37. package/build/components/global-styles/state-control-badges.cjs +69 -0
  38. package/build/components/global-styles/state-control-badges.cjs.map +7 -0
  39. package/build/components/global-styles/state-control.cjs +54 -63
  40. package/build/components/global-styles/state-control.cjs.map +3 -3
  41. package/build/components/iframe/index.cjs +0 -3
  42. package/build/components/iframe/index.cjs.map +2 -2
  43. package/build/components/iframe/use-scale-canvas.cjs +4 -1
  44. package/build/components/iframe/use-scale-canvas.cjs.map +2 -2
  45. package/build/components/inserter/hooks/use-patterns-state.cjs +4 -6
  46. package/build/components/inserter/hooks/use-patterns-state.cjs.map +2 -2
  47. package/build/components/inserter/index.cjs +1 -0
  48. package/build/components/inserter/index.cjs.map +2 -2
  49. package/build/components/inserter/media-tab/media-preview.cjs +27 -18
  50. package/build/components/inserter/media-tab/media-preview.cjs.map +2 -2
  51. package/build/components/inserter/media-tab/utils.cjs +1 -1
  52. package/build/components/inserter/media-tab/utils.cjs.map +2 -2
  53. package/build/components/inserter/panel.cjs.map +3 -3
  54. package/build/components/inspector-controls/block-support-tools-panel.cjs +10 -2
  55. package/build/components/inspector-controls/block-support-tools-panel.cjs.map +2 -2
  56. package/build/components/inspector-controls/fill.cjs +14 -4
  57. package/build/components/inspector-controls/fill.cjs.map +2 -2
  58. package/build/components/inspector-controls/groups.cjs +2 -0
  59. package/build/components/inspector-controls/groups.cjs.map +2 -2
  60. package/build/components/inspector-controls-tabs/index.cjs +13 -8
  61. package/build/components/inspector-controls-tabs/index.cjs.map +3 -3
  62. package/build/components/inspector-controls-tabs/settings-tab.cjs +1 -4
  63. package/build/components/inspector-controls-tabs/settings-tab.cjs.map +3 -3
  64. package/build/components/inspector-controls-tabs/styles-tab.cjs +9 -0
  65. package/build/components/inspector-controls-tabs/styles-tab.cjs.map +3 -3
  66. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs +11 -5
  67. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs.map +2 -2
  68. package/build/components/list-view/block-select-button.cjs +20 -8
  69. package/build/components/list-view/block-select-button.cjs.map +2 -2
  70. package/build/components/list-view/block.cjs +2 -1
  71. package/build/components/list-view/block.cjs.map +2 -2
  72. package/build/components/preset-input-control/custom-value-controls.cjs +10 -1
  73. package/build/components/preset-input-control/custom-value-controls.cjs.map +2 -2
  74. package/build/components/preset-input-control/index.cjs.map +3 -3
  75. package/build/components/provider/use-media-upload-settings.cjs +1 -0
  76. package/build/components/provider/use-media-upload-settings.cjs.map +2 -2
  77. package/build/components/rich-text/event-listeners/enter.cjs +9 -2
  78. package/build/components/rich-text/event-listeners/enter.cjs.map +3 -3
  79. package/build/components/rich-text/event-listeners/paste-handler.cjs +4 -4
  80. package/build/components/rich-text/event-listeners/paste-handler.cjs.map +3 -3
  81. package/build/hooks/background.cjs +13 -3
  82. package/build/hooks/background.cjs.map +2 -2
  83. package/build/hooks/block-fields/link/index.cjs.map +3 -3
  84. package/build/hooks/block-fields/media/index.cjs.map +3 -3
  85. package/build/hooks/block-style-state.cjs +112 -0
  86. package/build/hooks/block-style-state.cjs.map +7 -0
  87. package/build/hooks/border.cjs +13 -3
  88. package/build/hooks/border.cjs.map +2 -2
  89. package/build/hooks/color.cjs +28 -9
  90. package/build/hooks/color.cjs.map +2 -2
  91. package/build/hooks/dimensions.cjs +15 -6
  92. package/build/hooks/dimensions.cjs.map +2 -2
  93. package/build/hooks/layout-child.cjs +147 -61
  94. package/build/hooks/layout-child.cjs.map +2 -2
  95. package/build/hooks/layout.cjs +263 -56
  96. package/build/hooks/layout.cjs.map +3 -3
  97. package/build/hooks/state-utils.cjs +94 -0
  98. package/build/hooks/state-utils.cjs.map +7 -0
  99. package/build/hooks/states.cjs +124 -0
  100. package/build/hooks/states.cjs.map +7 -0
  101. package/build/hooks/style.cjs +304 -17
  102. package/build/hooks/style.cjs.map +3 -3
  103. package/build/hooks/typography.cjs +14 -5
  104. package/build/hooks/typography.cjs.map +2 -2
  105. package/build/layouts/constrained.cjs +128 -55
  106. package/build/layouts/constrained.cjs.map +3 -3
  107. package/build/layouts/flex.cjs +119 -31
  108. package/build/layouts/flex.cjs.map +3 -3
  109. package/build/layouts/grid.cjs +103 -40
  110. package/build/layouts/grid.cjs.map +3 -3
  111. package/build/private-apis.cjs +2 -0
  112. package/build/private-apis.cjs.map +2 -2
  113. package/build/store/private-actions.cjs +18 -0
  114. package/build/store/private-actions.cjs.map +2 -2
  115. package/build/store/private-keys.cjs +10 -2
  116. package/build/store/private-keys.cjs.map +2 -2
  117. package/build/store/private-selectors.cjs +26 -2
  118. package/build/store/private-selectors.cjs.map +2 -2
  119. package/build/store/reducer.cjs +70 -1
  120. package/build/store/reducer.cjs.map +2 -2
  121. package/build/store/utils.cjs +1 -1
  122. package/build/store/utils.cjs.map +2 -2
  123. package/build/utils/color-values.cjs +44 -0
  124. package/build/utils/color-values.cjs.map +7 -0
  125. package/build-module/components/block-card/index.mjs +52 -45
  126. package/build-module/components/block-card/index.mjs.map +2 -2
  127. package/build-module/components/block-heading-level-dropdown/heading-level-icon.mjs +2 -2
  128. package/build-module/components/block-heading-level-dropdown/heading-level-icon.mjs.map +2 -2
  129. package/build-module/components/block-icon/index.mjs +8 -2
  130. package/build-module/components/block-icon/index.mjs.map +2 -2
  131. package/build-module/components/block-inspector/index.mjs +166 -13
  132. package/build-module/components/block-inspector/index.mjs.map +2 -2
  133. package/build-module/components/block-inspector/inspector-pre-tabs-slot-fill.mjs +12 -0
  134. package/build-module/components/block-inspector/inspector-pre-tabs-slot-fill.mjs.map +7 -0
  135. package/build-module/components/block-list/use-block-props/index.mjs +1 -1
  136. package/build-module/components/block-list/use-block-props/index.mjs.map +2 -2
  137. package/build-module/components/block-list/use-block-props/use-focus-handler.mjs +7 -5
  138. package/build-module/components/block-list/use-block-props/use-focus-handler.mjs.map +2 -2
  139. package/build-module/components/block-list/use-block-props/use-is-hovered.mjs +28 -15
  140. package/build-module/components/block-list/use-block-props/use-is-hovered.mjs.map +2 -2
  141. package/build-module/components/block-lock/modal.mjs +4 -4
  142. package/build-module/components/block-lock/modal.mjs.map +2 -2
  143. package/build-module/components/block-patterns-list/index.mjs +14 -4
  144. package/build-module/components/block-patterns-list/index.mjs.map +2 -2
  145. package/build-module/components/block-popover/index.mjs +13 -3
  146. package/build-module/components/block-popover/index.mjs.map +2 -2
  147. package/build-module/components/block-toolbar/switch-section-style.mjs +2 -2
  148. package/build-module/components/block-toolbar/switch-section-style.mjs.map +2 -2
  149. package/build-module/components/block-visibility/modal.mjs +2 -2
  150. package/build-module/components/block-visibility/modal.mjs.map +2 -2
  151. package/build-module/components/block-visibility/viewport-visibility-info.mjs +2 -2
  152. package/build-module/components/block-visibility/viewport-visibility-info.mjs.map +2 -2
  153. package/build-module/components/colors-gradients/control.mjs +7 -4
  154. package/build-module/components/colors-gradients/control.mjs.map +2 -2
  155. package/build-module/components/global-styles/advanced-panel.mjs +25 -27
  156. package/build-module/components/global-styles/advanced-panel.mjs.map +2 -2
  157. package/build-module/components/global-styles/color-panel.mjs +96 -59
  158. package/build-module/components/global-styles/color-panel.mjs.map +2 -2
  159. package/build-module/components/global-styles/dimensions-panel.mjs +14 -5
  160. package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
  161. package/build-module/components/global-styles/index.mjs +2 -0
  162. package/build-module/components/global-styles/index.mjs.map +2 -2
  163. package/build-module/components/global-styles/shadow-panel-components.mjs +39 -28
  164. package/build-module/components/global-styles/shadow-panel-components.mjs.map +2 -2
  165. package/build-module/components/global-styles/state-control-badges.mjs +48 -0
  166. package/build-module/components/global-styles/state-control-badges.mjs.map +7 -0
  167. package/build-module/components/global-styles/state-control.mjs +57 -71
  168. package/build-module/components/global-styles/state-control.mjs.map +2 -2
  169. package/build-module/components/iframe/index.mjs +0 -3
  170. package/build-module/components/iframe/index.mjs.map +2 -2
  171. package/build-module/components/iframe/use-scale-canvas.mjs +4 -1
  172. package/build-module/components/iframe/use-scale-canvas.mjs.map +2 -2
  173. package/build-module/components/inserter/hooks/use-patterns-state.mjs +8 -7
  174. package/build-module/components/inserter/hooks/use-patterns-state.mjs.map +2 -2
  175. package/build-module/components/inserter/index.mjs +1 -0
  176. package/build-module/components/inserter/index.mjs.map +2 -2
  177. package/build-module/components/inserter/media-tab/media-preview.mjs +27 -19
  178. package/build-module/components/inserter/media-tab/media-preview.mjs.map +2 -2
  179. package/build-module/components/inserter/media-tab/utils.mjs +1 -1
  180. package/build-module/components/inserter/media-tab/utils.mjs.map +2 -2
  181. package/build-module/components/inserter/panel.mjs +2 -2
  182. package/build-module/components/inserter/panel.mjs.map +2 -2
  183. package/build-module/components/inspector-controls/block-support-tools-panel.mjs +10 -2
  184. package/build-module/components/inspector-controls/block-support-tools-panel.mjs.map +2 -2
  185. package/build-module/components/inspector-controls/fill.mjs +18 -5
  186. package/build-module/components/inspector-controls/fill.mjs.map +2 -2
  187. package/build-module/components/inspector-controls/groups.mjs +2 -0
  188. package/build-module/components/inspector-controls/groups.mjs.map +2 -2
  189. package/build-module/components/inspector-controls-tabs/index.mjs +14 -10
  190. package/build-module/components/inspector-controls-tabs/index.mjs.map +2 -2
  191. package/build-module/components/inspector-controls-tabs/settings-tab.mjs +1 -4
  192. package/build-module/components/inspector-controls-tabs/settings-tab.mjs.map +2 -2
  193. package/build-module/components/inspector-controls-tabs/styles-tab.mjs +9 -0
  194. package/build-module/components/inspector-controls-tabs/styles-tab.mjs.map +2 -2
  195. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs +11 -5
  196. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs.map +2 -2
  197. package/build-module/components/list-view/block-select-button.mjs +20 -9
  198. package/build-module/components/list-view/block-select-button.mjs.map +2 -2
  199. package/build-module/components/list-view/block.mjs +2 -1
  200. package/build-module/components/list-view/block.mjs.map +2 -2
  201. package/build-module/components/preset-input-control/custom-value-controls.mjs +10 -2
  202. package/build-module/components/preset-input-control/custom-value-controls.mjs.map +2 -2
  203. package/build-module/components/preset-input-control/index.mjs +2 -2
  204. package/build-module/components/preset-input-control/index.mjs.map +2 -2
  205. package/build-module/components/provider/use-media-upload-settings.mjs +1 -0
  206. package/build-module/components/provider/use-media-upload-settings.mjs.map +2 -2
  207. package/build-module/components/rich-text/event-listeners/enter.mjs +9 -2
  208. package/build-module/components/rich-text/event-listeners/enter.mjs.map +2 -2
  209. package/build-module/components/rich-text/event-listeners/paste-handler.mjs +4 -4
  210. package/build-module/components/rich-text/event-listeners/paste-handler.mjs.map +2 -2
  211. package/build-module/hooks/background.mjs +18 -3
  212. package/build-module/hooks/background.mjs.map +2 -2
  213. package/build-module/hooks/block-fields/link/index.mjs +3 -3
  214. package/build-module/hooks/block-fields/link/index.mjs.map +2 -2
  215. package/build-module/hooks/block-fields/media/index.mjs +3 -3
  216. package/build-module/hooks/block-fields/media/index.mjs.map +2 -2
  217. package/build-module/hooks/block-style-state.mjs +79 -0
  218. package/build-module/hooks/block-style-state.mjs.map +7 -0
  219. package/build-module/hooks/border.mjs +18 -3
  220. package/build-module/hooks/border.mjs.map +2 -2
  221. package/build-module/hooks/color.mjs +33 -9
  222. package/build-module/hooks/color.mjs.map +2 -2
  223. package/build-module/hooks/dimensions.mjs +20 -6
  224. package/build-module/hooks/dimensions.mjs.map +2 -2
  225. package/build-module/hooks/layout-child.mjs +141 -61
  226. package/build-module/hooks/layout-child.mjs.map +2 -2
  227. package/build-module/hooks/layout.mjs +270 -58
  228. package/build-module/hooks/layout.mjs.map +2 -2
  229. package/build-module/hooks/state-utils.mjs +64 -0
  230. package/build-module/hooks/state-utils.mjs.map +7 -0
  231. package/build-module/hooks/states.mjs +85 -0
  232. package/build-module/hooks/states.mjs.map +7 -0
  233. package/build-module/hooks/style.mjs +309 -18
  234. package/build-module/hooks/style.mjs.map +2 -2
  235. package/build-module/hooks/typography.mjs +19 -5
  236. package/build-module/hooks/typography.mjs.map +2 -2
  237. package/build-module/layouts/constrained.mjs +130 -57
  238. package/build-module/layouts/constrained.mjs.map +2 -2
  239. package/build-module/layouts/flex.mjs +123 -35
  240. package/build-module/layouts/flex.mjs.map +2 -2
  241. package/build-module/layouts/grid.mjs +105 -42
  242. package/build-module/layouts/grid.mjs.map +2 -2
  243. package/build-module/private-apis.mjs +4 -0
  244. package/build-module/private-apis.mjs.map +2 -2
  245. package/build-module/store/private-actions.mjs +16 -0
  246. package/build-module/store/private-actions.mjs.map +2 -2
  247. package/build-module/store/private-keys.mjs +7 -1
  248. package/build-module/store/private-keys.mjs.map +2 -2
  249. package/build-module/store/private-selectors.mjs +25 -2
  250. package/build-module/store/private-selectors.mjs.map +2 -2
  251. package/build-module/store/reducer.mjs +69 -1
  252. package/build-module/store/reducer.mjs.map +2 -2
  253. package/build-module/store/utils.mjs +5 -2
  254. package/build-module/store/utils.mjs.map +2 -2
  255. package/build-module/utils/color-values.mjs +19 -0
  256. package/build-module/utils/color-values.mjs.map +7 -0
  257. package/build-style/content-rtl.css +18 -3
  258. package/build-style/content.css +18 -3
  259. package/build-style/style-rtl.css +14 -17
  260. package/build-style/style.css +14 -17
  261. package/package.json +41 -41
  262. package/src/components/audio-player/index.native.js +7 -3
  263. package/src/components/block-card/index.js +67 -60
  264. package/src/components/block-heading-level-dropdown/heading-level-icon.js +2 -2
  265. package/src/components/block-icon/index.js +5 -2
  266. package/src/components/block-icon/index.native.js +2 -2
  267. package/src/components/block-inspector/index.js +153 -7
  268. package/src/components/block-inspector/inspector-pre-tabs-slot-fill.js +11 -0
  269. package/src/components/block-list/block-selection-button.native.js +3 -3
  270. package/src/components/block-list/content.scss +0 -6
  271. package/src/components/block-list/use-block-props/index.js +1 -1
  272. package/src/components/block-list/use-block-props/use-focus-handler.js +8 -6
  273. package/src/components/block-list/use-block-props/use-is-hovered.js +32 -15
  274. package/src/components/block-lock/modal.js +4 -4
  275. package/src/components/block-patterns-list/index.js +14 -5
  276. package/src/components/block-patterns-list/stories/index.story.jsx +2 -0
  277. package/src/components/block-patterns-list/style.scss +0 -1
  278. package/src/components/block-popover/index.js +20 -10
  279. package/src/components/block-toolbar/switch-section-style.js +2 -2
  280. package/src/components/block-visibility/modal.js +2 -2
  281. package/src/components/block-visibility/viewport-visibility-info.js +2 -2
  282. package/src/components/colors/test/with-colors.js +1 -1
  283. package/src/components/colors-gradients/control.js +10 -8
  284. package/src/components/colors-gradients/test/control.js +98 -1
  285. package/src/components/global-styles/advanced-panel.js +44 -39
  286. package/src/components/global-styles/color-panel.js +133 -60
  287. package/src/components/global-styles/dimensions-panel.js +17 -4
  288. package/src/components/global-styles/index.js +1 -0
  289. package/src/components/global-styles/shadow-panel-components.js +29 -19
  290. package/src/components/global-styles/state-control-badges.js +58 -0
  291. package/src/components/global-styles/state-control.js +28 -36
  292. package/src/components/global-styles/test/color-panel.js +135 -0
  293. package/src/components/iframe/index.js +0 -3
  294. package/src/components/iframe/use-scale-canvas.js +8 -2
  295. package/src/components/inserter/hooks/use-patterns-state.js +12 -7
  296. package/src/components/inserter/index.js +1 -0
  297. package/src/components/inserter/media-tab/media-preview.js +29 -20
  298. package/src/components/inserter/media-tab/utils.js +1 -1
  299. package/src/components/inserter/panel.js +2 -2
  300. package/src/components/inserter/style.scss +1 -0
  301. package/src/components/inserter-button/index.native.js +5 -2
  302. package/src/components/inspector-controls/block-support-tools-panel.js +10 -2
  303. package/src/components/inspector-controls/fill.js +18 -5
  304. package/src/components/inspector-controls/groups.js +2 -0
  305. package/src/components/inspector-controls-tabs/index.js +9 -5
  306. package/src/components/inspector-controls-tabs/settings-tab.js +1 -7
  307. package/src/components/inspector-controls-tabs/styles-tab.js +6 -0
  308. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +13 -7
  309. package/src/components/list-view/block-select-button.js +19 -9
  310. package/src/components/list-view/block.js +6 -1
  311. package/src/components/media-replace-flow/style.scss +0 -18
  312. package/src/components/preset-input-control/custom-value-controls.js +13 -6
  313. package/src/components/preset-input-control/index.js +2 -2
  314. package/src/components/provider/use-media-upload-settings.js +1 -0
  315. package/src/components/rich-text/event-listeners/enter.js +14 -2
  316. package/src/components/rich-text/event-listeners/paste-handler.js +5 -4
  317. package/src/components/unsupported-block-details/index.native.js +6 -2
  318. package/src/components/video-player/index.native.js +2 -2
  319. package/src/components/warning/index.native.js +2 -2
  320. package/src/hooks/background.js +59 -37
  321. package/src/hooks/block-fields/link/index.js +3 -3
  322. package/src/hooks/block-fields/media/index.js +3 -3
  323. package/src/hooks/block-style-state.js +127 -0
  324. package/src/hooks/border.js +25 -6
  325. package/src/hooks/color.js +40 -18
  326. package/src/hooks/dimensions.js +32 -11
  327. package/src/hooks/layout-child.js +179 -62
  328. package/src/hooks/layout.js +349 -75
  329. package/src/hooks/layout.scss +6 -0
  330. package/src/hooks/state-utils.js +158 -0
  331. package/src/hooks/states.js +109 -0
  332. package/src/hooks/style.js +456 -19
  333. package/src/hooks/test/block-style-state.js +270 -0
  334. package/src/hooks/test/layout.js +185 -0
  335. package/src/hooks/test/state-utils.js +193 -0
  336. package/src/hooks/test/style.js +301 -1
  337. package/src/hooks/typography.js +33 -14
  338. package/src/layouts/constrained.js +182 -95
  339. package/src/layouts/flex.js +141 -36
  340. package/src/layouts/grid.js +122 -32
  341. package/src/layouts/test/flex.js +57 -20
  342. package/src/private-apis.js +4 -0
  343. package/src/store/private-actions.js +32 -0
  344. package/src/store/private-keys.js +4 -0
  345. package/src/store/private-selectors.js +44 -2
  346. package/src/store/reducer.js +105 -1
  347. package/src/store/test/private-actions.js +26 -0
  348. package/src/store/test/private-selectors.js +90 -0
  349. package/src/store/test/reducer.js +363 -0
  350. package/src/store/utils.js +6 -2
  351. package/src/utils/color-values.js +28 -0
  352. package/src/utils/test/color-values.js +78 -0
@@ -13,7 +13,7 @@ import {
13
13
  __experimentalToggleGroupControlOption as ToggleGroupControlOption,
14
14
  __experimentalUnitControl as UnitControl,
15
15
  __experimentalParseQuantityAndUnitFromRawValue as parseQuantityAndUnitFromRawValue,
16
- __experimentalVStack as VStack,
16
+ __experimentalToolsPanelItem as ToolsPanelItem,
17
17
  } from '@wordpress/components';
18
18
  import { useState } from '@wordpress/element';
19
19
 
@@ -23,7 +23,7 @@ import { useState } from '@wordpress/element';
23
23
  import { appendSelectors, getBlockGapCSS } from './utils';
24
24
  import { getGapCSSValue, getGapBoxControlValueFromStyle } from '../hooks/gap';
25
25
  import { getSpacingPresetCssVar } from '../components/spacing-sizes-control/utils';
26
- import { shouldSkipSerialization } from '../hooks/utils';
26
+ import { cleanEmptyObject, shouldSkipSerialization } from '../hooks/utils';
27
27
  import { LAYOUT_DEFINITIONS } from './definitions';
28
28
 
29
29
  const RANGE_CONTROL_MAX_VALUES = {
@@ -70,6 +70,8 @@ export default {
70
70
  layout = {},
71
71
  onChange,
72
72
  layoutBlockSupport = {},
73
+ resetLayout = {},
74
+ clientId,
73
75
  } ) {
74
76
  const { allowSizingOnChildren = false } = layoutBlockSupport;
75
77
 
@@ -79,29 +81,87 @@ export default {
79
81
  const showMinWidthControl =
80
82
  ! layout?.isManualPlacement ||
81
83
  window.__experimentalEnableGridInteractivity;
84
+ const defaultColumnCount = layout.isManualPlacement ? 3 : undefined;
85
+ const hasLayoutValue = ( key, defaultValue ) =>
86
+ ( layout?.[ key ] ?? defaultValue ) !==
87
+ ( resetLayout?.[ key ] ?? defaultValue );
88
+ const hasGridTypeValue = () =>
89
+ hasLayoutValue( 'isManualPlacement', false );
90
+ const hasColumnsAndRowsValue = () =>
91
+ hasLayoutValue( 'columnCount', defaultColumnCount ) ||
92
+ hasLayoutValue( 'rowCount' );
93
+ const hasMinimumColumnWidthValue = () =>
94
+ hasLayoutValue( 'minimumColumnWidth' );
95
+ const resetGridType = () =>
96
+ onChange(
97
+ cleanEmptyObject( {
98
+ ...layout,
99
+ isManualPlacement: resetLayout?.isManualPlacement,
100
+ rowCount: resetLayout?.rowCount,
101
+ minimumColumnWidth: resetLayout?.minimumColumnWidth,
102
+ } )
103
+ );
104
+ const resetColumnsAndRows = () =>
105
+ onChange(
106
+ cleanEmptyObject( {
107
+ ...layout,
108
+ columnCount: resetLayout?.columnCount ?? defaultColumnCount,
109
+ rowCount: resetLayout?.rowCount,
110
+ } )
111
+ );
112
+ const resetMinimumColumnWidth = () =>
113
+ onChange(
114
+ cleanEmptyObject( {
115
+ ...layout,
116
+ minimumColumnWidth: resetLayout?.minimumColumnWidth,
117
+ } )
118
+ );
119
+
82
120
  return (
83
121
  <>
84
122
  { window.__experimentalEnableGridInteractivity && (
85
- <GridLayoutTypeControl
86
- layout={ layout }
87
- onChange={ onChange }
88
- />
123
+ <ToolsPanelItem
124
+ label={ __( 'Grid item position' ) }
125
+ hasValue={ hasGridTypeValue }
126
+ onDeselect={ resetGridType }
127
+ isShownByDefault
128
+ panelId={ clientId }
129
+ >
130
+ <GridLayoutTypeControl
131
+ layout={ layout }
132
+ onChange={ onChange }
133
+ />
134
+ </ToolsPanelItem>
89
135
  ) }
90
- <VStack spacing={ 4 }>
91
- { showColumnsControl && (
136
+ { showColumnsControl && (
137
+ <ToolsPanelItem
138
+ label={ __( 'Columns and rows' ) }
139
+ hasValue={ hasColumnsAndRowsValue }
140
+ onDeselect={ resetColumnsAndRows }
141
+ isShownByDefault
142
+ panelId={ clientId }
143
+ >
92
144
  <GridLayoutColumnsAndRowsControl
93
145
  layout={ layout }
94
146
  onChange={ onChange }
95
147
  allowSizingOnChildren={ allowSizingOnChildren }
96
148
  />
97
- ) }
98
- { showMinWidthControl && (
149
+ </ToolsPanelItem>
150
+ ) }
151
+ { showMinWidthControl && (
152
+ <ToolsPanelItem
153
+ label={ __( 'Min. column width' ) }
154
+ hasValue={ hasMinimumColumnWidthValue }
155
+ onDeselect={ resetMinimumColumnWidth }
156
+ isShownByDefault
157
+ panelId={ clientId }
158
+ >
99
159
  <GridLayoutMinimumWidthControl
100
160
  layout={ layout }
101
161
  onChange={ onChange }
102
162
  />
103
- ) }
104
- </VStack>
163
+ </ToolsPanelItem>
164
+ ) }
105
165
  </>
106
166
  );
107
167
  },
@@ -110,18 +170,25 @@ export default {
110
170
  },
111
171
  getLayoutStyle: function getLayoutStyle( {
112
172
  selector,
113
- layout,
173
+ layout = {},
174
+ viewportOverrides,
114
175
  style,
115
176
  blockName,
116
177
  hasBlockGapSupport,
117
178
  globalBlockGapValue,
118
179
  layoutDefinitions = LAYOUT_DEFINITIONS,
119
180
  } ) {
181
+ const hasViewportOverrides = viewportOverrides !== undefined;
182
+ const effectiveLayout = hasViewportOverrides
183
+ ? { ...layout, ...viewportOverrides }
184
+ : layout;
185
+ const hasViewportOverride = ( key ) =>
186
+ Object.hasOwn( viewportOverrides || {}, key );
120
187
  const {
121
188
  minimumColumnWidth = null,
122
189
  columnCount = null,
123
190
  rowCount = null,
124
- } = layout;
191
+ } = effectiveLayout;
125
192
 
126
193
  // Check that the grid layout attributes are of the correct type, so that we don't accidentally
127
194
  // write code that stores a string attribute instead of a number.
@@ -159,11 +226,27 @@ export default {
159
226
  ! shouldSkipSerialization( blockName, 'spacing', 'blockGap' )
160
227
  ? getGapCSSValue( style?.spacing?.blockGap, fallbackGapValue )
161
228
  : undefined;
229
+ const hasBlockGapOverride =
230
+ ! hasViewportOverrides ||
231
+ Object.hasOwn( style?.spacing || {}, 'blockGap' );
162
232
 
163
233
  let output = '';
164
234
  const rules = [];
235
+ const shouldOutputGridColumns =
236
+ ! hasViewportOverrides ||
237
+ hasViewportOverride( 'minimumColumnWidth' ) ||
238
+ hasViewportOverride( 'columnCount' ) ||
239
+ ( hasBlockGapOverride && minimumColumnWidth && columnCount > 0 );
240
+ const shouldOutputGridRows =
241
+ ( ! hasViewportOverrides || hasViewportOverride( 'rowCount' ) ) &&
242
+ columnCount &&
243
+ rowCount;
165
244
 
166
- if ( minimumColumnWidth && columnCount > 0 ) {
245
+ if (
246
+ shouldOutputGridColumns &&
247
+ minimumColumnWidth &&
248
+ columnCount > 0
249
+ ) {
167
250
  let blockGapToUse = blockGapValue || fallbackGapValue;
168
251
  // Ensure 0 values have a unit so they work in calc().
169
252
  if ( blockGapToUse === '0' || blockGapToUse === 0 ) {
@@ -173,29 +256,36 @@ export default {
173
256
  columnCount - 1
174
257
  }) ) / ${ columnCount })`;
175
258
  rules.push(
176
- `grid-template-columns: repeat(auto-fill, minmax(${ maxValue }, 1fr))`,
177
- `container-type: inline-size`
259
+ `grid-template-columns: repeat(auto-fill, minmax(${ maxValue }, 1fr))`
178
260
  );
179
- if ( rowCount ) {
180
- rules.push(
181
- `grid-template-rows: repeat(${ rowCount }, minmax(1rem, auto))`
182
- );
183
- }
184
- } else if ( columnCount ) {
261
+ } else if ( shouldOutputGridColumns && columnCount ) {
185
262
  rules.push(
186
263
  `grid-template-columns: repeat(${ columnCount }, minmax(0, 1fr))`
187
264
  );
188
- if ( rowCount ) {
189
- rules.push(
190
- `grid-template-rows: repeat(${ rowCount }, minmax(1rem, auto))`
191
- );
192
- }
193
- } else {
265
+ } else if ( shouldOutputGridColumns ) {
194
266
  rules.push(
195
267
  `grid-template-columns: repeat(auto-fill, minmax(min(${
196
268
  minimumColumnWidth || '12rem'
197
- }, 100%), 1fr))`,
198
- 'container-type: inline-size'
269
+ }, 100%), 1fr))`
270
+ );
271
+ }
272
+
273
+ if ( shouldOutputGridColumns ) {
274
+ const baseHasContainerType =
275
+ ! layout?.columnCount ||
276
+ ( layout?.columnCount && layout?.minimumColumnWidth );
277
+ const needsContainerType = ! columnCount || minimumColumnWidth;
278
+ if (
279
+ needsContainerType &&
280
+ ( ! hasViewportOverrides || ! baseHasContainerType )
281
+ ) {
282
+ rules.push( 'container-type: inline-size' );
283
+ }
284
+ }
285
+
286
+ if ( shouldOutputGridRows ) {
287
+ rules.push(
288
+ `grid-template-rows: repeat(${ rowCount }, minmax(1rem, auto))`
199
289
  );
200
290
  }
201
291
 
@@ -206,7 +296,7 @@ export default {
206
296
  }
207
297
 
208
298
  // Output blockGap styles based on rules contained in layout definitions in theme.json.
209
- if ( hasBlockGapSupport && blockGapValue ) {
299
+ if ( hasBlockGapSupport && hasBlockGapOverride && blockGapValue ) {
210
300
  output += getBlockGapCSS(
211
301
  selector,
212
302
  layoutDefinitions,
@@ -2,6 +2,12 @@
2
2
  * External dependencies
3
3
  */
4
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';
5
11
 
6
12
  /**
7
13
  * Internal dependencies
@@ -9,6 +15,20 @@ import { render, screen } from '@testing-library/react';
9
15
  import flex from '../flex';
10
16
 
11
17
  const FlexLayoutInspectorControls = flex.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
+ <FlexLayoutInspectorControls
24
+ clientId={ PANEL_ID }
25
+ layout={ {} }
26
+ onChange={ jest.fn() }
27
+ { ...props }
28
+ />
29
+ </ToolsPanel>
30
+ );
31
+ }
12
32
 
13
33
  describe( 'getLayoutStyle', () => {
14
34
  it( 'should return an empty string if no non-default params are provided', () => {
@@ -28,10 +48,20 @@ describe( 'getLayoutStyle', () => {
28
48
  } );
29
49
 
30
50
  describe( 'FlexLayoutInspectorControls', () => {
31
- it( 'should render the wrap toggle by default', () => {
32
- render(
33
- <FlexLayoutInspectorControls layout={ {} } onChange={ jest.fn() } />
34
- );
51
+ it( 'should not render the wrap toggle by default', () => {
52
+ renderInspectorControls();
53
+
54
+ expect(
55
+ screen.queryByRole( 'checkbox', {
56
+ name: 'Allow to wrap to multiple lines',
57
+ } )
58
+ ).not.toBeInTheDocument();
59
+ } );
60
+
61
+ it( 'should render the wrap toggle when it has a value', () => {
62
+ renderInspectorControls( {
63
+ layout: { flexWrap: 'nowrap' },
64
+ } );
35
65
 
36
66
  expect(
37
67
  screen.getByRole( 'checkbox', {
@@ -40,13 +70,19 @@ describe( 'FlexLayoutInspectorControls', () => {
40
70
  ).toBeInTheDocument();
41
71
  } );
42
72
 
43
- it( 'should render the wrap toggle when allowWrap is true', () => {
44
- render(
45
- <FlexLayoutInspectorControls
46
- layout={ {} }
47
- onChange={ jest.fn() }
48
- layoutBlockSupport={ { allowWrap: true } }
49
- />
73
+ it( 'should allow the wrap toggle to be selected from the tools panel menu', async () => {
74
+ const user = userEvent.setup();
75
+ renderInspectorControls( {
76
+ layoutBlockSupport: { allowWrap: true },
77
+ } );
78
+
79
+ await user.click(
80
+ screen.getByRole( 'button', { name: /Layout options/i } )
81
+ );
82
+ await user.click(
83
+ screen.getByRole( 'menuitemcheckbox', {
84
+ name: 'Show Wrapping',
85
+ } )
50
86
  );
51
87
 
52
88
  expect(
@@ -56,18 +92,19 @@ describe( 'FlexLayoutInspectorControls', () => {
56
92
  ).toBeInTheDocument();
57
93
  } );
58
94
 
59
- it( 'should not render the wrap toggle when allowWrap is false', () => {
60
- render(
61
- <FlexLayoutInspectorControls
62
- layout={ {} }
63
- onChange={ jest.fn() }
64
- layoutBlockSupport={ { allowWrap: false } }
65
- />
95
+ it( 'should not include the wrap toggle in the tools panel menu when allowWrap is false', async () => {
96
+ const user = userEvent.setup();
97
+ renderInspectorControls( {
98
+ layoutBlockSupport: { allowWrap: false },
99
+ } );
100
+
101
+ await user.click(
102
+ screen.getByRole( 'button', { name: /Layout options/i } )
66
103
  );
67
104
 
68
105
  expect(
69
- screen.queryByRole( 'checkbox', {
70
- name: 'Allow to wrap to multiple lines',
106
+ screen.queryByRole( 'menuitemcheckbox', {
107
+ name: 'Show Wrapping',
71
108
  } )
72
109
  ).not.toBeInTheDocument();
73
110
  } );
@@ -40,12 +40,14 @@ import { useFlashEditableBlocks } from './components/use-flash-editable-blocks';
40
40
  import {
41
41
  selectBlockPatternsKey,
42
42
  reusableBlocksSelectKey,
43
+ userPatternCategoriesSelectKey,
43
44
  globalStylesDataKey,
44
45
  globalStylesLinksDataKey,
45
46
  sectionRootClientIdKey,
46
47
  mediaEditKey,
47
48
  getMediaSelectKey,
48
49
  deviceTypeKey,
50
+ onViewportStateChangeKey,
49
51
  isIsolatedEditorKey,
50
52
  isNavigationOverlayContextKey,
51
53
  isNavigationPostEditorKey,
@@ -118,6 +120,7 @@ lock( privateApis, {
118
120
  PrivateRichText,
119
121
  PrivateInserterLibrary,
120
122
  reusableBlocksSelectKey,
123
+ userPatternCategoriesSelectKey,
121
124
  PrivateBlockPopover,
122
125
  PrivatePublishDateTimePicker,
123
126
  useSpacingSizes,
@@ -130,6 +133,7 @@ lock( privateApis, {
130
133
  mediaEditKey,
131
134
  getMediaSelectKey,
132
135
  deviceTypeKey,
136
+ onViewportStateChangeKey,
133
137
  isIsolatedEditorKey,
134
138
  isNavigationOverlayContextKey,
135
139
  isNavigationPostEditorKey,
@@ -529,3 +529,35 @@ export function clearRequestedInspectorTab() {
529
529
  type: 'CLEAR_REQUESTED_INSPECTOR_TAB',
530
530
  };
531
531
  }
532
+
533
+ /**
534
+ * Sets the selected style state for a block's style controls.
535
+ *
536
+ * @param {string} clientId The block client ID.
537
+ * @param {Object} value The selected state value.
538
+ *
539
+ * @return {Object} Action object.
540
+ */
541
+ export function setSelectedBlockStyleState( clientId, value ) {
542
+ return {
543
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE',
544
+ clientId,
545
+ value,
546
+ };
547
+ }
548
+
549
+ /**
550
+ * Sets whether the selected style state is shown on the canvas.
551
+ *
552
+ * @param {string} clientId The block client ID.
553
+ * @param {boolean} value Whether to show the selected state on the canvas.
554
+ *
555
+ * @return {Object} Action object.
556
+ */
557
+ export function setSelectedBlockStyleStateCanvasPreview( clientId, value ) {
558
+ return {
559
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE_CANVAS_PREVIEW',
560
+ clientId,
561
+ value,
562
+ };
563
+ }
@@ -2,11 +2,15 @@ export const globalStylesDataKey = Symbol( 'globalStylesDataKey' );
2
2
  export const globalStylesLinksDataKey = Symbol( 'globalStylesLinks' );
3
3
  export const selectBlockPatternsKey = Symbol( 'selectBlockPatternsKey' );
4
4
  export const reusableBlocksSelectKey = Symbol( 'reusableBlocksSelect' );
5
+ export const userPatternCategoriesSelectKey = Symbol(
6
+ 'userPatternCategoriesSelect'
7
+ );
5
8
  export const sectionRootClientIdKey = Symbol( 'sectionRootClientIdKey' );
6
9
  export const mediaEditKey = Symbol( 'mediaEditKey' );
7
10
  export const getMediaSelectKey = Symbol( 'getMediaSelect' );
8
11
  export const isIsolatedEditorKey = Symbol( 'isIsolatedEditor' );
9
12
  export const deviceTypeKey = Symbol( 'deviceTypeKey' );
13
+ export const onViewportStateChangeKey = Symbol( 'onViewportStateChangeKey' );
10
14
  export const isNavigationOverlayContextKey = Symbol(
11
15
  'isNavigationOverlayContext'
12
16
  );
@@ -34,6 +34,7 @@ import { unlock } from '../lock-unlock';
34
34
  import {
35
35
  selectBlockPatternsKey,
36
36
  reusableBlocksSelectKey,
37
+ userPatternCategoriesSelectKey,
37
38
  sectionRootClientIdKey,
38
39
  isIsolatedEditorKey,
39
40
  } from './private-keys';
@@ -361,7 +362,9 @@ export const getPatternBySlug = createRegistrySelector( ( select ) =>
361
362
 
362
363
  return mapUserPattern(
363
364
  block,
364
- state.settings.__experimentalUserPatternCategories
365
+ state.settings[ userPatternCategoriesSelectKey ]?.(
366
+ select
367
+ ) ?? state.settings.__experimentalUserPatternCategories
365
368
  );
366
369
  }
367
370
 
@@ -393,7 +396,9 @@ export const getAllPatterns = createRegistrySelector( ( select ) =>
393
396
  .map( ( userPattern ) =>
394
397
  mapUserPattern(
395
398
  userPattern,
396
- state.settings.__experimentalUserPatternCategories
399
+ state.settings[ userPatternCategoriesSelectKey ]?.(
400
+ select
401
+ ) ?? state.settings.__experimentalUserPatternCategories
397
402
  )
398
403
  ),
399
404
  // This setting is left for back compat.
@@ -1052,3 +1057,40 @@ export function getViewportModalClientIds( state ) {
1052
1057
  export function getRequestedInspectorTab( state ) {
1053
1058
  return state.requestedInspectorTab;
1054
1059
  }
1060
+
1061
+ const DEFAULT_BLOCK_STYLE_STATE = {
1062
+ viewport: 'default',
1063
+ pseudo: 'default',
1064
+ };
1065
+
1066
+ /**
1067
+ * Returns the selected style state for a block's style controls.
1068
+ *
1069
+ * @param {Object} state Global application state.
1070
+ * @param {string} clientId The block client ID.
1071
+ *
1072
+ * @return {Object} The selected block style state.
1073
+ */
1074
+ export function getSelectedBlockStyleState( state, clientId ) {
1075
+ if ( state.selectedBlockStyleState?.clientId !== clientId ) {
1076
+ return DEFAULT_BLOCK_STYLE_STATE;
1077
+ }
1078
+
1079
+ return state.selectedBlockStyleState.value ?? DEFAULT_BLOCK_STYLE_STATE;
1080
+ }
1081
+
1082
+ /**
1083
+ * Returns whether the selected style state is shown on the canvas.
1084
+ *
1085
+ * @param {Object} state Global application state.
1086
+ * @param {string} clientId The block client ID.
1087
+ *
1088
+ * @return {boolean} Whether the selected style state is shown on the canvas.
1089
+ */
1090
+ export function isSelectedBlockStyleStateShownOnCanvas( state, clientId ) {
1091
+ if ( state.selectedBlockStyleState?.clientId !== clientId ) {
1092
+ return true;
1093
+ }
1094
+
1095
+ return state.selectedBlockStyleState.showStateOnCanvas ?? true;
1096
+ }
@@ -2259,7 +2259,7 @@ export function listViewContentPanelOpen( state = false, action ) {
2259
2259
  * @param {Object|null} state Current state.
2260
2260
  * @param {Object} action Dispatched action.
2261
2261
  *
2262
- * @return {Object|null} Updated state.
2262
+ * @return {Object|undefined} Updated state.
2263
2263
  */
2264
2264
  export function requestedInspectorTab( state = null, action ) {
2265
2265
  switch ( action.type ) {
@@ -2275,6 +2275,109 @@ export function requestedInspectorTab( state = null, action ) {
2275
2275
  return state;
2276
2276
  }
2277
2277
 
2278
+ /**
2279
+ * Reducer tracking the selected style state for block style controls.
2280
+ *
2281
+ * @param {Object} state Current state.
2282
+ * @param {Object} action Dispatched action.
2283
+ *
2284
+ * @return {Object|null} Updated state.
2285
+ */
2286
+ export function selectedBlockStyleState( state = undefined, action ) {
2287
+ switch ( action.type ) {
2288
+ case 'SET_SELECTED_BLOCK_STYLE_STATE': {
2289
+ if ( ! action.clientId || ! action.value ) {
2290
+ return undefined;
2291
+ }
2292
+ const showStateOnCanvas =
2293
+ state?.clientId === action.clientId
2294
+ ? state.showStateOnCanvas ?? true
2295
+ : true;
2296
+ const previousValue =
2297
+ state?.clientId === action.clientId ? state.value : {};
2298
+
2299
+ return {
2300
+ clientId: action.clientId,
2301
+ showStateOnCanvas,
2302
+ value: {
2303
+ viewport: 'default',
2304
+ pseudo: 'default',
2305
+ ...previousValue,
2306
+ ...action.value,
2307
+ },
2308
+ };
2309
+ }
2310
+
2311
+ case 'SET_SELECTED_BLOCK_STYLE_STATE_CANVAS_PREVIEW': {
2312
+ if ( ! action.clientId || typeof action.value !== 'boolean' ) {
2313
+ return state;
2314
+ }
2315
+
2316
+ const previousValue =
2317
+ state?.clientId === action.clientId ? state.value : {};
2318
+
2319
+ return {
2320
+ clientId: action.clientId,
2321
+ showStateOnCanvas: action.value,
2322
+ value: {
2323
+ viewport: 'default',
2324
+ pseudo: 'default',
2325
+ ...previousValue,
2326
+ },
2327
+ };
2328
+ }
2329
+
2330
+ case 'SELECT_BLOCK':
2331
+ case 'SELECTION_CHANGE': {
2332
+ if ( state?.clientId && state.clientId !== action.clientId ) {
2333
+ return undefined;
2334
+ }
2335
+
2336
+ break;
2337
+ }
2338
+
2339
+ case 'RESET_SELECTION': {
2340
+ if (
2341
+ state?.clientId &&
2342
+ state.clientId !== action.selectionStart?.clientId
2343
+ ) {
2344
+ return undefined;
2345
+ }
2346
+
2347
+ break;
2348
+ }
2349
+
2350
+ case 'CLEAR_SELECTED_BLOCK':
2351
+ case 'MULTI_SELECT':
2352
+ return undefined;
2353
+
2354
+ case 'REMOVE_BLOCKS':
2355
+ case 'REPLACE_BLOCKS': {
2356
+ if (
2357
+ state?.clientId &&
2358
+ action.clientIds?.includes( state.clientId )
2359
+ ) {
2360
+ return undefined;
2361
+ }
2362
+
2363
+ break;
2364
+ }
2365
+
2366
+ case 'RESET_BLOCKS': {
2367
+ if (
2368
+ state?.clientId &&
2369
+ ! getFlattenedClientIds( action.blocks )[ state.clientId ]
2370
+ ) {
2371
+ return undefined;
2372
+ }
2373
+
2374
+ break;
2375
+ }
2376
+ }
2377
+
2378
+ return state;
2379
+ }
2380
+
2278
2381
  const combinedReducers = combineReducers( {
2279
2382
  blocks,
2280
2383
  isDragging,
@@ -2310,6 +2413,7 @@ const combinedReducers = combineReducers( {
2310
2413
  listViewExpandRevision,
2311
2414
  listViewContentPanelOpen,
2312
2415
  requestedInspectorTab,
2416
+ selectedBlockStyleState,
2313
2417
  } );
2314
2418
 
2315
2419
  /**
@@ -11,6 +11,8 @@ import {
11
11
  stopDragging,
12
12
  showViewportModal,
13
13
  hideViewportModal,
14
+ setSelectedBlockStyleState,
15
+ setSelectedBlockStyleStateCanvasPreview,
14
16
  } from '../private-actions';
15
17
 
16
18
  describe( 'private actions', () => {
@@ -141,4 +143,28 @@ describe( 'private actions', () => {
141
143
  } );
142
144
  } );
143
145
  } );
146
+
147
+ describe( 'setSelectedBlockStyleState', () => {
148
+ it( 'returns the SET_SELECTED_BLOCK_STYLE_STATE action', () => {
149
+ expect(
150
+ setSelectedBlockStyleState( 'client-1', { pseudo: ':hover' } )
151
+ ).toEqual( {
152
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE',
153
+ clientId: 'client-1',
154
+ value: { pseudo: ':hover' },
155
+ } );
156
+ } );
157
+ } );
158
+
159
+ describe( 'setSelectedBlockStyleStateCanvasPreview', () => {
160
+ it( 'returns the SET_SELECTED_BLOCK_STYLE_STATE_CANVAS_PREVIEW action', () => {
161
+ expect(
162
+ setSelectedBlockStyleStateCanvasPreview( 'client-1', false )
163
+ ).toEqual( {
164
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE_CANVAS_PREVIEW',
165
+ clientId: 'client-1',
166
+ value: false,
167
+ } );
168
+ } );
169
+ } );
144
170
  } );