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

81
html/202.html Normal file
View File

@@ -0,0 +1,81 @@
<html>
<head>
<meta charset="UTF-8">
<title>Ashen Rådande Profile</title>
<link rel="stylesheet" href="book-page.css">
</head>
<body>
<main>
<h1>ASHEN RÅDANDE</h1>
<p style="font-size: 1.1em; font-style: italic;">Lv 40 • PLANT</p>
<!-- Lore/Description -->
<section class="lore">
<h2>Description</h2>
<p>Once guardians of the forest, now they are driven by the gut-wrenching hatred that burns in their hearts.</p>
<p><strong>Traits:</strong> merciless, poisoned, scorched, terrifying.</p>
</section>
<!-- Stats Block -->
<div class="stats-block">
<div class="stat-group">
<h3>Attributes</h3>
<ul>
<li>DEX d10</li>
<li>INS d12</li>
<li>MIG d8</li>
<li>WLP d6</li>
<li>HP 120 • 60 MP</li>
<li>Init. 11</li>
</ul>
</div>
<div class="stat-group">
<h3>Defense & Attacks</h3>
<ul>
<li>DEF +0</li>
<li>M. DEF +0</li>
<li>p A VU b d E RS F IM I VU l T RS (Placeholder for complex stats)</li>
</ul>
</div>
<div class="stat-group">
<h3>Special Class Stats</h3>
<ul>
<li>Basic Damage: Fan the Flames • (DEX + MIG) +4 • (HR + 20) fire damage. After resolving this attack, if the target wasnt coveted, the Ashen Rådande loses 10 Hit Points.</li>
<li>Shared T orment OO • (INS + WLP) +7 • 20 MP • One creature • Instantaneous. Both the Ashen Rådande and the target suffer poisoned.</li>
</ul>
</div>
</div>
<!-- Core Abilities/Rules -->
<section class="abilities">
<h2>Special Rules</h2>
<ul>
<li><strong>Harrowing Rage:</strong> As long as the Ashen Rådande is poisoned, all damage they deal ignores Immunities and Resistances.</li>
<li><strong>Plant:</strong> The Ashen Rådande is immune to dazed, enraged, and shaken.</li>
<li><strong>Trial by Fire:</strong> When the Ashen Rådande is reduced to 0 Hit Points, Player Characters receive 1 Trial Point.</li>
</ul>
<h2>Ashen Rådande Tactics</h2>
<p>At the start of the conflict, a number of Rådande equal to the number of PCs minus 1 enter the scene. The forest spirits grudge drives them to push intruders away, preventing them from even attempting to demonstrate that they are worthy of Eldgrens trust and respect.</p>
<p><strong>Behavior:</strong></p>
<ul>
<li>On their turn, if they are not poisoned, a Rådande uses <em>Shared T orment</em> against a random target, prioritizing those who are not poisoned already.</li>
<li>If poisoned, the Rådande uses <em>Fan the Flames</em> against a random target, prioritizing coveted ones.</li>
<li>Also, every time a Player Character fails one of the three trials of the spirits, another Rådande immediately joins the conflict (up to a maximum number of Rådande equal to how many were present at the start of the conflict).</li>
</ul>
</section>
<!-- Footer/Metadata -->
<div style="margin-top: 40px; padding-top: 20px; border-top: 1px solid #ddd; font-size: 0.9em;">
<h4>Villain Status</h4>
<p>Major Villain (10 Ultima Points); Variable rank (see below)</p>
<p><strong>Source Data:</strong> ()</p>
</div>
</main>
</body>
</html>