@wordpress/block-library 7.10.0 → 7.11.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 (374) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/button/edit.js +2 -1
  3. package/build/button/edit.js.map +1 -1
  4. package/build/buttons/edit.js +1 -1
  5. package/build/buttons/edit.js.map +1 -1
  6. package/build/columns/edit.native.js +1 -1
  7. package/build/columns/edit.native.js.map +1 -1
  8. package/build/comments/edit/comments-legacy.js +73 -0
  9. package/build/comments/edit/comments-legacy.js.map +1 -0
  10. package/build/comments/{edit.js → edit/index.js} +17 -38
  11. package/build/comments/edit/index.js.map +1 -0
  12. package/build/comments/edit/placeholder.js +117 -0
  13. package/build/comments/edit/placeholder.js.map +1 -0
  14. package/build/comments/edit/template.js +39 -0
  15. package/build/comments/edit/template.js.map +1 -0
  16. package/build/comments/index.js +6 -1
  17. package/build/comments/index.js.map +1 -1
  18. package/build/comments/save.js +12 -4
  19. package/build/comments/save.js.map +1 -1
  20. package/build/cover/transforms.js +3 -2
  21. package/build/cover/transforms.js.map +1 -1
  22. package/build/embed/embed-placeholder.native.js +1 -3
  23. package/build/embed/embed-placeholder.native.js.map +1 -1
  24. package/build/gallery/edit.js +2 -2
  25. package/build/gallery/edit.js.map +1 -1
  26. package/build/gallery/use-get-media.native.js +59 -0
  27. package/build/gallery/use-get-media.native.js.map +1 -0
  28. package/build/group/index.js +1 -0
  29. package/build/group/index.js.map +1 -1
  30. package/build/group/variations.js +1 -1
  31. package/build/group/variations.js.map +1 -1
  32. package/build/image/deprecated.js +77 -9
  33. package/build/image/deprecated.js.map +1 -1
  34. package/build/image/edit.js +3 -1
  35. package/build/image/edit.js.map +1 -1
  36. package/build/image/edit.native.js +18 -8
  37. package/build/image/edit.native.js.map +1 -1
  38. package/build/image/image.js +27 -20
  39. package/build/image/image.js.map +1 -1
  40. package/build/image/index.js +7 -1
  41. package/build/image/index.js.map +1 -1
  42. package/build/image/save.js +8 -2
  43. package/build/image/save.js.map +1 -1
  44. package/build/index.js +1 -3
  45. package/build/index.js.map +1 -1
  46. package/build/index.native.js +3 -13
  47. package/build/index.native.js.map +1 -1
  48. package/build/list/transforms.js +4 -63
  49. package/build/list/transforms.js.map +1 -1
  50. package/build/list/v2/transforms.js +0 -27
  51. package/build/list/v2/transforms.js.map +1 -1
  52. package/build/list-item/edit.js +14 -9
  53. package/build/list-item/edit.js.map +1 -1
  54. package/build/list-item/hooks/index.js +8 -8
  55. package/build/list-item/hooks/index.js.map +1 -1
  56. package/build/list-item/hooks/use-merge.js +174 -0
  57. package/build/list-item/hooks/use-merge.js.map +1 -0
  58. package/build/list-item/hooks/use-outdent-list-item.js +86 -50
  59. package/build/list-item/hooks/use-outdent-list-item.js.map +1 -1
  60. package/build/list-item/utils.js +125 -1
  61. package/build/list-item/utils.js.map +1 -1
  62. package/build/media-text/deprecated.js +134 -7
  63. package/build/media-text/deprecated.js.map +1 -1
  64. package/build/media-text/edit.js +2 -2
  65. package/build/media-text/edit.js.map +1 -1
  66. package/build/media-text/save.js +13 -0
  67. package/build/media-text/save.js.map +1 -1
  68. package/build/more/save.js +1 -7
  69. package/build/more/save.js.map +1 -1
  70. package/build/navigation-link/edit.js +5 -4
  71. package/build/navigation-link/edit.js.map +1 -1
  72. package/build/navigation-submenu/edit.js +2 -1
  73. package/build/navigation-submenu/edit.js.map +1 -1
  74. package/build/page-list/edit.js +8 -1
  75. package/build/page-list/edit.js.map +1 -1
  76. package/build/paragraph/edit.js +7 -11
  77. package/build/paragraph/edit.js.map +1 -1
  78. package/build/post-comments-form/edit.js +4 -45
  79. package/build/post-comments-form/edit.js.map +1 -1
  80. package/build/post-comments-form/form.js +47 -3
  81. package/build/post-comments-form/form.js.map +1 -1
  82. package/build/post-terms/edit.js +3 -2
  83. package/build/post-terms/edit.js.map +1 -1
  84. package/build/query-no-results/edit.js +1 -1
  85. package/build/query-no-results/edit.js.map +1 -1
  86. package/build/query-pagination-next/edit.js +2 -1
  87. package/build/query-pagination-next/edit.js.map +1 -1
  88. package/build/query-pagination-previous/edit.js +2 -1
  89. package/build/query-pagination-previous/edit.js.map +1 -1
  90. package/build/quote/deprecated.js +168 -36
  91. package/build/quote/deprecated.js.map +1 -1
  92. package/build/quote/edit.js +76 -39
  93. package/build/quote/edit.js.map +1 -1
  94. package/build/quote/index.js +9 -45
  95. package/build/quote/index.js.map +1 -1
  96. package/build/quote/save.js +1 -5
  97. package/build/quote/save.js.map +1 -1
  98. package/build/quote/transforms.js +110 -158
  99. package/build/quote/transforms.js.map +1 -1
  100. package/build/social-link/icons/index.js +13 -0
  101. package/build/social-link/icons/index.js.map +1 -1
  102. package/build/social-link/icons/whatsapp.js +25 -0
  103. package/build/social-link/icons/whatsapp.js.map +1 -0
  104. package/build/social-link/variations.js +7 -0
  105. package/build/social-link/variations.js.map +1 -1
  106. package/build/template-part/edit/index.js +17 -8
  107. package/build/template-part/edit/index.js.map +1 -1
  108. package/build/template-part/edit/selection-modal.js +33 -13
  109. package/build/template-part/edit/selection-modal.js.map +1 -1
  110. package/build/template-part/edit/utils/search.js +94 -0
  111. package/build/template-part/edit/utils/search.js.map +1 -0
  112. package/build-module/button/edit.js +2 -1
  113. package/build-module/button/edit.js.map +1 -1
  114. package/build-module/buttons/edit.js +2 -2
  115. package/build-module/buttons/edit.js.map +1 -1
  116. package/build-module/columns/edit.native.js +2 -2
  117. package/build-module/columns/edit.native.js.map +1 -1
  118. package/build-module/comments/edit/comments-legacy.js +59 -0
  119. package/build-module/comments/edit/comments-legacy.js.map +1 -0
  120. package/build-module/comments/edit/index.js +37 -0
  121. package/build-module/comments/edit/index.js.map +1 -0
  122. package/build-module/comments/edit/placeholder.js +102 -0
  123. package/build-module/comments/edit/placeholder.js.map +1 -0
  124. package/build-module/comments/edit/template.js +32 -0
  125. package/build-module/comments/edit/template.js.map +1 -0
  126. package/build-module/comments/index.js +6 -1
  127. package/build-module/comments/index.js.map +1 -1
  128. package/build-module/comments/save.js +9 -4
  129. package/build-module/comments/save.js.map +1 -1
  130. package/build-module/cover/transforms.js +3 -2
  131. package/build-module/cover/transforms.js.map +1 -1
  132. package/build-module/embed/embed-placeholder.native.js +1 -2
  133. package/build-module/embed/embed-placeholder.native.js.map +1 -1
  134. package/build-module/gallery/edit.js +2 -2
  135. package/build-module/gallery/edit.js.map +1 -1
  136. package/build-module/gallery/use-get-media.native.js +50 -0
  137. package/build-module/gallery/use-get-media.native.js.map +1 -0
  138. package/build-module/group/index.js +1 -0
  139. package/build-module/group/index.js.map +1 -1
  140. package/build-module/group/variations.js +2 -2
  141. package/build-module/group/variations.js.map +1 -1
  142. package/build-module/image/deprecated.js +77 -9
  143. package/build-module/image/deprecated.js.map +1 -1
  144. package/build-module/image/edit.js +5 -3
  145. package/build-module/image/edit.js.map +1 -1
  146. package/build-module/image/edit.native.js +18 -8
  147. package/build-module/image/edit.native.js.map +1 -1
  148. package/build-module/image/image.js +29 -22
  149. package/build-module/image/image.js.map +1 -1
  150. package/build-module/image/index.js +7 -1
  151. package/build-module/image/index.js.map +1 -1
  152. package/build-module/image/save.js +9 -3
  153. package/build-module/image/save.js.map +1 -1
  154. package/build-module/index.js +1 -2
  155. package/build-module/index.js.map +1 -1
  156. package/build-module/index.native.js +3 -13
  157. package/build-module/index.native.js.map +1 -1
  158. package/build-module/list/transforms.js +4 -63
  159. package/build-module/list/transforms.js.map +1 -1
  160. package/build-module/list/v2/transforms.js +2 -29
  161. package/build-module/list/v2/transforms.js.map +1 -1
  162. package/build-module/list-item/edit.js +14 -10
  163. package/build-module/list-item/edit.js.map +1 -1
  164. package/build-module/list-item/hooks/index.js +1 -1
  165. package/build-module/list-item/hooks/index.js.map +1 -1
  166. package/build-module/list-item/hooks/use-merge.js +160 -0
  167. package/build-module/list-item/hooks/use-merge.js.map +1 -0
  168. package/build-module/list-item/hooks/use-outdent-list-item.js +82 -46
  169. package/build-module/list-item/hooks/use-outdent-list-item.js.map +1 -1
  170. package/build-module/list-item/utils.js +123 -2
  171. package/build-module/list-item/utils.js.map +1 -1
  172. package/build-module/media-text/deprecated.js +134 -8
  173. package/build-module/media-text/deprecated.js.map +1 -1
  174. package/build-module/media-text/edit.js +2 -2
  175. package/build-module/media-text/edit.js.map +1 -1
  176. package/build-module/media-text/save.js +13 -0
  177. package/build-module/media-text/save.js.map +1 -1
  178. package/build-module/more/save.js +1 -6
  179. package/build-module/more/save.js.map +1 -1
  180. package/build-module/navigation-link/edit.js +5 -4
  181. package/build-module/navigation-link/edit.js.map +1 -1
  182. package/build-module/navigation-submenu/edit.js +2 -1
  183. package/build-module/navigation-submenu/edit.js.map +1 -1
  184. package/build-module/page-list/edit.js +8 -1
  185. package/build-module/page-list/edit.js.map +1 -1
  186. package/build-module/paragraph/edit.js +8 -12
  187. package/build-module/paragraph/edit.js.map +1 -1
  188. package/build-module/post-comments-form/edit.js +5 -42
  189. package/build-module/post-comments-form/edit.js.map +1 -1
  190. package/build-module/post-comments-form/form.js +46 -5
  191. package/build-module/post-comments-form/form.js.map +1 -1
  192. package/build-module/post-terms/edit.js +3 -2
  193. package/build-module/post-terms/edit.js.map +1 -1
  194. package/build-module/query-no-results/edit.js +2 -2
  195. package/build-module/query-no-results/edit.js.map +1 -1
  196. package/build-module/query-pagination-next/edit.js +2 -1
  197. package/build-module/query-pagination-next/edit.js.map +1 -1
  198. package/build-module/query-pagination-previous/edit.js +2 -1
  199. package/build-module/query-pagination-previous/edit.js.map +1 -1
  200. package/build-module/quote/deprecated.js +162 -36
  201. package/build-module/quote/deprecated.js.map +1 -1
  202. package/build-module/quote/edit.js +77 -43
  203. package/build-module/quote/edit.js.map +1 -1
  204. package/build-module/quote/index.js +9 -39
  205. package/build-module/quote/index.js.map +1 -1
  206. package/build-module/quote/save.js +4 -8
  207. package/build-module/quote/save.js.map +1 -1
  208. package/build-module/quote/transforms.js +111 -158
  209. package/build-module/quote/transforms.js.map +1 -1
  210. package/build-module/social-link/icons/index.js +1 -0
  211. package/build-module/social-link/icons/index.js.map +1 -1
  212. package/build-module/social-link/icons/whatsapp.js +15 -0
  213. package/build-module/social-link/icons/whatsapp.js.map +1 -0
  214. package/build-module/social-link/variations.js +8 -1
  215. package/build-module/social-link/variations.js.map +1 -1
  216. package/build-module/template-part/edit/index.js +20 -11
  217. package/build-module/template-part/edit/index.js.map +1 -1
  218. package/build-module/template-part/edit/selection-modal.js +33 -15
  219. package/build-module/template-part/edit/selection-modal.js.map +1 -1
  220. package/build-module/template-part/edit/utils/search.js +84 -0
  221. package/build-module/template-part/edit/utils/search.js.map +1 -0
  222. package/build-style/button/style-rtl.css +1 -1
  223. package/build-style/button/style.css +1 -1
  224. package/build-style/comments/editor-rtl.css +122 -0
  225. package/build-style/comments/editor.css +122 -0
  226. package/build-style/{post-comments → comments}/style-rtl.css +1 -0
  227. package/build-style/{post-comments → comments}/style.css +1 -0
  228. package/build-style/common-rtl.css +7 -0
  229. package/build-style/common.css +7 -0
  230. package/build-style/cover/style-rtl.css +2 -2
  231. package/build-style/cover/style.css +2 -2
  232. package/build-style/{post-comments/editor.css → editor-elements-rtl.css} +8 -2
  233. package/build-style/{post-comments/editor-rtl.css → editor-elements.css} +8 -2
  234. package/build-style/editor-rtl.css +151 -10
  235. package/build-style/editor.css +151 -10
  236. package/build-style/gallery/style-rtl.css +7 -2
  237. package/build-style/gallery/style.css +7 -2
  238. package/build-style/image/editor-rtl.css +4 -3
  239. package/build-style/image/editor.css +4 -3
  240. package/build-style/image/style-rtl.css +33 -3
  241. package/build-style/image/style.css +33 -3
  242. package/build-style/post-comments-form/style-rtl.css +0 -1
  243. package/build-style/post-comments-form/style.css +0 -1
  244. package/build-style/social-link/editor-rtl.css +1 -0
  245. package/build-style/social-link/editor.css +1 -0
  246. package/build-style/social-links/style-rtl.css +8 -0
  247. package/build-style/social-links/style.css +8 -0
  248. package/build-style/style-rtl.css +170 -127
  249. package/build-style/style.css +170 -127
  250. package/build-style/template-part/editor-rtl.css +14 -3
  251. package/build-style/template-part/editor.css +14 -3
  252. package/package.json +28 -28
  253. package/src/button/edit.js +1 -0
  254. package/src/button/style.scss +3 -1
  255. package/src/buttons/edit.js +1 -5
  256. package/src/columns/edit.native.js +2 -2
  257. package/src/comments/block.json +6 -1
  258. package/src/comments/edit/comments-legacy.js +71 -0
  259. package/src/comments/edit/index.js +35 -0
  260. package/src/comments/edit/placeholder.js +124 -0
  261. package/src/comments/{edit.js → edit/template.js} +1 -28
  262. package/src/comments/editor.scss +9 -0
  263. package/src/comments/index.php +219 -0
  264. package/src/comments/save.js +8 -7
  265. package/src/{post-comments → comments}/style.scss +7 -0
  266. package/src/common.scss +2 -0
  267. package/src/cover/style.scss +2 -2
  268. package/src/cover/transforms.js +2 -2
  269. package/src/editor-elements.scss +10 -0
  270. package/src/editor.scss +2 -1
  271. package/src/embed/embed-placeholder.native.js +2 -3
  272. package/src/gallery/edit.js +4 -2
  273. package/src/gallery/style.scss +10 -1
  274. package/src/gallery/use-get-media.native.js +44 -0
  275. package/src/group/block.json +1 -0
  276. package/src/group/variations.js +2 -2
  277. package/src/image/block.json +7 -1
  278. package/src/image/deprecated.js +86 -0
  279. package/src/image/edit.js +6 -1
  280. package/src/image/edit.native.js +18 -7
  281. package/src/image/editor.scss +9 -4
  282. package/src/image/image.js +26 -16
  283. package/src/image/save.js +10 -1
  284. package/src/image/style.scss +39 -3
  285. package/src/index.js +0 -2
  286. package/src/index.native.js +2 -11
  287. package/src/list/transforms.js +0 -47
  288. package/src/list/v2/transforms.js +2 -40
  289. package/src/list-item/edit.js +10 -12
  290. package/src/list-item/hooks/index.js +1 -1
  291. package/src/list-item/hooks/use-merge.js +141 -0
  292. package/src/list-item/hooks/use-outdent-list-item.js +72 -74
  293. package/src/list-item/utils.js +27 -3
  294. package/src/media-text/deprecated.js +148 -1
  295. package/src/media-text/edit.js +2 -1
  296. package/src/media-text/save.js +18 -0
  297. package/src/more/save.js +3 -6
  298. package/src/navigation-link/edit.js +4 -3
  299. package/src/navigation-submenu/edit.js +1 -0
  300. package/src/page-list/edit.js +9 -0
  301. package/src/paragraph/edit.js +8 -14
  302. package/src/post-comments-form/edit.js +2 -71
  303. package/src/post-comments-form/form.js +80 -5
  304. package/src/post-comments-form/index.php +1 -1
  305. package/src/post-comments-form/style.scss +0 -1
  306. package/src/post-terms/edit.js +3 -2
  307. package/src/query-no-results/edit.js +2 -5
  308. package/src/query-pagination-next/edit.js +1 -0
  309. package/src/query-pagination-previous/edit.js +1 -0
  310. package/src/quote/deprecated.js +213 -99
  311. package/src/quote/edit.js +77 -52
  312. package/src/quote/index.js +10 -33
  313. package/src/quote/save.js +5 -5
  314. package/src/quote/{v2/test → test}/migrate.js +2 -7
  315. package/src/quote/transforms.js +117 -147
  316. package/src/social-link/editor.scss +3 -0
  317. package/src/social-link/icons/index.js +1 -0
  318. package/src/social-link/icons/whatsapp.js +10 -0
  319. package/src/social-link/index.php +4 -0
  320. package/src/social-link/socials-with-bg.scss +5 -0
  321. package/src/social-link/socials-without-bg.scss +5 -0
  322. package/src/social-link/variations.js +7 -0
  323. package/src/style.scss +1 -2
  324. package/src/template-part/edit/index.js +37 -24
  325. package/src/template-part/edit/selection-modal.js +68 -40
  326. package/src/template-part/edit/utils/search.js +76 -0
  327. package/src/template-part/editor.scss +21 -9
  328. package/src/template-part/index.php +56 -2
  329. package/build/comments/edit.js.map +0 -1
  330. package/build/list-item/hooks/use-backspace.js +0 -59
  331. package/build/list-item/hooks/use-backspace.js.map +0 -1
  332. package/build/post-comments/edit.js +0 -184
  333. package/build/post-comments/edit.js.map +0 -1
  334. package/build/post-comments/index.js +0 -72
  335. package/build/post-comments/index.js.map +0 -1
  336. package/build/quote/v2/deprecated.js +0 -133
  337. package/build/quote/v2/deprecated.js.map +0 -1
  338. package/build/quote/v2/edit.js +0 -139
  339. package/build/quote/v2/edit.js.map +0 -1
  340. package/build/quote/v2/index.js +0 -49
  341. package/build/quote/v2/index.js.map +0 -1
  342. package/build/quote/v2/save.js +0 -43
  343. package/build/quote/v2/save.js.map +0 -1
  344. package/build/quote/v2/transforms.js +0 -156
  345. package/build/quote/v2/transforms.js.map +0 -1
  346. package/build-module/comments/edit.js +0 -59
  347. package/build-module/comments/edit.js.map +0 -1
  348. package/build-module/list-item/hooks/use-backspace.js +0 -44
  349. package/build-module/list-item/hooks/use-backspace.js.map +0 -1
  350. package/build-module/post-comments/edit.js +0 -171
  351. package/build-module/post-comments/edit.js.map +0 -1
  352. package/build-module/post-comments/index.js +0 -59
  353. package/build-module/post-comments/index.js.map +0 -1
  354. package/build-module/quote/v2/deprecated.js +0 -116
  355. package/build-module/quote/v2/deprecated.js.map +0 -1
  356. package/build-module/quote/v2/edit.js +0 -122
  357. package/build-module/quote/v2/edit.js.map +0 -1
  358. package/build-module/quote/v2/index.js +0 -33
  359. package/build-module/quote/v2/index.js.map +0 -1
  360. package/build-module/quote/v2/save.js +0 -30
  361. package/build-module/quote/v2/save.js.map +0 -1
  362. package/build-module/quote/v2/transforms.js +0 -147
  363. package/build-module/quote/v2/transforms.js.map +0 -1
  364. package/src/list-item/hooks/use-backspace.js +0 -51
  365. package/src/post-comments/block.json +0 -45
  366. package/src/post-comments/edit.js +0 -247
  367. package/src/post-comments/editor.scss +0 -3
  368. package/src/post-comments/index.js +0 -18
  369. package/src/post-comments/index.php +0 -87
  370. package/src/quote/v2/deprecated.js +0 -107
  371. package/src/quote/v2/edit.js +0 -139
  372. package/src/quote/v2/index.js +0 -36
  373. package/src/quote/v2/save.js +0 -26
  374. package/src/quote/v2/transforms.js +0 -155
@@ -1,127 +1,241 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
+ import classnames from 'classnames';
4
5
  import { omit } from 'lodash';
5
6
 
6
7
  /**
7
8
  * WordPress dependencies
8
9
  */
9
- import { RichText } from '@wordpress/block-editor';
10
-
11
- const blockAttributes = {
12
- value: {
13
- type: 'string',
14
- source: 'html',
15
- selector: 'blockquote',
16
- multiline: 'p',
17
- default: '',
18
- },
19
- citation: {
20
- type: 'string',
21
- source: 'html',
22
- selector: 'cite',
23
- default: '',
24
- },
25
- align: {
26
- type: 'string',
27
- },
10
+ import { createBlock, parseWithAttributeSchema } from '@wordpress/blocks';
11
+ import { RichText, useBlockProps } from '@wordpress/block-editor';
12
+
13
+ export const migrateToQuoteV2 = ( attributes ) => {
14
+ const { value } = attributes;
15
+
16
+ return [
17
+ {
18
+ ...omit( attributes, [ 'value' ] ),
19
+ },
20
+ value
21
+ ? parseWithAttributeSchema( value, {
22
+ type: 'array',
23
+ source: 'query',
24
+ selector: 'p',
25
+ query: {
26
+ content: {
27
+ type: 'string',
28
+ source: 'html',
29
+ },
30
+ },
31
+ } ).map( ( { content } ) =>
32
+ createBlock( 'core/paragraph', { content } )
33
+ )
34
+ : createBlock( 'core/paragraph' ),
35
+ ];
28
36
  };
29
37
 
30
- const deprecated = [
31
- {
32
- attributes: blockAttributes,
33
- save( { attributes } ) {
34
- const { align, value, citation } = attributes;
35
-
36
- return (
37
- <blockquote style={ { textAlign: align ? align : null } }>
38
- <RichText.Content multiline value={ value } />
39
- { ! RichText.isEmpty( citation ) && (
40
- <RichText.Content tagName="cite" value={ citation } />
41
- ) }
42
- </blockquote>
43
- );
38
+ const v3 = {
39
+ attributes: {
40
+ value: {
41
+ type: 'string',
42
+ source: 'html',
43
+ selector: 'blockquote',
44
+ multiline: 'p',
45
+ default: '',
46
+ __experimentalRole: 'content',
47
+ },
48
+ citation: {
49
+ type: 'string',
50
+ source: 'html',
51
+ selector: 'cite',
52
+ default: '',
53
+ __experimentalRole: 'content',
54
+ },
55
+ align: {
56
+ type: 'string',
44
57
  },
45
58
  },
46
- {
47
- attributes: {
48
- ...blockAttributes,
49
- style: {
50
- type: 'number',
51
- default: 1,
59
+ supports: {
60
+ anchor: true,
61
+ __experimentalSlashInserter: true,
62
+ typography: {
63
+ fontSize: true,
64
+ lineHeight: true,
65
+ __experimentalFontStyle: true,
66
+ __experimentalFontWeight: true,
67
+ __experimentalLetterSpacing: true,
68
+ __experimentalTextTransform: true,
69
+ __experimentalDefaultControls: {
70
+ fontSize: true,
71
+ fontAppearance: true,
52
72
  },
53
73
  },
74
+ },
75
+ save( { attributes } ) {
76
+ const { align, value, citation } = attributes;
77
+
78
+ const className = classnames( {
79
+ [ `has-text-align-${ align }` ]: align,
80
+ } );
54
81
 
55
- migrate( attributes ) {
56
- if ( attributes.style === 2 ) {
57
- return {
58
- ...omit( attributes, [ 'style' ] ),
59
- className: attributes.className
60
- ? attributes.className + ' is-style-large'
61
- : 'is-style-large',
62
- };
63
- }
82
+ return (
83
+ <blockquote { ...useBlockProps.save( { className } ) }>
84
+ <RichText.Content multiline value={ value } />
85
+ { ! RichText.isEmpty( citation ) && (
86
+ <RichText.Content tagName="cite" value={ citation } />
87
+ ) }
88
+ </blockquote>
89
+ );
90
+ },
91
+ migrate: migrateToQuoteV2,
92
+ };
64
93
 
65
- return attributes;
94
+ const v2 = {
95
+ attributes: {
96
+ value: {
97
+ type: 'string',
98
+ source: 'html',
99
+ selector: 'blockquote',
100
+ multiline: 'p',
101
+ default: '',
102
+ },
103
+ citation: {
104
+ type: 'string',
105
+ source: 'html',
106
+ selector: 'cite',
107
+ default: '',
66
108
  },
109
+ align: {
110
+ type: 'string',
111
+ },
112
+ },
113
+ migrate: migrateToQuoteV2,
114
+ save( { attributes } ) {
115
+ const { align, value, citation } = attributes;
67
116
 
68
- save( { attributes } ) {
69
- const { align, value, citation, style } = attributes;
117
+ return (
118
+ <blockquote style={ { textAlign: align ? align : null } }>
119
+ <RichText.Content multiline value={ value } />
120
+ { ! RichText.isEmpty( citation ) && (
121
+ <RichText.Content tagName="cite" value={ citation } />
122
+ ) }
123
+ </blockquote>
124
+ );
125
+ },
126
+ };
70
127
 
71
- return (
72
- <blockquote
73
- className={ style === 2 ? 'is-large' : '' }
74
- style={ { textAlign: align ? align : null } }
75
- >
76
- <RichText.Content multiline value={ value } />
77
- { ! RichText.isEmpty( citation ) && (
78
- <RichText.Content tagName="cite" value={ citation } />
79
- ) }
80
- </blockquote>
81
- );
128
+ const v1 = {
129
+ attributes: {
130
+ value: {
131
+ type: 'string',
132
+ source: 'html',
133
+ selector: 'blockquote',
134
+ multiline: 'p',
135
+ default: '',
82
136
  },
83
- },
84
- {
85
- attributes: {
86
- ...blockAttributes,
87
- citation: {
88
- type: 'string',
89
- source: 'html',
90
- selector: 'footer',
91
- default: '',
92
- },
93
- style: {
94
- type: 'number',
95
- default: 1,
96
- },
137
+ citation: {
138
+ type: 'string',
139
+ source: 'html',
140
+ selector: 'cite',
141
+ default: '',
97
142
  },
143
+ align: {
144
+ type: 'string',
145
+ },
146
+ style: {
147
+ type: 'number',
148
+ default: 1,
149
+ },
150
+ },
98
151
 
99
- migrate( attributes ) {
100
- if ( ! isNaN( parseInt( attributes.style ) ) ) {
101
- return {
102
- ...omit( attributes, [ 'style' ] ),
103
- };
104
- }
152
+ migrate( attributes ) {
153
+ if ( attributes.style === 2 ) {
154
+ return migrateToQuoteV2( {
155
+ ...omit( attributes, [ 'style' ] ),
156
+ className: attributes.className
157
+ ? attributes.className + ' is-style-large'
158
+ : 'is-style-large',
159
+ } );
160
+ }
105
161
 
106
- return attributes;
107
- },
162
+ return migrateToQuoteV2( attributes );
163
+ },
108
164
 
109
- save( { attributes } ) {
110
- const { align, value, citation, style } = attributes;
165
+ save( { attributes } ) {
166
+ const { align, value, citation, style } = attributes;
111
167
 
112
- return (
113
- <blockquote
114
- className={ `blocks-quote-style-${ style }` }
115
- style={ { textAlign: align ? align : null } }
116
- >
117
- <RichText.Content multiline value={ value } />
118
- { ! RichText.isEmpty( citation ) && (
119
- <RichText.Content tagName="footer" value={ citation } />
120
- ) }
121
- </blockquote>
122
- );
168
+ return (
169
+ <blockquote
170
+ className={ style === 2 ? 'is-large' : '' }
171
+ style={ { textAlign: align ? align : null } }
172
+ >
173
+ <RichText.Content multiline value={ value } />
174
+ { ! RichText.isEmpty( citation ) && (
175
+ <RichText.Content tagName="cite" value={ citation } />
176
+ ) }
177
+ </blockquote>
178
+ );
179
+ },
180
+ };
181
+
182
+ const v0 = {
183
+ attributes: {
184
+ value: {
185
+ type: 'string',
186
+ source: 'html',
187
+ selector: 'blockquote',
188
+ multiline: 'p',
189
+ default: '',
190
+ },
191
+ citation: {
192
+ type: 'string',
193
+ source: 'html',
194
+ selector: 'footer',
195
+ default: '',
196
+ },
197
+ align: {
198
+ type: 'string',
123
199
  },
200
+ style: {
201
+ type: 'number',
202
+ default: 1,
203
+ },
204
+ },
205
+
206
+ migrate( attributes ) {
207
+ if ( ! isNaN( parseInt( attributes.style ) ) ) {
208
+ return migrateToQuoteV2( {
209
+ ...omit( attributes, [ 'style' ] ),
210
+ } );
211
+ }
212
+
213
+ return migrateToQuoteV2( attributes );
214
+ },
215
+
216
+ save( { attributes } ) {
217
+ const { align, value, citation, style } = attributes;
218
+
219
+ return (
220
+ <blockquote
221
+ className={ `blocks-quote-style-${ style }` }
222
+ style={ { textAlign: align ? align : null } }
223
+ >
224
+ <RichText.Content multiline value={ value } />
225
+ { ! RichText.isEmpty( citation ) && (
226
+ <RichText.Content tagName="footer" value={ citation } />
227
+ ) }
228
+ </blockquote>
229
+ );
124
230
  },
125
- ];
231
+ };
126
232
 
127
- export default deprecated;
233
+ /**
234
+ * New deprecations need to be placed first
235
+ * for them to have higher priority.
236
+ *
237
+ * Old deprecations may need to be updated as well.
238
+ *
239
+ * See block-deprecation.md
240
+ */
241
+ export default [ v3, v2, v1, v0 ];
package/src/quote/edit.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import classnames from 'classnames';
4
+ import classNames from 'classnames';
5
5
 
6
6
  /**
7
7
  * WordPress dependencies
@@ -12,29 +12,87 @@ import {
12
12
  BlockControls,
13
13
  RichText,
14
14
  useBlockProps,
15
+ useInnerBlocksProps,
16
+ store as blockEditorStore,
15
17
  } from '@wordpress/block-editor';
16
18
  import { BlockQuotation } from '@wordpress/components';
19
+ import { useDispatch, useSelect, useRegistry } from '@wordpress/data';
17
20
  import { createBlock, getDefaultBlockName } from '@wordpress/blocks';
18
- import { Platform } from '@wordpress/element';
21
+ import { Platform, useEffect } from '@wordpress/element';
22
+ import deprecated from '@wordpress/deprecated';
23
+
24
+ /**
25
+ * Internal dependencies
26
+ */
27
+ import { migrateToQuoteV2 } from './deprecated';
19
28
 
20
29
  const isWebPlatform = Platform.OS === 'web';
21
30
 
31
+ const TEMPLATE = [ [ 'core/paragraph', {} ] ];
32
+
33
+ /**
34
+ * At the moment, deprecations don't handle create blocks from attributes
35
+ * (like when using CPT templates). For this reason, this hook is necessary
36
+ * to avoid breaking templates using the old quote block format.
37
+ *
38
+ * @param {Object} attributes Block attributes.
39
+ * @param {string} clientId Block client ID.
40
+ */
41
+ const useMigrateOnLoad = ( attributes, clientId ) => {
42
+ const registry = useRegistry();
43
+ const { updateBlockAttributes, replaceInnerBlocks } =
44
+ useDispatch( blockEditorStore );
45
+ useEffect( () => {
46
+ // As soon as the block is loaded, migrate it to the new version.
47
+
48
+ if ( ! attributes.value ) {
49
+ // No need to migrate if it doesn't have the value attribute.
50
+ return;
51
+ }
52
+
53
+ const [ newAttributes, newInnerBlocks ] =
54
+ migrateToQuoteV2( attributes );
55
+
56
+ deprecated( 'Value attribute on the quote block', {
57
+ since: '6.0',
58
+ version: '6.5',
59
+ alternative: 'inner blocks',
60
+ } );
61
+
62
+ registry.batch( () => {
63
+ updateBlockAttributes( clientId, newAttributes );
64
+ replaceInnerBlocks( clientId, newInnerBlocks );
65
+ } );
66
+ }, [ attributes.value ] );
67
+ };
68
+
22
69
  export default function QuoteEdit( {
23
70
  attributes,
24
71
  setAttributes,
25
- isSelected,
26
- mergeBlocks,
27
- onReplace,
28
- className,
29
72
  insertBlocksAfter,
73
+ clientId,
74
+ className,
30
75
  style,
31
76
  } ) {
32
- const { align, value, citation } = attributes;
77
+ const { align, citation } = attributes;
78
+
79
+ useMigrateOnLoad( attributes, clientId );
80
+
81
+ const hasSelection = useSelect( ( select ) => {
82
+ const { isBlockSelected, hasSelectedInnerBlock } =
83
+ select( blockEditorStore );
84
+ return hasSelectedInnerBlock( clientId ) || isBlockSelected( clientId );
85
+ }, [] );
86
+
33
87
  const blockProps = useBlockProps( {
34
- className: classnames( className, {
88
+ className: classNames( className, {
35
89
  [ `has-text-align-${ align }` ]: align,
36
90
  } ),
37
- style,
91
+ ...( ! isWebPlatform && { style } ),
92
+ } );
93
+ const innerBlocksProps = useInnerBlocksProps( blockProps, {
94
+ template: TEMPLATE,
95
+ templateInsertUpdatesSelection: true,
38
96
  } );
39
97
 
40
98
  return (
@@ -47,66 +105,33 @@ export default function QuoteEdit( {
47
105
  } }
48
106
  />
49
107
  </BlockControls>
50
- <BlockQuotation { ...blockProps }>
51
- <RichText
52
- identifier="value"
53
- multiline
54
- value={ value }
55
- onChange={ ( nextValue ) =>
56
- setAttributes( {
57
- value: nextValue,
58
- } )
59
- }
60
- onMerge={ mergeBlocks }
61
- onRemove={ ( forward ) => {
62
- const hasEmptyCitation =
63
- ! citation || citation.length === 0;
64
- if ( ! forward && hasEmptyCitation ) {
65
- onReplace( [] );
66
- }
67
- } }
68
- aria-label={ __( 'Quote text' ) }
69
- placeholder={
70
- // translators: placeholder text used for the quote
71
- __( 'Add quote' )
72
- }
73
- onReplace={ onReplace }
74
- onSplit={ ( piece ) =>
75
- createBlock( 'core/quote', {
76
- ...attributes,
77
- value: piece,
78
- } )
79
- }
80
- __unstableOnSplitMiddle={ () =>
81
- createBlock( 'core/paragraph' )
82
- }
83
- textAlign={ align }
84
- __unstableEmbedURLOnPaste
85
- />
86
- { ( ! RichText.isEmpty( citation ) || isSelected ) && (
108
+ <BlockQuotation { ...innerBlocksProps }>
109
+ { innerBlocksProps.children }
110
+ { ( ! RichText.isEmpty( citation ) || hasSelection ) && (
87
111
  <RichText
88
112
  identifier="citation"
89
113
  tagName={ isWebPlatform ? 'cite' : undefined }
90
114
  style={ { display: 'block' } }
91
115
  value={ citation }
92
- onChange={ ( nextCitation ) =>
116
+ onChange={ ( nextCitation ) => {
93
117
  setAttributes( {
94
118
  citation: nextCitation,
95
- } )
96
- }
119
+ } );
120
+ } }
97
121
  __unstableMobileNoFocusOnMount
98
- aria-label={ __( 'Quote citation text' ) }
122
+ aria-label={ __( 'Quote citation' ) }
99
123
  placeholder={
100
- // translators: placeholder text used for the citation
124
+ // translators: placeholder text used for the
125
+ // citation
101
126
  __( 'Add citation' )
102
127
  }
103
128
  className="wp-block-quote__citation"
104
- textAlign={ align }
105
129
  __unstableOnSplitAtEnd={ () =>
106
130
  insertBlocksAfter(
107
131
  createBlock( getDefaultBlockName() )
108
132
  )
109
133
  }
134
+ { ...( ! isWebPlatform ? { textAlign: align } : {} ) }
110
135
  />
111
136
  ) }
112
137
  </BlockQuotation>
@@ -12,51 +12,28 @@ import edit from './edit';
12
12
  import metadata from './block.json';
13
13
  import save from './save';
14
14
  import transforms from './transforms';
15
- import settingsV2 from './v2';
16
15
 
17
16
  const { name } = metadata;
18
17
 
19
- export { metadata, name, settingsV2 };
18
+ export { metadata, name };
20
19
 
21
- export const settingsV1 = {
20
+ export const settings = {
22
21
  icon,
23
22
  example: {
24
23
  attributes: {
25
- value:
26
- '<p>' + __( 'In quoting others, we cite ourselves.' ) + '</p>',
27
24
  citation: 'Julio Cortázar',
28
25
  },
26
+ innerBlocks: [
27
+ {
28
+ name: 'core/paragraph',
29
+ attributes: {
30
+ content: __( 'In quoting others, we cite ourselves.' ),
31
+ },
32
+ },
33
+ ],
29
34
  },
30
35
  transforms,
31
36
  edit,
32
37
  save,
33
- merge( attributes, { value, citation } ) {
34
- // Quote citations cannot be merged. Pick the second one unless it's
35
- // empty.
36
- if ( ! citation ) {
37
- citation = attributes.citation;
38
- }
39
-
40
- if ( ! value || value === '<p></p>' ) {
41
- return {
42
- ...attributes,
43
- citation,
44
- };
45
- }
46
-
47
- return {
48
- ...attributes,
49
- value: attributes.value + value,
50
- citation,
51
- };
52
- },
53
38
  deprecated,
54
39
  };
55
-
56
- let settings = settingsV1;
57
- if ( process.env.IS_GUTENBERG_PLUGIN ) {
58
- settings = window?.__experimentalEnableQuoteBlockV2
59
- ? settingsV2
60
- : settingsV1;
61
- }
62
- export { settings };
package/src/quote/save.js CHANGED
@@ -1,23 +1,23 @@
1
1
  /**
2
2
  * External dependencies
3
3
  */
4
- import classnames from 'classnames';
4
+ import classNames from 'classnames';
5
5
 
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { RichText, useBlockProps } from '@wordpress/block-editor';
9
+ import { InnerBlocks, RichText, useBlockProps } from '@wordpress/block-editor';
10
10
 
11
11
  export default function save( { attributes } ) {
12
- const { align, value, citation } = attributes;
12
+ const { align, citation } = attributes;
13
13
 
14
- const className = classnames( {
14
+ const className = classNames( {
15
15
  [ `has-text-align-${ align }` ]: align,
16
16
  } );
17
17
 
18
18
  return (
19
19
  <blockquote { ...useBlockProps.save( { className } ) }>
20
- <RichText.Content multiline value={ value } />
20
+ <InnerBlocks.Content />
21
21
  { ! RichText.isEmpty( citation ) && (
22
22
  <RichText.Content tagName="cite" value={ citation } />
23
23
  ) }
@@ -11,9 +11,8 @@ import {
11
11
  * Internal dependencies
12
12
  */
13
13
  import { migrateToQuoteV2 } from '../deprecated';
14
- import * as paragraph from '../../../paragraph';
15
- import * as quote from '../../../quote';
16
- import * as quoteV2 from '../../../quote/v2';
14
+ import * as paragraph from '../../paragraph';
15
+ import * as quote from '../../quote';
17
16
 
18
17
  describe( 'Migrate quote block', () => {
19
18
  beforeAll( () => {
@@ -21,10 +20,6 @@ describe( 'Migrate quote block', () => {
21
20
  { name: paragraph.name, ...paragraph.metadata },
22
21
  paragraph.settings
23
22
  );
24
- registerBlockType(
25
- { name: quote.name, ...quote.metadata },
26
- quoteV2.settings
27
- );
28
23
  } );
29
24
 
30
25
  afterAll( () => {