@wordpress/block-library 7.17.0 → 7.19.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 +4 -0
  2. package/build/audio/edit.js +44 -4
  3. package/build/audio/edit.js.map +1 -1
  4. package/build/button/deprecated.js +16 -2
  5. package/build/button/deprecated.js.map +1 -1
  6. package/build/button/edit.js +14 -8
  7. package/build/button/edit.js.map +1 -1
  8. package/build/button/index.js +4 -1
  9. package/build/button/index.js.map +1 -1
  10. package/build/button/save.js +2 -0
  11. package/build/button/save.js.map +1 -1
  12. package/build/buttons/edit.native.js +1 -1
  13. package/build/buttons/edit.native.js.map +1 -1
  14. package/build/columns/transforms.js +5 -0
  15. package/build/columns/transforms.js.map +1 -1
  16. package/build/comment-template/index.js +6 -2
  17. package/build/comment-template/index.js.map +1 -1
  18. package/build/cover/edit/index.js +3 -1
  19. package/build/cover/edit/index.js.map +1 -1
  20. package/build/cover/edit/inspector-controls.js +3 -7
  21. package/build/cover/edit/inspector-controls.js.map +1 -1
  22. package/build/embed/deprecated.js +43 -4
  23. package/build/embed/deprecated.js.map +1 -1
  24. package/build/file/deprecated.js +108 -4
  25. package/build/file/deprecated.js.map +1 -1
  26. package/build/file/transforms.js +3 -9
  27. package/build/file/transforms.js.map +1 -1
  28. package/build/gallery/deprecated.js +148 -23
  29. package/build/gallery/deprecated.js.map +1 -1
  30. package/build/gallery/gallery.js +3 -2
  31. package/build/gallery/gallery.js.map +1 -1
  32. package/build/gallery/use-image-sizes.js +2 -1
  33. package/build/gallery/use-image-sizes.js.map +1 -1
  34. package/build/gallery/v1/edit.js +6 -3
  35. package/build/gallery/v1/edit.js.map +1 -1
  36. package/build/group/edit.js +105 -48
  37. package/build/group/edit.js.map +1 -1
  38. package/build/group/index.js +3 -0
  39. package/build/group/index.js.map +1 -1
  40. package/build/group/placeholder.js +168 -0
  41. package/build/group/placeholder.js.map +1 -0
  42. package/build/group/variations.js +3 -3
  43. package/build/group/variations.js.map +1 -1
  44. package/build/image/edit.native.js +1 -1
  45. package/build/image/edit.native.js.map +1 -1
  46. package/build/image/image.js +6 -9
  47. package/build/image/image.js.map +1 -1
  48. package/build/latest-comments/edit.js +2 -1
  49. package/build/latest-comments/edit.js.map +1 -1
  50. package/build/latest-comments/index.js +5 -1
  51. package/build/latest-comments/index.js.map +1 -1
  52. package/build/latest-posts/deprecated.js +13 -0
  53. package/build/latest-posts/deprecated.js.map +1 -1
  54. package/build/latest-posts/edit.js +1 -1
  55. package/build/latest-posts/edit.js.map +1 -1
  56. package/build/latest-posts/index.js +13 -0
  57. package/build/latest-posts/index.js.map +1 -1
  58. package/build/list/utils.js +4 -8
  59. package/build/list/utils.js.map +1 -1
  60. package/build/list-item/edit.js +2 -1
  61. package/build/list-item/edit.js.map +1 -1
  62. package/build/list-item/hooks/use-outdent-list-item.js +5 -7
  63. package/build/list-item/hooks/use-outdent-list-item.js.map +1 -1
  64. package/build/navigation/edit/index.js +94 -103
  65. package/build/navigation/edit/index.js.map +1 -1
  66. package/build/navigation/edit/manage-menus-button.js +36 -0
  67. package/build/navigation/edit/manage-menus-button.js.map +1 -0
  68. package/build/navigation/edit/navigation-menu-selector.js +12 -5
  69. package/build/navigation/edit/navigation-menu-selector.js.map +1 -1
  70. package/build/navigation/edit/responsive-wrapper.js +2 -6
  71. package/build/navigation/edit/responsive-wrapper.js.map +1 -1
  72. package/build/navigation/edit/unsaved-inner-blocks.js +5 -17
  73. package/build/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  74. package/build/navigation-link/edit.js +14 -3
  75. package/build/navigation-link/edit.js.map +1 -1
  76. package/build/navigation-submenu/edit.js +4 -4
  77. package/build/navigation-submenu/edit.js.map +1 -1
  78. package/build/page-list/edit.js +29 -10
  79. package/build/page-list/edit.js.map +1 -1
  80. package/build/post-author/edit.js +35 -20
  81. package/build/post-author/edit.js.map +1 -1
  82. package/build/post-comments-count/index.js +4 -0
  83. package/build/post-comments-count/index.js.map +1 -1
  84. package/build/post-comments-form/index.js +4 -0
  85. package/build/post-comments-form/index.js.map +1 -1
  86. package/build/post-comments-link/index.js +4 -0
  87. package/build/post-comments-link/index.js.map +1 -1
  88. package/build/post-content/edit.js +14 -6
  89. package/build/post-content/edit.js.map +1 -1
  90. package/build/post-content/index.js +3 -0
  91. package/build/post-content/index.js.map +1 -1
  92. package/build/pullquote/deprecated.js +6 -6
  93. package/build/pullquote/deprecated.js.map +1 -1
  94. package/build/search/edit.js +1 -3
  95. package/build/search/edit.js.map +1 -1
  96. package/build/site-logo/edit.js +2 -2
  97. package/build/site-logo/edit.js.map +1 -1
  98. package/build/site-tagline/edit.js +21 -9
  99. package/build/site-tagline/edit.js.map +1 -1
  100. package/build/site-title/edit/index.js +20 -8
  101. package/build/site-title/edit/index.js.map +1 -1
  102. package/build/social-link/edit.js +11 -2
  103. package/build/social-link/edit.js.map +1 -1
  104. package/build/social-link/index.js +3 -0
  105. package/build/social-link/index.js.map +1 -1
  106. package/build/spacer/controls.js +3 -7
  107. package/build/spacer/controls.js.map +1 -1
  108. package/build/table/deprecated.js +282 -27
  109. package/build/table/deprecated.js.map +1 -1
  110. package/build/table/state.js +1 -1
  111. package/build/table/state.js.map +1 -1
  112. package/build/template-part/variations.js +5 -0
  113. package/build/template-part/variations.js.map +1 -1
  114. package/build/utils/clean-empty-object.js +5 -4
  115. package/build/utils/clean-empty-object.js.map +1 -1
  116. package/build/video/deprecated.js +159 -0
  117. package/build/video/deprecated.js.map +1 -0
  118. package/build/video/edit.js +41 -5
  119. package/build/video/edit.js.map +1 -1
  120. package/build/video/index.js +3 -0
  121. package/build/video/index.js.map +1 -1
  122. package/build/video/tracks-editor.js +3 -28
  123. package/build/video/tracks-editor.js.map +1 -1
  124. package/build-module/audio/edit.js +46 -7
  125. package/build-module/audio/edit.js.map +1 -1
  126. package/build-module/button/deprecated.js +16 -2
  127. package/build-module/button/deprecated.js.map +1 -1
  128. package/build-module/button/edit.js +16 -10
  129. package/build-module/button/edit.js.map +1 -1
  130. package/build-module/button/index.js +4 -1
  131. package/build-module/button/index.js.map +1 -1
  132. package/build-module/button/save.js +2 -0
  133. package/build-module/button/save.js.map +1 -1
  134. package/build-module/buttons/edit.native.js +1 -1
  135. package/build-module/buttons/edit.native.js.map +1 -1
  136. package/build-module/columns/transforms.js +5 -0
  137. package/build-module/columns/transforms.js.map +1 -1
  138. package/build-module/comment-template/index.js +6 -2
  139. package/build-module/comment-template/index.js.map +1 -1
  140. package/build-module/cover/edit/index.js +3 -1
  141. package/build-module/cover/edit/index.js.map +1 -1
  142. package/build-module/cover/edit/inspector-controls.js +4 -8
  143. package/build-module/cover/edit/inspector-controls.js.map +1 -1
  144. package/build-module/embed/deprecated.js +44 -5
  145. package/build-module/embed/deprecated.js.map +1 -1
  146. package/build-module/file/deprecated.js +108 -4
  147. package/build-module/file/deprecated.js.map +1 -1
  148. package/build-module/file/transforms.js +3 -8
  149. package/build-module/file/transforms.js.map +1 -1
  150. package/build-module/gallery/deprecated.js +147 -25
  151. package/build-module/gallery/deprecated.js.map +1 -1
  152. package/build-module/gallery/gallery.js +3 -2
  153. package/build-module/gallery/gallery.js.map +1 -1
  154. package/build-module/gallery/use-image-sizes.js +3 -2
  155. package/build-module/gallery/use-image-sizes.js.map +1 -1
  156. package/build-module/gallery/v1/edit.js +7 -4
  157. package/build-module/gallery/v1/edit.js.map +1 -1
  158. package/build-module/group/edit.js +101 -48
  159. package/build-module/group/edit.js.map +1 -1
  160. package/build-module/group/index.js +3 -0
  161. package/build-module/group/index.js.map +1 -1
  162. package/build-module/group/placeholder.js +154 -0
  163. package/build-module/group/placeholder.js.map +1 -0
  164. package/build-module/group/variations.js +3 -3
  165. package/build-module/group/variations.js.map +1 -1
  166. package/build-module/image/edit.native.js +1 -1
  167. package/build-module/image/edit.native.js.map +1 -1
  168. package/build-module/image/image.js +8 -11
  169. package/build-module/image/image.js.map +1 -1
  170. package/build-module/latest-comments/edit.js +2 -1
  171. package/build-module/latest-comments/edit.js.map +1 -1
  172. package/build-module/latest-comments/index.js +5 -1
  173. package/build-module/latest-comments/index.js.map +1 -1
  174. package/build-module/latest-posts/deprecated.js +13 -0
  175. package/build-module/latest-posts/deprecated.js.map +1 -1
  176. package/build-module/latest-posts/edit.js +2 -2
  177. package/build-module/latest-posts/edit.js.map +1 -1
  178. package/build-module/latest-posts/index.js +13 -0
  179. package/build-module/latest-posts/index.js.map +1 -1
  180. package/build-module/list/utils.js +5 -9
  181. package/build-module/list/utils.js.map +1 -1
  182. package/build-module/list-item/edit.js +2 -1
  183. package/build-module/list-item/edit.js.map +1 -1
  184. package/build-module/list-item/hooks/use-outdent-list-item.js +5 -6
  185. package/build-module/list-item/hooks/use-outdent-list-item.js.map +1 -1
  186. package/build-module/navigation/edit/index.js +96 -105
  187. package/build-module/navigation/edit/index.js.map +1 -1
  188. package/build-module/navigation/edit/manage-menus-button.js +26 -0
  189. package/build-module/navigation/edit/manage-menus-button.js.map +1 -0
  190. package/build-module/navigation/edit/navigation-menu-selector.js +13 -6
  191. package/build-module/navigation/edit/navigation-menu-selector.js.map +1 -1
  192. package/build-module/navigation/edit/responsive-wrapper.js +2 -6
  193. package/build-module/navigation/edit/responsive-wrapper.js.map +1 -1
  194. package/build-module/navigation/edit/unsaved-inner-blocks.js +7 -18
  195. package/build-module/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  196. package/build-module/navigation-link/edit.js +14 -4
  197. package/build-module/navigation-link/edit.js.map +1 -1
  198. package/build-module/navigation-submenu/edit.js +4 -4
  199. package/build-module/navigation-submenu/edit.js.map +1 -1
  200. package/build-module/page-list/edit.js +29 -10
  201. package/build-module/page-list/edit.js.map +1 -1
  202. package/build-module/post-author/edit.js +35 -21
  203. package/build-module/post-author/edit.js.map +1 -1
  204. package/build-module/post-comments-count/index.js +4 -0
  205. package/build-module/post-comments-count/index.js.map +1 -1
  206. package/build-module/post-comments-form/index.js +4 -0
  207. package/build-module/post-comments-form/index.js.map +1 -1
  208. package/build-module/post-comments-link/index.js +4 -0
  209. package/build-module/post-comments-link/index.js.map +1 -1
  210. package/build-module/post-content/edit.js +14 -6
  211. package/build-module/post-content/edit.js.map +1 -1
  212. package/build-module/post-content/index.js +3 -0
  213. package/build-module/post-content/index.js.map +1 -1
  214. package/build-module/pullquote/deprecated.js +7 -7
  215. package/build-module/pullquote/deprecated.js.map +1 -1
  216. package/build-module/search/edit.js +1 -3
  217. package/build-module/search/edit.js.map +1 -1
  218. package/build-module/site-logo/edit.js +3 -3
  219. package/build-module/site-logo/edit.js.map +1 -1
  220. package/build-module/site-tagline/edit.js +23 -11
  221. package/build-module/site-tagline/edit.js.map +1 -1
  222. package/build-module/site-title/edit/index.js +22 -10
  223. package/build-module/site-title/edit/index.js.map +1 -1
  224. package/build-module/social-link/edit.js +11 -2
  225. package/build-module/social-link/edit.js.map +1 -1
  226. package/build-module/social-link/index.js +3 -0
  227. package/build-module/social-link/index.js.map +1 -1
  228. package/build-module/spacer/controls.js +4 -8
  229. package/build-module/spacer/controls.js.map +1 -1
  230. package/build-module/table/deprecated.js +282 -27
  231. package/build-module/table/deprecated.js.map +1 -1
  232. package/build-module/table/state.js +1 -1
  233. package/build-module/table/state.js.map +1 -1
  234. package/build-module/template-part/variations.js +5 -0
  235. package/build-module/template-part/variations.js.map +1 -1
  236. package/build-module/utils/clean-empty-object.js +5 -5
  237. package/build-module/utils/clean-empty-object.js.map +1 -1
  238. package/build-module/video/deprecated.js +147 -0
  239. package/build-module/video/deprecated.js.map +1 -0
  240. package/build-module/video/edit.js +45 -9
  241. package/build-module/video/edit.js.map +1 -1
  242. package/build-module/video/index.js +2 -0
  243. package/build-module/video/index.js.map +1 -1
  244. package/build-module/video/tracks-editor.js +4 -29
  245. package/build-module/video/tracks-editor.js.map +1 -1
  246. package/build-style/button/style-rtl.css +1 -0
  247. package/build-style/button/style.css +1 -0
  248. package/build-style/comment-template/style-rtl.css +1 -0
  249. package/build-style/comment-template/style.css +1 -0
  250. package/build-style/editor-rtl.css +80 -5
  251. package/build-style/editor.css +80 -5
  252. package/build-style/group/editor-rtl.css +44 -0
  253. package/build-style/group/editor.css +44 -0
  254. package/build-style/latest-comments/style-rtl.css +1 -0
  255. package/build-style/latest-comments/style.css +1 -0
  256. package/build-style/latest-posts/style-rtl.css +3 -0
  257. package/build-style/latest-posts/style.css +3 -0
  258. package/build-style/navigation/editor-rtl.css +27 -4
  259. package/build-style/navigation/editor.css +27 -4
  260. package/build-style/navigation/style-rtl.css +13 -1
  261. package/build-style/navigation/style.css +13 -1
  262. package/build-style/navigation-link/editor-rtl.css +8 -1
  263. package/build-style/navigation-link/editor.css +8 -1
  264. package/build-style/post-comments-form/style-rtl.css +3 -0
  265. package/build-style/post-comments-form/style.css +3 -0
  266. package/build-style/query/editor-rtl.css +1 -1
  267. package/build-style/query/editor.css +1 -1
  268. package/build-style/query-pagination/style-rtl.css +1 -1
  269. package/build-style/query-pagination/style.css +1 -1
  270. package/build-style/style-rtl.css +28 -2
  271. package/build-style/style.css +28 -2
  272. package/build-style/table/editor-rtl.css +1 -0
  273. package/build-style/table/editor.css +1 -0
  274. package/build-style/table/style-rtl.css +5 -0
  275. package/build-style/table/style.css +5 -0
  276. package/build-style/table/theme-rtl.css +1 -3
  277. package/build-style/table/theme.css +1 -3
  278. package/build-style/theme-rtl.css +1 -3
  279. package/build-style/theme.css +1 -3
  280. package/package.json +29 -28
  281. package/src/audio/edit.js +79 -24
  282. package/src/avatar/index.php +1 -1
  283. package/src/block/test/edit.native.js +8 -8
  284. package/src/button/block.json +4 -1
  285. package/src/button/deprecated.js +18 -2
  286. package/src/button/edit.js +12 -10
  287. package/src/button/save.js +12 -2
  288. package/src/button/style.scss +2 -0
  289. package/src/buttons/edit.native.js +1 -1
  290. package/src/buttons/test/edit.native.js +19 -19
  291. package/src/columns/test/edit.native.js +32 -32
  292. package/src/columns/transforms.js +8 -0
  293. package/src/comment-template/block.json +6 -2
  294. package/src/comment-template/style.scss +2 -0
  295. package/src/cover/edit/index.js +3 -1
  296. package/src/cover/edit/inspector-controls.js +11 -13
  297. package/src/cover/test/edit.native.js +26 -26
  298. package/src/embed/deprecated.js +53 -26
  299. package/src/embed/test/index.native.js +43 -43
  300. package/src/file/deprecated.js +130 -2
  301. package/src/file/transforms.js +3 -8
  302. package/src/gallery/deprecated.js +129 -4
  303. package/src/gallery/gallery.js +2 -0
  304. package/src/gallery/index.php +19 -10
  305. package/src/gallery/test/index.native.js +11 -11
  306. package/src/gallery/use-image-sizes.js +3 -2
  307. package/src/gallery/v1/edit.js +21 -25
  308. package/src/group/block.json +3 -0
  309. package/src/group/edit.js +105 -46
  310. package/src/group/editor.scss +48 -0
  311. package/src/group/placeholder.js +187 -0
  312. package/src/group/test/edit.native.js +3 -3
  313. package/src/group/test/placeholder.js +78 -0
  314. package/src/group/variations.js +3 -3
  315. package/src/image/edit.native.js +1 -1
  316. package/src/image/image.js +22 -10
  317. package/src/image/test/edit.native.js +17 -17
  318. package/src/latest-comments/block.json +5 -1
  319. package/src/latest-comments/edit.js +1 -0
  320. package/src/latest-comments/style.scss +3 -0
  321. package/src/latest-posts/block.json +13 -0
  322. package/src/latest-posts/edit.js +2 -2
  323. package/src/latest-posts/style.scss +3 -0
  324. package/src/list/test/edit.native.js +36 -36
  325. package/src/list/utils.js +3 -11
  326. package/src/list-item/edit.js +1 -0
  327. package/src/list-item/hooks/use-outdent-list-item.js +3 -6
  328. package/src/missing/test/edit-integration.native.js +5 -5
  329. package/src/navigation/edit/index.js +186 -161
  330. package/src/navigation/edit/manage-menus-button.js +21 -0
  331. package/src/navigation/edit/navigation-menu-selector.js +20 -5
  332. package/src/navigation/edit/responsive-wrapper.js +2 -10
  333. package/src/navigation/edit/unsaved-inner-blocks.js +5 -22
  334. package/src/navigation/editor.scss +29 -4
  335. package/src/navigation/style.scss +19 -1
  336. package/src/navigation-link/edit.js +13 -4
  337. package/src/navigation-link/editor.scss +8 -0
  338. package/src/navigation-submenu/edit.js +7 -5
  339. package/src/page-list/edit.js +36 -22
  340. package/src/post-author/edit.js +44 -20
  341. package/src/post-comments-count/block.json +4 -0
  342. package/src/post-comments-form/block.json +4 -0
  343. package/src/post-comments-form/style.scss +3 -0
  344. package/src/post-comments-link/block.json +4 -0
  345. package/src/post-content/block.json +3 -0
  346. package/src/post-content/edit.js +8 -4
  347. package/src/pullquote/deprecated.js +7 -7
  348. package/src/query/editor.scss +1 -1
  349. package/src/query-pagination/style.scss +1 -1
  350. package/src/read-more/index.php +9 -2
  351. package/src/search/edit.js +1 -1
  352. package/src/shortcode/test/edit.native.js +5 -5
  353. package/src/site-logo/edit.js +3 -3
  354. package/src/site-tagline/edit.js +25 -18
  355. package/src/site-title/edit/index.js +26 -12
  356. package/src/social-link/block.json +3 -0
  357. package/src/social-link/edit.js +8 -1
  358. package/src/social-link/index.php +11 -7
  359. package/src/social-link/test/index.native.js +10 -10
  360. package/src/social-links/test/edit.native.js +4 -4
  361. package/src/spacer/controls.js +10 -12
  362. package/src/spacer/test/index.native.js +17 -17
  363. package/src/table/deprecated.js +587 -348
  364. package/src/table/editor.scss +1 -0
  365. package/src/table/state.js +1 -1
  366. package/src/table/style.scss +7 -0
  367. package/src/table/theme.scss +1 -3
  368. package/src/template-part/index.php +5 -0
  369. package/src/template-part/variations.js +4 -0
  370. package/src/utils/clean-empty-object.js +5 -6
  371. package/src/video/deprecated.js +57 -0
  372. package/src/video/edit.js +71 -23
  373. package/src/video/index.js +2 -0
  374. package/src/video/tracks-editor.js +12 -28
package/src/list/utils.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { createBlock } from '@wordpress/blocks';
4
+ import { createBlock, rawHandler } from '@wordpress/blocks';
5
5
 
6
6
  export function createListBlockFromDOMElement( listElement ) {
7
7
  const listAttributes = {
@@ -70,15 +70,7 @@ export function migrateToListV2( attributes ) {
70
70
  list.setAttribute( 'type', type );
71
71
  }
72
72
 
73
- const listBlock = createListBlockFromDOMElement( list );
73
+ const [ listBlock ] = rawHandler( { HTML: list.outerHTML } );
74
74
 
75
- const { values: omittedValues, ...restAttributes } = attributes;
76
-
77
- return [
78
- {
79
- ...restAttributes,
80
- ...listBlock.attributes,
81
- },
82
- listBlock.innerBlocks,
83
- ];
75
+ return [ listBlock.attributes, listBlock.innerBlocks ];
84
76
  }
@@ -67,6 +67,7 @@ export default function ListItemEdit( {
67
67
  const innerBlocksProps = useInnerBlocksProps( blockProps, {
68
68
  allowedBlocks: [ 'core/list' ],
69
69
  renderAppender: false,
70
+ __unstableDisableDropZone: true,
70
71
  } );
71
72
  const useEnterRef = useEnter( { content, clientId } );
72
73
  const useSpaceRef = useSpace( clientId );
@@ -1,8 +1,3 @@
1
- /**
2
- * External dependencies
3
- */
4
- import { castArray } from 'lodash';
5
-
6
1
  /**
7
2
  * WordPress dependencies
8
3
  */
@@ -61,7 +56,9 @@ export default function useOutdentListItem( clientId ) {
61
56
  return [
62
57
  canOutdent,
63
58
  useCallback( ( clientIds = getSelectedBlockClientIds() ) => {
64
- clientIds = castArray( clientIds );
59
+ if ( ! Array.isArray( clientIds ) ) {
60
+ clientIds = [ clientIds ];
61
+ }
65
62
 
66
63
  if ( ! clientIds.length ) return;
67
64
 
@@ -40,12 +40,12 @@ describe( 'Unsupported block', () => {
40
40
  const initialHtml = `<!-- wp:table -->
41
41
  <figure class="wp-block-table"><table><tbody><tr><td>1</td><td>2</td></tr><tr><td>3</td><td>4</td></tr></tbody></table></figure>
42
42
  <!-- /wp:table -->`;
43
- const { getByA11yLabel } = await initializeEditor( {
43
+ const { getByLabelText } = await initializeEditor( {
44
44
  initialHtml,
45
45
  } );
46
46
 
47
47
  const missingBlock = await waitFor( () =>
48
- getByA11yLabel( /Unsupported Block\. Row 1/ )
48
+ getByLabelText( /Unsupported Block\. Row 1/ )
49
49
  );
50
50
 
51
51
  const translatedTableTitle =
@@ -58,18 +58,18 @@ describe( 'Unsupported block', () => {
58
58
  const initialHtml = `<!-- wp:table -->
59
59
  <figure class="wp-block-table"><table><tbody><tr><td>1</td><td>2</td></tr><tr><td>3</td><td>4</td></tr></tbody></table></figure>
60
60
  <!-- /wp:table -->`;
61
- const { getByA11yLabel, getByText } = await initializeEditor( {
61
+ const { getByLabelText, getByText } = await initializeEditor( {
62
62
  initialHtml,
63
63
  } );
64
64
 
65
65
  const missingBlock = await waitFor( () =>
66
- getByA11yLabel( /Unsupported Block\. Row 1/ )
66
+ getByLabelText( /Unsupported Block\. Row 1/ )
67
67
  );
68
68
 
69
69
  fireEvent.press( missingBlock );
70
70
 
71
71
  const helpButton = await waitFor( () =>
72
- getByA11yLabel( 'Help button' )
72
+ getByLabelText( 'Help button' )
73
73
  );
74
74
 
75
75
  fireEvent.press( helpButton );
@@ -6,9 +6,15 @@ import classnames from 'classnames';
6
6
  /**
7
7
  * WordPress dependencies
8
8
  */
9
- import { useState, useEffect, useRef, Platform } from '@wordpress/element';
10
- import { addQueryArgs } from '@wordpress/url';
11
9
  import {
10
+ useState,
11
+ useEffect,
12
+ useRef,
13
+ Platform,
14
+ useMemo,
15
+ } from '@wordpress/element';
16
+ import {
17
+ __experimentalOffCanvasEditor as OffCanvasEditor,
12
18
  InspectorControls,
13
19
  useBlockProps,
14
20
  __experimentalRecursionProvider as RecursionProvider,
@@ -31,6 +37,8 @@ import {
31
37
  __experimentalToggleGroupControlOption as ToggleGroupControlOption,
32
38
  Button,
33
39
  Spinner,
40
+ __experimentalHStack as HStack,
41
+ __experimentalHeading as Heading,
34
42
  } from '@wordpress/components';
35
43
  import { __, sprintf } from '@wordpress/i18n';
36
44
  import { speak } from '@wordpress/a11y';
@@ -60,6 +68,7 @@ import useConvertClassicToBlockMenu, {
60
68
  import useCreateNavigationMenu from './use-create-navigation-menu';
61
69
  import { useInnerBlocks } from './use-inner-blocks';
62
70
  import { detectColors } from './utils';
71
+ import ManageMenusButton from './manage-menus-button';
63
72
 
64
73
  function Navigation( {
65
74
  attributes,
@@ -82,6 +91,9 @@ function Navigation( {
82
91
  hasColorSettings = true,
83
92
  customPlaceholder: CustomPlaceholder = null,
84
93
  } ) {
94
+ const isOffCanvasNavigationEditorEnabled =
95
+ window?.__experimentalEnableOffCanvasNavigationEditor === true;
96
+
85
97
  const {
86
98
  openSubmenusOnClick,
87
99
  overlayMenu,
@@ -191,9 +203,6 @@ function Navigation( {
191
203
  __unstableMarkNextChangeAsNotPersistent,
192
204
  } = useDispatch( blockEditorStore );
193
205
 
194
- const [ hasSavedUnsavedInnerBlocks, setHasSavedUnsavedInnerBlocks ] =
195
- useState( false );
196
-
197
206
  const [ isResponsiveMenuOpen, setResponsiveMenuVisibility ] =
198
207
  useState( false );
199
208
 
@@ -227,8 +236,16 @@ function Navigation( {
227
236
  classicMenuConversionStatus === CLASSIC_MENU_CONVERSION_PENDING;
228
237
 
229
238
  // Only autofallback to published menus.
230
- const fallbackNavigationMenus = navigationMenus?.filter(
231
- ( menu ) => menu.status === 'publish'
239
+ const fallbackNavigationMenus = useMemo(
240
+ () =>
241
+ navigationMenus
242
+ ?.filter( ( menu ) => menu.status === 'publish' )
243
+ ?.sort( ( menuA, menuB ) => {
244
+ const menuADate = new Date( menuA.date );
245
+ const menuBDate = new Date( menuB.date );
246
+ return menuADate.getTime() < menuBDate.getTime();
247
+ } ),
248
+ [ navigationMenus ]
232
249
  );
233
250
 
234
251
  // Attempt to retrieve and prioritize any existing navigation menu unless:
@@ -248,12 +265,6 @@ function Navigation( {
248
265
  return;
249
266
  }
250
267
 
251
- fallbackNavigationMenus.sort( ( menuA, menuB ) => {
252
- const menuADate = new Date( menuA.date );
253
- const menuBDate = new Date( menuB.date );
254
- return menuADate.getTime() < menuBDate.getTime();
255
- } );
256
-
257
268
  /**
258
269
  * This fallback displays (both in editor and on front)
259
270
  * a list of pages only if no menu (user assigned or
@@ -263,7 +274,12 @@ function Navigation( {
263
274
  */
264
275
  __unstableMarkNextChangeAsNotPersistent();
265
276
  setRef( fallbackNavigationMenus[ 0 ].id );
266
- }, [ navigationMenus ] );
277
+ }, [
278
+ ref,
279
+ isCreatingNavigationMenu,
280
+ fallbackNavigationMenus,
281
+ hasUncontrolledInnerBlocks,
282
+ ] );
267
283
 
268
284
  useEffect( () => {
269
285
  if (
@@ -272,7 +288,7 @@ function Navigation( {
272
288
  fallbackNavigationMenus?.length > 0 ||
273
289
  classicMenus?.length !== 1
274
290
  ) {
275
- return false;
291
+ return;
276
292
  }
277
293
 
278
294
  // If there's non fallback navigation menus and
@@ -481,24 +497,22 @@ function Navigation( {
481
497
 
482
498
  // Prompt the user to publish the menu they have set as a draft
483
499
  const isDraftNavigationMenu = navigationMenu?.status === 'draft';
484
- useEffect( async () => {
500
+ useEffect( () => {
485
501
  hideMenuAutoPublishDraftNotice();
486
- if ( ! isDraftNavigationMenu ) return;
487
- try {
488
- await editEntityRecord(
489
- 'postType',
490
- 'wp_navigation',
491
- navigationMenu?.id,
492
- {
493
- status: 'publish',
494
- },
495
- { throwOnError: true }
496
- );
497
- } catch {
502
+ if ( ! isDraftNavigationMenu ) {
503
+ return;
504
+ }
505
+ editEntityRecord(
506
+ 'postType',
507
+ 'wp_navigation',
508
+ navigationMenu?.id,
509
+ { status: 'publish' },
510
+ { throwOnError: true }
511
+ ).catch( () => {
498
512
  showMenuAutoPublishDraftNotice(
499
513
  __( 'Error occurred while publishing the navigation menu.' )
500
514
  );
501
- }
515
+ } );
502
516
  }, [ isDraftNavigationMenu, navigationMenu ] );
503
517
 
504
518
  const stylingInspectorControls = (
@@ -648,48 +662,77 @@ function Navigation( {
648
662
  // Consider this state as 'unsaved' and offer an uncontrolled version of inner blocks,
649
663
  // that automatically saves the menu as an entity when changes are made to the inner blocks.
650
664
  const hasUnsavedBlocks = hasUncontrolledInnerBlocks && ! isEntityAvailable;
651
- if ( hasUnsavedBlocks ) {
665
+
666
+ const WrappedNavigationMenuSelector = ( { currentMenuId } ) => (
667
+ <NavigationMenuSelector
668
+ currentMenuId={ currentMenuId }
669
+ clientId={ clientId }
670
+ onSelectNavigationMenu={ ( menuId ) => {
671
+ handleUpdateMenu( menuId );
672
+ } }
673
+ onSelectClassicMenu={ async ( classicMenu ) => {
674
+ const navMenu = await convertClassicMenu(
675
+ classicMenu.id,
676
+ classicMenu.name,
677
+ 'draft'
678
+ );
679
+ if ( navMenu ) {
680
+ handleUpdateMenu( navMenu.id, {
681
+ focusNavigationBlock: true,
682
+ } );
683
+ }
684
+ } }
685
+ onCreateNew={ createUntitledEmptyNavigationMenu }
686
+ createNavigationMenuIsSuccess={ createNavigationMenuIsSuccess }
687
+ createNavigationMenuIsError={ createNavigationMenuIsError }
688
+ /* translators: %s: The name of a menu. */
689
+ actionLabel={ __( "Switch to '%s'" ) }
690
+ />
691
+ );
692
+
693
+ const isManageMenusButtonDisabled =
694
+ ! hasManagePermissions || ! hasResolvedNavigationMenus;
695
+
696
+ if ( hasUnsavedBlocks && ! isCreatingNavigationMenu ) {
652
697
  return (
653
698
  <TagName { ...blockProps }>
654
699
  <InspectorControls>
655
- <PanelBody title={ __( 'Menu' ) }>
656
- <NavigationMenuSelector
657
- currentMenuId={ ref }
658
- clientId={ clientId }
659
- onSelectNavigationMenu={ ( menuId ) => {
660
- handleUpdateMenu( menuId );
661
- } }
662
- onSelectClassicMenu={ async ( classicMenu ) => {
663
- const navMenu = await convertClassicMenu(
664
- classicMenu.id,
665
- classicMenu.name,
666
- 'draft'
667
- );
668
- if ( navMenu ) {
669
- handleUpdateMenu( navMenu.id, {
670
- focusNavigationBlock: true,
671
- } );
672
- }
673
- } }
674
- onCreateNew={ createUntitledEmptyNavigationMenu }
675
- createNavigationMenuIsSuccess={
676
- createNavigationMenuIsSuccess
677
- }
678
- /* translators: %s: The name of a menu. */
679
- actionLabel={ __( "Switch to '%s'" ) }
680
- />
681
- <Button
682
- variant="link"
683
- disabled={
684
- ! hasManagePermissions ||
685
- ! hasResolvedNavigationMenus
686
- }
687
- href={ addQueryArgs( 'edit.php', {
688
- post_type: 'wp_navigation',
689
- } ) }
690
- >
691
- { __( 'Manage menus' ) }
692
- </Button>
700
+ <PanelBody
701
+ title={
702
+ isOffCanvasNavigationEditorEnabled
703
+ ? null
704
+ : __( 'Menu' )
705
+ }
706
+ >
707
+ { isOffCanvasNavigationEditorEnabled ? (
708
+ <>
709
+ <HStack className="wp-block-navigation-off-canvas-editor__header">
710
+ <Heading
711
+ className="wp-block-navigation-off-canvas-editor__title"
712
+ level={ 2 }
713
+ >
714
+ { __( 'Menu' ) }
715
+ </Heading>
716
+ <WrappedNavigationMenuSelector
717
+ currentMenuId={ ref }
718
+ />
719
+ </HStack>
720
+ <OffCanvasEditor
721
+ blocks={ innerBlocks }
722
+ isExpanded={ true }
723
+ selectBlockInCanvas={ false }
724
+ />
725
+ </>
726
+ ) : (
727
+ <>
728
+ <WrappedNavigationMenuSelector
729
+ currentMenuId={ ref }
730
+ />
731
+ <ManageMenusButton
732
+ disabled={ isManageMenusButtonDisabled }
733
+ />
734
+ </>
735
+ ) }
693
736
  </PanelBody>
694
737
  </InspectorControls>
695
738
  { stylingInspectorControls }
@@ -705,24 +748,11 @@ function Navigation( {
705
748
  overlayTextColor={ overlayTextColor }
706
749
  >
707
750
  <UnsavedInnerBlocks
751
+ createNavigationMenu={ createNavigationMenu }
708
752
  blocks={ uncontrolledInnerBlocks }
709
- clientId={ clientId }
710
753
  templateLock={ templateLock }
711
754
  navigationMenus={ navigationMenus }
712
755
  hasSelection={ isSelected || isInnerBlockSelected }
713
- hasSavedUnsavedInnerBlocks={
714
- hasSavedUnsavedInnerBlocks
715
- }
716
- onSave={ ( post ) => {
717
- // Set some state used as a guard to prevent the creation of multiple posts.
718
- setHasSavedUnsavedInnerBlocks( true );
719
- // Switch to using the wp_navigation entity.
720
- setRef( post.id );
721
-
722
- showNavigationMenuStatusNotice(
723
- __( `New Navigation Menu created.` )
724
- );
725
- } }
726
756
  />
727
757
  </ResponsiveWrapper>
728
758
  </TagName>
@@ -735,44 +765,38 @@ function Navigation( {
735
765
  return (
736
766
  <TagName { ...blockProps }>
737
767
  <InspectorControls>
738
- <PanelBody title={ __( 'Menu' ) }>
739
- <NavigationMenuSelector
740
- currentMenuId={ null }
741
- clientId={ clientId }
742
- onSelectNavigationMenu={ ( menuId ) => {
743
- handleUpdateMenu( menuId );
744
- } }
745
- onSelectClassicMenu={ async ( classicMenu ) => {
746
- const navMenu = await convertClassicMenu(
747
- classicMenu.id,
748
- classicMenu.name,
749
- 'draft'
750
- );
751
- if ( navMenu ) {
752
- handleUpdateMenu( navMenu.id, {
753
- focusNavigationBlock: true,
754
- } );
755
- }
756
- } }
757
- onCreateNew={ createUntitledEmptyNavigationMenu }
758
- createNavigationMenuIsSuccess={
759
- createNavigationMenuIsSuccess
760
- }
761
- /* translators: %s: The name of a menu. */
762
- actionLabel={ __( "Switch to '%s'" ) }
763
- />
764
- <Button
765
- variant="link"
766
- disabled={
767
- ! hasManagePermissions ||
768
- ! hasResolvedNavigationMenus
769
- }
770
- href={ addQueryArgs( 'edit.php', {
771
- post_type: 'wp_navigation',
772
- } ) }
773
- >
774
- { __( 'Manage menus' ) }
775
- </Button>
768
+ <PanelBody
769
+ title={
770
+ isOffCanvasNavigationEditorEnabled
771
+ ? null
772
+ : __( 'Menu' )
773
+ }
774
+ >
775
+ { isOffCanvasNavigationEditorEnabled ? (
776
+ <>
777
+ <HStack className="wp-block-navigation-off-canvas-editor__header">
778
+ <Heading
779
+ className="wp-block-navigation-off-canvas-editor__title"
780
+ level={ 2 }
781
+ >
782
+ { __( 'Menu' ) }
783
+ </Heading>
784
+ <WrappedNavigationMenuSelector
785
+ currentMenuId={ null }
786
+ />
787
+ </HStack>
788
+ <p>Select or create a menu</p>
789
+ </>
790
+ ) : (
791
+ <>
792
+ <WrappedNavigationMenuSelector
793
+ currentMenuId={ null }
794
+ />
795
+ <ManageMenusButton
796
+ disabled={ isManageMenusButtonDisabled }
797
+ />
798
+ </>
799
+ ) }
776
800
  </PanelBody>
777
801
  </InspectorControls>
778
802
  <Warning>
@@ -850,47 +874,42 @@ function Navigation( {
850
874
  <EntityProvider kind="postType" type="wp_navigation" id={ ref }>
851
875
  <RecursionProvider uniqueId={ recursionId }>
852
876
  <InspectorControls>
853
- <PanelBody title={ __( 'Menu' ) }>
854
- <NavigationMenuSelector
855
- currentMenuId={ ref }
856
- clientId={ clientId }
857
- onSelectNavigationMenu={ ( menuId ) => {
858
- handleUpdateMenu( menuId );
859
- } }
860
- onSelectClassicMenu={ async ( classicMenu ) => {
861
- const navMenu = await convertClassicMenu(
862
- classicMenu.id,
863
- classicMenu.name,
864
- 'draft'
865
- );
866
- if ( navMenu ) {
867
- handleUpdateMenu( navMenu.id, {
868
- focusNavigationBlock: true,
869
- } );
870
- }
871
- } }
872
- onCreateNew={ createUntitledEmptyNavigationMenu }
873
- createNavigationMenuIsSuccess={
874
- createNavigationMenuIsSuccess
875
- }
876
- createNavigationMenuIsError={
877
- createNavigationMenuIsError
878
- }
879
- /* translators: %s: The name of a menu. */
880
- actionLabel={ __( "Switch to '%s'" ) }
881
- />
882
- <Button
883
- variant="link"
884
- disabled={
885
- ! hasManagePermissions ||
886
- ! hasResolvedNavigationMenus
887
- }
888
- href={ addQueryArgs( 'edit.php', {
889
- post_type: 'wp_navigation',
890
- } ) }
891
- >
892
- { __( 'Manage menus' ) }
893
- </Button>
877
+ <PanelBody
878
+ title={
879
+ isOffCanvasNavigationEditorEnabled
880
+ ? null
881
+ : __( 'Menu' )
882
+ }
883
+ >
884
+ { isOffCanvasNavigationEditorEnabled ? (
885
+ <>
886
+ <HStack className="wp-block-navigation-off-canvas-editor__header">
887
+ <Heading
888
+ className="wp-block-navigation-off-canvas-editor__title"
889
+ level={ 2 }
890
+ >
891
+ { __( 'Menu' ) }
892
+ </Heading>
893
+ <WrappedNavigationMenuSelector
894
+ currentMenuId={ ref }
895
+ />
896
+ </HStack>
897
+ <OffCanvasEditor
898
+ blocks={ innerBlocks }
899
+ isExpanded={ true }
900
+ selectBlockInCanvas={ false }
901
+ />
902
+ </>
903
+ ) : (
904
+ <>
905
+ <WrappedNavigationMenuSelector
906
+ currentMenuId={ ref }
907
+ />
908
+ <ManageMenusButton
909
+ disabled={ isManageMenusButtonDisabled }
910
+ />
911
+ </>
912
+ ) }
894
913
  </PanelBody>
895
914
  </InspectorControls>
896
915
  { stylingInspectorControls }
@@ -917,6 +936,12 @@ function Navigation( {
917
936
  } }
918
937
  />
919
938
  ) }
939
+ { isOffCanvasNavigationEditorEnabled && (
940
+ <ManageMenusButton
941
+ disabled={ isManageMenusButtonDisabled }
942
+ className="wp-block-navigation-manage-menus-button"
943
+ />
944
+ ) }
920
945
  </InspectorControls>
921
946
  ) }
922
947
 
@@ -0,0 +1,21 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { addQueryArgs } from '@wordpress/url';
5
+ import { Button } from '@wordpress/components';
6
+ import { __ } from '@wordpress/i18n';
7
+
8
+ const ManageMenusButton = ( { className = '', disabled } ) => (
9
+ <Button
10
+ variant="link"
11
+ disabled={ disabled }
12
+ className={ className }
13
+ href={ addQueryArgs( 'edit.php', {
14
+ post_type: 'wp_navigation',
15
+ } ) }
16
+ >
17
+ { __( 'Manage menus' ) }
18
+ </Button>
19
+ );
20
+
21
+ export default ManageMenusButton;
@@ -10,7 +10,7 @@ import {
10
10
  VisuallyHidden,
11
11
  } from '@wordpress/components';
12
12
  import { useEntityProp } from '@wordpress/core-data';
13
- import { Icon, chevronUp, chevronDown } from '@wordpress/icons';
13
+ import { Icon, chevronUp, chevronDown, moreVertical } from '@wordpress/icons';
14
14
  import { __, sprintf } from '@wordpress/i18n';
15
15
  import { decodeEntities } from '@wordpress/html-entities';
16
16
  import { useEffect, useMemo, useState } from '@wordpress/element';
@@ -31,6 +31,9 @@ function NavigationMenuSelector( {
31
31
  createNavigationMenuIsError,
32
32
  toggleProps = {},
33
33
  } ) {
34
+ const isOffCanvasNavigationEditorEnabled =
35
+ window?.__experimentalEnableOffCanvasNavigationEditor === true;
36
+
34
37
  /* translators: %s: The name of a menu. */
35
38
  const createActionLabel = __( "Create from '%s'" );
36
39
 
@@ -161,11 +164,23 @@ function NavigationMenuSelector( {
161
164
 
162
165
  return (
163
166
  <DropdownMenu
164
- className="wp-block-navigation__navigation-selector"
167
+ className={
168
+ isOffCanvasNavigationEditorEnabled
169
+ ? ''
170
+ : 'wp-block-navigation__navigation-selector'
171
+ }
165
172
  label={ selectorLabel }
166
- text={ selectorLabel }
167
- icon={ null }
168
- toggleProps={ toggleProps }
173
+ text={
174
+ <span className="wp-block-navigation__navigation-selector-button__label">
175
+ { isOffCanvasNavigationEditorEnabled ? '' : selectorLabel }
176
+ </span>
177
+ }
178
+ icon={ isOffCanvasNavigationEditorEnabled ? moreVertical : null }
179
+ toggleProps={
180
+ isOffCanvasNavigationEditorEnabled
181
+ ? { isSmall: true }
182
+ : toggleProps
183
+ }
169
184
  >
170
185
  { ( { onClose } ) => (
171
186
  <>
@@ -85,11 +85,7 @@ export default function ResponsiveWrapper( {
85
85
  onClick={ () => onToggle( true ) }
86
86
  >
87
87
  { hasIcon && <OverlayMenuIcon icon={ icon } /> }
88
- { ! hasIcon && (
89
- <span className="wp-block-navigation__toggle_button_label">
90
- { __( 'Menu' ) }
91
- </span>
92
- ) }
88
+ { ! hasIcon && __( 'Menu' ) }
93
89
  </Button>
94
90
  ) }
95
91
 
@@ -109,11 +105,7 @@ export default function ResponsiveWrapper( {
109
105
  onClick={ () => onToggle( false ) }
110
106
  >
111
107
  { hasIcon && <Icon icon={ close } /> }
112
- { ! hasIcon && (
113
- <span className="wp-block-navigation__toggle_button_label">
114
- { __( 'Close' ) }
115
- </span>
116
- ) }
108
+ { ! hasIcon && __( 'Close' ) }
117
109
  </Button>
118
110
  <div
119
111
  className="wp-block-navigation__responsive-container-content"