@wordpress/block-library 9.41.0 → 9.41.1-next.v.202603161435.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 (199) hide show
  1. package/build/cover/edit/cover-placeholder.cjs +7 -0
  2. package/build/cover/edit/cover-placeholder.cjs.map +2 -2
  3. package/build/html/block.json +2 -1
  4. package/build/html/modal.cjs +142 -147
  5. package/build/html/modal.cjs.map +3 -3
  6. package/build/icon/block.json +3 -12
  7. package/build/image/edit.cjs +7 -0
  8. package/build/image/edit.cjs.map +2 -2
  9. package/build/image/image.cjs +5 -9
  10. package/build/image/image.cjs.map +2 -2
  11. package/build/media-text/media-container.cjs +6 -0
  12. package/build/media-text/media-container.cjs.map +2 -2
  13. package/build/navigation/edit/index.cjs +21 -14
  14. package/build/navigation/edit/index.cjs.map +3 -3
  15. package/build/navigation/view.cjs +9 -2
  16. package/build/navigation/view.cjs.map +2 -2
  17. package/build/navigation-link/block.json +5 -0
  18. package/build/navigation-link/shared/use-link-preview.cjs +29 -0
  19. package/build/navigation-link/shared/use-link-preview.cjs.map +2 -2
  20. package/build/nextpage/block.json +0 -1
  21. package/build/paragraph/edit.cjs +1 -1
  22. package/build/paragraph/edit.cjs.map +1 -1
  23. package/build/playlist/edit.cjs +3 -23
  24. package/build/playlist/edit.cjs.map +3 -3
  25. package/build/playlist/utils.cjs +48 -0
  26. package/build/playlist/utils.cjs.map +7 -0
  27. package/build/playlist-track/block.json +0 -0
  28. package/build/post-excerpt/block.json +1 -3
  29. package/build/post-excerpt/deprecated.cjs +112 -0
  30. package/build/post-excerpt/deprecated.cjs.map +7 -0
  31. package/build/post-excerpt/edit.cjs +11 -30
  32. package/build/post-excerpt/edit.cjs.map +3 -3
  33. package/build/post-excerpt/index.cjs +3 -1
  34. package/build/post-excerpt/index.cjs.map +3 -3
  35. package/build/private-apis.cjs +3 -1
  36. package/build/private-apis.cjs.map +2 -2
  37. package/build/shortcode/block.json +2 -1
  38. package/build/site-logo/edit.cjs +1 -3
  39. package/build/site-logo/edit.cjs.map +2 -2
  40. package/build/tab/add-tab-toolbar-control.cjs +22 -5
  41. package/build/tab/add-tab-toolbar-control.cjs.map +2 -2
  42. package/build/tab/remove-tab-toolbar-control.cjs +19 -1
  43. package/build/tab/remove-tab-toolbar-control.cjs.map +2 -2
  44. package/build/tabs/edit.cjs +85 -7
  45. package/build/tabs/edit.cjs.map +2 -2
  46. package/build/tabs/index.cjs +12 -2
  47. package/build/tabs/index.cjs.map +2 -2
  48. package/build/tabs-menu/block.json +1 -6
  49. package/build/tabs-menu/edit.cjs +11 -151
  50. package/build/tabs-menu/edit.cjs.map +3 -3
  51. package/build/tabs-menu/save.cjs.map +2 -2
  52. package/build/tabs-menu-item/block.json +14 -11
  53. package/build/tabs-menu-item/controls.cjs +2 -133
  54. package/build/tabs-menu-item/controls.cjs.map +3 -3
  55. package/build/tabs-menu-item/edit.cjs +44 -56
  56. package/build/tabs-menu-item/edit.cjs.map +3 -3
  57. package/build/tabs-menu-item/save.cjs +0 -1
  58. package/build/tabs-menu-item/save.cjs.map +2 -2
  59. package/build/template-part/edit/index.cjs +6 -4
  60. package/build/template-part/edit/index.cjs.map +2 -2
  61. package/build/utils/media-control.cjs +72 -29
  62. package/build/utils/media-control.cjs.map +3 -3
  63. package/build-module/cover/edit/cover-placeholder.mjs +7 -0
  64. package/build-module/cover/edit/cover-placeholder.mjs.map +2 -2
  65. package/build-module/html/block.json +2 -1
  66. package/build-module/html/modal.mjs +144 -149
  67. package/build-module/html/modal.mjs.map +2 -2
  68. package/build-module/icon/block.json +3 -12
  69. package/build-module/image/edit.mjs +7 -0
  70. package/build-module/image/edit.mjs.map +2 -2
  71. package/build-module/image/image.mjs +5 -9
  72. package/build-module/image/image.mjs.map +2 -2
  73. package/build-module/media-text/media-container.mjs +7 -1
  74. package/build-module/media-text/media-container.mjs.map +2 -2
  75. package/build-module/navigation/edit/index.mjs +22 -14
  76. package/build-module/navigation/edit/index.mjs.map +2 -2
  77. package/build-module/navigation/view.mjs +9 -2
  78. package/build-module/navigation/view.mjs.map +2 -2
  79. package/build-module/navigation-link/block.json +5 -0
  80. package/build-module/navigation-link/shared/use-link-preview.mjs +28 -0
  81. package/build-module/navigation-link/shared/use-link-preview.mjs.map +2 -2
  82. package/build-module/nextpage/block.json +0 -1
  83. package/build-module/paragraph/edit.mjs +2 -2
  84. package/build-module/paragraph/edit.mjs.map +1 -1
  85. package/build-module/playlist/edit.mjs +2 -18
  86. package/build-module/playlist/edit.mjs.map +2 -2
  87. package/build-module/playlist/utils.mjs +23 -0
  88. package/build-module/playlist/utils.mjs.map +7 -0
  89. package/build-module/playlist-track/block.json +0 -0
  90. package/build-module/post-excerpt/block.json +1 -3
  91. package/build-module/post-excerpt/deprecated.mjs +81 -0
  92. package/build-module/post-excerpt/deprecated.mjs.map +7 -0
  93. package/build-module/post-excerpt/edit.mjs +12 -34
  94. package/build-module/post-excerpt/edit.mjs.map +2 -2
  95. package/build-module/post-excerpt/index.mjs +3 -1
  96. package/build-module/post-excerpt/index.mjs.map +2 -2
  97. package/build-module/private-apis.mjs +3 -1
  98. package/build-module/private-apis.mjs.map +2 -2
  99. package/build-module/shortcode/block.json +2 -1
  100. package/build-module/site-logo/edit.mjs +1 -3
  101. package/build-module/site-logo/edit.mjs.map +2 -2
  102. package/build-module/tab/add-tab-toolbar-control.mjs +22 -5
  103. package/build-module/tab/add-tab-toolbar-control.mjs.map +2 -2
  104. package/build-module/tab/remove-tab-toolbar-control.mjs +19 -1
  105. package/build-module/tab/remove-tab-toolbar-control.mjs.map +2 -2
  106. package/build-module/tabs/edit.mjs +87 -9
  107. package/build-module/tabs/edit.mjs.map +2 -2
  108. package/build-module/tabs/index.mjs +12 -2
  109. package/build-module/tabs/index.mjs.map +2 -2
  110. package/build-module/tabs-menu/block.json +1 -6
  111. package/build-module/tabs-menu/edit.mjs +13 -162
  112. package/build-module/tabs-menu/edit.mjs.map +2 -2
  113. package/build-module/tabs-menu/save.mjs.map +2 -2
  114. package/build-module/tabs-menu-item/block.json +14 -11
  115. package/build-module/tabs-menu-item/controls.mjs +4 -143
  116. package/build-module/tabs-menu-item/controls.mjs.map +2 -2
  117. package/build-module/tabs-menu-item/edit.mjs +45 -57
  118. package/build-module/tabs-menu-item/edit.mjs.map +3 -3
  119. package/build-module/tabs-menu-item/save.mjs +0 -1
  120. package/build-module/tabs-menu-item/save.mjs.map +2 -2
  121. package/build-module/template-part/edit/index.mjs +6 -4
  122. package/build-module/template-part/edit/index.mjs.map +2 -2
  123. package/build-module/utils/media-control.mjs +73 -30
  124. package/build-module/utils/media-control.mjs.map +2 -2
  125. package/build-style/common-rtl.css +1 -0
  126. package/build-style/common.css +1 -0
  127. package/build-style/editor-rtl.css +55 -17
  128. package/build-style/editor.css +55 -17
  129. package/build-style/html/editor-rtl.css +10 -6
  130. package/build-style/html/editor.css +10 -6
  131. package/build-style/navigation/style-rtl.css +15 -1
  132. package/build-style/navigation/style.css +15 -1
  133. package/build-style/navigation-overlay-close/style-rtl.css +3 -3
  134. package/build-style/navigation-overlay-close/style.css +3 -3
  135. package/build-style/playlist/style-rtl.css +4 -0
  136. package/build-style/playlist/style.css +4 -0
  137. package/build-style/style-rtl.css +23 -4
  138. package/build-style/style.css +23 -4
  139. package/build-style/tabs-menu/editor-rtl.css +5 -3
  140. package/build-style/tabs-menu/editor.css +5 -3
  141. package/package.json +38 -38
  142. package/src/accordion-item/index.php +17 -5
  143. package/src/common.scss +1 -0
  144. package/src/cover/edit/cover-placeholder.js +8 -0
  145. package/src/cover/index.php +8 -0
  146. package/src/details/index.php +47 -0
  147. package/src/html/block.json +2 -1
  148. package/src/html/editor.scss +15 -5
  149. package/src/html/modal.js +26 -22
  150. package/src/icon/block.json +3 -12
  151. package/src/image/edit.js +8 -0
  152. package/src/image/image.js +8 -13
  153. package/src/media-text/media-container.js +8 -1
  154. package/src/navigation/edit/index.js +26 -14
  155. package/src/navigation/index.php +27 -13
  156. package/src/navigation/style.scss +17 -1
  157. package/src/navigation/view.js +14 -2
  158. package/src/navigation-link/block.json +5 -0
  159. package/src/navigation-link/index.php +10 -10
  160. package/src/navigation-link/shared/test/use-link-preview.test.js +149 -0
  161. package/src/navigation-link/shared/use-link-preview.js +43 -1
  162. package/src/navigation-overlay-close/style.scss +3 -3
  163. package/src/navigation-submenu/index.php +17 -11
  164. package/src/nextpage/block.json +0 -1
  165. package/src/paragraph/edit.js +2 -2
  166. package/src/playlist/edit.js +1 -34
  167. package/src/playlist/style.scss +5 -0
  168. package/src/playlist/test/edit.js +1 -1
  169. package/src/playlist/utils.js +42 -0
  170. package/src/playlist-track/block.json +0 -0
  171. package/src/playlist-track/edit.js +0 -0
  172. package/src/playlist-track/index.js +0 -0
  173. package/src/playlist-track/index.php +0 -0
  174. package/src/playlist-track/init.js +0 -0
  175. package/src/playlist-track/style.scss +0 -0
  176. package/src/post-excerpt/block.json +1 -3
  177. package/src/post-excerpt/deprecated.js +84 -0
  178. package/src/post-excerpt/edit.js +14 -39
  179. package/src/post-excerpt/index.js +2 -0
  180. package/src/private-apis.js +2 -0
  181. package/src/shortcode/block.json +2 -1
  182. package/src/site-logo/edit.js +1 -3
  183. package/src/tab/add-tab-toolbar-control.js +48 -23
  184. package/src/tab/remove-tab-toolbar-control.js +30 -10
  185. package/src/tabs/edit.js +133 -10
  186. package/src/tabs/index.js +12 -2
  187. package/src/tabs-menu/block.json +1 -6
  188. package/src/tabs-menu/edit.js +13 -214
  189. package/src/tabs-menu/editor.scss +7 -3
  190. package/src/tabs-menu/index.php +42 -27
  191. package/src/tabs-menu/save.js +0 -4
  192. package/src/tabs-menu-item/block.json +14 -11
  193. package/src/tabs-menu-item/controls.js +4 -167
  194. package/src/tabs-menu-item/edit.js +60 -69
  195. package/src/tabs-menu-item/index.php +11 -23
  196. package/src/tabs-menu-item/save.js +0 -1
  197. package/src/template-part/edit/index.js +5 -1
  198. package/src/utils/media-control.js +61 -21
  199. package/src/utils/media-control.scss +54 -18
@@ -4,7 +4,7 @@
4
4
  import {
5
5
  Button,
6
6
  DropZone,
7
- FlexItem,
7
+ FlexBlock,
8
8
  Spinner,
9
9
  __experimentalItemGroup as ItemGroup,
10
10
  __experimentalHStack as HStack,
@@ -14,36 +14,62 @@ import {
14
14
  MediaReplaceFlow,
15
15
  store as blockEditorStore,
16
16
  } from '@wordpress/block-editor';
17
+ import { focus } from '@wordpress/dom';
18
+ import { useRef } from '@wordpress/element';
17
19
  import { __ } from '@wordpress/i18n';
18
20
  import { useSelect } from '@wordpress/data';
21
+ import { reset as resetIcon } from '@wordpress/icons';
22
+ import { getFilename } from '@wordpress/url';
23
+
24
+ /**
25
+ * Focuses the toggle button.
26
+ *
27
+ * @param {Object} containerRef - ref object containing current element
28
+ */
29
+ const focusToggleButton = ( containerRef ) => {
30
+ // Use requestAnimationFrame to ensure DOM updates are complete.
31
+ window.requestAnimationFrame( () => {
32
+ const [ toggleButton ] = focus.tabbable.find( containerRef?.current );
33
+ if ( ! toggleButton ) {
34
+ return;
35
+ }
36
+
37
+ toggleButton.focus();
38
+ } );
39
+ };
19
40
 
20
41
  /**
21
42
  * MediaControlPreview - Preview component showing media thumbnail and filename
22
43
  *
23
44
  * @param {Object} props
24
45
  * @param {string} props.url Media URL for thumbnail
25
- * @param {string} props.alt Alt text for image
26
46
  * @param {string} props.filename Filename to display
27
47
  * @param {Object} props.itemGroupProps Optional props to pass to ItemGroup
28
48
  * @param {string} props.className Optional className for Truncate
49
+ * @param {string} props.label Optional label for accessibility
29
50
  * @return {Element} Preview component
30
51
  */
31
52
  export function MediaControlPreview( {
32
53
  url,
33
- alt,
34
54
  filename,
35
55
  itemGroupProps,
36
56
  className,
57
+ label,
37
58
  } ) {
38
59
  return (
39
60
  <ItemGroup { ...itemGroupProps } as="span">
40
- <HStack justify="flex-start" as="span">
41
- <img src={ url } alt={ alt } />
42
- <FlexItem as="span">
61
+ <HStack justify="flex-start">
62
+ <span
63
+ className="block-library-utils__media-control__inspector-image-indicator"
64
+ style={ {
65
+ backgroundImage: url ? `url(${ url })` : undefined,
66
+ } }
67
+ />
68
+ <FlexBlock>
43
69
  <Truncate numberOfLines={ 1 } className={ className }>
44
- { filename }
70
+ { filename ?? label }
45
71
  </Truncate>
46
- </FlexItem>
72
+ </FlexBlock>
47
73
  </HStack>
48
74
  </ItemGroup>
49
75
  );
@@ -55,7 +81,6 @@ export function MediaControlPreview( {
55
81
  * @param {Object} props
56
82
  * @param {number} props.mediaId Media attachment ID
57
83
  * @param {string} props.mediaUrl Media URL
58
- * @param {string} props.alt Alt text for preview
59
84
  * @param {string} props.filename Filename to display
60
85
  * @param {Array} props.allowedTypes Allowed media types
61
86
  * @param {Function} props.onSelect Callback when media selected
@@ -69,7 +94,6 @@ export function MediaControlPreview( {
69
94
  export function MediaControl( {
70
95
  mediaId,
71
96
  mediaUrl,
72
- alt = '',
73
97
  filename,
74
98
  allowedTypes,
75
99
  onSelect,
@@ -77,7 +101,7 @@ export function MediaControl( {
77
101
  onError,
78
102
  onReset,
79
103
  isUploading = false,
80
- emptyLabel = __( 'Add media' ),
104
+ emptyLabel = __( 'Media' ),
81
105
  } ) {
82
106
  const { getSettings } = useSelect( blockEditorStore );
83
107
  const onFilesDrop = ( filesList ) => {
@@ -95,10 +119,15 @@ export function MediaControl( {
95
119
  multiple: false,
96
120
  } );
97
121
  };
122
+ const containerRef = useRef();
98
123
 
99
124
  return (
100
- <div className="block-library-utils__media-control">
125
+ <div
126
+ ref={ containerRef }
127
+ className="block-library-utils__media-control"
128
+ >
101
129
  <MediaReplaceFlow
130
+ className="block-library-utils__media-control__replace-flow"
102
131
  mediaId={ mediaId }
103
132
  mediaURL={ mediaUrl }
104
133
  allowedTypes={ allowedTypes }
@@ -106,15 +135,14 @@ export function MediaControl( {
106
135
  onSelectURL={ onSelectURL }
107
136
  onError={ onError }
108
137
  name={
109
- mediaUrl ? (
110
- <MediaControlPreview
111
- url={ mediaUrl }
112
- alt={ alt }
113
- filename={ filename }
114
- />
115
- ) : (
116
- emptyLabel
117
- )
138
+ <MediaControlPreview
139
+ url={ mediaUrl }
140
+ filename={ filename }
141
+ className="block-library-utils__media-control__inspector-media-replace-title"
142
+ label={
143
+ mediaUrl ? getFilename( filename ) : emptyLabel
144
+ }
145
+ />
118
146
  }
119
147
  renderToggle={ ( props ) => (
120
148
  <Button { ...props } __next40pxDefaultSize>
@@ -123,6 +151,18 @@ export function MediaControl( {
123
151
  ) }
124
152
  onReset={ onReset }
125
153
  />
154
+ { mediaUrl && onReset && (
155
+ <Button
156
+ label={ __( 'Reset' ) }
157
+ className="block-library-utils__media-control__reset"
158
+ size="small"
159
+ icon={ resetIcon }
160
+ onClick={ () => {
161
+ onReset();
162
+ focusToggleButton( containerRef );
163
+ } }
164
+ />
165
+ ) }
126
166
  <DropZone onFilesDrop={ onFilesDrop } />
127
167
  </div>
128
168
  );
@@ -11,31 +11,67 @@
11
11
  display: none;
12
12
  }
13
13
 
14
- button.components-button {
15
- color: $gray-900;
16
- box-shadow: inset 0 0 0 1px $gray-400;
17
- width: 100%;
14
+ .block-library-utils__media-control__replace-flow {
18
15
  display: block;
19
- height: $grid-unit-50;
20
16
 
21
- &:hover {
22
- color: var(--wp-admin-theme-color);
23
- }
17
+ button.components-button {
18
+ color: $gray-900;
19
+ box-shadow: inset 0 0 0 1px $gray-400;
20
+ width: 100%;
21
+ display: block;
22
+ height: $grid-unit-50;
23
+ padding-right: $grid-unit-40;
24
+
25
+ &:hover {
26
+ color: var(--wp-admin-theme-color);
27
+ }
24
28
 
25
- &:focus {
26
- box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
29
+ &:focus {
30
+ box-shadow: inset 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color);
31
+ }
27
32
  }
28
33
  }
34
+ }
29
35
 
30
- .components-dropdown {
31
- display: block;
36
+ .block-library-utils__media-control__inspector-media-replace-title {
37
+ word-break: break-all;
38
+ // The Button component is white-space: nowrap, and that won't work with line-clamp.
39
+ white-space: normal;
40
+
41
+ // Without this, the ellipsis can sometimes be partially hidden by the Button padding.
42
+ text-align: start;
43
+ }
44
+
45
+ .block-library-utils__media-control__inspector-image-indicator {
46
+ width: 20px;
47
+ height: 20px;
48
+ border-radius: $radius-small;
49
+ box-shadow: inset 0 0 0 $border-width rgba(0, 0, 0, 0.2);
50
+ background: $white linear-gradient(-45deg, transparent 48%, $gray-300 48%, $gray-300 52%, transparent 52%);
51
+ background-size: cover;
52
+ // Show a thin outline in Windows high contrast mode, otherwise the button is invisible.
53
+ outline: 1px solid transparent;
54
+ }
55
+
56
+ .block-library-utils__media-control__reset {
57
+ position: absolute;
58
+ right: 0;
59
+ top: $grid-unit;
60
+ margin: auto $grid-unit auto;
61
+ opacity: 0;
62
+ border-radius: $radius-small;
63
+ @media not ( prefers-reduced-motion ) {
64
+ transition: opacity 0.1s ease-in-out;
65
+ }
66
+
67
+ .block-library-utils__media-control:hover &,
68
+ &:focus,
69
+ &:hover {
70
+ opacity: 1;
32
71
  }
33
72
 
34
- img {
35
- width: 20px;
36
- min-width: 20px;
37
- aspect-ratio: 1;
38
- box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2);
39
- border-radius: 2px;
73
+ @media (hover: none) {
74
+ // Show reset button on devices that do not support hover.
75
+ opacity: 1;
40
76
  }
41
77
  }