Storyline: chapter structure + formatted Campaign Overview

The Storyline section is now a set of hand-written chapters. /storyline
lists them; /storyline/{slug} renders one inside a shell with a sticky
chapter nav and prev/next pager. Chapters are declared in
StorylineController::CHAPTERS, each pointing at a Twig partial under
templates/storyline/chapters/.

First chapter is the Brackenford Campaign Overview: the campaign-bible
text laid out as a long-form reading page -- numbered section headers,
a "by the numbers" / "the cast" quick-reference strip, pull-quotes for
in-world lines, GM callouts for the ticking clocks and the red herring,
and the escalation ladder. Storyline styles added to app.css.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Frank
2026-09-08 17:28:21 +02:00
co-authored by Claude Sonnet 5
parent 373fa6f78b
commit 7fbf6f1569
5 changed files with 579 additions and 7 deletions
+25 -5
View File
@@ -3,9 +3,29 @@
{% block title %}Storyline · dmtools{% endblock %}
{% block body %}
{{ include('_partials/page_placeholder.html.twig', {
title: 'Storyline',
icon: '📜',
blurb: 'The campaign storyline will live here. Shape still to be decided — session log, plot threads, or a wiki-style document.',
}) }}
<div class="storyline-index">
<header class="mb-4">
<div class="text-uppercase small text-body-secondary fw-semibold" style="letter-spacing:.08em">Storyline</div>
<h1 class="display-6 mb-2">Brackenford</h1>
<p class="text-body-secondary mb-0" style="max-width:60ch">
The campaign bible, split into chapters. Start with the overview for the whole
arc; later chapters will cover sessions, locations and the people of the village.
</p>
</header>
<ol class="storyline-chapter-list list-unstyled">
{% for slug, chapter in chapters %}
<li>
<a href="{{ path('app_storyline_chapter', {slug: slug}) }}" class="storyline-chapter-card">
<span class="storyline-chapter-num">{{ loop.index }}</span>
<span class="storyline-chapter-body">
<span class="storyline-chapter-title">{{ chapter.title }}</span>
<span class="storyline-chapter-summary">{{ chapter.summary }}</span>
</span>
<span class="storyline-chapter-go" aria-hidden="true">&rarr;</span>
</a>
</li>
{% endfor %}
</ol>
</div>
{% endblock %}