Flab UIv0.0.2
MobileA2UI

Gantt

A period-based schedule drawn as plain CSS, not a chart engine. Each row is one piece of work laid on a shared column grid as a bar that starts at a period and spans a number of them; a progress fill lets plan and actual read in one mark. Like the meter family it is a handful of divs, so it stays crisp at any zoom, needs no canvas and renders on the server. Every bar takes a textual label, so colour is never the only signal. The live version is on the Project chains showcase.

Q1
Q2
Q3
Q4
Discovery
FCE-01
40 / 40 md
Ingestion pipeline
FCE-12
68 / 64 md
Forecast model
FCE-33
48 / 72 md
Planning UI
FCE-38
12 / 88 md
Rollout
FCE-60
0 / 40 md
const periods = ['Q1', 'Q2', 'Q3', 'Q4'];
const rows = [  { id: 'discovery', label: 'Discovery', secondary: 'FCE-01', start: 0, span: 1, progress: 100, tone: 'success', value: '40 / 40 md' },  { id: 'model', label: 'Forecast model', secondary: 'FCE-33', start: 2, span: 1, progress: 70, tone: 'info', value: '48 / 72 md' },  { id: 'rollout', label: 'Rollout', secondary: 'FCE-60', start: 3, span: 2, progress: 0, tone: 'neutral', value: '0 / 40 md' },];
<Gantt periods={periods} rows={rows} labelWidth="12rem" valueWidth="6rem" />

Props

PropTypeDefaultNotes
periodsstring[]—Column headers, one per period.
rowsGanttRow[]—One bar per row.
labelWidthstring'12rem'Width of the left label gutter.
valueWidthstring'6rem'Trailing value column width; shown when any row has a value.
minWidthstring'32rem'Minimum inner width before the chart scrolls horizontally.

GanttRow

PropTypeDefaultNotes
idstring—Stable row id.
labelReactNode—Row label in the left gutter.
secondaryReactNode—Quieter sub-label beneath the label.
startnumber—Zero-based index into periods where the bar starts.
spannumber—Number of periods the bar spans (minimum 1).
progressnumber—0–100 progress fill; defaults to a full bar.
toneBadgeTone'info'Bar fill colour.
valueReactNode—Trailing figure, e.g. “12 / 88 md”.
titlestring—Accessible name and hover title for the bar.