diff --git a/frontend/app.js b/frontend/app.js
index 129bf93..0c213a2 100755
--- a/frontend/app.js
+++ b/frontend/app.js
@@ -10954,6 +10954,7 @@ function wireUI() {
// ---- Empty-home playlist grid ----
$('homePlNewBtn').addEventListener('click', () => newPlaylist(null));
+ const importSetlist = document.createElement('button'); importSetlist.type = 'button'; importSetlist.className = 'icon-btn'; importSetlist.textContent = '⇥'; importSetlist.title = 'Import setlist'; importSetlist.setAttribute('aria-label', 'Import setlist'); importSetlist.onclick = () => SetlistImport.open(); els.newPlaylistBtn.after(importSetlist);
$('homePlGrid').addEventListener('scroll', updateHomeGridScrollState, { passive: true });
window.addEventListener('resize', updateHomeGridScrollState);
@@ -12454,6 +12455,7 @@ async function boot() {
if (WEB) bootShareFromUrl();
Party.boot();
PartyDJ.register(() => $('navPartyBtn').click());
+ SetlistImport.configure({ library: async () => { let uploads = []; try { const j = await webFetch('/api/uploads?limit=200'); uploads = j.uploads || []; } catch {} return [...data.history, ...data.playlists.flatMap(p => p.videos || []), ...uploads]; }, search: async q => (await API.search(q)).results || [], modal: showModal, close: closeModal, create: (name, videos) => { const pl = { id: uid(), name, videos: videos.map(v => ({ ...slim(v), tags: v.tags, key: v.key, chordPro: v.chordPro })) }; data.playlists.push(pl); persist(); view = { type: 'playlist', id: pl.id }; render(); toast(`Imported ${videos.length} songs`); } });
Remote.boot();
LowerThird.register(() => $('remoteChip').click());
Transition.renderButton();
diff --git a/frontend/index.html b/frontend/index.html
index de15de2..3fded4c 100755
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -661,6 +661,7 @@
+