@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
@@ -1,7 +1,13 @@
1
1
  // packages/block-library/src/playlist/view.js
2
2
  import { store, getContext, getElement } from "@wordpress/interactivity";
3
- import { initWaveformPlayer, logPlayError } from "../utils/waveform-utils.mjs";
3
+ import {
4
+ initWaveformPlayer,
5
+ logPlayError,
6
+ setupPlayButtonArtwork,
7
+ updateSeekControlLabel
8
+ } from "../utils/waveform-utils.mjs";
4
9
  var playerState = /* @__PURE__ */ new WeakMap();
10
+ var playlistPlayerState = /* @__PURE__ */ new Map();
5
11
  var { state } = store(
6
12
  "core/playlist",
7
13
  {
@@ -10,11 +16,32 @@ var { state } = store(
10
16
  get isCurrentTrack() {
11
17
  const { currentId, trackId } = getContext();
12
18
  return currentId === trackId;
19
+ },
20
+ get isCurrentTrackPlaying() {
21
+ const { currentId, isPlaying, trackId } = getContext();
22
+ return currentId === trackId && !!isPlaying;
23
+ },
24
+ get trackButtonActionLabel() {
25
+ const { labelPauseTrack, labelSelectTrack } = getContext();
26
+ return state.isCurrentTrackPlaying ? labelPauseTrack : labelSelectTrack;
13
27
  }
14
28
  },
15
29
  actions: {
16
30
  changeTrack() {
17
31
  const context = getContext();
32
+ if (context.currentId === context.trackId) {
33
+ const player = playlistPlayerState.get(
34
+ context.playlistId
35
+ )?.instance;
36
+ if (player?.isPlaying) {
37
+ context.isPlaying = false;
38
+ player.pause();
39
+ } else {
40
+ player?.play()?.catch(logPlayError);
41
+ }
42
+ return;
43
+ }
44
+ context.isPlaying = false;
18
45
  context.currentId = context.trackId;
19
46
  }
20
47
  },
@@ -42,29 +69,60 @@ var { state } = store(
42
69
  );
43
70
  function initPlayer(ref, track, shouldAutoPlay, context) {
44
71
  const existing = playerState.get(ref);
72
+ const showPlayButtonArtwork = context.showPlayButtonArtwork === true;
73
+ const playerArtwork = showPlayButtonArtwork ? "" : track.image;
45
74
  if (existing?.instance) {
46
- existing.instance.loadTrack(track.url, track.title, track.artist, {
47
- artwork: track.image
48
- }).then(() => {
49
- existing.url = track.url;
50
- if (shouldAutoPlay) {
51
- existing.instance.play()?.catch(logPlayError);
52
- }
53
- }).catch(logPlayError);
54
- return;
75
+ const shouldRecreatePlayer = !!existing.instance.artworkEl !== !!playerArtwork;
76
+ if (shouldRecreatePlayer) {
77
+ existing.destroy?.();
78
+ playerState.delete(ref);
79
+ } else {
80
+ playlistPlayerState.set(context.playlistId, existing);
81
+ existing.instance.loadTrack(track.url, track.title, track.artist, {
82
+ artwork: playerArtwork,
83
+ artworkAlt: playerArtwork ? track.imageAlt : ""
84
+ }).then(() => {
85
+ existing.url = track.url;
86
+ if (existing.instance.artworkEl) {
87
+ existing.instance.artworkEl.alt = track.imageAlt || "";
88
+ }
89
+ updateSeekControlLabel(
90
+ existing.instance,
91
+ track.title || ref.dataset.labelSeek
92
+ );
93
+ if (showPlayButtonArtwork) {
94
+ setupPlayButtonArtwork(
95
+ existing.container,
96
+ track.image
97
+ );
98
+ }
99
+ if (shouldAutoPlay) {
100
+ existing.instance.play()?.catch(logPlayError);
101
+ }
102
+ }).catch(logPlayError);
103
+ return;
104
+ }
55
105
  }
56
106
  const labels = {
57
107
  play: ref.dataset.labelPlay,
58
- pause: ref.dataset.labelPause
108
+ pause: ref.dataset.labelPause,
109
+ seek: ref.dataset.labelSeek,
110
+ seekValueText: ref.dataset.labelSeekValue
59
111
  };
60
112
  const player = initWaveformPlayer(ref, {
61
113
  src: track.url,
62
114
  title: track.title,
63
115
  artist: track.artist,
64
116
  image: track.image,
117
+ imageAlt: track.imageAlt,
118
+ waveformColor: ref.dataset.waveformPlayerColor,
119
+ waveformGradient: ref.dataset.waveformPlayerGradient,
120
+ backgroundColor: ref.dataset.waveformPlayerBackgroundColor,
121
+ backgroundGradient: ref.dataset.waveformPlayerBackgroundGradient,
65
122
  autoPlay: shouldAutoPlay,
66
123
  labels,
67
124
  waveformStyle: context.waveformStyle,
125
+ showPlayButtonArtwork,
68
126
  onEnded: () => {
69
127
  const currentIndex = context.tracks.findIndex(
70
128
  (trackId) => trackId === context.currentId
@@ -75,10 +133,27 @@ function initPlayer(ref, track, shouldAutoPlay, context) {
75
133
  }
76
134
  }
77
135
  });
78
- playerState.set(ref, {
136
+ const setIsPlaying = (isPlaying) => {
137
+ context.isPlaying = isPlaying;
138
+ };
139
+ const onPlay = () => setIsPlaying(true);
140
+ const onPause = () => setIsPlaying(false);
141
+ player.container.addEventListener("waveformplayer:play", onPlay);
142
+ player.container.addEventListener("waveformplayer:pause", onPause);
143
+ player.container.addEventListener("waveformplayer:ended", onPause);
144
+ const destroy = () => {
145
+ player.container.removeEventListener("waveformplayer:play", onPlay);
146
+ player.container.removeEventListener("waveformplayer:pause", onPause);
147
+ player.container.removeEventListener("waveformplayer:ended", onPause);
148
+ player.destroy();
149
+ };
150
+ const nextState = {
79
151
  url: track.url,
80
152
  instance: player.instance,
81
- destroy: player.destroy
82
- });
153
+ container: player.container,
154
+ destroy
155
+ };
156
+ playerState.set(ref, nextState);
157
+ playlistPlayerState.set(context.playlistId, nextState);
83
158
  }
84
159
  //# sourceMappingURL=view.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/playlist/view.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { store, getContext, getElement } from '@wordpress/interactivity';\n\n/**\n * Internal dependencies\n */\nimport { initWaveformPlayer, logPlayError } from '../utils/waveform-utils';\n\n/**\n * Store player state for each element.\n */\nconst playerState = new WeakMap();\n\nconst { state } = store(\n\t'core/playlist',\n\t{\n\t\tstate: {\n\t\t\tplaylists: {},\n\t\t\tget isCurrentTrack() {\n\t\t\t\tconst { currentId, trackId } = getContext();\n\t\t\t\treturn currentId === trackId;\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\tchangeTrack() {\n\t\t\t\tconst context = getContext();\n\t\t\t\tcontext.currentId = context.trackId;\n\t\t\t},\n\t\t},\n\t\tcallbacks: {\n\t\t\tinitWaveformPlayer() {\n\t\t\t\tconst context = getContext();\n\t\t\t\tconst { ref } = getElement();\n\n\t\t\t\tif ( ! context.currentId || ! ref ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst track =\n\t\t\t\t\tstate.playlists[ context.playlistId ]?.tracks[\n\t\t\t\t\t\tcontext.currentId\n\t\t\t\t\t];\n\t\t\t\tif ( ! track?.url ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst existing = playerState.get( ref );\n\n\t\t\t\t// Skip if we already initialized with this exact URL.\n\t\t\t\tif ( existing?.url === track.url ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Autoplay if we're switching from a different track (user action),\n\t\t\t\t// but not on initial page load (when existing has no URL).\n\t\t\t\tconst shouldAutoPlay = !! existing?.url;\n\n\t\t\t\tinitPlayer( ref, track, shouldAutoPlay, context );\n\t\t\t},\n\t\t},\n\t},\n\t{ lock: true }\n);\n\n/**\n * Initialize the waveform player for a given element.\n *\n * @param {Element} ref - The container element.\n * @param {Object} track - The track data.\n * @param {boolean} shouldAutoPlay - Whether to auto-play after initialization.\n * @param {Object} context - The Interactivity API context.\n */\nfunction initPlayer( ref, track, shouldAutoPlay, context ) {\n\tconst existing = playerState.get( ref );\n\n\t// If a player already exists, load the new track without recreating.\n\tif ( existing?.instance ) {\n\t\texisting.instance\n\t\t\t.loadTrack( track.url, track.title, track.artist, {\n\t\t\t\tartwork: track.image,\n\t\t\t} )\n\t\t\t.then( () => {\n\t\t\t\texisting.url = track.url;\n\t\t\t\tif ( shouldAutoPlay ) {\n\t\t\t\t\texisting.instance.play()?.catch( logPlayError );\n\t\t\t\t}\n\t\t\t} )\n\t\t\t.catch( logPlayError );\n\t\treturn;\n\t}\n\n\t// Read translated labels from server-rendered data attributes.\n\tconst labels = {\n\t\tplay: ref.dataset.labelPlay,\n\t\tpause: ref.dataset.labelPause,\n\t};\n\n\t// Initialize using the shared core.\n\tconst player = initWaveformPlayer( ref, {\n\t\tsrc: track.url,\n\t\ttitle: track.title,\n\t\tartist: track.artist,\n\t\timage: track.image,\n\t\tautoPlay: shouldAutoPlay,\n\t\tlabels,\n\t\twaveformStyle: context.waveformStyle,\n\t\tonEnded: () => {\n\t\t\t// Advance to next track (autoPlay handles playback).\n\t\t\tconst currentIndex = context.tracks.findIndex(\n\t\t\t\t( trackId ) => trackId === context.currentId\n\t\t\t);\n\t\t\tconst nextTrack = context.tracks[ currentIndex + 1 ];\n\t\t\tif ( nextTrack ) {\n\t\t\t\tcontext.currentId = nextTrack;\n\t\t\t}\n\t\t},\n\t} );\n\n\t// Store state for cleanup, including instance for loadTrack reuse.\n\tplayerState.set( ref, {\n\t\turl: track.url,\n\t\tinstance: player.instance,\n\t\tdestroy: player.destroy,\n\t} );\n}\n"],
5
- "mappings": ";AAGA,SAAS,OAAO,YAAY,kBAAkB;AAK9C,SAAS,oBAAoB,oBAAoB;AAKjD,IAAM,cAAc,oBAAI,QAAQ;AAEhC,IAAM,EAAE,MAAM,IAAI;AAAA,EACjB;AAAA,EACA;AAAA,IACC,OAAO;AAAA,MACN,WAAW,CAAC;AAAA,MACZ,IAAI,iBAAiB;AACpB,cAAM,EAAE,WAAW,QAAQ,IAAI,WAAW;AAC1C,eAAO,cAAc;AAAA,MACtB;AAAA,IACD;AAAA,IACA,SAAS;AAAA,MACR,cAAc;AACb,cAAM,UAAU,WAAW;AAC3B,gBAAQ,YAAY,QAAQ;AAAA,MAC7B;AAAA,IACD;AAAA,IACA,WAAW;AAAA,MACV,qBAAqB;AACpB,cAAM,UAAU,WAAW;AAC3B,cAAM,EAAE,IAAI,IAAI,WAAW;AAE3B,YAAK,CAAE,QAAQ,aAAa,CAAE,KAAM;AACnC;AAAA,QACD;AAEA,cAAM,QACL,MAAM,UAAW,QAAQ,UAAW,GAAG,OACtC,QAAQ,SACT;AACD,YAAK,CAAE,OAAO,KAAM;AACnB;AAAA,QACD;AAEA,cAAM,WAAW,YAAY,IAAK,GAAI;AAGtC,YAAK,UAAU,QAAQ,MAAM,KAAM;AAClC;AAAA,QACD;AAIA,cAAM,iBAAiB,CAAC,CAAE,UAAU;AAEpC,mBAAY,KAAK,OAAO,gBAAgB,OAAQ;AAAA,MACjD;AAAA,IACD;AAAA,EACD;AAAA,EACA,EAAE,MAAM,KAAK;AACd;AAUA,SAAS,WAAY,KAAK,OAAO,gBAAgB,SAAU;AAC1D,QAAM,WAAW,YAAY,IAAK,GAAI;AAGtC,MAAK,UAAU,UAAW;AACzB,aAAS,SACP,UAAW,MAAM,KAAK,MAAM,OAAO,MAAM,QAAQ;AAAA,MACjD,SAAS,MAAM;AAAA,IAChB,CAAE,EACD,KAAM,MAAM;AACZ,eAAS,MAAM,MAAM;AACrB,UAAK,gBAAiB;AACrB,iBAAS,SAAS,KAAK,GAAG,MAAO,YAAa;AAAA,MAC/C;AAAA,IACD,CAAE,EACD,MAAO,YAAa;AACtB;AAAA,EACD;AAGA,QAAM,SAAS;AAAA,IACd,MAAM,IAAI,QAAQ;AAAA,IAClB,OAAO,IAAI,QAAQ;AAAA,EACpB;AAGA,QAAM,SAAS,mBAAoB,KAAK;AAAA,IACvC,KAAK,MAAM;AAAA,IACX,OAAO,MAAM;AAAA,IACb,QAAQ,MAAM;AAAA,IACd,OAAO,MAAM;AAAA,IACb,UAAU;AAAA,IACV;AAAA,IACA,eAAe,QAAQ;AAAA,IACvB,SAAS,MAAM;AAEd,YAAM,eAAe,QAAQ,OAAO;AAAA,QACnC,CAAE,YAAa,YAAY,QAAQ;AAAA,MACpC;AACA,YAAM,YAAY,QAAQ,OAAQ,eAAe,CAAE;AACnD,UAAK,WAAY;AAChB,gBAAQ,YAAY;AAAA,MACrB;AAAA,IACD;AAAA,EACD,CAAE;AAGF,cAAY,IAAK,KAAK;AAAA,IACrB,KAAK,MAAM;AAAA,IACX,UAAU,OAAO;AAAA,IACjB,SAAS,OAAO;AAAA,EACjB,CAAE;AACH;",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { store, getContext, getElement } from '@wordpress/interactivity';\n\n/**\n * Internal dependencies\n */\nimport {\n\tinitWaveformPlayer,\n\tlogPlayError,\n\tsetupPlayButtonArtwork,\n\tupdateSeekControlLabel,\n} from '../utils/waveform-utils';\n\n/**\n * Store player state for each element.\n */\nconst playerState = new WeakMap();\nconst playlistPlayerState = new Map();\n\nconst { state } = store(\n\t'core/playlist',\n\t{\n\t\tstate: {\n\t\t\tplaylists: {},\n\t\t\tget isCurrentTrack() {\n\t\t\t\tconst { currentId, trackId } = getContext();\n\t\t\t\treturn currentId === trackId;\n\t\t\t},\n\t\t\tget isCurrentTrackPlaying() {\n\t\t\t\tconst { currentId, isPlaying, trackId } = getContext();\n\t\t\t\treturn currentId === trackId && !! isPlaying;\n\t\t\t},\n\t\t\tget trackButtonActionLabel() {\n\t\t\t\tconst { labelPauseTrack, labelSelectTrack } = getContext();\n\t\t\t\treturn state.isCurrentTrackPlaying\n\t\t\t\t\t? labelPauseTrack\n\t\t\t\t\t: labelSelectTrack;\n\t\t\t},\n\t\t},\n\t\tactions: {\n\t\t\tchangeTrack() {\n\t\t\t\tconst context = getContext();\n\t\t\t\tif ( context.currentId === context.trackId ) {\n\t\t\t\t\tconst player = playlistPlayerState.get(\n\t\t\t\t\t\tcontext.playlistId\n\t\t\t\t\t)?.instance;\n\t\t\t\t\tif ( player?.isPlaying ) {\n\t\t\t\t\t\tcontext.isPlaying = false;\n\t\t\t\t\t\tplayer.pause();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tplayer?.play()?.catch( logPlayError );\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tcontext.isPlaying = false;\n\t\t\t\tcontext.currentId = context.trackId;\n\t\t\t},\n\t\t},\n\t\tcallbacks: {\n\t\t\tinitWaveformPlayer() {\n\t\t\t\tconst context = getContext();\n\t\t\t\tconst { ref } = getElement();\n\n\t\t\t\tif ( ! context.currentId || ! ref ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst track =\n\t\t\t\t\tstate.playlists[ context.playlistId ]?.tracks[\n\t\t\t\t\t\tcontext.currentId\n\t\t\t\t\t];\n\t\t\t\tif ( ! track?.url ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst existing = playerState.get( ref );\n\n\t\t\t\t// Skip if we already initialized with this exact URL.\n\t\t\t\tif ( existing?.url === track.url ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Autoplay if we're switching from a different track (user action),\n\t\t\t\t// but not on initial page load (when existing has no URL).\n\t\t\t\tconst shouldAutoPlay = !! existing?.url;\n\n\t\t\t\tinitPlayer( ref, track, shouldAutoPlay, context );\n\t\t\t},\n\t\t},\n\t},\n\t{ lock: true }\n);\n\n/**\n * Initialize the waveform player for a given element.\n *\n * @param {Element} ref - The container element.\n * @param {Object} track - The track data.\n * @param {boolean} shouldAutoPlay - Whether to auto-play after initialization.\n * @param {Object} context - The Interactivity API context.\n */\nfunction initPlayer( ref, track, shouldAutoPlay, context ) {\n\tconst existing = playerState.get( ref );\n\tconst showPlayButtonArtwork = context.showPlayButtonArtwork === true;\n\tconst playerArtwork = showPlayButtonArtwork ? '' : track.image;\n\n\t// If a player already exists, load the new track without recreating.\n\tif ( existing?.instance ) {\n\t\tconst shouldRecreatePlayer =\n\t\t\t!! existing.instance.artworkEl !== !! playerArtwork;\n\n\t\tif ( shouldRecreatePlayer ) {\n\t\t\texisting.destroy?.();\n\t\t\tplayerState.delete( ref );\n\t\t} else {\n\t\t\tplaylistPlayerState.set( context.playlistId, existing );\n\t\t\texisting.instance\n\t\t\t\t.loadTrack( track.url, track.title, track.artist, {\n\t\t\t\t\tartwork: playerArtwork,\n\t\t\t\t\tartworkAlt: playerArtwork ? track.imageAlt : '',\n\t\t\t\t} )\n\t\t\t\t.then( () => {\n\t\t\t\t\texisting.url = track.url;\n\t\t\t\t\tif ( existing.instance.artworkEl ) {\n\t\t\t\t\t\texisting.instance.artworkEl.alt = track.imageAlt || '';\n\t\t\t\t\t}\n\t\t\t\t\t// loadTrack() preserves the previous explicit seekLabel option.\n\t\t\t\t\tupdateSeekControlLabel(\n\t\t\t\t\t\texisting.instance,\n\t\t\t\t\t\ttrack.title || ref.dataset.labelSeek\n\t\t\t\t\t);\n\t\t\t\t\tif ( showPlayButtonArtwork ) {\n\t\t\t\t\t\tsetupPlayButtonArtwork(\n\t\t\t\t\t\t\texisting.container,\n\t\t\t\t\t\t\ttrack.image\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif ( shouldAutoPlay ) {\n\t\t\t\t\t\texisting.instance.play()?.catch( logPlayError );\n\t\t\t\t\t}\n\t\t\t\t} )\n\t\t\t\t.catch( logPlayError );\n\t\t\treturn;\n\t\t}\n\t}\n\n\t// Read translated labels from server-rendered data attributes.\n\tconst labels = {\n\t\tplay: ref.dataset.labelPlay,\n\t\tpause: ref.dataset.labelPause,\n\t\tseek: ref.dataset.labelSeek,\n\t\tseekValueText: ref.dataset.labelSeekValue,\n\t};\n\n\t// Initialize using the shared core.\n\tconst player = initWaveformPlayer( ref, {\n\t\tsrc: track.url,\n\t\ttitle: track.title,\n\t\tartist: track.artist,\n\t\timage: track.image,\n\t\timageAlt: track.imageAlt,\n\t\twaveformColor: ref.dataset.waveformPlayerColor,\n\t\twaveformGradient: ref.dataset.waveformPlayerGradient,\n\t\tbackgroundColor: ref.dataset.waveformPlayerBackgroundColor,\n\t\tbackgroundGradient: ref.dataset.waveformPlayerBackgroundGradient,\n\t\tautoPlay: shouldAutoPlay,\n\t\tlabels,\n\t\twaveformStyle: context.waveformStyle,\n\t\tshowPlayButtonArtwork,\n\t\tonEnded: () => {\n\t\t\t// Advance to next track (autoPlay handles playback).\n\t\t\tconst currentIndex = context.tracks.findIndex(\n\t\t\t\t( trackId ) => trackId === context.currentId\n\t\t\t);\n\t\t\tconst nextTrack = context.tracks[ currentIndex + 1 ];\n\t\t\tif ( nextTrack ) {\n\t\t\t\tcontext.currentId = nextTrack;\n\t\t\t}\n\t\t},\n\t} );\n\tconst setIsPlaying = ( isPlaying ) => {\n\t\tcontext.isPlaying = isPlaying;\n\t};\n\tconst onPlay = () => setIsPlaying( true );\n\tconst onPause = () => setIsPlaying( false );\n\tplayer.container.addEventListener( 'waveformplayer:play', onPlay );\n\tplayer.container.addEventListener( 'waveformplayer:pause', onPause );\n\tplayer.container.addEventListener( 'waveformplayer:ended', onPause );\n\tconst destroy = () => {\n\t\tplayer.container.removeEventListener( 'waveformplayer:play', onPlay );\n\t\tplayer.container.removeEventListener( 'waveformplayer:pause', onPause );\n\t\tplayer.container.removeEventListener( 'waveformplayer:ended', onPause );\n\t\tplayer.destroy();\n\t};\n\n\t// Store state for cleanup, including instance for loadTrack reuse.\n\tconst nextState = {\n\t\turl: track.url,\n\t\tinstance: player.instance,\n\t\tcontainer: player.container,\n\t\tdestroy,\n\t};\n\tplayerState.set( ref, nextState );\n\tplaylistPlayerState.set( context.playlistId, nextState );\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -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
  },
@@ -10,25 +10,28 @@ import {
10
10
  useBlockProps,
11
11
  BlockControls,
12
12
  InspectorControls,
13
- RichText
13
+ PlainText
14
14
  } from "@wordpress/block-editor";
15
15
  import {
16
16
  Button,
17
17
  PanelBody,
18
18
  TextControl,
19
+ TextareaControl,
19
20
  BaseControl,
20
21
  Spinner
21
22
  } from "@wordpress/components";
23
+ import { Link } from "@wordpress/ui";
22
24
  import { useDispatch } from "@wordpress/data";
23
25
  import { store as noticesStore } from "@wordpress/notices";
24
26
  import { __ } from "@wordpress/i18n";
25
27
  import { audio as icon } from "@wordpress/icons";
26
28
  import { __unstableStripHTML as stripHTML } from "@wordpress/dom";
27
29
  import { PlaylistContext } from "../playlist/context.mjs";
30
+ import { getTrackAttributes, getTrackImageAttributes } from "../playlist/utils.mjs";
28
31
  import { useUploadMediaFromBlobURL } from "../utils/hooks.mjs";
29
32
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
30
33
  var ALLOWED_MEDIA_TYPES = ["audio"];
31
- var ALBUM_COVER_ALLOWED_MEDIA_TYPES = ["image"];
34
+ var TRACK_IMAGE_ALLOWED_MEDIA_TYPES = ["image"];
32
35
  var PlaylistTrackEdit = ({
33
36
  attributes,
34
37
  setAttributes,
@@ -36,9 +39,10 @@ var PlaylistTrackEdit = ({
36
39
  clientId,
37
40
  isSelected
38
41
  }) => {
39
- const { id, src, album, artist, image, length, title } = attributes;
42
+ const { id, src, album, artist, image, imageAlt, length, title } = attributes;
40
43
  const [temporaryURL, setTemporaryURL] = useState(attributes.blob);
41
44
  const showArtists = context?.showArtists;
45
+ const showImages = context?.showImages ?? true;
42
46
  const imageButton = useRef();
43
47
  const blockProps = useBlockProps();
44
48
  const { currentTrackClientId, setCurrentTrackClientId } = useContext(PlaylistContext);
@@ -46,12 +50,14 @@ var PlaylistTrackEdit = ({
46
50
  function onUploadError(message) {
47
51
  createErrorNotice(message, { type: "snackbar" });
48
52
  }
53
+ const hasTrackSource = !!src || !!temporaryURL;
49
54
  useEffect(() => {
50
- if (isSelected && currentTrackClientId !== clientId) {
55
+ if (isSelected && hasTrackSource && currentTrackClientId !== clientId) {
51
56
  setCurrentTrackClientId(clientId);
52
57
  }
53
58
  }, [
54
59
  isSelected,
60
+ hasTrackSource,
55
61
  clientId,
56
62
  currentTrackClientId,
57
63
  setCurrentTrackClientId
@@ -70,6 +76,7 @@ var PlaylistTrackEdit = ({
70
76
  artist: void 0,
71
77
  album: void 0,
72
78
  image: void 0,
79
+ imageAlt: void 0,
73
80
  length: void 0,
74
81
  title: void 0,
75
82
  url: void 0
@@ -83,25 +90,18 @@ var PlaylistTrackEdit = ({
83
90
  }
84
91
  setAttributes({
85
92
  blob: void 0,
86
- id: media.id,
87
- src: media.url,
88
- artist: media.artist || media?.meta?.artist || media?.media_details?.artist || __("Unknown artist"),
89
- album: media.album || media?.meta?.album || media?.media_details?.album || __("Unknown album"),
90
- // Prevent using the default media attachment icon as the track image.
91
- image: media?.image?.src && media?.image?.src.endsWith("/images/media/audio.svg") ? "" : media?.image?.src,
92
- length: media?.fileLength || media?.media_details?.length_formatted,
93
- title: media.title
93
+ ...getTrackAttributes(media)
94
94
  });
95
95
  setTemporaryURL();
96
96
  }
97
- function onSelectAlbumCoverImage(coverImage) {
98
- setAttributes({ image: coverImage.url });
97
+ function onSelectTrackImage(trackImage) {
98
+ setAttributes(getTrackImageAttributes(trackImage));
99
99
  }
100
- function onRemoveAlbumCoverImage() {
101
- setAttributes({ image: void 0 });
100
+ function onRemoveTrackImage() {
101
+ setAttributes({ image: void 0, imageAlt: void 0 });
102
102
  imageButton.current.focus();
103
103
  }
104
- if (!src && !temporaryURL) {
104
+ if (!hasTrackSource) {
105
105
  return /* @__PURE__ */ jsx("div", { ...blockProps, children: /* @__PURE__ */ jsx(
106
106
  MediaPlaceholder,
107
107
  {
@@ -164,45 +164,70 @@ var PlaylistTrackEdit = ({
164
164
  }
165
165
  }
166
166
  ),
167
- /* @__PURE__ */ jsx(MediaUploadCheck, { children: /* @__PURE__ */ jsxs("div", { className: "editor-video-poster-control", children: [
168
- /* @__PURE__ */ jsx(BaseControl.VisualLabel, { children: __("Album cover image") }),
169
- !!image && /* @__PURE__ */ jsx(
170
- "img",
171
- {
172
- src: image,
173
- alt: __(
174
- "Preview of the album cover image"
175
- )
176
- }
177
- ),
178
- /* @__PURE__ */ jsx(
179
- MediaUpload,
180
- {
181
- title: __("Select image"),
182
- onSelect: onSelectAlbumCoverImage,
183
- allowedTypes: ALBUM_COVER_ALLOWED_MEDIA_TYPES,
184
- render: ({ open }) => /* @__PURE__ */ jsx(
185
- Button,
186
- {
187
- __next40pxDefaultSize: true,
188
- variant: "primary",
189
- onClick: open,
190
- ref: imageButton,
191
- children: !image ? __("Select") : __("Replace")
192
- }
193
- )
194
- }
195
- ),
196
- !!image && /* @__PURE__ */ jsx(
197
- Button,
198
- {
199
- __next40pxDefaultSize: true,
200
- onClick: onRemoveAlbumCoverImage,
201
- variant: "tertiary",
202
- children: __("Remove")
203
- }
204
- )
205
- ] }) })
167
+ /* @__PURE__ */ jsx(MediaUploadCheck, { children: /* @__PURE__ */ jsxs(BaseControl, { children: [
168
+ /* @__PURE__ */ jsx(BaseControl.VisualLabel, { children: __("Track image") }),
169
+ /* @__PURE__ */ jsxs("div", { className: "editor-video-poster-control", children: [
170
+ !!image && /* @__PURE__ */ jsx(
171
+ "img",
172
+ {
173
+ src: image,
174
+ alt: __(
175
+ "Preview of the track image"
176
+ )
177
+ }
178
+ ),
179
+ /* @__PURE__ */ jsx(
180
+ MediaUpload,
181
+ {
182
+ title: __("Select image"),
183
+ onSelect: onSelectTrackImage,
184
+ allowedTypes: TRACK_IMAGE_ALLOWED_MEDIA_TYPES,
185
+ render: ({ open }) => /* @__PURE__ */ jsx(
186
+ Button,
187
+ {
188
+ __next40pxDefaultSize: true,
189
+ variant: "primary",
190
+ onClick: open,
191
+ ref: imageButton,
192
+ children: !image ? __("Select") : __("Replace")
193
+ }
194
+ )
195
+ }
196
+ ),
197
+ !!image && /* @__PURE__ */ jsx(
198
+ Button,
199
+ {
200
+ __next40pxDefaultSize: true,
201
+ onClick: onRemoveTrackImage,
202
+ variant: "tertiary",
203
+ children: __("Remove")
204
+ }
205
+ )
206
+ ] })
207
+ ] }) }),
208
+ !!image && /* @__PURE__ */ jsx(
209
+ TextareaControl,
210
+ {
211
+ label: __("Alternative text"),
212
+ value: imageAlt || "",
213
+ onChange: (value) => setAttributes({ imageAlt: value }),
214
+ help: /* @__PURE__ */ jsx(
215
+ Link,
216
+ {
217
+ openInNewTab: true,
218
+ href: (
219
+ // translators: Localized tutorial, if one exists. W3C Web Accessibility Initiative link has list of existing translations.
220
+ __(
221
+ "https://www.w3.org/WAI/tutorials/images/decision-tree/"
222
+ )
223
+ ),
224
+ children: __(
225
+ "Describe the purpose of the image."
226
+ )
227
+ }
228
+ )
229
+ }
230
+ )
206
231
  ] }) }),
207
232
  /* @__PURE__ */ jsxs("li", { ...blockProps, children: [
208
233
  !!temporaryURL && /* @__PURE__ */ jsx(Spinner, {}),
@@ -213,9 +238,17 @@ var PlaylistTrackEdit = ({
213
238
  onClick: () => setCurrentTrackClientId(clientId),
214
239
  "aria-current": currentTrackClientId === clientId ? "true" : "false",
215
240
  children: [
241
+ showImages && !!image && /* @__PURE__ */ jsx(
242
+ "img",
243
+ {
244
+ className: "wp-block-playlist-track__image",
245
+ src: image,
246
+ alt: imageAlt || ""
247
+ }
248
+ ),
216
249
  /* @__PURE__ */ jsxs("span", { className: "wp-block-playlist-track__content", children: [
217
250
  /* @__PURE__ */ jsx(
218
- RichText,
251
+ PlainText,
219
252
  {
220
253
  tagName: "span",
221
254
  className: "wp-block-playlist-track__title",
@@ -224,32 +257,30 @@ var PlaylistTrackEdit = ({
224
257
  onChange: (value) => {
225
258
  setAttributes({ title: value });
226
259
  },
227
- allowedFormats: [],
228
- withoutInteractiveFormatting: true
260
+ __experimentalVersion: 2
229
261
  }
230
262
  ),
231
263
  showArtists && /* @__PURE__ */ jsx(
232
- RichText,
264
+ PlainText,
233
265
  {
234
266
  tagName: "span",
235
267
  className: "wp-block-playlist-track__artist",
236
268
  value: artist,
237
269
  placeholder: __("Add artist"),
238
270
  onChange: (value) => setAttributes({ artist: value }),
239
- allowedFormats: [],
240
- withoutInteractiveFormatting: true
271
+ __experimentalVersion: 2
241
272
  }
242
273
  )
243
274
  ] }),
244
275
  /* @__PURE__ */ jsxs("span", { className: "wp-block-playlist-track__length", children: [
245
276
  length && /* @__PURE__ */ jsx("span", {
246
277
  className: "screen-reader-text",
247
- /* translators: %s: Visually hidden label for the track length (screen reader text). */
248
- children: __("Length:")
278
+ /* translators: Visually hidden label for the track duration (screen reader text). */
279
+ children: __("Duration:")
249
280
  }),
250
281
  length
251
282
  ] }),
252
- /* @__PURE__ */ jsx("span", { className: "screen-reader-text", children: __("Select to play this track") })
283
+ /* @__PURE__ */ jsx("span", { className: "screen-reader-text", children: __("Play") })
253
284
  ]
254
285
  }
255
286
  )
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/playlist-track/edit.js"],
4
- "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { isBlobURL } from '@wordpress/blob';\nimport { useContext, useEffect, useRef, useState } from '@wordpress/element';\nimport {\n\tMediaPlaceholder,\n\tMediaReplaceFlow,\n\tMediaUpload,\n\tMediaUploadCheck,\n\tBlockIcon,\n\tuseBlockProps,\n\tBlockControls,\n\tInspectorControls,\n\tRichText,\n} from '@wordpress/block-editor';\nimport {\n\tButton,\n\tPanelBody,\n\tTextControl,\n\tBaseControl,\n\tSpinner,\n} from '@wordpress/components';\nimport { useDispatch } from '@wordpress/data';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { __ } from '@wordpress/i18n';\nimport { audio as icon } from '@wordpress/icons';\nimport { __unstableStripHTML as stripHTML } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport { PlaylistContext } from '../playlist/context';\nimport { useUploadMediaFromBlobURL } from '../utils/hooks';\n\nconst ALLOWED_MEDIA_TYPES = [ 'audio' ];\nconst ALBUM_COVER_ALLOWED_MEDIA_TYPES = [ 'image' ];\n\nconst PlaylistTrackEdit = ( {\n\tattributes,\n\tsetAttributes,\n\tcontext,\n\tclientId,\n\tisSelected,\n} ) => {\n\tconst { id, src, album, artist, image, length, title } = attributes;\n\tconst [ temporaryURL, setTemporaryURL ] = useState( attributes.blob );\n\tconst showArtists = context?.showArtists;\n\tconst imageButton = useRef();\n\tconst blockProps = useBlockProps();\n\tconst { currentTrackClientId, setCurrentTrackClientId } =\n\t\tuseContext( PlaylistContext );\n\tconst { createErrorNotice } = useDispatch( noticesStore );\n\tfunction onUploadError( message ) {\n\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t}\n\n\tuseEffect( () => {\n\t\tif ( isSelected && currentTrackClientId !== clientId ) {\n\t\t\tsetCurrentTrackClientId( clientId );\n\t\t}\n\t}, [\n\t\tisSelected,\n\t\tclientId,\n\t\tcurrentTrackClientId,\n\t\tsetCurrentTrackClientId,\n\t] );\n\n\tuseUploadMediaFromBlobURL( {\n\t\tsrc: temporaryURL,\n\t\tallowedTypes: ALLOWED_MEDIA_TYPES,\n\t\tonChange: onSelectTrack,\n\t\tonError: onUploadError,\n\t} );\n\n\tfunction onSelectTrack( media ) {\n\t\tif ( ! media || ! media.url ) {\n\t\t\t// In this case there was an error and we should continue in the editing state\n\t\t\t// previous attributes should be removed because they may be temporary blob urls.\n\t\t\tsetAttributes( {\n\t\t\t\tblob: undefined,\n\t\t\t\tid: undefined,\n\t\t\t\tartist: undefined,\n\t\t\t\talbum: undefined,\n\t\t\t\timage: undefined,\n\t\t\t\tlength: undefined,\n\t\t\t\ttitle: undefined,\n\t\t\t\turl: undefined,\n\t\t\t} );\n\t\t\tsetTemporaryURL();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isBlobURL( media.url ) ) {\n\t\t\tsetTemporaryURL( media.url );\n\t\t\treturn;\n\t\t}\n\n\t\tsetAttributes( {\n\t\t\tblob: undefined,\n\t\t\tid: media.id,\n\t\t\tsrc: media.url,\n\t\t\tartist:\n\t\t\t\tmedia.artist ||\n\t\t\t\tmedia?.meta?.artist ||\n\t\t\t\tmedia?.media_details?.artist ||\n\t\t\t\t__( 'Unknown artist' ),\n\t\t\talbum:\n\t\t\t\tmedia.album ||\n\t\t\t\tmedia?.meta?.album ||\n\t\t\t\tmedia?.media_details?.album ||\n\t\t\t\t__( 'Unknown album' ),\n\t\t\t// Prevent using the default media attachment icon as the track image.\n\t\t\timage:\n\t\t\t\tmedia?.image?.src &&\n\t\t\t\tmedia?.image?.src.endsWith( '/images/media/audio.svg' )\n\t\t\t\t\t? ''\n\t\t\t\t\t: media?.image?.src,\n\t\t\tlength: media?.fileLength || media?.media_details?.length_formatted,\n\t\t\ttitle: media.title,\n\t\t} );\n\t\tsetTemporaryURL();\n\t}\n\n\tfunction onSelectAlbumCoverImage( coverImage ) {\n\t\tsetAttributes( { image: coverImage.url } );\n\t}\n\n\tfunction onRemoveAlbumCoverImage() {\n\t\tsetAttributes( { image: undefined } );\n\n\t\t// Move focus back to the Media Upload button.\n\t\timageButton.current.focus();\n\t}\n\n\tif ( ! src && ! temporaryURL ) {\n\t\treturn (\n\t\t\t<div { ...blockProps }>\n\t\t\t\t<MediaPlaceholder\n\t\t\t\t\ticon={ <BlockIcon icon={ icon } /> }\n\t\t\t\t\tlabels={ {\n\t\t\t\t\t\ttitle: __( 'Track' ),\n\t\t\t\t\t\tinstructions: __(\n\t\t\t\t\t\t\t'Upload an audio file or pick one from your media library.'\n\t\t\t\t\t\t),\n\t\t\t\t\t} }\n\t\t\t\t\tonSelect={ onSelectTrack }\n\t\t\t\t\taccept=\"audio/*\"\n\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\tvalue={ attributes }\n\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<BlockControls group=\"other\">\n\t\t\t\t<MediaReplaceFlow\n\t\t\t\t\tname={ __( 'Replace' ) }\n\t\t\t\t\tonSelect={ onSelectTrack }\n\t\t\t\t\taccept=\"audio/*\"\n\t\t\t\t\tmediaId={ id }\n\t\t\t\t\tmediaURL={ src }\n\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t/>\n\t\t\t</BlockControls>\n\t\t\t<InspectorControls>\n\t\t\t\t<PanelBody title={ __( 'Settings' ) }>\n\t\t\t\t\t<TextControl\n\t\t\t\t\t\tlabel={ __( 'Artist' ) }\n\t\t\t\t\t\tvalue={ artist ? stripHTML( artist ) : '' }\n\t\t\t\t\t\tonChange={ ( artistValue ) => {\n\t\t\t\t\t\t\tsetAttributes( { artist: artistValue } );\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t\t<TextControl\n\t\t\t\t\t\tlabel={ __( 'Album' ) }\n\t\t\t\t\t\tvalue={ album ? stripHTML( album ) : '' }\n\t\t\t\t\t\tonChange={ ( albumValue ) => {\n\t\t\t\t\t\t\tsetAttributes( { album: albumValue } );\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t\t<TextControl\n\t\t\t\t\t\tlabel={ __( 'Title' ) }\n\t\t\t\t\t\tvalue={ title ? stripHTML( title ) : '' }\n\t\t\t\t\t\tonChange={ ( titleValue ) => {\n\t\t\t\t\t\t\tsetAttributes( { title: titleValue } );\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t\t<MediaUploadCheck>\n\t\t\t\t\t\t<div className=\"editor-video-poster-control\">\n\t\t\t\t\t\t\t<BaseControl.VisualLabel>\n\t\t\t\t\t\t\t\t{ __( 'Album cover image' ) }\n\t\t\t\t\t\t\t</BaseControl.VisualLabel>\n\t\t\t\t\t\t\t{ !! image && (\n\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\tsrc={ image }\n\t\t\t\t\t\t\t\t\talt={ __(\n\t\t\t\t\t\t\t\t\t\t'Preview of the album cover image'\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t<MediaUpload\n\t\t\t\t\t\t\t\ttitle={ __( 'Select image' ) }\n\t\t\t\t\t\t\t\tonSelect={ onSelectAlbumCoverImage }\n\t\t\t\t\t\t\t\tallowedTypes={ ALBUM_COVER_ALLOWED_MEDIA_TYPES }\n\t\t\t\t\t\t\t\trender={ ( { open } ) => (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\t\t\t\tonClick={ open }\n\t\t\t\t\t\t\t\t\t\tref={ imageButton }\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{ ! image\n\t\t\t\t\t\t\t\t\t\t\t? __( 'Select' )\n\t\t\t\t\t\t\t\t\t\t\t: __( 'Replace' ) }\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{ !! image && (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t\t\tonClick={ onRemoveAlbumCoverImage }\n\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ __( 'Remove' ) }\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</MediaUploadCheck>\n\t\t\t\t</PanelBody>\n\t\t\t</InspectorControls>\n\t\t\t<li { ...blockProps }>\n\t\t\t\t{ !! temporaryURL && <Spinner /> }\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"wp-block-playlist-track__button\"\n\t\t\t\t\tonClick={ () => setCurrentTrackClientId( clientId ) }\n\t\t\t\t\taria-current={\n\t\t\t\t\t\tcurrentTrackClientId === clientId ? 'true' : 'false'\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"wp-block-playlist-track__content\">\n\t\t\t\t\t\t<RichText\n\t\t\t\t\t\t\ttagName=\"span\"\n\t\t\t\t\t\t\tclassName=\"wp-block-playlist-track__title\"\n\t\t\t\t\t\t\tvalue={ title }\n\t\t\t\t\t\t\tplaceholder={ __( 'Add title' ) }\n\t\t\t\t\t\t\tonChange={ ( value ) => {\n\t\t\t\t\t\t\t\tsetAttributes( { title: value } );\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\tallowedFormats={ [] }\n\t\t\t\t\t\t\twithoutInteractiveFormatting\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ showArtists && (\n\t\t\t\t\t\t\t<RichText\n\t\t\t\t\t\t\t\ttagName=\"span\"\n\t\t\t\t\t\t\t\tclassName=\"wp-block-playlist-track__artist\"\n\t\t\t\t\t\t\t\tvalue={ artist }\n\t\t\t\t\t\t\t\tplaceholder={ __( 'Add artist' ) }\n\t\t\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\t\t\tsetAttributes( { artist: value } )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tallowedFormats={ [] }\n\t\t\t\t\t\t\t\twithoutInteractiveFormatting\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"wp-block-playlist-track__length\">\n\t\t\t\t\t\t{ length && (\n\t\t\t\t\t\t\t<span className=\"screen-reader-text\">\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t/* translators: %s: Visually hidden label for the track length (screen reader text). */\n\t\t\t\t\t\t\t\t\t__( 'Length:' )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) }\n\t\t\t\t\t\t{ length }\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"screen-reader-text\">\n\t\t\t\t\t\t{ __( 'Select to play this track' ) }\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t</>\n\t);\n};\n\nexport default PlaylistTrackEdit;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { isBlobURL } from '@wordpress/blob';\nimport { useContext, useEffect, useRef, useState } from '@wordpress/element';\nimport {\n\tMediaPlaceholder,\n\tMediaReplaceFlow,\n\tMediaUpload,\n\tMediaUploadCheck,\n\tBlockIcon,\n\tuseBlockProps,\n\tBlockControls,\n\tInspectorControls,\n\tPlainText,\n} from '@wordpress/block-editor';\nimport {\n\tButton,\n\tPanelBody,\n\tTextControl,\n\tTextareaControl,\n\tBaseControl,\n\tSpinner,\n} from '@wordpress/components';\nimport { Link } from '@wordpress/ui';\nimport { useDispatch } from '@wordpress/data';\nimport { store as noticesStore } from '@wordpress/notices';\nimport { __ } from '@wordpress/i18n';\nimport { audio as icon } from '@wordpress/icons';\nimport { __unstableStripHTML as stripHTML } from '@wordpress/dom';\n\n/**\n * Internal dependencies\n */\nimport { PlaylistContext } from '../playlist/context';\nimport { getTrackAttributes, getTrackImageAttributes } from '../playlist/utils';\nimport { useUploadMediaFromBlobURL } from '../utils/hooks';\n\nconst ALLOWED_MEDIA_TYPES = [ 'audio' ];\nconst TRACK_IMAGE_ALLOWED_MEDIA_TYPES = [ 'image' ];\n\nconst PlaylistTrackEdit = ( {\n\tattributes,\n\tsetAttributes,\n\tcontext,\n\tclientId,\n\tisSelected,\n} ) => {\n\tconst { id, src, album, artist, image, imageAlt, length, title } =\n\t\tattributes;\n\tconst [ temporaryURL, setTemporaryURL ] = useState( attributes.blob );\n\tconst showArtists = context?.showArtists;\n\tconst showImages = context?.showImages ?? true;\n\tconst imageButton = useRef();\n\tconst blockProps = useBlockProps();\n\tconst { currentTrackClientId, setCurrentTrackClientId } =\n\t\tuseContext( PlaylistContext );\n\tconst { createErrorNotice } = useDispatch( noticesStore );\n\tfunction onUploadError( message ) {\n\t\tcreateErrorNotice( message, { type: 'snackbar' } );\n\t}\n\tconst hasTrackSource = !! src || !! temporaryURL;\n\n\tuseEffect( () => {\n\t\tif (\n\t\t\tisSelected &&\n\t\t\thasTrackSource &&\n\t\t\tcurrentTrackClientId !== clientId\n\t\t) {\n\t\t\tsetCurrentTrackClientId( clientId );\n\t\t}\n\t}, [\n\t\tisSelected,\n\t\thasTrackSource,\n\t\tclientId,\n\t\tcurrentTrackClientId,\n\t\tsetCurrentTrackClientId,\n\t] );\n\n\tuseUploadMediaFromBlobURL( {\n\t\tsrc: temporaryURL,\n\t\tallowedTypes: ALLOWED_MEDIA_TYPES,\n\t\tonChange: onSelectTrack,\n\t\tonError: onUploadError,\n\t} );\n\n\tfunction onSelectTrack( media ) {\n\t\tif ( ! media || ! media.url ) {\n\t\t\t// In this case there was an error and we should continue in the editing state\n\t\t\t// previous attributes should be removed because they may be temporary blob urls.\n\t\t\tsetAttributes( {\n\t\t\t\tblob: undefined,\n\t\t\t\tid: undefined,\n\t\t\t\tartist: undefined,\n\t\t\t\talbum: undefined,\n\t\t\t\timage: undefined,\n\t\t\t\timageAlt: undefined,\n\t\t\t\tlength: undefined,\n\t\t\t\ttitle: undefined,\n\t\t\t\turl: undefined,\n\t\t\t} );\n\t\t\tsetTemporaryURL();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( isBlobURL( media.url ) ) {\n\t\t\tsetTemporaryURL( media.url );\n\t\t\treturn;\n\t\t}\n\n\t\tsetAttributes( {\n\t\t\tblob: undefined,\n\t\t\t...getTrackAttributes( media ),\n\t\t} );\n\t\tsetTemporaryURL();\n\t}\n\n\tfunction onSelectTrackImage( trackImage ) {\n\t\tsetAttributes( getTrackImageAttributes( trackImage ) );\n\t}\n\n\tfunction onRemoveTrackImage() {\n\t\tsetAttributes( { image: undefined, imageAlt: undefined } );\n\n\t\t// Move focus back to the Media Upload button.\n\t\timageButton.current.focus();\n\t}\n\n\tif ( ! hasTrackSource ) {\n\t\treturn (\n\t\t\t<div { ...blockProps }>\n\t\t\t\t<MediaPlaceholder\n\t\t\t\t\ticon={ <BlockIcon icon={ icon } /> }\n\t\t\t\t\tlabels={ {\n\t\t\t\t\t\ttitle: __( 'Track' ),\n\t\t\t\t\t\tinstructions: __(\n\t\t\t\t\t\t\t'Upload an audio file or pick one from your media library.'\n\t\t\t\t\t\t),\n\t\t\t\t\t} }\n\t\t\t\t\tonSelect={ onSelectTrack }\n\t\t\t\t\taccept=\"audio/*\"\n\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\tvalue={ attributes }\n\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<BlockControls group=\"other\">\n\t\t\t\t<MediaReplaceFlow\n\t\t\t\t\tname={ __( 'Replace' ) }\n\t\t\t\t\tonSelect={ onSelectTrack }\n\t\t\t\t\taccept=\"audio/*\"\n\t\t\t\t\tmediaId={ id }\n\t\t\t\t\tmediaURL={ src }\n\t\t\t\t\tallowedTypes={ ALLOWED_MEDIA_TYPES }\n\t\t\t\t\tonError={ onUploadError }\n\t\t\t\t/>\n\t\t\t</BlockControls>\n\t\t\t<InspectorControls>\n\t\t\t\t<PanelBody title={ __( 'Settings' ) }>\n\t\t\t\t\t<TextControl\n\t\t\t\t\t\tlabel={ __( 'Artist' ) }\n\t\t\t\t\t\tvalue={ artist ? stripHTML( artist ) : '' }\n\t\t\t\t\t\tonChange={ ( artistValue ) => {\n\t\t\t\t\t\t\tsetAttributes( { artist: artistValue } );\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t\t<TextControl\n\t\t\t\t\t\tlabel={ __( 'Album' ) }\n\t\t\t\t\t\tvalue={ album ? stripHTML( album ) : '' }\n\t\t\t\t\t\tonChange={ ( albumValue ) => {\n\t\t\t\t\t\t\tsetAttributes( { album: albumValue } );\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t\t<TextControl\n\t\t\t\t\t\tlabel={ __( 'Title' ) }\n\t\t\t\t\t\tvalue={ title ? stripHTML( title ) : '' }\n\t\t\t\t\t\tonChange={ ( titleValue ) => {\n\t\t\t\t\t\t\tsetAttributes( { title: titleValue } );\n\t\t\t\t\t\t} }\n\t\t\t\t\t/>\n\t\t\t\t\t<MediaUploadCheck>\n\t\t\t\t\t\t<BaseControl>\n\t\t\t\t\t\t\t<BaseControl.VisualLabel>\n\t\t\t\t\t\t\t\t{ __( 'Track image' ) }\n\t\t\t\t\t\t\t</BaseControl.VisualLabel>\n\t\t\t\t\t\t\t<div className=\"editor-video-poster-control\">\n\t\t\t\t\t\t\t\t{ !! image && (\n\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\tsrc={ image }\n\t\t\t\t\t\t\t\t\t\talt={ __(\n\t\t\t\t\t\t\t\t\t\t\t'Preview of the track image'\n\t\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t<MediaUpload\n\t\t\t\t\t\t\t\t\ttitle={ __( 'Select image' ) }\n\t\t\t\t\t\t\t\t\tonSelect={ onSelectTrackImage }\n\t\t\t\t\t\t\t\t\tallowedTypes={\n\t\t\t\t\t\t\t\t\t\tTRACK_IMAGE_ALLOWED_MEDIA_TYPES\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\trender={ ( { open } ) => (\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"primary\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={ open }\n\t\t\t\t\t\t\t\t\t\t\tref={ imageButton }\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{ ! image\n\t\t\t\t\t\t\t\t\t\t\t\t? __( 'Select' )\n\t\t\t\t\t\t\t\t\t\t\t\t: __( 'Replace' ) }\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t{ !! image && (\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t__next40pxDefaultSize\n\t\t\t\t\t\t\t\t\t\tonClick={ onRemoveTrackImage }\n\t\t\t\t\t\t\t\t\t\tvariant=\"tertiary\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{ __( 'Remove' ) }\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</BaseControl>\n\t\t\t\t\t</MediaUploadCheck>\n\t\t\t\t\t{ !! image && (\n\t\t\t\t\t\t<TextareaControl\n\t\t\t\t\t\t\tlabel={ __( 'Alternative text' ) }\n\t\t\t\t\t\t\tvalue={ imageAlt || '' }\n\t\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\t\tsetAttributes( { imageAlt: value } )\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\thelp={\n\t\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\t\topenInNewTab\n\t\t\t\t\t\t\t\t\thref={\n\t\t\t\t\t\t\t\t\t\t// translators: Localized tutorial, if one exists. W3C Web Accessibility Initiative link has list of existing translations.\n\t\t\t\t\t\t\t\t\t\t__(\n\t\t\t\t\t\t\t\t\t\t\t'https://www.w3.org/WAI/tutorials/images/decision-tree/'\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{ __(\n\t\t\t\t\t\t\t\t\t\t'Describe the purpose of the image.'\n\t\t\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</PanelBody>\n\t\t\t</InspectorControls>\n\t\t\t<li { ...blockProps }>\n\t\t\t\t{ !! temporaryURL && <Spinner /> }\n\t\t\t\t<button\n\t\t\t\t\tclassName=\"wp-block-playlist-track__button\"\n\t\t\t\t\tonClick={ () => setCurrentTrackClientId( clientId ) }\n\t\t\t\t\taria-current={\n\t\t\t\t\t\tcurrentTrackClientId === clientId ? 'true' : 'false'\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t{ showImages && !! image && (\n\t\t\t\t\t\t<img\n\t\t\t\t\t\t\tclassName=\"wp-block-playlist-track__image\"\n\t\t\t\t\t\t\tsrc={ image }\n\t\t\t\t\t\t\talt={ imageAlt || '' }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t\t<span className=\"wp-block-playlist-track__content\">\n\t\t\t\t\t\t<PlainText\n\t\t\t\t\t\t\ttagName=\"span\"\n\t\t\t\t\t\t\tclassName=\"wp-block-playlist-track__title\"\n\t\t\t\t\t\t\tvalue={ title }\n\t\t\t\t\t\t\tplaceholder={ __( 'Add title' ) }\n\t\t\t\t\t\t\tonChange={ ( value ) => {\n\t\t\t\t\t\t\t\tsetAttributes( { title: value } );\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\t__experimentalVersion={ 2 }\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ showArtists && (\n\t\t\t\t\t\t\t<PlainText\n\t\t\t\t\t\t\t\ttagName=\"span\"\n\t\t\t\t\t\t\t\tclassName=\"wp-block-playlist-track__artist\"\n\t\t\t\t\t\t\t\tvalue={ artist }\n\t\t\t\t\t\t\t\tplaceholder={ __( 'Add artist' ) }\n\t\t\t\t\t\t\t\tonChange={ ( value ) =>\n\t\t\t\t\t\t\t\t\tsetAttributes( { artist: value } )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t__experimentalVersion={ 2 }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"wp-block-playlist-track__length\">\n\t\t\t\t\t\t{ length && (\n\t\t\t\t\t\t\t<span className=\"screen-reader-text\">\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t/* translators: Visually hidden label for the track duration (screen reader text). */\n\t\t\t\t\t\t\t\t\t__( 'Duration:' )\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t) }\n\t\t\t\t\t\t{ length }\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"screen-reader-text\">{ __( 'Play' ) }</span>\n\t\t\t\t</button>\n\t\t\t</li>\n\t\t</>\n\t);\n};\n\nexport default PlaylistTrackEdit;\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -24,6 +24,7 @@
24
24
  "background": {
25
25
  "backgroundImage": true,
26
26
  "backgroundSize": true,
27
+ "gradient": true,
27
28
  "__experimentalDefaultControls": {
28
29
  "backgroundImage": true
29
30
  }
@@ -14,7 +14,8 @@
14
14
  "templateSlug",
15
15
  "previewPostType",
16
16
  "enhancedPagination",
17
- "postType"
17
+ "postType",
18
+ "postId"
18
19
  ],
19
20
  "supports": {
20
21
  "anchor": true,
@@ -90,6 +90,7 @@ function PostTemplateEdit({
90
90
  parents,
91
91
  pages,
92
92
  format,
93
+ excludeCurrent,
93
94
  // We gather extra query args to pass to the REST API call.
94
95
  // This way extenders of Query Loop can add their own query args,
95
96
  // and have accurate previews in the editor.
@@ -98,7 +99,8 @@ function PostTemplateEdit({
98
99
  ...restQueryArgs
99
100
  } = {},
100
101
  templateSlug,
101
- previewPostType
102
+ previewPostType,
103
+ postId
102
104
  },
103
105
  attributes: { layout },
104
106
  __unstableLayoutClassNames
@@ -179,6 +181,13 @@ function PostTemplateEdit({
179
181
  if (format?.length) {
180
182
  query.format = format;
181
183
  }
184
+ if (excludeCurrent && postId) {
185
+ if (query.exclude) {
186
+ query.exclude = [...query.exclude, postId];
187
+ } else {
188
+ query.exclude = [postId];
189
+ }
190
+ }
182
191
  if (["exclude", "only"].includes(sticky)) {
183
192
  query.sticky = sticky === "only";
184
193
  }