/** * The roadmap page as one HTML string (html-roadmap-view). * * Pure: a `RoadmapView` in, bytes out. The only time-dependent text is the generated-at * line, so two pages built from the same items differ in that line alone (AC-10) — ages * are left to the page script for exactly that reason. * * Every item-derived string goes through `escapeHtml`, in text and in double-quoted * attributes alike (AC-12); there is no second escaping scheme anywhere on the page. * That is why DOM ids are positions (`card-i3`) rather than item ids, and why each side * panel is a `