@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
@@ -0,0 +1,270 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import {
5
+ getStyleForState,
6
+ scopeResetAllFilterToState,
7
+ setStyleForState,
8
+ } from '../block-style-state';
9
+
10
+ describe( 'getStyleForState', () => {
11
+ it( 'returns the root style for the default state', () => {
12
+ const style = { color: { text: '#000000' } };
13
+
14
+ expect(
15
+ getStyleForState( style, {
16
+ viewport: 'default',
17
+ pseudo: 'default',
18
+ } )
19
+ ).toBe( style );
20
+ } );
21
+
22
+ it( 'returns the selected pseudo state style', () => {
23
+ const style = {
24
+ color: { text: '#000000' },
25
+ ':hover': { color: { text: '#ff0000' } },
26
+ };
27
+
28
+ expect(
29
+ getStyleForState( style, {
30
+ viewport: 'default',
31
+ pseudo: ':hover',
32
+ } )
33
+ ).toEqual( {
34
+ color: { text: '#ff0000' },
35
+ } );
36
+ } );
37
+
38
+ it( 'returns the selected viewport state style', () => {
39
+ const style = {
40
+ color: { text: '#000000' },
41
+ mobile: { color: { text: '#ff0000' } },
42
+ };
43
+
44
+ expect(
45
+ getStyleForState( style, {
46
+ viewport: 'mobile',
47
+ pseudo: 'default',
48
+ } )
49
+ ).toEqual( {
50
+ color: { text: '#ff0000' },
51
+ } );
52
+ } );
53
+
54
+ it( 'returns the selected viewport pseudo state style', () => {
55
+ const style = {
56
+ mobile: {
57
+ ':hover': { color: { text: '#ff0000' } },
58
+ },
59
+ };
60
+
61
+ expect(
62
+ getStyleForState( style, {
63
+ viewport: 'mobile',
64
+ pseudo: ':hover',
65
+ } )
66
+ ).toEqual( {
67
+ color: { text: '#ff0000' },
68
+ } );
69
+ } );
70
+ } );
71
+
72
+ describe( 'setStyleForState', () => {
73
+ it( 'replaces the root style for the default state', () => {
74
+ expect(
75
+ setStyleForState(
76
+ { color: { text: '#000000' } },
77
+ { viewport: 'default', pseudo: 'default' },
78
+ {
79
+ typography: { fontSize: '32px' },
80
+ }
81
+ )
82
+ ).toEqual( {
83
+ typography: { fontSize: '32px' },
84
+ } );
85
+ } );
86
+
87
+ it( 'updates only the selected pseudo state style', () => {
88
+ expect(
89
+ setStyleForState(
90
+ {
91
+ color: { text: '#000000' },
92
+ ':hover': { color: { text: '#ff0000' } },
93
+ },
94
+ { viewport: 'default', pseudo: ':hover' },
95
+ { typography: { fontSize: '32px' } }
96
+ )
97
+ ).toEqual( {
98
+ color: { text: '#000000' },
99
+ ':hover': { typography: { fontSize: '32px' } },
100
+ } );
101
+ } );
102
+
103
+ it( 'updates only the selected viewport state style', () => {
104
+ expect(
105
+ setStyleForState(
106
+ {
107
+ color: { text: '#000000' },
108
+ mobile: { color: { text: '#ff0000' } },
109
+ },
110
+ { viewport: 'mobile', pseudo: 'default' },
111
+ { typography: { fontSize: '32px' } }
112
+ )
113
+ ).toEqual( {
114
+ color: { text: '#000000' },
115
+ mobile: { typography: { fontSize: '32px' } },
116
+ } );
117
+ } );
118
+
119
+ it( 'updates only the selected viewport pseudo state style', () => {
120
+ expect(
121
+ setStyleForState(
122
+ {
123
+ color: { text: '#000000' },
124
+ mobile: {
125
+ color: { text: '#ff0000' },
126
+ ':hover': { color: { text: '#00ff00' } },
127
+ },
128
+ },
129
+ { viewport: 'mobile', pseudo: ':hover' },
130
+ { typography: { fontSize: '32px' } }
131
+ )
132
+ ).toEqual( {
133
+ color: { text: '#000000' },
134
+ mobile: {
135
+ color: { text: '#ff0000' },
136
+ ':hover': { typography: { fontSize: '32px' } },
137
+ },
138
+ } );
139
+ } );
140
+
141
+ it( 'removes the selected state key when the new state style is empty', () => {
142
+ expect(
143
+ setStyleForState(
144
+ {
145
+ color: { text: '#000000' },
146
+ ':hover': { color: { text: '#ff0000' } },
147
+ },
148
+ { viewport: 'default', pseudo: ':hover' },
149
+ { color: { text: undefined } }
150
+ )
151
+ ).toEqual( {
152
+ color: { text: '#000000' },
153
+ } );
154
+ } );
155
+ } );
156
+
157
+ describe( 'scopeResetAllFilterToState', () => {
158
+ it( 'passes only the selected state style to the reset filter', () => {
159
+ const innerReset = jest.fn( ( attributes ) => ( {
160
+ ...attributes,
161
+ style: {
162
+ ...attributes.style,
163
+ color: undefined,
164
+ },
165
+ textColor: undefined,
166
+ } ) );
167
+ const attributes = {
168
+ style: {
169
+ color: { text: '#000000' },
170
+ ':hover': {
171
+ color: { text: '#ff0000' },
172
+ typography: { fontSize: '32px' },
173
+ },
174
+ ':focus': { color: { text: '#0000ff' } },
175
+ },
176
+ };
177
+
178
+ const result = scopeResetAllFilterToState(
179
+ { viewport: 'default', pseudo: ':hover' },
180
+ innerReset
181
+ )( attributes );
182
+
183
+ expect( innerReset ).toHaveBeenCalledWith( {
184
+ style: attributes.style[ ':hover' ],
185
+ } );
186
+ expect( result ).toEqual( {
187
+ style: {
188
+ color: { text: '#000000' },
189
+ ':hover': {
190
+ typography: { fontSize: '32px' },
191
+ },
192
+ ':focus': { color: { text: '#0000ff' } },
193
+ },
194
+ } );
195
+ } );
196
+
197
+ it( 'removes the state key when the scoped reset leaves it empty', () => {
198
+ const innerReset = () => ( { style: undefined } );
199
+ const attributes = {
200
+ style: {
201
+ color: { text: '#000000' },
202
+ ':hover': { color: { text: '#ff0000' } },
203
+ },
204
+ };
205
+
206
+ const result = scopeResetAllFilterToState(
207
+ { viewport: 'default', pseudo: ':hover' },
208
+ innerReset
209
+ )( attributes );
210
+
211
+ expect( result ).toEqual( {
212
+ style: {
213
+ color: { text: '#000000' },
214
+ },
215
+ } );
216
+ } );
217
+
218
+ it( 'calls the reset filter with an empty style when no state styles exist', () => {
219
+ const innerReset = jest.fn( ( attributes ) => attributes );
220
+ const attributes = {
221
+ style: { color: { text: '#000000' } },
222
+ };
223
+
224
+ scopeResetAllFilterToState(
225
+ { viewport: 'default', pseudo: ':hover' },
226
+ innerReset
227
+ )( attributes );
228
+
229
+ expect( innerReset ).toHaveBeenCalledWith( { style: {} } );
230
+ } );
231
+
232
+ it( 'passes only the selected viewport pseudo state style to the reset filter', () => {
233
+ const innerReset = jest.fn( () => ( { style: undefined } ) );
234
+ const attributes = {
235
+ style: {
236
+ color: { text: '#000000' },
237
+ mobile: {
238
+ color: { text: '#ff0000' },
239
+ ':hover': { color: { text: '#00ff00' } },
240
+ },
241
+ },
242
+ };
243
+
244
+ const result = scopeResetAllFilterToState(
245
+ { viewport: 'mobile', pseudo: ':hover' },
246
+ innerReset
247
+ )( attributes );
248
+
249
+ expect( innerReset ).toHaveBeenCalledWith( {
250
+ style: attributes.style.mobile[ ':hover' ],
251
+ } );
252
+ expect( result ).toEqual( {
253
+ style: {
254
+ color: { text: '#000000' },
255
+ mobile: { color: { text: '#ff0000' } },
256
+ },
257
+ } );
258
+ } );
259
+
260
+ it( 'returns the original reset filter for the default state', () => {
261
+ const innerReset = () => ( { style: undefined } );
262
+
263
+ expect(
264
+ scopeResetAllFilterToState(
265
+ { viewport: 'default', pseudo: 'default' },
266
+ innerReset
267
+ )
268
+ ).toBe( innerReset );
269
+ } );
270
+ } );
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { getResetLayout, getResponsiveLayoutStyles } from '../layout';
5
+
6
+ describe( 'layout', () => {
7
+ describe( 'getResetLayout()', () => {
8
+ it( 'should reset to variation layout defaults', () => {
9
+ const layout = getResetLayout(
10
+ { default: { type: 'flex' } },
11
+ {
12
+ attributes: {
13
+ layout: {
14
+ type: 'grid',
15
+ columnCount: 3,
16
+ },
17
+ },
18
+ }
19
+ );
20
+
21
+ expect( layout ).toEqual( {
22
+ type: 'grid',
23
+ columnCount: 3,
24
+ } );
25
+ } );
26
+
27
+ it( 'should fall back to the block support layout defaults', () => {
28
+ const layout = getResetLayout(
29
+ {
30
+ default: {
31
+ type: 'flex',
32
+ flexWrap: 'nowrap',
33
+ },
34
+ },
35
+ undefined
36
+ );
37
+
38
+ expect( layout ).toEqual( {
39
+ type: 'flex',
40
+ flexWrap: 'nowrap',
41
+ } );
42
+ } );
43
+
44
+ it( 'should return undefined when there is no layout config', () => {
45
+ expect( getResetLayout() ).toBeUndefined();
46
+ } );
47
+ } );
48
+
49
+ describe( 'getResponsiveLayoutStyles()', () => {
50
+ it( 'generates responsive block gap styles for flow layouts', () => {
51
+ expect(
52
+ getResponsiveLayoutStyles( {
53
+ attributes: {
54
+ style: {
55
+ mobile: {
56
+ spacing: {
57
+ blockGap: '12px',
58
+ },
59
+ },
60
+ },
61
+ },
62
+ blockName: 'core/group',
63
+ selector: '.wp-container-test',
64
+ layout: { type: 'default' },
65
+ hasBlockGapSupport: true,
66
+ } )
67
+ ).toBe(
68
+ '@media (width <= 480px){.wp-container-test > :first-child { margin-block-start: 0; }.wp-container-test > :last-child { margin-block-end: 0; }.wp-container-test > * { margin-block-start: 12px; margin-block-end: 0; }}'
69
+ );
70
+ } );
71
+
72
+ it( 'generates responsive block gap styles for flex layouts', () => {
73
+ expect(
74
+ getResponsiveLayoutStyles( {
75
+ attributes: {
76
+ style: {
77
+ mobile: {
78
+ spacing: {
79
+ blockGap: '12px',
80
+ },
81
+ },
82
+ },
83
+ },
84
+ blockName: 'core/group',
85
+ selector: '.wp-container-test',
86
+ layout: { type: 'flex' },
87
+ hasBlockGapSupport: true,
88
+ } )
89
+ ).toBe(
90
+ '@media (width <= 480px){.wp-container-test { gap: 12px; }}'
91
+ );
92
+ } );
93
+
94
+ it( 'generates responsive layout styles for viewport layout overrides', () => {
95
+ expect(
96
+ getResponsiveLayoutStyles( {
97
+ attributes: {
98
+ style: {
99
+ mobile: {
100
+ layout: {
101
+ minimumColumnWidth: '8rem',
102
+ },
103
+ },
104
+ },
105
+ },
106
+ blockName: 'core/group',
107
+ selector: '.wp-container-test',
108
+ layout: { type: 'grid' },
109
+ hasBlockGapSupport: true,
110
+ } )
111
+ ).toBe(
112
+ '@media (width <= 480px){.wp-container-test { grid-template-columns: repeat(auto-fill, minmax(min(8rem, 100%), 1fr)); }}'
113
+ );
114
+ } );
115
+
116
+ it( 'generates responsive layout styles for grid column overrides', () => {
117
+ expect(
118
+ getResponsiveLayoutStyles( {
119
+ attributes: {
120
+ style: {
121
+ mobile: {
122
+ layout: {
123
+ columnCount: 3,
124
+ },
125
+ },
126
+ },
127
+ },
128
+ blockName: 'core/group',
129
+ selector: '.wp-container-test',
130
+ layout: { type: 'grid' },
131
+ hasBlockGapSupport: true,
132
+ } )
133
+ ).toBe(
134
+ '@media (width <= 480px){.wp-container-test { grid-template-columns: repeat(3, minmax(0, 1fr)); }}'
135
+ );
136
+ } );
137
+
138
+ it( 'keeps responsive grid column overrides when block gap is also changed', () => {
139
+ expect(
140
+ getResponsiveLayoutStyles( {
141
+ attributes: {
142
+ style: {
143
+ mobile: {
144
+ layout: {
145
+ columnCount: 3,
146
+ },
147
+ spacing: {
148
+ blockGap: '12px',
149
+ },
150
+ },
151
+ },
152
+ },
153
+ blockName: 'core/group',
154
+ selector: '.wp-container-test',
155
+ layout: { type: 'grid' },
156
+ hasBlockGapSupport: true,
157
+ } )
158
+ ).toBe(
159
+ '@media (width <= 480px){.wp-container-test { grid-template-columns: repeat(3, minmax(0, 1fr)); }.wp-container-test { gap: 12px; }}'
160
+ );
161
+ } );
162
+
163
+ it( 'does not repeat unchanged grid layout declarations for responsive block gap styles', () => {
164
+ expect(
165
+ getResponsiveLayoutStyles( {
166
+ attributes: {
167
+ style: {
168
+ tablet: {
169
+ spacing: {
170
+ blockGap: '12px',
171
+ },
172
+ },
173
+ },
174
+ },
175
+ blockName: 'core/group',
176
+ selector: '.wp-container-test',
177
+ layout: { type: 'grid', minimumColumnWidth: '12rem' },
178
+ hasBlockGapSupport: true,
179
+ } )
180
+ ).toBe(
181
+ '@media (480px < width <= 782px){.wp-container-test { gap: 12px; }}'
182
+ );
183
+ } );
184
+ } );
185
+ } );
@@ -0,0 +1,193 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { registerBlockType, unregisterBlockType } from '@wordpress/blocks';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import {
10
+ getRelativeRootSelector,
11
+ buildScopedBlockSelector,
12
+ buildRootStyleStateSelector,
13
+ buildPseudoStyleStateSelector,
14
+ } from '../state-utils';
15
+
16
+ describe( 'getRelativeRootSelector', () => {
17
+ it( 'returns the descendant part of a space-combinator selector', () => {
18
+ expect(
19
+ getRelativeRootSelector( '.wp-block-button .wp-block-button__link' )
20
+ ).toBe( '.wp-block-button__link' );
21
+ } );
22
+
23
+ it( 'preserves explicit child combinators', () => {
24
+ expect( getRelativeRootSelector( '.wp-block-foo > .inner' ) ).toBe(
25
+ '> .inner'
26
+ );
27
+ } );
28
+
29
+ it( 'preserves multi-level descendants', () => {
30
+ expect( getRelativeRootSelector( '.wp-block-foo .bar .baz' ) ).toBe(
31
+ '.bar .baz'
32
+ );
33
+ } );
34
+
35
+ it( 'returns null for a single-class selector', () => {
36
+ expect( getRelativeRootSelector( '.wp-block-foo' ) ).toBeNull();
37
+ } );
38
+ } );
39
+
40
+ describe( 'buildScopedBlockSelector', () => {
41
+ const BASE = '.wp-elements-abc123';
42
+
43
+ it( 'scopes a suffix to the descendant element from a block selector', () => {
44
+ expect(
45
+ buildScopedBlockSelector(
46
+ BASE,
47
+ '.wp-block-button .wp-block-button__link',
48
+ ':hover'
49
+ )
50
+ ).toBe( `${ BASE } .wp-block-button__link:hover` );
51
+ } );
52
+
53
+ it( 'preserves modifier classes on the first compound selector', () => {
54
+ expect(
55
+ buildScopedBlockSelector(
56
+ BASE,
57
+ '.wp-block-search.wp-block-search__button-outside .wp-block-search__input',
58
+ ':hover'
59
+ )
60
+ ).toBe(
61
+ `${ BASE }.wp-block-search__button-outside .wp-block-search__input:hover`
62
+ );
63
+ } );
64
+
65
+ it( 'preserves child combinators without surrounding spaces', () => {
66
+ expect(
67
+ buildScopedBlockSelector( BASE, '.wp-block-foo>.inner', ':hover' )
68
+ ).toBe( `${ BASE }>.inner:hover` );
69
+ } );
70
+
71
+ it( 'splits selector lists without splitting selector-function arguments', () => {
72
+ expect(
73
+ buildScopedBlockSelector(
74
+ BASE,
75
+ '.wp-block-example:not(.foo, .bar) .inner, .wp-block-example .fallback',
76
+ ':hover'
77
+ )
78
+ ).toBe(
79
+ `${ BASE }:not(.foo, .bar) .inner:hover, ${ BASE } .fallback:hover`
80
+ );
81
+ } );
82
+
83
+ it( 'works for :focus and :active states', () => {
84
+ expect(
85
+ buildScopedBlockSelector(
86
+ BASE,
87
+ '.wp-block-button .wp-block-button__link',
88
+ ':focus'
89
+ )
90
+ ).toBe( `${ BASE } .wp-block-button__link:focus` );
91
+ expect(
92
+ buildScopedBlockSelector(
93
+ BASE,
94
+ '.wp-block-button .wp-block-button__link',
95
+ ':active'
96
+ )
97
+ ).toBe( `${ BASE } .wp-block-button__link:active` );
98
+ } );
99
+
100
+ it( 'falls back to appending the suffix to the base selector when there is no descendant', () => {
101
+ expect(
102
+ buildScopedBlockSelector( BASE, '.wp-block-button', ':hover' )
103
+ ).toBe( `${ BASE }:hover` );
104
+ } );
105
+
106
+ it( 'falls back to appending the suffix to the base selector when the block selector is missing', () => {
107
+ expect( buildScopedBlockSelector( BASE, undefined, ':hover' ) ).toBe(
108
+ `${ BASE }:hover`
109
+ );
110
+ } );
111
+
112
+ it( 'does not split selector lists on commas inside pseudo-class arguments', () => {
113
+ expect(
114
+ buildScopedBlockSelector(
115
+ BASE,
116
+ '.wp-block-navigation :is(.current-menu-item, .current-menu-ancestor)',
117
+ ':hover'
118
+ )
119
+ ).toBe(
120
+ `${ BASE } :is(.current-menu-item, .current-menu-ancestor):hover`
121
+ );
122
+ } );
123
+ } );
124
+
125
+ describe( 'state selector builders', () => {
126
+ const BASE = '.wp-elements-abc123';
127
+
128
+ beforeEach( () => {
129
+ registerBlockType( 'test/button', {
130
+ apiVersion: 3,
131
+ title: 'Button',
132
+ category: 'text',
133
+ attributes: {},
134
+ edit: () => null,
135
+ save: () => null,
136
+ selectors: {
137
+ root: '.wp-block-button .wp-block-button__link',
138
+ },
139
+ } );
140
+ registerBlockType( 'test/plain', {
141
+ apiVersion: 3,
142
+ title: 'Plain',
143
+ category: 'text',
144
+ attributes: {},
145
+ edit: () => null,
146
+ save: () => null,
147
+ } );
148
+ } );
149
+
150
+ afterEach( () => {
151
+ unregisterBlockType( 'test/button' );
152
+ unregisterBlockType( 'test/plain' );
153
+ } );
154
+
155
+ it( 'scopes root state styles to the descendant element from selectors.root', () => {
156
+ expect( buildRootStyleStateSelector( BASE, 'test/button' ) ).toBe(
157
+ `${ BASE } .wp-block-button__link`
158
+ );
159
+ } );
160
+
161
+ it( 'falls back to the base selector when block has no selectors.root', () => {
162
+ expect( buildRootStyleStateSelector( BASE, 'test/plain' ) ).toBe(
163
+ BASE
164
+ );
165
+ } );
166
+
167
+ it( 'scopes pseudo states to the descendant element from selectors.root', () => {
168
+ expect(
169
+ buildPseudoStyleStateSelector( BASE, 'test/button', ':hover' )
170
+ ).toBe( `${ BASE } .wp-block-button__link:hover` );
171
+ } );
172
+
173
+ it( 'works for :focus and :active states', () => {
174
+ expect(
175
+ buildPseudoStyleStateSelector( BASE, 'test/button', ':focus' )
176
+ ).toBe( `${ BASE } .wp-block-button__link:focus` );
177
+ expect(
178
+ buildPseudoStyleStateSelector( BASE, 'test/button', ':active' )
179
+ ).toBe( `${ BASE } .wp-block-button__link:active` );
180
+ } );
181
+
182
+ it( 'falls back to appending state to the base selector when block has no selectors.root', () => {
183
+ expect(
184
+ buildPseudoStyleStateSelector( BASE, 'test/plain', ':hover' )
185
+ ).toBe( `${ BASE }:hover` );
186
+ } );
187
+
188
+ it( 'falls back to appending state to the base selector for an unknown block name', () => {
189
+ expect(
190
+ buildPseudoStyleStateSelector( BASE, 'test/unknown', ':hover' )
191
+ ).toBe( `${ BASE }:hover` );
192
+ } );
193
+ } );