package templates import ( "encoding/json" "fmt" ) func readerInitExpr(metadata ReaderMetadata, progress ReadingProgress) string { config := map[string]interface{}{ "mediaItemId": metadata.MediaItemID, "fileUrl": metadata.FileURL, "formatGroup": metadata.FormatGroup, "readingDirection": metadata.ReadingDirection, "mangaType": metadata.MangaType, } if progress.Percentage > 0 { config["savedPercentage"] = progress.Percentage / 100 } if progress.EpubCfi != "" { config["savedCfi"] = progress.EpubCfi } // Fixed-layout & comic formats: the page index is the canonical, exact // locator (pages are fixed images). Pass it so the reader restores by page. if (metadata.FormatGroup == "fixed_layout" || metadata.FormatGroup == "comic_archive") && progress.CurrentPage > 0 { config["savedPage"] = progress.CurrentPage if progress.TotalPages > 0 { config["savedTotalPages"] = progress.TotalPages } } jsonBytes, _ := json.Marshal(config) return fmt.Sprintf("initReader(%s)", string(jsonBytes)) } templ Reader(user User, metadata ReaderMetadata, progress ReadingProgress, bookmarks []Bookmark) { { metadata.Title } - Bookhoard Reader @ReaderChrome(user, metadata, progress)
@DictionaryPopup() } templ ReaderChrome(user User, metadata ReaderMetadata, progress ReadingProgress) {
← Back

{ metadata.Title }

if progress.FormatGroup == "reflowable" { if metadata.EstimatedPages > 0 { { fmt.Sprintf("%.0f%% Β· Page %d/%d", progress.Percentage, progress.CurrentPage, metadata.EstimatedPages) } } else { { fmt.Sprintf("%.0f%%", progress.Percentage) } } } else { { fmt.Sprintf("%d/%d", progress.CurrentPage, progress.TotalPages) } }
} templ ReaderSettingsPanel() {

βš™οΈ Settings

Display

Reading Theme

Typography

Navigation

} templ ReaderTOCPanel(_ ReaderMetadata) {

πŸ“– Table of Contents

} templ ReaderNavigatorPanel() {

πŸ—ΊοΈ Navigator

} templ ReaderBookmarksPanel(bookmarks []Bookmark) {

πŸ”– Bookmarks

if len(bookmarks) > 0 {
for _, bookmark := range bookmarks { { bookmark.Title } { bookmark.Position } }
} else {

No bookmarks yet

}
} templ DictionaryPopup() { }