diff --git a/internal/services/reader.go b/internal/services/reader.go index efcbc16..69b2919 100644 --- a/internal/services/reader.go +++ b/internal/services/reader.go @@ -403,6 +403,7 @@ func (s *ReaderService) getDefaultSettings() map[string]interface{} { "tap_zone_size": 30, "auto_scroll": false, "panel_zoom_enabled": true, + "double_page_spread": true, // Dockable panel defaults "panel_layout": map[string]interface{}{ diff --git a/templates/reader.templ b/templates/reader.templ index 2b3dec4..75ad6b3 100644 --- a/templates/reader.templ +++ b/templates/reader.templ @@ -153,8 +153,13 @@ templ ReaderChrome(user User, metadata ReaderMetadata, progress ReadingProgress) -
") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 12, "
") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -198,7 +198,7 @@ func ReaderChrome(user User, metadata ReaderMetadata, progress ReadingProgress) var templ_7745c5c3_Var7 string templ_7745c5c3_Var7, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%.0f%% · Page %d/%d", progress.Percentage, progress.CurrentPage, metadata.EstimatedPages)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/reader.templ`, Line: 170, Col: 113} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/reader.templ`, Line: 175, Col: 113} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var7)) if templ_7745c5c3_Err != nil { @@ -208,7 +208,7 @@ func ReaderChrome(user User, metadata ReaderMetadata, progress ReadingProgress) var templ_7745c5c3_Var8 string templ_7745c5c3_Var8, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%.0f%%", progress.Percentage)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/reader.templ`, Line: 172, Col: 52} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/reader.templ`, Line: 177, Col: 52} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var8)) if templ_7745c5c3_Err != nil { @@ -219,7 +219,7 @@ func ReaderChrome(user User, metadata ReaderMetadata, progress ReadingProgress) var templ_7745c5c3_Var9 string templ_7745c5c3_Var9, templ_7745c5c3_Err = templ.JoinStringErrs(fmt.Sprintf("%d/%d", progress.CurrentPage, progress.TotalPages)) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/reader.templ`, Line: 175, Col: 72} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/reader.templ`, Line: 180, Col: 72} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var9)) if templ_7745c5c3_Err != nil { @@ -255,7 +255,7 @@ func ReaderSettingsPanel() templ.Component { templ_7745c5c3_Var10 = templ.NopComponent } ctx = templ.ClearChildren(ctx) - templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "

⚙️ Settings

Display

Reading Theme

Typography

Navigation

") + templ_7745c5c3_Err = templruntime.WriteString(templ_7745c5c3_Buffer, 14, "

⚙️ Settings

Display

Reading Theme

Typography

Navigation

") if templ_7745c5c3_Err != nil { return templ_7745c5c3_Err } @@ -359,7 +359,7 @@ func ReaderBookmarksPanel(bookmarks []Bookmark) templ.Component { var templ_7745c5c3_Var14 string templ_7745c5c3_Var14, templ_7745c5c3_Err = templ.ResolveAttributeValue(bookmark.CfiPosition) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/reader.templ`, Line: 393, Col: 38} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/reader.templ`, Line: 398, Col: 38} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ_7745c5c3_Var14) if templ_7745c5c3_Err != nil { @@ -372,7 +372,7 @@ func ReaderBookmarksPanel(bookmarks []Bookmark) templ.Component { var templ_7745c5c3_Var15 string templ_7745c5c3_Var15, templ_7745c5c3_Err = templ.JoinStringErrs(bookmark.Title) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/reader.templ`, Line: 396, Col: 49} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/reader.templ`, Line: 401, Col: 49} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var15)) if templ_7745c5c3_Err != nil { @@ -385,7 +385,7 @@ func ReaderBookmarksPanel(bookmarks []Bookmark) templ.Component { var templ_7745c5c3_Var16 string templ_7745c5c3_Var16, templ_7745c5c3_Err = templ.JoinStringErrs(bookmark.Position) if templ_7745c5c3_Err != nil { - return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/reader.templ`, Line: 398, Col: 27} + return templ.Error{Err: templ_7745c5c3_Err, FileName: `templates/reader.templ`, Line: 403, Col: 27} } _, templ_7745c5c3_Err = templ_7745c5c3_Buffer.WriteString(templ.EscapeString(templ_7745c5c3_Var16)) if templ_7745c5c3_Err != nil { diff --git a/web/src/reader/reader.ts b/web/src/reader/reader.ts index 7b1d4fa..1f1d990 100644 --- a/web/src/reader/reader.ts +++ b/web/src/reader/reader.ts @@ -371,6 +371,7 @@ document.addEventListener("alpine:init", () => { isPDF: false, interactionMode: "select" as string, magnifierEnabled: false, + doublePageSpread: true as boolean, progressText: "", progressLabel: "", progressMain: "", @@ -454,6 +455,7 @@ document.addEventListener("alpine:init", () => { this.readingFont = this.settings.reading_font || "literata"; this.fontSize = this.settings.font_size || 18; this.lineHeight = this.settings.line_height || 1.6; + this.doublePageSpread = this.settings.double_page_spread ?? true; if (this.settings.reading_mode) { this.readingMode = this.settings.reading_mode; } else { @@ -492,6 +494,7 @@ document.addEventListener("alpine:init", () => { this.zoomPercent = this.renderer.zoomPercent; }); this.computeFixedLayoutChapterBoundaries(); + this.applyDoublePageSpread(); } else { this.renderer.setStyles?.(this.buildCSS()); } @@ -692,6 +695,14 @@ document.addEventListener("alpine:init", () => { this.renderer.setAttribute("interaction-mode", next); this.interactionMode = next; }, + applyDoublePageSpread() { + if (!this.isFixedLayout || !this.renderer) return; + this.renderer.setAttribute( + "spread", + this.doublePageSpread ? "auto" : "none", + ); + saveSettings({ double_page_spread: this.doublePageSpread }); + }, goLeft() { this.view?.goLeft?.(); }, diff --git a/web/src/reader/settings-manager.ts b/web/src/reader/settings-manager.ts index b434633..313c852 100644 --- a/web/src/reader/settings-manager.ts +++ b/web/src/reader/settings-manager.ts @@ -78,7 +78,7 @@ export function getDefaultSettings(): ReaderSettings { font_size: 18, line_height: 1.6, margin_width: 20, - double_page_spread: false, + double_page_spread: true, reading_direction: "ltr", hardware_acceleration: true, panel_layout: {