@wordpress/block-editor 17.1.0 → 17.2.1-next.v.202609171837.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 (541) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +214 -214
  3. package/build/autocompleters/block.cjs.map +2 -2
  4. package/build/components/alignment-control/ui.cjs.map +2 -2
  5. package/build/components/background-image-control/index.cjs +1 -1
  6. package/build/components/background-image-control/index.cjs.map +2 -2
  7. package/build/components/block-alignment-control/ui.cjs +21 -7
  8. package/build/components/block-alignment-control/ui.cjs.map +3 -3
  9. package/build/components/block-alignment-control/use-available-alignments.cjs +60 -13
  10. package/build/components/block-alignment-control/use-available-alignments.cjs.map +2 -2
  11. package/build/components/block-allowed-blocks/allowed-blocks-control.cjs.map +2 -2
  12. package/build/components/block-bindings/attribute-control.cjs +30 -30
  13. package/build/components/block-bindings/attribute-control.cjs.map +3 -3
  14. package/build/components/block-bindings/source-fields-list.cjs +27 -32
  15. package/build/components/block-bindings/source-fields-list.cjs.map +3 -3
  16. package/build/components/block-canvas/index.cjs.map +2 -2
  17. package/build/components/block-card/index.cjs +1 -2
  18. package/build/components/block-card/index.cjs.map +3 -3
  19. package/build/components/block-edit/edit.cjs.map +2 -2
  20. package/build/components/block-heading-level-dropdown/index.cjs.map +2 -2
  21. package/build/components/block-icon/index.cjs.map +2 -2
  22. package/build/components/block-inspector/edit-contents.cjs.map +2 -2
  23. package/build/components/block-inspector/index.cjs +27 -8
  24. package/build/components/block-inspector/index.cjs.map +3 -3
  25. package/build/components/block-keyboard-shortcuts/index.cjs.map +2 -2
  26. package/build/components/block-list/block-html.cjs +1 -12
  27. package/build/components/block-list/block-html.cjs.map +3 -3
  28. package/build/components/block-list/block.cjs +2 -4
  29. package/build/components/block-list/block.cjs.map +2 -2
  30. package/build/components/block-list/layout.cjs +1 -1
  31. package/build/components/block-list/layout.cjs.map +2 -2
  32. package/build/components/block-list/use-block-props/index.cjs.map +2 -2
  33. package/build/components/block-lock/modal.cjs +1 -3
  34. package/build/components/block-lock/modal.cjs.map +2 -2
  35. package/build/components/block-parent-selector/index.cjs +8 -5
  36. package/build/components/block-parent-selector/index.cjs.map +2 -2
  37. package/build/components/block-popover/index.cjs.map +2 -2
  38. package/build/components/block-rename/modal.cjs.map +2 -2
  39. package/build/components/block-settings-menu/block-settings-dropdown.cjs.map +2 -2
  40. package/build/components/block-styles/utils.cjs.map +2 -2
  41. package/build/components/block-switcher/index.cjs.map +2 -2
  42. package/build/components/block-toolbar/edit-section-button.cjs.map +2 -2
  43. package/build/components/block-toolbar/index.cjs +6 -4
  44. package/build/components/block-toolbar/index.cjs.map +2 -2
  45. package/build/components/block-toolbar/switch-section-style.cjs.map +2 -2
  46. package/build/components/block-variation-transforms/index.cjs +28 -18
  47. package/build/components/block-variation-transforms/index.cjs.map +3 -3
  48. package/build/components/block-visibility/modal.cjs.map +2 -2
  49. package/build/components/block-visibility/viewport-visibility-info.cjs.map +2 -2
  50. package/build/components/border-radius-control/index.cjs.map +2 -2
  51. package/build/components/color-palette/with-color-context.cjs.map +2 -2
  52. package/build/components/colors/with-colors.cjs.map +2 -2
  53. package/build/components/colors-gradients/control.cjs.map +2 -2
  54. package/build/components/contrast-checker/index.cjs.map +2 -2
  55. package/build/components/date-format-picker/index.cjs.map +2 -2
  56. package/build/components/dimensions-tool/aspect-ratio-tool.cjs.map +3 -3
  57. package/build/components/dimensions-tool/width-height-tool.cjs.map +2 -2
  58. package/build/components/font-sizes/with-font-sizes.cjs.map +2 -2
  59. package/build/components/global-styles/background-panel.cjs +1 -1
  60. package/build/components/global-styles/background-panel.cjs.map +2 -2
  61. package/build/components/global-styles/border-panel.cjs +1 -1
  62. package/build/components/global-styles/border-panel.cjs.map +2 -2
  63. package/build/components/global-styles/color-gradient-dropdown-item.cjs +1 -1
  64. package/build/components/global-styles/color-gradient-dropdown-item.cjs.map +2 -2
  65. package/build/components/global-styles/color-panel.cjs +1 -1
  66. package/build/components/global-styles/color-panel.cjs.map +2 -2
  67. package/build/components/global-styles/dimensions-panel.cjs +1 -1
  68. package/build/components/global-styles/dimensions-panel.cjs.map +2 -2
  69. package/build/components/global-styles/filters-panel.cjs +1 -1
  70. package/build/components/global-styles/filters-panel.cjs.map +2 -2
  71. package/build/components/global-styles/hooks.cjs +1 -0
  72. package/build/components/global-styles/hooks.cjs.map +2 -2
  73. package/build/components/global-styles/inheritance/index.cjs +3 -3
  74. package/build/components/global-styles/inheritance/index.cjs.map +2 -2
  75. package/build/components/global-styles/inherited-value-context.cjs +0 -5
  76. package/build/components/global-styles/inherited-value-context.cjs.map +2 -2
  77. package/build/components/global-styles/state-control-badges.cjs +0 -1
  78. package/build/components/global-styles/state-control-badges.cjs.map +2 -2
  79. package/build/components/global-styles/state-control.cjs +6 -4
  80. package/build/components/global-styles/state-control.cjs.map +2 -2
  81. package/build/components/global-styles/text-shadow-panel.cjs +254 -0
  82. package/build/components/global-styles/text-shadow-panel.cjs.map +7 -0
  83. package/build/components/global-styles/typography-panel.cjs +46 -5
  84. package/build/components/global-styles/typography-panel.cjs.map +2 -2
  85. package/build/components/global-styles/typography-utils.cjs.map +2 -2
  86. package/build/components/global-styles/utils.cjs.map +2 -2
  87. package/build/components/html-element-control/index.cjs.map +3 -3
  88. package/build/components/iframe/index.cjs.map +2 -2
  89. package/build/components/iframe/use-scale-canvas.cjs.map +2 -2
  90. package/build/components/image-size-control/index.cjs.map +3 -3
  91. package/build/components/inner-blocks/index.cjs +6 -1
  92. package/build/components/inner-blocks/index.cjs.map +2 -2
  93. package/build/components/inner-content/index.cjs.map +2 -2
  94. package/build/components/inserter/block-patterns-tab/use-pattern-categories.cjs +4 -23
  95. package/build/components/inserter/block-patterns-tab/use-pattern-categories.cjs.map +2 -2
  96. package/build/components/inserter/block-patterns-tab/utils.cjs +26 -0
  97. package/build/components/inserter/block-patterns-tab/utils.cjs.map +2 -2
  98. package/build/components/inserter/hooks/use-block-types-state.cjs.map +2 -2
  99. package/build/components/inserter/hooks/use-insertion-point.cjs.map +2 -2
  100. package/build/components/inserter/hooks/use-patterns-state.cjs.map +2 -2
  101. package/build/components/inserter/media-tab/media-panel.cjs.map +2 -2
  102. package/build/components/inserter/media-tab/media-preview.cjs.map +2 -2
  103. package/build/components/inserter-list-item/index.cjs.map +2 -2
  104. package/build/components/inspector-controls/list-view-content-popover.cjs.map +2 -2
  105. package/build/components/link-control/search-results.cjs.map +2 -2
  106. package/build/components/link-control/use-search-handler.cjs +3 -0
  107. package/build/components/link-control/use-search-handler.cjs.map +2 -2
  108. package/build/components/list-view/branch.cjs.map +2 -2
  109. package/build/components/list-view/drop-indicator.cjs.map +2 -2
  110. package/build/components/list-view/index.cjs.map +2 -2
  111. package/build/components/list-view/use-list-view-drop-zone.cjs.map +2 -2
  112. package/build/components/list-view/utils.cjs.map +2 -2
  113. package/build/components/media-replace-flow/index.cjs +4 -1
  114. package/build/components/media-replace-flow/index.cjs.map +2 -2
  115. package/build/components/plain-text/index.cjs +1 -2
  116. package/build/components/plain-text/index.cjs.map +3 -3
  117. package/build/components/preset-input-control/index.cjs.map +2 -2
  118. package/build/components/provider/index.cjs +3 -1
  119. package/build/components/provider/index.cjs.map +2 -2
  120. package/build/components/provider/use-block-sync.cjs.map +2 -2
  121. package/build/components/publish-date-time-picker/index.cjs.map +2 -2
  122. package/build/components/resizable-box-popover/index.cjs +1 -1
  123. package/build/components/resizable-box-popover/index.cjs.map +1 -1
  124. package/build/components/resolution-tool/index.cjs.map +3 -3
  125. package/build/components/rich-text/event-listeners/enter.cjs +8 -22
  126. package/build/components/rich-text/event-listeners/enter.cjs.map +2 -2
  127. package/build/components/rich-text/format-edit.cjs.map +2 -2
  128. package/build/components/rich-text/index.cjs +20 -0
  129. package/build/components/rich-text/index.cjs.map +2 -2
  130. package/build/components/rich-text/multiline.cjs +10 -2
  131. package/build/components/rich-text/multiline.cjs.map +2 -2
  132. package/build/components/spacing-sizes-control/hooks/use-spacing-sizes.cjs.map +2 -2
  133. package/build/components/typewriter/index.cjs.map +2 -2
  134. package/build/components/use-block-commands/index.cjs.map +2 -2
  135. package/build/components/writing-flow/index.cjs +3 -0
  136. package/build/components/writing-flow/index.cjs.map +2 -2
  137. package/build/components/writing-flow/use-clipboard-handler.cjs.map +2 -2
  138. package/build/components/writing-flow/use-selection-observer.cjs +5 -3
  139. package/build/components/writing-flow/use-selection-observer.cjs.map +2 -2
  140. package/build/hooks/align.cjs +3 -5
  141. package/build/hooks/align.cjs.map +2 -2
  142. package/build/hooks/background.cjs.map +2 -2
  143. package/build/hooks/block-bindings.cjs.map +2 -2
  144. package/build/hooks/border.cjs.map +2 -2
  145. package/build/hooks/contrast-checker.cjs.map +2 -2
  146. package/build/hooks/dimensions.cjs.map +2 -2
  147. package/build/hooks/duotone.cjs.map +2 -2
  148. package/build/hooks/elements.cjs.map +2 -2
  149. package/build/hooks/fit-text.cjs.map +2 -2
  150. package/build/hooks/gap.cjs +2 -1
  151. package/build/hooks/gap.cjs.map +3 -3
  152. package/build/hooks/index.cjs +4 -2
  153. package/build/hooks/index.cjs.map +3 -3
  154. package/build/hooks/layout-child.cjs.map +2 -2
  155. package/build/hooks/layout.cjs +15 -14
  156. package/build/hooks/layout.cjs.map +3 -3
  157. package/build/hooks/position.cjs +3 -31
  158. package/build/hooks/position.cjs.map +2 -2
  159. package/build/hooks/states.cjs +3 -2
  160. package/build/hooks/states.cjs.map +2 -2
  161. package/build/hooks/text-shadow.cjs +100 -0
  162. package/build/hooks/text-shadow.cjs.map +7 -0
  163. package/build/hooks/typography.cjs +30 -6
  164. package/build/hooks/typography.cjs.map +2 -2
  165. package/build/hooks/utils.cjs +24 -2
  166. package/build/hooks/utils.cjs.map +2 -2
  167. package/build/layouts/grid.cjs.map +2 -2
  168. package/build/layouts/utils.cjs +7 -2
  169. package/build/layouts/utils.cjs.map +2 -2
  170. package/build/private-apis.cjs +9 -6
  171. package/build/private-apis.cjs.map +2 -2
  172. package/build/store/actions.cjs +26 -4
  173. package/build/store/actions.cjs.map +3 -3
  174. package/build/store/private-selectors.cjs.map +2 -2
  175. package/build/store/reducer.cjs.map +2 -2
  176. package/build/store/selectors.cjs.map +2 -2
  177. package/build/utils/get-font-styles-and-weights.cjs.map +2 -2
  178. package/build/utils/transform-styles/index.cjs.map +1 -1
  179. package/build-module/autocompleters/block.mjs.map +2 -2
  180. package/build-module/components/alignment-control/ui.mjs.map +2 -2
  181. package/build-module/components/background-image-control/index.mjs +2 -2
  182. package/build-module/components/background-image-control/index.mjs.map +2 -2
  183. package/build-module/components/block-alignment-control/ui.mjs +21 -7
  184. package/build-module/components/block-alignment-control/ui.mjs.map +2 -2
  185. package/build-module/components/block-alignment-control/use-available-alignments.mjs +56 -13
  186. package/build-module/components/block-alignment-control/use-available-alignments.mjs.map +2 -2
  187. package/build-module/components/block-allowed-blocks/allowed-blocks-control.mjs.map +2 -2
  188. package/build-module/components/block-bindings/attribute-control.mjs +31 -32
  189. package/build-module/components/block-bindings/attribute-control.mjs.map +2 -2
  190. package/build-module/components/block-bindings/source-fields-list.mjs +25 -30
  191. package/build-module/components/block-bindings/source-fields-list.mjs.map +2 -2
  192. package/build-module/components/block-canvas/index.mjs.map +2 -2
  193. package/build-module/components/block-card/index.mjs +3 -8
  194. package/build-module/components/block-card/index.mjs.map +2 -2
  195. package/build-module/components/block-edit/edit.mjs.map +2 -2
  196. package/build-module/components/block-heading-level-dropdown/index.mjs.map +2 -2
  197. package/build-module/components/block-icon/index.mjs.map +2 -2
  198. package/build-module/components/block-inspector/edit-contents.mjs.map +2 -2
  199. package/build-module/components/block-inspector/index.mjs +29 -10
  200. package/build-module/components/block-inspector/index.mjs.map +2 -2
  201. package/build-module/components/block-keyboard-shortcuts/index.mjs.map +2 -2
  202. package/build-module/components/block-list/block-html.mjs +1 -2
  203. package/build-module/components/block-list/block-html.mjs.map +2 -2
  204. package/build-module/components/block-list/block.mjs +2 -4
  205. package/build-module/components/block-list/block.mjs.map +2 -2
  206. package/build-module/components/block-list/layout.mjs +1 -1
  207. package/build-module/components/block-list/layout.mjs.map +2 -2
  208. package/build-module/components/block-list/use-block-props/index.mjs.map +2 -2
  209. package/build-module/components/block-lock/modal.mjs +1 -3
  210. package/build-module/components/block-lock/modal.mjs.map +2 -2
  211. package/build-module/components/block-parent-selector/index.mjs +8 -5
  212. package/build-module/components/block-parent-selector/index.mjs.map +2 -2
  213. package/build-module/components/block-popover/index.mjs.map +2 -2
  214. package/build-module/components/block-rename/modal.mjs.map +2 -2
  215. package/build-module/components/block-settings-menu/block-settings-dropdown.mjs.map +2 -2
  216. package/build-module/components/block-styles/utils.mjs.map +2 -2
  217. package/build-module/components/block-switcher/index.mjs.map +2 -2
  218. package/build-module/components/block-toolbar/edit-section-button.mjs.map +2 -2
  219. package/build-module/components/block-toolbar/index.mjs +6 -4
  220. package/build-module/components/block-toolbar/index.mjs.map +2 -2
  221. package/build-module/components/block-toolbar/switch-section-style.mjs.map +2 -2
  222. package/build-module/components/block-variation-transforms/index.mjs +30 -21
  223. package/build-module/components/block-variation-transforms/index.mjs.map +2 -2
  224. package/build-module/components/block-visibility/modal.mjs.map +2 -2
  225. package/build-module/components/block-visibility/viewport-visibility-info.mjs.map +2 -2
  226. package/build-module/components/border-radius-control/index.mjs.map +2 -2
  227. package/build-module/components/color-palette/with-color-context.mjs.map +2 -2
  228. package/build-module/components/colors/with-colors.mjs.map +2 -2
  229. package/build-module/components/colors-gradients/control.mjs.map +2 -2
  230. package/build-module/components/contrast-checker/index.mjs.map +2 -2
  231. package/build-module/components/date-format-picker/index.mjs.map +2 -2
  232. package/build-module/components/dimensions-tool/aspect-ratio-tool.mjs +2 -2
  233. package/build-module/components/dimensions-tool/aspect-ratio-tool.mjs.map +2 -2
  234. package/build-module/components/dimensions-tool/width-height-tool.mjs.map +2 -2
  235. package/build-module/components/font-sizes/with-font-sizes.mjs.map +2 -2
  236. package/build-module/components/global-styles/background-panel.mjs +2 -2
  237. package/build-module/components/global-styles/background-panel.mjs.map +2 -2
  238. package/build-module/components/global-styles/border-panel.mjs +2 -2
  239. package/build-module/components/global-styles/border-panel.mjs.map +2 -2
  240. package/build-module/components/global-styles/color-gradient-dropdown-item.mjs +2 -2
  241. package/build-module/components/global-styles/color-gradient-dropdown-item.mjs.map +2 -2
  242. package/build-module/components/global-styles/color-panel.mjs +2 -2
  243. package/build-module/components/global-styles/color-panel.mjs.map +2 -2
  244. package/build-module/components/global-styles/dimensions-panel.mjs +2 -2
  245. package/build-module/components/global-styles/dimensions-panel.mjs.map +2 -2
  246. package/build-module/components/global-styles/filters-panel.mjs +2 -2
  247. package/build-module/components/global-styles/filters-panel.mjs.map +2 -2
  248. package/build-module/components/global-styles/hooks.mjs +1 -0
  249. package/build-module/components/global-styles/hooks.mjs.map +2 -2
  250. package/build-module/components/global-styles/inheritance/index.mjs +2 -2
  251. package/build-module/components/global-styles/inheritance/index.mjs.map +2 -2
  252. package/build-module/components/global-styles/inherited-value-context.mjs +0 -5
  253. package/build-module/components/global-styles/inherited-value-context.mjs.map +2 -2
  254. package/build-module/components/global-styles/state-control-badges.mjs +0 -1
  255. package/build-module/components/global-styles/state-control-badges.mjs.map +2 -2
  256. package/build-module/components/global-styles/state-control.mjs +6 -4
  257. package/build-module/components/global-styles/state-control.mjs.map +2 -2
  258. package/build-module/components/global-styles/text-shadow-panel.mjs +224 -0
  259. package/build-module/components/global-styles/text-shadow-panel.mjs.map +7 -0
  260. package/build-module/components/global-styles/typography-panel.mjs +47 -6
  261. package/build-module/components/global-styles/typography-panel.mjs.map +2 -2
  262. package/build-module/components/global-styles/typography-utils.mjs.map +2 -2
  263. package/build-module/components/global-styles/utils.mjs.map +2 -2
  264. package/build-module/components/html-element-control/index.mjs +2 -2
  265. package/build-module/components/html-element-control/index.mjs.map +2 -2
  266. package/build-module/components/iframe/index.mjs.map +2 -2
  267. package/build-module/components/iframe/use-scale-canvas.mjs.map +2 -2
  268. package/build-module/components/image-size-control/index.mjs +2 -2
  269. package/build-module/components/image-size-control/index.mjs.map +2 -2
  270. package/build-module/components/inner-blocks/index.mjs +6 -1
  271. package/build-module/components/inner-blocks/index.mjs.map +2 -2
  272. package/build-module/components/inner-content/index.mjs.map +2 -2
  273. package/build-module/components/inserter/block-patterns-tab/use-pattern-categories.mjs +6 -24
  274. package/build-module/components/inserter/block-patterns-tab/use-pattern-categories.mjs.map +2 -2
  275. package/build-module/components/inserter/block-patterns-tab/utils.mjs +25 -0
  276. package/build-module/components/inserter/block-patterns-tab/utils.mjs.map +2 -2
  277. package/build-module/components/inserter/hooks/use-block-types-state.mjs.map +2 -2
  278. package/build-module/components/inserter/hooks/use-insertion-point.mjs.map +2 -2
  279. package/build-module/components/inserter/hooks/use-patterns-state.mjs.map +2 -2
  280. package/build-module/components/inserter/media-tab/media-panel.mjs.map +2 -2
  281. package/build-module/components/inserter/media-tab/media-preview.mjs.map +2 -2
  282. package/build-module/components/inserter-list-item/index.mjs.map +2 -2
  283. package/build-module/components/inspector-controls/list-view-content-popover.mjs.map +2 -2
  284. package/build-module/components/link-control/search-results.mjs.map +2 -2
  285. package/build-module/components/link-control/use-search-handler.mjs +3 -0
  286. package/build-module/components/link-control/use-search-handler.mjs.map +2 -2
  287. package/build-module/components/list-view/branch.mjs.map +2 -2
  288. package/build-module/components/list-view/drop-indicator.mjs.map +2 -2
  289. package/build-module/components/list-view/index.mjs.map +2 -2
  290. package/build-module/components/list-view/use-list-view-drop-zone.mjs.map +2 -2
  291. package/build-module/components/list-view/utils.mjs.map +2 -2
  292. package/build-module/components/media-replace-flow/index.mjs +4 -1
  293. package/build-module/components/media-replace-flow/index.mjs.map +2 -2
  294. package/build-module/components/plain-text/index.mjs +1 -2
  295. package/build-module/components/plain-text/index.mjs.map +2 -2
  296. package/build-module/components/preset-input-control/index.mjs.map +2 -2
  297. package/build-module/components/provider/index.mjs +3 -1
  298. package/build-module/components/provider/index.mjs.map +2 -2
  299. package/build-module/components/provider/use-block-sync.mjs.map +2 -2
  300. package/build-module/components/publish-date-time-picker/index.mjs.map +2 -2
  301. package/build-module/components/resizable-box-popover/index.mjs +1 -1
  302. package/build-module/components/resizable-box-popover/index.mjs.map +1 -1
  303. package/build-module/components/resolution-tool/index.mjs +2 -2
  304. package/build-module/components/resolution-tool/index.mjs.map +2 -2
  305. package/build-module/components/rich-text/event-listeners/enter.mjs +8 -22
  306. package/build-module/components/rich-text/event-listeners/enter.mjs.map +2 -2
  307. package/build-module/components/rich-text/format-edit.mjs.map +2 -2
  308. package/build-module/components/rich-text/index.mjs +21 -0
  309. package/build-module/components/rich-text/index.mjs.map +2 -2
  310. package/build-module/components/rich-text/multiline.mjs +11 -3
  311. package/build-module/components/rich-text/multiline.mjs.map +2 -2
  312. package/build-module/components/spacing-sizes-control/hooks/use-spacing-sizes.mjs.map +2 -2
  313. package/build-module/components/typewriter/index.mjs.map +2 -2
  314. package/build-module/components/use-block-commands/index.mjs.map +2 -2
  315. package/build-module/components/writing-flow/index.mjs +3 -0
  316. package/build-module/components/writing-flow/index.mjs.map +2 -2
  317. package/build-module/components/writing-flow/use-clipboard-handler.mjs.map +2 -2
  318. package/build-module/components/writing-flow/use-selection-observer.mjs +5 -3
  319. package/build-module/components/writing-flow/use-selection-observer.mjs.map +2 -2
  320. package/build-module/hooks/align.mjs +6 -6
  321. package/build-module/hooks/align.mjs.map +2 -2
  322. package/build-module/hooks/background.mjs.map +2 -2
  323. package/build-module/hooks/block-bindings.mjs.map +2 -2
  324. package/build-module/hooks/border.mjs.map +2 -2
  325. package/build-module/hooks/contrast-checker.mjs.map +2 -2
  326. package/build-module/hooks/dimensions.mjs.map +2 -2
  327. package/build-module/hooks/duotone.mjs.map +2 -2
  328. package/build-module/hooks/elements.mjs.map +2 -2
  329. package/build-module/hooks/fit-text.mjs.map +2 -2
  330. package/build-module/hooks/gap.mjs +2 -1
  331. package/build-module/hooks/gap.mjs.map +2 -2
  332. package/build-module/hooks/index.mjs +4 -2
  333. package/build-module/hooks/index.mjs.map +2 -2
  334. package/build-module/hooks/layout-child.mjs.map +2 -2
  335. package/build-module/hooks/layout.mjs +6 -5
  336. package/build-module/hooks/layout.mjs.map +2 -2
  337. package/build-module/hooks/position.mjs +5 -33
  338. package/build-module/hooks/position.mjs.map +2 -2
  339. package/build-module/hooks/states.mjs +3 -2
  340. package/build-module/hooks/states.mjs.map +2 -2
  341. package/build-module/hooks/text-shadow.mjs +65 -0
  342. package/build-module/hooks/text-shadow.mjs.map +7 -0
  343. package/build-module/hooks/typography.mjs +30 -6
  344. package/build-module/hooks/typography.mjs.map +2 -2
  345. package/build-module/hooks/utils.mjs +24 -2
  346. package/build-module/hooks/utils.mjs.map +2 -2
  347. package/build-module/layouts/grid.mjs.map +2 -2
  348. package/build-module/layouts/utils.mjs +5 -1
  349. package/build-module/layouts/utils.mjs.map +2 -2
  350. package/build-module/private-apis.mjs +6 -2
  351. package/build-module/private-apis.mjs.map +2 -2
  352. package/build-module/store/actions.mjs +28 -5
  353. package/build-module/store/actions.mjs.map +3 -3
  354. package/build-module/store/private-selectors.mjs.map +2 -2
  355. package/build-module/store/reducer.mjs.map +2 -2
  356. package/build-module/store/selectors.mjs.map +2 -2
  357. package/build-module/utils/get-font-styles-and-weights.mjs.map +2 -2
  358. package/build-module/utils/transform-styles/index.mjs.map +1 -1
  359. package/build-style/content-rtl.css +7 -2
  360. package/build-style/content.css +7 -2
  361. package/build-style/style-rtl.css +90 -25
  362. package/build-style/style.css +92 -25
  363. package/package.json +42 -43
  364. package/src/autocompleters/block.jsx +4 -4
  365. package/src/components/alignment-control/ui.jsx +1 -1
  366. package/src/components/background-image-control/index.jsx +3 -3
  367. package/src/components/block-alignment-control/test/index.jsdom.test.jsx +267 -0
  368. package/src/components/block-alignment-control/ui.jsx +47 -9
  369. package/src/components/block-alignment-control/use-available-alignments.js +106 -20
  370. package/src/components/block-allowed-blocks/allowed-blocks-control.jsx +1 -1
  371. package/src/components/block-bindings/attribute-control.jsx +27 -29
  372. package/src/components/block-bindings/source-fields-list.jsx +22 -32
  373. package/src/components/block-bindings/test/attribute-control.jsdom.test.jsx +115 -0
  374. package/src/components/block-canvas/index.jsx +1 -1
  375. package/src/components/block-card/index.jsx +5 -11
  376. package/src/components/block-card/style.scss +1 -0
  377. package/src/components/block-edit/edit.jsx +1 -1
  378. package/src/components/block-heading-level-dropdown/index.jsx +1 -1
  379. package/src/components/block-icon/index.jsx +1 -1
  380. package/src/components/block-icon/test/index.browser.test.jsx +74 -0
  381. package/src/components/block-inspector/edit-contents.jsx +2 -2
  382. package/src/components/block-inspector/index.jsx +46 -15
  383. package/src/components/block-inspector/style.scss +16 -0
  384. package/src/components/block-keyboard-shortcuts/index.jsx +2 -2
  385. package/src/components/block-list/block-html.jsx +2 -3
  386. package/src/components/block-list/block.jsx +7 -5
  387. package/src/components/block-list/content.scss +3 -2
  388. package/src/components/block-list/layout.jsx +4 -1
  389. package/src/components/block-list/test/layout.jsdom.test.js +40 -0
  390. package/src/components/block-list/use-block-props/index.js +1 -1
  391. package/src/components/block-lock/modal.jsx +2 -3
  392. package/src/components/block-lock/style.scss +1 -1
  393. package/src/components/block-mover/style.scss +0 -13
  394. package/src/components/block-parent-selector/index.jsx +12 -6
  395. package/src/components/block-patterns-list/style.scss +1 -1
  396. package/src/components/block-popover/index.jsx +1 -1
  397. package/src/components/block-rename/modal.jsx +3 -3
  398. package/src/components/block-settings-menu/block-settings-dropdown.jsx +1 -1
  399. package/src/components/block-styles/utils.js +1 -1
  400. package/src/components/block-switcher/index.jsx +3 -3
  401. package/src/components/block-toolbar/edit-section-button.jsx +2 -2
  402. package/src/components/block-toolbar/index.jsx +8 -4
  403. package/src/components/block-toolbar/switch-section-style.jsx +1 -1
  404. package/src/components/block-variation-transforms/index.jsx +24 -23
  405. package/src/components/block-variation-transforms/test/index.jsdom.test.jsx +93 -0
  406. package/src/components/block-visibility/modal.jsx +7 -7
  407. package/src/components/block-visibility/style.scss +1 -1
  408. package/src/components/block-visibility/viewport-visibility-info.jsx +5 -7
  409. package/src/components/border-radius-control/index.jsx +2 -2
  410. package/src/components/border-radius-control/test/index.jsdom.test.jsx +0 -22
  411. package/src/components/border-radius-control/test/select.browser.test.js +30 -0
  412. package/src/components/color-palette/with-color-context.jsx +1 -1
  413. package/src/components/colors/with-colors.jsx +1 -1
  414. package/src/components/colors-gradients/control.jsx +2 -2
  415. package/src/components/colors-gradients/test/{control.jsdom.test.jsx → control.browser.test.jsx} +6 -9
  416. package/src/components/contrast-checker/index.jsx +2 -2
  417. package/src/components/date-format-picker/index.jsx +2 -2
  418. package/src/components/dimensions-tool/aspect-ratio-tool.jsx +4 -4
  419. package/src/components/dimensions-tool/test/index.jsdom.test.jsx +17 -11
  420. package/src/components/dimensions-tool/width-height-tool.jsx +2 -2
  421. package/src/components/font-sizes/with-font-sizes.jsx +2 -3
  422. package/src/components/global-styles/background-panel.jsx +2 -2
  423. package/src/components/global-styles/border-panel.jsx +2 -2
  424. package/src/components/global-styles/color-gradient-dropdown-item.jsx +3 -3
  425. package/src/components/global-styles/color-panel.jsx +3 -3
  426. package/src/components/global-styles/dimensions-panel.jsx +6 -6
  427. package/src/components/global-styles/filters-panel.jsx +2 -2
  428. package/src/components/global-styles/hooks.js +1 -0
  429. package/src/components/global-styles/inheritance/index.jsx +9 -6
  430. package/src/components/global-styles/inheritance/test/{index.jsdom.test.jsx → index.browser.test.jsx} +34 -28
  431. package/src/components/global-styles/inherited-value-context.js +1 -9
  432. package/src/components/global-styles/state-control-badges.jsx +0 -1
  433. package/src/components/global-styles/state-control.jsx +12 -3
  434. package/src/components/global-styles/style.scss +68 -0
  435. package/src/components/global-styles/test/{color-panel.jsdom.test.jsx → color-panel.browser.test.jsx} +53 -54
  436. package/src/components/global-styles/test/inherited-value-context-core.jsdom.test.js +17 -26
  437. package/src/components/global-styles/test/{typography-panel-core.jsdom.test.jsx → typography-panel-core.browser.test.jsx} +84 -39
  438. package/src/components/global-styles/test/{typography-panel.jsdom.test.jsx → typography-panel.browser.test.jsx} +80 -122
  439. package/src/components/global-styles/text-shadow-panel.tsx +257 -0
  440. package/src/components/global-styles/typography-panel.jsx +52 -13
  441. package/src/components/global-styles/typography-utils.js +2 -2
  442. package/src/components/global-styles/utils.js +1 -1
  443. package/src/components/html-element-control/index.jsx +2 -2
  444. package/src/components/iframe/index.jsx +1 -1
  445. package/src/components/iframe/use-scale-canvas.js +1 -1
  446. package/src/components/image-size-control/index.jsx +2 -2
  447. package/src/components/inner-blocks/index.jsx +9 -1
  448. package/src/components/inner-content/index.jsx +1 -1
  449. package/src/components/inserter/block-patterns-tab/use-pattern-categories.js +7 -33
  450. package/src/components/inserter/block-patterns-tab/utils.js +44 -0
  451. package/src/components/inserter/hooks/use-block-types-state.js +2 -2
  452. package/src/components/inserter/hooks/use-insertion-point.js +1 -1
  453. package/src/components/inserter/hooks/use-patterns-state.js +1 -1
  454. package/src/components/inserter/media-tab/media-panel.jsx +9 -9
  455. package/src/components/inserter/media-tab/media-preview.jsx +1 -1
  456. package/src/components/inserter-list-item/index.jsx +1 -1
  457. package/src/components/inserter-list-item/style.scss +2 -2
  458. package/src/components/inspector-controls/list-view-content-popover.jsx +1 -1
  459. package/src/components/link-control/search-results.jsx +1 -1
  460. package/src/components/link-control/style.scss +1 -1
  461. package/src/components/link-control/test/index.jsdom.test.jsx +38 -110
  462. package/src/components/link-control/test/keyboard-selection.browser.test.js +110 -0
  463. package/src/components/link-control/use-search-handler.js +8 -3
  464. package/src/components/list-view/branch.jsx +1 -1
  465. package/src/components/list-view/drop-indicator.jsx +3 -3
  466. package/src/components/list-view/index.jsx +1 -1
  467. package/src/components/list-view/style.scss +1 -9
  468. package/src/components/list-view/use-list-view-drop-zone.js +1 -1
  469. package/src/components/list-view/utils.js +1 -1
  470. package/src/components/media-replace-flow/index.jsx +4 -1
  471. package/src/components/navigable-toolbar/test/index.browser.test.js +6 -7
  472. package/src/components/plain-text/README.md +3 -2
  473. package/src/components/plain-text/content.scss +0 -1
  474. package/src/components/plain-text/index.jsx +2 -3
  475. package/src/components/plain-text/style.scss +4 -0
  476. package/src/components/preset-input-control/index.jsx +2 -2
  477. package/src/components/preset-input-control/test/index.jsdom.test.jsx +0 -56
  478. package/src/components/preset-input-control/test/interaction.browser.test.js +63 -0
  479. package/src/components/provider/index.jsx +5 -3
  480. package/src/components/provider/use-block-sync.js +5 -5
  481. package/src/components/publish-date-time-picker/index.jsx +1 -1
  482. package/src/components/resizable-box-popover/index.jsx +1 -1
  483. package/src/components/resolution-tool/index.jsx +2 -2
  484. package/src/components/responsive-block-control/style.scss +1 -2
  485. package/src/components/responsive-block-control/test/index.jsdom.test.jsx +2 -2
  486. package/src/components/rich-text/event-listeners/enter.js +16 -23
  487. package/src/components/rich-text/format-edit.jsx +1 -1
  488. package/src/components/rich-text/index.jsx +39 -2
  489. package/src/components/rich-text/multiline.jsx +11 -3
  490. package/src/components/spacing-sizes-control/hooks/use-spacing-sizes.js +1 -1
  491. package/src/components/spacing-sizes-control/test/index.jsdom.test.jsx +0 -21
  492. package/src/components/spacing-sizes-control/test/select.browser.test.js +58 -0
  493. package/src/components/typewriter/index.jsx +1 -1
  494. package/src/components/url-input/test/fixtures/validated-input-control-deprecation.js +1 -1
  495. package/src/components/use-block-commands/index.js +1 -1
  496. package/src/components/use-block-drop-zone/test/index.js +2 -2
  497. package/src/components/writing-flow/index.jsx +8 -0
  498. package/src/components/writing-flow/use-clipboard-handler.js +1 -1
  499. package/src/components/writing-flow/use-selection-observer.js +15 -6
  500. package/src/content.scss +1 -0
  501. package/src/hooks/align.jsx +22 -6
  502. package/src/hooks/background.jsx +1 -1
  503. package/src/hooks/block-bindings.jsx +1 -1
  504. package/src/hooks/block-hooks.scss +0 -6
  505. package/src/hooks/border.jsx +2 -2
  506. package/src/hooks/contrast-checker.js +1 -1
  507. package/src/hooks/dimensions.jsx +2 -2
  508. package/src/hooks/duotone.jsx +3 -3
  509. package/src/hooks/elements.jsx +3 -3
  510. package/src/hooks/fit-text.jsx +1 -1
  511. package/src/hooks/gap.js +2 -4
  512. package/src/hooks/index.js +3 -1
  513. package/src/hooks/layout-child.jsx +3 -4
  514. package/src/hooks/layout.jsx +17 -18
  515. package/src/hooks/position.jsx +5 -36
  516. package/src/hooks/states.jsx +6 -2
  517. package/src/hooks/test/layout.jsdom.test.js +44 -1
  518. package/src/hooks/text-shadow.ts +105 -0
  519. package/src/hooks/typography.jsx +58 -30
  520. package/src/hooks/utils.jsx +23 -1
  521. package/src/layouts/grid.jsx +2 -2
  522. package/src/layouts/test/flex.jsdom.test.jsx +4 -3
  523. package/src/layouts/test/utils.js +48 -1
  524. package/src/layouts/utils.js +19 -0
  525. package/src/private-apis.js +4 -0
  526. package/src/store/actions.js +50 -10
  527. package/src/store/private-selectors.js +5 -5
  528. package/src/store/reducer.js +6 -6
  529. package/src/store/selectors.js +3 -3
  530. package/src/store/test/actions.jsdom.test.js +60 -0
  531. package/src/style.scss +1 -0
  532. package/src/utils/get-font-styles-and-weights.ts +1 -1
  533. package/src/utils/transform-styles/index.ts +1 -1
  534. package/build/hooks/cross-origin-isolation.cjs +0 -56
  535. package/build/hooks/cross-origin-isolation.cjs.map +0 -7
  536. package/build-module/hooks/cross-origin-isolation.mjs +0 -54
  537. package/build-module/hooks/cross-origin-isolation.mjs.map +0 -7
  538. package/src/components/block-icon/test/__snapshots__/index.jsdom.test.jsx.snap +0 -27
  539. package/src/components/block-icon/test/index.jsdom.test.jsx +0 -67
  540. package/src/hooks/cross-origin-isolation.js +0 -73
  541. package/src/hooks/test/cross-origin-isolation.jsdom.test.js +0 -173
@@ -1,5 +1,6 @@
1
1
  import { useSelect } from '@wordpress/data';
2
2
  import { useLayout } from '../block-list/layout';
3
+ import { useSettings } from '../use-settings';
3
4
  import { store as blockEditorStore } from '../../store';
4
5
  import { getLayoutType } from '../../layouts';
5
6
 
@@ -7,6 +8,32 @@ const EMPTY_ARRAY = [];
7
8
  const DEFAULT_CONTROLS = [ 'none', 'left', 'center', 'right', 'wide', 'full' ];
8
9
  const WIDE_CONTROLS = [ 'wide', 'full' ];
9
10
 
11
+ function useAlignmentSettings( isNoneOnly ) {
12
+ return useSelect(
13
+ ( select ) => {
14
+ // If `isNoneOnly` is true, we'll be returning early because there is
15
+ // nothing to filter on an empty array. We won't need the info from
16
+ // the `useSelect` but we must call it anyway because Rules of Hooks.
17
+ // So the callback returns early to avoid block editor subscription.
18
+ if ( isNoneOnly ) {
19
+ return {
20
+ wideControlsEnabled: false,
21
+ themeSupportsLayout: false,
22
+ isBlockBasedTheme: false,
23
+ };
24
+ }
25
+
26
+ const settings = select( blockEditorStore ).getSettings();
27
+ return {
28
+ wideControlsEnabled: settings.alignWide ?? false,
29
+ themeSupportsLayout: settings.supportsLayout,
30
+ isBlockBasedTheme: settings.__unstableIsBlockBasedTheme,
31
+ };
32
+ },
33
+ [ isNoneOnly ]
34
+ );
35
+ }
36
+
10
37
  export default function useAvailableAlignments( controls = DEFAULT_CONTROLS ) {
11
38
  // Always add the `none` option if not exists.
12
39
  if ( ! controls.includes( 'none' ) ) {
@@ -14,32 +41,34 @@ export default function useAvailableAlignments( controls = DEFAULT_CONTROLS ) {
14
41
  }
15
42
  const isNoneOnly = controls.length === 1 && controls[ 0 ] === 'none';
16
43
 
17
- const [ wideControlsEnabled, themeSupportsLayout, isBlockBasedTheme ] =
18
- useSelect(
19
- ( select ) => {
20
- // If `isNoneOnly` is true, we'll be returning early because there is
21
- // nothing to filter on an empty array. We won't need the info from
22
- // the `useSelect` but we must call it anyway because Rules of Hooks.
23
- // So the callback returns early to avoid block editor subscription.
24
- if ( isNoneOnly ) {
25
- return [ false, false, false ];
26
- }
27
-
28
- const settings = select( blockEditorStore ).getSettings();
29
- return [
30
- settings.alignWide ?? false,
31
- settings.supportsLayout,
32
- settings.__unstableIsBlockBasedTheme,
33
- ];
34
- },
35
- [ isNoneOnly ]
36
- );
44
+ const settings = useAlignmentSettings( isNoneOnly );
37
45
  const layout = useLayout();
38
46
 
39
47
  if ( isNoneOnly ) {
40
48
  return EMPTY_ARRAY;
41
49
  }
42
50
 
51
+ return getAvailableAlignments( controls, layout, settings );
52
+ }
53
+
54
+ /**
55
+ * The store-free part of `useAvailableAlignments`, so the same rules can be
56
+ * evaluated against more than one layout without a subscription for each.
57
+ *
58
+ * @param {string[]} controls Alignments the block supports, including `none`.
59
+ * @param {Object} layout Layout to evaluate against.
60
+ * @param {Object} settings Editor settings from `useAlignmentSettings`.
61
+ * @param {boolean} settings.wideControlsEnabled Whether the theme enables wide alignments.
62
+ * @param {boolean} settings.themeSupportsLayout Whether the theme supports the layout config.
63
+ * @param {boolean} settings.isBlockBasedTheme Whether the theme is block based.
64
+ *
65
+ * @return {Object[]} The alignments the layout offers.
66
+ */
67
+ function getAvailableAlignments(
68
+ controls,
69
+ layout,
70
+ { wideControlsEnabled, themeSupportsLayout, isBlockBasedTheme }
71
+ ) {
43
72
  const layoutType = getLayoutType( layout?.type );
44
73
 
45
74
  if ( themeSupportsLayout ) {
@@ -85,3 +114,60 @@ export default function useAvailableAlignments( controls = DEFAULT_CONTROLS ) {
85
114
 
86
115
  return alignments;
87
116
  }
117
+
118
+ /**
119
+ * Returns the alignments a block supports, split into the ones the parent
120
+ * layout offers (`enabled`) and the wide alignments it does not (`unavailable`).
121
+ *
122
+ * An alignment is only `unavailable` when the block supports it, the theme
123
+ * offers it at the root, and the parent layout does not. The theme check is
124
+ * measured against the global layout settings, so a theme that sets no wide
125
+ * size, or no layout at all, is curating its own options rather than
126
+ * withholding them. Flex and Grid parents never offer alignments to anything,
127
+ * so under those both lists are empty.
128
+ *
129
+ * @param {string[]} controls Alignments the block supports.
130
+ *
131
+ * @return {{enabled: Object[], unavailable: string[]}} The split alignments.
132
+ */
133
+ export function useAlignmentMenu( controls = DEFAULT_CONTROLS ) {
134
+ // Always add the `none` option if not exists.
135
+ if ( ! controls.includes( 'none' ) ) {
136
+ controls = [ 'none', ...controls ];
137
+ }
138
+ const isNoneOnly = controls.length === 1 && controls[ 0 ] === 'none';
139
+
140
+ const settings = useAlignmentSettings( isNoneOnly );
141
+ const layout = useLayout();
142
+ const [ globalLayout ] = useSettings( 'layout' );
143
+
144
+ if ( isNoneOnly ) {
145
+ return { enabled: EMPTY_ARRAY, unavailable: EMPTY_ARRAY };
146
+ }
147
+
148
+ const enabled = getAvailableAlignments( controls, layout, settings );
149
+ const layoutOffersAlignments = !! getAvailableAlignments(
150
+ DEFAULT_CONTROLS,
151
+ layout,
152
+ settings
153
+ ).length;
154
+
155
+ if ( ! layoutOffersAlignments ) {
156
+ return { enabled, unavailable: EMPTY_ARRAY };
157
+ }
158
+
159
+ const themeNames = getAvailableAlignments(
160
+ DEFAULT_CONTROLS,
161
+ { ...globalLayout, type: 'constrained' },
162
+ settings
163
+ ).map( ( { name } ) => name );
164
+ const enabledNames = enabled.map( ( { name } ) => name );
165
+ const unavailable = controls.filter(
166
+ ( name ) =>
167
+ WIDE_CONTROLS.includes( name ) &&
168
+ themeNames.includes( name ) &&
169
+ ! enabledNames.includes( name )
170
+ );
171
+
172
+ return { enabled, unavailable };
173
+ }
@@ -36,7 +36,7 @@ export default function BlockAllowedBlocksControl( { clientId } ) {
36
36
  ? filteredBlockTypes
37
37
  : filteredBlockTypes.filter( ( blockType ) =>
38
38
  selectedBlockNames.includes( blockType.name )
39
- );
39
+ );
40
40
 
41
41
  return (
42
42
  <div className="block-editor-block-allowed-blocks-control">
@@ -9,19 +9,18 @@ import {
9
9
  __experimentalText as WCText,
10
10
  __experimentalToolsPanelItem as ToolsPanelItem,
11
11
  __experimentalVStack as VStack,
12
- privateApis as componentsPrivateApis,
13
12
  } from '@wordpress/components';
14
13
  import { useSelect } from '@wordpress/data';
15
14
  import { useContext } from '@wordpress/element';
16
15
  import { useViewportMatch } from '@wordpress/compose';
16
+ // eslint-disable-next-line @wordpress/use-recommended-components -- Intentional early adoption of the new Menu, pending WordPress/gutenberg#76135.
17
+ import { Menu } from '@wordpress/ui';
17
18
  import BlockContext from '../block-context';
18
19
  import BlockBindingsSourceFieldsList from './source-fields-list';
19
20
  import useBlockBindingsUtils from './use-block-bindings-utils';
20
21
  import { unlock } from '../../lock-unlock';
21
22
  import { store as blockEditorStore } from '../../store';
22
23
 
23
- const { Menu } = unlock( componentsPrivateApis );
24
-
25
24
  /**
26
25
  * Renders a control for viewing and editing a block attribute binding.
27
26
  *
@@ -132,11 +131,8 @@ export default function BlockBindingsAttributeControl( {
132
131
  } )
133
132
  }
134
133
  >
135
- <Menu placement={ isMobile ? 'bottom-start' : 'left-start' }>
136
- <Menu.TriggerButton
137
- render={ <Item /> }
138
- disabled={ ! hasCompatibleFields }
139
- >
134
+ <Menu.Root disabled={ ! hasCompatibleFields }>
135
+ <Menu.Trigger render={ <Item /> }>
140
136
  <VStack
141
137
  className="block-editor-bindings__item"
142
138
  spacing={ 0 }
@@ -150,29 +146,31 @@ export default function BlockBindingsAttributeControl( {
150
146
  { displayText }
151
147
  </WCText>
152
148
  </VStack>
153
- </Menu.TriggerButton>
149
+ </Menu.Trigger>
154
150
  { ! isAttributeReadOnly && (
155
- <Menu.Popover gutter={ isMobile ? 8 : 36 }>
156
- <Menu
157
- placement={
158
- isMobile ? 'bottom-start' : 'left-start'
159
- }
160
- >
161
- { Object.entries( compatibleFields ).map(
162
- ( [ sourceKey, fields ] ) => (
163
- <BlockBindingsSourceFieldsList
164
- key={ sourceKey }
165
- args={ binding?.args }
166
- attribute={ attribute }
167
- sourceKey={ sourceKey }
168
- fields={ fields }
169
- />
170
- )
171
- ) }
172
- </Menu>
173
- </Menu.Popover>
151
+ <Menu.Popup
152
+ positioner={
153
+ <Menu.Positioner
154
+ side={ isMobile ? 'bottom' : 'inline-start' }
155
+ align="start"
156
+ sideOffset={ isMobile ? 8 : 36 }
157
+ />
158
+ }
159
+ >
160
+ { Object.entries( compatibleFields ).map(
161
+ ( [ sourceKey, fields ] ) => (
162
+ <BlockBindingsSourceFieldsList
163
+ key={ sourceKey }
164
+ args={ binding?.args }
165
+ attribute={ attribute }
166
+ sourceKey={ sourceKey }
167
+ fields={ fields }
168
+ />
169
+ )
170
+ ) }
171
+ </Menu.Popup>
174
172
  ) }
175
- </Menu>
173
+ </Menu.Root>
176
174
  </ToolsPanelItem>
177
175
  );
178
176
  }
@@ -1,15 +1,13 @@
1
1
  import fastDeepEqual from 'fast-deep-equal/es6/index.js';
2
2
  import { getBlockBindingsSource } from '@wordpress/blocks';
3
- import { privateApis as componentsPrivateApis } from '@wordpress/components';
4
3
  import { useSelect } from '@wordpress/data';
5
4
  import { useContext, useMemo } from '@wordpress/element';
6
5
  import { useViewportMatch } from '@wordpress/compose';
6
+ // eslint-disable-next-line @wordpress/use-recommended-components -- Intentional early adoption of the new Menu, pending WordPress/gutenberg#76135.
7
+ import { Menu } from '@wordpress/ui';
7
8
  import useBlockBindingsUtils from './use-block-bindings-utils';
8
- import { unlock } from '../../lock-unlock';
9
9
  import BlockContext from '../block-context';
10
10
 
11
- const { Menu } = unlock( componentsPrivateApis );
12
-
13
11
  function BlockBindingsSourceFieldsListItem( {
14
12
  args,
15
13
  attribute,
@@ -43,25 +41,11 @@ function BlockBindingsSourceFieldsListItem( {
43
41
 
44
42
  return (
45
43
  <Menu.CheckboxItem
46
- onChange={ () => {
47
- const isCurrentlySelected =
48
- fastDeepEqual( args, field.args ) ??
49
- // Deprecate key dependency in 7.0.
50
- field.key === args?.key;
51
-
52
- if ( isCurrentlySelected ) {
53
- // Unset if the same field is selected again.
54
- updateBlockBindings( {
55
- [ attribute ]: undefined,
56
- } );
57
- } else {
58
- updateBlockBindings( {
59
- [ attribute ]: itemBindings,
60
- } );
61
- }
44
+ onCheckedChange={ ( checked ) => {
45
+ updateBlockBindings( {
46
+ [ attribute ]: checked ? itemBindings : undefined,
47
+ } );
62
48
  } }
63
- name={ attribute + '-binding' }
64
- value={ values[ attribute ] }
65
49
  checked={
66
50
  fastDeepEqual( args, field.args ) ??
67
51
  // Deprecate key dependency in 7.0.
@@ -69,7 +53,7 @@ function BlockBindingsSourceFieldsListItem( {
69
53
  }
70
54
  >
71
55
  <Menu.ItemLabel>{ field.label }</Menu.ItemLabel>
72
- <Menu.ItemHelpText>{ values[ attribute ] }</Menu.ItemHelpText>
56
+ <Menu.ItemDescription>{ values[ attribute ] }</Menu.ItemDescription>
73
57
  </Menu.CheckboxItem>
74
58
  );
75
59
  }
@@ -90,14 +74,20 @@ export default function BlockBindingsSourceFieldsList( {
90
74
  const source = getBlockBindingsSource( sourceKey );
91
75
 
92
76
  return (
93
- <Menu
94
- key={ sourceKey }
95
- placement={ isMobile ? 'bottom-start' : 'left-start' }
96
- >
97
- <Menu.SubmenuTriggerItem>
77
+ <Menu.SubmenuRoot key={ sourceKey }>
78
+ <Menu.SubmenuTrigger>
98
79
  <Menu.ItemLabel>{ source.label }</Menu.ItemLabel>
99
- </Menu.SubmenuTriggerItem>
100
- <Menu.Popover gutter={ 8 }>
80
+ </Menu.SubmenuTrigger>
81
+ <Menu.Popup
82
+ positioner={
83
+ <Menu.Positioner
84
+ side={ isMobile ? 'bottom' : 'inline-start' }
85
+ align="start"
86
+ sideOffset={ 8 }
87
+ alignOffset={ -4 }
88
+ />
89
+ }
90
+ >
101
91
  <Menu.Group>
102
92
  { fields.map( ( field ) => (
103
93
  <BlockBindingsSourceFieldsListItem
@@ -113,7 +103,7 @@ export default function BlockBindingsSourceFieldsList( {
113
103
  />
114
104
  ) ) }
115
105
  </Menu.Group>
116
- </Menu.Popover>
117
- </Menu>
106
+ </Menu.Popup>
107
+ </Menu.SubmenuRoot>
118
108
  );
119
109
  }
@@ -0,0 +1,115 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { fireEvent, render, screen } from '@testing-library/react';
3
+ import userEvent from '@testing-library/user-event';
4
+ import { getBlockBindingsSource } from '@wordpress/blocks';
5
+ import { useViewportMatch } from '@wordpress/compose';
6
+ import { useSelect } from '@wordpress/data';
7
+ import BlockBindingsAttributeControl from '../attribute-control';
8
+ import useBlockBindingsUtils from '../use-block-bindings-utils';
9
+
10
+ globalThis.wpVitest.mockMatchMedia();
11
+ globalThis.wpVitest.mockPointerEvent();
12
+ globalThis.wpVitest.mockScrollIntoView();
13
+
14
+ vi.mock( import( '@wordpress/blocks' ), async ( importOriginal ) => ( {
15
+ ...( await importOriginal() ),
16
+ getBlockBindingsSource: vi.fn(),
17
+ } ) );
18
+ vi.mock( import( '@wordpress/components' ), async ( importOriginal ) => ( {
19
+ ...( await importOriginal() ),
20
+ __experimentalToolsPanelItem: ( { children } ) => children,
21
+ } ) );
22
+ vi.mock( import( '@wordpress/compose' ), async ( importOriginal ) => ( {
23
+ ...( await importOriginal() ),
24
+ useViewportMatch: vi.fn(),
25
+ } ) );
26
+ vi.mock( import( '@wordpress/data' ), async ( importOriginal ) => ( {
27
+ ...( await importOriginal() ),
28
+ useSelect: vi.fn(),
29
+ } ) );
30
+ vi.mock( import( '../use-block-bindings-utils' ), () => ( {
31
+ default: vi.fn(),
32
+ } ) );
33
+
34
+ const updateBlockBindings = vi.fn();
35
+ const field = {
36
+ args: { key: 'seo_title' },
37
+ key: 'seo_title',
38
+ label: 'SEO title',
39
+ type: 'string',
40
+ };
41
+ const source = {
42
+ getValues: vi.fn(),
43
+ label: 'Post meta',
44
+ };
45
+
46
+ function renderControl( binding ) {
47
+ useViewportMatch.mockReturnValue( false );
48
+ getBlockBindingsSource.mockReturnValue( source );
49
+ useBlockBindingsUtils.mockReturnValue( { updateBlockBindings } );
50
+ useSelect.mockImplementation( ( _mapSelect, dependencies ) => {
51
+ if ( dependencies?.length === 3 ) {
52
+ return { 'core/post-meta': [ field ] };
53
+ }
54
+ if ( dependencies?.length === 4 ) {
55
+ return {};
56
+ }
57
+ return { canUpdateBlockBindings: true };
58
+ } );
59
+
60
+ return render(
61
+ <BlockBindingsAttributeControl
62
+ attribute="content"
63
+ binding={ binding }
64
+ blockName="core/paragraph"
65
+ />
66
+ );
67
+ }
68
+
69
+ async function openFieldMenu( user ) {
70
+ await user.click( screen.getByRole( 'button', { name: /content/i } ) );
71
+ const sourceItem = await screen.findByRole( 'menuitem', {
72
+ name: 'Post meta',
73
+ } );
74
+ await user.click( sourceItem );
75
+ const fieldItem = await screen.findByRole( 'menuitemcheckbox', {
76
+ name: 'SEO title',
77
+ } );
78
+ return fieldItem;
79
+ }
80
+
81
+ describe( 'BlockBindingsAttributeControl', () => {
82
+ beforeEach( () => {
83
+ updateBlockBindings.mockReset();
84
+ } );
85
+
86
+ it( 'selects a source field', async () => {
87
+ const user = userEvent.setup();
88
+ renderControl();
89
+
90
+ const fieldItem = await openFieldMenu( user );
91
+ fireEvent.click( fieldItem );
92
+
93
+ expect( updateBlockBindings ).toHaveBeenCalledWith( {
94
+ content: {
95
+ source: 'core/post-meta',
96
+ args: field.args,
97
+ },
98
+ } );
99
+ } );
100
+
101
+ it( 'clears the selected source field', async () => {
102
+ const user = userEvent.setup();
103
+ renderControl( {
104
+ source: 'core/post-meta',
105
+ args: field.args,
106
+ } );
107
+
108
+ const fieldItem = await openFieldMenu( user );
109
+ fireEvent.click( fieldItem );
110
+
111
+ expect( updateBlockBindings ).toHaveBeenCalledWith( {
112
+ content: undefined,
113
+ } );
114
+ } );
115
+ } );
@@ -70,7 +70,7 @@ export function ExperimentalBlockCanvas( {
70
70
  ? {
71
71
  scale: zoomLevel,
72
72
  frameSize: '40px',
73
- }
73
+ }
74
74
  : {};
75
75
 
76
76
  if ( ! shouldIframe ) {
@@ -1,10 +1,6 @@
1
1
  import clsx from 'clsx';
2
- import {
3
- Button,
4
- Icon as WCIcon,
5
- privateApis as componentsPrivateApis,
6
- } from '@wordpress/components';
7
- import { Text, Stack } from '@wordpress/ui';
2
+ import { Button, Icon as WCIcon } from '@wordpress/components';
3
+ import { Badge, Text, Stack } from '@wordpress/ui';
8
4
  import { useDispatch, useSelect } from '@wordpress/data';
9
5
  import deprecated from '@wordpress/deprecated';
10
6
  import { __, sprintf, isRTL } from '@wordpress/i18n';
@@ -19,8 +15,6 @@ import { unlock } from '../../lock-unlock';
19
15
  import { store as blockEditorStore } from '../../store';
20
16
  import BlockIcon from '../block-icon';
21
17
 
22
- const { Badge: WCBadge } = unlock( componentsPrivateApis );
23
-
24
18
  function OptionalParentSelectButton( { children, onClick } ) {
25
19
  if ( ! onClick ) {
26
20
  return children;
@@ -148,7 +142,7 @@ function BlockCard( {
148
142
  __( 'Go to "%s" block' ),
149
143
  getBlockType( parentBlockName )
150
144
  ?.title
151
- )
145
+ )
152
146
  : __( 'Go to parent block' )
153
147
  }
154
148
  style={
@@ -172,7 +166,7 @@ function BlockCard( {
172
166
  parentClientId
173
167
  ? () => {
174
168
  selectBlock( parentClientId );
175
- }
169
+ }
176
170
  : undefined
177
171
  }
178
172
  >
@@ -185,7 +179,7 @@ function BlockCard( {
185
179
  { ! parentClientId &&
186
180
  ! isChild &&
187
181
  !! name?.length && (
188
- <WCBadge>{ title }</WCBadge>
182
+ <Badge>{ title }</Badge>
189
183
  ) }
190
184
  </TitleElement>
191
185
  { children }
@@ -27,6 +27,7 @@
27
27
  align-items: center;
28
28
  flex-wrap: wrap;
29
29
  gap: calc($grid-unit-10 / 2) $grid-unit-10;
30
+ overflow-wrap: anywhere;
30
31
 
31
32
  &.block-editor-block-card__title {
32
33
  font-size: $default-font-size;
@@ -63,7 +63,7 @@ const EditWithGeneratedProps = ( props ) => {
63
63
  attributes?.metadata?.bindings
64
64
  ? Object.values( attributes.metadata.bindings ).map(
65
65
  ( binding ) => registeredSources[ binding?.source ]
66
- )
66
+ )
67
67
  : undefined
68
68
  ),
69
69
  hasPatternOverrides: hasPatternOverridesDefaultBinding(
@@ -55,7 +55,7 @@ export default function HeadingLevelDropdown( {
55
55
  // translators: %d: heading level e.g: "1", "2", "3"
56
56
  __( 'Heading %d' ),
57
57
  targetLevel
58
- ),
58
+ ),
59
59
  isActive,
60
60
  onClick() {
61
61
  onChange( targetLevel );
@@ -20,7 +20,7 @@ function BlockIcon( { icon, showColors = false, className, context } ) {
20
20
  ? {
21
21
  backgroundColor: icon && icon.background,
22
22
  color: icon && icon.foreground,
23
- }
23
+ }
24
24
  : {};
25
25
 
26
26
  return (
@@ -0,0 +1,74 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { render } from 'vitest-browser-react';
3
+ import { image } from '@wordpress/icons';
4
+ import BlockIcon from '../';
5
+
6
+ function getIconWrapper( container ) {
7
+ // The wrapper is intentionally non-semantic.
8
+ return container.firstChild;
9
+ }
10
+
11
+ describe( 'BlockIcon', () => {
12
+ it( 'renders an icon', async () => {
13
+ const { container } = await render( <BlockIcon icon={ image } /> );
14
+
15
+ // The decorative SVG is intentionally hidden from the accessibility tree.
16
+
17
+ const icon = container.querySelector( 'svg' );
18
+ expect( icon ).toHaveAttribute( 'aria-hidden', 'true' );
19
+ expect( icon ).toHaveAttribute( 'focusable', 'false' );
20
+ } );
21
+
22
+ it( 'renders a span without the has-colors classname', async () => {
23
+ const { container } = await render( <BlockIcon icon={ image } /> );
24
+
25
+ expect( getIconWrapper( container ) ).not.toHaveClass( 'has-colors' );
26
+ } );
27
+
28
+ it( 'renders a span with the has-colors classname', async () => {
29
+ const { container } = await render(
30
+ <BlockIcon icon={ image } showColors />
31
+ );
32
+
33
+ expect( getIconWrapper( container ) ).toHaveClass( 'has-colors' );
34
+ } );
35
+
36
+ it( 'supports adding a className to the wrapper', async () => {
37
+ const { container } = await render(
38
+ <BlockIcon icon={ image } className="foo-bar" />
39
+ );
40
+
41
+ expect( getIconWrapper( container ) ).toHaveClass( 'foo-bar' );
42
+ } );
43
+
44
+ it( 'skips adding background and foreground styles when colors are not enabled', async () => {
45
+ const { container } = await render(
46
+ <BlockIcon
47
+ icon={ {
48
+ background: 'white',
49
+ foreground: 'black',
50
+ src: 'image',
51
+ } }
52
+ />
53
+ );
54
+
55
+ expect( getIconWrapper( container ) ).not.toHaveAttribute( 'style' );
56
+ } );
57
+
58
+ it( 'adds background and foreground styles when colors are enabled', async () => {
59
+ const { container } = await render(
60
+ <BlockIcon
61
+ icon={ {
62
+ background: 'white',
63
+ foreground: 'black',
64
+ src: 'image',
65
+ } }
66
+ showColors
67
+ />
68
+ );
69
+
70
+ const styles = window.getComputedStyle( getIconWrapper( container ) );
71
+ expect( styles.backgroundColor ).toBe( 'rgb(255, 255, 255)' );
72
+ expect( styles.color ).toBe( 'rgb(0, 0, 0)' );
73
+ } );
74
+ } );
@@ -77,9 +77,9 @@ function InlineEditButton( {
77
77
  >
78
78
  { editedContentOnlySection
79
79
  ? /* translators: Button label to leave pattern editing mode. */
80
- __( 'Exit pattern' )
80
+ __( 'Exit pattern' )
81
81
  : /* translators: Button label to enter pattern editing mode. */
82
- __( 'Edit pattern' ) }
82
+ __( 'Edit pattern' ) }
83
83
  </Button>
84
84
  </Stack>
85
85
  );