Files
ebooks/views/pages.templ
T
2026-08-06 21:07:40 +02:00

110 lines
2.9 KiB
Templ

package views
import (
"strings"
"github.com/arnef/ebooks/internal/library"
)
templ Layout(title string, backHref string) {
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>{ title }</title>
<link rel="stylesheet" href="/static/styles.css" />
</head>
<body>
<header class="header">
<div class="header-bar">
if backHref != "" {
<a class="header-back" href={ backHref } aria-label="Zurück"></a>
}
<h1><a href="/">eBook Library</a></h1>
</div>
</header>
<main class="container">
{ children... }
</main>
</body>
</html>
}
templ BookCover(book library.Book, detail bool) {
if book.HasCover {
<img class={ coverClass(detail) } src={ "/cover/" + book.ID } alt={ "Cover von " + book.Title } loading="lazy" />
} else {
<div class={ placeholderClass(detail) } aria-hidden="true">
<span>{ strings.ToUpper(book.Format) }</span>
</div>
}
}
templ IndexPage(books []library.Book) {
@Layout("Bibliothek", "") {
<section class="page-head">
<h2>Meine Bücher</h2>
<p class="page-subtitle">Titel, Autor und Cover auf einen Blick.</p>
</section>
if len(books) == 0 {
<p>Keine eBooks gefunden. Lege EPUB- oder PDF-Dateien im Ordner <code>books/</code> ab.</p>
} else {
<ul class="book-list">
for _, b := range books {
<li class="book-item">
<a class="book-card" href={ "/book/" + b.ID }>
<div class="book-card-cover">
@BookCover(b, false)
</div>
<div class="book-card-body">
<strong class="book-title">{ b.Title }</strong>
<span class="book-author">{ b.Author }</span>
<span class="format">{ b.Format }</span>
</div>
</a>
</li>
}
</ul>
}
}
}
templ BookPage(book library.Book) {
@Layout(book.Title, "/") {
<article class="book-detail">
<div class="book-detail-cover">
@BookCover(book, true)
</div>
<div class="book-detail-body">
<h2>{ book.Title }</h2>
<p class="book-author-detail">{ book.Author }</p>
<dl class="book-meta">
<div>
<dt>Datei</dt>
<dd>{ book.Filename }</dd>
</div>
<div>
<dt>Format</dt>
<dd>{ book.Format }</dd>
</div>
</dl>
<p><a class="btn" href={ "/download/" + book.ID }>Auf Tolino herunterladen</a></p>
</div>
</article>
}
}
func coverClass(detail bool) string {
if detail {
return "book-cover book-cover-detail"
}
return "book-cover"
}
func placeholderClass(detail bool) string {
if detail {
return "book-cover-placeholder book-cover-placeholder-detail"
}
return "book-cover-placeholder"
}