@wordpress/block-library 10.1.1-next.v.202607070741.0 → 10.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/build/accordion/block.json +1 -0
  3. package/build/button/edit.cjs +18 -8
  4. package/build/button/edit.cjs.map +2 -2
  5. package/build/cover/block.json +11 -0
  6. package/build/cover/edit/block-controls.cjs +11 -4
  7. package/build/cover/edit/block-controls.cjs.map +2 -2
  8. package/build/cover/edit/embed-video-url-input.cjs +5 -3
  9. package/build/cover/edit/embed-video-url-input.cjs.map +3 -3
  10. package/build/cover/edit/index.cjs +1 -1
  11. package/build/cover/edit/index.cjs.map +2 -2
  12. package/build/cover/embed-video-utils.cjs +17 -7
  13. package/build/cover/embed-video-utils.cjs.map +2 -2
  14. package/build/details/transforms.cjs +1 -3
  15. package/build/details/transforms.cjs.map +2 -2
  16. package/build/embed/embed-placeholder.cjs +0 -1
  17. package/build/embed/embed-placeholder.cjs.map +2 -2
  18. package/build/file/edit.cjs +4 -3
  19. package/build/file/edit.cjs.map +2 -2
  20. package/build/file/transforms.cjs +25 -60
  21. package/build/file/transforms.cjs.map +2 -2
  22. package/build/gallery/block.json +4 -2
  23. package/build/gallery/edit.cjs +1 -1
  24. package/build/gallery/edit.cjs.map +3 -3
  25. package/build/gallery/gap-styles.cjs +49 -13
  26. package/build/gallery/gap-styles.cjs.map +3 -3
  27. package/build/group/transforms.cjs +1 -1
  28. package/build/group/transforms.cjs.map +2 -2
  29. package/build/icon/components/custom-inserter/icon-grid.cjs +25 -12
  30. package/build/icon/components/custom-inserter/icon-grid.cjs.map +2 -2
  31. package/build/icon/components/custom-inserter/index.cjs +100 -31
  32. package/build/icon/components/custom-inserter/index.cjs.map +3 -3
  33. package/build/icon/edit.cjs +11 -12
  34. package/build/icon/edit.cjs.map +2 -2
  35. package/build/image/block.json +1 -1
  36. package/build/image/edit.cjs +0 -34
  37. package/build/image/edit.cjs.map +2 -2
  38. package/build/image/image.cjs +4 -23
  39. package/build/image/image.cjs.map +3 -3
  40. package/build/image/transforms.cjs +78 -0
  41. package/build/image/transforms.cjs.map +3 -3
  42. package/build/index.cjs +18 -8
  43. package/build/index.cjs.map +2 -2
  44. package/build/latest-posts/edit.cjs +5 -8
  45. package/build/latest-posts/edit.cjs.map +2 -2
  46. package/build/list-item/edit.cjs +1 -1
  47. package/build/list-item/edit.cjs.map +2 -2
  48. package/build/list-item/hooks/use-enter.cjs +14 -17
  49. package/build/list-item/hooks/use-enter.cjs.map +3 -3
  50. package/build/list-item/hooks/use-space.cjs +3 -2
  51. package/build/list-item/hooks/use-space.cjs.map +3 -3
  52. package/build/paragraph/block.json +1 -0
  53. package/build/paragraph/use-enter.cjs +3 -7
  54. package/build/paragraph/use-enter.cjs.map +3 -3
  55. package/build/playlist/block.json +29 -10
  56. package/build/playlist/edit.cjs +216 -14
  57. package/build/playlist/edit.cjs.map +3 -3
  58. package/build/playlist/index.cjs +1 -1
  59. package/build/playlist/index.cjs.map +2 -2
  60. package/build/playlist/utils.cjs +19 -5
  61. package/build/playlist/utils.cjs.map +2 -2
  62. package/build/playlist/view.cjs +83 -13
  63. package/build/playlist/view.cjs.map +2 -2
  64. package/build/playlist-track/block.json +4 -2
  65. package/build/playlist-track/edit.cjs +94 -64
  66. package/build/playlist-track/edit.cjs.map +2 -2
  67. package/build/post-content/block.json +1 -0
  68. package/build/post-template/block.json +2 -1
  69. package/build/post-template/edit.cjs +10 -1
  70. package/build/post-template/edit.cjs.map +2 -2
  71. package/build/pullquote/block.json +3 -1
  72. package/build/query/block.json +3 -2
  73. package/build/query/edit/inspector-controls/index.cjs +38 -4
  74. package/build/query/edit/inspector-controls/index.cjs.map +2 -2
  75. package/build/query/edit/inspector-controls/offset-controls.cjs +0 -1
  76. package/build/query/edit/inspector-controls/offset-controls.cjs.map +2 -2
  77. package/build/query/edit/inspector-controls/pages-control.cjs +0 -1
  78. package/build/query/edit/inspector-controls/pages-control.cjs.map +2 -2
  79. package/build/query/edit/query-content.cjs +10 -3
  80. package/build/query/edit/query-content.cjs.map +2 -2
  81. package/build/query/index.cjs +2 -1
  82. package/build/query/index.cjs.map +2 -2
  83. package/build/quote/block.json +3 -1
  84. package/build/quote/transforms.cjs +1 -3
  85. package/build/quote/transforms.cjs.map +2 -2
  86. package/build/rss/edit.cjs +0 -1
  87. package/build/rss/edit.cjs.map +2 -2
  88. package/build/tab-list/block.json +2 -2
  89. package/build/tab-list/edit.cjs +65 -11
  90. package/build/tab-list/edit.cjs.map +3 -3
  91. package/build/tab-panel/block.json +1 -6
  92. package/build/tab-panel/edit.cjs +15 -15
  93. package/build/tab-panel/edit.cjs.map +2 -2
  94. package/build/tab-panels/block.json +0 -1
  95. package/build/tabs/block.json +0 -5
  96. package/build/tabs/edit.cjs +4 -39
  97. package/build/tabs/edit.cjs.map +3 -3
  98. package/build/tabs/use-tab-list-items-sync.cjs +19 -1
  99. package/build/tabs/use-tab-list-items-sync.cjs.map +2 -2
  100. package/build/term-name/block.json +1 -3
  101. package/build/term-name/deprecated.cjs +105 -0
  102. package/build/term-name/deprecated.cjs.map +7 -0
  103. package/build/term-name/edit.cjs +11 -37
  104. package/build/term-name/edit.cjs.map +3 -3
  105. package/build/term-name/index.cjs +3 -1
  106. package/build/term-name/index.cjs.map +3 -3
  107. package/build/utils/waveform-player.cjs +138 -22
  108. package/build/utils/waveform-player.cjs.map +2 -2
  109. package/build/utils/waveform-utils.cjs +315 -17
  110. package/build/utils/waveform-utils.cjs.map +2 -2
  111. package/build/video/edit.cjs +2 -11
  112. package/build/video/edit.cjs.map +3 -3
  113. package/build-module/accordion/block.json +1 -0
  114. package/build-module/button/edit.mjs +19 -14
  115. package/build-module/button/edit.mjs.map +2 -2
  116. package/build-module/cover/block.json +11 -0
  117. package/build-module/cover/edit/block-controls.mjs +11 -4
  118. package/build-module/cover/edit/block-controls.mjs.map +2 -2
  119. package/build-module/cover/edit/embed-video-url-input.mjs +5 -4
  120. package/build-module/cover/edit/embed-video-url-input.mjs.map +2 -2
  121. package/build-module/cover/edit/index.mjs +1 -1
  122. package/build-module/cover/edit/index.mjs.map +2 -2
  123. package/build-module/cover/embed-video-utils.mjs +16 -7
  124. package/build-module/cover/embed-video-utils.mjs.map +2 -2
  125. package/build-module/details/transforms.mjs +2 -7
  126. package/build-module/details/transforms.mjs.map +2 -2
  127. package/build-module/embed/embed-placeholder.mjs +0 -1
  128. package/build-module/embed/embed-placeholder.mjs.map +2 -2
  129. package/build-module/file/edit.mjs +4 -3
  130. package/build-module/file/edit.mjs.map +2 -2
  131. package/build-module/file/transforms.mjs +25 -60
  132. package/build-module/file/transforms.mjs.map +2 -2
  133. package/build-module/gallery/block.json +4 -2
  134. package/build-module/gallery/edit.mjs +3 -3
  135. package/build-module/gallery/edit.mjs.map +2 -2
  136. package/build-module/gallery/gap-styles.mjs +53 -14
  137. package/build-module/gallery/gap-styles.mjs.map +2 -2
  138. package/build-module/group/transforms.mjs +2 -5
  139. package/build-module/group/transforms.mjs.map +2 -2
  140. package/build-module/icon/components/custom-inserter/icon-grid.mjs +25 -12
  141. package/build-module/icon/components/custom-inserter/icon-grid.mjs.map +2 -2
  142. package/build-module/icon/components/custom-inserter/index.mjs +102 -33
  143. package/build-module/icon/components/custom-inserter/index.mjs.map +2 -2
  144. package/build-module/icon/edit.mjs +11 -12
  145. package/build-module/icon/edit.mjs.map +2 -2
  146. package/build-module/image/block.json +1 -1
  147. package/build-module/image/edit.mjs +0 -34
  148. package/build-module/image/edit.mjs.map +2 -2
  149. package/build-module/image/image.mjs +4 -13
  150. package/build-module/image/image.mjs.map +2 -2
  151. package/build-module/image/transforms.mjs +78 -0
  152. package/build-module/image/transforms.mjs.map +2 -2
  153. package/build-module/index.mjs +18 -8
  154. package/build-module/index.mjs.map +2 -2
  155. package/build-module/latest-posts/edit.mjs +5 -8
  156. package/build-module/latest-posts/edit.mjs.map +2 -2
  157. package/build-module/list-item/edit.mjs +1 -1
  158. package/build-module/list-item/edit.mjs.map +2 -2
  159. package/build-module/list-item/hooks/use-enter.mjs +15 -21
  160. package/build-module/list-item/hooks/use-enter.mjs.map +2 -2
  161. package/build-module/list-item/hooks/use-space.mjs +4 -6
  162. package/build-module/list-item/hooks/use-space.mjs.map +2 -2
  163. package/build-module/paragraph/block.json +1 -0
  164. package/build-module/paragraph/use-enter.mjs +4 -11
  165. package/build-module/paragraph/use-enter.mjs.map +2 -2
  166. package/build-module/playlist/block.json +29 -10
  167. package/build-module/playlist/edit.mjs +220 -16
  168. package/build-module/playlist/edit.mjs.map +2 -2
  169. package/build-module/playlist/index.mjs +1 -1
  170. package/build-module/playlist/index.mjs.map +2 -2
  171. package/build-module/playlist/utils.mjs +17 -4
  172. package/build-module/playlist/utils.mjs.map +2 -2
  173. package/build-module/playlist/view.mjs +89 -14
  174. package/build-module/playlist/view.mjs.map +2 -2
  175. package/build-module/playlist-track/block.json +4 -2
  176. package/build-module/playlist-track/edit.mjs +96 -65
  177. package/build-module/playlist-track/edit.mjs.map +2 -2
  178. package/build-module/post-content/block.json +1 -0
  179. package/build-module/post-template/block.json +2 -1
  180. package/build-module/post-template/edit.mjs +10 -1
  181. package/build-module/post-template/edit.mjs.map +2 -2
  182. package/build-module/pullquote/block.json +3 -1
  183. package/build-module/query/block.json +3 -2
  184. package/build-module/query/edit/inspector-controls/index.mjs +40 -5
  185. package/build-module/query/edit/inspector-controls/index.mjs.map +2 -2
  186. package/build-module/query/edit/inspector-controls/offset-controls.mjs +0 -1
  187. package/build-module/query/edit/inspector-controls/offset-controls.mjs.map +2 -2
  188. package/build-module/query/edit/inspector-controls/pages-control.mjs +0 -1
  189. package/build-module/query/edit/inspector-controls/pages-control.mjs.map +2 -2
  190. package/build-module/query/edit/query-content.mjs +10 -3
  191. package/build-module/query/edit/query-content.mjs.map +2 -2
  192. package/build-module/query/index.mjs +2 -1
  193. package/build-module/query/index.mjs.map +2 -2
  194. package/build-module/quote/block.json +3 -1
  195. package/build-module/quote/transforms.mjs +2 -4
  196. package/build-module/quote/transforms.mjs.map +2 -2
  197. package/build-module/rss/edit.mjs +0 -1
  198. package/build-module/rss/edit.mjs.map +2 -2
  199. package/build-module/tab-list/block.json +2 -2
  200. package/build-module/tab-list/edit.mjs +72 -13
  201. package/build-module/tab-list/edit.mjs.map +2 -2
  202. package/build-module/tab-panel/block.json +1 -6
  203. package/build-module/tab-panel/edit.mjs +16 -16
  204. package/build-module/tab-panel/edit.mjs.map +2 -2
  205. package/build-module/tab-panels/block.json +0 -1
  206. package/build-module/tabs/block.json +0 -5
  207. package/build-module/tabs/edit.mjs +5 -45
  208. package/build-module/tabs/edit.mjs.map +2 -2
  209. package/build-module/tabs/use-tab-list-items-sync.mjs +19 -1
  210. package/build-module/tabs/use-tab-list-items-sync.mjs.map +2 -2
  211. package/build-module/term-name/block.json +1 -3
  212. package/build-module/term-name/deprecated.mjs +74 -0
  213. package/build-module/term-name/deprecated.mjs.map +7 -0
  214. package/build-module/term-name/edit.mjs +11 -28
  215. package/build-module/term-name/edit.mjs.map +2 -2
  216. package/build-module/term-name/index.mjs +3 -1
  217. package/build-module/term-name/index.mjs.map +2 -2
  218. package/build-module/utils/waveform-player.mjs +144 -23
  219. package/build-module/utils/waveform-player.mjs.map +2 -2
  220. package/build-module/utils/waveform-utils.mjs +310 -16
  221. package/build-module/utils/waveform-utils.mjs.map +2 -2
  222. package/build-module/video/edit.mjs +2 -11
  223. package/build-module/video/edit.mjs.map +2 -2
  224. package/build-style/editor-rtl.css +46 -21
  225. package/build-style/editor.css +46 -21
  226. package/build-style/icon/editor-rtl.css +80 -7
  227. package/build-style/icon/editor.css +80 -7
  228. package/build-style/more/editor-rtl.css +2 -2
  229. package/build-style/more/editor.css +2 -2
  230. package/build-style/navigation/editor-rtl.css +3 -4
  231. package/build-style/navigation/editor.css +3 -4
  232. package/build-style/navigation-link/editor-rtl.css +1 -1
  233. package/build-style/navigation-link/editor.css +1 -1
  234. package/build-style/nextpage/editor-rtl.css +2 -2
  235. package/build-style/nextpage/editor.css +2 -2
  236. package/build-style/playlist/editor-rtl.css +6 -0
  237. package/build-style/playlist/editor.css +6 -0
  238. package/build-style/playlist/style-rtl.css +37 -1
  239. package/build-style/playlist/style.css +37 -1
  240. package/build-style/playlist-track/style-rtl.css +10 -0
  241. package/build-style/playlist-track/style.css +10 -0
  242. package/build-style/style-rtl.css +47 -1
  243. package/build-style/style.css +47 -1
  244. package/build-style/video/editor-rtl.css +1 -1
  245. package/build-style/video/editor.css +1 -1
  246. package/build-types/table-of-contents/list.d.ts +1 -1
  247. package/build-types/table-of-contents/list.d.ts.map +1 -1
  248. package/package.json +46 -44
  249. package/src/accordion/README.md +1 -0
  250. package/src/accordion/block.json +1 -0
  251. package/src/button/edit.js +21 -15
  252. package/src/cover/README.md +60 -0
  253. package/src/cover/block.json +11 -0
  254. package/src/cover/edit/block-controls.js +21 -11
  255. package/src/cover/edit/embed-video-url-input.js +5 -4
  256. package/src/cover/edit/index.js +9 -11
  257. package/src/cover/embed-video-utils.js +38 -13
  258. package/src/details/transforms.js +2 -7
  259. package/src/embed/embed-placeholder.js +0 -1
  260. package/src/file/edit.js +8 -8
  261. package/src/file/transforms.js +28 -60
  262. package/src/gallery/README.md +1 -1
  263. package/src/gallery/block.json +4 -2
  264. package/src/gallery/edit.js +3 -3
  265. package/src/gallery/gap-styles.js +79 -20
  266. package/src/gallery/index.php +103 -43
  267. package/src/group/transforms.js +2 -5
  268. package/src/icon/components/custom-inserter/icon-grid.js +40 -11
  269. package/src/icon/components/custom-inserter/index.js +98 -25
  270. package/src/icon/edit.js +11 -17
  271. package/src/icon/editor.scss +33 -8
  272. package/src/image/README.md +1 -1
  273. package/src/image/block.json +1 -1
  274. package/src/image/edit.js +0 -52
  275. package/src/image/editor.scss +2 -0
  276. package/src/image/image.js +19 -24
  277. package/src/image/transforms.js +128 -0
  278. package/src/index.js +19 -7
  279. package/src/latest-posts/edit.js +5 -8
  280. package/src/latest-posts/index.php +46 -16
  281. package/src/list-item/edit.js +1 -1
  282. package/src/list-item/hooks/use-enter.js +15 -22
  283. package/src/list-item/hooks/use-space.js +4 -6
  284. package/src/media-text/editor.scss +1 -0
  285. package/src/more/editor.scss +1 -1
  286. package/src/navigation/editor.scss +1 -2
  287. package/src/navigation-link/editor.scss +1 -1
  288. package/src/navigation-link/index.php +6 -3
  289. package/src/navigation-submenu/index.php +6 -3
  290. package/src/nextpage/editor.scss +1 -1
  291. package/src/paragraph/README.md +1 -0
  292. package/src/paragraph/block.json +1 -0
  293. package/src/paragraph/use-enter.js +4 -11
  294. package/src/playlist/README.md +17 -18
  295. package/src/playlist/block.json +29 -10
  296. package/src/playlist/edit.js +247 -15
  297. package/src/playlist/editor.scss +6 -0
  298. package/src/playlist/index.js +1 -1
  299. package/src/playlist/index.php +58 -14
  300. package/src/playlist/style.scss +51 -1
  301. package/src/playlist/test/edit.js +13 -2
  302. package/src/playlist/utils.js +25 -7
  303. package/src/playlist/view.js +97 -16
  304. package/src/playlist-track/README.md +3 -3
  305. package/src/playlist-track/block.json +4 -2
  306. package/src/playlist-track/edit.js +94 -70
  307. package/src/playlist-track/index.php +20 -6
  308. package/src/playlist-track/style.scss +10 -0
  309. package/src/playlist-track/test/edit.js +169 -0
  310. package/src/post-content/README.md +1 -0
  311. package/src/post-content/block.json +1 -0
  312. package/src/post-template/README.md +1 -0
  313. package/src/post-template/block.json +2 -1
  314. package/src/post-template/edit.js +9 -0
  315. package/src/pullquote/README.md +1 -0
  316. package/src/pullquote/block.json +3 -1
  317. package/src/query/README.md +2 -1
  318. package/src/query/block.json +3 -2
  319. package/src/query/edit/inspector-controls/index.js +43 -3
  320. package/src/query/edit/inspector-controls/offset-controls.js +0 -1
  321. package/src/query/edit/inspector-controls/pages-control.js +0 -1
  322. package/src/query/edit/query-content.js +19 -3
  323. package/src/query/index.js +1 -0
  324. package/src/quote/README.md +1 -0
  325. package/src/quote/block.json +3 -1
  326. package/src/quote/transforms.js +2 -4
  327. package/src/rss/edit.js +0 -1
  328. package/src/rss/index.php +1 -1
  329. package/src/tab-list/README.md +4 -5
  330. package/src/tab-list/block.json +2 -2
  331. package/src/tab-list/edit.js +90 -28
  332. package/src/tab-list/index.php +9 -4
  333. package/src/tab-panel/README.md +4 -6
  334. package/src/tab-panel/block.json +1 -6
  335. package/src/tab-panel/edit.js +19 -24
  336. package/src/tab-panels/README.md +5 -3
  337. package/src/tab-panels/block.json +0 -1
  338. package/src/tabs/README.md +18 -9
  339. package/src/tabs/block.json +0 -5
  340. package/src/tabs/edit.js +7 -64
  341. package/src/tabs/use-tab-list-items-sync.js +24 -4
  342. package/src/template-part/index.php +1 -16
  343. package/src/term-name/README.md +1 -1
  344. package/src/term-name/block.json +1 -3
  345. package/src/term-name/deprecated.js +74 -0
  346. package/src/term-name/edit.js +2 -18
  347. package/src/term-name/index.js +2 -0
  348. package/src/utils/media-control.scss +1 -5
  349. package/src/utils/test/waveform-player.js +297 -34
  350. package/src/utils/test/waveform-utils.js +410 -5
  351. package/src/utils/waveform-player.js +189 -59
  352. package/src/utils/waveform-utils.js +443 -40
  353. package/src/video/edit.js +0 -8
  354. package/src/video/editor.scss +1 -1
  355. package/build/image/animated-gif-convert-control.cjs +0 -105
  356. package/build/image/animated-gif-convert-control.cjs.map +0 -7
  357. package/build/utils/gif-conversion-attributes.cjs +0 -40
  358. package/build/utils/gif-conversion-attributes.cjs.map +0 -7
  359. package/build/video/gif-restore-control.cjs +0 -73
  360. package/build/video/gif-restore-control.cjs.map +0 -7
  361. package/build-module/image/animated-gif-convert-control.mjs +0 -87
  362. package/build-module/image/animated-gif-convert-control.mjs.map +0 -7
  363. package/build-module/utils/gif-conversion-attributes.mjs +0 -15
  364. package/build-module/utils/gif-conversion-attributes.mjs.map +0 -7
  365. package/build-module/video/gif-restore-control.mjs +0 -55
  366. package/build-module/video/gif-restore-control.mjs.map +0 -7
  367. package/src/image/animated-gif-convert-control.js +0 -135
  368. package/src/image/test/animated-gif-convert-control.js +0 -276
  369. package/src/utils/gif-conversion-attributes.js +0 -30
  370. package/src/utils/test/gif-conversion-attributes.js +0 -60
  371. package/src/video/gif-restore-control.js +0 -92
@@ -52,6 +52,41 @@ function block_core_gallery_render_context( $context, $parsed_block ) {
52
52
 
53
53
  add_filter( 'render_block_context', 'block_core_gallery_render_context', 10, 2 );
54
54
 
55
+ /**
56
+ * Returns the column gap value used for Gallery image width calculations.
57
+ *
58
+ * @since 7.1.0
59
+ *
60
+ * @param string|array|null $gap Gallery block gap value.
61
+ * @param string $fallback_gap Fallback gap value.
62
+ * @return string Gallery column gap value.
63
+ */
64
+ function block_core_gallery_get_column_gap_value( $gap, $fallback_gap ) {
65
+ if ( is_array( $gap ) ) {
66
+ $gap = $gap['left'] ?? $fallback_gap;
67
+ }
68
+
69
+ // Make sure $gap is a string to avoid PHP 8.1 deprecation error in preg_match() when the value is null.
70
+ $gap = is_string( $gap ) ? $gap : '';
71
+
72
+ // Skip if gap value contains unsupported characters.
73
+ // Regex for CSS value borrowed from `safecss_filter_attr`, and used here
74
+ // because we only want to match against the value, not the CSS attribute.
75
+ $gap = $gap && preg_match( '%[\\\(&=}]|/\*%', $gap ) ? null : $gap;
76
+
77
+ // Get spacing CSS variable from preset value if provided.
78
+ if ( is_string( $gap ) && str_contains( $gap, 'var:preset|spacing|' ) ) {
79
+ $index_to_splice = strrpos( $gap, '|' ) + 1;
80
+ $slug = _wp_to_kebab_case( substr( $gap, $index_to_splice ) );
81
+ $gap = "var(--wp--preset--spacing--$slug)";
82
+ }
83
+
84
+ $gap_column = ( null !== $gap && '' !== $gap ) ? $gap : $fallback_gap;
85
+
86
+ // The unstable gallery gap calculation requires a real value (such as `0px`) and not `0`.
87
+ return '0' === $gap_column ? '0px' : $gap_column;
88
+ }
89
+
55
90
  /**
56
91
  * Resolves a Gallery block's `dynamicContent` to an ordered list of image
57
92
  * attachment IDs.
@@ -272,6 +307,8 @@ function block_core_gallery_render_dynamic_image( $attachment_id, $attributes, $
272
307
  * @return string The content of the block being rendered.
273
308
  */
274
309
  function block_core_gallery_render( $attributes, $content, $block ) {
310
+ static $global_styles = null;
311
+
275
312
  // In dynamic mode the gallery's images are resolved at render time instead of
276
313
  // being authored as inner blocks, so `save.js` persists at most the
277
314
  // gallery-level caption — a bare `<figcaption>`, or nothing when there is no
@@ -345,36 +382,15 @@ function block_core_gallery_render( $attributes, $content, $block ) {
345
382
  // the current gap setting in order to maintain the number of flex columns
346
383
  // so a css var is added to allow this.
347
384
 
348
- $gap = $attributes['style']['spacing']['blockGap'] ?? null;
349
- // Skip if gap value contains unsupported characters.
350
- // Regex for CSS value borrowed from `safecss_filter_attr`, and used here
351
- // because we only want to match against the value, not the CSS attribute.
352
- if ( is_array( $gap ) ) {
353
- foreach ( $gap as $key => $value ) {
354
- // Make sure $value is a string to avoid PHP 8.1 deprecation error in preg_match() when the value is null.
355
- $value = is_string( $value ) ? $value : '';
356
- $value = $value && preg_match( '%[\\\(&=}]|/\*%', $value ) ? null : $value;
357
-
358
- // Get spacing CSS variable from preset value if provided.
359
- if ( is_string( $value ) && str_contains( $value, 'var:preset|spacing|' ) ) {
360
- $index_to_splice = strrpos( $value, '|' ) + 1;
361
- $slug = _wp_to_kebab_case( substr( $value, $index_to_splice ) );
362
- $value = "var(--wp--preset--spacing--$slug)";
363
- }
364
-
365
- $gap[ $key ] = $value;
366
- }
367
- } else {
368
- // Make sure $gap is a string to avoid PHP 8.1 deprecation error in preg_match() when the value is null.
369
- $gap = is_string( $gap ) ? $gap : '';
370
- $gap = $gap && preg_match( '%[\\\(&=}]|/\*%', $gap ) ? null : $gap;
371
-
372
- // Get spacing CSS variable from preset value if provided.
373
- if ( is_string( $gap ) && str_contains( $gap, 'var:preset|spacing|' ) ) {
374
- $index_to_splice = strrpos( $gap, '|' ) + 1;
375
- $slug = _wp_to_kebab_case( substr( $gap, $index_to_splice ) );
376
- $gap = "var(--wp--preset--spacing--$slug)";
377
- }
385
+ $style_attr = is_array( $attributes['style'] ?? null )
386
+ ? $attributes['style']
387
+ : array();
388
+ if (
389
+ defined( 'IS_GUTENBERG_PLUGIN' ) &&
390
+ IS_GUTENBERG_PLUGIN &&
391
+ function_exists( 'gutenberg_resolve_style_state_aliases' )
392
+ ) {
393
+ $style_attr = gutenberg_resolve_style_state_aliases( $style_attr, 'core/gallery' );
378
394
  }
379
395
 
380
396
  $unique_gallery_classname = wp_unique_id( 'wp-block-gallery-' );
@@ -385,31 +401,75 @@ function block_core_gallery_render( $attributes, $content, $block ) {
385
401
  // --gallery-block--gutter-size is deprecated. --wp--style--gallery-gap-default should be used by themes that want to set a default
386
402
  // gap on the gallery.
387
403
  $fallback_gap = 'var( --wp--style--gallery-gap-default, var( --gallery-block--gutter-size, var( --wp--style--block-gap, 0.5em ) ) )';
388
- $gap_value = $gap ? $gap : $fallback_gap;
389
- $gap_column = $gap_value;
390
404
 
391
- if ( is_array( $gap_value ) ) {
392
- $gap_row = $gap_value['top'] ?? $fallback_gap;
393
- $gap_column = $gap_value['left'] ?? $fallback_gap;
394
- $gap_value = $gap_row === $gap_column ? $gap_row : $gap_row . ' ' . $gap_column;
405
+ if ( null === $global_styles ) {
406
+ $global_styles = function_exists( 'wp_get_global_styles' ) ? wp_get_global_styles() : array();
395
407
  }
396
408
 
397
- // The unstable gallery gap calculation requires a real value (such as `0px`) and not `0`.
398
- if ( '0' === $gap_column ) {
399
- $gap_column = '0px';
400
- }
401
-
402
- // Set the CSS variable to the column value, and the `gap` property to the combined gap value.
409
+ $global_gallery_styles = $global_styles['blocks']['core/gallery'] ?? array();
410
+ $global_gallery_gap = $global_gallery_styles['spacing']['blockGap'] ?? $fallback_gap;
411
+ $has_block_gap = is_array( $style_attr['spacing'] ?? null ) && array_key_exists( 'blockGap', $style_attr['spacing'] );
412
+ // Prefer the block's own gap value, then Gallery global styles. Missing
413
+ // values fall back to the Gallery blockGap default.
414
+ $block_gap = $has_block_gap
415
+ ? $style_attr['spacing']['blockGap']
416
+ : $global_gallery_gap;
417
+ $gap_column = block_core_gallery_get_column_gap_value( $block_gap, $fallback_gap );
418
+
419
+ // Set the CSS variable to the column value for Gallery's flex width calculations.
403
420
  $gallery_styles = array(
404
421
  array(
405
422
  'selector' => ".wp-block-gallery.{$unique_gallery_classname}",
406
423
  'declarations' => array(
407
424
  '--wp--style--unstable-gallery-gap' => $gap_column,
408
- 'gap' => $gap_value,
409
425
  ),
410
426
  ),
411
427
  );
412
428
 
429
+ $global_settings = wp_get_global_settings();
430
+ $viewport_settings = $global_settings['viewport'] ?? null;
431
+ $responsive_media_queries = array();
432
+ foreach ( array( 'WP_Theme_JSON_Gutenberg', 'WP_Theme_JSON' ) as $theme_json_class_name ) {
433
+ if ( method_exists( $theme_json_class_name, 'get_viewport_media_queries' ) ) {
434
+ $responsive_media_queries = $theme_json_class_name::get_viewport_media_queries( $viewport_settings );
435
+ break;
436
+ }
437
+ }
438
+
439
+ foreach ( $responsive_media_queries as $breakpoint => $media_query ) {
440
+ $viewport_style = $style_attr[ $breakpoint ] ?? null;
441
+ $has_viewport_block_gap = is_array( $viewport_style ) &&
442
+ is_array( $viewport_style['spacing'] ?? null ) &&
443
+ array_key_exists( 'blockGap', $viewport_style['spacing'] );
444
+ $has_global_viewport_block_gap = is_array( $global_gallery_styles[ $breakpoint ]['spacing'] ?? null ) &&
445
+ array_key_exists( 'blockGap', $global_gallery_styles[ $breakpoint ]['spacing'] );
446
+
447
+ // Viewport-specific block values win. Gallery global viewport values
448
+ // only apply when the block has no base gap, so they do not override an instance value.
449
+ if ( $has_viewport_block_gap ) {
450
+ $viewport_gap = $viewport_style['spacing']['blockGap'];
451
+ } elseif ( ! $has_block_gap && $has_global_viewport_block_gap ) {
452
+ $viewport_gap = $global_gallery_styles[ $breakpoint ]['spacing']['blockGap'];
453
+ } else {
454
+ continue;
455
+ }
456
+
457
+ if ( null === $viewport_gap ) {
458
+ continue;
459
+ }
460
+
461
+ $gallery_styles[] = array(
462
+ 'selector' => ".wp-block-gallery.{$unique_gallery_classname}",
463
+ 'declarations' => array(
464
+ '--wp--style--unstable-gallery-gap' => block_core_gallery_get_column_gap_value(
465
+ $viewport_gap,
466
+ $fallback_gap
467
+ ),
468
+ ),
469
+ 'rules_group' => $media_query,
470
+ );
471
+ }
472
+
413
473
  wp_style_engine_get_stylesheet_from_css_rules(
414
474
  $gallery_styles,
415
475
  array( 'context' => 'block-supports' )
@@ -1,10 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import {
5
- createBlock,
6
- __experimentalCloneSanitizedBlock,
7
- } from '@wordpress/blocks';
4
+ import { createBlock, cloneSanitizedBlock } from '@wordpress/blocks';
8
5
 
9
6
  const transforms = {
10
7
  from: [
@@ -33,7 +30,7 @@ const transforms = {
33
30
  // are removed both from their original location and within the
34
31
  // new group block.
35
32
  const groupInnerBlocks = blocks.map( ( block ) =>
36
- __experimentalCloneSanitizedBlock( block )
33
+ cloneSanitizedBlock( block )
37
34
  );
38
35
 
39
36
  return createBlock(
@@ -3,13 +3,44 @@
3
3
  */
4
4
  import { __ } from '@wordpress/i18n';
5
5
  import { Button } from '@wordpress/components';
6
+ import { useAsyncList } from '@wordpress/compose';
7
+ import { useRef, useLayoutEffect } from '@wordpress/element';
8
+ import { getScrollContainer } from '@wordpress/dom';
6
9
 
7
10
  /**
8
11
  * Internal dependencies
9
12
  */
10
13
  import HtmlRenderer from '../../../utils/html-renderer';
11
14
 
12
- export default function IconGrid( { icons, onChange, attributes } ) {
15
+ const BATCH_SIZE = 20;
16
+
17
+ export default function IconGrid( { icons, onChange, value } ) {
18
+ const shownIcons = useAsyncList( icons, {
19
+ step: BATCH_SIZE,
20
+ } );
21
+
22
+ // Scroll the selected icon into view, but wait until enough icons render
23
+ // below it so it can be centered rather than stuck at the bottom. Skip it
24
+ // if the user has already scrolled the list.
25
+ const selectedIconRef = useRef();
26
+ const selectedIndex =
27
+ icons?.findIndex( ( icon ) => icon.name === value ) ?? -1;
28
+ const isReadyToScroll =
29
+ selectedIndex >= 0 &&
30
+ ( shownIcons.length >= selectedIndex + BATCH_SIZE ||
31
+ shownIcons.length === icons.length );
32
+
33
+ useLayoutEffect( () => {
34
+ const node = selectedIconRef.current;
35
+ if ( ! isReadyToScroll || ! node ) {
36
+ return;
37
+ }
38
+ if ( getScrollContainer( node )?.scrollTop ) {
39
+ return;
40
+ }
41
+ node.scrollIntoView( { block: 'center' } );
42
+ }, [ isReadyToScroll ] );
43
+
13
44
  return (
14
45
  <div className="wp-block-icon__inserter-grid">
15
46
  { ! icons?.length ? (
@@ -21,26 +52,24 @@ export default function IconGrid( { icons, onChange, attributes } ) {
21
52
  className="wp-block-icon__inserter-grid-icons-list"
22
53
  aria-label={ __( 'Icon library' ) }
23
54
  >
24
- { icons.map( ( icon ) => {
55
+ { shownIcons.map( ( icon ) => {
25
56
  return (
26
57
  <Button
27
58
  key={ icon.name }
59
+ ref={
60
+ icon.name === value
61
+ ? selectedIconRef
62
+ : undefined
63
+ }
28
64
  className="wp-block-icon__inserter-grid-icons-list-item"
29
65
  onClick={ () => onChange( icon.name ) }
30
66
  variant={
31
- icon.name === attributes?.icon
32
- ? 'primary'
33
- : undefined
67
+ icon.name === value ? 'primary' : undefined
34
68
  }
35
69
  __next40pxDefaultSize
36
70
  >
37
71
  <span className="wp-block-icon__inserter-grid-icons-list-item-icon">
38
- <HtmlRenderer
39
- html={ icon.content }
40
- wrapperProps={ {
41
- style: { width: '24px' },
42
- } }
43
- />
72
+ <HtmlRenderer html={ icon.content } />
44
73
  </span>
45
74
  <span className="wp-block-icon__inserter-grid-icons-list-item-title">
46
75
  { icon.label }
@@ -2,9 +2,12 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { __ } from '@wordpress/i18n';
5
- import { Modal, SearchControl } from '@wordpress/components';
6
- import { useState, useMemo, useCallback } from '@wordpress/element';
5
+ import { Modal, SearchControl, Spinner } from '@wordpress/components';
6
+ import { Stack, Tabs } from '@wordpress/ui';
7
+ import { useState, useMemo } from '@wordpress/element';
7
8
  import { useDebounce } from '@wordpress/compose';
9
+ import { useSelect } from '@wordpress/data';
10
+ import { store as coreDataStore } from '@wordpress/core-data';
8
11
 
9
12
  /**
10
13
  * Internal dependencies
@@ -12,27 +15,56 @@ import { useDebounce } from '@wordpress/compose';
12
15
  import IconGrid from './icon-grid';
13
16
  import { normalizeSearchInput } from '../../../utils/search-patterns';
14
17
 
15
- export default function CustomInserterModal( {
16
- icons = [],
17
- setInserterOpen,
18
- attributes,
19
- setAttributes,
20
- } ) {
18
+ export default function CustomInserterModal( { onClose, value, onChange } ) {
21
19
  const [ searchInput, setSearchInput ] = useState( '' );
20
+ const [ currentCollection, setCurrentCollection ] = useState( null );
22
21
 
23
22
  const debouncedSetSearchInput = useDebounce( setSearchInput, 300 );
24
23
 
25
- const setIcon = useCallback(
26
- ( name ) => {
27
- setAttributes( {
28
- icon: name,
29
- } );
30
- setInserterOpen( false );
24
+ const collections = useSelect(
25
+ ( select ) =>
26
+ select( coreDataStore ).getEntityRecords(
27
+ 'root',
28
+ 'iconCollection'
29
+ ),
30
+ []
31
+ );
32
+
33
+ // Default to the collection the selected icon belongs to, otherwise the
34
+ // first collection.
35
+ const selectedCollection = value?.split( '/' )[ 0 ];
36
+ const collectionSlug =
37
+ currentCollection ??
38
+ ( collections?.some( ( { slug } ) => slug === selectedCollection )
39
+ ? selectedCollection
40
+ : collections?.[ 0 ]?.slug ) ??
41
+ null;
42
+
43
+ const { icons, hasResolvedIcons } = useSelect(
44
+ ( select ) => {
45
+ if ( collectionSlug === null ) {
46
+ return { icons: null, hasResolvedIcons: false };
47
+ }
48
+ const query =
49
+ collectionSlug === '' ? {} : { collection: collectionSlug };
50
+ const { getEntityRecords, hasFinishedResolution } =
51
+ select( coreDataStore );
52
+ return {
53
+ icons: getEntityRecords( 'root', 'icon', query ),
54
+ hasResolvedIcons: hasFinishedResolution( 'getEntityRecords', [
55
+ 'root',
56
+ 'icon',
57
+ query,
58
+ ] ),
59
+ };
31
60
  },
32
- [ setAttributes, setInserterOpen ]
61
+ [ collectionSlug ]
33
62
  );
34
63
 
35
64
  const filteredIcons = useMemo( () => {
65
+ if ( ! icons ) {
66
+ return [];
67
+ }
36
68
  if ( searchInput ) {
37
69
  const input = normalizeSearchInput( searchInput );
38
70
  return icons.filter( ( icon ) => {
@@ -52,22 +84,63 @@ export default function CustomInserterModal( {
52
84
  <Modal
53
85
  className="wp-block-icon__inserter-modal"
54
86
  title={ __( 'Icon library' ) }
55
- onRequestClose={ () => setInserterOpen( false ) }
87
+ onRequestClose={ onClose }
56
88
  isFullScreen
57
89
  >
58
- <div className="wp-block-icon__inserter">
59
- <div className="wp-block-icon__inserter-header">
90
+ <Tabs.Root
91
+ className="wp-block-icon__inserter"
92
+ orientation="vertical"
93
+ value={ collectionSlug }
94
+ onValueChange={ setCurrentCollection }
95
+ >
96
+ <Stack
97
+ direction="column"
98
+ gap="lg"
99
+ className="wp-block-icon__inserter-sidebar"
100
+ >
60
101
  <SearchControl
61
102
  value={ searchInput }
62
103
  onChange={ debouncedSetSearchInput }
63
104
  />
64
- </div>
65
- <IconGrid
66
- icons={ filteredIcons }
67
- onChange={ setIcon }
68
- attributes={ attributes }
69
- />
70
- </div>
105
+ <Tabs.List>
106
+ <Tabs.Tab value="">{ __( 'All' ) }</Tabs.Tab>
107
+ { collections?.map( ( collection ) => (
108
+ <Tabs.Tab
109
+ key={ collection.slug }
110
+ value={ collection.slug }
111
+ >
112
+ { collection.label }
113
+ </Tabs.Tab>
114
+ ) ) }
115
+ </Tabs.List>
116
+ </Stack>
117
+ { [ { slug: '' }, ...( collections ?? [] ) ].map(
118
+ ( collection ) => (
119
+ <Tabs.Panel
120
+ tabIndex={ -1 }
121
+ key={ collection.slug }
122
+ value={ collection.slug }
123
+ className="wp-block-icon__inserter-panel"
124
+ >
125
+ { ! hasResolvedIcons ? (
126
+ <div
127
+ className="wp-block-icon__inserter-loading"
128
+ role="status"
129
+ aria-label={ __( 'Loading…' ) }
130
+ >
131
+ <Spinner />
132
+ </div>
133
+ ) : (
134
+ <IconGrid
135
+ icons={ filteredIcons }
136
+ onChange={ onChange }
137
+ value={ value }
138
+ />
139
+ ) }
140
+ </Tabs.Panel>
141
+ )
142
+ ) }
143
+ </Tabs.Root>
71
144
  </Modal>
72
145
  );
73
146
  }
package/src/icon/edit.js CHANGED
@@ -74,20 +74,12 @@ export function Edit( { attributes, setAttributes } ) {
74
74
  const borderProps = useBorderProps( attributes );
75
75
  const dimensionsProps = useDimensionsProps( attributes );
76
76
 
77
- const { selectedIcon, allIcons = [] } = useSelect(
77
+ const selectedIcon = useSelect(
78
78
  ( select ) => {
79
- const { getEntityRecord, getEntityRecords } =
80
- select( coreDataStore );
81
- return {
82
- selectedIcon: icon
83
- ? getEntityRecord( 'root', 'icon', icon )
84
- : null,
85
- allIcons: isInserterOpen
86
- ? getEntityRecords( 'root', 'icon' )
87
- : undefined,
88
- };
79
+ const { getEntityRecord } = select( coreDataStore );
80
+ return icon ? getEntityRecord( 'root', 'icon', icon ) : null;
89
81
  },
90
- [ isInserterOpen, icon ]
82
+ [ icon ]
91
83
  );
92
84
 
93
85
  const iconToDisplay = selectedIcon?.content || '';
@@ -218,7 +210,7 @@ export function Edit( { attributes, setAttributes } ) {
218
210
  { blockControls }
219
211
  { inspectorControls }
220
212
  <div { ...useBlockProps() }>
221
- { icon ? (
213
+ { iconToDisplay ? (
222
214
  <HtmlRenderer
223
215
  html={ iconToDisplay }
224
216
  wrapperProps={ {
@@ -258,10 +250,12 @@ export function Edit( { attributes, setAttributes } ) {
258
250
  </div>
259
251
  { isInserterOpen && (
260
252
  <CustomInserterModal
261
- icons={ allIcons }
262
- setInserterOpen={ setInserterOpen }
263
- attributes={ attributes }
264
- setAttributes={ setAttributes }
253
+ onClose={ () => setInserterOpen( false ) }
254
+ value={ attributes.icon }
255
+ onChange={ ( name ) => {
256
+ setAttributes( { icon: name } );
257
+ setInserterOpen( false );
258
+ } }
265
259
  />
266
260
  ) }
267
261
  </>
@@ -1,22 +1,38 @@
1
1
  @use "@wordpress/base-styles/variables" as *;
2
2
  @use "@wordpress/base-styles/colors" as *;
3
+ @use "@wordpress/base-styles/mixins" as *;
3
4
 
4
5
  .wp-block[data-align="center"] > .wp-block-icon {
5
6
  display: flex;
6
7
  justify-content: center;
7
8
  }
8
9
 
9
- // Style for the icon library modal.
10
- .wp-block-icon__inserter {
11
- padding: 0 $grid-unit-30;
12
- margin: 0 (-1 * $grid-unit-30);
10
+ .wp-block-icon__inserter-sidebar {
11
+ padding-bottom: $grid-unit-30;
12
+
13
+ @include break-medium() {
14
+ overflow-x: visible;
15
+ overflow-y: auto;
16
+ position: absolute;
17
+ top: $header-height + $grid-unit-10;
18
+ left: 0;
19
+ bottom: 0;
20
+ width: $sidebar-width;
21
+ padding-top: $grid-unit-30;
22
+ padding-inline: $grid-unit-30;
23
+ }
24
+ }
25
+
26
+ .wp-block-icon__inserter-panel {
27
+ @include break-medium() {
28
+ margin-inline-start: $sidebar-width;
29
+ }
13
30
  }
14
31
 
15
- .wp-block-icon__inserter-header {
16
- align-items: center;
32
+ .wp-block-icon__inserter-loading {
17
33
  display: flex;
18
- justify-content: space-between;
19
- margin-bottom: $grid-unit-20;
34
+ justify-content: center;
35
+ padding: $grid-unit-30;
20
36
  }
21
37
 
22
38
  .wp-block-icon__inserter-grid-icons-list {
@@ -37,6 +53,14 @@
37
53
 
38
54
  .wp-block-icon__inserter-grid-icons-list-item-icon {
39
55
  padding: $grid-unit-15;
56
+
57
+ // Fit any icon within 24x24. The viewBox preserves the aspect ratio, so
58
+ // non-square icons are scaled and centered without distortion.
59
+ svg {
60
+ display: block;
61
+ width: $icon-size;
62
+ height: $icon-size;
63
+ }
40
64
  }
41
65
 
42
66
  .wp-block-icon__inserter-grid-icons-list-item-title {
@@ -45,6 +69,7 @@
45
69
  overflow: hidden;
46
70
  text-overflow: ellipsis;
47
71
  white-space: nowrap;
72
+ width: 100%;
48
73
  }
49
74
 
50
75
  .wp-block-icon__toolbar-content {
@@ -79,7 +79,7 @@ _Defined via the [`styles`](https://developer.wordpress.org/block-editor/referen
79
79
 
80
80
  _Defined via the [`selectors`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-selectors/) property in block.json._
81
81
 
82
- - **dimensions**: `.wp-block-image img`
82
+ - **dimensions**: `.wp-block-image img, .wp-block-image .components-placeholder`
83
83
  - **border**: `.wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder`
84
84
  - **shadow**: `.wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder`
85
85
  - **filter**:
@@ -141,7 +141,7 @@
141
141
  }
142
142
  },
143
143
  "selectors": {
144
- "dimensions": ".wp-block-image img",
144
+ "dimensions": ".wp-block-image img, .wp-block-image .components-placeholder",
145
145
  "border": ".wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder",
146
146
  "shadow": ".wp-block-image img, .wp-block-image .wp-block-image__crop-area, .wp-block-image .components-placeholder",
147
147
  "filter": {
package/src/image/edit.js CHANGED
@@ -31,7 +31,6 @@ import { store as uploadStore } from '@wordpress/upload-media';
31
31
  * Internal dependencies
32
32
  */
33
33
  import { useUploadMediaFromBlobURL } from '../utils/hooks';
34
- import { getCarriedGifConversionAttributes } from '../utils/gif-conversion-attributes';
35
34
  import Image from './image';
36
35
  import { isValidFileType } from './utils';
37
36
  import { useMaxWidthObserver } from './use-max-width-observer';
@@ -238,57 +237,6 @@ export function ImageEdit( {
238
237
  return;
239
238
  }
240
239
 
241
- // Switch to a converted GIF video block when the selected media is
242
- // an animated GIF whose sideloaded video companion is available.
243
- // Triggering off the upload's onChange (rather than watching the
244
- // attachment record) means already-saved image blocks are left
245
- // alone on page load - the explicit "Display as video" toolbar
246
- // button is the path for converting those. `animated_video` is
247
- // only ever set on GIF image attachments, so its presence is a
248
- // sufficient signal that this swap applies.
249
- //
250
- // A gallery only accepts `core/image` children, so the swap is
251
- // skipped there; the converted video is still sideloaded and
252
- // stored for use elsewhere.
253
- const rootClientId = getBlockRootClientId( clientId );
254
- const isInGallery =
255
- !! rootClientId && getBlockName( rootClientId ) === 'core/gallery';
256
- if (
257
- ! isInGallery &&
258
- media.media_details?.animated_video &&
259
- media.url
260
- ) {
261
- const dir = media.url.slice( 0, media.url.lastIndexOf( '/' ) + 1 );
262
- const poster = media.media_details.animated_video_poster;
263
- __unstableMarkNextChangeAsNotPersistent();
264
- replaceBlock(
265
- clientId,
266
- createBlock( 'core/video', {
267
- ...getCarriedGifConversionAttributes( attributes ),
268
- id: media.id,
269
- src: dir + media.media_details.animated_video,
270
- poster: poster ? dir + poster : undefined,
271
- caption: media.caption?.raw ?? media.caption,
272
- controls: false,
273
- loop: true,
274
- autoplay: true,
275
- muted: true,
276
- playsInline: true,
277
- /*
278
- * Carry the GIF's intrinsic dimensions so the <video> keeps
279
- * its aspect ratio from the first paint. Without them the
280
- * element collapses to the browser-default size and then
281
- * jumps once the poster/metadata load, which shows up as a
282
- * brief duplicated image during the swap.
283
- */
284
- width: media.media_details.width,
285
- height: media.media_details.height,
286
- } )
287
- );
288
- setTemporaryURL();
289
- return;
290
- }
291
-
292
240
  const { imageDefaultSize } = getSettings();
293
241
 
294
242
  // Try to use the previous selected image size if its available
@@ -129,6 +129,7 @@ figure.wp-block-image:not(.wp-block) {
129
129
  width: 100%;
130
130
  overflow: hidden;
131
131
 
132
+ // stylelint-disable selector-class-pattern -- react-easy-crop library class names.
132
133
  .reactEasyCrop_Container {
133
134
  // The linked Image block has `pointer-events: none` applied. Override it
134
135
  // here to enable the crop action.
@@ -143,6 +144,7 @@ figure.wp-block-image:not(.wp-block) {
143
144
  border-radius: 0; // Prevent's theme.json radius bleeding into cropper.
144
145
  }
145
146
  }
147
+ // stylelint-enable selector-class-pattern
146
148
  }
147
149
 
148
150
  .wp-block-image__crop-icon {