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/116.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>Protagonists Chapter 9</title>
<link rel="stylesheet" href="book-page.css">
</head>
<body>
<div class="chapter-info">
<span>Chapter 9</span>
<h1>AUTODRIVERS</h1>
</div>
<h2>Protagonists</h2>
<!-- Introductory Paragraph -->
<p>Loud and powerful, these weapons were developed by the Merchant Chloe from just a sketch and a double-pressure tank. Built to process very tough material, rather than for combat, they nevertheless proved themselves as highly effective weapons, especially when combined with a host of experimental chemicals (see infusions, Core Rulebook, page 214).</p>
<!-- STAKE DRIVER Section -->
<div class="weapon-section">
<h3 style="margin-top: 0; border-bottom: none;">STAKE DRIVER <span class="rarity">W</span></h3>
<p>The weapons basic form, worth <strong>300 zenit</strong>.</p>
<h4>Stats</h4>
<ul class="stats">
<li><strong>Accuracy:</strong> (DEX + INS) +2</li>
<li><strong>Damage:</strong> (HR + 10) physical</li>
</ul>
<h4>Specifications</h4>
<div class="description">
<ul>
<li>Spear</li>
<li>Two-handed</li>
<li>Melee</li>
<li>No Quality.</li>
</ul>
<p>This weapon has the accurate, defense boost and powerful customizations.</p>
</div>
</div>
<!-- AUTOSCRAPPER Section -->
<div class="weapon-section">
<h3 style="margin-top: 0; border-bottom: none;">AUTOSCRAPPER <span class="rarity">W</span></h3>
<p>A possible rare evolution, worth <strong>1400 zenit</strong>.</p>
<h4>Stats</h4>
<ul class="stats">
<li><strong>Accuracy:</strong> (DEX + INS) +2</li>
<li><strong>Damage:</strong> (HR + 14) earth</li>
</ul>
<h4>Specifications</h4>
<div class="description">
<ul>
<li>Spear</li>
<li>Two-handed</li>
<li>Melee</li>
<li><strong>Effect:</strong> When you reduce an enemy to 0 Hit Points with this weapon, you gain a material, chosen by the Game Master, worth an amount of zenit equal to or less than (your Tinkerer level, multiplied by 100).</li>
</ul>
<p>This weapon has the accurate, defense boost and powerful customizations.</p>
</div>
</div>
<!-- Dialogue/Scene Break -->
<div class="dialogue">
“Oh! If we connect <br>
the primary compressor <br>
to the combustion chamber, <br>
dividing the pressure <br>
between the eight <br>
secondary valves… <br>
hehehe!”
</div>
<!-- Credits/Footer -->
</body>
</html>