Files
mythic-oracle/public/index.html
T
claudecode 40b0e21d9d fix: dice view readability and pool builder cleanup
Remove d100 from the dice pool builder (percentile section is
unaffected). Switch die buttons, pool display, and result output
to JetBrains Mono for mechanical/numeric readability, and lay out
the pool builder buttons in a fixed 7-column grid to match the
remaining die count.
2026-07-01 00:29:18 -04:00

309 lines
15 KiB
HTML

<!DOCTYPE html>
<html lang="en" data-theme="dark">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mythic Oracle</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,500;0,600;0,700;1,400&family=Lora:ital,wght@0,400;0,500;0,600;1,400&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="css/styles.css">
</head>
<body>
<div class="app">
<aside class="sidebar" id="sidebar">
<div class="sidebar-header">
<div class="sidebar-brand">
<svg class="sidebar-logo" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M12 3l1.8 4.6L18 9l-4.2 1.4L12 15l-1.8-4.6L6 9l4.2-1.4L12 3z"/>
</svg>
<span class="sidebar-title">Mythic Oracle</span>
</div>
<button class="sidebar-collapse-toggle" id="collapseToggle" aria-label="Collapse sidebar">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M15 6l-6 6 6 6"/>
</svg>
</button>
</div>
<div class="sidebar-active-campaign" id="activeCampaignName">No active campaign</div>
<nav class="sidebar-nav">
<div class="nav-section">
<div class="nav-section-label">Oracle</div>
<button class="nav-item active" data-view="oracle">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<circle cx="12" cy="11" r="7"/>
<path d="M6 20h12"/>
</svg>
<span class="nav-label">Oracle</span>
</button>
<button class="nav-item" data-view="meaning">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M4 4h16v12H8l-4 4V4z"/>
</svg>
<span class="nav-label">Meaning</span>
</button>
<button class="nav-item" data-view="une">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M4 6h16M4 12h16M4 18h10"/>
</svg>
<span class="nav-label">UNE</span>
</button>
</div>
<div class="nav-section">
<div class="nav-section-label">Tools</div>
<button class="nav-item" data-view="dice">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<rect x="4" y="4" width="16" height="16" rx="3"/>
<circle cx="8.5" cy="8.5" r="0.75" fill="currentColor" stroke="none"/>
<circle cx="15.5" cy="8.5" r="0.75" fill="currentColor" stroke="none"/>
<circle cx="12" cy="12" r="0.75" fill="currentColor" stroke="none"/>
<circle cx="8.5" cy="15.5" r="0.75" fill="currentColor" stroke="none"/>
<circle cx="15.5" cy="15.5" r="0.75" fill="currentColor" stroke="none"/>
</svg>
<span class="nav-label">Dice</span>
</button>
<button class="nav-item" data-view="tables">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<rect x="3" y="3" width="18" height="18" rx="1"/>
<path d="M3 9h18M3 15h18M9 3v18M15 3v18"/>
</svg>
<span class="nav-label">Tables</span>
</button>
</div>
<div class="nav-section">
<div class="nav-section-label">Campaign</div>
<button class="nav-item" data-view="threads">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M4 6h2M4 12h2M4 18h2M9 6h11M9 12h11M9 18h11"/>
</svg>
<span class="nav-label">Threads</span>
</button>
<button class="nav-item" data-view="npcs">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<circle cx="12" cy="8" r="4"/>
<path d="M4 20c0-4 4-6 8-6s8 2 8 6"/>
</svg>
<span class="nav-label">NPCs</span>
</button>
<button class="nav-item" data-view="notes">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M6 3h9l3 3v15H6z"/>
<path d="M9 8h8M9 12h8M9 16h5"/>
</svg>
<span class="nav-label">Notes</span>
</button>
<button class="nav-item" data-view="character">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M12 3l7 3v6c0 5-3.5 8-7 9-3.5-1-7-4-7-9V6z"/>
</svg>
<span class="nav-label">Character</span>
</button>
</div>
<div class="nav-section">
<div class="nav-section-label">Settings</div>
<button class="nav-item" data-view="campaign-management">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<circle cx="12" cy="12" r="3"/>
<path d="M12 2v3M12 19v3M4.2 4.2l2.1 2.1M17.7 17.7l2.1 2.1M2 12h3M19 12h3M4.2 19.8l2.1-2.1M17.7 6.3l2.1-2.1"/>
</svg>
<span class="nav-label">Campaign Management</span>
</button>
<button class="nav-item nav-action" id="themeToggle" aria-label="Toggle light and dark theme">
<svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<path d="M20 14.5A8.5 8.5 0 1 1 9.5 4a7 7 0 0 0 10.5 10.5z"/>
</svg>
<span class="nav-label">Theme Toggle</span>
</button>
</div>
</nav>
<div class="chaos-factor">
<div class="chaos-factor-label">Chaos Factor</div>
<div class="chaos-factor-controls">
<button class="chaos-btn" id="chaosMinus" aria-label="Decrease chaos factor">&minus;</button>
<span class="chaos-factor-value" id="chaosValue">5</span>
<button class="chaos-btn" id="chaosPlus" aria-label="Increase chaos factor">+</button>
</div>
</div>
</aside>
<main class="main-content">
<div class="view active" id="view-oracle">
<div class="card">
<div class="card-title">Fate Check</div>
<div class="prob-grid" id="probGrid">
<button class="prob-btn" data-label="Impossible" data-base="5">Impossible</button>
<button class="prob-btn" data-label="No Way" data-base="15">No Way</button>
<button class="prob-btn" data-label="Very Unlikely" data-base="25">Very Unlikely</button>
<button class="prob-btn" data-label="Unlikely" data-base="35">Unlikely</button>
<button class="prob-btn selected" data-label="50/50" data-base="50">50 / 50</button>
<button class="prob-btn" data-label="Somewhat Likely" data-base="65">Somewhat Likely</button>
<button class="prob-btn" data-label="Likely" data-base="75">Likely</button>
<button class="prob-btn" data-label="Very Likely" data-base="85">Very Likely</button>
<button class="prob-btn" data-label="Near Certain" data-base="95">Near Certain</button>
</div>
<button class="roll-btn" id="fateRollBtn">Ask the Fates</button>
<div class="result-box" id="fateResult">
<span class="placeholder">Select a probability and ask.</span>
</div>
</div>
<div class="card">
<div class="card-title">Random Event Check</div>
<p class="card-note">Roll at the start of each scene. A random event occurs if the result is equal to or under the chaos factor.</p>
<button class="roll-btn" id="eventRollBtn">Check for Random Event</button>
<div class="event-result" id="eventResult">
<span class="placeholder">Roll to check.</span>
</div>
</div>
</div>
<div class="view" id="view-meaning">
<div class="card">
<div class="card-title">Meaning Tables</div>
<p class="card-note">Use these to interpret random events, oracle results, or whenever you need narrative inspiration.</p>
<button class="roll-btn" id="meaningRollBtn">Roll Action + Descriptor</button>
<div class="meaning-grid">
<div class="meaning-result">
<div class="meaning-label">Action</div>
<div class="meaning-word" id="meaningAction"><span class="placeholder"></span></div>
</div>
<div class="meaning-result">
<div class="meaning-label">Descriptor</div>
<div class="meaning-word" id="meaningDescriptor"><span class="placeholder"></span></div>
</div>
</div>
</div>
<div class="card">
<div class="card-title">Individual Tables</div>
<div class="meaning-individual-grid">
<button class="roll-btn" id="actionRollBtn">Roll Action</button>
<button class="roll-btn" id="descriptorRollBtn">Roll Descriptor</button>
</div>
</div>
</div>
<div class="view" id="view-une">
<div class="card">
<div class="card-title">NPC Generator — UNE</div>
<p class="card-note">Generate an NPC's core traits. Drop the results into your NPC note.</p>
<button class="roll-btn" id="uneRollBtn">Generate NPC</button>
<div class="une-result" id="uneResult" style="display:none;">
<div class="une-row">
<span class="une-key">Motivation</span>
<span class="une-val" id="uneMotivation"></span>
</div>
<div class="une-row">
<span class="une-key">Demeanor</span>
<span class="une-val" id="uneDemeanor"></span>
</div>
<div class="une-row">
<span class="une-key">Character</span>
<span class="une-val" id="uneCharacter"></span>
</div>
</div>
</div>
<div class="card">
<div class="card-title">NPC Relationship</div>
<p class="card-note">How does this NPC feel about the PC?</p>
<button class="roll-btn" id="relationshipRollBtn">Roll Relationship</button>
<div class="event-result" id="relationshipResult">
<span class="placeholder">Roll to find out.</span>
</div>
</div>
</div>
<div class="view" id="view-dice">
<div class="card">
<div class="card-title">Dice Pool Builder</div>
<div class="dice-grid" id="diceGrid">
<button class="die-btn" data-sides="4">d4</button>
<button class="die-btn" data-sides="6">d6</button>
<button class="die-btn" data-sides="8">d8</button>
<button class="die-btn" data-sides="10">d10</button>
<button class="die-btn" data-sides="12">d12</button>
<button class="die-btn" data-sides="20">d20</button>
<button class="die-btn" data-sides="2">d2</button>
</div>
<div class="pool-display" id="poolDisplay">
<span class="placeholder">No dice in pool — click above to add.</span>
</div>
<div class="pool-cap-msg" id="poolCapMsg" style="display:none;">Pool is full — 25 dice maximum.</div>
<div class="dice-actions-row">
<button class="roll-btn" id="poolRollBtn">Roll Pool</button>
<button class="clear-btn" id="poolClearBtn">Clear</button>
</div>
<div class="dice-result-box" style="margin-top:1rem;" id="poolResult">
<span class="placeholder">Build a pool and roll.</span>
</div>
</div>
<div class="card">
<div class="card-title">Custom Roll</div>
<div class="custom-roll-row">
<input type="number" id="customQty" class="custom-roll-input" placeholder="Qty" min="1" step="1">
<div class="custom-die-input">
<span class="custom-die-prefix">d</span>
<input type="number" id="customSides" class="custom-roll-input" placeholder="sides" min="1" step="1">
</div>
</div>
<div class="dice-actions-row">
<button class="roll-btn" id="customRollBtn" disabled>Roll</button>
<button class="clear-btn" id="customClearBtn">Clear</button>
</div>
<div class="dice-result-box" style="margin-top:1rem;" id="customResult">
<span class="placeholder">Enter a quantity and die size.</span>
</div>
</div>
<div class="card">
<div class="card-title">Percentile</div>
<div class="dice-actions-row">
<button class="roll-btn" id="percentileTensBtn">Tens</button>
<button class="roll-btn" id="percentileOnesBtn">Ones</button>
</div>
<div class="dice-result-box" style="margin-top:1rem;" id="percentileResult">
<span class="placeholder">Roll tens or ones.</span>
</div>
</div>
<div class="card">
<div class="card-title">Ability Score</div>
<button class="roll-btn" id="ability4d6Btn">4d6 dl</button>
<button class="roll-btn" id="abilityArrayBtn">Full Array</button>
<div class="dice-result-box" style="margin-top:1rem;" id="abilityResult">
<span class="placeholder">Roll for an ability score.</span>
</div>
</div>
</div>
<div class="view" id="view-tables"></div>
<div class="view" id="view-threads"></div>
<div class="view" id="view-npcs"></div>
<div class="view" id="view-notes"></div>
<div class="view" id="view-character"></div>
<div class="view" id="view-campaign-management"></div>
</main>
</div>
</body>
<script src="js/app.js" type="module"></script>
<script src="js/campaigns.js" type="module"></script>
<script src="js/oracle.js" type="module"></script>
<script src="js/meaning.js" type="module"></script>
<script src="js/une.js" type="module"></script>
<script src="js/dice.js" type="module"></script>
</html>