Display name of the session's agent ("Sage") — chips, highlight tags, presence label.
Agent presence cursor (pulsing ring + "… is drawing" label), driven by the host.
AFTER event: an editor commit applied to the state engine.
Cancelable BEFORE event: an in-board editor commit (inline sticky/text/shape edit or
the markdown/HTML rich editor's Apply/Done) is about to write to the state engine.
Set Cancel = true synchronously to discard the commit; handlers may also rewrite
the args' Content / Title.
The open right-click context menu (canvas-relative position + model), or null.
Target item, or null for the empty-canvas / page-chip menus.
Target page (a right-clicked page chip), or null for item/canvas menus.
Board-coordinate click point — "add … here" placement target.
ReadonlyHandlesSelected pen ink color.
Selected pen stroke width.
Agent items that just popped in (drive the .pop-in violet flash).
Read-only mode (artifact viewer / session review): all mutating pointer interactions, paste, and inline editing are disabled; pan + zoom remain available for navigation.
The rich-content editor panel state (markdown / html items), or null when closed.
Selected shape kind for drag-create.
Shared board state engine (owned by the integration layer, passed via the host).
Selected text bold state for click-placed text (labels render bold by default).
Selected text color for click-placed text (null = theme default).
Selected text font family for click-placed text.
Selected text font size for click-placed text (curated steps; 12 = CSS default).
Requests a tool switch decided by a board gesture (e.g. Esc → select).
AMBIENT widget telemetry: the injected recorder observed passive form activity
(clicks / changes / typing / focus) inside a sandboxed HTML widget — no widget-authored
script involved. The batch was validated (marker + tracked source + size cap + shape)
and pre-summarized into one compact human line. Integration layers forward it to their
agent runtime as low-priority background context (MJ's channel plugin throttles per
widget and frames it as a do-not-respond [whiteboard] note).
AFTER event: a validated widget submission was accepted (not canceled). Integration
layers forward this to their agent/automation runtime — e.g. MJ's realtime channel
plugin surfaces it to the live agent as a [whiteboard] context note.
Cancelable BEFORE event: a sandboxed HTML widget called MJWhiteboard.submit(data)
and the payload passed validation (marker + tracked source window + size cap).
Handlers run synchronously — set Cancel = true on the args to drop the submission
(WidgetSubmitted then never fires).
The drag ghost rectangle ("from here") at the moved item's original bounds.
Live marquee (rubber-band) selection rectangle, or null when none is in flight.
Live shape-create preview rectangle.
Active tool (owned by the host; toolbar + keyboard drive it).
Apply a toolbar style pick to the selected text/sticky item (the "restyle existing"
path — the toolbar emits StyleSelection, the host routes it here). No-op when
nothing applicable is selected; color only applies to user text labels.
Open the rich editor for a markdown panel / HTML widget (dblclick or header edit).
Cancel any in-flight transient gesture (tool switch, Esc) — incl. the rich editor + context menu.
Click-away closes the menu (the menu root stops pointerdown propagation for itself).
Commit the inline editor's value to the edited sticky / text / shape item. Routes through the ContentApplying (cancelable) / ContentApplied event pair; an empty commit on a JUST-PLACED sticky/text abandons the placement instead (the item is removed — that path raises the engine's remove events, not the content pair).
Two short arrowhead strokes at the connector's target end.
Curved connector path between resolved (edge-clipped) endpoints.
Fit all content into the viewport (25%–200%, 60px padding).
Smoothed freehand path (quadratic curves through segment midpoints).
Dragging visuals: the grabbed item, plus every other member during a GROUP drag.
Cheap "on-screen-ish" check that gates iframe instantiation for HTML widgets: only widgets within (or near) the current viewport get a live sandboxed frame; the rest render a static placeholder until panned/zoomed into view. Re-entering view re-creates the frame (any internal widget state resets — acceptable for board decorations).
Whether the item is part of the current (single OR multi) selection.
Inline font-family stack for a styled text/sticky item (null = inherit).
Inline font-size for a styled text/sticky item (null = the kind's CSS default).
Inline font-weight for a styled text/sticky item (null = the kind's CSS default).
Inline color for a USER text label. Agent labels keep their violet authorship
treatment from CSS — Color never overrides it.
Left position of an item, honoring an in-flight move/resize transient.
A markdown panel's optional max height (its rendered height stays content-driven).
A callback method that is invoked immediately after the default change detector has completed one change-check cycle for a component's view.
A callback method that performs custom clean-up, invoked immediately before a directive, pipe, or service instance is destroyed.
A callback method that is invoked immediately after the default change detector has checked the directive's data-bound properties for the first time, and before any of the view or content children have been checked. It is invoked only once when the directive is instantiated.
Right-click on empty canvas → the "add … here" menu (suppresses the native menu).
Dispatch one picked context-menu action, then close the menu.
Click on a highlight region dismisses it (mockup: "click dismisses").
Right-click on a board item → the item action menu (selects the item first).
Right-click on a PAGE CHIP in the page strip (forwarded by the strip's
ChipContextMenu output) → the page action menu: Rename (routes back into the
strip's inline-rename editor) and Delete (offered only when more than one page
exists — the engine's last-page guard). Never opens in ReadOnly.
Paste an image from the clipboard onto the board (mockup: pasted-image card).
Esc inside the editor panel closes it; keys must not leak to the board shortcuts.
Delete affordance on the HTML widget header (the user removing their own widget).
Commit the draft to the item (ONE update = one undo step) and keep the panel open. Routes through the ContentApplying (cancelable) / ContentApplied pair.
Close the editor, discarding any uncommitted draft changes.
Commit the draft and close the editor panel.
Markdown editor: flip between the source editor and the rendered preview.
8 handles render on the selected, resizable item (gate: IsResizableKind) — but only for a SINGLE selection; a multi-selection shows the outline treatment only.
Explicit wrap width for a text label (resize / tool w) — null lets the CSS max-width wrap. Honors an in-flight RESIZE transient so the live preview tracks the handle drag (a move transient is deliberately ignored: its W is the rough bounds ESTIMATE, and stamping it inline would re-wrap an unsized label mid-drag).
Continuous zoom by a multiplicative factor at the viewport center — the hold-to-zoom tick path (the zoom cluster emits ~3.5% factors every 50 ms while a +/− button is held). Clamped to the same 25%–200% limits as the stepped zoom.
The LIVE WHITEBOARD canvas surface (
mj-realtime-whiteboard): dotted-grid board with pan/zoom, per-tool pointer interactions (select/move with ghost + handles, pan, smoothed freehand pen, drag-create shapes, click-place stickies/text with inline edit, image paste, item→item connectors with floating-point fallback, eraser, dismissible highlights), ownership chips, agent pop-in flash and the input-driven agent presence cursor.All mutations go through the shared WhiteboardState engine — the same API the agent's channel tools use — so undo/redo and the perception feed see one history.