A public handle a host constructs and hands to a Planner to drive and
observe its zoom from outside the widget (#76) — for example a custom zoom
toolbar that lives in the host's own chrome rather than the planner's
on-canvas buttons.
A single event drawn on the planner: its id, its time (day column /
start / duration), display title/content, fill color and text styles,
plus an optional typed data payload (#77) for carrying app domain metadata.
The on-screen layout facts handed to a PlannerEntryBuilder for one event
(#78). Everything here is derived from the package's geometry for the current
frame, so the builder can lay out responsively without recomputing it.
The position of an event on the planner grid: a day column index (into
PlannerConfig.labels — there are no calendar dates here), a start hour
and minutes, and a duration in minutes.
What a single in-progress events-canvas drag/resize is doing. A press within
8px of an event's top edge resizes from the top (topHandle), within 8px of
the bottom resizes from the bottom (bottomHandle), anywhere else moves the
whole event (body); none is the idle state (no drag in progress).
How a column-spanning event (one whose PlannerTime.endDay covers several
columns, #47) coexists with the per-column overlap layout that splits
concurrent single-column events into side-by-side sub-columns (#20 / D11).
Builds a fully custom widget for a single day/column header (#79). Supplied
to the Planner as dayHeaderBuilder; when non-null the planner replaces
the painted DateRow text with a row of host-built header widgets — one per
column label — each sized to the column's blockWidth and the date row's
height, and offset by the live horizontal scroll so the headers stay aligned
with the day-columns below as the user pans (it rebuilds on the same
triggerUpdate the row repaints on).
Builds a fully custom widget for a single timed event (#78) — and, reused as
allDayEntryBuilder, for a single all-day chip (#80). Supplied to the
Planner as entryBuilder; when non-null the planner layers a widget
overlay over the canvas and calls this for every (on-screen) event, sizing
and positioning the returned widget at the event's current on-screen rect so
it tracks scroll, zoom and drag in lockstep with the grid.