@wordpress/block-library 10.1.1-next.v.202607070741.0 → 10.3.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 (580) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/build/accordion/block.json +1 -0
  3. package/build/accordion-panel/block.json +1 -0
  4. package/build/button/edit.cjs +18 -8
  5. package/build/button/edit.cjs.map +2 -2
  6. package/build/code/edit.cjs +3 -1
  7. package/build/code/edit.cjs.map +2 -2
  8. package/build/cover/block.json +12 -0
  9. package/build/cover/edit/block-controls.cjs +14 -5
  10. package/build/cover/edit/block-controls.cjs.map +2 -2
  11. package/build/cover/edit/embed-video-url-input.cjs +5 -3
  12. package/build/cover/edit/embed-video-url-input.cjs.map +3 -3
  13. package/build/cover/edit/index.cjs +76 -32
  14. package/build/cover/edit/index.cjs.map +2 -2
  15. package/build/cover/embed-video-utils.cjs +17 -7
  16. package/build/cover/embed-video-utils.cjs.map +2 -2
  17. package/build/details/transforms.cjs +1 -3
  18. package/build/details/transforms.cjs.map +2 -2
  19. package/build/embed/edit.cjs +1 -1
  20. package/build/embed/edit.cjs.map +2 -2
  21. package/build/embed/embed-placeholder.cjs +1 -2
  22. package/build/embed/embed-placeholder.cjs.map +2 -2
  23. package/build/file/edit.cjs +4 -3
  24. package/build/file/edit.cjs.map +2 -2
  25. package/build/file/transforms.cjs +25 -60
  26. package/build/file/transforms.cjs.map +2 -2
  27. package/build/gallery/block.json +4 -2
  28. package/build/gallery/dynamic-gallery.cjs +104 -61
  29. package/build/gallery/dynamic-gallery.cjs.map +3 -3
  30. package/build/gallery/edit.cjs +1 -1
  31. package/build/gallery/edit.cjs.map +3 -3
  32. package/build/gallery/gap-styles.cjs +49 -13
  33. package/build/gallery/gap-styles.cjs.map +3 -3
  34. package/build/gallery/use-dynamic-gallery.cjs +15 -8
  35. package/build/gallery/use-dynamic-gallery.cjs.map +2 -2
  36. package/build/group/transforms.cjs +1 -1
  37. package/build/group/transforms.cjs.map +2 -2
  38. package/build/heading/edit.cjs +1 -1
  39. package/build/heading/edit.cjs.map +2 -2
  40. package/build/html/modal.cjs +63 -54
  41. package/build/html/modal.cjs.map +3 -3
  42. package/build/icon/block.json +5 -3
  43. package/build/icon/components/custom-inserter/icon-grid.cjs +25 -12
  44. package/build/icon/components/custom-inserter/icon-grid.cjs.map +2 -2
  45. package/build/icon/components/custom-inserter/index.cjs +100 -31
  46. package/build/icon/components/custom-inserter/index.cjs.map +3 -3
  47. package/build/icon/edit.cjs +11 -12
  48. package/build/icon/edit.cjs.map +2 -2
  49. package/build/image/block.json +1 -1
  50. package/build/image/edit.cjs +1 -35
  51. package/build/image/edit.cjs.map +2 -2
  52. package/build/image/image.cjs +23 -18
  53. package/build/image/image.cjs.map +3 -3
  54. package/build/image/transforms.cjs +78 -0
  55. package/build/image/transforms.cjs.map +3 -3
  56. package/build/image/use-open-image-media-editor-modal.cjs +6 -2
  57. package/build/image/use-open-image-media-editor-modal.cjs.map +2 -2
  58. package/build/index.cjs +18 -8
  59. package/build/index.cjs.map +2 -2
  60. package/build/latest-posts/edit.cjs +5 -8
  61. package/build/latest-posts/edit.cjs.map +2 -2
  62. package/build/list-item/edit.cjs +1 -1
  63. package/build/list-item/edit.cjs.map +2 -2
  64. package/build/list-item/hooks/use-enter.cjs +14 -17
  65. package/build/list-item/hooks/use-enter.cjs.map +3 -3
  66. package/build/list-item/hooks/use-indent-list-item.cjs +10 -2
  67. package/build/list-item/hooks/use-indent-list-item.cjs.map +2 -2
  68. package/build/list-item/hooks/use-space.cjs +3 -2
  69. package/build/list-item/hooks/use-space.cjs.map +3 -3
  70. package/build/math/edit.cjs +39 -56
  71. package/build/math/edit.cjs.map +3 -3
  72. package/build/media-text/edit.cjs +2 -1
  73. package/build/media-text/edit.cjs.map +2 -2
  74. package/build/more/edit.cjs +2 -2
  75. package/build/more/edit.cjs.map +2 -2
  76. package/build/navigation/edit/index.cjs +30 -16
  77. package/build/navigation/edit/index.cjs.map +3 -3
  78. package/build/navigation/edit/use-layout-custom-properties.cjs +72 -0
  79. package/build/navigation/edit/use-layout-custom-properties.cjs.map +7 -0
  80. package/build/navigation/view.cjs +9 -6
  81. package/build/navigation/view.cjs.map +2 -2
  82. package/build/navigation-link/edit.cjs +3 -3
  83. package/build/navigation-link/edit.cjs.map +2 -2
  84. package/build/navigation-link/link-ui/index.cjs +2 -2
  85. package/build/navigation-link/link-ui/index.cjs.map +2 -2
  86. package/build/paragraph/edit.cjs +5 -2
  87. package/build/paragraph/edit.cjs.map +3 -3
  88. package/build/paragraph/index.cjs +4 -1
  89. package/build/paragraph/index.cjs.map +2 -2
  90. package/build/paragraph/use-enter.cjs +3 -7
  91. package/build/paragraph/use-enter.cjs.map +3 -3
  92. package/build/playlist/block.json +29 -10
  93. package/build/playlist/context.cjs +2 -1
  94. package/build/playlist/context.cjs.map +2 -2
  95. package/build/playlist/edit.cjs +328 -39
  96. package/build/playlist/edit.cjs.map +3 -3
  97. package/build/playlist/index.cjs +1 -1
  98. package/build/playlist/index.cjs.map +2 -2
  99. package/build/playlist/utils.cjs +37 -8
  100. package/build/playlist/utils.cjs.map +2 -2
  101. package/build/playlist/view.cjs +83 -13
  102. package/build/playlist/view.cjs.map +2 -2
  103. package/build/playlist-track/block.json +4 -2
  104. package/build/playlist-track/edit.cjs +115 -70
  105. package/build/playlist-track/edit.cjs.map +2 -2
  106. package/build/post-content/block.json +1 -0
  107. package/build/post-content/edit.cjs +36 -15
  108. package/build/post-content/edit.cjs.map +2 -2
  109. package/build/post-featured-image/edit.cjs +3 -2
  110. package/build/post-featured-image/edit.cjs.map +2 -2
  111. package/build/post-template/block.json +2 -1
  112. package/build/post-template/edit.cjs +10 -1
  113. package/build/post-template/edit.cjs.map +2 -2
  114. package/build/post-terms/edit.cjs +2 -2
  115. package/build/post-terms/edit.cjs.map +2 -2
  116. package/build/post-title/edit.cjs +2 -2
  117. package/build/post-title/edit.cjs.map +2 -2
  118. package/build/preformatted/edit.cjs +3 -1
  119. package/build/preformatted/edit.cjs.map +2 -2
  120. package/build/pullquote/block.json +3 -1
  121. package/build/pullquote/edit.cjs +5 -3
  122. package/build/pullquote/edit.cjs.map +2 -2
  123. package/build/query/block.json +3 -2
  124. package/build/query/edit/inspector-controls/index.cjs +42 -5
  125. package/build/query/edit/inspector-controls/index.cjs.map +2 -2
  126. package/build/query/edit/inspector-controls/offset-controls.cjs +1 -2
  127. package/build/query/edit/inspector-controls/offset-controls.cjs.map +2 -2
  128. package/build/query/edit/inspector-controls/pages-control.cjs +0 -1
  129. package/build/query/edit/inspector-controls/pages-control.cjs.map +2 -2
  130. package/build/query/edit/query-content.cjs +10 -3
  131. package/build/query/edit/query-content.cjs.map +2 -2
  132. package/build/query/index.cjs +2 -1
  133. package/build/query/index.cjs.map +2 -2
  134. package/build/quote/block.json +3 -1
  135. package/build/quote/transforms.cjs +1 -3
  136. package/build/quote/transforms.cjs.map +2 -2
  137. package/build/read-more/edit.cjs +3 -1
  138. package/build/read-more/edit.cjs.map +2 -2
  139. package/build/rss/edit.cjs +0 -1
  140. package/build/rss/edit.cjs.map +2 -2
  141. package/build/site-tagline/edit.cjs +3 -1
  142. package/build/site-tagline/edit.cjs.map +2 -2
  143. package/build/site-title/edit.cjs +3 -1
  144. package/build/site-title/edit.cjs.map +2 -2
  145. package/build/social-links/edit.cjs +11 -4
  146. package/build/social-links/edit.cjs.map +2 -2
  147. package/build/tab-list/block.json +4 -3
  148. package/build/tab-list/edit.cjs +67 -11
  149. package/build/tab-list/edit.cjs.map +3 -3
  150. package/build/tab-list/tab-movers.cjs +87 -0
  151. package/build/tab-list/tab-movers.cjs.map +7 -0
  152. package/build/tab-panel/block.json +1 -6
  153. package/build/tab-panel/edit.cjs +16 -24
  154. package/build/tab-panel/edit.cjs.map +2 -2
  155. package/build/tab-panels/block.json +0 -1
  156. package/build/table/edit.cjs +1 -1
  157. package/build/table/edit.cjs.map +2 -2
  158. package/build/tabs/block.json +0 -5
  159. package/build/tabs/edit.cjs +4 -39
  160. package/build/tabs/edit.cjs.map +3 -3
  161. package/build/tabs/use-tab-actions.cjs +23 -1
  162. package/build/tabs/use-tab-actions.cjs.map +2 -2
  163. package/build/tabs/use-tab-list-items-sync.cjs +19 -1
  164. package/build/tabs/use-tab-list-items-sync.cjs.map +2 -2
  165. package/build/term-name/block.json +1 -3
  166. package/build/term-name/deprecated.cjs +105 -0
  167. package/build/term-name/deprecated.cjs.map +7 -0
  168. package/build/term-name/edit.cjs +11 -37
  169. package/build/term-name/edit.cjs.map +3 -3
  170. package/build/term-name/index.cjs +3 -1
  171. package/build/term-name/index.cjs.map +3 -3
  172. package/build/utils/caption.cjs +2 -2
  173. package/build/utils/caption.cjs.map +2 -2
  174. package/build/utils/waveform-player.cjs +138 -22
  175. package/build/utils/waveform-player.cjs.map +2 -2
  176. package/build/utils/waveform-utils.cjs +315 -17
  177. package/build/utils/waveform-utils.cjs.map +2 -2
  178. package/build/verse/edit.cjs +3 -1
  179. package/build/verse/edit.cjs.map +2 -2
  180. package/build/video/edit.cjs +2 -11
  181. package/build/video/edit.cjs.map +3 -3
  182. package/build/video/tracks-editor.cjs +0 -1
  183. package/build/video/tracks-editor.cjs.map +2 -2
  184. package/build-module/accordion/block.json +1 -0
  185. package/build-module/accordion-panel/block.json +1 -0
  186. package/build-module/button/edit.mjs +19 -14
  187. package/build-module/button/edit.mjs.map +2 -2
  188. package/build-module/code/edit.mjs +3 -1
  189. package/build-module/code/edit.mjs.map +2 -2
  190. package/build-module/cover/block.json +12 -0
  191. package/build-module/cover/edit/block-controls.mjs +14 -5
  192. package/build-module/cover/edit/block-controls.mjs.map +2 -2
  193. package/build-module/cover/edit/embed-video-url-input.mjs +5 -4
  194. package/build-module/cover/edit/embed-video-url-input.mjs.map +2 -2
  195. package/build-module/cover/edit/index.mjs +79 -35
  196. package/build-module/cover/edit/index.mjs.map +2 -2
  197. package/build-module/cover/embed-video-utils.mjs +16 -7
  198. package/build-module/cover/embed-video-utils.mjs.map +2 -2
  199. package/build-module/details/transforms.mjs +2 -7
  200. package/build-module/details/transforms.mjs.map +2 -2
  201. package/build-module/embed/edit.mjs +1 -1
  202. package/build-module/embed/edit.mjs.map +2 -2
  203. package/build-module/embed/embed-placeholder.mjs +1 -2
  204. package/build-module/embed/embed-placeholder.mjs.map +2 -2
  205. package/build-module/file/edit.mjs +4 -3
  206. package/build-module/file/edit.mjs.map +2 -2
  207. package/build-module/file/transforms.mjs +25 -60
  208. package/build-module/file/transforms.mjs.map +2 -2
  209. package/build-module/gallery/block.json +4 -2
  210. package/build-module/gallery/dynamic-gallery.mjs +104 -61
  211. package/build-module/gallery/dynamic-gallery.mjs.map +2 -2
  212. package/build-module/gallery/edit.mjs +3 -3
  213. package/build-module/gallery/edit.mjs.map +2 -2
  214. package/build-module/gallery/gap-styles.mjs +53 -14
  215. package/build-module/gallery/gap-styles.mjs.map +2 -2
  216. package/build-module/gallery/use-dynamic-gallery.mjs +16 -9
  217. package/build-module/gallery/use-dynamic-gallery.mjs.map +2 -2
  218. package/build-module/group/transforms.mjs +2 -5
  219. package/build-module/group/transforms.mjs.map +2 -2
  220. package/build-module/heading/edit.mjs +1 -1
  221. package/build-module/heading/edit.mjs.map +2 -2
  222. package/build-module/html/modal.mjs +68 -55
  223. package/build-module/html/modal.mjs.map +2 -2
  224. package/build-module/icon/block.json +5 -3
  225. package/build-module/icon/components/custom-inserter/icon-grid.mjs +25 -12
  226. package/build-module/icon/components/custom-inserter/icon-grid.mjs.map +2 -2
  227. package/build-module/icon/components/custom-inserter/index.mjs +102 -33
  228. package/build-module/icon/components/custom-inserter/index.mjs.map +2 -2
  229. package/build-module/icon/edit.mjs +11 -12
  230. package/build-module/icon/edit.mjs.map +2 -2
  231. package/build-module/image/block.json +1 -1
  232. package/build-module/image/edit.mjs +1 -35
  233. package/build-module/image/edit.mjs.map +2 -2
  234. package/build-module/image/image.mjs +23 -18
  235. package/build-module/image/image.mjs.map +2 -2
  236. package/build-module/image/transforms.mjs +78 -0
  237. package/build-module/image/transforms.mjs.map +2 -2
  238. package/build-module/image/use-open-image-media-editor-modal.mjs +6 -2
  239. package/build-module/image/use-open-image-media-editor-modal.mjs.map +2 -2
  240. package/build-module/index.mjs +18 -8
  241. package/build-module/index.mjs.map +2 -2
  242. package/build-module/latest-posts/edit.mjs +5 -8
  243. package/build-module/latest-posts/edit.mjs.map +2 -2
  244. package/build-module/list-item/edit.mjs +1 -1
  245. package/build-module/list-item/edit.mjs.map +2 -2
  246. package/build-module/list-item/hooks/use-enter.mjs +15 -21
  247. package/build-module/list-item/hooks/use-enter.mjs.map +2 -2
  248. package/build-module/list-item/hooks/use-indent-list-item.mjs +10 -2
  249. package/build-module/list-item/hooks/use-indent-list-item.mjs.map +2 -2
  250. package/build-module/list-item/hooks/use-space.mjs +4 -6
  251. package/build-module/list-item/hooks/use-space.mjs.map +2 -2
  252. package/build-module/math/edit.mjs +41 -60
  253. package/build-module/math/edit.mjs.map +2 -2
  254. package/build-module/media-text/edit.mjs +2 -1
  255. package/build-module/media-text/edit.mjs.map +2 -2
  256. package/build-module/more/edit.mjs +2 -2
  257. package/build-module/more/edit.mjs.map +2 -2
  258. package/build-module/navigation/edit/index.mjs +30 -16
  259. package/build-module/navigation/edit/index.mjs.map +2 -2
  260. package/build-module/navigation/edit/use-layout-custom-properties.mjs +51 -0
  261. package/build-module/navigation/edit/use-layout-custom-properties.mjs.map +7 -0
  262. package/build-module/navigation/view.mjs +9 -6
  263. package/build-module/navigation/view.mjs.map +2 -2
  264. package/build-module/navigation-link/edit.mjs +3 -3
  265. package/build-module/navigation-link/edit.mjs.map +2 -2
  266. package/build-module/navigation-link/link-ui/index.mjs +2 -2
  267. package/build-module/navigation-link/link-ui/index.mjs.map +2 -2
  268. package/build-module/paragraph/edit.mjs +6 -2
  269. package/build-module/paragraph/edit.mjs.map +2 -2
  270. package/build-module/paragraph/index.mjs +4 -1
  271. package/build-module/paragraph/index.mjs.map +2 -2
  272. package/build-module/paragraph/use-enter.mjs +4 -11
  273. package/build-module/paragraph/use-enter.mjs.map +2 -2
  274. package/build-module/playlist/block.json +29 -10
  275. package/build-module/playlist/context.mjs +2 -1
  276. package/build-module/playlist/context.mjs.map +2 -2
  277. package/build-module/playlist/edit.mjs +331 -41
  278. package/build-module/playlist/edit.mjs.map +2 -2
  279. package/build-module/playlist/index.mjs +1 -1
  280. package/build-module/playlist/index.mjs.map +2 -2
  281. package/build-module/playlist/utils.mjs +35 -7
  282. package/build-module/playlist/utils.mjs.map +2 -2
  283. package/build-module/playlist/view.mjs +89 -14
  284. package/build-module/playlist/view.mjs.map +2 -2
  285. package/build-module/playlist-track/block.json +4 -2
  286. package/build-module/playlist-track/edit.mjs +117 -71
  287. package/build-module/playlist-track/edit.mjs.map +2 -2
  288. package/build-module/post-content/block.json +1 -0
  289. package/build-module/post-content/edit.mjs +37 -15
  290. package/build-module/post-content/edit.mjs.map +2 -2
  291. package/build-module/post-featured-image/edit.mjs +3 -2
  292. package/build-module/post-featured-image/edit.mjs.map +2 -2
  293. package/build-module/post-template/block.json +2 -1
  294. package/build-module/post-template/edit.mjs +10 -1
  295. package/build-module/post-template/edit.mjs.map +2 -2
  296. package/build-module/post-terms/edit.mjs +2 -2
  297. package/build-module/post-terms/edit.mjs.map +2 -2
  298. package/build-module/post-title/edit.mjs +2 -2
  299. package/build-module/post-title/edit.mjs.map +2 -2
  300. package/build-module/preformatted/edit.mjs +3 -1
  301. package/build-module/preformatted/edit.mjs.map +2 -2
  302. package/build-module/pullquote/block.json +3 -1
  303. package/build-module/pullquote/edit.mjs +5 -3
  304. package/build-module/pullquote/edit.mjs.map +2 -2
  305. package/build-module/query/block.json +3 -2
  306. package/build-module/query/edit/inspector-controls/index.mjs +44 -6
  307. package/build-module/query/edit/inspector-controls/index.mjs.map +2 -2
  308. package/build-module/query/edit/inspector-controls/offset-controls.mjs +2 -3
  309. package/build-module/query/edit/inspector-controls/offset-controls.mjs.map +2 -2
  310. package/build-module/query/edit/inspector-controls/pages-control.mjs +0 -1
  311. package/build-module/query/edit/inspector-controls/pages-control.mjs.map +2 -2
  312. package/build-module/query/edit/query-content.mjs +10 -3
  313. package/build-module/query/edit/query-content.mjs.map +2 -2
  314. package/build-module/query/index.mjs +2 -1
  315. package/build-module/query/index.mjs.map +2 -2
  316. package/build-module/quote/block.json +3 -1
  317. package/build-module/quote/transforms.mjs +2 -4
  318. package/build-module/quote/transforms.mjs.map +2 -2
  319. package/build-module/read-more/edit.mjs +3 -1
  320. package/build-module/read-more/edit.mjs.map +2 -2
  321. package/build-module/rss/edit.mjs +0 -1
  322. package/build-module/rss/edit.mjs.map +2 -2
  323. package/build-module/site-tagline/edit.mjs +3 -1
  324. package/build-module/site-tagline/edit.mjs.map +2 -2
  325. package/build-module/site-title/edit.mjs +3 -1
  326. package/build-module/site-title/edit.mjs.map +2 -2
  327. package/build-module/social-links/edit.mjs +11 -4
  328. package/build-module/social-links/edit.mjs.map +2 -2
  329. package/build-module/tab-list/block.json +4 -3
  330. package/build-module/tab-list/edit.mjs +74 -13
  331. package/build-module/tab-list/edit.mjs.map +2 -2
  332. package/build-module/tab-list/tab-movers.mjs +59 -0
  333. package/build-module/tab-list/tab-movers.mjs.map +7 -0
  334. package/build-module/tab-panel/block.json +1 -6
  335. package/build-module/tab-panel/edit.mjs +17 -25
  336. package/build-module/tab-panel/edit.mjs.map +2 -2
  337. package/build-module/tab-panels/block.json +0 -1
  338. package/build-module/table/edit.mjs +1 -1
  339. package/build-module/table/edit.mjs.map +2 -2
  340. package/build-module/tabs/block.json +0 -5
  341. package/build-module/tabs/edit.mjs +5 -45
  342. package/build-module/tabs/edit.mjs.map +2 -2
  343. package/build-module/tabs/use-tab-actions.mjs +23 -1
  344. package/build-module/tabs/use-tab-actions.mjs.map +2 -2
  345. package/build-module/tabs/use-tab-list-items-sync.mjs +19 -1
  346. package/build-module/tabs/use-tab-list-items-sync.mjs.map +2 -2
  347. package/build-module/term-name/block.json +1 -3
  348. package/build-module/term-name/deprecated.mjs +74 -0
  349. package/build-module/term-name/deprecated.mjs.map +7 -0
  350. package/build-module/term-name/edit.mjs +11 -28
  351. package/build-module/term-name/edit.mjs.map +2 -2
  352. package/build-module/term-name/index.mjs +3 -1
  353. package/build-module/term-name/index.mjs.map +2 -2
  354. package/build-module/utils/caption.mjs +2 -2
  355. package/build-module/utils/caption.mjs.map +2 -2
  356. package/build-module/utils/waveform-player.mjs +144 -23
  357. package/build-module/utils/waveform-player.mjs.map +2 -2
  358. package/build-module/utils/waveform-utils.mjs +310 -16
  359. package/build-module/utils/waveform-utils.mjs.map +2 -2
  360. package/build-module/verse/edit.mjs +3 -1
  361. package/build-module/verse/edit.mjs.map +2 -2
  362. package/build-module/video/edit.mjs +2 -11
  363. package/build-module/video/edit.mjs.map +2 -2
  364. package/build-module/video/tracks-editor.mjs +0 -1
  365. package/build-module/video/tracks-editor.mjs.map +2 -2
  366. package/build-style/cover/editor-rtl.css +3 -0
  367. package/build-style/cover/editor.css +3 -0
  368. package/build-style/editor-rtl.css +61 -59
  369. package/build-style/editor.css +61 -59
  370. package/build-style/icon/editor-rtl.css +80 -10
  371. package/build-style/icon/editor.css +80 -10
  372. package/build-style/image/editor-rtl.css +3 -32
  373. package/build-style/image/editor.css +3 -32
  374. package/build-style/more/editor-rtl.css +2 -2
  375. package/build-style/more/editor.css +2 -2
  376. package/build-style/navigation/editor-rtl.css +3 -4
  377. package/build-style/navigation/editor.css +3 -4
  378. package/build-style/navigation-link/editor-rtl.css +1 -1
  379. package/build-style/navigation-link/editor.css +1 -1
  380. package/build-style/nextpage/editor-rtl.css +2 -2
  381. package/build-style/nextpage/editor.css +2 -2
  382. package/build-style/playlist/editor-rtl.css +4 -3
  383. package/build-style/playlist/editor.css +4 -3
  384. package/build-style/playlist/style-rtl.css +81 -5
  385. package/build-style/playlist/style.css +81 -5
  386. package/build-style/playlist-track/style-rtl.css +10 -0
  387. package/build-style/playlist-track/style.css +10 -0
  388. package/build-style/pullquote/editor-rtl.css +4 -0
  389. package/build-style/pullquote/editor.css +4 -0
  390. package/build-style/style-rtl.css +91 -5
  391. package/build-style/style.css +91 -5
  392. package/build-style/tab-list/editor-rtl.css +101 -0
  393. package/build-style/tab-list/editor.css +101 -0
  394. package/build-style/video/editor-rtl.css +1 -1
  395. package/build-style/video/editor.css +1 -1
  396. package/build-types/table-of-contents/list.d.ts +1 -1
  397. package/build-types/table-of-contents/list.d.ts.map +1 -1
  398. package/package.json +47 -45
  399. package/src/accordion/README.md +1 -0
  400. package/src/accordion/block.json +1 -0
  401. package/src/accordion-panel/block.json +1 -0
  402. package/src/breadcrumbs/index.php +3 -1
  403. package/src/button/edit.js +21 -15
  404. package/src/button/index.php +1 -1
  405. package/src/code/edit.js +7 -2
  406. package/src/cover/README.md +60 -0
  407. package/src/cover/block.json +12 -0
  408. package/src/cover/edit/block-controls.js +26 -11
  409. package/src/cover/edit/embed-video-url-input.js +5 -4
  410. package/src/cover/edit/index.js +109 -46
  411. package/src/cover/editor.scss +6 -0
  412. package/src/cover/embed-video-utils.js +38 -13
  413. package/src/cover/index.php +9 -2
  414. package/src/details/transforms.js +2 -7
  415. package/src/editor.scss +1 -0
  416. package/src/embed/edit.js +3 -1
  417. package/src/embed/embed-placeholder.js +9 -8
  418. package/src/file/edit.js +8 -8
  419. package/src/file/transforms.js +28 -60
  420. package/src/form/index.php +6 -4
  421. package/src/gallery/README.md +1 -1
  422. package/src/gallery/block.json +4 -2
  423. package/src/gallery/dynamic-gallery.js +133 -74
  424. package/src/gallery/edit.js +3 -3
  425. package/src/gallery/gap-styles.js +79 -20
  426. package/src/gallery/index.php +103 -43
  427. package/src/gallery/use-dynamic-gallery.js +27 -12
  428. package/src/group/transforms.js +2 -5
  429. package/src/heading/edit.js +1 -1
  430. package/src/html/modal.js +13 -2
  431. package/src/icon/README.md +1 -3
  432. package/src/icon/block.json +5 -3
  433. package/src/icon/components/custom-inserter/icon-grid.js +40 -11
  434. package/src/icon/components/custom-inserter/index.js +98 -25
  435. package/src/icon/edit.js +11 -17
  436. package/src/icon/editor.scss +33 -11
  437. package/src/image/README.md +1 -1
  438. package/src/image/block.json +1 -1
  439. package/src/image/edit.js +1 -57
  440. package/src/image/editor.scss +6 -44
  441. package/src/image/image.js +56 -27
  442. package/src/image/test/use-open-image-media-editor-modal.js +37 -1
  443. package/src/image/transforms.js +128 -0
  444. package/src/image/use-open-image-media-editor-modal.js +8 -1
  445. package/src/index.js +19 -7
  446. package/src/latest-posts/edit.js +5 -8
  447. package/src/latest-posts/index.php +49 -18
  448. package/src/list-item/edit.js +1 -1
  449. package/src/list-item/hooks/use-enter.js +15 -22
  450. package/src/list-item/hooks/use-indent-list-item.js +10 -1
  451. package/src/list-item/hooks/use-space.js +4 -6
  452. package/src/math/edit.js +42 -59
  453. package/src/media-text/edit.js +1 -0
  454. package/src/media-text/editor.scss +1 -0
  455. package/src/media-text/index.php +11 -2
  456. package/src/more/edit.js +7 -4
  457. package/src/more/editor.scss +1 -1
  458. package/src/navigation/edit/index.js +52 -36
  459. package/src/navigation/edit/test/layout-custom-properties.js +138 -0
  460. package/src/navigation/edit/use-layout-custom-properties.js +84 -0
  461. package/src/navigation/editor.scss +1 -2
  462. package/src/navigation/index.php +123 -12
  463. package/src/navigation/test/view.js +51 -0
  464. package/src/navigation/view.js +15 -14
  465. package/src/navigation-link/edit.js +11 -7
  466. package/src/navigation-link/editor.scss +1 -1
  467. package/src/navigation-link/index.php +70 -3
  468. package/src/navigation-link/link-ui/index.js +2 -1
  469. package/src/navigation-link/test/__snapshots__/hooks.js.snap +1 -1
  470. package/src/navigation-submenu/index.php +6 -3
  471. package/src/nextpage/editor.scss +1 -1
  472. package/src/page-list/index.php +4 -3
  473. package/src/paragraph/edit.js +9 -2
  474. package/src/paragraph/index.js +4 -1
  475. package/src/paragraph/use-enter.js +4 -11
  476. package/src/pattern/index.php +5 -5
  477. package/src/playlist/README.md +17 -18
  478. package/src/playlist/block.json +29 -10
  479. package/src/playlist/context.js +1 -0
  480. package/src/playlist/edit.js +395 -59
  481. package/src/playlist/editor.scss +4 -5
  482. package/src/playlist/index.js +1 -1
  483. package/src/playlist/index.php +71 -22
  484. package/src/playlist/style.scss +54 -1
  485. package/src/playlist/test/edit-component.js +139 -0
  486. package/src/playlist/test/edit.js +43 -2
  487. package/src/playlist/utils.js +49 -10
  488. package/src/playlist/view.js +97 -16
  489. package/src/playlist-track/README.md +3 -3
  490. package/src/playlist-track/block.json +4 -2
  491. package/src/playlist-track/edit.js +116 -75
  492. package/src/playlist-track/index.php +26 -11
  493. package/src/playlist-track/style.scss +10 -0
  494. package/src/playlist-track/test/edit.js +253 -0
  495. package/src/post-content/README.md +1 -0
  496. package/src/post-content/block.json +1 -0
  497. package/src/post-content/edit.js +45 -16
  498. package/src/post-excerpt/index.php +4 -1
  499. package/src/post-featured-image/edit.js +3 -2
  500. package/src/post-featured-image/index.php +4 -1
  501. package/src/post-template/README.md +1 -0
  502. package/src/post-template/block.json +2 -1
  503. package/src/post-template/edit.js +9 -0
  504. package/src/post-terms/edit.js +7 -4
  505. package/src/post-title/edit.js +5 -3
  506. package/src/preformatted/edit.js +7 -2
  507. package/src/pullquote/README.md +1 -0
  508. package/src/pullquote/block.json +3 -1
  509. package/src/pullquote/edit.js +9 -4
  510. package/src/pullquote/editor.scss +6 -0
  511. package/src/query/README.md +2 -1
  512. package/src/query/block.json +3 -2
  513. package/src/query/edit/inspector-controls/index.js +47 -4
  514. package/src/query/edit/inspector-controls/offset-controls.js +2 -3
  515. package/src/query/edit/inspector-controls/pages-control.js +0 -1
  516. package/src/query/edit/query-content.js +19 -3
  517. package/src/query/index.js +1 -0
  518. package/src/quote/README.md +1 -0
  519. package/src/quote/block.json +3 -1
  520. package/src/quote/transforms.js +2 -4
  521. package/src/read-more/edit.js +7 -2
  522. package/src/rss/edit.js +0 -1
  523. package/src/rss/index.php +10 -4
  524. package/src/site-tagline/edit.js +7 -2
  525. package/src/site-title/edit.js +7 -2
  526. package/src/social-link/index.php +19 -9
  527. package/src/social-links/edit.js +21 -12
  528. package/src/tab-list/README.md +4 -5
  529. package/src/tab-list/block.json +4 -3
  530. package/src/tab-list/edit.js +92 -28
  531. package/src/tab-list/editor.scss +9 -0
  532. package/src/tab-list/index.php +9 -4
  533. package/src/tab-list/tab-movers.js +72 -0
  534. package/src/tab-panel/README.md +4 -6
  535. package/src/tab-panel/block.json +1 -6
  536. package/src/tab-panel/edit.js +20 -33
  537. package/src/tab-panels/README.md +5 -3
  538. package/src/tab-panels/block.json +0 -1
  539. package/src/table/edit.js +1 -1
  540. package/src/table-of-contents/index.php +386 -1
  541. package/src/tabs/README.md +18 -9
  542. package/src/tabs/block.json +0 -5
  543. package/src/tabs/edit.js +7 -64
  544. package/src/tabs/use-tab-actions.js +32 -3
  545. package/src/tabs/use-tab-list-items-sync.js +24 -4
  546. package/src/tag-cloud/index.php +3 -2
  547. package/src/template-part/index.php +3 -17
  548. package/src/term-name/README.md +1 -1
  549. package/src/term-name/block.json +1 -3
  550. package/src/term-name/deprecated.js +74 -0
  551. package/src/term-name/edit.js +2 -18
  552. package/src/term-name/index.js +2 -0
  553. package/src/utils/caption.js +7 -4
  554. package/src/utils/media-control.scss +1 -5
  555. package/src/utils/test/waveform-player.js +297 -34
  556. package/src/utils/test/waveform-utils.js +473 -5
  557. package/src/utils/waveform-player.js +189 -59
  558. package/src/utils/waveform-utils.js +443 -40
  559. package/src/verse/edit.js +7 -2
  560. package/src/video/edit.js +0 -8
  561. package/src/video/editor.scss +1 -1
  562. package/src/video/index.php +2 -2
  563. package/src/video/tracks-editor.js +0 -1
  564. package/build/image/animated-gif-convert-control.cjs +0 -105
  565. package/build/image/animated-gif-convert-control.cjs.map +0 -7
  566. package/build/utils/gif-conversion-attributes.cjs +0 -40
  567. package/build/utils/gif-conversion-attributes.cjs.map +0 -7
  568. package/build/video/gif-restore-control.cjs +0 -73
  569. package/build/video/gif-restore-control.cjs.map +0 -7
  570. package/build-module/image/animated-gif-convert-control.mjs +0 -87
  571. package/build-module/image/animated-gif-convert-control.mjs.map +0 -7
  572. package/build-module/utils/gif-conversion-attributes.mjs +0 -15
  573. package/build-module/utils/gif-conversion-attributes.mjs.map +0 -7
  574. package/build-module/video/gif-restore-control.mjs +0 -55
  575. package/build-module/video/gif-restore-control.mjs.map +0 -7
  576. package/src/image/animated-gif-convert-control.js +0 -135
  577. package/src/image/test/animated-gif-convert-control.js +0 -276
  578. package/src/utils/gif-conversion-attributes.js +0 -30
  579. package/src/utils/test/gif-conversion-attributes.js +0 -60
  580. package/src/video/gif-restore-control.js +0 -92
@@ -6,12 +6,18 @@ import { store, getContext, getElement } from '@wordpress/interactivity';
6
6
  /**
7
7
  * Internal dependencies
8
8
  */
9
- import { initWaveformPlayer, logPlayError } from '../utils/waveform-utils';
9
+ import {
10
+ initWaveformPlayer,
11
+ logPlayError,
12
+ setupPlayButtonArtwork,
13
+ updateSeekControlLabel,
14
+ } from '../utils/waveform-utils';
10
15
 
11
16
  /**
12
17
  * Store player state for each element.
13
18
  */
14
19
  const playerState = new WeakMap();
20
+ const playlistPlayerState = new Map();
15
21
 
16
22
  const { state } = store(
17
23
  'core/playlist',
@@ -22,10 +28,34 @@ const { state } = store(
22
28
  const { currentId, trackId } = getContext();
23
29
  return currentId === trackId;
24
30
  },
31
+ get isCurrentTrackPlaying() {
32
+ const { currentId, isPlaying, trackId } = getContext();
33
+ return currentId === trackId && !! isPlaying;
34
+ },
35
+ get trackButtonActionLabel() {
36
+ const { labelPauseTrack, labelSelectTrack } = getContext();
37
+ return state.isCurrentTrackPlaying
38
+ ? labelPauseTrack
39
+ : labelSelectTrack;
40
+ },
25
41
  },
26
42
  actions: {
27
43
  changeTrack() {
28
44
  const context = getContext();
45
+ if ( context.currentId === context.trackId ) {
46
+ const player = playlistPlayerState.get(
47
+ context.playlistId
48
+ )?.instance;
49
+ if ( player?.isPlaying ) {
50
+ context.isPlaying = false;
51
+ player.pause();
52
+ } else {
53
+ player?.play()?.catch( logPlayError );
54
+ }
55
+ return;
56
+ }
57
+
58
+ context.isPlaying = false;
29
59
  context.currentId = context.trackId;
30
60
  },
31
61
  },
@@ -74,27 +104,55 @@ const { state } = store(
74
104
  */
75
105
  function initPlayer( ref, track, shouldAutoPlay, context ) {
76
106
  const existing = playerState.get( ref );
107
+ const showPlayButtonArtwork = context.showPlayButtonArtwork === true;
108
+ const playerArtwork = showPlayButtonArtwork ? '' : track.image;
77
109
 
78
110
  // If a player already exists, load the new track without recreating.
79
111
  if ( existing?.instance ) {
80
- existing.instance
81
- .loadTrack( track.url, track.title, track.artist, {
82
- artwork: track.image,
83
- } )
84
- .then( () => {
85
- existing.url = track.url;
86
- if ( shouldAutoPlay ) {
87
- existing.instance.play()?.catch( logPlayError );
88
- }
89
- } )
90
- .catch( logPlayError );
91
- return;
112
+ const shouldRecreatePlayer =
113
+ !! existing.instance.artworkEl !== !! playerArtwork;
114
+
115
+ if ( shouldRecreatePlayer ) {
116
+ existing.destroy?.();
117
+ playerState.delete( ref );
118
+ } else {
119
+ playlistPlayerState.set( context.playlistId, existing );
120
+ existing.instance
121
+ .loadTrack( track.url, track.title, track.artist, {
122
+ artwork: playerArtwork,
123
+ artworkAlt: playerArtwork ? track.imageAlt : '',
124
+ } )
125
+ .then( () => {
126
+ existing.url = track.url;
127
+ if ( existing.instance.artworkEl ) {
128
+ existing.instance.artworkEl.alt = track.imageAlt || '';
129
+ }
130
+ // loadTrack() preserves the previous explicit seekLabel option.
131
+ updateSeekControlLabel(
132
+ existing.instance,
133
+ track.title || ref.dataset.labelSeek
134
+ );
135
+ if ( showPlayButtonArtwork ) {
136
+ setupPlayButtonArtwork(
137
+ existing.container,
138
+ track.image
139
+ );
140
+ }
141
+ if ( shouldAutoPlay ) {
142
+ existing.instance.play()?.catch( logPlayError );
143
+ }
144
+ } )
145
+ .catch( logPlayError );
146
+ return;
147
+ }
92
148
  }
93
149
 
94
150
  // Read translated labels from server-rendered data attributes.
95
151
  const labels = {
96
152
  play: ref.dataset.labelPlay,
97
153
  pause: ref.dataset.labelPause,
154
+ seek: ref.dataset.labelSeek,
155
+ seekValueText: ref.dataset.labelSeekValue,
98
156
  };
99
157
 
100
158
  // Initialize using the shared core.
@@ -103,9 +161,15 @@ function initPlayer( ref, track, shouldAutoPlay, context ) {
103
161
  title: track.title,
104
162
  artist: track.artist,
105
163
  image: track.image,
164
+ imageAlt: track.imageAlt,
165
+ waveformColor: ref.dataset.waveformPlayerColor,
166
+ waveformGradient: ref.dataset.waveformPlayerGradient,
167
+ backgroundColor: ref.dataset.waveformPlayerBackgroundColor,
168
+ backgroundGradient: ref.dataset.waveformPlayerBackgroundGradient,
106
169
  autoPlay: shouldAutoPlay,
107
170
  labels,
108
171
  waveformStyle: context.waveformStyle,
172
+ showPlayButtonArtwork,
109
173
  onEnded: () => {
110
174
  // Advance to next track (autoPlay handles playback).
111
175
  const currentIndex = context.tracks.findIndex(
@@ -117,11 +181,28 @@ function initPlayer( ref, track, shouldAutoPlay, context ) {
117
181
  }
118
182
  },
119
183
  } );
184
+ const setIsPlaying = ( isPlaying ) => {
185
+ context.isPlaying = isPlaying;
186
+ };
187
+ const onPlay = () => setIsPlaying( true );
188
+ const onPause = () => setIsPlaying( false );
189
+ player.container.addEventListener( 'waveformplayer:play', onPlay );
190
+ player.container.addEventListener( 'waveformplayer:pause', onPause );
191
+ player.container.addEventListener( 'waveformplayer:ended', onPause );
192
+ const destroy = () => {
193
+ player.container.removeEventListener( 'waveformplayer:play', onPlay );
194
+ player.container.removeEventListener( 'waveformplayer:pause', onPause );
195
+ player.container.removeEventListener( 'waveformplayer:ended', onPause );
196
+ player.destroy();
197
+ };
120
198
 
121
199
  // Store state for cleanup, including instance for loadTrack reuse.
122
- playerState.set( ref, {
200
+ const nextState = {
123
201
  url: track.url,
124
202
  instance: player.instance,
125
- destroy: player.destroy,
126
- } );
203
+ container: player.container,
204
+ destroy,
205
+ };
206
+ playerState.set( ref, nextState );
207
+ playlistPlayerState.set( context.playlistId, nextState );
127
208
  }
@@ -1,8 +1,6 @@
1
1
  # Playlist track
2
2
 
3
3
  <!-- START TOKEN(Autogenerated block API docs) -->
4
- <div class="callout callout-warning">This block is <strong>experimental</strong> and may change or be removed without notice.</div>
5
-
6
4
  Playlist track.
7
5
 
8
6
  - **Name:** `core/playlist-track`
@@ -29,6 +27,7 @@ _Defined via the [`attributes`](https://developer.wordpress.org/block-editor/ref
29
27
  | `album` | `string` | — | — |
30
28
  | `artist` | `string` | — | — |
31
29
  | `image` | `string` | — | — |
30
+ | `imageAlt` | `string` | — | — |
32
31
  | `length` | `string` | — | — |
33
32
  | `title` | `string` | — | — |
34
33
 
@@ -48,6 +47,7 @@ _Defined via the [`usesContext` and `providesContext`](https://developer.wordpre
48
47
  **Uses context:**
49
48
 
50
49
  - `showArtists`
50
+ - `showImages`
51
51
 
52
52
  ## Block Markup
53
53
 
@@ -56,7 +56,7 @@ This is a [**dynamic block**](https://developer.wordpress.org/block-editor/getti
56
56
  In post content, it is stored as a block comment:
57
57
 
58
58
  ```html
59
- <!-- wp:playlist-track {"type":"audio"} /-->
59
+ <!-- wp:core/playlist-track {"id":123,"src":"https://example.com/audio.mp3","album":"Example album","artist":"Example creator","image":"https://example.com/track-image.jpg","imageAlt":"Track image","length":"3:21","title":"Sample track"} /-->
60
60
  ```
61
61
 
62
62
  ## Source
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "$schema": "https://schemas.wp.org/trunk/block.json",
3
3
  "apiVersion": 3,
4
- "__experimental": true,
5
4
  "name": "core/playlist-track",
6
5
  "title": "Playlist track",
7
6
  "category": "media",
@@ -9,7 +8,7 @@
9
8
  "description": "Playlist track.",
10
9
  "keywords": [ "music", "sound" ],
11
10
  "textdomain": "default",
12
- "usesContext": [ "showArtists" ],
11
+ "usesContext": [ "showArtists", "showImages" ],
13
12
  "attributes": {
14
13
  "blob": {
15
14
  "type": "string",
@@ -34,6 +33,9 @@
34
33
  "image": {
35
34
  "type": "string"
36
35
  },
36
+ "imageAlt": {
37
+ "type": "string"
38
+ },
37
39
  "length": {
38
40
  "type": "string"
39
41
  },
@@ -12,15 +12,17 @@ import {
12
12
  useBlockProps,
13
13
  BlockControls,
14
14
  InspectorControls,
15
- RichText,
15
+ PlainText,
16
16
  } from '@wordpress/block-editor';
17
17
  import {
18
18
  Button,
19
19
  PanelBody,
20
20
  TextControl,
21
+ TextareaControl,
21
22
  BaseControl,
22
23
  Spinner,
23
24
  } from '@wordpress/components';
25
+ import { Link } from '@wordpress/ui';
24
26
  import { useDispatch } from '@wordpress/data';
25
27
  import { store as noticesStore } from '@wordpress/notices';
26
28
  import { __ } from '@wordpress/i18n';
@@ -31,10 +33,11 @@ import { __unstableStripHTML as stripHTML } from '@wordpress/dom';
31
33
  * Internal dependencies
32
34
  */
33
35
  import { PlaylistContext } from '../playlist/context';
36
+ import { getTrackAttributes, getTrackImageAttributes } from '../playlist/utils';
34
37
  import { useUploadMediaFromBlobURL } from '../utils/hooks';
35
38
 
36
39
  const ALLOWED_MEDIA_TYPES = [ 'audio' ];
37
- const ALBUM_COVER_ALLOWED_MEDIA_TYPES = [ 'image' ];
40
+ const TRACK_IMAGE_ALLOWED_MEDIA_TYPES = [ 'image' ];
38
41
 
39
42
  const PlaylistTrackEdit = ( {
40
43
  attributes,
@@ -43,38 +46,48 @@ const PlaylistTrackEdit = ( {
43
46
  clientId,
44
47
  isSelected,
45
48
  } ) => {
46
- const { id, src, album, artist, image, length, title } = attributes;
49
+ const { id, src, album, artist, image, imageAlt, length, title } =
50
+ attributes;
47
51
  const [ temporaryURL, setTemporaryURL ] = useState( attributes.blob );
48
52
  const showArtists = context?.showArtists;
53
+ const showImages = context?.showImages ?? true;
49
54
  const imageButton = useRef();
50
55
  const blockProps = useBlockProps();
51
- const { currentTrackClientId, setCurrentTrackClientId } =
56
+ const { currentTrackClientId, setCurrentTrackClientId, addTracks } =
52
57
  useContext( PlaylistContext );
53
58
  const { createErrorNotice } = useDispatch( noticesStore );
54
59
  function onUploadError( message ) {
55
60
  createErrorNotice( message, { type: 'snackbar' } );
56
61
  }
62
+ const hasTrackSource = !! src || !! temporaryURL;
57
63
 
58
64
  useEffect( () => {
59
- if ( isSelected && currentTrackClientId !== clientId ) {
65
+ if (
66
+ isSelected &&
67
+ hasTrackSource &&
68
+ currentTrackClientId !== clientId
69
+ ) {
60
70
  setCurrentTrackClientId( clientId );
61
71
  }
62
72
  }, [
63
73
  isSelected,
74
+ hasTrackSource,
64
75
  clientId,
65
76
  currentTrackClientId,
66
77
  setCurrentTrackClientId,
67
78
  ] );
68
79
 
69
80
  useUploadMediaFromBlobURL( {
70
- src: temporaryURL,
81
+ url: temporaryURL,
71
82
  allowedTypes: ALLOWED_MEDIA_TYPES,
72
83
  onChange: onSelectTrack,
73
84
  onError: onUploadError,
74
85
  } );
75
86
 
76
87
  function onSelectTrack( media ) {
77
- if ( ! media || ! media.url ) {
88
+ const mediaUrl = media?.url ?? media?.source_url;
89
+
90
+ if ( ! media || ! mediaUrl ) {
78
91
  // In this case there was an error and we should continue in the editing state
79
92
  // previous attributes should be removed because they may be temporary blob urls.
80
93
  setAttributes( {
@@ -83,6 +96,7 @@ const PlaylistTrackEdit = ( {
83
96
  artist: undefined,
84
97
  album: undefined,
85
98
  image: undefined,
99
+ imageAlt: undefined,
86
100
  length: undefined,
87
101
  title: undefined,
88
102
  url: undefined,
@@ -91,49 +105,30 @@ const PlaylistTrackEdit = ( {
91
105
  return;
92
106
  }
93
107
 
94
- if ( isBlobURL( media.url ) ) {
95
- setTemporaryURL( media.url );
108
+ if ( isBlobURL( mediaUrl ) ) {
109
+ setTemporaryURL( mediaUrl );
96
110
  return;
97
111
  }
98
112
 
99
113
  setAttributes( {
100
114
  blob: undefined,
101
- id: media.id,
102
- src: media.url,
103
- artist:
104
- media.artist ||
105
- media?.meta?.artist ||
106
- media?.media_details?.artist ||
107
- __( 'Unknown artist' ),
108
- album:
109
- media.album ||
110
- media?.meta?.album ||
111
- media?.media_details?.album ||
112
- __( 'Unknown album' ),
113
- // Prevent using the default media attachment icon as the track image.
114
- image:
115
- media?.image?.src &&
116
- media?.image?.src.endsWith( '/images/media/audio.svg' )
117
- ? ''
118
- : media?.image?.src,
119
- length: media?.fileLength || media?.media_details?.length_formatted,
120
- title: media.title,
115
+ ...getTrackAttributes( media ),
121
116
  } );
122
117
  setTemporaryURL();
123
118
  }
124
119
 
125
- function onSelectAlbumCoverImage( coverImage ) {
126
- setAttributes( { image: coverImage.url } );
120
+ function onSelectTrackImage( trackImage ) {
121
+ setAttributes( getTrackImageAttributes( trackImage ) );
127
122
  }
128
123
 
129
- function onRemoveAlbumCoverImage() {
130
- setAttributes( { image: undefined } );
124
+ function onRemoveTrackImage() {
125
+ setAttributes( { image: undefined, imageAlt: undefined } );
131
126
 
132
127
  // Move focus back to the Media Upload button.
133
128
  imageButton.current.focus();
134
129
  }
135
130
 
136
- if ( ! src && ! temporaryURL ) {
131
+ if ( ! hasTrackSource ) {
137
132
  return (
138
133
  <div { ...blockProps }>
139
134
  <MediaPlaceholder
@@ -165,8 +160,23 @@ const PlaylistTrackEdit = ( {
165
160
  mediaURL={ src }
166
161
  allowedTypes={ ALLOWED_MEDIA_TYPES }
167
162
  onError={ onUploadError }
163
+ variant="toolbar"
168
164
  />
169
165
  </BlockControls>
166
+ { !! addTracks && (
167
+ <BlockControls group="block">
168
+ <MediaReplaceFlow
169
+ name={ __( 'Add' ) }
170
+ onSelect={ addTracks }
171
+ accept="audio/*"
172
+ multiple
173
+ handleUpload={ false }
174
+ allowedTypes={ ALLOWED_MEDIA_TYPES }
175
+ onError={ onUploadError }
176
+ variant="toolbar"
177
+ />
178
+ </BlockControls>
179
+ ) }
170
180
  <InspectorControls>
171
181
  <PanelBody title={ __( 'Settings' ) }>
172
182
  <TextControl
@@ -191,46 +201,74 @@ const PlaylistTrackEdit = ( {
191
201
  } }
192
202
  />
193
203
  <MediaUploadCheck>
194
- <div className="editor-video-poster-control">
204
+ <BaseControl>
195
205
  <BaseControl.VisualLabel>
196
- { __( 'Album cover image' ) }
206
+ { __( 'Track image' ) }
197
207
  </BaseControl.VisualLabel>
198
- { !! image && (
199
- <img
200
- src={ image }
201
- alt={ __(
202
- 'Preview of the album cover image'
208
+ <div className="editor-video-poster-control">
209
+ { !! image && (
210
+ <img
211
+ src={ image }
212
+ alt={ __(
213
+ 'Preview of the track image'
214
+ ) }
215
+ />
216
+ ) }
217
+ <MediaUpload
218
+ title={ __( 'Select image' ) }
219
+ onSelect={ onSelectTrackImage }
220
+ allowedTypes={
221
+ TRACK_IMAGE_ALLOWED_MEDIA_TYPES
222
+ }
223
+ render={ ( { open } ) => (
224
+ <Button
225
+ __next40pxDefaultSize
226
+ variant="primary"
227
+ onClick={ open }
228
+ ref={ imageButton }
229
+ >
230
+ { ! image
231
+ ? __( 'Select' )
232
+ : __( 'Replace' ) }
233
+ </Button>
203
234
  ) }
204
235
  />
205
- ) }
206
- <MediaUpload
207
- title={ __( 'Select image' ) }
208
- onSelect={ onSelectAlbumCoverImage }
209
- allowedTypes={ ALBUM_COVER_ALLOWED_MEDIA_TYPES }
210
- render={ ( { open } ) => (
236
+ { !! image && (
211
237
  <Button
212
238
  __next40pxDefaultSize
213
- variant="primary"
214
- onClick={ open }
215
- ref={ imageButton }
239
+ onClick={ onRemoveTrackImage }
240
+ variant="tertiary"
216
241
  >
217
- { ! image
218
- ? __( 'Select' )
219
- : __( 'Replace' ) }
242
+ { __( 'Remove' ) }
220
243
  </Button>
221
244
  ) }
222
- />
223
- { !! image && (
224
- <Button
225
- __next40pxDefaultSize
226
- onClick={ onRemoveAlbumCoverImage }
227
- variant="tertiary"
228
- >
229
- { __( 'Remove' ) }
230
- </Button>
231
- ) }
232
- </div>
245
+ </div>
246
+ </BaseControl>
233
247
  </MediaUploadCheck>
248
+ { !! image && (
249
+ <TextareaControl
250
+ label={ __( 'Alternative text' ) }
251
+ value={ imageAlt || '' }
252
+ onChange={ ( value ) =>
253
+ setAttributes( { imageAlt: value } )
254
+ }
255
+ help={
256
+ <Link
257
+ openInNewTab
258
+ href={
259
+ // translators: Localized tutorial, if one exists. W3C Web Accessibility Initiative link has list of existing translations.
260
+ __(
261
+ 'https://www.w3.org/WAI/tutorials/images/decision-tree/'
262
+ )
263
+ }
264
+ >
265
+ { __(
266
+ 'Describe the purpose of the image.'
267
+ ) }
268
+ </Link>
269
+ }
270
+ />
271
+ ) }
234
272
  </PanelBody>
235
273
  </InspectorControls>
236
274
  <li { ...blockProps }>
@@ -242,8 +280,15 @@ const PlaylistTrackEdit = ( {
242
280
  currentTrackClientId === clientId ? 'true' : 'false'
243
281
  }
244
282
  >
283
+ { showImages && !! image && (
284
+ <img
285
+ className="wp-block-playlist-track__image"
286
+ src={ image }
287
+ alt={ imageAlt || '' }
288
+ />
289
+ ) }
245
290
  <span className="wp-block-playlist-track__content">
246
- <RichText
291
+ <PlainText
247
292
  tagName="span"
248
293
  className="wp-block-playlist-track__title"
249
294
  value={ title }
@@ -251,11 +296,10 @@ const PlaylistTrackEdit = ( {
251
296
  onChange={ ( value ) => {
252
297
  setAttributes( { title: value } );
253
298
  } }
254
- allowedFormats={ [] }
255
- withoutInteractiveFormatting
299
+ __experimentalVersion={ 2 }
256
300
  />
257
301
  { showArtists && (
258
- <RichText
302
+ <PlainText
259
303
  tagName="span"
260
304
  className="wp-block-playlist-track__artist"
261
305
  value={ artist }
@@ -263,8 +307,7 @@ const PlaylistTrackEdit = ( {
263
307
  onChange={ ( value ) =>
264
308
  setAttributes( { artist: value } )
265
309
  }
266
- allowedFormats={ [] }
267
- withoutInteractiveFormatting
310
+ __experimentalVersion={ 2 }
268
311
  />
269
312
  ) }
270
313
  </span>
@@ -272,16 +315,14 @@ const PlaylistTrackEdit = ( {
272
315
  { length && (
273
316
  <span className="screen-reader-text">
274
317
  {
275
- /* translators: %s: Visually hidden label for the track length (screen reader text). */
276
- __( 'Length:' )
318
+ /* translators: Visually hidden label for the track duration (screen reader text). */
319
+ __( 'Duration:' )
277
320
  }
278
321
  </span>
279
322
  ) }
280
323
  { length }
281
324
  </span>
282
- <span className="screen-reader-text">
283
- { __( 'Select to play this track' ) }
284
- </span>
325
+ <span className="screen-reader-text">{ __( 'Play' ) }</span>
285
326
  </button>
286
327
  </li>
287
328
  </>
@@ -8,43 +8,58 @@
8
8
  /**
9
9
  * Renders the `core/playlist-track` block on server.
10
10
  *
11
- * @since 6.9.0
11
+ * @since 7.1.0
12
12
  *
13
- * @param array $attributes The block attributes.
13
+ * @param array $attributes The block attributes.
14
+ * @param string $content The block content.
15
+ * @param WP_Block|null $block The block instance.
14
16
  *
15
17
  * @return string Returns the Playlist Track.
16
18
  */
17
- function render_block_core_playlist_track( $attributes ) {
19
+ function render_block_core_playlist_track( $attributes, $content = '', $block = null ) {
18
20
  if ( empty( $attributes['id'] ) ) {
19
21
  return '';
20
22
  }
21
23
 
22
24
  $wrapper_attributes = get_block_wrapper_attributes();
25
+ $show_images = true;
26
+ if ( $block instanceof WP_Block && isset( $block->context['showImages'] ) ) {
27
+ $show_images = $block->context['showImages'];
28
+ }
23
29
 
24
- $artist = $attributes['artist'] ?? '';
25
- $length = $attributes['length'] ?? '';
26
- $title = isset( $attributes['title'] ) && ! empty( $attributes['title'] ) ? $attributes['title'] : __( 'Unknown title' );
30
+ $track_image = $attributes['image'] ?? null;
31
+ $image = is_string( $track_image ) ? $track_image : '';
32
+ $artist = $attributes['artist'] ?? '';
33
+ $alt = $attributes['imageAlt'] ?? '';
34
+ $length = $attributes['length'] ?? '';
35
+ $title = isset( $attributes['title'] ) && ! empty( $attributes['title'] ) ? $attributes['title'] : __( 'Unknown title' );
27
36
 
28
37
  $html = '<li ' . $wrapper_attributes . '>';
29
38
  $html .= '<button data-wp-on--click="actions.changeTrack" data-wp-bind--aria-current="state.isCurrentTrack" class="wp-block-playlist-track__button">';
30
39
 
40
+ if ( $show_images && $image ) {
41
+ $html .= '<img class="wp-block-playlist-track__image" src="' . esc_url( $image ) . '" alt="' . esc_attr( $alt ) . '" />';
42
+ }
43
+
31
44
  $html .= '<span class="wp-block-playlist-track__content">';
32
45
  if ( $title ) {
33
- $html .= '<span class="wp-block-playlist-track__title">' . wp_kses_post( $title ) . '</span>';
46
+ $html .= '<span class="wp-block-playlist-track__title">' . esc_html( $title ) . '</span>';
34
47
  }
35
48
  if ( $artist ) {
36
- $html .= '<span class="wp-block-playlist-track__artist">' . wp_kses_post( $artist ) . '</span>';
49
+ $html .= '<span class="wp-block-playlist-track__artist">' . esc_html( $artist ) . '</span>';
37
50
  }
38
51
  $html .= '</span>';
39
52
 
40
53
  if ( $length ) {
41
54
  $html .= '<span class="wp-block-playlist-track__length">';
42
- $html .= '<span class="screen-reader-text">' . esc_html__( 'Length:' ) . ' </span>';
55
+ $html .= '<span class="screen-reader-text">' . esc_html__( 'Duration:' ) . ' </span>';
43
56
  $html .= esc_html( $length );
44
57
  $html .= '</span>';
45
58
  }
46
59
 
47
- $html .= '<span class="screen-reader-text">' . esc_html__( 'Select to play this track' ) . '</span>';
60
+ $html .= '<span class="screen-reader-text" data-wp-text="state.trackButtonActionLabel">';
61
+ $html .= esc_html__( 'Play' );
62
+ $html .= '</span>';
48
63
  $html .= '</button>';
49
64
  $html .= '</li>';
50
65
 
@@ -54,7 +69,7 @@ function render_block_core_playlist_track( $attributes ) {
54
69
  /**
55
70
  * Registers the `core/playlist-track` block on server.
56
71
  *
57
- * @since 6.9.0
72
+ * @since 7.1.0
58
73
  */
59
74
  function register_block_core_playlist_track() {
60
75
  register_block_type_from_metadata(
@@ -33,6 +33,16 @@
33
33
  opacity: 0.7;
34
34
  }
35
35
 
36
+ .wp-block-playlist-track__image {
37
+ flex: 0 0 50px;
38
+ width: 50px;
39
+ height: 50px;
40
+ margin-right: var(--wp--preset--spacing--20, 0.5em);
41
+ border: 1px solid rgb(0 0 0 / 8%);
42
+ box-sizing: border-box;
43
+ object-fit: cover;
44
+ }
45
+
36
46
  .wp-block-playlist-track__content {
37
47
  flex: 1 1 0;
38
48
  min-width: 0;