@wordpress/block-library 10.5.2-next.v.202608281122.0 → 11.0.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 (588) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/build/audio/edit.cjs +5 -5
  3. package/build/audio/edit.cjs.map +2 -2
  4. package/build/audio/index.cjs +0 -37
  5. package/build/audio/index.cjs.map +3 -3
  6. package/build/button/index.cjs +0 -34
  7. package/build/button/index.cjs.map +3 -3
  8. package/build/code/index.cjs +0 -17
  9. package/build/code/index.cjs.map +3 -3
  10. package/build/comment-template/edit.cjs.map +1 -1
  11. package/build/cover/index.cjs +0 -38
  12. package/build/cover/index.cjs.map +3 -3
  13. package/build/details/index.cjs +0 -17
  14. package/build/details/index.cjs.map +3 -3
  15. package/build/file/index.cjs +0 -43
  16. package/build/file/index.cjs.map +3 -3
  17. package/build/footnotes/format.cjs +1 -1
  18. package/build/footnotes/format.cjs.map +2 -2
  19. package/build/gallery/dynamic-gallery.cjs +22 -12
  20. package/build/gallery/dynamic-gallery.cjs.map +2 -2
  21. package/build/heading/index.cjs +0 -16
  22. package/build/heading/index.cjs.map +3 -3
  23. package/build/image/image.cjs +7 -5
  24. package/build/image/image.cjs.map +2 -2
  25. package/build/image/index.cjs +0 -81
  26. package/build/image/index.cjs.map +3 -3
  27. package/build/image/use-open-image-media-editor-modal.cjs +81 -14
  28. package/build/image/use-open-image-media-editor-modal.cjs.map +2 -2
  29. package/build/index.cjs +0 -10
  30. package/build/index.cjs.map +2 -2
  31. package/build/latest-posts/edit.cjs.map +1 -1
  32. package/build/list-item/edit.cjs +14 -11
  33. package/build/list-item/edit.cjs.map +2 -2
  34. package/build/list-item/hooks/index.cjs +6 -9
  35. package/build/list-item/hooks/index.cjs.map +2 -2
  36. package/build/list-item/hooks/use-enter.cjs +62 -67
  37. package/build/list-item/hooks/use-enter.cjs.map +3 -3
  38. package/build/list-item/hooks/use-merge.cjs +26 -44
  39. package/build/list-item/hooks/use-merge.cjs.map +3 -3
  40. package/build/list-item/hooks/use-multi-select-tab.cjs +80 -0
  41. package/build/list-item/hooks/use-multi-select-tab.cjs.map +7 -0
  42. package/build/list-item/hooks/use-tab.cjs +65 -0
  43. package/build/list-item/hooks/use-tab.cjs.map +7 -0
  44. package/build/list-item/index.cjs +0 -17
  45. package/build/list-item/index.cjs.map +3 -3
  46. package/build/list-item/utils.cjs +169 -0
  47. package/build/list-item/utils.cjs.map +7 -0
  48. package/build/math/block.json +3 -0
  49. package/build/media-text/index.cjs +0 -50
  50. package/build/media-text/index.cjs.map +3 -3
  51. package/build/media-text/media-container.cjs +16 -11
  52. package/build/media-text/media-container.cjs.map +2 -2
  53. package/build/more/index.cjs +0 -18
  54. package/build/more/index.cjs.map +3 -3
  55. package/build/navigation/constants.cjs +1 -1
  56. package/build/navigation/constants.cjs.map +1 -1
  57. package/build/navigation-link/block.json +1 -1
  58. package/build/navigation-link/deprecated.cjs +69 -0
  59. package/build/navigation-link/deprecated.cjs.map +7 -0
  60. package/build/navigation-link/index.cjs +6 -74
  61. package/build/navigation-link/index.cjs.map +4 -4
  62. package/build/{form-submit-button/init.cjs → navigation-link/variations.cjs} +23 -8
  63. package/build/navigation-link/variations.cjs.map +7 -0
  64. package/build/navigation-submenu/index.cjs +0 -32
  65. package/build/navigation-submenu/index.cjs.map +3 -3
  66. package/build/paragraph/index.cjs +0 -17
  67. package/build/paragraph/index.cjs.map +3 -3
  68. package/build/paragraph/use-enter.cjs +8 -4
  69. package/build/paragraph/use-enter.cjs.map +2 -2
  70. package/build/post-template/edit.cjs +3 -1
  71. package/build/post-template/edit.cjs.map +2 -2
  72. package/build/preformatted/index.cjs +0 -17
  73. package/build/preformatted/index.cjs.map +3 -3
  74. package/build/pullquote/index.cjs +0 -24
  75. package/build/pullquote/index.cjs.map +3 -3
  76. package/build/query/edit/inspector-controls/enhanced-pagination-control.cjs +13 -5
  77. package/build/query/edit/inspector-controls/enhanced-pagination-control.cjs.map +2 -2
  78. package/build/query/edit/inspector-controls/index.cjs +9 -4
  79. package/build/query/edit/inspector-controls/index.cjs.map +2 -2
  80. package/build/query/edit/query-content.cjs +30 -9
  81. package/build/query/edit/query-content.cjs.map +3 -3
  82. package/build/query/utils.cjs +11 -4
  83. package/build/query/utils.cjs.map +2 -2
  84. package/build/search/edit.cjs +3 -1
  85. package/build/search/edit.cjs.map +2 -2
  86. package/build/search/index.cjs +0 -31
  87. package/build/search/index.cjs.map +3 -3
  88. package/build/site-tagline/edit.cjs +11 -17
  89. package/build/site-tagline/edit.cjs.map +2 -2
  90. package/build/site-title/edit.cjs +12 -18
  91. package/build/site-title/edit.cjs.map +2 -2
  92. package/build/social-link/index.cjs +0 -31
  93. package/build/social-link/index.cjs.map +3 -3
  94. package/build/verse/index.cjs +0 -17
  95. package/build/verse/index.cjs.map +3 -3
  96. package/build/video/index.cjs +0 -40
  97. package/build/video/index.cjs.map +3 -3
  98. package/build/video/tracks-editor.cjs +2 -3
  99. package/build/video/tracks-editor.cjs.map +3 -3
  100. package/build-module/audio/edit.mjs +5 -5
  101. package/build-module/audio/edit.mjs.map +2 -2
  102. package/build-module/audio/index.mjs +0 -37
  103. package/build-module/audio/index.mjs.map +2 -2
  104. package/build-module/button/index.mjs +0 -34
  105. package/build-module/button/index.mjs.map +2 -2
  106. package/build-module/code/index.mjs +0 -17
  107. package/build-module/code/index.mjs.map +2 -2
  108. package/build-module/comment-template/edit.mjs.map +1 -1
  109. package/build-module/cover/index.mjs +0 -38
  110. package/build-module/cover/index.mjs.map +2 -2
  111. package/build-module/details/index.mjs +0 -17
  112. package/build-module/details/index.mjs.map +2 -2
  113. package/build-module/file/index.mjs +1 -44
  114. package/build-module/file/index.mjs.map +2 -2
  115. package/build-module/footnotes/format.mjs +1 -1
  116. package/build-module/footnotes/format.mjs.map +2 -2
  117. package/build-module/gallery/dynamic-gallery.mjs +23 -13
  118. package/build-module/gallery/dynamic-gallery.mjs.map +2 -2
  119. package/build-module/heading/index.mjs +1 -21
  120. package/build-module/heading/index.mjs.map +2 -2
  121. package/build-module/image/image.mjs +7 -5
  122. package/build-module/image/image.mjs.map +2 -2
  123. package/build-module/image/index.mjs +0 -81
  124. package/build-module/image/index.mjs.map +2 -2
  125. package/build-module/image/use-open-image-media-editor-modal.mjs +84 -14
  126. package/build-module/image/use-open-image-media-editor-modal.mjs.map +2 -2
  127. package/build-module/index.mjs +0 -10
  128. package/build-module/index.mjs.map +2 -2
  129. package/build-module/latest-posts/edit.mjs.map +1 -1
  130. package/build-module/list-item/edit.mjs +20 -18
  131. package/build-module/list-item/edit.mjs.map +2 -2
  132. package/build-module/list-item/hooks/index.mjs +8 -10
  133. package/build-module/list-item/hooks/index.mjs.map +2 -2
  134. package/build-module/list-item/hooks/use-enter.mjs +63 -58
  135. package/build-module/list-item/hooks/use-enter.mjs.map +2 -2
  136. package/build-module/list-item/hooks/use-merge.mjs +27 -35
  137. package/build-module/list-item/hooks/use-merge.mjs.map +2 -2
  138. package/build-module/list-item/hooks/use-multi-select-tab.mjs +59 -0
  139. package/build-module/list-item/hooks/use-multi-select-tab.mjs.map +7 -0
  140. package/build-module/list-item/hooks/use-tab.mjs +44 -0
  141. package/build-module/list-item/hooks/use-tab.mjs.map +7 -0
  142. package/build-module/list-item/index.mjs +0 -17
  143. package/build-module/list-item/index.mjs.map +2 -2
  144. package/build-module/list-item/utils.mjs +140 -0
  145. package/build-module/list-item/utils.mjs.map +7 -0
  146. package/build-module/math/block.json +3 -0
  147. package/build-module/media-text/index.mjs +0 -50
  148. package/build-module/media-text/index.mjs.map +2 -2
  149. package/build-module/media-text/media-container.mjs +17 -12
  150. package/build-module/media-text/media-container.mjs.map +2 -2
  151. package/build-module/more/index.mjs +0 -18
  152. package/build-module/more/index.mjs.map +2 -2
  153. package/build-module/navigation/constants.mjs +1 -1
  154. package/build-module/navigation/constants.mjs.map +1 -1
  155. package/build-module/navigation-link/block.json +1 -1
  156. package/build-module/navigation-link/deprecated.mjs +48 -0
  157. package/build-module/navigation-link/deprecated.mjs.map +7 -0
  158. package/build-module/navigation-link/index.mjs +7 -75
  159. package/build-module/navigation-link/index.mjs.map +3 -3
  160. package/build-module/navigation-link/variations.mjs +22 -0
  161. package/build-module/navigation-link/variations.mjs.map +7 -0
  162. package/build-module/navigation-submenu/index.mjs +1 -33
  163. package/build-module/navigation-submenu/index.mjs.map +2 -2
  164. package/build-module/paragraph/index.mjs +0 -17
  165. package/build-module/paragraph/index.mjs.map +2 -2
  166. package/build-module/paragraph/use-enter.mjs +8 -4
  167. package/build-module/paragraph/use-enter.mjs.map +2 -2
  168. package/build-module/post-template/edit.mjs +3 -1
  169. package/build-module/post-template/edit.mjs.map +2 -2
  170. package/build-module/preformatted/index.mjs +0 -17
  171. package/build-module/preformatted/index.mjs.map +2 -2
  172. package/build-module/pullquote/index.mjs +0 -24
  173. package/build-module/pullquote/index.mjs.map +2 -2
  174. package/build-module/query/edit/inspector-controls/enhanced-pagination-control.mjs +14 -6
  175. package/build-module/query/edit/inspector-controls/enhanced-pagination-control.mjs.map +2 -2
  176. package/build-module/query/edit/inspector-controls/index.mjs +9 -4
  177. package/build-module/query/edit/inspector-controls/index.mjs.map +2 -2
  178. package/build-module/query/edit/query-content.mjs +32 -11
  179. package/build-module/query/edit/query-content.mjs.map +2 -2
  180. package/build-module/query/utils.mjs +10 -7
  181. package/build-module/query/utils.mjs.map +2 -2
  182. package/build-module/search/edit.mjs +4 -2
  183. package/build-module/search/edit.mjs.map +2 -2
  184. package/build-module/search/index.mjs +0 -31
  185. package/build-module/search/index.mjs.map +2 -2
  186. package/build-module/site-tagline/edit.mjs +13 -19
  187. package/build-module/site-tagline/edit.mjs.map +2 -2
  188. package/build-module/site-title/edit.mjs +14 -20
  189. package/build-module/site-title/edit.mjs.map +2 -2
  190. package/build-module/social-link/index.mjs +0 -31
  191. package/build-module/social-link/index.mjs.map +2 -2
  192. package/build-module/verse/index.mjs +0 -17
  193. package/build-module/verse/index.mjs.map +2 -2
  194. package/build-module/video/index.mjs +0 -40
  195. package/build-module/video/index.mjs.map +2 -2
  196. package/build-module/video/tracks-editor.mjs +3 -5
  197. package/build-module/video/tracks-editor.mjs.map +2 -2
  198. package/build-style/columns/style-rtl.css +1 -1
  199. package/build-style/columns/style.css +1 -1
  200. package/build-style/comment-template/style-rtl.css +0 -1
  201. package/build-style/comment-template/style.css +0 -1
  202. package/build-style/cover/style-rtl.css +1 -2
  203. package/build-style/cover/style.css +1 -2
  204. package/build-style/editor-rtl.css +20 -81
  205. package/build-style/editor.css +20 -81
  206. package/build-style/gallery/style-rtl.css +2 -4
  207. package/build-style/gallery/style.css +2 -4
  208. package/build-style/group/theme-rtl.css +1 -1
  209. package/build-style/group/theme.css +1 -1
  210. package/build-style/heading/style-rtl.css +1 -1
  211. package/build-style/heading/style.css +1 -1
  212. package/build-style/icon/style-rtl.css +3 -0
  213. package/build-style/icon/style.css +3 -0
  214. package/build-style/image/editor-rtl.css +0 -1
  215. package/build-style/image/editor.css +0 -1
  216. package/build-style/list/style-rtl.css +1 -1
  217. package/build-style/list/style.css +1 -1
  218. package/build-style/media-text/style-rtl.css +2 -3
  219. package/build-style/media-text/style.css +2 -3
  220. package/build-style/navigation/editor-rtl.css +8 -0
  221. package/build-style/navigation/editor.css +8 -0
  222. package/build-style/paragraph/style-rtl.css +1 -1
  223. package/build-style/paragraph/style.css +1 -1
  224. package/build-style/playlist/style-rtl.css +1 -2
  225. package/build-style/playlist/style.css +1 -2
  226. package/build-style/playlist-track/style-rtl.css +1 -2
  227. package/build-style/playlist-track/style.css +1 -2
  228. package/build-style/preformatted/style-rtl.css +1 -1
  229. package/build-style/preformatted/style.css +1 -1
  230. package/build-style/query/editor-rtl.css +5 -15
  231. package/build-style/query/editor.css +5 -15
  232. package/build-style/read-more/style-rtl.css +0 -1
  233. package/build-style/read-more/style.css +0 -1
  234. package/build-style/reset-rtl.css +1 -3
  235. package/build-style/reset.css +1 -3
  236. package/build-style/search/style-rtl.css +1 -3
  237. package/build-style/search/style.css +1 -3
  238. package/build-style/site-logo/editor-rtl.css +1 -2
  239. package/build-style/site-logo/editor.css +1 -2
  240. package/build-style/style-rtl.css +18 -77
  241. package/build-style/style.css +18 -77
  242. package/build-style/tab-list/style-rtl.css +1 -3
  243. package/build-style/tab-list/style.css +1 -3
  244. package/build-style/template-part/editor-rtl.css +4 -8
  245. package/build-style/template-part/editor.css +4 -8
  246. package/build-style/template-part/theme-rtl.css +1 -1
  247. package/build-style/template-part/theme.css +1 -1
  248. package/build-style/theme-rtl.css +2 -2
  249. package/build-style/theme.css +2 -2
  250. package/build-style/video/style-rtl.css +1 -2
  251. package/build-style/video/style.css +1 -2
  252. package/build-types/navigation-link/deprecated.d.ts +48 -0
  253. package/build-types/navigation-link/deprecated.d.ts.map +1 -0
  254. package/package.json +43 -43
  255. package/src/accordion/index.php +2 -2
  256. package/src/accordion-item/index.php +1 -1
  257. package/src/audio/edit.jsx +6 -7
  258. package/src/audio/index.js +0 -37
  259. package/src/breadcrumbs/index.php +4 -4
  260. package/src/button/index.js +0 -34
  261. package/src/button/style.scss +16 -15
  262. package/src/button/test/{get-experimental-label.js → get-experimental-label.jsdom.test.js} +1 -0
  263. package/src/button/test/get-updated-link-attributes.js +1 -0
  264. package/src/button/test/utils.js +1 -0
  265. package/src/categories/index.php +4 -0
  266. package/src/code/index.js +0 -18
  267. package/src/code/test/utils.js +1 -0
  268. package/src/columns/style.scss +2 -1
  269. package/src/columns/test/{transforms.js → transforms.jsdom.test.js} +1 -0
  270. package/src/columns/test/utils.js +1 -0
  271. package/src/comment-template/edit.jsx +1 -1
  272. package/src/comment-template/index.php +2 -2
  273. package/src/comment-template/test/index.js +1 -0
  274. package/src/common.scss +51 -50
  275. package/src/cover/README.md +37 -0
  276. package/src/cover/index.js +0 -39
  277. package/src/cover/style.scss +3 -3
  278. package/src/cover/test/{edit.js → edit.jsdom.test.js} +18 -17
  279. package/src/cover/test/{transforms.js → transforms.jsdom.test.js} +1 -0
  280. package/src/details/index.js +0 -18
  281. package/src/editor.scss +0 -2
  282. package/src/embed/editor.scss +1 -0
  283. package/src/embed/test/{index.js → index.jsdom.test.js} +5 -1
  284. package/src/file/index.js +1 -43
  285. package/src/footnotes/format.jsx +5 -1
  286. package/src/gallery/dynamic-gallery.jsx +31 -4
  287. package/src/gallery/test/dynamic-source.js +1 -0
  288. package/src/gallery/test/{edit.js → edit.jsdom.test.js} +4 -0
  289. package/src/gallery/test/responsive-styles.js +1 -0
  290. package/src/gallery/test/shared.js +1 -0
  291. package/src/gallery/test/{transforms.js → transforms.jsdom.test.js} +1 -0
  292. package/src/gallery/test/{use-get-new-images.jsx → use-get-new-images.jsdom.test.jsx} +1 -0
  293. package/src/gallery/test/variations.js +1 -0
  294. package/src/group/test/{placeholder.jsx → placeholder.jsdom.test.jsx} +1 -0
  295. package/src/group/theme.scss +1 -1
  296. package/src/heading/index.js +1 -22
  297. package/src/heading/index.php +1 -1
  298. package/src/heading/style.scss +1 -1
  299. package/src/heading/test/shared.js +1 -0
  300. package/src/home-link/index.php +2 -2
  301. package/src/html/test/{index.js → index.jsdom.test.js} +9 -0
  302. package/src/html/test/{utils.js → utils.jsdom.test.js} +1 -0
  303. package/src/icon/index.php +18 -6
  304. package/src/icon/style.scss +7 -0
  305. package/src/image/image.jsx +18 -11
  306. package/src/image/index.js +0 -80
  307. package/src/image/test/{transforms.js → transforms.jsdom.test.js} +1 -0
  308. package/src/image/test/{use-open-image-media-editor-modal.js → use-open-image-media-editor-modal.jsdom.test.js} +343 -28
  309. package/src/image/use-open-image-media-editor-modal.js +184 -21
  310. package/src/index.jsx +0 -11
  311. package/src/latest-posts/edit.jsx +1 -1
  312. package/src/latest-posts/test/{deprecated.js → deprecated.jsdom.test.js} +1 -0
  313. package/src/list/index.php +1 -1
  314. package/src/list/style.scss +1 -1
  315. package/src/list-item/edit.jsx +20 -20
  316. package/src/list-item/hooks/index.js +2 -3
  317. package/src/list-item/hooks/use-enter.js +82 -70
  318. package/src/list-item/hooks/use-merge.js +28 -36
  319. package/src/list-item/hooks/use-multi-select-tab.js +83 -0
  320. package/src/list-item/hooks/use-tab.js +62 -0
  321. package/src/list-item/index.js +0 -18
  322. package/src/list-item/utils.js +236 -0
  323. package/src/math/README.md +2 -0
  324. package/src/math/block.json +3 -0
  325. package/src/media-text/index.js +0 -50
  326. package/src/media-text/media-container.jsx +22 -12
  327. package/src/media-text/style.scss +2 -1
  328. package/src/media-text/test/image-fill.js +1 -0
  329. package/src/more/index.js +0 -19
  330. package/src/navigation/constants.js +1 -1
  331. package/src/navigation/edit/test/are-blocks-dirty.js +1 -0
  332. package/src/navigation/edit/test/{layout-custom-properties.js → layout-custom-properties.jsdom.test.js} +8 -7
  333. package/src/navigation/edit/test/{navigation-menu-selector.jsx → navigation-menu-selector.jsdom.test.jsx} +23 -14
  334. package/src/navigation/edit/test/{overlay-template-part-selector.jsx → overlay-template-part-selector.jsdom.test.jsx} +22 -20
  335. package/src/navigation/edit/test/{responsive-wrapper.jsx → responsive-wrapper.jsdom.test.jsx} +14 -13
  336. package/src/navigation/edit/test/{use-create-overlay.js → use-create-overlay.jsdom.test.js} +19 -24
  337. package/src/navigation/edit/test/utils.js +1 -0
  338. package/src/navigation/editor.scss +13 -0
  339. package/src/navigation/index.php +14 -14
  340. package/src/navigation/test/{menu-items-to-blocks.js → menu-items-to-blocks.jsdom.test.js} +3 -2
  341. package/src/navigation/test/{use-navigation-menu.js → use-navigation-menu.jsdom.test.js} +7 -4
  342. package/src/navigation/test/{view.js → view.jsdom.test.js} +4 -2
  343. package/src/navigation-link/block.json +1 -1
  344. package/src/navigation-link/deprecated.tsx +58 -0
  345. package/src/navigation-link/{index.jsx → index.js} +5 -77
  346. package/src/navigation-link/index.php +5 -5
  347. package/src/navigation-link/shared/test/{controls.jsx → controls.jsdom.test.jsx} +18 -18
  348. package/src/navigation-link/shared/test/update-attributes.test.js +52 -51
  349. package/src/navigation-link/shared/test/{use-enable-link-status-validation.test.js → use-enable-link-status-validation.jsdom.test.js} +8 -6
  350. package/src/navigation-link/shared/test/{use-entity-binding.js → use-entity-binding.jsdom.test.js} +12 -11
  351. package/src/navigation-link/shared/test/{use-handle-link-change.test.js → use-handle-link-change.jsdom.test.js} +23 -20
  352. package/src/navigation-link/shared/test/{use-link-preview.test.js → use-link-preview.jsdom.test.js} +17 -14
  353. package/src/navigation-link/test/__snapshots__/{hooks.js.snap → hooks.jsdom.test.js.snap} +23 -6
  354. package/src/navigation-link/test/block-labelling.js +1 -0
  355. package/src/navigation-link/test/{hooks.js → hooks.jsdom.test.js} +1 -0
  356. package/src/navigation-link/variations.js +19 -0
  357. package/src/navigation-submenu/index.js +1 -33
  358. package/src/page-list/index.php +10 -10
  359. package/src/page-list/test/{convert-to-navigation-links.js → convert-to-navigation-links.jsdom.test.js} +3 -2
  360. package/src/paragraph/index.js +0 -18
  361. package/src/paragraph/style.scss +1 -1
  362. package/src/paragraph/use-enter.js +13 -6
  363. package/src/pattern/test/index.js +1 -0
  364. package/src/playlist/test/{edit-component.jsx → edit-component.jsdom.test.jsx} +31 -30
  365. package/src/playlist/test/{edit.js → edit.jsdom.test.js} +1 -0
  366. package/src/playlist/test/{transforms.js → transforms.jsdom.test.js} +1 -0
  367. package/src/playlist-track/test/{edit.jsx → edit.jsdom.test.jsx} +20 -19
  368. package/src/post-author/index.php +3 -3
  369. package/src/post-author-biography/index.php +3 -3
  370. package/src/post-author-name/index.php +3 -3
  371. package/src/post-comments-link/index.php +4 -4
  372. package/src/post-date/test/{edit.js → edit.jsdom.test.js} +1 -0
  373. package/src/post-template/edit.jsx +3 -1
  374. package/src/post-time-to-read/index.php +3 -3
  375. package/src/post-title/style.scss +1 -0
  376. package/src/preformatted/index.js +0 -18
  377. package/src/preformatted/style.scss +1 -1
  378. package/src/pullquote/index.js +0 -24
  379. package/src/query/edit/inspector-controls/enhanced-pagination-control.jsx +13 -6
  380. package/src/query/edit/inspector-controls/index.jsx +9 -4
  381. package/src/query/edit/query-content.jsx +31 -8
  382. package/src/query/editor.scss +1 -7
  383. package/src/query/index.php +2 -2
  384. package/src/query/test/{utils.js → utils.jsdom.test.js} +1 -0
  385. package/src/query/utils.js +15 -11
  386. package/src/quote/test/{migrate.js → migrate.jsdom.test.js} +1 -0
  387. package/src/read-more/index.php +1 -1
  388. package/src/search/edit.jsx +12 -2
  389. package/src/search/index.js +0 -30
  390. package/src/search/index.php +1 -1
  391. package/src/separator/test/{edit.jsx → edit.jsdom.test.jsx} +5 -4
  392. package/src/site-logo/index.php +1 -1
  393. package/src/site-tagline/edit.jsx +18 -27
  394. package/src/site-title/edit.jsx +20 -27
  395. package/src/social-link/index.js +0 -32
  396. package/src/social-link/index.php +0 -1
  397. package/src/style.scss +0 -1
  398. package/src/table/editor.scss +1 -0
  399. package/src/table/style.scss +2 -0
  400. package/src/table/test/state.js +1 -0
  401. package/src/table/test/utils.js +1 -0
  402. package/src/table-of-contents/index.php +3 -3
  403. package/src/template-part/theme.scss +1 -1
  404. package/src/utils/test/search-patterns.js +1 -0
  405. package/src/utils/test/{style-state.js → style-state.jsdom.test.js} +1 -0
  406. package/src/utils/test/{waveform-player-dependency.js → waveform-player-dependency.jsdom.test.js} +15 -21
  407. package/src/verse/index.js +0 -18
  408. package/src/verse/style.scss +1 -0
  409. package/src/video/index.js +0 -40
  410. package/src/video/test/variations.js +1 -0
  411. package/src/video/tracks-editor.jsx +4 -5
  412. package/build/form/block.json +0 -65
  413. package/build/form/deprecated.cjs +0 -111
  414. package/build/form/deprecated.cjs.map +0 -7
  415. package/build/form/edit.cjs +0 -180
  416. package/build/form/edit.cjs.map +0 -7
  417. package/build/form/icons.cjs +0 -33
  418. package/build/form/icons.cjs.map +0 -7
  419. package/build/form/index.cjs +0 -118
  420. package/build/form/index.cjs.map +0 -7
  421. package/build/form/init.cjs +0 -28
  422. package/build/form/init.cjs.map +0 -7
  423. package/build/form/save.cjs +0 -40
  424. package/build/form/save.cjs.map +0 -7
  425. package/build/form/utils.cjs +0 -61
  426. package/build/form/utils.cjs.map +0 -7
  427. package/build/form/variations.cjs +0 -152
  428. package/build/form/variations.cjs.map +0 -7
  429. package/build/form/view.cjs +0 -48
  430. package/build/form/view.cjs.map +0 -7
  431. package/build/form-input/block.json +0 -72
  432. package/build/form-input/deprecated.cjs +0 -252
  433. package/build/form-input/deprecated.cjs.map +0 -7
  434. package/build/form-input/edit.cjs +0 -206
  435. package/build/form-input/edit.cjs.map +0 -7
  436. package/build/form-input/icons.cjs +0 -33
  437. package/build/form-input/icons.cjs.map +0 -7
  438. package/build/form-input/index.cjs +0 -63
  439. package/build/form-input/index.cjs.map +0 -7
  440. package/build/form-input/init.cjs +0 -28
  441. package/build/form-input/init.cjs.map +0 -7
  442. package/build/form-input/save.cjs +0 -88
  443. package/build/form-input/save.cjs.map +0 -7
  444. package/build/form-input/variations.cjs +0 -105
  445. package/build/form-input/variations.cjs.map +0 -7
  446. package/build/form-submission-notification/block.json +0 -19
  447. package/build/form-submission-notification/edit.cjs +0 -71
  448. package/build/form-submission-notification/edit.cjs.map +0 -7
  449. package/build/form-submission-notification/index.cjs +0 -73
  450. package/build/form-submission-notification/index.cjs.map +0 -7
  451. package/build/form-submission-notification/init.cjs +0 -28
  452. package/build/form-submission-notification/init.cjs.map +0 -7
  453. package/build/form-submission-notification/save.cjs +0 -54
  454. package/build/form-submission-notification/save.cjs.map +0 -7
  455. package/build/form-submission-notification/variations.cjs +0 -78
  456. package/build/form-submission-notification/variations.cjs.map +0 -7
  457. package/build/form-submit-button/block.json +0 -15
  458. package/build/form-submit-button/edit.cjs +0 -36
  459. package/build/form-submit-button/edit.cjs.map +0 -7
  460. package/build/form-submit-button/index.cjs +0 -75
  461. package/build/form-submit-button/index.cjs.map +0 -7
  462. package/build/form-submit-button/init.cjs.map +0 -7
  463. package/build/form-submit-button/save.cjs +0 -32
  464. package/build/form-submit-button/save.cjs.map +0 -7
  465. package/build/list-item/hooks/use-indent-list-item.cjs +0 -79
  466. package/build/list-item/hooks/use-indent-list-item.cjs.map +0 -7
  467. package/build/list-item/hooks/use-outdent-list-item.cjs +0 -106
  468. package/build/list-item/hooks/use-outdent-list-item.cjs.map +0 -7
  469. package/build/list-item/hooks/use-space.cjs +0 -83
  470. package/build/list-item/hooks/use-space.cjs.map +0 -7
  471. package/build/query/edit/enhanced-pagination-modal.cjs +0 -89
  472. package/build/query/edit/enhanced-pagination-modal.cjs.map +0 -7
  473. package/build-module/form/block.json +0 -65
  474. package/build-module/form/deprecated.mjs +0 -96
  475. package/build-module/form/deprecated.mjs.map +0 -7
  476. package/build-module/form/edit.mjs +0 -170
  477. package/build-module/form/edit.mjs.map +0 -7
  478. package/build-module/form/icons.mjs +0 -8
  479. package/build-module/form/icons.mjs.map +0 -7
  480. package/build-module/form/index.mjs +0 -83
  481. package/build-module/form/index.mjs.map +0 -7
  482. package/build-module/form/init.mjs +0 -7
  483. package/build-module/form/init.mjs.map +0 -7
  484. package/build-module/form/save.mjs +0 -19
  485. package/build-module/form/save.mjs.map +0 -7
  486. package/build-module/form/utils.mjs +0 -35
  487. package/build-module/form/utils.mjs.map +0 -7
  488. package/build-module/form/variations.mjs +0 -134
  489. package/build-module/form/variations.mjs.map +0 -7
  490. package/build-module/form/view.mjs +0 -46
  491. package/build-module/form/view.mjs.map +0 -7
  492. package/build-module/form-input/block.json +0 -72
  493. package/build-module/form-input/deprecated.mjs +0 -226
  494. package/build-module/form-input/deprecated.mjs.map +0 -7
  495. package/build-module/form-input/edit.mjs +0 -186
  496. package/build-module/form-input/edit.mjs.map +0 -7
  497. package/build-module/form-input/icons.mjs +0 -8
  498. package/build-module/form-input/icons.mjs.map +0 -7
  499. package/build-module/form-input/index.mjs +0 -25
  500. package/build-module/form-input/index.mjs.map +0 -7
  501. package/build-module/form-input/init.mjs +0 -7
  502. package/build-module/form-input/init.mjs.map +0 -7
  503. package/build-module/form-input/save.mjs +0 -62
  504. package/build-module/form-input/save.mjs.map +0 -7
  505. package/build-module/form-input/variations.mjs +0 -84
  506. package/build-module/form-input/variations.mjs.map +0 -7
  507. package/build-module/form-submission-notification/block.json +0 -19
  508. package/build-module/form-submission-notification/edit.mjs +0 -45
  509. package/build-module/form-submission-notification/edit.mjs.map +0 -7
  510. package/build-module/form-submission-notification/index.mjs +0 -35
  511. package/build-module/form-submission-notification/index.mjs.map +0 -7
  512. package/build-module/form-submission-notification/init.mjs +0 -7
  513. package/build-module/form-submission-notification/init.mjs.map +0 -7
  514. package/build-module/form-submission-notification/save.mjs +0 -23
  515. package/build-module/form-submission-notification/save.mjs.map +0 -7
  516. package/build-module/form-submission-notification/variations.mjs +0 -57
  517. package/build-module/form-submission-notification/variations.mjs.map +0 -7
  518. package/build-module/form-submit-button/block.json +0 -15
  519. package/build-module/form-submit-button/edit.mjs +0 -15
  520. package/build-module/form-submit-button/edit.mjs.map +0 -7
  521. package/build-module/form-submit-button/index.mjs +0 -37
  522. package/build-module/form-submit-button/index.mjs.map +0 -7
  523. package/build-module/form-submit-button/init.mjs +0 -7
  524. package/build-module/form-submit-button/init.mjs.map +0 -7
  525. package/build-module/form-submit-button/save.mjs +0 -11
  526. package/build-module/form-submit-button/save.mjs.map +0 -7
  527. package/build-module/list-item/hooks/use-indent-list-item.mjs +0 -58
  528. package/build-module/list-item/hooks/use-indent-list-item.mjs.map +0 -7
  529. package/build-module/list-item/hooks/use-outdent-list-item.mjs +0 -85
  530. package/build-module/list-item/hooks/use-outdent-list-item.mjs.map +0 -7
  531. package/build-module/list-item/hooks/use-space.mjs +0 -52
  532. package/build-module/list-item/hooks/use-space.mjs.map +0 -7
  533. package/build-module/query/edit/enhanced-pagination-modal.mjs +0 -72
  534. package/build-module/query/edit/enhanced-pagination-modal.mjs.map +0 -7
  535. package/build-style/form-input/editor-rtl.css +0 -19
  536. package/build-style/form-input/editor.css +0 -19
  537. package/build-style/form-input/style-rtl.css +0 -48
  538. package/build-style/form-input/style.css +0 -48
  539. package/build-style/form-submission-notification/editor-rtl.css +0 -30
  540. package/build-style/form-submission-notification/editor.css +0 -30
  541. package/build-style/form-submit-button/style-rtl.css +0 -3
  542. package/build-style/form-submit-button/style.css +0 -3
  543. package/src/form/README.md +0 -90
  544. package/src/form/block.json +0 -65
  545. package/src/form/deprecated.jsx +0 -93
  546. package/src/form/edit.jsx +0 -169
  547. package/src/form/icons.jsx +0 -7
  548. package/src/form/index.js +0 -91
  549. package/src/form/index.php +0 -197
  550. package/src/form/init.js +0 -3
  551. package/src/form/save.jsx +0 -15
  552. package/src/form/utils.js +0 -36
  553. package/src/form/variations.js +0 -133
  554. package/src/form/view.js +0 -54
  555. package/src/form-input/README.md +0 -74
  556. package/src/form-input/block.json +0 -72
  557. package/src/form-input/deprecated.jsx +0 -248
  558. package/src/form-input/edit.jsx +0 -187
  559. package/src/form-input/editor.scss +0 -24
  560. package/src/form-input/icons.jsx +0 -7
  561. package/src/form-input/index.js +0 -22
  562. package/src/form-input/index.php +0 -47
  563. package/src/form-input/init.js +0 -3
  564. package/src/form-input/save.jsx +0 -89
  565. package/src/form-input/style.scss +0 -64
  566. package/src/form-input/variations.js +0 -82
  567. package/src/form-submission-notification/README.md +0 -50
  568. package/src/form-submission-notification/block.json +0 -19
  569. package/src/form-submission-notification/edit.jsx +0 -44
  570. package/src/form-submission-notification/editor.scss +0 -45
  571. package/src/form-submission-notification/index.js +0 -33
  572. package/src/form-submission-notification/index.php +0 -48
  573. package/src/form-submission-notification/init.js +0 -3
  574. package/src/form-submission-notification/save.jsx +0 -18
  575. package/src/form-submission-notification/variations.js +0 -56
  576. package/src/form-submit-button/README.md +0 -54
  577. package/src/form-submit-button/block.json +0 -15
  578. package/src/form-submit-button/edit.jsx +0 -12
  579. package/src/form-submit-button/index.js +0 -35
  580. package/src/form-submit-button/init.js +0 -3
  581. package/src/form-submit-button/save.jsx +0 -10
  582. package/src/form-submit-button/style.scss +0 -3
  583. package/src/list-item/hooks/use-indent-list-item.js +0 -73
  584. package/src/list-item/hooks/use-outdent-list-item.js +0 -100
  585. package/src/list-item/hooks/use-space.js +0 -66
  586. package/src/query/edit/enhanced-pagination-modal.jsx +0 -77
  587. /package/src/utils/test/{waveform-player.jsx → waveform-player.jsdom.test.jsx} +0 -0
  588. /package/src/utils/test/{waveform-utils.js → waveform-utils.jsdom.test.js} +0 -0
@@ -7,6 +7,11 @@ import { __unstableStripHTML as stripHTML } from '@wordpress/dom';
7
7
  import { useRegistry, useSelect } from '@wordpress/data';
8
8
  import { useCallback, useEffect, useRef } from '@wordpress/element';
9
9
  import { unlock } from '../lock-unlock';
10
+ import {
11
+ DEFAULT_MEDIA_SIZE_SLUG,
12
+ LINK_DESTINATION_ATTACHMENT,
13
+ LINK_DESTINATION_MEDIA,
14
+ } from './constants';
10
15
 
11
16
  function normalizeImageBlockCaption( caption ) {
12
17
  if ( typeof caption !== 'string' ) {
@@ -96,6 +101,107 @@ export function getSyncedImageBlockAttributes(
96
101
  return syncedAttributes;
97
102
  }
98
103
 
104
+ /**
105
+ * Resolves the attributes needed to keep the selected image size on a new
106
+ * attachment.
107
+ *
108
+ * WordPress skips generating a sub-size larger than the file itself, so the
109
+ * selected size may not exist on the edited image; fall back to full when it
110
+ * doesn't.
111
+ *
112
+ * @param {string|undefined} sizeSlug The block's currently selected size.
113
+ * @param {Object} attachment The new attachment record.
114
+ *
115
+ * @return {Object|undefined} Attributes to apply, if any.
116
+ */
117
+ function getNewAttachmentSizeAttributes( sizeSlug, attachment ) {
118
+ const sizes = attachment.media_details?.sizes;
119
+
120
+ if ( ! sizeSlug || sizeSlug === DEFAULT_MEDIA_SIZE_SLUG || ! sizes ) {
121
+ return undefined;
122
+ }
123
+
124
+ const sizeUrl = sizes[ sizeSlug ]?.source_url;
125
+
126
+ if ( sizeUrl ) {
127
+ return { url: sizeUrl };
128
+ }
129
+
130
+ const fullUrl = attachment.source_url ?? sizes.full?.source_url;
131
+
132
+ return fullUrl
133
+ ? { url: fullUrl, sizeSlug: DEFAULT_MEDIA_SIZE_SLUG }
134
+ : undefined;
135
+ }
136
+
137
+ /**
138
+ * Resolves the link attributes needed to keep the block's link pointing at the
139
+ * new attachment.
140
+ *
141
+ * Only the destinations derived from the attachment follow the edited image. A
142
+ * `custom` link is the user's own URL and a `none` link has nothing to point
143
+ * at, so both are left alone. When the record doesn't carry the field, the
144
+ * existing link is kept rather than cleared.
145
+ *
146
+ * @param {string|undefined} linkDestination The block's link destination.
147
+ * @param {Object} attachment The new attachment record.
148
+ *
149
+ * @return {Object|undefined} Attributes to apply, if any.
150
+ */
151
+ function getNewAttachmentLinkAttributes( linkDestination, attachment ) {
152
+ // Media file links point at the full-size file, independently of the size
153
+ // the block renders.
154
+ if ( linkDestination === LINK_DESTINATION_MEDIA ) {
155
+ return attachment.source_url
156
+ ? { href: attachment.source_url }
157
+ : undefined;
158
+ }
159
+
160
+ if ( linkDestination === LINK_DESTINATION_ATTACHMENT ) {
161
+ return attachment.link ? { href: attachment.link } : undefined;
162
+ }
163
+
164
+ return undefined;
165
+ }
166
+
167
+ /**
168
+ * Resolves the block attributes that are derived from the attachment, for an
169
+ * edit that saved to a different one.
170
+ *
171
+ * Editing media (crop, rotate, flip) creates a new attachment with its own
172
+ * generated sub-sizes and its own attachment page, and the media editor
173
+ * reports the full-size file. Without re-deriving these, the size control
174
+ * keeps reporting e.g. "Medium" while the block renders the full-size image,
175
+ * and a "Media file" or "Attachment page" link still points at the image as it
176
+ * was before the edit. Everything else the user set on the block — dimensions,
177
+ * lightbox, title, custom links — is left untouched.
178
+ *
179
+ * @param {Object} blockAttributes The block's current attributes.
180
+ * @param {Object|undefined} attachment The new attachment record.
181
+ *
182
+ * @return {Object|undefined} Attributes to apply, or undefined when the
183
+ * attachment record isn't known yet.
184
+ */
185
+ export function getNewAttachmentImageBlockAttributes(
186
+ blockAttributes,
187
+ attachment
188
+ ) {
189
+ if ( ! attachment ) {
190
+ return undefined;
191
+ }
192
+
193
+ return {
194
+ ...getNewAttachmentSizeAttributes(
195
+ blockAttributes.sizeSlug,
196
+ attachment
197
+ ),
198
+ ...getNewAttachmentLinkAttributes(
199
+ blockAttributes.linkDestination,
200
+ attachment
201
+ ),
202
+ };
203
+ }
204
+
99
205
  const { openMediaEditorModalKey } = unlock( blockEditorPrivateApis );
100
206
 
101
207
  function getAttachmentFallbackForEmptyBlockMetadata( { alt, caption } ) {
@@ -134,8 +240,10 @@ export function useOpenImageMediaEditorModal( {
134
240
  } ) {
135
241
  // Keep this hook private to the Image block and pass the block attributes
136
242
  // object so the callsite stays compact. Destructure only the attributes
137
- // currently used for metadata sync; add more here if the sync policy grows.
138
- const { id, url, alt, caption } = attributes;
243
+ // the update needs to read those synced from the attachment's metadata,
244
+ // and those derived from which attachment the block points at; add more
245
+ // here if the sync policy grows.
246
+ const { id, url, alt, caption, sizeSlug, linkDestination } = attributes;
139
247
  const registry = useRegistry();
140
248
  const openMediaEditorModal = useSelect(
141
249
  ( select ) =>
@@ -151,6 +259,8 @@ export function useOpenImageMediaEditorModal( {
151
259
  url,
152
260
  alt,
153
261
  caption: caption?.toString(),
262
+ sizeSlug,
263
+ linkDestination,
154
264
  } );
155
265
  // Snapshot of the attachment's metadata taken just before the modal opens,
156
266
  // used as the baseline for detecting what changed during the editing session.
@@ -165,8 +275,10 @@ export function useOpenImageMediaEditorModal( {
165
275
  url,
166
276
  alt,
167
277
  caption: caption?.toString(),
278
+ sizeSlug,
279
+ linkDestination,
168
280
  };
169
- }, [ alt, caption, id, url ] );
281
+ }, [ alt, caption, id, linkDestination, sizeSlug, url ] );
170
282
 
171
283
  // Reads the cached attachment record. The `attachment` postType entity
172
284
  // fetches with `context: 'edit'` by default, so `getEditedEntityRecord`
@@ -236,14 +348,19 @@ export function useOpenImageMediaEditorModal( {
236
348
  const nextAttributes = {};
237
349
 
238
350
  const currentBlockAttributes = blockAttributesRef.current;
351
+ const isNewAttachment = newId !== currentBlockAttributes.id;
239
352
 
240
- if ( newId !== currentBlockAttributes.id ) {
353
+ if ( isNewAttachment ) {
241
354
  nextAttributes.id = newId;
242
355
  nextAttributes.url = newUrl ?? currentBlockAttributes.url;
243
356
  if ( nextAttributes.url !== currentBlockAttributes.url ) {
244
357
  // The block is about to point at a freshly generated file
245
358
  // the browser hasn't loaded yet; let the caller show a
246
- // loading state until its <img> fires load/error.
359
+ // loading state until its <img> fires load/error. Raising
360
+ // it here, before anything is awaited, keeps the rest of
361
+ // this update behind that loading state: the attributes
362
+ // land in a single `setAttributes` at the end, so the
363
+ // image never renders against half-updated settings.
247
364
  onUrlChange?.( nextAttributes.url );
248
365
  }
249
366
  blockAttributesRef.current = {
@@ -253,10 +370,9 @@ export function useOpenImageMediaEditorModal( {
253
370
  };
254
371
  }
255
372
 
256
- if ( originalAttachment ) {
257
- // Fetch fresh server state so the comparison reflects what
258
- // the media editor actually saved, not a potentially stale
259
- // cache.
373
+ if ( originalAttachment || isNewAttachment ) {
374
+ // Fetch fresh server state so this reflects what the media
375
+ // editor actually saved, not a potentially stale cache.
260
376
  const resolvedAttachment =
261
377
  await resolveFreshAttachmentRecord( newId );
262
378
 
@@ -268,21 +384,63 @@ export function useOpenImageMediaEditorModal( {
268
384
  return;
269
385
  }
270
386
 
387
+ // A failed refetch returns nothing, which would leave the
388
+ // block pointing at the new file while its size and link
389
+ // still describe the old one. The record the media editor
390
+ // received when it saved is already in the store, so fall
391
+ // back to that rather than half-updating the block.
392
+ const attachmentRecord =
393
+ resolvedAttachment ?? getCachedAttachmentRecord( newId );
394
+
395
+ const latestBlockAttributes = blockAttributesRef.current;
396
+
271
397
  // Sync alt text and caption back to the block only when
272
398
  // they were changed in the media editor. Fields the user
273
399
  // has independently customised on the block (i.e. values
274
400
  // that don't match the pre-session attachment metadata)
275
- // are left untouched.
276
- const latestBlockAttributes = blockAttributesRef.current;
277
- const resolvedMetadataAttributes =
278
- getSyncedImageBlockAttributes(
279
- latestBlockAttributes,
280
- originalAttachment,
281
- resolvedAttachment
282
- );
283
-
284
- if ( Object.keys( resolvedMetadataAttributes ).length ) {
285
- Object.assign( nextAttributes, resolvedMetadataAttributes );
401
+ // are left untouched. Without a baseline there's no way to
402
+ // tell the two apart, so nothing is synced.
403
+ if ( originalAttachment ) {
404
+ const resolvedMetadataAttributes =
405
+ getSyncedImageBlockAttributes(
406
+ latestBlockAttributes,
407
+ originalAttachment,
408
+ attachmentRecord
409
+ );
410
+
411
+ if ( Object.keys( resolvedMetadataAttributes ).length ) {
412
+ Object.assign(
413
+ nextAttributes,
414
+ resolvedMetadataAttributes
415
+ );
416
+ }
417
+ }
418
+
419
+ if ( isNewAttachment ) {
420
+ const derivedAttributes =
421
+ getNewAttachmentImageBlockAttributes(
422
+ latestBlockAttributes,
423
+ attachmentRecord
424
+ );
425
+
426
+ if ( derivedAttributes ) {
427
+ Object.assign( nextAttributes, derivedAttributes );
428
+
429
+ // The URL announced before the resolve was the
430
+ // full-size file the media editor reported, and
431
+ // deriving the selected size can change it.
432
+ // Re-announce so the pending swap names the file
433
+ // that actually lands: an update that is undone or
434
+ // superseded never changes the <img> src, and the
435
+ // block then clears its loading state by matching
436
+ // the pending URL against the rendered one.
437
+ if (
438
+ derivedAttributes.url &&
439
+ derivedAttributes.url !== latestBlockAttributes.url
440
+ ) {
441
+ onUrlChange?.( derivedAttributes.url );
442
+ }
443
+ }
286
444
  }
287
445
  }
288
446
 
@@ -294,7 +452,12 @@ export function useOpenImageMediaEditorModal( {
294
452
  setAttributes( nextAttributes );
295
453
  }
296
454
  },
297
- [ onUrlChange, resolveFreshAttachmentRecord, setAttributes ]
455
+ [
456
+ getCachedAttachmentRecord,
457
+ onUrlChange,
458
+ resolveFreshAttachmentRecord,
459
+ setAttributes,
460
+ ]
298
461
  );
299
462
 
300
463
  const openImageMediaEditorModal = useCallback( async () => {
package/src/index.jsx CHANGED
@@ -49,10 +49,6 @@ import * as cover from './cover';
49
49
  import * as details from './details';
50
50
  import * as embed from './embed';
51
51
  import * as file from './file';
52
- import * as form from './form';
53
- import * as formInput from './form-input';
54
- import * as formSubmitButton from './form-submit-button';
55
- import * as formSubmissionNotification from './form-submission-notification';
56
52
  import * as gallery from './gallery';
57
53
  import * as group from './group';
58
54
  import * as heading from './heading';
@@ -267,13 +263,6 @@ const getAllBlocks = () => {
267
263
  breadcrumbs,
268
264
  ];
269
265
 
270
- if ( window?.__experimentalEnableFormBlocks ) {
271
- blocks.push( form );
272
- blocks.push( formInput );
273
- blocks.push( formSubmitButton );
274
- blocks.push( formSubmissionNotification );
275
- }
276
-
277
266
  if ( window?.__experimentalEnableBlockExperiments ) {
278
267
  // Blocks added here are only registered when the "Block experiments"
279
268
  // option is enabled in the Gutenberg > Experiments settings page.
@@ -164,7 +164,7 @@ function Controls( { attributes, setAttributes } ) {
164
164
  return;
165
165
  }
166
166
  // Categories that are already will be objects, while new additions will be strings (the name).
167
- // allCategories nomalizes the array so that they are all objects.
167
+ // allCategories normalizes the array so that they are all objects.
168
168
  const allCategories = tokens.map( ( token ) => {
169
169
  return typeof token === 'string'
170
170
  ? categorySuggestions[ token ]
@@ -1,3 +1,4 @@
1
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
1
2
  // Load block support registration filters.
2
3
  import '@wordpress/block-editor';
3
4
  import {
@@ -15,7 +15,7 @@
15
15
  * @see https://github.com/WordPress/gutenberg/issues/12420
16
16
  *
17
17
  * @param array $attributes Attributes of the block being rendered.
18
- * @param string $content Content of the block being rendered.
18
+ * @param string $content Content of the block being rendered.
19
19
  *
20
20
  * @return string The content of the block being rendered.
21
21
  */
@@ -6,5 +6,5 @@ ul {
6
6
  }
7
7
 
8
8
  :root :where(.wp-block-list.has-background) {
9
- padding: $block-bg-padding--v $block-bg-padding--h;
9
+ padding: $block-bg-padding;
10
10
  }
@@ -14,29 +14,24 @@ import {
14
14
  formatIndent,
15
15
  } from '@wordpress/icons';
16
16
  import { useMergeRefs } from '@wordpress/compose';
17
- import { useSelect } from '@wordpress/data';
17
+ import { useSelect, useRegistry } from '@wordpress/data';
18
18
  import { displayShortcut } from '@wordpress/keycodes';
19
+ import { useEnter, useTab, useMultiSelectTab, useMerge } from './hooks';
19
20
  import {
20
- useEnter,
21
- useSpace,
22
- useIndentListItem,
23
- useOutdentListItem,
24
- useMerge,
25
- } from './hooks';
21
+ indentListItems,
22
+ outdentListItems,
23
+ getIndentTarget,
24
+ getOutdentTarget,
25
+ } from './utils';
26
26
 
27
27
  export function IndentUI( { clientId } ) {
28
- const indentListItem = useIndentListItem( clientId );
29
- const outdentListItem = useOutdentListItem();
28
+ const registry = useRegistry();
30
29
  const { canIndent, canOutdent } = useSelect(
31
30
  ( select ) => {
32
- const { getBlockIndex, getBlockRootClientId, getBlockName } =
33
- select( blockEditorStore );
31
+ const storeSelect = select( blockEditorStore );
34
32
  return {
35
- canIndent: getBlockIndex( clientId ) > 0,
36
- canOutdent:
37
- getBlockName(
38
- getBlockRootClientId( getBlockRootClientId( clientId ) )
39
- ) === 'core/list-item',
33
+ canIndent: !! getIndentTarget( storeSelect, clientId ),
34
+ canOutdent: !! getOutdentTarget( storeSelect, clientId ),
40
35
  };
41
36
  },
42
37
  [ clientId ]
@@ -50,7 +45,7 @@ export function IndentUI( { clientId } ) {
50
45
  shortcut={ displayShortcut.shift( 'Tab' ) }
51
46
  description={ __( 'Outdent list item' ) }
52
47
  disabled={ ! canOutdent }
53
- onClick={ () => outdentListItem() }
48
+ onClick={ () => outdentListItems( registry ) }
54
49
  />
55
50
  <ToolbarButton
56
51
  icon={ isRTL() ? formatIndentRTL : formatIndent }
@@ -58,7 +53,7 @@ export function IndentUI( { clientId } ) {
58
53
  shortcut="Tab"
59
54
  description={ __( 'Indent list item' ) }
60
55
  disabled={ ! canIndent }
61
- onClick={ () => indentListItem() }
56
+ onClick={ () => indentListItems( registry, clientId ) }
62
57
  />
63
58
  </>
64
59
  );
@@ -77,13 +72,18 @@ export default function ListItemEdit( {
77
72
  __unstableDisableDropZone: true,
78
73
  } );
79
74
  const useEnterRef = useEnter( clientId );
80
- const useSpaceRef = useSpace( clientId );
75
+ const useTabRef = useTab();
76
+ const useMultiSelectTabRef = useMultiSelectTab( clientId );
81
77
  const onMerge = useMerge( clientId, mergeBlocks );
82
78
  return (
83
79
  <>
84
80
  <li { ...innerBlocksProps }>
85
81
  <RichText
86
- ref={ useMergeRefs( [ useEnterRef, useSpaceRef ] ) }
82
+ ref={ useMergeRefs( [
83
+ useEnterRef,
84
+ useTabRef,
85
+ useMultiSelectTabRef,
86
+ ] ) }
87
87
  identifier="content"
88
88
  tagName="div"
89
89
  onChange={ ( nextContent ) =>
@@ -1,5 +1,4 @@
1
- export { default as useOutdentListItem } from './use-outdent-list-item';
2
- export { default as useIndentListItem } from './use-indent-list-item';
3
1
  export { default as useEnter } from './use-enter';
4
- export { default as useSpace } from './use-space';
2
+ export { default as useTab } from './use-tab';
3
+ export { default as useMultiSelectTab } from './use-multi-select-tab';
5
4
  export { default as useMerge } from './use-merge';
@@ -5,82 +5,94 @@ import {
5
5
  } from '@wordpress/blocks';
6
6
  import { useRefEffect } from '@wordpress/compose';
7
7
  import { privateApis as richTextPrivateApis } from '@wordpress/rich-text';
8
- import { ENTER } from '@wordpress/keycodes';
9
- import { useSelect, useDispatch } from '@wordpress/data';
8
+ import { useRegistry } from '@wordpress/data';
10
9
  import { store as blockEditorStore } from '@wordpress/block-editor';
11
- import useOutdentListItem from './use-outdent-list-item';
10
+ import { outdentListItems, getOutdentTarget } from '../utils';
12
11
  import { unlock } from '../../lock-unlock';
13
12
 
14
13
  const { subscribeOwnedListener } = unlock( richTextPrivateApis );
15
14
 
16
15
  export default function useEnter( clientId ) {
17
- const { replaceBlocks, selectionChange } = useDispatch( blockEditorStore );
18
- const {
19
- getBlock,
20
- getBlockAttributes,
21
- getBlockRootClientId,
22
- getBlockIndex,
23
- getBlockName,
24
- } = useSelect( blockEditorStore );
25
- const outdentListItem = useOutdentListItem();
26
- return useRefEffect( ( element ) => {
27
- function onKeyDown( event ) {
28
- if ( event.defaultPrevented || event.keyCode !== ENTER ) {
29
- return;
30
- }
31
- const { content } = getBlockAttributes( clientId ) ?? {};
32
- if ( content?.length ) {
33
- return;
34
- }
35
- event.preventDefault();
36
- const canOutdent =
37
- getBlockName(
38
- getBlockRootClientId( getBlockRootClientId( clientId ) )
39
- ) === 'core/list-item';
40
- if ( canOutdent ) {
41
- outdentListItem();
42
- return;
16
+ const registry = useRegistry();
17
+ return useRefEffect(
18
+ ( element ) => {
19
+ function onBeforeInput( event ) {
20
+ if (
21
+ event.defaultPrevented ||
22
+ event.inputType !== 'insertParagraph'
23
+ ) {
24
+ return;
25
+ }
26
+ const select = registry.select( blockEditorStore );
27
+ const {
28
+ getBlock,
29
+ getBlockAttributes,
30
+ getBlockRootClientId,
31
+ getBlockIndex,
32
+ } = select;
33
+ const { replaceBlocks, selectionChange } =
34
+ registry.dispatch( blockEditorStore );
35
+
36
+ const { content } = getBlockAttributes( clientId ) ?? {};
37
+ if ( content?.length ) {
38
+ return;
39
+ }
40
+ event.preventDefault();
41
+ const canOutdent = !! getOutdentTarget( select, clientId );
42
+ if ( canOutdent ) {
43
+ outdentListItems( registry );
44
+ return;
45
+ }
46
+ // Here we are in top level list so we need to split.
47
+ const topParentListBlock = getBlock(
48
+ getBlockRootClientId( clientId )
49
+ );
50
+ const blockIndex = getBlockIndex( clientId );
51
+ const head = cloneBlock( {
52
+ ...topParentListBlock,
53
+ innerBlocks: topParentListBlock.innerBlocks.slice(
54
+ 0,
55
+ blockIndex
56
+ ),
57
+ } );
58
+ const middle = createBlock( getDefaultBlockName() );
59
+ // Last list item might contain a `list` block innerBlock
60
+ // In that case append remaining innerBlocks blocks.
61
+ const after = [
62
+ ...( topParentListBlock.innerBlocks[ blockIndex ]
63
+ .innerBlocks[ 0 ]?.innerBlocks || [] ),
64
+ ...topParentListBlock.innerBlocks.slice( blockIndex + 1 ),
65
+ ];
66
+ const tail = after.length
67
+ ? [
68
+ cloneBlock( {
69
+ ...topParentListBlock,
70
+ innerBlocks: after,
71
+ } ),
72
+ ]
73
+ : [];
74
+ replaceBlocks(
75
+ topParentListBlock.clientId,
76
+ [ head, middle, ...tail ],
77
+ 1
78
+ );
79
+ // We manually change the selection here because we are replacing
80
+ // a different block than the selected one.
81
+ selectionChange( middle.clientId );
43
82
  }
44
- // Here we are in top level list so we need to split.
45
- const topParentListBlock = getBlock(
46
- getBlockRootClientId( clientId )
47
- );
48
- const blockIndex = getBlockIndex( clientId );
49
- const head = cloneBlock( {
50
- ...topParentListBlock,
51
- innerBlocks: topParentListBlock.innerBlocks.slice(
52
- 0,
53
- blockIndex
54
- ),
55
- } );
56
- const middle = createBlock( getDefaultBlockName() );
57
- // Last list item might contain a `list` block innerBlock
58
- // In that case append remaining innerBlocks blocks.
59
- const after = [
60
- ...( topParentListBlock.innerBlocks[ blockIndex ]
61
- .innerBlocks[ 0 ]?.innerBlocks || [] ),
62
- ...topParentListBlock.innerBlocks.slice( blockIndex + 1 ),
63
- ];
64
- const tail = after.length
65
- ? [
66
- cloneBlock( {
67
- ...topParentListBlock,
68
- innerBlocks: after,
69
- } ),
70
- ]
71
- : [];
72
- replaceBlocks(
73
- topParentListBlock.clientId,
74
- [ head, middle, ...tail ],
75
- 1
76
- );
77
- // We manually change the selection here because we are replacing
78
- // a different block than the selected one.
79
- selectionChange( middle.clientId );
80
- }
81
83
 
82
- // Capture phase so we run before writing-flow's ancestor-bubble
83
- // keydown handlers that gate on `event.defaultPrevented`.
84
- return subscribeOwnedListener( element, 'keydown', onKeyDown, true );
85
- }, [] );
84
+ // Enter is handled on beforeinput: moving focus while the
85
+ // keydown is still being handled leaves the iOS keyboard's
86
+ // auto-capitalization stale. Capture phase so we run before
87
+ // writing-flow's ancestor-bubble handler that gates on
88
+ // `event.defaultPrevented`.
89
+ return subscribeOwnedListener(
90
+ element,
91
+ 'beforeinput',
92
+ onBeforeInput,
93
+ true
94
+ );
95
+ },
96
+ [ clientId, registry ]
97
+ );
86
98
  }