@memberjunction/ng-whiteboard 6.2.0-edge.0 → 6.2.0-edge.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/whiteboard-board.component.d.ts +1 -1
- package/dist/lib/whiteboard-board.component.js +2 -2
- package/dist/lib/whiteboard-board.component.js.map +1 -1
- package/dist/lib/whiteboard-host.component.d.ts +12 -2
- package/dist/lib/whiteboard-host.component.d.ts.map +1 -1
- package/dist/lib/whiteboard-host.component.js +17 -7
- package/dist/lib/whiteboard-host.component.js.map +1 -1
- package/dist/lib/whiteboard-state.d.ts +2 -2
- package/dist/lib/whiteboard-state.js +5 -5
- package/dist/lib/whiteboard-state.js.map +1 -1
- package/dist/lib/whiteboard-zoom.component.d.ts +3 -3
- package/dist/lib/whiteboard-zoom.component.js +7 -7
- package/dist/lib/whiteboard-zoom.component.js.map +1 -1
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whiteboard-board.component.js","sourceRoot":"","sources":["../../src/lib/whiteboard-board.component.ts","../../src/lib/whiteboard-board.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n AfterViewChecked, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener,\n Input, OnDestroy, OnInit, Output, ViewChild, inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { Subscription } from 'rxjs';\nimport { MarkdownModule } from '@memberjunction/ng-markdown';\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\nimport {\n BuildResizeCommitPatch, IsResizableKind,\n WHITEBOARD_DEFAULTS, WhiteboardBounds, WhiteboardConnectorItem, WhiteboardFontFamily,\n WhiteboardHighlightItem, WhiteboardHtmlItem, WhiteboardImageItem, WhiteboardInkItem,\n WhiteboardItem, WhiteboardItemPatch, WhiteboardMarkdownItem, WhiteboardPageInfo,\n WhiteboardPoint, WhiteboardShapeItem, WhiteboardState, WhiteboardStickyItem, WhiteboardTextItem\n} from './whiteboard-state';\nimport { WhiteboardTextStyleEvent, WHITEBOARD_PEN_COLORS } from './whiteboard-toolbar.component';\nimport {\n EvaluateWidgetInteractionMessage, EvaluateWidgetSubmitMessage,\n WHITEBOARD_WIDGET_INTERACTION_MAX_CHARS, WHITEBOARD_WIDGET_SUBMIT_MAX_CHARS,\n WhiteboardWidgetInteractionEvent, WhiteboardWidgetSubmitEvent, WhiteboardWidgetSubmittingEventArgs\n} from './whiteboard-widget-bridge';\nimport { WhiteboardWidgetSrcdocPipe } from './whiteboard-srcdoc.pipe';\nimport {\n BuildWhiteboardContextMenu, BuildWhiteboardPageContextMenu,\n WhiteboardContextMenuAction, WhiteboardContextMenuActionID\n} from './whiteboard-context-menu';\nimport { WhiteboardTool, WhiteboardToolRoster } from './whiteboard-tool-roster';\nimport { RealtimeWhiteboardPagesComponent, WhiteboardPageChipContextMenuEvent } from './whiteboard-pages.component';\n\n/** The agent presence cursor state (input-driven; the host animates it to mutation points). */\nexport interface WhiteboardAgentPresence {\n Active: boolean;\n X: number;\n Y: number;\n Label: string;\n}\n\n/** Item kinds whose content can be committed through an in-board editor. */\nexport type WhiteboardEditableContentKind = 'sticky' | 'text' | 'shape' | 'markdown' | 'html';\n\n/**\n * BEFORE-event args for the board/host `ContentApplying` output — raised when an\n * in-board editor commit (inline sticky/text/shape edit, or the markdown/HTML rich\n * editor's Apply/Done) is about to write the draft into the state engine. Handlers run\n * synchronously; set {@link Cancel} to `true` to discard the commit (the item keeps its\n * previous content and `ContentApplied` never fires). Handlers may also rewrite\n * {@link Content} / {@link Title} — the edited values are what gets applied.\n */\nexport interface WhiteboardContentApplyingEventArgs {\n /** The target item's ID. */\n ItemID: string;\n /** The target item's kind (decides which field the content lands in). */\n Kind: WhiteboardEditableContentKind;\n /** The committed content: Text (sticky/text), Label (shape), Markdown or Html source. */\n Content: string;\n /** HTML widgets only: the committed header title ('' clears it). */\n Title?: string;\n /** Set to `true` (in a synchronous handler) to discard the commit. */\n Cancel: boolean;\n}\n\n/** AFTER-event args for the board/host `ContentApplied` output — the commit applied. */\nexport interface WhiteboardContentAppliedEventArgs {\n /** The updated item's ID. */\n ItemID: string;\n /** The updated item's kind. */\n Kind: WhiteboardEditableContentKind;\n /** The content that was applied. */\n Content: string;\n /** HTML widgets only: the applied header title. */\n Title?: string;\n}\n\ntype ResizeHandle = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n\ntype BoardInteraction =\n | { Type: 'move'; ItemID: string; StartX: number; StartY: number; OrigBounds: WhiteboardBounds; DX: number; DY: number; Moved: boolean; Group: boolean }\n | { Type: 'resize'; ItemID: string; Handle: ResizeHandle; StartX: number; StartY: number; OrigBounds: WhiteboardBounds; CurBounds: WhiteboardBounds }\n | { Type: 'pen'; Points: WhiteboardPoint[] }\n | { Type: 'shape'; StartX: number; StartY: number; CurX: number; CurY: number }\n | { Type: 'marquee'; StartX: number; StartY: number; CurX: number; CurY: number; Additive: boolean }\n | { Type: 'pan'; StartClientX: number; StartClientY: number; OrigPanX: number; OrigPanY: number };\n\ninterface PendingConnector {\n FromItemID: string | null;\n FromPoint: WhiteboardPoint | null;\n CurX: number;\n CurY: number;\n}\n\n/** Transient state of the in-board rich-content editor panel (markdown / html items). */\ninterface RichEditorState {\n ItemID: string;\n Kind: 'markdown' | 'html';\n /** The in-flight source draft (committed only on Apply / Done). */\n Draft: string;\n /** HTML widgets only: the in-flight header title draft. */\n TitleDraft: string;\n /** Markdown only: show the rendered preview instead of the source editor. */\n Preview: boolean;\n}\n\n/**\n * Starter document placed by the HTML-widget tool (user click-place) — a one-question\n * quiz that demos the `MJWhiteboard.submit` input bridge: the Submit button posts the\n * picked answer to the host, which surfaces it to the session agent as a context note.\n * (Hardcoded colors are fine here: this is an isolated sandboxed document — the app's\n * design tokens cannot reach inside the opaque-origin frame.)\n */\nexport const WHITEBOARD_WIDGET_STARTER_HTML = `<!doctype html>\n<html>\n<head>\n<style>\n body { font-family: system-ui, sans-serif; margin: 14px; color: #1f2937; }\n h3 { margin: 0 0 6px; }\n label { display: block; margin: 4px 0; }\n button { margin-top: 8px; padding: 5px 12px; border: 1px solid #cbd5e1; border-radius: 6px; background: #f1f5f9; cursor: pointer; }\n .hint { margin-top: 8px; color: #6b7280; font-size: 12px; }\n</style>\n</head>\n<body>\n<h3>Quick quiz</h3>\n<p>Which planet is closest to the sun?</p>\n<label><input type=\"radio\" name=\"q\" value=\"Mercury\"> Mercury</label>\n<label><input type=\"radio\" name=\"q\" value=\"Venus\"> Venus</label>\n<label><input type=\"radio\" name=\"q\" value=\"Mars\"> Mars</label>\n<button id=\"go\">Submit answer</button>\n<p class=\"hint\">Submitting sends your answer to the agent via MJWhiteboard.submit.</p>\n<script>\n document.getElementById('go').addEventListener('click', function () {\n var picked = document.querySelector('input[name=\"q\"]:checked');\n MJWhiteboard.submit({ question: 'closest planet to the sun', answer: picked ? picked.value : null });\n });\n</script>\n</body>\n</html>`;\n\n/** Starter markdown placed by the markdown-panel tool (user click-place). */\nconst STARTER_MARKDOWN = '## New note\\n\\n- point one';\n\n/** Zoom presets stepped by the zoom cluster (25%–200%, matching the mockup's range). */\nconst ZOOM_STEPS = [0.25, 0.5, 0.75, 0.9, 1, 1.25, 1.5, 2] as const;\nconst GRID_SIZE = 22;\n/** How long an agent-added item keeps its pop-in/flash class. */\nconst POP_IN_MS = 3200;\n\n/**\n * The LIVE WHITEBOARD canvas surface (`mj-realtime-whiteboard`): dotted-grid board with\n * pan/zoom, per-tool pointer interactions (select/move with ghost + handles, pan, smoothed\n * freehand pen, drag-create shapes, click-place stickies/text with inline edit, image paste,\n * item→item connectors with floating-point fallback, eraser, dismissible highlights),\n * ownership chips, agent pop-in flash and the input-driven agent presence cursor.\n *\n * All mutations go through the shared {@link WhiteboardState} engine — the same API the\n * agent's channel tools use — so undo/redo and the perception feed see one history.\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-whiteboard',\n imports: [CommonModule, MarkdownModule, CodeEditorModule, RealtimeWhiteboardPagesComponent, WhiteboardWidgetSrcdocPipe],\n templateUrl: './whiteboard-board.component.html',\n styleUrl: './whiteboard-board.component.css'\n})\nexport class RealtimeWhiteboardBoardComponent implements OnInit, OnDestroy, AfterViewChecked {\n /** Shared board state engine (owned by the integration layer, passed via the host). */\n @Input({ required: true }) State!: WhiteboardState;\n /** Display name of the session's agent (\"Sage\") — chips, highlight tags, presence label. */\n @Input() AgentName = 'Agent';\n /**\n * The host's tool roster, used HERE for one thing only: gating the canvas context menu's\n * \"add … here\" actions. The board does not own the active tool — the host does, and the host\n * enforces the roster on it. A standalone consumer binding this input gets the menu narrowed\n * and nothing else. `null` = all.\n */\n @Input() ToolRoster: WhiteboardToolRoster = null;\n /** Active tool (owned by the host; toolbar + keyboard drive it). */\n @Input()\n set Tool(value: WhiteboardTool) {\n if (value !== this._tool) {\n this._tool = value;\n this.CancelTransient();\n }\n }\n get Tool(): WhiteboardTool {\n return this._tool;\n }\n /** Selected pen ink color. */\n @Input() PenColor: string = WHITEBOARD_PEN_COLORS[0];\n /** Selected pen stroke width. */\n @Input() PenWidth = 4;\n /** Selected shape kind for drag-create. */\n @Input() ShapeKind: WhiteboardShapeItem['Shape'] = 'rect';\n /** Selected text font size for click-placed text (curated steps; 12 = CSS default). */\n @Input() TextSize = 12;\n /** Selected text font family for click-placed text. */\n @Input() TextFamily: WhiteboardFontFamily = 'sans';\n /** Selected text bold state for click-placed text (labels render bold by default). */\n @Input() TextBold = true;\n /** Selected text color for click-placed text (null = theme default). */\n @Input() TextColor: string | null = null;\n /** Agent presence cursor (pulsing ring + \"… is drawing\" label), driven by the host. */\n @Input() AgentPresence: WhiteboardAgentPresence | null = null;\n /**\n * Read-only mode (artifact viewer / session review): all mutating pointer interactions,\n * paste, and inline editing are disabled; pan + zoom remain available for navigation.\n */\n @Input() ReadOnly = false;\n\n /** Requests a tool switch decided by a board gesture (e.g. Esc → select). */\n @Output() ToolChangeRequest = new EventEmitter<WhiteboardTool>();\n /**\n * Cancelable BEFORE event: a sandboxed HTML widget called `MJWhiteboard.submit(data)`\n * and the payload passed validation (marker + tracked source window + size cap).\n * Handlers run synchronously — set `Cancel = true` on the args to drop the submission\n * ({@link WidgetSubmitted} then never fires).\n */\n @Output() WidgetSubmitting = new EventEmitter<WhiteboardWidgetSubmittingEventArgs>();\n /**\n * AFTER event: a validated widget submission was accepted (not canceled). Integration\n * layers forward this to their agent/automation runtime — e.g. MJ's realtime channel\n * plugin surfaces it to the live agent as a `[whiteboard]` context note.\n */\n @Output() WidgetSubmitted = new EventEmitter<WhiteboardWidgetSubmitEvent>();\n /**\n * AMBIENT widget telemetry: the injected recorder observed passive form activity\n * (clicks / changes / typing / focus) inside a sandboxed HTML widget — no widget-authored\n * script involved. The batch was validated (marker + tracked source + size cap + shape)\n * and pre-summarized into one compact human line. Integration layers forward it to their\n * agent runtime as low-priority background context (MJ's channel plugin throttles per\n * widget and frames it as a do-not-respond `[whiteboard]` note).\n */\n @Output() WidgetInteraction = new EventEmitter<WhiteboardWidgetInteractionEvent>();\n /**\n * Cancelable BEFORE event: an in-board editor commit (inline sticky/text/shape edit or\n * the markdown/HTML rich editor's Apply/Done) is about to write to the state engine.\n * Set `Cancel = true` synchronously to discard the commit; handlers may also rewrite\n * the args' `Content` / `Title`.\n */\n @Output() ContentApplying = new EventEmitter<WhiteboardContentApplyingEventArgs>();\n /** AFTER event: an editor commit applied to the state engine. */\n @Output() ContentApplied = new EventEmitter<WhiteboardContentAppliedEventArgs>();\n\n @ViewChild('canvas') private canvasRef?: ElementRef<HTMLDivElement>;\n /** The page strip — the context menu's \"Rename page\" routes to its inline editor. */\n @ViewChild(RealtimeWhiteboardPagesComponent) private pagesStrip?: RealtimeWhiteboardPagesComponent;\n\n // viewport\n public PanX = 0;\n public PanY = 0;\n public Zoom = 0.9;\n public MinimapOpen = false;\n\n // transient interaction state\n public Interaction: BoardInteraction | null = null;\n public PendingConnector: PendingConnector | null = null;\n public EditingID: string | null = null;\n /** The rich-content editor panel state (markdown / html items), or null when closed. */\n public RichEditor: RichEditorState | null = null;\n /** The open right-click context menu (canvas-relative position + model), or null. */\n public ContextMenu: {\n Left: number;\n Top: number;\n /** Board-coordinate click point — \"add … here\" placement target. */\n Point: WhiteboardPoint;\n /** Target item, or null for the empty-canvas / page-chip menus. */\n ItemID: string | null;\n /** Target page (a right-clicked page chip), or null for item/canvas menus. */\n PageID: string | null;\n Actions: WhiteboardContextMenuAction[];\n } | null = null;\n private editIsNew = false;\n private pendingFocus = false;\n private userStickyCount = 0;\n\n /** Agent items that just popped in (drive the .pop-in violet flash). */\n public PopInIDs = new Set<string>();\n private popInTimers: ReturnType<typeof setTimeout>[] = [];\n\n private _tool: WhiteboardTool = 'select';\n private changedSub?: Subscription;\n private cdr = inject(ChangeDetectorRef);\n\n // ── Precomputed render buckets ──────────────────────────────────────────────\n // `State.Items` allocates (Array.from + sort) on every access, and the four\n // template-bound getters below each used to call it and re-filter the whole\n // array — so a single change-detection pass on this high-interaction drag\n // surface re-sorted + re-scanned the item list 4×. We partition State.Items\n // into these four buckets ONCE whenever the items/state actually change\n // (initial load + every Changed$ emission, which covers adds/updates/removes\n // AND page switches), and the template binds to the plain array fields.\n private _boxItems: (WhiteboardStickyItem | WhiteboardShapeItem | WhiteboardTextItem | WhiteboardImageItem | WhiteboardMarkdownItem | WhiteboardHtmlItem)[] = [];\n private _inkItems: WhiteboardInkItem[] = [];\n private _connectorItems: WhiteboardConnectorItem[] = [];\n private _highlightItems: WhiteboardHighlightItem[] = [];\n\n /** Whether the single window 'message' listener (the widget input bridge) is attached. */\n private widgetMessageListenerAttached = false;\n\n ngOnInit(): void {\n this.changedSub = this.State.Changed$.subscribe((change) => {\n if (change.Op === 'add' && change.Author === 'agent') {\n this.PopInIDs.add(change.ItemID);\n this.popInTimers.push(setTimeout(() => {\n this.PopInIDs.delete(change.ItemID);\n this.cdr.markForCheck();\n }, POP_IN_MS));\n }\n // NOTE: HTML-widget srcdoc payloads need no invalidation here — the\n // `wbWidgetSrcdoc` pipe is view-scoped (rebuilt per mount, memoized per source),\n // so journal ops can neither leave a re-mounted frame a stale document nor\n // force-reload a still-mounted widget whose Html didn't change.\n // close the rich editor when its target item no longer exists (erased / undone)\n if (this.RichEditor && !this.State.GetItem(this.RichEditor.ItemID)) {\n this.RichEditor = null;\n }\n // close the context menu when its target item / page no longer exists\n if (this.ContextMenu?.ItemID && !this.State.GetItem(this.ContextMenu.ItemID)) {\n this.ContextMenu = null;\n }\n if (this.ContextMenu?.PageID && !this.State.FindPage(this.ContextMenu.PageID)) {\n this.ContextMenu = null;\n }\n this.recomputeRenderBuckets();\n this.syncWidgetMessageListener();\n this.cdr.markForCheck();\n });\n this.recomputeRenderBuckets();\n this.syncWidgetMessageListener();\n }\n\n /**\n * Partition `State.Items` (one Array.from + sort) into the four render buckets\n * the template binds to. Called on init and on every {@link WhiteboardState.Changed$}\n * emission — the engine emits there for adds/updates/removes and page switches, so\n * the buckets always reflect the active page's current items.\n */\n private recomputeRenderBuckets(): void {\n const box: (WhiteboardStickyItem | WhiteboardShapeItem | WhiteboardTextItem | WhiteboardImageItem | WhiteboardMarkdownItem | WhiteboardHtmlItem)[] = [];\n const ink: WhiteboardInkItem[] = [];\n const connectors: WhiteboardConnectorItem[] = [];\n const highlights: WhiteboardHighlightItem[] = [];\n for (const i of this.State.Items) {\n switch (i.Kind) {\n case 'sticky':\n case 'shape':\n case 'text':\n case 'image':\n case 'markdown':\n case 'html':\n box.push(i);\n break;\n case 'ink':\n ink.push(i);\n break;\n case 'connector':\n connectors.push(i);\n break;\n case 'highlight':\n highlights.push(i);\n break;\n }\n }\n this._boxItems = box;\n this._inkItems = ink;\n this._connectorItems = connectors;\n this._highlightItems = highlights;\n }\n\n ngOnDestroy(): void {\n this.changedSub?.unsubscribe();\n for (const t of this.popInTimers) {\n clearTimeout(t);\n }\n if (this.widgetMessageListenerAttached) {\n window.removeEventListener('message', this.onWindowMessage);\n this.widgetMessageListenerAttached = false;\n }\n }\n\n ngAfterViewChecked(): void {\n if (this.pendingFocus) {\n this.pendingFocus = false;\n const editor = this.canvasRef?.nativeElement.querySelector<HTMLElement>('.wb-edit');\n editor?.focus();\n }\n this.observeCanvasSize();\n }\n\n // ── Hidden-host layout recovery ─────────────────────────────────────────────\n //\n // The board is often CREATED inside a display:none tab pane (a review session's\n // Whiteboard tab, a collapsed surface panel): the canvas measures 0×0, so the\n // viewport-lazy culling computes everything as off-screen and the board renders\n // BLANK until some interaction forces a re-measure. A ResizeObserver watches for\n // the first REAL layout: it re-runs change detection (fixing the culling) and —\n // when the viewport is still untouched — frames the content via FitToContent so a\n // reviewed board opens centered instead of wherever pan (0,0) happens to land.\n\n /** Observer driving {@link onCanvasResize}; created once the canvas element exists. */\n private canvasResizeObserver: ResizeObserver | null = null;\n /** True once the canvas has had a real (non-zero) layout. */\n private hadRealLayout = false;\n /** True once the user pans/zooms — the auto-fit must never fight a chosen viewport. */\n private viewportTouched = false;\n\n /** Attaches the ResizeObserver exactly once (no-op where ResizeObserver is unavailable). */\n private observeCanvasSize(): void {\n const el = this.canvasRef?.nativeElement;\n if (!el || this.canvasResizeObserver || typeof ResizeObserver === 'undefined') {\n return;\n }\n this.canvasResizeObserver = new ResizeObserver(() => this.onCanvasResize());\n this.canvasResizeObserver.observe(el);\n this.onCanvasResize();\n }\n\n /** First non-zero layout: recompute culling and (if untouched) frame the content. */\n private onCanvasResize(): void {\n const el = this.canvasRef?.nativeElement;\n if (!el || el.clientWidth === 0 || el.clientHeight === 0 || this.hadRealLayout) {\n return;\n }\n this.hadRealLayout = true;\n if (!this.viewportTouched) {\n this.FitToContent();\n }\n this.cdr.markForCheck();\n }\n\n // ────────────────────────────────────────────── render-model getters\n\n // These four return precomputed buckets (see recomputeRenderBuckets); they are\n // refreshed only when the items/state change, not re-filtered every CD pass.\n public get BoxItems(): (WhiteboardStickyItem | WhiteboardShapeItem | WhiteboardTextItem | WhiteboardImageItem | WhiteboardMarkdownItem | WhiteboardHtmlItem)[] {\n return this._boxItems;\n }\n\n public get InkItems(): WhiteboardInkItem[] {\n return this._inkItems;\n }\n\n public get ConnectorItems(): WhiteboardConnectorItem[] {\n return this._connectorItems;\n }\n\n public get HighlightItems(): WhiteboardHighlightItem[] {\n return this._highlightItems;\n }\n\n public get ViewportTransform(): string {\n return `translate(${this.PanX}px, ${this.PanY}px) scale(${this.Zoom})`;\n }\n\n public get GridBackgroundSize(): string {\n const s = GRID_SIZE * this.Zoom;\n return `${s}px ${s}px`;\n }\n\n public get GridBackgroundPosition(): string {\n return `${this.PanX}px ${this.PanY}px`;\n }\n\n public get ZoomPercent(): number {\n return Math.round(this.Zoom * 100);\n }\n\n public get CursorClass(): string {\n switch (this.Tool) {\n case 'pan': return 'cur-pan';\n case 'pen': case 'shape': case 'connector': return 'cur-cross';\n case 'sticky': case 'image': case 'markdown': case 'html': return 'cur-copy';\n case 'text': return 'cur-text';\n case 'eraser': return 'cur-eraser';\n default: return '';\n }\n }\n\n public TrackItem(index: number, item: WhiteboardItem): string {\n return item.ID;\n }\n\n /**\n * Explicit wrap width for a text label (resize / tool w) — null lets the CSS max-width\n * wrap. Honors an in-flight RESIZE transient so the live preview tracks the handle drag\n * (a move transient is deliberately ignored: its W is the rough bounds ESTIMATE, and\n * stamping it inline would re-wrap an unsized label mid-drag).\n */\n public TextWrapWidth(item: WhiteboardItem): number | null {\n if (item.Kind !== 'text') {\n return null;\n }\n if (this.Interaction?.Type === 'resize' && this.Interaction.ItemID === item.ID) {\n return this.Interaction.CurBounds.W;\n }\n return item.W ?? null;\n }\n\n /** Left position of an item, honoring an in-flight move/resize transient. */\n public ItemX(item: WhiteboardItem): number {\n const t = this.transientBounds(item.ID);\n return t ? t.X : this.State.ItemBounds(item).X;\n }\n\n public ItemY(item: WhiteboardItem): number {\n const t = this.transientBounds(item.ID);\n return t ? t.Y : this.State.ItemBounds(item).Y;\n }\n\n public ItemW(item: WhiteboardItem): number | null {\n const t = this.transientBounds(item.ID);\n if (t) {\n return t.W;\n }\n if (item.Kind === 'shape' || item.Kind === 'highlight') {\n return item.W;\n }\n if (item.Kind === 'sticky') {\n return item.W ?? WHITEBOARD_DEFAULTS.StickyW;\n }\n if (item.Kind === 'image') {\n return item.W ?? WHITEBOARD_DEFAULTS.ImageW;\n }\n if (item.Kind === 'markdown' || item.Kind === 'html') {\n return item.W;\n }\n return null;\n }\n\n public ItemH(item: WhiteboardItem): number | null {\n const t = this.transientBounds(item.ID);\n if (t && (item.Kind === 'shape' || item.Kind === 'highlight' || item.Kind === 'html')) {\n return t.H;\n }\n if (item.Kind === 'shape' || item.Kind === 'highlight' || item.Kind === 'html') {\n return item.H;\n }\n return null;\n }\n\n /** A markdown panel's optional max height (its rendered height stays content-driven). */\n public MarkdownMaxHeight(item: WhiteboardMarkdownItem): number | null {\n return item.H ?? null;\n }\n\n /** Whether the item is part of the current (single OR multi) selection. */\n public IsSelected(item: WhiteboardItem): boolean {\n return this.State.IsItemSelected(item.ID);\n }\n\n /** Dragging visuals: the grabbed item, plus every other member during a GROUP drag. */\n public IsDragging(item: WhiteboardItem): boolean {\n const i = this.Interaction;\n if (i?.Type !== 'move' || !i.Moved) {\n return false;\n }\n return UUIDsEqual(i.ItemID, item.ID) || (i.Group && this.State.IsItemSelected(item.ID));\n }\n\n /**\n * 8 handles render on the selected, resizable item (gate: {@link IsResizableKind}) —\n * but only for a SINGLE selection; a multi-selection shows the outline treatment only.\n */\n public ShowHandles(item: WhiteboardItem): boolean {\n return this.IsSelected(item) && this.State.SelectedIDs.length === 1 && IsResizableKind(item.Kind);\n }\n\n public readonly Handles: ResizeHandle[] = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n\n /** The drag ghost rectangle (\"from here\") at the moved item's original bounds. */\n public get DragGhost(): WhiteboardBounds | null {\n return this.Interaction?.Type === 'move' && this.Interaction.Moved ? this.Interaction.OrigBounds : null;\n }\n\n /** Live shape-create preview rectangle. */\n public get ShapePreview(): WhiteboardBounds | null {\n if (this.Interaction?.Type !== 'shape') {\n return null;\n }\n const s = this.Interaction;\n return {\n X: Math.min(s.StartX, s.CurX),\n Y: Math.min(s.StartY, s.CurY),\n W: Math.abs(s.CurX - s.StartX),\n H: Math.abs(s.CurY - s.StartY)\n };\n }\n\n /** Live marquee (rubber-band) selection rectangle, or null when none is in flight. */\n public get MarqueeRect(): WhiteboardBounds | null {\n if (this.Interaction?.Type !== 'marquee') {\n return null;\n }\n const m = this.Interaction;\n const rect: WhiteboardBounds = {\n X: Math.min(m.StartX, m.CurX),\n Y: Math.min(m.StartY, m.CurY),\n W: Math.abs(m.CurX - m.StartX),\n H: Math.abs(m.CurY - m.StartY)\n };\n return rect.W >= 3 || rect.H >= 3 ? rect : null;\n }\n\n public StickyRotation(item: WhiteboardStickyItem): string {\n return `rotate(${item.Rotation ?? 0}deg)`;\n }\n\n public StickyTintClass(item: WhiteboardStickyItem): string {\n if (item.Author === 'agent') {\n return 'sticky--sage';\n }\n return item.Tint === 'amber-light' ? 'sticky--amber2' : 'sticky--amber';\n }\n\n public HighlightTag(item: WhiteboardHighlightItem): string {\n return item.Label || `${item.Author === 'agent' ? this.AgentName : 'You'} highlighted`;\n }\n\n // ────────────────────────────────────────────── text styling\n\n /** Family key → CSS font stack ('sans' = null so the board's default font cascades). */\n private static readonly FontStacks: Record<WhiteboardFontFamily, string | null> = {\n sans: null,\n serif: 'Georgia, \"Times New Roman\", serif',\n mono: 'var(--mj-font-mono, ui-monospace, \"SF Mono\", Menlo, monospace)'\n };\n\n /** Inline font-size for a styled text/sticky item (null = the kind's CSS default). */\n public ItemFontSize(item: WhiteboardStickyItem | WhiteboardTextItem): string | null {\n return item.FontSize != null ? `${item.FontSize}px` : null;\n }\n\n /** Inline font-family stack for a styled text/sticky item (null = inherit). */\n public ItemFontFamily(item: WhiteboardStickyItem | WhiteboardTextItem): string | null {\n return item.FontFamily ? RealtimeWhiteboardBoardComponent.FontStacks[item.FontFamily] : null;\n }\n\n /** Inline font-weight for a styled text/sticky item (null = the kind's CSS default). */\n public ItemFontWeight(item: WhiteboardStickyItem | WhiteboardTextItem): string | null {\n return item.FontWeight != null ? `${item.FontWeight}` : null;\n }\n\n /**\n * Inline color for a USER text label. Agent labels keep their violet authorship\n * treatment from CSS — `Color` never overrides it.\n */\n public ItemTextColor(item: WhiteboardTextItem): string | null {\n return item.Author === 'user' && item.Color ? item.Color : null;\n }\n\n /**\n * Apply a toolbar style pick to the selected text/sticky item (the \"restyle existing\"\n * path — the toolbar emits `StyleSelection`, the host routes it here). No-op when\n * nothing applicable is selected; color only applies to user text labels.\n */\n public ApplyTextStyleToSelection(style: WhiteboardTextStyleEvent): void {\n const id = this.State.SelectedID;\n const item = id ? this.State.GetItem(id) : undefined;\n if (!id || !item || (item.Kind !== 'sticky' && item.Kind !== 'text')) {\n return;\n }\n const patch: WhiteboardItemPatch = {};\n if (style.FontSize !== undefined) {\n patch.FontSize = style.FontSize;\n }\n if (style.FontFamily !== undefined) {\n patch.FontFamily = style.FontFamily;\n }\n if (style.Bold !== undefined) {\n patch.FontWeight = style.Bold ? 700 : 400;\n }\n if (style.Color !== undefined && item.Kind === 'text') {\n patch.Color = style.Color;\n }\n if (Object.keys(patch).length > 0) {\n this.State.UpdateItem(id, patch, 'user');\n }\n }\n\n // ────────────────────────────────────────────── svg path builders\n\n /** Smoothed freehand path (quadratic curves through segment midpoints). */\n public InkPath(points: WhiteboardPoint[]): string {\n if (points.length === 0) {\n return '';\n }\n if (points.length < 3) {\n const last = points[points.length - 1];\n return `M ${points[0].X} ${points[0].Y} L ${last.X} ${last.Y}`;\n }\n let d = `M ${points[0].X} ${points[0].Y}`;\n for (let i = 1; i < points.length - 1; i++) {\n const midX = (points[i].X + points[i + 1].X) / 2;\n const midY = (points[i].Y + points[i + 1].Y) / 2;\n d += ` Q ${points[i].X} ${points[i].Y} ${midX} ${midY}`;\n }\n const last = points[points.length - 1];\n d += ` L ${last.X} ${last.Y}`;\n return d;\n }\n\n /** Curved connector path between resolved (edge-clipped) endpoints. */\n public ConnectorPath(conn: WhiteboardConnectorItem): string {\n const { from, to } = this.connectorEndpoints(conn);\n return this.curveBetween(from, to);\n }\n\n /** Two short arrowhead strokes at the connector's target end. */\n public ConnectorArrow(conn: WhiteboardConnectorItem): string {\n const { from, to } = this.connectorEndpoints(conn);\n return this.arrowAt(from, to);\n }\n\n public get PendingConnectorPath(): string {\n if (!this.PendingConnector) {\n return '';\n }\n const from = this.pendingFromPoint();\n return this.curveBetween(from, { X: this.PendingConnector.CurX, Y: this.PendingConnector.CurY });\n }\n\n public get LivePenPath(): string {\n return this.Interaction?.Type === 'pen' ? this.InkPath(this.Interaction.Points) : '';\n }\n\n private connectorEndpoints(conn: WhiteboardConnectorItem): { from: WhiteboardPoint; to: WhiteboardPoint } {\n let from = this.State.ResolveEndpoint(conn, 'from');\n let to = this.State.ResolveEndpoint(conn, 'to');\n // clip anchored endpoints to the referenced item's bounds edge\n const fromItem = conn.FromItemID ? this.State.GetItem(conn.FromItemID) : undefined;\n const toItem = conn.ToItemID ? this.State.GetItem(conn.ToItemID) : undefined;\n if (fromItem) {\n from = this.edgePoint(this.State.ItemBounds(fromItem), to);\n }\n if (toItem) {\n to = this.edgePoint(this.State.ItemBounds(toItem), from);\n }\n return { from, to };\n }\n\n /** Intersect the segment bounds-center → towards with the bounds rectangle edge. */\n private edgePoint(b: WhiteboardBounds, towards: WhiteboardPoint): WhiteboardPoint {\n const cx = b.X + b.W / 2;\n const cy = b.Y + b.H / 2;\n const dx = towards.X - cx;\n const dy = towards.Y - cy;\n if (dx === 0 && dy === 0) {\n return { X: cx, Y: cy };\n }\n const sx = dx !== 0 ? (b.W / 2) / Math.abs(dx) : Infinity;\n const sy = dy !== 0 ? (b.H / 2) / Math.abs(dy) : Infinity;\n const s = Math.min(sx, sy);\n return { X: cx + dx * s, Y: cy + dy * s };\n }\n\n private curveBetween(from: WhiteboardPoint, to: WhiteboardPoint): string {\n const dx = to.X - from.X;\n const dy = to.Y - from.Y;\n if (Math.abs(dy) >= Math.abs(dx)) {\n // vertical bias (matches the mockup's email→webinar curve)\n return `M ${from.X} ${from.Y} C ${from.X + dx * 0.08} ${from.Y + dy * 0.45}, ${to.X - dx * 0.08} ${to.Y - dy * 0.45}, ${to.X} ${to.Y}`;\n }\n return `M ${from.X} ${from.Y} C ${from.X + dx * 0.45} ${from.Y + dy * 0.08}, ${to.X - dx * 0.45} ${to.Y - dy * 0.08}, ${to.X} ${to.Y}`;\n }\n\n private arrowAt(from: WhiteboardPoint, to: WhiteboardPoint): string {\n const angle = Math.atan2(to.Y - from.Y, to.X - from.X);\n const len = 13;\n const spread = 0.46; // ~26°\n const a1 = angle + Math.PI - spread;\n const a2 = angle + Math.PI + spread;\n const p1 = { X: to.X + Math.cos(a1) * len, Y: to.Y + Math.sin(a1) * len };\n const p2 = { X: to.X + Math.cos(a2) * len, Y: to.Y + Math.sin(a2) * len };\n return `M ${to.X} ${to.Y} L ${p1.X.toFixed(1)} ${p1.Y.toFixed(1)} M ${to.X} ${to.Y} L ${p2.X.toFixed(1)} ${p2.Y.toFixed(1)}`;\n }\n\n // ────────────────────────────────────────────── pointer interactions\n\n public OnCanvasPointerDown(event: PointerEvent): void {\n if (event.button !== 0) {\n return;\n }\n if (this.ReadOnly) {\n // Pan stays available for read navigation; every other tool is inert.\n if (this.Tool === 'pan') {\n this.Interaction = { Type: 'pan', StartClientX: event.clientX, StartClientY: event.clientY, OrigPanX: this.PanX, OrigPanY: this.PanY };\n }\n return;\n }\n this.canvasRef?.nativeElement.focus();\n const p = this.toBoard(event);\n switch (this.Tool) {\n case 'select':\n // marquee (rubber-band) selection starts on empty canvas; a tiny drag (a plain\n // click) clears the selection at pointerup unless shift is held (additive)\n this.Interaction = { Type: 'marquee', StartX: p.X, StartY: p.Y, CurX: p.X, CurY: p.Y, Additive: event.shiftKey };\n break;\n case 'pan':\n this.Interaction = { Type: 'pan', StartClientX: event.clientX, StartClientY: event.clientY, OrigPanX: this.PanX, OrigPanY: this.PanY };\n break;\n case 'pen':\n this.Interaction = { Type: 'pen', Points: [p] };\n break;\n case 'shape':\n this.Interaction = { Type: 'shape', StartX: p.X, StartY: p.Y, CurX: p.X, CurY: p.Y };\n break;\n case 'sticky':\n this.placeSticky(p);\n break;\n case 'text':\n this.placeText(p);\n break;\n case 'markdown':\n this.placeMarkdown(p);\n break;\n case 'html':\n this.placeHtml(p);\n break;\n case 'image':\n this.placeImage(p, 'pasted-image.png', null);\n break;\n case 'connector':\n this.connectorClick(null, p);\n break;\n case 'eraser':\n break;\n }\n }\n\n public OnItemPointerDown(event: PointerEvent, item: WhiteboardItem): void {\n if (this.ReadOnly) {\n return;\n }\n if (event.button !== 0) {\n return;\n }\n if (UUIDsEqual(this.EditingID, item.ID)) {\n event.stopPropagation();\n return;\n }\n switch (this.Tool) {\n case 'select': {\n event.stopPropagation();\n if (event.shiftKey) {\n // shift-click toggles membership in the multi-selection (no drag from it)\n this.State.ToggleSelect(item.ID);\n break;\n }\n // pointerdown on an already multi-selected item keeps the selection and drags\n // the whole GROUP; a click without movement collapses to that item at pointerup\n const group = this.State.IsItemSelected(item.ID) && this.State.SelectedIDs.length > 1;\n if (!group) {\n this.State.Select(item.ID);\n }\n const p = this.toBoard(event);\n const bounds = this.State.ItemBounds(item);\n this.Interaction = { Type: 'move', ItemID: item.ID, StartX: p.X, StartY: p.Y, OrigBounds: bounds, DX: 0, DY: 0, Moved: false, Group: group };\n break;\n }\n case 'eraser':\n event.stopPropagation();\n this.State.RemoveItem(item.ID, 'user');\n break;\n case 'connector': {\n event.stopPropagation();\n this.connectorClick(item.ID, this.toBoard(event));\n break;\n }\n default:\n // pen / shape / sticky / text / image gestures begin on the canvas — let it bubble\n break;\n }\n }\n\n public OnHandlePointerDown(event: PointerEvent, item: WhiteboardItem, handle: ResizeHandle): void {\n if (this.ReadOnly) {\n return;\n }\n if (event.button !== 0 || this.Tool !== 'select') {\n return;\n }\n event.stopPropagation();\n const p = this.toBoard(event);\n const bounds = this.State.ItemBounds(item);\n this.Interaction = { Type: 'resize', ItemID: item.ID, Handle: handle, StartX: p.X, StartY: p.Y, OrigBounds: bounds, CurBounds: { ...bounds } };\n }\n\n /** Click on a highlight region dismisses it (mockup: \"click dismisses\"). */\n public OnHighlightClick(event: MouseEvent, item: WhiteboardHighlightItem): void {\n event.stopPropagation();\n this.State.RemoveItem(item.ID, 'user');\n }\n\n @HostListener('window:pointermove', ['$event'])\n public OnWindowPointerMove(event: PointerEvent): void {\n if (!this.Interaction && !this.PendingConnector) {\n return;\n }\n const p = this.toBoard(event);\n if (this.PendingConnector) {\n this.PendingConnector.CurX = p.X;\n this.PendingConnector.CurY = p.Y;\n }\n const i = this.Interaction;\n if (!i) {\n return;\n }\n switch (i.Type) {\n case 'move': {\n i.DX = p.X - i.StartX;\n i.DY = p.Y - i.StartY;\n if (!i.Moved && Math.hypot(i.DX, i.DY) > 3) {\n i.Moved = true;\n }\n break;\n }\n case 'resize':\n i.CurBounds = this.resizeBounds(i.OrigBounds, i.Handle, p.X - i.StartX, p.Y - i.StartY);\n break;\n case 'pen': {\n const last = i.Points[i.Points.length - 1];\n if (Math.hypot(p.X - last.X, p.Y - last.Y) > 2.2) {\n i.Points.push(p);\n }\n break;\n }\n case 'shape':\n i.CurX = p.X;\n i.CurY = p.Y;\n break;\n case 'marquee':\n i.CurX = p.X;\n i.CurY = p.Y;\n break;\n case 'pan':\n this.viewportTouched = true; // a chosen viewport — the first-layout auto-fit must not fight it\n this.PanX = i.OrigPanX + (event.clientX - i.StartClientX);\n this.PanY = i.OrigPanY + (event.clientY - i.StartClientY);\n break;\n }\n }\n\n @HostListener('window:pointerup')\n public OnWindowPointerUp(): void {\n const i = this.Interaction;\n if (!i) {\n return;\n }\n this.Interaction = null;\n switch (i.Type) {\n case 'move':\n if (i.Moved) {\n if (i.Group) {\n // group drag: every selected item moves by the same delta — ONE undo step\n this.State.MoveSelectedBy(i.DX, i.DY, 'user');\n }\n else {\n this.State.MoveItem(i.ItemID, i.OrigBounds.X + i.DX, i.OrigBounds.Y + i.DY, 'user');\n }\n }\n else if (i.Group) {\n // click (no drag) on a multi-selected item collapses the selection to it\n this.State.Select(i.ItemID);\n }\n break;\n case 'marquee': {\n const rect: WhiteboardBounds = {\n X: Math.min(i.StartX, i.CurX),\n Y: Math.min(i.StartY, i.CurY),\n W: Math.abs(i.CurX - i.StartX),\n H: Math.abs(i.CurY - i.StartY)\n };\n if (rect.W < 3 && rect.H < 3) {\n // a plain click on empty canvas clears the selection (shift-click keeps it)\n if (!i.Additive) {\n this.State.Select(null);\n }\n break;\n }\n const hits = this.State.ItemsIntersecting(rect).map((it) => it.ID);\n this.State.SelectMany(i.Additive ? [...this.State.SelectedIDs, ...hits] : hits);\n break;\n }\n case 'resize': {\n const item = this.State.GetItem(i.ItemID);\n // per-kind commit: full-box kinds take X/Y/W/H; content-driven-height kinds\n // (sticky/text/image/markdown) take X/Y/W only — see BuildResizeCommitPatch.\n const patch = item ? BuildResizeCommitPatch(item.Kind, i.CurBounds) : null;\n if (patch) {\n this.State.UpdateItem(i.ItemID, patch, 'user');\n }\n break;\n }\n case 'pen':\n if (i.Points.length >= 2) {\n this.State.AddItem({ Kind: 'ink', Points: i.Points, Color: this.PenColor, StrokeWidth: this.PenWidth }, 'user');\n }\n break;\n case 'shape': {\n const r = {\n X: Math.min(i.StartX, i.CurX),\n Y: Math.min(i.StartY, i.CurY),\n W: Math.abs(i.CurX - i.StartX),\n H: Math.abs(i.CurY - i.StartY)\n };\n if (r.W >= 16 && r.H >= 16) {\n const item = this.State.AddItem(\n { Kind: 'shape', Shape: this.ShapeKind, X: r.X, Y: r.Y, W: Math.max(r.W, 60), H: Math.max(r.H, WHITEBOARD_DEFAULTS.ShapeMinH), Label: '' }, 'user');\n if (item) {\n this.State.Select(item.ID);\n this.beginEdit(item.ID, true);\n }\n }\n break;\n }\n case 'pan':\n break;\n }\n }\n\n public OnWheel(event: WheelEvent): void {\n event.preventDefault();\n if (event.ctrlKey || event.metaKey) {\n const factor = event.deltaY < 0 ? 1.1 : 1 / 1.1;\n this.zoomAt(this.clampZoom(this.Zoom * factor), event.clientX, event.clientY);\n }\n else {\n this.PanX -= event.deltaX;\n this.PanY -= event.deltaY;\n }\n }\n\n /** Paste an image from the clipboard onto the board (mockup: pasted-image card). */\n public OnPaste(event: ClipboardEvent): void {\n if (this.ReadOnly) {\n return;\n }\n const files = event.clipboardData?.files;\n if (!files || files.length === 0) {\n return;\n }\n for (let n = 0; n < files.length; n++) {\n const file = files[n];\n if (file.type.startsWith('image/')) {\n event.preventDefault();\n const center = this.viewportCenter();\n this.placeImage({ X: center.X - WHITEBOARD_DEFAULTS.ImageW / 2, Y: center.Y - WHITEBOARD_DEFAULTS.ImageH / 2 },\n file.name || 'pasted-image.png', URL.createObjectURL(file));\n return;\n }\n }\n }\n\n // ────────────────────────────────────────────── inline editing\n\n public BeginItemEdit(event: Event, item: WhiteboardItem): void {\n if (item.Kind !== 'sticky' && item.Kind !== 'text' && item.Kind !== 'shape') {\n return;\n }\n event.stopPropagation();\n this.beginEdit(item.ID, false);\n }\n\n /**\n * Commit the inline editor's value to the edited sticky / text / shape item. Routes\n * through the {@link ContentApplying} (cancelable) / {@link ContentApplied} event pair;\n * an empty commit on a JUST-PLACED sticky/text abandons the placement instead (the item\n * is removed — that path raises the engine's remove events, not the content pair).\n */\n public CommitEdit(value: string): void {\n const id = this.EditingID;\n if (!id) {\n return;\n }\n this.EditingID = null;\n const item = this.State.GetItem(id);\n if (!item) {\n return;\n }\n const text = value.trim();\n if (text.length === 0 && this.editIsNew && (item.Kind === 'sticky' || item.Kind === 'text')) {\n this.State.RemoveItem(id, 'user'); // abandoned placement\n return;\n }\n if (item.Kind === 'shape') {\n this.applyContent(id, 'shape', text);\n }\n else if (item.Kind === 'sticky' || item.Kind === 'text') {\n this.applyContent(id, item.Kind, text);\n }\n this.editIsNew = false;\n }\n\n /**\n * Run one editor commit through the {@link ContentApplying} / {@link ContentApplied}\n * pair: raise the cancelable BEFORE event, apply the (possibly handler-edited) content\n * via the state engine when not canceled, and raise the AFTER event when the engine\n * applied it (an engine-level `ItemUpdating$` veto also suppresses the AFTER event).\n */\n private applyContent(itemId: string, kind: WhiteboardEditableContentKind, content: string, title?: string): void {\n const applying: WhiteboardContentApplyingEventArgs = { ItemID: itemId, Kind: kind, Content: content, Title: title, Cancel: false };\n this.ContentApplying.emit(applying);\n if (applying.Cancel) {\n return;\n }\n let patch: WhiteboardItemPatch;\n switch (kind) {\n case 'shape': patch = { Label: applying.Content }; break;\n case 'markdown': patch = { Markdown: applying.Content }; break;\n case 'html': patch = { Html: applying.Content, Title: applying.Title }; break;\n default: patch = { Text: applying.Content }; break; // sticky / text\n }\n if (this.State.UpdateItem(itemId, patch, 'user')) {\n this.ContentApplied.emit({ ItemID: itemId, Kind: kind, Content: applying.Content, Title: applying.Title });\n }\n }\n\n public OnEditKeydown(event: KeyboardEvent, value: string): void {\n event.stopPropagation();\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.CommitEdit(value);\n }\n else if (event.key === 'Escape') {\n event.preventDefault();\n this.CommitEdit(value);\n }\n }\n\n // ────────────────────────────────────────────── rich widgets (markdown / html)\n // The sandboxed iframe's `srcdoc` is produced by the view-scoped `wbWidgetSrcdoc`\n // pipe (see whiteboard-srcdoc.pipe.ts for the per-mount lifecycle contract and the\n // full security rationale for bypassing Angular's sanitizer into the sandbox).\n\n // ────────────────────────────────────────────── widget input bridge (MJWhiteboard.submit)\n\n /** Attach/detach the SINGLE window 'message' listener so it only runs while widgets exist. */\n private syncWidgetMessageListener(): void {\n const hasWidgets = this.State.Items.some((i) => i.Kind === 'html');\n if (hasWidgets && !this.widgetMessageListenerAttached) {\n window.addEventListener('message', this.onWindowMessage);\n this.widgetMessageListenerAttached = true;\n }\n else if (!hasWidgets && this.widgetMessageListenerAttached) {\n window.removeEventListener('message', this.onWindowMessage);\n this.widgetMessageListenerAttached = false;\n }\n }\n\n /**\n * The widget input bridge's host-side listener. The sandboxed frames have OPAQUE\n * origins (their helper posts with `'*'`), so validation happens HERE: the payload\n * must carry the bridge marker AND `event.source` must be the contentWindow of one of\n * this board's tracked widget iframes — anything else is dropped. Accepted payloads\n * are JSON-capped and surfaced through the {@link WidgetSubmitting} (cancelable) /\n * {@link WidgetSubmitted} event pair.\n */\n private onWindowMessage = (event: MessageEvent): void => {\n const widget = this.resolveWidgetFromSource(event.source);\n const outcome = EvaluateWidgetSubmitMessage(event.data, widget);\n if (outcome.Kind === 'submit') {\n const submitting: WhiteboardWidgetSubmittingEventArgs = { Event: outcome.Event, Cancel: false };\n this.WidgetSubmitting.emit(submitting);\n if (!submitting.Cancel) {\n this.WidgetSubmitted.emit(outcome.Event);\n }\n this.cdr.markForCheck();\n return;\n }\n if (outcome.Reason === 'oversize') {\n console.warn(`Whiteboard widget submit dropped: payload exceeds ${WHITEBOARD_WIDGET_SUBMIT_MAX_CHARS} chars.`);\n }\n else if (outcome.Reason === 'unknown-source') {\n console.warn('Whiteboard widget submit dropped: message source is not a tracked widget frame.');\n }\n else {\n // 'not-submit' — may be the injected recorder's AMBIENT interaction batch instead.\n this.handleInteractionMessage(event.data, widget);\n }\n };\n\n /**\n * Second leg of the message listener: evaluate a non-submit message against the ambient\n * interaction contract and surface accepted batches through {@link WidgetInteraction}.\n * `'not-interaction'` is unrelated postMessage traffic — ignored silently, like the\n * submit path's `'not-submit'`.\n */\n private handleInteractionMessage(messageData: unknown, widget: { ItemID: string; Title?: string } | null): void {\n const outcome = EvaluateWidgetInteractionMessage(messageData, widget);\n if (outcome.Kind === 'interaction') {\n this.WidgetInteraction.emit(outcome.Event);\n this.cdr.markForCheck();\n return;\n }\n if (outcome.Reason === 'oversize') {\n console.warn(`Whiteboard widget interaction dropped: batch exceeds ${WHITEBOARD_WIDGET_INTERACTION_MAX_CHARS} chars.`);\n }\n else if (outcome.Reason === 'unknown-source') {\n console.warn('Whiteboard widget interaction dropped: message source is not a tracked widget frame.');\n }\n else if (outcome.Reason === 'bad-shape') {\n console.warn('Whiteboard widget interaction dropped: events batch is malformed.');\n }\n }\n\n /** Resolve a message `event.source` to the tracked widget iframe (window → item) it belongs to. */\n private resolveWidgetFromSource(source: MessageEventSource | null): { ItemID: string; Title?: string } | null {\n if (!source) {\n return null;\n }\n const frames = this.canvasRef?.nativeElement.querySelectorAll<HTMLIFrameElement>('iframe.html-card__frame[data-item-id]');\n if (!frames) {\n return null;\n }\n for (const frame of Array.from(frames)) {\n if (frame.contentWindow === source) {\n const id = frame.dataset['itemId'];\n const item = id ? this.State.GetItem(id) : undefined;\n if (item && item.Kind === 'html') {\n return { ItemID: item.ID, Title: item.Title };\n }\n }\n }\n return null;\n }\n\n /**\n * Cheap \"on-screen-ish\" check that gates iframe instantiation for HTML widgets: only\n * widgets within (or near) the current viewport get a live sandboxed frame; the rest\n * render a static placeholder until panned/zoomed into view. Re-entering view re-creates\n * the frame (any internal widget state resets — acceptable for board decorations).\n */\n public IsNearViewport(item: WhiteboardItem): boolean {\n const el = this.canvasRef?.nativeElement;\n if (!el || el.clientWidth === 0 || el.clientHeight === 0) {\n // Before the first layout — or while the host pane is display:none (an\n // unfocused tab) — there is no real viewport to cull against: render rather\n // than blank out (culling resumes on the first real layout).\n return true;\n }\n const margin = 320;\n const b = this.State.ItemBounds(item);\n const vx = -this.PanX / this.Zoom;\n const vy = -this.PanY / this.Zoom;\n const vw = el.clientWidth / this.Zoom;\n const vh = el.clientHeight / this.Zoom;\n return b.X < vx + vw + margin && b.X + b.W > vx - margin\n && b.Y < vy + vh + margin && b.Y + b.H > vy - margin;\n }\n\n /** Header title for an HTML widget. */\n public HtmlTitle(item: WhiteboardHtmlItem): string {\n return item.Title || 'HTML widget';\n }\n\n /** Open the rich editor for a markdown panel / HTML widget (dblclick or header edit). */\n public BeginRichEdit(event: Event, item: WhiteboardItem): void {\n if (this.ReadOnly || (item.Kind !== 'markdown' && item.Kind !== 'html')) {\n return;\n }\n event.stopPropagation();\n this.openRichEditor(item);\n }\n\n /** Delete affordance on the HTML widget header (the user removing their own widget). */\n public RemoveItemClick(event: Event, item: WhiteboardItem): void {\n if (this.ReadOnly) {\n return;\n }\n event.stopPropagation();\n this.State.RemoveItem(item.ID, 'user');\n }\n\n /** Markdown editor: flip between the source editor and the rendered preview. */\n public RichEditorSetPreview(preview: boolean): void {\n if (this.RichEditor) {\n this.RichEditor.Preview = preview;\n }\n }\n\n public OnRichEditorDraftChange(value: string): void {\n if (this.RichEditor) {\n this.RichEditor.Draft = value;\n }\n }\n\n public OnRichEditorTitleChange(value: string): void {\n if (this.RichEditor) {\n this.RichEditor.TitleDraft = value;\n }\n }\n\n /**\n * Commit the draft to the item (ONE update = one undo step) and keep the panel open.\n * Routes through the {@link ContentApplying} (cancelable) / {@link ContentApplied} pair.\n */\n public RichEditorApply(): void {\n const editor = this.RichEditor;\n if (!editor || !this.State.GetItem(editor.ItemID)) {\n return;\n }\n if (editor.Kind === 'markdown') {\n this.applyContent(editor.ItemID, 'markdown', editor.Draft);\n }\n else {\n // empty title clears the header label (UpdateItem skips undefined, so pass '' to clear)\n this.applyContent(editor.ItemID, 'html', editor.Draft, editor.TitleDraft.trim());\n }\n }\n\n /** Commit the draft and close the editor panel. */\n public RichEditorDone(): void {\n this.RichEditorApply();\n this.RichEditor = null;\n }\n\n /** Close the editor, discarding any uncommitted draft changes. */\n public RichEditorCancel(): void {\n this.RichEditor = null;\n }\n\n /** Esc inside the editor panel closes it; keys must not leak to the board shortcuts. */\n public OnRichEditorKeydown(event: KeyboardEvent): void {\n event.stopPropagation();\n if (event.key === 'Escape') {\n event.preventDefault();\n this.RichEditorCancel();\n }\n }\n\n private openRichEditor(item: WhiteboardMarkdownItem | WhiteboardHtmlItem): void {\n this.RichEditor = item.Kind === 'markdown'\n ? { ItemID: item.ID, Kind: 'markdown', Draft: item.Markdown, TitleDraft: '', Preview: false }\n : { ItemID: item.ID, Kind: 'html', Draft: item.Html, TitleDraft: item.Title ?? '', Preview: false };\n }\n\n // ────────────────────────────────────────────── context menu (right-click)\n\n /** Right-click on empty canvas → the \"add … here\" menu (suppresses the native menu). */\n public OnCanvasContextMenu(event: MouseEvent): void {\n if (this.ReadOnly) {\n return; // no board menu in read-only — the native browser menu stays available\n }\n event.preventDefault();\n this.openContextMenu(event, null);\n }\n\n /** Right-click on a board item → the item action menu (selects the item first). */\n public OnItemContextMenu(event: MouseEvent, item: WhiteboardItem): void {\n if (this.ReadOnly) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n if (item.Kind !== 'highlight') {\n this.State.Select(item.ID);\n }\n this.openContextMenu(event, item);\n }\n\n /** Dispatch one picked context-menu action, then close the menu. */\n public OnContextMenuAction(actionId: WhiteboardContextMenuActionID): void {\n const menu = this.ContextMenu;\n this.ContextMenu = null;\n if (!menu) {\n return;\n }\n const item = menu.ItemID ? this.State.GetItem(menu.ItemID) : undefined;\n switch (actionId) {\n case 'edit':\n // same paths as dblclick: inline edit for sticky/text/shape, rich editor for md/html\n if (item && (item.Kind === 'sticky' || item.Kind === 'text' || item.Kind === 'shape')) {\n this.State.Select(item.ID);\n this.beginEdit(item.ID, false);\n }\n else if (item && (item.Kind === 'markdown' || item.Kind === 'html')) {\n this.openRichEditor(item);\n }\n break;\n case 'restyle':\n // open the toolbar's text-style flyout with the item selected — style picks\n // restyle the selection through the existing StyleSelection path\n if (item) {\n this.State.Select(item.ID);\n this.ToolChangeRequest.emit('text');\n }\n break;\n case 'duplicate':\n if (item) {\n const copy = this.State.DuplicateItem(item.ID, 'user');\n if (copy) {\n this.State.Select(copy.ID);\n }\n }\n break;\n case 'bring-front':\n if (item) {\n this.State.BringToFront(item.ID, 'user');\n }\n break;\n case 'send-back':\n if (item) {\n this.State.SendToBack(item.ID, 'user');\n }\n break;\n case 'delete':\n if (item) {\n this.State.RemoveItem(item.ID, 'user');\n }\n break;\n case 'add-sticky':\n this.placeSticky(menu.Point);\n break;\n case 'add-text':\n this.placeText(menu.Point);\n break;\n case 'add-markdown':\n this.placeMarkdown(menu.Point);\n break;\n case 'add-html':\n this.placeHtml(menu.Point);\n break;\n case 'add-page':\n // same path as the strip's \"+\" — an auto-named page the engine switches to\n this.State.AddPage(undefined, 'user');\n break;\n case 'page-rename':\n if (menu.PageID) {\n this.pagesStrip?.BeginRename(menu.PageID);\n }\n break;\n case 'page-delete':\n if (menu.PageID) {\n this.State.RemovePage(menu.PageID, 'user'); // engine guards the last page\n }\n break;\n }\n }\n\n /** Click-away closes the menu (the menu root stops pointerdown propagation for itself). */\n @HostListener('document:pointerdown')\n public CloseContextMenu(): void {\n if (this.ContextMenu) {\n this.ContextMenu = null;\n }\n }\n\n /**\n * Right-click on a PAGE CHIP in the page strip (forwarded by the strip's\n * `ChipContextMenu` output) → the page action menu: Rename (routes back into the\n * strip's inline-rename editor) and Delete (offered only when more than one page\n * exists — the engine's last-page guard). Never opens in ReadOnly.\n */\n public OnPageChipContextMenu(payload: WhiteboardPageChipContextMenuEvent): void {\n if (this.ReadOnly) {\n return;\n }\n const actions = BuildWhiteboardPageContextMenu(payload.Page, {\n CanDelete: this.State.Pages.length > 1,\n ReadOnly: this.ReadOnly\n });\n if (actions.length === 0) {\n return;\n }\n this.showContextMenu(payload.Event, actions, null, payload.Page.ID);\n }\n\n private openContextMenu(event: MouseEvent, item: WhiteboardItem | null): void {\n this.showContextMenu(event, BuildWhiteboardContextMenu(item, this.ToolRoster), item ? item.ID : null, null);\n }\n\n /** Position + open the shared context-menu panel for any target (item / canvas / page chip). */\n private showContextMenu(event: MouseEvent, actions: WhiteboardContextMenuAction[], itemId: string | null, pageId: string | null): void {\n const el = this.canvasRef?.nativeElement;\n const rect = el ? el.getBoundingClientRect() : { left: 0, top: 0, width: 0, height: 0 };\n // keep the menu inside the canvas (estimate: ~200px wide, ~31px per row + padding)\n const menuW = 200;\n const menuH = actions.length * 31 + 12;\n const left = Math.max(4, Math.min(event.clientX - rect.left, Math.max(menuW, rect.width) - menuW));\n const top = Math.max(4, Math.min(event.clientY - rect.top, Math.max(menuH, rect.height) - menuH));\n this.ContextMenu = {\n Left: left,\n Top: top,\n Point: this.toBoard(event),\n ItemID: itemId,\n PageID: pageId,\n Actions: actions\n };\n }\n\n // ────────────────────────────────────────────── zoom / fit / minimap\n\n public ZoomIn(): void {\n const next = ZOOM_STEPS.find((z) => z > this.Zoom + 0.001);\n this.zoomCentered(next ?? ZOOM_STEPS[ZOOM_STEPS.length - 1]);\n }\n\n /**\n * Continuous zoom by a multiplicative factor at the viewport center — the\n * hold-to-zoom tick path (the zoom cluster emits ~3.5% factors every 50 ms while a\n * +/− button is held). Clamped to the same 25%–200% limits as the stepped zoom.\n */\n public ZoomByFactor(factor: number): void {\n if (!Number.isFinite(factor) || factor <= 0) {\n return;\n }\n this.zoomCentered(this.clampZoom(this.Zoom * factor));\n }\n\n public ZoomOut(): void {\n const lower = [...ZOOM_STEPS].reverse().find((z) => z < this.Zoom - 0.001);\n this.zoomCentered(lower ?? ZOOM_STEPS[0]);\n }\n\n /** Fit all content into the viewport (25%–200%, 60px padding). */\n public FitToContent(): void {\n const bounds = this.State.ContentBounds();\n const el = this.canvasRef?.nativeElement;\n if (!bounds || !el || bounds.W === 0 || bounds.H === 0 || el.clientWidth === 0 || el.clientHeight === 0) {\n return; // a hidden (0×0) host cannot be fit against — wait for a real layout\n }\n const pad = 60;\n const zoom = this.clampZoom(Math.min((el.clientWidth - pad * 2) / bounds.W, (el.clientHeight - pad * 2) / bounds.H));\n this.Zoom = zoom;\n this.PanX = (el.clientWidth - bounds.W * zoom) / 2 - bounds.X * zoom;\n this.PanY = (el.clientHeight - bounds.H * zoom) / 2 - bounds.Y * zoom;\n }\n\n public ToggleMinimap(): void {\n this.MinimapOpen = !this.MinimapOpen;\n }\n\n /** Cancel any in-flight transient gesture (tool switch, Esc) — incl. the rich editor + context menu. */\n public CancelTransient(): void {\n this.Interaction = null;\n this.PendingConnector = null;\n this.RichEditor = null;\n this.ContextMenu = null;\n }\n\n // minimap render model\n public get MinimapViewBox(): string {\n const world = this.minimapWorld();\n return `${world.X} ${world.Y} ${world.W} ${world.H}`;\n }\n\n public get MinimapItems(): { X: number; Y: number; W: number; H: number; Agent: boolean }[] {\n return this.State.Items\n .filter((i) => i.Kind !== 'highlight')\n .map((i) => {\n const b = this.State.ItemBounds(i);\n return { X: b.X, Y: b.Y, W: Math.max(b.W, 8), H: Math.max(b.H, 8), Agent: i.Author === 'agent' };\n });\n }\n\n public get MinimapViewport(): WhiteboardBounds {\n const el = this.canvasRef?.nativeElement;\n const w = el ? el.clientWidth : 0;\n const h = el ? el.clientHeight : 0;\n return { X: -this.PanX / this.Zoom, Y: -this.PanY / this.Zoom, W: w / this.Zoom, H: h / this.Zoom };\n }\n\n private minimapWorld(): WhiteboardBounds {\n const content = this.State.ContentBounds();\n const vp = this.MinimapViewport;\n const minX = Math.min(content?.X ?? vp.X, vp.X) - 40;\n const minY = Math.min(content?.Y ?? vp.Y, vp.Y) - 40;\n const maxX = Math.max(content ? content.X + content.W : vp.X + vp.W, vp.X + vp.W) + 40;\n const maxY = Math.max(content ? content.Y + content.H : vp.Y + vp.H, vp.Y + vp.H) + 40;\n return { X: minX, Y: minY, W: Math.max(maxX - minX, 1), H: Math.max(maxY - minY, 1) };\n }\n\n // ────────────────────────────────────────────── internals\n\n private toBoard(event: { clientX: number; clientY: number }): WhiteboardPoint {\n const el = this.canvasRef?.nativeElement;\n const rect = el ? el.getBoundingClientRect() : { left: 0, top: 0 };\n return {\n X: (event.clientX - rect.left - this.PanX) / this.Zoom,\n Y: (event.clientY - rect.top - this.PanY) / this.Zoom\n };\n }\n\n private viewportCenter(): WhiteboardPoint {\n const el = this.canvasRef?.nativeElement;\n const w = el ? el.clientWidth : 0;\n const h = el ? el.clientHeight : 0;\n return { X: (w / 2 - this.PanX) / this.Zoom, Y: (h / 2 - this.PanY) / this.Zoom };\n }\n\n private clampZoom(z: number): number {\n return Math.min(2, Math.max(0.25, z));\n }\n\n private zoomCentered(next: number): void {\n this.viewportTouched = true; // user-driven zoom — disable the first-layout auto-fit\n const el = this.canvasRef?.nativeElement;\n if (!el) {\n this.Zoom = next;\n return;\n }\n const rect = el.getBoundingClientRect();\n this.zoomAt(next, rect.left + rect.width / 2, rect.top + rect.height / 2);\n }\n\n private zoomAt(next: number, clientX: number, clientY: number): void {\n const el = this.canvasRef?.nativeElement;\n if (!el) {\n this.Zoom = next;\n return;\n }\n const rect = el.getBoundingClientRect();\n const px = clientX - rect.left;\n const py = clientY - rect.top;\n const bx = (px - this.PanX) / this.Zoom;\n const by = (py - this.PanY) / this.Zoom;\n this.Zoom = next;\n this.PanX = px - bx * next;\n this.PanY = py - by * next;\n }\n\n private resizeBounds(orig: WhiteboardBounds, handle: ResizeHandle, dx: number, dy: number): WhiteboardBounds {\n let { X, Y, W, H } = orig;\n if (handle.includes('w')) {\n X = orig.X + dx;\n W = orig.W - dx;\n }\n if (handle.includes('e')) {\n W = orig.W + dx;\n }\n if (handle.includes('n')) {\n Y = orig.Y + dy;\n H = orig.H - dy;\n }\n if (handle.includes('s')) {\n H = orig.H + dy;\n }\n const minSize = 24;\n if (W < minSize) {\n if (handle.includes('w')) {\n X -= minSize - W;\n }\n W = minSize;\n }\n if (H < minSize) {\n if (handle.includes('n')) {\n Y -= minSize - H;\n }\n H = minSize;\n }\n return { X, Y, W, H };\n }\n\n private transientBounds(itemId: string): WhiteboardBounds | null {\n const i = this.Interaction;\n if (i?.Type === 'move' && i.Moved) {\n if (i.ItemID === itemId) {\n return { X: i.OrigBounds.X + i.DX, Y: i.OrigBounds.Y + i.DY, W: i.OrigBounds.W, H: i.OrigBounds.H };\n }\n // GROUP drag: every other selected member previews at the same live delta\n // (state is untouched mid-drag, so ItemBounds still reports the original spot)\n if (i.Group && this.State.IsItemSelected(itemId)) {\n const item = this.State.GetItem(itemId);\n if (item) {\n const b = this.State.ItemBounds(item);\n return { X: b.X + i.DX, Y: b.Y + i.DY, W: b.W, H: b.H };\n }\n }\n }\n if (i?.Type === 'resize' && i.ItemID === itemId) {\n return i.CurBounds;\n }\n return null;\n }\n\n private placeSticky(p: WhiteboardPoint): void {\n const tint = this.userStickyCount % 2 === 0 ? 'amber' : 'amber-light';\n const rotation = this.userStickyCount % 2 === 0 ? -1 : 0.8;\n this.userStickyCount++;\n const item = this.State.AddItem(\n { Kind: 'sticky', X: p.X - WHITEBOARD_DEFAULTS.StickyW / 2, Y: p.Y - 24, Text: '', Tint: tint, Rotation: rotation }, 'user');\n if (!item) {\n return; // canceled via ItemAdding\n }\n this.State.Select(item.ID);\n this.beginEdit(item.ID, true);\n }\n\n private placeText(p: WhiteboardPoint): void {\n // Stamp only non-default style choices so an untouched flyout keeps the default look\n // (and the compact perception payloads stay free of noise fields).\n const item = this.State.AddItem({\n Kind: 'text',\n X: p.X,\n Y: p.Y - 9,\n Text: '',\n FontSize: this.TextSize !== 12 ? this.TextSize : undefined,\n FontFamily: this.TextFamily !== 'sans' ? this.TextFamily : undefined,\n FontWeight: this.TextBold ? undefined : 400,\n Color: this.TextColor ?? undefined\n }, 'user');\n if (!item) {\n return; // canceled via ItemAdding\n }\n this.State.Select(item.ID);\n this.beginEdit(item.ID, true);\n }\n\n private placeImage(p: WhiteboardPoint, name: string, url: string | null): void {\n const item = this.State.AddItem({ Kind: 'image', X: p.X, Y: p.Y, Name: name, Url: url }, 'user');\n if (item) {\n this.State.Select(item.ID);\n }\n }\n\n /** Click-place a starter markdown panel and open its editor. */\n private placeMarkdown(p: WhiteboardPoint): void {\n const item = this.State.AddItem({\n Kind: 'markdown',\n X: p.X - WHITEBOARD_DEFAULTS.MarkdownW / 2,\n Y: p.Y - 20,\n W: WHITEBOARD_DEFAULTS.MarkdownW,\n Markdown: STARTER_MARKDOWN\n }, 'user') as WhiteboardMarkdownItem | null;\n if (!item) {\n return; // canceled via ItemAdding\n }\n this.State.Select(item.ID);\n this.openRichEditor(item);\n }\n\n /** Click-place a starter HTML widget (sandboxed) and open its editor. */\n private placeHtml(p: WhiteboardPoint): void {\n const item = this.State.AddItem({\n Kind: 'html',\n X: p.X - WHITEBOARD_DEFAULTS.HtmlW / 2,\n Y: p.Y - 20,\n W: WHITEBOARD_DEFAULTS.HtmlW,\n H: WHITEBOARD_DEFAULTS.HtmlH,\n Html: WHITEBOARD_WIDGET_STARTER_HTML,\n Title: 'New widget'\n }, 'user') as WhiteboardHtmlItem | null;\n if (!item) {\n return; // canceled via ItemAdding\n }\n this.State.Select(item.ID);\n this.openRichEditor(item);\n }\n\n private beginEdit(id: string, isNew: boolean): void {\n this.EditingID = id;\n this.editIsNew = isNew;\n this.pendingFocus = true;\n }\n\n private connectorClick(itemId: string | null, p: WhiteboardPoint): void {\n if (!this.PendingConnector) {\n this.PendingConnector = {\n FromItemID: itemId,\n FromPoint: itemId ? null : p,\n CurX: p.X,\n CurY: p.Y\n };\n return;\n }\n const pending = this.PendingConnector;\n this.PendingConnector = null;\n if (itemId && pending.FromItemID === itemId) {\n return; // self-connector — ignore\n }\n this.State.AddItem({\n Kind: 'connector',\n FromItemID: pending.FromItemID,\n ToItemID: itemId,\n FromPoint: pending.FromPoint,\n ToPoint: itemId ? null : p\n }, 'user');\n }\n\n private pendingFromPoint(): WhiteboardPoint {\n const pc = this.PendingConnector;\n if (!pc) {\n return { X: 0, Y: 0 };\n }\n if (pc.FromItemID) {\n const item = this.State.GetItem(pc.FromItemID);\n if (item) {\n const b = this.State.ItemBounds(item);\n return { X: b.X + b.W / 2, Y: b.Y + b.H / 2 };\n }\n }\n return pc.FromPoint ?? { X: 0, Y: 0 };\n }\n}\n","<div #canvas\n [class]=\"'board-canvas ' + CursorClass\"\n [class.is-panning]=\"Interaction?.Type === 'pan'\"\n [class.is-interacting]=\"Interaction !== null || PendingConnector !== null\"\n [style.backgroundSize]=\"GridBackgroundSize\"\n [style.backgroundPosition]=\"GridBackgroundPosition\"\n tabindex=\"0\"\n (pointerdown)=\"OnCanvasPointerDown($event)\"\n (contextmenu)=\"OnCanvasContextMenu($event)\"\n (wheel)=\"OnWheel($event)\"\n (paste)=\"OnPaste($event)\">\n\n <div class=\"board-viewport\" [style.transform]=\"ViewportTransform\">\n\n <!-- ink + connectors -->\n <svg class=\"ink-layer\">\n @for (ink of InkItems; track ink.ID) {\n <path [attr.d]=\"InkPath(ink.Points)\"\n [class.ink-sage]=\"ink.Author === 'agent'\"\n [class.wb-erasable]=\"Tool === 'eraser' || Tool === 'select'\"\n [class.wb-ink-selected]=\"IsSelected(ink)\"\n [attr.stroke]=\"ink.Author === 'agent' ? null : ink.Color\"\n [attr.stroke-width]=\"ink.StrokeWidth\"\n fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n (pointerdown)=\"OnItemPointerDown($event, ink)\"\n (contextmenu)=\"OnItemContextMenu($event, ink)\"/>\n }\n @for (conn of ConnectorItems; track conn.ID) {\n <g [class.conn-sage]=\"conn.Author === 'agent'\" [class.conn-user]=\"conn.Author === 'user'\">\n <path [attr.d]=\"ConnectorPath(conn)\"\n [class.draw-in]=\"PopInIDs.has(conn.ID)\"\n [class.wb-erasable]=\"Tool === 'eraser' || Tool === 'select'\"\n stroke-width=\"2.5\" fill=\"none\" stroke-linecap=\"round\"\n (pointerdown)=\"OnItemPointerDown($event, conn)\"\n (contextmenu)=\"OnItemContextMenu($event, conn)\"/>\n <path [attr.d]=\"ConnectorArrow(conn)\" stroke-width=\"2.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </g>\n }\n <!-- live transients -->\n @if (LivePenPath) {\n <path class=\"wb-live-pen\" [attr.d]=\"LivePenPath\" [attr.stroke]=\"PenColor\" [attr.stroke-width]=\"PenWidth\"\n fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n }\n @if (PendingConnector) {\n <path class=\"wb-pending-conn\" [attr.d]=\"PendingConnectorPath\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\"/>\n }\n </svg>\n\n <!-- highlight regions (agent \"pointing without touching\"; click dismisses) -->\n @for (hl of HighlightItems; track hl.ID) {\n <div class=\"sage-highlight\"\n [class.user-highlight]=\"hl.Author === 'user'\"\n [style.left.px]=\"ItemX(hl)\" [style.top.px]=\"ItemY(hl)\"\n [style.width.px]=\"ItemW(hl)\" [style.height.px]=\"ItemH(hl)\"\n title=\"Click to dismiss\"\n (pointerdown)=\"OnHighlightClick($event, hl)\"\n (contextmenu)=\"OnItemContextMenu($event, hl)\">\n <span class=\"hl-tag\"><i class=\"fa-solid fa-highlighter\"></i> {{ HighlightTag(hl) }}</span>\n </div>\n }\n\n <!-- drag ghost (\"from here\") -->\n @if (DragGhost; as ghost) {\n <div class=\"drag-ghost\"\n [style.left.px]=\"ghost.X\" [style.top.px]=\"ghost.Y\"\n [style.width.px]=\"ghost.W\" [style.height.px]=\"ghost.H\"></div>\n }\n\n <!-- shape drag-create preview -->\n @if (ShapePreview; as preview) {\n <div class=\"shape-preview\"\n [style.left.px]=\"preview.X\" [style.top.px]=\"preview.Y\"\n [style.width.px]=\"preview.W\" [style.height.px]=\"preview.H\"></div>\n }\n\n <!-- marquee (rubber-band) multi-selection rectangle -->\n @if (MarqueeRect; as mq) {\n <div class=\"wb-marquee\"\n [style.left.px]=\"mq.X\" [style.top.px]=\"mq.Y\"\n [style.width.px]=\"mq.W\" [style.height.px]=\"mq.H\"></div>\n }\n\n <!-- board items -->\n @for (item of BoxItems; track item.ID) {\n @switch (item.Kind) {\n\n @case ('sticky') {\n <div [class]=\"'bi sticky ' + StickyTintClass(item)\"\n [class.selected]=\"IsSelected(item)\"\n [class.dragging]=\"IsDragging(item)\"\n [class.pop-in]=\"PopInIDs.has(item.ID)\"\n [style.left.px]=\"ItemX(item)\" [style.top.px]=\"ItemY(item)\"\n [style.width.px]=\"ItemW(item)\"\n [style.fontSize]=\"ItemFontSize(item)\"\n [style.fontFamily]=\"ItemFontFamily(item)\"\n [style.fontWeight]=\"ItemFontWeight(item)\"\n [style.transform]=\"IsDragging(item) ? '' : StickyRotation(item)\"\n (pointerdown)=\"OnItemPointerDown($event, item)\"\n (dblclick)=\"BeginItemEdit($event, item)\"\n (contextmenu)=\"OnItemContextMenu($event, item)\">\n @if (item.Author === 'agent') {\n <span class=\"author-chip author-chip--sage\"><i class=\"fa-solid fa-feather\"></i> {{ AgentName }}</span>\n } @else {\n <span class=\"author-chip author-chip--you\"><i class=\"fa-solid fa-user\"></i> You</span>\n }\n @if (EditingID === item.ID) {\n <textarea class=\"wb-edit\" rows=\"3\"\n [value]=\"item.Text\"\n (keydown)=\"OnEditKeydown($event, edit.value)\"\n (blur)=\"CommitEdit(edit.value)\"\n #edit></textarea>\n } @else {\n {{ item.Text }}\n }\n @if (ShowHandles(item) && !IsDragging(item)) {\n @for (h of Handles; track h) {\n <span [class]=\"'sel-h ' + h\" (pointerdown)=\"OnHandlePointerDown($event, item, h)\"></span>\n }\n }\n </div>\n }\n\n @case ('shape') {\n <div class=\"bi shape-box\"\n [class.shape-box--ellipse]=\"item.Shape === 'ellipse'\"\n [class.shape-box--diamond]=\"item.Shape === 'diamond'\"\n [class.shape-box--sage]=\"item.Author === 'agent'\"\n [class.selected]=\"IsSelected(item)\"\n [class.dragging]=\"IsDragging(item)\"\n [class.pop-in]=\"PopInIDs.has(item.ID)\"\n [style.left.px]=\"ItemX(item)\" [style.top.px]=\"ItemY(item)\"\n [style.width.px]=\"ItemW(item)\" [style.height.px]=\"ItemH(item)\"\n (pointerdown)=\"OnItemPointerDown($event, item)\"\n (dblclick)=\"BeginItemEdit($event, item)\"\n (contextmenu)=\"OnItemContextMenu($event, item)\">\n @if (item.Author === 'agent') {\n <span class=\"author-chip author-chip--sage\"><i class=\"fa-solid fa-feather\"></i> {{ AgentName }}</span>\n } @else {\n <span class=\"author-chip author-chip--you\"><i class=\"fa-solid fa-user\"></i> You</span>\n }\n @if (EditingID === item.ID) {\n <textarea class=\"wb-edit wb-edit--shape\" rows=\"1\"\n [value]=\"item.Label\"\n (keydown)=\"OnEditKeydown($event, editShape.value)\"\n (blur)=\"CommitEdit(editShape.value)\"\n #editShape></textarea>\n } @else {\n <span>{{ item.Label }}@if (item.Sub) {<span class=\"sub\">{{ item.Sub }}</span>}</span>\n }\n @if (ShowHandles(item) && !IsDragging(item)) {\n @for (h of Handles; track h) {\n <span [class]=\"'sel-h ' + h\" (pointerdown)=\"OnHandlePointerDown($event, item, h)\"></span>\n }\n }\n </div>\n }\n\n @case ('text') {\n <div class=\"bi tlabel\"\n [class.tlabel--user]=\"item.Author === 'user'\"\n [class.selected]=\"IsSelected(item)\"\n [class.dragging]=\"IsDragging(item)\"\n [class.pop-in]=\"PopInIDs.has(item.ID)\"\n [style.left.px]=\"ItemX(item)\" [style.top.px]=\"ItemY(item)\"\n [style.width.px]=\"TextWrapWidth(item)\"\n [style.maxWidth.px]=\"TextWrapWidth(item)\"\n [style.fontSize]=\"ItemFontSize(item)\"\n [style.fontFamily]=\"ItemFontFamily(item)\"\n [style.fontWeight]=\"ItemFontWeight(item)\"\n [style.color]=\"ItemTextColor(item)\"\n (pointerdown)=\"OnItemPointerDown($event, item)\"\n (dblclick)=\"BeginItemEdit($event, item)\"\n (contextmenu)=\"OnItemContextMenu($event, item)\">\n @if (item.Author === 'agent') {\n <i class=\"fa-solid fa-feather\"></i>\n }\n @if (EditingID === item.ID) {\n <input class=\"wb-edit wb-edit--text\" type=\"text\"\n [value]=\"item.Text\"\n (keydown)=\"OnEditKeydown($event, editText.value)\"\n (blur)=\"CommitEdit(editText.value)\"\n #editText/>\n } @else {\n {{ item.Text }}\n }\n @if (ShowHandles(item) && !IsDragging(item)) {\n @for (h of Handles; track h) {\n <span [class]=\"'sel-h ' + h\" (pointerdown)=\"OnHandlePointerDown($event, item, h)\"></span>\n }\n }\n </div>\n }\n\n @case ('markdown') {\n <div class=\"bi md-card\"\n [class.md-card--sage]=\"item.Author === 'agent'\"\n [class.selected]=\"IsSelected(item)\"\n [class.dragging]=\"IsDragging(item)\"\n [class.pop-in]=\"PopInIDs.has(item.ID)\"\n [style.left.px]=\"ItemX(item)\" [style.top.px]=\"ItemY(item)\"\n [style.width.px]=\"ItemW(item)\"\n (pointerdown)=\"OnItemPointerDown($event, item)\"\n (dblclick)=\"BeginRichEdit($event, item)\"\n (contextmenu)=\"OnItemContextMenu($event, item)\">\n @if (item.Author === 'agent') {\n <span class=\"author-chip author-chip--sage\"><i class=\"fa-solid fa-feather\"></i> {{ AgentName }}</span>\n } @else {\n <span class=\"author-chip author-chip--you\"><i class=\"fa-brands fa-markdown\"></i> You</span>\n }\n <!-- the BODY clips (overflow + max height) so the out-jutting selection\n handles and author chip on the card root are never clipped away -->\n <div class=\"md-card__body\"\n [style.maxHeight.px]=\"MarkdownMaxHeight(item)\">\n <!-- rendered through the shared mj-markdown component (sanitize defaults ON — no raw HTML passthrough) -->\n <mj-markdown [data]=\"item.Markdown\"\n [enableMermaid]=\"false\"\n [enableCodeCopy]=\"false\"\n [enableCollapsibleHeadings]=\"false\"/>\n </div>\n @if (ShowHandles(item) && !IsDragging(item)) {\n @for (h of Handles; track h) {\n <span [class]=\"'sel-h ' + h\" (pointerdown)=\"OnHandlePointerDown($event, item, h)\"></span>\n }\n }\n </div>\n }\n\n @case ('html') {\n <div class=\"bi html-card\"\n [class.html-card--sage]=\"item.Author === 'agent'\"\n [class.selected]=\"IsSelected(item)\"\n [class.dragging]=\"IsDragging(item)\"\n [class.pop-in]=\"PopInIDs.has(item.ID)\"\n [style.left.px]=\"ItemX(item)\" [style.top.px]=\"ItemY(item)\"\n [style.width.px]=\"ItemW(item)\" [style.height.px]=\"ItemH(item)\"\n (pointerdown)=\"OnItemPointerDown($event, item)\"\n (contextmenu)=\"OnItemContextMenu($event, item)\">\n <!-- Drag/select wiring lives on the CARD ROOT: pointer events from the header,\n the border ring and the lazy placeholder all bubble here, while events\n inside the sandboxed iframe never reach the parent document — so the\n widget body stays fully interactive and everything else drags the card. -->\n <div class=\"html-card__head\"\n (dblclick)=\"BeginRichEdit($event, item)\">\n <i class=\"fa-solid fa-code html-card__glyph\"></i>\n <span class=\"html-card__title\">{{ HtmlTitle(item) }}</span>\n @if (item.Author === 'agent') {\n <span class=\"author-chip author-chip--sage author-chip--inline\"><i class=\"fa-solid fa-feather\"></i> {{ AgentName }}</span>\n } @else {\n <span class=\"author-chip author-chip--you author-chip--inline\"><i class=\"fa-solid fa-user\"></i> You</span>\n }\n @if (!ReadOnly) {\n <button type=\"button\" class=\"html-card__btn\" title=\"Edit HTML\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"BeginRichEdit($event, item)\"><i class=\"fa-solid fa-pen\"></i></button>\n <button type=\"button\" class=\"html-card__btn\" title=\"Remove widget\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"RemoveItemClick($event, item)\"><i class=\"fa-solid fa-trash-can\"></i></button>\n }\n </div>\n <div class=\"html-card__body\">\n @if (IsNearViewport(item)) {\n <!-- SANDBOXED: allow-scripts ONLY (no allow-same-origin) — opaque origin,\n no access to the app DOM, session, cookies or storage. The srcdoc is\n built by the view-scoped wbWidgetSrcdoc pipe: rebuilt per MOUNT (page\n switches / lazy toggle / board re-creation always render fresh) and\n identity-stable while mounted (no reload churn). See whiteboard-srcdoc.pipe.ts. -->\n <iframe class=\"html-card__frame\"\n sandbox=\"allow-scripts\"\n [srcdoc]=\"item.Html | wbWidgetSrcdoc\"\n [attr.data-item-id]=\"item.ID\"\n [attr.title]=\"HtmlTitle(item)\"></iframe>\n } @else {\n <div class=\"html-card__lazy\">\n <i class=\"fa-solid fa-code\"></i>\n <span>{{ HtmlTitle(item) }}</span>\n </div>\n }\n </div>\n @if (ShowHandles(item) && !IsDragging(item)) {\n @for (h of Handles; track h) {\n <span [class]=\"'sel-h ' + h\" (pointerdown)=\"OnHandlePointerDown($event, item, h)\"></span>\n }\n }\n </div>\n }\n\n @case ('image') {\n <div class=\"bi img-card\"\n [class.selected]=\"IsSelected(item)\"\n [class.dragging]=\"IsDragging(item)\"\n [class.pop-in]=\"PopInIDs.has(item.ID)\"\n [style.left.px]=\"ItemX(item)\" [style.top.px]=\"ItemY(item)\"\n [style.width.px]=\"ItemW(item)\"\n (pointerdown)=\"OnItemPointerDown($event, item)\"\n (contextmenu)=\"OnItemContextMenu($event, item)\">\n @if (item.Author === 'agent') {\n <span class=\"author-chip author-chip--sage\"><i class=\"fa-solid fa-feather\"></i> {{ AgentName }}</span>\n } @else {\n <span class=\"author-chip author-chip--you\"><i class=\"fa-solid fa-paste\"></i> You · pasted</span>\n }\n <div class=\"img-card__body\">\n @if (item.Url) {\n <img [src]=\"item.Url\" [alt]=\"item.Name\"/>\n } @else {\n <i class=\"fa-regular fa-image\"></i>\n }\n </div>\n <div class=\"img-card__name\"><i class=\"fa-solid fa-chart-area\"></i> {{ item.Name }}</div>\n @if (ShowHandles(item) && !IsDragging(item)) {\n @for (h of Handles; track h) {\n <span [class]=\"'sel-h ' + h\" (pointerdown)=\"OnHandlePointerDown($event, item, h)\"></span>\n }\n }\n </div>\n }\n }\n }\n\n <!-- agent presence cursor -->\n @if (AgentPresence?.Active) {\n <div class=\"cursor cursor--sage\" [style.left.px]=\"AgentPresence!.X\" [style.top.px]=\"AgentPresence!.Y\">\n <span class=\"tip\"><i class=\"fa-solid fa-feather\"></i></span>\n <span class=\"lbl\"><i class=\"fa-solid fa-pen\"></i>{{ AgentPresence!.Label }}</span>\n </div>\n }\n </div>\n\n <!-- in-board rich-content editor panel (markdown / html items) -->\n @if (RichEditor; as ed) {\n <div class=\"rich-editor\"\n (keydown)=\"OnRichEditorKeydown($event)\"\n (pointerdown)=\"$event.stopPropagation()\"\n (dblclick)=\"$event.stopPropagation()\"\n (wheel)=\"$event.stopPropagation()\">\n <div class=\"rich-editor__head\">\n @if (ed.Kind === 'markdown') {\n <i class=\"fa-brands fa-markdown\"></i>\n <span class=\"rich-editor__label\">Markdown panel</span>\n <span class=\"rich-editor__modes\">\n <button type=\"button\" class=\"re-mode\" [class.on]=\"!ed.Preview\" (click)=\"RichEditorSetPreview(false)\">Edit</button>\n <button type=\"button\" class=\"re-mode\" [class.on]=\"ed.Preview\" (click)=\"RichEditorSetPreview(true)\">Preview</button>\n </span>\n } @else {\n <i class=\"fa-solid fa-code\"></i>\n <span class=\"rich-editor__label\">HTML widget</span>\n <input class=\"rich-editor__title\" type=\"text\" placeholder=\"Title\" #reTitle\n [value]=\"ed.TitleDraft\" (input)=\"OnRichEditorTitleChange(reTitle.value)\"/>\n }\n </div>\n <div class=\"rich-editor__body\">\n @if (ed.Kind === 'markdown' && ed.Preview) {\n <div class=\"rich-editor__preview\">\n <mj-markdown [data]=\"ed.Draft\"\n [enableMermaid]=\"false\"\n [enableCodeCopy]=\"false\"\n [enableCollapsibleHeadings]=\"false\"/>\n </div>\n } @else {\n <mj-code-editor class=\"rich-editor__code\"\n [value]=\"ed.Draft\"\n [language]=\"ed.Kind === 'markdown' ? 'markdown' : 'html'\"\n (change)=\"OnRichEditorDraftChange($event)\"/>\n }\n </div>\n @if (ed.Kind === 'html') {\n <div class=\"rich-editor__note\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n Renders in a sandboxed frame — scripts run isolated, no app or network access guaranteed.\n </div>\n }\n <div class=\"rich-editor__foot\">\n <button type=\"button\" class=\"re-btn re-btn--primary\" (click)=\"RichEditorDone()\">Done</button>\n <button type=\"button\" class=\"re-btn\" title=\"Apply without closing — re-renders the widget\" (click)=\"RichEditorApply()\">Apply</button>\n <span class=\"re-spacer\"></span>\n <button type=\"button\" class=\"re-btn\" title=\"Close without applying draft changes\" (click)=\"RichEditorCancel()\">Cancel</button>\n </div>\n </div>\n }\n\n <!-- right-click context menu (item actions / \"add … here\") -->\n @if (ContextMenu; as menu) {\n <div class=\"wb-context-menu\"\n [style.left.px]=\"menu.Left\" [style.top.px]=\"menu.Top\"\n (pointerdown)=\"$event.stopPropagation()\"\n (contextmenu)=\"$event.preventDefault(); $event.stopPropagation()\"\n (wheel)=\"$event.stopPropagation()\">\n @for (action of menu.Actions; track action.ID) {\n @if (action.SeparatorBefore) {\n <div class=\"wb-context-menu__sep\"></div>\n }\n <button type=\"button\" class=\"wb-context-menu__item\"\n [class.wb-context-menu__item--danger]=\"action.Danger\"\n (click)=\"OnContextMenuAction(action.ID)\">\n <i [class]=\"action.Icon\"></i> {{ action.Label }}\n </button>\n }\n </div>\n }\n\n <!-- page strip (OneNote-style tabs; switching works in ReadOnly, mutations don't) -->\n <mj-realtime-whiteboard-pages [State]=\"State\" [ReadOnly]=\"ReadOnly\"\n (ChipContextMenu)=\"OnPageChipContextMenu($event)\"/>\n\n <!-- minimap -->\n @if (MinimapOpen) {\n <div class=\"minimap\">\n <svg [attr.viewBox]=\"MinimapViewBox\" preserveAspectRatio=\"xMidYMid meet\">\n @for (mi of MinimapItems; track $index) {\n <rect [attr.x]=\"mi.X\" [attr.y]=\"mi.Y\" [attr.width]=\"mi.W\" [attr.height]=\"mi.H\"\n [attr.class]=\"mi.Agent ? 'mm-item mm-item--sage' : 'mm-item'\" rx=\"6\"/>\n }\n <rect class=\"mm-viewport\"\n [attr.x]=\"MinimapViewport.X\" [attr.y]=\"MinimapViewport.Y\"\n [attr.width]=\"MinimapViewport.W\" [attr.height]=\"MinimapViewport.H\" rx=\"8\"/>\n </svg>\n </div>\n }\n</div>\n"]}
|
|
1
|
+
{"version":3,"file":"whiteboard-board.component.js","sourceRoot":"","sources":["../../src/lib/whiteboard-board.component.ts","../../src/lib/whiteboard-board.component.html"],"names":[],"mappings":"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","sourcesContent":["import {\n AfterViewChecked, ChangeDetectorRef, Component, ElementRef, EventEmitter, HostListener,\n Input, OnDestroy, OnInit, Output, ViewChild, inject\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { UUIDsEqual } from '@memberjunction/global';\nimport { Subscription } from 'rxjs';\nimport { MarkdownModule } from '@memberjunction/ng-markdown';\nimport { CodeEditorModule } from '@memberjunction/ng-code-editor';\nimport {\n BuildResizeCommitPatch, IsResizableKind,\n WHITEBOARD_DEFAULTS, WhiteboardBounds, WhiteboardConnectorItem, WhiteboardFontFamily,\n WhiteboardHighlightItem, WhiteboardHtmlItem, WhiteboardImageItem, WhiteboardInkItem,\n WhiteboardItem, WhiteboardItemPatch, WhiteboardMarkdownItem, WhiteboardPageInfo,\n WhiteboardPoint, WhiteboardShapeItem, WhiteboardState, WhiteboardStickyItem, WhiteboardTextItem\n} from './whiteboard-state';\nimport { WhiteboardTextStyleEvent, WHITEBOARD_PEN_COLORS } from './whiteboard-toolbar.component';\nimport {\n EvaluateWidgetInteractionMessage, EvaluateWidgetSubmitMessage,\n WHITEBOARD_WIDGET_INTERACTION_MAX_CHARS, WHITEBOARD_WIDGET_SUBMIT_MAX_CHARS,\n WhiteboardWidgetInteractionEvent, WhiteboardWidgetSubmitEvent, WhiteboardWidgetSubmittingEventArgs\n} from './whiteboard-widget-bridge';\nimport { WhiteboardWidgetSrcdocPipe } from './whiteboard-srcdoc.pipe';\nimport {\n BuildWhiteboardContextMenu, BuildWhiteboardPageContextMenu,\n WhiteboardContextMenuAction, WhiteboardContextMenuActionID\n} from './whiteboard-context-menu';\nimport { WhiteboardTool, WhiteboardToolRoster } from './whiteboard-tool-roster';\nimport { RealtimeWhiteboardPagesComponent, WhiteboardPageChipContextMenuEvent } from './whiteboard-pages.component';\n\n/** The agent presence cursor state (input-driven; the host animates it to mutation points). */\nexport interface WhiteboardAgentPresence {\n Active: boolean;\n X: number;\n Y: number;\n Label: string;\n}\n\n/** Item kinds whose content can be committed through an in-board editor. */\nexport type WhiteboardEditableContentKind = 'sticky' | 'text' | 'shape' | 'markdown' | 'html';\n\n/**\n * BEFORE-event args for the board/host `ContentApplying` output — raised when an\n * in-board editor commit (inline sticky/text/shape edit, or the markdown/HTML rich\n * editor's Apply/Done) is about to write the draft into the state engine. Handlers run\n * synchronously; set {@link Cancel} to `true` to discard the commit (the item keeps its\n * previous content and `ContentApplied` never fires). Handlers may also rewrite\n * {@link Content} / {@link Title} — the edited values are what gets applied.\n */\nexport interface WhiteboardContentApplyingEventArgs {\n /** The target item's ID. */\n ItemID: string;\n /** The target item's kind (decides which field the content lands in). */\n Kind: WhiteboardEditableContentKind;\n /** The committed content: Text (sticky/text), Label (shape), Markdown or Html source. */\n Content: string;\n /** HTML widgets only: the committed header title ('' clears it). */\n Title?: string;\n /** Set to `true` (in a synchronous handler) to discard the commit. */\n Cancel: boolean;\n}\n\n/** AFTER-event args for the board/host `ContentApplied` output — the commit applied. */\nexport interface WhiteboardContentAppliedEventArgs {\n /** The updated item's ID. */\n ItemID: string;\n /** The updated item's kind. */\n Kind: WhiteboardEditableContentKind;\n /** The content that was applied. */\n Content: string;\n /** HTML widgets only: the applied header title. */\n Title?: string;\n}\n\ntype ResizeHandle = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';\n\ntype BoardInteraction =\n | { Type: 'move'; ItemID: string; StartX: number; StartY: number; OrigBounds: WhiteboardBounds; DX: number; DY: number; Moved: boolean; Group: boolean }\n | { Type: 'resize'; ItemID: string; Handle: ResizeHandle; StartX: number; StartY: number; OrigBounds: WhiteboardBounds; CurBounds: WhiteboardBounds }\n | { Type: 'pen'; Points: WhiteboardPoint[] }\n | { Type: 'shape'; StartX: number; StartY: number; CurX: number; CurY: number }\n | { Type: 'marquee'; StartX: number; StartY: number; CurX: number; CurY: number; Additive: boolean }\n | { Type: 'pan'; StartClientX: number; StartClientY: number; OrigPanX: number; OrigPanY: number };\n\ninterface PendingConnector {\n FromItemID: string | null;\n FromPoint: WhiteboardPoint | null;\n CurX: number;\n CurY: number;\n}\n\n/** Transient state of the in-board rich-content editor panel (markdown / html items). */\ninterface RichEditorState {\n ItemID: string;\n Kind: 'markdown' | 'html';\n /** The in-flight source draft (committed only on Apply / Done). */\n Draft: string;\n /** HTML widgets only: the in-flight header title draft. */\n TitleDraft: string;\n /** Markdown only: show the rendered preview instead of the source editor. */\n Preview: boolean;\n}\n\n/**\n * Starter document placed by the HTML-widget tool (user click-place) — a one-question\n * quiz that demos the `MJWhiteboard.submit` input bridge: the Submit button posts the\n * picked answer to the host, which surfaces it to the session agent as a context note.\n * (Hardcoded colors are fine here: this is an isolated sandboxed document — the app's\n * design tokens cannot reach inside the opaque-origin frame.)\n */\nexport const WHITEBOARD_WIDGET_STARTER_HTML = `<!doctype html>\n<html>\n<head>\n<style>\n body { font-family: system-ui, sans-serif; margin: 14px; color: #1f2937; }\n h3 { margin: 0 0 6px; }\n label { display: block; margin: 4px 0; }\n button { margin-top: 8px; padding: 5px 12px; border: 1px solid #cbd5e1; border-radius: 6px; background: #f1f5f9; cursor: pointer; }\n .hint { margin-top: 8px; color: #6b7280; font-size: 12px; }\n</style>\n</head>\n<body>\n<h3>Quick quiz</h3>\n<p>Which planet is closest to the sun?</p>\n<label><input type=\"radio\" name=\"q\" value=\"Mercury\"> Mercury</label>\n<label><input type=\"radio\" name=\"q\" value=\"Venus\"> Venus</label>\n<label><input type=\"radio\" name=\"q\" value=\"Mars\"> Mars</label>\n<button id=\"go\">Submit answer</button>\n<p class=\"hint\">Submitting sends your answer to the agent via MJWhiteboard.submit.</p>\n<script>\n document.getElementById('go').addEventListener('click', function () {\n var picked = document.querySelector('input[name=\"q\"]:checked');\n MJWhiteboard.submit({ question: 'closest planet to the sun', answer: picked ? picked.value : null });\n });\n</script>\n</body>\n</html>`;\n\n/** Starter markdown placed by the markdown-panel tool (user click-place). */\nconst STARTER_MARKDOWN = '## New note\\n\\n- point one';\n\n/** Zoom presets stepped by the zoom cluster (25%–200%, matching the mockup's range). */\nconst ZOOM_STEPS = [0.25, 0.5, 0.75, 0.9, 1, 1.25, 1.5, 2] as const;\nconst GRID_SIZE = 22;\n/** How long an agent-added item keeps its pop-in/flash class. */\nconst POP_IN_MS = 3200;\n\n/**\n * The LIVE WHITEBOARD canvas surface (`mj-realtime-whiteboard`): dotted-grid board with\n * pan/zoom, per-tool pointer interactions (select/move with ghost + handles, pan, smoothed\n * freehand pen, drag-create shapes, click-place stickies/text with inline edit, image paste,\n * item→item connectors with floating-point fallback, eraser, dismissible highlights),\n * ownership chips, agent pop-in flash and the input-driven agent presence cursor.\n *\n * All mutations go through the shared {@link WhiteboardState} engine — the same API the\n * agent's channel tools use — so undo/redo and the perception feed see one history.\n */\n@Component({\n standalone: true,\n selector: 'mj-realtime-whiteboard',\n imports: [CommonModule, MarkdownModule, CodeEditorModule, RealtimeWhiteboardPagesComponent, WhiteboardWidgetSrcdocPipe],\n templateUrl: './whiteboard-board.component.html',\n styleUrl: './whiteboard-board.component.css'\n})\nexport class RealtimeWhiteboardBoardComponent implements OnInit, OnDestroy, AfterViewChecked {\n /** Shared board state engine (owned by the integration layer, passed via the host). */\n @Input({ required: true }) State!: WhiteboardState;\n /** Display name of the session's agent (\"Sage\") — chips, highlight tags, presence label. */\n @Input() AgentName = 'Agent';\n /**\n * The host's tool roster, used HERE for one thing only: gating the canvas context menu's\n * \"add … here\" actions. The board does not own the active tool — the host does, and the host\n * enforces the roster on it. A standalone consumer binding this input gets the menu narrowed\n * and nothing else. `null` = all.\n */\n @Input() ToolRoster: WhiteboardToolRoster = null;\n /** Active tool (owned by the host; toolbar + keyboard drive it). */\n @Input()\n set Tool(value: WhiteboardTool) {\n if (value !== this._tool) {\n this._tool = value;\n this.CancelTransient();\n }\n }\n get Tool(): WhiteboardTool {\n return this._tool;\n }\n /** Selected pen ink color. */\n @Input() PenColor: string = WHITEBOARD_PEN_COLORS[0];\n /** Selected pen stroke width. */\n @Input() PenWidth = 4;\n /** Selected shape kind for drag-create. */\n @Input() ShapeKind: WhiteboardShapeItem['Shape'] = 'rect';\n /** Selected text font size for click-placed text (curated steps; 12 = CSS default). */\n @Input() TextSize = 12;\n /** Selected text font family for click-placed text. */\n @Input() TextFamily: WhiteboardFontFamily = 'sans';\n /** Selected text bold state for click-placed text (labels render bold by default). */\n @Input() TextBold = true;\n /** Selected text color for click-placed text (null = theme default). */\n @Input() TextColor: string | null = null;\n /** Agent presence cursor (pulsing ring + \"… is drawing\" label), driven by the host. */\n @Input() AgentPresence: WhiteboardAgentPresence | null = null;\n /**\n * Read-only mode (artifact viewer / session review): all mutating pointer interactions,\n * paste, and inline editing are disabled; pan + zoom remain available for navigation.\n */\n @Input() ReadOnly = false;\n\n /** Requests a tool switch decided by a board gesture (e.g. Esc → select). */\n @Output() ToolChangeRequest = new EventEmitter<WhiteboardTool>();\n /**\n * Cancelable BEFORE event: a sandboxed HTML widget called `MJWhiteboard.submit(data)`\n * and the payload passed validation (marker + tracked source window + size cap).\n * Handlers run synchronously — set `Cancel = true` on the args to drop the submission\n * ({@link WidgetSubmitted} then never fires).\n */\n @Output() WidgetSubmitting = new EventEmitter<WhiteboardWidgetSubmittingEventArgs>();\n /**\n * AFTER event: a validated widget submission was accepted (not canceled). Integration\n * layers forward this to their agent/automation runtime — e.g. MJ's realtime channel\n * plugin surfaces it to the live agent as a `[whiteboard]` context note.\n */\n @Output() WidgetSubmitted = new EventEmitter<WhiteboardWidgetSubmitEvent>();\n /**\n * AMBIENT widget telemetry: the injected recorder observed passive form activity\n * (clicks / changes / typing / focus) inside a sandboxed HTML widget — no widget-authored\n * script involved. The batch was validated (marker + tracked source + size cap + shape)\n * and pre-summarized into one compact human line. Integration layers forward it to their\n * agent runtime as low-priority background context (MJ's channel plugin throttles per\n * widget and frames it as a do-not-respond `[whiteboard]` note).\n */\n @Output() WidgetInteraction = new EventEmitter<WhiteboardWidgetInteractionEvent>();\n /**\n * Cancelable BEFORE event: an in-board editor commit (inline sticky/text/shape edit or\n * the markdown/HTML rich editor's Apply/Done) is about to write to the state engine.\n * Set `Cancel = true` synchronously to discard the commit; handlers may also rewrite\n * the args' `Content` / `Title`.\n */\n @Output() ContentApplying = new EventEmitter<WhiteboardContentApplyingEventArgs>();\n /** AFTER event: an editor commit applied to the state engine. */\n @Output() ContentApplied = new EventEmitter<WhiteboardContentAppliedEventArgs>();\n\n @ViewChild('canvas') private canvasRef?: ElementRef<HTMLDivElement>;\n /** The page strip — the context menu's \"Rename page\" routes to its inline editor. */\n @ViewChild(RealtimeWhiteboardPagesComponent) private pagesStrip?: RealtimeWhiteboardPagesComponent;\n\n // viewport\n public PanX = 0;\n public PanY = 0;\n public Zoom = 0.9;\n public MinimapOpen = false;\n\n // transient interaction state\n public Interaction: BoardInteraction | null = null;\n public PendingConnector: PendingConnector | null = null;\n public EditingID: string | null = null;\n /** The rich-content editor panel state (markdown / html items), or null when closed. */\n public RichEditor: RichEditorState | null = null;\n /** The open right-click context menu (canvas-relative position + model), or null. */\n public ContextMenu: {\n Left: number;\n Top: number;\n /** Board-coordinate click point — \"add … here\" placement target. */\n Point: WhiteboardPoint;\n /** Target item, or null for the empty-canvas / page-chip menus. */\n ItemID: string | null;\n /** Target page (a right-clicked page chip), or null for item/canvas menus. */\n PageID: string | null;\n Actions: WhiteboardContextMenuAction[];\n } | null = null;\n private editIsNew = false;\n private pendingFocus = false;\n private userStickyCount = 0;\n\n /** Agent items that just popped in (drive the .pop-in violet flash). */\n public PopInIDs = new Set<string>();\n private popInTimers: ReturnType<typeof setTimeout>[] = [];\n\n private _tool: WhiteboardTool = 'select';\n private changedSub?: Subscription;\n private cdr = inject(ChangeDetectorRef);\n\n // ── Precomputed render buckets ──────────────────────────────────────────────\n // `State.Items` allocates (Array.from + sort) on every access, and the four\n // template-bound getters below each used to call it and re-filter the whole\n // array — so a single change-detection pass on this high-interaction drag\n // surface re-sorted + re-scanned the item list 4×. We partition State.Items\n // into these four buckets ONCE whenever the items/state actually change\n // (initial load + every Changed$ emission, which covers adds/updates/removes\n // AND page switches), and the template binds to the plain array fields.\n private _boxItems: (WhiteboardStickyItem | WhiteboardShapeItem | WhiteboardTextItem | WhiteboardImageItem | WhiteboardMarkdownItem | WhiteboardHtmlItem)[] = [];\n private _inkItems: WhiteboardInkItem[] = [];\n private _connectorItems: WhiteboardConnectorItem[] = [];\n private _highlightItems: WhiteboardHighlightItem[] = [];\n\n /** Whether the single window 'message' listener (the widget input bridge) is attached. */\n private widgetMessageListenerAttached = false;\n\n ngOnInit(): void {\n this.changedSub = this.State.Changed$.subscribe((change) => {\n if (change.Op === 'add' && change.Author === 'agent') {\n this.PopInIDs.add(change.ItemID);\n this.popInTimers.push(setTimeout(() => {\n this.PopInIDs.delete(change.ItemID);\n this.cdr.markForCheck();\n }, POP_IN_MS));\n }\n // NOTE: HTML-widget srcdoc payloads need no invalidation here — the\n // `wbWidgetSrcdoc` pipe is view-scoped (rebuilt per mount, memoized per source),\n // so journal ops can neither leave a re-mounted frame a stale document nor\n // force-reload a still-mounted widget whose Html didn't change.\n // close the rich editor when its target item no longer exists (erased / undone)\n if (this.RichEditor && !this.State.GetItem(this.RichEditor.ItemID)) {\n this.RichEditor = null;\n }\n // close the context menu when its target item / page no longer exists\n if (this.ContextMenu?.ItemID && !this.State.GetItem(this.ContextMenu.ItemID)) {\n this.ContextMenu = null;\n }\n if (this.ContextMenu?.PageID && !this.State.FindPage(this.ContextMenu.PageID)) {\n this.ContextMenu = null;\n }\n this.recomputeRenderBuckets();\n this.syncWidgetMessageListener();\n this.cdr.markForCheck();\n });\n this.recomputeRenderBuckets();\n this.syncWidgetMessageListener();\n }\n\n /**\n * Partition `State.Items` (one Array.from + sort) into the four render buckets\n * the template binds to. Called on init and on every {@link WhiteboardState.Changed$}\n * emission — the engine emits there for adds/updates/removes and page switches, so\n * the buckets always reflect the active page's current items.\n */\n private recomputeRenderBuckets(): void {\n const box: (WhiteboardStickyItem | WhiteboardShapeItem | WhiteboardTextItem | WhiteboardImageItem | WhiteboardMarkdownItem | WhiteboardHtmlItem)[] = [];\n const ink: WhiteboardInkItem[] = [];\n const connectors: WhiteboardConnectorItem[] = [];\n const highlights: WhiteboardHighlightItem[] = [];\n for (const i of this.State.Items) {\n switch (i.Kind) {\n case 'sticky':\n case 'shape':\n case 'text':\n case 'image':\n case 'markdown':\n case 'html':\n box.push(i);\n break;\n case 'ink':\n ink.push(i);\n break;\n case 'connector':\n connectors.push(i);\n break;\n case 'highlight':\n highlights.push(i);\n break;\n }\n }\n this._boxItems = box;\n this._inkItems = ink;\n this._connectorItems = connectors;\n this._highlightItems = highlights;\n }\n\n ngOnDestroy(): void {\n this.changedSub?.unsubscribe();\n for (const t of this.popInTimers) {\n clearTimeout(t);\n }\n if (this.widgetMessageListenerAttached) {\n window.removeEventListener('message', this.onWindowMessage);\n this.widgetMessageListenerAttached = false;\n }\n }\n\n ngAfterViewChecked(): void {\n if (this.pendingFocus) {\n this.pendingFocus = false;\n const editor = this.canvasRef?.nativeElement.querySelector<HTMLElement>('.wb-edit');\n editor?.focus();\n }\n this.observeCanvasSize();\n }\n\n // ── Hidden-host layout recovery ─────────────────────────────────────────────\n //\n // The board is often CREATED inside a display:none tab pane (a review session's\n // Whiteboard tab, a collapsed surface panel): the canvas measures 0×0, so the\n // viewport-lazy culling computes everything as off-screen and the board renders\n // BLANK until some interaction forces a re-measure. A ResizeObserver watches for\n // the first REAL layout: it re-runs change detection (fixing the culling) and —\n // when the viewport is still untouched — frames the content via FitToContent so a\n // reviewed board opens centered instead of wherever pan (0,0) happens to land.\n\n /** Observer driving {@link onCanvasResize}; created once the canvas element exists. */\n private canvasResizeObserver: ResizeObserver | null = null;\n /** True once the canvas has had a real (non-zero) layout. */\n private hadRealLayout = false;\n /** True once the user pans/zooms — the auto-fit must never fight a chosen viewport. */\n private viewportTouched = false;\n\n /** Attaches the ResizeObserver exactly once (no-op where ResizeObserver is unavailable). */\n private observeCanvasSize(): void {\n const el = this.canvasRef?.nativeElement;\n if (!el || this.canvasResizeObserver || typeof ResizeObserver === 'undefined') {\n return;\n }\n this.canvasResizeObserver = new ResizeObserver(() => this.onCanvasResize());\n this.canvasResizeObserver.observe(el);\n this.onCanvasResize();\n }\n\n /** First non-zero layout: recompute culling and (if untouched) frame the content. */\n private onCanvasResize(): void {\n const el = this.canvasRef?.nativeElement;\n if (!el || el.clientWidth === 0 || el.clientHeight === 0 || this.hadRealLayout) {\n return;\n }\n this.hadRealLayout = true;\n if (!this.viewportTouched) {\n this.FitToContent();\n }\n this.cdr.markForCheck();\n }\n\n // ────────────────────────────────────────────── render-model getters\n\n // These four return precomputed buckets (see recomputeRenderBuckets); they are\n // refreshed only when the items/state change, not re-filtered every CD pass.\n public get BoxItems(): (WhiteboardStickyItem | WhiteboardShapeItem | WhiteboardTextItem | WhiteboardImageItem | WhiteboardMarkdownItem | WhiteboardHtmlItem)[] {\n return this._boxItems;\n }\n\n public get InkItems(): WhiteboardInkItem[] {\n return this._inkItems;\n }\n\n public get ConnectorItems(): WhiteboardConnectorItem[] {\n return this._connectorItems;\n }\n\n public get HighlightItems(): WhiteboardHighlightItem[] {\n return this._highlightItems;\n }\n\n public get ViewportTransform(): string {\n return `translate(${this.PanX}px, ${this.PanY}px) scale(${this.Zoom})`;\n }\n\n public get GridBackgroundSize(): string {\n const s = GRID_SIZE * this.Zoom;\n return `${s}px ${s}px`;\n }\n\n public get GridBackgroundPosition(): string {\n return `${this.PanX}px ${this.PanY}px`;\n }\n\n public get ZoomPercent(): number {\n return Math.round(this.Zoom * 100);\n }\n\n public get CursorClass(): string {\n switch (this.Tool) {\n case 'pan': return 'cur-pan';\n case 'pen': case 'shape': case 'connector': return 'cur-cross';\n case 'sticky': case 'image': case 'markdown': case 'html': return 'cur-copy';\n case 'text': return 'cur-text';\n case 'eraser': return 'cur-eraser';\n default: return '';\n }\n }\n\n public TrackItem(index: number, item: WhiteboardItem): string {\n return item.ID;\n }\n\n /**\n * Explicit wrap width for a text label (resize / tool w) — null lets the CSS max-width\n * wrap. Honors an in-flight RESIZE transient so the live preview tracks the handle drag\n * (a move transient is deliberately ignored: its W is the rough bounds ESTIMATE, and\n * stamping it inline would re-wrap an unsized label mid-drag).\n */\n public TextWrapWidth(item: WhiteboardItem): number | null {\n if (item.Kind !== 'text') {\n return null;\n }\n if (this.Interaction?.Type === 'resize' && this.Interaction.ItemID === item.ID) {\n return this.Interaction.CurBounds.W;\n }\n return item.W ?? null;\n }\n\n /** Left position of an item, honoring an in-flight move/resize transient. */\n public ItemX(item: WhiteboardItem): number {\n const t = this.transientBounds(item.ID);\n return t ? t.X : this.State.ItemBounds(item).X;\n }\n\n public ItemY(item: WhiteboardItem): number {\n const t = this.transientBounds(item.ID);\n return t ? t.Y : this.State.ItemBounds(item).Y;\n }\n\n public ItemW(item: WhiteboardItem): number | null {\n const t = this.transientBounds(item.ID);\n if (t) {\n return t.W;\n }\n if (item.Kind === 'shape' || item.Kind === 'highlight') {\n return item.W;\n }\n if (item.Kind === 'sticky') {\n return item.W ?? WHITEBOARD_DEFAULTS.StickyW;\n }\n if (item.Kind === 'image') {\n return item.W ?? WHITEBOARD_DEFAULTS.ImageW;\n }\n if (item.Kind === 'markdown' || item.Kind === 'html') {\n return item.W;\n }\n return null;\n }\n\n public ItemH(item: WhiteboardItem): number | null {\n const t = this.transientBounds(item.ID);\n if (t && (item.Kind === 'shape' || item.Kind === 'highlight' || item.Kind === 'html')) {\n return t.H;\n }\n if (item.Kind === 'shape' || item.Kind === 'highlight' || item.Kind === 'html') {\n return item.H;\n }\n return null;\n }\n\n /** A markdown panel's optional max height (its rendered height stays content-driven). */\n public MarkdownMaxHeight(item: WhiteboardMarkdownItem): number | null {\n return item.H ?? null;\n }\n\n /** Whether the item is part of the current (single OR multi) selection. */\n public IsSelected(item: WhiteboardItem): boolean {\n return this.State.IsItemSelected(item.ID);\n }\n\n /** Dragging visuals: the grabbed item, plus every other member during a GROUP drag. */\n public IsDragging(item: WhiteboardItem): boolean {\n const i = this.Interaction;\n if (i?.Type !== 'move' || !i.Moved) {\n return false;\n }\n return UUIDsEqual(i.ItemID, item.ID) || (i.Group && this.State.IsItemSelected(item.ID));\n }\n\n /**\n * 8 handles render on the selected, resizable item (gate: {@link IsResizableKind}) —\n * but only for a SINGLE selection; a multi-selection shows the outline treatment only.\n */\n public ShowHandles(item: WhiteboardItem): boolean {\n return this.IsSelected(item) && this.State.SelectedIDs.length === 1 && IsResizableKind(item.Kind);\n }\n\n public readonly Handles: ResizeHandle[] = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w'];\n\n /** The drag ghost rectangle (\"from here\") at the moved item's original bounds. */\n public get DragGhost(): WhiteboardBounds | null {\n return this.Interaction?.Type === 'move' && this.Interaction.Moved ? this.Interaction.OrigBounds : null;\n }\n\n /** Live shape-create preview rectangle. */\n public get ShapePreview(): WhiteboardBounds | null {\n if (this.Interaction?.Type !== 'shape') {\n return null;\n }\n const s = this.Interaction;\n return {\n X: Math.min(s.StartX, s.CurX),\n Y: Math.min(s.StartY, s.CurY),\n W: Math.abs(s.CurX - s.StartX),\n H: Math.abs(s.CurY - s.StartY)\n };\n }\n\n /** Live marquee (rubber-band) selection rectangle, or null when none is in flight. */\n public get MarqueeRect(): WhiteboardBounds | null {\n if (this.Interaction?.Type !== 'marquee') {\n return null;\n }\n const m = this.Interaction;\n const rect: WhiteboardBounds = {\n X: Math.min(m.StartX, m.CurX),\n Y: Math.min(m.StartY, m.CurY),\n W: Math.abs(m.CurX - m.StartX),\n H: Math.abs(m.CurY - m.StartY)\n };\n return rect.W >= 3 || rect.H >= 3 ? rect : null;\n }\n\n public StickyRotation(item: WhiteboardStickyItem): string {\n return `rotate(${item.Rotation ?? 0}deg)`;\n }\n\n public StickyTintClass(item: WhiteboardStickyItem): string {\n if (item.Author === 'agent') {\n return 'sticky--sage';\n }\n return item.Tint === 'amber-light' ? 'sticky--amber2' : 'sticky--amber';\n }\n\n public HighlightTag(item: WhiteboardHighlightItem): string {\n return item.Label || `${item.Author === 'agent' ? this.AgentName : 'You'} highlighted`;\n }\n\n // ────────────────────────────────────────────── text styling\n\n /** Family key → CSS font stack ('sans' = null so the board's default font cascades). */\n private static readonly fontStacks: Record<WhiteboardFontFamily, string | null> = {\n sans: null,\n serif: 'Georgia, \"Times New Roman\", serif',\n mono: 'var(--mj-font-mono, ui-monospace, \"SF Mono\", Menlo, monospace)'\n };\n\n /** Inline font-size for a styled text/sticky item (null = the kind's CSS default). */\n public ItemFontSize(item: WhiteboardStickyItem | WhiteboardTextItem): string | null {\n return item.FontSize != null ? `${item.FontSize}px` : null;\n }\n\n /** Inline font-family stack for a styled text/sticky item (null = inherit). */\n public ItemFontFamily(item: WhiteboardStickyItem | WhiteboardTextItem): string | null {\n return item.FontFamily ? RealtimeWhiteboardBoardComponent.fontStacks[item.FontFamily] : null;\n }\n\n /** Inline font-weight for a styled text/sticky item (null = the kind's CSS default). */\n public ItemFontWeight(item: WhiteboardStickyItem | WhiteboardTextItem): string | null {\n return item.FontWeight != null ? `${item.FontWeight}` : null;\n }\n\n /**\n * Inline color for a USER text label. Agent labels keep their violet authorship\n * treatment from CSS — `Color` never overrides it.\n */\n public ItemTextColor(item: WhiteboardTextItem): string | null {\n return item.Author === 'user' && item.Color ? item.Color : null;\n }\n\n /**\n * Apply a toolbar style pick to the selected text/sticky item (the \"restyle existing\"\n * path — the toolbar emits `StyleSelection`, the host routes it here). No-op when\n * nothing applicable is selected; color only applies to user text labels.\n */\n public ApplyTextStyleToSelection(style: WhiteboardTextStyleEvent): void {\n const id = this.State.SelectedID;\n const item = id ? this.State.GetItem(id) : undefined;\n if (!id || !item || (item.Kind !== 'sticky' && item.Kind !== 'text')) {\n return;\n }\n const patch: WhiteboardItemPatch = {};\n if (style.FontSize !== undefined) {\n patch.FontSize = style.FontSize;\n }\n if (style.FontFamily !== undefined) {\n patch.FontFamily = style.FontFamily;\n }\n if (style.Bold !== undefined) {\n patch.FontWeight = style.Bold ? 700 : 400;\n }\n if (style.Color !== undefined && item.Kind === 'text') {\n patch.Color = style.Color;\n }\n if (Object.keys(patch).length > 0) {\n this.State.UpdateItem(id, patch, 'user');\n }\n }\n\n // ────────────────────────────────────────────── svg path builders\n\n /** Smoothed freehand path (quadratic curves through segment midpoints). */\n public InkPath(points: WhiteboardPoint[]): string {\n if (points.length === 0) {\n return '';\n }\n if (points.length < 3) {\n const last = points[points.length - 1];\n return `M ${points[0].X} ${points[0].Y} L ${last.X} ${last.Y}`;\n }\n let d = `M ${points[0].X} ${points[0].Y}`;\n for (let i = 1; i < points.length - 1; i++) {\n const midX = (points[i].X + points[i + 1].X) / 2;\n const midY = (points[i].Y + points[i + 1].Y) / 2;\n d += ` Q ${points[i].X} ${points[i].Y} ${midX} ${midY}`;\n }\n const last = points[points.length - 1];\n d += ` L ${last.X} ${last.Y}`;\n return d;\n }\n\n /** Curved connector path between resolved (edge-clipped) endpoints. */\n public ConnectorPath(conn: WhiteboardConnectorItem): string {\n const { from, to } = this.connectorEndpoints(conn);\n return this.curveBetween(from, to);\n }\n\n /** Two short arrowhead strokes at the connector's target end. */\n public ConnectorArrow(conn: WhiteboardConnectorItem): string {\n const { from, to } = this.connectorEndpoints(conn);\n return this.arrowAt(from, to);\n }\n\n public get PendingConnectorPath(): string {\n if (!this.PendingConnector) {\n return '';\n }\n const from = this.pendingFromPoint();\n return this.curveBetween(from, { X: this.PendingConnector.CurX, Y: this.PendingConnector.CurY });\n }\n\n public get LivePenPath(): string {\n return this.Interaction?.Type === 'pen' ? this.InkPath(this.Interaction.Points) : '';\n }\n\n private connectorEndpoints(conn: WhiteboardConnectorItem): { from: WhiteboardPoint; to: WhiteboardPoint } {\n let from = this.State.ResolveEndpoint(conn, 'from');\n let to = this.State.ResolveEndpoint(conn, 'to');\n // clip anchored endpoints to the referenced item's bounds edge\n const fromItem = conn.FromItemID ? this.State.GetItem(conn.FromItemID) : undefined;\n const toItem = conn.ToItemID ? this.State.GetItem(conn.ToItemID) : undefined;\n if (fromItem) {\n from = this.edgePoint(this.State.ItemBounds(fromItem), to);\n }\n if (toItem) {\n to = this.edgePoint(this.State.ItemBounds(toItem), from);\n }\n return { from, to };\n }\n\n /** Intersect the segment bounds-center → towards with the bounds rectangle edge. */\n private edgePoint(b: WhiteboardBounds, towards: WhiteboardPoint): WhiteboardPoint {\n const cx = b.X + b.W / 2;\n const cy = b.Y + b.H / 2;\n const dx = towards.X - cx;\n const dy = towards.Y - cy;\n if (dx === 0 && dy === 0) {\n return { X: cx, Y: cy };\n }\n const sx = dx !== 0 ? (b.W / 2) / Math.abs(dx) : Infinity;\n const sy = dy !== 0 ? (b.H / 2) / Math.abs(dy) : Infinity;\n const s = Math.min(sx, sy);\n return { X: cx + dx * s, Y: cy + dy * s };\n }\n\n private curveBetween(from: WhiteboardPoint, to: WhiteboardPoint): string {\n const dx = to.X - from.X;\n const dy = to.Y - from.Y;\n if (Math.abs(dy) >= Math.abs(dx)) {\n // vertical bias (matches the mockup's email→webinar curve)\n return `M ${from.X} ${from.Y} C ${from.X + dx * 0.08} ${from.Y + dy * 0.45}, ${to.X - dx * 0.08} ${to.Y - dy * 0.45}, ${to.X} ${to.Y}`;\n }\n return `M ${from.X} ${from.Y} C ${from.X + dx * 0.45} ${from.Y + dy * 0.08}, ${to.X - dx * 0.45} ${to.Y - dy * 0.08}, ${to.X} ${to.Y}`;\n }\n\n private arrowAt(from: WhiteboardPoint, to: WhiteboardPoint): string {\n const angle = Math.atan2(to.Y - from.Y, to.X - from.X);\n const len = 13;\n const spread = 0.46; // ~26°\n const a1 = angle + Math.PI - spread;\n const a2 = angle + Math.PI + spread;\n const p1 = { X: to.X + Math.cos(a1) * len, Y: to.Y + Math.sin(a1) * len };\n const p2 = { X: to.X + Math.cos(a2) * len, Y: to.Y + Math.sin(a2) * len };\n return `M ${to.X} ${to.Y} L ${p1.X.toFixed(1)} ${p1.Y.toFixed(1)} M ${to.X} ${to.Y} L ${p2.X.toFixed(1)} ${p2.Y.toFixed(1)}`;\n }\n\n // ────────────────────────────────────────────── pointer interactions\n\n public OnCanvasPointerDown(event: PointerEvent): void {\n if (event.button !== 0) {\n return;\n }\n if (this.ReadOnly) {\n // Pan stays available for read navigation; every other tool is inert.\n if (this.Tool === 'pan') {\n this.Interaction = { Type: 'pan', StartClientX: event.clientX, StartClientY: event.clientY, OrigPanX: this.PanX, OrigPanY: this.PanY };\n }\n return;\n }\n this.canvasRef?.nativeElement.focus();\n const p = this.toBoard(event);\n switch (this.Tool) {\n case 'select':\n // marquee (rubber-band) selection starts on empty canvas; a tiny drag (a plain\n // click) clears the selection at pointerup unless shift is held (additive)\n this.Interaction = { Type: 'marquee', StartX: p.X, StartY: p.Y, CurX: p.X, CurY: p.Y, Additive: event.shiftKey };\n break;\n case 'pan':\n this.Interaction = { Type: 'pan', StartClientX: event.clientX, StartClientY: event.clientY, OrigPanX: this.PanX, OrigPanY: this.PanY };\n break;\n case 'pen':\n this.Interaction = { Type: 'pen', Points: [p] };\n break;\n case 'shape':\n this.Interaction = { Type: 'shape', StartX: p.X, StartY: p.Y, CurX: p.X, CurY: p.Y };\n break;\n case 'sticky':\n this.placeSticky(p);\n break;\n case 'text':\n this.placeText(p);\n break;\n case 'markdown':\n this.placeMarkdown(p);\n break;\n case 'html':\n this.placeHtml(p);\n break;\n case 'image':\n this.placeImage(p, 'pasted-image.png', null);\n break;\n case 'connector':\n this.connectorClick(null, p);\n break;\n case 'eraser':\n break;\n }\n }\n\n public OnItemPointerDown(event: PointerEvent, item: WhiteboardItem): void {\n if (this.ReadOnly) {\n return;\n }\n if (event.button !== 0) {\n return;\n }\n if (UUIDsEqual(this.EditingID, item.ID)) {\n event.stopPropagation();\n return;\n }\n switch (this.Tool) {\n case 'select': {\n event.stopPropagation();\n if (event.shiftKey) {\n // shift-click toggles membership in the multi-selection (no drag from it)\n this.State.ToggleSelect(item.ID);\n break;\n }\n // pointerdown on an already multi-selected item keeps the selection and drags\n // the whole GROUP; a click without movement collapses to that item at pointerup\n const group = this.State.IsItemSelected(item.ID) && this.State.SelectedIDs.length > 1;\n if (!group) {\n this.State.Select(item.ID);\n }\n const p = this.toBoard(event);\n const bounds = this.State.ItemBounds(item);\n this.Interaction = { Type: 'move', ItemID: item.ID, StartX: p.X, StartY: p.Y, OrigBounds: bounds, DX: 0, DY: 0, Moved: false, Group: group };\n break;\n }\n case 'eraser':\n event.stopPropagation();\n this.State.RemoveItem(item.ID, 'user');\n break;\n case 'connector': {\n event.stopPropagation();\n this.connectorClick(item.ID, this.toBoard(event));\n break;\n }\n default:\n // pen / shape / sticky / text / image gestures begin on the canvas — let it bubble\n break;\n }\n }\n\n public OnHandlePointerDown(event: PointerEvent, item: WhiteboardItem, handle: ResizeHandle): void {\n if (this.ReadOnly) {\n return;\n }\n if (event.button !== 0 || this.Tool !== 'select') {\n return;\n }\n event.stopPropagation();\n const p = this.toBoard(event);\n const bounds = this.State.ItemBounds(item);\n this.Interaction = { Type: 'resize', ItemID: item.ID, Handle: handle, StartX: p.X, StartY: p.Y, OrigBounds: bounds, CurBounds: { ...bounds } };\n }\n\n /** Click on a highlight region dismisses it (mockup: \"click dismisses\"). */\n public OnHighlightClick(event: MouseEvent, item: WhiteboardHighlightItem): void {\n event.stopPropagation();\n this.State.RemoveItem(item.ID, 'user');\n }\n\n @HostListener('window:pointermove', ['$event'])\n public OnWindowPointerMove(event: PointerEvent): void {\n if (!this.Interaction && !this.PendingConnector) {\n return;\n }\n const p = this.toBoard(event);\n if (this.PendingConnector) {\n this.PendingConnector.CurX = p.X;\n this.PendingConnector.CurY = p.Y;\n }\n const i = this.Interaction;\n if (!i) {\n return;\n }\n switch (i.Type) {\n case 'move': {\n i.DX = p.X - i.StartX;\n i.DY = p.Y - i.StartY;\n if (!i.Moved && Math.hypot(i.DX, i.DY) > 3) {\n i.Moved = true;\n }\n break;\n }\n case 'resize':\n i.CurBounds = this.resizeBounds(i.OrigBounds, i.Handle, p.X - i.StartX, p.Y - i.StartY);\n break;\n case 'pen': {\n const last = i.Points[i.Points.length - 1];\n if (Math.hypot(p.X - last.X, p.Y - last.Y) > 2.2) {\n i.Points.push(p);\n }\n break;\n }\n case 'shape':\n i.CurX = p.X;\n i.CurY = p.Y;\n break;\n case 'marquee':\n i.CurX = p.X;\n i.CurY = p.Y;\n break;\n case 'pan':\n this.viewportTouched = true; // a chosen viewport — the first-layout auto-fit must not fight it\n this.PanX = i.OrigPanX + (event.clientX - i.StartClientX);\n this.PanY = i.OrigPanY + (event.clientY - i.StartClientY);\n break;\n }\n }\n\n @HostListener('window:pointerup')\n public OnWindowPointerUp(): void {\n const i = this.Interaction;\n if (!i) {\n return;\n }\n this.Interaction = null;\n switch (i.Type) {\n case 'move':\n if (i.Moved) {\n if (i.Group) {\n // group drag: every selected item moves by the same delta — ONE undo step\n this.State.MoveSelectedBy(i.DX, i.DY, 'user');\n }\n else {\n this.State.MoveItem(i.ItemID, i.OrigBounds.X + i.DX, i.OrigBounds.Y + i.DY, 'user');\n }\n }\n else if (i.Group) {\n // click (no drag) on a multi-selected item collapses the selection to it\n this.State.Select(i.ItemID);\n }\n break;\n case 'marquee': {\n const rect: WhiteboardBounds = {\n X: Math.min(i.StartX, i.CurX),\n Y: Math.min(i.StartY, i.CurY),\n W: Math.abs(i.CurX - i.StartX),\n H: Math.abs(i.CurY - i.StartY)\n };\n if (rect.W < 3 && rect.H < 3) {\n // a plain click on empty canvas clears the selection (shift-click keeps it)\n if (!i.Additive) {\n this.State.Select(null);\n }\n break;\n }\n const hits = this.State.ItemsIntersecting(rect).map((it) => it.ID);\n this.State.SelectMany(i.Additive ? [...this.State.SelectedIDs, ...hits] : hits);\n break;\n }\n case 'resize': {\n const item = this.State.GetItem(i.ItemID);\n // per-kind commit: full-box kinds take X/Y/W/H; content-driven-height kinds\n // (sticky/text/image/markdown) take X/Y/W only — see BuildResizeCommitPatch.\n const patch = item ? BuildResizeCommitPatch(item.Kind, i.CurBounds) : null;\n if (patch) {\n this.State.UpdateItem(i.ItemID, patch, 'user');\n }\n break;\n }\n case 'pen':\n if (i.Points.length >= 2) {\n this.State.AddItem({ Kind: 'ink', Points: i.Points, Color: this.PenColor, StrokeWidth: this.PenWidth }, 'user');\n }\n break;\n case 'shape': {\n const r = {\n X: Math.min(i.StartX, i.CurX),\n Y: Math.min(i.StartY, i.CurY),\n W: Math.abs(i.CurX - i.StartX),\n H: Math.abs(i.CurY - i.StartY)\n };\n if (r.W >= 16 && r.H >= 16) {\n const item = this.State.AddItem(\n { Kind: 'shape', Shape: this.ShapeKind, X: r.X, Y: r.Y, W: Math.max(r.W, 60), H: Math.max(r.H, WHITEBOARD_DEFAULTS.ShapeMinH), Label: '' }, 'user');\n if (item) {\n this.State.Select(item.ID);\n this.beginEdit(item.ID, true);\n }\n }\n break;\n }\n case 'pan':\n break;\n }\n }\n\n public OnWheel(event: WheelEvent): void {\n event.preventDefault();\n if (event.ctrlKey || event.metaKey) {\n const factor = event.deltaY < 0 ? 1.1 : 1 / 1.1;\n this.zoomAt(this.clampZoom(this.Zoom * factor), event.clientX, event.clientY);\n }\n else {\n this.PanX -= event.deltaX;\n this.PanY -= event.deltaY;\n }\n }\n\n /** Paste an image from the clipboard onto the board (mockup: pasted-image card). */\n public OnPaste(event: ClipboardEvent): void {\n if (this.ReadOnly) {\n return;\n }\n const files = event.clipboardData?.files;\n if (!files || files.length === 0) {\n return;\n }\n for (let n = 0; n < files.length; n++) {\n const file = files[n];\n if (file.type.startsWith('image/')) {\n event.preventDefault();\n const center = this.viewportCenter();\n this.placeImage({ X: center.X - WHITEBOARD_DEFAULTS.ImageW / 2, Y: center.Y - WHITEBOARD_DEFAULTS.ImageH / 2 },\n file.name || 'pasted-image.png', URL.createObjectURL(file));\n return;\n }\n }\n }\n\n // ────────────────────────────────────────────── inline editing\n\n public BeginItemEdit(event: Event, item: WhiteboardItem): void {\n if (item.Kind !== 'sticky' && item.Kind !== 'text' && item.Kind !== 'shape') {\n return;\n }\n event.stopPropagation();\n this.beginEdit(item.ID, false);\n }\n\n /**\n * Commit the inline editor's value to the edited sticky / text / shape item. Routes\n * through the {@link ContentApplying} (cancelable) / {@link ContentApplied} event pair;\n * an empty commit on a JUST-PLACED sticky/text abandons the placement instead (the item\n * is removed — that path raises the engine's remove events, not the content pair).\n */\n public CommitEdit(value: string): void {\n const id = this.EditingID;\n if (!id) {\n return;\n }\n this.EditingID = null;\n const item = this.State.GetItem(id);\n if (!item) {\n return;\n }\n const text = value.trim();\n if (text.length === 0 && this.editIsNew && (item.Kind === 'sticky' || item.Kind === 'text')) {\n this.State.RemoveItem(id, 'user'); // abandoned placement\n return;\n }\n if (item.Kind === 'shape') {\n this.applyContent(id, 'shape', text);\n }\n else if (item.Kind === 'sticky' || item.Kind === 'text') {\n this.applyContent(id, item.Kind, text);\n }\n this.editIsNew = false;\n }\n\n /**\n * Run one editor commit through the {@link ContentApplying} / {@link ContentApplied}\n * pair: raise the cancelable BEFORE event, apply the (possibly handler-edited) content\n * via the state engine when not canceled, and raise the AFTER event when the engine\n * applied it (an engine-level `ItemUpdating$` veto also suppresses the AFTER event).\n */\n private applyContent(itemId: string, kind: WhiteboardEditableContentKind, content: string, title?: string): void {\n const applying: WhiteboardContentApplyingEventArgs = { ItemID: itemId, Kind: kind, Content: content, Title: title, Cancel: false };\n this.ContentApplying.emit(applying);\n if (applying.Cancel) {\n return;\n }\n let patch: WhiteboardItemPatch;\n switch (kind) {\n case 'shape': patch = { Label: applying.Content }; break;\n case 'markdown': patch = { Markdown: applying.Content }; break;\n case 'html': patch = { Html: applying.Content, Title: applying.Title }; break;\n default: patch = { Text: applying.Content }; break; // sticky / text\n }\n if (this.State.UpdateItem(itemId, patch, 'user')) {\n this.ContentApplied.emit({ ItemID: itemId, Kind: kind, Content: applying.Content, Title: applying.Title });\n }\n }\n\n public OnEditKeydown(event: KeyboardEvent, value: string): void {\n event.stopPropagation();\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n this.CommitEdit(value);\n }\n else if (event.key === 'Escape') {\n event.preventDefault();\n this.CommitEdit(value);\n }\n }\n\n // ────────────────────────────────────────────── rich widgets (markdown / html)\n // The sandboxed iframe's `srcdoc` is produced by the view-scoped `wbWidgetSrcdoc`\n // pipe (see whiteboard-srcdoc.pipe.ts for the per-mount lifecycle contract and the\n // full security rationale for bypassing Angular's sanitizer into the sandbox).\n\n // ────────────────────────────────────────────── widget input bridge (MJWhiteboard.submit)\n\n /** Attach/detach the SINGLE window 'message' listener so it only runs while widgets exist. */\n private syncWidgetMessageListener(): void {\n const hasWidgets = this.State.Items.some((i) => i.Kind === 'html');\n if (hasWidgets && !this.widgetMessageListenerAttached) {\n window.addEventListener('message', this.onWindowMessage);\n this.widgetMessageListenerAttached = true;\n }\n else if (!hasWidgets && this.widgetMessageListenerAttached) {\n window.removeEventListener('message', this.onWindowMessage);\n this.widgetMessageListenerAttached = false;\n }\n }\n\n /**\n * The widget input bridge's host-side listener. The sandboxed frames have OPAQUE\n * origins (their helper posts with `'*'`), so validation happens HERE: the payload\n * must carry the bridge marker AND `event.source` must be the contentWindow of one of\n * this board's tracked widget iframes — anything else is dropped. Accepted payloads\n * are JSON-capped and surfaced through the {@link WidgetSubmitting} (cancelable) /\n * {@link WidgetSubmitted} event pair.\n */\n private onWindowMessage = (event: MessageEvent): void => {\n const widget = this.resolveWidgetFromSource(event.source);\n const outcome = EvaluateWidgetSubmitMessage(event.data, widget);\n if (outcome.Kind === 'submit') {\n const submitting: WhiteboardWidgetSubmittingEventArgs = { Event: outcome.Event, Cancel: false };\n this.WidgetSubmitting.emit(submitting);\n if (!submitting.Cancel) {\n this.WidgetSubmitted.emit(outcome.Event);\n }\n this.cdr.markForCheck();\n return;\n }\n if (outcome.Reason === 'oversize') {\n console.warn(`Whiteboard widget submit dropped: payload exceeds ${WHITEBOARD_WIDGET_SUBMIT_MAX_CHARS} chars.`);\n }\n else if (outcome.Reason === 'unknown-source') {\n console.warn('Whiteboard widget submit dropped: message source is not a tracked widget frame.');\n }\n else {\n // 'not-submit' — may be the injected recorder's AMBIENT interaction batch instead.\n this.handleInteractionMessage(event.data, widget);\n }\n };\n\n /**\n * Second leg of the message listener: evaluate a non-submit message against the ambient\n * interaction contract and surface accepted batches through {@link WidgetInteraction}.\n * `'not-interaction'` is unrelated postMessage traffic — ignored silently, like the\n * submit path's `'not-submit'`.\n */\n private handleInteractionMessage(messageData: unknown, widget: { ItemID: string; Title?: string } | null): void {\n const outcome = EvaluateWidgetInteractionMessage(messageData, widget);\n if (outcome.Kind === 'interaction') {\n this.WidgetInteraction.emit(outcome.Event);\n this.cdr.markForCheck();\n return;\n }\n if (outcome.Reason === 'oversize') {\n console.warn(`Whiteboard widget interaction dropped: batch exceeds ${WHITEBOARD_WIDGET_INTERACTION_MAX_CHARS} chars.`);\n }\n else if (outcome.Reason === 'unknown-source') {\n console.warn('Whiteboard widget interaction dropped: message source is not a tracked widget frame.');\n }\n else if (outcome.Reason === 'bad-shape') {\n console.warn('Whiteboard widget interaction dropped: events batch is malformed.');\n }\n }\n\n /** Resolve a message `event.source` to the tracked widget iframe (window → item) it belongs to. */\n private resolveWidgetFromSource(source: MessageEventSource | null): { ItemID: string; Title?: string } | null {\n if (!source) {\n return null;\n }\n const frames = this.canvasRef?.nativeElement.querySelectorAll<HTMLIFrameElement>('iframe.html-card__frame[data-item-id]');\n if (!frames) {\n return null;\n }\n for (const frame of Array.from(frames)) {\n if (frame.contentWindow === source) {\n const id = frame.dataset['itemId'];\n const item = id ? this.State.GetItem(id) : undefined;\n if (item && item.Kind === 'html') {\n return { ItemID: item.ID, Title: item.Title };\n }\n }\n }\n return null;\n }\n\n /**\n * Cheap \"on-screen-ish\" check that gates iframe instantiation for HTML widgets: only\n * widgets within (or near) the current viewport get a live sandboxed frame; the rest\n * render a static placeholder until panned/zoomed into view. Re-entering view re-creates\n * the frame (any internal widget state resets — acceptable for board decorations).\n */\n public IsNearViewport(item: WhiteboardItem): boolean {\n const el = this.canvasRef?.nativeElement;\n if (!el || el.clientWidth === 0 || el.clientHeight === 0) {\n // Before the first layout — or while the host pane is display:none (an\n // unfocused tab) — there is no real viewport to cull against: render rather\n // than blank out (culling resumes on the first real layout).\n return true;\n }\n const margin = 320;\n const b = this.State.ItemBounds(item);\n const vx = -this.PanX / this.Zoom;\n const vy = -this.PanY / this.Zoom;\n const vw = el.clientWidth / this.Zoom;\n const vh = el.clientHeight / this.Zoom;\n return b.X < vx + vw + margin && b.X + b.W > vx - margin\n && b.Y < vy + vh + margin && b.Y + b.H > vy - margin;\n }\n\n /** Header title for an HTML widget. */\n public HtmlTitle(item: WhiteboardHtmlItem): string {\n return item.Title || 'HTML widget';\n }\n\n /** Open the rich editor for a markdown panel / HTML widget (dblclick or header edit). */\n public BeginRichEdit(event: Event, item: WhiteboardItem): void {\n if (this.ReadOnly || (item.Kind !== 'markdown' && item.Kind !== 'html')) {\n return;\n }\n event.stopPropagation();\n this.openRichEditor(item);\n }\n\n /** Delete affordance on the HTML widget header (the user removing their own widget). */\n public RemoveItemClick(event: Event, item: WhiteboardItem): void {\n if (this.ReadOnly) {\n return;\n }\n event.stopPropagation();\n this.State.RemoveItem(item.ID, 'user');\n }\n\n /** Markdown editor: flip between the source editor and the rendered preview. */\n public RichEditorSetPreview(preview: boolean): void {\n if (this.RichEditor) {\n this.RichEditor.Preview = preview;\n }\n }\n\n public OnRichEditorDraftChange(value: string): void {\n if (this.RichEditor) {\n this.RichEditor.Draft = value;\n }\n }\n\n public OnRichEditorTitleChange(value: string): void {\n if (this.RichEditor) {\n this.RichEditor.TitleDraft = value;\n }\n }\n\n /**\n * Commit the draft to the item (ONE update = one undo step) and keep the panel open.\n * Routes through the {@link ContentApplying} (cancelable) / {@link ContentApplied} pair.\n */\n public RichEditorApply(): void {\n const editor = this.RichEditor;\n if (!editor || !this.State.GetItem(editor.ItemID)) {\n return;\n }\n if (editor.Kind === 'markdown') {\n this.applyContent(editor.ItemID, 'markdown', editor.Draft);\n }\n else {\n // empty title clears the header label (UpdateItem skips undefined, so pass '' to clear)\n this.applyContent(editor.ItemID, 'html', editor.Draft, editor.TitleDraft.trim());\n }\n }\n\n /** Commit the draft and close the editor panel. */\n public RichEditorDone(): void {\n this.RichEditorApply();\n this.RichEditor = null;\n }\n\n /** Close the editor, discarding any uncommitted draft changes. */\n public RichEditorCancel(): void {\n this.RichEditor = null;\n }\n\n /** Esc inside the editor panel closes it; keys must not leak to the board shortcuts. */\n public OnRichEditorKeydown(event: KeyboardEvent): void {\n event.stopPropagation();\n if (event.key === 'Escape') {\n event.preventDefault();\n this.RichEditorCancel();\n }\n }\n\n private openRichEditor(item: WhiteboardMarkdownItem | WhiteboardHtmlItem): void {\n this.RichEditor = item.Kind === 'markdown'\n ? { ItemID: item.ID, Kind: 'markdown', Draft: item.Markdown, TitleDraft: '', Preview: false }\n : { ItemID: item.ID, Kind: 'html', Draft: item.Html, TitleDraft: item.Title ?? '', Preview: false };\n }\n\n // ────────────────────────────────────────────── context menu (right-click)\n\n /** Right-click on empty canvas → the \"add … here\" menu (suppresses the native menu). */\n public OnCanvasContextMenu(event: MouseEvent): void {\n if (this.ReadOnly) {\n return; // no board menu in read-only — the native browser menu stays available\n }\n event.preventDefault();\n this.openContextMenu(event, null);\n }\n\n /** Right-click on a board item → the item action menu (selects the item first). */\n public OnItemContextMenu(event: MouseEvent, item: WhiteboardItem): void {\n if (this.ReadOnly) {\n return;\n }\n event.preventDefault();\n event.stopPropagation();\n if (item.Kind !== 'highlight') {\n this.State.Select(item.ID);\n }\n this.openContextMenu(event, item);\n }\n\n /** Dispatch one picked context-menu action, then close the menu. */\n public OnContextMenuAction(actionId: WhiteboardContextMenuActionID): void {\n const menu = this.ContextMenu;\n this.ContextMenu = null;\n if (!menu) {\n return;\n }\n const item = menu.ItemID ? this.State.GetItem(menu.ItemID) : undefined;\n switch (actionId) {\n case 'edit':\n // same paths as dblclick: inline edit for sticky/text/shape, rich editor for md/html\n if (item && (item.Kind === 'sticky' || item.Kind === 'text' || item.Kind === 'shape')) {\n this.State.Select(item.ID);\n this.beginEdit(item.ID, false);\n }\n else if (item && (item.Kind === 'markdown' || item.Kind === 'html')) {\n this.openRichEditor(item);\n }\n break;\n case 'restyle':\n // open the toolbar's text-style flyout with the item selected — style picks\n // restyle the selection through the existing StyleSelection path\n if (item) {\n this.State.Select(item.ID);\n this.ToolChangeRequest.emit('text');\n }\n break;\n case 'duplicate':\n if (item) {\n const copy = this.State.DuplicateItem(item.ID, 'user');\n if (copy) {\n this.State.Select(copy.ID);\n }\n }\n break;\n case 'bring-front':\n if (item) {\n this.State.BringToFront(item.ID, 'user');\n }\n break;\n case 'send-back':\n if (item) {\n this.State.SendToBack(item.ID, 'user');\n }\n break;\n case 'delete':\n if (item) {\n this.State.RemoveItem(item.ID, 'user');\n }\n break;\n case 'add-sticky':\n this.placeSticky(menu.Point);\n break;\n case 'add-text':\n this.placeText(menu.Point);\n break;\n case 'add-markdown':\n this.placeMarkdown(menu.Point);\n break;\n case 'add-html':\n this.placeHtml(menu.Point);\n break;\n case 'add-page':\n // same path as the strip's \"+\" — an auto-named page the engine switches to\n this.State.AddPage(undefined, 'user');\n break;\n case 'page-rename':\n if (menu.PageID) {\n this.pagesStrip?.BeginRename(menu.PageID);\n }\n break;\n case 'page-delete':\n if (menu.PageID) {\n this.State.RemovePage(menu.PageID, 'user'); // engine guards the last page\n }\n break;\n }\n }\n\n /** Click-away closes the menu (the menu root stops pointerdown propagation for itself). */\n @HostListener('document:pointerdown')\n public CloseContextMenu(): void {\n if (this.ContextMenu) {\n this.ContextMenu = null;\n }\n }\n\n /**\n * Right-click on a PAGE CHIP in the page strip (forwarded by the strip's\n * `ChipContextMenu` output) → the page action menu: Rename (routes back into the\n * strip's inline-rename editor) and Delete (offered only when more than one page\n * exists — the engine's last-page guard). Never opens in ReadOnly.\n */\n public OnPageChipContextMenu(payload: WhiteboardPageChipContextMenuEvent): void {\n if (this.ReadOnly) {\n return;\n }\n const actions = BuildWhiteboardPageContextMenu(payload.Page, {\n CanDelete: this.State.Pages.length > 1,\n ReadOnly: this.ReadOnly\n });\n if (actions.length === 0) {\n return;\n }\n this.showContextMenu(payload.Event, actions, null, payload.Page.ID);\n }\n\n private openContextMenu(event: MouseEvent, item: WhiteboardItem | null): void {\n this.showContextMenu(event, BuildWhiteboardContextMenu(item, this.ToolRoster), item ? item.ID : null, null);\n }\n\n /** Position + open the shared context-menu panel for any target (item / canvas / page chip). */\n private showContextMenu(event: MouseEvent, actions: WhiteboardContextMenuAction[], itemId: string | null, pageId: string | null): void {\n const el = this.canvasRef?.nativeElement;\n const rect = el ? el.getBoundingClientRect() : { left: 0, top: 0, width: 0, height: 0 };\n // keep the menu inside the canvas (estimate: ~200px wide, ~31px per row + padding)\n const menuW = 200;\n const menuH = actions.length * 31 + 12;\n const left = Math.max(4, Math.min(event.clientX - rect.left, Math.max(menuW, rect.width) - menuW));\n const top = Math.max(4, Math.min(event.clientY - rect.top, Math.max(menuH, rect.height) - menuH));\n this.ContextMenu = {\n Left: left,\n Top: top,\n Point: this.toBoard(event),\n ItemID: itemId,\n PageID: pageId,\n Actions: actions\n };\n }\n\n // ────────────────────────────────────────────── zoom / fit / minimap\n\n public ZoomIn(): void {\n const next = ZOOM_STEPS.find((z) => z > this.Zoom + 0.001);\n this.zoomCentered(next ?? ZOOM_STEPS[ZOOM_STEPS.length - 1]);\n }\n\n /**\n * Continuous zoom by a multiplicative factor at the viewport center — the\n * hold-to-zoom tick path (the zoom cluster emits ~3.5% factors every 50 ms while a\n * +/− button is held). Clamped to the same 25%–200% limits as the stepped zoom.\n */\n public ZoomByFactor(factor: number): void {\n if (!Number.isFinite(factor) || factor <= 0) {\n return;\n }\n this.zoomCentered(this.clampZoom(this.Zoom * factor));\n }\n\n public ZoomOut(): void {\n const lower = [...ZOOM_STEPS].reverse().find((z) => z < this.Zoom - 0.001);\n this.zoomCentered(lower ?? ZOOM_STEPS[0]);\n }\n\n /** Fit all content into the viewport (25%–200%, 60px padding). */\n public FitToContent(): void {\n const bounds = this.State.ContentBounds();\n const el = this.canvasRef?.nativeElement;\n if (!bounds || !el || bounds.W === 0 || bounds.H === 0 || el.clientWidth === 0 || el.clientHeight === 0) {\n return; // a hidden (0×0) host cannot be fit against — wait for a real layout\n }\n const pad = 60;\n const zoom = this.clampZoom(Math.min((el.clientWidth - pad * 2) / bounds.W, (el.clientHeight - pad * 2) / bounds.H));\n this.Zoom = zoom;\n this.PanX = (el.clientWidth - bounds.W * zoom) / 2 - bounds.X * zoom;\n this.PanY = (el.clientHeight - bounds.H * zoom) / 2 - bounds.Y * zoom;\n }\n\n public ToggleMinimap(): void {\n this.MinimapOpen = !this.MinimapOpen;\n }\n\n /** Cancel any in-flight transient gesture (tool switch, Esc) — incl. the rich editor + context menu. */\n public CancelTransient(): void {\n this.Interaction = null;\n this.PendingConnector = null;\n this.RichEditor = null;\n this.ContextMenu = null;\n }\n\n // minimap render model\n public get MinimapViewBox(): string {\n const world = this.minimapWorld();\n return `${world.X} ${world.Y} ${world.W} ${world.H}`;\n }\n\n public get MinimapItems(): { X: number; Y: number; W: number; H: number; Agent: boolean }[] {\n return this.State.Items\n .filter((i) => i.Kind !== 'highlight')\n .map((i) => {\n const b = this.State.ItemBounds(i);\n return { X: b.X, Y: b.Y, W: Math.max(b.W, 8), H: Math.max(b.H, 8), Agent: i.Author === 'agent' };\n });\n }\n\n public get MinimapViewport(): WhiteboardBounds {\n const el = this.canvasRef?.nativeElement;\n const w = el ? el.clientWidth : 0;\n const h = el ? el.clientHeight : 0;\n return { X: -this.PanX / this.Zoom, Y: -this.PanY / this.Zoom, W: w / this.Zoom, H: h / this.Zoom };\n }\n\n private minimapWorld(): WhiteboardBounds {\n const content = this.State.ContentBounds();\n const vp = this.MinimapViewport;\n const minX = Math.min(content?.X ?? vp.X, vp.X) - 40;\n const minY = Math.min(content?.Y ?? vp.Y, vp.Y) - 40;\n const maxX = Math.max(content ? content.X + content.W : vp.X + vp.W, vp.X + vp.W) + 40;\n const maxY = Math.max(content ? content.Y + content.H : vp.Y + vp.H, vp.Y + vp.H) + 40;\n return { X: minX, Y: minY, W: Math.max(maxX - minX, 1), H: Math.max(maxY - minY, 1) };\n }\n\n // ────────────────────────────────────────────── internals\n\n private toBoard(event: { clientX: number; clientY: number }): WhiteboardPoint {\n const el = this.canvasRef?.nativeElement;\n const rect = el ? el.getBoundingClientRect() : { left: 0, top: 0 };\n return {\n X: (event.clientX - rect.left - this.PanX) / this.Zoom,\n Y: (event.clientY - rect.top - this.PanY) / this.Zoom\n };\n }\n\n private viewportCenter(): WhiteboardPoint {\n const el = this.canvasRef?.nativeElement;\n const w = el ? el.clientWidth : 0;\n const h = el ? el.clientHeight : 0;\n return { X: (w / 2 - this.PanX) / this.Zoom, Y: (h / 2 - this.PanY) / this.Zoom };\n }\n\n private clampZoom(z: number): number {\n return Math.min(2, Math.max(0.25, z));\n }\n\n private zoomCentered(next: number): void {\n this.viewportTouched = true; // user-driven zoom — disable the first-layout auto-fit\n const el = this.canvasRef?.nativeElement;\n if (!el) {\n this.Zoom = next;\n return;\n }\n const rect = el.getBoundingClientRect();\n this.zoomAt(next, rect.left + rect.width / 2, rect.top + rect.height / 2);\n }\n\n private zoomAt(next: number, clientX: number, clientY: number): void {\n const el = this.canvasRef?.nativeElement;\n if (!el) {\n this.Zoom = next;\n return;\n }\n const rect = el.getBoundingClientRect();\n const px = clientX - rect.left;\n const py = clientY - rect.top;\n const bx = (px - this.PanX) / this.Zoom;\n const by = (py - this.PanY) / this.Zoom;\n this.Zoom = next;\n this.PanX = px - bx * next;\n this.PanY = py - by * next;\n }\n\n private resizeBounds(orig: WhiteboardBounds, handle: ResizeHandle, dx: number, dy: number): WhiteboardBounds {\n let { X, Y, W, H } = orig;\n if (handle.includes('w')) {\n X = orig.X + dx;\n W = orig.W - dx;\n }\n if (handle.includes('e')) {\n W = orig.W + dx;\n }\n if (handle.includes('n')) {\n Y = orig.Y + dy;\n H = orig.H - dy;\n }\n if (handle.includes('s')) {\n H = orig.H + dy;\n }\n const minSize = 24;\n if (W < minSize) {\n if (handle.includes('w')) {\n X -= minSize - W;\n }\n W = minSize;\n }\n if (H < minSize) {\n if (handle.includes('n')) {\n Y -= minSize - H;\n }\n H = minSize;\n }\n return { X, Y, W, H };\n }\n\n private transientBounds(itemId: string): WhiteboardBounds | null {\n const i = this.Interaction;\n if (i?.Type === 'move' && i.Moved) {\n if (i.ItemID === itemId) {\n return { X: i.OrigBounds.X + i.DX, Y: i.OrigBounds.Y + i.DY, W: i.OrigBounds.W, H: i.OrigBounds.H };\n }\n // GROUP drag: every other selected member previews at the same live delta\n // (state is untouched mid-drag, so ItemBounds still reports the original spot)\n if (i.Group && this.State.IsItemSelected(itemId)) {\n const item = this.State.GetItem(itemId);\n if (item) {\n const b = this.State.ItemBounds(item);\n return { X: b.X + i.DX, Y: b.Y + i.DY, W: b.W, H: b.H };\n }\n }\n }\n if (i?.Type === 'resize' && i.ItemID === itemId) {\n return i.CurBounds;\n }\n return null;\n }\n\n private placeSticky(p: WhiteboardPoint): void {\n const tint = this.userStickyCount % 2 === 0 ? 'amber' : 'amber-light';\n const rotation = this.userStickyCount % 2 === 0 ? -1 : 0.8;\n this.userStickyCount++;\n const item = this.State.AddItem(\n { Kind: 'sticky', X: p.X - WHITEBOARD_DEFAULTS.StickyW / 2, Y: p.Y - 24, Text: '', Tint: tint, Rotation: rotation }, 'user');\n if (!item) {\n return; // canceled via ItemAdding\n }\n this.State.Select(item.ID);\n this.beginEdit(item.ID, true);\n }\n\n private placeText(p: WhiteboardPoint): void {\n // Stamp only non-default style choices so an untouched flyout keeps the default look\n // (and the compact perception payloads stay free of noise fields).\n const item = this.State.AddItem({\n Kind: 'text',\n X: p.X,\n Y: p.Y - 9,\n Text: '',\n FontSize: this.TextSize !== 12 ? this.TextSize : undefined,\n FontFamily: this.TextFamily !== 'sans' ? this.TextFamily : undefined,\n FontWeight: this.TextBold ? undefined : 400,\n Color: this.TextColor ?? undefined\n }, 'user');\n if (!item) {\n return; // canceled via ItemAdding\n }\n this.State.Select(item.ID);\n this.beginEdit(item.ID, true);\n }\n\n private placeImage(p: WhiteboardPoint, name: string, url: string | null): void {\n const item = this.State.AddItem({ Kind: 'image', X: p.X, Y: p.Y, Name: name, Url: url }, 'user');\n if (item) {\n this.State.Select(item.ID);\n }\n }\n\n /** Click-place a starter markdown panel and open its editor. */\n private placeMarkdown(p: WhiteboardPoint): void {\n const item = this.State.AddItem({\n Kind: 'markdown',\n X: p.X - WHITEBOARD_DEFAULTS.MarkdownW / 2,\n Y: p.Y - 20,\n W: WHITEBOARD_DEFAULTS.MarkdownW,\n Markdown: STARTER_MARKDOWN\n }, 'user') as WhiteboardMarkdownItem | null;\n if (!item) {\n return; // canceled via ItemAdding\n }\n this.State.Select(item.ID);\n this.openRichEditor(item);\n }\n\n /** Click-place a starter HTML widget (sandboxed) and open its editor. */\n private placeHtml(p: WhiteboardPoint): void {\n const item = this.State.AddItem({\n Kind: 'html',\n X: p.X - WHITEBOARD_DEFAULTS.HtmlW / 2,\n Y: p.Y - 20,\n W: WHITEBOARD_DEFAULTS.HtmlW,\n H: WHITEBOARD_DEFAULTS.HtmlH,\n Html: WHITEBOARD_WIDGET_STARTER_HTML,\n Title: 'New widget'\n }, 'user') as WhiteboardHtmlItem | null;\n if (!item) {\n return; // canceled via ItemAdding\n }\n this.State.Select(item.ID);\n this.openRichEditor(item);\n }\n\n private beginEdit(id: string, isNew: boolean): void {\n this.EditingID = id;\n this.editIsNew = isNew;\n this.pendingFocus = true;\n }\n\n private connectorClick(itemId: string | null, p: WhiteboardPoint): void {\n if (!this.PendingConnector) {\n this.PendingConnector = {\n FromItemID: itemId,\n FromPoint: itemId ? null : p,\n CurX: p.X,\n CurY: p.Y\n };\n return;\n }\n const pending = this.PendingConnector;\n this.PendingConnector = null;\n if (itemId && pending.FromItemID === itemId) {\n return; // self-connector — ignore\n }\n this.State.AddItem({\n Kind: 'connector',\n FromItemID: pending.FromItemID,\n ToItemID: itemId,\n FromPoint: pending.FromPoint,\n ToPoint: itemId ? null : p\n }, 'user');\n }\n\n private pendingFromPoint(): WhiteboardPoint {\n const pc = this.PendingConnector;\n if (!pc) {\n return { X: 0, Y: 0 };\n }\n if (pc.FromItemID) {\n const item = this.State.GetItem(pc.FromItemID);\n if (item) {\n const b = this.State.ItemBounds(item);\n return { X: b.X + b.W / 2, Y: b.Y + b.H / 2 };\n }\n }\n return pc.FromPoint ?? { X: 0, Y: 0 };\n }\n}\n","<div #canvas\n [class]=\"'board-canvas ' + CursorClass\"\n [class.is-panning]=\"Interaction?.Type === 'pan'\"\n [class.is-interacting]=\"Interaction !== null || PendingConnector !== null\"\n [style.backgroundSize]=\"GridBackgroundSize\"\n [style.backgroundPosition]=\"GridBackgroundPosition\"\n tabindex=\"0\"\n (pointerdown)=\"OnCanvasPointerDown($event)\"\n (contextmenu)=\"OnCanvasContextMenu($event)\"\n (wheel)=\"OnWheel($event)\"\n (paste)=\"OnPaste($event)\">\n\n <div class=\"board-viewport\" [style.transform]=\"ViewportTransform\">\n\n <!-- ink + connectors -->\n <svg class=\"ink-layer\">\n @for (ink of InkItems; track ink.ID) {\n <path [attr.d]=\"InkPath(ink.Points)\"\n [class.ink-sage]=\"ink.Author === 'agent'\"\n [class.wb-erasable]=\"Tool === 'eraser' || Tool === 'select'\"\n [class.wb-ink-selected]=\"IsSelected(ink)\"\n [attr.stroke]=\"ink.Author === 'agent' ? null : ink.Color\"\n [attr.stroke-width]=\"ink.StrokeWidth\"\n fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n (pointerdown)=\"OnItemPointerDown($event, ink)\"\n (contextmenu)=\"OnItemContextMenu($event, ink)\"/>\n }\n @for (conn of ConnectorItems; track conn.ID) {\n <g [class.conn-sage]=\"conn.Author === 'agent'\" [class.conn-user]=\"conn.Author === 'user'\">\n <path [attr.d]=\"ConnectorPath(conn)\"\n [class.draw-in]=\"PopInIDs.has(conn.ID)\"\n [class.wb-erasable]=\"Tool === 'eraser' || Tool === 'select'\"\n stroke-width=\"2.5\" fill=\"none\" stroke-linecap=\"round\"\n (pointerdown)=\"OnItemPointerDown($event, conn)\"\n (contextmenu)=\"OnItemContextMenu($event, conn)\"/>\n <path [attr.d]=\"ConnectorArrow(conn)\" stroke-width=\"2.5\" fill=\"none\" stroke-linecap=\"round\"/>\n </g>\n }\n <!-- live transients -->\n @if (LivePenPath) {\n <path class=\"wb-live-pen\" [attr.d]=\"LivePenPath\" [attr.stroke]=\"PenColor\" [attr.stroke-width]=\"PenWidth\"\n fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n }\n @if (PendingConnector) {\n <path class=\"wb-pending-conn\" [attr.d]=\"PendingConnectorPath\" stroke-width=\"2\" fill=\"none\" stroke-linecap=\"round\"/>\n }\n </svg>\n\n <!-- highlight regions (agent \"pointing without touching\"; click dismisses) -->\n @for (hl of HighlightItems; track hl.ID) {\n <div class=\"sage-highlight\"\n [class.user-highlight]=\"hl.Author === 'user'\"\n [style.left.px]=\"ItemX(hl)\" [style.top.px]=\"ItemY(hl)\"\n [style.width.px]=\"ItemW(hl)\" [style.height.px]=\"ItemH(hl)\"\n title=\"Click to dismiss\"\n (pointerdown)=\"OnHighlightClick($event, hl)\"\n (contextmenu)=\"OnItemContextMenu($event, hl)\">\n <span class=\"hl-tag\"><i class=\"fa-solid fa-highlighter\"></i> {{ HighlightTag(hl) }}</span>\n </div>\n }\n\n <!-- drag ghost (\"from here\") -->\n @if (DragGhost; as ghost) {\n <div class=\"drag-ghost\"\n [style.left.px]=\"ghost.X\" [style.top.px]=\"ghost.Y\"\n [style.width.px]=\"ghost.W\" [style.height.px]=\"ghost.H\"></div>\n }\n\n <!-- shape drag-create preview -->\n @if (ShapePreview; as preview) {\n <div class=\"shape-preview\"\n [style.left.px]=\"preview.X\" [style.top.px]=\"preview.Y\"\n [style.width.px]=\"preview.W\" [style.height.px]=\"preview.H\"></div>\n }\n\n <!-- marquee (rubber-band) multi-selection rectangle -->\n @if (MarqueeRect; as mq) {\n <div class=\"wb-marquee\"\n [style.left.px]=\"mq.X\" [style.top.px]=\"mq.Y\"\n [style.width.px]=\"mq.W\" [style.height.px]=\"mq.H\"></div>\n }\n\n <!-- board items -->\n @for (item of BoxItems; track item.ID) {\n @switch (item.Kind) {\n\n @case ('sticky') {\n <div [class]=\"'bi sticky ' + StickyTintClass(item)\"\n [class.selected]=\"IsSelected(item)\"\n [class.dragging]=\"IsDragging(item)\"\n [class.pop-in]=\"PopInIDs.has(item.ID)\"\n [style.left.px]=\"ItemX(item)\" [style.top.px]=\"ItemY(item)\"\n [style.width.px]=\"ItemW(item)\"\n [style.fontSize]=\"ItemFontSize(item)\"\n [style.fontFamily]=\"ItemFontFamily(item)\"\n [style.fontWeight]=\"ItemFontWeight(item)\"\n [style.transform]=\"IsDragging(item) ? '' : StickyRotation(item)\"\n (pointerdown)=\"OnItemPointerDown($event, item)\"\n (dblclick)=\"BeginItemEdit($event, item)\"\n (contextmenu)=\"OnItemContextMenu($event, item)\">\n @if (item.Author === 'agent') {\n <span class=\"author-chip author-chip--sage\"><i class=\"fa-solid fa-feather\"></i> {{ AgentName }}</span>\n } @else {\n <span class=\"author-chip author-chip--you\"><i class=\"fa-solid fa-user\"></i> You</span>\n }\n @if (EditingID === item.ID) {\n <textarea class=\"wb-edit\" rows=\"3\"\n [value]=\"item.Text\"\n (keydown)=\"OnEditKeydown($event, edit.value)\"\n (blur)=\"CommitEdit(edit.value)\"\n #edit></textarea>\n } @else {\n {{ item.Text }}\n }\n @if (ShowHandles(item) && !IsDragging(item)) {\n @for (h of Handles; track h) {\n <span [class]=\"'sel-h ' + h\" (pointerdown)=\"OnHandlePointerDown($event, item, h)\"></span>\n }\n }\n </div>\n }\n\n @case ('shape') {\n <div class=\"bi shape-box\"\n [class.shape-box--ellipse]=\"item.Shape === 'ellipse'\"\n [class.shape-box--diamond]=\"item.Shape === 'diamond'\"\n [class.shape-box--sage]=\"item.Author === 'agent'\"\n [class.selected]=\"IsSelected(item)\"\n [class.dragging]=\"IsDragging(item)\"\n [class.pop-in]=\"PopInIDs.has(item.ID)\"\n [style.left.px]=\"ItemX(item)\" [style.top.px]=\"ItemY(item)\"\n [style.width.px]=\"ItemW(item)\" [style.height.px]=\"ItemH(item)\"\n (pointerdown)=\"OnItemPointerDown($event, item)\"\n (dblclick)=\"BeginItemEdit($event, item)\"\n (contextmenu)=\"OnItemContextMenu($event, item)\">\n @if (item.Author === 'agent') {\n <span class=\"author-chip author-chip--sage\"><i class=\"fa-solid fa-feather\"></i> {{ AgentName }}</span>\n } @else {\n <span class=\"author-chip author-chip--you\"><i class=\"fa-solid fa-user\"></i> You</span>\n }\n @if (EditingID === item.ID) {\n <textarea class=\"wb-edit wb-edit--shape\" rows=\"1\"\n [value]=\"item.Label\"\n (keydown)=\"OnEditKeydown($event, editShape.value)\"\n (blur)=\"CommitEdit(editShape.value)\"\n #editShape></textarea>\n } @else {\n <span>{{ item.Label }}@if (item.Sub) {<span class=\"sub\">{{ item.Sub }}</span>}</span>\n }\n @if (ShowHandles(item) && !IsDragging(item)) {\n @for (h of Handles; track h) {\n <span [class]=\"'sel-h ' + h\" (pointerdown)=\"OnHandlePointerDown($event, item, h)\"></span>\n }\n }\n </div>\n }\n\n @case ('text') {\n <div class=\"bi tlabel\"\n [class.tlabel--user]=\"item.Author === 'user'\"\n [class.selected]=\"IsSelected(item)\"\n [class.dragging]=\"IsDragging(item)\"\n [class.pop-in]=\"PopInIDs.has(item.ID)\"\n [style.left.px]=\"ItemX(item)\" [style.top.px]=\"ItemY(item)\"\n [style.width.px]=\"TextWrapWidth(item)\"\n [style.maxWidth.px]=\"TextWrapWidth(item)\"\n [style.fontSize]=\"ItemFontSize(item)\"\n [style.fontFamily]=\"ItemFontFamily(item)\"\n [style.fontWeight]=\"ItemFontWeight(item)\"\n [style.color]=\"ItemTextColor(item)\"\n (pointerdown)=\"OnItemPointerDown($event, item)\"\n (dblclick)=\"BeginItemEdit($event, item)\"\n (contextmenu)=\"OnItemContextMenu($event, item)\">\n @if (item.Author === 'agent') {\n <i class=\"fa-solid fa-feather\"></i>\n }\n @if (EditingID === item.ID) {\n <input class=\"wb-edit wb-edit--text\" type=\"text\"\n [value]=\"item.Text\"\n (keydown)=\"OnEditKeydown($event, editText.value)\"\n (blur)=\"CommitEdit(editText.value)\"\n #editText/>\n } @else {\n {{ item.Text }}\n }\n @if (ShowHandles(item) && !IsDragging(item)) {\n @for (h of Handles; track h) {\n <span [class]=\"'sel-h ' + h\" (pointerdown)=\"OnHandlePointerDown($event, item, h)\"></span>\n }\n }\n </div>\n }\n\n @case ('markdown') {\n <div class=\"bi md-card\"\n [class.md-card--sage]=\"item.Author === 'agent'\"\n [class.selected]=\"IsSelected(item)\"\n [class.dragging]=\"IsDragging(item)\"\n [class.pop-in]=\"PopInIDs.has(item.ID)\"\n [style.left.px]=\"ItemX(item)\" [style.top.px]=\"ItemY(item)\"\n [style.width.px]=\"ItemW(item)\"\n (pointerdown)=\"OnItemPointerDown($event, item)\"\n (dblclick)=\"BeginRichEdit($event, item)\"\n (contextmenu)=\"OnItemContextMenu($event, item)\">\n @if (item.Author === 'agent') {\n <span class=\"author-chip author-chip--sage\"><i class=\"fa-solid fa-feather\"></i> {{ AgentName }}</span>\n } @else {\n <span class=\"author-chip author-chip--you\"><i class=\"fa-brands fa-markdown\"></i> You</span>\n }\n <!-- the BODY clips (overflow + max height) so the out-jutting selection\n handles and author chip on the card root are never clipped away -->\n <div class=\"md-card__body\"\n [style.maxHeight.px]=\"MarkdownMaxHeight(item)\">\n <!-- rendered through the shared mj-markdown component (sanitize defaults ON — no raw HTML passthrough) -->\n <mj-markdown [data]=\"item.Markdown\"\n [enableMermaid]=\"false\"\n [enableCodeCopy]=\"false\"\n [enableCollapsibleHeadings]=\"false\"/>\n </div>\n @if (ShowHandles(item) && !IsDragging(item)) {\n @for (h of Handles; track h) {\n <span [class]=\"'sel-h ' + h\" (pointerdown)=\"OnHandlePointerDown($event, item, h)\"></span>\n }\n }\n </div>\n }\n\n @case ('html') {\n <div class=\"bi html-card\"\n [class.html-card--sage]=\"item.Author === 'agent'\"\n [class.selected]=\"IsSelected(item)\"\n [class.dragging]=\"IsDragging(item)\"\n [class.pop-in]=\"PopInIDs.has(item.ID)\"\n [style.left.px]=\"ItemX(item)\" [style.top.px]=\"ItemY(item)\"\n [style.width.px]=\"ItemW(item)\" [style.height.px]=\"ItemH(item)\"\n (pointerdown)=\"OnItemPointerDown($event, item)\"\n (contextmenu)=\"OnItemContextMenu($event, item)\">\n <!-- Drag/select wiring lives on the CARD ROOT: pointer events from the header,\n the border ring and the lazy placeholder all bubble here, while events\n inside the sandboxed iframe never reach the parent document — so the\n widget body stays fully interactive and everything else drags the card. -->\n <div class=\"html-card__head\"\n (dblclick)=\"BeginRichEdit($event, item)\">\n <i class=\"fa-solid fa-code html-card__glyph\"></i>\n <span class=\"html-card__title\">{{ HtmlTitle(item) }}</span>\n @if (item.Author === 'agent') {\n <span class=\"author-chip author-chip--sage author-chip--inline\"><i class=\"fa-solid fa-feather\"></i> {{ AgentName }}</span>\n } @else {\n <span class=\"author-chip author-chip--you author-chip--inline\"><i class=\"fa-solid fa-user\"></i> You</span>\n }\n @if (!ReadOnly) {\n <button type=\"button\" class=\"html-card__btn\" title=\"Edit HTML\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"BeginRichEdit($event, item)\"><i class=\"fa-solid fa-pen\"></i></button>\n <button type=\"button\" class=\"html-card__btn\" title=\"Remove widget\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"RemoveItemClick($event, item)\"><i class=\"fa-solid fa-trash-can\"></i></button>\n }\n </div>\n <div class=\"html-card__body\">\n @if (IsNearViewport(item)) {\n <!-- SANDBOXED: allow-scripts ONLY (no allow-same-origin) — opaque origin,\n no access to the app DOM, session, cookies or storage. The srcdoc is\n built by the view-scoped wbWidgetSrcdoc pipe: rebuilt per MOUNT (page\n switches / lazy toggle / board re-creation always render fresh) and\n identity-stable while mounted (no reload churn). See whiteboard-srcdoc.pipe.ts. -->\n <iframe class=\"html-card__frame\"\n sandbox=\"allow-scripts\"\n [srcdoc]=\"item.Html | wbWidgetSrcdoc\"\n [attr.data-item-id]=\"item.ID\"\n [attr.title]=\"HtmlTitle(item)\"></iframe>\n } @else {\n <div class=\"html-card__lazy\">\n <i class=\"fa-solid fa-code\"></i>\n <span>{{ HtmlTitle(item) }}</span>\n </div>\n }\n </div>\n @if (ShowHandles(item) && !IsDragging(item)) {\n @for (h of Handles; track h) {\n <span [class]=\"'sel-h ' + h\" (pointerdown)=\"OnHandlePointerDown($event, item, h)\"></span>\n }\n }\n </div>\n }\n\n @case ('image') {\n <div class=\"bi img-card\"\n [class.selected]=\"IsSelected(item)\"\n [class.dragging]=\"IsDragging(item)\"\n [class.pop-in]=\"PopInIDs.has(item.ID)\"\n [style.left.px]=\"ItemX(item)\" [style.top.px]=\"ItemY(item)\"\n [style.width.px]=\"ItemW(item)\"\n (pointerdown)=\"OnItemPointerDown($event, item)\"\n (contextmenu)=\"OnItemContextMenu($event, item)\">\n @if (item.Author === 'agent') {\n <span class=\"author-chip author-chip--sage\"><i class=\"fa-solid fa-feather\"></i> {{ AgentName }}</span>\n } @else {\n <span class=\"author-chip author-chip--you\"><i class=\"fa-solid fa-paste\"></i> You · pasted</span>\n }\n <div class=\"img-card__body\">\n @if (item.Url) {\n <img [src]=\"item.Url\" [alt]=\"item.Name\"/>\n } @else {\n <i class=\"fa-regular fa-image\"></i>\n }\n </div>\n <div class=\"img-card__name\"><i class=\"fa-solid fa-chart-area\"></i> {{ item.Name }}</div>\n @if (ShowHandles(item) && !IsDragging(item)) {\n @for (h of Handles; track h) {\n <span [class]=\"'sel-h ' + h\" (pointerdown)=\"OnHandlePointerDown($event, item, h)\"></span>\n }\n }\n </div>\n }\n }\n }\n\n <!-- agent presence cursor -->\n @if (AgentPresence?.Active) {\n <div class=\"cursor cursor--sage\" [style.left.px]=\"AgentPresence!.X\" [style.top.px]=\"AgentPresence!.Y\">\n <span class=\"tip\"><i class=\"fa-solid fa-feather\"></i></span>\n <span class=\"lbl\"><i class=\"fa-solid fa-pen\"></i>{{ AgentPresence!.Label }}</span>\n </div>\n }\n </div>\n\n <!-- in-board rich-content editor panel (markdown / html items) -->\n @if (RichEditor; as ed) {\n <div class=\"rich-editor\"\n (keydown)=\"OnRichEditorKeydown($event)\"\n (pointerdown)=\"$event.stopPropagation()\"\n (dblclick)=\"$event.stopPropagation()\"\n (wheel)=\"$event.stopPropagation()\">\n <div class=\"rich-editor__head\">\n @if (ed.Kind === 'markdown') {\n <i class=\"fa-brands fa-markdown\"></i>\n <span class=\"rich-editor__label\">Markdown panel</span>\n <span class=\"rich-editor__modes\">\n <button type=\"button\" class=\"re-mode\" [class.on]=\"!ed.Preview\" (click)=\"RichEditorSetPreview(false)\">Edit</button>\n <button type=\"button\" class=\"re-mode\" [class.on]=\"ed.Preview\" (click)=\"RichEditorSetPreview(true)\">Preview</button>\n </span>\n } @else {\n <i class=\"fa-solid fa-code\"></i>\n <span class=\"rich-editor__label\">HTML widget</span>\n <input class=\"rich-editor__title\" type=\"text\" placeholder=\"Title\" #reTitle\n [value]=\"ed.TitleDraft\" (input)=\"OnRichEditorTitleChange(reTitle.value)\"/>\n }\n </div>\n <div class=\"rich-editor__body\">\n @if (ed.Kind === 'markdown' && ed.Preview) {\n <div class=\"rich-editor__preview\">\n <mj-markdown [data]=\"ed.Draft\"\n [enableMermaid]=\"false\"\n [enableCodeCopy]=\"false\"\n [enableCollapsibleHeadings]=\"false\"/>\n </div>\n } @else {\n <mj-code-editor class=\"rich-editor__code\"\n [value]=\"ed.Draft\"\n [language]=\"ed.Kind === 'markdown' ? 'markdown' : 'html'\"\n (change)=\"OnRichEditorDraftChange($event)\"/>\n }\n </div>\n @if (ed.Kind === 'html') {\n <div class=\"rich-editor__note\">\n <i class=\"fa-solid fa-shield-halved\"></i>\n Renders in a sandboxed frame — scripts run isolated, no app or network access guaranteed.\n </div>\n }\n <div class=\"rich-editor__foot\">\n <button type=\"button\" class=\"re-btn re-btn--primary\" (click)=\"RichEditorDone()\">Done</button>\n <button type=\"button\" class=\"re-btn\" title=\"Apply without closing — re-renders the widget\" (click)=\"RichEditorApply()\">Apply</button>\n <span class=\"re-spacer\"></span>\n <button type=\"button\" class=\"re-btn\" title=\"Close without applying draft changes\" (click)=\"RichEditorCancel()\">Cancel</button>\n </div>\n </div>\n }\n\n <!-- right-click context menu (item actions / \"add … here\") -->\n @if (ContextMenu; as menu) {\n <div class=\"wb-context-menu\"\n [style.left.px]=\"menu.Left\" [style.top.px]=\"menu.Top\"\n (pointerdown)=\"$event.stopPropagation()\"\n (contextmenu)=\"$event.preventDefault(); $event.stopPropagation()\"\n (wheel)=\"$event.stopPropagation()\">\n @for (action of menu.Actions; track action.ID) {\n @if (action.SeparatorBefore) {\n <div class=\"wb-context-menu__sep\"></div>\n }\n <button type=\"button\" class=\"wb-context-menu__item\"\n [class.wb-context-menu__item--danger]=\"action.Danger\"\n (click)=\"OnContextMenuAction(action.ID)\">\n <i [class]=\"action.Icon\"></i> {{ action.Label }}\n </button>\n }\n </div>\n }\n\n <!-- page strip (OneNote-style tabs; switching works in ReadOnly, mutations don't) -->\n <mj-realtime-whiteboard-pages [State]=\"State\" [ReadOnly]=\"ReadOnly\"\n (ChipContextMenu)=\"OnPageChipContextMenu($event)\"/>\n\n <!-- minimap -->\n @if (MinimapOpen) {\n <div class=\"minimap\">\n <svg [attr.viewBox]=\"MinimapViewBox\" preserveAspectRatio=\"xMidYMid meet\">\n @for (mi of MinimapItems; track $index) {\n <rect [attr.x]=\"mi.X\" [attr.y]=\"mi.Y\" [attr.width]=\"mi.W\" [attr.height]=\"mi.H\"\n [attr.class]=\"mi.Agent ? 'mm-item mm-item--sage' : 'mm-item'\" rx=\"6\"/>\n }\n <rect class=\"mm-viewport\"\n [attr.x]=\"MinimapViewport.X\" [attr.y]=\"MinimapViewport.Y\"\n [attr.width]=\"MinimapViewport.W\" [attr.height]=\"MinimapViewport.H\" rx=\"8\"/>\n </svg>\n </div>\n }\n</div>\n"]}
|