@wordpress/block-editor 15.19.1-next.v.202605131032.0 → 15.21.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 (342) hide show
  1. package/CHANGELOG.md +17 -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/use-focus-handler.cjs +3 -4
  12. package/build/components/block-list/use-block-props/use-focus-handler.cjs.map +3 -3
  13. package/build/components/block-list/use-block-props/use-is-hovered.cjs +24 -14
  14. package/build/components/block-list/use-block-props/use-is-hovered.cjs.map +3 -3
  15. package/build/components/block-lock/modal.cjs.map +3 -3
  16. package/build/components/block-patterns-list/index.cjs +13 -2
  17. package/build/components/block-patterns-list/index.cjs.map +2 -2
  18. package/build/components/block-popover/index.cjs +13 -3
  19. package/build/components/block-popover/index.cjs.map +2 -2
  20. package/build/components/block-toolbar/switch-section-style.cjs.map +3 -3
  21. package/build/components/block-visibility/modal.cjs.map +3 -3
  22. package/build/components/block-visibility/viewport-visibility-info.cjs.map +3 -3
  23. package/build/components/child-layout-control/index.cjs +10 -5
  24. package/build/components/child-layout-control/index.cjs.map +2 -2
  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 +15 -8
  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/use-scale-canvas.cjs +4 -1
  42. package/build/components/iframe/use-scale-canvas.cjs.map +2 -2
  43. package/build/components/inserter/hooks/use-patterns-state.cjs +4 -6
  44. package/build/components/inserter/hooks/use-patterns-state.cjs.map +2 -2
  45. package/build/components/inserter/index.cjs +1 -0
  46. package/build/components/inserter/index.cjs.map +2 -2
  47. package/build/components/inserter/media-tab/media-preview.cjs +27 -18
  48. package/build/components/inserter/media-tab/media-preview.cjs.map +2 -2
  49. package/build/components/inserter/panel.cjs.map +3 -3
  50. package/build/components/inspector-controls/block-support-tools-panel.cjs +10 -2
  51. package/build/components/inspector-controls/block-support-tools-panel.cjs.map +2 -2
  52. package/build/components/inspector-controls/fill.cjs +14 -4
  53. package/build/components/inspector-controls/fill.cjs.map +2 -2
  54. package/build/components/inspector-controls/groups.cjs +2 -0
  55. package/build/components/inspector-controls/groups.cjs.map +2 -2
  56. package/build/components/inspector-controls-tabs/index.cjs +13 -8
  57. package/build/components/inspector-controls-tabs/index.cjs.map +3 -3
  58. package/build/components/inspector-controls-tabs/settings-tab.cjs +1 -4
  59. package/build/components/inspector-controls-tabs/settings-tab.cjs.map +3 -3
  60. package/build/components/inspector-controls-tabs/styles-tab.cjs +9 -0
  61. package/build/components/inspector-controls-tabs/styles-tab.cjs.map +3 -3
  62. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs +11 -5
  63. package/build/components/inspector-controls-tabs/use-inspector-controls-tabs.cjs.map +2 -2
  64. package/build/components/list-view/block-select-button.cjs +20 -8
  65. package/build/components/list-view/block-select-button.cjs.map +2 -2
  66. package/build/components/list-view/block.cjs +2 -1
  67. package/build/components/list-view/block.cjs.map +2 -2
  68. package/build/components/preset-input-control/custom-value-controls.cjs +10 -1
  69. package/build/components/preset-input-control/custom-value-controls.cjs.map +2 -2
  70. package/build/components/preset-input-control/index.cjs.map +3 -3
  71. package/build/components/provider/use-media-upload-settings.cjs +1 -0
  72. package/build/components/provider/use-media-upload-settings.cjs.map +2 -2
  73. package/build/components/rich-text/event-listeners/enter.cjs +9 -2
  74. package/build/components/rich-text/event-listeners/enter.cjs.map +3 -3
  75. package/build/components/rich-text/event-listeners/paste-handler.cjs +4 -4
  76. package/build/components/rich-text/event-listeners/paste-handler.cjs.map +3 -3
  77. package/build/hooks/background.cjs +13 -3
  78. package/build/hooks/background.cjs.map +2 -2
  79. package/build/hooks/block-fields/link/index.cjs.map +3 -3
  80. package/build/hooks/block-fields/media/index.cjs.map +3 -3
  81. package/build/hooks/block-style-state.cjs +112 -0
  82. package/build/hooks/block-style-state.cjs.map +7 -0
  83. package/build/hooks/border.cjs +13 -3
  84. package/build/hooks/border.cjs.map +2 -2
  85. package/build/hooks/color.cjs +28 -9
  86. package/build/hooks/color.cjs.map +2 -2
  87. package/build/hooks/dimensions.cjs +15 -6
  88. package/build/hooks/dimensions.cjs.map +2 -2
  89. package/build/hooks/layout-child.cjs +147 -61
  90. package/build/hooks/layout-child.cjs.map +2 -2
  91. package/build/hooks/layout.cjs +263 -56
  92. package/build/hooks/layout.cjs.map +3 -3
  93. package/build/hooks/state-utils.cjs +94 -0
  94. package/build/hooks/state-utils.cjs.map +7 -0
  95. package/build/hooks/states.cjs +124 -0
  96. package/build/hooks/states.cjs.map +7 -0
  97. package/build/hooks/style.cjs +304 -17
  98. package/build/hooks/style.cjs.map +3 -3
  99. package/build/hooks/typography.cjs +14 -5
  100. package/build/hooks/typography.cjs.map +2 -2
  101. package/build/layouts/constrained.cjs +128 -55
  102. package/build/layouts/constrained.cjs.map +3 -3
  103. package/build/layouts/flex.cjs +119 -31
  104. package/build/layouts/flex.cjs.map +3 -3
  105. package/build/layouts/grid.cjs +103 -40
  106. package/build/layouts/grid.cjs.map +3 -3
  107. package/build/private-apis.cjs +2 -0
  108. package/build/private-apis.cjs.map +2 -2
  109. package/build/store/private-actions.cjs +18 -0
  110. package/build/store/private-actions.cjs.map +2 -2
  111. package/build/store/private-keys.cjs +10 -2
  112. package/build/store/private-keys.cjs.map +2 -2
  113. package/build/store/private-selectors.cjs +32 -2
  114. package/build/store/private-selectors.cjs.map +2 -2
  115. package/build/store/reducer.cjs +70 -1
  116. package/build/store/reducer.cjs.map +2 -2
  117. package/build/store/utils.cjs +1 -1
  118. package/build/store/utils.cjs.map +2 -2
  119. package/build/utils/color-values.cjs +44 -0
  120. package/build/utils/color-values.cjs.map +7 -0
  121. package/build-module/components/block-card/index.mjs +52 -45
  122. package/build-module/components/block-card/index.mjs.map +2 -2
  123. package/build-module/components/block-heading-level-dropdown/heading-level-icon.mjs +2 -2
  124. package/build-module/components/block-heading-level-dropdown/heading-level-icon.mjs.map +2 -2
  125. package/build-module/components/block-icon/index.mjs +8 -2
  126. package/build-module/components/block-icon/index.mjs.map +2 -2
  127. package/build-module/components/block-inspector/index.mjs +166 -13
  128. package/build-module/components/block-inspector/index.mjs.map +2 -2
  129. package/build-module/components/block-inspector/inspector-pre-tabs-slot-fill.mjs +12 -0
  130. package/build-module/components/block-inspector/inspector-pre-tabs-slot-fill.mjs.map +7 -0
  131. package/build-module/components/block-list/use-block-props/use-focus-handler.mjs +7 -5
  132. package/build-module/components/block-list/use-block-props/use-focus-handler.mjs.map +2 -2
  133. package/build-module/components/block-list/use-block-props/use-is-hovered.mjs +28 -15
  134. package/build-module/components/block-list/use-block-props/use-is-hovered.mjs.map +2 -2
  135. package/build-module/components/block-lock/modal.mjs +4 -4
  136. package/build-module/components/block-lock/modal.mjs.map +2 -2
  137. package/build-module/components/block-patterns-list/index.mjs +14 -4
  138. package/build-module/components/block-patterns-list/index.mjs.map +2 -2
  139. package/build-module/components/block-popover/index.mjs +13 -3
  140. package/build-module/components/block-popover/index.mjs.map +2 -2
  141. package/build-module/components/block-toolbar/switch-section-style.mjs +2 -2
  142. package/build-module/components/block-toolbar/switch-section-style.mjs.map +2 -2
  143. package/build-module/components/block-visibility/modal.mjs +2 -2
  144. package/build-module/components/block-visibility/modal.mjs.map +2 -2
  145. package/build-module/components/block-visibility/viewport-visibility-info.mjs +2 -2
  146. package/build-module/components/block-visibility/viewport-visibility-info.mjs.map +2 -2
  147. package/build-module/components/child-layout-control/index.mjs +10 -5
  148. package/build-module/components/child-layout-control/index.mjs.map +2 -2
  149. package/build-module/components/colors-gradients/control.mjs +7 -4
  150. package/build-module/components/colors-gradients/control.mjs.map +2 -2
  151. package/build-module/components/global-styles/advanced-panel.mjs +25 -27
  152. package/build-module/components/global-styles/advanced-panel.mjs.map +2 -2
  153. package/build-module/components/global-styles/color-panel.mjs +96 -59
  154. package/build-module/components/global-styles/color-panel.mjs.map +2 -2
  155. package/build-module/components/global-styles/dimensions-panel.mjs +20 -8
  156. package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
  157. package/build-module/components/global-styles/index.mjs +2 -0
  158. package/build-module/components/global-styles/index.mjs.map +2 -2
  159. package/build-module/components/global-styles/shadow-panel-components.mjs +39 -28
  160. package/build-module/components/global-styles/shadow-panel-components.mjs.map +2 -2
  161. package/build-module/components/global-styles/state-control-badges.mjs +48 -0
  162. package/build-module/components/global-styles/state-control-badges.mjs.map +7 -0
  163. package/build-module/components/global-styles/state-control.mjs +57 -71
  164. package/build-module/components/global-styles/state-control.mjs.map +2 -2
  165. package/build-module/components/iframe/use-scale-canvas.mjs +4 -1
  166. package/build-module/components/iframe/use-scale-canvas.mjs.map +2 -2
  167. package/build-module/components/inserter/hooks/use-patterns-state.mjs +8 -7
  168. package/build-module/components/inserter/hooks/use-patterns-state.mjs.map +2 -2
  169. package/build-module/components/inserter/index.mjs +1 -0
  170. package/build-module/components/inserter/index.mjs.map +2 -2
  171. package/build-module/components/inserter/media-tab/media-preview.mjs +27 -19
  172. package/build-module/components/inserter/media-tab/media-preview.mjs.map +2 -2
  173. package/build-module/components/inserter/panel.mjs +2 -2
  174. package/build-module/components/inserter/panel.mjs.map +2 -2
  175. package/build-module/components/inspector-controls/block-support-tools-panel.mjs +10 -2
  176. package/build-module/components/inspector-controls/block-support-tools-panel.mjs.map +2 -2
  177. package/build-module/components/inspector-controls/fill.mjs +18 -5
  178. package/build-module/components/inspector-controls/fill.mjs.map +2 -2
  179. package/build-module/components/inspector-controls/groups.mjs +2 -0
  180. package/build-module/components/inspector-controls/groups.mjs.map +2 -2
  181. package/build-module/components/inspector-controls-tabs/index.mjs +14 -10
  182. package/build-module/components/inspector-controls-tabs/index.mjs.map +2 -2
  183. package/build-module/components/inspector-controls-tabs/settings-tab.mjs +1 -4
  184. package/build-module/components/inspector-controls-tabs/settings-tab.mjs.map +2 -2
  185. package/build-module/components/inspector-controls-tabs/styles-tab.mjs +9 -0
  186. package/build-module/components/inspector-controls-tabs/styles-tab.mjs.map +2 -2
  187. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs +11 -5
  188. package/build-module/components/inspector-controls-tabs/use-inspector-controls-tabs.mjs.map +2 -2
  189. package/build-module/components/list-view/block-select-button.mjs +20 -9
  190. package/build-module/components/list-view/block-select-button.mjs.map +2 -2
  191. package/build-module/components/list-view/block.mjs +2 -1
  192. package/build-module/components/list-view/block.mjs.map +2 -2
  193. package/build-module/components/preset-input-control/custom-value-controls.mjs +10 -2
  194. package/build-module/components/preset-input-control/custom-value-controls.mjs.map +2 -2
  195. package/build-module/components/preset-input-control/index.mjs +2 -2
  196. package/build-module/components/preset-input-control/index.mjs.map +2 -2
  197. package/build-module/components/provider/use-media-upload-settings.mjs +1 -0
  198. package/build-module/components/provider/use-media-upload-settings.mjs.map +2 -2
  199. package/build-module/components/rich-text/event-listeners/enter.mjs +9 -2
  200. package/build-module/components/rich-text/event-listeners/enter.mjs.map +2 -2
  201. package/build-module/components/rich-text/event-listeners/paste-handler.mjs +4 -4
  202. package/build-module/components/rich-text/event-listeners/paste-handler.mjs.map +2 -2
  203. package/build-module/hooks/background.mjs +18 -3
  204. package/build-module/hooks/background.mjs.map +2 -2
  205. package/build-module/hooks/block-fields/link/index.mjs +3 -3
  206. package/build-module/hooks/block-fields/link/index.mjs.map +2 -2
  207. package/build-module/hooks/block-fields/media/index.mjs +3 -3
  208. package/build-module/hooks/block-fields/media/index.mjs.map +2 -2
  209. package/build-module/hooks/block-style-state.mjs +79 -0
  210. package/build-module/hooks/block-style-state.mjs.map +7 -0
  211. package/build-module/hooks/border.mjs +18 -3
  212. package/build-module/hooks/border.mjs.map +2 -2
  213. package/build-module/hooks/color.mjs +33 -9
  214. package/build-module/hooks/color.mjs.map +2 -2
  215. package/build-module/hooks/dimensions.mjs +20 -6
  216. package/build-module/hooks/dimensions.mjs.map +2 -2
  217. package/build-module/hooks/layout-child.mjs +141 -61
  218. package/build-module/hooks/layout-child.mjs.map +2 -2
  219. package/build-module/hooks/layout.mjs +270 -58
  220. package/build-module/hooks/layout.mjs.map +2 -2
  221. package/build-module/hooks/state-utils.mjs +64 -0
  222. package/build-module/hooks/state-utils.mjs.map +7 -0
  223. package/build-module/hooks/states.mjs +85 -0
  224. package/build-module/hooks/states.mjs.map +7 -0
  225. package/build-module/hooks/style.mjs +309 -18
  226. package/build-module/hooks/style.mjs.map +2 -2
  227. package/build-module/hooks/typography.mjs +19 -5
  228. package/build-module/hooks/typography.mjs.map +2 -2
  229. package/build-module/layouts/constrained.mjs +130 -57
  230. package/build-module/layouts/constrained.mjs.map +2 -2
  231. package/build-module/layouts/flex.mjs +123 -35
  232. package/build-module/layouts/flex.mjs.map +2 -2
  233. package/build-module/layouts/grid.mjs +105 -42
  234. package/build-module/layouts/grid.mjs.map +2 -2
  235. package/build-module/private-apis.mjs +4 -0
  236. package/build-module/private-apis.mjs.map +2 -2
  237. package/build-module/store/private-actions.mjs +16 -0
  238. package/build-module/store/private-actions.mjs.map +2 -2
  239. package/build-module/store/private-keys.mjs +7 -1
  240. package/build-module/store/private-keys.mjs.map +2 -2
  241. package/build-module/store/private-selectors.mjs +30 -2
  242. package/build-module/store/private-selectors.mjs.map +2 -2
  243. package/build-module/store/reducer.mjs +69 -1
  244. package/build-module/store/reducer.mjs.map +2 -2
  245. package/build-module/store/utils.mjs +5 -2
  246. package/build-module/store/utils.mjs.map +2 -2
  247. package/build-module/utils/color-values.mjs +19 -0
  248. package/build-module/utils/color-values.mjs.map +7 -0
  249. package/build-style/content-rtl.css +18 -3
  250. package/build-style/content.css +18 -3
  251. package/build-style/style-rtl.css +14 -17
  252. package/build-style/style.css +14 -17
  253. package/package.json +39 -39
  254. package/src/components/audio-player/index.native.js +7 -3
  255. package/src/components/block-card/index.js +67 -60
  256. package/src/components/block-heading-level-dropdown/heading-level-icon.js +2 -2
  257. package/src/components/block-icon/index.js +5 -2
  258. package/src/components/block-icon/index.native.js +2 -2
  259. package/src/components/block-inspector/index.js +153 -7
  260. package/src/components/block-inspector/inspector-pre-tabs-slot-fill.js +11 -0
  261. package/src/components/block-list/block-selection-button.native.js +3 -3
  262. package/src/components/block-list/content.scss +0 -6
  263. package/src/components/block-list/use-block-props/use-focus-handler.js +8 -6
  264. package/src/components/block-list/use-block-props/use-is-hovered.js +32 -15
  265. package/src/components/block-lock/modal.js +4 -4
  266. package/src/components/block-patterns-list/index.js +14 -5
  267. package/src/components/block-patterns-list/stories/index.story.jsx +2 -0
  268. package/src/components/block-patterns-list/style.scss +0 -1
  269. package/src/components/block-popover/index.js +20 -10
  270. package/src/components/block-toolbar/switch-section-style.js +2 -2
  271. package/src/components/block-visibility/modal.js +2 -2
  272. package/src/components/block-visibility/viewport-visibility-info.js +2 -2
  273. package/src/components/child-layout-control/index.js +15 -8
  274. package/src/components/child-layout-control/test/index.js +126 -0
  275. package/src/components/colors-gradients/control.js +10 -8
  276. package/src/components/colors-gradients/test/control.js +98 -1
  277. package/src/components/global-styles/advanced-panel.js +44 -39
  278. package/src/components/global-styles/color-panel.js +133 -60
  279. package/src/components/global-styles/dimensions-panel.js +29 -8
  280. package/src/components/global-styles/index.js +1 -0
  281. package/src/components/global-styles/shadow-panel-components.js +29 -19
  282. package/src/components/global-styles/state-control-badges.js +58 -0
  283. package/src/components/global-styles/state-control.js +28 -36
  284. package/src/components/global-styles/test/color-panel.js +135 -0
  285. package/src/components/iframe/use-scale-canvas.js +8 -2
  286. package/src/components/inserter/hooks/use-patterns-state.js +12 -7
  287. package/src/components/inserter/index.js +1 -0
  288. package/src/components/inserter/media-tab/media-preview.js +29 -20
  289. package/src/components/inserter/panel.js +2 -2
  290. package/src/components/inserter/style.scss +1 -0
  291. package/src/components/inserter-button/index.native.js +5 -2
  292. package/src/components/inspector-controls/block-support-tools-panel.js +10 -2
  293. package/src/components/inspector-controls/fill.js +18 -5
  294. package/src/components/inspector-controls/groups.js +2 -0
  295. package/src/components/inspector-controls-tabs/index.js +9 -5
  296. package/src/components/inspector-controls-tabs/settings-tab.js +1 -7
  297. package/src/components/inspector-controls-tabs/styles-tab.js +6 -0
  298. package/src/components/inspector-controls-tabs/use-inspector-controls-tabs.js +13 -7
  299. package/src/components/list-view/block-select-button.js +19 -9
  300. package/src/components/list-view/block.js +6 -1
  301. package/src/components/media-replace-flow/style.scss +0 -18
  302. package/src/components/preset-input-control/custom-value-controls.js +13 -6
  303. package/src/components/preset-input-control/index.js +2 -2
  304. package/src/components/provider/use-media-upload-settings.js +1 -0
  305. package/src/components/rich-text/event-listeners/enter.js +14 -2
  306. package/src/components/rich-text/event-listeners/paste-handler.js +5 -4
  307. package/src/components/unsupported-block-details/index.native.js +6 -2
  308. package/src/components/video-player/index.native.js +2 -2
  309. package/src/components/warning/index.native.js +2 -2
  310. package/src/hooks/background.js +59 -37
  311. package/src/hooks/block-fields/link/index.js +3 -3
  312. package/src/hooks/block-fields/media/index.js +3 -3
  313. package/src/hooks/block-style-state.js +127 -0
  314. package/src/hooks/border.js +25 -6
  315. package/src/hooks/color.js +40 -18
  316. package/src/hooks/dimensions.js +32 -11
  317. package/src/hooks/layout-child.js +179 -62
  318. package/src/hooks/layout.js +349 -75
  319. package/src/hooks/layout.scss +6 -0
  320. package/src/hooks/state-utils.js +158 -0
  321. package/src/hooks/states.js +109 -0
  322. package/src/hooks/style.js +456 -19
  323. package/src/hooks/test/block-style-state.js +270 -0
  324. package/src/hooks/test/layout.js +185 -0
  325. package/src/hooks/test/state-utils.js +193 -0
  326. package/src/hooks/test/style.js +301 -1
  327. package/src/hooks/typography.js +33 -14
  328. package/src/layouts/constrained.js +182 -95
  329. package/src/layouts/flex.js +141 -36
  330. package/src/layouts/grid.js +122 -32
  331. package/src/layouts/test/flex.js +57 -20
  332. package/src/private-apis.js +4 -0
  333. package/src/store/private-actions.js +32 -0
  334. package/src/store/private-keys.js +4 -0
  335. package/src/store/private-selectors.js +61 -2
  336. package/src/store/reducer.js +105 -1
  337. package/src/store/test/private-actions.js +26 -0
  338. package/src/store/test/private-selectors.js +143 -0
  339. package/src/store/test/reducer.js +363 -0
  340. package/src/store/utils.js +6 -2
  341. package/src/utils/color-values.js +28 -0
  342. package/src/utils/test/color-values.js +78 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/hooks/state-utils.js"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { getBlockType } from '@wordpress/blocks';\nimport { splitSelectorList } from '@wordpress/global-styles-engine';\n\n/**\n * Given a block's `selectors.root` value, returns the part of the selector\n * that is relative to the block wrapper \u2014 i.e., everything after the first\n * compound selector segment.\n *\n * Examples:\n * \".wp-block-button .wp-block-button__link\" \u2192 \".wp-block-button__link\"\n * \".wp-block-foo > .inner\" \u2192 \"> .inner\"\n * \".wp-block-foo\" \u2192 null (no descendant)\n *\n * @param {string} rootSelector The block's `selectors.root` value.\n * @return {string|null} Relative selector, or null if rootSelector targets the wrapper itself.\n */\nexport function getRelativeRootSelector( rootSelector ) {\n\t// Match everything after the first compound selector (up to the first\n\t// whitespace or combinator character).\n\t// Require at least one combinator character (space, >, +, ~) between the\n\t// first compound selector and the rest. Without this anchor, a greedy\n\t// quantifier would backtrack into the first token and produce false matches.\n\tconst match = rootSelector.trim().match( /^[^ >+~]+[ >+~](.*)$/ );\n\tif ( ! match ) {\n\t\treturn null;\n\t}\n\tconst rest = match[ 1 ].trim();\n\treturn rest || null;\n}\n\n/**\n * Builds a scoped selector from a block selector and optional suffix.\n *\n * If the block selector targets a descendant, the descendant portion is scoped\n * under the provided base selector. Otherwise the base selector itself is used.\n *\n * @param {string} baseSelector The block-instance scoping selector.\n * @param {string} blockSelector The block or feature selector from block metadata.\n * @param {string} suffix Optional selector suffix, e.g. \":hover\".\n * @return {string} The scoped CSS selector.\n */\nexport function buildScopedBlockSelector(\n\tbaseSelector,\n\tblockSelector,\n\tsuffix = ''\n) {\n\tif ( typeof blockSelector !== 'string' || ! blockSelector ) {\n\t\treturn splitSelectorList( baseSelector )\n\t\t\t.map( ( selector ) => `${ selector.trim() }${ suffix }` )\n\t\t\t.join( ', ' );\n\t}\n\n\tconst baseSelectors = splitSelectorList( baseSelector ).filter(\n\t\t( selector ) => selector.trim()\n\t);\n\tconst selectors = splitSelectorList( blockSelector ).filter( ( selector ) =>\n\t\tselector.trim()\n\t);\n\n\tif ( ! selectors.length ) {\n\t\treturn baseSelectors\n\t\t\t.map( ( selector ) => `${ selector.trim() }${ suffix }` )\n\t\t\t.join( ', ' );\n\t}\n\n\treturn selectors\n\t\t.map( ( selector ) => {\n\t\t\tselector = selector.trim();\n\n\t\t\t/*\n\t\t\t * Replace only the leading block selector part (e.g. class name,\n\t\t\t * attribute selector, ID, or tag name) with the block instance selector.\n\t\t\t * Preserve anything after that prefix, including modifier classes on the\n\t\t\t * same element and combinators without spaces.\n\t\t\t */\n\t\t\tconst match = selector.match( /^([.#]?[-_a-zA-Z0-9]+|\\[[^\\]]+\\])/ );\n\t\t\tif ( match ) {\n\t\t\t\treturn baseSelectors\n\t\t\t\t\t.map(\n\t\t\t\t\t\t( base ) =>\n\t\t\t\t\t\t\t`${ base.trim() }${ selector.slice(\n\t\t\t\t\t\t\t\tmatch[ 0 ].length\n\t\t\t\t\t\t\t) }${ suffix }`\n\t\t\t\t\t)\n\t\t\t\t\t.join( ', ' );\n\t\t\t}\n\n\t\t\treturn baseSelectors\n\t\t\t\t.map( ( base ) => `${ base.trim() }${ suffix }` )\n\t\t\t\t.join( ', ' );\n\t\t} )\n\t\t.join( ', ' );\n}\n\n/**\n * Builds the scoped selector for root block style state styles.\n *\n * Uses the block's `selectors.root` to determine which element should receive\n * root-level state styles. If `selectors.root` describes a descendant element\n * (e.g. `.wp-block-button .wp-block-button__link`), the relative portion is\n * scoped under `baseSelector`. If no descendant is present, falls back to the\n * base selector.\n *\n * @param {string} baseSelector The block-instance scoping class selector.\n * @param {string} name The block name, used to look up selectors.\n * @return {string} The fully-scoped CSS selector for root state styles.\n */\nexport function buildRootStyleStateSelector( baseSelector, name ) {\n\tconst rootSelector = getBlockType( name )?.selectors?.root;\n\treturn buildScopedBlockSelector( baseSelector, rootSelector );\n}\n\n/**\n * Builds the scoped CSS selector for a block state (e.g. :hover, :focus).\n *\n * Uses the block's `selectors.root` to determine which element the state\n * pseudo-class should apply to. If `selectors.root` describes a descendant\n * element (e.g. \".wp-block-button .wp-block-button__link\"), the relative\n * portion (\".wp-block-button__link\") is scoped under `baseSelector`. If no\n * descendant is present, falls back to appending the state to `baseSelector`.\n *\n * @param {string} baseSelector The block-instance scoping class selector.\n * @param {string} name The block name, used to look up selectors.\n * @param {string} state The pseudo-class string, e.g. \":hover\".\n * @return {string} The fully-scoped CSS selector for this state.\n */\nexport function buildPseudoStyleStateSelector( baseSelector, name, state ) {\n\treturn `${ buildRootStyleStateSelector( baseSelector, name ) }${ state }`;\n}\n\nexport function buildStateSelector( baseSelector, name, state ) {\n\tconst rootSelector = getBlockType( name )?.selectors?.root;\n\treturn buildScopedBlockSelector( baseSelector, rootSelector, state );\n}\n\n/**\n * Builds the CSS selector used to preview a state on the editor canvas,\n * scoped to a specific block instance via its `data-block` attribute.\n *\n * For blocks whose `selectors.root` targets a descendant element\n * (e.g. \".wp-block-button .wp-block-button__link\"), the selector targets\n * that descendant inside the block wrapper. Otherwise it targets the wrapper\n * itself.\n *\n * @param {string} clientId The block's clientId.\n * @param {string} name The block name, used to look up selectors.\n * @return {string} CSS selector scoped to this block instance.\n */\nexport function buildCanvasStateSelector( clientId, name ) {\n\tconst rootSelector = getBlockType( name )?.selectors?.root;\n\treturn buildScopedBlockSelector(\n\t\t`[data-block=\"${ clientId }\"]`,\n\t\trootSelector\n\t);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,oBAA6B;AAC7B,kCAAkC;AAe3B,SAAS,wBAAyB,cAAe;AAMvD,QAAM,QAAQ,aAAa,KAAK,EAAE,MAAO,sBAAuB;AAChE,MAAK,CAAE,OAAQ;AACd,WAAO;AAAA,EACR;AACA,QAAM,OAAO,MAAO,CAAE,EAAE,KAAK;AAC7B,SAAO,QAAQ;AAChB;AAaO,SAAS,yBACf,cACA,eACA,SAAS,IACR;AACD,MAAK,OAAO,kBAAkB,YAAY,CAAE,eAAgB;AAC3D,eAAO,+CAAmB,YAAa,EACrC,IAAK,CAAE,aAAc,GAAI,SAAS,KAAK,CAAE,GAAI,MAAO,EAAG,EACvD,KAAM,IAAK;AAAA,EACd;AAEA,QAAM,oBAAgB,+CAAmB,YAAa,EAAE;AAAA,IACvD,CAAE,aAAc,SAAS,KAAK;AAAA,EAC/B;AACA,QAAM,gBAAY,+CAAmB,aAAc,EAAE;AAAA,IAAQ,CAAE,aAC9D,SAAS,KAAK;AAAA,EACf;AAEA,MAAK,CAAE,UAAU,QAAS;AACzB,WAAO,cACL,IAAK,CAAE,aAAc,GAAI,SAAS,KAAK,CAAE,GAAI,MAAO,EAAG,EACvD,KAAM,IAAK;AAAA,EACd;AAEA,SAAO,UACL,IAAK,CAAE,aAAc;AACrB,eAAW,SAAS,KAAK;AAQzB,UAAM,QAAQ,SAAS,MAAO,mCAAoC;AAClE,QAAK,OAAQ;AACZ,aAAO,cACL;AAAA,QACA,CAAE,SACD,GAAI,KAAK,KAAK,CAAE,GAAI,SAAS;AAAA,UAC5B,MAAO,CAAE,EAAE;AAAA,QACZ,CAAE,GAAI,MAAO;AAAA,MACf,EACC,KAAM,IAAK;AAAA,IACd;AAEA,WAAO,cACL,IAAK,CAAE,SAAU,GAAI,KAAK,KAAK,CAAE,GAAI,MAAO,EAAG,EAC/C,KAAM,IAAK;AAAA,EACd,CAAE,EACD,KAAM,IAAK;AACd;AAeO,SAAS,4BAA6B,cAAc,MAAO;AACjE,QAAM,mBAAe,4BAAc,IAAK,GAAG,WAAW;AACtD,SAAO,yBAA0B,cAAc,YAAa;AAC7D;AAgBO,SAAS,8BAA+B,cAAc,MAAM,OAAQ;AAC1E,SAAO,GAAI,4BAA6B,cAAc,IAAK,CAAE,GAAI,KAAM;AACxE;AAEO,SAAS,mBAAoB,cAAc,MAAM,OAAQ;AAC/D,QAAM,mBAAe,4BAAc,IAAK,GAAG,WAAW;AACtD,SAAO,yBAA0B,cAAc,cAAc,KAAM;AACpE;AAeO,SAAS,yBAA0B,UAAU,MAAO;AAC1D,QAAM,mBAAe,4BAAc,IAAK,GAAG,WAAW;AACtD,SAAO;AAAA,IACN,gBAAiB,QAAS;AAAA,IAC1B;AAAA,EACD;AACD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // packages/block-editor/src/hooks/states.js
31
+ var states_exports = {};
32
+ __export(states_exports, {
33
+ BlockStateBadges: () => BlockStateBadges,
34
+ BlockStatesControl: () => BlockStatesControl,
35
+ PSEUDO_STATE_LABELS: () => PSEUDO_STATE_LABELS,
36
+ RESPONSIVE_STATE_LABELS: () => RESPONSIVE_STATE_LABELS,
37
+ VALID_BLOCK_PSEUDO_STATES: () => VALID_BLOCK_PSEUDO_STATES
38
+ });
39
+ module.exports = __toCommonJS(states_exports);
40
+ var import_blocks = require("@wordpress/blocks");
41
+ var import_i18n = require("@wordpress/i18n");
42
+ var import_state_control = __toESM(require("../components/global-styles/state-control.cjs"));
43
+ var import_state_control_badges = __toESM(require("../components/global-styles/state-control-badges.cjs"));
44
+ var import_utils = require("../components/global-styles/utils.cjs");
45
+ var import_jsx_runtime = require("react/jsx-runtime");
46
+ var PSEUDO_STATE_LABELS = {
47
+ ":hover": (0, import_i18n.__)("Hover"),
48
+ ":focus": (0, import_i18n.__)("Focus"),
49
+ ":focus-visible": (0, import_i18n.__)("Focus-visible"),
50
+ ":active": (0, import_i18n.__)("Active")
51
+ };
52
+ var RESPONSIVE_STATE_LABELS = {
53
+ tablet: (0, import_i18n.__)("Tablet"),
54
+ mobile: (0, import_i18n.__)("Mobile")
55
+ };
56
+ var VALID_BLOCK_PSEUDO_STATES = {
57
+ "core/button": [":hover", ":focus", ":focus-visible", ":active"],
58
+ "core/navigation-link": [":hover", ":focus", ":focus-visible", ":active"]
59
+ };
60
+ function getPseudoStateOptions(name) {
61
+ const validStates = VALID_BLOCK_PSEUDO_STATES[name] ?? [];
62
+ return validStates.filter((state) => PSEUDO_STATE_LABELS[state]).map((state) => ({
63
+ value: state,
64
+ label: PSEUDO_STATE_LABELS[state]
65
+ }));
66
+ }
67
+ var DEFAULT_STATE_VALUE = "default";
68
+ function getViewportStateOptions(name) {
69
+ if (!(0, import_blocks.getBlockType)(name)?.attributes?.style) {
70
+ return [];
71
+ }
72
+ return Object.entries(RESPONSIVE_STATE_LABELS).map(
73
+ ([value, label]) => ({
74
+ value,
75
+ label
76
+ })
77
+ );
78
+ }
79
+ function BlockStatesControl({ name, value, onChange }) {
80
+ const viewportStateOptions = getViewportStateOptions(name);
81
+ const pseudoStateOptions = getPseudoStateOptions(name);
82
+ const dropdownMenuProps = (0, import_utils.useToolsPanelDropdownMenuProps)();
83
+ if (!viewportStateOptions.length && !pseudoStateOptions.length) {
84
+ return null;
85
+ }
86
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
87
+ import_state_control.default,
88
+ {
89
+ viewportStates: viewportStateOptions,
90
+ pseudoStates: pseudoStateOptions,
91
+ viewportValue: value?.viewport ?? DEFAULT_STATE_VALUE,
92
+ pseudoStateValue: value?.pseudo ?? DEFAULT_STATE_VALUE,
93
+ onChangeViewport: (viewport) => onChange({ viewport }),
94
+ onChangePseudoState: (pseudo) => onChange({ pseudo }),
95
+ popoverProps: dropdownMenuProps.popoverProps,
96
+ showText: false
97
+ }
98
+ );
99
+ }
100
+ function BlockStateBadges({ name, value }) {
101
+ const viewportStateOptions = getViewportStateOptions(name);
102
+ const pseudoStateOptions = getPseudoStateOptions(name);
103
+ if (!viewportStateOptions.length && !pseudoStateOptions.length) {
104
+ return null;
105
+ }
106
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
107
+ import_state_control_badges.default,
108
+ {
109
+ viewportStates: viewportStateOptions,
110
+ pseudoStates: pseudoStateOptions,
111
+ viewportValue: value?.viewport ?? DEFAULT_STATE_VALUE,
112
+ pseudoStateValue: value?.pseudo ?? DEFAULT_STATE_VALUE
113
+ }
114
+ );
115
+ }
116
+ // Annotate the CommonJS export names for ESM import in node:
117
+ 0 && (module.exports = {
118
+ BlockStateBadges,
119
+ BlockStatesControl,
120
+ PSEUDO_STATE_LABELS,
121
+ RESPONSIVE_STATE_LABELS,
122
+ VALID_BLOCK_PSEUDO_STATES
123
+ });
124
+ //# sourceMappingURL=states.cjs.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/hooks/states.js"],
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { getBlockType } from '@wordpress/blocks';\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport StateControl from '../components/global-styles/state-control';\nimport StateControlBadges from '../components/global-styles/state-control-badges';\nimport { useToolsPanelDropdownMenuProps } from '../components/global-styles/utils';\n\nexport const PSEUDO_STATE_LABELS = {\n\t':hover': __( 'Hover' ),\n\t':focus': __( 'Focus' ),\n\t':focus-visible': __( 'Focus-visible' ),\n\t':active': __( 'Active' ),\n};\n\nexport const RESPONSIVE_STATE_LABELS = {\n\ttablet: __( 'Tablet' ),\n\tmobile: __( 'Mobile' ),\n};\n\n// Keep in sync with WP_Theme_JSON_Gutenberg::VALID_BLOCK_PSEUDO_SELECTORS\n// and packages/global-styles-engine/src/core/render.tsx.\nexport const VALID_BLOCK_PSEUDO_STATES = {\n\t'core/button': [ ':hover', ':focus', ':focus-visible', ':active' ],\n\t'core/navigation-link': [ ':hover', ':focus', ':focus-visible', ':active' ],\n};\n\nfunction getPseudoStateOptions( name ) {\n\tconst validStates = VALID_BLOCK_PSEUDO_STATES[ name ] ?? [];\n\n\treturn validStates\n\t\t.filter( ( state ) => PSEUDO_STATE_LABELS[ state ] )\n\t\t.map( ( state ) => ( {\n\t\t\tvalue: state,\n\t\t\tlabel: PSEUDO_STATE_LABELS[ state ],\n\t\t} ) );\n}\n\nconst DEFAULT_STATE_VALUE = 'default';\n\nfunction getViewportStateOptions( name ) {\n\tif ( ! getBlockType( name )?.attributes?.style ) {\n\t\treturn [];\n\t}\n\n\treturn Object.entries( RESPONSIVE_STATE_LABELS ).map(\n\t\t( [ value, label ] ) => ( {\n\t\t\tvalue,\n\t\t\tlabel,\n\t\t} )\n\t);\n}\n\n/**\n * Renders a style-state selector in the block card header.\n * Viewport states are shown for blocks with a style attribute, while\n * pseudo-states are shown for blocks with configured pseudo-state support.\n *\n * @param {Object} props Component props.\n * @param {string} props.name Block name.\n * @param {Object} props.value Currently selected style-state value.\n * @param {Function} props.onChange Callback when style-state selection changes.\n * @return {Element|null} State control component, or null if not applicable.\n */\nexport function BlockStatesControl( { name, value, onChange } ) {\n\tconst viewportStateOptions = getViewportStateOptions( name );\n\tconst pseudoStateOptions = getPseudoStateOptions( name );\n\tconst dropdownMenuProps = useToolsPanelDropdownMenuProps();\n\n\tif ( ! viewportStateOptions.length && ! pseudoStateOptions.length ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<StateControl\n\t\t\tviewportStates={ viewportStateOptions }\n\t\t\tpseudoStates={ pseudoStateOptions }\n\t\t\tviewportValue={ value?.viewport ?? DEFAULT_STATE_VALUE }\n\t\t\tpseudoStateValue={ value?.pseudo ?? DEFAULT_STATE_VALUE }\n\t\t\tonChangeViewport={ ( viewport ) => onChange( { viewport } ) }\n\t\t\tonChangePseudoState={ ( pseudo ) => onChange( { pseudo } ) }\n\t\t\tpopoverProps={ dropdownMenuProps.popoverProps }\n\t\t\tshowText={ false }\n\t\t/>\n\t);\n}\n\nexport function BlockStateBadges( { name, value } ) {\n\tconst viewportStateOptions = getViewportStateOptions( name );\n\tconst pseudoStateOptions = getPseudoStateOptions( name );\n\n\tif ( ! viewportStateOptions.length && ! pseudoStateOptions.length ) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<StateControlBadges\n\t\t\tviewportStates={ viewportStateOptions }\n\t\t\tpseudoStates={ pseudoStateOptions }\n\t\t\tviewportValue={ value?.viewport ?? DEFAULT_STATE_VALUE }\n\t\t\tpseudoStateValue={ value?.pseudo ?? DEFAULT_STATE_VALUE }\n\t\t/>\n\t);\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,oBAA6B;AAC7B,kBAAmB;AAKnB,2BAAyB;AACzB,kCAA+B;AAC/B,mBAA+C;AAoE7C;AAlEK,IAAM,sBAAsB;AAAA,EAClC,cAAU,gBAAI,OAAQ;AAAA,EACtB,cAAU,gBAAI,OAAQ;AAAA,EACtB,sBAAkB,gBAAI,eAAgB;AAAA,EACtC,eAAW,gBAAI,QAAS;AACzB;AAEO,IAAM,0BAA0B;AAAA,EACtC,YAAQ,gBAAI,QAAS;AAAA,EACrB,YAAQ,gBAAI,QAAS;AACtB;AAIO,IAAM,4BAA4B;AAAA,EACxC,eAAe,CAAE,UAAU,UAAU,kBAAkB,SAAU;AAAA,EACjE,wBAAwB,CAAE,UAAU,UAAU,kBAAkB,SAAU;AAC3E;AAEA,SAAS,sBAAuB,MAAO;AACtC,QAAM,cAAc,0BAA2B,IAAK,KAAK,CAAC;AAE1D,SAAO,YACL,OAAQ,CAAE,UAAW,oBAAqB,KAAM,CAAE,EAClD,IAAK,CAAE,WAAa;AAAA,IACpB,OAAO;AAAA,IACP,OAAO,oBAAqB,KAAM;AAAA,EACnC,EAAI;AACN;AAEA,IAAM,sBAAsB;AAE5B,SAAS,wBAAyB,MAAO;AACxC,MAAK,KAAE,4BAAc,IAAK,GAAG,YAAY,OAAQ;AAChD,WAAO,CAAC;AAAA,EACT;AAEA,SAAO,OAAO,QAAS,uBAAwB,EAAE;AAAA,IAChD,CAAE,CAAE,OAAO,KAAM,OAAS;AAAA,MACzB;AAAA,MACA;AAAA,IACD;AAAA,EACD;AACD;AAaO,SAAS,mBAAoB,EAAE,MAAM,OAAO,SAAS,GAAI;AAC/D,QAAM,uBAAuB,wBAAyB,IAAK;AAC3D,QAAM,qBAAqB,sBAAuB,IAAK;AACvD,QAAM,wBAAoB,6CAA+B;AAEzD,MAAK,CAAE,qBAAqB,UAAU,CAAE,mBAAmB,QAAS;AACnE,WAAO;AAAA,EACR;AAEA,SACC;AAAA,IAAC,qBAAAA;AAAA,IAAA;AAAA,MACA,gBAAiB;AAAA,MACjB,cAAe;AAAA,MACf,eAAgB,OAAO,YAAY;AAAA,MACnC,kBAAmB,OAAO,UAAU;AAAA,MACpC,kBAAmB,CAAE,aAAc,SAAU,EAAE,SAAS,CAAE;AAAA,MAC1D,qBAAsB,CAAE,WAAY,SAAU,EAAE,OAAO,CAAE;AAAA,MACzD,cAAe,kBAAkB;AAAA,MACjC,UAAW;AAAA;AAAA,EACZ;AAEF;AAEO,SAAS,iBAAkB,EAAE,MAAM,MAAM,GAAI;AACnD,QAAM,uBAAuB,wBAAyB,IAAK;AAC3D,QAAM,qBAAqB,sBAAuB,IAAK;AAEvD,MAAK,CAAE,qBAAqB,UAAU,CAAE,mBAAmB,QAAS;AACnE,WAAO;AAAA,EACR;AAEA,SACC;AAAA,IAAC,4BAAAC;AAAA,IAAA;AAAA,MACA,gBAAiB;AAAA,MACjB,cAAe;AAAA,MACf,eAAgB,OAAO,YAAY;AAAA,MACnC,kBAAmB,OAAO,UAAU;AAAA;AAAA,EACrC;AAEF;",
6
+ "names": ["StateControl", "StateControlBadges"]
7
+ }
@@ -22,12 +22,18 @@ var style_exports = {};
22
22
  __export(style_exports, {
23
23
  addSaveProps: () => addSaveProps,
24
24
  default: () => style_default,
25
+ getBlockStateStylesCSS: () => getBlockStateStylesCSS,
26
+ getCanvasStateStyleValue: () => getCanvasStateStyleValue,
25
27
  getInlineStyles: () => getInlineStyles,
28
+ getResponsiveStateCSSRules: () => getResponsiveStateCSSRules,
29
+ getStateStylesCSS: () => getStateStylesCSS,
26
30
  omitStyle: () => omitStyle
27
31
  });
28
32
  module.exports = __toCommonJS(style_exports);
29
33
  var import_element = require("@wordpress/element");
30
34
  var import_hooks = require("@wordpress/hooks");
35
+ var import_data = require("@wordpress/data");
36
+ var import_global_styles_engine = require("@wordpress/global-styles-engine");
31
37
  var import_blocks = require("@wordpress/blocks");
32
38
  var import_compose = require("@wordpress/compose");
33
39
  var import_style_engine = require("@wordpress/style-engine");
@@ -37,9 +43,20 @@ var import_color = require("./color.cjs");
37
43
  var import_typography = require("./typography.cjs");
38
44
  var import_dimensions = require("./dimensions.cjs");
39
45
  var import_utils = require("./utils.cjs");
46
+ var import_block_style_state = require("./block-style-state.cjs");
47
+ var import_states = require("./states.cjs");
48
+ var import_state_utils = require("./state-utils.cjs");
40
49
  var import_utils2 = require("../components/global-styles/utils.cjs");
41
50
  var import_block_editing_mode = require("../components/block-editing-mode/index.cjs");
51
+ var import_store = require("../store/index.cjs");
52
+ var import_private_keys = require("../store/private-keys.cjs");
53
+ var import_lock_unlock = require("../lock-unlock.cjs");
42
54
  var import_jsx_runtime = require("react/jsx-runtime");
55
+ var BORDER_SIDES = ["Top", "Right", "Bottom", "Left"];
56
+ var RESPONSIVE_BREAKPOINTS = {
57
+ mobile: "@media (width <= 480px)",
58
+ tablet: "@media (480px < width <= 782px)"
59
+ };
43
60
  var styleSupportKeys = [
44
61
  ...import_typography.TYPOGRAPHY_SUPPORT_KEYS,
45
62
  import_border.BORDER_SUPPORT_KEY,
@@ -57,6 +74,200 @@ function getInlineStyles(styles = {}) {
57
74
  });
58
75
  return output;
59
76
  }
77
+ function getStateFallbackBorderStyles(stateStyles) {
78
+ const border = stateStyles?.border;
79
+ if (!border) {
80
+ return void 0;
81
+ }
82
+ const hasBorderStyle = !!border.style;
83
+ const hasBorderColor = !!border.color;
84
+ const hasBorderWidth = !!border.width;
85
+ const fallbackBorder = {};
86
+ if (!hasBorderStyle && (hasBorderColor || hasBorderWidth)) {
87
+ fallbackBorder.style = "solid";
88
+ }
89
+ BORDER_SIDES.forEach((side) => {
90
+ const sideKey = side.toLowerCase();
91
+ const sideBorder = border[sideKey];
92
+ const hasSideStyle = !!sideBorder?.style;
93
+ const hasSideColor = !!sideBorder?.color;
94
+ const hasSideWidth = !!sideBorder?.width;
95
+ if (!hasBorderStyle && !hasSideStyle && (hasSideColor || hasSideWidth)) {
96
+ fallbackBorder[sideKey] = { style: "solid" };
97
+ }
98
+ });
99
+ return (0, import_utils.cleanEmptyObject)({ border: (0, import_utils.cleanEmptyObject)(fallbackBorder) });
100
+ }
101
+ function getStateStylesCSS(stateStyles, selector) {
102
+ const css = (0, import_style_engine.compileCSS)(stateStyles, { selector });
103
+ const importantCSS = css ? css.replace(/;/g, " !important;") : void 0;
104
+ const fallbackBorderStyles = getStateFallbackBorderStyles(stateStyles);
105
+ const fallbackCSS = fallbackBorderStyles ? (0, import_style_engine.compileCSS)(fallbackBorderStyles, { selector }) : void 0;
106
+ return [importantCSS, fallbackCSS].filter(Boolean).join("\n");
107
+ }
108
+ function isPlainObject(value) {
109
+ return !!value && typeof value === "object" && !Array.isArray(value);
110
+ }
111
+ function mergeStyleObjects(target = {}, source = {}) {
112
+ const merged = { ...target };
113
+ Object.entries(source).forEach(([key, value]) => {
114
+ merged[key] = isPlainObject(value) && isPlainObject(merged[key]) ? mergeStyleObjects(merged[key], value) : value;
115
+ });
116
+ return merged;
117
+ }
118
+ function addStyleGroup(groups, selector, style) {
119
+ const key = selector || "";
120
+ const existing = groups.get(key) || { selector, style: {} };
121
+ groups.set(key, {
122
+ selector,
123
+ style: mergeStyleObjects(existing.style, style)
124
+ });
125
+ }
126
+ function getStateStyleGroups(stateStyles, name) {
127
+ const blockSelectors = (0, import_blocks.getBlockType)(name)?.selectors || {};
128
+ const groups = /* @__PURE__ */ new Map();
129
+ Object.entries(stateStyles || {}).forEach(
130
+ ([feature, featureStyles]) => {
131
+ const featureSelectors = blockSelectors[feature];
132
+ if (typeof featureSelectors === "string") {
133
+ addStyleGroup(groups, featureSelectors, {
134
+ [feature]: featureStyles
135
+ });
136
+ return;
137
+ }
138
+ if (isPlainObject(featureSelectors) && isPlainObject(featureStyles)) {
139
+ const remainingStyles = { ...featureStyles };
140
+ Object.entries(featureSelectors).forEach(
141
+ ([subfeature, subfeatureSelector]) => {
142
+ if (subfeature === "root" || typeof subfeatureSelector !== "string" || !Object.hasOwn(featureStyles, subfeature)) {
143
+ return;
144
+ }
145
+ addStyleGroup(groups, subfeatureSelector, {
146
+ [feature]: {
147
+ [subfeature]: featureStyles[subfeature]
148
+ }
149
+ });
150
+ delete remainingStyles[subfeature];
151
+ }
152
+ );
153
+ if (Object.keys(remainingStyles).length) {
154
+ addStyleGroup(
155
+ groups,
156
+ featureSelectors.root || blockSelectors.root,
157
+ {
158
+ [feature]: remainingStyles
159
+ }
160
+ );
161
+ }
162
+ return;
163
+ }
164
+ addStyleGroup(groups, blockSelectors.root, {
165
+ [feature]: featureStyles
166
+ });
167
+ }
168
+ );
169
+ return Array.from(groups.values());
170
+ }
171
+ function getBlockStateStylesCSS(stateStyles, options) {
172
+ const { name, baseSelector, state = "" } = options;
173
+ const rules = getStateStyleGroups(stateStyles, name).map(
174
+ ({ selector: blockSelector, style }) => getStateStylesCSS(
175
+ style,
176
+ (0, import_state_utils.buildScopedBlockSelector)(baseSelector, blockSelector, state)
177
+ )
178
+ ).filter(Boolean);
179
+ return rules.length ? rules.join("\n") : void 0;
180
+ }
181
+ function getRootStateStyles(stateStyles, nestedKeys) {
182
+ if (!stateStyles) {
183
+ return stateStyles;
184
+ }
185
+ const rootStyles = { ...stateStyles };
186
+ nestedKeys.forEach((key) => {
187
+ delete rootStyles[key];
188
+ });
189
+ return rootStyles;
190
+ }
191
+ function getPseudoStateCSSRules(style, name, baseSelector) {
192
+ const validPseudoStates = import_states.VALID_BLOCK_PSEUDO_STATES[name];
193
+ if (!validPseudoStates) {
194
+ return [];
195
+ }
196
+ const cssRules = [];
197
+ validPseudoStates.forEach((pseudoState) => {
198
+ const stateStyles = style?.[pseudoState];
199
+ if (stateStyles) {
200
+ const css = getBlockStateStylesCSS(stateStyles, {
201
+ name,
202
+ baseSelector,
203
+ state: pseudoState
204
+ });
205
+ if (css) {
206
+ cssRules.push(css);
207
+ }
208
+ }
209
+ });
210
+ return cssRules;
211
+ }
212
+ function getResponsiveStateCSSRules(style, name, baseSelector) {
213
+ const cssRules = [];
214
+ const validPseudoStates = import_states.VALID_BLOCK_PSEUDO_STATES[name] ?? [];
215
+ const nestedStateKeys = ["elements", ...validPseudoStates];
216
+ Object.entries(RESPONSIVE_BREAKPOINTS).forEach(
217
+ ([viewport, mediaQuery]) => {
218
+ const viewportStyles = style?.[viewport];
219
+ if (!viewportStyles) {
220
+ return;
221
+ }
222
+ const viewportCSSRules = [];
223
+ const rootCSS = getBlockStateStylesCSS(
224
+ getRootStateStyles(viewportStyles, nestedStateKeys),
225
+ {
226
+ name,
227
+ baseSelector
228
+ }
229
+ );
230
+ if (rootCSS) {
231
+ viewportCSSRules.push(rootCSS);
232
+ }
233
+ const elementCSS = getElementCSSRules(
234
+ viewportStyles.elements,
235
+ name,
236
+ baseSelector
237
+ );
238
+ if (elementCSS) {
239
+ viewportCSSRules.push(elementCSS);
240
+ }
241
+ viewportCSSRules.push(
242
+ ...getPseudoStateCSSRules(viewportStyles, name, baseSelector)
243
+ );
244
+ if (viewportCSSRules.length) {
245
+ cssRules.push(
246
+ `${mediaQuery}{${viewportCSSRules.join("")}}`
247
+ );
248
+ }
249
+ }
250
+ );
251
+ return cssRules;
252
+ }
253
+ function getCanvasStateStyleValue(style, selectedState) {
254
+ const stateValue = (0, import_block_style_state.getStyleForState)(style, selectedState);
255
+ if (!(0, import_block_style_state.hasViewportBlockStyleState)(selectedState)) {
256
+ return stateValue;
257
+ }
258
+ const defaultViewportState = {
259
+ ...selectedState,
260
+ viewport: import_block_style_state.DEFAULT_BLOCK_STYLE_STATE.viewport
261
+ };
262
+ const defaultViewportStateValue = (0, import_block_style_state.getStyleForState)(
263
+ style,
264
+ defaultViewportState
265
+ );
266
+ if (defaultViewportStateValue && stateValue) {
267
+ return (0, import_global_styles_engine.mergeGlobalStyles)(defaultViewportStateValue, stateValue);
268
+ }
269
+ return stateValue || defaultViewportStateValue;
270
+ }
60
271
  function addAttribute(settings) {
61
272
  if (!hasStyleSupport(settings) && !(0, import_blocks.hasBlockSupport)(settings, "customCSS", true)) {
62
273
  return settings;
@@ -153,28 +364,86 @@ function BlockStyleControls({
153
364
  clientId,
154
365
  name,
155
366
  setAttributes,
367
+ style,
156
368
  __unstableParentLayout
157
369
  }) {
158
370
  const settings = (0, import_utils.useBlockSettings)(name, __unstableParentLayout);
159
371
  const blockEditingMode = (0, import_block_editing_mode.useBlockEditingMode)();
372
+ const { globalBlockStyles, selectedState, showStateOnCanvas } = (0, import_data.useSelect)(
373
+ (select) => {
374
+ const blockEditorSelect = select(import_store.store);
375
+ const {
376
+ getSelectedBlockStyleState,
377
+ isSelectedBlockStyleStateShownOnCanvas
378
+ } = (0, import_lock_unlock.unlock)(blockEditorSelect);
379
+ const editorSettings = blockEditorSelect.getSettings();
380
+ return {
381
+ globalBlockStyles: editorSettings?.[import_private_keys.globalStylesDataKey]?.blocks?.[name],
382
+ selectedState: getSelectedBlockStyleState(clientId),
383
+ showStateOnCanvas: isSelectedBlockStyleStateShownOnCanvas(clientId)
384
+ };
385
+ },
386
+ [clientId, name]
387
+ );
388
+ const isPseudoSelectorState = (0, import_block_style_state.hasPseudoBlockStyleState)(selectedState);
389
+ const canvasStateCSS = (0, import_element.useMemo)(() => {
390
+ if (!showStateOnCanvas || !isPseudoSelectorState) {
391
+ return void 0;
392
+ }
393
+ const globalStateValue = getCanvasStateStyleValue(
394
+ globalBlockStyles,
395
+ selectedState
396
+ );
397
+ const instanceStateValue = getCanvasStateStyleValue(
398
+ style,
399
+ selectedState
400
+ );
401
+ let stateValue;
402
+ if (globalStateValue && instanceStateValue) {
403
+ stateValue = (0, import_global_styles_engine.mergeGlobalStyles)(
404
+ globalStateValue,
405
+ instanceStateValue
406
+ );
407
+ } else if (instanceStateValue) {
408
+ stateValue = instanceStateValue;
409
+ } else if (globalStateValue) {
410
+ stateValue = globalStateValue;
411
+ } else {
412
+ return void 0;
413
+ }
414
+ return getBlockStateStylesCSS(stateValue, {
415
+ name,
416
+ baseSelector: `[data-block="${clientId}"]`
417
+ });
418
+ }, [
419
+ showStateOnCanvas,
420
+ isPseudoSelectorState,
421
+ globalBlockStyles,
422
+ style,
423
+ selectedState,
424
+ clientId,
425
+ name
426
+ ]);
427
+ (0, import_utils.useStyleOverride)({ css: canvasStateCSS });
428
+ if (blockEditingMode !== "default") {
429
+ return null;
430
+ }
431
+ const panelSettings = {
432
+ ...settings,
433
+ typography: {
434
+ ...settings.typography,
435
+ // The text alignment UI for individual blocks is rendered in
436
+ // the block toolbar, so disable it here.
437
+ textAlign: false
438
+ }
439
+ };
160
440
  const passedProps = {
161
441
  clientId,
162
442
  name,
163
443
  setAttributes,
164
- settings: {
165
- ...settings,
166
- typography: {
167
- ...settings.typography,
168
- // The text alignment UI for individual blocks is rendered in
169
- // the block toolbar, so disable it here.
170
- textAlign: false
171
- }
172
- }
444
+ settings: panelSettings
173
445
  };
174
- if (blockEditingMode !== "default") {
175
- return null;
176
- }
177
- return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
446
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_block_style_state.BlockStyleStateProvider, { value: selectedState, children: [
178
447
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_color.ColorEdit, { ...passedProps }),
179
448
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_background.BackgroundImagePanel, { ...passedProps }),
180
449
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_typography.TypographyPanel, { ...passedProps }),
@@ -258,10 +527,24 @@ function useBlockProps({ name, style }) {
258
527
  );
259
528
  const baseElementSelector = `.${blockElementsContainerIdentifier}`;
260
529
  const blockElementStyles = style?.elements;
261
- const styles = (0, import_element.useMemo)(
262
- () => getElementCSSRules(blockElementStyles, name, baseElementSelector),
263
- [baseElementSelector, blockElementStyles, name]
264
- );
530
+ const styles = (0, import_element.useMemo)(() => {
531
+ const cssRules = [];
532
+ const elementCSS = getElementCSSRules(
533
+ blockElementStyles,
534
+ name,
535
+ baseElementSelector
536
+ );
537
+ if (elementCSS) {
538
+ cssRules.push(elementCSS);
539
+ }
540
+ cssRules.push(
541
+ ...getPseudoStateCSSRules(style, name, baseElementSelector)
542
+ );
543
+ cssRules.push(
544
+ ...getResponsiveStateCSSRules(style, name, baseElementSelector)
545
+ );
546
+ return cssRules.length > 0 ? cssRules.join("") : void 0;
547
+ }, [baseElementSelector, blockElementStyles, name, style]);
265
548
  (0, import_utils.useStyleOverride)({ css: styles });
266
549
  return addSaveProps(
267
550
  { className: blockElementsContainerIdentifier },
@@ -278,7 +561,11 @@ function useBlockProps({ name, style }) {
278
561
  // Annotate the CommonJS export names for ESM import in node:
279
562
  0 && (module.exports = {
280
563
  addSaveProps,
564
+ getBlockStateStylesCSS,
565
+ getCanvasStateStyleValue,
281
566
  getInlineStyles,
567
+ getResponsiveStateCSSRules,
568
+ getStateStylesCSS,
282
569
  omitStyle
283
570
  });
284
571
  //# sourceMappingURL=style.cjs.map