<product-roadmap>
Interactive themes × quarters product roadmap. Auto-discovers lane sections + initiative articles; editable mode wires drag-to-reschedule, drag-to-resize, and drop-on-lane.
Overview
The <product-roadmap> component renders a horizontal time axis (quarters or months) with one swimlane per <section data-lane>. Each <article data-start data-end> inside a lane becomes a status-coded bar spanning its date range.
Distinct from <gantt-chart>: roadmap is theme-centric (initiatives in lanes, status as enum, no dependency arrows). Gantt is task-scheduling. Use roadmap for quarterly product roadmaps; gantt for project plans.
Authoring shape
The component reads its content from authored HTML — no JSON config required. Lanes are <section data-lane>; initiatives are <article data-start data-end> inside a lane:
<product-roadmap start="2026-Q3" end="2027-Q2" today-marker> <section data-lane="Platform"> <article data-start="2026-Q3" data-end="2026-Q4" data-status="in-progress"> <h3>Multi-tenant database</h3> </article> <article data-start="2027-Q1" data-end="2027-Q2" data-status="planned"> <h3>Edge cache layer</h3> </article> </section> <section data-lane="Growth"> <article data-start="2026-Q4" data-end="2027-Q1" data-status="planned"> <h3>Onboarding rewrite</h3> </article> </section></product-roadmap>
Dates accept ISO 8601 (2026-07-01) or quarter shorthand (2026-Q3). For data-end, quarter shorthand resolves to the last day of the quarter.
Attributes
| Attribute | Values | Default | Description |
|---|---|---|---|
start | string | — | First date in the range (ISO 8601 or "YYYY-Qn"; required) |
end | string | — | Last date in the range (ISO 8601 or "YYYY-Qn"; required, inclusive) |
view | "quarter", "month" | — | Time-axis granularity (default: quarter) |
editable | boolean | — | Wire drag-to-reschedule, drag-to-resize, and lane drop |
today-marker | boolean | — | Render a vertical line at today's date if it falls within the range |
Child attributes
| Attribute | On | Values | Description |
|---|---|---|---|
data-lane | section | string | Lane name (used as the row label) |
data-start | article | string | Initiative start date (ISO 8601 or YYYY-Qn) |
data-end | article | string | Initiative end date (ISO 8601 or YYYY-Qn) |
data-status | article | "planned", "in-progress", "at-risk", "shipped", "blocked" | Status enum; drives bar color |
Status colors
Set data-status on each initiative to drive the bar color. Recognized values:
planned— info bluein-progress— accentat-risk— warning ambershipped— success greenblocked— danger red
Custom statuses fall back to the default accent. Override --color-accent or per-status tokens to retheme.
Editable mode
Add the editable attribute to enable interactive editing:
- Drag bar body → snaps to the nearest quarter (or month, if
view="month"); firesproduct-roadmap:reschedule; updatesdata-start/data-endon both the rendered bar AND the source<article>. - Drag right edge → resizes the end date; fires
product-roadmap:resize. - Drag onto another lane → moves the source
<article>; firesproduct-roadmap:move. - Click bar → fires
product-roadmap:selectwith full detail.
Today marker
Add today-marker to render a vertical line at the current date if it falls within the visible range. Useful for "where are we now in the year" context.
Progressive Enhancement
- HTML. Without JS, the component CSS hides source lanes (otherwise
<article>headings would flash before upgrade). Authors who need a visible no-JS fallback should render a sibling table or list. - CSS. The
:not(:defined)selector keeps the host visible pre-upgrade. - JS. Auto-discovers lanes + initiatives, builds the time-axis header, positions bars by date fraction, optionally wires drag-to-reschedule and lane drops.
Known limitations (v1)
- Overlapping initiatives in the same lane render stacked (later DOM order on top). Sequence non-overlapping work in a single lane, or split overlapping work into multiple lanes.
- Initiatives whose dates fall entirely outside the visible range are skipped. Initiatives crossing the boundary are clipped.
- No keyboard shortcuts for drag-to-reschedule yet (use the explicit
data-start/data-endattributes for screen-reader-driven editing).
Related
<gantt-chart>— Task-level scheduling with dependencies.<burndown-chart>— Sprint progress at the day-level.<iron-triangle>— Sprint capacity / scope / time visualization.