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/186.html Normal file
View File

@@ -0,0 +1,81 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Character Dossier & Reflection</title>
<link rel="stylesheet" href="book-page.css">
</head>
<body>
<div class="chapter-header">
ANTAGONISTS (Chapter)
</div>
<h2>DYLON PROFILE</h2>
<p style="font-style: italic; color: #6a6a6a;">“We dont expect gratitude. Nonetheless, we know what must be done.”</p>
<div class="stats-container">
<div class="stats-header">DYLON (Elite)</div>
<div><strong>Level:</strong> 10 • <strong>Race:</strong> BEAST</div>
<p style="margin: 5px 0;"><strong>Traits:</strong> imposing, protective, seaborn, staunch.</p>
<hr>
<h4>Combat Stats</h4>
<div class="stat-line"><strong>DEX / INS / MIG / WLP / HP:</strong> d6 / d8 / d10 / d8 / 140</div>
<div class="stat-line"><strong>MP / Init.:</strong> 70 MP / 60 Init. 9</div>
<div class="stat-line"><strong>DEF / M. DEF:</strong> +2 / +1 p a B</div>
<p style="margin: 5px 0;">VU d E RS F VU I RS l t</p>
</div>
<h2>Abilities</h2>
<h3>Basic Attacks</h3>
<div class="ability-section">
<strong>Sea Fin</strong>
<ul>
<li>(INS + MIG) +1 attack.</li>
<li>(HR + 5) ice damage.</li>
<li><em>Condition:</em> If the tide is high, the target suffers weak.</li>
<li>*Note:* If the tide is low, the target wont be able to see Node (see previous page) until Dylon uses Sea Fin again.</li>
</ul>
</div>
<h3>Spells</h3>
<div class="ability-section">
<strong>Rock Toss</strong> <em>(OO)</em>
<ul>
<li>(MIG + WLP) +1 attack, 5 MP cost. One creature target. Instantaneous.</li>
<li>Dylon deals (HR + 10) earth damage to the target.</li>
</ul>
</div>
<h3>Other Actions</h3>
<div class="ability-section">
<strong>Coordinated Action</strong> <em>(SS)</em>
<p>Dylon can use an action and spend 10 Mind Points to perform a free attack with Sea Fin, treating the High Roll as 0 when calculating damage. After this attack is resolved:</p>
<ul>
<li>If the tide is high: Node (see previous page) performs a free attack with Hunters Bow, treating the High Roll as 0.</li>
<li>If the tide is low: Node recovers 10 Hit Points instead.</li>
</ul>
</div>
<h2>Special Rules</h2>
<div class="special-rule-list">
<ul>
<li><strong>High Tide Strength:</strong> When the tide is high, all damage dealt by Dylon ignores Resistances.</li>
<li><strong>Ill Avenge You!:</strong> When Node (see previous page) is reduced to 0 Hit Points, Dylon recovers from all status effects and loses all his Vulnerabilities. After that, the tide becomes high again.</li>
<li><strong>Low Tide Tenacity:</strong> When the tide is low, Dylon becomes Resistant to physical damage.</li>
</ul>
</div>
<div class="reflection-text">
<h3>A Reflection In Two Parts</h3>
<p>While the T onitranea Rex (see page 176) is a terrible predator that upsets the ecosystem, Node and Dylon showcase how pain and tragedy might warp protective instincts into extremism a preemptive and short-sighted hunt, fueled by fear rather than understanding. However, the village of Turva and their mentor cultivated a diametrically opposite philosophy, one that still endures in the powerful bond between Node and Dylon: its not too late, and the Player Characters might be able to bring those feelings back to surface before they drown in a sea of bitterness.</p>
</div>
<div class="guest-customer">
</div>
</body>
</html>