@wordpress/block-editor 14.0.0 → 14.1.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 (290) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +9 -14
  3. package/build/autocompleters/block.js +1 -1
  4. package/build/autocompleters/block.js.map +1 -1
  5. package/build/components/block-list/use-block-props/index.js +2 -2
  6. package/build/components/block-list/use-block-props/index.js.map +1 -1
  7. package/build/components/block-list/use-in-between-inserter.js +11 -4
  8. package/build/components/block-list/use-in-between-inserter.js.map +1 -1
  9. package/build/components/block-settings-menu/block-mode-toggle.js +28 -34
  10. package/build/components/block-settings-menu/block-mode-toggle.js.map +1 -1
  11. package/build/components/block-tools/insertion-point.js +14 -3
  12. package/build/components/block-tools/insertion-point.js.map +1 -1
  13. package/build/components/block-tools/use-show-block-tools.js +2 -1
  14. package/build/components/block-tools/use-show-block-tools.js.map +1 -1
  15. package/build/components/block-tools/zoom-out-mode-inserters.js +8 -4
  16. package/build/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  17. package/build/components/border-radius-control/index.js +1 -0
  18. package/build/components/border-radius-control/index.js.map +1 -1
  19. package/build/components/convert-to-group-buttons/index.js +1 -1
  20. package/build/components/convert-to-group-buttons/index.js.map +1 -1
  21. package/build/components/date-format-picker/index.js +2 -0
  22. package/build/components/date-format-picker/index.js.map +1 -1
  23. package/build/components/font-appearance-control/index.js +3 -0
  24. package/build/components/font-appearance-control/index.js.map +1 -1
  25. package/build/components/font-family/index.js +3 -0
  26. package/build/components/font-family/index.js.map +1 -1
  27. package/build/components/global-styles/background-panel.js +114 -42
  28. package/build/components/global-styles/background-panel.js.map +1 -1
  29. package/build/components/global-styles/get-global-styles-changes.js +3 -1
  30. package/build/components/global-styles/get-global-styles-changes.js.map +1 -1
  31. package/build/components/global-styles/hooks.js +0 -7
  32. package/build/components/global-styles/hooks.js.map +1 -1
  33. package/build/components/global-styles/index.js +0 -6
  34. package/build/components/global-styles/index.js.map +1 -1
  35. package/build/components/global-styles/use-global-styles-output.js +3 -3
  36. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  37. package/build/components/global-styles/utils.js +8 -24
  38. package/build/components/global-styles/utils.js.map +1 -1
  39. package/build/components/grid/grid-visualizer.js +20 -5
  40. package/build/components/grid/grid-visualizer.js.map +1 -1
  41. package/build/components/height-control/index.js +1 -0
  42. package/build/components/height-control/index.js.map +1 -1
  43. package/build/components/iframe/index.js +4 -2
  44. package/build/components/iframe/index.js.map +1 -1
  45. package/build/components/image-editor/zoom-dropdown.js +11 -7
  46. package/build/components/image-editor/zoom-dropdown.js.map +1 -1
  47. package/build/components/inner-blocks/button-block-appender.js +8 -8
  48. package/build/components/inner-blocks/button-block-appender.js.map +1 -1
  49. package/build/components/inner-blocks/default-block-appender.js +7 -25
  50. package/build/components/inner-blocks/default-block-appender.js.map +1 -1
  51. package/build/components/inner-blocks/index.js +9 -11
  52. package/build/components/inner-blocks/index.js.map +1 -1
  53. package/build/components/inserter/library.js +4 -2
  54. package/build/components/inserter/library.js.map +1 -1
  55. package/build/components/inserter/menu.js +30 -12
  56. package/build/components/inserter/menu.js.map +1 -1
  57. package/build/components/inserter/quick-inserter.js +4 -0
  58. package/build/components/inserter/quick-inserter.js.map +1 -1
  59. package/build/components/line-height-control/index.js +3 -0
  60. package/build/components/line-height-control/index.js.map +1 -1
  61. package/build/components/media-placeholder/index.js +9 -4
  62. package/build/components/media-placeholder/index.js.map +1 -1
  63. package/build/components/media-upload/index.native.js +4 -1
  64. package/build/components/media-upload/index.native.js.map +1 -1
  65. package/build/components/multi-selection-inspector/index.js +12 -12
  66. package/build/components/multi-selection-inspector/index.js.map +1 -1
  67. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js +4 -2
  68. package/build/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  69. package/build/components/text-alignment-control/index.js +13 -8
  70. package/build/components/text-alignment-control/index.js.map +1 -1
  71. package/build/components/text-decoration-control/index.js +13 -8
  72. package/build/components/text-decoration-control/index.js.map +1 -1
  73. package/build/components/text-transform-control/index.js +13 -8
  74. package/build/components/text-transform-control/index.js.map +1 -1
  75. package/build/components/url-popover/image-url-input-ui.js +2 -0
  76. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  77. package/build/components/use-block-drop-zone/index.js +14 -2
  78. package/build/components/use-block-drop-zone/index.js.map +1 -1
  79. package/build/components/writing-mode-control/index.js +13 -8
  80. package/build/components/writing-mode-control/index.js.map +1 -1
  81. package/build/hooks/background.js +19 -23
  82. package/build/hooks/background.js.map +1 -1
  83. package/build/hooks/block-bindings.js +37 -79
  84. package/build/hooks/block-bindings.js.map +1 -1
  85. package/build/layouts/constrained.js +1 -0
  86. package/build/layouts/constrained.js.map +1 -1
  87. package/build/layouts/flex.js +2 -0
  88. package/build/layouts/flex.js.map +1 -1
  89. package/build/layouts/grid.js +3 -0
  90. package/build/layouts/grid.js.map +1 -1
  91. package/build/private-apis.js +3 -1
  92. package/build/private-apis.js.map +1 -1
  93. package/build/store/private-selectors.js +30 -0
  94. package/build/store/private-selectors.js.map +1 -1
  95. package/build/store/reducer.js +10 -1
  96. package/build/store/reducer.js.map +1 -1
  97. package/build/utils/block-bindings.js +112 -0
  98. package/build/utils/block-bindings.js.map +1 -0
  99. package/build-module/autocompleters/block.js +1 -1
  100. package/build-module/autocompleters/block.js.map +1 -1
  101. package/build-module/components/block-list/use-block-props/index.js +2 -2
  102. package/build-module/components/block-list/use-block-props/index.js.map +1 -1
  103. package/build-module/components/block-list/use-in-between-inserter.js +11 -4
  104. package/build-module/components/block-list/use-in-between-inserter.js.map +1 -1
  105. package/build-module/components/block-settings-menu/block-mode-toggle.js +29 -34
  106. package/build-module/components/block-settings-menu/block-mode-toggle.js.map +1 -1
  107. package/build-module/components/block-tools/insertion-point.js +14 -3
  108. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  109. package/build-module/components/block-tools/use-show-block-tools.js +2 -1
  110. package/build-module/components/block-tools/use-show-block-tools.js.map +1 -1
  111. package/build-module/components/block-tools/zoom-out-mode-inserters.js +8 -4
  112. package/build-module/components/block-tools/zoom-out-mode-inserters.js.map +1 -1
  113. package/build-module/components/border-radius-control/index.js +1 -0
  114. package/build-module/components/border-radius-control/index.js.map +1 -1
  115. package/build-module/components/convert-to-group-buttons/index.js +1 -1
  116. package/build-module/components/convert-to-group-buttons/index.js.map +1 -1
  117. package/build-module/components/date-format-picker/index.js +2 -0
  118. package/build-module/components/date-format-picker/index.js.map +1 -1
  119. package/build-module/components/font-appearance-control/index.js +3 -0
  120. package/build-module/components/font-appearance-control/index.js.map +1 -1
  121. package/build-module/components/font-family/index.js +3 -0
  122. package/build-module/components/font-family/index.js.map +1 -1
  123. package/build-module/components/global-styles/background-panel.js +117 -45
  124. package/build-module/components/global-styles/background-panel.js.map +1 -1
  125. package/build-module/components/global-styles/get-global-styles-changes.js +3 -1
  126. package/build-module/components/global-styles/get-global-styles-changes.js.map +1 -1
  127. package/build-module/components/global-styles/hooks.js +0 -6
  128. package/build-module/components/global-styles/hooks.js.map +1 -1
  129. package/build-module/components/global-styles/index.js +1 -1
  130. package/build-module/components/global-styles/index.js.map +1 -1
  131. package/build-module/components/global-styles/use-global-styles-output.js +5 -5
  132. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  133. package/build-module/components/global-styles/utils.js +8 -23
  134. package/build-module/components/global-styles/utils.js.map +1 -1
  135. package/build-module/components/grid/grid-visualizer.js +20 -5
  136. package/build-module/components/grid/grid-visualizer.js.map +1 -1
  137. package/build-module/components/height-control/index.js +1 -0
  138. package/build-module/components/height-control/index.js.map +1 -1
  139. package/build-module/components/iframe/index.js +4 -2
  140. package/build-module/components/iframe/index.js.map +1 -1
  141. package/build-module/components/image-editor/zoom-dropdown.js +12 -8
  142. package/build-module/components/image-editor/zoom-dropdown.js.map +1 -1
  143. package/build-module/components/inner-blocks/button-block-appender.js +7 -6
  144. package/build-module/components/inner-blocks/button-block-appender.js.map +1 -1
  145. package/build-module/components/inner-blocks/default-block-appender.js +6 -23
  146. package/build-module/components/inner-blocks/default-block-appender.js.map +1 -1
  147. package/build-module/components/inner-blocks/index.js +9 -11
  148. package/build-module/components/inner-blocks/index.js.map +1 -1
  149. package/build-module/components/inserter/library.js +4 -2
  150. package/build-module/components/inserter/library.js.map +1 -1
  151. package/build-module/components/inserter/menu.js +30 -12
  152. package/build-module/components/inserter/menu.js.map +1 -1
  153. package/build-module/components/inserter/quick-inserter.js +5 -1
  154. package/build-module/components/inserter/quick-inserter.js.map +1 -1
  155. package/build-module/components/line-height-control/index.js +3 -0
  156. package/build-module/components/line-height-control/index.js.map +1 -1
  157. package/build-module/components/media-placeholder/index.js +9 -4
  158. package/build-module/components/media-placeholder/index.js.map +1 -1
  159. package/build-module/components/media-upload/index.native.js +4 -1
  160. package/build-module/components/media-upload/index.native.js.map +1 -1
  161. package/build-module/components/multi-selection-inspector/index.js +12 -12
  162. package/build-module/components/multi-selection-inspector/index.js.map +1 -1
  163. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js +4 -2
  164. package/build-module/components/spacing-sizes-control/input-controls/spacing-input-control.js.map +1 -1
  165. package/build-module/components/text-alignment-control/index.js +13 -8
  166. package/build-module/components/text-alignment-control/index.js.map +1 -1
  167. package/build-module/components/text-decoration-control/index.js +13 -8
  168. package/build-module/components/text-decoration-control/index.js.map +1 -1
  169. package/build-module/components/text-transform-control/index.js +13 -8
  170. package/build-module/components/text-transform-control/index.js.map +1 -1
  171. package/build-module/components/url-popover/image-url-input-ui.js +2 -0
  172. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  173. package/build-module/components/use-block-drop-zone/index.js +14 -2
  174. package/build-module/components/use-block-drop-zone/index.js.map +1 -1
  175. package/build-module/components/writing-mode-control/index.js +13 -8
  176. package/build-module/components/writing-mode-control/index.js.map +1 -1
  177. package/build-module/hooks/background.js +19 -23
  178. package/build-module/hooks/background.js.map +1 -1
  179. package/build-module/hooks/block-bindings.js +38 -80
  180. package/build-module/hooks/block-bindings.js.map +1 -1
  181. package/build-module/layouts/constrained.js +1 -0
  182. package/build-module/layouts/constrained.js.map +1 -1
  183. package/build-module/layouts/flex.js +2 -0
  184. package/build-module/layouts/flex.js.map +1 -1
  185. package/build-module/layouts/grid.js +3 -0
  186. package/build-module/layouts/grid.js.map +1 -1
  187. package/build-module/private-apis.js +3 -1
  188. package/build-module/private-apis.js.map +1 -1
  189. package/build-module/store/private-selectors.js +27 -0
  190. package/build-module/store/private-selectors.js.map +1 -1
  191. package/build-module/store/reducer.js +9 -1
  192. package/build-module/store/reducer.js.map +1 -1
  193. package/build-module/utils/block-bindings.js +105 -0
  194. package/build-module/utils/block-bindings.js.map +1 -0
  195. package/build-style/content-rtl.css +7 -14
  196. package/build-style/content.css +7 -14
  197. package/build-style/default-editor-styles-rtl.css +2 -2
  198. package/build-style/default-editor-styles.css +2 -2
  199. package/build-style/style-rtl.css +36 -38
  200. package/build-style/style.css +36 -38
  201. package/package.json +32 -32
  202. package/src/autocompleters/block.js +2 -1
  203. package/src/components/block-list/content.scss +5 -13
  204. package/src/components/block-list/use-block-props/index.js +2 -2
  205. package/src/components/block-list/use-in-between-inserter.js +17 -5
  206. package/src/components/block-settings-menu/block-mode-toggle.js +28 -31
  207. package/src/components/block-settings-menu/test/block-mode-toggle.js +26 -23
  208. package/src/components/block-tools/insertion-point.js +11 -0
  209. package/src/components/block-tools/style.scss +1 -1
  210. package/src/components/block-tools/use-show-block-tools.js +4 -1
  211. package/src/components/block-tools/zoom-out-mode-inserters.js +7 -1
  212. package/src/components/block-variation-transforms/style.scss +1 -1
  213. package/src/components/border-radius-control/index.js +1 -0
  214. package/src/components/border-radius-control/style.scss +0 -10
  215. package/src/components/convert-to-group-buttons/index.js +1 -1
  216. package/src/components/date-format-picker/index.js +2 -0
  217. package/src/components/font-appearance-control/index.js +3 -0
  218. package/src/components/font-family/README.md +11 -2
  219. package/src/components/font-family/index.js +3 -0
  220. package/src/components/global-styles/background-panel.js +132 -53
  221. package/src/components/global-styles/get-global-styles-changes.js +4 -1
  222. package/src/components/global-styles/hooks.js +0 -5
  223. package/src/components/global-styles/index.js +0 -1
  224. package/src/components/global-styles/style.scss +13 -2
  225. package/src/components/global-styles/test/use-global-styles-output.js +20 -4
  226. package/src/components/global-styles/use-global-styles-output.js +5 -6
  227. package/src/components/global-styles/utils.js +7 -29
  228. package/src/components/grid/grid-visualizer.js +22 -7
  229. package/src/components/height-control/index.js +1 -0
  230. package/src/components/iframe/index.js +4 -2
  231. package/src/components/image-editor/zoom-dropdown.js +17 -9
  232. package/src/components/inner-blocks/button-block-appender.js +5 -7
  233. package/src/components/inner-blocks/default-block-appender.js +4 -23
  234. package/src/components/inner-blocks/index.js +10 -9
  235. package/src/components/inserter/library.js +2 -0
  236. package/src/components/inserter/menu.js +32 -27
  237. package/src/components/inserter/quick-inserter.js +4 -1
  238. package/src/components/inserter/style.scss +1 -1
  239. package/src/components/inserter-list-item/style.scss +1 -0
  240. package/src/components/line-height-control/README.md +7 -0
  241. package/src/components/line-height-control/index.js +3 -0
  242. package/src/components/link-control/style.scss +1 -1
  243. package/src/components/media-placeholder/index.js +12 -7
  244. package/src/components/media-upload/README.md +2 -0
  245. package/src/components/media-upload/index.native.js +2 -0
  246. package/src/components/multi-selection-inspector/index.js +8 -9
  247. package/src/components/responsive-block-control/README.md +1 -0
  248. package/src/components/responsive-block-control/test/index.js +1 -0
  249. package/src/components/spacing-sizes-control/input-controls/spacing-input-control.js +8 -4
  250. package/src/components/spacing-sizes-control/style.scss +16 -16
  251. package/src/components/text-alignment-control/index.js +20 -8
  252. package/src/components/text-decoration-control/index.js +20 -8
  253. package/src/components/text-decoration-control/stories/index.story.js +0 -4
  254. package/src/components/text-transform-control/index.js +20 -8
  255. package/src/components/text-transform-control/stories/index.story.js +0 -4
  256. package/src/components/url-input/style.scss +2 -2
  257. package/src/components/url-popover/image-url-input-ui.js +2 -0
  258. package/src/components/use-block-drop-zone/index.js +21 -3
  259. package/src/components/writing-mode-control/index.js +20 -8
  260. package/src/hooks/background.js +21 -27
  261. package/src/hooks/block-bindings.js +27 -84
  262. package/src/hooks/block-bindings.scss +1 -1
  263. package/src/hooks/test/background.js +60 -0
  264. package/src/layouts/constrained.js +1 -0
  265. package/src/layouts/flex.js +2 -0
  266. package/src/layouts/grid.js +3 -0
  267. package/src/private-apis.js +2 -0
  268. package/src/store/private-selectors.js +36 -0
  269. package/src/store/reducer.js +7 -0
  270. package/src/store/test/private-selectors.js +89 -0
  271. package/src/style.scss +0 -1
  272. package/src/utils/block-bindings.js +98 -0
  273. package/src/utils/test/transform-styles.js +49 -0
  274. package/build/components/global-styles/theme-file-uri-utils.js +0 -21
  275. package/build/components/global-styles/theme-file-uri-utils.js.map +0 -1
  276. package/build/components/inner-blocks/with-client-id.js +0 -28
  277. package/build/components/inner-blocks/with-client-id.js.map +0 -1
  278. package/build/components/segmented-text-control/index.js +0 -63
  279. package/build/components/segmented-text-control/index.js.map +0 -1
  280. package/build-module/components/global-styles/theme-file-uri-utils.js +0 -15
  281. package/build-module/components/global-styles/theme-file-uri-utils.js.map +0 -1
  282. package/build-module/components/inner-blocks/with-client-id.js +0 -21
  283. package/build-module/components/inner-blocks/with-client-id.js.map +0 -1
  284. package/build-module/components/segmented-text-control/index.js +0 -58
  285. package/build-module/components/segmented-text-control/index.js.map +0 -1
  286. package/src/components/global-styles/test/theme-file-uri-utils.js +0 -41
  287. package/src/components/global-styles/theme-file-uri-utils.js +0 -18
  288. package/src/components/inner-blocks/with-client-id.js +0 -19
  289. package/src/components/segmented-text-control/index.js +0 -63
  290. package/src/components/segmented-text-control/style.scss +0 -15
@@ -14,11 +14,10 @@ import {
14
14
  alignJustify,
15
15
  } from '@wordpress/icons';
16
16
  import { useMemo } from '@wordpress/element';
17
-
18
- /**
19
- * Internal dependencies
20
- */
21
- import SegmentedTextControl from '../segmented-text-control';
17
+ import {
18
+ __experimentalToggleGroupControl as ToggleGroupControl,
19
+ __experimentalToggleGroupControlOptionIcon as ToggleGroupControlOptionIcon,
20
+ } from '@wordpress/components';
22
21
 
23
22
  const TEXT_ALIGNMENT_OPTIONS = [
24
23
  {
@@ -75,9 +74,11 @@ export default function TextAlignmentControl( {
75
74
  }
76
75
 
77
76
  return (
78
- <SegmentedTextControl
77
+ <ToggleGroupControl
78
+ isDeselectable
79
+ __nextHasNoMarginBottom
80
+ __next40pxDefaultSize
79
81
  label={ __( 'Text alignment' ) }
80
- options={ validOptions }
81
82
  className={ clsx(
82
83
  'block-editor-text-alignment-control',
83
84
  className
@@ -86,6 +87,17 @@ export default function TextAlignmentControl( {
86
87
  onChange={ ( newValue ) => {
87
88
  onChange( newValue === value ? undefined : newValue );
88
89
  } }
89
- />
90
+ >
91
+ { validOptions.map( ( option ) => {
92
+ return (
93
+ <ToggleGroupControlOptionIcon
94
+ key={ option.value }
95
+ value={ option.value }
96
+ icon={ option.icon }
97
+ label={ option.label }
98
+ />
99
+ );
100
+ } ) }
101
+ </ToggleGroupControl>
90
102
  );
91
103
  }
@@ -8,11 +8,10 @@ import clsx from 'clsx';
8
8
  */
9
9
  import { reset, formatStrikethrough, formatUnderline } from '@wordpress/icons';
10
10
  import { __ } from '@wordpress/i18n';
11
-
12
- /**
13
- * Internal dependencies
14
- */
15
- import SegmentedTextControl from '../segmented-text-control';
11
+ import {
12
+ __experimentalToggleGroupControl as ToggleGroupControl,
13
+ __experimentalToggleGroupControlOptionIcon as ToggleGroupControlOptionIcon,
14
+ } from '@wordpress/components';
16
15
 
17
16
  const TEXT_DECORATIONS = [
18
17
  {
@@ -48,9 +47,11 @@ export default function TextDecorationControl( {
48
47
  className,
49
48
  } ) {
50
49
  return (
51
- <SegmentedTextControl
50
+ <ToggleGroupControl
51
+ isDeselectable
52
+ __nextHasNoMarginBottom
53
+ __next40pxDefaultSize
52
54
  label={ __( 'Decoration' ) }
53
- options={ TEXT_DECORATIONS }
54
55
  className={ clsx(
55
56
  'block-editor-text-decoration-control',
56
57
  className
@@ -59,6 +60,17 @@ export default function TextDecorationControl( {
59
60
  onChange={ ( newValue ) => {
60
61
  onChange( newValue === value ? undefined : newValue );
61
62
  } }
62
- />
63
+ >
64
+ { TEXT_DECORATIONS.map( ( option ) => {
65
+ return (
66
+ <ToggleGroupControlOptionIcon
67
+ key={ option.value }
68
+ value={ option.value }
69
+ icon={ option.icon }
70
+ label={ option.label }
71
+ />
72
+ );
73
+ } ) }
74
+ </ToggleGroupControl>
63
75
  );
64
76
  }
@@ -13,10 +13,6 @@ export default {
13
13
  component: TextDecorationControl,
14
14
  argTypes: {
15
15
  onChange: { action: 'onChange' },
16
- size: {
17
- options: [ 'default', '__unstable-large' ],
18
- control: { type: 'radio' },
19
- },
20
16
  },
21
17
  };
22
18
 
@@ -13,11 +13,10 @@ import {
13
13
  formatLowercase,
14
14
  formatUppercase,
15
15
  } from '@wordpress/icons';
16
-
17
- /**
18
- * Internal dependencies
19
- */
20
- import SegmentedTextControl from '../segmented-text-control';
16
+ import {
17
+ __experimentalToggleGroupControl as ToggleGroupControl,
18
+ __experimentalToggleGroupControlOptionIcon as ToggleGroupControlOptionIcon,
19
+ } from '@wordpress/components';
21
20
 
22
21
  const TEXT_TRANSFORMS = [
23
22
  {
@@ -54,9 +53,11 @@ const TEXT_TRANSFORMS = [
54
53
  */
55
54
  export default function TextTransformControl( { className, value, onChange } ) {
56
55
  return (
57
- <SegmentedTextControl
56
+ <ToggleGroupControl
57
+ isDeselectable
58
+ __nextHasNoMarginBottom
59
+ __next40pxDefaultSize
58
60
  label={ __( 'Letter case' ) }
59
- options={ TEXT_TRANSFORMS }
60
61
  className={ clsx(
61
62
  'block-editor-text-transform-control',
62
63
  className
@@ -65,6 +66,17 @@ export default function TextTransformControl( { className, value, onChange } ) {
65
66
  onChange={ ( newValue ) => {
66
67
  onChange( newValue === value ? undefined : newValue );
67
68
  } }
68
- />
69
+ >
70
+ { TEXT_TRANSFORMS.map( ( option ) => {
71
+ return (
72
+ <ToggleGroupControlOptionIcon
73
+ key={ option.value }
74
+ value={ option.value }
75
+ icon={ option.icon }
76
+ label={ option.label }
77
+ />
78
+ );
79
+ } ) }
80
+ </ToggleGroupControl>
69
81
  );
70
82
  }
@@ -13,10 +13,6 @@ export default {
13
13
  component: TextTransformControl,
14
14
  argTypes: {
15
15
  onChange: { action: 'onChange' },
16
- size: {
17
- options: [ 'default', '__unstable-large' ],
18
- control: { type: 'radio' },
19
- },
20
16
  },
21
17
  };
22
18
 
@@ -120,8 +120,8 @@ $input-size: 300px;
120
120
  }
121
121
 
122
122
  .block-editor-url-input__button-modal {
123
- box-shadow: $shadow-popover;
124
- border: 1px solid $gray-300;
123
+ box-shadow: $elevation-x-small;
124
+ border: $border-width solid $gray-300;
125
125
  background: $white;
126
126
  }
127
127
 
@@ -227,12 +227,14 @@ const ImageURLInputUI = ( {
227
227
  checked={ linkTarget === '_blank' }
228
228
  />
229
229
  <TextControl
230
+ __next40pxDefaultSize
230
231
  __nextHasNoMarginBottom
231
232
  label={ __( 'Link rel' ) }
232
233
  value={ rel ?? '' }
233
234
  onChange={ onSetLinkRel }
234
235
  />
235
236
  <TextControl
237
+ __next40pxDefaultSize
236
238
  __nextHasNoMarginBottom
237
239
  label={ __( 'Link CSS class' ) }
238
240
  value={ linkClass || '' }
@@ -313,6 +313,8 @@ export default function useBlockDropZone( {
313
313
  getAllowedBlocks,
314
314
  isDragging,
315
315
  isGroupable,
316
+ getSettings,
317
+ isZoomOutMode,
316
318
  } = unlock( useSelect( blockEditorStore ) );
317
319
  const {
318
320
  showInsertionPoint,
@@ -343,6 +345,7 @@ export default function useBlockDropZone( {
343
345
  const targetBlockName = getBlockNamesByClientId( [
344
346
  targetRootClientId,
345
347
  ] )[ 0 ];
348
+
346
349
  const draggedBlockNames = getBlockNamesByClientId(
347
350
  getDraggedBlockClientIds()
348
351
  );
@@ -352,10 +355,23 @@ export default function useBlockDropZone( {
352
355
  draggedBlockNames,
353
356
  targetBlockName
354
357
  );
358
+
355
359
  if ( ! isBlockDroppingAllowed ) {
356
360
  return;
357
361
  }
358
362
 
363
+ const { sectionRootClientId } = unlock( getSettings() );
364
+
365
+ // In Zoom Out mode, if the target is not the section root provided by settings then
366
+ // do not allow dropping as the drop target is not within the root (that which is
367
+ // treated as "the content" by Zoom Out Mode).
368
+ if (
369
+ isZoomOutMode() &&
370
+ sectionRootClientId !== targetRootClientId
371
+ ) {
372
+ return;
373
+ }
374
+
359
375
  const blocks = getBlocks( targetRootClientId );
360
376
 
361
377
  // The block list is empty, don't show the insertion point but still allow dropping.
@@ -470,6 +486,7 @@ export default function useBlockDropZone( {
470
486
  } );
471
487
  },
472
488
  [
489
+ isDragging,
473
490
  getAllowedBlocks,
474
491
  targetRootClientId,
475
492
  getBlockNamesByClientId,
@@ -481,13 +498,14 @@ export default function useBlockDropZone( {
481
498
  parentBlockClientId,
482
499
  getBlockIndex,
483
500
  registry,
484
- showInsertionPoint,
485
- isDragging,
486
501
  startDragging,
502
+ showInsertionPoint,
487
503
  canInsertBlockType,
504
+ isGroupable,
488
505
  getBlockVariations,
489
506
  getGroupingBlockName,
490
- isGroupable,
507
+ getSettings,
508
+ isZoomOutMode,
491
509
  ]
492
510
  ),
493
511
  200
@@ -8,11 +8,10 @@ import clsx from 'clsx';
8
8
  */
9
9
  import { __, isRTL } from '@wordpress/i18n';
10
10
  import { textHorizontal, textVertical } from '@wordpress/icons';
11
-
12
- /**
13
- * Internal dependencies
14
- */
15
- import SegmentedTextControl from '../segmented-text-control';
11
+ import {
12
+ __experimentalToggleGroupControl as ToggleGroupControl,
13
+ __experimentalToggleGroupControlOptionIcon as ToggleGroupControlOptionIcon,
14
+ } from '@wordpress/components';
16
15
 
17
16
  const WRITING_MODES = [
18
17
  {
@@ -39,14 +38,27 @@ const WRITING_MODES = [
39
38
  */
40
39
  export default function WritingModeControl( { className, value, onChange } ) {
41
40
  return (
42
- <SegmentedTextControl
41
+ <ToggleGroupControl
42
+ isDeselectable
43
+ __nextHasNoMarginBottom
44
+ __next40pxDefaultSize
43
45
  label={ __( 'Orientation' ) }
44
- options={ WRITING_MODES }
45
46
  className={ clsx( 'block-editor-writing-mode-control', className ) }
46
47
  value={ value }
47
48
  onChange={ ( newValue ) => {
48
49
  onChange( newValue === value ? undefined : newValue );
49
50
  } }
50
- />
51
+ >
52
+ { WRITING_MODES.map( ( option ) => {
53
+ return (
54
+ <ToggleGroupControlOptionIcon
55
+ key={ option.value }
56
+ value={ option.value }
57
+ icon={ option.icon }
58
+ label={ option.label }
59
+ />
60
+ );
61
+ } ) }
62
+ </ToggleGroupControl>
51
63
  );
52
64
  }
@@ -16,16 +16,14 @@ import {
16
16
  useHasBackgroundPanel,
17
17
  hasBackgroundImageValue,
18
18
  } from '../components/global-styles/background-panel';
19
- import {
20
- globalStylesDataKey,
21
- globalStylesLinksDataKey,
22
- } from '../store/private-keys';
19
+ import { globalStylesDataKey } from '../store/private-keys';
23
20
 
24
21
  export const BACKGROUND_SUPPORT_KEY = 'background';
25
22
 
26
- // Initial control values where no block style is set.
27
- const BACKGROUND_DEFAULT_VALUES = {
23
+ // Initial control values.
24
+ export const BACKGROUND_BLOCK_DEFAULT_VALUES = {
28
25
  backgroundSize: 'cover',
26
+ backgroundPosition: '50% 50%', // used only when backgroundSize is 'contain'.
29
27
  };
30
28
 
31
29
  /**
@@ -55,31 +53,28 @@ export function hasBackgroundSupport( blockName, feature = 'any' ) {
55
53
  }
56
54
 
57
55
  export function setBackgroundStyleDefaults( backgroundStyle ) {
58
- if ( ! backgroundStyle ) {
56
+ if ( ! backgroundStyle || ! backgroundStyle?.backgroundImage?.url ) {
59
57
  return;
60
58
  }
61
59
 
62
- const backgroundImage = backgroundStyle?.backgroundImage;
63
60
  let backgroundStylesWithDefaults;
64
61
 
65
62
  // Set block background defaults.
66
- if ( !! backgroundImage?.url ) {
67
- if ( ! backgroundStyle?.backgroundSize ) {
68
- backgroundStylesWithDefaults = {
69
- backgroundSize: 'cover',
70
- };
71
- }
72
-
73
- if (
74
- 'contain' === backgroundStyle?.backgroundSize &&
75
- ! backgroundStyle?.backgroundPosition
76
- ) {
77
- backgroundStylesWithDefaults = {
78
- backgroundPosition: 'center',
79
- };
80
- }
63
+ if ( ! backgroundStyle?.backgroundSize ) {
64
+ backgroundStylesWithDefaults = {
65
+ backgroundSize: BACKGROUND_BLOCK_DEFAULT_VALUES.backgroundSize,
66
+ };
81
67
  }
82
68
 
69
+ if (
70
+ 'contain' === backgroundStyle?.backgroundSize &&
71
+ ! backgroundStyle?.backgroundPosition
72
+ ) {
73
+ backgroundStylesWithDefaults = {
74
+ backgroundPosition:
75
+ BACKGROUND_BLOCK_DEFAULT_VALUES.backgroundPosition,
76
+ };
77
+ }
83
78
  return backgroundStylesWithDefaults;
84
79
  }
85
80
 
@@ -138,15 +133,15 @@ export function BackgroundImagePanel( {
138
133
  setAttributes,
139
134
  settings,
140
135
  } ) {
141
- const { style, inheritedValue, _links } = useSelect(
136
+ const { style, inheritedValue } = useSelect(
142
137
  ( select ) => {
143
138
  const { getBlockAttributes, getSettings } =
144
139
  select( blockEditorStore );
145
140
  const _settings = getSettings();
146
141
  return {
147
142
  style: getBlockAttributes( clientId )?.style,
148
- _links: _settings[ globalStylesLinksDataKey ],
149
143
  /*
144
+ * To ensure we pass down the right inherited values:
150
145
  * @TODO 1. Pass inherited value down to all block style controls,
151
146
  * See: packages/block-editor/src/hooks/style.js
152
147
  * @TODO 2. Add support for block style variations,
@@ -187,11 +182,10 @@ export function BackgroundImagePanel( {
187
182
  inheritedValue={ inheritedValue }
188
183
  as={ BackgroundInspectorControl }
189
184
  panelId={ clientId }
190
- defaultValues={ BACKGROUND_DEFAULT_VALUES }
185
+ defaultValues={ BACKGROUND_BLOCK_DEFAULT_VALUES }
191
186
  settings={ updatedSettings }
192
187
  onChange={ onChange }
193
188
  value={ style }
194
- themeFileURIs={ _links?.[ 'wp:theme-file' ] }
195
189
  />
196
190
  );
197
191
  }
@@ -13,7 +13,7 @@ import {
13
13
  __experimentalVStack as VStack,
14
14
  privateApis as componentsPrivateApis,
15
15
  } from '@wordpress/components';
16
- import { useSelect, useDispatch, useRegistry } from '@wordpress/data';
16
+ import { useRegistry } from '@wordpress/data';
17
17
  import { useContext, Fragment } from '@wordpress/element';
18
18
  import { useViewportMatch } from '@wordpress/compose';
19
19
 
@@ -24,10 +24,10 @@ import {
24
24
  canBindAttribute,
25
25
  getBindableAttributes,
26
26
  } from '../hooks/use-bindings-attributes';
27
- import { store as blockEditorStore } from '../store';
28
27
  import { unlock } from '../lock-unlock';
29
28
  import InspectorControls from '../components/inspector-controls';
30
29
  import BlockContext from '../components/block-context';
30
+ import { useBlockBindingsUtils } from '../utils/block-bindings';
31
31
 
32
32
  const {
33
33
  DropdownMenuV2: DropdownMenu,
@@ -51,17 +51,15 @@ const useToolsPanelDropdownMenuProps = () => {
51
51
  : {};
52
52
  };
53
53
 
54
- function BlockBindingsPanelDropdown( {
55
- fieldsList,
56
- addConnection,
57
- attribute,
58
- binding,
59
- } ) {
54
+ function BlockBindingsPanelDropdown( { fieldsList, attribute, binding } ) {
55
+ const { getBlockBindingsSources } = unlock( blocksPrivateApis );
56
+ const registeredSources = getBlockBindingsSources();
57
+ const { updateBlockBindings } = useBlockBindingsUtils();
60
58
  const currentKey = binding?.args?.key;
61
59
  return (
62
60
  <>
63
- { Object.entries( fieldsList ).map( ( [ label, fields ], i ) => (
64
- <Fragment key={ label }>
61
+ { Object.entries( fieldsList ).map( ( [ name, fields ], i ) => (
62
+ <Fragment key={ name }>
65
63
  <DropdownMenuGroup>
66
64
  { Object.keys( fieldsList ).length > 1 && (
67
65
  <Text
@@ -70,14 +68,19 @@ function BlockBindingsPanelDropdown( {
70
68
  variant="muted"
71
69
  aria-hidden
72
70
  >
73
- { label }
71
+ { registeredSources[ name ].label }
74
72
  </Text>
75
73
  ) }
76
74
  { Object.entries( fields ).map( ( [ key, value ] ) => (
77
75
  <DropdownMenuRadioItem
78
76
  key={ key }
79
77
  onChange={ () =>
80
- addConnection( key, attribute )
78
+ updateBlockBindings( {
79
+ [ attribute ]: {
80
+ source: name,
81
+ args: { key },
82
+ },
83
+ } )
81
84
  }
82
85
  name={ attribute + '-binding' }
83
86
  value={ key }
@@ -141,9 +144,8 @@ function EditableBlockBindingsPanelItems( {
141
144
  attributes,
142
145
  bindings,
143
146
  fieldsList,
144
- addConnection,
145
- removeConnection,
146
147
  } ) {
148
+ const { updateBlockBindings } = useBlockBindingsUtils();
147
149
  const isMobile = useViewportMatch( 'medium', '<' );
148
150
  return (
149
151
  <>
@@ -155,7 +157,9 @@ function EditableBlockBindingsPanelItems( {
155
157
  hasValue={ () => !! binding }
156
158
  label={ attribute }
157
159
  onDeselect={ () => {
158
- removeConnection( attribute );
160
+ updateBlockBindings( {
161
+ [ attribute ]: undefined,
162
+ } );
159
163
  } }
160
164
  >
161
165
  <DropdownMenu
@@ -175,7 +179,6 @@ function EditableBlockBindingsPanelItems( {
175
179
  >
176
180
  <BlockBindingsPanelDropdown
177
181
  fieldsList={ fieldsList }
178
- addConnection={ addConnection }
179
182
  attribute={ attribute }
180
183
  binding={ binding }
181
184
  />
@@ -187,91 +190,33 @@ function EditableBlockBindingsPanelItems( {
187
190
  );
188
191
  }
189
192
 
190
- export const BlockBindingsPanel = ( { name, metadata } ) => {
193
+ export const BlockBindingsPanel = ( { name: blockName, metadata } ) => {
191
194
  const registry = useRegistry();
192
195
  const blockContext = useContext( BlockContext );
193
196
  const { bindings } = metadata || {};
194
-
195
- const bindableAttributes = getBindableAttributes( name );
197
+ const { removeAllBlockBindings } = useBlockBindingsUtils();
198
+ const bindableAttributes = getBindableAttributes( blockName );
196
199
  const dropdownMenuProps = useToolsPanelDropdownMenuProps();
197
200
 
198
201
  const filteredBindings = { ...bindings };
199
202
  Object.keys( filteredBindings ).forEach( ( key ) => {
200
203
  if (
201
- ! canBindAttribute( name, key ) ||
204
+ ! canBindAttribute( blockName, key ) ||
202
205
  filteredBindings[ key ].source === 'core/pattern-overrides'
203
206
  ) {
204
207
  delete filteredBindings[ key ];
205
208
  }
206
209
  } );
207
210
 
208
- const { updateBlockAttributes } = useDispatch( blockEditorStore );
209
-
210
- const { _id } = useSelect( ( select ) => {
211
- const { getSelectedBlockClientId } = select( blockEditorStore );
212
-
213
- return {
214
- _id: getSelectedBlockClientId(),
215
- };
216
- }, [] );
217
-
218
211
  if ( ! bindableAttributes || bindableAttributes.length === 0 ) {
219
212
  return null;
220
213
  }
221
214
 
222
- const removeAllConnections = () => {
223
- const newMetadata = { ...metadata };
224
- delete newMetadata.bindings;
225
- updateBlockAttributes( _id, {
226
- metadata:
227
- Object.keys( newMetadata ).length === 0
228
- ? undefined
229
- : newMetadata,
230
- } );
231
- };
232
-
233
- const addConnection = ( value, attribute ) => {
234
- // Assuming the block expects a flat structure for its metadata attribute
235
- const newMetadata = {
236
- ...metadata,
237
- // Adjust this according to the actual structure expected by your block
238
- bindings: {
239
- ...metadata?.bindings,
240
- [ attribute ]: {
241
- source: 'core/post-meta',
242
- args: { key: value },
243
- },
244
- },
245
- };
246
- // Update the block's attributes with the new metadata
247
- updateBlockAttributes( _id, {
248
- metadata: newMetadata,
249
- } );
250
- };
251
-
252
- const removeConnection = ( key ) => {
253
- const newMetadata = { ...metadata };
254
- if ( ! newMetadata.bindings ) {
255
- return;
256
- }
257
-
258
- delete newMetadata.bindings[ key ];
259
- if ( Object.keys( newMetadata.bindings ).length === 0 ) {
260
- delete newMetadata.bindings;
261
- }
262
- updateBlockAttributes( _id, {
263
- metadata:
264
- Object.keys( newMetadata ).length === 0
265
- ? undefined
266
- : newMetadata,
267
- } );
268
- };
269
-
270
215
  const fieldsList = {};
271
216
  const { getBlockBindingsSources } = unlock( blocksPrivateApis );
272
217
  const registeredSources = getBlockBindingsSources();
273
- Object.values( registeredSources ).forEach(
274
- ( { getFieldsList, label, usesContext } ) => {
218
+ Object.entries( registeredSources ).forEach(
219
+ ( [ sourceName, { getFieldsList, usesContext } ] ) => {
275
220
  if ( getFieldsList ) {
276
221
  // Populate context.
277
222
  const context = {};
@@ -286,7 +231,7 @@ export const BlockBindingsPanel = ( { name, metadata } ) => {
286
231
  } );
287
232
  // Only add source if the list is not empty.
288
233
  if ( sourceList ) {
289
- fieldsList[ label ] = { ...sourceList };
234
+ fieldsList[ sourceName ] = { ...sourceList };
290
235
  }
291
236
  }
292
237
  }
@@ -312,7 +257,7 @@ export const BlockBindingsPanel = ( { name, metadata } ) => {
312
257
  <ToolsPanel
313
258
  label={ __( 'Attributes' ) }
314
259
  resetAll={ () => {
315
- removeAllConnections();
260
+ removeAllBlockBindings();
316
261
  } }
317
262
  dropdownMenuProps={ dropdownMenuProps }
318
263
  className="block-editor-bindings__panel"
@@ -327,8 +272,6 @@ export const BlockBindingsPanel = ( { name, metadata } ) => {
327
272
  attributes={ bindableAttributes }
328
273
  bindings={ filteredBindings }
329
274
  fieldsList={ fieldsList }
330
- addConnection={ addConnection }
331
- removeConnection={ removeConnection }
332
275
  />
333
276
  ) }
334
277
  </ItemGroup>
@@ -1,5 +1,5 @@
1
1
  div.block-editor-bindings__panel {
2
- grid-template-columns: auto;
2
+ grid-template-columns: repeat(auto-fit, minmax(100%, 1fr));
3
3
  button:hover .block-editor-bindings__item-explanation {
4
4
  color: inherit;
5
5
  }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import {
5
+ setBackgroundStyleDefaults,
6
+ BACKGROUND_BLOCK_DEFAULT_VALUES,
7
+ } from '../background';
8
+
9
+ describe( 'background', () => {
10
+ describe( 'setBackgroundStyleDefaults', () => {
11
+ const backgroundStyles = {
12
+ backgroundImage: { id: 123, url: 'image.png' },
13
+ };
14
+ const backgroundStylesContain = {
15
+ backgroundImage: { id: 123, url: 'image.png' },
16
+ backgroundSize: 'contain',
17
+ };
18
+ const backgroundStylesNoURL = { backgroundImage: { id: 123 } };
19
+ it.each( [
20
+ [
21
+ 'return background size default',
22
+ backgroundStyles,
23
+ {
24
+ backgroundSize:
25
+ BACKGROUND_BLOCK_DEFAULT_VALUES.backgroundSize,
26
+ },
27
+ ],
28
+ [ 'return early if no styles are passed', undefined, undefined ],
29
+ [
30
+ 'return early if images has no id',
31
+ backgroundStylesNoURL,
32
+ undefined,
33
+ ],
34
+ [
35
+ 'return early if images has no URL',
36
+ backgroundStylesNoURL,
37
+ undefined,
38
+ ],
39
+ [
40
+ 'return background position default',
41
+ backgroundStylesContain,
42
+ {
43
+ backgroundPosition:
44
+ BACKGROUND_BLOCK_DEFAULT_VALUES.backgroundPosition,
45
+ },
46
+ ],
47
+ [
48
+ 'not apply background position value if one already exists in styles',
49
+ {
50
+ ...backgroundStylesContain,
51
+ backgroundPosition: 'center',
52
+ },
53
+ undefined,
54
+ ],
55
+ ] )( 'should %s', ( message, styles, expected ) => {
56
+ const result = setBackgroundStyleDefaults( styles );
57
+ expect( result ).toEqual( expected );
58
+ } );
59
+ } );
60
+ } );