diff --git a/scraper/internal/server/ui.go b/scraper/internal/server/ui.go
index 8b8bf44..31f82bc 100644
--- a/scraper/internal/server/ui.go
+++ b/scraper/internal/server/ui.go
@@ -1075,8 +1075,14 @@ const chapterTmpl = `
← Prev
{{end}}
-
- {{.Title}}
+
+
{{if .NextN}}
@@ -1119,6 +1125,28 @@ const chapterTmpl = `
+
+
+
@@ -1152,10 +1180,6 @@ const chapterTmpl = `
-
-
{{.HTML}}
@@ -1237,20 +1261,50 @@ const chapterTmpl = `
var article = document.getElementById('chapter-article');
// ── settings panel toggle ─────────────────────────────────────────────────────
- var settingsPanel = document.getElementById('settings-panel');
+ var settingsPanel = document.getElementById('settings-panel');
+ var chapterListPanel = document.getElementById('chapter-list-panel');
+ var chapterListBtn = document.getElementById('chapter-list-btn');
+
+ window.closeChapterList = function () {
+ chapterListPanel.style.display = 'none';
+ chapterListBtn.querySelector('span:last-child').innerHTML = '▼';
+ };
+
+ window.toggleChapterList = function () {
+ var open = chapterListPanel.style.display !== 'none';
+ // Close settings if open
+ settingsPanel.style.display = 'none';
+ if (open) {
+ closeChapterList();
+ } else {
+ chapterListPanel.style.display = 'block';
+ chapterListBtn.querySelector('span:last-child').innerHTML = '▲';
+ // Scroll the current chapter row into view inside the panel
+ var current = chapterListPanel.querySelector('[data-current="1"]');
+ if (current) current.scrollIntoView({ block: 'center' });
+ }
+ };
window.toggleSettings = function () {
var open = settingsPanel.style.display !== 'none';
+ // Close chapter list if open
+ closeChapterList();
settingsPanel.style.display = open ? 'none' : 'block';
};
- // Close settings panel when clicking outside
+ // Close both panels when clicking outside
document.addEventListener('click', function (e) {
- if (settingsPanel.style.display === 'none') return;
- var btn = document.getElementById('settings-btn');
- if (!settingsPanel.contains(e.target) && e.target !== btn && !btn.contains(e.target)) {
+ var settingsBtn = document.getElementById('settings-btn');
+ if (settingsPanel.style.display !== 'none' &&
+ !settingsPanel.contains(e.target) &&
+ e.target !== settingsBtn && !settingsBtn.contains(e.target)) {
settingsPanel.style.display = 'none';
}
+ if (chapterListPanel.style.display !== 'none' &&
+ !chapterListPanel.contains(e.target) &&
+ e.target !== chapterListBtn && !chapterListBtn.contains(e.target)) {
+ closeChapterList();
+ }
});
function setStatus(text) {
@@ -1848,6 +1902,7 @@ func (s *Server) handleChapter(w http.ResponseWriter, r *http.Request) {
NextN int
ChapterN int
Title string
+ AllChapters interface{}
KokoroURL string
Voices []string
DefaultVoice string
@@ -1858,6 +1913,7 @@ func (s *Server) handleChapter(w http.ResponseWriter, r *http.Request) {
NextN: nextN,
ChapterN: n,
Title: title,
+ AllChapters: chapters,
KokoroURL: s.kokoroURL,
Voices: kokoroVoices,
DefaultVoice: s.kokoroVoice,