feat: Add book viewer at /book with shared design system

- Add html/index.html: book viewer with auto-discovering sidebar,
  prev/next navigation, keyboard shortcuts, and URL hash persistence
- Add html/book-page.css: shared stylesheet for all book pages derived
  from fabula-ultima-sheet.css (dark theme, CSS variables, Cinzel/
  Crimson Text fonts, common class styles)
- Add book.js entry point so webpack injects the shared CSS into the
  book viewer; update webpack.config.js for two entry points, split
  CSS chunk, CopyWebpackPlugin for book pages, and /book dev server
  rewrite rule
- Add scripts/strip_watermark.py: removes "Guest Customer (Order
  #52072168)" watermark artifacts from all 210 book pages
- Add scripts/restyle_book.py: strips per-page <style> blocks and
  injects <link rel="stylesheet" href="book-page.css"> into all pages
- Update Justfile deploy to scp -r dist/* for the new /book subtree

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-06 03:36:35 +00:00
parent 58552b536f
commit c75cd188c1
220 changed files with 12685 additions and 10 deletions

74
html/190.html Normal file
View File

@@ -0,0 +1,74 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Will-o-Wisp Profile</title>
<link rel="stylesheet" href="book-page.css">
</head>
<body>
<header class="metadata">
<span>Chapter Title Placeholder</span>
<span style="float: right;">Page 189</span>
</header>
<h1>WILL-O-WISP</h1>
<h2>Lv 20 • UNDEAD</h2>
<section class="introduction">
<p>The remains of the inhabitants of Brightvale, the Will-o-Wisps crave the energy of the living and float around the creature that was once their home. Traits: empty, faint, incomplete, whispering.</p>
</section>
<section class="stats">
<h2>Characteristics & Stats</h2>
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px;">
<div>
<strong>DEX</strong> d12 <br>
<strong>INS</strong> d8 <br>
<strong>MIG</strong> d6 <br>
<strong>WLP</strong> d8 <br>
<p style="margin-top: 10px;">HP: 70 • MP: 35</p>
</div>
<div>
<strong>Init.</strong> 9 <br>
<div class="stat-block">DEF +0 / M. DEF +0</div>
<div class="stat-block">P RS A VU B RS D IM E RS F RS I VU L VU T IM</div>
</div>
</div>
<h3 style="margin-top: 25px;">Combat Details</h3>
<div class="stat-block" style="font-size: 0.9em;">
<strong>BASIC ATTACKS</strong> <br>
<span>M Pale Flame • (DEX + WLP) +2 • (HR + 10) fire damage.</span>
</div>
<h3 style="margin-top: 15px;">SPELLS</h3>
<div class="stat-block" style="font-size: 0.9em; background-color: #fffbe6; padding: 8px;">
<strong>Grave Whispers</strong> OO • (INS + WLP) +5 • 5 MP • One creature • Instantaneous. Deals (HR + 15) dark damage to the target.
</div>
</section>
<section class="abilities">
<h2>Special Rules</h2>
<ul>
<li><strong>Embrace the End:</strong> As long as there are at least two Will-o-Wisps on the scene, Grave Whispers deals 5 extra damage.</li>
<li><strong>Feeble Flame:</strong> When a Will-o-Wisp suffers damage it is Vulnerable to, it loses all Mind Points and suffers dazed, shaken, slow and weak.</li>
<li><strong>Flying:</strong> See Core Rulebook, page 307.</li>
<li><strong>Parasitic Flame:</strong> When one or more enemies recover Mind Points, they regain only half the normal amount and each Will-o-Wisp recovers 999 Mind Points (if there are two or more Will-o-Wisps on the scene, this effect triggers only once).</li>
<li><strong>Undead:</strong> The Will-o-Wisp is immune to poisoned and HP recovery may harm it (see Core Rulebook, page 305).</li>
</ul>
</section>
<section class="lore-analysis">
<h2>Lore Entry: Undead Adversaries in Natural Fantasy</h2>
<p>Clinging to life so fiercely that one becomes undead is a classic of the high fantasy genre: ancient warlocks becoming abominable liches, entire spectral armies forced by ancient oaths to emerge from their graves, and so on. Brightvale frames this idea in a natural fantasy context, adding a touch of horror the love of a steadfast community turned to unhealthy attachment and misfortune. This adversary doesnt have any evil plan or grand ambitions, it lacks even a real conscience its considered a Villain because it embodies the villagers fear and refusal to accept the natural order of life.</p>
<div class="lore-quote">“Nothing remains of those ancient lands. Only sand, silence and a pale light far, far away.”</div>
</section>
<footer class="metadata">
</footer>
</body>
</html>