@wordpress/block-library 9.35.1-next.dc3f6d3c1.0 → 9.36.1-next.6deb34194.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 (315) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/accordion/view.js +46 -4
  3. package/build/accordion/view.js.map +2 -2
  4. package/build/accordion-heading/block.json +1 -1
  5. package/build/accordion-heading/deprecated.js +1 -1
  6. package/build/accordion-heading/deprecated.js.map +2 -2
  7. package/build/accordion-panel/block.json +1 -1
  8. package/build/audio/index.js +13 -10
  9. package/build/audio/index.js.map +3 -3
  10. package/build/avatar/edit.js +13 -38
  11. package/build/avatar/edit.js.map +2 -2
  12. package/build/breadcrumbs/block.json +3 -2
  13. package/build/breadcrumbs/edit.js +18 -18
  14. package/build/breadcrumbs/edit.js.map +2 -2
  15. package/build/button/index.js +14 -11
  16. package/build/button/index.js.map +3 -3
  17. package/build/code/index.js +10 -7
  18. package/build/code/index.js.map +3 -3
  19. package/build/comments-pagination-numbers/block.json +7 -0
  20. package/build/cover/edit/block-controls.js +37 -3
  21. package/build/cover/edit/block-controls.js.map +3 -3
  22. package/build/cover/edit/cover-placeholder.js +0 -1
  23. package/build/cover/edit/cover-placeholder.js.map +2 -2
  24. package/build/cover/edit/embed-video-url-input.js +83 -0
  25. package/build/cover/edit/embed-video-url-input.js.map +7 -0
  26. package/build/cover/edit/index.js +60 -0
  27. package/build/cover/edit/index.js.map +2 -2
  28. package/build/cover/embed-video-utils.js +151 -0
  29. package/build/cover/embed-video-utils.js.map +7 -0
  30. package/build/cover/index.js +11 -5
  31. package/build/cover/index.js.map +3 -3
  32. package/build/cover/save.js +12 -0
  33. package/build/cover/save.js.map +2 -2
  34. package/build/cover/shared.js +3 -0
  35. package/build/cover/shared.js.map +2 -2
  36. package/build/details/index.js +10 -7
  37. package/build/details/index.js.map +3 -3
  38. package/build/file/index.js +15 -15
  39. package/build/file/index.js.map +3 -3
  40. package/build/freeform/block.json +1 -1
  41. package/build/gallery/edit.js +1 -3
  42. package/build/gallery/edit.js.map +2 -2
  43. package/build/gallery/transforms.js +7 -3
  44. package/build/gallery/transforms.js.map +2 -2
  45. package/build/heading/index.js +10 -7
  46. package/build/heading/index.js.map +3 -3
  47. package/build/html/modal.js +141 -121
  48. package/build/html/modal.js.map +3 -3
  49. package/build/image/edit.js +0 -1
  50. package/build/image/edit.js.map +2 -2
  51. package/build/image/image.js +0 -1
  52. package/build/image/image.js.map +2 -2
  53. package/build/image/index.js +19 -19
  54. package/build/image/index.js.map +3 -3
  55. package/build/index.js +9 -3
  56. package/build/index.js.map +2 -2
  57. package/build/list-item/index.js +9 -7
  58. package/build/list-item/index.js.map +3 -3
  59. package/build/math/block.json +28 -1
  60. package/build/math/edit.js +17 -2
  61. package/build/math/edit.js.map +2 -2
  62. package/build/media-text/index.js +16 -9
  63. package/build/media-text/index.js.map +3 -3
  64. package/build/media-text/media-container.js +0 -2
  65. package/build/media-text/media-container.js.map +2 -2
  66. package/build/missing/block.json +1 -1
  67. package/build/missing/edit.js +2 -2
  68. package/build/missing/edit.js.map +1 -1
  69. package/build/more/index.js +10 -7
  70. package/build/more/index.js.map +3 -3
  71. package/build/navigation-link/edit.js +36 -11
  72. package/build/navigation-link/edit.js.map +2 -2
  73. package/build/navigation-link/index.js +12 -9
  74. package/build/navigation-link/index.js.map +3 -3
  75. package/build/navigation-submenu/index.js +12 -9
  76. package/build/navigation-submenu/index.js.map +3 -3
  77. package/build/page-list-item/edit.js +4 -3
  78. package/build/page-list-item/edit.js.map +2 -2
  79. package/build/paragraph/deprecated-attributes.js +68 -0
  80. package/build/paragraph/deprecated-attributes.js.map +7 -0
  81. package/build/paragraph/edit.js +2 -0
  82. package/build/paragraph/edit.js.map +3 -3
  83. package/build/paragraph/index.js +10 -7
  84. package/build/paragraph/index.js.map +3 -3
  85. package/build/pattern/block.json +1 -1
  86. package/build/post-title/edit.js +6 -4
  87. package/build/post-title/edit.js.map +2 -2
  88. package/build/preformatted/index.js +10 -7
  89. package/build/preformatted/index.js.map +3 -3
  90. package/build/pullquote/index.js +12 -12
  91. package/build/pullquote/index.js.map +3 -3
  92. package/build/search/index.js +15 -17
  93. package/build/search/index.js.map +3 -3
  94. package/build/social-link/index.js +12 -9
  95. package/build/social-link/index.js.map +3 -3
  96. package/build/template-part/edit/index.js +37 -7
  97. package/build/template-part/edit/index.js.map +2 -2
  98. package/build/template-part/edit/utils/get-template-part-icon.js +9 -4
  99. package/build/template-part/edit/utils/get-template-part-icon.js.map +3 -3
  100. package/build/template-part/edit/utils/hooks.js +2 -3
  101. package/build/template-part/edit/utils/hooks.js.map +2 -2
  102. package/build/term-count/index.js +1 -0
  103. package/build/term-count/index.js.map +2 -2
  104. package/build/term-name/index.js +1 -0
  105. package/build/term-name/index.js.map +2 -2
  106. package/build/verse/index.js +10 -7
  107. package/build/verse/index.js.map +3 -3
  108. package/build/video/index.js +13 -10
  109. package/build/video/index.js.map +3 -3
  110. package/build-module/accordion/view.js +46 -4
  111. package/build-module/accordion/view.js.map +2 -2
  112. package/build-module/accordion-heading/block.json +1 -1
  113. package/build-module/accordion-heading/deprecated.js +1 -1
  114. package/build-module/accordion-heading/deprecated.js.map +2 -2
  115. package/build-module/accordion-panel/block.json +1 -1
  116. package/build-module/audio/index.js +13 -10
  117. package/build-module/audio/index.js.map +2 -2
  118. package/build-module/avatar/edit.js +13 -38
  119. package/build-module/avatar/edit.js.map +2 -2
  120. package/build-module/breadcrumbs/block.json +3 -2
  121. package/build-module/breadcrumbs/edit.js +18 -18
  122. package/build-module/breadcrumbs/edit.js.map +2 -2
  123. package/build-module/button/index.js +14 -11
  124. package/build-module/button/index.js.map +2 -2
  125. package/build-module/code/index.js +10 -7
  126. package/build-module/code/index.js.map +2 -2
  127. package/build-module/comments-pagination-numbers/block.json +7 -0
  128. package/build-module/cover/edit/block-controls.js +27 -3
  129. package/build-module/cover/edit/block-controls.js.map +2 -2
  130. package/build-module/cover/edit/cover-placeholder.js +0 -1
  131. package/build-module/cover/edit/cover-placeholder.js.map +2 -2
  132. package/build-module/cover/edit/embed-video-url-input.js +67 -0
  133. package/build-module/cover/edit/embed-video-url-input.js.map +7 -0
  134. package/build-module/cover/edit/index.js +61 -0
  135. package/build-module/cover/edit/index.js.map +2 -2
  136. package/build-module/cover/embed-video-utils.js +122 -0
  137. package/build-module/cover/embed-video-utils.js.map +7 -0
  138. package/build-module/cover/index.js +11 -5
  139. package/build-module/cover/index.js.map +2 -2
  140. package/build-module/cover/save.js +13 -0
  141. package/build-module/cover/save.js.map +2 -2
  142. package/build-module/cover/shared.js +2 -0
  143. package/build-module/cover/shared.js.map +2 -2
  144. package/build-module/details/index.js +10 -7
  145. package/build-module/details/index.js.map +2 -2
  146. package/build-module/file/index.js +15 -15
  147. package/build-module/file/index.js.map +2 -2
  148. package/build-module/freeform/block.json +1 -1
  149. package/build-module/gallery/edit.js +1 -3
  150. package/build-module/gallery/edit.js.map +2 -2
  151. package/build-module/gallery/transforms.js +7 -3
  152. package/build-module/gallery/transforms.js.map +2 -2
  153. package/build-module/heading/index.js +10 -7
  154. package/build-module/heading/index.js.map +2 -2
  155. package/build-module/html/modal.js +143 -122
  156. package/build-module/html/modal.js.map +2 -2
  157. package/build-module/image/edit.js +0 -1
  158. package/build-module/image/edit.js.map +2 -2
  159. package/build-module/image/image.js +0 -1
  160. package/build-module/image/image.js.map +2 -2
  161. package/build-module/image/index.js +19 -19
  162. package/build-module/image/index.js.map +2 -2
  163. package/build-module/index.js +9 -3
  164. package/build-module/index.js.map +2 -2
  165. package/build-module/list-item/index.js +9 -7
  166. package/build-module/list-item/index.js.map +2 -2
  167. package/build-module/math/block.json +28 -1
  168. package/build-module/math/edit.js +18 -3
  169. package/build-module/math/edit.js.map +2 -2
  170. package/build-module/media-text/index.js +16 -9
  171. package/build-module/media-text/index.js.map +2 -2
  172. package/build-module/media-text/media-container.js +0 -2
  173. package/build-module/media-text/media-container.js.map +2 -2
  174. package/build-module/missing/block.json +1 -1
  175. package/build-module/missing/edit.js +2 -2
  176. package/build-module/missing/edit.js.map +1 -1
  177. package/build-module/more/index.js +10 -7
  178. package/build-module/more/index.js.map +2 -2
  179. package/build-module/navigation-link/edit.js +37 -12
  180. package/build-module/navigation-link/edit.js.map +2 -2
  181. package/build-module/navigation-link/index.js +12 -9
  182. package/build-module/navigation-link/index.js.map +2 -2
  183. package/build-module/navigation-submenu/index.js +12 -9
  184. package/build-module/navigation-submenu/index.js.map +2 -2
  185. package/build-module/page-list-item/edit.js +4 -3
  186. package/build-module/page-list-item/edit.js.map +2 -2
  187. package/build-module/paragraph/deprecated-attributes.js +37 -0
  188. package/build-module/paragraph/deprecated-attributes.js.map +7 -0
  189. package/build-module/paragraph/edit.js +2 -0
  190. package/build-module/paragraph/edit.js.map +2 -2
  191. package/build-module/paragraph/index.js +10 -7
  192. package/build-module/paragraph/index.js.map +2 -2
  193. package/build-module/pattern/block.json +1 -1
  194. package/build-module/post-title/edit.js +6 -4
  195. package/build-module/post-title/edit.js.map +2 -2
  196. package/build-module/preformatted/index.js +10 -7
  197. package/build-module/preformatted/index.js.map +2 -2
  198. package/build-module/pullquote/index.js +12 -12
  199. package/build-module/pullquote/index.js.map +2 -2
  200. package/build-module/search/index.js +15 -17
  201. package/build-module/search/index.js.map +2 -2
  202. package/build-module/social-link/index.js +12 -9
  203. package/build-module/social-link/index.js.map +2 -2
  204. package/build-module/template-part/edit/index.js +37 -7
  205. package/build-module/template-part/edit/index.js.map +2 -2
  206. package/build-module/template-part/edit/utils/get-template-part-icon.js +10 -4
  207. package/build-module/template-part/edit/utils/get-template-part-icon.js.map +2 -2
  208. package/build-module/template-part/edit/utils/hooks.js +2 -3
  209. package/build-module/template-part/edit/utils/hooks.js.map +2 -2
  210. package/build-module/term-count/index.js +1 -0
  211. package/build-module/term-count/index.js.map +2 -2
  212. package/build-module/term-name/index.js +1 -0
  213. package/build-module/term-name/index.js.map +2 -2
  214. package/build-module/verse/index.js +10 -7
  215. package/build-module/verse/index.js.map +2 -2
  216. package/build-module/video/index.js +13 -10
  217. package/build-module/video/index.js.map +2 -2
  218. package/build-style/accordion/style-rtl.css +3 -0
  219. package/build-style/accordion/style.css +3 -0
  220. package/build-style/accordion-heading/style-rtl.css +2 -19
  221. package/build-style/accordion-heading/style.css +2 -19
  222. package/build-style/accordion-item/style-rtl.css +0 -7
  223. package/build-style/accordion-item/style.css +0 -7
  224. package/build-style/accordion-panel/style-rtl.css +1 -4
  225. package/build-style/accordion-panel/style.css +1 -4
  226. package/build-style/classic-rtl.css +24 -0
  227. package/build-style/classic.css +24 -0
  228. package/build-style/common-rtl.css +4 -4
  229. package/build-style/common.css +4 -0
  230. package/build-style/cover/style-rtl.css +47 -0
  231. package/build-style/cover/style.css +47 -0
  232. package/build-style/editor-rtl.css +11 -13
  233. package/build-style/editor.css +11 -13
  234. package/build-style/html/editor-rtl.css +11 -13
  235. package/build-style/html/editor.css +11 -13
  236. package/build-style/style-rtl.css +59 -33
  237. package/build-style/style.css +59 -29
  238. package/build-style/verse/style-rtl.css +2 -0
  239. package/build-style/verse/style.css +2 -0
  240. package/package.json +40 -38
  241. package/src/accordion/style.scss +4 -0
  242. package/src/accordion/view.js +60 -3
  243. package/src/accordion-heading/block.json +1 -1
  244. package/src/accordion-heading/deprecated.js +1 -1
  245. package/src/accordion-heading/style.scss +2 -38
  246. package/src/accordion-item/index.php +1 -0
  247. package/src/accordion-item/style.scss +2 -9
  248. package/src/accordion-panel/block.json +1 -1
  249. package/src/accordion-panel/style.scss +1 -5
  250. package/src/audio/index.js +14 -10
  251. package/src/avatar/edit.js +68 -83
  252. package/src/breadcrumbs/block.json +3 -2
  253. package/src/breadcrumbs/edit.js +18 -18
  254. package/src/breadcrumbs/index.php +103 -93
  255. package/src/button/index.js +15 -11
  256. package/src/classic.scss +38 -0
  257. package/src/code/index.js +11 -7
  258. package/src/comments-pagination-numbers/block.json +7 -0
  259. package/src/common.scss +4 -0
  260. package/src/cover/edit/block-controls.js +26 -2
  261. package/src/cover/edit/cover-placeholder.js +0 -1
  262. package/src/cover/edit/embed-video-url-input.js +74 -0
  263. package/src/cover/edit/index.js +81 -0
  264. package/src/cover/embed-video-utils.js +196 -0
  265. package/src/cover/index.js +12 -5
  266. package/src/cover/index.php +106 -0
  267. package/src/cover/save.js +14 -0
  268. package/src/cover/shared.js +1 -0
  269. package/src/cover/style.scss +47 -0
  270. package/src/details/index.js +11 -7
  271. package/src/file/index.js +16 -15
  272. package/src/freeform/block.json +1 -1
  273. package/src/gallery/edit.js +4 -3
  274. package/src/gallery/transforms.js +6 -2
  275. package/src/heading/index.js +11 -7
  276. package/src/html/editor.scss +10 -15
  277. package/src/html/modal.js +54 -30
  278. package/src/image/edit.js +0 -1
  279. package/src/image/image.js +0 -1
  280. package/src/image/index.js +20 -19
  281. package/src/image/index.php +1 -0
  282. package/src/index.js +9 -3
  283. package/src/list-item/index.js +10 -7
  284. package/src/math/block.json +28 -1
  285. package/src/math/edit.js +18 -3
  286. package/src/media-text/index.js +17 -9
  287. package/src/media-text/media-container.js +0 -2
  288. package/src/missing/block.json +1 -1
  289. package/src/missing/edit.js +2 -2
  290. package/src/more/index.js +11 -7
  291. package/src/navigation-link/edit.js +72 -26
  292. package/src/navigation-link/index.js +13 -9
  293. package/src/navigation-submenu/index.js +13 -9
  294. package/src/page-list/index.php +3 -4
  295. package/src/page-list-item/edit.js +4 -3
  296. package/src/paragraph/deprecated-attributes.js +45 -0
  297. package/src/paragraph/edit.js +2 -0
  298. package/src/paragraph/index.js +11 -7
  299. package/src/pattern/block.json +1 -1
  300. package/src/post-title/edit.js +8 -4
  301. package/src/post-title/index.php +1 -1
  302. package/src/preformatted/index.js +11 -7
  303. package/src/pullquote/index.js +13 -12
  304. package/src/search/index.js +15 -16
  305. package/src/social-link/index.js +13 -9
  306. package/src/style.scss +1 -0
  307. package/src/template-part/edit/index.js +44 -6
  308. package/src/template-part/edit/utils/get-template-part-icon.js +23 -4
  309. package/src/template-part/edit/utils/hooks.js +2 -4
  310. package/src/term-count/index.js +1 -0
  311. package/src/term-name/index.js +1 -0
  312. package/src/verse/index.js +11 -7
  313. package/src/verse/style.scss +4 -0
  314. package/src/video/index.js +14 -10
  315. package/tsconfig.tsbuildinfo +1 -1
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { __ } from '@wordpress/i18n';
5
5
  import { mediaAndText as icon } from '@wordpress/icons';
6
+ import { privateApis as blocksPrivateApis } from '@wordpress/blocks';
6
7
 
7
8
  /**
8
9
  * Internal dependencies
@@ -13,6 +14,9 @@ import edit from './edit';
13
14
  import metadata from './block.json';
14
15
  import save from './save';
15
16
  import transforms from './transforms';
17
+ import { unlock } from '../lock-unlock';
18
+
19
+ const { fieldsKey, formKey } = unlock( blocksPrivateApis );
16
20
 
17
21
  const { name } = metadata;
18
22
 
@@ -50,16 +54,17 @@ export const settings = {
50
54
  deprecated,
51
55
  };
52
56
 
53
- if ( window.__experimentalContentOnlyPatternInsertion ) {
54
- settings.fields = [
57
+ if ( window.__experimentalContentOnlyInspectorFields ) {
58
+ settings[ fieldsKey ] = [
55
59
  {
60
+ id: 'media',
56
61
  label: __( 'Media' ),
57
- type: 'Media',
58
- shownByDefault: true,
62
+ type: 'media',
59
63
  mapping: {
60
64
  id: 'mediaId',
61
65
  type: 'mediaType',
62
- src: 'mediaUrl',
66
+ url: 'mediaUrl',
67
+ link: 'mediaLink',
63
68
  },
64
69
  args: {
65
70
  allowedTypes: [ 'image', 'video' ],
@@ -67,16 +72,19 @@ if ( window.__experimentalContentOnlyPatternInsertion ) {
67
72
  },
68
73
  },
69
74
  {
75
+ id: 'link',
70
76
  label: __( 'Link' ),
71
- type: 'Link',
72
- shownByDefault: false,
77
+ type: 'link',
73
78
  mapping: {
74
- href: 'href',
79
+ url: 'href',
75
80
  rel: 'rel',
76
- target: 'linkTarget',
81
+ linkTarget: 'linkTarget',
77
82
  },
78
83
  },
79
84
  ];
85
+ settings[ formKey ] = {
86
+ fields: [ 'media' ],
87
+ };
80
88
  }
81
89
 
82
90
  export const init = () => initBlock( { name, metadata, settings } );
@@ -61,7 +61,6 @@ function ToolbarEditButton( {
61
61
  mediaId={ mediaId }
62
62
  mediaURL={ mediaUrl }
63
63
  allowedTypes={ ALLOWED_MEDIA_TYPES }
64
- accept="image/*,video/*"
65
64
  onSelect={ onSelectMedia }
66
65
  onToggleFeaturedImage={ toggleUseFeaturedImage }
67
66
  useFeaturedImage={ useFeaturedImage }
@@ -91,7 +90,6 @@ function PlaceholderContainer( {
91
90
  } }
92
91
  className={ className }
93
92
  onSelect={ onSelectMedia }
94
- accept="image/*,video/*"
95
93
  onToggleFeaturedImage={ toggleUseFeaturedImage }
96
94
  allowedTypes={ ALLOWED_MEDIA_TYPES }
97
95
  onError={ onUploadError }
@@ -26,7 +26,7 @@
26
26
  "lock": false,
27
27
  "reusable": false,
28
28
  "renaming": false,
29
- "blockVisibility": false,
29
+ "visibility": false,
30
30
  "interactivity": {
31
31
  "clientNavigation": true
32
32
  }
@@ -66,12 +66,12 @@ export default function MissingEdit( { attributes, clientId } ) {
66
66
  ) {
67
67
  if ( hasHTMLBlock ) {
68
68
  messageHTML = __(
69
- 'It appears you are trying to use the deprecated Classic block. You can leave this block intact, convert its content to a Custom HTML block, or remove it entirely. Alternatively, you can refresh the page to use the Classic block.'
69
+ 'It appears you are trying to use the deprecated Classic block. You can leave this block intact, convert its content to a Custom HTML block, or remove it entirely. Alternatively, if you have unsaved changes, you can save them and refresh to use the Classic block.'
70
70
  );
71
71
  actions.push( convertToHtmlButton );
72
72
  } else {
73
73
  messageHTML = __(
74
- 'It appears you are trying to use the deprecated Classic block. You can leave this block intact, or remove it entirely. Alternatively, you can refresh the page to use the Classic block.'
74
+ 'It appears you are trying to use the deprecated Classic block. You can leave this block intact, or remove it entirely. Alternatively, if you have unsaved changes, you can save them and refresh to use the Classic block.'
75
75
  );
76
76
  }
77
77
  } else if ( hasContent && hasHTMLBlock ) {
package/src/more/index.js CHANGED
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { more as icon } from '@wordpress/icons';
5
5
  import { __ } from '@wordpress/i18n';
6
+ import { privateApis as blocksPrivateApis } from '@wordpress/blocks';
6
7
 
7
8
  /**
8
9
  * Internal dependencies
@@ -12,6 +13,9 @@ import edit from './edit';
12
13
  import metadata from './block.json';
13
14
  import save from './save';
14
15
  import transforms from './transforms';
16
+ import { unlock } from '../lock-unlock';
17
+
18
+ const { fieldsKey, formKey } = unlock( blocksPrivateApis );
15
19
 
16
20
  const { name } = metadata;
17
21
 
@@ -36,17 +40,17 @@ export const settings = {
36
40
  save,
37
41
  };
38
42
 
39
- if ( window.__experimentalContentOnlyPatternInsertion ) {
40
- settings.fields = [
43
+ if ( window.__experimentalContentOnlyInspectorFields ) {
44
+ settings[ fieldsKey ] = [
41
45
  {
46
+ id: 'customText',
42
47
  label: __( 'Content' ),
43
- type: 'RichText',
44
- shownByDefault: true,
45
- mapping: {
46
- value: 'customText',
47
- },
48
+ type: 'richtext',
48
49
  },
49
50
  ];
51
+ settings[ formKey ] = {
52
+ fields: [ 'customText' ],
53
+ };
50
54
  }
51
55
 
52
56
  export const init = () => initBlock( { name, metadata, settings } );
@@ -30,7 +30,7 @@ import { useState, useEffect, useRef, useCallback } from '@wordpress/element';
30
30
  import { decodeEntities } from '@wordpress/html-entities';
31
31
  import { link as linkIcon, addSubmenu } from '@wordpress/icons';
32
32
  import { store as coreStore } from '@wordpress/core-data';
33
- import { useMergeRefs, usePrevious, useInstanceId } from '@wordpress/compose';
33
+ import { useMergeRefs, useInstanceId } from '@wordpress/compose';
34
34
 
35
35
  /**
36
36
  * Internal dependencies
@@ -213,8 +213,11 @@ export default function NavigationLinkEdit( {
213
213
  const itemLabelPlaceholder = __( 'Add label…' );
214
214
  const ref = useRef();
215
215
  const linkUIref = useRef();
216
- const prevUrl = usePrevious( url );
217
- const isNewLink = useRef( ! url );
216
+ // A link is "new" only if it has an undefined label
217
+ // After the link is created, even if no label is provided, it's set to an empty string.
218
+ const isNewLink = useRef( label === undefined );
219
+ // Track whether we should focus the submenu appender when closing the link UI
220
+ const shouldSelectSubmenuAppenderOnClose = useRef( false );
218
221
 
219
222
  const {
220
223
  isAtMaxNesting,
@@ -223,6 +226,7 @@ export default function NavigationLinkEdit( {
223
226
  hasChildren,
224
227
  validateLinkStatus,
225
228
  parentBlockClientId,
229
+ isSubmenu,
226
230
  } = useSelect(
227
231
  ( select ) => {
228
232
  const {
@@ -267,6 +271,7 @@ export default function NavigationLinkEdit( {
267
271
  hasChildren: !! getBlockCount( clientId ),
268
272
  validateLinkStatus: enableLinkStatusValidation,
269
273
  parentBlockClientId: parentBlockId,
274
+ isSubmenu: parentBlockName === 'core/navigation-submenu',
270
275
  };
271
276
  },
272
277
  [ clientId, maxNestingLevel ]
@@ -314,7 +319,7 @@ export default function NavigationLinkEdit( {
314
319
  // If we leave focus on this block, then when we close the link without creating a link, focus will
315
320
  // be lost during the new block selection process.
316
321
  useEffect( () => {
317
- if ( isNewLink.current && isSelected && ! url ) {
322
+ if ( isNewLink.current && isSelected ) {
318
323
  selectBlock( parentBlockClientId );
319
324
  }
320
325
  }, [] ); // eslint-disable-line react-hooks/exhaustive-deps
@@ -333,20 +338,46 @@ export default function NavigationLinkEdit( {
333
338
  transformToSubmenu,
334
339
  ] );
335
340
 
336
- // If the LinkControl popover is open and the URL has changed, close the LinkControl and focus the label text.
341
+ // Handle link UI when a new link is created
337
342
  useEffect( () => {
338
- // We only want to do this when the URL has gone from nothing to a new URL AND the label looks like a URL
339
- if (
340
- ! prevUrl &&
341
- url &&
342
- isLinkOpen &&
343
- isURL( prependHTTP( label ) ) &&
344
- /^.+\.[a-z]+/.test( label )
345
- ) {
343
+ // We know if a link was just created from our link UI if
344
+ // 1. isNewLink.current is true
345
+ // 2. url has a value
346
+ // 3. isLinkOpen is true
347
+ if ( ! isNewLink.current || ! url || ! isLinkOpen ) {
348
+ return;
349
+ }
350
+
351
+ // Ensure this only runs once
352
+ isNewLink.current = false;
353
+
354
+ // We just created a link and the block is now selected.
355
+ // If the label looks like a URL, focus and select the label text.
356
+ if ( isURL( prependHTTP( label ) ) && /^.+\.[a-z]+/.test( label ) ) {
346
357
  // Focus and select the label text.
347
358
  selectLabelText();
359
+ } else {
360
+ // If the link was just created, we want to select the block so the inspector controls
361
+ // are accurate.
362
+ selectBlock( clientId, null );
363
+
364
+ // Edge case: When the created link is the first child of a submenu, the focus will have
365
+ // originated from the add submenu toolbar button. In this case, we need to return focus
366
+ // to the submenu appender if the user closes the link ui using the keyboard.
367
+ // Check if this is the first and only child of a newly created submenu.
368
+ if ( isSubmenu ) {
369
+ const parentBlocks = getBlocks( parentBlockClientId );
370
+ // If this is the only child, then this is a new submenu.
371
+ // Set the flag to select the submenu appender when the link ui is closed.
372
+ if (
373
+ parentBlocks.length === 1 &&
374
+ parentBlocks[ 0 ].clientId === clientId
375
+ ) {
376
+ shouldSelectSubmenuAppenderOnClose.current = true;
377
+ }
378
+ }
348
379
  }
349
- }, [ prevUrl, url, isLinkOpen, label ] );
380
+ }, [ url, isLinkOpen, isNewLink, label ] );
350
381
 
351
382
  /**
352
383
  * Focus the Link label text and select it.
@@ -444,23 +475,20 @@ export default function NavigationLinkEdit( {
444
475
  }
445
476
  );
446
477
 
447
- if (
448
- ! url ||
478
+ const needsValidLink =
479
+ ( ! url && ! ( hasUrlBinding && isBoundEntityAvailable ) ) ||
449
480
  isInvalid ||
450
481
  isDraft ||
451
- ( hasUrlBinding && ! isBoundEntityAvailable )
452
- ) {
482
+ ( hasUrlBinding && ! isBoundEntityAvailable );
483
+
484
+ if ( needsValidLink ) {
453
485
  blockProps.onClick = () => {
454
486
  setIsLinkOpen( true );
455
487
  };
456
488
  }
457
489
 
458
490
  const classes = clsx( 'wp-block-navigation-item__content', {
459
- 'wp-block-navigation-link__placeholder':
460
- ! url ||
461
- isInvalid ||
462
- isDraft ||
463
- ( hasUrlBinding && ! isBoundEntityAvailable ),
491
+ 'wp-block-navigation-link__placeholder': needsValidLink,
464
492
  } );
465
493
 
466
494
  const missingText = getMissingText( type );
@@ -589,9 +617,27 @@ export default function NavigationLinkEdit( {
589
617
  // Don't remove if binding exists (even if entity is unavailable) so user can fix it.
590
618
  if ( ! url && ! hasUrlBinding ) {
591
619
  onReplace( [] );
592
- } else if ( isNewLink.current ) {
593
- // If we just created a new link, select it
594
- selectBlock( clientId );
620
+ return;
621
+ }
622
+
623
+ // Edge case: If this is the first child of a new submenu, focus the submenu's appender
624
+ if (
625
+ shouldSelectSubmenuAppenderOnClose.current
626
+ ) {
627
+ shouldSelectSubmenuAppenderOnClose.current = false;
628
+
629
+ // The appender is the next sibling in the DOM after the current block
630
+ if (
631
+ listItemRef.current?.nextElementSibling
632
+ ) {
633
+ const appenderButton =
634
+ listItemRef.current.nextElementSibling.querySelector(
635
+ '.block-editor-button-block-appender'
636
+ );
637
+ if ( appenderButton ) {
638
+ appenderButton.focus();
639
+ }
640
+ }
595
641
  }
596
642
  } }
597
643
  anchor={ popoverAnchor }
@@ -5,6 +5,7 @@ import { _x, __ } from '@wordpress/i18n';
5
5
  import { customLink as linkIcon } from '@wordpress/icons';
6
6
  import { InnerBlocks } from '@wordpress/block-editor';
7
7
  import { addFilter } from '@wordpress/hooks';
8
+ import { privateApis as blocksPrivateApis } from '@wordpress/blocks';
8
9
 
9
10
  /**
10
11
  * Internal dependencies
@@ -15,6 +16,9 @@ import edit from './edit';
15
16
  import save from './save';
16
17
  import { enhanceNavigationLinkVariations } from './hooks';
17
18
  import transforms from './transforms';
19
+ import { unlock } from '../lock-unlock';
20
+
21
+ const { fieldsKey, formKey } = unlock( blocksPrivateApis );
18
22
 
19
23
  const { name } = metadata;
20
24
 
@@ -89,20 +93,17 @@ export const settings = {
89
93
  transforms,
90
94
  };
91
95
 
92
- if ( window.__experimentalContentOnlyPatternInsertion ) {
93
- settings.fields = [
96
+ if ( window.__experimentalContentOnlyInspectorFields ) {
97
+ settings[ fieldsKey ] = [
94
98
  {
99
+ id: 'label',
95
100
  label: __( 'Label' ),
96
- type: 'RichText',
97
- shownByDefault: true,
98
- mapping: {
99
- value: 'label',
100
- },
101
+ type: 'richtext',
101
102
  },
102
103
  {
104
+ id: 'link',
103
105
  label: __( 'Link' ),
104
- type: 'Link',
105
- shownByDefault: false,
106
+ type: 'link',
106
107
  mapping: {
107
108
  href: 'url',
108
109
  rel: 'rel',
@@ -110,6 +111,9 @@ if ( window.__experimentalContentOnlyPatternInsertion ) {
110
111
  },
111
112
  },
112
113
  ];
114
+ settings[ formKey ] = {
115
+ fields: [ 'label' ],
116
+ };
113
117
  }
114
118
 
115
119
  export const init = () => {
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { page, addSubmenu } from '@wordpress/icons';
5
5
  import { _x, __ } from '@wordpress/i18n';
6
+ import { privateApis as blocksPrivateApis } from '@wordpress/blocks';
6
7
 
7
8
  /**
8
9
  * Internal dependencies
@@ -12,6 +13,9 @@ import metadata from './block.json';
12
13
  import edit from './edit';
13
14
  import save from './save';
14
15
  import transforms from './transforms';
16
+ import { unlock } from '../lock-unlock';
17
+
18
+ const { fieldsKey, formKey } = unlock( blocksPrivateApis );
15
19
 
16
20
  const { name } = metadata;
17
21
 
@@ -48,20 +52,17 @@ export const settings = {
48
52
  transforms,
49
53
  };
50
54
 
51
- if ( window.__experimentalContentOnlyPatternInsertion ) {
52
- settings.fields = [
55
+ if ( window.__experimentalContentOnlyInspectorFields ) {
56
+ settings[ fieldsKey ] = [
53
57
  {
58
+ id: 'label',
54
59
  label: __( 'Label' ),
55
- type: 'RichText',
56
- shownByDefault: true,
57
- mapping: {
58
- value: 'label',
59
- },
60
+ type: 'richtext',
60
61
  },
61
62
  {
63
+ id: 'link',
62
64
  label: __( 'Link' ),
63
- type: 'Link',
64
- shownByDefault: false,
65
+ type: 'link',
65
66
  mapping: {
66
67
  href: 'url',
67
68
  rel: 'rel',
@@ -69,6 +70,9 @@ if ( window.__experimentalContentOnlyPatternInsertion ) {
69
70
  },
70
71
  },
71
72
  ];
73
+ settings[ formKey ] = {
74
+ fields: [ 'label' ],
75
+ };
72
76
  }
73
77
 
74
78
  export const init = () => initBlock( { name, metadata, settings } );
@@ -192,8 +192,7 @@ function block_core_page_list_render_nested_page_list( $open_submenus_on_click,
192
192
  $css_class .= ' menu-item-home';
193
193
  }
194
194
 
195
- $title = wp_kses_post( $page['title'] );
196
- $title = $title ? $title : __( '(no title)' );
195
+ $title = $page['title'] ? $page['title'] : __( '(no title)' );
197
196
 
198
197
  $aria_label = sprintf(
199
198
  /* translators: Accessibility text. %s: Parent page title. */
@@ -204,10 +203,10 @@ function block_core_page_list_render_nested_page_list( $open_submenus_on_click,
204
203
  $markup .= '<li class="wp-block-pages-list__item' . esc_attr( $css_class ) . '"' . $style_attribute . '>';
205
204
 
206
205
  if ( isset( $page['children'] ) && $is_navigation_child && $open_submenus_on_click ) {
207
- $markup .= '<button aria-label="' . esc_attr( $aria_label ) . '" class="' . esc_attr( $navigation_child_content_class ) . ' wp-block-navigation-submenu__toggle" aria-expanded="false">' . esc_html( $title ) .
206
+ $markup .= '<button aria-label="' . esc_attr( $aria_label ) . '" class="' . esc_attr( $navigation_child_content_class ) . ' wp-block-navigation-submenu__toggle" aria-expanded="false">' . wp_kses_post( $title ) .
208
207
  '</button><span class="wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></span>';
209
208
  } else {
210
- $markup .= '<a class="wp-block-pages-list__item__link' . esc_attr( $navigation_child_content_class ) . '" href="' . esc_url( $page['link'] ) . '"' . $aria_current . '>' . $title . '</a>';
209
+ $markup .= '<a class="wp-block-pages-list__item__link' . esc_attr( $navigation_child_content_class ) . '" href="' . esc_url( $page['link'] ) . '"' . $aria_current . '>' . wp_kses_post( $title ) . '</a>';
211
210
  }
212
211
 
213
212
  if ( isset( $page['children'] ) ) {
@@ -8,7 +8,8 @@ import clsx from 'clsx';
8
8
  import { useBlockProps, useInnerBlocksProps } from '@wordpress/block-editor';
9
9
  import { useSelect } from '@wordpress/data';
10
10
  import { store as coreStore } from '@wordpress/core-data';
11
- import { decodeEntities } from '@wordpress/html-entities';
11
+ import { RawHTML } from '@wordpress/element';
12
+ import { safeHTML } from '@wordpress/dom';
12
13
 
13
14
  /**
14
15
  * Internal dependencies
@@ -68,7 +69,7 @@ export default function PageListItemEdit( { context, attributes } ) {
68
69
  className="wp-block-navigation-item__content wp-block-navigation-submenu__toggle"
69
70
  aria-expanded="false"
70
71
  >
71
- { decodeEntities( label ) }
72
+ <RawHTML>{ safeHTML( label ) }</RawHTML>
72
73
  </button>
73
74
  <span className="wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon">
74
75
  <ItemSubmenuIcon />
@@ -81,7 +82,7 @@ export default function PageListItemEdit( { context, attributes } ) {
81
82
  } ) }
82
83
  href={ link }
83
84
  >
84
- { decodeEntities( title ) }
85
+ <RawHTML>{ safeHTML( title ) }</RawHTML>
85
86
  </a>
86
87
  ) }
87
88
  { hasChildren && (
@@ -0,0 +1,45 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useEvent } from '@wordpress/compose';
5
+ import { useEffect, useRef } from '@wordpress/element';
6
+ import deprecated from '@wordpress/deprecated';
7
+ import { useDispatch } from '@wordpress/data';
8
+ import { store as blockEditorStore } from '@wordpress/block-editor';
9
+
10
+ /**
11
+ * If a plugin is still using the old align attribute, we need to migrate its value
12
+ * to the new style.typography.textAlign attribute.
13
+ *
14
+ * @param {string?} align Align attribute value.
15
+ * @param {Object?} style Style attribute value.
16
+ * @param {(Object) => void} setAttributes Updater function for block attributes.
17
+ */
18
+ export default function useDeprecatedAlign( align, style, setAttributes ) {
19
+ const { __unstableMarkNextChangeAsNotPersistent } =
20
+ useDispatch( blockEditorStore );
21
+ const updateStyleWithAlign = useEvent( () => {
22
+ deprecated( 'align attribute in paragraph block', {
23
+ alternative: 'style.typography.textAlign',
24
+ since: '7.0',
25
+ } );
26
+ __unstableMarkNextChangeAsNotPersistent();
27
+ setAttributes( {
28
+ style: {
29
+ ...style,
30
+ typography: {
31
+ ...style?.typography,
32
+ textAlign: align,
33
+ },
34
+ },
35
+ } );
36
+ } );
37
+ const lastUpdatedAlignRef = useRef();
38
+ useEffect( () => {
39
+ if ( align === lastUpdatedAlignRef.current ) {
40
+ return;
41
+ }
42
+ lastUpdatedAlignRef.current = align;
43
+ updateStyleWithAlign();
44
+ }, [ align, updateStyleWithAlign ] );
45
+ }
@@ -26,6 +26,7 @@ import { formatLtr } from '@wordpress/icons';
26
26
  * Internal dependencies
27
27
  */
28
28
  import { useOnEnter } from './use-enter';
29
+ import useDeprecatedAlign from './deprecated-attributes';
29
30
 
30
31
  function ParagraphRTLControl( { direction, setDirection } ) {
31
32
  return (
@@ -110,6 +111,7 @@ function ParagraphBlock( {
110
111
  } ) {
111
112
  const { content, direction, dropCap, placeholder, style } = attributes;
112
113
  const textAlign = style?.typography?.textAlign;
114
+ useDeprecatedAlign( attributes.align, style, setAttributes );
113
115
  const blockProps = useBlockProps( {
114
116
  ref: useOnEnter( { clientId, content } ),
115
117
  className: clsx( {
@@ -3,6 +3,7 @@
3
3
  */
4
4
  import { __ } from '@wordpress/i18n';
5
5
  import { paragraph as icon } from '@wordpress/icons';
6
+ import { privateApis as blocksPrivateApis } from '@wordpress/blocks';
6
7
 
7
8
  /**
8
9
  * Internal dependencies
@@ -14,6 +15,9 @@ import metadata from './block.json';
14
15
  import save from './save';
15
16
  import transforms from './transforms';
16
17
  import variations from './variations';
18
+ import { unlock } from '../lock-unlock';
19
+
20
+ const { fieldsKey, formKey } = unlock( blocksPrivateApis );
17
21
 
18
22
  const { name } = metadata;
19
23
 
@@ -58,17 +62,17 @@ export const settings = {
58
62
  variations,
59
63
  };
60
64
 
61
- if ( window.__experimentalContentOnlyPatternInsertion ) {
62
- settings.fields = [
65
+ if ( window.__experimentalContentOnlyInspectorFields ) {
66
+ settings[ fieldsKey ] = [
63
67
  {
68
+ id: 'content',
64
69
  label: __( 'Content' ),
65
- type: 'RichText',
66
- shownByDefault: true,
67
- mapping: {
68
- value: 'content',
69
- },
70
+ type: 'richtext',
70
71
  },
71
72
  ];
73
+ settings[ formKey ] = {
74
+ fields: [ 'content' ],
75
+ };
72
76
  }
73
77
 
74
78
  export const init = () => initBlock( { name, metadata, settings } );
@@ -9,7 +9,7 @@
9
9
  "html": false,
10
10
  "inserter": false,
11
11
  "renaming": false,
12
- "blockVisibility": false,
12
+ "visibility": false,
13
13
  "interactivity": {
14
14
  "clientNavigation": true
15
15
  }
@@ -86,7 +86,7 @@ export default function PostTitleEdit( {
86
86
  titleElement = userCanEdit ? (
87
87
  <PlainText
88
88
  tagName={ TagName }
89
- placeholder={ __( 'No title' ) }
89
+ placeholder={ __( '(no title)' ) }
90
90
  value={ rawTitle }
91
91
  onChange={ setTitle }
92
92
  __experimentalVersion={ 2 }
@@ -96,7 +96,9 @@ export default function PostTitleEdit( {
96
96
  ) : (
97
97
  <TagName
98
98
  { ...blockProps }
99
- dangerouslySetInnerHTML={ { __html: fullTitle?.rendered } }
99
+ dangerouslySetInnerHTML={ {
100
+ __html: fullTitle?.rendered || __( '(no title)' ),
101
+ } }
100
102
  />
101
103
  );
102
104
  }
@@ -109,7 +111,9 @@ export default function PostTitleEdit( {
109
111
  href={ link }
110
112
  target={ linkTarget }
111
113
  rel={ rel }
112
- placeholder={ ! rawTitle.length ? __( 'No title' ) : null }
114
+ placeholder={
115
+ ! rawTitle.length ? __( '(no title)' ) : null
116
+ }
113
117
  value={ rawTitle }
114
118
  onChange={ setTitle }
115
119
  __experimentalVersion={ 2 }
@@ -124,7 +128,7 @@ export default function PostTitleEdit( {
124
128
  rel={ rel }
125
129
  onClick={ ( event ) => event.preventDefault() }
126
130
  dangerouslySetInnerHTML={ {
127
- __html: fullTitle?.rendered,
131
+ __html: fullTitle?.rendered || __( '(no title)' ),
128
132
  } }
129
133
  />
130
134
  </TagName>
@@ -27,7 +27,7 @@ function render_block_core_post_title( $attributes, $content, $block ) {
27
27
  */
28
28
  $title = get_the_title();
29
29
 
30
- if ( ! $title ) {
30
+ if ( ! strip_tags( $title ) ) {
31
31
  return '';
32
32
  }
33
33