@namespace MidrandBooks.Components @using Microsoft.AspNetCore.Components @using MidrandBooks.Models

@Book.Title

By @Book.Author • Chapter Page @(CurrentPage + 1) of @PagesCount()

@if (ShowSettings) {
Font Size @(FontSize)px
}
@if (Book.FullText != null && Book.FullText.Count > CurrentPage) {

@Book.FullText[CurrentPage]

} else {

Digital copy protection sandbox active. Reflowable text formatting is loading.

}
@code { [Parameter] public BookModel Book { get; set; } = new(); [Parameter] public EventCallback OnClose { get; set; } [Parameter] public int CurrentPage { get; set; } = 0; [Parameter] public EventCallback OnPageChanged { get; set; } private bool ShowSettings { get; set; } = false; private string Theme { get; set; } = "sepia"; private string Font { get; set; } = "serif"; private int FontSize { get; set; } = 16; private bool IsBookmarked { get; set; } = false; private List Bookmarks { get; set; } = new(); private void ToggleSettings() { ShowSettings = !ShowSettings; } private void ToggleBookmark() { if (Bookmarks.Contains(CurrentPage)) { Bookmarks.Remove(CurrentPage); IsBookmarked = false; } else { Bookmarks.Add(CurrentPage); IsBookmarked = true; } } private int PagesCount() { return Book.FullText?.Count ?? 1; } private void NextPage() { if (Book.FullText != null && CurrentPage < Book.FullText.Count - 1) { CurrentPage++; IsBookmarked = Bookmarks.Contains(CurrentPage); OnPageChanged.InvokeAsync(CurrentPage); } } private void PrevPage() { if (CurrentPage > 0) { CurrentPage--; IsBookmarked = Bookmarks.Contains(CurrentPage); OnPageChanged.InvokeAsync(CurrentPage); } } private void SetTheme(string theme) { Theme = theme; } private void SetFont(string font) { Font = font; } private string ThemeBgClass() { return Theme switch { "sepia" => "bg-amber-50 text-amber-950", "dark" => "bg-slate-950 text-slate-100", _ => "bg-white text-slate-900" }; } private string HeaderBorderClass() { return Theme == "dark" ? "border-white/5 bg-slate-900/40" : "border-black/5 bg-slate-100/40"; } private string FontClass() { return Font switch { "sans" => "reader-text-sans", "mono" => "reader-text-mono", _ => "reader-text-serif" }; } private string TextContrastClass() { return Theme switch { "sepia" => "text-amber-900", "dark" => "text-slate-200", _ => "text-slate-800" }; } }