@wordpress/block-library 8.29.0 → 8.30.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 (347) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/audio/edit.js +7 -17
  3. package/build/audio/edit.js.map +1 -1
  4. package/build/audio/edit.native.js.map +1 -1
  5. package/build/avatar/edit.js.map +1 -1
  6. package/build/block/deprecated.js +71 -11
  7. package/build/block/deprecated.js.map +1 -1
  8. package/build/block/edit.js +49 -24
  9. package/build/block/edit.js.map +1 -1
  10. package/build/button/edit.js +2 -2
  11. package/build/button/edit.js.map +1 -1
  12. package/build/buttons/edit.native.js.map +1 -1
  13. package/build/buttons/transforms.js +16 -2
  14. package/build/buttons/transforms.js.map +1 -1
  15. package/build/code/transforms.js +17 -6
  16. package/build/code/transforms.js.map +1 -1
  17. package/build/columns/edit.js +3 -2
  18. package/build/columns/edit.js.map +1 -1
  19. package/build/comment-author-avatar/edit.js +1 -1
  20. package/build/comment-author-avatar/edit.js.map +1 -1
  21. package/build/cover/edit/block-controls.js +14 -3
  22. package/build/cover/edit/block-controls.js.map +1 -1
  23. package/build/cover/edit/index.js.map +1 -1
  24. package/build/cover/edit/inspector-controls.js.map +1 -1
  25. package/build/cover/edit/resizable-cover-popover.js +0 -6
  26. package/build/cover/edit/resizable-cover-popover.js.map +1 -1
  27. package/build/cover/edit.native.js.map +1 -1
  28. package/build/file/deprecated.js.map +1 -1
  29. package/build/file/edit.js +6 -13
  30. package/build/file/edit.js.map +1 -1
  31. package/build/file/edit.native.js.map +1 -1
  32. package/build/file/save.js.map +1 -1
  33. package/build/form-input/edit.js +1 -1
  34. package/build/form-input/edit.js.map +1 -1
  35. package/build/gallery/edit.js.map +1 -1
  36. package/build/gallery/gallery.native.js.map +1 -1
  37. package/build/gallery/v1/edit.js.map +1 -1
  38. package/build/gallery/v1/gallery.native.js.map +1 -1
  39. package/build/heading/transforms.js +17 -4
  40. package/build/heading/transforms.js.map +1 -1
  41. package/build/image/edit.js +8 -4
  42. package/build/image/edit.js.map +1 -1
  43. package/build/image/edit.native.js.map +1 -1
  44. package/build/image/image.js +22 -8
  45. package/build/image/image.js.map +1 -1
  46. package/build/latest-posts/edit.native.js.map +1 -1
  47. package/build/list/ordered-list-settings.js +1 -1
  48. package/build/list/ordered-list-settings.js.map +1 -1
  49. package/build/list-item/edit.js +1 -3
  50. package/build/list-item/edit.js.map +1 -1
  51. package/build/list-item/edit.native.js.map +1 -1
  52. package/build/list-item/hooks/index.js +0 -7
  53. package/build/list-item/hooks/index.js.map +1 -1
  54. package/build/list-item/hooks/use-indent-list-item.js +1 -0
  55. package/build/list-item/hooks/use-indent-list-item.js.map +1 -1
  56. package/build/list-item/hooks/use-outdent-list-item.js +1 -0
  57. package/build/list-item/hooks/use-outdent-list-item.js.map +1 -1
  58. package/build/list-item/hooks/use-space.js +16 -7
  59. package/build/list-item/hooks/use-space.js.map +1 -1
  60. package/build/list-item/index.js +4 -1
  61. package/build/list-item/index.js.map +1 -1
  62. package/build/media-text/media-container.native.js +1 -1
  63. package/build/media-text/media-container.native.js.map +1 -1
  64. package/build/navigation/edit/index.js.map +1 -1
  65. package/build/navigation-link/link-ui.js.map +1 -1
  66. package/build/paragraph/edit.native.js.map +1 -1
  67. package/build/pattern/edit.js +11 -0
  68. package/build/pattern/edit.js.map +1 -1
  69. package/build/post-excerpt/edit.js.map +1 -1
  70. package/build/post-featured-image/dimension-controls.js.map +1 -1
  71. package/build/post-featured-image/edit.js +8 -11
  72. package/build/post-featured-image/edit.js.map +1 -1
  73. package/build/post-navigation-link/edit.js.map +1 -1
  74. package/build/post-title/edit.js +2 -2
  75. package/build/post-title/edit.js.map +1 -1
  76. package/build/query/edit/pattern-selection-modal.js.map +1 -1
  77. package/build/query/utils.js +7 -5
  78. package/build/query/utils.js.map +1 -1
  79. package/build/query-pagination-next/edit.js.map +1 -1
  80. package/build/query-pagination-previous/edit.js.map +1 -1
  81. package/build/quote/deprecated.js +111 -12
  82. package/build/quote/deprecated.js.map +1 -1
  83. package/build/quote/edit.js +5 -5
  84. package/build/quote/edit.js.map +1 -1
  85. package/build/quote/index.js +1 -1
  86. package/build/quote/index.js.map +1 -1
  87. package/build/quote/save.js +2 -2
  88. package/build/quote/save.js.map +1 -1
  89. package/build/read-more/edit.js.map +1 -1
  90. package/build/search/edit.js +1 -1
  91. package/build/search/edit.js.map +1 -1
  92. package/build/search/edit.native.js.map +1 -1
  93. package/build/site-logo/edit.js +7 -2
  94. package/build/site-logo/edit.js.map +1 -1
  95. package/build/site-title/{edit/index.js → edit.js} +1 -1
  96. package/build/site-title/edit.js.map +1 -0
  97. package/build/social-link/edit.js.map +1 -1
  98. package/build/social-links/edit.native.js.map +1 -1
  99. package/build/spacer/edit.js.map +1 -1
  100. package/build/table-of-contents/edit.js.map +1 -1
  101. package/build/template-part/edit/index.js +53 -1
  102. package/build/template-part/edit/index.js.map +1 -1
  103. package/build/template-part/edit/selection-modal.js +2 -8
  104. package/build/template-part/edit/selection-modal.js.map +1 -1
  105. package/build/template-part/edit/utils/map-template-part-to-block-pattern.js +30 -0
  106. package/build/template-part/edit/utils/map-template-part-to-block-pattern.js.map +1 -0
  107. package/build/utils/caption.js +15 -5
  108. package/build/utils/caption.js.map +1 -1
  109. package/build/utils/get-transformed-metadata.js +57 -0
  110. package/build/utils/get-transformed-metadata.js.map +1 -0
  111. package/build/utils/hooks.js +55 -4
  112. package/build/utils/hooks.js.map +1 -1
  113. package/build/video/edit-common-settings.js.map +1 -1
  114. package/build/video/edit.js +7 -16
  115. package/build/video/edit.js.map +1 -1
  116. package/build/video/edit.native.js +2 -7
  117. package/build/video/edit.native.js.map +1 -1
  118. package/build-module/audio/edit.js +10 -20
  119. package/build-module/audio/edit.js.map +1 -1
  120. package/build-module/audio/edit.native.js.map +1 -1
  121. package/build-module/avatar/edit.js.map +1 -1
  122. package/build-module/block/deprecated.js +71 -11
  123. package/build-module/block/deprecated.js.map +1 -1
  124. package/build-module/block/edit.js +49 -24
  125. package/build-module/block/edit.js.map +1 -1
  126. package/build-module/button/edit.js +3 -3
  127. package/build-module/button/edit.js.map +1 -1
  128. package/build-module/buttons/edit.native.js.map +1 -1
  129. package/build-module/buttons/transforms.js +16 -2
  130. package/build-module/buttons/transforms.js.map +1 -1
  131. package/build-module/code/transforms.js +17 -6
  132. package/build-module/code/transforms.js.map +1 -1
  133. package/build-module/columns/edit.js +3 -2
  134. package/build-module/columns/edit.js.map +1 -1
  135. package/build-module/comment-author-avatar/edit.js +1 -1
  136. package/build-module/comment-author-avatar/edit.js.map +1 -1
  137. package/build-module/cover/edit/block-controls.js +15 -4
  138. package/build-module/cover/edit/block-controls.js.map +1 -1
  139. package/build-module/cover/edit/index.js.map +1 -1
  140. package/build-module/cover/edit/inspector-controls.js.map +1 -1
  141. package/build-module/cover/edit/resizable-cover-popover.js +1 -7
  142. package/build-module/cover/edit/resizable-cover-popover.js.map +1 -1
  143. package/build-module/cover/edit.native.js.map +1 -1
  144. package/build-module/file/deprecated.js.map +1 -1
  145. package/build-module/file/edit.js +7 -14
  146. package/build-module/file/edit.js.map +1 -1
  147. package/build-module/file/edit.native.js.map +1 -1
  148. package/build-module/file/save.js.map +1 -1
  149. package/build-module/form-input/edit.js +1 -1
  150. package/build-module/form-input/edit.js.map +1 -1
  151. package/build-module/gallery/edit.js.map +1 -1
  152. package/build-module/gallery/gallery.native.js.map +1 -1
  153. package/build-module/gallery/v1/edit.js.map +1 -1
  154. package/build-module/gallery/v1/gallery.native.js.map +1 -1
  155. package/build-module/heading/transforms.js +17 -4
  156. package/build-module/heading/transforms.js.map +1 -1
  157. package/build-module/image/edit.js +9 -5
  158. package/build-module/image/edit.js.map +1 -1
  159. package/build-module/image/edit.native.js.map +1 -1
  160. package/build-module/image/image.js +23 -9
  161. package/build-module/image/image.js.map +1 -1
  162. package/build-module/latest-posts/edit.native.js.map +1 -1
  163. package/build-module/list/ordered-list-settings.js +1 -1
  164. package/build-module/list/ordered-list-settings.js.map +1 -1
  165. package/build-module/list-item/edit.js +2 -4
  166. package/build-module/list-item/edit.js.map +1 -1
  167. package/build-module/list-item/edit.native.js.map +1 -1
  168. package/build-module/list-item/hooks/index.js +0 -1
  169. package/build-module/list-item/hooks/index.js.map +1 -1
  170. package/build-module/list-item/hooks/use-indent-list-item.js +1 -0
  171. package/build-module/list-item/hooks/use-indent-list-item.js.map +1 -1
  172. package/build-module/list-item/hooks/use-outdent-list-item.js +1 -0
  173. package/build-module/list-item/hooks/use-outdent-list-item.js.map +1 -1
  174. package/build-module/list-item/hooks/use-space.js +17 -8
  175. package/build-module/list-item/hooks/use-space.js.map +1 -1
  176. package/build-module/list-item/index.js +4 -1
  177. package/build-module/list-item/index.js.map +1 -1
  178. package/build-module/media-text/media-container.native.js +1 -1
  179. package/build-module/media-text/media-container.native.js.map +1 -1
  180. package/build-module/navigation/edit/index.js.map +1 -1
  181. package/build-module/navigation-link/link-ui.js.map +1 -1
  182. package/build-module/paragraph/edit.native.js.map +1 -1
  183. package/build-module/pattern/edit.js +11 -0
  184. package/build-module/pattern/edit.js.map +1 -1
  185. package/build-module/post-excerpt/edit.js.map +1 -1
  186. package/build-module/post-featured-image/dimension-controls.js.map +1 -1
  187. package/build-module/post-featured-image/edit.js +9 -12
  188. package/build-module/post-featured-image/edit.js.map +1 -1
  189. package/build-module/post-navigation-link/edit.js.map +1 -1
  190. package/build-module/post-title/edit.js +2 -2
  191. package/build-module/post-title/edit.js.map +1 -1
  192. package/build-module/query/edit/pattern-selection-modal.js.map +1 -1
  193. package/build-module/query/utils.js +7 -5
  194. package/build-module/query/utils.js.map +1 -1
  195. package/build-module/query-pagination-next/edit.js.map +1 -1
  196. package/build-module/query-pagination-previous/edit.js.map +1 -1
  197. package/build-module/quote/deprecated.js +112 -13
  198. package/build-module/quote/deprecated.js.map +1 -1
  199. package/build-module/quote/edit.js +5 -5
  200. package/build-module/quote/edit.js.map +1 -1
  201. package/build-module/quote/index.js +1 -1
  202. package/build-module/quote/index.js.map +1 -1
  203. package/build-module/quote/save.js +2 -2
  204. package/build-module/quote/save.js.map +1 -1
  205. package/build-module/read-more/edit.js.map +1 -1
  206. package/build-module/search/edit.js +1 -1
  207. package/build-module/search/edit.js.map +1 -1
  208. package/build-module/search/edit.native.js.map +1 -1
  209. package/build-module/site-logo/edit.js +7 -2
  210. package/build-module/site-logo/edit.js.map +1 -1
  211. package/build-module/site-title/{edit/index.js → edit.js} +1 -1
  212. package/build-module/site-title/edit.js.map +1 -0
  213. package/build-module/social-link/edit.js.map +1 -1
  214. package/build-module/social-links/edit.native.js.map +1 -1
  215. package/build-module/spacer/edit.js.map +1 -1
  216. package/build-module/table-of-contents/edit.js.map +1 -1
  217. package/build-module/template-part/edit/index.js +57 -5
  218. package/build-module/template-part/edit/index.js.map +1 -1
  219. package/build-module/template-part/edit/selection-modal.js +2 -8
  220. package/build-module/template-part/edit/selection-modal.js.map +1 -1
  221. package/build-module/template-part/edit/utils/map-template-part-to-block-pattern.js +24 -0
  222. package/build-module/template-part/edit/utils/map-template-part-to-block-pattern.js.map +1 -0
  223. package/build-module/utils/caption.js +13 -3
  224. package/build-module/utils/caption.js.map +1 -1
  225. package/build-module/utils/get-transformed-metadata.js +51 -0
  226. package/build-module/utils/get-transformed-metadata.js.map +1 -0
  227. package/build-module/utils/hooks.js +54 -3
  228. package/build-module/utils/hooks.js.map +1 -1
  229. package/build-module/video/edit-common-settings.js.map +1 -1
  230. package/build-module/video/edit.js +10 -19
  231. package/build-module/video/edit.js.map +1 -1
  232. package/build-module/video/edit.native.js +2 -7
  233. package/build-module/video/edit.native.js.map +1 -1
  234. package/build-style/common-rtl.css +1 -0
  235. package/build-style/common.css +1 -0
  236. package/build-style/cover/style-rtl.css +2 -1
  237. package/build-style/cover/style.css +2 -1
  238. package/build-style/editor-rtl.css +4 -1
  239. package/build-style/editor.css +4 -1
  240. package/build-style/group/editor-rtl.css +1 -1
  241. package/build-style/group/editor.css +1 -1
  242. package/build-style/image/editor-rtl.css +3 -0
  243. package/build-style/image/editor.css +3 -0
  244. package/build-style/search/style-rtl.css +2 -0
  245. package/build-style/search/style.css +2 -0
  246. package/build-style/style-rtl.css +4 -1
  247. package/build-style/style.css +4 -1
  248. package/package.json +34 -34
  249. package/src/audio/edit.js +9 -19
  250. package/src/audio/edit.native.js +3 -3
  251. package/src/avatar/edit.js +1 -1
  252. package/src/block/deprecated.js +76 -11
  253. package/src/block/edit.js +64 -19
  254. package/src/block/index.php +23 -12
  255. package/src/button/edit.js +4 -3
  256. package/src/buttons/edit.native.js +1 -1
  257. package/src/buttons/transforms.js +14 -4
  258. package/src/calendar/index.php +5 -0
  259. package/src/code/transforms.js +20 -5
  260. package/src/columns/edit.js +3 -2
  261. package/src/comment-author-avatar/edit.js +1 -1
  262. package/src/comments/index.php +2 -0
  263. package/src/cover/edit/block-controls.js +16 -2
  264. package/src/cover/edit/index.js +2 -2
  265. package/src/cover/edit/inspector-controls.js +1 -1
  266. package/src/cover/edit/resizable-cover-popover.js +1 -6
  267. package/src/cover/edit.native.js +1 -1
  268. package/src/cover/style.scss +3 -2
  269. package/src/file/deprecated.js +3 -3
  270. package/src/file/edit.js +8 -15
  271. package/src/file/edit.native.js +4 -4
  272. package/src/file/save.js +1 -1
  273. package/src/footnotes/index.php +1 -1
  274. package/src/form-input/edit.js +1 -1
  275. package/src/gallery/edit.js +3 -3
  276. package/src/gallery/gallery.native.js +1 -1
  277. package/src/gallery/test/index.native.js +1 -1
  278. package/src/gallery/v1/edit.js +2 -2
  279. package/src/gallery/v1/gallery.native.js +1 -1
  280. package/src/group/editor.scss +1 -1
  281. package/src/heading/transforms.js +27 -8
  282. package/src/image/edit.js +13 -5
  283. package/src/image/edit.native.js +1 -1
  284. package/src/image/editor.scss +6 -0
  285. package/src/image/image.js +34 -22
  286. package/src/latest-posts/edit.native.js +1 -1
  287. package/src/list/ordered-list-settings.js +1 -1
  288. package/src/list-item/edit.js +1 -2
  289. package/src/list-item/edit.native.js +1 -1
  290. package/src/list-item/hooks/index.js +0 -1
  291. package/src/list-item/hooks/use-indent-list-item.js +2 -0
  292. package/src/list-item/hooks/use-outdent-list-item.js +2 -0
  293. package/src/list-item/hooks/use-space.js +16 -9
  294. package/src/list-item/index.js +3 -0
  295. package/src/media-text/media-container.native.js +5 -3
  296. package/src/media-text/test/edit.native.js +58 -0
  297. package/src/missing/test/edit-integration.native.js +2 -1
  298. package/src/navigation/edit/index.js +1 -1
  299. package/src/navigation/edit/test/navigation-menu-selector.js +3 -3
  300. package/src/navigation/index.php +26 -17
  301. package/src/navigation-link/link-ui.js +2 -2
  302. package/src/paragraph/edit.native.js +1 -1
  303. package/src/paragraph/test/edit.native.js +36 -0
  304. package/src/pattern/edit.js +14 -0
  305. package/src/post-excerpt/edit.js +1 -1
  306. package/src/post-featured-image/dimension-controls.js +4 -4
  307. package/src/post-featured-image/edit.js +10 -12
  308. package/src/post-navigation-link/edit.js +1 -1
  309. package/src/post-template/index.php +2 -0
  310. package/src/post-title/edit.js +49 -43
  311. package/src/query/edit/pattern-selection-modal.js +1 -1
  312. package/src/query/utils.js +6 -4
  313. package/src/query-pagination-next/edit.js +1 -1
  314. package/src/query-pagination-previous/edit.js +1 -1
  315. package/src/quote/block.json +1 -1
  316. package/src/quote/deprecated.js +110 -15
  317. package/src/quote/edit.js +5 -5
  318. package/src/quote/save.js +2 -2
  319. package/src/quote/test/__snapshots__/transforms.native.js.snap +2 -2
  320. package/src/read-more/edit.js +1 -1
  321. package/src/search/edit.js +1 -1
  322. package/src/search/edit.native.js +4 -4
  323. package/src/search/index.php +1 -1
  324. package/src/search/style.scss +2 -0
  325. package/src/site-logo/edit.js +11 -6
  326. package/src/social-link/edit.js +1 -1
  327. package/src/social-links/edit.native.js +1 -1
  328. package/src/spacer/edit.js +1 -1
  329. package/src/table-of-contents/edit.js +1 -1
  330. package/src/template-part/edit/index.js +91 -4
  331. package/src/template-part/edit/selection-modal.js +4 -8
  332. package/src/template-part/edit/utils/map-template-part-to-block-pattern.js +23 -0
  333. package/src/utils/caption.js +10 -1
  334. package/src/utils/get-transformed-metadata.js +65 -0
  335. package/src/utils/hooks.js +53 -3
  336. package/src/video/edit-common-settings.js +1 -1
  337. package/src/video/edit.js +10 -18
  338. package/src/video/edit.native.js +5 -8
  339. package/src/video/test/edit.native.js +0 -14
  340. package/build/list-item/hooks/use-copy.js +0 -39
  341. package/build/list-item/hooks/use-copy.js.map +0 -1
  342. package/build/site-title/edit/index.js.map +0 -1
  343. package/build-module/list-item/hooks/use-copy.js +0 -32
  344. package/build-module/list-item/hooks/use-copy.js.map +0 -1
  345. package/build-module/site-title/edit/index.js.map +0 -1
  346. package/src/list-item/hooks/use-copy.js +0 -38
  347. /package/src/site-title/{edit/index.js → edit.js} +0 -0
@@ -7,7 +7,7 @@ import classnames from 'classnames';
7
7
  * WordPress dependencies
8
8
  */
9
9
  import { createBlock, parseWithAttributeSchema } from '@wordpress/blocks';
10
- import { RichText, useBlockProps } from '@wordpress/block-editor';
10
+ import { InnerBlocks, RichText, useBlockProps } from '@wordpress/block-editor';
11
11
 
12
12
  export const migrateToQuoteV2 = ( attributes ) => {
13
13
  const { value, ...restAttributes } = attributes;
@@ -34,6 +34,102 @@ export const migrateToQuoteV2 = ( attributes ) => {
34
34
  ];
35
35
  };
36
36
 
37
+ const TEXT_ALIGN_OPTIONS = [ 'left', 'right', 'center' ];
38
+
39
+ // Migrate existing text alignment settings to the renamed attribute.
40
+ const migrateTextAlign = ( attributes, innerBlocks ) => {
41
+ const { align, ...rest } = attributes;
42
+ // Check if there are valid alignments stored in the old attribute
43
+ // and assign them to the new attribute name.
44
+ const migratedAttributes = TEXT_ALIGN_OPTIONS.includes( align )
45
+ ? { ...rest, textAlign: align }
46
+ : attributes;
47
+
48
+ return [ migratedAttributes, innerBlocks ];
49
+ };
50
+
51
+ // Migrate the v2 blocks with style === `2`;
52
+ const migrateLargeStyle = ( attributes, innerBlocks ) => {
53
+ return [
54
+ {
55
+ ...attributes,
56
+ className: attributes.className
57
+ ? attributes.className + ' is-style-large'
58
+ : 'is-style-large',
59
+ },
60
+ innerBlocks,
61
+ ];
62
+ };
63
+
64
+ // Version before the 'align' attribute was replaced with 'textAlign'.
65
+ const v4 = {
66
+ attributes: {
67
+ value: {
68
+ type: 'string',
69
+ source: 'html',
70
+ selector: 'blockquote',
71
+ multiline: 'p',
72
+ default: '',
73
+ __experimentalRole: 'content',
74
+ },
75
+ citation: {
76
+ type: 'string',
77
+ source: 'html',
78
+ selector: 'cite',
79
+ default: '',
80
+ __experimentalRole: 'content',
81
+ },
82
+ align: {
83
+ type: 'string',
84
+ },
85
+ },
86
+ supports: {
87
+ anchor: true,
88
+ html: false,
89
+ __experimentalOnEnter: true,
90
+ __experimentalOnMerge: true,
91
+ typography: {
92
+ fontSize: true,
93
+ lineHeight: true,
94
+ __experimentalFontFamily: true,
95
+ __experimentalFontWeight: true,
96
+ __experimentalFontStyle: true,
97
+ __experimentalTextTransform: true,
98
+ __experimentalTextDecoration: true,
99
+ __experimentalLetterSpacing: true,
100
+ __experimentalDefaultControls: {
101
+ fontSize: true,
102
+ fontAppearance: true,
103
+ },
104
+ },
105
+ color: {
106
+ gradients: true,
107
+ heading: true,
108
+ link: true,
109
+ __experimentalDefaultControls: {
110
+ background: true,
111
+ text: true,
112
+ },
113
+ },
114
+ },
115
+ isEligible: ( { align } ) => TEXT_ALIGN_OPTIONS.includes( align ),
116
+ save( { attributes } ) {
117
+ const { align, citation } = attributes;
118
+ const className = classnames( {
119
+ [ `has-text-align-${ align }` ]: align,
120
+ } );
121
+ return (
122
+ <blockquote { ...useBlockProps.save( { className } ) }>
123
+ <InnerBlocks.Content />
124
+ { ! RichText.isEmpty( citation ) && (
125
+ <RichText.Content tagName="cite" value={ citation } />
126
+ ) }
127
+ </blockquote>
128
+ );
129
+ },
130
+ migrate: migrateTextAlign,
131
+ };
132
+
37
133
  const v3 = {
38
134
  attributes: {
39
135
  value: {
@@ -87,7 +183,9 @@ const v3 = {
87
183
  </blockquote>
88
184
  );
89
185
  },
90
- migrate: migrateToQuoteV2,
186
+ migrate( attributes ) {
187
+ return migrateTextAlign( ...migrateToQuoteV2( attributes ) );
188
+ },
91
189
  };
92
190
 
93
191
  const v2 = {
@@ -109,7 +207,9 @@ const v2 = {
109
207
  type: 'string',
110
208
  },
111
209
  },
112
- migrate: migrateToQuoteV2,
210
+ migrate( attributes ) {
211
+ return migrateTextAlign( ...migrateToQuoteV2( attributes ) );
212
+ },
113
213
  save( { attributes } ) {
114
214
  const { align, value, citation } = attributes;
115
215
 
@@ -151,15 +251,12 @@ const v1 = {
151
251
  migrate( attributes ) {
152
252
  if ( attributes.style === 2 ) {
153
253
  const { style, ...restAttributes } = attributes;
154
- return migrateToQuoteV2( {
155
- ...restAttributes,
156
- className: attributes.className
157
- ? attributes.className + ' is-style-large'
158
- : 'is-style-large',
159
- } );
254
+ return migrateTextAlign(
255
+ ...migrateLargeStyle( ...migrateToQuoteV2( restAttributes ) )
256
+ );
160
257
  }
161
258
 
162
- return migrateToQuoteV2( attributes );
259
+ return migrateTextAlign( ...migrateToQuoteV2( attributes ) );
163
260
  },
164
261
 
165
262
  save( { attributes } ) {
@@ -206,12 +303,10 @@ const v0 = {
206
303
  migrate( attributes ) {
207
304
  if ( ! isNaN( parseInt( attributes.style ) ) ) {
208
305
  const { style, ...restAttributes } = attributes;
209
- return migrateToQuoteV2( {
210
- ...restAttributes,
211
- } );
306
+ return migrateTextAlign( ...migrateToQuoteV2( restAttributes ) );
212
307
  }
213
308
 
214
- return migrateToQuoteV2( attributes );
309
+ return migrateTextAlign( ...migrateToQuoteV2( attributes ) );
215
310
  },
216
311
 
217
312
  save( { attributes } ) {
@@ -239,4 +334,4 @@ const v0 = {
239
334
  *
240
335
  * See block-deprecation.md
241
336
  */
242
- export default [ v3, v2, v1, v0 ];
337
+ export default [ v4, v3, v2, v1, v0 ];
package/src/quote/edit.js CHANGED
@@ -74,7 +74,7 @@ export default function QuoteEdit( {
74
74
  className,
75
75
  style,
76
76
  } ) {
77
- const { align, citation } = attributes;
77
+ const { textAlign, citation } = attributes;
78
78
 
79
79
  useMigrateOnLoad( attributes, clientId );
80
80
 
@@ -86,7 +86,7 @@ export default function QuoteEdit( {
86
86
 
87
87
  const blockProps = useBlockProps( {
88
88
  className: classNames( className, {
89
- [ `has-text-align-${ align }` ]: align,
89
+ [ `has-text-align-${ textAlign }` ]: textAlign,
90
90
  } ),
91
91
  ...( ! isWebPlatform && { style } ),
92
92
  } );
@@ -100,9 +100,9 @@ export default function QuoteEdit( {
100
100
  <>
101
101
  <BlockControls group="block">
102
102
  <AlignmentControl
103
- value={ align }
103
+ value={ textAlign }
104
104
  onChange={ ( nextAlign ) => {
105
- setAttributes( { align: nextAlign } );
105
+ setAttributes( { textAlign: nextAlign } );
106
106
  } }
107
107
  />
108
108
  </BlockControls>
@@ -132,7 +132,7 @@ export default function QuoteEdit( {
132
132
  createBlock( getDefaultBlockName() )
133
133
  )
134
134
  }
135
- { ...( ! isWebPlatform ? { textAlign: align } : {} ) }
135
+ { ...( ! isWebPlatform ? { textAlign } : {} ) }
136
136
  />
137
137
  ) }
138
138
  </BlockQuotation>
package/src/quote/save.js CHANGED
@@ -9,10 +9,10 @@ import classNames from 'classnames';
9
9
  import { InnerBlocks, RichText, useBlockProps } from '@wordpress/block-editor';
10
10
 
11
11
  export default function save( { attributes } ) {
12
- const { align, citation } = attributes;
12
+ const { textAlign, citation } = attributes;
13
13
 
14
14
  const className = classNames( {
15
- [ `has-text-align-${ align }` ]: align,
15
+ [ `has-text-align-${ textAlign }` ]: textAlign,
16
16
  } );
17
17
 
18
18
  return (
@@ -3,7 +3,7 @@
3
3
  exports[`Quote block transforms to Columns block 1`] = `
4
4
  "<!-- wp:columns -->
5
5
  <div class="wp-block-columns"><!-- wp:column {"width":"100%"} -->
6
- <div class="wp-block-column" style="flex-basis:100%"><!-- wp:quote {"align":"left","className":"is-style-large"} -->
6
+ <div class="wp-block-column" style="flex-basis:100%"><!-- wp:quote {"textAlign":"left","className":"is-style-large"} -->
7
7
  <blockquote class="wp-block-quote has-text-align-left is-style-large"><!-- wp:paragraph -->
8
8
  <p>"This will make running your own blog a viable alternative again."</p>
9
9
  <!-- /wp:paragraph --><cite>— <a href="https://twitter.com/azumbrunnen_/status/1019347243084800005">Adrian Zumbrunnen</a></cite></blockquote>
@@ -14,7 +14,7 @@ exports[`Quote block transforms to Columns block 1`] = `
14
14
 
15
15
  exports[`Quote block transforms to Group block 1`] = `
16
16
  "<!-- wp:group {"layout":{"type":"constrained"}} -->
17
- <div class="wp-block-group"><!-- wp:quote {"align":"left","className":"is-style-large"} -->
17
+ <div class="wp-block-group"><!-- wp:quote {"textAlign":"left","className":"is-style-large"} -->
18
18
  <blockquote class="wp-block-quote has-text-align-left is-style-large"><!-- wp:paragraph -->
19
19
  <p>"This will make running your own blog a viable alternative again."</p>
20
20
  <!-- /wp:paragraph --><cite>— <a href="https://twitter.com/azumbrunnen_/status/1019347243084800005">Adrian Zumbrunnen</a></cite></blockquote>
@@ -43,7 +43,7 @@ export default function ReadMore( {
43
43
  __unstableOnSplitAtEnd={ () =>
44
44
  insertBlocksAfter( createBlock( getDefaultBlockName() ) )
45
45
  }
46
- withoutInteractiveFormatting={ true }
46
+ withoutInteractiveFormatting
47
47
  { ...blockProps }
48
48
  />
49
49
  </>
@@ -400,7 +400,7 @@ export default function SearchEdit( {
400
400
  </BlockControls>
401
401
 
402
402
  <InspectorControls>
403
- <PanelBody title={ __( 'Display Settings' ) }>
403
+ <PanelBody title={ __( 'Settings' ) }>
404
404
  <BaseControl
405
405
  label={ __( 'Width' ) }
406
406
  id={ unitControlInputId }
@@ -192,7 +192,7 @@ export default function SearchEdit( {
192
192
  } );
193
193
  } }
194
194
  options={ BUTTON_OPTIONS }
195
- hideCancelButton={ true }
195
+ hideCancelButton
196
196
  />
197
197
  { buttonPosition !== 'no-button' && (
198
198
  <ToggleControl
@@ -294,7 +294,7 @@ export default function SearchEdit( {
294
294
  return (
295
295
  <View
296
296
  style={ styles.searchInputContainer }
297
- accessible={ true }
297
+ accessible
298
298
  accessibilityRole="none"
299
299
  accessibilityHint={
300
300
  isScreenReaderEnabled
@@ -383,7 +383,7 @@ export default function SearchEdit( {
383
383
 
384
384
  { ! buttonUseIcon && (
385
385
  <View
386
- accessible={ true }
386
+ accessible
387
387
  accessibilityRole="none"
388
388
  accessibilityHint={
389
389
  isScreenReaderEnabled
@@ -438,7 +438,7 @@ export default function SearchEdit( {
438
438
 
439
439
  { showLabel && (
440
440
  <View
441
- accessible={ true }
441
+ accessible
442
442
  accessibilityRole="none"
443
443
  accessibilityHint={
444
444
  isScreenReaderEnabled
@@ -179,7 +179,7 @@ function render_block_core_search( $attributes ) {
179
179
  if ( $is_expandable_searchfield ) {
180
180
  $aria_label_expanded = __( 'Submit Search' );
181
181
  $aria_label_collapsed = __( 'Expand search field' );
182
- $form_context = data_wp_context(
182
+ $form_context = wp_interactivity_data_wp_context(
183
183
  array(
184
184
  'isSearchInputVisible' => $open_by_default,
185
185
  'inputId' => $input_id,
@@ -12,6 +12,8 @@ $button-spacing-y: math.div($grid-unit-15, 2); // 6px
12
12
  svg {
13
13
  min-width: $grid-unit-30;
14
14
  min-height: $grid-unit-30;
15
+ width: 1.25em;
16
+ height: 1.25em;
15
17
  fill: currentColor;
16
18
  vertical-align: text-bottom;
17
19
  }
@@ -268,6 +268,14 @@ const SiteLogo = ( {
268
268
  </ResizableBox>
269
269
  );
270
270
 
271
+ // Support the previous location for the Site Icon settings. To be removed
272
+ // when the required WP core version for Gutenberg is >= 6.5.0.
273
+ const shouldUseNewUrl = ! window?.__experimentalUseCustomizerSiteLogoUrl;
274
+
275
+ const siteIconSettingsUrl = shouldUseNewUrl
276
+ ? siteUrl + '/wp-admin/options-general.php'
277
+ : siteUrl + '/wp-admin/customize.php?autofocus[section]=title_tagline';
278
+
271
279
  const syncSiteIconHelpText = createInterpolateElement(
272
280
  __(
273
281
  'Site Icons are what you see in browser tabs, bookmark bars, and within the WordPress mobile apps. To use a custom icon that is different from your site logo, use the <a>Site Icon settings</a>.'
@@ -276,10 +284,7 @@ const SiteLogo = ( {
276
284
  a: (
277
285
  // eslint-disable-next-line jsx-a11y/anchor-has-content
278
286
  <a
279
- href={
280
- siteUrl +
281
- '/wp-admin/customize.php?autofocus[section]=title_tagline'
282
- }
287
+ href={ siteIconSettingsUrl }
283
288
  target="_blank"
284
289
  rel="noopener noreferrer"
285
290
  />
@@ -331,7 +336,7 @@ const SiteLogo = ( {
331
336
  <>
332
337
  <ToggleControl
333
338
  __nextHasNoMarginBottom
334
- label={ __( 'Use as site icon' ) }
339
+ label={ __( 'Use as Site Icon' ) }
335
340
  onChange={ ( value ) => {
336
341
  setAttributes( { shouldSyncIcon: value } );
337
342
  setIcon( value ? logoId : undefined );
@@ -569,7 +574,7 @@ export default function LogoEdit( {
569
574
  <Placeholder
570
575
  className={ placeholderClassName }
571
576
  preview={ logoImage }
572
- withIllustration={ true }
577
+ withIllustration
573
578
  style={ {
574
579
  width,
575
580
  } }
@@ -59,7 +59,7 @@ const SocialLinkURLPopover = ( {
59
59
  setAttributes( { url: nextURL } )
60
60
  }
61
61
  placeholder={ __( 'Enter address' ) }
62
- disableSuggestions={ true }
62
+ disableSuggestions
63
63
  onKeyDown={ ( event ) => {
64
64
  if (
65
65
  !! url ||
@@ -53,7 +53,7 @@ function SocialLinksEdit( {
53
53
 
54
54
  const renderFooterAppender = useRef( () => (
55
55
  <View style={ styles.footerAppenderContainer }>
56
- <InnerBlocks.ButtonBlockAppender isFloating={ true } />
56
+ <InnerBlocks.ButtonBlockAppender isFloating />
57
57
  </View>
58
58
  ) );
59
59
 
@@ -67,7 +67,7 @@ const ResizableSpacer = ( {
67
67
  onResizeStop( `${ nextVal }px` );
68
68
  setIsResizing( false );
69
69
  } }
70
- __experimentalShowTooltip={ true }
70
+ __experimentalShowTooltip
71
71
  __experimentalTooltipProps={ {
72
72
  axis: orientation === 'horizontal' ? 'x' : 'y',
73
73
  position: 'corner',
@@ -160,7 +160,7 @@ export default function TableOfContentsEdit( {
160
160
  <ol>
161
161
  <TableOfContentsList
162
162
  nestedHeadingList={ headingTree }
163
- disableLinkActivation={ true }
163
+ disableLinkActivation
164
164
  onClick={ showRedirectionPreventedNotice }
165
165
  />
166
166
  </ol>
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useSelect } from '@wordpress/data';
4
+ import { useSelect, useDispatch } from '@wordpress/data';
5
5
  import {
6
6
  BlockSettingsMenuControls,
7
7
  useBlockProps,
@@ -10,11 +10,14 @@ import {
10
10
  RecursionProvider,
11
11
  useHasRecursion,
12
12
  InspectorControls,
13
+ __experimentalBlockPatternsList as BlockPatternsList,
13
14
  } from '@wordpress/block-editor';
14
- import { Spinner, Modal, MenuItem } from '@wordpress/components';
15
+ import { PanelBody, Spinner, Modal, MenuItem } from '@wordpress/components';
16
+ import { useAsyncList } from '@wordpress/compose';
15
17
  import { __, sprintf } from '@wordpress/i18n';
16
18
  import { store as coreStore } from '@wordpress/core-data';
17
19
  import { useState } from '@wordpress/element';
20
+ import { store as noticesStore } from '@wordpress/notices';
18
21
 
19
22
  /**
20
23
  * Internal dependencies
@@ -24,10 +27,12 @@ import TemplatePartSelectionModal from './selection-modal';
24
27
  import { TemplatePartAdvancedControls } from './advanced-controls';
25
28
  import TemplatePartInnerBlocks from './inner-blocks';
26
29
  import { createTemplatePartId } from './utils/create-template-part-id';
30
+ import { mapTemplatePartToBlockPattern } from './utils/map-template-part-to-block-pattern';
27
31
  import {
28
32
  useAlternativeBlockPatterns,
29
33
  useAlternativeTemplateParts,
30
34
  useTemplatePartArea,
35
+ useCreateTemplatePartFromBlocks,
31
36
  } from './utils/hooks';
32
37
 
33
38
  function ReplaceButton( {
@@ -43,7 +48,6 @@ function ReplaceButton( {
43
48
  templatePartId
44
49
  );
45
50
  const blockPatterns = useAlternativeBlockPatterns( area, clientId );
46
-
47
51
  const hasReplacements = !! templateParts.length || !! blockPatterns.length;
48
52
  const canReplace =
49
53
  isEntityAvailable &&
@@ -67,11 +71,29 @@ function ReplaceButton( {
67
71
  );
68
72
  }
69
73
 
74
+ function TemplatesList( { availableTemplates, onSelect } ) {
75
+ const shownTemplates = useAsyncList( availableTemplates );
76
+
77
+ if ( ! availableTemplates ) {
78
+ return null;
79
+ }
80
+
81
+ return (
82
+ <BlockPatternsList
83
+ label={ __( 'Templates' ) }
84
+ blockPatterns={ availableTemplates }
85
+ shownPatterns={ shownTemplates }
86
+ onClickPattern={ onSelect }
87
+ />
88
+ );
89
+ }
90
+
70
91
  export default function TemplatePartEdit( {
71
92
  attributes,
72
93
  setAttributes,
73
94
  clientId,
74
95
  } ) {
96
+ const { createSuccessNotice } = useDispatch( noticesStore );
75
97
  const currentTheme = useSelect(
76
98
  ( select ) => select( coreStore ).getCurrentTheme()?.stylesheet,
77
99
  []
@@ -117,12 +139,28 @@ export default function TemplatePartEdit( {
117
139
  [ templatePartId, attributes.area, clientId ]
118
140
  );
119
141
 
142
+ const { templateParts } = useAlternativeTemplateParts(
143
+ area,
144
+ templatePartId
145
+ );
146
+ const blockPatterns = useAlternativeBlockPatterns( area, clientId );
147
+ const hasReplacements = !! templateParts.length || !! blockPatterns.length;
120
148
  const areaObject = useTemplatePartArea( area );
121
149
  const blockProps = useBlockProps();
122
150
  const isPlaceholder = ! slug;
123
151
  const isEntityAvailable = ! isPlaceholder && ! isMissing && isResolved;
124
152
  const TagName = tagName || areaObject.tagName;
125
153
 
154
+ const canReplace =
155
+ isEntityAvailable &&
156
+ hasReplacements &&
157
+ ( area === 'header' || area === 'footer' );
158
+
159
+ const createFromBlocks = useCreateTemplatePartFromBlocks(
160
+ area,
161
+ setAttributes
162
+ );
163
+
126
164
  // We don't want to render a missing state if we have any inner blocks.
127
165
  // A new template part is automatically created if we have any inner blocks but no entity.
128
166
  if (
@@ -154,6 +192,28 @@ export default function TemplatePartEdit( {
154
192
  );
155
193
  }
156
194
 
195
+ const partsAsPatterns = templateParts.map( ( templatePart ) =>
196
+ mapTemplatePartToBlockPattern( templatePart )
197
+ );
198
+
199
+ const onTemplatePartSelect = ( templatePart ) => {
200
+ setAttributes( {
201
+ slug: templatePart.slug,
202
+ theme: templatePart.theme,
203
+ area: undefined,
204
+ } );
205
+ createSuccessNotice(
206
+ sprintf(
207
+ /* translators: %s: template part title. */
208
+ __( 'Template Part "%s" replaceed.' ),
209
+ templatePart.title?.rendered || templatePart.slug
210
+ ),
211
+ {
212
+ type: 'snackbar',
213
+ }
214
+ );
215
+ };
216
+
157
217
  return (
158
218
  <>
159
219
  <RecursionProvider uniqueId={ templatePartId }>
@@ -207,6 +267,33 @@ export default function TemplatePartEdit( {
207
267
  );
208
268
  } }
209
269
  </BlockSettingsMenuControls>
270
+
271
+ { canReplace &&
272
+ ( partsAsPatterns.length > 0 ||
273
+ blockPatterns.length > 0 ) && (
274
+ <InspectorControls>
275
+ <PanelBody title={ __( 'Replace' ) }>
276
+ <TemplatesList
277
+ availableTemplates={ partsAsPatterns }
278
+ onSelect={ ( pattern ) => {
279
+ onTemplatePartSelect(
280
+ pattern.templatePart
281
+ );
282
+ } }
283
+ />
284
+ <TemplatesList
285
+ availableTemplates={ blockPatterns }
286
+ onSelect={ ( pattern, blocks ) => {
287
+ createFromBlocks(
288
+ blocks,
289
+ pattern.title
290
+ );
291
+ } }
292
+ />
293
+ </PanelBody>
294
+ </InspectorControls>
295
+ ) }
296
+
210
297
  { isEntityAvailable && (
211
298
  <TemplatePartInnerBlocks
212
299
  tagName={ TagName }
@@ -233,7 +320,7 @@ export default function TemplatePartEdit( {
233
320
  onRequestClose={ () =>
234
321
  setIsTemplatePartSelectionOpen( false )
235
322
  }
236
- isFullScreen={ true }
323
+ isFullScreen
237
324
  >
238
325
  <TemplatePartSelectionModal
239
326
  templatePartId={ templatePartId }
@@ -5,7 +5,6 @@ import { useMemo, useState } from '@wordpress/element';
5
5
  import { __, sprintf } from '@wordpress/i18n';
6
6
  import { store as noticesStore } from '@wordpress/notices';
7
7
  import { useDispatch } from '@wordpress/data';
8
- import { parse } from '@wordpress/blocks';
9
8
  import { useAsyncList } from '@wordpress/compose';
10
9
  import { __experimentalBlockPatternsList as BlockPatternsList } from '@wordpress/block-editor';
11
10
  import {
@@ -21,7 +20,7 @@ import {
21
20
  useAlternativeTemplateParts,
22
21
  useCreateTemplatePartFromBlocks,
23
22
  } from './utils/hooks';
24
- import { createTemplatePartId } from './utils/create-template-part-id';
23
+ import { mapTemplatePartToBlockPattern } from './utils/map-template-part-to-block-pattern';
25
24
  import { searchPatterns } from '../../utils/search-patterns';
26
25
 
27
26
  export default function TemplatePartSelectionModal( {
@@ -39,12 +38,9 @@ export default function TemplatePartSelectionModal( {
39
38
  );
40
39
  // We can map template parts to block patters to reuse the BlockPatternsList UI
41
40
  const filteredTemplateParts = useMemo( () => {
42
- const partsAsPatterns = templateParts.map( ( templatePart ) => ( {
43
- name: createTemplatePartId( templatePart.theme, templatePart.slug ),
44
- title: templatePart.title.rendered,
45
- blocks: parse( templatePart.content.raw ),
46
- templatePart,
47
- } ) );
41
+ const partsAsPatterns = templateParts.map( ( templatePart ) =>
42
+ mapTemplatePartToBlockPattern( templatePart )
43
+ );
48
44
 
49
45
  return searchPatterns( partsAsPatterns, searchValue );
50
46
  }, [ templateParts, searchValue ] );
@@ -0,0 +1,23 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { parse } from '@wordpress/blocks';
5
+
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { createTemplatePartId } from './create-template-part-id';
10
+
11
+ /**
12
+ * This maps the properties of a template part to those of a block pattern.
13
+ * @param {Object} templatePart
14
+ * @return {Object} The template part in the shape of block pattern.
15
+ */
16
+ export function mapTemplatePartToBlockPattern( templatePart ) {
17
+ return {
18
+ name: createTemplatePartId( templatePart.theme, templatePart.slug ),
19
+ title: templatePart.title.rendered,
20
+ blocks: parse( templatePart.content.raw ),
21
+ templatePart,
22
+ };
23
+ }
@@ -10,14 +10,21 @@ import { useState, useEffect, useCallback } from '@wordpress/element';
10
10
  import { usePrevious } from '@wordpress/compose';
11
11
  import { __ } from '@wordpress/i18n';
12
12
  import {
13
- RichText,
14
13
  BlockControls,
15
14
  __experimentalGetElementClassName,
15
+ privateApis as blockEditorPrivateApis,
16
16
  } from '@wordpress/block-editor';
17
17
  import { ToolbarButton } from '@wordpress/components';
18
18
  import { caption as captionIcon } from '@wordpress/icons';
19
19
  import { createBlock, getDefaultBlockName } from '@wordpress/blocks';
20
20
 
21
+ /**
22
+ * Internal dependencies
23
+ */
24
+ import { unlock } from '../lock-unlock';
25
+
26
+ const { PrivateRichText: RichText } = unlock( blockEditorPrivateApis );
27
+
21
28
  export function Caption( {
22
29
  key = 'caption',
23
30
  attributes,
@@ -28,6 +35,7 @@ export function Caption( {
28
35
  label = __( 'Caption text' ),
29
36
  showToolbarButton = true,
30
37
  className,
38
+ disableEditing,
31
39
  } ) {
32
40
  const caption = attributes[ key ];
33
41
  const prevCaption = usePrevious( caption );
@@ -101,6 +109,7 @@ export function Caption( {
101
109
  createBlock( getDefaultBlockName() )
102
110
  )
103
111
  }
112
+ disableEditing={ disableEditing }
104
113
  />
105
114
  ) }
106
115
  </>