static assets for the read-only web view
=========================================

Everything here is committed as-is and served from this package; the page
never requests an external host, a web font or a third-party script. There is
no build step. The server sends Content-Security-Policy: default-src 'self',
so full inline scripts and inline styles are impossible by design.

- app.css    one stylesheet: design tokens (light and dark), components,
             responsive layout and the reduced-motion policy.
- theme.js   synchronous bootstrap in <head>: reads the stored theme, sets
             data-theme on <html> before first paint, and owns the
             auto -> light -> dark cycle. localStorage access is wrapped.
- board.js   polls /api/board on an interval, honours ETag/304, and diffs the
             board in place (keyed cards, FLIP movement, change highlight,
             pause/resume, last-updated stamp, polite live region).
- graph.js   the dependency graph renderer and the server-rendered fallback's
             client-side counterpart. Pointer Events pan/zoom (zoom at the
             cursor, 4 px click/drag threshold, soft pan limits), click to
             select with transitive path highlighting, double-click to centre,
             a hover tooltip, and a collapsible minimap. The camera lives in
             module state and is written to the viewport transform at most once
             per animation frame; level of detail follows the zoom scale. The
             indented outline under the canvas stays readable with JavaScript
             disabled.
- markdown.js the in-house task-text renderer: builds DOM nodes with
             createElement and textContent, supports a small Markdown subset
             (paragraphs, headings, lists, fenced/inline code, bold, italic and
             http(s)-only links), and replaces the server-rendered
             <pre class="description"> fallback only after a successful build.

Status is encoded in shape, glyph and text as well as colour: backlog is a
dashed rounded rectangle, ready a circle, in progress a diamond, review a
hexagon, done a square, cancelled a dotted square. A theme change only swaps
CSS custom properties, so the graph's pan and zoom are untouched.
