@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
@@ -318,6 +318,7 @@ describe( 'useOpenImageMediaEditorModal', () => {
318
318
  expect( openMediaEditorModal ).toHaveBeenCalledWith( {
319
319
  id: 1,
320
320
  onUpdate: expect.any( Function ),
321
+ onUndo: expect.any( Function ),
321
322
  onClose: undefined,
322
323
  } );
323
324
  expect( setAttributes ).toHaveBeenCalledWith( {
@@ -360,6 +361,7 @@ describe( 'useOpenImageMediaEditorModal', () => {
360
361
  expect( openMediaEditorModal ).toHaveBeenCalledWith( {
361
362
  id: 1,
362
363
  onUpdate: expect.any( Function ),
364
+ onUndo: expect.any( Function ),
363
365
  onClose: undefined,
364
366
  } );
365
367
  expect( setAttributes ).toHaveBeenCalledWith( {
@@ -623,6 +625,85 @@ describe( 'useOpenImageMediaEditorModal', () => {
623
625
  } );
624
626
  } );
625
627
 
628
+ it( 'does not restore overwritten metadata when a later session saves back to the previous attachment', async () => {
629
+ const originalAttachment = {
630
+ id: 1,
631
+ alt_text: 'Original alt',
632
+ caption: { raw: 'Original caption' },
633
+ };
634
+ const croppedAttachment = {
635
+ id: 2,
636
+ alt_text: 'Updated alt',
637
+ caption: { raw: 'Updated caption' },
638
+ };
639
+ const registry = createRegistry( {
640
+ getEditedEntityRecord: ( kind, name, attachmentId ) =>
641
+ attachmentId === 1 ? originalAttachment : croppedAttachment,
642
+ resolveGetEntityRecord: ( kind, name, attachmentId ) =>
643
+ attachmentId === 2
644
+ ? croppedAttachment
645
+ : {
646
+ ...originalAttachment,
647
+ alt_text: 'Server alt',
648
+ caption: { raw: 'Server caption' },
649
+ },
650
+ } );
651
+ useRegistry.mockReturnValue( registry );
652
+ const setAttributes = vi.fn();
653
+ const openMediaEditorModal = vi.fn();
654
+ mockMediaEditorModalSetting( openMediaEditorModal );
655
+ const { result, rerender } = renderHook(
656
+ ( { attributes } ) =>
657
+ useOpenImageMediaEditorModal( { attributes, setAttributes } ),
658
+ {
659
+ initialProps: {
660
+ attributes: {
661
+ id: 1,
662
+ url: 'original.jpg',
663
+ alt: 'Original alt',
664
+ caption: 'Original caption',
665
+ },
666
+ },
667
+ }
668
+ );
669
+
670
+ await act( async () => {
671
+ await result.current();
672
+ } );
673
+ await act( async () => {
674
+ await openMediaEditorModal.mock.calls[ 0 ][ 0 ].onUpdate( {
675
+ id: 2,
676
+ url: 'cropped.jpg',
677
+ } );
678
+ } );
679
+ rerender( {
680
+ attributes: {
681
+ id: 2,
682
+ url: 'cropped.jpg',
683
+ alt: 'Updated alt',
684
+ caption: 'Updated caption',
685
+ },
686
+ } );
687
+ // Opening the modal again starts a new session, so a save in it that
688
+ // happens to return the block to attachment 1 is not the Undo.
689
+ await act( async () => {
690
+ await result.current();
691
+ } );
692
+ await act( async () => {
693
+ await openMediaEditorModal.mock.calls[ 1 ][ 0 ].onUpdate( {
694
+ id: 1,
695
+ url: 'original.jpg',
696
+ } );
697
+ } );
698
+
699
+ expect( setAttributes ).toHaveBeenLastCalledWith( {
700
+ id: 1,
701
+ url: 'original.jpg',
702
+ alt: 'Server alt',
703
+ caption: 'Server caption',
704
+ } );
705
+ } );
706
+
626
707
  it( 'resolves fresh metadata when the new attachment id has an incomplete cached record', async () => {
627
708
  const originalAttachment = {
628
709
  id: 1,
@@ -866,6 +947,126 @@ describe( 'useOpenImageMediaEditorModal', () => {
866
947
  } );
867
948
  } );
868
949
 
950
+ describe( 'media editor Undo', () => {
951
+ it( 'restores the block metadata, selected image size, and link after restoring an original image', async () => {
952
+ const { setAttributes, openMediaEditorModal } = await runModalUpdate( {
953
+ attributes: {
954
+ id: 2,
955
+ url: 'crop-medium.jpg',
956
+ alt: 'Close-up',
957
+ caption: 'Cropped caption',
958
+ sizeSlug: 'medium',
959
+ linkDestination: 'media',
960
+ href: 'crop.jpg',
961
+ },
962
+ registryOptions: {
963
+ getEditedEntityRecord: () => ( {
964
+ id: 2,
965
+ alt_text: 'Close-up',
966
+ caption: { raw: 'Cropped caption' },
967
+ } ),
968
+ resolveGetEntityRecord: () => ( {
969
+ id: 1,
970
+ source_url: 'original.jpg',
971
+ alt_text: 'Full scene',
972
+ caption: { raw: 'Original caption' },
973
+ media_details: {
974
+ sizes: { full: { source_url: 'original.jpg' } },
975
+ },
976
+ } ),
977
+ },
978
+ updatePayload: { id: 1, url: 'original.jpg' },
979
+ } );
980
+ expect( setAttributes ).toHaveBeenLastCalledWith( {
981
+ id: 1,
982
+ url: 'original.jpg',
983
+ alt: 'Full scene',
984
+ caption: 'Original caption',
985
+ sizeSlug: 'full',
986
+ href: 'original.jpg',
987
+ } );
988
+
989
+ act( () => openMediaEditorModal.mock.calls[ 0 ][ 0 ].onUndo() );
990
+
991
+ expect( setAttributes ).toHaveBeenLastCalledWith( {
992
+ id: 2,
993
+ url: 'crop-medium.jpg',
994
+ alt: 'Close-up',
995
+ caption: 'Cropped caption',
996
+ sizeSlug: 'medium',
997
+ href: 'crop.jpg',
998
+ } );
999
+ } );
1000
+
1001
+ it( 'leaves custom metadata and unrelated block edits out of Undo', async () => {
1002
+ const { setAttributes, openMediaEditorModal } = await runModalUpdate( {
1003
+ attributes: {
1004
+ id: 1,
1005
+ url: 'original.jpg',
1006
+ alt: 'Custom alt',
1007
+ caption: 'Custom caption',
1008
+ width: '300px',
1009
+ linkDestination: 'custom',
1010
+ href: 'https://example.com/custom',
1011
+ },
1012
+ registryOptions: croppedAttachmentRecords(),
1013
+ updatePayload: CROP_UPDATE,
1014
+ } );
1015
+
1016
+ act( () => openMediaEditorModal.mock.calls[ 0 ][ 0 ].onUndo() );
1017
+
1018
+ expect( setAttributes ).toHaveBeenLastCalledWith( {
1019
+ id: 1,
1020
+ url: 'original.jpg',
1021
+ } );
1022
+ } );
1023
+
1024
+ it( 'keeps the previous image when Undo runs before metadata finishes loading', async () => {
1025
+ const pendingAttachment = createDeferred();
1026
+ useRegistry.mockReturnValue(
1027
+ createRegistry( {
1028
+ getEditedEntityRecord: () => ORIGINAL_ATTACHMENT,
1029
+ resolveGetEntityRecord: () => pendingAttachment.promise,
1030
+ } )
1031
+ );
1032
+ const setAttributes = vi.fn();
1033
+ const onUrlChange = vi.fn();
1034
+ const openMediaEditorModal = vi.fn();
1035
+ mockMediaEditorModalSetting( openMediaEditorModal );
1036
+ const { result } = renderHook( () =>
1037
+ useOpenImageMediaEditorModal( {
1038
+ attributes: {
1039
+ id: 1,
1040
+ url: 'original-medium.jpg',
1041
+ alt: '',
1042
+ caption: '',
1043
+ },
1044
+ setAttributes,
1045
+ onUrlChange,
1046
+ } )
1047
+ );
1048
+ await act( () => result.current() );
1049
+ const { onUpdate, onUndo } = openMediaEditorModal.mock.calls[ 0 ][ 0 ];
1050
+ let updatePromise;
1051
+ act( () => {
1052
+ updatePromise = onUpdate( CROP_UPDATE );
1053
+ } );
1054
+
1055
+ act( () => onUndo() );
1056
+ await act( async () => {
1057
+ pendingAttachment.resolve( CROPPED_ATTACHMENT );
1058
+ await updatePromise;
1059
+ } );
1060
+
1061
+ expect( setAttributes ).toHaveBeenCalledTimes( 1 );
1062
+ expect( setAttributes ).toHaveBeenCalledWith( {
1063
+ id: 1,
1064
+ url: 'original-medium.jpg',
1065
+ } );
1066
+ expect( onUrlChange ).toHaveBeenLastCalledWith( 'original-medium.jpg' );
1067
+ } );
1068
+ } );
1069
+
869
1070
  describe( 'getImageBlockMetadataFromAttachment', () => {
870
1071
  it( 'normalizes attachment metadata to image block attributes', () => {
871
1072
  expect(
@@ -243,7 +243,8 @@ export function useOpenImageMediaEditorModal( {
243
243
  // the update needs to read — those synced from the attachment's metadata,
244
244
  // and those derived from which attachment the block points at; add more
245
245
  // here if the sync policy grows.
246
- const { id, url, alt, caption, sizeSlug, linkDestination } = attributes;
246
+ const { id, url, alt, caption, sizeSlug, linkDestination, href } =
247
+ attributes;
247
248
  const registry = useRegistry();
248
249
  const openMediaEditorModal = useSelect(
249
250
  ( select ) =>
@@ -261,6 +262,7 @@ export function useOpenImageMediaEditorModal( {
261
262
  caption: caption?.toString(),
262
263
  sizeSlug,
263
264
  linkDestination,
265
+ href,
264
266
  } );
265
267
  // Snapshot of the attachment's metadata taken just before the modal opens,
266
268
  // used as the baseline for detecting what changed during the editing session.
@@ -277,8 +279,9 @@ export function useOpenImageMediaEditorModal( {
277
279
  caption: caption?.toString(),
278
280
  sizeSlug,
279
281
  linkDestination,
282
+ href,
280
283
  };
281
- }, [ alt, caption, id, linkDestination, sizeSlug, url ] );
284
+ }, [ alt, caption, href, id, linkDestination, sizeSlug, url ] );
282
285
 
283
286
  // Reads the cached attachment record. The `attachment` postType entity
284
287
  // fetches with `context: 'edit'` by default, so `getEditedEntityRecord`
@@ -335,7 +338,7 @@ export function useOpenImageMediaEditorModal( {
335
338
  );
336
339
 
337
340
  const handleMediaUpdate = useCallback(
338
- async ( { id: newId, url: newUrl } ) => {
341
+ async ( { id: newId, url: newUrl }, undoState ) => {
339
342
  if ( typeof newId !== 'number' ) {
340
343
  return;
341
344
  }
@@ -351,6 +354,10 @@ export function useOpenImageMediaEditorModal( {
351
354
  const isNewAttachment = newId !== currentBlockAttributes.id;
352
355
 
353
356
  if ( isNewAttachment ) {
357
+ // Capture the block's selected-size URL, not the attachment's
358
+ // full-size URL supplied by the modal's fallback Undo.
359
+ undoState.undoAttributes.id = currentBlockAttributes.id;
360
+ undoState.undoAttributes.url = currentBlockAttributes.url;
354
361
  nextAttributes.id = newId;
355
362
  nextAttributes.url = newUrl ?? currentBlockAttributes.url;
356
363
  if ( nextAttributes.url !== currentBlockAttributes.url ) {
@@ -379,6 +386,7 @@ export function useOpenImageMediaEditorModal( {
379
386
  // A newer update started while we were awaiting; discard
380
387
  // this one.
381
388
  if (
389
+ undoState.isUndone ||
382
390
  syncRequest !== mediaEditorMetadataSyncRequestRef.current
383
391
  ) {
384
392
  return;
@@ -445,6 +453,14 @@ export function useOpenImageMediaEditorModal( {
445
453
  }
446
454
 
447
455
  if ( Object.keys( nextAttributes ).length ) {
456
+ // Only restore values this save changed. Block-specific
457
+ // metadata and unrelated edits must not be overwritten.
458
+ for ( const key of Object.keys( nextAttributes ) ) {
459
+ if ( ! Object.hasOwn( undoState.undoAttributes, key ) ) {
460
+ undoState.undoAttributes[ key ] =
461
+ blockAttributesRef.current[ key ];
462
+ }
463
+ }
448
464
  blockAttributesRef.current = {
449
465
  ...blockAttributesRef.current,
450
466
  ...nextAttributes,
@@ -488,9 +504,24 @@ export function useOpenImageMediaEditorModal( {
488
504
  : fallbackAttachmentRecord ) ||
489
505
  cachedAttachmentRecord;
490
506
 
507
+ // Each opening owns its Undo snapshot, so a later opening cannot
508
+ // replace the values captured by an earlier snackbar.
509
+ const undoState = { undoAttributes: {}, isUndone: false };
491
510
  openMediaEditorModal( {
492
511
  id,
493
- onUpdate: handleMediaUpdate,
512
+ onUpdate: ( updated ) => handleMediaUpdate( updated, undoState ),
513
+ onUndo: () => {
514
+ undoState.isUndone = true;
515
+ const { undoAttributes } = undoState;
516
+ if ( Object.hasOwn( undoAttributes, 'url' ) ) {
517
+ onUrlChange?.( undoAttributes.url );
518
+ }
519
+ blockAttributesRef.current = {
520
+ ...blockAttributesRef.current,
521
+ ...undoAttributes,
522
+ };
523
+ setAttributes( undoAttributes );
524
+ },
494
525
  onClose,
495
526
  } );
496
527
  }, [
@@ -498,8 +529,10 @@ export function useOpenImageMediaEditorModal( {
498
529
  handleMediaUpdate,
499
530
  id,
500
531
  onClose,
532
+ onUrlChange,
501
533
  openMediaEditorModal,
502
534
  resolveAttachmentRecord,
535
+ setAttributes,
503
536
  ] );
504
537
 
505
538
  return id && openMediaEditorModal ? openImageMediaEditorModal : undefined;
package/src/image/view.js CHANGED
@@ -30,6 +30,14 @@ const touchStartEvent = {
30
30
  startTime: 0,
31
31
  };
32
32
 
33
+ /**
34
+ * Elements made inert while the lightbox is open, so only those are restored
35
+ * when it closes.
36
+ *
37
+ * @type {Element[]}
38
+ */
39
+ let inertElements = [];
40
+
33
41
  const focusableSelectors = [
34
42
  '.wp-lightbox-close-button',
35
43
  '.wp-lightbox-navigation-button',
@@ -430,7 +438,7 @@ const { state, actions, callbacks } = store(
430
438
  // Natural ratio of the image clicked to open the lightbox.
431
439
  const naturalRatio = naturalWidth / naturalHeight;
432
440
  // Original ratio of the image clicked to open the lightbox.
433
- let originalRatio = originalWidth / originalHeight;
441
+ const originalRatio = originalWidth / originalHeight;
434
442
 
435
443
  // If it has object-fit: contain, recalculates the original sizes
436
444
  // and the screen position without the blank spaces.
@@ -448,19 +456,18 @@ const { state, actions, callbacks } = store(
448
456
  originalWidth = widthWithoutSpace;
449
457
  }
450
458
  }
451
- originalRatio = originalWidth / originalHeight;
452
459
 
453
460
  // Typically, it uses the image's full-sized dimensions. If those
454
461
  // dimensions have not been set (i.e. an external image with only one
455
462
  // size), the image's dimensions in the lightbox are the same
456
463
  // as those of the image in the content.
457
- let imgMaxWidth = parseFloat(
464
+ const imgMaxWidth = parseFloat(
458
465
  state.selectedImage.targetWidth &&
459
466
  state.selectedImage.targetWidth !== 'none'
460
467
  ? state.selectedImage.targetWidth
461
468
  : naturalWidth
462
469
  );
463
- let imgMaxHeight = parseFloat(
470
+ const imgMaxHeight = parseFloat(
464
471
  state.selectedImage.targetHeight &&
465
472
  state.selectedImage.targetHeight !== 'none'
466
473
  ? state.selectedImage.targetHeight
@@ -468,54 +475,10 @@ const { state, actions, callbacks } = store(
468
475
  );
469
476
 
470
477
  // Ratio of the biggest image stored in the database.
471
- let imgRatio = imgMaxWidth / imgMaxHeight;
472
- let containerMaxWidth = imgMaxWidth;
473
- let containerMaxHeight = imgMaxHeight;
478
+ const fullSizeRatio = imgMaxWidth / imgMaxHeight;
474
479
  let containerWidth = imgMaxWidth;
475
480
  let containerHeight = imgMaxHeight;
476
481
 
477
- // Checks if the target image has a different ratio than the original
478
- // one (thumbnail). Recalculates the width and height.
479
- if ( naturalRatio.toFixed( 2 ) !== imgRatio.toFixed( 2 ) ) {
480
- if ( naturalRatio > imgRatio ) {
481
- // If the width is reached before the height, it keeps the maxWidth
482
- // and recalculates the height unless the difference between the
483
- // maxHeight and the reducedHeight is higher than the maxWidth,
484
- // where it keeps the reducedHeight and recalculate the width.
485
- const reducedHeight = imgMaxWidth / naturalRatio;
486
- if ( imgMaxHeight - reducedHeight > imgMaxWidth ) {
487
- imgMaxHeight = reducedHeight;
488
- imgMaxWidth = reducedHeight * naturalRatio;
489
- } else {
490
- imgMaxHeight = imgMaxWidth / naturalRatio;
491
- }
492
- } else {
493
- // If the height is reached before the width, it keeps the maxHeight
494
- // and recalculate the width unlesss the difference between the
495
- // maxWidth and the reducedWidth is higher than the maxHeight, where
496
- // it keeps the reducedWidth and recalculate the height.
497
- const reducedWidth = imgMaxHeight * naturalRatio;
498
- if ( imgMaxWidth - reducedWidth > imgMaxHeight ) {
499
- imgMaxWidth = reducedWidth;
500
- imgMaxHeight = reducedWidth / naturalRatio;
501
- } else {
502
- imgMaxWidth = imgMaxHeight * naturalRatio;
503
- }
504
- }
505
- containerWidth = imgMaxWidth;
506
- containerHeight = imgMaxHeight;
507
- imgRatio = imgMaxWidth / imgMaxHeight;
508
-
509
- // Calculates the max size of the container.
510
- if ( originalRatio > imgRatio ) {
511
- containerMaxWidth = imgMaxWidth;
512
- containerMaxHeight = containerMaxWidth / originalRatio;
513
- } else {
514
- containerMaxHeight = imgMaxHeight;
515
- containerMaxWidth = containerMaxHeight * originalRatio;
516
- }
517
- }
518
-
519
482
  // If the image has been pixelated on purpose, it keeps that size.
520
483
  if (
521
484
  originalWidth > containerWidth ||
@@ -553,21 +516,35 @@ const { state, actions, callbacks } = store(
553
516
  );
554
517
  const targetContainerRatio = targetMaxWidth / targetMaxHeight;
555
518
 
556
- if ( originalRatio > targetContainerRatio ) {
519
+ if ( fullSizeRatio > targetContainerRatio ) {
557
520
  // If targetMaxWidth is reached before targetMaxHeight.
558
521
  containerWidth = targetMaxWidth;
559
- containerHeight = containerWidth / originalRatio;
522
+ containerHeight = containerWidth / fullSizeRatio;
560
523
  } else {
561
524
  // If targetMaxHeight is reached before targetMaxWidth.
562
525
  containerHeight = targetMaxHeight;
563
- containerWidth = containerHeight * originalRatio;
526
+ containerWidth = containerHeight * fullSizeRatio;
564
527
  }
565
528
 
566
- const containerScale = originalWidth / containerWidth;
567
- const lightboxImgWidth =
568
- imgMaxWidth * ( containerWidth / containerMaxWidth );
569
- const lightboxImgHeight =
570
- imgMaxHeight * ( containerHeight / containerMaxHeight );
529
+ const hasCroppedSource =
530
+ naturalRatio.toFixed( 2 ) !== fullSizeRatio.toFixed( 2 );
531
+ const sourceRatio = hasCroppedSource
532
+ ? naturalRatio
533
+ : fullSizeRatio;
534
+
535
+ // Include any crop already applied to the thumbnail file.
536
+ const containerScale = Math.max(
537
+ originalWidth / containerWidth,
538
+ originalHeight / containerHeight,
539
+ originalWidth / ( containerHeight * sourceRatio ),
540
+ ( originalHeight * sourceRatio ) / containerWidth
541
+ );
542
+ const thumbnailWidth = originalWidth / containerScale;
543
+ const thumbnailHeight = originalHeight / containerScale;
544
+ const cropX = ( containerWidth - thumbnailWidth ) / 2;
545
+ const cropY = ( containerHeight - thumbnailHeight ) / 2;
546
+ screenPosX -= cropX * containerScale;
547
+ screenPosY -= cropY * containerScale;
571
548
 
572
549
  // As of this writing, using the calculations above will render the
573
550
  // lightbox with a small, erroneous whitespace on the left side of the
@@ -580,8 +557,15 @@ const { state, actions, callbacks } = store(
580
557
  --wp--lightbox-initial-left-position: ${ screenPosX }px;
581
558
  --wp--lightbox-container-width: ${ containerWidth + 1 }px;
582
559
  --wp--lightbox-container-height: ${ containerHeight + 1 }px;
583
- --wp--lightbox-image-width: ${ lightboxImgWidth }px;
584
- --wp--lightbox-image-height: ${ lightboxImgHeight }px;
560
+ --wp--lightbox-image-width: ${ containerWidth }px;
561
+ --wp--lightbox-image-height: ${ containerHeight }px;
562
+ --wp--lightbox-initial-clip: inset(${ cropY }px ${ cropX }px);
563
+ --wp--lightbox-thumbnail-width: ${
564
+ hasCroppedSource ? thumbnailWidth : containerWidth
565
+ }px;
566
+ --wp--lightbox-thumbnail-height: ${
567
+ hasCroppedSource ? thumbnailHeight : containerHeight
568
+ }px;
585
569
  --wp--lightbox-scale: ${ containerScale };
586
570
  --wp--lightbox-scrollbar-width: ${
587
571
  window.innerWidth - document.documentElement.clientWidth
@@ -690,16 +674,28 @@ const { state, actions, callbacks } = store(
690
674
  }
691
675
  },
692
676
  setInertElements() {
693
- // Makes all children of the document inert exempt .wp-lightbox-overlay.
694
- document
695
- .querySelectorAll( 'body > :not(.wp-lightbox-overlay)' )
696
- .forEach( ( el ) => {
697
- if ( state.overlayEnabled ) {
698
- el.setAttribute( 'inert', '' );
699
- } else {
700
- el.removeAttribute( 'inert' );
677
+ if ( ! state.overlayEnabled ) {
678
+ inertElements.forEach( ( el ) =>
679
+ el.removeAttribute( 'inert' )
680
+ );
681
+ inertElements = [];
682
+ return;
683
+ }
684
+ // Inerts the overlay's siblings at each level, not its ancestors.
685
+ const { ref } = getElement();
686
+ let node = ref;
687
+ while ( node && node !== document.body && node.parentElement ) {
688
+ for ( const sibling of node.parentElement.children ) {
689
+ if (
690
+ sibling !== node &&
691
+ ! sibling.hasAttribute( 'inert' )
692
+ ) {
693
+ sibling.setAttribute( 'inert', '' );
694
+ inertElements.push( sibling );
701
695
  }
702
- } );
696
+ }
697
+ node = node.parentElement;
698
+ }
703
699
  },
704
700
  initTriggerButton() {
705
701
  const { imageId } = getContext();
@@ -26,13 +26,21 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
26
26
 
27
27
  - [`anchor`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#anchor): `true`
28
28
  - [`align`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#align): `true`
29
+ - [`background`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#background):
30
+ - `backgroundImage`: `true`
31
+ - `backgroundSize`: `true`
32
+ - `gradient`: `true`
29
33
  - [`color`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color):
30
34
  - [`gradients`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-gradients): `true`
31
35
  - [`link`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-link): `true`
36
+ - [`dimensions`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#dimensions):
37
+ - `minHeight`: `true`
38
+ - `minWidth`: `true`
32
39
  - [`html`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#html): `false`
33
40
  - [`spacing`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#spacing):
34
41
  - `margin`: `true`
35
42
  - `padding`: `true`
43
+ - [`shadow`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#shadow): `true`
36
44
  - [`typography`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography):
37
45
  - [`fontSize`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography-fontsize): `true`
38
46
  - [`lineHeight`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography-lineheight): `true`
@@ -31,6 +31,15 @@
31
31
  "supports": {
32
32
  "anchor": true,
33
33
  "align": true,
34
+ "background": {
35
+ "backgroundImage": true,
36
+ "backgroundSize": true,
37
+ "gradient": true,
38
+ "__experimentalDefaultControls": {
39
+ "backgroundImage": true,
40
+ "gradient": true
41
+ }
42
+ },
34
43
  "color": {
35
44
  "gradients": true,
36
45
  "link": true,
@@ -40,11 +49,22 @@
40
49
  "link": true
41
50
  }
42
51
  },
52
+ "dimensions": {
53
+ "minHeight": true,
54
+ "minWidth": true
55
+ },
43
56
  "html": false,
44
57
  "spacing": {
45
58
  "margin": true,
46
59
  "padding": true
47
60
  },
61
+ "__experimentalBorder": {
62
+ "color": true,
63
+ "radius": true,
64
+ "style": true,
65
+ "width": true
66
+ },
67
+ "shadow": true,
48
68
  "typography": {
49
69
  "fontSize": true,
50
70
  "lineHeight": true,
@@ -40,9 +40,16 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
40
40
  - [`align`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#align): `true`
41
41
  - [`html`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#html): `false`
42
42
  - [`layout`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#layout): `true`
43
+ - [`background`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#background):
44
+ - `backgroundImage`: `true`
45
+ - `backgroundSize`: `true`
46
+ - `gradient`: `true`
43
47
  - [`color`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color):
44
48
  - [`gradients`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-gradients): `true`
45
49
  - [`link`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-link): `true`
50
+ - [`dimensions`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#dimensions):
51
+ - `minHeight`: `true`
52
+ - `minWidth`: `true`
46
53
  - [`spacing`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#spacing):
47
54
  - `margin`: `true`
48
55
  - `padding`: `true`
@@ -50,6 +57,7 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
50
57
  - [`typography`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography):
51
58
  - [`fontSize`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography-fontsize): `true`
52
59
  - [`lineHeight`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography-lineheight): `true`
60
+ - [`shadow`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#shadow): `true`
53
61
  - [`interactivity`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#interactivity):
54
62
  - `clientNavigation`: `true`
55
63
 
@@ -79,6 +79,15 @@
79
79
  "align": true,
80
80
  "html": false,
81
81
  "layout": true,
82
+ "background": {
83
+ "backgroundImage": true,
84
+ "backgroundSize": true,
85
+ "gradient": true,
86
+ "__experimentalDefaultControls": {
87
+ "backgroundImage": true,
88
+ "gradient": true
89
+ }
90
+ },
82
91
  "color": {
83
92
  "gradients": true,
84
93
  "link": true,
@@ -88,6 +97,10 @@
88
97
  "link": true
89
98
  }
90
99
  },
100
+ "dimensions": {
101
+ "minHeight": true,
102
+ "minWidth": true
103
+ },
91
104
  "spacing": {
92
105
  "margin": true,
93
106
  "padding": true,
@@ -123,6 +136,7 @@
123
136
  "style": true
124
137
  }
125
138
  },
139
+ "shadow": true,
126
140
  "interactivity": {
127
141
  "clientNavigation": true
128
142
  }
@@ -37,12 +37,17 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
37
37
  - [`typography`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography):
38
38
  - [`fontSize`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography-fontsize): `true`
39
39
  - [`lineHeight`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography-lineheight): `true`
40
+ - [`background`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#background):
41
+ - `backgroundImage`: `true`
42
+ - `backgroundSize`: `true`
43
+ - `gradient`: `true`
40
44
  - [`color`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color):
41
45
  - [`gradients`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-gradients): `true`
42
46
  - [`link`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#color-link): `true`
43
47
  - [`spacing`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#spacing):
44
48
  - `margin`: `true`
45
49
  - `padding`: `true`
50
+ - [`shadow`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#shadow): `true`
46
51
  - [`interactivity`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#interactivity):
47
52
  - `clientNavigation`: `true`
48
53
  - [`listView`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#listview): `true`
@@ -52,6 +57,7 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
52
57
  _Defined via the [`selectors`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-selectors/) property in block.json._
53
58
 
54
59
  - **border**: `.wp-block-list:not(.wp-block-list .wp-block-list)`
60
+ - **shadow**: `.wp-block-list:not(.wp-block-list .wp-block-list)`
55
61
 
56
62
  ## Block Markup
57
63