@wordpress/block-editor 10.3.0 → 10.4.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 (264) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/build/components/alignment-control/ui.js +1 -1
  3. package/build/components/alignment-control/ui.js.map +1 -1
  4. package/build/components/block-alignment-control/constants.js +1 -1
  5. package/build/components/block-alignment-control/constants.js.map +1 -1
  6. package/build/components/block-alignment-matrix-control/index.js +1 -1
  7. package/build/components/block-alignment-matrix-control/index.js.map +1 -1
  8. package/build/components/block-compare/index.js +1 -3
  9. package/build/components/block-compare/index.js.map +1 -1
  10. package/build/components/block-edit/index.js +4 -2
  11. package/build/components/block-edit/index.js.map +1 -1
  12. package/build/components/block-list/block.js +3 -1
  13. package/build/components/block-list/block.js.map +1 -1
  14. package/build/components/block-popover/inbetween.js +2 -1
  15. package/build/components/block-popover/inbetween.js.map +1 -1
  16. package/build/components/block-popover/index.js +2 -1
  17. package/build/components/block-popover/index.js.map +1 -1
  18. package/build/components/block-preview/index.js +2 -4
  19. package/build/components/block-preview/index.js.map +1 -1
  20. package/build/components/block-settings-menu/block-settings-dropdown.js +2 -8
  21. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  22. package/build/components/block-switcher/index.js +2 -8
  23. package/build/components/block-switcher/index.js.map +1 -1
  24. package/build/components/block-switcher/preview-block-popover.js +1 -1
  25. package/build/components/block-switcher/preview-block-popover.js.map +1 -1
  26. package/build/components/block-tools/insertion-point.js +12 -2
  27. package/build/components/block-tools/insertion-point.js.map +1 -1
  28. package/build/components/block-vertical-alignment-control/ui.js +1 -1
  29. package/build/components/block-vertical-alignment-control/ui.js.map +1 -1
  30. package/build/components/border-radius-control/all-input-control.js +2 -1
  31. package/build/components/border-radius-control/all-input-control.js.map +1 -1
  32. package/build/components/border-radius-control/index.js +2 -1
  33. package/build/components/border-radius-control/index.js.map +1 -1
  34. package/build/components/border-radius-control/input-controls.js +2 -1
  35. package/build/components/border-radius-control/input-controls.js.map +1 -1
  36. package/build/components/duotone-control/index.js +1 -1
  37. package/build/components/duotone-control/index.js.map +1 -1
  38. package/build/components/font-sizes/with-font-sizes.js +1 -1
  39. package/build/components/font-sizes/with-font-sizes.js.map +1 -1
  40. package/build/components/iframe/index.js +1 -1
  41. package/build/components/iframe/index.js.map +1 -1
  42. package/build/components/image-editor/constants.js +1 -1
  43. package/build/components/image-editor/constants.js.map +1 -1
  44. package/build/components/inner-blocks/index.js +6 -2
  45. package/build/components/inner-blocks/index.js.map +1 -1
  46. package/build/components/inserter/hooks/use-insertion-point.js +2 -7
  47. package/build/components/inserter/hooks/use-insertion-point.js.map +1 -1
  48. package/build/components/inserter/search-items.js +23 -2
  49. package/build/components/inserter/search-items.js.map +1 -1
  50. package/build/components/line-height-control/index.js +2 -1
  51. package/build/components/line-height-control/index.js.map +1 -1
  52. package/build/components/list-view/drop-indicator.js +2 -1
  53. package/build/components/list-view/drop-indicator.js.map +1 -1
  54. package/build/components/media-replace-flow/index.js +1 -1
  55. package/build/components/media-replace-flow/index.js.map +1 -1
  56. package/build/components/rich-text/format-toolbar/index.js +1 -1
  57. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  58. package/build/components/rich-text/format-toolbar-container.js +1 -1
  59. package/build/components/rich-text/format-toolbar-container.js.map +1 -1
  60. package/build/components/rich-text/use-paste-handler.js +1 -1
  61. package/build/components/rich-text/use-paste-handler.js.map +1 -1
  62. package/build/components/spacing-sizes-control/all-input-control.js +6 -2
  63. package/build/components/spacing-sizes-control/all-input-control.js.map +1 -1
  64. package/build/components/spacing-sizes-control/axial-input-controls.js +6 -2
  65. package/build/components/spacing-sizes-control/axial-input-controls.js.map +1 -1
  66. package/build/components/spacing-sizes-control/index.js +6 -2
  67. package/build/components/spacing-sizes-control/index.js.map +1 -1
  68. package/build/components/spacing-sizes-control/input-controls.js +6 -2
  69. package/build/components/spacing-sizes-control/input-controls.js.map +1 -1
  70. package/build/components/spacing-sizes-control/spacing-input-control.js +12 -5
  71. package/build/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  72. package/build/components/url-input/index.js +1 -1
  73. package/build/components/url-input/index.js.map +1 -1
  74. package/build/hooks/border.js +1 -0
  75. package/build/hooks/border.js.map +1 -1
  76. package/build/hooks/dimensions.js +32 -4
  77. package/build/hooks/dimensions.js.map +1 -1
  78. package/build/hooks/font-size.js +1 -0
  79. package/build/hooks/font-size.js.map +1 -1
  80. package/build/hooks/layout.js +4 -3
  81. package/build/hooks/layout.js.map +1 -1
  82. package/build/hooks/margin.js +22 -16
  83. package/build/hooks/margin.js.map +1 -1
  84. package/build/hooks/padding.js +18 -11
  85. package/build/hooks/padding.js.map +1 -1
  86. package/build/hooks/utils.js +7 -6
  87. package/build/hooks/utils.js.map +1 -1
  88. package/build/layouts/constrained.js +0 -1
  89. package/build/layouts/constrained.js.map +1 -1
  90. package/build/layouts/flex.js +1 -1
  91. package/build/layouts/flex.js.map +1 -1
  92. package/build/store/actions.js +4 -0
  93. package/build/store/actions.js.map +1 -1
  94. package/build/store/array.js +1 -7
  95. package/build/store/array.js.map +1 -1
  96. package/build/store/selectors.js +46 -29
  97. package/build/store/selectors.js.map +1 -1
  98. package/build-module/components/alignment-control/ui.js +1 -1
  99. package/build-module/components/alignment-control/ui.js.map +1 -1
  100. package/build-module/components/block-alignment-control/constants.js +1 -1
  101. package/build-module/components/block-alignment-control/constants.js.map +1 -1
  102. package/build-module/components/block-alignment-matrix-control/index.js +1 -1
  103. package/build-module/components/block-alignment-matrix-control/index.js.map +1 -1
  104. package/build-module/components/block-compare/index.js +2 -3
  105. package/build-module/components/block-compare/index.js.map +1 -1
  106. package/build-module/components/block-edit/index.js +4 -2
  107. package/build-module/components/block-edit/index.js.map +1 -1
  108. package/build-module/components/block-list/block.js +3 -1
  109. package/build-module/components/block-list/block.js.map +1 -1
  110. package/build-module/components/block-popover/inbetween.js +2 -1
  111. package/build-module/components/block-popover/inbetween.js.map +1 -1
  112. package/build-module/components/block-popover/index.js +2 -1
  113. package/build-module/components/block-popover/index.js.map +1 -1
  114. package/build-module/components/block-preview/index.js +2 -3
  115. package/build-module/components/block-preview/index.js.map +1 -1
  116. package/build-module/components/block-settings-menu/block-settings-dropdown.js +2 -7
  117. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  118. package/build-module/components/block-switcher/index.js +2 -7
  119. package/build-module/components/block-switcher/index.js.map +1 -1
  120. package/build-module/components/block-switcher/preview-block-popover.js +1 -1
  121. package/build-module/components/block-switcher/preview-block-popover.js.map +1 -1
  122. package/build-module/components/block-tools/insertion-point.js +12 -2
  123. package/build-module/components/block-tools/insertion-point.js.map +1 -1
  124. package/build-module/components/block-vertical-alignment-control/ui.js +1 -1
  125. package/build-module/components/block-vertical-alignment-control/ui.js.map +1 -1
  126. package/build-module/components/border-radius-control/all-input-control.js +2 -1
  127. package/build-module/components/border-radius-control/all-input-control.js.map +1 -1
  128. package/build-module/components/border-radius-control/index.js +2 -1
  129. package/build-module/components/border-radius-control/index.js.map +1 -1
  130. package/build-module/components/border-radius-control/input-controls.js +2 -1
  131. package/build-module/components/border-radius-control/input-controls.js.map +1 -1
  132. package/build-module/components/duotone-control/index.js +1 -1
  133. package/build-module/components/duotone-control/index.js.map +1 -1
  134. package/build-module/components/font-sizes/with-font-sizes.js +2 -2
  135. package/build-module/components/font-sizes/with-font-sizes.js.map +1 -1
  136. package/build-module/components/iframe/index.js +1 -1
  137. package/build-module/components/iframe/index.js.map +1 -1
  138. package/build-module/components/image-editor/constants.js +1 -1
  139. package/build-module/components/image-editor/constants.js.map +1 -1
  140. package/build-module/components/inner-blocks/index.js +6 -2
  141. package/build-module/components/inner-blocks/index.js.map +1 -1
  142. package/build-module/components/inserter/hooks/use-insertion-point.js +2 -6
  143. package/build-module/components/inserter/hooks/use-insertion-point.js.map +1 -1
  144. package/build-module/components/inserter/search-items.js +23 -3
  145. package/build-module/components/inserter/search-items.js.map +1 -1
  146. package/build-module/components/line-height-control/index.js +2 -1
  147. package/build-module/components/line-height-control/index.js.map +1 -1
  148. package/build-module/components/list-view/drop-indicator.js +2 -1
  149. package/build-module/components/list-view/drop-indicator.js.map +1 -1
  150. package/build-module/components/media-replace-flow/index.js +1 -1
  151. package/build-module/components/media-replace-flow/index.js.map +1 -1
  152. package/build-module/components/rich-text/format-toolbar/index.js +1 -1
  153. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  154. package/build-module/components/rich-text/format-toolbar-container.js +1 -1
  155. package/build-module/components/rich-text/format-toolbar-container.js.map +1 -1
  156. package/build-module/components/rich-text/use-paste-handler.js +1 -1
  157. package/build-module/components/rich-text/use-paste-handler.js.map +1 -1
  158. package/build-module/components/spacing-sizes-control/all-input-control.js +6 -2
  159. package/build-module/components/spacing-sizes-control/all-input-control.js.map +1 -1
  160. package/build-module/components/spacing-sizes-control/axial-input-controls.js +6 -2
  161. package/build-module/components/spacing-sizes-control/axial-input-controls.js.map +1 -1
  162. package/build-module/components/spacing-sizes-control/index.js +6 -2
  163. package/build-module/components/spacing-sizes-control/index.js.map +1 -1
  164. package/build-module/components/spacing-sizes-control/input-controls.js +6 -2
  165. package/build-module/components/spacing-sizes-control/input-controls.js.map +1 -1
  166. package/build-module/components/spacing-sizes-control/spacing-input-control.js +12 -5
  167. package/build-module/components/spacing-sizes-control/spacing-input-control.js.map +1 -1
  168. package/build-module/components/url-input/index.js +1 -1
  169. package/build-module/components/url-input/index.js.map +1 -1
  170. package/build-module/hooks/border.js +1 -0
  171. package/build-module/hooks/border.js.map +1 -1
  172. package/build-module/hooks/dimensions.js +32 -4
  173. package/build-module/hooks/dimensions.js.map +1 -1
  174. package/build-module/hooks/font-size.js +1 -0
  175. package/build-module/hooks/font-size.js.map +1 -1
  176. package/build-module/hooks/layout.js +5 -4
  177. package/build-module/hooks/layout.js.map +1 -1
  178. package/build-module/hooks/margin.js +23 -17
  179. package/build-module/hooks/margin.js.map +1 -1
  180. package/build-module/hooks/padding.js +19 -12
  181. package/build-module/hooks/padding.js.map +1 -1
  182. package/build-module/hooks/utils.js +7 -7
  183. package/build-module/hooks/utils.js.map +1 -1
  184. package/build-module/layouts/constrained.js +0 -1
  185. package/build-module/layouts/constrained.js.map +1 -1
  186. package/build-module/layouts/flex.js +1 -1
  187. package/build-module/layouts/flex.js.map +1 -1
  188. package/build-module/store/actions.js +4 -0
  189. package/build-module/store/actions.js.map +1 -1
  190. package/build-module/store/array.js +1 -6
  191. package/build-module/store/array.js.map +1 -1
  192. package/build-module/store/selectors.js +47 -30
  193. package/build-module/store/selectors.js.map +1 -1
  194. package/build-style/style-rtl.css +49 -62
  195. package/build-style/style.css +45 -58
  196. package/package.json +29 -28
  197. package/src/components/alignment-control/ui.js +1 -1
  198. package/src/components/block-alignment-control/constants.js +1 -1
  199. package/src/components/block-alignment-matrix-control/index.js +1 -1
  200. package/src/components/block-breadcrumb/test/__snapshots__/index.js.snap +13 -11
  201. package/src/components/block-breadcrumb/test/index.js +1 -1
  202. package/src/components/block-compare/index.js +3 -2
  203. package/src/components/block-edit/index.js +2 -1
  204. package/src/components/block-list/block.js +2 -0
  205. package/src/components/block-list/style.scss +1 -1
  206. package/src/components/block-mover/stories/index.js +1 -1
  207. package/src/components/block-mover/style.scss +35 -0
  208. package/src/components/block-popover/inbetween.js +1 -0
  209. package/src/components/block-popover/index.js +1 -0
  210. package/src/components/block-popover/style.scss +0 -4
  211. package/src/components/block-preview/index.js +8 -3
  212. package/src/components/block-settings-menu/block-settings-dropdown.js +4 -7
  213. package/src/components/block-switcher/index.js +2 -7
  214. package/src/components/block-switcher/preview-block-popover.js +1 -1
  215. package/src/components/block-tools/insertion-point.js +10 -1
  216. package/src/components/block-variation-picker/README.md +1 -1
  217. package/src/components/block-vertical-alignment-control/ui.js +1 -1
  218. package/src/components/border-radius-control/all-input-control.js +1 -0
  219. package/src/components/border-radius-control/index.js +1 -0
  220. package/src/components/border-radius-control/input-controls.js +1 -0
  221. package/src/components/border-radius-control/style.scss +15 -24
  222. package/src/components/color-palette/test/__snapshots__/control.js.snap +85 -83
  223. package/src/components/color-palette/test/control.js +1 -1
  224. package/src/components/duotone-control/index.js +1 -1
  225. package/src/components/font-sizes/with-font-sizes.js +2 -3
  226. package/src/components/iframe/index.js +1 -1
  227. package/src/components/image-editor/constants.js +1 -1
  228. package/src/components/inner-blocks/index.js +5 -1
  229. package/src/components/inner-blocks/test/index.js +4 -0
  230. package/src/components/inserter/hooks/use-insertion-point.js +3 -11
  231. package/src/components/inserter/search-items.js +23 -3
  232. package/src/components/inserter/test/search-items.js +6 -0
  233. package/src/components/inserter-list-item/style.scss +2 -0
  234. package/src/components/letter-spacing-control/README.md +55 -0
  235. package/src/components/line-height-control/index.js +1 -0
  236. package/src/components/link-control/README.md +3 -3
  237. package/src/components/list-view/drop-indicator.js +1 -0
  238. package/src/components/list-view/style.scss +1 -36
  239. package/src/components/media-replace-flow/index.js +1 -1
  240. package/src/components/media-replace-flow/test/index.js +69 -51
  241. package/src/components/rich-text/format-toolbar/index.js +1 -1
  242. package/src/components/rich-text/format-toolbar-container.js +1 -1
  243. package/src/components/rich-text/use-paste-handler.js +1 -1
  244. package/src/components/spacing-sizes-control/all-input-control.js +4 -0
  245. package/src/components/spacing-sizes-control/axial-input-controls.js +4 -0
  246. package/src/components/spacing-sizes-control/index.js +4 -0
  247. package/src/components/spacing-sizes-control/input-controls.js +4 -0
  248. package/src/components/spacing-sizes-control/spacing-input-control.js +10 -1
  249. package/src/components/spacing-sizes-control/style.scss +1 -0
  250. package/src/components/url-input/index.js +1 -1
  251. package/src/hooks/border.js +1 -0
  252. package/src/hooks/dimensions.js +32 -5
  253. package/src/hooks/font-size.js +1 -0
  254. package/src/hooks/layout.js +7 -9
  255. package/src/hooks/margin.js +19 -14
  256. package/src/hooks/padding.js +19 -16
  257. package/src/hooks/test/align.js +96 -72
  258. package/src/hooks/utils.js +5 -6
  259. package/src/layouts/constrained.js +0 -1
  260. package/src/layouts/flex.js +1 -1
  261. package/src/store/actions.js +4 -0
  262. package/src/store/array.js +1 -6
  263. package/src/store/selectors.js +28 -21
  264. package/src/store/test/selectors.js +1 -1
@@ -0,0 +1,55 @@
1
+ # Letter spacing control
2
+
3
+ The `LetterSpacingControl` component renders a [`UnitControl`](https://github.com/WordPress/gutenberg/blob/trunk/packages/block-editor/src/components/unit-control/README.md) that lets the user enter a numeric value and select a unit, for example px or rem.
4
+
5
+ This component is used for blocks that display text, commonly inside a
6
+ [`ToolsPanelItem`](https://github.com/WordPress/gutenberg/blob/trunk/packages/components/src/tools-panel/tools-panel-item/README.md).
7
+
8
+ ## Table of contents
9
+
10
+ 1. [Development guidelines](#development-guidelines)
11
+ 2. [Related components](#related-components)
12
+
13
+ ## Development guidelines
14
+
15
+ ### Usage
16
+
17
+ Renders a letter spacing control.
18
+
19
+ ```jsx
20
+ import { LetterSpacingControl } from '@wordpress/block-editor';
21
+
22
+ const MyLetterSpacingControl = () => (
23
+ <LetterSpacingControl
24
+ value={ value }
25
+ onChange={ onChange }
26
+ __unstableInputWidth="auto"
27
+ />
28
+ );
29
+ ```
30
+
31
+ ### Props
32
+
33
+ ### `value`
34
+
35
+ - **Type:** `String`
36
+ - **Default:** `undefined`
37
+
38
+ The current value of the letter spacing setting.
39
+
40
+ ### `onChange`
41
+
42
+ - **Type:** `Function`
43
+
44
+ A callback function invoked when the value is changed.
45
+
46
+ ### `_unstableInputWidth`
47
+
48
+ - **Type:** `string|number|undefined`
49
+ - **Default:** `undefined`
50
+
51
+ Input width to pass through to inner UnitControl. Should be a valid CSS value.
52
+
53
+ ## Related components
54
+
55
+ Block Editor components are components that can be used to compose the UI of your block editor. Thus, they can only be used under a [`BlockEditorProvider`](https://github.com/WordPress/gutenberg/blob/HEAD/packages/block-editor/src/components/provider/README.md) in the components tree.
@@ -99,6 +99,7 @@ const LineHeightControl = ( {
99
99
  step={ STEP }
100
100
  value={ value }
101
101
  min={ 0 }
102
+ spinControls="custom"
102
103
  />
103
104
  </div>
104
105
  );
@@ -192,7 +192,7 @@ A `suggestion` should have the following shape:
192
192
  )}
193
193
  />
194
194
  ```
195
- ### renderControlBottom
195
+ ### renderControlBottom
196
196
 
197
197
  - Type: `Function`
198
198
  - Required: No
@@ -338,7 +338,7 @@ See the [createSuggestion](#createSuggestion) section of this file to learn more
338
338
  <LinkControlSearchInput
339
339
  renderSuggestions={( { suggestions } ) => {
340
340
  return (
341
- <Popover focusOnMount={ false } position="bottom">
341
+ <Popover focusOnMount={ false } placement="bottom">
342
342
  <ul>
343
343
  { suggestions.map( () => ( <li key={ `${ suggestion.id }-${ suggestion.type }` }>{ suggestion.title }</li> ) ) }
344
344
  </ul>
@@ -352,7 +352,7 @@ See the [createSuggestion](#createSuggestion) section of this file to learn more
352
352
  <LinkControlSearchInput
353
353
  renderSuggestions={( suggestionsProps ) => {
354
354
  return (
355
- <Popover focusOnMount={ false } position="bottom">
355
+ <Popover focusOnMount={ false } placement="bottom">
356
356
  <LinkControlSearchResults { ...suggestionsProps } />
357
357
  </Popover>
358
358
  );
@@ -115,6 +115,7 @@ export default function ListViewDropIndicator( {
115
115
  anchor={ popoverAnchor }
116
116
  focusOnMount={ false }
117
117
  className="block-editor-list-view-drop-indicator"
118
+ variant="unstyled"
118
119
  >
119
120
  <div
120
121
  style={ style }
@@ -249,39 +249,12 @@
249
249
  }
250
250
  }
251
251
 
252
- // Don't show the focus inherited by the Button component.
253
- &:focus:enabled {
254
- box-shadow: none;
255
- outline: none;
256
- }
257
-
258
- // Focus style.
259
- &:focus {
260
- box-shadow: none;
261
- outline: none;
262
- }
263
-
264
- &:focus::before {
265
- @include block-toolbar-button-style__focus();
266
- }
267
-
268
- // Focus and toggle pseudo elements.
252
+ // Tweak size and position of focus ring.
269
253
  &::before {
270
- content: "";
271
- position: absolute;
272
- display: block;
273
- border-radius: $radius-block-ui;
274
254
  height: 16px;
275
255
  min-width: 100%;
276
-
277
- // Position the focus rectangle.
278
256
  left: 0;
279
257
  right: 0;
280
-
281
- // Animate in.
282
- animation: components-button__appear-animation 0.1s ease;
283
- animation-fill-mode: forwards;
284
- @include reduce-motion("animation");
285
258
  }
286
259
  }
287
260
 
@@ -416,14 +389,6 @@ $block-navigation-max-indent: 8;
416
389
  }
417
390
  }
418
391
 
419
- // Reset some popover defaults for the drop indicator.
420
- .block-editor-list-view-drop-indicator > .components-popover__content {
421
- margin-left: 0;
422
- border: none;
423
- box-shadow: none;
424
- outline: none;
425
- }
426
-
427
392
  .block-editor-list-view-placeholder {
428
393
  padding: 0;
429
394
  margin: 0;
@@ -131,7 +131,7 @@ const MediaReplaceFlow = ( {
131
131
  const gallery = multiple && onlyAllowsImages();
132
132
 
133
133
  const POPOVER_PROPS = {
134
- isAlternate: true,
134
+ variant: 'toolbar',
135
135
  };
136
136
 
137
137
  return (
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import { render, fireEvent } from '@testing-library/react';
4
+ import { render, screen } from '@testing-library/react';
5
+ import userEvent from '@testing-library/user-event';
5
6
 
6
7
  /**
7
8
  * WordPress dependencies
@@ -31,80 +32,97 @@ function TestWrapper() {
31
32
  );
32
33
  }
33
34
 
34
- function setUpMediaReplaceFlow() {
35
- const { container } = render( <TestWrapper /> );
36
- return container;
37
- }
38
-
39
35
  describe( 'General media replace flow', () => {
40
36
  it( 'renders successfully', () => {
41
- const container = setUpMediaReplaceFlow();
42
-
43
- const mediaReplaceButton = container.querySelector(
44
- 'button[aria-expanded="false"]'
45
- );
46
-
47
- expect( mediaReplaceButton ).not.toBeNull();
37
+ render( <TestWrapper /> );
38
+
39
+ expect(
40
+ screen.getByRole( 'button', {
41
+ expanded: false,
42
+ name: 'Replace',
43
+ } )
44
+ ).toBeVisible();
48
45
  } );
49
46
 
50
- it( 'renders replace menu', () => {
51
- const container = setUpMediaReplaceFlow();
47
+ it( 'renders replace menu', async () => {
48
+ const user = userEvent.setup( {
49
+ advanceTimers: jest.advanceTimersByTime,
50
+ } );
52
51
 
53
- const mediaReplaceButton = container.querySelector(
54
- 'button[aria-expanded="false"]'
55
- );
56
- mediaReplaceButton.click();
52
+ render( <TestWrapper /> );
57
53
 
58
- const uploadMenu = container.querySelector(
59
- '.block-editor-media-replace-flow__media-upload-menu'
54
+ await user.click(
55
+ screen.getByRole( 'button', {
56
+ expanded: false,
57
+ name: 'Replace',
58
+ } )
60
59
  );
61
60
 
62
- expect( uploadMenu ).not.toBeNull();
61
+ const uploadMenu = screen.getByRole( 'menu' );
62
+
63
+ expect( uploadMenu ).toBeInTheDocument();
64
+ expect( uploadMenu ).not.toBeVisible();
63
65
  } );
64
66
 
65
- it( 'displays media URL', () => {
66
- const container = setUpMediaReplaceFlow();
67
+ it( 'displays media URL', async () => {
68
+ const user = userEvent.setup( {
69
+ advanceTimers: jest.advanceTimersByTime,
70
+ } );
67
71
 
68
- const mediaReplaceButton = container.querySelector(
69
- 'button[aria-expanded="false"]'
70
- );
71
- mediaReplaceButton.click();
72
+ render( <TestWrapper /> );
72
73
 
73
- const mediaURL = container.querySelector( '.components-external-link' );
74
+ await user.click(
75
+ screen.getByRole( 'button', {
76
+ expanded: false,
77
+ name: 'Replace',
78
+ } )
79
+ );
74
80
 
75
- expect( mediaURL.href ).toEqual( 'https://example.media/' );
81
+ expect(
82
+ screen.getByRole( 'link', {
83
+ name: 'example.media (opens in a new tab)',
84
+ } )
85
+ ).toHaveAttribute( 'href', 'https://example.media' );
76
86
  } );
77
87
 
78
- it( 'edits media URL', () => {
79
- const container = setUpMediaReplaceFlow();
88
+ it( 'edits media URL', async () => {
89
+ const user = userEvent.setup( {
90
+ advanceTimers: jest.advanceTimersByTime,
91
+ } );
80
92
 
81
- const mediaReplaceButton = container.querySelector(
82
- 'button[aria-expanded="false"]'
83
- );
84
- mediaReplaceButton.click();
93
+ render( <TestWrapper /> );
85
94
 
86
- const editMediaURL = container.querySelector(
87
- '.block-editor-link-control__search-item-action'
95
+ await user.click(
96
+ screen.getByRole( 'button', {
97
+ expanded: false,
98
+ name: 'Replace',
99
+ } )
88
100
  );
89
101
 
90
- editMediaURL.click();
91
-
92
- const mediaURLInput = container.querySelector(
93
- '.block-editor-url-input__input'
102
+ await user.click(
103
+ screen.getByRole( 'button', {
104
+ name: 'Edit',
105
+ } )
94
106
  );
95
107
 
96
- fireEvent.change( mediaURLInput, {
97
- target: { value: 'https://new.example.media' },
108
+ const mediaURLInput = screen.getByRole( 'combobox', {
109
+ name: 'URL',
110
+ expanded: false,
98
111
  } );
99
112
 
100
- const saveMediaURLButton = container.querySelector(
101
- '.block-editor-link-control__search-submit'
102
- );
103
-
104
- saveMediaURLButton.click();
113
+ await user.clear( mediaURLInput );
114
+ await user.type( mediaURLInput, 'https://new.example.media' );
105
115
 
106
- const mediaURL = container.querySelector( '.components-external-link' );
116
+ await user.click(
117
+ screen.getByRole( 'button', {
118
+ name: 'Submit',
119
+ } )
120
+ );
107
121
 
108
- expect( mediaURL.href ).toEqual( 'https://new.example.media/' );
122
+ expect(
123
+ screen.getByRole( 'link', {
124
+ name: 'new.example.media (opens in a new tab)',
125
+ } )
126
+ ).toHaveAttribute( 'href', 'https://new.example.media' );
109
127
  } );
110
128
  } );
@@ -15,7 +15,7 @@ import { chevronDown } from '@wordpress/icons';
15
15
 
16
16
  const POPOVER_PROPS = {
17
17
  position: 'bottom right',
18
- isAlternate: true,
18
+ variant: 'toolbar',
19
19
  };
20
20
 
21
21
  const FormatToolbar = () => {
@@ -42,7 +42,7 @@ function InlineSelectionToolbar( {
42
42
  function InlineToolbar( { popoverAnchor } ) {
43
43
  return (
44
44
  <Popover
45
- position="top center"
45
+ placement="top"
46
46
  focusOnMount={ false }
47
47
  anchor={ popoverAnchor }
48
48
  className="block-editor-rich-text__inline-format-toolbar"
@@ -255,7 +255,7 @@ export function usePasteHandler( props ) {
255
255
 
256
256
  /**
257
257
  * Normalizes a given string of HTML to remove the Windows-specific "Fragment"
258
- * comments and any preceeding and trailing content.
258
+ * comments and any preceding and trailing content.
259
259
  *
260
260
  * @param {string} html the html to be normalized
261
261
  * @return {string} the normalized html
@@ -16,6 +16,8 @@ export default function AllInputControl( {
16
16
  spacingSizes,
17
17
  type,
18
18
  minimumCustomValue,
19
+ onMouseOver,
20
+ onMouseOut,
19
21
  } ) {
20
22
  const allValue = getAllRawValue( values );
21
23
  const hasValues = isValuesDefined( values );
@@ -35,6 +37,8 @@ export default function AllInputControl( {
35
37
  isMixed={ isMixed }
36
38
  type={ type }
37
39
  minimumCustomValue={ minimumCustomValue }
40
+ onMouseOver={ onMouseOver }
41
+ onMouseOut={ onMouseOut }
38
42
  />
39
43
  );
40
44
  }
@@ -13,6 +13,8 @@ export default function AxialInputControls( {
13
13
  spacingSizes,
14
14
  type,
15
15
  minimumCustomValue,
16
+ onMouseOver,
17
+ onMouseOut,
16
18
  } ) {
17
19
  const createHandleOnChange = ( side ) => ( next ) => {
18
20
  if ( ! onChange ) {
@@ -54,6 +56,8 @@ export default function AxialInputControls( {
54
56
  spacingSizes={ spacingSizes }
55
57
  type={ type }
56
58
  minimumCustomValue={ minimumCustomValue }
59
+ onMouseOver={ onMouseOver }
60
+ onMouseOut={ onMouseOut }
57
61
  />
58
62
  );
59
63
  } ) }
@@ -29,6 +29,8 @@ export default function SpacingSizesControl( {
29
29
  splitOnAxis = false,
30
30
  useSelect,
31
31
  minimumCustomValue = 0,
32
+ onMouseOver,
33
+ onMouseOut,
32
34
  } ) {
33
35
  const spacingSizes = [
34
36
  { name: 0, slug: '0', size: 0 },
@@ -70,6 +72,8 @@ export default function SpacingSizesControl( {
70
72
  useSelect,
71
73
  type: label,
72
74
  minimumCustomValue,
75
+ onMouseOver,
76
+ onMouseOut,
73
77
  };
74
78
 
75
79
  return (
@@ -11,6 +11,8 @@ export default function BoxInputControls( {
11
11
  spacingSizes,
12
12
  type,
13
13
  minimumCustomValue,
14
+ onMouseOver,
15
+ onMouseOut,
14
16
  } ) {
15
17
  // Filter sides if custom configuration provided, maintaining default order.
16
18
  const filteredSides = sides?.length
@@ -38,6 +40,8 @@ export default function BoxInputControls( {
38
40
  spacingSizes={ spacingSizes }
39
41
  type={ type }
40
42
  minimumCustomValue={ minimumCustomValue }
43
+ onMouseOver={ onMouseOver }
44
+ onMouseOut={ onMouseOut }
41
45
  />
42
46
  );
43
47
  } ) }
@@ -51,6 +51,8 @@ export default function SpacingInputControl( {
51
51
  isMixed = false,
52
52
  type,
53
53
  minimumCustomValue,
54
+ onMouseOver,
55
+ onMouseOut,
54
56
  } ) {
55
57
  // Treat value as a preset value if the passed in value matches the value of one of the spacingSizes.
56
58
  value = getPresetValueFromCustomValue( value, spacingSizes );
@@ -218,6 +220,8 @@ export default function SpacingInputControl( {
218
220
  { showCustomValueControl && (
219
221
  <>
220
222
  <UnitControl
223
+ onMouseOver={ onMouseOver }
224
+ onMouseOut={ onMouseOut }
221
225
  onChange={ ( newSize ) =>
222
226
  onChange( getNewCustomValue( newSize ) )
223
227
  }
@@ -229,11 +233,12 @@ export default function SpacingInputControl( {
229
233
  label={ ariaLabel }
230
234
  hideLabelFromVision={ true }
231
235
  className="components-spacing-sizes-control__custom-value-input"
232
- style={ { gridColumn: '1' } }
233
236
  size={ '__unstable-large' }
234
237
  />
235
238
 
236
239
  <RangeControl
240
+ onMouseOver={ onMouseOver }
241
+ onMouseOut={ onMouseOut }
237
242
  value={ customRangeValue }
238
243
  min={ 0 }
239
244
  max={ CUSTOM_VALUE_SETTINGS[ selectedUnit ]?.max ?? 10 }
@@ -248,6 +253,8 @@ export default function SpacingInputControl( {
248
253
  ) }
249
254
  { showRangeControl && ! showCustomValueControl && (
250
255
  <RangeControl
256
+ onMouseOver={ onMouseOver }
257
+ onMouseOut={ onMouseOut }
251
258
  className="components-spacing-sizes-control__range-control"
252
259
  value={ currentValue }
253
260
  onChange={ ( newSize ) =>
@@ -293,6 +300,8 @@ export default function SpacingInputControl( {
293
300
  hideLabelFromVision={ true }
294
301
  __nextUnconstrainedWidth={ true }
295
302
  size={ '__unstable-large' }
303
+ onMouseOver={ onMouseOver }
304
+ onMouseOut={ onMouseOut }
296
305
  />
297
306
  ) }
298
307
  </>
@@ -91,6 +91,7 @@
91
91
  .components-spacing-sizes-control__custom-value-input {
92
92
  width: 124px;
93
93
  margin-top: 8px;
94
+ grid-column: 1;
94
95
  }
95
96
 
96
97
  .components-range-control {
@@ -543,7 +543,7 @@ class URLInput extends Component {
543
543
  !! suggestions.length
544
544
  ) {
545
545
  return (
546
- <Popover position="bottom" focusOnMount={ false }>
546
+ <Popover placement="bottom" focusOnMount={ false }>
547
547
  <div
548
548
  { ...suggestionsListProps }
549
549
  className={ classnames(
@@ -272,6 +272,7 @@ export function BorderPanel( props ) {
272
272
  onChange={ onBorderChange }
273
273
  popoverOffset={ 40 }
274
274
  popoverPlacement="left-start"
275
+ size="__unstable-large"
275
276
  value={ hydratedBorder }
276
277
  __experimentalHasMultipleOrigins={ true }
277
278
  __experimentalIsRenderedInSidebar={ true }
@@ -7,7 +7,7 @@ import classnames from 'classnames';
7
7
  * WordPress dependencies
8
8
  */
9
9
  import { __experimentalToolsPanelItem as ToolsPanelItem } from '@wordpress/components';
10
- import { Platform } from '@wordpress/element';
10
+ import { Platform, useState } from '@wordpress/element';
11
11
  import { __ } from '@wordpress/i18n';
12
12
  import { getBlockSupport } from '@wordpress/blocks';
13
13
 
@@ -44,6 +44,13 @@ export const SPACING_SUPPORT_KEY = 'spacing';
44
44
  export const ALL_SIDES = [ 'top', 'right', 'bottom', 'left' ];
45
45
  export const AXIAL_SIDES = [ 'vertical', 'horizontal' ];
46
46
 
47
+ function useVisualizerMouseOver() {
48
+ const [ isMouseOver, setIsMouseOver ] = useState( false );
49
+ const onMouseOver = () => setIsMouseOver( true );
50
+ const onMouseOut = () => setIsMouseOver( false );
51
+ return { isMouseOver, onMouseOver, onMouseOut };
52
+ }
53
+
47
54
  /**
48
55
  * Inspector controls for dimensions support.
49
56
  *
@@ -58,6 +65,8 @@ export function DimensionsPanel( props ) {
58
65
  const isDisabled = useIsDimensionsDisabled( props );
59
66
  const isSupported = hasDimensionsSupport( props.name );
60
67
  const spacingSizes = useSetting( 'spacing.spacingSizes' );
68
+ const paddingMouseOver = useVisualizerMouseOver();
69
+ const marginMouseOver = useVisualizerMouseOver();
61
70
 
62
71
  if ( isDisabled || ! isSupported ) {
63
72
  return null;
@@ -96,7 +105,11 @@ export function DimensionsPanel( props ) {
96
105
  isShownByDefault={ defaultSpacingControls?.padding }
97
106
  panelId={ props.clientId }
98
107
  >
99
- <PaddingEdit { ...props } />
108
+ <PaddingEdit
109
+ onMouseOver={ paddingMouseOver.onMouseOver }
110
+ onMouseOut={ paddingMouseOver.onMouseOut }
111
+ { ...props }
112
+ />
100
113
  </ToolsPanelItem>
101
114
  ) }
102
115
  { ! isMarginDisabled && (
@@ -109,7 +122,11 @@ export function DimensionsPanel( props ) {
109
122
  isShownByDefault={ defaultSpacingControls?.margin }
110
123
  panelId={ props.clientId }
111
124
  >
112
- <MarginEdit { ...props } />
125
+ <MarginEdit
126
+ onMouseOver={ marginMouseOver.onMouseOver }
127
+ onMouseOut={ marginMouseOver.onMouseOut }
128
+ { ...props }
129
+ />
113
130
  </ToolsPanelItem>
114
131
  ) }
115
132
  { ! isGapDisabled && (
@@ -126,8 +143,18 @@ export function DimensionsPanel( props ) {
126
143
  </ToolsPanelItem>
127
144
  ) }
128
145
  </InspectorControls>
129
- { ! isPaddingDisabled && <PaddingVisualizer { ...props } /> }
130
- { ! isMarginDisabled && <MarginVisualizer { ...props } /> }
146
+ { ! isPaddingDisabled && (
147
+ <PaddingVisualizer
148
+ forceShow={ paddingMouseOver.isMouseOver }
149
+ { ...props }
150
+ />
151
+ ) }
152
+ { ! isMarginDisabled && (
153
+ <MarginVisualizer
154
+ forceShow={ marginMouseOver.isMouseOver }
155
+ { ...props }
156
+ />
157
+ ) }
131
158
  </>
132
159
  );
133
160
  }
@@ -150,6 +150,7 @@ export function FontSizeEdit( props ) {
150
150
  onChange={ onChange }
151
151
  value={ fontSizeValue }
152
152
  withReset={ false }
153
+ withSlider
153
154
  size="__unstable-large"
154
155
  __nextHasNoMarginBottom
155
156
  />
@@ -9,11 +9,7 @@ import { kebabCase } from 'lodash';
9
9
  */
10
10
  import { createHigherOrderComponent, useInstanceId } from '@wordpress/compose';
11
11
  import { addFilter } from '@wordpress/hooks';
12
- import {
13
- getBlockDefaultClassName,
14
- getBlockSupport,
15
- hasBlockSupport,
16
- } from '@wordpress/blocks';
12
+ import { getBlockSupport, hasBlockSupport } from '@wordpress/blocks';
17
13
  import { useSelect } from '@wordpress/data';
18
14
  import {
19
15
  Button,
@@ -366,9 +362,8 @@ export const withLayoutStyles = createHigherOrderComponent(
366
362
  const layoutClasses = hasLayoutBlockSupport
367
363
  ? useLayoutClasses( block )
368
364
  : null;
369
- const selector = `.${ getBlockDefaultClassName(
370
- name
371
- ) }.wp-container-${ id }`;
365
+ // Higher specificity to override defaults from theme.json.
366
+ const selector = `.wp-container-${ id }.wp-container-${ id }`;
372
367
  const blockGapSupport = useSetting( 'spacing.blockGap' );
373
368
  const hasBlockGapSupport = blockGapSupport !== null;
374
369
 
@@ -413,7 +408,10 @@ export const withLayoutStyles = createHigherOrderComponent(
413
408
  />,
414
409
  element
415
410
  ) }
416
- <BlockListBlock { ...props } className={ className } />
411
+ <BlockListBlock
412
+ { ...props }
413
+ __unstableLayoutClassNames={ className }
414
+ />
417
415
  </>
418
416
  );
419
417
  }