@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
@@ -2,10 +2,8 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { useRef } from '@wordpress/element';
5
- import {
6
- useRefEffect,
7
- privateApis as composePrivateApis,
8
- } from '@wordpress/compose';
5
+ import { useRefEffect } from '@wordpress/compose';
6
+ import { privateApis as richTextPrivateApis } from '@wordpress/rich-text';
9
7
  import { ENTER } from '@wordpress/keycodes';
10
8
  import { useSelect, useDispatch, useRegistry } from '@wordpress/data';
11
9
  import { store as blockEditorStore } from '@wordpress/block-editor';
@@ -21,7 +19,7 @@ import {
21
19
  */
22
20
  import { unlock } from '../lock-unlock';
23
21
 
24
- const { subscribeDelegatedListener } = unlock( composePrivateApis );
22
+ const { subscribeOwnedListener } = unlock( richTextPrivateApis );
25
23
 
26
24
  export function useOnEnter( props ) {
27
25
  const { batch } = useRegistry();
@@ -131,11 +129,6 @@ export function useOnEnter( props ) {
131
129
 
132
130
  // Capture phase so we run before writing-flow's ancestor-bubble
133
131
  // keydown handlers that gate on `event.defaultPrevented`.
134
- return subscribeDelegatedListener(
135
- element,
136
- 'keydown',
137
- onKeyDown,
138
- true
139
- );
132
+ return subscribeOwnedListener( element, 'keydown', onKeyDown, true );
140
133
  }, [] );
141
134
  }
@@ -1,8 +1,6 @@
1
1
  # Playlist
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
  Embed a simple playlist.
7
5
 
8
6
  - **Name:** `core/playlist`
@@ -26,9 +24,15 @@ _Defined via the [`attributes`](https://developer.wordpress.org/block-editor/ref
26
24
  | `order` | `string` | `"asc"` | — |
27
25
  | `showTracklist` | `boolean` | `true` | — |
28
26
  | `showImages` | `boolean` | `true` | — |
27
+ | `showPlayButtonArtwork` | `boolean` | `false` | — |
29
28
  | `showArtists` | `boolean` | `true` | — |
30
29
  | `showNumbers` | `boolean` | `true` | — |
31
30
  | `showTrackLength` | `boolean` | `true` | — |
31
+ | `waveformStyle` | `string` | `"bars"` | [Enum](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-attributes/#enum-validation): `bars`, `mirror`, `line`, `blocks`, `dots`, `seekbar` |
32
+ | `waveformColor` | `string` | — | — |
33
+ | `waveformGradient` | `string` | — | — |
34
+ | `waveformBackgroundColor` | `string` | — | — |
35
+ | `waveformBackgroundGradient` | `string` | — | — |
32
36
  | `caption` | `string` | — | — |
33
37
 
34
38
  ## Supports
@@ -44,6 +48,8 @@ _Defined via the [`supports`](https://developer.wordpress.org/block-editor/refer
44
48
  - [`spacing`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#spacing):
45
49
  - `margin`: `true`
46
50
  - `padding`: `true`
51
+ - [`typography`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography):
52
+ - [`fontSize`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-supports/#typography-fontsize): `true`
47
53
 
48
54
  ## Context
49
55
 
@@ -52,28 +58,21 @@ _Defined via the [`usesContext` and `providesContext`](https://developer.wordpre
52
58
  **Provides context:**
53
59
 
54
60
  - `showArtists` → attribute `showArtists`
55
-
56
- ## Block Styles
57
-
58
- _Defined via the [`styles`](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-styles/) property in block.json._
59
-
60
- | Style Name | Label | Default |
61
- |------------|-------|---------|
62
- | `bars` | Bars | Yes |
63
- | `mirror` | Mirror | No |
64
- | `line` | Line | No |
65
- | `blocks` | Blocks | No |
66
- | `dots` | Dots | No |
67
- | `seekbar` | Seekbar | No |
61
+ - `showImages` → attribute `showImages`
68
62
 
69
63
  ## Block Markup
70
64
 
71
65
  This is a [**hybrid block**](https://developer.wordpress.org/block-editor/getting-started/fundamentals/static-dynamic-rendering/). It saves static markup that the server may enhance during rendering.
72
66
 
73
67
  ```html
74
- <!-- wp:playlist {"type":"audio","order":"asc","showTracklist":true,"showImages":true,"showArtists":true,"showNumbers":true,"showTrackLength":true} -->
75
- <!-- Content... -->
76
- <!-- /wp:playlist -->
68
+ <!-- wp:core/playlist {"caption":"Sample playlist"} -->
69
+ <figure class="wp-block-playlist">
70
+ <ol class="wp-block-playlist__tracklist wp-block-playlist__tracklist-show-numbers">
71
+ <!-- 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"} /-->
72
+ </ol>
73
+ <figcaption class="wp-element-caption">Sample playlist</figcaption>
74
+ </figure>
75
+ <!-- /wp:core/playlist -->
77
76
  ```
78
77
 
79
78
  ## 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",
6
5
  "title": "Playlist",
7
6
  "category": "media",
@@ -26,6 +25,10 @@
26
25
  "type": "boolean",
27
26
  "default": true
28
27
  },
28
+ "showPlayButtonArtwork": {
29
+ "type": "boolean",
30
+ "default": false
31
+ },
29
32
  "showArtists": {
30
33
  "type": "boolean",
31
34
  "default": true
@@ -38,12 +41,30 @@
38
41
  "type": "boolean",
39
42
  "default": true
40
43
  },
44
+ "waveformStyle": {
45
+ "type": "string",
46
+ "enum": [ "bars", "mirror", "line", "blocks", "dots", "seekbar" ],
47
+ "default": "bars"
48
+ },
49
+ "waveformColor": {
50
+ "type": "string"
51
+ },
52
+ "waveformGradient": {
53
+ "type": "string"
54
+ },
55
+ "waveformBackgroundColor": {
56
+ "type": "string"
57
+ },
58
+ "waveformBackgroundGradient": {
59
+ "type": "string"
60
+ },
41
61
  "caption": {
42
62
  "type": "string"
43
63
  }
44
64
  },
45
65
  "providesContext": {
46
- "showArtists": "showArtists"
66
+ "showArtists": "showArtists",
67
+ "showImages": "showImages"
47
68
  },
48
69
  "supports": {
49
70
  "anchor": true,
@@ -70,16 +91,14 @@
70
91
  "spacing": {
71
92
  "margin": true,
72
93
  "padding": true
94
+ },
95
+ "typography": {
96
+ "fontSize": true,
97
+ "__experimentalDefaultControls": {
98
+ "fontSize": true
99
+ }
73
100
  }
74
101
  },
75
- "styles": [
76
- { "name": "bars", "label": "Bars", "isDefault": true },
77
- { "name": "mirror", "label": "Mirror" },
78
- { "name": "line", "label": "Line" },
79
- { "name": "blocks", "label": "Blocks" },
80
- { "name": "dots", "label": "Dots" },
81
- { "name": "seekbar", "label": "Seekbar" }
82
- ],
83
102
  "editorStyle": "wp-block-playlist-editor",
84
103
  "style": "wp-block-playlist"
85
104
  }
@@ -17,6 +17,8 @@ import {
17
17
  BlockControls,
18
18
  InspectorControls,
19
19
  InnerBlocks,
20
+ __experimentalColorGradientSettingsDropdown as ColorGradientSettingsDropdown,
21
+ __experimentalUseMultipleOriginColorsAndGradients as useMultipleOriginColorsAndGradients,
20
22
  } from '@wordpress/block-editor';
21
23
  import {
22
24
  ToggleControl,
@@ -27,8 +29,8 @@ import {
27
29
  } from '@wordpress/components';
28
30
  import { useSelect, useDispatch } from '@wordpress/data';
29
31
  import { store as noticesStore } from '@wordpress/notices';
30
- import { __ } from '@wordpress/i18n';
31
- import { audio as icon } from '@wordpress/icons';
32
+ import { __, _x } from '@wordpress/i18n';
33
+ import { playlist as icon } from '@wordpress/icons';
32
34
  import { createBlock } from '@wordpress/blocks';
33
35
 
34
36
  /**
@@ -41,6 +43,15 @@ import { PlaylistContext } from './context';
41
43
  import { getTrackAttributes } from './utils';
42
44
 
43
45
  const ALLOWED_MEDIA_TYPES = [ 'audio' ];
46
+ const DEFAULT_WAVEFORM_STYLE = 'bars';
47
+ const WAVEFORM_STYLE_OPTIONS = [
48
+ { label: _x( 'Bars', 'waveform style option' ), value: 'bars' },
49
+ { label: _x( 'Mirror', 'waveform style option' ), value: 'mirror' },
50
+ { label: _x( 'Line', 'waveform style option' ), value: 'line' },
51
+ { label: _x( 'Blocks', 'waveform style option' ), value: 'blocks' },
52
+ { label: _x( 'Dots', 'waveform style option' ), value: 'dots' },
53
+ { label: _x( 'Seekbar', 'waveform style option' ), value: 'seekbar' },
54
+ ];
44
55
 
45
56
  const PlaylistEdit = ( {
46
57
  attributes,
@@ -54,17 +65,44 @@ const PlaylistEdit = ( {
54
65
  showTracklist,
55
66
  showNumbers,
56
67
  showImages,
68
+ showPlayButtonArtwork,
57
69
  showArtists,
58
70
  showTrackLength,
71
+ waveformStyle = DEFAULT_WAVEFORM_STYLE,
72
+ waveformColor,
73
+ waveformGradient,
74
+ waveformBackgroundColor,
75
+ waveformBackgroundGradient,
59
76
  } = attributes;
60
77
 
61
- // Extract the waveform style from the block style variation class.
62
- const waveformStyle =
63
- attributes.className?.match( /is-style-([\w-]+)/ )?.[ 1 ] || 'bars';
64
78
  const blockProps = useBlockProps();
79
+ const waveformPanelId = `${ clientId }-waveform`;
65
80
  const { replaceInnerBlocks } = useDispatch( blockEditorStore );
66
81
  const { createErrorNotice } = useDispatch( noticesStore );
67
82
  const dropdownMenuProps = useToolsPanelDropdownMenuProps();
83
+ const colorGradientSettings = useMultipleOriginColorsAndGradients();
84
+ const colors = useMemo(
85
+ () =>
86
+ colorGradientSettings.colors.flatMap(
87
+ ( origin ) => origin?.colors ?? []
88
+ ),
89
+ [ colorGradientSettings.colors ]
90
+ );
91
+ const gradients = useMemo(
92
+ () =>
93
+ colorGradientSettings.gradients.flatMap(
94
+ ( origin ) => origin?.gradients ?? []
95
+ ),
96
+ [ colorGradientSettings.gradients ]
97
+ );
98
+ const hasColors =
99
+ colors.length > 0 || ! colorGradientSettings.disableCustomColors;
100
+ const hasGradients =
101
+ gradients.length > 0 || ! colorGradientSettings.disableCustomGradients;
102
+ const waveformGradientValue = waveformGradient;
103
+ const waveformBackgroundGradientValue = waveformBackgroundGradient;
104
+ let waveformColorGradientChange;
105
+ let waveformBackgroundColorGradientChange;
68
106
  function onUploadError( message ) {
69
107
  createErrorNotice( message, { type: 'snackbar' } );
70
108
  }
@@ -189,6 +227,84 @@ const PlaylistEdit = ( {
189
227
  };
190
228
  }
191
229
 
230
+ const onChangeWaveformStyle = useCallback(
231
+ ( newWaveformStyle ) => {
232
+ setAttributes( {
233
+ waveformStyle:
234
+ newWaveformStyle === DEFAULT_WAVEFORM_STYLE
235
+ ? undefined
236
+ : newWaveformStyle,
237
+ } );
238
+ },
239
+ [ setAttributes ]
240
+ );
241
+
242
+ function updateWaveformColor( colorValue ) {
243
+ const isSettingColor = colorValue !== undefined;
244
+ if ( ! isSettingColor && waveformColorGradientChange === 'gradient' ) {
245
+ waveformColorGradientChange = undefined;
246
+ return;
247
+ }
248
+
249
+ waveformColorGradientChange = 'color';
250
+
251
+ setAttributes( {
252
+ waveformColor: colorValue,
253
+ waveformGradient: undefined,
254
+ } );
255
+ }
256
+
257
+ function updateWaveformGradient( gradientValue ) {
258
+ const isSettingGradient = gradientValue !== undefined;
259
+ if ( ! isSettingGradient && waveformColorGradientChange === 'color' ) {
260
+ waveformColorGradientChange = undefined;
261
+ return;
262
+ }
263
+
264
+ waveformColorGradientChange = 'gradient';
265
+
266
+ setAttributes( {
267
+ waveformGradient: gradientValue,
268
+ waveformColor: undefined,
269
+ } );
270
+ }
271
+
272
+ function updateWaveformBackgroundColor( colorValue ) {
273
+ const isSettingColor = colorValue !== undefined;
274
+ if (
275
+ ! isSettingColor &&
276
+ waveformBackgroundColorGradientChange === 'gradient'
277
+ ) {
278
+ waveformBackgroundColorGradientChange = undefined;
279
+ return;
280
+ }
281
+
282
+ waveformBackgroundColorGradientChange = 'color';
283
+
284
+ setAttributes( {
285
+ waveformBackgroundColor: colorValue,
286
+ waveformBackgroundGradient: undefined,
287
+ } );
288
+ }
289
+
290
+ function updateWaveformBackgroundGradient( gradientValue ) {
291
+ const isSettingGradient = gradientValue !== undefined;
292
+ if (
293
+ ! isSettingGradient &&
294
+ waveformBackgroundColorGradientChange === 'color'
295
+ ) {
296
+ waveformBackgroundColorGradientChange = undefined;
297
+ return;
298
+ }
299
+
300
+ waveformBackgroundColorGradientChange = 'gradient';
301
+
302
+ setAttributes( {
303
+ waveformBackgroundGradient: gradientValue,
304
+ waveformBackgroundColor: undefined,
305
+ } );
306
+ }
307
+
192
308
  const hasSelectedChild = useSelect(
193
309
  ( select ) =>
194
310
  select( blockEditorStore ).hasSelectedInnerBlock( clientId ),
@@ -197,6 +313,48 @@ const PlaylistEdit = ( {
197
313
 
198
314
  const hasAnySelected = isSelected || hasSelectedChild;
199
315
 
316
+ const colorSettings = [];
317
+ if ( hasColors || hasGradients ) {
318
+ colorSettings.push(
319
+ {
320
+ colorValue: hasColors ? waveformColor : undefined,
321
+ gradientValue: hasGradients ? waveformGradientValue : undefined,
322
+ label: __( 'Waveform & Play button' ),
323
+ onColorChange: hasColors ? updateWaveformColor : undefined,
324
+ onGradientChange: hasGradients
325
+ ? updateWaveformGradient
326
+ : undefined,
327
+ isShownByDefault: true,
328
+ clearable: true,
329
+ enableAlpha: true,
330
+ resetAllFilter: () => ( {
331
+ waveformColor: undefined,
332
+ waveformGradient: undefined,
333
+ } ),
334
+ },
335
+ {
336
+ colorValue: hasColors ? waveformBackgroundColor : undefined,
337
+ gradientValue: hasGradients
338
+ ? waveformBackgroundGradientValue
339
+ : undefined,
340
+ label: __( 'Waveform background' ),
341
+ onColorChange: hasColors
342
+ ? updateWaveformBackgroundColor
343
+ : undefined,
344
+ onGradientChange: hasGradients
345
+ ? updateWaveformBackgroundGradient
346
+ : undefined,
347
+ isShownByDefault: true,
348
+ clearable: true,
349
+ enableAlpha: true,
350
+ resetAllFilter: () => ( {
351
+ waveformBackgroundColor: undefined,
352
+ waveformBackgroundGradient: undefined,
353
+ } ),
354
+ }
355
+ );
356
+ }
357
+
200
358
  const innerBlocksProps = useInnerBlocksProps( blockProps, {
201
359
  __experimentalAppenderTagName: 'li',
202
360
  renderAppender: hasAnySelected && InnerBlocks.ButtonBlockAppender,
@@ -251,13 +409,14 @@ const PlaylistEdit = ( {
251
409
  showNumbers: true,
252
410
  showTrackLength: true,
253
411
  showImages: true,
412
+ showPlayButtonArtwork: false,
254
413
  order: 'asc',
255
414
  } );
256
415
  } }
257
416
  dropdownMenuProps={ dropdownMenuProps }
258
417
  >
259
418
  <ToolsPanelItem
260
- label={ __( 'Show Tracklist' ) }
419
+ label={ __( 'Show tracklist' ) }
261
420
  isShownByDefault
262
421
  hasValue={ () => showTracklist !== true }
263
422
  onDeselect={ () =>
@@ -265,7 +424,7 @@ const PlaylistEdit = ( {
265
424
  }
266
425
  >
267
426
  <ToggleControl
268
- label={ __( 'Show Tracklist' ) }
427
+ label={ __( 'Show tracklist' ) }
269
428
  onChange={ toggleAttribute( 'showTracklist' ) }
270
429
  checked={ showTracklist }
271
430
  />
@@ -273,7 +432,7 @@ const PlaylistEdit = ( {
273
432
  { showTracklist && (
274
433
  <>
275
434
  <ToolsPanelItem
276
- label={ __( 'Show artist name in Tracklist' ) }
435
+ label={ __( 'Show artist name in tracklist' ) }
277
436
  isShownByDefault
278
437
  hasValue={ () => showArtists !== true }
279
438
  onDeselect={ () =>
@@ -282,7 +441,7 @@ const PlaylistEdit = ( {
282
441
  >
283
442
  <ToggleControl
284
443
  label={ __(
285
- 'Show artist name in Tracklist'
444
+ 'Show artist name in tracklist'
286
445
  ) }
287
446
  onChange={ toggleAttribute(
288
447
  'showArtists'
@@ -291,7 +450,9 @@ const PlaylistEdit = ( {
291
450
  />
292
451
  </ToolsPanelItem>
293
452
  <ToolsPanelItem
294
- label={ __( 'Show number in Tracklist' ) }
453
+ label={ __(
454
+ 'Show track numbers in tracklist'
455
+ ) }
295
456
  isShownByDefault
296
457
  hasValue={ () => showNumbers !== true }
297
458
  onDeselect={ () =>
@@ -299,7 +460,9 @@ const PlaylistEdit = ( {
299
460
  }
300
461
  >
301
462
  <ToggleControl
302
- label={ __( 'Show number in Tracklist' ) }
463
+ label={ __(
464
+ 'Show track numbers in tracklist'
465
+ ) }
303
466
  onChange={ toggleAttribute(
304
467
  'showNumbers'
305
468
  ) }
@@ -307,7 +470,9 @@ const PlaylistEdit = ( {
307
470
  />
308
471
  </ToolsPanelItem>
309
472
  <ToolsPanelItem
310
- label={ __( 'Show track length in Tracklist' ) }
473
+ label={ __(
474
+ 'Show track duration in tracklist'
475
+ ) }
311
476
  isShownByDefault
312
477
  hasValue={ () => showTrackLength !== true }
313
478
  onDeselect={ () =>
@@ -316,7 +481,7 @@ const PlaylistEdit = ( {
316
481
  >
317
482
  <ToggleControl
318
483
  label={ __(
319
- 'Show track length in Tracklist'
484
+ 'Show track duration in tracklist'
320
485
  ) }
321
486
  onChange={ toggleAttribute(
322
487
  'showTrackLength'
@@ -327,7 +492,7 @@ const PlaylistEdit = ( {
327
492
  </>
328
493
  ) }
329
494
  <ToolsPanelItem
330
- label={ __( 'Show images' ) }
495
+ label={ __( 'Show tracklist images' ) }
331
496
  isShownByDefault
332
497
  hasValue={ () => showImages !== true }
333
498
  onDeselect={ () =>
@@ -335,11 +500,27 @@ const PlaylistEdit = ( {
335
500
  }
336
501
  >
337
502
  <ToggleControl
338
- label={ __( 'Show images' ) }
503
+ label={ __( 'Show tracklist images' ) }
339
504
  onChange={ toggleAttribute( 'showImages' ) }
340
505
  checked={ showImages }
341
506
  />
342
507
  </ToolsPanelItem>
508
+ <ToolsPanelItem
509
+ label={ __( 'Show track image on play button' ) }
510
+ isShownByDefault
511
+ hasValue={ () => showPlayButtonArtwork === true }
512
+ onDeselect={ () =>
513
+ setAttributes( { showPlayButtonArtwork: false } )
514
+ }
515
+ >
516
+ <ToggleControl
517
+ label={ __( 'Show track image on play button' ) }
518
+ onChange={ toggleAttribute(
519
+ 'showPlayButtonArtwork'
520
+ ) }
521
+ checked={ showPlayButtonArtwork === true }
522
+ />
523
+ </ToolsPanelItem>
343
524
  <ToolsPanelItem
344
525
  label={ __( 'Order' ) }
345
526
  isShownByDefault
@@ -358,6 +539,51 @@ const PlaylistEdit = ( {
358
539
  </ToolsPanelItem>
359
540
  </ToolsPanel>
360
541
  </InspectorControls>
542
+ <InspectorControls group="styles">
543
+ <ToolsPanel
544
+ label={ __( 'Waveform' ) }
545
+ resetAll={ () => {
546
+ setAttributes( {
547
+ waveformStyle: undefined,
548
+ waveformColor: undefined,
549
+ waveformGradient: undefined,
550
+ waveformBackgroundColor: undefined,
551
+ waveformBackgroundGradient: undefined,
552
+ } );
553
+ } }
554
+ panelId={ waveformPanelId }
555
+ dropdownMenuProps={ dropdownMenuProps }
556
+ >
557
+ { colorSettings.length > 0 && (
558
+ <div className="wp-block-playlist__waveform-color-controls">
559
+ <ColorGradientSettingsDropdown
560
+ __experimentalIsRenderedInSidebar
561
+ settings={ colorSettings }
562
+ panelId={ waveformPanelId }
563
+ { ...colorGradientSettings }
564
+ />
565
+ </div>
566
+ ) }
567
+ <ToolsPanelItem
568
+ label={ __( 'Shape' ) }
569
+ isShownByDefault
570
+ hasValue={ () =>
571
+ waveformStyle !== DEFAULT_WAVEFORM_STYLE
572
+ }
573
+ onDeselect={ () =>
574
+ onChangeWaveformStyle( DEFAULT_WAVEFORM_STYLE )
575
+ }
576
+ panelId={ waveformPanelId }
577
+ >
578
+ <SelectControl
579
+ label={ __( 'Shape' ) }
580
+ value={ waveformStyle }
581
+ options={ WAVEFORM_STYLE_OPTIONS }
582
+ onChange={ onChangeWaveformStyle }
583
+ />
584
+ </ToolsPanelItem>
585
+ </ToolsPanel>
586
+ </InspectorControls>
361
587
  <figure { ...blockProps }>
362
588
  <Disabled isDisabled={ ! isSelected }>
363
589
  <WaveformPlayer
@@ -365,8 +591,14 @@ const PlaylistEdit = ( {
365
591
  title={ currentTrackData?.title }
366
592
  artist={ currentTrackData?.artist }
367
593
  image={ currentTrackData?.image }
594
+ imageAlt={ currentTrackData?.imageAlt }
368
595
  waveformStyle={ waveformStyle }
596
+ color={ waveformColor }
597
+ gradient={ waveformGradientValue }
598
+ backgroundColor={ waveformBackgroundColor }
599
+ backgroundGradient={ waveformBackgroundGradientValue }
369
600
  onEnded={ onTrackEnded }
601
+ showPlayButtonArtwork={ showPlayButtonArtwork === true }
370
602
  />
371
603
  </Disabled>
372
604
  { showTracklist && (
@@ -4,3 +4,9 @@
4
4
  margin-top: var(--wp--preset--spacing--30, 1em);
5
5
  }
6
6
  }
7
+
8
+ .wp-block-playlist__waveform-color-controls {
9
+ display: grid;
10
+ grid-column: 1 / -1;
11
+ row-gap: 0;
12
+ }
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { audio as icon } from '@wordpress/icons';
4
+ import { playlist as icon } from '@wordpress/icons';
5
5
 
6
6
  /**
7
7
  * Internal dependencies