@wordpress/block-editor 15.19.1-next.v.202605131032.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
@@ -24,6 +24,8 @@ import {
24
24
  getViewportModalClientIds,
25
25
  isSectionBlock,
26
26
  getParentSectionBlock,
27
+ getSelectedBlockStyleState,
28
+ isSelectedBlockStyleStateShownOnCanvas,
27
29
  } from '../private-selectors';
28
30
  import { getBlockEditingMode } from '../selectors';
29
31
  import { deviceTypeKey } from '../private-keys';
@@ -72,6 +74,94 @@ describe( 'private selectors', () => {
72
74
  } );
73
75
  } );
74
76
 
77
+ describe( 'getSelectedBlockStyleState', () => {
78
+ it( 'returns default when the block has no selected state', () => {
79
+ const state = {};
80
+
81
+ expect( getSelectedBlockStyleState( state, 'client-1' ) ).toEqual( {
82
+ viewport: 'default',
83
+ pseudo: 'default',
84
+ } );
85
+ } );
86
+
87
+ it( 'returns the selected state for the block', () => {
88
+ const state = {
89
+ selectedBlockStyleState: {
90
+ clientId: 'client-1',
91
+ value: { viewport: 'mobile', pseudo: ':hover' },
92
+ },
93
+ };
94
+
95
+ expect( getSelectedBlockStyleState( state, 'client-1' ) ).toEqual( {
96
+ viewport: 'mobile',
97
+ pseudo: ':hover',
98
+ } );
99
+ } );
100
+
101
+ it( 'returns default when the selected state has no value', () => {
102
+ const state = {
103
+ selectedBlockStyleState: {
104
+ clientId: 'client-1',
105
+ },
106
+ };
107
+
108
+ expect( getSelectedBlockStyleState( state, 'client-1' ) ).toEqual( {
109
+ viewport: 'default',
110
+ pseudo: 'default',
111
+ } );
112
+ } );
113
+
114
+ it( 'returns default when another block has the selected state', () => {
115
+ const state = {
116
+ selectedBlockStyleState: {
117
+ clientId: 'client-2',
118
+ value: { viewport: 'default', pseudo: ':hover' },
119
+ },
120
+ };
121
+
122
+ expect( getSelectedBlockStyleState( state, 'client-1' ) ).toEqual( {
123
+ viewport: 'default',
124
+ pseudo: 'default',
125
+ } );
126
+ } );
127
+ } );
128
+
129
+ describe( 'isSelectedBlockStyleStateShownOnCanvas', () => {
130
+ it( 'returns true when the block has no canvas preview state', () => {
131
+ const state = {};
132
+
133
+ expect(
134
+ isSelectedBlockStyleStateShownOnCanvas( state, 'client-1' )
135
+ ).toBe( true );
136
+ } );
137
+
138
+ it( 'returns the canvas preview state for the block', () => {
139
+ const state = {
140
+ selectedBlockStyleState: {
141
+ clientId: 'client-1',
142
+ showStateOnCanvas: false,
143
+ },
144
+ };
145
+
146
+ expect(
147
+ isSelectedBlockStyleStateShownOnCanvas( state, 'client-1' )
148
+ ).toBe( false );
149
+ } );
150
+
151
+ it( 'returns true when another block has canvas preview state', () => {
152
+ const state = {
153
+ selectedBlockStyleState: {
154
+ clientId: 'client-2',
155
+ showStateOnCanvas: false,
156
+ },
157
+ };
158
+
159
+ expect(
160
+ isSelectedBlockStyleStateShownOnCanvas( state, 'client-1' )
161
+ ).toBe( true );
162
+ } );
163
+ } );
164
+
75
165
  describe( 'isBlockSubtreeDisabled', () => {
76
166
  const baseState = {
77
167
  settings: {},
@@ -42,6 +42,7 @@ import {
42
42
  editedContentOnlySection,
43
43
  withDerivedBlockEditingModes,
44
44
  viewportModalClientIds,
45
+ selectedBlockStyleState,
45
46
  } from '../reducer';
46
47
  import { getBlockOrder, getBlocks } from '../selectors';
47
48
  import { unlock } from '../../lock-unlock';
@@ -5815,6 +5816,368 @@ describe( 'state', () => {
5815
5816
  } );
5816
5817
  } );
5817
5818
 
5819
+ describe( 'selectedBlockStyleState', () => {
5820
+ it( 'defaults to undefined', () => {
5821
+ const state = selectedBlockStyleState( undefined, {} );
5822
+
5823
+ expect( state ).toBeUndefined();
5824
+ } );
5825
+
5826
+ it( 'stores a selected viewport state for a block', () => {
5827
+ const state = selectedBlockStyleState( undefined, {
5828
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE',
5829
+ clientId: 'client-1',
5830
+ value: { viewport: 'mobile' },
5831
+ } );
5832
+
5833
+ expect( state ).toEqual( {
5834
+ clientId: 'client-1',
5835
+ showStateOnCanvas: true,
5836
+ value: {
5837
+ viewport: 'mobile',
5838
+ pseudo: 'default',
5839
+ },
5840
+ } );
5841
+ } );
5842
+
5843
+ it( 'stores a selected pseudo state for a block', () => {
5844
+ const state = selectedBlockStyleState( undefined, {
5845
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE',
5846
+ clientId: 'client-1',
5847
+ value: { pseudo: ':hover' },
5848
+ } );
5849
+
5850
+ expect( state ).toEqual( {
5851
+ clientId: 'client-1',
5852
+ showStateOnCanvas: true,
5853
+ value: {
5854
+ viewport: 'default',
5855
+ pseudo: ':hover',
5856
+ },
5857
+ } );
5858
+ } );
5859
+
5860
+ it( 'updates only the selected state type for the same block', () => {
5861
+ const state = selectedBlockStyleState(
5862
+ {
5863
+ clientId: 'client-1',
5864
+ value: { viewport: 'mobile', pseudo: 'default' },
5865
+ },
5866
+ {
5867
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE',
5868
+ clientId: 'client-1',
5869
+ value: { pseudo: ':hover' },
5870
+ }
5871
+ );
5872
+
5873
+ expect( state ).toEqual( {
5874
+ clientId: 'client-1',
5875
+ showStateOnCanvas: true,
5876
+ value: {
5877
+ viewport: 'mobile',
5878
+ pseudo: ':hover',
5879
+ },
5880
+ } );
5881
+ } );
5882
+
5883
+ it( 'replaces the selected state when another block is selected', () => {
5884
+ const state = selectedBlockStyleState(
5885
+ {
5886
+ clientId: 'client-1',
5887
+ value: { viewport: 'mobile', pseudo: ':hover' },
5888
+ },
5889
+ {
5890
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE',
5891
+ clientId: 'client-2',
5892
+ value: { pseudo: ':focus' },
5893
+ }
5894
+ );
5895
+
5896
+ expect( state ).toEqual( {
5897
+ clientId: 'client-2',
5898
+ showStateOnCanvas: true,
5899
+ value: {
5900
+ viewport: 'default',
5901
+ pseudo: ':focus',
5902
+ },
5903
+ } );
5904
+ } );
5905
+
5906
+ it( 'stores explicit defaults when both state types are default', () => {
5907
+ const state = selectedBlockStyleState(
5908
+ {
5909
+ clientId: 'client-1',
5910
+ value: { viewport: 'mobile', pseudo: ':hover' },
5911
+ },
5912
+ {
5913
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE',
5914
+ clientId: 'client-1',
5915
+ value: { viewport: 'default', pseudo: 'default' },
5916
+ }
5917
+ );
5918
+
5919
+ expect( state ).toEqual( {
5920
+ clientId: 'client-1',
5921
+ showStateOnCanvas: true,
5922
+ value: {
5923
+ viewport: 'default',
5924
+ pseudo: 'default',
5925
+ },
5926
+ } );
5927
+ } );
5928
+
5929
+ it( 'clears the selected state when clientId is missing', () => {
5930
+ const state = selectedBlockStyleState(
5931
+ {
5932
+ clientId: 'client-1',
5933
+ value: { viewport: 'default', pseudo: ':hover' },
5934
+ },
5935
+ {
5936
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE',
5937
+ value: { pseudo: ':focus' },
5938
+ }
5939
+ );
5940
+
5941
+ expect( state ).toBeUndefined();
5942
+ } );
5943
+
5944
+ it( 'clears the selected state when value is missing', () => {
5945
+ const state = selectedBlockStyleState(
5946
+ {
5947
+ clientId: 'client-1',
5948
+ value: { viewport: 'default', pseudo: ':hover' },
5949
+ },
5950
+ {
5951
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE',
5952
+ clientId: 'client-1',
5953
+ }
5954
+ );
5955
+
5956
+ expect( state ).toBeUndefined();
5957
+ } );
5958
+
5959
+ it( 'keeps the selected state when the same block is selected', () => {
5960
+ const originalState = {
5961
+ clientId: 'client-1',
5962
+ value: { viewport: 'default', pseudo: ':hover' },
5963
+ };
5964
+ const state = selectedBlockStyleState( originalState, {
5965
+ type: 'SELECT_BLOCK',
5966
+ clientId: 'client-1',
5967
+ } );
5968
+
5969
+ expect( state ).toBe( originalState );
5970
+ } );
5971
+
5972
+ it( 'clears the selected state when another block is selected', () => {
5973
+ const state = selectedBlockStyleState(
5974
+ {
5975
+ clientId: 'client-1',
5976
+ value: { viewport: 'default', pseudo: ':hover' },
5977
+ },
5978
+ {
5979
+ type: 'SELECT_BLOCK',
5980
+ clientId: 'client-2',
5981
+ }
5982
+ );
5983
+
5984
+ expect( state ).toBeUndefined();
5985
+ } );
5986
+
5987
+ it( 'keeps the selected state for selection changes in the same block', () => {
5988
+ const originalState = {
5989
+ clientId: 'client-1',
5990
+ value: { viewport: 'default', pseudo: ':hover' },
5991
+ };
5992
+ const state = selectedBlockStyleState( originalState, {
5993
+ type: 'SELECTION_CHANGE',
5994
+ clientId: 'client-1',
5995
+ } );
5996
+
5997
+ expect( state ).toBe( originalState );
5998
+ } );
5999
+
6000
+ it( 'clears the selected state for selection changes in another block', () => {
6001
+ const state = selectedBlockStyleState(
6002
+ {
6003
+ clientId: 'client-1',
6004
+ value: { viewport: 'default', pseudo: ':hover' },
6005
+ },
6006
+ {
6007
+ type: 'SELECTION_CHANGE',
6008
+ clientId: 'client-2',
6009
+ }
6010
+ );
6011
+
6012
+ expect( state ).toBeUndefined();
6013
+ } );
6014
+
6015
+ it( 'keeps the selected state when selection resets to the same block', () => {
6016
+ const originalState = {
6017
+ clientId: 'client-1',
6018
+ value: { viewport: 'default', pseudo: ':hover' },
6019
+ };
6020
+ const state = selectedBlockStyleState( originalState, {
6021
+ type: 'RESET_SELECTION',
6022
+ selectionStart: { clientId: 'client-1' },
6023
+ } );
6024
+
6025
+ expect( state ).toBe( originalState );
6026
+ } );
6027
+
6028
+ it( 'clears the selected state when selection resets to another block', () => {
6029
+ const state = selectedBlockStyleState(
6030
+ {
6031
+ clientId: 'client-1',
6032
+ value: { viewport: 'default', pseudo: ':hover' },
6033
+ },
6034
+ {
6035
+ type: 'RESET_SELECTION',
6036
+ selectionStart: { clientId: 'client-2' },
6037
+ }
6038
+ );
6039
+
6040
+ expect( state ).toBeUndefined();
6041
+ } );
6042
+
6043
+ it( 'clears the selected state when the selection is cleared', () => {
6044
+ const state = selectedBlockStyleState(
6045
+ {
6046
+ clientId: 'client-1',
6047
+ value: { viewport: 'default', pseudo: ':hover' },
6048
+ },
6049
+ {
6050
+ type: 'CLEAR_SELECTED_BLOCK',
6051
+ }
6052
+ );
6053
+
6054
+ expect( state ).toBeUndefined();
6055
+ } );
6056
+
6057
+ it( 'clears the selected state when multiple blocks are selected', () => {
6058
+ const state = selectedBlockStyleState(
6059
+ {
6060
+ clientId: 'client-1',
6061
+ value: { viewport: 'default', pseudo: ':hover' },
6062
+ },
6063
+ {
6064
+ type: 'MULTI_SELECT',
6065
+ }
6066
+ );
6067
+
6068
+ expect( state ).toBeUndefined();
6069
+ } );
6070
+
6071
+ it( 'clears the selected state when the block is removed', () => {
6072
+ const state = selectedBlockStyleState(
6073
+ {
6074
+ clientId: 'client-1',
6075
+ value: { viewport: 'default', pseudo: ':hover' },
6076
+ },
6077
+ {
6078
+ type: 'REMOVE_BLOCKS',
6079
+ clientIds: [ 'client-1' ],
6080
+ }
6081
+ );
6082
+
6083
+ expect( state ).toBeUndefined();
6084
+ } );
6085
+
6086
+ it( 'clears the selected state when the block is replaced', () => {
6087
+ const state = selectedBlockStyleState(
6088
+ {
6089
+ clientId: 'client-2',
6090
+ value: { viewport: 'default', pseudo: ':focus' },
6091
+ },
6092
+ {
6093
+ type: 'REPLACE_BLOCKS',
6094
+ clientIds: [ 'client-2' ],
6095
+ }
6096
+ );
6097
+
6098
+ expect( state ).toBeUndefined();
6099
+ } );
6100
+
6101
+ it( 'clears the selected state when the block is missing after reset', () => {
6102
+ const state = selectedBlockStyleState(
6103
+ {
6104
+ clientId: 'client-1',
6105
+ value: { viewport: 'default', pseudo: ':hover' },
6106
+ },
6107
+ {
6108
+ type: 'RESET_BLOCKS',
6109
+ blocks: [
6110
+ {
6111
+ clientId: 'client-2',
6112
+ innerBlocks: [],
6113
+ },
6114
+ ],
6115
+ }
6116
+ );
6117
+
6118
+ expect( state ).toBeUndefined();
6119
+ } );
6120
+
6121
+ it( 'keeps the selected state when the block exists after reset', () => {
6122
+ const originalState = {
6123
+ clientId: 'client-2',
6124
+ value: { viewport: 'default', pseudo: ':focus' },
6125
+ };
6126
+ const state = selectedBlockStyleState( originalState, {
6127
+ type: 'RESET_BLOCKS',
6128
+ blocks: [
6129
+ {
6130
+ clientId: 'client-2',
6131
+ innerBlocks: [],
6132
+ },
6133
+ ],
6134
+ } );
6135
+
6136
+ expect( state ).toBe( originalState );
6137
+ } );
6138
+
6139
+ it( 'stores whether canvas preview is enabled for the selected state', () => {
6140
+ const state = selectedBlockStyleState(
6141
+ {
6142
+ clientId: 'client-1',
6143
+ value: { viewport: 'mobile', pseudo: ':hover' },
6144
+ },
6145
+ {
6146
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE_CANVAS_PREVIEW',
6147
+ clientId: 'client-1',
6148
+ value: false,
6149
+ }
6150
+ );
6151
+
6152
+ expect( state ).toEqual( {
6153
+ clientId: 'client-1',
6154
+ showStateOnCanvas: false,
6155
+ value: { viewport: 'mobile', pseudo: ':hover' },
6156
+ } );
6157
+ } );
6158
+
6159
+ it( 'keeps canvas preview when updating the selected state for the same block', () => {
6160
+ const state = selectedBlockStyleState(
6161
+ {
6162
+ clientId: 'client-1',
6163
+ showStateOnCanvas: false,
6164
+ value: { viewport: 'mobile', pseudo: 'default' },
6165
+ },
6166
+ {
6167
+ type: 'SET_SELECTED_BLOCK_STYLE_STATE',
6168
+ clientId: 'client-1',
6169
+ value: { pseudo: ':hover' },
6170
+ }
6171
+ );
6172
+
6173
+ expect( state ).toEqual( {
6174
+ clientId: 'client-1',
6175
+ showStateOnCanvas: false,
6176
+ value: { viewport: 'mobile', pseudo: ':hover' },
6177
+ } );
6178
+ } );
6179
+ } );
6180
+
5818
6181
  describe( 'viewportModalClientIds', () => {
5819
6182
  it( 'should default to null', () => {
5820
6183
  const state = viewportModalClientIds( undefined, {} );
@@ -7,7 +7,10 @@ import { parse as grammarParse } from '@wordpress/block-serialization-default-pa
7
7
  /**
8
8
  * Internal dependencies
9
9
  */
10
- import { selectBlockPatternsKey } from './private-keys';
10
+ import {
11
+ selectBlockPatternsKey,
12
+ userPatternCategoriesSelectKey,
13
+ } from './private-keys';
11
14
  import { unlock } from '../lock-unlock';
12
15
  import { STORE_NAME } from './constants';
13
16
  import {
@@ -128,7 +131,8 @@ export const checkAllowListRecursive = ( blocks, allowedBlockTypes ) => {
128
131
  export const getAllPatternsDependants = ( select ) => ( state ) => {
129
132
  return [
130
133
  state.settings.__experimentalBlockPatterns,
131
- state.settings.__experimentalUserPatternCategories,
134
+ state.settings[ userPatternCategoriesSelectKey ]?.( select ) ??
135
+ state.settings.__experimentalUserPatternCategories,
132
136
  state.settings.__experimentalReusableBlocks,
133
137
  state.settings[ selectBlockPatternsKey ]?.( select ),
134
138
  state.blockPatterns,
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Extracts the palette slug from a style value for any preset type, supporting
3
+ * both the user preset format and the theme CSS-variable format:
4
+ *
5
+ * - User format: `var:preset|<type>|slug`
6
+ * - Theme format: `var(--wp--preset--<type>--slug)`
7
+ *
8
+ * Returns `undefined` for plain values, non-strings, or any other
9
+ * unrecognised format.
10
+ *
11
+ * @param {*} rawValue Raw style value stored in the style object.
12
+ * @param {'color'|'gradient'} type Preset type, e.g. `'color'` or `'gradient'`.
13
+ * @return {string|undefined} The palette slug, or undefined.
14
+ */
15
+ export function extractPresetSlug( rawValue, type ) {
16
+ if ( typeof rawValue !== 'string' ) {
17
+ return undefined;
18
+ }
19
+ const userPrefix = `var:preset|${ type }|`;
20
+ if ( rawValue.startsWith( userPrefix ) ) {
21
+ return rawValue.slice( userPrefix.length );
22
+ }
23
+ const cssVarPrefix = `--wp--preset--${ type }--`;
24
+ const themeFormatMatch = rawValue.match(
25
+ new RegExp( `^var\\(${ cssVarPrefix }([^)]+)\\)$` )
26
+ );
27
+ return themeFormatMatch?.[ 1 ];
28
+ }
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { extractPresetSlug } from '../color-values';
5
+
6
+ describe( 'extractPresetSlug', () => {
7
+ it( 'extracts the slug for a color from the user preset format', () => {
8
+ expect(
9
+ extractPresetSlug( 'var:preset|color|dark-text', 'color' )
10
+ ).toBe( 'dark-text' );
11
+ } );
12
+
13
+ it( 'extracts the slug for a color from the theme CSS-var format', () => {
14
+ expect(
15
+ extractPresetSlug(
16
+ 'var(--wp--preset--color--vivid-purple)',
17
+ 'color'
18
+ )
19
+ ).toBe( 'vivid-purple' );
20
+ } );
21
+
22
+ it( 'extracts the slug for a gradient from the user preset format', () => {
23
+ expect(
24
+ extractPresetSlug(
25
+ 'var:preset|gradient|blush-bordeaux',
26
+ 'gradient'
27
+ )
28
+ ).toBe( 'blush-bordeaux' );
29
+ } );
30
+
31
+ it( 'extracts the slug for a gradient from the theme CSS-var format', () => {
32
+ expect(
33
+ extractPresetSlug(
34
+ 'var(--wp--preset--gradient--blush-bordeaux)',
35
+ 'gradient'
36
+ )
37
+ ).toBe( 'blush-bordeaux' );
38
+ } );
39
+
40
+ it( 'handles slugs that contain hyphens for any type', () => {
41
+ expect(
42
+ extractPresetSlug(
43
+ 'var:preset|gradient|my-custom-gradient-100',
44
+ 'gradient'
45
+ )
46
+ ).toBe( 'my-custom-gradient-100' );
47
+ expect(
48
+ extractPresetSlug(
49
+ 'var(--wp--preset--gradient--my-custom-gradient-100)',
50
+ 'gradient'
51
+ )
52
+ ).toBe( 'my-custom-gradient-100' );
53
+ } );
54
+
55
+ it( 'returns undefined for a non-matching type', () => {
56
+ expect(
57
+ extractPresetSlug( 'var:preset|color|dark-text', 'gradient' )
58
+ ).toBeUndefined();
59
+ expect(
60
+ extractPresetSlug(
61
+ 'var(--wp--preset--color--vivid-purple)',
62
+ 'gradient'
63
+ )
64
+ ).toBeUndefined();
65
+ } );
66
+
67
+ it( 'returns undefined for non-string values', () => {
68
+ expect( extractPresetSlug( undefined, 'gradient' ) ).toBeUndefined();
69
+ expect( extractPresetSlug( null, 'gradient' ) ).toBeUndefined();
70
+ expect( extractPresetSlug( 42, 'gradient' ) ).toBeUndefined();
71
+ } );
72
+
73
+ it( 'returns undefined for a theme var missing its closing parenthesis', () => {
74
+ expect(
75
+ extractPresetSlug( 'var(--wp--preset--gradient--oops', 'gradient' )
76
+ ).toBeUndefined();
77
+ } );
78
+ } );