The entry the entry-menu (edit/delete) acts on. A PlannerEntry rather
than an Event so the same menu serves both timed events and all-day chips
(#72) — both carry a PlannerEntry, which is all edit/delete need.
The menu's top-left position in planner-local coordinates (the whole
widget's box), so the single overlay can sit over either the time grid or
the all-day band (#72). The widget layer converts each surface's local hit
position into this space before calling showEventMenu/showPlannerMenu.
Scrolls the day-axis by one wheel notch — the Shift+wheel horizontal scroll
(#65). forward (a wheel-down notch) reveals later columns by decreasing
x; the reverse reveals earlier ones. The step is the flat
PlannerConfig.scrollStep: unlike the time axis, columns are a fixed
PlannerConfig.blockWidth wide and don't scale with zoom, so a notch always
moves the same distance. Clamped to the same [_maxXOffset, _minXOffset]
bounds as a horizontal drag, so it can't reveal past the grid edges.
Records the height of the chrome reserved above the time grid besides the
date row — the all-day band (#48). Recomputes the scroll clamp so the grid
viewport excludes the band. A no-op when the height is unchanged.
Opens the entry menu (edit/delete) for entry at planner-local pos. The
caller (timed grid or all-day band) passes the chip's/event's
PlannerEntry, so the same menu serves both surfaces (#72).
Adopts a new config (e.g. when the host Planner is rebuilt with
different settings) and recomputes the scroll bounds, while leaving the
current scroll/zoom position untouched.