@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
@@ -1,46 +1,35 @@
1
- import { useRegistry, useDispatch, useSelect } from '@wordpress/data';
1
+ import { useRegistry } from '@wordpress/data';
2
2
  import { store as blockEditorStore } from '@wordpress/block-editor';
3
3
  import { isUnmodifiedBlock, switchToBlockType } from '@wordpress/blocks';
4
- import useOutdentListItem from './use-outdent-list-item';
4
+ import { outdentListItems, getOutdentTarget } from '../utils';
5
5
 
6
6
  export default function useMerge( clientId, onMerge ) {
7
7
  const registry = useRegistry();
8
- const {
9
- getPreviousBlockClientId,
10
- getNextBlockClientId,
11
- getBlockOrder,
12
- getBlockIndex,
13
- getBlockRootClientId,
14
- getBlockName,
15
- getBlock,
16
- } = useSelect( blockEditorStore );
17
- const { mergeBlocks, moveBlocksToPosition, removeBlock, insertBlocks } =
18
- useDispatch( blockEditorStore );
19
- const outdentListItem = useOutdentListItem();
20
8
 
21
- function getTrailingId( id ) {
22
- const order = getBlockOrder( id );
9
+ return ( forward ) => {
10
+ const select = registry.select( blockEditorStore );
11
+ const {
12
+ getPreviousBlockClientId,
13
+ getNextBlockClientId,
14
+ getBlockOrder,
15
+ getBlockIndex,
16
+ getBlockRootClientId,
17
+ getBlockName,
18
+ getBlock,
19
+ } = select;
20
+ const { mergeBlocks, moveBlocksToPosition, removeBlock, insertBlocks } =
21
+ registry.dispatch( blockEditorStore );
23
22
 
24
- if ( ! order.length ) {
25
- return id;
26
- }
23
+ function getTrailingId( id ) {
24
+ const order = getBlockOrder( id );
27
25
 
28
- return getTrailingId( order[ order.length - 1 ] );
29
- }
26
+ if ( ! order.length ) {
27
+ return id;
28
+ }
30
29
 
31
- function getParentListItemId( id ) {
32
- const listId = getBlockRootClientId( id );
33
- const parentListItemId = getBlockRootClientId( listId );
34
- if ( ! parentListItemId ) {
35
- return;
30
+ return getTrailingId( order[ order.length - 1 ] );
36
31
  }
37
- if ( getBlockName( parentListItemId ) !== 'core/list-item' ) {
38
- return;
39
- }
40
- return parentListItemId;
41
- }
42
32
 
43
- return ( forward ) => {
44
33
  function mergeWithNested( clientIdA, clientIdB ) {
45
34
  registry.batch( () => {
46
35
  // When merging a sub list item with a higher next list item, we
@@ -62,7 +51,7 @@ export default function useMerge( clientId, onMerge ) {
62
51
  clientIdA
63
52
  );
64
53
  } else if (
65
- getParentListItemId( clientIdB ) === clientIdA
54
+ getOutdentTarget( select, clientIdB ) === clientIdA
66
55
  ) {
67
56
  // Merging into the parent item's own line: the
68
57
  // children take the item's place in its list, one
@@ -104,7 +93,7 @@ export default function useMerge( clientId, onMerge ) {
104
93
  while (
105
94
  ! ( nextBlockClientId = getNextBlockClientId( listItemId ) )
106
95
  ) {
107
- const parentLi = getParentListItemId( listItemId );
96
+ const parentLi = getOutdentTarget( select, listItemId );
108
97
  if ( ! parentLi ) {
109
98
  break;
110
99
  }
@@ -158,7 +147,7 @@ export default function useMerge( clientId, onMerge ) {
158
147
  mergeWithNested( trailingId, clientId );
159
148
  return;
160
149
  }
161
- const parentListItemId = getParentListItemId( clientId );
150
+ const parentListItemId = getOutdentTarget( select, clientId );
162
151
  if ( parentListItemId ) {
163
152
  mergeWithNested( parentListItemId, clientId );
164
153
  return;
@@ -170,7 +159,10 @@ export default function useMerge( clientId, onMerge ) {
170
159
  blockOrder.length > 0
171
160
  ) {
172
161
  registry.batch( () => {
173
- outdentListItem( getBlockOrder( blockOrder[ 0 ] ) );
162
+ outdentListItems(
163
+ registry,
164
+ getBlockOrder( blockOrder[ 0 ] )
165
+ );
174
166
  removeBlock( clientId, true );
175
167
  } );
176
168
  } else {
@@ -0,0 +1,83 @@
1
+ import { useRefEffect } from '@wordpress/compose';
2
+ import { TAB } from '@wordpress/keycodes';
3
+ import { store as blockEditorStore } from '@wordpress/block-editor';
4
+ import { useSelect, useRegistry } from '@wordpress/data';
5
+ import { indentListItems, outdentListItems } from '../utils';
6
+
7
+ export default function useMultiSelectTab( clientId ) {
8
+ const registry = useRegistry();
9
+ // Only the first item of an all-list-item multi selection attaches the
10
+ // listener, so there is a single handler regardless of how many list items
11
+ // are rendered, and only while such a selection exists.
12
+ const isActive = useSelect(
13
+ ( select ) => {
14
+ const {
15
+ hasMultiSelection,
16
+ getMultiSelectedBlockClientIds,
17
+ getBlockName,
18
+ } = select( blockEditorStore );
19
+ if ( ! hasMultiSelection() ) {
20
+ return false;
21
+ }
22
+ const clientIds = getMultiSelectedBlockClientIds();
23
+ return (
24
+ clientIds[ 0 ] === clientId &&
25
+ clientIds.every(
26
+ ( id ) => getBlockName( id ) === 'core/list-item'
27
+ )
28
+ );
29
+ },
30
+ [ clientId ]
31
+ );
32
+
33
+ return useRefEffect(
34
+ ( element ) => {
35
+ if ( ! isActive ) {
36
+ return;
37
+ }
38
+
39
+ function onKeyDown( event ) {
40
+ const { keyCode, shiftKey, altKey, metaKey, ctrlKey } = event;
41
+
42
+ if (
43
+ keyCode !== TAB ||
44
+ event.defaultPrevented ||
45
+ altKey ||
46
+ metaKey ||
47
+ ctrlKey
48
+ ) {
49
+ return;
50
+ }
51
+
52
+ // The listener is on the document, so it also sees a Tab from
53
+ // other editor UI while the multi selection lingers (moving
54
+ // focus does not clear it). A multi selection keeps focus on the
55
+ // canvas host that wraps the blocks, so only act when the key
56
+ // comes from an ancestor of them, not from a toolbar or panel.
57
+ if ( ! event.target.contains( element ) ) {
58
+ return;
59
+ }
60
+
61
+ if ( shiftKey ) {
62
+ if ( outdentListItems( registry ) ) {
63
+ event.preventDefault();
64
+ }
65
+ } else if ( indentListItems( registry ) ) {
66
+ event.preventDefault();
67
+ }
68
+ }
69
+
70
+ // During a multi selection focus sits on the writing flow
71
+ // container, not inside any item, so an element listener never sees
72
+ // the key. Listen on the document. Capture phase so we run before
73
+ // writing-flow's keydown handlers, which gate on
74
+ // `event.defaultPrevented`.
75
+ const { ownerDocument } = element;
76
+ ownerDocument.addEventListener( 'keydown', onKeyDown, true );
77
+ return () => {
78
+ ownerDocument.removeEventListener( 'keydown', onKeyDown, true );
79
+ };
80
+ },
81
+ [ isActive, registry ]
82
+ );
83
+ }
@@ -0,0 +1,62 @@
1
+ import { useRefEffect } from '@wordpress/compose';
2
+ import { privateApis as richTextPrivateApis } from '@wordpress/rich-text';
3
+ import { SPACE, TAB } from '@wordpress/keycodes';
4
+ import { store as blockEditorStore } from '@wordpress/block-editor';
5
+ import { useRegistry } from '@wordpress/data';
6
+ import { isEntirelySelected } from '@wordpress/dom';
7
+ import { indentListItems, outdentListItems } from '../utils';
8
+ import { unlock } from '../../lock-unlock';
9
+
10
+ const { subscribeOwnedListener } = unlock( richTextPrivateApis );
11
+
12
+ export default function useTab() {
13
+ const registry = useRegistry();
14
+
15
+ return useRefEffect(
16
+ ( element ) => {
17
+ function onKeyDown( event ) {
18
+ const { keyCode, shiftKey, altKey, metaKey, ctrlKey } = event;
19
+
20
+ if (
21
+ event.defaultPrevented ||
22
+ ( keyCode !== SPACE && keyCode !== TAB ) ||
23
+ // Shift selects outdent; other modifiers pass through.
24
+ altKey ||
25
+ metaKey ||
26
+ ctrlKey
27
+ ) {
28
+ return;
29
+ }
30
+
31
+ const { getSelectionStart, getSelectionEnd } =
32
+ registry.select( blockEditorStore );
33
+ const isAtStart =
34
+ getSelectionStart().offset === 0 &&
35
+ getSelectionEnd().offset === 0;
36
+
37
+ // Both keys act at the start of an item; Tab also acts on a
38
+ // full selection.
39
+ if (
40
+ ! isAtStart &&
41
+ ! ( keyCode === TAB && isEntirelySelected( element ) )
42
+ ) {
43
+ return;
44
+ }
45
+ const move = shiftKey ? outdentListItems : indentListItems;
46
+ if ( move( registry ) ) {
47
+ event.preventDefault();
48
+ }
49
+ }
50
+
51
+ // Capture phase so we run before writing-flow's ancestor-bubble
52
+ // keydown handlers that gate on `event.defaultPrevented`.
53
+ return subscribeOwnedListener(
54
+ element,
55
+ 'keydown',
56
+ onKeyDown,
57
+ true
58
+ );
59
+ },
60
+ [ registry ]
61
+ );
62
+ }
@@ -1,7 +1,5 @@
1
- import { __ } from '@wordpress/i18n';
2
1
  import { listItem as icon } from '@wordpress/icons';
3
2
  import { privateApis } from '@wordpress/block-editor';
4
- import { privateApis as blocksPrivateApis } from '@wordpress/blocks';
5
3
  import initBlock from '../utils/init-block';
6
4
  import metadata from './block.json';
7
5
  import edit from './edit';
@@ -9,8 +7,6 @@ import save from './save';
9
7
  import transforms from './transforms';
10
8
  import { unlock } from '../lock-unlock';
11
9
 
12
- const { fieldsKey, formKey } = unlock( blocksPrivateApis );
13
-
14
10
  const { name } = metadata;
15
11
 
16
12
  export { metadata, name };
@@ -45,18 +41,4 @@ export const settings = {
45
41
  },
46
42
  };
47
43
 
48
- if ( window.__experimentalContentOnlyInspectorFields ) {
49
- settings[ fieldsKey ] = [
50
- {
51
- id: 'content',
52
- label: __( 'Content' ),
53
- type: 'text',
54
- Edit: 'rich-text', // TODO: replace with custom component
55
- },
56
- ];
57
- settings[ formKey ] = {
58
- fields: [ 'content' ],
59
- };
60
- }
61
-
62
44
  export const init = () => initBlock( { name, metadata, settings } );
@@ -0,0 +1,236 @@
1
+ import { store as blockEditorStore } from '@wordpress/block-editor';
2
+ import { cloneBlock } from '@wordpress/blocks';
3
+
4
+ /**
5
+ * The previous sibling to nest a list item under when indenting, or undefined
6
+ * for the first item, which has no sibling to nest under.
7
+ *
8
+ * @param {Object} select The block editor store's selectors.
9
+ * @param {string} clientId The list item's client ID.
10
+ *
11
+ * @return {string|undefined} The client ID to nest the item under.
12
+ */
13
+ export function getIndentTarget( select, clientId ) {
14
+ return select.getPreviousBlockClientId( clientId );
15
+ }
16
+
17
+ /**
18
+ * The ancestor list item the given item's list is nested in when outdenting, or
19
+ * undefined at the top level, where there is nothing to outdent to.
20
+ *
21
+ * @param {Object} select The block editor store's selectors.
22
+ * @param {string} clientId The list item's client ID.
23
+ *
24
+ * @return {string|undefined} The ancestor list item's client ID.
25
+ */
26
+ export function getOutdentTarget( select, clientId ) {
27
+ const listId = select.getBlockRootClientId( clientId );
28
+ const parentListItemId = select.getBlockRootClientId( listId );
29
+ if (
30
+ ! parentListItemId ||
31
+ select.getBlockName( parentListItemId ) !== 'core/list-item'
32
+ ) {
33
+ return undefined;
34
+ }
35
+ return parentListItemId;
36
+ }
37
+
38
+ /**
39
+ * Moves blocks into a list item's nested list, keeping their client IDs. If the
40
+ * list item has no nested list yet, one is created from the source list so it
41
+ * inherits its attributes.
42
+ *
43
+ * @param {Object} registry The data registry.
44
+ * @param {string[]} clientIds The blocks to move.
45
+ * @param {string} sourceListId The list the blocks currently live in, also
46
+ * cloned when a nested list has to be created.
47
+ * @param {string} listItemId The list item to nest the blocks under.
48
+ */
49
+ export function moveBlocksToNestedList(
50
+ registry,
51
+ clientIds,
52
+ sourceListId,
53
+ listItemId
54
+ ) {
55
+ const { getBlockOrder, getBlock } = registry.select( blockEditorStore );
56
+ const { moveBlocksToPosition, removeBlocks, insertBlock } =
57
+ registry.dispatch( blockEditorStore );
58
+ // A list item can hold more than one nested list; append to the last one,
59
+ // the same subtree a reader sees at the end of the item.
60
+ const nestedLists = getBlockOrder( listItemId );
61
+ const nestedListId = nestedLists[ nestedLists.length - 1 ];
62
+
63
+ if ( nestedListId ) {
64
+ moveBlocksToPosition( clientIds, sourceListId, nestedListId );
65
+ return;
66
+ }
67
+
68
+ // Insert the list with the items already inside: an empty list would be
69
+ // scaffolded with the list block type's template, and moving into a freshly
70
+ // created list would fail its canInsert check. Cloning the source list keeps
71
+ // its attributes; passing the items as inner blocks keeps their client IDs.
72
+ const nestedList = cloneBlock(
73
+ getBlock( sourceListId ),
74
+ {},
75
+ clientIds.map( ( id ) => getBlock( id ) )
76
+ );
77
+ // Remove and re-insert in one batch so the blocks are never momentarily
78
+ // detached. A caller batch nests harmlessly: only the outermost flushes.
79
+ registry.batch( () => {
80
+ removeBlocks( clientIds, false );
81
+ insertBlock( nestedList, 0, listItemId, false );
82
+ } );
83
+ }
84
+
85
+ /**
86
+ * Indents the selected list items, nesting them under the previous sibling of
87
+ * the given item. Defaults to the first selected item.
88
+ *
89
+ * @param {Object} registry The data registry.
90
+ * @param {string} [clientId] The list item providing the sibling to nest under.
91
+ *
92
+ * @return {boolean} Whether the items were indented.
93
+ */
94
+ export function indentListItems( registry, clientId ) {
95
+ const select = registry.select( blockEditorStore );
96
+ const {
97
+ getBlockRootClientId,
98
+ getSelectedBlockClientIds,
99
+ getSelectionStart,
100
+ getSelectionEnd,
101
+ hasMultiSelection,
102
+ getMultiSelectedBlockClientIds,
103
+ } = select;
104
+ const { selectionChange, multiSelect } =
105
+ registry.dispatch( blockEditorStore );
106
+
107
+ const _hasMultiSelection = hasMultiSelection();
108
+ const clientIds = _hasMultiSelection
109
+ ? getMultiSelectedBlockClientIds()
110
+ : getSelectedBlockClientIds();
111
+
112
+ if ( clientId === undefined ) {
113
+ clientId = clientIds[ 0 ];
114
+ }
115
+
116
+ const previousSiblingId = getIndentTarget( select, clientId );
117
+
118
+ // Can't indent the first item: there is no sibling to nest it under.
119
+ if ( ! previousSiblingId ) {
120
+ return false;
121
+ }
122
+
123
+ const rootClientId = getBlockRootClientId( clientId );
124
+ // Read the selection before the move: creating a nested list removes and
125
+ // re-inserts the items, which drops it.
126
+ const selectionStart = getSelectionStart();
127
+ const selectionEnd = getSelectionEnd();
128
+
129
+ registry.batch( () => {
130
+ moveBlocksToNestedList(
131
+ registry,
132
+ clientIds,
133
+ rootClientId,
134
+ previousSiblingId
135
+ );
136
+
137
+ // Put the selection back on the same blocks (client IDs are kept).
138
+ if ( ! _hasMultiSelection ) {
139
+ selectionChange(
140
+ clientIds[ 0 ],
141
+ selectionEnd.attributeKey,
142
+ selectionEnd.clientId === selectionStart.clientId
143
+ ? selectionStart.offset
144
+ : selectionEnd.offset,
145
+ selectionEnd.offset
146
+ );
147
+ } else {
148
+ multiSelect( clientIds[ 0 ], clientIds[ clientIds.length - 1 ] );
149
+ }
150
+ } );
151
+
152
+ return true;
153
+ }
154
+
155
+ /**
156
+ * Outdents list items, moving them up a level. Defaults to the selected items;
157
+ * a specific set can be passed, e.g. to outdent an item's children.
158
+ *
159
+ * @param {Object} registry The data registry.
160
+ * @param {string[]|string} [clientIds] The list items to outdent.
161
+ *
162
+ * @return {boolean} Whether the items were outdented.
163
+ */
164
+ export function outdentListItems( registry, clientIds ) {
165
+ const select = registry.select( blockEditorStore );
166
+ const {
167
+ getBlockRootClientId,
168
+ getBlockName,
169
+ getBlockOrder,
170
+ getBlockIndex,
171
+ getSelectedBlockClientIds,
172
+ } = select;
173
+ const { moveBlocksToPosition, removeBlock, multiSelect } =
174
+ registry.dispatch( blockEditorStore );
175
+
176
+ if ( clientIds === undefined ) {
177
+ clientIds = getSelectedBlockClientIds();
178
+ }
179
+
180
+ if ( ! Array.isArray( clientIds ) ) {
181
+ clientIds = [ clientIds ];
182
+ }
183
+
184
+ if ( ! clientIds.length ) {
185
+ return false;
186
+ }
187
+
188
+ const firstClientId = clientIds[ 0 ];
189
+
190
+ // Can't outdent if it's not a list item.
191
+ if ( getBlockName( firstClientId ) !== 'core/list-item' ) {
192
+ return false;
193
+ }
194
+
195
+ // Can't outdent if it's at the top level.
196
+ const parentListItemId = getOutdentTarget( select, firstClientId );
197
+ if ( ! parentListItemId ) {
198
+ return false;
199
+ }
200
+
201
+ const parentListId = getBlockRootClientId( firstClientId );
202
+ const lastClientId = clientIds[ clientIds.length - 1 ];
203
+ const order = getBlockOrder( parentListId );
204
+ const followingListItems = order.slice( getBlockIndex( lastClientId ) + 1 );
205
+
206
+ registry.batch( () => {
207
+ if ( followingListItems.length ) {
208
+ // Nest the items that follow under the outdented item so they keep
209
+ // their place below it.
210
+ moveBlocksToNestedList(
211
+ registry,
212
+ followingListItems,
213
+ parentListId,
214
+ firstClientId
215
+ );
216
+ }
217
+ moveBlocksToPosition(
218
+ clientIds,
219
+ parentListId,
220
+ getBlockRootClientId( parentListItemId ),
221
+ getBlockIndex( parentListItemId ) + 1
222
+ );
223
+ if ( ! getBlockOrder( parentListId ).length ) {
224
+ const shouldSelectParent = false;
225
+ removeBlock( parentListId, shouldSelectParent );
226
+ }
227
+
228
+ // Reset the lingering partial cross-block range to a whole block
229
+ // selection. A single caret is preserved by the store on its own.
230
+ if ( clientIds.length > 1 ) {
231
+ multiSelect( firstClientId, lastClientId );
232
+ }
233
+ } );
234
+
235
+ return true;
236
+ }
@@ -31,6 +31,8 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
31
31
  - `padding`: `true`
32
32
  - [`typography`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography):
33
33
  - [`fontSize`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography-fontsize): `true`
34
+ - [`interactivity`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#interactivity):
35
+ - `clientNavigation`: `true`
34
36
 
35
37
  ## Block Markup
36
38
 
@@ -36,6 +36,9 @@
36
36
  "__experimentalDefaultControls": {
37
37
  "fontSize": true
38
38
  }
39
+ },
40
+ "interactivity": {
41
+ "clientNavigation": true
39
42
  }
40
43
  },
41
44
  "attributes": {
@@ -1,6 +1,5 @@
1
1
  import { __ } from '@wordpress/i18n';
2
2
  import { mediaAndText as icon } from '@wordpress/icons';
3
- import { privateApis as blocksPrivateApis } from '@wordpress/blocks';
4
3
  import initBlock from '../utils/init-block';
5
4
  import { TEMPLATE } from './constants';
6
5
  import deprecated from './deprecated';
@@ -8,9 +7,6 @@ import edit from './edit';
8
7
  import metadata from './block.json';
9
8
  import save from './save';
10
9
  import transforms from './transforms';
11
- import { unlock } from '../lock-unlock';
12
-
13
- const { fieldsKey, formKey } = unlock( blocksPrivateApis );
14
10
 
15
11
  const { name } = metadata;
16
12
 
@@ -49,50 +45,4 @@ export const settings = {
49
45
  deprecated,
50
46
  };
51
47
 
52
- if ( window.__experimentalContentOnlyInspectorFields ) {
53
- settings[ fieldsKey ] = [
54
- {
55
- id: 'media',
56
- label: __( 'Media' ),
57
- type: 'media',
58
- Edit: {
59
- control: 'media', // TODO: replace with custom component
60
- allowedTypes: [ 'image', 'video' ],
61
- multiple: false,
62
- },
63
- getValue: ( { item } ) => ( {
64
- id: item.mediaId,
65
- url: item.mediaUrl,
66
- mediaType: item.mediaType,
67
- link: item.mediaLink,
68
- } ),
69
- setValue: ( { value } ) => ( {
70
- mediaId: value.id,
71
- mediaUrl: value.url,
72
- mediaType: value.mediaType,
73
- mediaLink: value.link,
74
- } ),
75
- },
76
- {
77
- id: 'link',
78
- label: __( 'Link' ),
79
- type: 'url',
80
- Edit: 'link', // TODO: replace with custom component
81
- getValue: ( { item } ) => ( {
82
- url: item.href,
83
- rel: item.rel,
84
- linkTarget: item.linkTarget,
85
- } ),
86
- setValue: ( { value } ) => ( {
87
- href: value.url,
88
- rel: value.rel,
89
- linkTarget: value.linkTarget,
90
- } ),
91
- },
92
- ];
93
- settings[ formKey ] = {
94
- fields: [ 'media', 'link' ],
95
- };
96
- }
97
-
98
48
  export const init = () => initBlock( { name, metadata, settings } );
@@ -53,6 +53,7 @@ function ToolbarEditButton( {
53
53
  onSelect={ onSelectMedia }
54
54
  onToggleFeaturedImage={ toggleUseFeaturedImage }
55
55
  useFeaturedImage={ useFeaturedImage }
56
+ name={ mediaUrl ? __( 'Replace' ) : __( 'Add media' ) }
56
57
  onReset={ () => onSelectMedia( undefined ) }
57
58
  />
58
59
  </BlockControls>
@@ -122,6 +123,20 @@ function MediaContainer( props, ref ) {
122
123
 
123
124
  const { toggleSelection } = useDispatch( blockEditorStore );
124
125
 
126
+ const toolbarEditButton = (
127
+ <ToolbarEditButton
128
+ onSelectMedia={ onSelectMedia }
129
+ mediaUrl={
130
+ useFeaturedImage && featuredImageURL
131
+ ? featuredImageURL
132
+ : mediaUrl
133
+ }
134
+ mediaId={ mediaId }
135
+ toggleUseFeaturedImage={ toggleUseFeaturedImage }
136
+ useFeaturedImage={ useFeaturedImage }
137
+ />
138
+ );
139
+
125
140
  if ( mediaUrl || featuredImageURL || useFeaturedImage ) {
126
141
  const onResizeStart = () => {
127
142
  toggleSelection( false );
@@ -185,17 +200,7 @@ function MediaContainer( props, ref ) {
185
200
  isStackedOnMobile={ isStackedOnMobile }
186
201
  ref={ ref }
187
202
  >
188
- <ToolbarEditButton
189
- onSelectMedia={ onSelectMedia }
190
- mediaUrl={
191
- useFeaturedImage && featuredImageURL
192
- ? featuredImageURL
193
- : mediaUrl
194
- }
195
- mediaId={ mediaId }
196
- toggleUseFeaturedImage={ toggleUseFeaturedImage }
197
- useFeaturedImage={ useFeaturedImage }
198
- />
203
+ { toolbarEditButton }
199
204
  { ( mediaTypeRenderers[ mediaType ] || noop )() }
200
205
  { isTemporaryMedia && <Spinner /> }
201
206
  { ! useFeaturedImage && <PlaceholderContainer { ...props } /> }
@@ -210,7 +215,12 @@ function MediaContainer( props, ref ) {
210
215
  );
211
216
  }
212
217
 
213
- return <PlaceholderContainer { ...props } />;
218
+ return (
219
+ <>
220
+ { toolbarEditButton }
221
+ <PlaceholderContainer { ...props } />
222
+ </>
223
+ );
214
224
  }
215
225
 
216
226
  export default forwardRef( MediaContainer );
@@ -53,6 +53,7 @@
53
53
  grid-row: 1;
54
54
  /*rtl:end:ignore*/
55
55
  padding: 0 8% 0 8%;
56
+ // stylelint-disable-next-line declaration-property-value-keyword-no-deprecated -- Pending review of overflow-wrap alternative.
56
57
  word-break: break-word;
57
58
  }
58
59
 
@@ -102,7 +103,7 @@
102
103
  padding: 0;
103
104
  margin: -1px;
104
105
  overflow: hidden;
105
- clip: rect(0, 0, 0, 0);
106
+ clip-path: inset(50%);
106
107
  border: 0;
107
108
  }
108
109
 
@@ -1,3 +1,4 @@
1
+ import { describe, expect, it } from 'vitest';
1
2
  import { imageFillStyles } from '../image-fill';
2
3
 
3
4
  describe( 'imageFillStyles()', () => {