The lanes, in the order the chart draws them, each holding the intervals of one lane.
Nested rather than flat so a lane with no intervals still exists: an empty
row is a real statement about a schedule -- nothing is booked -- and a
flat list grouped by x cannot say it.
OptionallanesWhat each lane is called, in the order GanttData.points holds them.
A populated lane names itself: every interval carries its lane in x. An
empty lane holds no interval and so has nowhere to carry one, which
makes it the only row a reader can navigate onto and be told nothing
about -- and an empty lane is exactly the row this shape is nested to be
able to express. This is where its name goes.
Optional, and optional per entry: a chart with no empty lanes need not supply it, and the trace prefers a lane's own intervals over this when both are present, so a producer cannot make the two disagree about a populated lane.
OptionalunitWhat a unit of the axis is called: "days", "hours", "weeks".
The length of an interval is the fact a gantt exists to carry, and a bare number does not carry it. Omitted, the trace announces the length without a unit rather than guessing one.
A gantt chart: its lanes, and how its axis reads.
An object rather than a bare array, for the reason DumbbellData is one: a unit belongs to the chart and not to any row, and repeating it per point would let a producer emit rows that disagree about what their numbers measure.