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

63
html/140.html Normal file
View File

@@ -0,0 +1,63 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Prologue Character Sheet</title>
<link rel="stylesheet" href="book-page.css">
</head>
<body>
<header>
<h1>CHAPTER 139</h1>
<h2>W / PROTAGONISTS</h2>
<p style="font-size: 0.9em;">FLORALIST FREE BENEFITS</p>
</header>
<section class="skill-entry">
<h3>BATTLE GARDENING <span class="cost">(çç3)</span></h3>
<p>After you plant a magiseed through the Chloromancy Skill (not when using Graft), you may choose one option:</p>
<ul>
<li>Perform a free attack with an equipped weapon; or</li>
<li>Perform the Spell action for free, casting a spell with a total Mind Point cost equal to or lower than (5 + (SL × 5)) (you must still pay its MP cost).</li>
</ul>
<p class="note" style="font-size: 0.9em; margin-top: 10px;"><strong>Note:</strong> Treat the High Roll (HR) of your Accuracy Check or Magic Check as being equal to 0 when determining damage dealt by this attack or spell.</p>
</section>
<section class="skill-entry">
<h3>CHLOROMANCY <span class="cost">(çç10)</span></h3>
<p>Each time you acquire this Skill, you discover a new type of magiseed from the list found in the next pages.</p>
<p>During a conflict, if there are no magiseeds in your garden, you may use an action and spend 20 Mind Points to plant a magiseed of a type you have discovered. The rules for the garden and for magiseed growth can be found in the next pages.</p>
</section>
<section class="skill-entry">
<h3>GRAFT</h3>
<p>As long as there is a magiseed in your garden and 1 or more sections of your Growth Clock are filled, you may use an action to remove that magiseed from your garden: if you do, plant a different magiseed among those you have discovered (keep the current filled sections of your Growth Clock unchanged).</p>
</section>
<section class="skill-entry">
<h3>TREE OF LIFE <span class="cost">(çç5)</span></h3>
<p>When a magiseed is removed from your garden, you may choose one creature you can see: if that creature is in Crisis, they recover (5 + (SL × 5)) Hit Points.</p>
</section>
<section class="skill-entry">
<h3>VERDANT SWAY</h3>
<p>You gain the ability to perform Rituals of the Ritualism discipline; additionally, you may use Ritualism to create, animate, and/or control vegetation, pollen, spores, and toxins (but you cannot create nor control plant-Species NPCs this way).</p>
</section>
<div class="meta-data" style="margin-top: 40px;">
<h3>Character Reflection</h3>
<ul class="question-list">
<li>When did you first discover a magiseed, and where?</li>
<li>Who taught you how to tend to plants and flowers?</li>
<li>How did you implement magiseeds in your combat style?</li>
<li>Are there many practicing your art, or are you the exception?</li>
</ul>
</div>
<div class="guest-customer" style="margin-top: 30px; padding-top: 15px; border-top: 1px dashed #ccc;">
</div>
</body>
</html>