@wordpress/block-library 8.9.0 → 8.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 (502) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/build/block/edit.native.js +17 -10
  3. package/build/block/edit.native.js.map +1 -1
  4. package/build/code/index.js +1 -0
  5. package/build/code/index.js.map +1 -1
  6. package/build/column/index.js +1 -1
  7. package/build/columns/transforms.js +1 -5
  8. package/build/columns/transforms.js.map +1 -1
  9. package/build/comment-author-name/edit.js +1 -1
  10. package/build/comment-author-name/edit.js.map +1 -1
  11. package/build/comment-edit-link/edit.js +1 -1
  12. package/build/comment-edit-link/edit.js.map +1 -1
  13. package/build/cover/edit/inspector-controls.js +1 -1
  14. package/build/cover/edit/inspector-controls.js.map +1 -1
  15. package/build/cover/edit/resizable-cover-popover.js +3 -3
  16. package/build/cover/edit/resizable-cover-popover.js.map +1 -1
  17. package/build/cover/index.js +1 -1
  18. package/build/cover/variations.js +1 -1
  19. package/build/cover/variations.js.map +1 -1
  20. package/build/details/edit.js +19 -5
  21. package/build/details/edit.js.map +1 -1
  22. package/build/details/index.js +14 -10
  23. package/build/details/index.js.map +1 -1
  24. package/build/details/save.js +4 -1
  25. package/build/details/save.js.map +1 -1
  26. package/build/embed/variations.js +2 -2
  27. package/build/embed/variations.js.map +1 -1
  28. package/build/file/interactivity.js +19 -0
  29. package/build/file/interactivity.js.map +1 -0
  30. package/build/file/{utils.js → utils/index.js} +1 -1
  31. package/build/file/utils/index.js.map +1 -0
  32. package/build/file/view.js +1 -1
  33. package/build/file/view.js.map +1 -1
  34. package/build/freeform/modal.js +20 -17
  35. package/build/freeform/modal.js.map +1 -1
  36. package/build/gallery/edit.js +2 -8
  37. package/build/gallery/edit.js.map +1 -1
  38. package/build/gallery/v1/edit.js +1 -7
  39. package/build/gallery/v1/edit.js.map +1 -1
  40. package/build/gallery/v1/gallery-image.native.js +1 -3
  41. package/build/gallery/v1/gallery-image.native.js.map +1 -1
  42. package/build/group/transforms.js +0 -5
  43. package/build/group/transforms.js.map +1 -1
  44. package/build/image/deprecated.js +2 -4
  45. package/build/image/deprecated.js.map +1 -1
  46. package/build/image/edit.js +13 -11
  47. package/build/image/edit.js.map +1 -1
  48. package/build/image/image.js +7 -12
  49. package/build/image/image.js.map +1 -1
  50. package/build/image/index.js +3 -0
  51. package/build/image/index.js.map +1 -1
  52. package/build/image/interactivity.js +102 -0
  53. package/build/image/interactivity.js.map +1 -0
  54. package/build/image/save.js +2 -4
  55. package/build/image/save.js.map +1 -1
  56. package/build/image/utils.js +10 -18
  57. package/build/image/utils.js.map +1 -1
  58. package/build/index.js +0 -6
  59. package/build/index.js.map +1 -1
  60. package/build/index.native.js +1 -1
  61. package/build/index.native.js.map +1 -1
  62. package/build/latest-posts/edit.native.js +1 -3
  63. package/build/latest-posts/edit.native.js.map +1 -1
  64. package/build/list/edit.js +1 -1
  65. package/build/list/edit.js.map +1 -1
  66. package/build/list-item/edit.native.js +1 -1
  67. package/build/list-item/edit.native.js.map +1 -1
  68. package/build/list-item/transforms.js +4 -1
  69. package/build/list-item/transforms.js.map +1 -1
  70. package/build/list-item/utils.js +5 -1
  71. package/build/list-item/utils.js.map +1 -1
  72. package/build/loginout/index.js +11 -1
  73. package/build/loginout/index.js.map +1 -1
  74. package/build/media-text/deprecated.js +4 -6
  75. package/build/media-text/deprecated.js.map +1 -1
  76. package/build/media-text/edit.js +13 -11
  77. package/build/media-text/edit.js.map +1 -1
  78. package/build/media-text/media-container.js +3 -3
  79. package/build/media-text/media-container.js.map +1 -1
  80. package/build/media-text/save.js +1 -3
  81. package/build/media-text/save.js.map +1 -1
  82. package/build/navigation/constants.js +15 -0
  83. package/build/navigation/constants.js.map +1 -0
  84. package/build/navigation/edit/index.js +16 -26
  85. package/build/navigation/edit/index.js.map +1 -1
  86. package/build/navigation/edit/inner-blocks.js +5 -7
  87. package/build/navigation/edit/inner-blocks.js.map +1 -1
  88. package/build/navigation/edit/leaf-more-menu.js +148 -0
  89. package/build/navigation/edit/leaf-more-menu.js.map +1 -0
  90. package/build/navigation/edit/menu-inspector-controls.js +53 -8
  91. package/build/navigation/edit/menu-inspector-controls.js.map +1 -1
  92. package/build/navigation/edit/navigation-menu-delete-control.js +6 -6
  93. package/build/navigation/edit/navigation-menu-delete-control.js.map +1 -1
  94. package/build/navigation/edit/unsaved-inner-blocks.js +12 -25
  95. package/build/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  96. package/build/navigation/edit/use-convert-classic-menu-to-block-menu.js +1 -1
  97. package/build/navigation/edit/use-convert-classic-menu-to-block-menu.js.map +1 -1
  98. package/build/navigation/interactivity.js +157 -0
  99. package/build/navigation/interactivity.js.map +1 -0
  100. package/build/navigation-link/edit.js +7 -5
  101. package/build/navigation-link/edit.js.map +1 -1
  102. package/build/navigation-link/update-attributes.js +5 -5
  103. package/build/navigation-link/update-attributes.js.map +1 -1
  104. package/build/navigation-submenu/edit.js +7 -5
  105. package/build/navigation-submenu/edit.js.map +1 -1
  106. package/build/paragraph/index.js +5 -1
  107. package/build/paragraph/index.js.map +1 -1
  108. package/build/paragraph/transforms.js +5 -1
  109. package/build/paragraph/transforms.js.map +1 -1
  110. package/build/pattern/edit.js +42 -8
  111. package/build/pattern/edit.js.map +1 -1
  112. package/build/pattern/index.js +12 -5
  113. package/build/pattern/index.js.map +1 -1
  114. package/build/pattern/v1/edit.js +57 -0
  115. package/build/pattern/v1/edit.js.map +1 -0
  116. package/build/post-author-name/edit.js +1 -1
  117. package/build/post-author-name/edit.js.map +1 -1
  118. package/build/post-featured-image/edit.js +1 -2
  119. package/build/post-featured-image/edit.js.map +1 -1
  120. package/build/post-featured-image/overlay.js +5 -0
  121. package/build/post-featured-image/overlay.js.map +1 -1
  122. package/build/post-title/edit.js +24 -7
  123. package/build/post-title/edit.js.map +1 -1
  124. package/build/preformatted/edit.native.js +3 -2
  125. package/build/preformatted/edit.native.js.map +1 -1
  126. package/build/quote/transforms.js +23 -37
  127. package/build/quote/transforms.js.map +1 -1
  128. package/build/read-more/edit.js +1 -1
  129. package/build/read-more/edit.js.map +1 -1
  130. package/build/search/edit.js +9 -1
  131. package/build/search/edit.js.map +1 -1
  132. package/build/site-title/edit/index.js +1 -1
  133. package/build/site-title/edit/index.js.map +1 -1
  134. package/build/social-link/edit.js +21 -4
  135. package/build/social-link/edit.js.map +1 -1
  136. package/build/social-links/edit.js +2 -2
  137. package/build/social-links/edit.js.map +1 -1
  138. package/build/template-part/edit/index.js +1 -7
  139. package/build/template-part/edit/index.js.map +1 -1
  140. package/build/template-part/edit/utils/hooks.js +2 -2
  141. package/build/template-part/edit/utils/hooks.js.map +1 -1
  142. package/build/utils/interactivity/constants.js +9 -0
  143. package/build/utils/interactivity/constants.js.map +1 -0
  144. package/build/utils/interactivity/directives.js +236 -0
  145. package/build/utils/interactivity/directives.js.map +1 -0
  146. package/build/utils/interactivity/hooks.js +176 -0
  147. package/build/utils/interactivity/hooks.js.map +1 -0
  148. package/build/utils/interactivity/hydration.js +34 -0
  149. package/build/utils/interactivity/hydration.js.map +1 -0
  150. package/build/utils/interactivity/index.js +34 -0
  151. package/build/utils/interactivity/index.js.map +1 -0
  152. package/build/utils/interactivity/portals.js +108 -0
  153. package/build/utils/interactivity/portals.js.map +1 -0
  154. package/build/utils/interactivity/store.js +67 -0
  155. package/build/utils/interactivity/store.js.map +1 -0
  156. package/build/utils/interactivity/utils.js +87 -0
  157. package/build/utils/interactivity/utils.js.map +1 -0
  158. package/build/utils/interactivity/vdom.js +109 -0
  159. package/build/utils/interactivity/vdom.js.map +1 -0
  160. package/build-module/block/edit.native.js +7 -1
  161. package/build-module/block/edit.native.js.map +1 -1
  162. package/build-module/code/index.js +1 -0
  163. package/build-module/code/index.js.map +1 -1
  164. package/build-module/column/index.js +1 -1
  165. package/build-module/columns/transforms.js +1 -5
  166. package/build-module/columns/transforms.js.map +1 -1
  167. package/build-module/comment-author-name/edit.js +1 -1
  168. package/build-module/comment-author-name/edit.js.map +1 -1
  169. package/build-module/comment-edit-link/edit.js +1 -1
  170. package/build-module/comment-edit-link/edit.js.map +1 -1
  171. package/build-module/cover/edit/inspector-controls.js +1 -1
  172. package/build-module/cover/edit/inspector-controls.js.map +1 -1
  173. package/build-module/cover/edit/resizable-cover-popover.js +3 -3
  174. package/build-module/cover/edit/resizable-cover-popover.js.map +1 -1
  175. package/build-module/cover/index.js +1 -1
  176. package/build-module/cover/variations.js +1 -1
  177. package/build-module/cover/variations.js.map +1 -1
  178. package/build-module/details/edit.js +20 -6
  179. package/build-module/details/edit.js.map +1 -1
  180. package/build-module/details/index.js +14 -10
  181. package/build-module/details/index.js.map +1 -1
  182. package/build-module/details/save.js +5 -2
  183. package/build-module/details/save.js.map +1 -1
  184. package/build-module/embed/variations.js +2 -2
  185. package/build-module/embed/variations.js.map +1 -1
  186. package/build-module/file/interactivity.js +15 -0
  187. package/build-module/file/interactivity.js.map +1 -0
  188. package/build-module/file/{utils.js → utils/index.js} +1 -1
  189. package/build-module/file/utils/index.js.map +1 -0
  190. package/build-module/file/view.js +1 -1
  191. package/build-module/file/view.js.map +1 -1
  192. package/build-module/freeform/modal.js +19 -18
  193. package/build-module/freeform/modal.js.map +1 -1
  194. package/build-module/gallery/edit.js +2 -8
  195. package/build-module/gallery/edit.js.map +1 -1
  196. package/build-module/gallery/v1/edit.js +1 -6
  197. package/build-module/gallery/v1/edit.js.map +1 -1
  198. package/build-module/gallery/v1/gallery-image.native.js +1 -2
  199. package/build-module/gallery/v1/gallery-image.native.js.map +1 -1
  200. package/build-module/group/transforms.js +0 -5
  201. package/build-module/group/transforms.js.map +1 -1
  202. package/build-module/image/deprecated.js +2 -3
  203. package/build-module/image/deprecated.js.map +1 -1
  204. package/build-module/image/edit.js +12 -11
  205. package/build-module/image/edit.js.map +1 -1
  206. package/build-module/image/image.js +7 -11
  207. package/build-module/image/image.js.map +1 -1
  208. package/build-module/image/index.js +3 -0
  209. package/build-module/image/index.js.map +1 -1
  210. package/build-module/image/interactivity.js +99 -0
  211. package/build-module/image/interactivity.js.map +1 -0
  212. package/build-module/image/save.js +2 -3
  213. package/build-module/image/save.js.map +1 -1
  214. package/build-module/image/utils.js +10 -17
  215. package/build-module/image/utils.js.map +1 -1
  216. package/build-module/index.js +0 -4
  217. package/build-module/index.js.map +1 -1
  218. package/build-module/index.native.js +1 -1
  219. package/build-module/index.native.js.map +1 -1
  220. package/build-module/latest-posts/edit.native.js +1 -2
  221. package/build-module/latest-posts/edit.native.js.map +1 -1
  222. package/build-module/list/edit.js +1 -1
  223. package/build-module/list/edit.js.map +1 -1
  224. package/build-module/list-item/edit.native.js +1 -1
  225. package/build-module/list-item/edit.native.js.map +1 -1
  226. package/build-module/list-item/transforms.js +5 -2
  227. package/build-module/list-item/transforms.js.map +1 -1
  228. package/build-module/list-item/utils.js +5 -1
  229. package/build-module/list-item/utils.js.map +1 -1
  230. package/build-module/loginout/index.js +11 -1
  231. package/build-module/loginout/index.js.map +1 -1
  232. package/build-module/media-text/deprecated.js +4 -5
  233. package/build-module/media-text/deprecated.js.map +1 -1
  234. package/build-module/media-text/edit.js +13 -12
  235. package/build-module/media-text/edit.js.map +1 -1
  236. package/build-module/media-text/media-container.js +3 -3
  237. package/build-module/media-text/media-container.js.map +1 -1
  238. package/build-module/media-text/save.js +1 -2
  239. package/build-module/media-text/save.js.map +1 -1
  240. package/build-module/navigation/constants.js +6 -0
  241. package/build-module/navigation/constants.js.map +1 -0
  242. package/build-module/navigation/edit/index.js +18 -27
  243. package/build-module/navigation/edit/index.js.map +1 -1
  244. package/build-module/navigation/edit/inner-blocks.js +2 -4
  245. package/build-module/navigation/edit/inner-blocks.js.map +1 -1
  246. package/build-module/navigation/edit/leaf-more-menu.js +132 -0
  247. package/build-module/navigation/edit/leaf-more-menu.js.map +1 -0
  248. package/build-module/navigation/edit/menu-inspector-controls.js +52 -9
  249. package/build-module/navigation/edit/menu-inspector-controls.js.map +1 -1
  250. package/build-module/navigation/edit/navigation-menu-delete-control.js +7 -7
  251. package/build-module/navigation/edit/navigation-menu-delete-control.js.map +1 -1
  252. package/build-module/navigation/edit/unsaved-inner-blocks.js +9 -20
  253. package/build-module/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  254. package/build-module/navigation/edit/use-convert-classic-menu-to-block-menu.js +1 -1
  255. package/build-module/navigation/edit/use-convert-classic-menu-to-block-menu.js.map +1 -1
  256. package/build-module/navigation/interactivity.js +154 -0
  257. package/build-module/navigation/interactivity.js.map +1 -0
  258. package/build-module/navigation-link/edit.js +7 -5
  259. package/build-module/navigation-link/edit.js.map +1 -1
  260. package/build-module/navigation-link/update-attributes.js +4 -4
  261. package/build-module/navigation-link/update-attributes.js.map +1 -1
  262. package/build-module/navigation-submenu/edit.js +7 -5
  263. package/build-module/navigation-submenu/edit.js.map +1 -1
  264. package/build-module/paragraph/index.js +5 -1
  265. package/build-module/paragraph/index.js.map +1 -1
  266. package/build-module/paragraph/transforms.js +5 -1
  267. package/build-module/paragraph/transforms.js.map +1 -1
  268. package/build-module/pattern/edit.js +42 -9
  269. package/build-module/pattern/edit.js.map +1 -1
  270. package/build-module/pattern/index.js +12 -3
  271. package/build-module/pattern/index.js.map +1 -1
  272. package/build-module/pattern/v1/edit.js +48 -0
  273. package/build-module/pattern/v1/edit.js.map +1 -0
  274. package/build-module/post-author-name/edit.js +1 -1
  275. package/build-module/post-author-name/edit.js.map +1 -1
  276. package/build-module/post-featured-image/edit.js +1 -2
  277. package/build-module/post-featured-image/edit.js.map +1 -1
  278. package/build-module/post-featured-image/overlay.js +5 -0
  279. package/build-module/post-featured-image/overlay.js.map +1 -1
  280. package/build-module/post-title/edit.js +23 -7
  281. package/build-module/post-title/edit.js.map +1 -1
  282. package/build-module/preformatted/edit.native.js +3 -2
  283. package/build-module/preformatted/edit.native.js.map +1 -1
  284. package/build-module/quote/transforms.js +23 -37
  285. package/build-module/quote/transforms.js.map +1 -1
  286. package/build-module/read-more/edit.js +1 -1
  287. package/build-module/read-more/edit.js.map +1 -1
  288. package/build-module/search/edit.js +9 -1
  289. package/build-module/search/edit.js.map +1 -1
  290. package/build-module/site-title/edit/index.js +1 -1
  291. package/build-module/site-title/edit/index.js.map +1 -1
  292. package/build-module/social-link/edit.js +20 -5
  293. package/build-module/social-link/edit.js.map +1 -1
  294. package/build-module/social-links/edit.js +2 -2
  295. package/build-module/social-links/edit.js.map +1 -1
  296. package/build-module/template-part/edit/index.js +1 -6
  297. package/build-module/template-part/edit/index.js.map +1 -1
  298. package/build-module/template-part/edit/utils/hooks.js +1 -1
  299. package/build-module/template-part/edit/utils/hooks.js.map +1 -1
  300. package/build-module/utils/interactivity/constants.js +2 -0
  301. package/build-module/utils/interactivity/constants.js.map +1 -0
  302. package/build-module/utils/interactivity/directives.js +220 -0
  303. package/build-module/utils/interactivity/directives.js.map +1 -0
  304. package/build-module/utils/interactivity/hooks.js +162 -0
  305. package/build-module/utils/interactivity/hooks.js.map +1 -0
  306. package/build-module/utils/interactivity/hydration.js +21 -0
  307. package/build-module/utils/interactivity/hydration.js.map +1 -0
  308. package/build-module/utils/interactivity/index.js +17 -0
  309. package/build-module/utils/interactivity/index.js.map +1 -0
  310. package/build-module/utils/interactivity/portals.js +100 -0
  311. package/build-module/utils/interactivity/portals.js.map +1 -0
  312. package/build-module/utils/interactivity/store.js +56 -0
  313. package/build-module/utils/interactivity/store.js.map +1 -0
  314. package/build-module/utils/interactivity/utils.js +75 -0
  315. package/build-module/utils/interactivity/utils.js.map +1 -0
  316. package/build-module/utils/interactivity/vdom.js +97 -0
  317. package/build-module/utils/interactivity/vdom.js.map +1 -0
  318. package/build-style/common-rtl.css +1 -1
  319. package/build-style/common.css +1 -1
  320. package/build-style/cover/style-rtl.css +3 -2
  321. package/build-style/cover/style.css +3 -2
  322. package/build-style/{details-summary → details}/editor-rtl.css +1 -1
  323. package/build-style/{details-summary → details}/editor.css +1 -1
  324. package/build-style/details/style-rtl.css +14 -0
  325. package/build-style/details/style.css +14 -0
  326. package/build-style/editor-rtl.css +71 -5
  327. package/build-style/editor.css +71 -5
  328. package/build-style/file/editor-rtl.css +3 -0
  329. package/build-style/file/editor.css +3 -0
  330. package/build-style/freeform/editor-rtl.css +29 -0
  331. package/build-style/freeform/editor.css +29 -0
  332. package/build-style/gallery/editor-rtl.css +0 -4
  333. package/build-style/gallery/editor.css +0 -4
  334. package/build-style/gallery/style-rtl.css +2 -4
  335. package/build-style/gallery/style.css +2 -4
  336. package/build-style/image/style-rtl.css +98 -0
  337. package/build-style/image/style.css +98 -0
  338. package/build-style/navigation/editor-rtl.css +36 -0
  339. package/build-style/navigation/editor.css +36 -0
  340. package/build-style/post-comments-form/style-rtl.css +1 -1
  341. package/build-style/post-comments-form/style.css +1 -1
  342. package/build-style/search/editor-rtl.css +1 -0
  343. package/build-style/search/editor.css +1 -0
  344. package/build-style/site-logo/editor-rtl.css +1 -0
  345. package/build-style/site-logo/editor.css +1 -0
  346. package/build-style/style-rtl.css +116 -10
  347. package/build-style/style.css +116 -10
  348. package/build-style/video/style-rtl.css +1 -2
  349. package/build-style/video/style.css +1 -2
  350. package/package.json +37 -33
  351. package/src/block/edit.native.js +18 -4
  352. package/src/buttons/test/edit.native.js +0 -9
  353. package/src/code/block.json +1 -0
  354. package/src/column/block.json +1 -1
  355. package/src/columns/test/__snapshots__/transforms.native.js.snap +1 -1
  356. package/src/columns/test/transforms.native.js +3 -5
  357. package/src/columns/transforms.js +2 -8
  358. package/src/comment-author-name/edit.js +1 -1
  359. package/src/comment-edit-link/edit.js +1 -1
  360. package/src/comment-template/index.php +8 -7
  361. package/src/comments/index.php +1 -6
  362. package/src/cover/block.json +1 -1
  363. package/src/cover/edit/inspector-controls.js +56 -54
  364. package/src/cover/edit/resizable-cover-popover.js +2 -1
  365. package/src/cover/style.scss +5 -0
  366. package/src/cover/test/edit.js +56 -2
  367. package/src/cover/variations.js +1 -3
  368. package/src/details/block.json +8 -6
  369. package/src/details/edit.js +27 -5
  370. package/src/details/editor.scss +3 -0
  371. package/src/details/index.js +10 -5
  372. package/src/details/save.js +5 -1
  373. package/src/details/style.scss +16 -0
  374. package/src/editor.scss +1 -1
  375. package/src/embed/variations.js +2 -2
  376. package/src/file/editor.scss +4 -0
  377. package/src/file/interactivity.js +15 -0
  378. package/src/file/view.js +4 -1
  379. package/src/freeform/editor.scss +45 -0
  380. package/src/freeform/modal.js +22 -19
  381. package/src/gallery/edit.js +5 -8
  382. package/src/gallery/editor.scss +0 -6
  383. package/src/gallery/test/index.native.js +48 -3
  384. package/src/gallery/v1/edit.js +1 -6
  385. package/src/gallery/v1/gallery-image.native.js +1 -2
  386. package/src/group/test/__snapshots__/transforms.native.js.snap +1 -1
  387. package/src/group/test/transforms.native.js +3 -5
  388. package/src/group/transforms.js +0 -7
  389. package/src/image/block.json +3 -0
  390. package/src/image/deprecated.js +2 -3
  391. package/src/image/edit.js +18 -18
  392. package/src/image/image.js +8 -11
  393. package/src/image/index.php +75 -2
  394. package/src/image/interactivity.js +113 -0
  395. package/src/image/save.js +4 -3
  396. package/src/image/style.scss +113 -0
  397. package/src/image/test/edit.native.js +38 -16
  398. package/src/image/utils.js +11 -18
  399. package/src/index.js +0 -4
  400. package/src/index.native.js +1 -0
  401. package/src/latest-posts/edit.native.js +1 -4
  402. package/src/list/edit.js +1 -1
  403. package/src/list/test/edit.native.js +80 -1
  404. package/src/list-item/edit.native.js +1 -1
  405. package/src/list-item/transforms.js +4 -2
  406. package/src/loginout/block.json +11 -1
  407. package/src/media-text/deprecated.js +4 -5
  408. package/src/media-text/edit.js +12 -10
  409. package/src/media-text/media-container.js +3 -3
  410. package/src/media-text/save.js +1 -2
  411. package/src/navigation/constants.js +21 -0
  412. package/src/navigation/edit/index.js +71 -83
  413. package/src/navigation/edit/inner-blocks.js +6 -16
  414. package/src/navigation/edit/leaf-more-menu.js +170 -0
  415. package/src/navigation/edit/menu-inspector-controls.js +78 -10
  416. package/src/navigation/edit/navigation-menu-delete-control.js +29 -29
  417. package/src/navigation/edit/unsaved-inner-blocks.js +12 -40
  418. package/src/navigation/edit/use-convert-classic-menu-to-block-menu.js +1 -1
  419. package/src/navigation/editor.scss +10 -0
  420. package/src/navigation/index.php +213 -204
  421. package/src/navigation/interactivity.js +151 -0
  422. package/src/navigation-link/edit.js +9 -3
  423. package/src/navigation-link/update-attributes.js +2 -2
  424. package/src/navigation-submenu/edit.js +9 -3
  425. package/src/paragraph/block.json +5 -1
  426. package/src/pattern/block.json +4 -0
  427. package/src/pattern/edit.js +53 -16
  428. package/src/pattern/index.js +5 -4
  429. package/src/pattern/index.php +14 -1
  430. package/src/pattern/v1/edit.js +57 -0
  431. package/src/post-author-name/edit.js +1 -1
  432. package/src/post-comments-form/style.scss +3 -1
  433. package/src/post-featured-image/edit.js +1 -1
  434. package/src/post-featured-image/index.php +1 -1
  435. package/src/post-featured-image/overlay.js +4 -0
  436. package/src/post-terms/index.php +2 -2
  437. package/src/post-title/edit.js +57 -44
  438. package/src/preformatted/edit.native.js +1 -3
  439. package/src/quote/test/__snapshots__/transforms.native.js.snap +1 -1
  440. package/src/quote/test/transforms.native.js +3 -5
  441. package/src/quote/transforms.js +9 -19
  442. package/src/read-more/edit.js +1 -1
  443. package/src/search/edit.js +9 -4
  444. package/src/search/editor.scss +1 -0
  445. package/src/site-logo/editor.scss +2 -1
  446. package/src/site-title/edit/index.js +1 -1
  447. package/src/social-link/edit.js +51 -26
  448. package/src/social-links/edit.js +33 -31
  449. package/src/style.scss +0 -1
  450. package/src/template-part/edit/index.js +4 -6
  451. package/src/template-part/edit/utils/hooks.js +1 -1
  452. package/src/template-part/index.php +22 -7
  453. package/src/utils/interactivity/constants.js +1 -0
  454. package/src/utils/interactivity/directives.js +200 -0
  455. package/src/utils/interactivity/hooks.js +145 -0
  456. package/src/utils/interactivity/hydration.js +22 -0
  457. package/src/utils/interactivity/index.js +17 -0
  458. package/src/utils/interactivity/portals.js +98 -0
  459. package/src/utils/interactivity/store.js +45 -0
  460. package/src/utils/interactivity/utils.js +66 -0
  461. package/src/utils/interactivity/vdom.js +94 -0
  462. package/tsconfig.json +1 -0
  463. package/tsconfig.tsbuildinfo +1 -1
  464. package/build/details-content/edit.js +0 -34
  465. package/build/details-content/edit.js.map +0 -1
  466. package/build/details-content/index.js +0 -94
  467. package/build/details-content/index.js.map +0 -1
  468. package/build/details-content/save.js +0 -20
  469. package/build/details-content/save.js.map +0 -1
  470. package/build/details-summary/edit.js +0 -42
  471. package/build/details-summary/edit.js.map +0 -1
  472. package/build/details-summary/index.js +0 -97
  473. package/build/details-summary/index.js.map +0 -1
  474. package/build/details-summary/save.js +0 -24
  475. package/build/details-summary/save.js.map +0 -1
  476. package/build/file/utils.js.map +0 -1
  477. package/build-module/details-content/edit.js +0 -23
  478. package/build-module/details-content/edit.js.map +0 -1
  479. package/build-module/details-content/index.js +0 -76
  480. package/build-module/details-content/index.js.map +0 -1
  481. package/build-module/details-content/save.js +0 -11
  482. package/build-module/details-content/save.js.map +0 -1
  483. package/build-module/details-summary/edit.js +0 -30
  484. package/build-module/details-summary/edit.js.map +0 -1
  485. package/build-module/details-summary/index.js +0 -79
  486. package/build-module/details-summary/index.js.map +0 -1
  487. package/build-module/details-summary/save.js +0 -16
  488. package/build-module/details-summary/save.js.map +0 -1
  489. package/build-module/file/utils.js.map +0 -1
  490. package/build-style/details-summary/style-rtl.css +0 -91
  491. package/build-style/details-summary/style.css +0 -91
  492. package/src/details-content/block.json +0 -50
  493. package/src/details-content/edit.js +0 -29
  494. package/src/details-content/index.js +0 -23
  495. package/src/details-content/save.js +0 -12
  496. package/src/details-summary/block.json +0 -53
  497. package/src/details-summary/edit.js +0 -27
  498. package/src/details-summary/editor.scss +0 -3
  499. package/src/details-summary/index.js +0 -23
  500. package/src/details-summary/save.js +0 -13
  501. package/src/details-summary/style.scss +0 -3
  502. /package/src/file/{utils.js → utils/index.js} +0 -0
@@ -67,60 +67,7 @@ if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
67
67
  }
68
68
  }
69
69
 
70
- /**
71
- * Turns menu item data into a nested array of parsed blocks
72
- *
73
- * @param array $menu_items An array of menu items that represent
74
- * an individual level of a menu.
75
- * @param array $menu_items_by_parent_id An array keyed by the id of the
76
- * parent menu where each element is an
77
- * array of menu items that belong to
78
- * that parent.
79
- * @return array An array of parsed block data.
80
- */
81
- function block_core_navigation_parse_blocks_from_menu_items( $menu_items, $menu_items_by_parent_id ) {
82
-
83
- _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::parse_blocks_from_menu_items' );
84
-
85
- if ( empty( $menu_items ) ) {
86
- return array();
87
- }
88
-
89
- $blocks = array();
90
-
91
- foreach ( $menu_items as $menu_item ) {
92
- $class_name = ! empty( $menu_item->classes ) ? implode( ' ', (array) $menu_item->classes ) : null;
93
- $id = ( null !== $menu_item->object_id && 'custom' !== $menu_item->object ) ? $menu_item->object_id : null;
94
- $opens_in_new_tab = null !== $menu_item->target && '_blank' === $menu_item->target;
95
- $rel = ( null !== $menu_item->xfn && '' !== $menu_item->xfn ) ? $menu_item->xfn : null;
96
- $kind = null !== $menu_item->type ? str_replace( '_', '-', $menu_item->type ) : 'custom';
97
-
98
- $block = array(
99
- 'blockName' => isset( $menu_items_by_parent_id[ $menu_item->ID ] ) ? 'core/navigation-submenu' : 'core/navigation-link',
100
- 'attrs' => array(
101
- 'className' => $class_name,
102
- 'description' => $menu_item->description,
103
- 'id' => $id,
104
- 'kind' => $kind,
105
- 'label' => $menu_item->title,
106
- 'opensInNewTab' => $opens_in_new_tab,
107
- 'rel' => $rel,
108
- 'title' => $menu_item->attr_title,
109
- 'type' => $menu_item->object,
110
- 'url' => $menu_item->url,
111
- ),
112
- );
113
70
 
114
- $block['innerBlocks'] = isset( $menu_items_by_parent_id[ $menu_item->ID ] )
115
- ? block_core_navigation_parse_blocks_from_menu_items( $menu_items_by_parent_id[ $menu_item->ID ], $menu_items_by_parent_id )
116
- : array();
117
- $block['innerContent'] = array_map( 'serialize_block', $block['innerBlocks'] );
118
-
119
- $blocks[] = $block;
120
- }
121
-
122
- return $blocks;
123
- }
124
71
 
125
72
  /**
126
73
  * Build an array with CSS classes and inline styles defining the colors
@@ -251,159 +198,9 @@ function block_core_navigation_render_submenu_icon() {
251
198
  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>';
252
199
  }
253
200
 
254
- /**
255
- * Get the classic navigation menu to use as a fallback.
256
- *
257
- * @return object WP_Term The classic navigation.
258
- */
259
- function block_core_navigation_get_classic_menu_fallback() {
260
-
261
- _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::get_classic_menu_fallback' );
262
-
263
- $classic_nav_menus = wp_get_nav_menus();
264
-
265
- // If menus exist.
266
- if ( $classic_nav_menus && ! is_wp_error( $classic_nav_menus ) ) {
267
- // Handles simple use case where user has a classic menu and switches to a block theme.
268
201
 
269
- // Returns the menu assigned to location `primary`.
270
- $locations = get_nav_menu_locations();
271
- if ( isset( $locations['primary'] ) ) {
272
- $primary_menu = wp_get_nav_menu_object( $locations['primary'] );
273
- if ( $primary_menu ) {
274
- return $primary_menu;
275
- }
276
- }
277
202
 
278
- // Returns a menu if `primary` is its slug.
279
- foreach ( $classic_nav_menus as $classic_nav_menu ) {
280
- if ( 'primary' === $classic_nav_menu->slug ) {
281
- return $classic_nav_menu;
282
- }
283
- }
284
203
 
285
- // Otherwise return the most recently created classic menu.
286
- usort(
287
- $classic_nav_menus,
288
- function( $a, $b ) {
289
- return $b->term_id - $a->term_id;
290
- }
291
- );
292
- return $classic_nav_menus[0];
293
- }
294
- }
295
-
296
- /**
297
- * Converts a classic navigation to blocks.
298
- *
299
- * @param object $classic_nav_menu WP_Term The classic navigation object to convert.
300
- * @return array the normalized parsed blocks.
301
- */
302
- function block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu ) {
303
-
304
- _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::get_classic_menu_fallback_blocks' );
305
-
306
- // BEGIN: Code that already exists in wp_nav_menu().
307
- $menu_items = wp_get_nav_menu_items( $classic_nav_menu->term_id, array( 'update_post_term_cache' => false ) );
308
-
309
- // Set up the $menu_item variables.
310
- _wp_menu_item_classes_by_context( $menu_items );
311
-
312
- $sorted_menu_items = array();
313
- foreach ( (array) $menu_items as $menu_item ) {
314
- $sorted_menu_items[ $menu_item->menu_order ] = $menu_item;
315
- }
316
-
317
- unset( $menu_items, $menu_item );
318
-
319
- // END: Code that already exists in wp_nav_menu().
320
-
321
- $menu_items_by_parent_id = array();
322
- foreach ( $sorted_menu_items as $menu_item ) {
323
- $menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item;
324
- }
325
-
326
- $inner_blocks = block_core_navigation_parse_blocks_from_menu_items(
327
- isset( $menu_items_by_parent_id[0] )
328
- ? $menu_items_by_parent_id[0]
329
- : array(),
330
- $menu_items_by_parent_id
331
- );
332
-
333
- return serialize_blocks( $inner_blocks );
334
- }
335
-
336
- /**
337
- * If there's a the classic menu then use it as a fallback.
338
- *
339
- * @return array the normalized parsed blocks.
340
- */
341
- function block_core_navigation_maybe_use_classic_menu_fallback() {
342
-
343
- _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::create_classic_menu_fallback' );
344
-
345
- // See if we have a classic menu.
346
- $classic_nav_menu = block_core_navigation_get_classic_menu_fallback();
347
-
348
- if ( ! $classic_nav_menu ) {
349
- return;
350
- }
351
-
352
- // If we have a classic menu then convert it to blocks.
353
- $classic_nav_menu_blocks = block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu );
354
-
355
- if ( empty( $classic_nav_menu_blocks ) ) {
356
- return;
357
- }
358
-
359
- // Create a new navigation menu from the classic menu.
360
- $wp_insert_post_result = wp_insert_post(
361
- array(
362
- 'post_content' => $classic_nav_menu_blocks,
363
- 'post_title' => $classic_nav_menu->name,
364
- 'post_name' => $classic_nav_menu->slug,
365
- 'post_status' => 'publish',
366
- 'post_type' => 'wp_navigation',
367
- ),
368
- true // So that we can check whether the result is an error.
369
- );
370
-
371
- if ( is_wp_error( $wp_insert_post_result ) ) {
372
- return;
373
- }
374
-
375
- // Fetch the most recently published navigation which will be the classic one created above.
376
- return block_core_navigation_get_most_recently_published_navigation();
377
- }
378
-
379
- /**
380
- * Finds the most recently published `wp_navigation` Post.
381
- *
382
- * @return WP_Post|null the first non-empty Navigation or null.
383
- */
384
- function block_core_navigation_get_most_recently_published_navigation() {
385
-
386
- _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::get_most_recently_published_navigation' );
387
-
388
- // Default to the most recently created menu.
389
- $parsed_args = array(
390
- 'post_type' => 'wp_navigation',
391
- 'no_found_rows' => true,
392
- 'update_post_meta_cache' => false,
393
- 'update_post_term_cache' => false,
394
- 'order' => 'DESC',
395
- 'orderby' => 'date',
396
- 'post_status' => 'publish',
397
- 'posts_per_page' => 1, // get only the most recent.
398
- );
399
-
400
- $navigation_post = new WP_Query( $parsed_args );
401
- if ( count( $navigation_post->posts ) > 0 ) {
402
- return $navigation_post->posts[0];
403
- }
404
-
405
- return null;
406
- }
407
204
 
408
205
  /**
409
206
  * Filter out empty "null" blocks from the block list.
@@ -673,7 +470,10 @@ function render_block_core_navigation( $attributes, $content, $block ) {
673
470
 
674
471
  // Restore legacy classnames for submenu positioning.
675
472
  $layout_class = '';
676
- if ( isset( $attributes['layout']['justifyContent'] ) ) {
473
+ if (
474
+ isset( $attributes['layout']['justifyContent'] ) &&
475
+ isset( $layout_justification[ $attributes['layout']['justifyContent'] ] )
476
+ ) {
677
477
  $layout_class .= $layout_justification[ $attributes['layout']['justifyContent'] ];
678
478
  }
679
479
  if ( isset( $attributes['layout']['orientation'] ) && 'vertical' === $attributes['layout']['orientation'] ) {
@@ -881,3 +681,212 @@ function block_core_navigation_typographic_presets_backcompatibility( $parsed_bl
881
681
  }
882
682
 
883
683
  add_filter( 'render_block_data', 'block_core_navigation_typographic_presets_backcompatibility' );
684
+
685
+ /**
686
+ * Turns menu item data into a nested array of parsed blocks
687
+ *
688
+ * @param array $menu_items An array of menu items that represent
689
+ * an individual level of a menu.
690
+ * @param array $menu_items_by_parent_id An array keyed by the id of the
691
+ * parent menu where each element is an
692
+ * array of menu items that belong to
693
+ * that parent.
694
+ * @return array An array of parsed block data.
695
+ */
696
+ function block_core_navigation_parse_blocks_from_menu_items( $menu_items, $menu_items_by_parent_id ) {
697
+
698
+ _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::parse_blocks_from_menu_items' );
699
+
700
+ if ( empty( $menu_items ) ) {
701
+ return array();
702
+ }
703
+
704
+ $blocks = array();
705
+
706
+ foreach ( $menu_items as $menu_item ) {
707
+ $class_name = ! empty( $menu_item->classes ) ? implode( ' ', (array) $menu_item->classes ) : null;
708
+ $id = ( null !== $menu_item->object_id && 'custom' !== $menu_item->object ) ? $menu_item->object_id : null;
709
+ $opens_in_new_tab = null !== $menu_item->target && '_blank' === $menu_item->target;
710
+ $rel = ( null !== $menu_item->xfn && '' !== $menu_item->xfn ) ? $menu_item->xfn : null;
711
+ $kind = null !== $menu_item->type ? str_replace( '_', '-', $menu_item->type ) : 'custom';
712
+
713
+ $block = array(
714
+ 'blockName' => isset( $menu_items_by_parent_id[ $menu_item->ID ] ) ? 'core/navigation-submenu' : 'core/navigation-link',
715
+ 'attrs' => array(
716
+ 'className' => $class_name,
717
+ 'description' => $menu_item->description,
718
+ 'id' => $id,
719
+ 'kind' => $kind,
720
+ 'label' => $menu_item->title,
721
+ 'opensInNewTab' => $opens_in_new_tab,
722
+ 'rel' => $rel,
723
+ 'title' => $menu_item->attr_title,
724
+ 'type' => $menu_item->object,
725
+ 'url' => $menu_item->url,
726
+ ),
727
+ );
728
+
729
+ $block['innerBlocks'] = isset( $menu_items_by_parent_id[ $menu_item->ID ] )
730
+ ? block_core_navigation_parse_blocks_from_menu_items( $menu_items_by_parent_id[ $menu_item->ID ], $menu_items_by_parent_id )
731
+ : array();
732
+ $block['innerContent'] = array_map( 'serialize_block', $block['innerBlocks'] );
733
+
734
+ $blocks[] = $block;
735
+ }
736
+
737
+ return $blocks;
738
+ }
739
+
740
+ /**
741
+ * Get the classic navigation menu to use as a fallback.
742
+ *
743
+ * @return object WP_Term The classic navigation.
744
+ */
745
+ function block_core_navigation_get_classic_menu_fallback() {
746
+
747
+ _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::get_classic_menu_fallback' );
748
+
749
+ $classic_nav_menus = wp_get_nav_menus();
750
+
751
+ // If menus exist.
752
+ if ( $classic_nav_menus && ! is_wp_error( $classic_nav_menus ) ) {
753
+ // Handles simple use case where user has a classic menu and switches to a block theme.
754
+
755
+ // Returns the menu assigned to location `primary`.
756
+ $locations = get_nav_menu_locations();
757
+ if ( isset( $locations['primary'] ) ) {
758
+ $primary_menu = wp_get_nav_menu_object( $locations['primary'] );
759
+ if ( $primary_menu ) {
760
+ return $primary_menu;
761
+ }
762
+ }
763
+
764
+ // Returns a menu if `primary` is its slug.
765
+ foreach ( $classic_nav_menus as $classic_nav_menu ) {
766
+ if ( 'primary' === $classic_nav_menu->slug ) {
767
+ return $classic_nav_menu;
768
+ }
769
+ }
770
+
771
+ // Otherwise return the most recently created classic menu.
772
+ usort(
773
+ $classic_nav_menus,
774
+ function( $a, $b ) {
775
+ return $b->term_id - $a->term_id;
776
+ }
777
+ );
778
+ return $classic_nav_menus[0];
779
+ }
780
+ }
781
+
782
+ /**
783
+ * Converts a classic navigation to blocks.
784
+ *
785
+ * @param object $classic_nav_menu WP_Term The classic navigation object to convert.
786
+ * @return array the normalized parsed blocks.
787
+ */
788
+ function block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu ) {
789
+
790
+ _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::get_classic_menu_fallback_blocks' );
791
+
792
+ // BEGIN: Code that already exists in wp_nav_menu().
793
+ $menu_items = wp_get_nav_menu_items( $classic_nav_menu->term_id, array( 'update_post_term_cache' => false ) );
794
+
795
+ // Set up the $menu_item variables.
796
+ _wp_menu_item_classes_by_context( $menu_items );
797
+
798
+ $sorted_menu_items = array();
799
+ foreach ( (array) $menu_items as $menu_item ) {
800
+ $sorted_menu_items[ $menu_item->menu_order ] = $menu_item;
801
+ }
802
+
803
+ unset( $menu_items, $menu_item );
804
+
805
+ // END: Code that already exists in wp_nav_menu().
806
+
807
+ $menu_items_by_parent_id = array();
808
+ foreach ( $sorted_menu_items as $menu_item ) {
809
+ $menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item;
810
+ }
811
+
812
+ $inner_blocks = block_core_navigation_parse_blocks_from_menu_items(
813
+ isset( $menu_items_by_parent_id[0] )
814
+ ? $menu_items_by_parent_id[0]
815
+ : array(),
816
+ $menu_items_by_parent_id
817
+ );
818
+
819
+ return serialize_blocks( $inner_blocks );
820
+ }
821
+
822
+ /**
823
+ * If there's a the classic menu then use it as a fallback.
824
+ *
825
+ * @return array the normalized parsed blocks.
826
+ */
827
+ function block_core_navigation_maybe_use_classic_menu_fallback() {
828
+
829
+ _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::create_classic_menu_fallback' );
830
+
831
+ // See if we have a classic menu.
832
+ $classic_nav_menu = block_core_navigation_get_classic_menu_fallback();
833
+
834
+ if ( ! $classic_nav_menu ) {
835
+ return;
836
+ }
837
+
838
+ // If we have a classic menu then convert it to blocks.
839
+ $classic_nav_menu_blocks = block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu );
840
+
841
+ if ( empty( $classic_nav_menu_blocks ) ) {
842
+ return;
843
+ }
844
+
845
+ // Create a new navigation menu from the classic menu.
846
+ $wp_insert_post_result = wp_insert_post(
847
+ array(
848
+ 'post_content' => $classic_nav_menu_blocks,
849
+ 'post_title' => $classic_nav_menu->name,
850
+ 'post_name' => $classic_nav_menu->slug,
851
+ 'post_status' => 'publish',
852
+ 'post_type' => 'wp_navigation',
853
+ ),
854
+ true // So that we can check whether the result is an error.
855
+ );
856
+
857
+ if ( is_wp_error( $wp_insert_post_result ) ) {
858
+ return;
859
+ }
860
+
861
+ // Fetch the most recently published navigation which will be the classic one created above.
862
+ return block_core_navigation_get_most_recently_published_navigation();
863
+ }
864
+
865
+ /**
866
+ * Finds the most recently published `wp_navigation` Post.
867
+ *
868
+ * @return WP_Post|null the first non-empty Navigation or null.
869
+ */
870
+ function block_core_navigation_get_most_recently_published_navigation() {
871
+
872
+ _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::get_most_recently_published_navigation' );
873
+
874
+ // Default to the most recently created menu.
875
+ $parsed_args = array(
876
+ 'post_type' => 'wp_navigation',
877
+ 'no_found_rows' => true,
878
+ 'update_post_meta_cache' => false,
879
+ 'update_post_term_cache' => false,
880
+ 'order' => 'DESC',
881
+ 'orderby' => 'date',
882
+ 'post_status' => 'publish',
883
+ 'posts_per_page' => 1, // get only the most recent.
884
+ );
885
+
886
+ $navigation_post = new WP_Query( $parsed_args );
887
+ if ( count( $navigation_post->posts ) > 0 ) {
888
+ return $navigation_post->posts[0];
889
+ }
890
+
891
+ return null;
892
+ }
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Internal dependencies
3
+ */
4
+ import { store } from '../utils/interactivity';
5
+
6
+ const focusableSelectors = [
7
+ 'a[href]',
8
+ 'area[href]',
9
+ 'input:not([disabled]):not([type="hidden"]):not([aria-hidden])',
10
+ 'select:not([disabled]):not([aria-hidden])',
11
+ 'textarea:not([disabled]):not([aria-hidden])',
12
+ 'button:not([disabled]):not([aria-hidden])',
13
+ 'iframe',
14
+ 'object',
15
+ 'embed',
16
+ '[contenteditable]',
17
+ '[tabindex]:not([tabindex^="-"])',
18
+ ];
19
+
20
+ store( {
21
+ effects: {
22
+ core: {
23
+ navigation: {
24
+ initMenu: ( { context, ref } ) => {
25
+ if ( context.core.navigation.isMenuOpen ) {
26
+ const focusableElements =
27
+ ref.querySelectorAll( focusableSelectors );
28
+ context.core.navigation.modal = ref;
29
+ context.core.navigation.firstFocusableElement =
30
+ focusableElements[ 0 ];
31
+ context.core.navigation.lastFocusableElement =
32
+ focusableElements[ focusableElements.length - 1 ];
33
+ }
34
+ },
35
+ focusFirstElement: ( { context, ref } ) => {
36
+ if ( context.core.navigation.isMenuOpen ) {
37
+ ref.querySelector(
38
+ '.wp-block-navigation-item > *:first-child'
39
+ ).focus();
40
+ }
41
+ },
42
+ },
43
+ },
44
+ },
45
+ selectors: {
46
+ core: {
47
+ navigation: {
48
+ roleAttribute: ( { context } ) => {
49
+ return context.core.navigation.overlay &&
50
+ context.core.navigation.isMenuOpen
51
+ ? 'dialog'
52
+ : '';
53
+ },
54
+ },
55
+ },
56
+ },
57
+ actions: {
58
+ core: {
59
+ navigation: {
60
+ openMenu: ( { context, ref } ) => {
61
+ context.core.navigation.isMenuOpen = true;
62
+ context.core.navigation.previousFocus = ref;
63
+ if ( context.core.navigation.overlay ) {
64
+ // It adds a `has-modal-open` class to the <html> root
65
+ document.documentElement.classList.add(
66
+ 'has-modal-open'
67
+ );
68
+ }
69
+ },
70
+ closeMenu: ( { context } ) => {
71
+ if ( context.core.navigation.isMenuOpen ) {
72
+ context.core.navigation.isMenuOpen = false;
73
+ if (
74
+ context.core.navigation.modal.contains(
75
+ window.document.activeElement
76
+ )
77
+ ) {
78
+ context.core.navigation.previousFocus.focus();
79
+ }
80
+ context.core.navigation.modal = null;
81
+ context.core.navigation.previousFocus = null;
82
+ if ( context.core.navigation.overlay ) {
83
+ document.documentElement.classList.remove(
84
+ 'has-modal-open'
85
+ );
86
+ }
87
+ }
88
+ },
89
+ toggleMenu: ( { context, actions, ref } ) => {
90
+ if ( context.core.navigation.isMenuOpen ) {
91
+ actions.core.navigation.closeMenu( { context } );
92
+ } else {
93
+ actions.core.navigation.openMenu( { context, ref } );
94
+ }
95
+ },
96
+ handleMenuKeydown: ( { actions, context, event } ) => {
97
+ if ( context.core.navigation.isMenuOpen ) {
98
+ // If Escape close the menu
99
+ if (
100
+ event?.key === 'Escape' ||
101
+ event?.keyCode === 27
102
+ ) {
103
+ actions.core.navigation.closeMenu( { context } );
104
+ return;
105
+ }
106
+
107
+ // Trap focus if it is an overlay (main menu)
108
+ if (
109
+ context.core.navigation.overlay &&
110
+ ( event.key === 'Tab' || event.keyCode === 9 )
111
+ ) {
112
+ // If shift + tab it change the direction
113
+ if (
114
+ event.shiftKey &&
115
+ window.document.activeElement ===
116
+ context.core.navigation
117
+ .firstFocusableElement
118
+ ) {
119
+ event.preventDefault();
120
+ context.core.navigation.lastFocusableElement.focus();
121
+ } else if (
122
+ ! event.shiftKey &&
123
+ window.document.activeElement ===
124
+ context.core.navigation.lastFocusableElement
125
+ ) {
126
+ event.preventDefault();
127
+ context.core.navigation.firstFocusableElement.focus();
128
+ }
129
+ }
130
+ }
131
+ },
132
+ handleMenuFocusout: ( { actions, context, event } ) => {
133
+ if ( context.core.navigation.isMenuOpen ) {
134
+ // If focus is outside modal, and in the document, close menu
135
+ // event.target === The element losing focus
136
+ // event.relatedTarget === The element receiving focus (if any)
137
+ // When focusout is outsite the document, `window.document.activeElement` doesn't change
138
+ if (
139
+ ! context.core.navigation.modal.contains(
140
+ event.relatedTarget
141
+ ) &&
142
+ event.target !== window.document.activeElement
143
+ ) {
144
+ actions.core.navigation.closeMenu( { context } );
145
+ }
146
+ }
147
+ },
148
+ },
149
+ },
150
+ },
151
+ } );
@@ -429,7 +429,7 @@ export default function NavigationLinkEdit( {
429
429
  </BlockControls>
430
430
  { /* Warning, this duplicated in packages/block-library/src/navigation-submenu/edit.js */ }
431
431
  <InspectorControls>
432
- <PanelBody title={ __( 'Link settings' ) }>
432
+ <PanelBody title={ __( 'Settings' ) }>
433
433
  <TextControl
434
434
  __nextHasNoMarginBottom
435
435
  value={ label ? stripHTML( label ) : '' }
@@ -469,8 +469,11 @@ export default function NavigationLinkEdit( {
469
469
  onChange={ ( titleValue ) => {
470
470
  setAttributes( { title: titleValue } );
471
471
  } }
472
- label={ __( 'Link title' ) }
472
+ label={ __( 'Title attribute' ) }
473
473
  autoComplete="off"
474
+ help={ __(
475
+ 'Additional information to help clarify the purpose of the link.'
476
+ ) }
474
477
  />
475
478
  <TextControl
476
479
  __nextHasNoMarginBottom
@@ -478,8 +481,11 @@ export default function NavigationLinkEdit( {
478
481
  onChange={ ( relValue ) => {
479
482
  setAttributes( { rel: relValue } );
480
483
  } }
481
- label={ __( 'Link rel' ) }
484
+ label={ __( 'Rel attribute' ) }
482
485
  autoComplete="off"
486
+ help={ __(
487
+ 'The relationship of the linked URL as space-separated link types.'
488
+ ) }
483
489
  />
484
490
  </PanelBody>
485
491
  </InspectorControls>
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { safeDecodeURI } from '@wordpress/url';
5
4
  import { escapeHTML } from '@wordpress/escape-html';
5
+ import { safeDecodeURI } from '@wordpress/url';
6
6
 
7
7
  /**
8
8
  * @typedef {'post-type'|'custom'|'taxonomy'|'post-type-archive'} WPNavigationLinkKind
@@ -89,7 +89,7 @@ export const updateAttributes = (
89
89
 
90
90
  setAttributes( {
91
91
  // Passed `url` may already be encoded. To prevent double encoding, decodeURI is executed to revert to the original string.
92
- ...{ url: newUrl ? encodeURI( safeDecodeURI( newUrl ) ) : newUrl },
92
+ ...( newUrl && { url: encodeURI( safeDecodeURI( newUrl ) ) } ),
93
93
  ...( label && { label } ),
94
94
  ...( undefined !== opensInNewTab && { opensInNewTab } ),
95
95
  ...( id && Number.isInteger( id ) && { id } ),
@@ -384,7 +384,7 @@ export default function NavigationSubmenuEdit( {
384
384
  </BlockControls>
385
385
  { /* Warning, this duplicated in packages/block-library/src/navigation-link/edit.js */ }
386
386
  <InspectorControls>
387
- <PanelBody title={ __( 'Link settings' ) }>
387
+ <PanelBody title={ __( 'Settings' ) }>
388
388
  <TextControl
389
389
  __nextHasNoMarginBottom
390
390
  value={ label || '' }
@@ -422,8 +422,11 @@ export default function NavigationSubmenuEdit( {
422
422
  onChange={ ( titleValue ) => {
423
423
  setAttributes( { title: titleValue } );
424
424
  } }
425
- label={ __( 'Link title' ) }
425
+ label={ __( 'Title attribute' ) }
426
426
  autoComplete="off"
427
+ help={ __(
428
+ 'Additional information to help clarify the purpose of the link.'
429
+ ) }
427
430
  />
428
431
  <TextControl
429
432
  __nextHasNoMarginBottom
@@ -431,8 +434,11 @@ export default function NavigationSubmenuEdit( {
431
434
  onChange={ ( relValue ) => {
432
435
  setAttributes( { rel: relValue } );
433
436
  } }
434
- label={ __( 'Link rel' ) }
437
+ label={ __( 'Rel attribute' ) }
435
438
  autoComplete="off"
439
+ help={ __(
440
+ 'The relationship of the linked URL as space-separated link types.'
441
+ ) }
436
442
  />
437
443
  </PanelBody>
438
444
  </InspectorControls>
@@ -43,7 +43,11 @@
43
43
  },
44
44
  "spacing": {
45
45
  "margin": true,
46
- "padding": true
46
+ "padding": true,
47
+ "__experimentalDefaultControls": {
48
+ "margin": false,
49
+ "padding": false
50
+ }
47
51
  },
48
52
  "typography": {
49
53
  "fontSize": true,