@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
@@ -7,9 +7,14 @@ import '@testing-library/jest-dom';
7
7
  * Internal dependencies
8
8
  */
9
9
  import {
10
+ applyWaveformPlayerStyles,
10
11
  createWaveformContainer,
12
+ getWaveformColors,
13
+ getWaveformGradientStops,
11
14
  styleSvgIcons,
12
15
  setupPlayButtonAccessibility,
16
+ setupPlayButtonArtwork,
17
+ updateSeekControlLabel,
13
18
  logPlayError,
14
19
  } from '../waveform-utils';
15
20
 
@@ -49,6 +54,7 @@ describe( 'Waveform utilities', () => {
49
54
  'data-button-color',
50
55
  '#000000'
51
56
  );
57
+ expect( container ).toHaveAttribute( 'data-seek-label', 'Seek' );
52
58
  } );
53
59
 
54
60
  it( 'should set optional attributes when provided', () => {
@@ -57,25 +63,37 @@ describe( 'Waveform utilities', () => {
57
63
  title: 'My Song',
58
64
  artist: 'The Artist',
59
65
  artwork: 'https://example.com/cover.jpg',
66
+ seekLabel: 'My Song',
60
67
  } );
61
68
 
62
69
  expect( container ).toHaveAttribute( 'data-title', 'My Song' );
63
- expect( container ).toHaveAttribute(
64
- 'data-subtitle',
65
- 'The Artist'
66
- );
70
+ expect( container ).toHaveAttribute( 'data-artist', 'The Artist' );
67
71
  expect( container ).toHaveAttribute(
68
72
  'data-artwork',
69
73
  'https://example.com/cover.jpg'
70
74
  );
75
+ expect( container ).toHaveAttribute( 'data-seek-label', 'My Song' );
76
+ } );
77
+
78
+ it( 'should set the seek value-text template when provided', () => {
79
+ const container = createWaveformContainer( {
80
+ ...basePlayerData,
81
+ seekValueText: '%1$s of %2$s',
82
+ } );
83
+
84
+ expect( container ).toHaveAttribute(
85
+ 'data-seek-value-text',
86
+ '%1$s of %2$s'
87
+ );
71
88
  } );
72
89
 
73
90
  it( 'should not set optional attributes when not provided', () => {
74
91
  const container = createWaveformContainer( basePlayerData );
75
92
 
76
93
  expect( container ).not.toHaveAttribute( 'data-title' );
77
- expect( container ).not.toHaveAttribute( 'data-subtitle' );
94
+ expect( container ).not.toHaveAttribute( 'data-artist' );
78
95
  expect( container ).not.toHaveAttribute( 'data-artwork' );
96
+ expect( container ).not.toHaveAttribute( 'data-seek-value-text' );
79
97
  } );
80
98
 
81
99
  it( 'should use custom height when provided', () => {
@@ -86,6 +104,237 @@ describe( 'Waveform utilities', () => {
86
104
 
87
105
  expect( container ).toHaveAttribute( 'data-height', '150' );
88
106
  } );
107
+
108
+ it( 'serializes gradient color arrays and direction attributes', () => {
109
+ const container = createWaveformContainer( {
110
+ ...basePlayerData,
111
+ waveformColor: [
112
+ 'rgba(255, 0, 0, 0.3)',
113
+ 'rgba(0, 0, 255, 0.3)',
114
+ ],
115
+ progressColor: [
116
+ 'rgba(255, 0, 0, 0.6)',
117
+ 'rgba(0, 0, 255, 0.6)',
118
+ ],
119
+ waveformGradient: 'horizontal',
120
+ } );
121
+
122
+ expect( container ).toHaveAttribute(
123
+ 'data-waveform-color',
124
+ '["rgba(255, 0, 0, 0.3)","rgba(0, 0, 255, 0.3)"]'
125
+ );
126
+ expect( container ).toHaveAttribute(
127
+ 'data-progress-color',
128
+ '["rgba(255, 0, 0, 0.6)","rgba(0, 0, 255, 0.6)"]'
129
+ );
130
+ expect( container ).toHaveAttribute(
131
+ 'data-waveform-gradient',
132
+ 'horizontal'
133
+ );
134
+ } );
135
+ } );
136
+
137
+ describe( 'getWaveformColors', () => {
138
+ it( 'derives waveform colors from the computed text color', () => {
139
+ const element = document.createElement( 'div' );
140
+ element.style.color = '#336699';
141
+ document.body.appendChild( element );
142
+
143
+ const colors = getWaveformColors( element );
144
+
145
+ expect( colors ).toEqual( {
146
+ textColor: 'rgb(51, 102, 153)',
147
+ waveformColor: 'rgba(51, 102, 153, 0.3)',
148
+ progressColor: 'rgba(51, 102, 153, 0.6)',
149
+ } );
150
+
151
+ element.remove();
152
+ } );
153
+
154
+ it( 'uses explicit text and waveform color values when provided', () => {
155
+ const element = document.createElement( 'div' );
156
+
157
+ const colors = getWaveformColors( element, '#ff0000', '#0000ff' );
158
+
159
+ expect( colors ).toEqual( {
160
+ textColor: '#0000ff',
161
+ waveformColor: 'rgba(255, 0, 0, 0.3)',
162
+ progressColor: 'rgba(255, 0, 0, 0.6)',
163
+ } );
164
+ } );
165
+
166
+ it( 'uses gradient stops when a waveform gradient is provided', () => {
167
+ const element = document.createElement( 'div' );
168
+
169
+ const colors = getWaveformColors(
170
+ element,
171
+ undefined,
172
+ '#0000ff',
173
+ 'linear-gradient(90deg,rgb(255,0,0) 0%,rgb(0,0,255) 100%)'
174
+ );
175
+
176
+ expect( colors ).toEqual( {
177
+ textColor: '#0000ff',
178
+ waveformColor: [
179
+ 'rgba(255, 0, 0, 0.3)',
180
+ 'rgba(0, 0, 255, 0.3)',
181
+ ],
182
+ progressColor: [
183
+ 'rgba(255, 0, 0, 0.6)',
184
+ 'rgba(0, 0, 255, 0.6)',
185
+ ],
186
+ waveformGradient: 'horizontal',
187
+ } );
188
+ } );
189
+
190
+ it( 'maps CSS gradient side-or-corner directions for waveform gradients', () => {
191
+ const element = document.createElement( 'div' );
192
+
193
+ expect(
194
+ getWaveformColors(
195
+ element,
196
+ undefined,
197
+ '#0000ff',
198
+ 'linear-gradient(to right,rgb(255,0,0) 0%,rgb(0,0,255) 100%)'
199
+ ).waveformGradient
200
+ ).toBe( 'horizontal' );
201
+ expect(
202
+ getWaveformColors(
203
+ element,
204
+ undefined,
205
+ '#0000ff',
206
+ 'linear-gradient(to bottom right,rgb(255,0,0) 0%,rgb(0,0,255) 100%)'
207
+ ).waveformGradient
208
+ ).toBe( 'diagonal' );
209
+ } );
210
+ } );
211
+
212
+ describe( 'getWaveformGradientStops', () => {
213
+ it( 'extracts color stops from a CSS gradient value', () => {
214
+ expect(
215
+ getWaveformGradientStops(
216
+ 'linear-gradient(135deg,rgb(255,0,0) 0%,rgba(0,0,255,0.8) 100%)'
217
+ )
218
+ ).toEqual( [ 'rgb(255,0,0)', 'rgba(0,0,255,0.8)' ] );
219
+ } );
220
+ } );
221
+
222
+ describe( 'applyWaveformPlayerStyles', () => {
223
+ it( 'applies the waveform background color', () => {
224
+ const container = document.createElement( 'div' );
225
+ const waveformContainer = document.createElement( 'div' );
226
+ waveformContainer.className = 'waveform-container';
227
+ container.appendChild( waveformContainer );
228
+
229
+ applyWaveformPlayerStyles( container, {
230
+ backgroundColor: '#ffeeaa',
231
+ } );
232
+
233
+ expect( waveformContainer ).toHaveStyle( {
234
+ backgroundColor: '#ffeeaa',
235
+ } );
236
+ } );
237
+
238
+ it( 'applies the waveform background gradient', () => {
239
+ const container = document.createElement( 'div' );
240
+ const waveformContainer = document.createElement( 'div' );
241
+ waveformContainer.className = 'waveform-container';
242
+ container.appendChild( waveformContainer );
243
+
244
+ applyWaveformPlayerStyles( container, {
245
+ backgroundGradient:
246
+ 'linear-gradient(90deg,#ff0000 0%,#0000ff 100%)',
247
+ } );
248
+
249
+ expect( waveformContainer ).toHaveStyle( {
250
+ background: 'linear-gradient(90deg,#ff0000 0%,#0000ff 100%)',
251
+ } );
252
+ } );
253
+
254
+ it( 'applies the waveform player text color variables', () => {
255
+ const container = document.createElement( 'div' );
256
+
257
+ applyWaveformPlayerStyles( container, {
258
+ textColor: '#0000ff',
259
+ } );
260
+
261
+ expect( container ).toHaveStyle( {
262
+ '--wfp-text-color': '#0000ff',
263
+ '--wfp-text-secondary-color': '#0000ff',
264
+ } );
265
+ } );
266
+
267
+ it( 'applies the waveform player play button color variable', () => {
268
+ const container = document.createElement( 'div' );
269
+
270
+ applyWaveformPlayerStyles( container, {
271
+ playButtonColor: '#ff0000',
272
+ } );
273
+
274
+ expect( container ).toHaveStyle( {
275
+ '--wfp-button-color': '#ff0000',
276
+ } );
277
+ } );
278
+
279
+ it( 'applies the waveform player play button gradient', () => {
280
+ const container = document.createElement( 'div' );
281
+ const playButton = document.createElement( 'button' );
282
+ playButton.className = 'waveform-btn';
283
+ container.appendChild( playButton );
284
+
285
+ applyWaveformPlayerStyles( container, {
286
+ playButtonGradient:
287
+ 'linear-gradient(90deg,#ff0000 0%,#0000ff 100%)',
288
+ } );
289
+
290
+ expect( playButton ).toHaveStyle( {
291
+ background: 'linear-gradient(90deg,#ff0000 0%,#0000ff 100%)',
292
+ } );
293
+ expect( container ).toHaveStyle( {
294
+ '--wfp-button-color': '#0000ff',
295
+ } );
296
+ } );
297
+
298
+ it( 'removes the waveform background color when cleared', () => {
299
+ const container = document.createElement( 'div' );
300
+ const waveformContainer = document.createElement( 'div' );
301
+ waveformContainer.className = 'waveform-container';
302
+ waveformContainer.style.backgroundColor = '#ffeeaa';
303
+ container.appendChild( waveformContainer );
304
+
305
+ applyWaveformPlayerStyles( container );
306
+
307
+ expect( waveformContainer ).not.toHaveStyle( {
308
+ backgroundColor: '#ffeeaa',
309
+ } );
310
+ } );
311
+
312
+ it( 'removes the waveform player text color variables when cleared', () => {
313
+ const container = document.createElement( 'div' );
314
+ container.style.setProperty( '--wfp-text-color', '#0000ff' );
315
+ container.style.setProperty(
316
+ '--wfp-text-secondary-color',
317
+ '#0000ff'
318
+ );
319
+
320
+ applyWaveformPlayerStyles( container );
321
+
322
+ expect( container ).not.toHaveStyle( {
323
+ '--wfp-text-color': '#0000ff',
324
+ '--wfp-text-secondary-color': '#0000ff',
325
+ } );
326
+ } );
327
+
328
+ it( 'removes the waveform player play button color variable when cleared', () => {
329
+ const container = document.createElement( 'div' );
330
+ container.style.setProperty( '--wfp-button-color', '#ff0000' );
331
+
332
+ applyWaveformPlayerStyles( container );
333
+
334
+ expect( container ).not.toHaveStyle( {
335
+ '--wfp-button-color': '#ff0000',
336
+ } );
337
+ } );
89
338
  } );
90
339
 
91
340
  describe( 'styleSvgIcons', () => {
@@ -197,6 +446,39 @@ describe( 'Waveform utilities', () => {
197
446
  } );
198
447
  } );
199
448
 
449
+ describe( 'updateSeekControlLabel', () => {
450
+ afterEach( () => {
451
+ document.body.innerHTML = '';
452
+ } );
453
+
454
+ it( 'updates the seek control label on the library slider', () => {
455
+ const container = document.createElement( 'div' );
456
+ const seekControl = document.createElement( 'div' );
457
+ seekControl.className = 'waveform-container';
458
+ container.appendChild( seekControl );
459
+ document.body.appendChild( container );
460
+
461
+ const instance = {
462
+ container,
463
+ options: {},
464
+ applySeekLabel: jest.fn( ( label ) => {
465
+ seekControl.setAttribute( 'aria-label', label );
466
+ } ),
467
+ };
468
+
469
+ updateSeekControlLabel( instance, 'Updated Song' );
470
+
471
+ expect( instance.options.seekLabel ).toBe( 'Updated Song' );
472
+ expect( instance.applySeekLabel ).toHaveBeenCalledWith(
473
+ 'Updated Song'
474
+ );
475
+ expect( seekControl ).toHaveAttribute(
476
+ 'aria-label',
477
+ 'Updated Song'
478
+ );
479
+ } );
480
+ } );
481
+
200
482
  describe( 'setupPlayButtonAccessibility', () => {
201
483
  it( 'should set aria-label to Play initially', () => {
202
484
  const container = document.createElement( 'div' );
@@ -275,6 +557,129 @@ describe( 'Waveform utilities', () => {
275
557
  } );
276
558
  } );
277
559
 
560
+ describe( 'setupPlayButtonArtwork', () => {
561
+ it( 'should set artwork as the play button background', () => {
562
+ const container = document.createElement( 'div' );
563
+ const playBtn = document.createElement( 'button' );
564
+ playBtn.className = 'waveform-btn';
565
+ const artworkEl = document.createElement( 'img' );
566
+ artworkEl.src = 'https://example.com/cover.jpg';
567
+ container.append( playBtn, artworkEl );
568
+
569
+ setupPlayButtonArtwork(
570
+ container,
571
+ 'https://example.com/cover.jpg'
572
+ );
573
+
574
+ expect( container ).toHaveClass( 'has-play-button-artwork' );
575
+ expect(
576
+ container.style.getPropertyValue(
577
+ '--wp--playlist--play-button-artwork'
578
+ )
579
+ ).toBe( 'url("https://example.com/cover.jpg")' );
580
+ expect( artworkEl.parentElement ).toBe( container );
581
+ } );
582
+
583
+ it( 'should escape artwork URLs for CSS usage', () => {
584
+ const container = document.createElement( 'div' );
585
+ const playBtn = document.createElement( 'button' );
586
+ playBtn.className = 'waveform-btn';
587
+ container.appendChild( playBtn );
588
+
589
+ setupPlayButtonArtwork(
590
+ container,
591
+ 'https://example.com/cover "quoted".jpg'
592
+ );
593
+
594
+ expect(
595
+ container.style.getPropertyValue(
596
+ '--wp--playlist--play-button-artwork'
597
+ )
598
+ ).toBe( 'url("https://example.com/cover \\"quoted\\".jpg")' );
599
+ } );
600
+
601
+ it( 'should not modify play button icon paths', () => {
602
+ const container = document.createElement( 'div' );
603
+ const playBtn = document.createElement( 'button' );
604
+ playBtn.className = 'waveform-btn';
605
+ const svg = document.createElementNS(
606
+ 'http://www.w3.org/2000/svg',
607
+ 'svg'
608
+ );
609
+ const path = document.createElementNS(
610
+ 'http://www.w3.org/2000/svg',
611
+ 'path'
612
+ );
613
+ const artworkEl = document.createElement( 'img' );
614
+ svg.appendChild( path );
615
+ playBtn.appendChild( svg );
616
+ container.append( playBtn, artworkEl );
617
+
618
+ setupPlayButtonArtwork(
619
+ container,
620
+ 'https://example.com/cover.jpg'
621
+ );
622
+
623
+ expect( path ).not.toHaveStyle( { fill: '#ffffff' } );
624
+ } );
625
+
626
+ it( 'should set artwork state when play button is missing', () => {
627
+ const container = document.createElement( 'div' );
628
+ const artworkEl = document.createElement( 'img' );
629
+ container.appendChild( artworkEl );
630
+
631
+ expect( () => {
632
+ setupPlayButtonArtwork(
633
+ container,
634
+ 'https://example.com/cover.jpg'
635
+ );
636
+ } ).not.toThrow();
637
+ expect( container ).toHaveClass( 'has-play-button-artwork' );
638
+ expect( artworkEl.parentElement ).toBe( container );
639
+ } );
640
+
641
+ it( 'should set button artwork when artwork element is missing', () => {
642
+ const container = document.createElement( 'div' );
643
+ const playBtn = document.createElement( 'button' );
644
+ playBtn.className = 'waveform-btn';
645
+ container.appendChild( playBtn );
646
+
647
+ expect( () => {
648
+ setupPlayButtonArtwork(
649
+ container,
650
+ 'https://example.com/cover.jpg'
651
+ );
652
+ } ).not.toThrow();
653
+ expect( container ).toHaveClass( 'has-play-button-artwork' );
654
+ expect(
655
+ container.style.getPropertyValue(
656
+ '--wp--playlist--play-button-artwork'
657
+ )
658
+ ).toBe( 'url("https://example.com/cover.jpg")' );
659
+ } );
660
+
661
+ it( 'should clear button artwork when artwork URL is empty', () => {
662
+ const container = document.createElement( 'div' );
663
+ container.className = 'has-play-button-artwork';
664
+ container.style.setProperty(
665
+ '--wp--playlist--play-button-artwork',
666
+ 'url("https://example.com/cover.jpg")'
667
+ );
668
+ const playBtn = document.createElement( 'button' );
669
+ playBtn.className = 'waveform-btn';
670
+ container.appendChild( playBtn );
671
+
672
+ setupPlayButtonArtwork( container, '' );
673
+
674
+ expect( container ).not.toHaveClass( 'has-play-button-artwork' );
675
+ expect(
676
+ container.style.getPropertyValue(
677
+ '--wp--playlist--play-button-artwork'
678
+ )
679
+ ).toBe( '' );
680
+ } );
681
+ } );
682
+
278
683
  describe( 'logPlayError', () => {
279
684
  let consoleErrorSpy;
280
685