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.
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).
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.