@wordpress/block-library 11.0.2-next.v.202609171837.0 → 11.2.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 (686) hide show
  1. package/CHANGELOG.md +44 -1
  2. package/build/accordion/block.json +4 -1
  3. package/build/accordion-heading/block.json +1 -0
  4. package/build/accordion-item/block.json +7 -1
  5. package/build/accordion-panel/block.json +9 -1
  6. package/build/archives/block.json +12 -0
  7. package/build/audio/block.json +8 -0
  8. package/build/audio/edit.cjs +2 -1
  9. package/build/audio/edit.cjs.map +2 -2
  10. package/build/avatar/block.json +4 -0
  11. package/build/avatar/edit.cjs +31 -1
  12. package/build/avatar/edit.cjs.map +3 -3
  13. package/build/breadcrumbs/block.json +3 -0
  14. package/build/breadcrumbs/edit.cjs.map +3 -3
  15. package/build/button/block.json +6 -0
  16. package/build/button/edit.cjs +9 -6
  17. package/build/button/edit.cjs.map +2 -2
  18. package/build/buttons/block.json +15 -1
  19. package/build/categories/block.json +12 -1
  20. package/build/code/block.json +13 -0
  21. package/build/column/block.json +9 -0
  22. package/build/column/edit.cjs +5 -0
  23. package/build/column/edit.cjs.map +2 -2
  24. package/build/columns/block.json +13 -0
  25. package/build/columns/edit.cjs +21 -112
  26. package/build/columns/edit.cjs.map +3 -3
  27. package/build/comment-author-name/block.json +3 -0
  28. package/build/comment-content/block.json +5 -0
  29. package/build/comment-date/block.json +3 -0
  30. package/build/comment-edit-link/block.json +3 -0
  31. package/build/comment-reply-link/block.json +3 -0
  32. package/build/comments/block.json +10 -0
  33. package/build/comments/edit/placeholder.cjs +95 -87
  34. package/build/comments/edit/placeholder.cjs.map +2 -2
  35. package/build/comments-pagination/block.json +14 -0
  36. package/build/comments-pagination-next/block.json +3 -0
  37. package/build/comments-pagination-numbers/block.json +3 -0
  38. package/build/comments-pagination-previous/block.json +6 -0
  39. package/build/comments-title/block.json +3 -0
  40. package/build/cover/block.json +2 -1
  41. package/build/cover/edit/index.cjs +30 -6
  42. package/build/cover/edit/index.cjs.map +2 -2
  43. package/build/cover/edit/inspector-controls.cjs +56 -14
  44. package/build/cover/edit/inspector-controls.cjs.map +2 -2
  45. package/build/cover/embed-video-utils.cjs +9 -8
  46. package/build/cover/embed-video-utils.cjs.map +2 -2
  47. package/build/cover/view.cjs +21 -0
  48. package/build/cover/view.cjs.map +7 -0
  49. package/build/details/block.json +14 -0
  50. package/build/embed/block.json +6 -1
  51. package/build/file/block.json +14 -0
  52. package/build/footnotes/block.json +13 -0
  53. package/build/gallery/block.json +22 -0
  54. package/build/gallery/dynamic-gallery.cjs +32 -93
  55. package/build/gallery/dynamic-gallery.cjs.map +3 -3
  56. package/build/gallery/edit.cjs +104 -42
  57. package/build/gallery/edit.cjs.map +2 -2
  58. package/build/gallery/order-controls.cjs +107 -0
  59. package/build/gallery/order-controls.cjs.map +7 -0
  60. package/build/gallery/order-images.cjs +92 -0
  61. package/build/gallery/order-images.cjs.map +7 -0
  62. package/build/gallery/order-options.cjs +62 -0
  63. package/build/gallery/order-options.cjs.map +7 -0
  64. package/build/gallery/use-dynamic-gallery.cjs +1 -7
  65. package/build/gallery/use-dynamic-gallery.cjs.map +2 -2
  66. package/build/gallery/use-get-media.cjs +2 -3
  67. package/build/gallery/use-get-media.cjs.map +2 -2
  68. package/build/group/block.json +1 -0
  69. package/build/group/edit.cjs +3 -3
  70. package/build/group/edit.cjs.map +2 -2
  71. package/build/heading/block.json +14 -0
  72. package/build/home-link/block.json +30 -0
  73. package/build/home-link/edit.cjs.map +3 -3
  74. package/build/icon/components/custom-inserter/index.cjs +3 -1
  75. package/build/icon/components/custom-inserter/index.cjs.map +2 -2
  76. package/build/icon/edit.cjs +49 -5
  77. package/build/icon/edit.cjs.map +2 -2
  78. package/build/image/image.cjs +10 -8
  79. package/build/image/image.cjs.map +3 -3
  80. package/build/image/use-open-image-media-editor-modal.cjs +32 -8
  81. package/build/image/use-open-image-media-editor-modal.cjs.map +2 -2
  82. package/build/image/view.cjs +44 -50
  83. package/build/image/view.cjs.map +2 -2
  84. package/build/latest-comments/block.json +20 -0
  85. package/build/latest-posts/block.json +14 -0
  86. package/build/list/block.json +12 -1
  87. package/build/list-item/block.json +8 -1
  88. package/build/list-item/index.cjs +4 -0
  89. package/build/list-item/index.cjs.map +3 -3
  90. package/build/loginout/block.json +14 -0
  91. package/build/math/block.json +14 -0
  92. package/build/media-text/block.json +19 -0
  93. package/build/navigation/edit/index.cjs +1 -4
  94. package/build/navigation/edit/index.cjs.map +2 -2
  95. package/build/navigation-link/link-ui/index.cjs +33 -19
  96. package/build/navigation-link/link-ui/index.cjs.map +2 -2
  97. package/build/navigation-link/link-ui/page-creator.cjs.map +3 -3
  98. package/build/navigation-link/shared/controls.cjs.map +3 -3
  99. package/build/navigation-link/shared/index.cjs +5 -0
  100. package/build/navigation-link/shared/index.cjs.map +2 -2
  101. package/build/navigation-link/shared/use-block-suggestions.cjs +141 -0
  102. package/build/navigation-link/shared/use-block-suggestions.cjs.map +7 -0
  103. package/build/navigation-link/shared/use-link-preview.cjs +13 -13
  104. package/build/navigation-link/shared/use-link-preview.cjs.map +2 -2
  105. package/build/navigation-overlay-close/block.json +7 -0
  106. package/build/navigation-submenu/block.json +6 -0
  107. package/build/navigation-submenu/edit.cjs +9 -1
  108. package/build/navigation-submenu/edit.cjs.map +3 -3
  109. package/build/page-list/block.json +14 -0
  110. package/build/paragraph/block.json +1 -0
  111. package/build/paragraph/edit.cjs +1 -2
  112. package/build/paragraph/edit.cjs.map +2 -2
  113. package/build/playlist/block.json +1 -0
  114. package/build/post-author-biography/block.json +5 -0
  115. package/build/post-author-name/block.json +5 -0
  116. package/build/post-comments-count/block.json +3 -0
  117. package/build/post-comments-form/block.json +15 -0
  118. package/build/post-content/block.json +4 -1
  119. package/build/post-date/block.json +3 -0
  120. package/build/post-excerpt/block.json +9 -0
  121. package/build/post-featured-image/block.json +1 -0
  122. package/build/post-featured-image/edit.cjs +12 -10
  123. package/build/post-featured-image/edit.cjs.map +2 -2
  124. package/build/post-navigation-link/block.json +30 -0
  125. package/build/post-navigation-link/edit.cjs +13 -2
  126. package/build/post-navigation-link/edit.cjs.map +3 -3
  127. package/build/post-template/block.json +13 -1
  128. package/build/post-terms/block.json +10 -0
  129. package/build/post-time-to-read/block.json +10 -0
  130. package/build/post-title/block.json +14 -0
  131. package/build/preformatted/block.json +11 -0
  132. package/build/pullquote/block.json +3 -1
  133. package/build/query-no-results/block.json +14 -2
  134. package/build/query-pagination/block.json +20 -0
  135. package/build/query-pagination-next/block.json +3 -0
  136. package/build/query-pagination-numbers/block.json +3 -0
  137. package/build/query-pagination-previous/block.json +3 -0
  138. package/build/query-title/block.json +3 -0
  139. package/build/query-total/block.json +10 -0
  140. package/build/quote/block.json +3 -0
  141. package/build/read-more/block.json +11 -0
  142. package/build/rss/block.json +10 -0
  143. package/build/search/block.json +2 -1
  144. package/build/site-tagline/block.json +12 -1
  145. package/build/site-title/block.json +11 -1
  146. package/build/social-links/block.json +4 -0
  147. package/build/social-links/edit.cjs +2 -3
  148. package/build/social-links/edit.cjs.map +2 -2
  149. package/build/tab-list/block.json +4 -0
  150. package/build/tab-list/edit.cjs +3 -1
  151. package/build/tab-list/edit.cjs.map +3 -3
  152. package/build/tab-list/save.cjs +3 -1
  153. package/build/tab-list/save.cjs.map +3 -3
  154. package/build/tab-panel/block.json +25 -0
  155. package/build/tab-panel/controls.cjs.map +3 -3
  156. package/build/tab-panels/block.json +21 -1
  157. package/build/table-of-contents/block.json +7 -0
  158. package/build/tabs/block.json +27 -1
  159. package/build/tag-cloud/block.json +19 -0
  160. package/build/template-part/edit/selection-modal.cjs.map +1 -1
  161. package/build/term-count/block.json +12 -0
  162. package/build/term-description/block.json +13 -0
  163. package/build/term-name/block.json +16 -1
  164. package/build/term-template/block.json +14 -1
  165. package/build/utils/search-patterns.cjs +7 -43
  166. package/build/utils/search-patterns.cjs.map +3 -3
  167. package/build/utils/style-state.cjs +4 -6
  168. package/build/utils/style-state.cjs.map +2 -2
  169. package/build/utils/waveform-utils.cjs +2 -2
  170. package/build/utils/waveform-utils.cjs.map +2 -2
  171. package/build/verse/block.json +4 -0
  172. package/build/video/block.json +12 -0
  173. package/build/video/edit.cjs +30 -14
  174. package/build/video/edit.cjs.map +3 -3
  175. package/build/video/index.cjs +0 -2
  176. package/build/video/index.cjs.map +3 -3
  177. package/build/video/save.cjs +5 -1
  178. package/build/video/save.cjs.map +3 -3
  179. package/build-module/accordion/block.json +4 -1
  180. package/build-module/accordion-heading/block.json +1 -0
  181. package/build-module/accordion-item/block.json +7 -1
  182. package/build-module/accordion-panel/block.json +9 -1
  183. package/build-module/archives/block.json +12 -0
  184. package/build-module/audio/block.json +8 -0
  185. package/build-module/audio/edit.mjs +2 -1
  186. package/build-module/audio/edit.mjs.map +2 -2
  187. package/build-module/avatar/block.json +4 -0
  188. package/build-module/avatar/edit.mjs +33 -2
  189. package/build-module/avatar/edit.mjs.map +2 -2
  190. package/build-module/breadcrumbs/block.json +3 -0
  191. package/build-module/breadcrumbs/edit.mjs +3 -3
  192. package/build-module/breadcrumbs/edit.mjs.map +2 -2
  193. package/build-module/button/block.json +6 -0
  194. package/build-module/button/edit.mjs +11 -7
  195. package/build-module/button/edit.mjs.map +2 -2
  196. package/build-module/buttons/block.json +15 -1
  197. package/build-module/categories/block.json +12 -1
  198. package/build-module/code/block.json +13 -0
  199. package/build-module/column/block.json +9 -0
  200. package/build-module/column/edit.mjs +5 -0
  201. package/build-module/column/edit.mjs.map +2 -2
  202. package/build-module/columns/block.json +13 -0
  203. package/build-module/columns/edit.mjs +22 -122
  204. package/build-module/columns/edit.mjs.map +2 -2
  205. package/build-module/comment-author-name/block.json +3 -0
  206. package/build-module/comment-content/block.json +5 -0
  207. package/build-module/comment-date/block.json +3 -0
  208. package/build-module/comment-edit-link/block.json +3 -0
  209. package/build-module/comment-reply-link/block.json +3 -0
  210. package/build-module/comments/block.json +10 -0
  211. package/build-module/comments/edit/placeholder.mjs +95 -87
  212. package/build-module/comments/edit/placeholder.mjs.map +2 -2
  213. package/build-module/comments-pagination/block.json +14 -0
  214. package/build-module/comments-pagination-next/block.json +3 -0
  215. package/build-module/comments-pagination-numbers/block.json +3 -0
  216. package/build-module/comments-pagination-previous/block.json +6 -0
  217. package/build-module/comments-title/block.json +3 -0
  218. package/build-module/cover/block.json +2 -1
  219. package/build-module/cover/edit/index.mjs +36 -7
  220. package/build-module/cover/edit/index.mjs.map +2 -2
  221. package/build-module/cover/edit/inspector-controls.mjs +62 -16
  222. package/build-module/cover/edit/inspector-controls.mjs.map +2 -2
  223. package/build-module/cover/embed-video-utils.mjs +9 -8
  224. package/build-module/cover/embed-video-utils.mjs.map +2 -2
  225. package/build-module/cover/view.mjs +19 -0
  226. package/build-module/cover/view.mjs.map +7 -0
  227. package/build-module/details/block.json +14 -0
  228. package/build-module/embed/block.json +6 -1
  229. package/build-module/file/block.json +14 -0
  230. package/build-module/footnotes/block.json +13 -0
  231. package/build-module/gallery/block.json +22 -0
  232. package/build-module/gallery/dynamic-gallery.mjs +33 -97
  233. package/build-module/gallery/dynamic-gallery.mjs.map +2 -2
  234. package/build-module/gallery/edit.mjs +111 -44
  235. package/build-module/gallery/edit.mjs.map +2 -2
  236. package/build-module/gallery/order-controls.mjs +87 -0
  237. package/build-module/gallery/order-controls.mjs.map +7 -0
  238. package/build-module/gallery/order-images.mjs +66 -0
  239. package/build-module/gallery/order-images.mjs.map +7 -0
  240. package/build-module/gallery/order-options.mjs +33 -0
  241. package/build-module/gallery/order-options.mjs.map +7 -0
  242. package/build-module/gallery/use-dynamic-gallery.mjs +1 -7
  243. package/build-module/gallery/use-dynamic-gallery.mjs.map +2 -2
  244. package/build-module/gallery/use-get-media.mjs +2 -3
  245. package/build-module/gallery/use-get-media.mjs.map +2 -2
  246. package/build-module/group/block.json +1 -0
  247. package/build-module/group/edit.mjs +4 -4
  248. package/build-module/group/edit.mjs.map +2 -2
  249. package/build-module/heading/block.json +14 -0
  250. package/build-module/home-link/block.json +30 -0
  251. package/build-module/home-link/edit.mjs +2 -2
  252. package/build-module/home-link/edit.mjs.map +2 -2
  253. package/build-module/icon/components/custom-inserter/index.mjs +3 -1
  254. package/build-module/icon/components/custom-inserter/index.mjs.map +2 -2
  255. package/build-module/icon/edit.mjs +50 -6
  256. package/build-module/icon/edit.mjs.map +2 -2
  257. package/build-module/image/image.mjs +12 -10
  258. package/build-module/image/image.mjs.map +2 -2
  259. package/build-module/image/use-open-image-media-editor-modal.mjs +32 -8
  260. package/build-module/image/use-open-image-media-editor-modal.mjs.map +2 -2
  261. package/build-module/image/view.mjs +44 -50
  262. package/build-module/image/view.mjs.map +2 -2
  263. package/build-module/latest-comments/block.json +20 -0
  264. package/build-module/latest-posts/block.json +14 -0
  265. package/build-module/list/block.json +12 -1
  266. package/build-module/list-item/block.json +8 -1
  267. package/build-module/list-item/index.mjs +4 -0
  268. package/build-module/list-item/index.mjs.map +2 -2
  269. package/build-module/loginout/block.json +14 -0
  270. package/build-module/math/block.json +14 -0
  271. package/build-module/media-text/block.json +19 -0
  272. package/build-module/navigation/edit/index.mjs +1 -4
  273. package/build-module/navigation/edit/index.mjs.map +2 -2
  274. package/build-module/navigation-link/link-ui/index.mjs +39 -20
  275. package/build-module/navigation-link/link-ui/index.mjs.map +2 -2
  276. package/build-module/navigation-link/link-ui/page-creator.mjs +2 -2
  277. package/build-module/navigation-link/link-ui/page-creator.mjs.map +2 -2
  278. package/build-module/navigation-link/shared/controls.mjs +2 -2
  279. package/build-module/navigation-link/shared/controls.mjs.map +2 -2
  280. package/build-module/navigation-link/shared/index.mjs +6 -0
  281. package/build-module/navigation-link/shared/index.mjs.map +2 -2
  282. package/build-module/navigation-link/shared/use-block-suggestions.mjs +120 -0
  283. package/build-module/navigation-link/shared/use-block-suggestions.mjs.map +7 -0
  284. package/build-module/navigation-link/shared/use-link-preview.mjs +13 -13
  285. package/build-module/navigation-link/shared/use-link-preview.mjs.map +2 -2
  286. package/build-module/navigation-overlay-close/block.json +7 -0
  287. package/build-module/navigation-submenu/block.json +6 -0
  288. package/build-module/navigation-submenu/edit.mjs +11 -2
  289. package/build-module/navigation-submenu/edit.mjs.map +2 -2
  290. package/build-module/page-list/block.json +14 -0
  291. package/build-module/paragraph/block.json +1 -0
  292. package/build-module/paragraph/edit.mjs +1 -2
  293. package/build-module/paragraph/edit.mjs.map +2 -2
  294. package/build-module/playlist/block.json +1 -0
  295. package/build-module/post-author-biography/block.json +5 -0
  296. package/build-module/post-author-name/block.json +5 -0
  297. package/build-module/post-comments-count/block.json +3 -0
  298. package/build-module/post-comments-form/block.json +15 -0
  299. package/build-module/post-content/block.json +4 -1
  300. package/build-module/post-date/block.json +3 -0
  301. package/build-module/post-excerpt/block.json +9 -0
  302. package/build-module/post-featured-image/block.json +1 -0
  303. package/build-module/post-featured-image/edit.mjs +12 -10
  304. package/build-module/post-featured-image/edit.mjs.map +2 -2
  305. package/build-module/post-navigation-link/block.json +30 -0
  306. package/build-module/post-navigation-link/edit.mjs +17 -3
  307. package/build-module/post-navigation-link/edit.mjs.map +2 -2
  308. package/build-module/post-template/block.json +13 -1
  309. package/build-module/post-terms/block.json +10 -0
  310. package/build-module/post-time-to-read/block.json +10 -0
  311. package/build-module/post-title/block.json +14 -0
  312. package/build-module/preformatted/block.json +11 -0
  313. package/build-module/pullquote/block.json +3 -1
  314. package/build-module/query-no-results/block.json +14 -2
  315. package/build-module/query-pagination/block.json +20 -0
  316. package/build-module/query-pagination-next/block.json +3 -0
  317. package/build-module/query-pagination-numbers/block.json +3 -0
  318. package/build-module/query-pagination-previous/block.json +3 -0
  319. package/build-module/query-title/block.json +3 -0
  320. package/build-module/query-total/block.json +10 -0
  321. package/build-module/quote/block.json +3 -0
  322. package/build-module/read-more/block.json +11 -0
  323. package/build-module/rss/block.json +10 -0
  324. package/build-module/search/block.json +2 -1
  325. package/build-module/site-tagline/block.json +12 -1
  326. package/build-module/site-title/block.json +11 -1
  327. package/build-module/social-links/block.json +4 -0
  328. package/build-module/social-links/edit.mjs +2 -3
  329. package/build-module/social-links/edit.mjs.map +2 -2
  330. package/build-module/tab-list/block.json +4 -0
  331. package/build-module/tab-list/edit.mjs +4 -1
  332. package/build-module/tab-list/edit.mjs.map +2 -2
  333. package/build-module/tab-list/save.mjs +4 -1
  334. package/build-module/tab-list/save.mjs.map +2 -2
  335. package/build-module/tab-panel/block.json +25 -0
  336. package/build-module/tab-panel/controls.mjs +2 -2
  337. package/build-module/tab-panel/controls.mjs.map +2 -2
  338. package/build-module/tab-panels/block.json +21 -1
  339. package/build-module/table-of-contents/block.json +7 -0
  340. package/build-module/tabs/block.json +27 -1
  341. package/build-module/tag-cloud/block.json +19 -0
  342. package/build-module/template-part/edit/selection-modal.mjs.map +1 -1
  343. package/build-module/term-count/block.json +12 -0
  344. package/build-module/term-description/block.json +13 -0
  345. package/build-module/term-name/block.json +16 -1
  346. package/build-module/term-template/block.json +14 -1
  347. package/build-module/utils/search-patterns.mjs +7 -32
  348. package/build-module/utils/search-patterns.mjs.map +2 -2
  349. package/build-module/utils/style-state.mjs +6 -4
  350. package/build-module/utils/style-state.mjs.map +2 -2
  351. package/build-module/utils/waveform-utils.mjs +1 -1
  352. package/build-module/utils/waveform-utils.mjs.map +1 -1
  353. package/build-module/verse/block.json +4 -0
  354. package/build-module/video/block.json +12 -0
  355. package/build-module/video/edit.mjs +32 -15
  356. package/build-module/video/edit.mjs.map +2 -2
  357. package/build-module/video/index.mjs +0 -2
  358. package/build-module/video/index.mjs.map +2 -2
  359. package/build-module/video/save.mjs +7 -2
  360. package/build-module/video/save.mjs.map +2 -2
  361. package/build-style/avatar/editor-rtl.css +4 -0
  362. package/build-style/avatar/editor.css +4 -0
  363. package/build-style/comments-pagination/style-rtl.css +3 -0
  364. package/build-style/comments-pagination/style.css +3 -0
  365. package/build-style/common-rtl.css +32 -1
  366. package/build-style/common.css +35 -2
  367. package/build-style/editor-rtl.css +23 -6
  368. package/build-style/editor.css +23 -6
  369. package/build-style/embed/style-rtl.css +4 -1
  370. package/build-style/embed/style.css +4 -1
  371. package/build-style/gallery/editor-rtl.css +1 -3
  372. package/build-style/gallery/editor.css +1 -3
  373. package/build-style/image/editor-rtl.css +6 -0
  374. package/build-style/image/editor.css +6 -0
  375. package/build-style/image/style-rtl.css +11 -2
  376. package/build-style/image/style.css +11 -2
  377. package/build-style/media-text/style-rtl.css +4 -1
  378. package/build-style/media-text/style.css +4 -1
  379. package/build-style/navigation/style-rtl.css +18 -3
  380. package/build-style/navigation/style.css +18 -3
  381. package/build-style/navigation-link/editor-rtl.css +3 -1
  382. package/build-style/navigation-link/editor.css +3 -1
  383. package/build-style/navigation-overlay-close/style-rtl.css +1 -1
  384. package/build-style/navigation-overlay-close/style.css +1 -1
  385. package/build-style/navigation-submenu/editor-rtl.css +3 -1
  386. package/build-style/navigation-submenu/editor.css +3 -1
  387. package/build-style/post-navigation-link/style-rtl.css +3 -0
  388. package/build-style/post-navigation-link/style.css +3 -0
  389. package/build-style/query-pagination/style-rtl.css +3 -0
  390. package/build-style/query-pagination/style.css +3 -0
  391. package/build-style/style-rtl.css +94 -13
  392. package/build-style/style.css +97 -14
  393. package/build-style/tab-panel/style-rtl.css +2 -0
  394. package/build-style/tab-panel/style.css +2 -0
  395. package/build-style/table/editor-rtl.css +6 -1
  396. package/build-style/table/editor.css +6 -1
  397. package/build-style/table/style-rtl.css +4 -2
  398. package/build-style/table/style.css +4 -2
  399. package/build-style/tag-cloud/style-rtl.css +1 -1
  400. package/build-style/tag-cloud/style.css +1 -1
  401. package/build-style/verse/style-rtl.css +8 -1
  402. package/build-style/verse/style.css +8 -1
  403. package/build-types/gallery/order-controls.d.ts +58 -0
  404. package/build-types/gallery/order-controls.d.ts.map +1 -0
  405. package/build-types/gallery/order-options.d.ts +67 -0
  406. package/build-types/gallery/order-options.d.ts.map +1 -0
  407. package/package.json +46 -44
  408. package/src/accordion/README.md +3 -0
  409. package/src/accordion/block.json +4 -1
  410. package/src/accordion-heading/README.md +1 -0
  411. package/src/accordion-heading/block.json +1 -0
  412. package/src/accordion-item/README.md +5 -0
  413. package/src/accordion-item/block.json +7 -1
  414. package/src/accordion-panel/README.md +7 -0
  415. package/src/accordion-panel/block.json +9 -1
  416. package/src/archives/README.md +6 -0
  417. package/src/archives/block.json +12 -0
  418. package/src/audio/README.md +4 -0
  419. package/src/audio/block.json +8 -0
  420. package/src/audio/edit.jsx +2 -1
  421. package/src/avatar/README.md +2 -0
  422. package/src/avatar/block.json +4 -0
  423. package/src/avatar/edit.jsx +48 -2
  424. package/src/avatar/editor.scss +4 -0
  425. package/src/avatar/index.php +5 -3
  426. package/src/breadcrumbs/README.md +2 -0
  427. package/src/breadcrumbs/block.json +3 -0
  428. package/src/breadcrumbs/edit.jsx +3 -3
  429. package/src/breadcrumbs/index.php +1 -1
  430. package/src/button/README.md +4 -0
  431. package/src/button/block.json +6 -0
  432. package/src/button/edit.jsx +47 -52
  433. package/src/button/index.php +47 -0
  434. package/src/buttons/README.md +8 -0
  435. package/src/buttons/block.json +15 -1
  436. package/src/categories/README.md +6 -0
  437. package/src/categories/block.json +12 -1
  438. package/src/code/README.md +7 -0
  439. package/src/code/block.json +13 -0
  440. package/src/column/README.md +4 -0
  441. package/src/column/block.json +9 -0
  442. package/src/column/edit.jsx +6 -0
  443. package/src/columns/README.md +7 -0
  444. package/src/columns/block.json +13 -0
  445. package/src/columns/edit.jsx +1 -131
  446. package/src/comment-author-name/README.md +2 -0
  447. package/src/comment-author-name/block.json +3 -0
  448. package/src/comment-content/README.md +4 -0
  449. package/src/comment-content/block.json +5 -0
  450. package/src/comment-date/README.md +2 -0
  451. package/src/comment-date/block.json +3 -0
  452. package/src/comment-edit-link/README.md +2 -0
  453. package/src/comment-edit-link/block.json +3 -0
  454. package/src/comment-reply-link/README.md +2 -0
  455. package/src/comment-reply-link/block.json +3 -0
  456. package/src/comments/README.md +5 -0
  457. package/src/comments/block.json +10 -0
  458. package/src/comments/edit/placeholder.jsx +5 -1
  459. package/src/comments-pagination/README.md +6 -0
  460. package/src/comments-pagination/block.json +14 -0
  461. package/src/comments-pagination/style.scss +3 -0
  462. package/src/comments-pagination-next/README.md +2 -0
  463. package/src/comments-pagination-next/block.json +3 -0
  464. package/src/comments-pagination-numbers/README.md +2 -0
  465. package/src/comments-pagination-numbers/block.json +3 -0
  466. package/src/comments-pagination-previous/README.md +2 -0
  467. package/src/comments-pagination-previous/block.json +6 -0
  468. package/src/comments-title/README.md +2 -0
  469. package/src/comments-title/block.json +3 -0
  470. package/src/common.scss +38 -0
  471. package/src/cover/README.md +1 -0
  472. package/src/cover/block.json +2 -1
  473. package/src/cover/edit/index.jsx +41 -6
  474. package/src/cover/edit/inspector-controls.jsx +74 -14
  475. package/src/cover/embed-video-utils.js +18 -10
  476. package/src/cover/index.php +44 -15
  477. package/src/cover/test/edit.browser.test.js +200 -4
  478. package/src/cover/test/embed-video-utils.test.js +48 -0
  479. package/src/cover/view.js +22 -0
  480. package/src/details/README.md +8 -0
  481. package/src/details/block.json +14 -0
  482. package/src/embed/README.md +4 -0
  483. package/src/embed/block.json +6 -1
  484. package/src/embed/style.scss +7 -1
  485. package/src/file/README.md +8 -0
  486. package/src/file/block.json +14 -0
  487. package/src/footnotes/README.md +7 -0
  488. package/src/footnotes/block.json +13 -0
  489. package/src/gallery/README.md +17 -0
  490. package/src/gallery/block.json +22 -0
  491. package/src/gallery/dynamic-gallery.jsx +11 -91
  492. package/src/gallery/edit.jsx +147 -49
  493. package/src/gallery/editor.scss +5 -9
  494. package/src/gallery/order-controls.tsx +143 -0
  495. package/src/gallery/order-images.js +111 -0
  496. package/src/gallery/order-options.ts +75 -0
  497. package/src/gallery/test/edit.jsdom.test.js +87 -10
  498. package/src/gallery/test/order-images.js +162 -0
  499. package/src/gallery/use-dynamic-gallery.js +1 -9
  500. package/src/gallery/use-get-media.js +7 -2
  501. package/src/group/README.md +1 -0
  502. package/src/group/block.json +1 -0
  503. package/src/group/edit.jsx +5 -5
  504. package/src/heading/README.md +8 -0
  505. package/src/heading/block.json +14 -0
  506. package/src/home-link/README.md +11 -0
  507. package/src/home-link/block.json +30 -0
  508. package/src/home-link/edit.jsx +2 -2
  509. package/src/icon/components/custom-inserter/index.jsx +5 -1
  510. package/src/icon/edit.jsx +68 -7
  511. package/src/icon/index.php +10 -1
  512. package/src/image/editor.scss +8 -0
  513. package/src/image/image.jsx +13 -11
  514. package/src/image/index.php +3 -4
  515. package/src/image/style.scss +14 -2
  516. package/src/image/test/use-open-image-media-editor-modal.jsdom.test.js +201 -0
  517. package/src/image/use-open-image-media-editor-modal.js +37 -4
  518. package/src/image/view.js +64 -68
  519. package/src/latest-comments/README.md +8 -0
  520. package/src/latest-comments/block.json +20 -0
  521. package/src/latest-posts/README.md +8 -0
  522. package/src/latest-posts/block.json +14 -0
  523. package/src/list/README.md +6 -0
  524. package/src/list/block.json +12 -1
  525. package/src/list-item/README.md +6 -0
  526. package/src/list-item/block.json +8 -1
  527. package/src/list-item/index.js +5 -0
  528. package/src/loginout/README.md +8 -0
  529. package/src/loginout/block.json +14 -0
  530. package/src/math/README.md +8 -0
  531. package/src/math/block.json +14 -0
  532. package/src/media-text/README.md +18 -0
  533. package/src/media-text/block.json +19 -0
  534. package/src/media-text/style.scss +5 -1
  535. package/src/navigation/edit/index.jsx +2 -4
  536. package/src/navigation/style.scss +40 -4
  537. package/src/navigation/test/use-navigation-menu.jsdom.test.js +1 -1
  538. package/src/navigation-link/README.md +1 -1
  539. package/src/navigation-link/editor.scss +6 -1
  540. package/src/navigation-link/link-ui/index.jsx +60 -27
  541. package/src/navigation-link/link-ui/page-creator.jsx +2 -2
  542. package/src/navigation-link/link-ui/test/get-suggestions-query.jsdom.test.js +67 -0
  543. package/src/navigation-link/shared/controls.jsx +2 -2
  544. package/src/navigation-link/shared/index.js +4 -0
  545. package/src/navigation-link/shared/test/use-block-suggestions.jsdom.test.js +158 -0
  546. package/src/navigation-link/shared/test/use-entity-binding.jsdom.test.js +1 -7
  547. package/src/navigation-link/shared/test/use-link-preview.jsdom.test.js +22 -22
  548. package/src/navigation-link/shared/use-block-suggestions.js +192 -0
  549. package/src/navigation-link/shared/use-link-preview.js +15 -14
  550. package/src/navigation-overlay-close/README.md +1 -0
  551. package/src/navigation-overlay-close/block.json +7 -0
  552. package/src/navigation-overlay-close/style.scss +1 -1
  553. package/src/navigation-submenu/README.md +7 -0
  554. package/src/navigation-submenu/block.json +6 -0
  555. package/src/navigation-submenu/edit.jsx +11 -1
  556. package/src/navigation-submenu/editor.scss +6 -1
  557. package/src/navigation-submenu/index.php +11 -0
  558. package/src/page-list/README.md +8 -0
  559. package/src/page-list/block.json +14 -0
  560. package/src/paragraph/README.md +1 -0
  561. package/src/paragraph/block.json +1 -0
  562. package/src/paragraph/edit.jsx +1 -3
  563. package/src/playlist/README.md +1 -0
  564. package/src/playlist/block.json +1 -0
  565. package/src/playlist/test/edit-component.jsdom.test.jsx +11 -11
  566. package/src/playlist-track/test/edit.jsdom.test.jsx +3 -3
  567. package/src/post-author-biography/README.md +4 -0
  568. package/src/post-author-biography/block.json +5 -0
  569. package/src/post-author-name/README.md +4 -0
  570. package/src/post-author-name/block.json +5 -0
  571. package/src/post-comments-count/README.md +2 -0
  572. package/src/post-comments-count/block.json +3 -0
  573. package/src/post-comments-form/README.md +8 -0
  574. package/src/post-comments-form/block.json +15 -0
  575. package/src/post-content/README.md +3 -0
  576. package/src/post-content/block.json +4 -1
  577. package/src/post-date/README.md +2 -0
  578. package/src/post-date/block.json +3 -0
  579. package/src/post-excerpt/README.md +7 -0
  580. package/src/post-excerpt/block.json +9 -0
  581. package/src/post-featured-image/block.json +1 -0
  582. package/src/post-featured-image/edit.jsx +13 -11
  583. package/src/post-navigation-link/README.md +12 -0
  584. package/src/post-navigation-link/block.json +30 -0
  585. package/src/post-navigation-link/edit.jsx +23 -2
  586. package/src/post-navigation-link/index.php +94 -5
  587. package/src/post-navigation-link/style.scss +2 -0
  588. package/src/post-template/README.md +7 -0
  589. package/src/post-template/block.json +13 -1
  590. package/src/post-terms/README.md +8 -0
  591. package/src/post-terms/block.json +10 -0
  592. package/src/post-time-to-read/README.md +8 -0
  593. package/src/post-time-to-read/block.json +10 -0
  594. package/src/post-title/README.md +8 -0
  595. package/src/post-title/block.json +14 -0
  596. package/src/preformatted/README.md +9 -0
  597. package/src/preformatted/block.json +11 -0
  598. package/src/pullquote/README.md +2 -0
  599. package/src/pullquote/block.json +3 -1
  600. package/src/query-no-results/README.md +10 -0
  601. package/src/query-no-results/block.json +14 -2
  602. package/src/query-pagination/README.md +6 -0
  603. package/src/query-pagination/block.json +20 -0
  604. package/src/query-pagination/style.scss +3 -0
  605. package/src/query-pagination-next/README.md +2 -0
  606. package/src/query-pagination-next/block.json +3 -0
  607. package/src/query-pagination-numbers/README.md +2 -0
  608. package/src/query-pagination-numbers/block.json +3 -0
  609. package/src/query-pagination-previous/README.md +2 -0
  610. package/src/query-pagination-previous/block.json +3 -0
  611. package/src/query-title/README.md +2 -0
  612. package/src/query-title/block.json +3 -0
  613. package/src/query-total/README.md +8 -0
  614. package/src/query-total/block.json +10 -0
  615. package/src/quote/README.md +3 -0
  616. package/src/quote/block.json +3 -0
  617. package/src/read-more/README.md +8 -0
  618. package/src/read-more/block.json +11 -0
  619. package/src/rss/README.md +8 -0
  620. package/src/rss/block.json +10 -0
  621. package/src/search/README.md +1 -0
  622. package/src/search/block.json +2 -1
  623. package/src/site-tagline/README.md +9 -0
  624. package/src/site-tagline/block.json +12 -1
  625. package/src/site-title/README.md +8 -0
  626. package/src/site-title/block.json +11 -1
  627. package/src/social-links/README.md +3 -0
  628. package/src/social-links/block.json +4 -0
  629. package/src/social-links/edit.jsx +2 -3
  630. package/src/tab-list/README.md +2 -0
  631. package/src/tab-list/block.json +4 -0
  632. package/src/tab-list/edit.jsx +3 -0
  633. package/src/tab-list/save.jsx +3 -0
  634. package/src/tab-panel/README.md +9 -0
  635. package/src/tab-panel/block.json +25 -0
  636. package/src/tab-panel/controls.jsx +2 -2
  637. package/src/tab-panel/style.scss +5 -2
  638. package/src/tab-panels/README.md +9 -0
  639. package/src/tab-panels/block.json +21 -1
  640. package/src/table/editor.scss +8 -2
  641. package/src/table/style.scss +4 -4
  642. package/src/table-of-contents/README.md +6 -0
  643. package/src/table-of-contents/block.json +7 -0
  644. package/src/tabs/README.md +11 -0
  645. package/src/tabs/block.json +27 -1
  646. package/src/tag-cloud/README.md +9 -0
  647. package/src/tag-cloud/block.json +19 -0
  648. package/src/tag-cloud/style.scss +1 -1
  649. package/src/template-part/edit/selection-modal.jsx +1 -1
  650. package/src/template-part/index.php +16 -3
  651. package/src/term-count/README.md +10 -0
  652. package/src/term-count/block.json +12 -0
  653. package/src/term-description/README.md +8 -0
  654. package/src/term-description/block.json +13 -0
  655. package/src/term-name/README.md +9 -0
  656. package/src/term-name/block.json +16 -1
  657. package/src/term-name/index.php +1 -1
  658. package/src/term-template/README.md +8 -0
  659. package/src/term-template/block.json +14 -1
  660. package/src/utils/search-patterns.js +9 -53
  661. package/src/utils/style-state.js +6 -4
  662. package/src/utils/test/{search-patterns.js → search-patterns.jsdom.test.js} +1 -22
  663. package/src/utils/test/waveform-player-auto-init.jsdom.test.js +25 -0
  664. package/src/utils/test/waveform-player-dependency.jsdom.test.js +7 -60
  665. package/src/utils/test/waveform-utils.browser.test.js +3 -15
  666. package/src/utils/waveform-utils.js +1 -1
  667. package/src/verse/README.md +4 -0
  668. package/src/verse/block.json +4 -0
  669. package/src/verse/style.scss +11 -2
  670. package/src/video/README.md +11 -0
  671. package/src/video/block.json +12 -0
  672. package/src/video/edit.jsx +65 -49
  673. package/src/video/index.js +0 -2
  674. package/src/video/save.jsx +10 -1
  675. package/build/columns/utils.cjs +0 -112
  676. package/build/columns/utils.cjs.map +0 -7
  677. package/build/video/variations.cjs +0 -75
  678. package/build/video/variations.cjs.map +0 -7
  679. package/build-module/columns/utils.mjs +0 -78
  680. package/build-module/columns/utils.mjs.map +0 -7
  681. package/build-module/video/variations.mjs +0 -50
  682. package/build-module/video/variations.mjs.map +0 -7
  683. package/src/columns/test/utils.js +0 -331
  684. package/src/columns/utils.js +0 -176
  685. package/src/video/test/variations.js +0 -63
  686. package/src/video/variations.js +0 -62
@@ -0,0 +1,67 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { getSuggestionsQuery } from '..';
3
+
4
+ const PER_PAGE = 20;
5
+
6
+ const LINK_TYPES = [
7
+ [ 'page', 'post-type', { type: 'post', subtype: 'page' } ],
8
+ [ 'post', 'post-type', { type: 'post', subtype: 'post' } ],
9
+ [ 'category', 'taxonomy', { type: 'term', subtype: 'category' } ],
10
+ [ 'tag', 'taxonomy', { type: 'term', subtype: 'post_tag' } ],
11
+ [ 'post_format', 'taxonomy', { type: 'post-format' } ],
12
+ [ 'event', 'post-type', { type: 'post', subtype: 'event' } ],
13
+ [ 'genre', 'taxonomy', { type: 'term', subtype: 'genre' } ],
14
+ ];
15
+
16
+ describe( 'getSuggestionsQuery', () => {
17
+ // A typed search is unscoped: naming no type leaves every endpoint to
18
+ // answer it, which is what lets a category be found from a page link.
19
+ it.each( LINK_TYPES )(
20
+ 'searches every entity type from a %s link',
21
+ ( type, kind ) => {
22
+ const query = getSuggestionsQuery( type, kind );
23
+
24
+ expect( query.type ).toBeUndefined();
25
+ expect( query.subtype ).toBeUndefined();
26
+ }
27
+ );
28
+
29
+ // Searching everything only helps if the link's own kind leads, so the
30
+ // block names it rather than narrowing to it.
31
+ it.each( LINK_TYPES )(
32
+ 'ranks the %s link’s own type above the usual order',
33
+ ( type, kind, expected ) => {
34
+ expect( getSuggestionsQuery( type, kind ).preferTypes ).toEqual( [
35
+ expected.subtype ? expected : expected.type,
36
+ ] );
37
+ }
38
+ );
39
+
40
+ // Before anything is typed there is nothing to rank, so the preview is
41
+ // narrowed to the link's own type instead.
42
+ it.each( LINK_TYPES )(
43
+ 'suggests the %s link’s own type before anything is typed',
44
+ ( type, kind, expected ) => {
45
+ expect(
46
+ getSuggestionsQuery( type, kind )
47
+ .initialSuggestionsSearchOptions
48
+ ).toEqual( { ...expected, perPage: PER_PAGE } );
49
+ }
50
+ );
51
+
52
+ // A custom link points at a URL, and a link just inserted has no type at
53
+ // all, so neither has a kind of its own to preview. Pages are the most
54
+ // likely thing to link to.
55
+ it.each( [
56
+ [ 'a custom link', 'custom', 'custom' ],
57
+ [ 'a link with no type', undefined, undefined ],
58
+ ] )(
59
+ 'suggests pages before anything is typed for %s',
60
+ ( _label, type, kind ) => {
61
+ expect(
62
+ getSuggestionsQuery( type, kind )
63
+ .initialSuggestionsSearchOptions
64
+ ).toEqual( { type: 'post', subtype: 'page', perPage: PER_PAGE } );
65
+ }
66
+ );
67
+ } );
@@ -2,7 +2,7 @@ import {
2
2
  Button,
3
3
  __experimentalToolsPanel as ToolsPanel,
4
4
  __experimentalToolsPanelItem as ToolsPanelItem,
5
- CheckboxControl,
5
+ CheckboxControl as WCCheckboxControl,
6
6
  TextControl,
7
7
  TextareaControl as WCTextareaControl,
8
8
  } from '@wordpress/components';
@@ -214,7 +214,7 @@ export function Controls( {
214
214
  }
215
215
  isShownByDefault
216
216
  >
217
- <CheckboxControl
217
+ <WCCheckboxControl
218
218
  label={ __( 'Open in new tab' ) }
219
219
  checked={ opensInNewTab }
220
220
  onChange={ ( value ) =>
@@ -19,3 +19,7 @@ export { useEnableLinkStatusValidation } from './use-enable-link-status-validati
19
19
  export { useIsDraggingWithin } from './use-is-dragging-within';
20
20
  export { selectLabelText } from './select-label-text';
21
21
  export { useLinkPreview } from './use-link-preview';
22
+ export {
23
+ isBlockSuggestion,
24
+ useBlockSuggestions,
25
+ } from './use-block-suggestions';
@@ -0,0 +1,158 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { BlockIcon } from '@wordpress/block-editor';
3
+ import {
4
+ addBlockSuggestions,
5
+ BLOCK_SUGGESTION_TYPE,
6
+ isBlockSuggestion,
7
+ } from '../use-block-suggestions';
8
+
9
+ const homeLink = {
10
+ id: 'core/home-link',
11
+ name: 'core/home-link',
12
+ title: 'Home Link',
13
+ icon: { src: 'home' },
14
+ };
15
+ const pageList = {
16
+ id: 'core/page-list',
17
+ name: 'core/page-list',
18
+ title: 'Page List',
19
+ icon: { src: 'list' },
20
+ keywords: [ 'menu', 'navigation' ],
21
+ };
22
+ const pageLinkVariation = {
23
+ id: 'core/navigation-link/page',
24
+ name: 'core/navigation-link',
25
+ title: 'Page Link',
26
+ icon: { src: 'page' },
27
+ };
28
+ const homePage = {
29
+ id: 1,
30
+ title: 'Home Office',
31
+ type: 'page',
32
+ kind: 'post-type',
33
+ url: '/home-office',
34
+ };
35
+ const menuPage = {
36
+ id: 2,
37
+ title: 'Menu',
38
+ type: 'page',
39
+ kind: 'post-type',
40
+ url: '/menu',
41
+ };
42
+
43
+ describe( 'addBlockSuggestions', () => {
44
+ it( 'describes a block as a suggestion that is not a link', () => {
45
+ const [ suggestion ] = addBlockSuggestions( [], [ homeLink ], 'Home' );
46
+
47
+ expect( suggestion ).toEqual( {
48
+ id: 'core/home-link',
49
+ blockItemId: 'core/home-link',
50
+ type: BLOCK_SUGGESTION_TYPE,
51
+ title: 'Home Link',
52
+ icon: expect.anything(),
53
+ typeLabel: 'Block',
54
+ } );
55
+ } );
56
+
57
+ // LinkControl renders an icon it is given as is, so the block's icon
58
+ // object is turned into an element here, where blocks are known about.
59
+ it( 'renders the block icon the way the inserter does', () => {
60
+ const [ suggestion ] = addBlockSuggestions( [], [ homeLink ], 'Home' );
61
+
62
+ expect( suggestion.icon.type ).toBe( BlockIcon );
63
+ expect( suggestion.icon.props.icon ).toBe( homeLink.icon );
64
+ } );
65
+
66
+ it( 'puts a block whose title starts with the search before the links', () => {
67
+ const suggestions = addBlockSuggestions(
68
+ [ homePage ],
69
+ [ homeLink ],
70
+ 'home'
71
+ );
72
+
73
+ expect( suggestions.map( ( { title } ) => title ) ).toEqual( [
74
+ 'Home Link',
75
+ 'Home Office',
76
+ ] );
77
+ } );
78
+
79
+ it( 'puts a block that matches any other way after the links', () => {
80
+ // Page List matches "menu" by keyword, not by title.
81
+ const suggestions = addBlockSuggestions(
82
+ [ menuPage ],
83
+ [ pageList ],
84
+ 'menu'
85
+ );
86
+
87
+ expect( suggestions.map( ( { title } ) => title ) ).toEqual( [
88
+ 'Menu',
89
+ 'Page List',
90
+ ] );
91
+ } );
92
+
93
+ it( 'leaves out the link variations, which the links already cover', () => {
94
+ const suggestions = addBlockSuggestions(
95
+ [],
96
+ [ pageLinkVariation ],
97
+ 'page'
98
+ );
99
+
100
+ expect( suggestions ).toEqual( [] );
101
+ } );
102
+
103
+ it( 'leaves out blocks that cannot be inserted', () => {
104
+ const suggestions = addBlockSuggestions(
105
+ [],
106
+ [ { ...homeLink, isDisabled: true } ],
107
+ 'home'
108
+ );
109
+
110
+ expect( suggestions ).toEqual( [] );
111
+ } );
112
+
113
+ it( 'adds every block that matches', () => {
114
+ const items = Array.from( { length: 5 }, ( _, index ) => ( {
115
+ id: `test/home-${ index }`,
116
+ name: `test/home-${ index }`,
117
+ title: `Home ${ index }`,
118
+ } ) );
119
+
120
+ expect( addBlockSuggestions( [], items, 'home' ) ).toHaveLength( 5 );
121
+ } );
122
+
123
+ it( 'returns the links unchanged when no block matches', () => {
124
+ const suggestions = [ homePage ];
125
+
126
+ expect(
127
+ addBlockSuggestions( suggestions, [ homeLink ], 'office' )
128
+ ).toBe( suggestions );
129
+ } );
130
+
131
+ it( 'returns the links unchanged when nothing is searched', () => {
132
+ const suggestions = [ homePage ];
133
+
134
+ expect( addBlockSuggestions( suggestions, [ homeLink ], '' ) ).toBe(
135
+ suggestions
136
+ );
137
+ } );
138
+
139
+ // A site can register a post type called "block", whose results arrive
140
+ // with that type, so a block is recognized by something only it carries.
141
+ it( 'tells a block apart from a post of a type called "block"', () => {
142
+ const [ blockSuggestion ] = addBlockSuggestions(
143
+ [],
144
+ [ homeLink ],
145
+ 'Home'
146
+ );
147
+ const postOfTypeBlock = {
148
+ id: 12,
149
+ title: 'Home',
150
+ type: 'block',
151
+ kind: 'post-type',
152
+ url: '/block/home',
153
+ };
154
+
155
+ expect( isBlockSuggestion( blockSuggestion ) ).toBe( true );
156
+ expect( isBlockSuggestion( postOfTypeBlock ) ).toBe( false );
157
+ } );
158
+ } );
@@ -326,10 +326,6 @@ describe( 'useEntityBinding', () => {
326
326
  } );
327
327
 
328
328
  it( 'handles invalid kind gracefully in createBinding', () => {
329
- const consoleSpy = vi
330
- .spyOn( console, 'warn' )
331
- .mockImplementation( () => {} );
332
-
333
329
  const attributes = {
334
330
  metadata: {},
335
331
  id: null,
@@ -347,15 +343,13 @@ describe( 'useEntityBinding', () => {
347
343
  result.current.createBinding();
348
344
  } );
349
345
 
350
- expect( consoleSpy ).toHaveBeenCalledWith(
346
+ expect( console ).toHaveWarnedWith(
351
347
  'Failed to create entity binding:',
352
348
  expect.stringContaining( 'Invalid kind "invalid-kind"' )
353
349
  );
354
350
 
355
351
  // Should not call updateBlockBindings when validation fails
356
352
  expect( mockUpdateBlockBindings ).not.toHaveBeenCalled();
357
-
358
- consoleSpy.mockRestore();
359
353
  } );
360
354
  } );
361
355
  } );
@@ -208,7 +208,7 @@ describe( 'computeBadges', () => {
208
208
 
209
209
  expect( badges ).toContainEqual( {
210
210
  label: 'External link',
211
- intent: 'default',
211
+ intent: 'none',
212
212
  } );
213
213
  } );
214
214
 
@@ -221,7 +221,7 @@ describe( 'computeBadges', () => {
221
221
 
222
222
  expect( badges ).toContainEqual( {
223
223
  label: 'Page',
224
- intent: 'default',
224
+ intent: 'none',
225
225
  } );
226
226
  } );
227
227
 
@@ -233,7 +233,7 @@ describe( 'computeBadges', () => {
233
233
 
234
234
  expect( badges ).toContainEqual( {
235
235
  label: 'Internal link',
236
- intent: 'default',
236
+ intent: 'none',
237
237
  } );
238
238
  } );
239
239
 
@@ -245,7 +245,7 @@ describe( 'computeBadges', () => {
245
245
 
246
246
  expect( badges ).toContainEqual( {
247
247
  label: 'Homepage',
248
- intent: 'default',
248
+ intent: 'none',
249
249
  } );
250
250
  } );
251
251
 
@@ -262,7 +262,7 @@ describe( 'computeBadges', () => {
262
262
  } );
263
263
  expect( badges ).toContainEqual( {
264
264
  label: 'Homepage',
265
- intent: 'default',
265
+ intent: 'none',
266
266
  } );
267
267
  } );
268
268
 
@@ -276,7 +276,7 @@ describe( 'computeBadges', () => {
276
276
  } );
277
277
  expect( badges ).not.toContainEqual( {
278
278
  label: 'Homepage',
279
- intent: 'default',
279
+ intent: 'none',
280
280
  } );
281
281
  }
282
282
  );
@@ -293,7 +293,7 @@ describe( 'computeBadges', () => {
293
293
  } );
294
294
  expect( badges ).toContainEqual( {
295
295
  label: 'Homepage',
296
- intent: 'default',
296
+ intent: 'none',
297
297
  } );
298
298
  }
299
299
  );
@@ -306,7 +306,7 @@ describe( 'computeBadges', () => {
306
306
 
307
307
  expect( badges ).toContainEqual( {
308
308
  label: 'Page',
309
- intent: 'default',
309
+ intent: 'none',
310
310
  } );
311
311
  } );
312
312
  } );
@@ -319,7 +319,7 @@ describe( 'computeBadges', () => {
319
319
 
320
320
  expect( badges ).toContainEqual( {
321
321
  label: 'No link selected',
322
- intent: 'error',
322
+ intent: 'high',
323
323
  } );
324
324
  } );
325
325
 
@@ -333,7 +333,7 @@ describe( 'computeBadges', () => {
333
333
 
334
334
  expect( badges ).toContainEqual( {
335
335
  label: 'Missing page',
336
- intent: 'error',
336
+ intent: 'high',
337
337
  } );
338
338
  } );
339
339
 
@@ -346,7 +346,7 @@ describe( 'computeBadges', () => {
346
346
 
347
347
  expect( badges ).toContainEqual( {
348
348
  label: 'Published',
349
- intent: 'success',
349
+ intent: 'stable',
350
350
  } );
351
351
  } );
352
352
 
@@ -359,7 +359,7 @@ describe( 'computeBadges', () => {
359
359
 
360
360
  expect( badges ).toContainEqual( {
361
361
  label: 'Draft',
362
- intent: 'warning',
362
+ intent: 'low',
363
363
  } );
364
364
  } );
365
365
  } );
@@ -375,12 +375,12 @@ it( 'should show "Internal link" badge for hash links even when type is present'
375
375
  // Should prioritize hash link detection over type
376
376
  expect( badges ).toContainEqual( {
377
377
  label: 'Internal link',
378
- intent: 'default',
378
+ intent: 'none',
379
379
  } );
380
380
  // Should NOT show Page badge
381
381
  expect( badges ).not.toContainEqual( {
382
382
  label: 'Page',
383
- intent: 'default',
383
+ intent: 'none',
384
384
  } );
385
385
  } );
386
386
 
@@ -394,12 +394,12 @@ it( 'should show "Homepage" badge for root path even when type is present', () =
394
394
  // Should prioritize homepage detection over type
395
395
  expect( badges ).toContainEqual( {
396
396
  label: 'Homepage',
397
- intent: 'default',
397
+ intent: 'none',
398
398
  } );
399
399
  // Should NOT show Page badge
400
400
  expect( badges ).not.toContainEqual( {
401
401
  label: 'Page',
402
- intent: 'default',
402
+ intent: 'none',
403
403
  } );
404
404
  } );
405
405
 
@@ -420,12 +420,12 @@ test.each( [
420
420
  // Should prioritize external link detection over type
421
421
  expect( badges ).toContainEqual( {
422
422
  label: 'External link',
423
- intent: 'default',
423
+ intent: 'none',
424
424
  } );
425
425
  // Should NOT show Page badge
426
426
  expect( badges ).not.toContainEqual( {
427
427
  label: 'Page',
428
- intent: 'default',
428
+ intent: 'none',
429
429
  } );
430
430
  }
431
431
  );
@@ -440,12 +440,12 @@ it( 'should show "Page" badge for internal custom links', () => {
440
440
  // Should show Page badge for internal custom links
441
441
  expect( badges ).toContainEqual( {
442
442
  label: 'Page',
443
- intent: 'default',
443
+ intent: 'none',
444
444
  } );
445
445
  // Should NOT show Custom badge
446
446
  expect( badges ).not.toContainEqual( {
447
447
  label: 'Custom',
448
- intent: 'default',
448
+ intent: 'none',
449
449
  } );
450
450
  } );
451
451
 
@@ -644,7 +644,7 @@ describe( 'useLinkPreview', () => {
644
644
 
645
645
  expect( result.current.badges ).toContainEqual( {
646
646
  label: 'No link selected',
647
- intent: 'error',
647
+ intent: 'high',
648
648
  } );
649
649
  } );
650
650
 
@@ -676,7 +676,7 @@ describe( 'useLinkPreview', () => {
676
676
 
677
677
  expect( result.current.badges ).toContainEqual( {
678
678
  label: 'Missing page',
679
- intent: 'error',
679
+ intent: 'high',
680
680
  } );
681
681
  } );
682
682
 
@@ -0,0 +1,192 @@
1
+ import { __, sprintf } from '@wordpress/i18n';
2
+ import { speak } from '@wordpress/a11y';
3
+ import { createElement, useCallback } from '@wordpress/element';
4
+ import { useDispatch, useSelect } from '@wordpress/data';
5
+ import {
6
+ createBlock,
7
+ createBlocksFromInnerBlocksTemplate,
8
+ } from '@wordpress/blocks';
9
+ import {
10
+ BlockIcon,
11
+ store as blockEditorStore,
12
+ privateApis as blockEditorPrivateApis,
13
+ } from '@wordpress/block-editor';
14
+ import { unlock } from '../../lock-unlock';
15
+
16
+ const { searchItems, normalizeString } = unlock( blockEditorPrivateApis );
17
+
18
+ /**
19
+ * The `type` of a suggestion that inserts a block rather than setting a link.
20
+ */
21
+ export const BLOCK_SUGGESTION_TYPE = 'block';
22
+
23
+ /**
24
+ * Whether a suggestion inserts a block rather than setting a link.
25
+ *
26
+ * The `type` alone is not enough: a site can register a post type called
27
+ * "block", whose results arrive with that type. Only a block suggestion
28
+ * carries the inserter item it was made from.
29
+ *
30
+ * @param {Object} suggestion A link suggestion.
31
+ * @return {boolean} Whether it is a block suggestion.
32
+ */
33
+ export function isBlockSuggestion( suggestion ) {
34
+ return (
35
+ suggestion?.type === BLOCK_SUGGESTION_TYPE &&
36
+ typeof suggestion.blockItemId === 'string'
37
+ );
38
+ }
39
+
40
+ /**
41
+ * The link variations are left out: searching already finds the pages, posts
42
+ * and terms they would link to.
43
+ */
44
+ const EXCLUDED_BLOCK_NAMES = [ 'core/navigation-link' ];
45
+
46
+ // Match on what a block is called, not on its description or category, which
47
+ // would list blocks for words that only happen to describe them.
48
+ const SEARCH_FIELDS = [
49
+ { get: ( item ) => item.title },
50
+ { get: ( item ) => item.keywords },
51
+ ];
52
+
53
+ /**
54
+ * Adds the blocks that match a search to the link suggestions.
55
+ *
56
+ * A block whose title starts with the search is what was asked for by name,
57
+ * so it goes before the links. Any other matching block goes after them.
58
+ *
59
+ * @param {Array} suggestions Link suggestions.
60
+ * @param {Array} blockItems Inserter items the Navigation allows.
61
+ * @param {string} searchTerm What the user typed.
62
+ * @return {Array} The suggestions, with any matching blocks added.
63
+ */
64
+ export function addBlockSuggestions( suggestions, blockItems, searchTerm ) {
65
+ if ( ! searchTerm?.trim() ) {
66
+ return suggestions;
67
+ }
68
+
69
+ const matches = searchItems( blockItems, searchTerm, {
70
+ fields: SEARCH_FIELDS,
71
+ filter: ( item ) =>
72
+ ! item.isDisabled && ! EXCLUDED_BLOCK_NAMES.includes( item.name ),
73
+ } );
74
+
75
+ if ( ! matches.length ) {
76
+ return suggestions;
77
+ }
78
+
79
+ const search = normalizeString( searchTerm.trim() );
80
+ const before = [];
81
+ const after = [];
82
+
83
+ for ( const item of matches ) {
84
+ const suggestion = {
85
+ id: item.id,
86
+ blockItemId: item.id,
87
+ type: BLOCK_SUGGESTION_TYPE,
88
+ title: item.title,
89
+ icon: createElement( BlockIcon, { icon: item.icon } ),
90
+ typeLabel: __( 'Block' ),
91
+ };
92
+
93
+ if ( normalizeString( item.title ).startsWith( search ) ) {
94
+ before.push( suggestion );
95
+ } else {
96
+ after.push( suggestion );
97
+ }
98
+ }
99
+
100
+ return [ ...before, ...suggestions, ...after ];
101
+ }
102
+
103
+ /**
104
+ * Lists the blocks a Navigation allows in a link's search results, and
105
+ * inserts the one that is chosen.
106
+ *
107
+ * The allowed blocks are read when a search runs, not subscribed to, so an
108
+ * open link UI does no work as the editor changes.
109
+ *
110
+ * @param {Object} options Hook options.
111
+ * @param {string} options.clientId Client ID of the link or submenu.
112
+ * @param {boolean} options.isEnabled Whether to list blocks at all.
113
+ * @param {Function=} options.onBlockInsert Called with the inserted block by a
114
+ * caller that tracks the new link,
115
+ * such as the list view.
116
+ * @param {Function=} options.onClose Closes the link UI.
117
+ * @return {{ transformSuggestions: Function|undefined, insertBlockFromSuggestion: Function }}
118
+ * The `transformSuggestions` to give LinkControl, and the handler for a chosen
119
+ * block suggestion.
120
+ */
121
+ export function useBlockSuggestions( {
122
+ clientId,
123
+ isEnabled,
124
+ onBlockInsert,
125
+ onClose,
126
+ } ) {
127
+ const {
128
+ getBlockIndex,
129
+ getBlockOrder,
130
+ getBlockRootClientId,
131
+ getInserterItems,
132
+ } = useSelect( blockEditorStore );
133
+ const { insertBlock, replaceBlock } = useDispatch( blockEditorStore );
134
+
135
+ const transformSuggestions = useCallback(
136
+ ( suggestions, { isInitialSuggestions, searchTerm } ) =>
137
+ isInitialSuggestions
138
+ ? suggestions
139
+ : addBlockSuggestions(
140
+ suggestions,
141
+ getInserterItems( getBlockRootClientId( clientId ) ),
142
+ searchTerm
143
+ ),
144
+ [ clientId, getBlockRootClientId, getInserterItems ]
145
+ );
146
+
147
+ const insertBlockFromSuggestion = ( itemId ) => {
148
+ const rootClientId = getBlockRootClientId( clientId );
149
+ const item = getInserterItems( rootClientId ).find(
150
+ ( { id } ) => id === itemId
151
+ );
152
+
153
+ if ( ! item ) {
154
+ return;
155
+ }
156
+
157
+ const block = createBlock(
158
+ item.name,
159
+ item.initialAttributes,
160
+ createBlocksFromInnerBlocksTemplate( item.innerBlocks )
161
+ );
162
+ const index = getBlockIndex( clientId );
163
+
164
+ if ( onBlockInsert ) {
165
+ // A caller that tracks the new link, such as the list view, removes
166
+ // it itself once told about the block, as with the "Add block" pane.
167
+ insertBlock( block, index, rootClientId, false );
168
+ onBlockInsert( block );
169
+ } else if ( getBlockOrder( clientId ).length ) {
170
+ // A submenu keeps its items, so the block goes before it, where the
171
+ // "Add block" pane puts it.
172
+ insertBlock( block, index, rootClientId );
173
+ onClose?.();
174
+ } else {
175
+ // An empty link is replaced by the block.
176
+ replaceBlock( clientId, block );
177
+ }
178
+
179
+ speak(
180
+ sprintf(
181
+ /* translators: %s: The title of the block that was added. */
182
+ __( '%s block added.' ),
183
+ item.title
184
+ )
185
+ );
186
+ };
187
+
188
+ return {
189
+ transformSuggestions: isEnabled ? transformSuggestions : undefined,
190
+ insertBlockFromSuggestion,
191
+ };
192
+ }