@wordpress/block-library 7.15.1-next.4d3b314fd5.0 → 7.17.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 (351) hide show
  1. package/CHANGELOG.md +4 -1
  2. package/build/archives/edit.js +1 -0
  3. package/build/archives/edit.js.map +1 -1
  4. package/build/code/utils.js +3 -3
  5. package/build/code/utils.js.map +1 -1
  6. package/build/comment-template/edit.js +40 -32
  7. package/build/comment-template/edit.js.map +1 -1
  8. package/build/comments/edit/placeholder.js +1 -4
  9. package/build/comments/edit/placeholder.js.map +1 -1
  10. package/build/comments/index.js +5 -1
  11. package/build/comments/index.js.map +1 -1
  12. package/build/comments-title/edit.js +18 -1
  13. package/build/comments-title/edit.js.map +1 -1
  14. package/build/cover/edit/index.js +2 -2
  15. package/build/cover/edit/index.js.map +1 -1
  16. package/build/cover/edit/use-cover-is-dark.js +8 -7
  17. package/build/cover/edit/use-cover-is-dark.js.map +1 -1
  18. package/build/embed/variations.js +1 -1
  19. package/build/embed/variations.js.map +1 -1
  20. package/build/gallery/transforms.js +3 -3
  21. package/build/gallery/transforms.js.map +1 -1
  22. package/build/gallery/v1/edit.js +1 -1
  23. package/build/gallery/v1/edit.js.map +1 -1
  24. package/build/group/edit.js +1 -1
  25. package/build/group/edit.js.map +1 -1
  26. package/build/image/image.js +34 -10
  27. package/build/image/image.js.map +1 -1
  28. package/build/image/transforms.js +1 -7
  29. package/build/image/transforms.js.map +1 -1
  30. package/build/list/transforms.js +9 -1
  31. package/build/list/transforms.js.map +1 -1
  32. package/build/list-item/edit.js +3 -2
  33. package/build/list-item/edit.js.map +1 -1
  34. package/build/list-item/edit.native.js +3 -2
  35. package/build/list-item/edit.native.js.map +1 -1
  36. package/build/list-item/hooks/use-merge.js +19 -22
  37. package/build/list-item/hooks/use-merge.js.map +1 -1
  38. package/build/list-item/hooks/use-outdent-list-item.js +19 -3
  39. package/build/list-item/hooks/use-outdent-list-item.js.map +1 -1
  40. package/build/list-item/index.js +14 -1
  41. package/build/list-item/index.js.map +1 -1
  42. package/build/list-item/utils.js +14 -1
  43. package/build/list-item/utils.js.map +1 -1
  44. package/build/navigation/edit/index.js +46 -33
  45. package/build/navigation/edit/index.js.map +1 -1
  46. package/build/navigation/edit/inner-blocks.js +3 -5
  47. package/build/navigation/edit/inner-blocks.js.map +1 -1
  48. package/build/navigation/edit/use-convert-classic-menu-to-block-menu.js +25 -8
  49. package/build/navigation/edit/use-convert-classic-menu-to-block-menu.js.map +1 -1
  50. package/build/navigation/edit/use-create-navigation-menu.js +1 -1
  51. package/build/navigation/edit/use-create-navigation-menu.js.map +1 -1
  52. package/build/navigation/index.js +4 -1
  53. package/build/navigation/index.js.map +1 -1
  54. package/build/navigation-link/edit.js +1 -1
  55. package/build/navigation-link/edit.js.map +1 -1
  56. package/build/page-list/index.js +1 -5
  57. package/build/page-list/index.js.map +1 -1
  58. package/build/paragraph/deprecated.js +49 -10
  59. package/build/paragraph/deprecated.js.map +1 -1
  60. package/build/paragraph/edit.js +22 -14
  61. package/build/paragraph/edit.js.map +1 -1
  62. package/build/paragraph/save.js +3 -1
  63. package/build/paragraph/save.js.map +1 -1
  64. package/build/pattern/edit.js +11 -4
  65. package/build/pattern/edit.js.map +1 -1
  66. package/build/post-author/edit.js +20 -2
  67. package/build/post-author/edit.js.map +1 -1
  68. package/build/post-author/index.js +8 -0
  69. package/build/post-author/index.js.map +1 -1
  70. package/build/post-comments-form/form.js +1 -2
  71. package/build/post-comments-form/form.js.map +1 -1
  72. package/build/post-featured-image/index.js +1 -1
  73. package/build/post-featured-image/overlay.js +2 -2
  74. package/build/post-featured-image/overlay.js.map +1 -1
  75. package/build/post-terms/index.js +4 -0
  76. package/build/post-terms/index.js.map +1 -1
  77. package/build/query/edit/inspector-controls/author-control.js +2 -1
  78. package/build/query/edit/inspector-controls/author-control.js.map +1 -1
  79. package/build/query/edit/inspector-controls/index.js +3 -3
  80. package/build/query/edit/inspector-controls/index.js.map +1 -1
  81. package/build/query/edit/inspector-controls/parent-control.js +2 -1
  82. package/build/query/edit/inspector-controls/parent-control.js.map +1 -1
  83. package/build/query/edit/inspector-controls/taxonomy-controls.js +79 -103
  84. package/build/query/edit/inspector-controls/taxonomy-controls.js.map +1 -1
  85. package/build/query/utils.js +1 -1
  86. package/build/query/utils.js.map +1 -1
  87. package/build/quote/index.js +0 -1
  88. package/build/quote/index.js.map +1 -1
  89. package/build/search/edit.js +2 -1
  90. package/build/search/edit.js.map +1 -1
  91. package/build/site-logo/edit.js +6 -9
  92. package/build/site-logo/edit.js.map +1 -1
  93. package/build/site-title/index.js +2 -1
  94. package/build/site-title/index.js.map +1 -1
  95. package/build/table/state.js +1 -1
  96. package/build/table/state.js.map +1 -1
  97. package/build/table-of-contents/edit.js +1 -4
  98. package/build/table-of-contents/edit.js.map +1 -1
  99. package/build/tag-cloud/edit.js +1 -1
  100. package/build/tag-cloud/edit.js.map +1 -1
  101. package/build/tag-cloud/index.js +8 -0
  102. package/build/tag-cloud/index.js.map +1 -1
  103. package/build/template-part/index.js +2 -2
  104. package/build/template-part/index.js.map +1 -1
  105. package/build/video/edit.js +13 -1
  106. package/build/video/edit.js.map +1 -1
  107. package/build-module/archives/edit.js +1 -0
  108. package/build-module/archives/edit.js.map +1 -1
  109. package/build-module/code/utils.js +3 -3
  110. package/build-module/code/utils.js.map +1 -1
  111. package/build-module/comment-template/edit.js +38 -30
  112. package/build-module/comment-template/edit.js.map +1 -1
  113. package/build-module/comments/edit/placeholder.js +1 -3
  114. package/build-module/comments/edit/placeholder.js.map +1 -1
  115. package/build-module/comments/index.js +5 -1
  116. package/build-module/comments/index.js.map +1 -1
  117. package/build-module/comments-title/edit.js +18 -2
  118. package/build-module/comments-title/edit.js.map +1 -1
  119. package/build-module/cover/edit/index.js +2 -2
  120. package/build-module/cover/edit/index.js.map +1 -1
  121. package/build-module/cover/edit/use-cover-is-dark.js +7 -7
  122. package/build-module/cover/edit/use-cover-is-dark.js.map +1 -1
  123. package/build-module/embed/variations.js +1 -1
  124. package/build-module/embed/variations.js.map +1 -1
  125. package/build-module/gallery/transforms.js +4 -4
  126. package/build-module/gallery/transforms.js.map +1 -1
  127. package/build-module/gallery/v1/edit.js +2 -2
  128. package/build-module/gallery/v1/edit.js.map +1 -1
  129. package/build-module/group/edit.js +1 -1
  130. package/build-module/group/edit.js.map +1 -1
  131. package/build-module/image/image.js +35 -11
  132. package/build-module/image/image.js.map +1 -1
  133. package/build-module/image/transforms.js +1 -6
  134. package/build-module/image/transforms.js.map +1 -1
  135. package/build-module/list/transforms.js +9 -1
  136. package/build-module/list/transforms.js.map +1 -1
  137. package/build-module/list-item/edit.js +3 -2
  138. package/build-module/list-item/edit.js.map +1 -1
  139. package/build-module/list-item/edit.native.js +3 -2
  140. package/build-module/list-item/edit.native.js.map +1 -1
  141. package/build-module/list-item/hooks/use-merge.js +19 -21
  142. package/build-module/list-item/hooks/use-merge.js.map +1 -1
  143. package/build-module/list-item/hooks/use-outdent-list-item.js +19 -3
  144. package/build-module/list-item/hooks/use-outdent-list-item.js.map +1 -1
  145. package/build-module/list-item/index.js +14 -1
  146. package/build-module/list-item/index.js.map +1 -1
  147. package/build-module/list-item/utils.js +14 -1
  148. package/build-module/list-item/utils.js.map +1 -1
  149. package/build-module/navigation/edit/index.js +46 -33
  150. package/build-module/navigation/edit/index.js.map +1 -1
  151. package/build-module/navigation/edit/inner-blocks.js +3 -5
  152. package/build-module/navigation/edit/inner-blocks.js.map +1 -1
  153. package/build-module/navigation/edit/use-convert-classic-menu-to-block-menu.js +25 -8
  154. package/build-module/navigation/edit/use-convert-classic-menu-to-block-menu.js.map +1 -1
  155. package/build-module/navigation/edit/use-create-navigation-menu.js +1 -1
  156. package/build-module/navigation/edit/use-create-navigation-menu.js.map +1 -1
  157. package/build-module/navigation/index.js +4 -1
  158. package/build-module/navigation/index.js.map +1 -1
  159. package/build-module/navigation-link/edit.js +1 -1
  160. package/build-module/navigation-link/edit.js.map +1 -1
  161. package/build-module/page-list/index.js +1 -5
  162. package/build-module/page-list/index.js.map +1 -1
  163. package/build-module/paragraph/deprecated.js +49 -11
  164. package/build-module/paragraph/deprecated.js.map +1 -1
  165. package/build-module/paragraph/edit.js +22 -13
  166. package/build-module/paragraph/edit.js.map +1 -1
  167. package/build-module/paragraph/save.js +2 -1
  168. package/build-module/paragraph/save.js.map +1 -1
  169. package/build-module/pattern/edit.js +10 -3
  170. package/build-module/pattern/edit.js.map +1 -1
  171. package/build-module/post-author/edit.js +21 -2
  172. package/build-module/post-author/edit.js.map +1 -1
  173. package/build-module/post-author/index.js +8 -0
  174. package/build-module/post-author/index.js.map +1 -1
  175. package/build-module/post-comments-form/form.js +2 -3
  176. package/build-module/post-comments-form/form.js.map +1 -1
  177. package/build-module/post-featured-image/index.js +1 -1
  178. package/build-module/post-featured-image/overlay.js +2 -2
  179. package/build-module/post-featured-image/overlay.js.map +1 -1
  180. package/build-module/post-terms/index.js +4 -0
  181. package/build-module/post-terms/index.js.map +1 -1
  182. package/build-module/query/edit/inspector-controls/author-control.js +2 -1
  183. package/build-module/query/edit/inspector-controls/author-control.js.map +1 -1
  184. package/build-module/query/edit/inspector-controls/index.js +5 -5
  185. package/build-module/query/edit/inspector-controls/index.js.map +1 -1
  186. package/build-module/query/edit/inspector-controls/parent-control.js +2 -1
  187. package/build-module/query/edit/inspector-controls/parent-control.js.map +1 -1
  188. package/build-module/query/edit/inspector-controls/taxonomy-controls.js +81 -101
  189. package/build-module/query/edit/inspector-controls/taxonomy-controls.js.map +1 -1
  190. package/build-module/query/utils.js +1 -1
  191. package/build-module/query/utils.js.map +1 -1
  192. package/build-module/quote/index.js +0 -1
  193. package/build-module/quote/index.js.map +1 -1
  194. package/build-module/search/edit.js +3 -2
  195. package/build-module/search/edit.js.map +1 -1
  196. package/build-module/site-logo/edit.js +6 -9
  197. package/build-module/site-logo/edit.js.map +1 -1
  198. package/build-module/site-title/index.js +2 -1
  199. package/build-module/site-title/index.js.map +1 -1
  200. package/build-module/table/state.js +2 -2
  201. package/build-module/table/state.js.map +1 -1
  202. package/build-module/table-of-contents/edit.js +1 -3
  203. package/build-module/table-of-contents/edit.js.map +1 -1
  204. package/build-module/tag-cloud/edit.js +1 -1
  205. package/build-module/tag-cloud/edit.js.map +1 -1
  206. package/build-module/tag-cloud/index.js +8 -0
  207. package/build-module/tag-cloud/index.js.map +1 -1
  208. package/build-module/template-part/index.js +2 -2
  209. package/build-module/template-part/index.js.map +1 -1
  210. package/build-module/video/edit.js +15 -3
  211. package/build-module/video/edit.js.map +1 -1
  212. package/build-style/archives/style-rtl.css +4 -0
  213. package/build-style/archives/style.css +4 -0
  214. package/build-style/code/style-rtl.css +3 -0
  215. package/build-style/code/style.css +3 -0
  216. package/build-style/comments/editor-rtl.css +1 -0
  217. package/build-style/comments/editor.css +1 -0
  218. package/build-style/comments/style-rtl.css +1 -0
  219. package/build-style/comments/style.css +1 -0
  220. package/build-style/cover/editor-rtl.css +4 -0
  221. package/build-style/cover/editor.css +4 -0
  222. package/build-style/editor-rtl.css +78 -46
  223. package/build-style/editor.css +78 -46
  224. package/build-style/group/editor-rtl.css +1 -0
  225. package/build-style/group/editor.css +1 -0
  226. package/build-style/image/editor-rtl.css +1 -1
  227. package/build-style/image/editor.css +1 -1
  228. package/build-style/navigation/editor-rtl.css +5 -0
  229. package/build-style/navigation/editor.css +5 -0
  230. package/build-style/navigation/style-rtl.css +3 -0
  231. package/build-style/navigation/style.css +3 -0
  232. package/build-style/paragraph/editor-rtl.css +0 -16
  233. package/build-style/paragraph/editor.css +0 -16
  234. package/build-style/paragraph/style-rtl.css +5 -0
  235. package/build-style/paragraph/style.css +5 -0
  236. package/build-style/post-featured-image/editor-rtl.css +39 -29
  237. package/build-style/post-featured-image/editor.css +39 -29
  238. package/build-style/post-terms/style-rtl.css +4 -1
  239. package/build-style/post-terms/style.css +4 -1
  240. package/build-style/site-logo/editor-rtl.css +1 -0
  241. package/build-style/site-logo/editor.css +1 -0
  242. package/build-style/site-title/editor-rtl.css +4 -0
  243. package/build-style/site-title/editor.css +4 -0
  244. package/build-style/site-title/style-rtl.css +79 -0
  245. package/build-style/site-title/style.css +79 -0
  246. package/build-style/style-rtl.css +27 -1
  247. package/build-style/style.css +27 -1
  248. package/build-style/tag-cloud/style-rtl.css +3 -0
  249. package/build-style/tag-cloud/style.css +3 -0
  250. package/build-style/video/editor-rtl.css +22 -0
  251. package/build-style/video/editor.css +22 -0
  252. package/package.json +28 -28
  253. package/src/archives/edit.js +1 -0
  254. package/src/archives/style.scss +5 -0
  255. package/src/avatar/index.php +1 -1
  256. package/src/categories/index.php +1 -1
  257. package/src/code/style.scss +12 -7
  258. package/src/code/test/__snapshots__/edit.native.js.snap +13 -0
  259. package/src/code/test/edit.native.js +46 -32
  260. package/src/code/utils.js +3 -3
  261. package/src/comment-author-name/index.php +1 -1
  262. package/src/comment-reply-link/index.php +1 -1
  263. package/src/comment-template/edit.js +47 -34
  264. package/src/comment-template/index.php +2 -3
  265. package/src/comments/block.json +5 -1
  266. package/src/comments/edit/placeholder.js +1 -7
  267. package/src/comments/style.scss +2 -0
  268. package/src/comments-title/edit.js +24 -1
  269. package/src/cover/edit/index.js +2 -7
  270. package/src/cover/edit/use-cover-is-dark.js +11 -11
  271. package/src/cover/editor.scss +7 -0
  272. package/src/cover/index.php +1 -1
  273. package/src/embed/variations.js +1 -1
  274. package/src/gallery/transforms.js +8 -5
  275. package/src/gallery/v1/edit.js +2 -2
  276. package/src/group/edit.js +1 -1
  277. package/src/group/editor.scss +1 -0
  278. package/src/image/editor.scss +4 -1
  279. package/src/image/image.js +59 -29
  280. package/src/image/transforms.js +1 -7
  281. package/src/latest-posts/index.php +1 -1
  282. package/src/list/test/edit.native.js +102 -3
  283. package/src/list/transforms.js +11 -0
  284. package/src/list-item/block.json +14 -1
  285. package/src/list-item/edit.js +2 -1
  286. package/src/list-item/edit.native.js +2 -1
  287. package/src/list-item/hooks/use-merge.js +4 -23
  288. package/src/list-item/hooks/use-outdent-list-item.js +6 -2
  289. package/src/navigation/block.json +4 -1
  290. package/src/navigation/edit/index.js +60 -32
  291. package/src/navigation/edit/inner-blocks.js +2 -5
  292. package/src/navigation/edit/use-convert-classic-menu-to-block-menu.js +32 -5
  293. package/src/navigation/edit/use-create-navigation-menu.js +2 -5
  294. package/src/navigation/editor.scss +7 -0
  295. package/src/navigation/index.php +103 -6
  296. package/src/navigation/style.scss +8 -0
  297. package/src/navigation-link/edit.js +1 -1
  298. package/src/navigation-link/index.php +8 -1
  299. package/src/navigation-submenu/index.php +8 -1
  300. package/src/page-list/block.json +1 -5
  301. package/src/page-list/index.php +10 -8
  302. package/src/paragraph/deprecated.js +36 -0
  303. package/src/paragraph/edit.js +24 -22
  304. package/src/paragraph/editor.scss +0 -20
  305. package/src/paragraph/save.js +5 -1
  306. package/src/paragraph/style.scss +5 -0
  307. package/src/pattern/edit.js +10 -3
  308. package/src/post-author/block.json +8 -0
  309. package/src/post-author/edit.js +29 -3
  310. package/src/post-author/index.php +7 -1
  311. package/src/post-comments-form/form.js +2 -3
  312. package/src/post-featured-image/block.json +1 -1
  313. package/src/post-featured-image/editor.scss +79 -72
  314. package/src/post-featured-image/index.php +18 -24
  315. package/src/post-featured-image/overlay.js +17 -14
  316. package/src/post-terms/block.json +4 -0
  317. package/src/post-terms/style.scss +7 -2
  318. package/src/query/edit/inspector-controls/author-control.js +1 -0
  319. package/src/query/edit/inspector-controls/index.js +5 -7
  320. package/src/query/edit/inspector-controls/parent-control.js +1 -0
  321. package/src/query/edit/inspector-controls/taxonomy-controls.js +82 -86
  322. package/src/query/utils.js +1 -1
  323. package/src/quote/block.json +0 -1
  324. package/src/rss/index.php +3 -3
  325. package/src/search/edit.js +6 -1
  326. package/src/search/index.php +21 -13
  327. package/src/site-logo/edit.js +10 -8
  328. package/src/site-logo/editor.scss +1 -0
  329. package/src/site-title/block.json +2 -1
  330. package/src/site-title/editor.scss +6 -0
  331. package/src/site-title/style.scss +5 -0
  332. package/src/style.scss +1 -0
  333. package/src/table/state.js +2 -2
  334. package/src/table-of-contents/edit.js +1 -3
  335. package/src/tag-cloud/block.json +8 -0
  336. package/src/tag-cloud/edit.js +1 -1
  337. package/src/tag-cloud/style.scss +3 -0
  338. package/src/template-part/index.js +2 -2
  339. package/src/template-part/index.php +4 -0
  340. package/src/video/edit.js +19 -0
  341. package/src/video/editor.scss +37 -0
  342. package/build/navigation-submenu/view.js +0 -56
  343. package/build/navigation-submenu/view.js.map +0 -1
  344. package/build/paragraph/drop-zone.js +0 -99
  345. package/build/paragraph/drop-zone.js.map +0 -1
  346. package/build-module/navigation-submenu/view.js +0 -54
  347. package/build-module/navigation-submenu/view.js.map +0 -1
  348. package/build-module/paragraph/drop-zone.js +0 -88
  349. package/build-module/paragraph/drop-zone.js.map +0 -1
  350. package/src/navigation-submenu/view.js +0 -67
  351. package/src/paragraph/drop-zone.js +0 -105
@@ -86,6 +86,7 @@ function Navigation( {
86
86
  openSubmenusOnClick,
87
87
  overlayMenu,
88
88
  showSubmenuIcon,
89
+ templateLock,
89
90
  layout: {
90
91
  justifyContent,
91
92
  orientation = 'horizontal',
@@ -107,7 +108,7 @@ function Navigation( {
107
108
 
108
109
  // Preload classic menus, so that they don't suddenly pop-in when viewing
109
110
  // the Select Menu dropdown.
110
- useNavigationEntities();
111
+ const { menus: classicMenus } = useNavigationEntities();
111
112
 
112
113
  const [ showNavigationMenuStatusNotice, hideNavigationMenuStatusNotice ] =
113
114
  useNavigationNotice( {
@@ -216,6 +217,20 @@ function Navigation( {
216
217
  const navMenuResolvedButMissing =
217
218
  hasResolvedNavigationMenus && isNavigationMenuMissing;
218
219
 
220
+ const {
221
+ convert: convertClassicMenu,
222
+ status: classicMenuConversionStatus,
223
+ error: classicMenuConversionError,
224
+ } = useConvertClassicToBlockMenu( clientId );
225
+
226
+ const isConvertingClassicMenu =
227
+ classicMenuConversionStatus === CLASSIC_MENU_CONVERSION_PENDING;
228
+
229
+ // Only autofallback to published menus.
230
+ const fallbackNavigationMenus = navigationMenus?.filter(
231
+ ( menu ) => menu.status === 'publish'
232
+ );
233
+
219
234
  // Attempt to retrieve and prioritize any existing navigation menu unless:
220
235
  // - the are uncontrolled inner blocks already present in the block.
221
236
  // - the user is creating a new menu.
@@ -228,23 +243,17 @@ function Navigation( {
228
243
  hasUncontrolledInnerBlocks ||
229
244
  isCreatingNavigationMenu ||
230
245
  ref ||
231
- ! navigationMenus?.length
246
+ ! fallbackNavigationMenus?.length
232
247
  ) {
233
248
  return;
234
249
  }
235
250
 
236
- navigationMenus.sort( ( menuA, menuB ) => {
251
+ fallbackNavigationMenus.sort( ( menuA, menuB ) => {
237
252
  const menuADate = new Date( menuA.date );
238
253
  const menuBDate = new Date( menuB.date );
239
254
  return menuADate.getTime() < menuBDate.getTime();
240
255
  } );
241
256
 
242
- // Only autofallback to published menus.
243
- const fallbackNavigationMenus = navigationMenus.filter(
244
- ( menu ) => menu.status === 'publish'
245
- );
246
- if ( fallbackNavigationMenus.length === 0 ) return;
247
-
248
257
  /**
249
258
  * This fallback displays (both in editor and on front)
250
259
  * a list of pages only if no menu (user assigned or
@@ -256,16 +265,26 @@ function Navigation( {
256
265
  setRef( fallbackNavigationMenus[ 0 ].id );
257
266
  }, [ navigationMenus ] );
258
267
 
259
- const navRef = useRef();
268
+ useEffect( () => {
269
+ if (
270
+ ! hasResolvedNavigationMenus ||
271
+ isConvertingClassicMenu ||
272
+ fallbackNavigationMenus?.length > 0 ||
273
+ classicMenus?.length !== 1
274
+ ) {
275
+ return false;
276
+ }
260
277
 
261
- const {
262
- convert: convertClassicMenu,
263
- status: classicMenuConversionStatus,
264
- error: classicMenuConversionError,
265
- } = useConvertClassicToBlockMenu( clientId );
278
+ // If there's non fallback navigation menus and
279
+ // only one classic menu then create a new navigation menu based on it.
280
+ convertClassicMenu(
281
+ classicMenus[ 0 ].id,
282
+ classicMenus[ 0 ].name,
283
+ 'publish'
284
+ );
285
+ }, [ hasResolvedNavigationMenus ] );
266
286
 
267
- const isConvertingClassicMenu =
268
- classicMenuConversionStatus === CLASSIC_MENU_CONVERSION_PENDING;
287
+ const navRef = useRef();
269
288
 
270
289
  // The standard HTML5 tag for the block wrapper.
271
290
  const TagName = 'nav';
@@ -280,18 +299,21 @@ function Navigation( {
280
299
  ! isCreatingNavigationMenu &&
281
300
  ! isConvertingClassicMenu &&
282
301
  hasResolvedNavigationMenus &&
302
+ classicMenus?.length === 0 &&
283
303
  ! hasUncontrolledInnerBlocks;
284
304
 
285
- if ( isPlaceholder && ! ref ) {
286
- /**
287
- * this fallback only displays (both in editor and on front)
288
- * the list of pages block if no menu is available as a fallback.
289
- * We don't want the fallback to request a save,
290
- * nor to be undoable, hence we mark it non persistent.
291
- */
292
- __unstableMarkNextChangeAsNotPersistent();
293
- replaceInnerBlocks( clientId, [ createBlock( 'core/page-list' ) ] );
294
- }
305
+ useEffect( () => {
306
+ if ( isPlaceholder ) {
307
+ /**
308
+ * this fallback only displays (both in editor and on front)
309
+ * the list of pages block if no menu is available as a fallback.
310
+ * We don't want the fallback to request a save,
311
+ * nor to be undoable, hence we mark it non persistent.
312
+ */
313
+ __unstableMarkNextChangeAsNotPersistent();
314
+ replaceInnerBlocks( clientId, [ createBlock( 'core/page-list' ) ] );
315
+ }
316
+ }, [ clientId, isPlaceholder, ref ] );
295
317
 
296
318
  const isEntityAvailable =
297
319
  ! isNavigationMenuMissing && isNavigationMenuResolved;
@@ -474,7 +496,7 @@ function Navigation( {
474
496
  );
475
497
  } catch {
476
498
  showMenuAutoPublishDraftNotice(
477
- __( 'Error ocurred while publishing the navigation menu.' )
499
+ __( 'Error occurred while publishing the navigation menu.' )
478
500
  );
479
501
  }
480
502
  }, [ isDraftNavigationMenu, navigationMenu ] );
@@ -640,7 +662,8 @@ function Navigation( {
640
662
  onSelectClassicMenu={ async ( classicMenu ) => {
641
663
  const navMenu = await convertClassicMenu(
642
664
  classicMenu.id,
643
- classicMenu.name
665
+ classicMenu.name,
666
+ 'draft'
644
667
  );
645
668
  if ( navMenu ) {
646
669
  handleUpdateMenu( navMenu.id, {
@@ -684,6 +707,7 @@ function Navigation( {
684
707
  <UnsavedInnerBlocks
685
708
  blocks={ uncontrolledInnerBlocks }
686
709
  clientId={ clientId }
710
+ templateLock={ templateLock }
687
711
  navigationMenus={ navigationMenus }
688
712
  hasSelection={ isSelected || isInnerBlockSelected }
689
713
  hasSavedUnsavedInnerBlocks={
@@ -721,7 +745,8 @@ function Navigation( {
721
745
  onSelectClassicMenu={ async ( classicMenu ) => {
722
746
  const navMenu = await convertClassicMenu(
723
747
  classicMenu.id,
724
- classicMenu.name
748
+ classicMenu.name,
749
+ 'draft'
725
750
  );
726
751
  if ( navMenu ) {
727
752
  handleUpdateMenu( navMenu.id, {
@@ -806,7 +831,8 @@ function Navigation( {
806
831
  onSelectClassicMenu={ async ( classicMenu ) => {
807
832
  const navMenu = await convertClassicMenu(
808
833
  classicMenu.id,
809
- classicMenu.name
834
+ classicMenu.name,
835
+ 'draft'
810
836
  );
811
837
  if ( navMenu ) {
812
838
  handleUpdateMenu( navMenu.id, {
@@ -834,7 +860,8 @@ function Navigation( {
834
860
  onSelectClassicMenu={ async ( classicMenu ) => {
835
861
  const navMenu = await convertClassicMenu(
836
862
  classicMenu.id,
837
- classicMenu.name
863
+ classicMenu.name,
864
+ 'draft'
838
865
  );
839
866
  if ( navMenu ) {
840
867
  handleUpdateMenu( navMenu.id, {
@@ -919,6 +946,7 @@ function Navigation( {
919
946
  hasCustomPlaceholder={
920
947
  !! CustomPlaceholder
921
948
  }
949
+ templateLock={ templateLock }
922
950
  orientation={ orientation }
923
951
  />
924
952
  ) }
@@ -40,6 +40,7 @@ export default function NavigationInnerBlocks( {
40
40
  clientId,
41
41
  hasCustomPlaceholder,
42
42
  orientation,
43
+ templateLock,
43
44
  } ) {
44
45
  const {
45
46
  isImmediateParentOfSelectedBlock,
@@ -115,6 +116,7 @@ export default function NavigationInnerBlocks( {
115
116
  __experimentalDefaultBlock: DEFAULT_BLOCK,
116
117
  __experimentalDirectInsert: shouldDirectInsert,
117
118
  orientation,
119
+ templateLock,
118
120
 
119
121
  // As an exception to other blocks which feature nesting, show
120
122
  // the block appender even when a child block is selected.
@@ -129,11 +131,6 @@ export default function NavigationInnerBlocks( {
129
131
  parentOrChildHasSelection
130
132
  ? InnerBlocks.ButtonBlockAppender
131
133
  : false,
132
-
133
- // Template lock set to false here so that the Nav
134
- // Block on the experimental menus screen does not
135
- // inherit templateLock={ 'all' }.
136
- templateLock: false,
137
134
  __experimentalLayout: LAYOUT,
138
135
  placeholder: showPlaceholder ? placeholder : undefined,
139
136
  }
@@ -17,6 +17,10 @@ export const CLASSIC_MENU_CONVERSION_ERROR = 'error';
17
17
  export const CLASSIC_MENU_CONVERSION_PENDING = 'pending';
18
18
  export const CLASSIC_MENU_CONVERSION_IDLE = 'idle';
19
19
 
20
+ // This is needed to ensure that multiple components using this hook
21
+ // do not import the same classic menu twice.
22
+ let classicMenuBeingConvertedId = null;
23
+
20
24
  function useConvertClassicToBlockMenu( clientId ) {
21
25
  /*
22
26
  * The wp_navigation post is created as a draft so the changes on the frontend and
@@ -32,7 +36,11 @@ function useConvertClassicToBlockMenu( clientId ) {
32
36
  const [ status, setStatus ] = useState( CLASSIC_MENU_CONVERSION_IDLE );
33
37
  const [ error, setError ] = useState( null );
34
38
 
35
- async function convertClassicMenuToBlockMenu( menuId, menuName ) {
39
+ async function convertClassicMenuToBlockMenu(
40
+ menuId,
41
+ menuName,
42
+ postStatus = 'publish'
43
+ ) {
36
44
  let navigationMenu;
37
45
  let classicMenuItems;
38
46
 
@@ -76,7 +84,8 @@ function useConvertClassicToBlockMenu( clientId ) {
76
84
  try {
77
85
  navigationMenu = await createNavigationMenu(
78
86
  menuName,
79
- innerBlocks
87
+ innerBlocks,
88
+ postStatus
80
89
  );
81
90
 
82
91
  /**
@@ -91,7 +100,7 @@ function useConvertClassicToBlockMenu( clientId ) {
91
100
  'wp_navigation',
92
101
  navigationMenu.id,
93
102
  {
94
- status: 'publish',
103
+ status: postStatus,
95
104
  },
96
105
  { throwOnError: true }
97
106
  );
@@ -111,7 +120,15 @@ function useConvertClassicToBlockMenu( clientId ) {
111
120
  return navigationMenu;
112
121
  }
113
122
 
114
- const convert = useCallback( async ( menuId, menuName ) => {
123
+ const convert = useCallback( async ( menuId, menuName, postStatus ) => {
124
+ // Check whether this classic menu is being imported already.
125
+ if ( classicMenuBeingConvertedId === menuId ) {
126
+ return;
127
+ }
128
+
129
+ // Set the ID for the currently importing classic menu.
130
+ classicMenuBeingConvertedId = menuId;
131
+
115
132
  if ( ! menuId || ! menuName ) {
116
133
  setError( 'Unable to convert menu. Missing menu details.' );
117
134
  setStatus( CLASSIC_MENU_CONVERSION_ERROR );
@@ -121,15 +138,25 @@ function useConvertClassicToBlockMenu( clientId ) {
121
138
  setStatus( CLASSIC_MENU_CONVERSION_PENDING );
122
139
  setError( null );
123
140
 
124
- return await convertClassicMenuToBlockMenu( menuId, menuName )
141
+ return await convertClassicMenuToBlockMenu(
142
+ menuId,
143
+ menuName,
144
+ postStatus
145
+ )
125
146
  .then( ( navigationMenu ) => {
126
147
  setStatus( CLASSIC_MENU_CONVERSION_SUCCESS );
148
+ // Reset the ID for the currently importing classic menu.
149
+ classicMenuBeingConvertedId = null;
127
150
  return navigationMenu;
128
151
  } )
129
152
  .catch( ( err ) => {
130
153
  setError( err?.message );
154
+ // Reset the ID for the currently importing classic menu.
131
155
  setStatus( CLASSIC_MENU_CONVERSION_ERROR );
132
156
 
157
+ // Reset the ID for the currently importing classic menu.
158
+ classicMenuBeingConvertedId = null;
159
+
133
160
  // Rethrow error for debugging.
134
161
  throw new Error(
135
162
  sprintf(
@@ -16,10 +16,7 @@ export const CREATE_NAVIGATION_MENU_ERROR = 'error';
16
16
  export const CREATE_NAVIGATION_MENU_PENDING = 'pending';
17
17
  export const CREATE_NAVIGATION_MENU_IDLE = 'idle';
18
18
 
19
- export default function useCreateNavigationMenu(
20
- clientId,
21
- postStatus = 'publish'
22
- ) {
19
+ export default function useCreateNavigationMenu( clientId ) {
23
20
  const [ status, setStatus ] = useState( CREATE_NAVIGATION_MENU_IDLE );
24
21
  const [ value, setValue ] = useState( null );
25
22
  const [ error, setError ] = useState( null );
@@ -30,7 +27,7 @@ export default function useCreateNavigationMenu(
30
27
  // This callback uses data from the two placeholder steps and only creates
31
28
  // a new navigation menu when the user completes the final step.
32
29
  const create = useCallback(
33
- async ( title = null, blocks = [] ) => {
30
+ async ( title = null, blocks = [], postStatus ) => {
34
31
  // Guard against creating Navigations without a title.
35
32
  // Note you can pass no title, but if one is passed it must be
36
33
  // a string otherwise the title may end up being empty.
@@ -291,6 +291,7 @@ $color-control-label-height: 20px;
291
291
  bottom: 0;
292
292
  left: 0;
293
293
  pointer-events: none;
294
+ border: $border-width dashed currentColor;
294
295
  @include placeholder-style();
295
296
 
296
297
  // Inherit border radius from style variations.
@@ -629,3 +630,9 @@ body.editor-styles-wrapper
629
630
  margin-bottom: $grid-unit-20;
630
631
  width: 100%;
631
632
  }
633
+
634
+ // Buttons inside a disabled component get semitransparent when there's a clickthrough overlay.
635
+ // Since this navigation button is content rather than UI, however, override that.
636
+ .wp-block-navigation__responsive-container-open.components-button {
637
+ opacity: 1;
638
+ }
@@ -248,6 +248,99 @@ function block_core_navigation_render_submenu_icon() {
248
248
  return '<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>';
249
249
  }
250
250
 
251
+ /**
252
+ * Get the classic navigation menu to use as a fallback.
253
+ *
254
+ * @return object WP_Term The classic navigation.
255
+ */
256
+ function block_core_navigation_get_classic_menu_fallback() {
257
+ $classic_nav_menus = wp_get_nav_menus();
258
+
259
+ // If menus exist.
260
+ if ( $classic_nav_menus && ! is_wp_error( $classic_nav_menus ) && count( $classic_nav_menus ) === 1 ) {
261
+ // Use the first classic menu only. Handles simple use case where user has a single
262
+ // classic menu and switches to a block theme. In future this maybe expanded to
263
+ // determine the most appropriate classic menu to be used based on location.
264
+ return $classic_nav_menus[0];
265
+ }
266
+ }
267
+
268
+ /**
269
+ * Converts a classic navigation to blocks.
270
+ *
271
+ * @param object $classic_nav_menu WP_Term The classic navigation object to convert.
272
+ * @return array the normalized parsed blocks.
273
+ */
274
+ function block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu ) {
275
+ // BEGIN: Code that already exists in wp_nav_menu().
276
+ $menu_items = wp_get_nav_menu_items( $classic_nav_menu->term_id, array( 'update_post_term_cache' => false ) );
277
+
278
+ // Set up the $menu_item variables.
279
+ _wp_menu_item_classes_by_context( $menu_items );
280
+
281
+ $sorted_menu_items = array();
282
+ foreach ( (array) $menu_items as $menu_item ) {
283
+ $sorted_menu_items[ $menu_item->menu_order ] = $menu_item;
284
+ }
285
+
286
+ unset( $menu_items, $menu_item );
287
+
288
+ // END: Code that already exists in wp_nav_menu().
289
+
290
+ $menu_items_by_parent_id = array();
291
+ foreach ( $sorted_menu_items as $menu_item ) {
292
+ $menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item;
293
+ }
294
+
295
+ $inner_blocks = block_core_navigation_parse_blocks_from_menu_items(
296
+ isset( $menu_items_by_parent_id[0] )
297
+ ? $menu_items_by_parent_id[0]
298
+ : array(),
299
+ $menu_items_by_parent_id
300
+ );
301
+
302
+ return serialize_blocks( $inner_blocks );
303
+ }
304
+
305
+ /**
306
+ * If there's a the classic menu then use it as a fallback.
307
+ *
308
+ * @return array the normalized parsed blocks.
309
+ */
310
+ function block_core_navigation_maybe_use_classic_menu_fallback() {
311
+ // See if we have a classic menu.
312
+ $classic_nav_menu = block_core_navigation_get_classic_menu_fallback();
313
+
314
+ if ( ! $classic_nav_menu ) {
315
+ return;
316
+ }
317
+
318
+ // If we have a classic menu then convert it to blocks.
319
+ $classic_nav_menu_blocks = block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu );
320
+
321
+ if ( empty( $classic_nav_menu_blocks ) ) {
322
+ return;
323
+ }
324
+
325
+ // Create a new navigation menu from the classic menu.
326
+ $wp_insert_post_result = wp_insert_post(
327
+ array(
328
+ 'post_content' => $classic_nav_menu_blocks,
329
+ 'post_title' => $classic_nav_menu->slug,
330
+ 'post_name' => $classic_nav_menu->slug,
331
+ 'post_status' => 'publish',
332
+ 'post_type' => 'wp_navigation',
333
+ ),
334
+ true // So that we can check whether the result is an error.
335
+ );
336
+
337
+ if ( is_wp_error( $wp_insert_post_result ) ) {
338
+ return;
339
+ }
340
+
341
+ // Fetch the most recently published navigation which will be the classic one created above.
342
+ return block_core_navigation_get_most_recently_published_navigation();
343
+ }
251
344
 
252
345
  /**
253
346
  * Finds the most recently published `wp_navigation` Post.
@@ -255,7 +348,8 @@ function block_core_navigation_render_submenu_icon() {
255
348
  * @return WP_Post|null the first non-empty Navigation or null.
256
349
  */
257
350
  function block_core_navigation_get_most_recently_published_navigation() {
258
- // We default to the most recently created menu.
351
+
352
+ // Default to the most recently created menu.
259
353
  $parsed_args = array(
260
354
  'post_type' => 'wp_navigation',
261
355
  'no_found_rows' => true,
@@ -307,9 +401,6 @@ function block_core_navigation_get_fallback_blocks() {
307
401
  $page_list_fallback = array(
308
402
  array(
309
403
  'blockName' => 'core/page-list',
310
- 'attrs' => array(
311
- '__unstableMaxPages' => 4,
312
- ),
313
404
  ),
314
405
  );
315
406
 
@@ -322,7 +413,13 @@ function block_core_navigation_get_fallback_blocks() {
322
413
 
323
414
  $navigation_post = block_core_navigation_get_most_recently_published_navigation();
324
415
 
325
- // Prefer using the first non-empty Navigation as fallback if available.
416
+ // If there are no navigation posts then try to find a classic menu
417
+ // and convert it into a block based navigation menu.
418
+ if ( ! $navigation_post ) {
419
+ $navigation_post = block_core_navigation_maybe_use_classic_menu_fallback();
420
+ }
421
+
422
+ // Use the first non-empty Navigation as fallback if available.
326
423
  if ( $navigation_post ) {
327
424
  $maybe_fallback = block_core_navigation_filter_out_empty_blocks( parse_blocks( $navigation_post->post_content ) );
328
425
 
@@ -649,7 +746,7 @@ function render_block_core_navigation( $attributes, $content, $block ) {
649
746
  $toggle_aria_label_close,
650
747
  esc_attr( implode( ' ', $responsive_container_classes ) ),
651
748
  esc_attr( implode( ' ', $open_button_classes ) ),
652
- safecss_filter_attr( $colors['overlay_inline_styles'] ),
749
+ esc_attr( safecss_filter_attr( $colors['overlay_inline_styles'] ) ),
653
750
  __( 'Menu' ),
654
751
  $toggle_button_content,
655
752
  $toggle_close_button_content
@@ -47,6 +47,14 @@ $navigation-icon-size: 24px;
47
47
  display: block;
48
48
  }
49
49
 
50
+ // This rule needs extra specificity so that it inherits the correct color from its parent.
51
+ // Otherwise, a link color set by a parent group can override the value.
52
+ // This also fixes an issue where a navigation with an explicitly set color is overridden
53
+ // by link colors defined in Global Styles.
54
+ .wp-block-navigation-item__content.wp-block-navigation-item__content {
55
+ color: inherit;
56
+ }
57
+
50
58
  // The following rules provide class based application of user selected text
51
59
  // decoration via block supports.
52
60
  &.has-text-decoration-underline .wp-block-navigation-item__content {
@@ -467,7 +467,7 @@ export default function NavigationLinkEdit( {
467
467
  const [ popoverAnchor, setPopoverAnchor ] = useState( null );
468
468
  const listItemRef = useRef( null );
469
469
  const isDraggingWithin = useIsDraggingWithin( listItemRef );
470
- const itemLabelPlaceholder = __( 'Add link…' );
470
+ const itemLabelPlaceholder = __( 'Add label…' );
471
471
  const ref = useRef();
472
472
 
473
473
  const pagesPermissions = useResourcePermissions( 'pages' );
@@ -98,7 +98,14 @@ function block_core_navigation_link_build_css_font_sizes( $context ) {
98
98
  $font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] );
99
99
  } elseif ( $has_custom_font_size ) {
100
100
  // Add the custom font size inline style.
101
- $font_sizes['inline_styles'] = sprintf( 'font-size: %s;', $context['style']['typography']['fontSize'] );
101
+ $font_sizes['inline_styles'] = sprintf(
102
+ 'font-size: %s;',
103
+ wp_get_typography_font_size_value(
104
+ array(
105
+ 'size' => $context['style']['typography']['fontSize'],
106
+ )
107
+ )
108
+ );
102
109
  }
103
110
 
104
111
  return $font_sizes;
@@ -98,7 +98,14 @@ function block_core_navigation_submenu_build_css_font_sizes( $context ) {
98
98
  $font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] );
99
99
  } elseif ( $has_custom_font_size ) {
100
100
  // Add the custom font size inline style.
101
- $font_sizes['inline_styles'] = sprintf( 'font-size: %s;', $context['style']['typography']['fontSize'] );
101
+ $font_sizes['inline_styles'] = sprintf(
102
+ 'font-size: %s;',
103
+ wp_get_typography_font_size_value(
104
+ array(
105
+ 'size' => $context['style']['typography']['fontSize'],
106
+ )
107
+ )
108
+ );
102
109
  }
103
110
 
104
111
  return $font_sizes;
@@ -7,11 +7,7 @@
7
7
  "description": "Display a list of all pages.",
8
8
  "keywords": [ "menu", "navigation" ],
9
9
  "textdomain": "default",
10
- "attributes": {
11
- "__unstableMaxPages": {
12
- "type": "number"
13
- }
14
- },
10
+ "attributes": {},
15
11
  "usesContext": [
16
12
  "textColor",
17
13
  "customTextColor",
@@ -119,7 +119,14 @@ function block_core_page_list_build_css_font_sizes( $context ) {
119
119
  $font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] );
120
120
  } elseif ( $has_custom_font_size ) {
121
121
  // Add the custom font size inline style.
122
- $font_sizes['inline_styles'] = sprintf( 'font-size: %s;', $context['style']['typography']['fontSize'] );
122
+ $font_sizes['inline_styles'] = sprintf(
123
+ 'font-size: %s;',
124
+ wp_get_typography_font_size_value(
125
+ array(
126
+ 'size' => $context['style']['typography']['fontSize'],
127
+ )
128
+ )
129
+ );
123
130
  }
124
131
 
125
132
  return $font_sizes;
@@ -189,7 +196,7 @@ function block_core_page_list_render_nested_page_list( $open_submenus_on_click,
189
196
 
190
197
  if ( isset( $page['children'] ) && $is_navigation_child && $open_submenus_on_click ) {
191
198
  $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 ) .
192
- '</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>';
199
+ '</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>';
193
200
  } else {
194
201
  $markup .= '<a class="wp-block-pages-list__item__link' . esc_attr( $navigation_child_content_class ) . '" href="' . esc_url( $page['link'] ) . '"' . $aria_current . '>' . $title . '</a>';
195
202
  }
@@ -243,7 +250,7 @@ function block_core_page_list_nest_pages( $current_level, $children ) {
243
250
  */
244
251
  function render_block_core_page_list( $attributes, $content, $block ) {
245
252
  static $block_id = 0;
246
- $block_id++;
253
+ ++$block_id;
247
254
 
248
255
  $all_pages = get_pages(
249
256
  array(
@@ -299,11 +306,6 @@ function render_block_core_page_list( $attributes, $content, $block ) {
299
306
 
300
307
  $nested_pages = block_core_page_list_nest_pages( $top_level_pages, $pages_with_children );
301
308
 
302
- // Limit the number of items to be visually displayed.
303
- if ( ! empty( $attributes['__unstableMaxPages'] ) ) {
304
- $nested_pages = array_slice( $nested_pages, 0, $attributes['__unstableMaxPages'] );
305
- }
306
-
307
309
  $is_navigation_child = array_key_exists( 'showSubmenuIcon', $block->context );
308
310
 
309
311
  $open_submenus_on_click = array_key_exists( 'openSubmenusOnClick', $block->context ) ? $block->context['openSubmenusOnClick'] : false;
@@ -11,8 +11,11 @@ import {
11
11
  getColorClassName,
12
12
  getFontSizeClass,
13
13
  RichText,
14
+ useBlockProps,
14
15
  } from '@wordpress/block-editor';
15
16
 
17
+ import { isRTL } from '@wordpress/i18n';
18
+
16
19
  const supports = {
17
20
  className: false,
18
21
  };
@@ -90,6 +93,39 @@ const migrateCustomColorsAndFontSizes = ( attributes ) => {
90
93
  const { style, ...restBlockAttributes } = blockAttributes;
91
94
 
92
95
  const deprecated = [
96
+ // Version without drop cap on aligned text.
97
+ {
98
+ supports,
99
+ attributes: {
100
+ ...restBlockAttributes,
101
+ customTextColor: {
102
+ type: 'string',
103
+ },
104
+ customBackgroundColor: {
105
+ type: 'string',
106
+ },
107
+ customFontSize: {
108
+ type: 'number',
109
+ },
110
+ },
111
+ save( { attributes } ) {
112
+ const { align, content, dropCap, direction } = attributes;
113
+ const className = classnames( {
114
+ 'has-drop-cap':
115
+ align === ( isRTL() ? 'left' : 'right' ) ||
116
+ align === 'center'
117
+ ? false
118
+ : dropCap,
119
+ [ `has-text-align-${ align }` ]: align,
120
+ } );
121
+
122
+ return (
123
+ <p { ...useBlockProps.save( { className, dir: direction } ) }>
124
+ <RichText.Content value={ content } />
125
+ </p>
126
+ );
127
+ },
128
+ },
93
129
  {
94
130
  supports,
95
131
  attributes: {