@wordpress/block-editor 12.22.0 → 12.23.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 (273) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/README.md +4 -0
  3. package/build/components/block-list/block.js +11 -3
  4. package/build/components/block-list/block.js.map +1 -1
  5. package/build/components/block-mover/button.js +4 -1
  6. package/build/components/block-mover/button.js.map +1 -1
  7. package/build/components/block-mover/index.js +5 -1
  8. package/build/components/block-mover/index.js.map +1 -1
  9. package/build/components/block-patterns-list/index.js +4 -1
  10. package/build/components/block-patterns-list/index.js.map +1 -1
  11. package/build/components/block-settings-menu/block-settings-dropdown.js +7 -3
  12. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  13. package/build/components/block-switcher/index.js +4 -3
  14. package/build/components/block-switcher/index.js.map +1 -1
  15. package/build/components/block-toolbar/index.js +5 -4
  16. package/build/components/block-toolbar/index.js.map +1 -1
  17. package/build/components/block-toolbar/shuffle.js +18 -9
  18. package/build/components/block-toolbar/shuffle.js.map +1 -1
  19. package/build/components/block-tools/block-selection-button.js +48 -8
  20. package/build/components/block-tools/block-selection-button.js.map +1 -1
  21. package/build/components/block-tools/index.js +14 -2
  22. package/build/components/block-tools/index.js.map +1 -1
  23. package/build/components/global-styles/advanced-panel.js +9 -2
  24. package/build/components/global-styles/advanced-panel.js.map +1 -1
  25. package/build/components/global-styles/background-panel.js +444 -0
  26. package/build/components/global-styles/background-panel.js.map +1 -0
  27. package/build/components/global-styles/color-panel.js +2 -1
  28. package/build/components/global-styles/color-panel.js.map +1 -1
  29. package/build/components/global-styles/get-global-styles-changes.js +3 -0
  30. package/build/components/global-styles/get-global-styles-changes.js.map +1 -1
  31. package/build/components/global-styles/hooks.js +1 -1
  32. package/build/components/global-styles/hooks.js.map +1 -1
  33. package/build/components/global-styles/index.js +13 -0
  34. package/build/components/global-styles/index.js.map +1 -1
  35. package/build/components/global-styles/use-global-styles-output.js +15 -14
  36. package/build/components/global-styles/use-global-styles-output.js.map +1 -1
  37. package/build/components/global-styles/utils.js +2 -1
  38. package/build/components/global-styles/utils.js.map +1 -1
  39. package/build/components/iframe/index.js +9 -4
  40. package/build/components/iframe/index.js.map +1 -1
  41. package/build/components/inserter/block-patterns-tab/index.js.map +1 -1
  42. package/build/components/inserter/block-patterns-tab/pattern-category-preview-panel.js +5 -0
  43. package/build/components/inserter/block-patterns-tab/pattern-category-preview-panel.js.map +1 -1
  44. package/build/components/inserter/library.js +2 -0
  45. package/build/components/inserter/library.js.map +1 -1
  46. package/build/components/inserter/menu.js +8 -2
  47. package/build/components/inserter/menu.js.map +1 -1
  48. package/build/components/inserter/search-items.js +36 -15
  49. package/build/components/inserter/search-items.js.map +1 -1
  50. package/build/components/keyboard-shortcuts/index.js +11 -0
  51. package/build/components/keyboard-shortcuts/index.js.map +1 -1
  52. package/build/components/list-view/block-select-button.js +16 -0
  53. package/build/components/list-view/block-select-button.js.map +1 -1
  54. package/build/components/list-view/block.js +1 -1
  55. package/build/components/list-view/block.js.map +1 -1
  56. package/build/components/list-view/index.js +17 -2
  57. package/build/components/list-view/index.js.map +1 -1
  58. package/build/components/list-view/use-list-view-collapse-items.js +47 -0
  59. package/build/components/list-view/use-list-view-collapse-items.js.map +1 -0
  60. package/build/components/rich-text/index.js +14 -11
  61. package/build/components/rich-text/index.js.map +1 -1
  62. package/build/components/rich-text/index.native.js +17 -11
  63. package/build/components/rich-text/index.native.js.map +1 -1
  64. package/build/components/rich-text/native/get-format-colors.native.js +1 -1
  65. package/build/components/rich-text/native/get-format-colors.native.js.map +1 -1
  66. package/build/components/rich-text/native/index.native.js +2 -2
  67. package/build/components/rich-text/native/index.native.js.map +1 -1
  68. package/build/components/rich-text/with-deprecations.js +0 -3
  69. package/build/components/rich-text/with-deprecations.js.map +1 -1
  70. package/build/components/url-popover/image-url-input-ui.js +50 -36
  71. package/build/components/url-popover/image-url-input-ui.js.map +1 -1
  72. package/build/components/use-block-display-information/index.js +4 -6
  73. package/build/components/use-block-display-information/index.js.map +1 -1
  74. package/build/hooks/anchor.js +2 -2
  75. package/build/hooks/anchor.js.map +1 -1
  76. package/build/hooks/background.js +70 -424
  77. package/build/hooks/background.js.map +1 -1
  78. package/build/hooks/index.js +7 -0
  79. package/build/hooks/index.js.map +1 -1
  80. package/build/hooks/use-zoom-out.js +47 -0
  81. package/build/hooks/use-zoom-out.js.map +1 -0
  82. package/build/index.js +7 -0
  83. package/build/index.js.map +1 -1
  84. package/build/private-apis.js +6 -1
  85. package/build/private-apis.js.map +1 -1
  86. package/build/private-apis.native.js +3 -1
  87. package/build/private-apis.native.js.map +1 -1
  88. package/build/store/private-actions.js +13 -0
  89. package/build/store/private-actions.js.map +1 -1
  90. package/build/store/private-keys.js +2 -1
  91. package/build/store/private-keys.js.map +1 -1
  92. package/build/store/private-selectors.js +24 -3
  93. package/build/store/private-selectors.js.map +1 -1
  94. package/build/store/reducer.js +22 -0
  95. package/build/store/reducer.js.map +1 -1
  96. package/build/store/selectors.js +34 -32
  97. package/build/store/selectors.js.map +1 -1
  98. package/build/store/utils.js +7 -1
  99. package/build/store/utils.js.map +1 -1
  100. package/build/utils/transform-styles/index.js +2 -1
  101. package/build/utils/transform-styles/index.js.map +1 -1
  102. package/build-module/components/block-list/block.js +11 -3
  103. package/build-module/components/block-list/block.js.map +1 -1
  104. package/build-module/components/block-mover/button.js +4 -1
  105. package/build-module/components/block-mover/button.js.map +1 -1
  106. package/build-module/components/block-mover/index.js +5 -1
  107. package/build-module/components/block-mover/index.js.map +1 -1
  108. package/build-module/components/block-patterns-list/index.js +4 -1
  109. package/build-module/components/block-patterns-list/index.js.map +1 -1
  110. package/build-module/components/block-settings-menu/block-settings-dropdown.js +7 -3
  111. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  112. package/build-module/components/block-switcher/index.js +4 -3
  113. package/build-module/components/block-switcher/index.js.map +1 -1
  114. package/build-module/components/block-toolbar/index.js +5 -4
  115. package/build-module/components/block-toolbar/index.js.map +1 -1
  116. package/build-module/components/block-toolbar/shuffle.js +18 -9
  117. package/build-module/components/block-toolbar/shuffle.js.map +1 -1
  118. package/build-module/components/block-tools/block-selection-button.js +50 -10
  119. package/build-module/components/block-tools/block-selection-button.js.map +1 -1
  120. package/build-module/components/block-tools/index.js +14 -2
  121. package/build-module/components/block-tools/index.js.map +1 -1
  122. package/build-module/components/global-styles/advanced-panel.js +9 -2
  123. package/build-module/components/global-styles/advanced-panel.js.map +1 -1
  124. package/build-module/components/global-styles/background-panel.js +430 -0
  125. package/build-module/components/global-styles/background-panel.js.map +1 -0
  126. package/build-module/components/global-styles/color-panel.js +2 -1
  127. package/build-module/components/global-styles/color-panel.js.map +1 -1
  128. package/build-module/components/global-styles/get-global-styles-changes.js +3 -0
  129. package/build-module/components/global-styles/get-global-styles-changes.js.map +1 -1
  130. package/build-module/components/global-styles/hooks.js +1 -1
  131. package/build-module/components/global-styles/hooks.js.map +1 -1
  132. package/build-module/components/global-styles/index.js +1 -0
  133. package/build-module/components/global-styles/index.js.map +1 -1
  134. package/build-module/components/global-styles/use-global-styles-output.js +16 -15
  135. package/build-module/components/global-styles/use-global-styles-output.js.map +1 -1
  136. package/build-module/components/global-styles/utils.js +1 -0
  137. package/build-module/components/global-styles/utils.js.map +1 -1
  138. package/build-module/components/iframe/index.js +9 -4
  139. package/build-module/components/iframe/index.js.map +1 -1
  140. package/build-module/components/inserter/block-patterns-tab/index.js.map +1 -1
  141. package/build-module/components/inserter/block-patterns-tab/pattern-category-preview-panel.js +5 -0
  142. package/build-module/components/inserter/block-patterns-tab/pattern-category-preview-panel.js.map +1 -1
  143. package/build-module/components/inserter/library.js +2 -0
  144. package/build-module/components/inserter/library.js.map +1 -1
  145. package/build-module/components/inserter/menu.js +8 -2
  146. package/build-module/components/inserter/menu.js.map +1 -1
  147. package/build-module/components/inserter/search-items.js +33 -15
  148. package/build-module/components/inserter/search-items.js.map +1 -1
  149. package/build-module/components/keyboard-shortcuts/index.js +11 -0
  150. package/build-module/components/keyboard-shortcuts/index.js.map +1 -1
  151. package/build-module/components/list-view/block-select-button.js +16 -0
  152. package/build-module/components/list-view/block-select-button.js.map +1 -1
  153. package/build-module/components/list-view/block.js +1 -1
  154. package/build-module/components/list-view/block.js.map +1 -1
  155. package/build-module/components/list-view/index.js +17 -2
  156. package/build-module/components/list-view/index.js.map +1 -1
  157. package/build-module/components/list-view/use-list-view-collapse-items.js +40 -0
  158. package/build-module/components/list-view/use-list-view-collapse-items.js.map +1 -0
  159. package/build-module/components/rich-text/index.js +15 -12
  160. package/build-module/components/rich-text/index.js.map +1 -1
  161. package/build-module/components/rich-text/index.native.js +16 -11
  162. package/build-module/components/rich-text/index.native.js.map +1 -1
  163. package/build-module/components/rich-text/native/get-format-colors.native.js +1 -1
  164. package/build-module/components/rich-text/native/get-format-colors.native.js.map +1 -1
  165. package/build-module/components/rich-text/native/index.native.js +2 -2
  166. package/build-module/components/rich-text/native/index.native.js.map +1 -1
  167. package/build-module/components/rich-text/with-deprecations.js +0 -3
  168. package/build-module/components/rich-text/with-deprecations.js.map +1 -1
  169. package/build-module/components/url-popover/image-url-input-ui.js +50 -36
  170. package/build-module/components/url-popover/image-url-input-ui.js.map +1 -1
  171. package/build-module/components/use-block-display-information/index.js +5 -7
  172. package/build-module/components/use-block-display-information/index.js.map +1 -1
  173. package/build-module/hooks/anchor.js +2 -2
  174. package/build-module/hooks/anchor.js.map +1 -1
  175. package/build-module/hooks/background.js +67 -419
  176. package/build-module/hooks/background.js.map +1 -1
  177. package/build-module/hooks/index.js +1 -0
  178. package/build-module/hooks/index.js.map +1 -1
  179. package/build-module/hooks/use-zoom-out.js +41 -0
  180. package/build-module/hooks/use-zoom-out.js.map +1 -0
  181. package/build-module/index.js +1 -1
  182. package/build-module/index.js.map +1 -1
  183. package/build-module/private-apis.js +7 -2
  184. package/build-module/private-apis.js.map +1 -1
  185. package/build-module/private-apis.native.js +3 -1
  186. package/build-module/private-apis.native.js.map +1 -1
  187. package/build-module/store/private-actions.js +12 -0
  188. package/build-module/store/private-actions.js.map +1 -1
  189. package/build-module/store/private-keys.js +1 -0
  190. package/build-module/store/private-keys.js.map +1 -1
  191. package/build-module/store/private-selectors.js +22 -4
  192. package/build-module/store/private-selectors.js.map +1 -1
  193. package/build-module/store/reducer.js +21 -0
  194. package/build-module/store/reducer.js.map +1 -1
  195. package/build-module/store/selectors.js +35 -33
  196. package/build-module/store/selectors.js.map +1 -1
  197. package/build-module/store/utils.js +6 -1
  198. package/build-module/store/utils.js.map +1 -1
  199. package/build-module/utils/transform-styles/index.js +2 -1
  200. package/build-module/utils/transform-styles/index.js.map +1 -1
  201. package/build-style/content-rtl.css +4 -1
  202. package/build-style/content.css +4 -1
  203. package/build-style/style-rtl.css +84 -79
  204. package/build-style/style.css +84 -79
  205. package/package.json +31 -31
  206. package/src/components/block-list/block.js +19 -3
  207. package/src/components/block-mover/button.js +4 -1
  208. package/src/components/block-mover/index.js +8 -1
  209. package/src/components/block-patterns-list/index.js +22 -17
  210. package/src/components/block-preview/style.scss +28 -0
  211. package/src/components/block-settings-menu/block-settings-dropdown.js +8 -2
  212. package/src/components/block-switcher/index.js +5 -3
  213. package/src/components/block-switcher/style.scss +1 -1
  214. package/src/components/block-toolbar/index.js +22 -19
  215. package/src/components/block-toolbar/shuffle.js +19 -13
  216. package/src/components/block-toolbar/style.scss +1 -1
  217. package/src/components/block-tools/block-selection-button.js +66 -9
  218. package/src/components/block-tools/index.js +18 -1
  219. package/src/components/button-block-appender/content.scss +5 -1
  220. package/src/components/default-block-appender/content.scss +2 -2
  221. package/src/components/global-styles/advanced-panel.js +8 -2
  222. package/src/components/global-styles/background-panel.js +591 -0
  223. package/src/components/global-styles/color-panel.js +2 -1
  224. package/src/components/global-styles/get-global-styles-changes.js +3 -0
  225. package/src/components/global-styles/hooks.js +1 -0
  226. package/src/components/global-styles/index.js +4 -0
  227. package/src/components/global-styles/style.scss +78 -1
  228. package/src/{hooks/test/background.js → components/global-styles/test/background-panel.js} +36 -1
  229. package/src/components/global-styles/test/get-global-styles-changes.js +22 -3
  230. package/src/components/global-styles/test/use-global-styles-output.js +9 -9
  231. package/src/components/global-styles/use-global-styles-output.js +27 -16
  232. package/src/components/global-styles/utils.js +1 -0
  233. package/src/components/iframe/index.js +19 -9
  234. package/src/components/inserter/block-patterns-tab/index.js +1 -0
  235. package/src/components/inserter/block-patterns-tab/pattern-category-preview-panel.js +5 -0
  236. package/src/components/inserter/library.js +4 -0
  237. package/src/components/inserter/menu.js +8 -1
  238. package/src/components/inserter/search-items.js +37 -15
  239. package/src/components/inserter/style.scss +6 -12
  240. package/src/components/keyboard-shortcuts/index.js +11 -0
  241. package/src/components/list-view/block-select-button.js +13 -1
  242. package/src/components/list-view/block.js +1 -1
  243. package/src/components/list-view/index.js +18 -1
  244. package/src/components/list-view/style.scss +4 -4
  245. package/src/components/list-view/use-list-view-collapse-items.js +33 -0
  246. package/src/components/rich-text/index.js +30 -13
  247. package/src/components/rich-text/index.native.js +14 -11
  248. package/src/components/rich-text/native/get-format-colors.native.js +1 -1
  249. package/src/components/rich-text/native/index.native.js +2 -2
  250. package/src/components/rich-text/with-deprecations.js +0 -3
  251. package/src/components/url-popover/image-url-input-ui.js +68 -51
  252. package/src/components/use-block-display-information/index.js +8 -10
  253. package/src/hooks/anchor.js +11 -9
  254. package/src/hooks/background.js +77 -538
  255. package/src/hooks/index.js +1 -0
  256. package/src/hooks/use-zoom-out.js +36 -0
  257. package/src/index.js +1 -0
  258. package/src/private-apis.js +13 -1
  259. package/src/private-apis.native.js +2 -0
  260. package/src/store/private-actions.js +12 -0
  261. package/src/store/private-keys.js +1 -0
  262. package/src/store/private-selectors.js +54 -27
  263. package/src/store/reducer.js +22 -0
  264. package/src/store/selectors.js +195 -180
  265. package/src/store/test/private-actions.js +10 -0
  266. package/src/store/test/private-selectors.js +13 -0
  267. package/src/store/test/reducer.js +26 -0
  268. package/src/store/test/selectors.js +90 -199
  269. package/src/store/utils.js +13 -0
  270. package/src/style.scss +0 -2
  271. package/src/utils/transform-styles/index.js +2 -1
  272. package/src/hooks/anchor.scss +0 -4
  273. package/src/hooks/background.scss +0 -75
@@ -0,0 +1,430 @@
1
+ import { createElement } from "react";
2
+ /**
3
+ * External dependencies
4
+ */
5
+ import classnames from 'classnames';
6
+
7
+ /**
8
+ * WordPress dependencies
9
+ */
10
+ import { __experimentalToolsPanel as ToolsPanel, __experimentalToolsPanelItem as ToolsPanelItem, ToggleControl, __experimentalToggleGroupControl as ToggleGroupControl, __experimentalToggleGroupControlOption as ToggleGroupControlOption, __experimentalUnitControl as UnitControl, __experimentalVStack as VStack, DropZone, FlexItem, FocalPointPicker, MenuItem, VisuallyHidden, __experimentalItemGroup as ItemGroup, __experimentalHStack as HStack, __experimentalTruncate as Truncate } from '@wordpress/components';
11
+ import { __, sprintf } from '@wordpress/i18n';
12
+ import { store as noticesStore } from '@wordpress/notices';
13
+ import { getFilename } from '@wordpress/url';
14
+ import { useCallback, Platform, useRef } from '@wordpress/element';
15
+ import { useDispatch, useSelect } from '@wordpress/data';
16
+ import { focus } from '@wordpress/dom';
17
+ import { isBlobURL } from '@wordpress/blob';
18
+
19
+ /**
20
+ * Internal dependencies
21
+ */
22
+ import { TOOLSPANEL_DROPDOWNMENU_PROPS } from './utils';
23
+ import { setImmutably } from '../../utils/object';
24
+ import MediaReplaceFlow from '../media-replace-flow';
25
+ import { store as blockEditorStore } from '../../store';
26
+ const IMAGE_BACKGROUND_TYPE = 'image';
27
+
28
+ /**
29
+ * Checks site settings to see if the background panel may be used.
30
+ * `settings.background.backgroundSize` exists also,
31
+ * but can only be used if settings?.background?.backgroundImage is `true`.
32
+ *
33
+ * @param {Object} settings Site settings
34
+ * @return {boolean} Whether site settings has activated background panel.
35
+ */
36
+ export function useHasBackgroundPanel(settings) {
37
+ return Platform.OS === 'web' && settings?.background?.backgroundImage;
38
+ }
39
+
40
+ /**
41
+ * Checks if there is a current value in the background size block support
42
+ * attributes. Background size values include background size as well
43
+ * as background position.
44
+ *
45
+ * @param {Object} style Style attribute.
46
+ * @return {boolean} Whether the block has a background size value set.
47
+ */
48
+ export function hasBackgroundSizeValue(style) {
49
+ return style?.background?.backgroundPosition !== undefined || style?.background?.backgroundSize !== undefined;
50
+ }
51
+
52
+ /**
53
+ * Checks if there is a current value in the background image block support
54
+ * attributes.
55
+ *
56
+ * @param {Object} style Style attribute.
57
+ * @return {boolean} Whether the block has a background image value set.
58
+ */
59
+ export function hasBackgroundImageValue(style) {
60
+ return !!style?.background?.backgroundImage?.id || !!style?.background?.backgroundImage?.url;
61
+ }
62
+
63
+ /**
64
+ * Get the help text for the background size control.
65
+ *
66
+ * @param {string} value backgroundSize value.
67
+ * @return {string} Translated help text.
68
+ */
69
+ function backgroundSizeHelpText(value) {
70
+ if (value === 'cover' || value === undefined) {
71
+ return __('Image covers the space evenly.');
72
+ }
73
+ if (value === 'contain') {
74
+ return __('Image is contained without distortion.');
75
+ }
76
+ return __('Specify a fixed width.');
77
+ }
78
+
79
+ /**
80
+ * Converts decimal x and y coords from FocalPointPicker to percentage-based values
81
+ * to use as backgroundPosition value.
82
+ *
83
+ * @param {{x?:number, y?:number}} value FocalPointPicker coords.
84
+ * @return {string} backgroundPosition value.
85
+ */
86
+ export const coordsToBackgroundPosition = value => {
87
+ if (!value || isNaN(value.x) && isNaN(value.y)) {
88
+ return undefined;
89
+ }
90
+ const x = isNaN(value.x) ? 0.5 : value.x;
91
+ const y = isNaN(value.y) ? 0.5 : value.y;
92
+ return `${x * 100}% ${y * 100}%`;
93
+ };
94
+
95
+ /**
96
+ * Converts backgroundPosition value to x and y coords for FocalPointPicker.
97
+ *
98
+ * @param {string} value backgroundPosition value.
99
+ * @return {{x?:number, y?:number}} FocalPointPicker coords.
100
+ */
101
+ export const backgroundPositionToCoords = value => {
102
+ if (!value) {
103
+ return {
104
+ x: undefined,
105
+ y: undefined
106
+ };
107
+ }
108
+ let [x, y] = value.split(' ').map(v => parseFloat(v) / 100);
109
+ x = isNaN(x) ? undefined : x;
110
+ y = isNaN(y) ? x : y;
111
+ return {
112
+ x,
113
+ y
114
+ };
115
+ };
116
+ function InspectorImagePreview({
117
+ label,
118
+ filename,
119
+ url: imgUrl
120
+ }) {
121
+ const imgLabel = label || getFilename(imgUrl);
122
+ return createElement(ItemGroup, {
123
+ as: "span"
124
+ }, createElement(HStack, {
125
+ justify: "flex-start",
126
+ as: "span"
127
+ }, createElement("span", {
128
+ className: classnames('block-editor-global-styles-background-panel__inspector-image-indicator-wrapper', {
129
+ 'has-image': imgUrl
130
+ }),
131
+ "aria-hidden": true
132
+ }, imgUrl && createElement("span", {
133
+ className: "block-editor-global-styles-background-panel__inspector-image-indicator",
134
+ style: {
135
+ backgroundImage: `url(${imgUrl})`
136
+ }
137
+ })), createElement(FlexItem, {
138
+ as: "span"
139
+ }, createElement(Truncate, {
140
+ numberOfLines: 1,
141
+ className: "block-editor-global-styles-background-panel__inspector-media-replace-title"
142
+ }, imgLabel), createElement(VisuallyHidden, {
143
+ as: "span"
144
+ }, filename ? sprintf( /* translators: %s: file name */
145
+ __('Selected image: %s'), filename) : __('No image selected')))));
146
+ }
147
+ function BackgroundImageToolsPanelItem({
148
+ panelId,
149
+ isShownByDefault,
150
+ onChange,
151
+ style,
152
+ inheritedValue
153
+ }) {
154
+ const mediaUpload = useSelect(select => select(blockEditorStore).getSettings().mediaUpload, []);
155
+ const {
156
+ id,
157
+ title,
158
+ url
159
+ } = style?.background?.backgroundImage || {
160
+ ...inheritedValue?.background?.backgroundImage
161
+ };
162
+ const replaceContainerRef = useRef();
163
+ const {
164
+ createErrorNotice
165
+ } = useDispatch(noticesStore);
166
+ const onUploadError = message => {
167
+ createErrorNotice(message, {
168
+ type: 'snackbar'
169
+ });
170
+ };
171
+ const resetBackgroundImage = () => onChange(setImmutably(style, ['background', 'backgroundImage'], undefined));
172
+ const onSelectMedia = media => {
173
+ if (!media || !media.url) {
174
+ resetBackgroundImage();
175
+ return;
176
+ }
177
+ if (isBlobURL(media.url)) {
178
+ return;
179
+ }
180
+
181
+ // For media selections originated from a file upload.
182
+ if (media.media_type && media.media_type !== IMAGE_BACKGROUND_TYPE || !media.media_type && media.type && media.type !== IMAGE_BACKGROUND_TYPE) {
183
+ onUploadError(__('Only images can be used as a background image.'));
184
+ return;
185
+ }
186
+ onChange(setImmutably(style, ['background', 'backgroundImage'], {
187
+ url: media.url,
188
+ id: media.id,
189
+ source: 'file',
190
+ title: media.title || undefined
191
+ }));
192
+ };
193
+ const onFilesDrop = filesList => {
194
+ mediaUpload({
195
+ allowedTypes: ['image'],
196
+ filesList,
197
+ onFileChange([image]) {
198
+ if (isBlobURL(image?.url)) {
199
+ return;
200
+ }
201
+ onSelectMedia(image);
202
+ },
203
+ onError: onUploadError
204
+ });
205
+ };
206
+ const resetAllFilter = useCallback(previousValue => {
207
+ return {
208
+ ...previousValue,
209
+ style: {
210
+ ...previousValue.style,
211
+ background: undefined
212
+ }
213
+ };
214
+ }, []);
215
+ const hasValue = hasBackgroundImageValue(style) || hasBackgroundImageValue(inheritedValue);
216
+ return createElement(ToolsPanelItem, {
217
+ className: "single-column",
218
+ hasValue: () => hasValue,
219
+ label: __('Background image'),
220
+ onDeselect: resetBackgroundImage,
221
+ isShownByDefault: isShownByDefault,
222
+ resetAllFilter: resetAllFilter,
223
+ panelId: panelId
224
+ }, createElement("div", {
225
+ className: "block-editor-global-styles-background-panel__inspector-media-replace-container",
226
+ ref: replaceContainerRef
227
+ }, createElement(MediaReplaceFlow, {
228
+ mediaId: id,
229
+ mediaURL: url,
230
+ allowedTypes: [IMAGE_BACKGROUND_TYPE],
231
+ accept: "image/*",
232
+ onSelect: onSelectMedia,
233
+ name: createElement(InspectorImagePreview, {
234
+ label: __('Background image'),
235
+ filename: title || __('Untitled'),
236
+ url: url
237
+ }),
238
+ variant: "secondary"
239
+ }, hasValue && createElement(MenuItem, {
240
+ onClick: () => {
241
+ const [toggleButton] = focus.tabbable.find(replaceContainerRef.current);
242
+ // Focus the toggle button and close the dropdown menu.
243
+ // This ensures similar behaviour as to selecting an image, where the dropdown is
244
+ // closed and focus is redirected to the dropdown toggle button.
245
+ toggleButton?.focus();
246
+ toggleButton?.click();
247
+ resetBackgroundImage();
248
+ }
249
+ }, __('Reset '))), createElement(DropZone, {
250
+ onFilesDrop: onFilesDrop,
251
+ label: __('Drop to upload')
252
+ })));
253
+ }
254
+ function BackgroundSizeToolsPanelItem({
255
+ panelId,
256
+ isShownByDefault,
257
+ onChange,
258
+ style,
259
+ inheritedValue,
260
+ defaultValues
261
+ }) {
262
+ const sizeValue = style?.background?.backgroundSize || inheritedValue?.background?.backgroundSize;
263
+ const repeatValue = style?.background?.backgroundRepeat || inheritedValue?.background?.backgroundRepeat;
264
+ const imageValue = style?.background?.backgroundImage?.url || inheritedValue?.background?.backgroundImage?.url;
265
+ const positionValue = style?.background?.backgroundPosition || inheritedValue?.background?.backgroundPosition;
266
+
267
+ /*
268
+ * An `undefined` value is replaced with any supplied
269
+ * default control value for the toggle group control.
270
+ * An empty string is treated as `auto` - this allows a user
271
+ * to select "Size" and then enter a custom value, with an
272
+ * empty value being treated as `auto`.
273
+ */
274
+ const currentValueForToggle = sizeValue !== undefined && sizeValue !== 'cover' && sizeValue !== 'contain' || sizeValue === '' ? 'auto' : sizeValue || defaultValues?.backgroundSize;
275
+
276
+ /*
277
+ * If the current value is `cover` and the repeat value is `undefined`, then
278
+ * the toggle should be unchecked as the default state. Otherwise, the toggle
279
+ * should reflect the current repeat value.
280
+ */
281
+ const repeatCheckedValue = !(repeatValue === 'no-repeat' || currentValueForToggle === 'cover' && repeatValue === undefined);
282
+ const hasValue = hasBackgroundSizeValue(style);
283
+ const resetAllFilter = useCallback(previousValue => {
284
+ return {
285
+ ...previousValue,
286
+ style: {
287
+ ...previousValue.style,
288
+ background: {
289
+ ...previousValue.style?.background,
290
+ backgroundRepeat: undefined,
291
+ backgroundSize: undefined
292
+ }
293
+ }
294
+ };
295
+ }, []);
296
+ const updateBackgroundSize = next => {
297
+ // When switching to 'contain' toggle the repeat off.
298
+ let nextRepeat = repeatValue;
299
+ if (next === 'contain') {
300
+ nextRepeat = 'no-repeat';
301
+ }
302
+ if (next === 'cover') {
303
+ nextRepeat = undefined;
304
+ }
305
+ if ((currentValueForToggle === 'cover' || currentValueForToggle === 'contain') && next === 'auto') {
306
+ nextRepeat = undefined;
307
+ }
308
+ onChange(setImmutably(style, ['background'], {
309
+ ...style?.background,
310
+ backgroundRepeat: nextRepeat,
311
+ backgroundSize: next
312
+ }));
313
+ };
314
+ const updateBackgroundPosition = next => {
315
+ onChange(setImmutably(style, ['background', 'backgroundPosition'], coordsToBackgroundPosition(next)));
316
+ };
317
+ const toggleIsRepeated = () => onChange(setImmutably(style, ['background', 'backgroundRepeat'], repeatCheckedValue === true ? 'no-repeat' : undefined));
318
+ const resetBackgroundSize = () => onChange(setImmutably(style, ['background'], {
319
+ ...style?.background,
320
+ backgroundPosition: undefined,
321
+ backgroundRepeat: undefined,
322
+ backgroundSize: undefined
323
+ }));
324
+ return createElement(VStack, {
325
+ as: ToolsPanelItem,
326
+ spacing: 2,
327
+ className: "single-column",
328
+ hasValue: () => hasValue,
329
+ label: __('Size'),
330
+ onDeselect: resetBackgroundSize,
331
+ isShownByDefault: isShownByDefault,
332
+ resetAllFilter: resetAllFilter,
333
+ panelId: panelId
334
+ }, createElement(FocalPointPicker, {
335
+ __next40pxDefaultSize: true,
336
+ label: __('Position'),
337
+ url: imageValue,
338
+ value: backgroundPositionToCoords(positionValue),
339
+ onChange: updateBackgroundPosition
340
+ }), createElement(ToggleGroupControl, {
341
+ size: '__unstable-large',
342
+ label: __('Size'),
343
+ value: currentValueForToggle,
344
+ onChange: updateBackgroundSize,
345
+ isBlock: true,
346
+ help: backgroundSizeHelpText(sizeValue)
347
+ }, createElement(ToggleGroupControlOption, {
348
+ key: 'cover',
349
+ value: 'cover',
350
+ label: __('Cover')
351
+ }), createElement(ToggleGroupControlOption, {
352
+ key: 'contain',
353
+ value: 'contain',
354
+ label: __('Contain')
355
+ }), createElement(ToggleGroupControlOption, {
356
+ key: 'fixed',
357
+ value: 'auto',
358
+ label: __('Fixed')
359
+ })), sizeValue !== undefined && sizeValue !== 'cover' && sizeValue !== 'contain' ? createElement(UnitControl, {
360
+ size: '__unstable-large',
361
+ onChange: updateBackgroundSize,
362
+ value: sizeValue
363
+ }) : null, currentValueForToggle !== 'cover' && createElement(ToggleControl, {
364
+ label: __('Repeat'),
365
+ checked: repeatCheckedValue,
366
+ onChange: toggleIsRepeated
367
+ }));
368
+ }
369
+ function BackgroundToolsPanel({
370
+ resetAllFilter,
371
+ onChange,
372
+ value,
373
+ panelId,
374
+ children
375
+ }) {
376
+ const resetAll = () => {
377
+ const updatedValue = resetAllFilter(value);
378
+ onChange(updatedValue);
379
+ };
380
+ return createElement(VStack, {
381
+ as: ToolsPanel,
382
+ spacing: 6,
383
+ label: __('Background'),
384
+ resetAll: resetAll,
385
+ panelId: panelId,
386
+ dropdownMenuProps: TOOLSPANEL_DROPDOWNMENU_PROPS
387
+ }, children);
388
+ }
389
+ const DEFAULT_CONTROLS = {
390
+ backgroundImage: true,
391
+ backgroundSize: true
392
+ };
393
+ export default function BackgroundPanel({
394
+ as: Wrapper = BackgroundToolsPanel,
395
+ value,
396
+ onChange,
397
+ inheritedValue = value,
398
+ settings,
399
+ panelId,
400
+ defaultControls = DEFAULT_CONTROLS,
401
+ defaultValues = {}
402
+ }) {
403
+ const resetAllFilter = useCallback(previousValue => {
404
+ return {
405
+ ...previousValue,
406
+ background: {}
407
+ };
408
+ }, []);
409
+ const shouldShowBackgroundSizeControls = settings?.background?.backgroundSize;
410
+ return createElement(Wrapper, {
411
+ resetAllFilter: resetAllFilter,
412
+ value: value,
413
+ onChange: onChange,
414
+ panelId: panelId
415
+ }, createElement(BackgroundImageToolsPanelItem, {
416
+ onChange: onChange,
417
+ panelId: panelId,
418
+ isShownByDefault: defaultControls.backgroundImage,
419
+ style: value,
420
+ inheritedValue: inheritedValue
421
+ }), shouldShowBackgroundSizeControls && createElement(BackgroundSizeToolsPanelItem, {
422
+ onChange: onChange,
423
+ panelId: panelId,
424
+ isShownByDefault: defaultControls.backgroundSize,
425
+ style: value,
426
+ inheritedValue: inheritedValue,
427
+ defaultValues: defaultValues
428
+ }));
429
+ }
430
+ //# sourceMappingURL=background-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["classnames","__experimentalToolsPanel","ToolsPanel","__experimentalToolsPanelItem","ToolsPanelItem","ToggleControl","__experimentalToggleGroupControl","ToggleGroupControl","__experimentalToggleGroupControlOption","ToggleGroupControlOption","__experimentalUnitControl","UnitControl","__experimentalVStack","VStack","DropZone","FlexItem","FocalPointPicker","MenuItem","VisuallyHidden","__experimentalItemGroup","ItemGroup","__experimentalHStack","HStack","__experimentalTruncate","Truncate","__","sprintf","store","noticesStore","getFilename","useCallback","Platform","useRef","useDispatch","useSelect","focus","isBlobURL","TOOLSPANEL_DROPDOWNMENU_PROPS","setImmutably","MediaReplaceFlow","blockEditorStore","IMAGE_BACKGROUND_TYPE","useHasBackgroundPanel","settings","OS","background","backgroundImage","hasBackgroundSizeValue","style","backgroundPosition","undefined","backgroundSize","hasBackgroundImageValue","id","url","backgroundSizeHelpText","value","coordsToBackgroundPosition","isNaN","x","y","backgroundPositionToCoords","split","map","v","parseFloat","InspectorImagePreview","label","filename","imgUrl","imgLabel","createElement","as","justify","className","numberOfLines","BackgroundImageToolsPanelItem","panelId","isShownByDefault","onChange","inheritedValue","mediaUpload","select","getSettings","title","replaceContainerRef","createErrorNotice","onUploadError","message","type","resetBackgroundImage","onSelectMedia","media","media_type","source","onFilesDrop","filesList","allowedTypes","onFileChange","image","onError","resetAllFilter","previousValue","hasValue","onDeselect","ref","mediaId","mediaURL","accept","onSelect","name","variant","onClick","toggleButton","tabbable","find","current","click","BackgroundSizeToolsPanelItem","defaultValues","sizeValue","repeatValue","backgroundRepeat","imageValue","positionValue","currentValueForToggle","repeatCheckedValue","updateBackgroundSize","next","nextRepeat","updateBackgroundPosition","toggleIsRepeated","resetBackgroundSize","spacing","__next40pxDefaultSize","size","isBlock","help","key","checked","BackgroundToolsPanel","children","resetAll","updatedValue","dropdownMenuProps","DEFAULT_CONTROLS","BackgroundPanel","Wrapper","defaultControls","shouldShowBackgroundSizeControls"],"sources":["@wordpress/block-editor/src/components/global-styles/background-panel.js"],"sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport {\n\t__experimentalToolsPanel as ToolsPanel,\n\t__experimentalToolsPanelItem as ToolsPanelItem,\n\tToggleControl,\n\t__experimentalToggleGroupControl as ToggleGroupControl,\n\t__experimentalToggleGroupControlOption as ToggleGroupControlOption,\n\t__experimentalUnitControl as UnitControl,\n\t__experimentalVStack as VStack,\n\tDropZone,\n\tFlexItem,\n\tFocalPointPicker,\n\tMenuItem,\n\tVisuallyHidden,\n\t__experimentalItemGroup as ItemGroup,\n\t__experimentalHStack as HStack,\n\t__experimentalTruncate as Truncate,\n} from '@wordpress/components';\nimport { __, sprintf } from '@wordpress/i18n';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { getFilename } from '@wordpress/url';\nimport { useCallback, Platform, useRef } from '@wordpress/element';\nimport { useDispatch, useSelect } from '@wordpress/data';\nimport { focus } from '@wordpress/dom';\nimport { isBlobURL } from '@wordpress/blob';\n\n/**\n * Internal dependencies\n */\nimport { TOOLSPANEL_DROPDOWNMENU_PROPS } from './utils';\nimport { setImmutably } from '../../utils/object';\nimport MediaReplaceFlow from '../media-replace-flow';\nimport { store as blockEditorStore } from '../../store';\n\nconst IMAGE_BACKGROUND_TYPE = 'image';\n\n/**\n * Checks site settings to see if the background panel may be used.\n * `settings.background.backgroundSize` exists also,\n * but can only be used if settings?.background?.backgroundImage is `true`.\n *\n * @param {Object} settings Site settings\n * @return {boolean} Whether site settings has activated background panel.\n */\nexport function useHasBackgroundPanel( settings ) {\n\treturn Platform.OS === 'web' && settings?.background?.backgroundImage;\n}\n\n/**\n * Checks if there is a current value in the background size block support\n * attributes. Background size values include background size as well\n * as background position.\n *\n * @param {Object} style Style attribute.\n * @return {boolean} Whether the block has a background size value set.\n */\nexport function hasBackgroundSizeValue( style ) {\n\treturn (\n\t\tstyle?.background?.backgroundPosition !== undefined ||\n\t\tstyle?.background?.backgroundSize !== undefined\n\t);\n}\n\n/**\n * Checks if there is a current value in the background image block support\n * attributes.\n *\n * @param {Object} style Style attribute.\n * @return {boolean} Whether the block has a background image value set.\n */\nexport function hasBackgroundImageValue( style ) {\n\treturn (\n\t\t!! style?.background?.backgroundImage?.id ||\n\t\t!! style?.background?.backgroundImage?.url\n\t);\n}\n\n/**\n * Get the help text for the background size control.\n *\n * @param {string} value backgroundSize value.\n * @return {string} Translated help text.\n */\nfunction backgroundSizeHelpText( value ) {\n\tif ( value === 'cover' || value === undefined ) {\n\t\treturn __( 'Image covers the space evenly.' );\n\t}\n\tif ( value === 'contain' ) {\n\t\treturn __( 'Image is contained without distortion.' );\n\t}\n\treturn __( 'Specify a fixed width.' );\n}\n\n/**\n * Converts decimal x and y coords from FocalPointPicker to percentage-based values\n * to use as backgroundPosition value.\n *\n * @param {{x?:number, y?:number}} value FocalPointPicker coords.\n * @return {string} \t\t\t\t backgroundPosition value.\n */\nexport const coordsToBackgroundPosition = ( value ) => {\n\tif ( ! value || ( isNaN( value.x ) && isNaN( value.y ) ) ) {\n\t\treturn undefined;\n\t}\n\n\tconst x = isNaN( value.x ) ? 0.5 : value.x;\n\tconst y = isNaN( value.y ) ? 0.5 : value.y;\n\n\treturn `${ x * 100 }% ${ y * 100 }%`;\n};\n\n/**\n * Converts backgroundPosition value to x and y coords for FocalPointPicker.\n *\n * @param {string} value backgroundPosition value.\n * @return {{x?:number, y?:number}} FocalPointPicker coords.\n */\nexport const backgroundPositionToCoords = ( value ) => {\n\tif ( ! value ) {\n\t\treturn { x: undefined, y: undefined };\n\t}\n\n\tlet [ x, y ] = value.split( ' ' ).map( ( v ) => parseFloat( v ) / 100 );\n\tx = isNaN( x ) ? undefined : x;\n\ty = isNaN( y ) ? x : y;\n\n\treturn { x, y };\n};\n\nfunction InspectorImagePreview( { label, filename, url: imgUrl } ) {\n\tconst imgLabel = label || getFilename( imgUrl );\n\treturn (\n\t\t<ItemGroup as=\"span\">\n\t\t\t<HStack justify=\"flex-start\" as=\"span\">\n\t\t\t\t<span\n\t\t\t\t\tclassName={ classnames(\n\t\t\t\t\t\t'block-editor-global-styles-background-panel__inspector-image-indicator-wrapper',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t'has-image': imgUrl,\n\t\t\t\t\t\t}\n\t\t\t\t\t) }\n\t\t\t\t\taria-hidden\n\t\t\t\t>\n\t\t\t\t\t{ imgUrl && (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"block-editor-global-styles-background-panel__inspector-image-indicator\"\n\t\t\t\t\t\t\tstyle={ {\n\t\t\t\t\t\t\t\tbackgroundImage: `url(${ imgUrl })`,\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</span>\n\t\t\t\t<FlexItem as=\"span\">\n\t\t\t\t\t<Truncate\n\t\t\t\t\t\tnumberOfLines={ 1 }\n\t\t\t\t\t\tclassName=\"block-editor-global-styles-background-panel__inspector-media-replace-title\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{ imgLabel }\n\t\t\t\t\t</Truncate>\n\t\t\t\t\t<VisuallyHidden as=\"span\">\n\t\t\t\t\t\t{ filename\n\t\t\t\t\t\t\t? sprintf(\n\t\t\t\t\t\t\t\t\t/* translators: %s: file name */\n\t\t\t\t\t\t\t\t\t__( 'Selected image: %s' ),\n\t\t\t\t\t\t\t\t\tfilename\n\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t: __( 'No image selected' ) }\n\t\t\t\t\t</VisuallyHidden>\n\t\t\t\t</FlexItem>\n\t\t\t</HStack>\n\t\t</ItemGroup>\n\t);\n}\n\nfunction BackgroundImageToolsPanelItem( {\n\tpanelId,\n\tisShownByDefault,\n\tonChange,\n\tstyle,\n\tinheritedValue,\n} ) {\n\tconst mediaUpload = useSelect(\n\t\t( select ) => select( blockEditorStore ).getSettings().mediaUpload,\n\t\t[]\n\t);\n\n\tconst { id, title, url } = style?.background?.backgroundImage || {\n\t\t...inheritedValue?.background?.backgroundImage,\n\t};\n\n\tconst replaceContainerRef = useRef();\n\n\tconst { createErrorNotice } = useDispatch( noticesStore );\n\tconst onUploadError = ( message ) => {\n\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t};\n\n\tconst resetBackgroundImage = () =>\n\t\tonChange(\n\t\t\tsetImmutably(\n\t\t\t\tstyle,\n\t\t\t\t[ 'background', 'backgroundImage' ],\n\t\t\t\tundefined\n\t\t\t)\n\t\t);\n\n\tconst onSelectMedia = ( media ) => {\n\t\tif ( ! media || ! media.url ) {\n\t\t\tresetBackgroundImage();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isBlobURL( media.url ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// For media selections originated from a file upload.\n\t\tif (\n\t\t\t( media.media_type &&\n\t\t\t\tmedia.media_type !== IMAGE_BACKGROUND_TYPE ) ||\n\t\t\t( ! media.media_type &&\n\t\t\t\tmedia.type &&\n\t\t\t\tmedia.type !== IMAGE_BACKGROUND_TYPE )\n\t\t) {\n\t\t\tonUploadError(\n\t\t\t\t__( 'Only images can be used as a background image.' )\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tonChange(\n\t\t\tsetImmutably( style, [ 'background', 'backgroundImage' ], {\n\t\t\t\turl: media.url,\n\t\t\t\tid: media.id,\n\t\t\t\tsource: 'file',\n\t\t\t\ttitle: media.title || undefined,\n\t\t\t} )\n\t\t);\n\t};\n\n\tconst onFilesDrop = ( filesList ) => {\n\t\tmediaUpload( {\n\t\t\tallowedTypes: [ 'image' ],\n\t\t\tfilesList,\n\t\t\tonFileChange( [ image ] ) {\n\t\t\t\tif ( isBlobURL( image?.url ) ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tonSelectMedia( image );\n\t\t\t},\n\t\t\tonError: onUploadError,\n\t\t} );\n\t};\n\n\tconst resetAllFilter = useCallback( ( previousValue ) => {\n\t\treturn {\n\t\t\t...previousValue,\n\t\t\tstyle: {\n\t\t\t\t...previousValue.style,\n\t\t\t\tbackground: undefined,\n\t\t\t},\n\t\t};\n\t}, [] );\n\n\tconst hasValue =\n\t\thasBackgroundImageValue( style ) ||\n\t\thasBackgroundImageValue( inheritedValue );\n\n\treturn (\n\t\t<ToolsPanelItem\n\t\t\tclassName=\"single-column\"\n\t\t\thasValue={ () => hasValue }\n\t\t\tlabel={ __( 'Background image' ) }\n\t\t\tonDeselect={ resetBackgroundImage }\n\t\t\tisShownByDefault={ isShownByDefault }\n\t\t\tresetAllFilter={ resetAllFilter }\n\t\t\tpanelId={ panelId }\n\t\t>\n\t\t\t<div\n\t\t\t\tclassName=\"block-editor-global-styles-background-panel__inspector-media-replace-container\"\n\t\t\t\tref={ replaceContainerRef }\n\t\t\t>\n\t\t\t\t<MediaReplaceFlow\n\t\t\t\t\tmediaId={ id }\n\t\t\t\t\tmediaURL={ url }\n\t\t\t\t\tallowedTypes={ [ IMAGE_BACKGROUND_TYPE ] }\n\t\t\t\t\taccept=\"image/*\"\n\t\t\t\t\tonSelect={ onSelectMedia }\n\t\t\t\t\tname={\n\t\t\t\t\t\t<InspectorImagePreview\n\t\t\t\t\t\t\tlabel={ __( 'Background image' ) }\n\t\t\t\t\t\t\tfilename={ title || __( 'Untitled' ) }\n\t\t\t\t\t\t\turl={ url }\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t\tvariant=\"secondary\"\n\t\t\t\t>\n\t\t\t\t\t{ hasValue && (\n\t\t\t\t\t\t<MenuItem\n\t\t\t\t\t\t\tonClick={ () => {\n\t\t\t\t\t\t\t\tconst [ toggleButton ] = focus.tabbable.find(\n\t\t\t\t\t\t\t\t\treplaceContainerRef.current\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t// Focus the toggle button and close the dropdown menu.\n\t\t\t\t\t\t\t\t// This ensures similar behaviour as to selecting an image, where the dropdown is\n\t\t\t\t\t\t\t\t// closed and focus is redirected to the dropdown toggle button.\n\t\t\t\t\t\t\t\ttoggleButton?.focus();\n\t\t\t\t\t\t\t\ttoggleButton?.click();\n\t\t\t\t\t\t\t\tresetBackgroundImage();\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{ __( 'Reset ' ) }\n\t\t\t\t\t\t</MenuItem>\n\t\t\t\t\t) }\n\t\t\t\t</MediaReplaceFlow>\n\t\t\t\t<DropZone\n\t\t\t\t\tonFilesDrop={ onFilesDrop }\n\t\t\t\t\tlabel={ __( 'Drop to upload' ) }\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</ToolsPanelItem>\n\t);\n}\n\nfunction BackgroundSizeToolsPanelItem( {\n\tpanelId,\n\tisShownByDefault,\n\tonChange,\n\tstyle,\n\tinheritedValue,\n\tdefaultValues,\n} ) {\n\tconst sizeValue =\n\t\tstyle?.background?.backgroundSize ||\n\t\tinheritedValue?.background?.backgroundSize;\n\tconst repeatValue =\n\t\tstyle?.background?.backgroundRepeat ||\n\t\tinheritedValue?.background?.backgroundRepeat;\n\tconst imageValue =\n\t\tstyle?.background?.backgroundImage?.url ||\n\t\tinheritedValue?.background?.backgroundImage?.url;\n\tconst positionValue =\n\t\tstyle?.background?.backgroundPosition ||\n\t\tinheritedValue?.background?.backgroundPosition;\n\n\t/*\n\t * An `undefined` value is replaced with any supplied\n\t * default control value for the toggle group control.\n\t * An empty string is treated as `auto` - this allows a user\n\t * to select \"Size\" and then enter a custom value, with an\n\t * empty value being treated as `auto`.\n\t */\n\tconst currentValueForToggle =\n\t\t( sizeValue !== undefined &&\n\t\t\tsizeValue !== 'cover' &&\n\t\t\tsizeValue !== 'contain' ) ||\n\t\tsizeValue === ''\n\t\t\t? 'auto'\n\t\t\t: sizeValue || defaultValues?.backgroundSize;\n\n\t/*\n\t * If the current value is `cover` and the repeat value is `undefined`, then\n\t * the toggle should be unchecked as the default state. Otherwise, the toggle\n\t * should reflect the current repeat value.\n\t */\n\tconst repeatCheckedValue = ! (\n\t\trepeatValue === 'no-repeat' ||\n\t\t( currentValueForToggle === 'cover' && repeatValue === undefined )\n\t);\n\n\tconst hasValue = hasBackgroundSizeValue( style );\n\n\tconst resetAllFilter = useCallback( ( previousValue ) => {\n\t\treturn {\n\t\t\t...previousValue,\n\t\t\tstyle: {\n\t\t\t\t...previousValue.style,\n\t\t\t\tbackground: {\n\t\t\t\t\t...previousValue.style?.background,\n\t\t\t\t\tbackgroundRepeat: undefined,\n\t\t\t\t\tbackgroundSize: undefined,\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}, [] );\n\n\tconst updateBackgroundSize = ( next ) => {\n\t\t// When switching to 'contain' toggle the repeat off.\n\t\tlet nextRepeat = repeatValue;\n\n\t\tif ( next === 'contain' ) {\n\t\t\tnextRepeat = 'no-repeat';\n\t\t}\n\n\t\tif ( next === 'cover' ) {\n\t\t\tnextRepeat = undefined;\n\t\t}\n\n\t\tif (\n\t\t\t( currentValueForToggle === 'cover' ||\n\t\t\t\tcurrentValueForToggle === 'contain' ) &&\n\t\t\tnext === 'auto'\n\t\t) {\n\t\t\tnextRepeat = undefined;\n\t\t}\n\n\t\tonChange(\n\t\t\tsetImmutably( style, [ 'background' ], {\n\t\t\t\t...style?.background,\n\t\t\t\tbackgroundRepeat: nextRepeat,\n\t\t\t\tbackgroundSize: next,\n\t\t\t} )\n\t\t);\n\t};\n\n\tconst updateBackgroundPosition = ( next ) => {\n\t\tonChange(\n\t\t\tsetImmutably(\n\t\t\t\tstyle,\n\t\t\t\t[ 'background', 'backgroundPosition' ],\n\t\t\t\tcoordsToBackgroundPosition( next )\n\t\t\t)\n\t\t);\n\t};\n\n\tconst toggleIsRepeated = () =>\n\t\tonChange(\n\t\t\tsetImmutably(\n\t\t\t\tstyle,\n\t\t\t\t[ 'background', 'backgroundRepeat' ],\n\t\t\t\trepeatCheckedValue === true ? 'no-repeat' : undefined\n\t\t\t)\n\t\t);\n\n\tconst resetBackgroundSize = () =>\n\t\tonChange(\n\t\t\tsetImmutably( style, [ 'background' ], {\n\t\t\t\t...style?.background,\n\t\t\t\tbackgroundPosition: undefined,\n\t\t\t\tbackgroundRepeat: undefined,\n\t\t\t\tbackgroundSize: undefined,\n\t\t\t} )\n\t\t);\n\n\treturn (\n\t\t<VStack\n\t\t\tas={ ToolsPanelItem }\n\t\t\tspacing={ 2 }\n\t\t\tclassName=\"single-column\"\n\t\t\thasValue={ () => hasValue }\n\t\t\tlabel={ __( 'Size' ) }\n\t\t\tonDeselect={ resetBackgroundSize }\n\t\t\tisShownByDefault={ isShownByDefault }\n\t\t\tresetAllFilter={ resetAllFilter }\n\t\t\tpanelId={ panelId }\n\t\t>\n\t\t\t<FocalPointPicker\n\t\t\t\t__next40pxDefaultSize\n\t\t\t\tlabel={ __( 'Position' ) }\n\t\t\t\turl={ imageValue }\n\t\t\t\tvalue={ backgroundPositionToCoords( positionValue ) }\n\t\t\t\tonChange={ updateBackgroundPosition }\n\t\t\t/>\n\t\t\t<ToggleGroupControl\n\t\t\t\tsize={ '__unstable-large' }\n\t\t\t\tlabel={ __( 'Size' ) }\n\t\t\t\tvalue={ currentValueForToggle }\n\t\t\t\tonChange={ updateBackgroundSize }\n\t\t\t\tisBlock\n\t\t\t\thelp={ backgroundSizeHelpText( sizeValue ) }\n\t\t\t>\n\t\t\t\t<ToggleGroupControlOption\n\t\t\t\t\tkey={ 'cover' }\n\t\t\t\t\tvalue={ 'cover' }\n\t\t\t\t\tlabel={ __( 'Cover' ) }\n\t\t\t\t/>\n\t\t\t\t<ToggleGroupControlOption\n\t\t\t\t\tkey={ 'contain' }\n\t\t\t\t\tvalue={ 'contain' }\n\t\t\t\t\tlabel={ __( 'Contain' ) }\n\t\t\t\t/>\n\t\t\t\t<ToggleGroupControlOption\n\t\t\t\t\tkey={ 'fixed' }\n\t\t\t\t\tvalue={ 'auto' }\n\t\t\t\t\tlabel={ __( 'Fixed' ) }\n\t\t\t\t/>\n\t\t\t</ToggleGroupControl>\n\t\t\t{ sizeValue !== undefined &&\n\t\t\tsizeValue !== 'cover' &&\n\t\t\tsizeValue !== 'contain' ? (\n\t\t\t\t<UnitControl\n\t\t\t\t\tsize={ '__unstable-large' }\n\t\t\t\t\tonChange={ updateBackgroundSize }\n\t\t\t\t\tvalue={ sizeValue }\n\t\t\t\t/>\n\t\t\t) : null }\n\t\t\t{ currentValueForToggle !== 'cover' && (\n\t\t\t\t<ToggleControl\n\t\t\t\t\tlabel={ __( 'Repeat' ) }\n\t\t\t\t\tchecked={ repeatCheckedValue }\n\t\t\t\t\tonChange={ toggleIsRepeated }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</VStack>\n\t);\n}\n\nfunction BackgroundToolsPanel( {\n\tresetAllFilter,\n\tonChange,\n\tvalue,\n\tpanelId,\n\tchildren,\n} ) {\n\tconst resetAll = () => {\n\t\tconst updatedValue = resetAllFilter( value );\n\t\tonChange( updatedValue );\n\t};\n\n\treturn (\n\t\t<VStack\n\t\t\tas={ ToolsPanel }\n\t\t\tspacing={ 6 }\n\t\t\tlabel={ __( 'Background' ) }\n\t\t\tresetAll={ resetAll }\n\t\t\tpanelId={ panelId }\n\t\t\tdropdownMenuProps={ TOOLSPANEL_DROPDOWNMENU_PROPS }\n\t\t>\n\t\t\t{ children }\n\t\t</VStack>\n\t);\n}\n\nconst DEFAULT_CONTROLS = {\n\tbackgroundImage: true,\n\tbackgroundSize: true,\n};\n\nexport default function BackgroundPanel( {\n\tas: Wrapper = BackgroundToolsPanel,\n\tvalue,\n\tonChange,\n\tinheritedValue = value,\n\tsettings,\n\tpanelId,\n\tdefaultControls = DEFAULT_CONTROLS,\n\tdefaultValues = {},\n} ) {\n\tconst resetAllFilter = useCallback( ( previousValue ) => {\n\t\treturn {\n\t\t\t...previousValue,\n\t\t\tbackground: {},\n\t\t};\n\t}, [] );\n\tconst shouldShowBackgroundSizeControls =\n\t\tsettings?.background?.backgroundSize;\n\n\treturn (\n\t\t<Wrapper\n\t\t\tresetAllFilter={ resetAllFilter }\n\t\t\tvalue={ value }\n\t\t\tonChange={ onChange }\n\t\t\tpanelId={ panelId }\n\t\t>\n\t\t\t<BackgroundImageToolsPanelItem\n\t\t\t\tonChange={ onChange }\n\t\t\t\tpanelId={ panelId }\n\t\t\t\tisShownByDefault={ defaultControls.backgroundImage }\n\t\t\t\tstyle={ value }\n\t\t\t\tinheritedValue={ inheritedValue }\n\t\t\t/>\n\t\t\t{ shouldShowBackgroundSizeControls && (\n\t\t\t\t<BackgroundSizeToolsPanelItem\n\t\t\t\t\tonChange={ onChange }\n\t\t\t\t\tpanelId={ panelId }\n\t\t\t\t\tisShownByDefault={ defaultControls.backgroundSize }\n\t\t\t\t\tstyle={ value }\n\t\t\t\t\tinheritedValue={ inheritedValue }\n\t\t\t\t\tdefaultValues={ defaultValues }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</Wrapper>\n\t);\n}\n"],"mappings":"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"}
@@ -67,10 +67,11 @@ function ColorToolsPanel({
67
67
  onChange(updatedValue);
68
68
  };
69
69
  return createElement(ToolsPanel, {
70
- label: __('Color'),
70
+ label: __('Elements'),
71
71
  resetAll: resetAll,
72
72
  panelId: panelId,
73
73
  hasInnerWrapper: true,
74
+ headingLevel: 3,
74
75
  className: "color-block-support-panel",
75
76
  __experimentalFirstVisibleItemClass: "first",
76
77
  __experimentalLastVisibleItemClass: "last",