FreeGantt

Generic demo

A four-level fixture tree with grid columns, and one row that draws several bars — entry-16 draws its three children as segments (ADR 0026: a bar is a child Entry). The strip on the chart is the surface a consumer ships; everything under the torn rule drives the demo. Drag a bar up or down, or drag a row in the grid, to move it to another place. Lock tree turns both off. Lock a row (right-click → Lock): its bar and its grid row do not drag, and nothing drops into it.

No selection Not activated

Harness bench

Demo-only controls. None of this is library UI.

Rows and columns

Row source, filtering and column visibility. entry-16 (“Auth”) draws three bars on one row — its three child Entries, drawn as segments by childrenAsSegments.

Mutation

Every write goes through one transaction and one changeset. Double-click Name, Start or Budget in the grid to edit in place.

Activation (#434)

Click a bar or a grid row, or press Enter on one, to fire entryActivate. The readout above names the entry and the cause. Press Enter on a non-editable grid cell (Duration) to activate from there too — an editable cell opens its editor instead.

Convenience chords (#262)

Mod+Z/Mod+Shift+Z undo/redo are convenience chords: the toolbar's Undo/Redo buttons run the same command another way, so an app is free to turn the chord off and keep the keystroke for itself.

Vetoes and capabilities

The Mobilization date line reads "can't move before this". It marks a hard boundary — beforeEntryMove refuses a drop before it. Hold drop proves the async veto path.

Plugins and renderers

Each control is a plugin over the public contract alone. Mod+K clears the selection through a plugin-registered command.

Document

Round-trips the dataset through the public toJSON/fromJSON pair.

Event log