@wordpress/block-library 8.9.0 → 8.10.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 (284) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/comment-author-name/edit.js +1 -1
  3. package/build/comment-author-name/edit.js.map +1 -1
  4. package/build/comment-edit-link/edit.js +1 -1
  5. package/build/comment-edit-link/edit.js.map +1 -1
  6. package/build/cover/edit/inspector-controls.js +1 -1
  7. package/build/cover/edit/inspector-controls.js.map +1 -1
  8. package/build/cover/index.js +1 -1
  9. package/build/cover/variations.js +1 -1
  10. package/build/cover/variations.js.map +1 -1
  11. package/build/details/edit.js +19 -5
  12. package/build/details/edit.js.map +1 -1
  13. package/build/details/index.js +14 -10
  14. package/build/details/index.js.map +1 -1
  15. package/build/details/save.js +4 -1
  16. package/build/details/save.js.map +1 -1
  17. package/build/embed/variations.js +2 -2
  18. package/build/embed/variations.js.map +1 -1
  19. package/build/file/view.js +1 -1
  20. package/build/file/view.js.map +1 -1
  21. package/build/gallery/edit.js +2 -8
  22. package/build/gallery/edit.js.map +1 -1
  23. package/build/index.js +0 -6
  24. package/build/index.js.map +1 -1
  25. package/build/index.native.js +1 -1
  26. package/build/index.native.js.map +1 -1
  27. package/build/list-item/utils.js +5 -1
  28. package/build/list-item/utils.js.map +1 -1
  29. package/build/loginout/index.js +11 -1
  30. package/build/loginout/index.js.map +1 -1
  31. package/build/navigation/constants.js +13 -0
  32. package/build/navigation/constants.js.map +1 -0
  33. package/build/navigation/edit/index.js +16 -26
  34. package/build/navigation/edit/index.js.map +1 -1
  35. package/build/navigation/edit/inner-blocks.js +4 -7
  36. package/build/navigation/edit/inner-blocks.js.map +1 -1
  37. package/build/navigation/edit/unsaved-inner-blocks.js +4 -6
  38. package/build/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  39. package/build/navigation/edit/use-convert-classic-menu-to-block-menu.js +1 -1
  40. package/build/navigation/edit/use-convert-classic-menu-to-block-menu.js.map +1 -1
  41. package/build/navigation/interactivity.js +139 -0
  42. package/build/navigation/interactivity.js.map +1 -0
  43. package/build/navigation-link/edit.js +1 -1
  44. package/build/navigation-link/edit.js.map +1 -1
  45. package/build/navigation-submenu/edit.js +1 -1
  46. package/build/navigation-submenu/edit.js.map +1 -1
  47. package/build/paragraph/index.js +5 -1
  48. package/build/paragraph/index.js.map +1 -1
  49. package/build/paragraph/transforms.js +5 -1
  50. package/build/paragraph/transforms.js.map +1 -1
  51. package/build/post-author-name/edit.js +1 -1
  52. package/build/post-author-name/edit.js.map +1 -1
  53. package/build/post-featured-image/edit.js +1 -2
  54. package/build/post-featured-image/edit.js.map +1 -1
  55. package/build/post-featured-image/overlay.js +5 -0
  56. package/build/post-featured-image/overlay.js.map +1 -1
  57. package/build/post-title/edit.js +14 -4
  58. package/build/post-title/edit.js.map +1 -1
  59. package/build/preformatted/edit.native.js +3 -2
  60. package/build/preformatted/edit.native.js.map +1 -1
  61. package/build/quote/transforms.js +16 -27
  62. package/build/quote/transforms.js.map +1 -1
  63. package/build/read-more/edit.js +1 -1
  64. package/build/read-more/edit.js.map +1 -1
  65. package/build/search/edit.js +9 -1
  66. package/build/search/edit.js.map +1 -1
  67. package/build/site-title/edit/index.js +1 -1
  68. package/build/site-title/edit/index.js.map +1 -1
  69. package/build/social-links/edit.js +2 -2
  70. package/build/social-links/edit.js.map +1 -1
  71. package/build/utils/interactivity/constants.js +9 -0
  72. package/build/utils/interactivity/constants.js.map +1 -0
  73. package/build/utils/interactivity/directives.js +208 -0
  74. package/build/utils/interactivity/directives.js.map +1 -0
  75. package/build/utils/interactivity/hooks.js +112 -0
  76. package/build/utils/interactivity/hooks.js.map +1 -0
  77. package/build/utils/interactivity/hydration.js +34 -0
  78. package/build/utils/interactivity/hydration.js.map +1 -0
  79. package/build/utils/interactivity/index.js +34 -0
  80. package/build/utils/interactivity/index.js.map +1 -0
  81. package/build/utils/interactivity/store.js +67 -0
  82. package/build/utils/interactivity/store.js.map +1 -0
  83. package/build/utils/interactivity/utils.js +87 -0
  84. package/build/utils/interactivity/utils.js.map +1 -0
  85. package/build/utils/interactivity/vdom.js +109 -0
  86. package/build/utils/interactivity/vdom.js.map +1 -0
  87. package/build-module/comment-author-name/edit.js +1 -1
  88. package/build-module/comment-author-name/edit.js.map +1 -1
  89. package/build-module/comment-edit-link/edit.js +1 -1
  90. package/build-module/comment-edit-link/edit.js.map +1 -1
  91. package/build-module/cover/edit/inspector-controls.js +1 -1
  92. package/build-module/cover/edit/inspector-controls.js.map +1 -1
  93. package/build-module/cover/index.js +1 -1
  94. package/build-module/cover/variations.js +1 -1
  95. package/build-module/cover/variations.js.map +1 -1
  96. package/build-module/details/edit.js +20 -6
  97. package/build-module/details/edit.js.map +1 -1
  98. package/build-module/details/index.js +14 -10
  99. package/build-module/details/index.js.map +1 -1
  100. package/build-module/details/save.js +5 -2
  101. package/build-module/details/save.js.map +1 -1
  102. package/build-module/embed/variations.js +2 -2
  103. package/build-module/embed/variations.js.map +1 -1
  104. package/build-module/file/view.js +1 -1
  105. package/build-module/file/view.js.map +1 -1
  106. package/build-module/gallery/edit.js +2 -8
  107. package/build-module/gallery/edit.js.map +1 -1
  108. package/build-module/index.js +0 -4
  109. package/build-module/index.js.map +1 -1
  110. package/build-module/index.native.js +1 -1
  111. package/build-module/index.native.js.map +1 -1
  112. package/build-module/list-item/utils.js +5 -1
  113. package/build-module/list-item/utils.js.map +1 -1
  114. package/build-module/loginout/index.js +11 -1
  115. package/build-module/loginout/index.js.map +1 -1
  116. package/build-module/navigation/constants.js +5 -0
  117. package/build-module/navigation/constants.js.map +1 -0
  118. package/build-module/navigation/edit/index.js +18 -27
  119. package/build-module/navigation/edit/index.js.map +1 -1
  120. package/build-module/navigation/edit/inner-blocks.js +1 -4
  121. package/build-module/navigation/edit/inner-blocks.js.map +1 -1
  122. package/build-module/navigation/edit/unsaved-inner-blocks.js +1 -4
  123. package/build-module/navigation/edit/unsaved-inner-blocks.js.map +1 -1
  124. package/build-module/navigation/edit/use-convert-classic-menu-to-block-menu.js +1 -1
  125. package/build-module/navigation/edit/use-convert-classic-menu-to-block-menu.js.map +1 -1
  126. package/build-module/navigation/interactivity.js +136 -0
  127. package/build-module/navigation/interactivity.js.map +1 -0
  128. package/build-module/navigation-link/edit.js +1 -1
  129. package/build-module/navigation-link/edit.js.map +1 -1
  130. package/build-module/navigation-submenu/edit.js +1 -1
  131. package/build-module/navigation-submenu/edit.js.map +1 -1
  132. package/build-module/paragraph/index.js +5 -1
  133. package/build-module/paragraph/index.js.map +1 -1
  134. package/build-module/paragraph/transforms.js +5 -1
  135. package/build-module/paragraph/transforms.js.map +1 -1
  136. package/build-module/post-author-name/edit.js +1 -1
  137. package/build-module/post-author-name/edit.js.map +1 -1
  138. package/build-module/post-featured-image/edit.js +1 -2
  139. package/build-module/post-featured-image/edit.js.map +1 -1
  140. package/build-module/post-featured-image/overlay.js +5 -0
  141. package/build-module/post-featured-image/overlay.js.map +1 -1
  142. package/build-module/post-title/edit.js +13 -4
  143. package/build-module/post-title/edit.js.map +1 -1
  144. package/build-module/preformatted/edit.native.js +3 -2
  145. package/build-module/preformatted/edit.native.js.map +1 -1
  146. package/build-module/quote/transforms.js +16 -27
  147. package/build-module/quote/transforms.js.map +1 -1
  148. package/build-module/read-more/edit.js +1 -1
  149. package/build-module/read-more/edit.js.map +1 -1
  150. package/build-module/search/edit.js +9 -1
  151. package/build-module/search/edit.js.map +1 -1
  152. package/build-module/site-title/edit/index.js +1 -1
  153. package/build-module/site-title/edit/index.js.map +1 -1
  154. package/build-module/social-links/edit.js +2 -2
  155. package/build-module/social-links/edit.js.map +1 -1
  156. package/build-module/utils/interactivity/constants.js +2 -0
  157. package/build-module/utils/interactivity/constants.js.map +1 -0
  158. package/build-module/utils/interactivity/directives.js +193 -0
  159. package/build-module/utils/interactivity/directives.js.map +1 -0
  160. package/build-module/utils/interactivity/hooks.js +98 -0
  161. package/build-module/utils/interactivity/hooks.js.map +1 -0
  162. package/build-module/utils/interactivity/hydration.js +21 -0
  163. package/build-module/utils/interactivity/hydration.js.map +1 -0
  164. package/build-module/utils/interactivity/index.js +17 -0
  165. package/build-module/utils/interactivity/index.js.map +1 -0
  166. package/build-module/utils/interactivity/store.js +56 -0
  167. package/build-module/utils/interactivity/store.js.map +1 -0
  168. package/build-module/utils/interactivity/utils.js +75 -0
  169. package/build-module/utils/interactivity/utils.js.map +1 -0
  170. package/build-module/utils/interactivity/vdom.js +97 -0
  171. package/build-module/utils/interactivity/vdom.js.map +1 -0
  172. package/build-style/cover/style-rtl.css +2 -0
  173. package/build-style/cover/style.css +2 -0
  174. package/build-style/{details-summary → details}/editor-rtl.css +1 -1
  175. package/build-style/{details-summary → details}/editor.css +1 -1
  176. package/build-style/details/style-rtl.css +14 -0
  177. package/build-style/details/style.css +14 -0
  178. package/build-style/editor-rtl.css +3 -5
  179. package/build-style/editor.css +3 -5
  180. package/build-style/gallery/editor-rtl.css +0 -4
  181. package/build-style/gallery/editor.css +0 -4
  182. package/build-style/search/editor-rtl.css +1 -0
  183. package/build-style/search/editor.css +1 -0
  184. package/build-style/site-logo/editor-rtl.css +1 -0
  185. package/build-style/site-logo/editor.css +1 -0
  186. package/build-style/style-rtl.css +13 -1
  187. package/build-style/style.css +13 -1
  188. package/package.json +36 -32
  189. package/src/comment-author-name/edit.js +1 -1
  190. package/src/comment-edit-link/edit.js +1 -1
  191. package/src/comment-template/index.php +8 -7
  192. package/src/cover/block.json +1 -1
  193. package/src/cover/edit/inspector-controls.js +56 -54
  194. package/src/cover/style.scss +5 -0
  195. package/src/cover/test/edit.js +56 -2
  196. package/src/cover/variations.js +1 -3
  197. package/src/details/block.json +8 -6
  198. package/src/details/edit.js +27 -5
  199. package/src/details/editor.scss +3 -0
  200. package/src/details/index.js +10 -5
  201. package/src/details/save.js +5 -1
  202. package/src/details/style.scss +16 -0
  203. package/src/editor.scss +1 -1
  204. package/src/embed/variations.js +2 -2
  205. package/src/file/view.js +4 -1
  206. package/src/gallery/edit.js +5 -8
  207. package/src/gallery/editor.scss +0 -6
  208. package/src/gallery/test/index.native.js +48 -3
  209. package/src/image/test/edit.native.js +38 -16
  210. package/src/index.js +0 -4
  211. package/src/index.native.js +1 -0
  212. package/src/loginout/block.json +11 -1
  213. package/src/navigation/constants.js +16 -0
  214. package/src/navigation/edit/index.js +71 -83
  215. package/src/navigation/edit/inner-blocks.js +1 -16
  216. package/src/navigation/edit/unsaved-inner-blocks.js +1 -16
  217. package/src/navigation/edit/use-convert-classic-menu-to-block-menu.js +1 -1
  218. package/src/navigation/index.php +209 -203
  219. package/src/navigation/interactivity.js +144 -0
  220. package/src/navigation-link/edit.js +1 -1
  221. package/src/navigation-submenu/edit.js +1 -1
  222. package/src/paragraph/block.json +5 -1
  223. package/src/post-author-name/edit.js +1 -1
  224. package/src/post-featured-image/edit.js +1 -1
  225. package/src/post-featured-image/index.php +1 -1
  226. package/src/post-featured-image/overlay.js +4 -0
  227. package/src/post-terms/index.php +2 -2
  228. package/src/post-title/edit.js +8 -1
  229. package/src/preformatted/edit.native.js +1 -3
  230. package/src/quote/transforms.js +0 -6
  231. package/src/read-more/edit.js +1 -1
  232. package/src/search/edit.js +9 -4
  233. package/src/search/editor.scss +1 -0
  234. package/src/site-logo/editor.scss +2 -1
  235. package/src/site-title/edit/index.js +1 -1
  236. package/src/social-links/edit.js +33 -31
  237. package/src/style.scss +0 -1
  238. package/src/template-part/index.php +20 -5
  239. package/src/utils/interactivity/constants.js +1 -0
  240. package/src/utils/interactivity/directives.js +179 -0
  241. package/src/utils/interactivity/hooks.js +76 -0
  242. package/src/utils/interactivity/hydration.js +22 -0
  243. package/src/utils/interactivity/index.js +17 -0
  244. package/src/utils/interactivity/store.js +45 -0
  245. package/src/utils/interactivity/utils.js +66 -0
  246. package/src/utils/interactivity/vdom.js +94 -0
  247. package/tsconfig.json +1 -0
  248. package/tsconfig.tsbuildinfo +1 -1
  249. package/build/details-content/edit.js +0 -34
  250. package/build/details-content/edit.js.map +0 -1
  251. package/build/details-content/index.js +0 -94
  252. package/build/details-content/index.js.map +0 -1
  253. package/build/details-content/save.js +0 -20
  254. package/build/details-content/save.js.map +0 -1
  255. package/build/details-summary/edit.js +0 -42
  256. package/build/details-summary/edit.js.map +0 -1
  257. package/build/details-summary/index.js +0 -97
  258. package/build/details-summary/index.js.map +0 -1
  259. package/build/details-summary/save.js +0 -24
  260. package/build/details-summary/save.js.map +0 -1
  261. package/build-module/details-content/edit.js +0 -23
  262. package/build-module/details-content/edit.js.map +0 -1
  263. package/build-module/details-content/index.js +0 -76
  264. package/build-module/details-content/index.js.map +0 -1
  265. package/build-module/details-content/save.js +0 -11
  266. package/build-module/details-content/save.js.map +0 -1
  267. package/build-module/details-summary/edit.js +0 -30
  268. package/build-module/details-summary/edit.js.map +0 -1
  269. package/build-module/details-summary/index.js +0 -79
  270. package/build-module/details-summary/index.js.map +0 -1
  271. package/build-module/details-summary/save.js +0 -16
  272. package/build-module/details-summary/save.js.map +0 -1
  273. package/build-style/details-summary/style-rtl.css +0 -91
  274. package/build-style/details-summary/style.css +0 -91
  275. package/src/details-content/block.json +0 -50
  276. package/src/details-content/edit.js +0 -29
  277. package/src/details-content/index.js +0 -23
  278. package/src/details-content/save.js +0 -12
  279. package/src/details-summary/block.json +0 -53
  280. package/src/details-summary/edit.js +0 -27
  281. package/src/details-summary/editor.scss +0 -3
  282. package/src/details-summary/index.js +0 -23
  283. package/src/details-summary/save.js +0 -13
  284. package/src/details-summary/style.scss +0 -3
@@ -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
-
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
-
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
-
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
201
 
345
- // See if we have a classic menu.
346
- $classic_nav_menu = block_core_navigation_get_classic_menu_fallback();
347
202
 
348
- if ( ! $classic_nav_menu ) {
349
- return;
350
- }
351
203
 
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.
@@ -881,3 +678,212 @@ function block_core_navigation_typographic_presets_backcompatibility( $parsed_bl
881
678
  }
882
679
 
883
680
  add_filter( 'render_block_data', 'block_core_navigation_typographic_presets_backcompatibility' );
681
+
682
+ /**
683
+ * Turns menu item data into a nested array of parsed blocks
684
+ *
685
+ * @param array $menu_items An array of menu items that represent
686
+ * an individual level of a menu.
687
+ * @param array $menu_items_by_parent_id An array keyed by the id of the
688
+ * parent menu where each element is an
689
+ * array of menu items that belong to
690
+ * that parent.
691
+ * @return array An array of parsed block data.
692
+ */
693
+ function block_core_navigation_parse_blocks_from_menu_items( $menu_items, $menu_items_by_parent_id ) {
694
+
695
+ _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::parse_blocks_from_menu_items' );
696
+
697
+ if ( empty( $menu_items ) ) {
698
+ return array();
699
+ }
700
+
701
+ $blocks = array();
702
+
703
+ foreach ( $menu_items as $menu_item ) {
704
+ $class_name = ! empty( $menu_item->classes ) ? implode( ' ', (array) $menu_item->classes ) : null;
705
+ $id = ( null !== $menu_item->object_id && 'custom' !== $menu_item->object ) ? $menu_item->object_id : null;
706
+ $opens_in_new_tab = null !== $menu_item->target && '_blank' === $menu_item->target;
707
+ $rel = ( null !== $menu_item->xfn && '' !== $menu_item->xfn ) ? $menu_item->xfn : null;
708
+ $kind = null !== $menu_item->type ? str_replace( '_', '-', $menu_item->type ) : 'custom';
709
+
710
+ $block = array(
711
+ 'blockName' => isset( $menu_items_by_parent_id[ $menu_item->ID ] ) ? 'core/navigation-submenu' : 'core/navigation-link',
712
+ 'attrs' => array(
713
+ 'className' => $class_name,
714
+ 'description' => $menu_item->description,
715
+ 'id' => $id,
716
+ 'kind' => $kind,
717
+ 'label' => $menu_item->title,
718
+ 'opensInNewTab' => $opens_in_new_tab,
719
+ 'rel' => $rel,
720
+ 'title' => $menu_item->attr_title,
721
+ 'type' => $menu_item->object,
722
+ 'url' => $menu_item->url,
723
+ ),
724
+ );
725
+
726
+ $block['innerBlocks'] = isset( $menu_items_by_parent_id[ $menu_item->ID ] )
727
+ ? block_core_navigation_parse_blocks_from_menu_items( $menu_items_by_parent_id[ $menu_item->ID ], $menu_items_by_parent_id )
728
+ : array();
729
+ $block['innerContent'] = array_map( 'serialize_block', $block['innerBlocks'] );
730
+
731
+ $blocks[] = $block;
732
+ }
733
+
734
+ return $blocks;
735
+ }
736
+
737
+ /**
738
+ * Get the classic navigation menu to use as a fallback.
739
+ *
740
+ * @return object WP_Term The classic navigation.
741
+ */
742
+ function block_core_navigation_get_classic_menu_fallback() {
743
+
744
+ _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::get_classic_menu_fallback' );
745
+
746
+ $classic_nav_menus = wp_get_nav_menus();
747
+
748
+ // If menus exist.
749
+ if ( $classic_nav_menus && ! is_wp_error( $classic_nav_menus ) ) {
750
+ // Handles simple use case where user has a classic menu and switches to a block theme.
751
+
752
+ // Returns the menu assigned to location `primary`.
753
+ $locations = get_nav_menu_locations();
754
+ if ( isset( $locations['primary'] ) ) {
755
+ $primary_menu = wp_get_nav_menu_object( $locations['primary'] );
756
+ if ( $primary_menu ) {
757
+ return $primary_menu;
758
+ }
759
+ }
760
+
761
+ // Returns a menu if `primary` is its slug.
762
+ foreach ( $classic_nav_menus as $classic_nav_menu ) {
763
+ if ( 'primary' === $classic_nav_menu->slug ) {
764
+ return $classic_nav_menu;
765
+ }
766
+ }
767
+
768
+ // Otherwise return the most recently created classic menu.
769
+ usort(
770
+ $classic_nav_menus,
771
+ function( $a, $b ) {
772
+ return $b->term_id - $a->term_id;
773
+ }
774
+ );
775
+ return $classic_nav_menus[0];
776
+ }
777
+ }
778
+
779
+ /**
780
+ * Converts a classic navigation to blocks.
781
+ *
782
+ * @param object $classic_nav_menu WP_Term The classic navigation object to convert.
783
+ * @return array the normalized parsed blocks.
784
+ */
785
+ function block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu ) {
786
+
787
+ _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::get_classic_menu_fallback_blocks' );
788
+
789
+ // BEGIN: Code that already exists in wp_nav_menu().
790
+ $menu_items = wp_get_nav_menu_items( $classic_nav_menu->term_id, array( 'update_post_term_cache' => false ) );
791
+
792
+ // Set up the $menu_item variables.
793
+ _wp_menu_item_classes_by_context( $menu_items );
794
+
795
+ $sorted_menu_items = array();
796
+ foreach ( (array) $menu_items as $menu_item ) {
797
+ $sorted_menu_items[ $menu_item->menu_order ] = $menu_item;
798
+ }
799
+
800
+ unset( $menu_items, $menu_item );
801
+
802
+ // END: Code that already exists in wp_nav_menu().
803
+
804
+ $menu_items_by_parent_id = array();
805
+ foreach ( $sorted_menu_items as $menu_item ) {
806
+ $menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item;
807
+ }
808
+
809
+ $inner_blocks = block_core_navigation_parse_blocks_from_menu_items(
810
+ isset( $menu_items_by_parent_id[0] )
811
+ ? $menu_items_by_parent_id[0]
812
+ : array(),
813
+ $menu_items_by_parent_id
814
+ );
815
+
816
+ return serialize_blocks( $inner_blocks );
817
+ }
818
+
819
+ /**
820
+ * If there's a the classic menu then use it as a fallback.
821
+ *
822
+ * @return array the normalized parsed blocks.
823
+ */
824
+ function block_core_navigation_maybe_use_classic_menu_fallback() {
825
+
826
+ _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::create_classic_menu_fallback' );
827
+
828
+ // See if we have a classic menu.
829
+ $classic_nav_menu = block_core_navigation_get_classic_menu_fallback();
830
+
831
+ if ( ! $classic_nav_menu ) {
832
+ return;
833
+ }
834
+
835
+ // If we have a classic menu then convert it to blocks.
836
+ $classic_nav_menu_blocks = block_core_navigation_get_classic_menu_fallback_blocks( $classic_nav_menu );
837
+
838
+ if ( empty( $classic_nav_menu_blocks ) ) {
839
+ return;
840
+ }
841
+
842
+ // Create a new navigation menu from the classic menu.
843
+ $wp_insert_post_result = wp_insert_post(
844
+ array(
845
+ 'post_content' => $classic_nav_menu_blocks,
846
+ 'post_title' => $classic_nav_menu->name,
847
+ 'post_name' => $classic_nav_menu->slug,
848
+ 'post_status' => 'publish',
849
+ 'post_type' => 'wp_navigation',
850
+ ),
851
+ true // So that we can check whether the result is an error.
852
+ );
853
+
854
+ if ( is_wp_error( $wp_insert_post_result ) ) {
855
+ return;
856
+ }
857
+
858
+ // Fetch the most recently published navigation which will be the classic one created above.
859
+ return block_core_navigation_get_most_recently_published_navigation();
860
+ }
861
+
862
+ /**
863
+ * Finds the most recently published `wp_navigation` Post.
864
+ *
865
+ * @return WP_Post|null the first non-empty Navigation or null.
866
+ */
867
+ function block_core_navigation_get_most_recently_published_navigation() {
868
+
869
+ _deprecated_function( __FUNCTION__, '6.3.0', 'WP_Navigation_Fallback_Gutenberg::get_most_recently_published_navigation' );
870
+
871
+ // Default to the most recently created menu.
872
+ $parsed_args = array(
873
+ 'post_type' => 'wp_navigation',
874
+ 'no_found_rows' => true,
875
+ 'update_post_meta_cache' => false,
876
+ 'update_post_term_cache' => false,
877
+ 'order' => 'DESC',
878
+ 'orderby' => 'date',
879
+ 'post_status' => 'publish',
880
+ 'posts_per_page' => 1, // get only the most recent.
881
+ );
882
+
883
+ $navigation_post = new WP_Query( $parsed_args );
884
+ if ( count( $navigation_post->posts ) > 0 ) {
885
+ return $navigation_post->posts[0];
886
+ }
887
+
888
+ return null;
889
+ }
@@ -0,0 +1,144 @@
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
+ initModal: async ( { 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: async ( { 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
+ handleMenuKeydown: ( { actions, context, event } ) => {
90
+ if ( context.core.navigation.isMenuOpen ) {
91
+ // If Escape close the menu
92
+ if (
93
+ event?.key === 'Escape' ||
94
+ event?.keyCode === 27
95
+ ) {
96
+ actions.core.navigation.closeMenu( { context } );
97
+ return;
98
+ }
99
+
100
+ // Trap focus if it is an overlay (main menu)
101
+ if (
102
+ context.core.navigation.overlay &&
103
+ ( event.key === 'Tab' || event.keyCode === 9 )
104
+ ) {
105
+ // If shift + tab it change the direction
106
+ if (
107
+ event.shiftKey &&
108
+ window.document.activeElement ===
109
+ context.core.navigation
110
+ .firstFocusableElement
111
+ ) {
112
+ event.preventDefault();
113
+ context.core.navigation.lastFocusableElement.focus();
114
+ } else if (
115
+ ! event.shiftKey &&
116
+ window.document.activeElement ===
117
+ context.core.navigation.lastFocusableElement
118
+ ) {
119
+ event.preventDefault();
120
+ context.core.navigation.firstFocusableElement.focus();
121
+ }
122
+ }
123
+ }
124
+ },
125
+ handleMenuFocusout: ( { actions, context, event } ) => {
126
+ if ( context.core.navigation.isMenuOpen ) {
127
+ // If focus is outside modal, and in the document, close menu
128
+ // event.target === The element losing focus
129
+ // event.relatedTarget === The element receiving focus (if any)
130
+ // When focusout is outsite the document, `window.document.activeElement` doesn't change
131
+ if (
132
+ ! context.core.navigation.modal.contains(
133
+ event.relatedTarget
134
+ ) &&
135
+ event.target !== window.document.activeElement
136
+ ) {
137
+ actions.core.navigation.closeMenu( { context } );
138
+ }
139
+ }
140
+ },
141
+ },
142
+ },
143
+ },
144
+ } );
@@ -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 ) : '' }
@@ -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 || '' }
@@ -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,
@@ -69,7 +69,7 @@ function PostAuthorNameEdit( {
69
69
  />
70
70
  </BlockControls>
71
71
  <InspectorControls>
72
- <PanelBody title={ __( 'Link settings' ) }>
72
+ <PanelBody title={ __( 'Settings' ) }>
73
73
  <ToggleControl
74
74
  __nextHasNoMarginBottom
75
75
  label={ __( 'Link to author archive' ) }
@@ -97,7 +97,7 @@ export default function PostFeaturedImageEdit( {
97
97
  } ) );
98
98
 
99
99
  const blockProps = useBlockProps( {
100
- style: { width, height, aspectRatio, maxWidth: '100%' },
100
+ style: { width, height, aspectRatio },
101
101
  } );
102
102
  const borderProps = useBorderProps( attributes );
103
103
 
@@ -92,7 +92,7 @@ function render_block_core_post_featured_image( $attributes, $content, $block )
92
92
  if ( ! $height && ! $width && ! $aspect_ratio ) {
93
93
  $wrapper_attributes = get_block_wrapper_attributes();
94
94
  } else {
95
- $wrapper_attributes = get_block_wrapper_attributes( array( 'style' => $aspect_ratio . $width . $height . 'max-width:100%;' ) );
95
+ $wrapper_attributes = get_block_wrapper_attributes( array( 'style' => $aspect_ratio . $width . $height ) );
96
96
  }
97
97
  return "<figure {$wrapper_attributes}>{$featured_image}</figure>";
98
98
  }
@@ -45,6 +45,10 @@ const Overlay = ( {
45
45
  ...borderProps.style,
46
46
  };
47
47
 
48
+ if ( ! colorGradientSettings.hasColorsOrGradients ) {
49
+ return null;
50
+ }
51
+
48
52
  return (
49
53
  <>
50
54
  { !! dimRatio && (
@@ -64,8 +64,8 @@ function render_block_core_post_terms( $attributes, $content, $block ) {
64
64
  function register_block_core_post_terms() {
65
65
  $taxonomies = get_taxonomies(
66
66
  array(
67
- 'public' => true,
68
- 'show_in_rest' => true,
67
+ 'publicly_queryable' => true,
68
+ 'show_in_rest' => true,
69
69
  ),
70
70
  'objects'
71
71
  );