Canonical, framework-agnostic gantt controller (createGanttController) on @bimetal/headless-core. Owns all timeline-interaction semantics — bar move/resize, task dialog, dependency linking (the family's first cross-entity relationship), FS-block-as-state,
The canonical, framework-agnostic gantt controller — instance #4 of the
BIMETAL component family. Built on @bimetal/headless-core, so it shares the
identity-stable getSnapshot/subscribe contract and the errors-as-state
surface; the framework packages are pure bindings.
createGanttController({ store, chartId, config }) owns every timeline
decision:
Bars — move, resize and progress via a pointerId-bound drag gesture, in
TIME UNITS rather than pixels, so all five ports draw identically.
Dependencies — two-click linking, lead/lag, and correcting a drawn edge
(updateDependency) without losing its identity.
Constraint-as-state — a move that violates FS/SS/FF/SF surfaces as
snapshot.lastAction, never as a throw into the binding.
Hierarchy, zoom, virtualization, undo — including the controller-owned
tick model, so no renderer re-derives the scale.
The cut line is the family's: DOM measurement and listener registration belong
to the framework; every if belongs here.
Canonical, framework-agnostic gantt controller (createGanttController) on @bimetal/headless-core. Owns all timeline-interaction semantics — bar move/resize, task dialog, dependency linking (the family's first cross-entity relationship), FS-block-as-state,