diff --git a/BACKLOG.md b/BACKLOG.md
index db139ac..eff3c20 100644
--- a/BACKLOG.md
+++ b/BACKLOG.md
@@ -24,7 +24,7 @@ bottom as they come up.
## Features
- [x] Drag-to-reorder videos within a playlist.
-- [ ] "Up next" queue panel showing the autoplay queue.
+- [x] "Up next" queue panel showing the autoplay queue.
- [ ] Persistent mini now-playing bar when browsing other views.
- [ ] Cache size cap in Settings (auto-evict oldest past a limit).
- [ ] Export / import playlists as JSON.
diff --git a/frontend/app.js b/frontend/app.js
index e98aa1b..69bcdc1 100644
--- a/frontend/app.js
+++ b/frontend/app.js
@@ -578,13 +578,40 @@ function playFromList(list, index) {
queue = list;
queueIndex = index;
Player.loadVideo(list[index]);
+ renderUpNext();
+}
+
+function renderUpNext() {
+ const upcoming = queue.slice(queueIndex + 1);
+ if (!upcoming.length) { $('upnext').classList.add('hidden'); return; }
+ $('upnext').classList.remove('hidden');
+ $('upnextCount').textContent = String(upcoming.length);
+ const list = $('upnextList');
+ list.innerHTML = '';
+ upcoming.forEach((v) => {
+ const item = document.createElement('div');
+ item.className = 'upnext-item';
+ item.innerHTML = `
+
+
+
${v.title}
+
${v.channel || ''}
+
`;
+ item.addEventListener('click', () => {
+ const idx = queue.findIndex((x) => x.id === v.id);
+ if (idx >= 0) { queueIndex = idx - 1; playNext(); }
+ });
+ list.appendChild(item);
+ });
}
function playNext() {
if (queueIndex >= 0 && queueIndex < queue.length - 1) {
queueIndex++;
Player.loadVideo(queue[queueIndex]);
+ renderUpNext();
} else {
updatePlayBtn();
+ $('upnext').classList.add('hidden');
}
}
function playPrev() {
@@ -592,6 +619,7 @@ function playPrev() {
if (queueIndex > 0) {
queueIndex--;
Player.loadVideo(queue[queueIndex]);
+ renderUpNext();
}
}
diff --git a/frontend/index.html b/frontend/index.html
index d047b80..cda2498 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -138,6 +138,15 @@
+
+
+
diff --git a/frontend/styles.css b/frontend/styles.css
index 06dfac7..a659cfe 100644
--- a/frontend/styles.css
+++ b/frontend/styles.css
@@ -517,7 +517,62 @@ input[type="range"]::-webkit-slider-thumb:hover { transform: scale(1.25); }
}
.player-pane.empty .controls,
-.player-pane.empty .now-meta { display: none; }
+.player-pane.empty .now-meta,
+.player-pane.empty .upnext { display: none; }
+
+/* ===================== Up next queue ===================== */
+.upnext {
+ margin-top: 16px;
+ background: linear-gradient(180deg, var(--bg-2), var(--bg-1));
+ border: 1px solid var(--line);
+ border-radius: var(--radius);
+ padding: 14px 16px;
+}
+.upnext-header {
+ display: flex; align-items: center; gap: 8px;
+ font-family: var(--mono);
+ font-size: 10px; font-weight: 700;
+ text-transform: uppercase; letter-spacing: 0.16em;
+ color: var(--text-dim);
+ margin-bottom: 10px;
+}
+.upnext-count {
+ font-family: var(--mono);
+ font-size: 10px;
+ color: var(--accent);
+ background: rgba(255,75,50,0.12);
+ padding: 0 7px;
+ border-radius: 10px;
+ line-height: 17px;
+}
+.upnext-list {
+ display: flex; flex-direction: column; gap: 6px;
+ max-height: 200px; overflow-y: auto;
+}
+.upnext-item {
+ display: flex; gap: 10px;
+ padding: 6px;
+ border-radius: 9px;
+ cursor: pointer;
+ transition: background 0.16s;
+}
+.upnext-item:hover { background: var(--bg-3); }
+.upnext-item img {
+ width: 80px; aspect-ratio: 16/9;
+ border-radius: 6px;
+ object-fit: cover;
+ background: #000;
+ flex-shrink: 0;
+}
+.upnext-info { min-width: 0; display: flex; flex-direction: column; justify-content: center; }
+.upnext-title {
+ font-size: 12.5px; font-weight: 600;
+ display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
+}
+.upnext-channel {
+ font-size: 11px; color: var(--text-dim);
+ margin-top: 3px;
+}
/* ===================== List pane ===================== */
.list-pane {
diff --git a/releases/YT Player_1.0.0_x64-setup.exe b/releases/YT Player_1.0.0_x64-setup.exe
index 1fbcc96..28aaad1 100755
Binary files a/releases/YT Player_1.0.0_x64-setup.exe and b/releases/YT Player_1.0.0_x64-setup.exe differ
diff --git a/releases/YT Player_1.0.0_x64_en-US.msi b/releases/YT Player_1.0.0_x64_en-US.msi
index 278bccd..e562a70 100755
Binary files a/releases/YT Player_1.0.0_x64_en-US.msi and b/releases/YT Player_1.0.0_x64_en-US.msi differ
diff --git a/releases/ytplayer.exe b/releases/ytplayer.exe
index 8faa226..ef7b004 100644
Binary files a/releases/ytplayer.exe and b/releases/ytplayer.exe differ