fix(roadmap): restore original top header + add centred route-intro below banner

The previous pass replaced the top page header with a single centred
'Roadmap' block — that was wrong. The intent was: keep the original
left-aligned editorial lead at the very top of the page, and insert a
new smaller centred section between the dispatch banner and the route
that carries the interaction hints.

Top of page (restored):
  Roadmap            ← 11px tracked eyebrow
  What we are building.   ← 48px serif h1, left-aligned, max-width 540
  A live picture of the work…   ← 14px subtitle, no hover-hint copy

Between LatestDispatchBanner and RoadmapRoute (new):
  Roadmap            ← 22px serif title, centred
  Tap or hover any milestone for the full story. Drag or scroll to move.
                     ← 12px tracked muted hint, centred

The hover/tap hint moves out of the top subtitle and into the route-
intro block, where the drag/scroll hint joins it. Both interaction
modalities sit together right above the surface they describe — closer
to where the reader needs them.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Jonathan Hvid 2026-05-12 15:23:48 +02:00
parent f90480bc8b
commit b2e0e8f518

View file

@ -12,22 +12,31 @@ const items = getAllRoadmapItems()
<AppLayout title="Roadmap" user={user}> <AppLayout title="Roadmap" user={user}>
<article class="roadmap-page"> <article class="roadmap-page">
<header class="roadmap-header"> <!-- Page-level header — left-aligned, the page's editorial lead. -->
<p class="roadmap-eyebrow">Roadmap</p> <header class="page-header">
<h1 class="roadmap-title">Roadmap</h1> <p class="page-eyebrow">Roadmap</p>
<p class="roadmap-subtitle"> <h1 class="page-title">What we are building.</h1>
<p class="page-sub">
A live picture of the work. What's in motion, what's queued, A live picture of the work. What's in motion, what's queued,
what we're still thinking about. Tap or hover any milestone what we're still thinking about.
for the full story.
</p> </p>
</header> </header>
<LatestDispatchBanner /> <LatestDispatchBanner />
<!-- Centred section intro for the route specifically. Sits between
the dispatch banner and the full-bleed route; carries the two
interaction hints (hover/tap + drag/scroll). -->
<section class="route-intro">
<h2 class="route-intro-title">Roadmap</h2>
<p class="route-intro-hint">
Tap or hover any milestone for the full story. Drag or scroll to move.
</p>
</section>
<RoadmapRoute items={items} /> <RoadmapRoute items={items} />
<!-- Legend lives outside the route component so it can return to <!-- Legend — final row, centred in content column. -->
centred content-column width while the route goes full-bleed. -->
<div class="roadmap-legend" aria-label="Status legend"> <div class="roadmap-legend" aria-label="Status legend">
<span><i style="background:#6d8c7c"></i>Shipping</span> <span><i style="background:#6d8c7c"></i>Shipping</span>
<span><i style="background:#b96b58"></i>In beta</span> <span><i style="background:#b96b58"></i>In beta</span>
@ -45,14 +54,13 @@ const items = getAllRoadmapItems()
margin: 0 auto; margin: 0 auto;
} }
/* ── Centred page header ──────────────────────────────────────── */ /* ── Page header (left-aligned editorial lead) ────────────────── */
.roadmap-header { .page-header {
text-align: center; max-width: 540px;
max-width: 640px; margin-bottom: 36px;
margin: 0 auto 48px;
padding-top: 32px; padding-top: 32px;
} }
.roadmap-eyebrow { .page-eyebrow {
font-family: var(--font-sans); font-family: var(--font-sans);
font-size: 11px; font-size: 11px;
letter-spacing: 1.4px; letter-spacing: 1.4px;
@ -60,7 +68,7 @@ const items = getAllRoadmapItems()
color: var(--on-surface-variant); color: var(--on-surface-variant);
margin: 0 0 12px; margin: 0 0 12px;
} }
.roadmap-title { .page-title {
font-family: var(--font-serif); font-family: var(--font-serif);
font-weight: 400; font-weight: 400;
font-size: 48px; font-size: 48px;
@ -69,17 +77,40 @@ const items = getAllRoadmapItems()
color: var(--on-surface); color: var(--on-surface);
margin: 0 0 14px; margin: 0 0 14px;
} }
.roadmap-subtitle { .page-sub {
font-size: 14px; font-size: 14px;
line-height: 1.65; line-height: 1.65;
color: var(--on-surface-variant); color: var(--on-surface-variant);
margin: 0 auto; margin: 0;
max-width: 480px; max-width: 480px;
} }
.roadmap-page :global(.banner), .roadmap-page :global(.banner),
.roadmap-page :global(.rr-dispatch) { margin-bottom: 56px; } .roadmap-page :global(.rr-dispatch) { margin-bottom: 56px; }
/* ── Centred route intro ──────────────────────────────────────── */
.route-intro {
text-align: center;
max-width: 560px;
margin: 0 auto 28px;
}
.route-intro-title {
font-family: var(--font-serif);
font-weight: 400;
font-size: 22px;
line-height: 1.2;
color: var(--on-surface);
margin: 0 0 10px;
}
.route-intro-hint {
font-family: var(--font-sans);
font-size: 12px;
letter-spacing: var(--tracking-wide);
color: var(--on-surface-variant);
margin: 0;
line-height: 1.5;
}
/* ── Legend ───────────────────────────────────────────────────── */ /* ── Legend ───────────────────────────────────────────────────── */
.roadmap-legend { .roadmap-legend {
display: flex; display: flex;
@ -107,9 +138,11 @@ const items = getAllRoadmapItems()
@media (max-width: 767px) { @media (max-width: 767px) {
.roadmap-page { padding: 0 24px 64px; } .roadmap-page { padding: 0 24px 64px; }
.roadmap-header { padding-top: 24px; margin-bottom: 32px; } .page-header { padding-top: 24px; margin-bottom: 28px; }
.roadmap-title { font-size: 36px; } .page-title { font-size: 36px; }
.roadmap-page :global(.banner), .roadmap-page :global(.banner),
.roadmap-page :global(.rr-dispatch) { margin-bottom: 40px; } .roadmap-page :global(.rr-dispatch) { margin-bottom: 40px; }
.route-intro { margin-bottom: 22px; }
.route-intro-title { font-size: 19px; }
} }
</style> </style>