()
| 484 | } |
| 485 | |
| 486 | function libraryBody() { |
| 487 | if (state.libState === "loading") { |
| 488 | return `<div class="lib-note">Loading your library…</div>`; |
| 489 | } |
| 490 | if (state.libState === "error") { |
| 491 | return `<div class="lib-note">Couldn't reach the server. <button class="lib-retry" data-action="reload">Retry</button></div>`; |
| 492 | } |
| 493 | if (state.libState === "empty") { |
| 494 | return `<div class="lib-note">No tracks yet. Head to <b>Extract</b> to split your first song.</div>`; |
| 495 | } |
| 496 | return `<div class="eyebrow">RECENT</div> |
| 497 | ${state.tracks.map((t) => `<div class="track-wrap${state.swipedTrackId === t.id ? " swiped" : ""}"> |
| 498 | <button class="track-delete" data-action="delete" data-id="${esc(t.id)}">Delete</button> |
| 499 | <div class="track" data-action="open" data-id="${esc(t.id)}"> |
| 500 | <div class="track-art" style="${artStyle(t)}">${artLabel(t)}</div> |
| 501 | <div class="track-info"><div class="t">${esc(t.title)}</div><div class="s">${esc(t.sub)}</div><div class="m">${esc(t.meta)}</div></div> |
| 502 | <div class="track-dot ${t.status}"></div> |
| 503 | <button class="track-load" data-action="open" data-id="${esc(t.id)}">Load</button> |
| 504 | </div> |
| 505 | </div>`).join("")}`; |
| 506 | } |
| 507 | |
| 508 | function libraryScreen() { |
| 509 | return `<div class="screen scrl"> |
no test coverage detected