@wordpress/block-library 9.27.1-next.46f643fa0.0 → 9.28.1-next.0f6f9d12c.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 (271) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/accordion-header/edit.js +118 -0
  3. package/build/accordion-header/edit.js.map +1 -0
  4. package/build/accordion-header/index.js +124 -0
  5. package/build/accordion-header/index.js.map +1 -0
  6. package/build/accordion-header/init.js +12 -0
  7. package/build/accordion-header/init.js.map +1 -0
  8. package/build/accordion-header/save.js +81 -0
  9. package/build/accordion-header/save.js.map +1 -0
  10. package/build/accordion-item/edit.js +129 -0
  11. package/build/accordion-item/edit.js.map +1 -0
  12. package/build/accordion-item/icons.js +30 -0
  13. package/build/accordion-item/icons.js.map +1 -0
  14. package/build/accordion-item/index.js +79 -0
  15. package/build/accordion-item/index.js.map +1 -0
  16. package/build/accordion-item/init.js +12 -0
  17. package/build/accordion-item/init.js.map +1 -0
  18. package/build/accordion-item/save.js +37 -0
  19. package/build/accordion-item/save.js.map +1 -0
  20. package/build/accordion-panel/edit.js +59 -0
  21. package/build/accordion-panel/edit.js.map +1 -0
  22. package/build/accordion-panel/index.js +108 -0
  23. package/build/accordion-panel/index.js.map +1 -0
  24. package/build/accordion-panel/init.js +12 -0
  25. package/build/accordion-panel/init.js.map +1 -0
  26. package/build/accordion-panel/save.js +46 -0
  27. package/build/accordion-panel/save.js.map +1 -0
  28. package/build/accordions/edit.js +123 -0
  29. package/build/accordions/edit.js.map +1 -0
  30. package/build/accordions/index.js +103 -0
  31. package/build/accordions/index.js.map +1 -0
  32. package/build/accordions/init.js +12 -0
  33. package/build/accordions/init.js.map +1 -0
  34. package/build/accordions/save.js +36 -0
  35. package/build/accordions/save.js.map +1 -0
  36. package/build/accordions/view.js +49 -0
  37. package/build/accordions/view.js.map +1 -0
  38. package/build/cover/edit/index.js +1 -1
  39. package/build/cover/edit/index.js.map +1 -1
  40. package/build/cover/edit/inspector-controls.js +1 -1
  41. package/build/cover/edit/inspector-controls.js.map +1 -1
  42. package/build/cover/index.js +2 -1
  43. package/build/cover/index.js.map +1 -1
  44. package/build/file/edit.js +4 -2
  45. package/build/file/edit.js.map +1 -1
  46. package/build/file/edit.native.js +1 -1
  47. package/build/file/edit.native.js.map +1 -1
  48. package/build/file/transforms.js +6 -6
  49. package/build/file/transforms.js.map +1 -1
  50. package/build/file/utils/index.js +5 -0
  51. package/build/file/utils/index.js.map +1 -1
  52. package/build/freeform/edit.js +6 -0
  53. package/build/freeform/edit.js.map +1 -1
  54. package/build/gallery/use-get-media.js +3 -3
  55. package/build/gallery/use-get-media.js.map +1 -1
  56. package/build/gallery/use-get-media.native.js +3 -3
  57. package/build/gallery/use-get-media.native.js.map +1 -1
  58. package/build/image/edit.native.js +2 -2
  59. package/build/image/edit.native.js.map +1 -1
  60. package/build/image/image.js +1 -1
  61. package/build/image/image.js.map +1 -1
  62. package/build/index.js +10 -0
  63. package/build/index.js.map +1 -1
  64. package/build/list-item/edit.js +3 -0
  65. package/build/list-item/edit.js.map +1 -1
  66. package/build/media-text/edit.js +2 -2
  67. package/build/media-text/edit.js.map +1 -1
  68. package/build/media-text/media-container.js +2 -1
  69. package/build/media-text/media-container.js.map +1 -1
  70. package/build/media-text/transforms.js +7 -3
  71. package/build/media-text/transforms.js.map +1 -1
  72. package/build/more/edit.js +13 -28
  73. package/build/more/edit.js.map +1 -1
  74. package/build/post-comments-count/index.js +3 -0
  75. package/build/post-comments-count/index.js.map +1 -1
  76. package/build/post-comments-link/index.js +3 -0
  77. package/build/post-comments-link/index.js.map +1 -1
  78. package/build/post-featured-image/edit.js +2 -2
  79. package/build/post-featured-image/edit.js.map +1 -1
  80. package/build/query-title/edit.js +52 -2
  81. package/build/query-title/edit.js.map +1 -1
  82. package/build/query-title/index.js +1 -0
  83. package/build/query-title/index.js.map +1 -1
  84. package/build/query-title/use-post-type-label.js +42 -0
  85. package/build/query-title/use-post-type-label.js.map +1 -0
  86. package/build/query-title/variations.js +10 -0
  87. package/build/query-title/variations.js.map +1 -1
  88. package/build/site-logo/edit.js +58 -43
  89. package/build/site-logo/edit.js.map +1 -1
  90. package/build/site-title/edit.js +9 -3
  91. package/build/site-title/edit.js.map +1 -1
  92. package/build/social-link/icons/tiktok.js +2 -2
  93. package/build/social-link/icons/tiktok.js.map +1 -1
  94. package/build/utils/poster-image.js +54 -6
  95. package/build/utils/poster-image.js.map +1 -1
  96. package/build-module/accordion-header/edit.js +108 -0
  97. package/build-module/accordion-header/edit.js.map +1 -0
  98. package/build-module/accordion-header/index.js +116 -0
  99. package/build-module/accordion-header/index.js.map +1 -0
  100. package/build-module/accordion-header/init.js +6 -0
  101. package/build-module/accordion-header/init.js.map +1 -0
  102. package/build-module/accordion-header/save.js +71 -0
  103. package/build-module/accordion-header/save.js.map +1 -0
  104. package/build-module/accordion-item/edit.js +120 -0
  105. package/build-module/accordion-item/edit.js.map +1 -0
  106. package/build-module/accordion-item/icons.js +22 -0
  107. package/build-module/accordion-item/icons.js.map +1 -0
  108. package/build-module/accordion-item/index.js +71 -0
  109. package/build-module/accordion-item/index.js.map +1 -0
  110. package/build-module/accordion-item/init.js +6 -0
  111. package/build-module/accordion-item/init.js.map +1 -0
  112. package/build-module/accordion-item/save.js +28 -0
  113. package/build-module/accordion-item/save.js.map +1 -0
  114. package/build-module/accordion-panel/edit.js +50 -0
  115. package/build-module/accordion-panel/edit.js.map +1 -0
  116. package/build-module/accordion-panel/index.js +100 -0
  117. package/build-module/accordion-panel/index.js.map +1 -0
  118. package/build-module/accordion-panel/init.js +6 -0
  119. package/build-module/accordion-panel/init.js.map +1 -0
  120. package/build-module/accordion-panel/save.js +37 -0
  121. package/build-module/accordion-panel/save.js.map +1 -0
  122. package/build-module/accordions/edit.js +116 -0
  123. package/build-module/accordions/edit.js.map +1 -0
  124. package/build-module/accordions/index.js +95 -0
  125. package/build-module/accordions/index.js.map +1 -0
  126. package/build-module/accordions/init.js +6 -0
  127. package/build-module/accordions/init.js.map +1 -0
  128. package/build-module/accordions/save.js +27 -0
  129. package/build-module/accordions/save.js.map +1 -0
  130. package/build-module/accordions/view.js +46 -0
  131. package/build-module/accordions/view.js.map +1 -0
  132. package/build-module/cover/edit/index.js +1 -1
  133. package/build-module/cover/edit/index.js.map +1 -1
  134. package/build-module/cover/edit/inspector-controls.js +1 -1
  135. package/build-module/cover/edit/inspector-controls.js.map +1 -1
  136. package/build-module/cover/index.js +2 -1
  137. package/build-module/cover/index.js.map +1 -1
  138. package/build-module/file/edit.js +4 -2
  139. package/build-module/file/edit.js.map +1 -1
  140. package/build-module/file/edit.native.js +1 -1
  141. package/build-module/file/edit.native.js.map +1 -1
  142. package/build-module/file/transforms.js +6 -6
  143. package/build-module/file/transforms.js.map +1 -1
  144. package/build-module/file/utils/index.js +5 -0
  145. package/build-module/file/utils/index.js.map +1 -1
  146. package/build-module/freeform/edit.js +6 -0
  147. package/build-module/freeform/edit.js.map +1 -1
  148. package/build-module/gallery/use-get-media.js +3 -3
  149. package/build-module/gallery/use-get-media.js.map +1 -1
  150. package/build-module/gallery/use-get-media.native.js +3 -3
  151. package/build-module/gallery/use-get-media.native.js.map +1 -1
  152. package/build-module/image/edit.native.js +2 -2
  153. package/build-module/image/edit.native.js.map +1 -1
  154. package/build-module/image/image.js +1 -1
  155. package/build-module/image/image.js.map +1 -1
  156. package/build-module/index.js +10 -0
  157. package/build-module/index.js.map +1 -1
  158. package/build-module/list-item/edit.js +3 -0
  159. package/build-module/list-item/edit.js.map +1 -1
  160. package/build-module/media-text/edit.js +2 -2
  161. package/build-module/media-text/edit.js.map +1 -1
  162. package/build-module/media-text/media-container.js +2 -1
  163. package/build-module/media-text/media-container.js.map +1 -1
  164. package/build-module/media-text/transforms.js +7 -3
  165. package/build-module/media-text/transforms.js.map +1 -1
  166. package/build-module/more/edit.js +15 -29
  167. package/build-module/more/edit.js.map +1 -1
  168. package/build-module/post-comments-count/index.js +3 -0
  169. package/build-module/post-comments-count/index.js.map +1 -1
  170. package/build-module/post-comments-link/index.js +3 -0
  171. package/build-module/post-comments-link/index.js.map +1 -1
  172. package/build-module/post-featured-image/edit.js +2 -2
  173. package/build-module/post-featured-image/edit.js.map +1 -1
  174. package/build-module/query-title/edit.js +52 -2
  175. package/build-module/query-title/edit.js.map +1 -1
  176. package/build-module/query-title/index.js +1 -0
  177. package/build-module/query-title/index.js.map +1 -1
  178. package/build-module/query-title/use-post-type-label.js +36 -0
  179. package/build-module/query-title/use-post-type-label.js.map +1 -0
  180. package/build-module/query-title/variations.js +10 -0
  181. package/build-module/query-title/variations.js.map +1 -1
  182. package/build-module/site-logo/edit.js +59 -44
  183. package/build-module/site-logo/edit.js.map +1 -1
  184. package/build-module/site-title/edit.js +10 -4
  185. package/build-module/site-title/edit.js.map +1 -1
  186. package/build-module/social-link/icons/tiktok.js +2 -2
  187. package/build-module/social-link/icons/tiktok.js.map +1 -1
  188. package/build-module/utils/poster-image.js +57 -9
  189. package/build-module/utils/poster-image.js.map +1 -1
  190. package/build-style/accordions/style-rtl.css +223 -0
  191. package/build-style/accordions/style.css +223 -0
  192. package/build-style/editor-rtl.css +23 -26
  193. package/build-style/editor.css +23 -26
  194. package/build-style/gallery/style-rtl.css +1 -2
  195. package/build-style/gallery/style.css +1 -2
  196. package/build-style/image/style-rtl.css +1 -2
  197. package/build-style/image/style.css +1 -2
  198. package/build-style/more/editor-rtl.css +3 -11
  199. package/build-style/more/editor.css +3 -11
  200. package/build-style/post-featured-image/editor-rtl.css +1 -2
  201. package/build-style/post-featured-image/editor.css +1 -2
  202. package/build-style/style-rtl.css +90 -4
  203. package/build-style/style.css +90 -4
  204. package/package.json +36 -35
  205. package/src/accordion-header/block.json +93 -0
  206. package/src/accordion-header/edit.js +128 -0
  207. package/src/accordion-header/index.js +24 -0
  208. package/src/accordion-header/init.js +6 -0
  209. package/src/accordion-header/save.js +79 -0
  210. package/src/accordion-item/block.json +45 -0
  211. package/src/accordion-item/edit.js +149 -0
  212. package/src/accordion-item/icons.js +23 -0
  213. package/src/accordion-item/index.js +24 -0
  214. package/src/accordion-item/index.php +73 -0
  215. package/src/accordion-item/init.js +6 -0
  216. package/src/accordion-item/save.js +25 -0
  217. package/src/accordion-panel/block.json +74 -0
  218. package/src/accordion-panel/edit.js +61 -0
  219. package/src/accordion-panel/index.js +24 -0
  220. package/src/accordion-panel/init.js +6 -0
  221. package/src/accordion-panel/save.js +51 -0
  222. package/src/accordions/block.json +69 -0
  223. package/src/accordions/edit.js +133 -0
  224. package/src/accordions/index.js +24 -0
  225. package/src/accordions/index.php +61 -0
  226. package/src/accordions/init.js +6 -0
  227. package/src/accordions/save.js +23 -0
  228. package/src/accordions/style.scss +91 -0
  229. package/src/accordions/view.js +38 -0
  230. package/src/block/index.php +35 -20
  231. package/src/cover/block.json +2 -1
  232. package/src/cover/edit/index.js +8 -3
  233. package/src/cover/edit/inspector-controls.js +6 -1
  234. package/src/file/edit.js +9 -4
  235. package/src/file/edit.native.js +5 -1
  236. package/src/file/index.php +28 -22
  237. package/src/file/transforms.js +6 -6
  238. package/src/file/utils/index.js +5 -0
  239. package/src/form-input/index.php +4 -2
  240. package/src/freeform/edit.js +7 -0
  241. package/src/gallery/use-get-media.js +9 -5
  242. package/src/gallery/use-get-media.native.js +10 -6
  243. package/src/image/edit.native.js +4 -2
  244. package/src/image/image.js +6 -1
  245. package/src/image/index.php +1 -1
  246. package/src/image/test/edit.native.js +16 -10
  247. package/src/index.js +12 -0
  248. package/src/list-item/edit.js +3 -0
  249. package/src/loginout/index.php +4 -2
  250. package/src/media-text/edit.js +16 -6
  251. package/src/media-text/media-container.js +1 -0
  252. package/src/media-text/transforms.js +5 -1
  253. package/src/more/edit.js +27 -33
  254. package/src/more/editor.scss +3 -12
  255. package/src/post-comments-count/block.json +3 -0
  256. package/src/post-comments-link/block.json +3 -0
  257. package/src/post-date/index.php +28 -32
  258. package/src/post-excerpt/index.php +16 -12
  259. package/src/post-featured-image/edit.js +2 -2
  260. package/src/query-title/block.json +1 -0
  261. package/src/query-title/edit.js +58 -1
  262. package/src/query-title/index.php +30 -5
  263. package/src/query-title/use-post-type-label.js +34 -0
  264. package/src/query-title/variations.js +13 -0
  265. package/src/site-logo/edit.js +44 -16
  266. package/src/site-title/edit.js +24 -16
  267. package/src/social-link/icons/tiktok.js +2 -2
  268. package/src/social-link/index.php +1 -1
  269. package/src/style.scss +1 -0
  270. package/src/utils/poster-image.js +62 -17
  271. package/src/utils/poster-image.scss +23 -16
@@ -104,8 +104,8 @@ const transforms = {
104
104
  if ( ! id ) {
105
105
  return false;
106
106
  }
107
- const { getMedia } = select( coreStore );
108
- const media = getMedia( id );
107
+ const { getEntityRecord } = select( coreStore );
108
+ const media = getEntityRecord( 'postType', 'attachment', id );
109
109
  return !! media && media.mime_type.includes( 'audio' );
110
110
  },
111
111
  transform: ( attributes ) => {
@@ -124,8 +124,8 @@ const transforms = {
124
124
  if ( ! id ) {
125
125
  return false;
126
126
  }
127
- const { getMedia } = select( coreStore );
128
- const media = getMedia( id );
127
+ const { getEntityRecord } = select( coreStore );
128
+ const media = getEntityRecord( 'postType', 'attachment', id );
129
129
  return !! media && media.mime_type.includes( 'video' );
130
130
  },
131
131
  transform: ( attributes ) => {
@@ -144,8 +144,8 @@ const transforms = {
144
144
  if ( ! id ) {
145
145
  return false;
146
146
  }
147
- const { getMedia } = select( coreStore );
148
- const media = getMedia( id );
147
+ const { getEntityRecord } = select( coreStore );
148
+ const media = getEntityRecord( 'postType', 'attachment', id );
149
149
  return !! media && media.mime_type.includes( 'image' );
150
150
  },
151
151
  transform: ( attributes ) => {
@@ -5,6 +5,11 @@
5
5
  * @return {boolean} Whether or not the browser supports inline PDFs.
6
6
  */
7
7
  export const browserSupportsPdfs = () => {
8
+ // Use native feature detection if available.
9
+ if ( window.navigator.pdfViewerEnabled ) {
10
+ return true;
11
+ }
12
+
8
13
  // Most mobile devices include "Mobi" in their UA.
9
14
  if ( window.navigator.userAgent.indexOf( 'Mobi' ) > -1 ) {
10
15
  return false;
@@ -19,10 +19,12 @@ function render_block_core_form_input( $attributes, $content ) {
19
19
  $visibility_permissions = $attributes['visibilityPermissions'];
20
20
  }
21
21
 
22
- if ( 'logged-in' === $visibility_permissions && ! is_user_logged_in() ) {
22
+ $user_logged_in = is_user_logged_in();
23
+
24
+ if ( 'logged-in' === $visibility_permissions && ! $user_logged_in ) {
23
25
  return '';
24
26
  }
25
- if ( 'logged-out' === $visibility_permissions && is_user_logged_in() ) {
27
+ if ( 'logged-out' === $visibility_permissions && $user_logged_in ) {
26
28
  return '';
27
29
  }
28
30
  return $content;
@@ -188,6 +188,13 @@ function ClassicEdit( {
188
188
  }
189
189
  } );
190
190
 
191
+ editor.on( 'paste', ( event ) => {
192
+ // TinyMCE selection isn’t synced with the block editor selection store.
193
+ // This event handler prevents paste from bubbling so the useClipboardHandler
194
+ // won’t replace the block.
195
+ event.stopPropagation();
196
+ } );
197
+
191
198
  editor.on( 'init', () => {
192
199
  const rootNode = editor.getBody();
193
200
 
@@ -26,11 +26,15 @@ export default function useGetMedia( innerBlockImages ) {
26
26
  }
27
27
 
28
28
  return (
29
- select( coreStore ).getMediaItems( {
30
- include: imageIds.join( ',' ),
31
- per_page: -1,
32
- orderby: 'include',
33
- } ) ?? EMPTY_IMAGE_MEDIA
29
+ select( coreStore ).getEntityRecords(
30
+ 'postType',
31
+ 'attachment',
32
+ {
33
+ include: imageIds.join( ',' ),
34
+ per_page: -1,
35
+ orderby: 'include',
36
+ }
37
+ ) ?? EMPTY_IMAGE_MEDIA
34
38
  );
35
39
  },
36
40
  [ innerBlockImages ]
@@ -32,12 +32,16 @@ export default function useGetMedia( innerBlockImages = [] ) {
32
32
  }
33
33
 
34
34
  return (
35
- select( coreStore ).getMediaItems( {
36
- include: imageIds.join( ',' ),
37
- per_page:
38
- imageIds.length /* 'hard' limit necessary as unbounded queries aren't supported on native */,
39
- orderby: 'include',
40
- } ) ?? EMPTY_IMAGE_MEDIA
35
+ select( coreStore ).getEntityRecords(
36
+ 'postType',
37
+ 'attachment',
38
+ {
39
+ include: imageIds.join( ',' ),
40
+ per_page:
41
+ imageIds.length /* 'hard' limit necessary as unbounded queries aren't supported on native */,
42
+ orderby: 'include',
43
+ }
44
+ ) ?? EMPTY_IMAGE_MEDIA
41
45
  );
42
46
  },
43
47
  [ innerBlockImages ]
@@ -905,7 +905,7 @@ export class ImageEdit extends Component {
905
905
 
906
906
  export default compose( [
907
907
  withSelect( ( select, props ) => {
908
- const { getMedia } = select( coreStore );
908
+ const { getEntityRecord } = select( coreStore );
909
909
  const { getSettings, wasBlockJustInserted } =
910
910
  select( blockEditorStore );
911
911
  const { getEditedPostAttribute } = select( 'core/editor' );
@@ -926,7 +926,9 @@ export default compose( [
926
926
  isNotFileUrl &&
927
927
  url &&
928
928
  ! hasQueryArg( url, 'w' ) );
929
- const image = shouldGetMedia ? getMedia( id ) : null;
929
+ const image = shouldGetMedia
930
+ ? getEntityRecord( 'postType', 'attachment', id )
931
+ : null;
930
932
 
931
933
  return {
932
934
  image,
@@ -306,7 +306,12 @@ export default function Image( {
306
306
  const image = useSelect(
307
307
  ( select ) =>
308
308
  id && isSingleSelected
309
- ? select( coreStore ).getMedia( id, { context: 'view' } )
309
+ ? select( coreStore ).getEntityRecord(
310
+ 'postType',
311
+ 'attachment',
312
+ id,
313
+ { context: 'view' }
314
+ )
310
315
  : null,
311
316
  [ id, isSingleSelected ]
312
317
  );
@@ -100,7 +100,7 @@ function render_block_core_image( $attributes, $content, $block ) {
100
100
  *
101
101
  * @param array $block Block data.
102
102
  *
103
- * @return array Filtered block data.
103
+ * @return array|null Filtered block data.
104
104
  */
105
105
  function block_core_image_get_lightbox_settings( $block ) {
106
106
  // Gets the lightbox setting from the block attributes.
@@ -42,7 +42,9 @@ sendMediaUpload.mockImplementation( ( payload ) => {
42
42
  } );
43
43
 
44
44
  function mockGetMedia( media ) {
45
- jest.spyOn( select( coreStore ), 'getMedia' ).mockReturnValue( media );
45
+ jest.spyOn( select( coreStore ), 'getEntityRecord' ).mockReturnValue(
46
+ media
47
+ );
46
48
  }
47
49
 
48
50
  const FETCH_MEDIA = {
@@ -71,8 +73,12 @@ beforeEach( () => {
71
73
  // Mock media fetch requests
72
74
  setupApiFetch( [ FETCH_MEDIA ] );
73
75
 
74
- // Invalidate `getMedia` resolutions to allow requesting to the API the same media id
75
- dispatch( coreStore ).invalidateResolutionForStoreSelector( 'getMedia' );
76
+ // Invalidate `getEntityRecord` resolutions to allow requesting to the API the same media id
77
+ dispatch( coreStore ).invalidateResolution( 'getEntityRecord', [
78
+ 'postType',
79
+ 'attachment',
80
+ 1,
81
+ ] );
76
82
  } );
77
83
 
78
84
  afterEach( () => {
@@ -99,7 +105,7 @@ describe( 'Image Block', () => {
99
105
  <figcaption class="wp-element-caption">Mountain</figcaption></figure>
100
106
  <!-- /wp:image -->`;
101
107
  const screen = await initializeEditor( { initialHtml } );
102
- // Check that image is fetched via `getMedia`
108
+ // Check that image is fetched via `getEntityRecord`
103
109
  expect( apiFetch ).toHaveBeenCalledWith( FETCH_MEDIA.request );
104
110
 
105
111
  const [ imageBlock ] = screen.getAllByLabelText( /Image Block/ );
@@ -126,7 +132,7 @@ describe( 'Image Block', () => {
126
132
  <figcaption class="wp-element-caption">Mountain</figcaption></figure>
127
133
  <!-- /wp:image -->`;
128
134
  const screen = await initializeEditor( { initialHtml } );
129
- // Check that image is fetched via `getMedia`
135
+ // Check that image is fetched via `getEntityRecord`
130
136
  expect( apiFetch ).toHaveBeenCalledWith( FETCH_MEDIA.request );
131
137
 
132
138
  const [ imageBlock ] = screen.getAllByLabelText( /Image Block/ );
@@ -153,7 +159,7 @@ describe( 'Image Block', () => {
153
159
  <figcaption class="wp-element-caption">Mountain</figcaption></figure>
154
160
  <!-- /wp:image -->`;
155
161
  const screen = await initializeEditor( { initialHtml } );
156
- // Check that image is fetched via `getMedia`
162
+ // Check that image is fetched via `getEntityRecord`
157
163
  expect( apiFetch ).toHaveBeenCalledWith( FETCH_MEDIA.request );
158
164
 
159
165
  const [ imageBlock ] = screen.getAllByLabelText( /Image Block/ );
@@ -190,7 +196,7 @@ describe( 'Image Block', () => {
190
196
  <figcaption class="wp-element-caption">Mountain</figcaption></figure>
191
197
  <!-- /wp:image -->`;
192
198
  const screen = await initializeEditor( { initialHtml } );
193
- // Check that image is fetched via `getMedia`
199
+ // Check that image is fetched via `getEntityRecord`
194
200
  expect( apiFetch ).toHaveBeenCalledWith( FETCH_MEDIA.request );
195
201
 
196
202
  const [ imageBlock ] = screen.getAllByLabelText( /Image Block/ );
@@ -223,7 +229,7 @@ describe( 'Image Block', () => {
223
229
  <figcaption class="wp-element-caption">Mountain</figcaption></figure>
224
230
  <!-- /wp:image -->`;
225
231
  const screen = await initializeEditor( { initialHtml } );
226
- // Check that image is not fetched via `getMedia` due to the presence of query parameters in the URL.
232
+ // Check that image is not fetched via `getEntityRecord` due to the presence of query parameters in the URL.
227
233
  expect( apiFetch ).not.toHaveBeenCalledWith( FETCH_MEDIA.request );
228
234
 
229
235
  const [ imageBlock ] = screen.getAllByLabelText( /Image Block/ );
@@ -248,7 +254,7 @@ describe( 'Image Block', () => {
248
254
  <figcaption class="wp-element-caption">Mountain</figcaption></figure>
249
255
  <!-- /wp:image -->`;
250
256
  const screen = await initializeEditor( { initialHtml } );
251
- // Check that image is fetched via `getMedia`
257
+ // Check that image is fetched via `getEntityRecord`
252
258
  expect( apiFetch ).toHaveBeenCalledWith( FETCH_MEDIA.request );
253
259
 
254
260
  const [ imageBlock ] = screen.getAllByLabelText( /Image Block/ );
@@ -279,7 +285,7 @@ describe( 'Image Block', () => {
279
285
  </figure>
280
286
  <!-- /wp:image -->`;
281
287
  const screen = await initializeEditor( { initialHtml } );
282
- // Check that image is fetched via `getMedia`
288
+ // Check that image is fetched via `getEntityRecord`
283
289
  expect( apiFetch ).toHaveBeenCalledWith( FETCH_MEDIA.request );
284
290
 
285
291
  const [ imageBlock ] = screen.getAllByLabelText( /Image Block/ );
package/src/index.js CHANGED
@@ -20,6 +20,10 @@ import {
20
20
  // production build to make the final bundle smaller.
21
21
  //
22
22
  // See https://github.com/WordPress/gutenberg/pull/40655 for more context.
23
+ import * as accordions from './accordions';
24
+ import * as accordionItem from './accordion-item';
25
+ import * as accordionHeader from './accordion-header';
26
+ import * as accordionPanel from './accordion-panel';
23
27
  import * as archives from './archives';
24
28
  import * as avatar from './avatar';
25
29
  import * as audio from './audio';
@@ -234,6 +238,14 @@ const getAllBlocks = () => {
234
238
  queryTitle,
235
239
  postAuthorBiography,
236
240
  ];
241
+
242
+ if ( window?.__experimentalEnableBlockExperiments ) {
243
+ blocks.push( accordions );
244
+ blocks.push( accordionItem );
245
+ blocks.push( accordionHeader );
246
+ blocks.push( accordionPanel );
247
+ }
248
+
237
249
  if ( window?.__experimentalEnableFormBlocks ) {
238
250
  blocks.push( form );
239
251
  blocks.push( formInput );
@@ -18,6 +18,7 @@ import {
18
18
  } from '@wordpress/icons';
19
19
  import { useMergeRefs } from '@wordpress/compose';
20
20
  import { useSelect } from '@wordpress/data';
21
+ import { displayShortcut } from '@wordpress/keycodes';
21
22
 
22
23
  /**
23
24
  * Internal dependencies
@@ -53,6 +54,7 @@ export function IndentUI( { clientId } ) {
53
54
  <ToolbarButton
54
55
  icon={ isRTL() ? formatOutdentRTL : formatOutdent }
55
56
  title={ __( 'Outdent' ) }
57
+ shortcut={ displayShortcut.shift( 'Tab' ) }
56
58
  description={ __( 'Outdent list item' ) }
57
59
  disabled={ ! canOutdent }
58
60
  onClick={ () => outdentListItem() }
@@ -60,6 +62,7 @@ export function IndentUI( { clientId } ) {
60
62
  <ToolbarButton
61
63
  icon={ isRTL() ? formatIndentRTL : formatIndent }
62
64
  title={ __( 'Indent' ) }
65
+ shortcut="Tab"
63
66
  description={ __( 'Indent list item' ) }
64
67
  disabled={ ! canIndent }
65
68
  onClick={ () => indentListItem() }
@@ -23,14 +23,16 @@ function render_block_core_loginout( $attributes ) {
23
23
  */
24
24
  $current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
25
25
 
26
- $classes = is_user_logged_in() ? 'logged-in' : 'logged-out';
26
+ $user_logged_in = is_user_logged_in();
27
+
28
+ $classes = $user_logged_in ? 'logged-in' : 'logged-out';
27
29
  $contents = wp_loginout(
28
30
  isset( $attributes['redirectToCurrent'] ) && $attributes['redirectToCurrent'] ? $current_url : '',
29
31
  false
30
32
  );
31
33
 
32
34
  // If logged-out and displayLoginAsForm is true, show the login form.
33
- if ( ! is_user_logged_in() && ! empty( $attributes['displayLoginAsForm'] ) ) {
35
+ if ( ! $user_logged_in && ! empty( $attributes['displayLoginAsForm'] ) ) {
34
36
  // Add a class.
35
37
  $classes .= ' has-login-form';
36
38
 
@@ -199,9 +199,14 @@ function MediaTextEdit( {
199
199
  return {
200
200
  featuredImageMedia:
201
201
  featuredImage && useFeaturedImage
202
- ? select( coreStore ).getMedia( featuredImage, {
203
- context: 'view',
204
- } )
202
+ ? select( coreStore ).getEntityRecord(
203
+ 'postType',
204
+ 'attachment',
205
+ featuredImage,
206
+ {
207
+ context: 'view',
208
+ }
209
+ )
205
210
  : undefined,
206
211
  };
207
212
  },
@@ -213,9 +218,14 @@ function MediaTextEdit( {
213
218
  return {
214
219
  image:
215
220
  mediaId && isSelected
216
- ? select( coreStore ).getMedia( mediaId, {
217
- context: 'view',
218
- } )
221
+ ? select( coreStore ).getEntityRecord(
222
+ 'postType',
223
+ 'attachment',
224
+ mediaId,
225
+ {
226
+ context: 'view',
227
+ }
228
+ )
219
229
  : null,
220
230
  };
221
231
  },
@@ -200,6 +200,7 @@ function MediaContainer( props, ref ) {
200
200
  }
201
201
  mediaId={ mediaId }
202
202
  toggleUseFeaturedImage={ toggleUseFeaturedImage }
203
+ useFeaturedImage={ useFeaturedImage }
203
204
  />
204
205
  { ( mediaTypeRenderers[ mediaType ] || noop )() }
205
206
  { isTemporaryMedia && <Spinner /> }
@@ -45,6 +45,7 @@ const transforms = {
45
45
  style,
46
46
  textColor,
47
47
  url,
48
+ useFeaturedImage,
48
49
  },
49
50
  innerBlocks
50
51
  ) => {
@@ -90,6 +91,7 @@ const transforms = {
90
91
  mediaType: backgroundType,
91
92
  mediaUrl: url,
92
93
  textColor,
94
+ useFeaturedImage,
93
95
  ...additionalAttributes,
94
96
  },
95
97
  innerBlocks
@@ -143,6 +145,7 @@ const transforms = {
143
145
  mediaUrl,
144
146
  style,
145
147
  textColor,
148
+ useFeaturedImage,
146
149
  },
147
150
  innerBlocks
148
151
  ) => {
@@ -169,13 +172,14 @@ const transforms = {
169
172
  alt: mediaAlt,
170
173
  anchor,
171
174
  backgroundType: mediaType,
172
- dimRatio: !! mediaUrl ? 50 : 100,
175
+ dimRatio: !! mediaUrl || useFeaturedImage ? 50 : 100,
173
176
  focalPoint,
174
177
  gradient,
175
178
  id: mediaId,
176
179
  overlayColor: backgroundColor,
177
180
  textColor,
178
181
  url: mediaUrl,
182
+ useFeaturedImage,
179
183
  ...additionalAttributes,
180
184
  };
181
185
 
package/src/more/edit.js CHANGED
@@ -7,9 +7,13 @@ import {
7
7
  __experimentalToolsPanelItem as ToolsPanelItem,
8
8
  ToggleControl,
9
9
  } from '@wordpress/components';
10
- import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
11
- import { ENTER } from '@wordpress/keycodes';
10
+ import {
11
+ InspectorControls,
12
+ PlainText,
13
+ useBlockProps,
14
+ } from '@wordpress/block-editor';
12
15
  import { getDefaultBlockName, createBlock } from '@wordpress/blocks';
16
+
13
17
  /**
14
18
  * Internal dependencies
15
19
  */
@@ -22,29 +26,6 @@ export default function MoreEdit( {
22
26
  insertBlocksAfter,
23
27
  setAttributes,
24
28
  } ) {
25
- const onChangeInput = ( event ) => {
26
- setAttributes( {
27
- customText: event.target.value,
28
- } );
29
- };
30
-
31
- const onKeyDown = ( { keyCode } ) => {
32
- if ( keyCode === ENTER ) {
33
- insertBlocksAfter( [ createBlock( getDefaultBlockName() ) ] );
34
- }
35
- };
36
-
37
- const getHideExcerptHelp = ( checked ) =>
38
- checked
39
- ? __( 'The excerpt is hidden.' )
40
- : __( 'The excerpt is visible.' );
41
-
42
- const toggleHideExcerpt = () => setAttributes( { noTeaser: ! noTeaser } );
43
-
44
- const style = {
45
- width: `${ ( customText ? customText : DEFAULT_TEXT ).length + 1.2 }em`,
46
- };
47
-
48
29
  const dropdownMenuProps = useToolsPanelDropdownMenuProps();
49
30
 
50
31
  return (
@@ -73,21 +54,34 @@ export default function MoreEdit( {
73
54
  'Hide the excerpt on the full content page'
74
55
  ) }
75
56
  checked={ !! noTeaser }
76
- onChange={ toggleHideExcerpt }
77
- help={ getHideExcerptHelp }
57
+ onChange={ () =>
58
+ setAttributes( { noTeaser: ! noTeaser } )
59
+ }
60
+ help={ ( checked ) =>
61
+ checked
62
+ ? __( 'The excerpt is hidden.' )
63
+ : __( 'The excerpt is visible.' )
64
+ }
78
65
  />
79
66
  </ToolsPanelItem>
80
67
  </ToolsPanel>
81
68
  </InspectorControls>
82
69
  <div { ...useBlockProps() }>
83
- <input
84
- aria-label={ __( '“Read more” link text' ) }
85
- type="text"
70
+ <PlainText
71
+ __experimentalVersion={ 2 }
72
+ tagName="span"
73
+ aria-label={ __( '"Read more" text' ) }
86
74
  value={ customText }
87
75
  placeholder={ DEFAULT_TEXT }
88
- onChange={ onChangeInput }
89
- onKeyDown={ onKeyDown }
90
- style={ style }
76
+ onChange={ ( value ) =>
77
+ setAttributes( { customText: value } )
78
+ }
79
+ disableLineBreaks
80
+ __unstableOnSplitAtEnd={ () =>
81
+ insertBlocksAfter(
82
+ createBlock( getDefaultBlockName() )
83
+ )
84
+ }
91
85
  />
92
86
  </div>
93
87
  </>
@@ -11,27 +11,18 @@
11
11
  white-space: nowrap;
12
12
 
13
13
  // Label
14
- input[type="text"] {
14
+ .rich-text {
15
15
  position: relative;
16
16
  font-size: $default-font-size;
17
17
  text-transform: uppercase;
18
18
  font-weight: 600;
19
19
  font-family: $default-font;
20
20
  color: $gray-700;
21
- border: none;
22
- box-shadow: none;
21
+ display: inline-flex;
23
22
  white-space: nowrap;
24
23
  text-align: center;
25
- margin: 0;
26
- border-radius: 4px;
27
24
  background: $white;
28
- padding: 6px 8px;
29
- height: $button-size-small;
30
- max-width: 100%;
31
-
32
- &:focus {
33
- box-shadow: none;
34
- }
25
+ padding: 10px 36px;
35
26
  }
36
27
 
37
28
  // Dashed line
@@ -12,6 +12,9 @@
12
12
  }
13
13
  },
14
14
  "usesContext": [ "postId" ],
15
+ "example": {
16
+ "viewportWidth": 350
17
+ },
15
18
  "supports": {
16
19
  "html": false,
17
20
  "color": {
@@ -12,6 +12,9 @@
12
12
  "type": "string"
13
13
  }
14
14
  },
15
+ "example": {
16
+ "viewportWidth": 350
17
+ },
15
18
  "supports": {
16
19
  "html": false,
17
20
  "color": {
@@ -9,6 +9,7 @@
9
9
  * Renders the `core/post-date` block on the server.
10
10
  *
11
11
  * @since 5.8.0
12
+ * @since 6.9.0 Added `datetime` attribute and Block Bindings support.
12
13
  *
13
14
  * @param array $attributes Block attributes.
14
15
  * @param string $content Block default content.
@@ -18,44 +19,39 @@
18
19
  function render_block_core_post_date( $attributes, $content, $block ) {
19
20
  $classes = array();
20
21
 
21
- if ( ! isset( $attributes['datetime'] ) ) {
22
+ if (
23
+ isset( $attributes['metadata']['bindings']['datetime']['source'] ) &&
24
+ isset( $attributes['metadata']['bindings']['datetime']['args'] )
25
+ ) {
22
26
  /*
23
- * This can mean two things:
24
- *
25
- * 1. We're dealing with the legacy version of the block that didn't have the `datetime` attribute.
26
- * 2. The `datetime` attribute is bound to a Block Bindings source, but we're on a version of WordPress
27
- * that doesn't support binding that attribute to a Block Bindings source.
28
- *
29
- * In both cases, we set the `datetime` attribute to its correct value by applying Block Bindings manually.
27
+ * We might be running on a version of WordPress that doesn't support binding the block's `datetime` attribute
28
+ * to a Block Bindings source. In this case, we need to manually set the `datetime` attribute to its correct value.
29
+ * This branch can be removed once the minimum required WordPress version is 6.9 or newer.
30
30
  */
31
- if (
32
- isset( $attributes['metadata']['bindings']['datetime']['source'] ) &&
33
- isset( $attributes['metadata']['bindings']['datetime']['args'] )
34
- ) {
35
- // We're using a version of WordPress that doesn't support binding the block's `datetime` attribute to a Block Bindings source.
36
- // This branch can be removed once the minimum required WordPress version supports the `core/post-data` source.
37
- $source = get_block_bindings_source( $attributes['metadata']['bindings']['datetime']['source'] );
38
- $source_args = $attributes['metadata']['bindings']['datetime']['args'];
31
+ $source = get_block_bindings_source( $attributes['metadata']['bindings']['datetime']['source'] );
32
+ $source_args = $attributes['metadata']['bindings']['datetime']['args'];
33
+
34
+ $attributes['datetime'] = $source->get_value( $source_args, $block, 'datetime' );
35
+ } elseif ( ! isset( $attributes['datetime'] ) ) {
36
+ /*
37
+ * This is the legacy version of the block that didn't have the `datetime` attribute.
38
+ * This branch needs to be kept for backward compatibility.
39
+ */
40
+ $source = get_block_bindings_source( 'core/post-data' );
41
+ if ( isset( $attributes['displayType'] ) && 'modified' === $attributes['displayType'] ) {
42
+ $source_args = array(
43
+ 'key' => 'modified',
44
+ );
39
45
  } else {
40
- // This is the legacy version of the block that didn't have the `datetime` attribute.
41
- // This branch needs to be kept for backward compatibility.
42
- $source = get_block_bindings_source( 'core/post-data' );
43
- if ( isset( $attributes['displayType'] ) && 'modified' === $attributes['displayType'] ) {
44
- $source_args = array(
45
- 'key' => 'modified',
46
- );
47
- } else {
48
- $source_args = array(
49
- 'key' => 'date',
50
- );
51
- }
46
+ $source_args = array(
47
+ 'key' => 'date',
48
+ );
52
49
  }
53
-
54
50
  $attributes['datetime'] = $source->get_value( $source_args, $block, 'datetime' );
51
+ }
55
52
 
56
- if ( isset( $source_args['key'] ) && 'modified' === $source_args['key'] ) {
57
- $classes[] = 'wp-block-post-date__modified-date';
58
- }
53
+ if ( isset( $source_args['key'] ) && 'modified' === $source_args['key'] ) {
54
+ $classes[] = 'wp-block-post-date__modified-date';
59
55
  }
60
56
 
61
57
  if ( empty( $attributes['datetime'] ) ) {