Files
kennethreitzandClaude Fable 5 49f66d3cb1 Soup up the books index
- bronze "The Canon of Scripture" kicker over the title
- canon stats strip in old-style numerals: 66 books, 1,189 chapters
  (computed from the book data), 31,102 verses, 2 testaments
- testament headers carry their book counts
- every card names its genre in the genre's own ink above the title,
  with chapter counts in bronze small caps
- the color legend is gone — with genres printed on the cards it was
  pure duplication (dead CSS removed with it)

All 976 tests pass.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-08 00:38:48 -04:00

286 lines
7.5 KiB
HTML

{% extends "base.html" %}
{% block title %}Books of the Bible - KJV Study{% endblock %}
{% block description %}Browse all 66 books of the Authorized King James Version Bible{% endblock %}
{% block head %}
<style>
.book-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 1rem;
max-width: 90%;
margin: 2rem 0;
}
.book-card {
display: block;
padding: 1rem 1.1rem;
background: var(--bg-elevated);
border: 1px solid var(--border-color-dark);
border-left: 3px solid var(--border-color-darker);
border-radius: 6px;
transition: all 0.2s ease;
text-decoration: none;
color: var(--text-color);
}
.book-card:hover {
border-top-color: var(--accent);
border-right-color: var(--accent);
border-bottom-color: var(--accent);
transform: translateY(-2px);
box-shadow: var(--shadow-soft);
cursor: pointer;
}
.book-card.selected {
border-top-color: var(--accent);
border-right-color: var(--accent);
border-bottom-color: var(--accent);
box-shadow: 0 0 0 2px var(--accent-soft);
outline: none;
}
.book-card.selected .book-name {
color: var(--accent-strong);
}
.book-name {
font-size: 1.2rem;
font-weight: 600;
margin-bottom: 0.25rem;
color: var(--text-strong);
transition: color 0.15s ease;
}
.book-card:hover .book-name {
color: var(--accent-strong);
}
.book-info {
font-size: 0.68rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.14em;
color: var(--bronze);
margin-top: 0.4rem;
}
/* Genre name printed in its own ink */
.book-genre {
font-size: 0.62rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.16em;
margin-bottom: 0.3rem;
}
.book-genre.law { color: var(--cat-law); }
.book-genre.historical { color: var(--cat-historical); }
.book-genre.wisdom { color: var(--cat-wisdom); }
.book-genre.major-prophets { color: var(--cat-major-prophets); }
.book-genre.minor-prophets { color: var(--cat-minor-prophets); }
.book-genre.gospels { color: var(--cat-gospels); }
.book-genre.acts { color: var(--cat-acts); }
.book-genre.pauline { color: var(--cat-pauline); }
.book-genre.general { color: var(--cat-general); }
.book-genre.apocalyptic { color: var(--cat-apocalyptic); }
/* Canon stats strip */
.canon-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
gap: 1rem;
max-width: 90%;
margin: 2rem 0 1rem;
}
.canon-stat {
background: var(--bg-elevated);
border: 1px solid var(--border-color-dark);
border-radius: 8px;
padding: 1.1rem 1.25rem;
text-align: center;
}
.canon-stat .number {
font-family: et-book-roman-old-style, et-book, Georgia, serif;
font-size: 1.9rem;
color: var(--text-strong);
line-height: 1.2;
}
.canon-stat .label {
font-size: 0.66rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.16em;
color: var(--bronze);
margin-top: 0.3rem;
}
.testament-section {
margin: 2rem 0;
}
.testament-header {
position: relative;
font-size: 1rem !important;
font-weight: 600;
font-style: normal !important;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--text-secondary) !important;
margin-bottom: 1rem;
padding-bottom: 0.6rem;
border-bottom: 1px solid var(--border-color);
}
.testament-header::after {
content: '';
position: absolute;
left: 0;
bottom: -1px;
width: 2.75rem;
height: 1px;
background: var(--gold);
}
.testament-count {
float: right;
font-size: 0.7rem;
font-weight: 600;
letter-spacing: 0.12em;
color: var(--bronze);
}
/* Book type color coding — genre inks on the spine edge */
.book-card.law { border-left-color: var(--cat-law); }
.book-card.historical { border-left-color: var(--cat-historical); }
.book-card.wisdom { border-left-color: var(--cat-wisdom); }
.book-card.major-prophets { border-left-color: var(--cat-major-prophets); }
.book-card.minor-prophets { border-left-color: var(--cat-minor-prophets); }
.book-card.gospels { border-left-color: var(--cat-gospels); }
.book-card.acts { border-left-color: var(--cat-acts); }
.book-card.pauline { border-left-color: var(--cat-pauline); }
.book-card.general { border-left-color: var(--cat-general); }
.book-card.apocalyptic { border-left-color: var(--cat-apocalyptic); }
/* Mobile optimizations */
@media (max-width: 768px) {
.book-grid {
max-width: 100%;
grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
gap: 0.75rem;
}
.book-card {
padding: 0.9rem;
min-height: 70px;
}
.book-name {
font-size: 1.05rem;
}
.book-info {
font-size: 0.8rem;
}
.testament-header {
font-size: 1.3rem;
}
.intro-text {
max-width: 100%;
font-size: 1.1rem;
}
}
@media (max-width: 480px) {
.book-grid {
grid-template-columns: 1fr 1fr;
gap: 0.5rem;
}
.book-card {
padding: 0.75rem;
}
.book-name {
font-size: 0.95rem;
}
}
</style>
{% endblock %}
{% block content %}
<span class="page-kicker">The Canon of Scripture</span>
<h1>Books of the Bible</h1>
<p class="subtitle">The Authorized King James Version</p>
{% set all_books = old_testament + new_testament %}
<div class="canon-stats">
<div class="canon-stat">
<div class="number">{{ all_books | length }}</div>
<div class="label">Books</div>
</div>
<div class="canon-stat">
<div class="number">{{ "{:,}".format(all_books | sum(attribute="chapters")) }}</div>
<div class="label">Chapters</div>
</div>
<div class="canon-stat">
{# 1769 Oxford Standard text of the Authorized Version #}
<div class="number">31,102</div>
<div class="label">Verses</div>
</div>
<div class="canon-stat">
<div class="number">2</div>
<div class="label">Testaments</div>
</div>
</div>
<section id="old-testament" class="testament-section">
<h2 class="testament-header">Old Testament <span class="testament-count">{{ old_testament | length }} BOOKS</span></h2>
<div class="book-grid">
{% for book in old_testament %}
{% if book.available %}
<a href="/book/{{ book.name }}" class="book-card {{ book.type }}">
<div class="book-genre {{ book.type }}">{{ book.type.replace('-', ' ') }}</div>
<div class="book-name">{{ book.name }}</div>
<div class="book-info">{{ book.chapters }} {% if book.chapters == 1 %}chapter{% else %}chapters{% endif %}</div>
</a>
{% endif %}
{% endfor %}
</div>
</section>
<section id="new-testament" class="testament-section">
<h2 class="testament-header">New Testament <span class="testament-count">{{ new_testament | length }} BOOKS</span></h2>
<div class="book-grid">
{% for book in new_testament %}
{% if book.available %}
<a href="/book/{{ book.name }}" class="book-card {{ book.type }}">
<div class="book-genre {{ book.type }}">{{ book.type.replace('-', ' ') }}</div>
<div class="book-name">{{ book.name }}</div>
<div class="book-info">{{ book.chapters }} {% if book.chapters == 1 %}chapter{% else %}chapters{% endif %}</div>
</a>
{% endif %}
{% endfor %}
</div>
</section>
<script>
// Use standardized grid navigation from base.js
document.addEventListener('DOMContentLoaded', function() {
if (window.KJVNav && KJVNav.initGridNav) {
KJVNav.initGridNav('.book-card', { gridSelector: '.book-grid' });
}
});
</script>
{% endblock %}