@wordpress/block-library 7.3.10 → 7.3.13

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 (105) hide show
  1. package/build/avatar/hooks.js +2 -2
  2. package/build/avatar/hooks.js.map +1 -1
  3. package/build/columns/index.js +3 -1
  4. package/build/columns/index.js.map +1 -1
  5. package/build/comment-author-name/edit.js +3 -3
  6. package/build/comment-author-name/edit.js.map +1 -1
  7. package/build/comment-author-name/index.js +0 -4
  8. package/build/comment-author-name/index.js.map +1 -1
  9. package/build/comment-date/edit.js +4 -4
  10. package/build/comment-date/edit.js.map +1 -1
  11. package/build/comment-date/index.js +0 -4
  12. package/build/comment-date/index.js.map +1 -1
  13. package/build/comment-edit-link/index.js +0 -4
  14. package/build/comment-edit-link/index.js.map +1 -1
  15. package/build/comment-reply-link/index.js +0 -4
  16. package/build/comment-reply-link/index.js.map +1 -1
  17. package/build/comments-query-loop/edit.js +10 -2
  18. package/build/comments-query-loop/edit.js.map +1 -1
  19. package/build/gallery/gap-styles.js +14 -4
  20. package/build/gallery/gap-styles.js.map +1 -1
  21. package/build/image/edit.js +5 -56
  22. package/build/image/edit.js.map +1 -1
  23. package/build/image/image.js +4 -15
  24. package/build/image/image.js.map +1 -1
  25. package/build/latest-posts/edit.js +30 -4
  26. package/build/latest-posts/edit.js.map +1 -1
  27. package/build/media-text/edit.js +0 -1
  28. package/build/media-text/edit.js.map +1 -1
  29. package/build/navigation/edit/index.js +81 -80
  30. package/build/navigation/edit/index.js.map +1 -1
  31. package/build/post-comments/edit.js +12 -33
  32. package/build/post-comments/edit.js.map +1 -1
  33. package/build/post-comments-form/edit.js +46 -25
  34. package/build/post-comments-form/edit.js.map +1 -1
  35. package/build/post-comments-form/form.js +48 -0
  36. package/build/post-comments-form/form.js.map +1 -0
  37. package/build-module/avatar/hooks.js +2 -2
  38. package/build-module/avatar/hooks.js.map +1 -1
  39. package/build-module/columns/index.js +3 -1
  40. package/build-module/columns/index.js.map +1 -1
  41. package/build-module/comment-author-name/edit.js +3 -3
  42. package/build-module/comment-author-name/edit.js.map +1 -1
  43. package/build-module/comment-author-name/index.js +0 -4
  44. package/build-module/comment-author-name/index.js.map +1 -1
  45. package/build-module/comment-date/edit.js +4 -4
  46. package/build-module/comment-date/edit.js.map +1 -1
  47. package/build-module/comment-date/index.js +0 -4
  48. package/build-module/comment-date/index.js.map +1 -1
  49. package/build-module/comment-edit-link/index.js +0 -4
  50. package/build-module/comment-edit-link/index.js.map +1 -1
  51. package/build-module/comment-reply-link/index.js +0 -4
  52. package/build-module/comment-reply-link/index.js.map +1 -1
  53. package/build-module/comments-query-loop/edit.js +10 -2
  54. package/build-module/comments-query-loop/edit.js.map +1 -1
  55. package/build-module/gallery/gap-styles.js +14 -4
  56. package/build-module/gallery/gap-styles.js.map +1 -1
  57. package/build-module/image/edit.js +4 -52
  58. package/build-module/image/edit.js.map +1 -1
  59. package/build-module/image/image.js +5 -16
  60. package/build-module/image/image.js.map +1 -1
  61. package/build-module/latest-posts/edit.js +29 -5
  62. package/build-module/latest-posts/edit.js.map +1 -1
  63. package/build-module/media-text/edit.js +0 -1
  64. package/build-module/media-text/edit.js.map +1 -1
  65. package/build-module/navigation/edit/index.js +81 -80
  66. package/build-module/navigation/edit/index.js.map +1 -1
  67. package/build-module/post-comments/edit.js +12 -34
  68. package/build-module/post-comments/edit.js.map +1 -1
  69. package/build-module/post-comments-form/edit.js +47 -28
  70. package/build-module/post-comments-form/edit.js.map +1 -1
  71. package/build-module/post-comments-form/form.js +39 -0
  72. package/build-module/post-comments-form/form.js.map +1 -0
  73. package/build-style/editor-rtl.css +3 -0
  74. package/build-style/editor.css +3 -0
  75. package/build-style/navigation/style-rtl.css +3 -0
  76. package/build-style/navigation/style.css +3 -0
  77. package/build-style/post-comments-form/editor-rtl.css +3 -0
  78. package/build-style/post-comments-form/editor.css +3 -0
  79. package/build-style/style-rtl.css +3 -0
  80. package/build-style/style.css +3 -0
  81. package/package.json +7 -7
  82. package/src/avatar/hooks.js +9 -6
  83. package/src/columns/block.json +3 -1
  84. package/src/comment-author-name/block.json +0 -4
  85. package/src/comment-author-name/edit.js +3 -12
  86. package/src/comment-date/block.json +0 -4
  87. package/src/comment-date/edit.js +10 -14
  88. package/src/comment-date/index.php +0 -3
  89. package/src/comment-edit-link/block.json +0 -4
  90. package/src/comment-reply-link/block.json +0 -4
  91. package/src/comments-query-loop/edit.js +24 -4
  92. package/src/cover/index.php +9 -6
  93. package/src/gallery/gap-styles.js +21 -6
  94. package/src/gallery/index.php +24 -4
  95. package/src/image/edit.js +0 -44
  96. package/src/image/image.js +3 -14
  97. package/src/latest-posts/edit.js +27 -2
  98. package/src/media-text/edit.js +0 -1
  99. package/src/navigation/edit/index.js +140 -143
  100. package/src/navigation/style.scss +3 -0
  101. package/src/post-comments/edit.js +13 -42
  102. package/src/post-comments-form/edit.js +65 -59
  103. package/src/post-comments-form/editor.scss +4 -0
  104. package/src/post-comments-form/form.js +43 -0
  105. package/src/post-template/index.php +15 -3
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["@wordpress/block-library/src/post-comments-form/form.js"],"names":["__","__experimentalUseDisabled","useDisabled","useInstanceId","CommentsForm","disabledFormRef","instanceId"],"mappings":";;AAAA;AACA;AACA;AACA,SAASA,EAAT,QAAmB,iBAAnB;AACA,SACCC,yBAAyB,IAAIC,WAD9B,EAECC,aAFD,QAGO,oBAHP;;AAKA,MAAMC,YAAY,GAAG,MAAM;AAC1B,QAAMC,eAAe,GAAGH,WAAW,EAAnC;AACA,QAAMI,UAAU,GAAGH,aAAa,CAAEC,YAAF,CAAhC;AAEA,SACC;AAAK,IAAA,SAAS,EAAC;AAAf,KACC;AAAI,IAAA,SAAS,EAAC;AAAd,KAAsCJ,EAAE,CAAE,eAAF,CAAxC,CADD,EAEC;AAAM,IAAA,UAAU,MAAhB;AAAiB,IAAA,SAAS,EAAC,cAA3B;AAA0C,IAAA,GAAG,EAAGK;AAAhD,KACC,yBACC;AAAO,IAAA,OAAO,EAAI,WAAWC,UAAY;AAAzC,KACGN,EAAE,CAAE,SAAF,CADL,CADD,EAIC;AACC,IAAA,EAAE,EAAI,WAAWM,UAAY,EAD9B;AAEC,IAAA,IAAI,EAAC,SAFN;AAGC,IAAA,IAAI,EAAC,IAHN;AAIC,IAAA,IAAI,EAAC;AAJN,IAJD,CADD,EAYC;AAAG,IAAA,SAAS,EAAC;AAAb,KACC;AACC,IAAA,IAAI,EAAC,QADN;AAEC,IAAA,IAAI,EAAC,QAFN;AAGC,IAAA,SAAS,EAAC,8BAHX;AAIC,IAAA,KAAK,EAAGN,EAAE,CAAE,cAAF,CAJX;AAKC,IAAA,KAAK,EAAGA,EAAE,CAAE,cAAF;AALX,IADD,CAZD,CAFD,CADD;AA2BA,CA/BD;;AAiCA,eAAeI,YAAf","sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\nimport {\n\t__experimentalUseDisabled as useDisabled,\n\tuseInstanceId,\n} from '@wordpress/compose';\n\nconst CommentsForm = () => {\n\tconst disabledFormRef = useDisabled();\n\tconst instanceId = useInstanceId( CommentsForm );\n\n\treturn (\n\t\t<div className=\"comment-respond\">\n\t\t\t<h3 className=\"comment-reply-title\">{ __( 'Leave a Reply' ) }</h3>\n\t\t\t<form noValidate className=\"comment-form\" ref={ disabledFormRef }>\n\t\t\t\t<p>\n\t\t\t\t\t<label htmlFor={ `comment-${ instanceId }` }>\n\t\t\t\t\t\t{ __( 'Comment' ) }\n\t\t\t\t\t</label>\n\t\t\t\t\t<textarea\n\t\t\t\t\t\tid={ `comment-${ instanceId }` }\n\t\t\t\t\t\tname=\"comment\"\n\t\t\t\t\t\tcols=\"45\"\n\t\t\t\t\t\trows=\"8\"\n\t\t\t\t\t/>\n\t\t\t\t</p>\n\t\t\t\t<p className=\"form-submit wp-block-button\">\n\t\t\t\t\t<input\n\t\t\t\t\t\tname=\"submit\"\n\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\tclassName=\"submit wp-block-button__link\"\n\t\t\t\t\t\tlabel={ __( 'Post Comment' ) }\n\t\t\t\t\t\tvalue={ __( 'Post Comment' ) }\n\t\t\t\t\t/>\n\t\t\t\t</p>\n\t\t\t</form>\n\t\t</div>\n\t);\n};\n\nexport default CommentsForm;\n"]}
@@ -2701,6 +2701,9 @@ div[data-type="core/post-featured-image"] img {
2701
2701
  .wp-block-post-comments-form * {
2702
2702
  pointer-events: none;
2703
2703
  }
2704
+ .wp-block-post-comments-form *.block-editor-warning * {
2705
+ pointer-events: auto;
2706
+ }
2704
2707
 
2705
2708
  :root .editor-styles-wrapper {
2706
2709
  /*
@@ -2712,6 +2712,9 @@ div[data-type="core/post-featured-image"] img {
2712
2712
  .wp-block-post-comments-form * {
2713
2713
  pointer-events: none;
2714
2714
  }
2715
+ .wp-block-post-comments-form *.block-editor-warning * {
2716
+ pointer-events: auto;
2717
+ }
2715
2718
 
2716
2719
  :root .editor-styles-wrapper {
2717
2720
  /*
@@ -271,6 +271,9 @@ button.wp-block-navigation-item__content {
271
271
  font-size: inherit;
272
272
  font-family: inherit;
273
273
  line-height: inherit;
274
+ font-style: inherit;
275
+ font-weight: inherit;
276
+ text-transform: inherit;
274
277
  text-align: right;
275
278
  }
276
279
 
@@ -271,6 +271,9 @@ button.wp-block-navigation-item__content {
271
271
  font-size: inherit;
272
272
  font-family: inherit;
273
273
  line-height: inherit;
274
+ font-style: inherit;
275
+ font-weight: inherit;
276
+ text-transform: inherit;
274
277
  text-align: left;
275
278
  }
276
279
 
@@ -76,4 +76,7 @@
76
76
  */
77
77
  .wp-block-post-comments-form * {
78
78
  pointer-events: none;
79
+ }
80
+ .wp-block-post-comments-form *.block-editor-warning * {
81
+ pointer-events: auto;
79
82
  }
@@ -76,4 +76,7 @@
76
76
  */
77
77
  .wp-block-post-comments-form * {
78
78
  pointer-events: none;
79
+ }
80
+ .wp-block-post-comments-form *.block-editor-warning * {
81
+ pointer-events: auto;
79
82
  }
@@ -1753,6 +1753,9 @@ button.wp-block-navigation-item__content {
1753
1753
  font-size: inherit;
1754
1754
  font-family: inherit;
1755
1755
  line-height: inherit;
1756
+ font-style: inherit;
1757
+ font-weight: inherit;
1758
+ text-transform: inherit;
1756
1759
  text-align: right;
1757
1760
  }
1758
1761
 
@@ -1779,6 +1779,9 @@ button.wp-block-navigation-item__content {
1779
1779
  font-size: inherit;
1780
1780
  font-family: inherit;
1781
1781
  line-height: inherit;
1782
+ font-style: inherit;
1783
+ font-weight: inherit;
1784
+ text-transform: inherit;
1782
1785
  text-align: left;
1783
1786
  }
1784
1787
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wordpress/block-library",
3
- "version": "7.3.10",
3
+ "version": "7.3.13",
4
4
  "description": "Block library for the WordPress editor.",
5
5
  "author": "The WordPress Contributors",
6
6
  "license": "GPL-2.0-or-later",
@@ -37,9 +37,9 @@
37
37
  "@wordpress/api-fetch": "^6.3.1",
38
38
  "@wordpress/autop": "^3.6.1",
39
39
  "@wordpress/blob": "^3.6.1",
40
- "@wordpress/block-editor": "^8.5.7",
40
+ "@wordpress/block-editor": "^8.5.9",
41
41
  "@wordpress/blocks": "^11.5.3",
42
- "@wordpress/components": "^19.8.4",
42
+ "@wordpress/components": "^19.8.5",
43
43
  "@wordpress/compose": "^5.4.1",
44
44
  "@wordpress/core-data": "^4.4.5",
45
45
  "@wordpress/data": "^6.6.1",
@@ -50,13 +50,13 @@
50
50
  "@wordpress/hooks": "^3.6.1",
51
51
  "@wordpress/html-entities": "^3.6.1",
52
52
  "@wordpress/i18n": "^4.6.1",
53
- "@wordpress/icons": "^8.2.2",
53
+ "@wordpress/icons": "^8.2.3",
54
54
  "@wordpress/keycodes": "^3.6.1",
55
55
  "@wordpress/notices": "^3.6.1",
56
56
  "@wordpress/primitives": "^3.4.1",
57
- "@wordpress/reusable-blocks": "^3.4.7",
57
+ "@wordpress/reusable-blocks": "^3.4.9",
58
58
  "@wordpress/rich-text": "^5.4.2",
59
- "@wordpress/server-side-render": "^3.4.5",
59
+ "@wordpress/server-side-render": "^3.4.6",
60
60
  "@wordpress/url": "^3.7.1",
61
61
  "@wordpress/viewport": "^4.4.1",
62
62
  "classnames": "^2.3.1",
@@ -74,5 +74,5 @@
74
74
  "publishConfig": {
75
75
  "access": "public"
76
76
  },
77
- "gitHead": "d9042594d77ee2d9e28326266de078a505fdf645"
77
+ "gitHead": "b2f4eb9e7da83e45e2f726cfdef4d4224c423da8"
78
78
  }
@@ -76,12 +76,15 @@ export function useUserAvatar( { userId, postId, postType } ) {
76
76
  },
77
77
  [ postType, postId, userId ]
78
78
  );
79
- const avatarUrls = authorDetails
80
- ? Object.values( authorDetails.avatar_urls )
81
- : null;
82
- const sizes = authorDetails
83
- ? Object.keys( authorDetails.avatar_urls )
84
- : null;
79
+
80
+ const avatarUrls =
81
+ authorDetails && authorDetails?.avatar_urls
82
+ ? Object.values( authorDetails.avatar_urls )
83
+ : null;
84
+ const sizes =
85
+ authorDetails && authorDetails?.avatar_urls
86
+ ? Object.keys( authorDetails.avatar_urls )
87
+ : null;
85
88
  const { minSize, maxSize } = getAvatarSizes( sizes );
86
89
  const defaultAvatar = useDefaultAvatar();
87
90
  return {
@@ -28,7 +28,9 @@
28
28
  }
29
29
  },
30
30
  "spacing": {
31
- "blockGap": true,
31
+ "blockGap": {
32
+ "__experimentalDefault": "2em"
33
+ },
32
34
  "margin": [ "top", "bottom" ],
33
35
  "padding": true,
34
36
  "__experimentalDefaultControls": {
@@ -18,10 +18,6 @@
18
18
  },
19
19
  "textAlign": {
20
20
  "type": "string"
21
- },
22
- "fontSize": {
23
- "type": "string",
24
- "default": "small"
25
21
  }
26
22
  },
27
23
  "usesContext": [ "commentId" ],
@@ -41,7 +41,7 @@ export default function Edit( {
41
41
  [ `has-text-align-${ textAlign }` ]: textAlign,
42
42
  } ),
43
43
  } );
44
- const displayName = useSelect(
44
+ let displayName = useSelect(
45
45
  ( select ) => {
46
46
  const { getEntityRecord } = select( coreStore );
47
47
 
@@ -92,15 +92,7 @@ export default function Edit( {
92
92
  );
93
93
 
94
94
  if ( ! commentId || ! displayName ) {
95
- return (
96
- <>
97
- { inspectorControls }
98
- { blockControls }
99
- <div { ...blockProps }>
100
- <p>{ _x( 'Comment Author', 'block title' ) }</p>
101
- </div>
102
- </>
103
- );
95
+ displayName = _x( 'Comment Author', 'block title' );
104
96
  }
105
97
 
106
98
  const displayAuthor = isLink ? (
@@ -111,9 +103,8 @@ export default function Edit( {
111
103
  { displayName }
112
104
  </a>
113
105
  ) : (
114
- <p>{ displayName }</p>
106
+ displayName
115
107
  );
116
-
117
108
  return (
118
109
  <>
119
110
  { inspectorControls }
@@ -14,10 +14,6 @@
14
14
  "isLink": {
15
15
  "type": "boolean",
16
16
  "default": true
17
- },
18
- "fontSize": {
19
- "type": "string",
20
- "default": "small"
21
17
  }
22
18
  },
23
19
  "usesContext": [ "commentId" ],
@@ -33,7 +33,7 @@ export default function Edit( {
33
33
  setAttributes,
34
34
  } ) {
35
35
  const blockProps = useBlockProps();
36
- const [ date ] = useEntityProp( 'root', 'comment', 'date', commentId );
36
+ let [ date ] = useEntityProp( 'root', 'comment', 'date', commentId );
37
37
  const [ siteFormat = getDateSettings().formats.date ] = useEntityProp(
38
38
  'root',
39
39
  'site',
@@ -60,21 +60,17 @@ export default function Edit( {
60
60
  );
61
61
 
62
62
  if ( ! commentId || ! date ) {
63
- return (
64
- <>
65
- { inspectorControls }
66
- <div { ...blockProps }>
67
- <p>{ _x( 'Comment Date', 'block title' ) }</p>
68
- </div>
69
- </>
70
- );
63
+ date = _x( 'Comment Date', 'block title' );
71
64
  }
72
65
 
73
- let commentDate = (
74
- <time dateTime={ dateI18n( 'c', date ) }>
75
- { dateI18n( format || siteFormat, date ) }
76
- </time>
77
- );
66
+ let commentDate =
67
+ date instanceof Date ? (
68
+ <time dateTime={ dateI18n( 'c', date ) }>
69
+ { dateI18n( format || siteFormat, date ) }
70
+ </time>
71
+ ) : (
72
+ <time>{ date }</time>
73
+ );
78
74
 
79
75
  if ( isLink ) {
80
76
  commentDate = (
@@ -24,9 +24,6 @@ function render_block_core_comment_date( $attributes, $content, $block ) {
24
24
  }
25
25
 
26
26
  $classes = '';
27
- if ( isset( $attributes['fontSize'] ) ) {
28
- $classes .= 'has-' . esc_attr( $attributes['fontSize'] ) . '-font-size';
29
- }
30
27
 
31
28
  $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) );
32
29
  $formatted_date = get_comment_date(
@@ -15,10 +15,6 @@
15
15
  },
16
16
  "textAlign": {
17
17
  "type": "string"
18
- },
19
- "fontSize": {
20
- "type": "string",
21
- "default": "small"
22
18
  }
23
19
  },
24
20
  "supports": {
@@ -11,10 +11,6 @@
11
11
  "attributes": {
12
12
  "textAlign": {
13
13
  "type": "string"
14
- },
15
- "fontSize": {
16
- "type": "string",
17
- "default": "small"
18
14
  }
19
15
  },
20
16
  "supports": {
@@ -37,7 +37,12 @@ const TEMPLATE = [
37
37
  'core/column',
38
38
  {},
39
39
  [
40
- [ 'core/comment-author-name' ],
40
+ [
41
+ 'core/comment-author-name',
42
+ {
43
+ fontSize: 'small',
44
+ },
45
+ ],
41
46
  [
42
47
  'core/group',
43
48
  {
@@ -52,12 +57,27 @@ const TEMPLATE = [
52
57
  },
53
58
  },
54
59
  [
55
- [ 'core/comment-date' ],
56
- [ 'core/comment-edit-link' ],
60
+ [
61
+ 'core/comment-date',
62
+ {
63
+ fontSize: 'small',
64
+ },
65
+ ],
66
+ [
67
+ 'core/comment-edit-link',
68
+ {
69
+ fontSize: 'small',
70
+ },
71
+ ],
57
72
  ],
58
73
  ],
59
74
  [ 'core/comment-content' ],
60
- [ 'core/comment-reply-link' ],
75
+ [
76
+ 'core/comment-reply-link',
77
+ {
78
+ fontSize: 'small',
79
+ },
80
+ ],
61
81
  ],
62
82
  ],
63
83
  ],
@@ -32,12 +32,15 @@ function render_block_core_cover( $attributes, $content ) {
32
32
 
33
33
  $image = get_the_post_thumbnail( null, 'post-thumbnail', $attr );
34
34
 
35
- $content = str_replace(
36
- '</span><div',
37
- '</span>' . $image . '<div',
38
- $content
39
- );
40
-
35
+ /*
36
+ * Inserts the featured image between the (1st) cover 'background' `span` and 'inner_container' `div`,
37
+ * and removes eventual withespace characters between the two (typically introduced at template level)
38
+ */
39
+ $inner_container_start = '/<div\b[^>]+wp-block-cover__inner-container[\s|"][^>]*>/U';
40
+ if ( 1 === preg_match( $inner_container_start, $content, $matches, PREG_OFFSET_CAPTURE ) ) {
41
+ $offset = $matches[0][1];
42
+ $content = substr( $content, 0, $offset ) . $image . substr( $content, $offset );
43
+ }
41
44
  } else {
42
45
  if ( in_the_loop() ) {
43
46
  update_post_thumbnail_cache();
@@ -8,12 +8,27 @@ export default function GapStyles( { blockGap, clientId } ) {
8
8
  const styleElement = useContext( BlockList.__unstableElementContext );
9
9
  // --gallery-block--gutter-size is deprecated. --wp--style--gallery-gap-default should be used by themes that want to set a default
10
10
  // gap on the gallery.
11
- const gapValue = blockGap
12
- ? blockGap
13
- : `var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )`;
14
- const gap = `#block-${ clientId } {
15
- --wp--style--unstable-gallery-gap: ${ gapValue };
16
- gap: ${ gapValue }
11
+ const fallbackValue = `var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )`;
12
+ let gapValue = fallbackValue;
13
+ let column = fallbackValue;
14
+ let row;
15
+
16
+ // Check for the possibility of split block gap values. See: https://github.com/WordPress/gutenberg/pull/37736
17
+ if ( !! blockGap ) {
18
+ row =
19
+ typeof blockGap === 'string'
20
+ ? blockGap
21
+ : blockGap?.top || fallbackValue;
22
+ column =
23
+ typeof blockGap === 'string'
24
+ ? blockGap
25
+ : blockGap?.left || fallbackValue;
26
+ gapValue = row === column ? row : `${ row } ${ column }`;
27
+ }
28
+
29
+ const gap = `#block-${ clientId } {
30
+ --wp--style--unstable-gallery-gap: ${ column };
31
+ gap: ${ gapValue }
17
32
  }`;
18
33
 
19
34
  const GapStyle = () => {
@@ -48,7 +48,14 @@ function block_core_gallery_render( $attributes, $content ) {
48
48
  // Skip if gap value contains unsupported characters.
49
49
  // Regex for CSS value borrowed from `safecss_filter_attr`, and used here
50
50
  // because we only want to match against the value, not the CSS attribute.
51
- $gap = preg_match( '%[\\\(&=}]|/\*%', $gap ) ? null : $gap;
51
+ if ( is_array( $gap ) ) {
52
+ foreach ( $gap as $key => $value ) {
53
+ $gap[ $key ] = $value && preg_match( '%[\\\(&=}]|/\*%', $value ) ? null : $value;
54
+ }
55
+ } else {
56
+ $gap = $gap && preg_match( '%[\\\(&=}]|/\*%', $gap ) ? null : $gap;
57
+ }
58
+
52
59
  $class = wp_unique_id( 'wp-block-gallery-' );
53
60
  $content = preg_replace(
54
61
  '/' . preg_quote( 'class="', '/' ) . '/',
@@ -56,10 +63,22 @@ function block_core_gallery_render( $attributes, $content ) {
56
63
  $content,
57
64
  1
58
65
  );
66
+
59
67
  // --gallery-block--gutter-size is deprecated. --wp--style--gallery-gap-default should be used by themes that want to set a default
60
68
  // gap on the gallery.
61
- $gap_value = $gap ? $gap : 'var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )';
62
- $style = '.' . $class . '{ --wp--style--unstable-gallery-gap: ' . $gap_value . '; gap: ' . $gap_value . '}';
69
+ $fallback_gap = 'var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )';
70
+ $gap_value = $gap ? $gap : $fallback_gap;
71
+ $gap_column = $gap_value;
72
+
73
+ if ( is_array( $gap_value ) ) {
74
+ $gap_row = isset( $gap_value['top'] ) ? $gap_value['top'] : $fallback_gap;
75
+ $gap_column = isset( $gap_value['left'] ) ? $gap_value['left'] : $fallback_gap;
76
+ $gap_value = $gap_row === $gap_column ? $gap_row : $gap_row . ' ' . $gap_column;
77
+ }
78
+
79
+ // Set the CSS variable to the column value, and the `gap` property to the combined gap value.
80
+ $style = '.' . $class . '{ --wp--style--unstable-gallery-gap: ' . $gap_column . '; gap: ' . $gap_value . '}';
81
+
63
82
  // Ideally styles should be loaded in the head, but blocks may be parsed
64
83
  // after that, so loading in the footer for now.
65
84
  // See https://core.trac.wordpress.org/ticket/53494.
@@ -67,7 +86,8 @@ function block_core_gallery_render( $attributes, $content ) {
67
86
  'wp_footer',
68
87
  function () use ( $style ) {
69
88
  echo '<style> ' . $style . '</style>';
70
- }
89
+ },
90
+ 11
71
91
  );
72
92
  return $content;
73
93
  }
package/src/image/edit.js CHANGED
@@ -87,20 +87,6 @@ function hasDefaultSize( image, defaultSize ) {
87
87
  );
88
88
  }
89
89
 
90
- /**
91
- * Checks if a media attachment object has been "destroyed",
92
- * that is, removed from the media library. The core Media Library
93
- * adds a `destroyed` property to a deleted attachment object in the media collection.
94
- *
95
- * @param {number} id The attachment id.
96
- *
97
- * @return {boolean} Whether the image has been destroyed.
98
- */
99
- export function isMediaDestroyed( id ) {
100
- const attachment = wp?.media?.attachment( id ) || {};
101
- return attachment.destroyed;
102
- }
103
-
104
90
  export function ImageEdit( {
105
91
  attributes,
106
92
  setAttributes,
@@ -141,33 +127,6 @@ export function ImageEdit( {
141
127
  return pick( getSettings(), [ 'imageDefaultSize', 'mediaUpload' ] );
142
128
  }, [] );
143
129
 
144
- // A callback passed to MediaUpload,
145
- // fired when the media modal closes.
146
- function onCloseModal() {
147
- if ( isMediaDestroyed( attributes?.id ) ) {
148
- setAttributes( {
149
- url: undefined,
150
- id: undefined,
151
- } );
152
- }
153
- }
154
-
155
- /*
156
- Runs an error callback if the image does not load.
157
- If the error callback is triggered, we infer that that image
158
- has been deleted.
159
- */
160
- function onImageError( isReplaced = false ) {
161
- // If the image block was not replaced with an embed,
162
- // clear the attributes and trigger the placeholder.
163
- if ( ! isReplaced ) {
164
- setAttributes( {
165
- url: undefined,
166
- id: undefined,
167
- } );
168
- }
169
- }
170
-
171
130
  function onUploadError( message ) {
172
131
  noticeOperations.removeAllNotices();
173
132
  noticeOperations.createErrorNotice( message );
@@ -366,8 +325,6 @@ export function ImageEdit( {
366
325
  containerRef={ ref }
367
326
  context={ context }
368
327
  clientId={ clientId }
369
- onCloseModal={ onCloseModal }
370
- onImageLoadError={ onImageError }
371
328
  />
372
329
  ) }
373
330
  { ! url && (
@@ -384,7 +341,6 @@ export function ImageEdit( {
384
341
  onSelectURL={ onSelectURL }
385
342
  notices={ noticeUI }
386
343
  onError={ onUploadError }
387
- onClose={ onCloseModal }
388
344
  accept="image/*"
389
345
  allowedTypes={ ALLOWED_MEDIA_TYPES }
390
346
  value={ { id, src } }
@@ -43,7 +43,7 @@ import { store as coreStore } from '@wordpress/core-data';
43
43
  */
44
44
  import { createUpgradedEmbedBlock } from '../embed/util';
45
45
  import useClientWidth from './use-client-width';
46
- import { isExternalImage, isMediaDestroyed } from './edit';
46
+ import { isExternalImage } from './edit';
47
47
 
48
48
  /**
49
49
  * Module constants
@@ -72,14 +72,12 @@ export default function Image( {
72
72
  isSelected,
73
73
  insertBlocksAfter,
74
74
  onReplace,
75
- onCloseModal,
76
75
  onSelectImage,
77
76
  onSelectURL,
78
77
  onUploadError,
79
78
  containerRef,
80
79
  context,
81
80
  clientId,
82
- onImageLoadError,
83
81
  } ) {
84
82
  const imageRef = useRef();
85
83
  const captionRef = useRef();
@@ -218,16 +216,11 @@ export default function Image( {
218
216
  }
219
217
 
220
218
  function onImageError() {
221
- // Check if there's an embed block that handles this URL, e.g., instagram URL.
222
- // See: https://github.com/WordPress/gutenberg/pull/11472
219
+ // Check if there's an embed block that handles this URL.
223
220
  const embedBlock = createUpgradedEmbedBlock( { attributes: { url } } );
224
- const shouldReplace = undefined !== embedBlock;
225
-
226
- if ( shouldReplace ) {
221
+ if ( undefined !== embedBlock ) {
227
222
  onReplace( embedBlock );
228
223
  }
229
-
230
- onImageLoadError( shouldReplace );
231
224
  }
232
225
 
233
226
  function onSetHref( props ) {
@@ -299,9 +292,6 @@ export default function Image( {
299
292
  if ( ! isSelected ) {
300
293
  setIsEditingImage( false );
301
294
  }
302
- if ( isSelected && isMediaDestroyed( id ) ) {
303
- onImageLoadError();
304
- }
305
295
  }, [ isSelected ] );
306
296
 
307
297
  const canEditImage = id && naturalWidth && naturalHeight && imageEditing;
@@ -365,7 +355,6 @@ export default function Image( {
365
355
  onSelect={ onSelectImage }
366
356
  onSelectURL={ onSelectURL }
367
357
  onError={ onUploadError }
368
- onCloseModal={ onCloseModal }
369
358
  />
370
359
  </BlockControls>
371
360
  ) }
@@ -28,9 +28,11 @@ import {
28
28
  useBlockProps,
29
29
  store as blockEditorStore,
30
30
  } from '@wordpress/block-editor';
31
- import { useSelect } from '@wordpress/data';
31
+ import { useSelect, useDispatch } from '@wordpress/data';
32
32
  import { pin, list, grid } from '@wordpress/icons';
33
33
  import { store as coreStore } from '@wordpress/core-data';
34
+ import { store as noticeStore } from '@wordpress/notices';
35
+ import { useInstanceId } from '@wordpress/compose';
34
36
 
35
37
  /**
36
38
  * Internal dependencies
@@ -66,6 +68,7 @@ function getFeaturedImageDetails( post, size ) {
66
68
  }
67
69
 
68
70
  export default function LatestPostsEdit( { attributes, setAttributes } ) {
71
+ const instanceId = useInstanceId( LatestPostsEdit );
69
72
  const {
70
73
  postsToShow,
71
74
  order,
@@ -148,6 +151,20 @@ export default function LatestPostsEdit( { attributes, setAttributes } ) {
148
151
  ]
149
152
  );
150
153
 
154
+ // If a user clicks to a link prevent redirection and show a warning.
155
+ const { createWarningNotice, removeNotice } = useDispatch( noticeStore );
156
+ let noticeId;
157
+ const showRedirectionPreventedNotice = ( event ) => {
158
+ event.preventDefault();
159
+ // Remove previous warning if any, to show one at a time per block.
160
+ removeNotice( noticeId );
161
+ noticeId = `block-library/core/latest-posts/redirection-prevented/${ instanceId }`;
162
+ createWarningNotice( __( 'Links are disabled in the editor.' ), {
163
+ id: noticeId,
164
+ type: 'snackbar',
165
+ } );
166
+ };
167
+
151
168
  const imageSizeOptions = imageSizes
152
169
  .filter( ( { slug } ) => slug !== 'full' )
153
170
  .map( ( { name, slug } ) => ( {
@@ -466,7 +483,11 @@ export default function LatestPostsEdit( { attributes, setAttributes } ) {
466
483
  .join( ' ' ) }
467
484
  { /* translators: excerpt truncation character, default … */ }
468
485
  { __( ' … ' ) }
469
- <a href={ post.link } rel="noopener noreferrer">
486
+ <a
487
+ href={ post.link }
488
+ rel="noopener noreferrer"
489
+ onClick={ showRedirectionPreventedNotice }
490
+ >
470
491
  { __( 'Read more' ) }
471
492
  </a>
472
493
  </>
@@ -483,6 +504,9 @@ export default function LatestPostsEdit( { attributes, setAttributes } ) {
483
504
  className="wp-block-latest-posts__post-title"
484
505
  href={ post.link }
485
506
  rel="noreferrer noopener"
507
+ onClick={
508
+ showRedirectionPreventedNotice
509
+ }
486
510
  >
487
511
  { featuredImage }
488
512
  </a>
@@ -501,6 +525,7 @@ export default function LatestPostsEdit( { attributes, setAttributes } ) {
501
525
  }
502
526
  : undefined
503
527
  }
528
+ onClick={ showRedirectionPreventedNotice }
504
529
  >
505
530
  { ! titleTrimmed ? __( '(no title)' ) : null }
506
531
  </a>