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

88
html/85.html Normal file
View File

@@ -0,0 +1,88 @@
<link rel="stylesheet" href="book-page.css">
<article>
<h1>SAMPLE NATURAL FANTASY RARE WEAPONS</h1>
</article>
<div class="weapon-entry">
<div class="weapon-header">
<span class="weapon-name">Ladle</span>
<span class="weapon-stats">Cost: <strong class="cost">500 z</strong> | Attributes: (DEX + INS) (HR + 8) physical</span>
</div>
<div class="key-attributes">
<p><strong>Classification:</strong> Thrown • One-handed • Ranged</p>
<p><strong>Description:</strong> If you have acquired the *Made with Love* Skill (see page 149), treat your Skill Level in it as if it were increased by 1 (up to a maximum of SL 4).</p>
</div>
</div>
<div class="weapon-entry">
<div class="weapon-header">
<span class="weapon-name">Camera Obscura</span>
<span class="weapon-stats">Cost: <strong class="cost">600 z</strong> | Attributes: (INS + INS) (HR + 6) dark</span>
</div>
<div class="key-attributes">
<p><strong>Classification:</strong> Arcane • Two-handed • Melee</p>
<ul class="type-list">
<li><em>Special Rule:</em> When you obtain a result of 13 or higher in a Check made to examine the profile of one or more enemies that you can see, if you have acquired the *Spell Mimic Skill* (see Core Rulebook, page 183), you can choose one of those enemies. If the chosen enemy knows one or more spells you may learn one of them as a Chimerist spell.</li>
</ul>
</div>
</div>
<div class="weapon-entry">
<div class="weapon-header">
<span class="weapon-name">Memorialis W</span>
<span class="weapon-stats">Cost: <strong class="cost">700 z</strong> | Attributes: (DEX + MIG) +1 (HR + 12) physical</span>
</div>
<div class="key-attributes">
<p><strong>Classification:</strong> Spear • Two-handed • Melee</p>
<p><strong>Description:</strong> When you use the *Ripples* Skill (see page 155), you recover 5 Mind Points.</p>
</div>
</div>
<div class="weapon-entry">
<div class="weapon-header">
<span class="weapon-name">Blazing Fan</span>
<span class="weapon-stats">Cost: <strong class="cost">800 z</strong> | Attributes: (DEX + MIG) +1 (HR + 6) fire</span>
</div>
<div class="key-attributes">
<p><strong>Classification:</strong> Brawling • One-handed • Melee</p>
<p><strong>Description:</strong> Your invocations that target two or more creatures deal extra damage equal to your Skill Level in *Linked Invocations* (see page 155).</p>
</div>
</div>
<div class="weapon-entry">
<div class="weapon-header">
<span class="weapon-name">Derringer</span>
<span class="weapon-stats">Cost: <strong class="cost">800 z</strong> | Attributes: (DEX + INS) +1 (HR + 8) physical</span>
</div>
<div class="key-attributes">
<p><strong>Classification:</strong> Firearm • One-handed • Ranged</p>
<p><strong>Description:</strong> The first attack you perform with this weapon during each scene deals 5 extra damage. Also, despite being based on the pistols profile, this isnt considered a martial (W) weapon.</p>
</div>
</div>
<div class="weapon-entry">
<div class="weapon-header">
<span class="weapon-name">Bronze Libra</span>
<span class="weapon-stats">Cost: <strong class="cost">900 z</strong> | Attributes: (INS + INS) (HR + 6) earth</span>
</div>
<div class="key-attributes">
<p><strong>Classification:</strong> Arcane • Two-handed • Melee</p>
<p><strong>Description:</strong> After you perform a Magic Check, if the value of one die is a multiple of the value of the other, you regain Inventory Points equal to (half your Skill Level in *Winds of Trade* (see page 159)).</p>
</div>
</div>
<div class="weapon-entry">
<div class="weapon-header">
<span class="weapon-name">Giant Fork W</span>
<span class="weapon-stats">Cost: <strong class="cost">1000 z</strong> | Attributes: (DEX + MIG) (HR + 16) physical</span>
</div>
<div class="key-attributes">
<p><strong>Classification:</strong> Spear • Two-handed • Melee</p>
<p><strong>Description:</strong> When you use this weapon with the *Knife and Fork* Skill (see page 149), you may add the High Roll to the attacks damage (you dont have to treat it as being equal to 0).</p>
</div>
</div>
<div class="weapon-entry" style="border: none; background-color: transparent;">
<p><em>(This entry appears to be a catalog identifier rather than an actual weapon profile, therefore only the name is styled as a main heading.)</em></p>
</div>