- Use getBoundingClientRect() in the scroll listener so the active-page
threshold is measured relative to the content container rather than
the document body, fixing off-by-one page detection.
- Replace history.replaceState with pushState for user-initiated
navigation (sidebar, prev/next, keyboard) and add a popstate listener
so the browser back/forward buttons work correctly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the iframe-based viewer with a self-contained file where each
page is a <section id="page-N">. Navigation (sidebar, prev/next, arrow
keys, URL hash) scrolls to sections instead of loading separate files.
Added build.py to regenerate index.html from the individual page files.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>