The challenge
A 15,000-word document dumped into a web page is unreadable. Long-form content — technical manuals, policy documents, game rulebooks — needs structure a reader can move through quickly, and reference information placed where it is actually needed.
Our approach
We give the document a clear heading hierarchy and an anchored table of contents with scroll-spy, so the reader always knows where they are and can jump anywhere in one click. Reference material — stat blocks, tables, callouts — is placed immediately next to the text that uses it, so the reader never has to hunt.
Layout prioritizes functional clarity: responsive tables that stay legible on a phone, distinct callout and blockquote styles, and a typographic scale tuned for sustained reading rather than decoration.
What we deliver
- A sticky, anchored table of contents with scroll-spy highlighting the current section.
- Modular, numbered sections and a reference-first layout that keeps lookups in context.
- Responsive tables and stat-block components that stay readable at every width.
- Accessibility patterns — skip-to-content, semantic headings — for long documents.
Example configuration
A semantic structure plus a small IntersectionObserver drives the scroll-spy — no framework required.
<nav class="toc" aria-label="Contents">
<a href="#act-1">1 · The Signal</a>
<a href="#act-2">2 · Boarding Action</a>
</nav>
<main>
<section id="act-1"><h2>1 · The Signal</h2> ... </section>
<section id="act-2"><h2>2 · Boarding Action</h2> ... </section>
</main>const links = document.querySelectorAll('.toc a')
const io = new IntersectionObserver((entries) => {
for (const e of entries) {
if (!e.isIntersecting) continue
links.forEach((l) => l.classList.toggle(
'active', l.getAttribute('href') === '#' + e.target.id))
}
}, { rootMargin: '-40% 0px -55% 0px' })
document.querySelectorAll('main section[id]').forEach((s) => io.observe(s))Outcome
A large document becomes something people can actually use during a long session — navigable, scannable, and legible on any device.