A music player that connects to your cloud/distributed storage.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

chore: fix typescript errors

+13 -2
+1
src/common/pages/grid.js
··· 15 15 /** @type {NodeListOf<HTMLElement>} */ 16 16 const items = document.querySelectorAll(".grid-item"); 17 17 18 + /** @param {string} filter */ 18 19 function applyFilter(filter) { 19 20 buttons.forEach((b) => { 20 21 if (b.dataset.filter === filter) b.classList.remove("button--transparent");
+12 -2
src/themes/winamp/winamp/element.js
··· 79 79 /** @type {Float32Array} */ #temp1; 80 80 /** @type {Float32Array} */ #temp2; 81 81 82 + /** @param {number} NFREQ */ 82 83 #initBitRev(NFREQ) { 83 84 const t = Array.from({ length: NFREQ }, (_, i) => i); 84 85 for (let i = 0, j = 0; i < NFREQ; i++) { ··· 90 91 return t; 91 92 } 92 93 94 + /** @param {number} NFREQ */ 93 95 #initCosSin(NFREQ) { 94 96 const table = []; 95 97 let d = 2; ··· 101 103 return table; 102 104 } 103 105 106 + /** @param {number} n @param {number} power */ 104 107 #initEnvelope(n, power) { 105 108 const mult = (1.0 / n) * WinampFFT.#TWO_PI; 106 109 return Float32Array.from({ length: n }, (_, i) => ··· 108 111 ); 109 112 } 110 113 114 + /** @param {number} NFREQ */ 111 115 #initEqualize(NFREQ) { 112 116 const eq = new Float32Array(NFREQ / 2); 113 117 let bias = 0.04; ··· 406 410 const startY = e.clientY; 407 411 const startTop = parseFloat(playlistHandle.style.top) || 0; 408 412 const maxScroll = playlistContent.scrollHeight - playlistContent.clientHeight; 413 + /** @param {MouseEvent} mv */ 409 414 const onMove = (mv) => { 410 415 const newTop = Math.max(0, Math.min(range, startTop + mv.clientY - startY)); 411 416 const rawScroll = (newTop / range) * maxScroll; ··· 468 473 }); 469 474 470 475 // Window dragging 471 - this.root().addEventListener("mousedown", this.#onWindowDragStart); 476 + this.root().addEventListener("mousedown", /** @type {EventListener} */ (this.#onWindowDragStart)); 472 477 } 473 478 479 + /** @override */ 474 480 disconnectedCallback() { 475 481 clearInterval(this.#marqueeStepInterval); 476 - this.root().removeEventListener("mousedown", this.#onWindowDragStart); 482 + this.root().removeEventListener("mousedown", /** @type {EventListener} */ (this.#onWindowDragStart)); 477 483 if (this.#visRAF !== undefined) { 478 484 cancelAnimationFrame(this.#visRAF); 479 485 this.#visRAF = undefined; ··· 699 705 document.addEventListener("mouseup", onUp); 700 706 }; 701 707 708 + /** @param {MouseEvent} e */ 702 709 #onPlaylistResizeStart = (e) => { 703 710 e.preventDefault(); 704 711 ··· 792 799 static #MARQUEE_SEPARATOR = " *** "; 793 800 static #CHAR_WIDTH = 5; 794 801 802 + /** @param {number} n @param {number} m */ 795 803 static #marqueeMod(n, m) { 796 804 return ((n % m) + m) % m; 797 805 } 798 806 807 + /** @param {string} text */ 799 808 static #marqueeLoopText(text) { 800 809 const MAX = WinampElement.#MARQUEE_MAX_LENGTH; 801 810 return text.length >= MAX ··· 1496 1505 const d = trackMap.get(item.id)?.stats?.duration; 1497 1506 return sum + (d ? d / 1000 : 0); 1498 1507 }, 0); 1508 + /** @param {number} s */ 1499 1509 const fmtDur = (s) => { 1500 1510 const h = Math.floor(s / 3600); 1501 1511 const m = Math.floor((s % 3600) / 60);