@memberjunction/ng-whiteboard 0.0.1 → 5.41.0

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.
Files changed (62) hide show
  1. package/README.md +302 -28
  2. package/dist/lib/whiteboard-agent-sees-popover.component.d.ts +31 -0
  3. package/dist/lib/whiteboard-agent-sees-popover.component.d.ts.map +1 -0
  4. package/dist/lib/whiteboard-agent-sees-popover.component.js +132 -0
  5. package/dist/lib/whiteboard-agent-sees-popover.component.js.map +1 -0
  6. package/dist/lib/whiteboard-board.component.d.ts +458 -0
  7. package/dist/lib/whiteboard-board.component.d.ts.map +1 -0
  8. package/dist/lib/whiteboard-board.component.js +2357 -0
  9. package/dist/lib/whiteboard-board.component.js.map +1 -0
  10. package/dist/lib/whiteboard-context-menu.d.ts +57 -0
  11. package/dist/lib/whiteboard-context-menu.d.ts.map +1 -0
  12. package/dist/lib/whiteboard-context-menu.js +69 -0
  13. package/dist/lib/whiteboard-context-menu.js.map +1 -0
  14. package/dist/lib/whiteboard-export.d.ts +94 -0
  15. package/dist/lib/whiteboard-export.d.ts.map +1 -0
  16. package/dist/lib/whiteboard-export.js +592 -0
  17. package/dist/lib/whiteboard-export.js.map +1 -0
  18. package/dist/lib/whiteboard-host.component.d.ts +174 -0
  19. package/dist/lib/whiteboard-host.component.d.ts.map +1 -0
  20. package/dist/lib/whiteboard-host.component.js +758 -0
  21. package/dist/lib/whiteboard-host.component.js.map +1 -0
  22. package/dist/lib/whiteboard-pages.component.d.ts +83 -0
  23. package/dist/lib/whiteboard-pages.component.d.ts.map +1 -0
  24. package/dist/lib/whiteboard-pages.component.js +211 -0
  25. package/dist/lib/whiteboard-pages.component.js.map +1 -0
  26. package/dist/lib/whiteboard-snapshot.component.d.ts +30 -0
  27. package/dist/lib/whiteboard-snapshot.component.d.ts.map +1 -0
  28. package/dist/lib/whiteboard-snapshot.component.js +91 -0
  29. package/dist/lib/whiteboard-snapshot.component.js.map +1 -0
  30. package/dist/lib/whiteboard-srcdoc.pipe.d.ts +60 -0
  31. package/dist/lib/whiteboard-srcdoc.pipe.d.ts.map +1 -0
  32. package/dist/lib/whiteboard-srcdoc.pipe.js +75 -0
  33. package/dist/lib/whiteboard-srcdoc.pipe.js.map +1 -0
  34. package/dist/lib/whiteboard-state.d.ts +1113 -0
  35. package/dist/lib/whiteboard-state.d.ts.map +1 -0
  36. package/dist/lib/whiteboard-state.js +1396 -0
  37. package/dist/lib/whiteboard-state.js.map +1 -0
  38. package/dist/lib/whiteboard-toolbar.component.d.ts +95 -0
  39. package/dist/lib/whiteboard-toolbar.component.d.ts.map +1 -0
  40. package/dist/lib/whiteboard-toolbar.component.js +344 -0
  41. package/dist/lib/whiteboard-toolbar.component.js.map +1 -0
  42. package/dist/lib/whiteboard-tools.d.ts +103 -0
  43. package/dist/lib/whiteboard-tools.d.ts.map +1 -0
  44. package/dist/lib/whiteboard-tools.js +748 -0
  45. package/dist/lib/whiteboard-tools.js.map +1 -0
  46. package/dist/lib/whiteboard-widget-bridge.d.ts +217 -0
  47. package/dist/lib/whiteboard-widget-bridge.d.ts.map +1 -0
  48. package/dist/lib/whiteboard-widget-bridge.js +254 -0
  49. package/dist/lib/whiteboard-widget-bridge.js.map +1 -0
  50. package/dist/lib/whiteboard-zoom.component.d.ts +55 -0
  51. package/dist/lib/whiteboard-zoom.component.d.ts.map +1 -0
  52. package/dist/lib/whiteboard-zoom.component.js +139 -0
  53. package/dist/lib/whiteboard-zoom.component.js.map +1 -0
  54. package/dist/lib/whiteboard.module.d.ts +29 -0
  55. package/dist/lib/whiteboard.module.d.ts.map +1 -0
  56. package/dist/lib/whiteboard.module.js +78 -0
  57. package/dist/lib/whiteboard.module.js.map +1 -0
  58. package/dist/public-api.d.ts +49 -0
  59. package/dist/public-api.d.ts.map +1 -0
  60. package/dist/public-api.js +59 -0
  61. package/dist/public-api.js.map +1 -0
  62. package/package.json +43 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whiteboard-export.js","sourceRoot":"","sources":["../../src/lib/whiteboard-export.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n WHITEBOARD_DEFAULTS,\n WhiteboardBounds,\n WhiteboardConnectorItem,\n WhiteboardFontFamily,\n WhiteboardHighlightItem,\n WhiteboardHtmlItem,\n WhiteboardImageItem,\n WhiteboardInkItem,\n WhiteboardItem,\n WhiteboardMarkdownItem,\n WhiteboardShapeItem,\n WhiteboardState,\n WhiteboardStickyItem,\n WhiteboardTextItem\n} from './whiteboard-state';\n\n/**\n * LIVE WHITEBOARD — EXPORT builders (pure, Angular-free).\n *\n * {@link BuildWhiteboardExportHtml} renders a board snapshot as ONE fully self-contained\n * HTML document (inline CSS only, zero external references) suitable for \"Download HTML\"\n * and the host's Print path; {@link BuildWhiteboardExportSvg} renders the same snapshot\n * as a standalone SVG document for \"Download SVG\".\n *\n * Rendering model (mirrors the live board):\n * - BOX items (sticky / shape / text / image placeholder) become absolutely positioned\n * divs honoring the optional text-style fields (FontSize / FontFamily / FontWeight /\n * Color), each garnished with a small ownership chip (You / the agent's name);\n * - MARKDOWN panels render their formatted content through {@link RenderMarkdownInert}\n * (escape-FIRST, no raw-HTML passthrough); HTML widgets export as a placeholder card\n * (title + note + escaped source in a <details>) — live widget HTML is NEVER inlined\n * into the export document (no iframe sandbox exists there, so it would be XSS);\n * - VECTOR items (ink strokes, connectors, highlight regions) render in one inline SVG\n * layer underneath the boxes — connectors anchor to item centers via the engine's own\n * {@link WhiteboardState.ResolveEndpoint} bounds math, highlights become dashed\n * outlines;\n * - the palette is a light, paper-friendly literal palette (exports must stand alone, so\n * no design tokens here — this is the documented exception for self-contained output).\n *\n * SECURITY: every piece of user/agent-authored text (item text, labels, names, the title,\n * the agent name, the timestamp) is HTML-escaped via {@link escapeHtml} before it touches\n * the document. Output is deterministic for a given state + options (the caller passes\n * `GeneratedAt`).\n */\n\n/** Options for {@link BuildWhiteboardExportHtml}. */\nexport interface WhiteboardExportOptions {\n /** Document / header title (e.g. the board title). */\n Title: string;\n /** Display name of the session's agent — ownership chips + header byline. */\n AgentName: string;\n /** Preformatted generation timestamp (passed in so output stays deterministic). */\n GeneratedAt: string;\n}\n\n/** Padding (px) added around the content bounds so nothing renders flush to the edge. */\nconst EXPORT_PAD = 36;\n/** Fallback board size when the board is empty. */\nconst EMPTY_BOARD_W = 640;\nconst EMPTY_BOARD_H = 240;\n\n/** Paper-friendly literal palette (self-contained exports cannot reference app tokens). */\nconst PALETTE = {\n PageBg: '#f6f5f1',\n PaperBg: '#ffffff',\n PaperBorder: '#d9d4c8',\n TextPrimary: '#1f2937',\n TextMuted: '#6b7280',\n UserChipBg: '#eef2f7',\n UserChipBorder: '#cbd5e1',\n UserChipText: '#475569',\n AgentChipBg: '#ede9fe',\n AgentChipBorder: '#c4b5fd',\n AgentChipText: '#6d28d9',\n StickyAmberBg: '#fef3c7',\n StickyAmberBorder: '#f0d48a',\n StickyAmberLightBg: '#fffbeb',\n StickyAmberLightBorder: '#f3e3b3',\n StickyAgentBg: '#f1ecfe',\n StickyAgentBorder: '#c4b5fd',\n ShapeUserBg: '#fdfdfb',\n ShapeUserBorder: '#94a3b8',\n ShapeAgentBg: '#f5f3ff',\n ShapeAgentBorder: '#a78bfa',\n ImageBg: '#f1f5f9',\n ImageBorder: '#cbd5e1',\n ConnectorUser: '#64748b',\n ConnectorAgent: '#8b5cf6',\n HighlightUser: '#d97706',\n HighlightAgent: '#8b5cf6'\n} as const;\n\n/** Map a {@link WhiteboardFontFamily} key to a literal font stack. */\nconst FONT_STACKS: Record<WhiteboardFontFamily, string> = {\n sans: \"ui-sans-serif, system-ui, 'Segoe UI', Helvetica, Arial, sans-serif\",\n serif: \"Georgia, 'Times New Roman', serif\",\n mono: \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\"\n};\n\n/** HTML/SVG-escape every user-authored string: & < > \" ' (also valid in XML text/attrs). */\nfunction escapeHtml(text: string): string {\n return (text ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\n// ────────────────────────────────────────────── minimal inert markdown renderer\n\n/**\n * Format ONE already-escaped line's inline markdown: code spans, links (http/https/mailto\n * only — anything else stays literal text), bold, italic. Code spans are protected from\n * the other inline formats via placeholders.\n */\nfunction markdownInline(escaped: string): string {\n const codeSpans: string[] = [];\n let text = escaped.replace(/`([^`]+)`/g, (_m, c: string) => {\n codeSpans.push(c);\n return `\\u0000${codeSpans.length - 1}\\u0000`;\n });\n // href is escaped text in a whitelisted scheme — quotes are entities, so it can't break the attribute\n text = text.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^()\\s]+|mailto:[^()\\s]+)\\)/g,\n '<a href=\"$2\" rel=\"noopener noreferrer\">$1</a>');\n text = text.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n text = text.replace(/\\*([^*]+)\\*/g, '<em>$1</em>');\n return text.replace(/\\u0000(\\d+)\\u0000/g, (_m, i: string) => `<code>${codeSpans[Number(i)]}</code>`);\n}\n\n/**\n * Minimal, SAFE markdown → HTML renderer for the self-contained exports (the live board\n * renders through the shared `mj-markdown` Angular component instead — this exists only\n * because export builders are pure functions with no Angular available).\n *\n * SECURITY: ESCAPE-FIRST — the whole source is HTML-escaped before any formatting, so raw\n * HTML in the markdown can never become live markup (NO passthrough, ever). Supported:\n * headings, bold/italic, inline code, fenced code blocks, un/ordered lists, paragraphs,\n * and links restricted to http(s)/mailto.\n */\nexport function RenderMarkdownInert(markdown: string): string {\n const lines = escapeHtml(markdown ?? '').split('\\n');\n const out: string[] = [];\n let para: string[] = [];\n let list: { tag: 'ul' | 'ol'; items: string[] } | null = null;\n let code: string[] | null = null;\n const flushPara = (): void => {\n if (para.length > 0) {\n out.push(`<p>${para.join('<br>')}</p>`);\n para = [];\n }\n };\n const flushList = (): void => {\n if (list) {\n out.push(`<${list.tag}>${list.items.map((i) => `<li>${i}</li>`).join('')}</${list.tag}>`);\n list = null;\n }\n };\n for (const line of lines) {\n if (code) {\n if (/^```/.test(line)) {\n out.push(`<pre><code>${code.join('\\n')}</code></pre>`);\n code = null;\n }\n else {\n code.push(line);\n }\n continue;\n }\n if (/^```/.test(line)) {\n flushPara();\n flushList();\n code = [];\n continue;\n }\n const heading = /^(#{1,6})\\s+(.*)$/.exec(line);\n if (heading) {\n flushPara();\n flushList();\n out.push(`<h${heading[1].length}>${markdownInline(heading[2])}</h${heading[1].length}>`);\n continue;\n }\n const ul = /^\\s*[-*]\\s+(.*)$/.exec(line);\n const ol = /^\\s*\\d+\\.\\s+(.*)$/.exec(line);\n if (ul || ol) {\n flushPara();\n const tag: 'ul' | 'ol' = ul ? 'ul' : 'ol';\n if (!list || list.tag !== tag) {\n flushList();\n list = { tag, items: [] };\n }\n list.items.push(markdownInline((ul ?? ol)![1]));\n continue;\n }\n if (line.trim().length === 0) {\n flushPara();\n flushList();\n continue;\n }\n flushList();\n para.push(markdownInline(line));\n }\n if (code) {\n out.push(`<pre><code>${code.join('\\n')}</code></pre>`); // unterminated fence\n }\n flushPara();\n flushList();\n return out.join('');\n}\n\n/** Round to 2 decimals for compact, deterministic coordinate output. */\nfunction n(value: number): number {\n return Math.round(value * 100) / 100;\n}\n\n/** Board bounds padded for export (or a default empty stage). */\nfunction exportBounds(state: WhiteboardState): WhiteboardBounds {\n const content = state.ContentBounds();\n if (!content) {\n return { X: 0, Y: 0, W: EMPTY_BOARD_W, H: EMPTY_BOARD_H };\n }\n return {\n X: content.X - EXPORT_PAD,\n Y: content.Y - EXPORT_PAD,\n W: content.W + EXPORT_PAD * 2,\n H: content.H + EXPORT_PAD * 2\n };\n}\n\n/** Inline font-style fragment from the optional text-style fields. */\nfunction textStyleCss(item: WhiteboardStickyItem | WhiteboardTextItem): string {\n const parts: string[] = [];\n if (item.FontSize != null) {\n parts.push(`font-size:${n(item.FontSize)}px`);\n }\n if (item.FontFamily) {\n parts.push(`font-family:${FONT_STACKS[item.FontFamily]}`);\n }\n if (item.FontWeight != null) {\n parts.push(`font-weight:${item.FontWeight}`);\n }\n return parts.length > 0 ? parts.join(';') + ';' : '';\n}\n\n/** The small ownership chip rendered on each box/ink item. */\nfunction chipHtml(item: WhiteboardItem, agentName: string): string {\n const label = item.Author === 'agent' ? escapeHtml(agentName) : 'You';\n return `<span class=\"chip chip--${item.Author}\">${label}</span>`;\n}\n\n// ────────────────────────────────────────────── box items (positioned divs)\n\nfunction stickyHtml(item: WhiteboardStickyItem, ox: number, oy: number, agentName: string): string {\n const w = item.W ?? WHITEBOARD_DEFAULTS.StickyW;\n const isAgent = item.Author === 'agent';\n const bg = isAgent ? PALETTE.StickyAgentBg : item.Tint === 'amber-light' ? PALETTE.StickyAmberLightBg : PALETTE.StickyAmberBg;\n const border = isAgent ? PALETTE.StickyAgentBorder : item.Tint === 'amber-light' ? PALETTE.StickyAmberLightBorder : PALETTE.StickyAmberBorder;\n const rotate = item.Rotation ? `transform:rotate(${n(item.Rotation)}deg);` : '';\n const style = `left:${n(item.X - ox)}px;top:${n(item.Y - oy)}px;width:${n(w)}px;min-height:${WHITEBOARD_DEFAULTS.StickyH}px;` +\n `background:${bg};border-color:${border};${rotate}${textStyleCss(item)}`;\n return `<div class=\"it sticky\" style=\"${style}\">${chipHtml(item, agentName)}<div class=\"it-text\">${escapeHtml(item.Text)}</div></div>`;\n}\n\nfunction shapeHtml(item: WhiteboardShapeItem, ox: number, oy: number, agentName: string): string {\n const isAgent = item.Author === 'agent';\n const bg = isAgent ? PALETTE.ShapeAgentBg : PALETTE.ShapeUserBg;\n const border = isAgent ? PALETTE.ShapeAgentBorder : PALETTE.ShapeUserBorder;\n const shapeCss =\n item.Shape === 'ellipse' ? 'border-radius:50%;'\n : item.Shape === 'diamond' ? 'clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%);border:none;'\n : '';\n const style = `left:${n(item.X - ox)}px;top:${n(item.Y - oy)}px;width:${n(item.W)}px;height:${n(item.H)}px;` +\n `background:${bg};border-color:${border};${shapeCss}`;\n const sub = item.Sub ? `<div class=\"it-sub\">${escapeHtml(item.Sub)}</div>` : '';\n return `<div class=\"it shape\" style=\"${style}\">${chipHtml(item, agentName)}<div class=\"it-label\">${escapeHtml(item.Label)}</div>${sub}</div>`;\n}\n\nfunction textHtml(item: WhiteboardTextItem, ox: number, oy: number, agentName: string): string {\n const color = item.Color ? `color:${escapeHtml(item.Color)};` : '';\n // explicit wrap width wins; otherwise wrap at the on-board default max width\n const width = item.W ? `width:${n(item.W)}px;` : 'max-width:380px;';\n const style = `left:${n(item.X - ox)}px;top:${n(item.Y - oy)}px;${width}${color}${textStyleCss(item)}`;\n return `<div class=\"it label\" style=\"${style}\">${chipHtml(item, agentName)}<div class=\"it-text\">${escapeHtml(item.Text)}</div></div>`;\n}\n\nfunction imageHtml(item: WhiteboardImageItem, ox: number, oy: number, agentName: string): string {\n const w = item.W ?? WHITEBOARD_DEFAULTS.ImageW;\n const style = `left:${n(item.X - ox)}px;top:${n(item.Y - oy)}px;width:${n(w)}px;height:${WHITEBOARD_DEFAULTS.ImageH}px;`;\n // Url is a runtime object URL (not persisted as pixels) — always export a named placeholder.\n return `<div class=\"it image\" style=\"${style}\">${chipHtml(item, agentName)}` +\n `<div class=\"image-glyph\">▦</div><div class=\"image-name\">${escapeHtml(item.Name)}</div></div>`;\n}\n\n/** Markdown panel: rendered through the inert escape-first renderer (never raw HTML). */\nfunction markdownItemHtml(item: WhiteboardMarkdownItem, ox: number, oy: number, agentName: string): string {\n const maxH = item.H ? `max-height:${n(item.H)}px;overflow:hidden;` : '';\n const style = `left:${n(item.X - ox)}px;top:${n(item.Y - oy)}px;width:${n(item.W)}px;${maxH}`;\n return `<div class=\"it md\" style=\"${style}\">${chipHtml(item, agentName)}` +\n `<div class=\"md-body\">${RenderMarkdownInert(item.Markdown)}</div></div>`;\n}\n\n/**\n * HTML widget: exported as a PLACEHOLDER card — title, an \"interactive widget\" note, and\n * the ESCAPED source inside a collapsed <details>. The live HTML is deliberately NOT\n * inlined into the export document: the board's iframe sandbox doesn't exist here, so\n * embedding it would hand arbitrary script a same-origin document (XSS).\n */\nfunction htmlWidgetItemHtml(item: WhiteboardHtmlItem, ox: number, oy: number, agentName: string): string {\n const title = escapeHtml(item.Title || 'HTML widget');\n const style = `left:${n(item.X - ox)}px;top:${n(item.Y - oy)}px;width:${n(item.W)}px;min-height:${n(item.H)}px;`;\n return `<div class=\"it htmlw\" style=\"${style}\">${chipHtml(item, agentName)}` +\n `<div class=\"htmlw-title\">${title}</div>` +\n `<div class=\"htmlw-note\">Interactive HTML widget — renders sandboxed on the live board; not embedded in this export.</div>` +\n `<details class=\"htmlw-src\"><summary>View source</summary><pre>${escapeHtml(item.Html)}</pre></details></div>`;\n}\n\n/** Ink strokes draw in the SVG layer, but their ownership chip is an HTML div at the stroke's bounds. */\nfunction inkChipHtml(item: WhiteboardInkItem, state: WhiteboardState, ox: number, oy: number, agentName: string): string {\n const b = state.ItemBounds(item);\n return `<div class=\"ink-chip\" style=\"left:${n(b.X - ox)}px;top:${n(b.Y - oy - 18)}px;\">${chipHtml(item, agentName)}</div>`;\n}\n\n// ────────────────────────────────────────────── vector layer (one inline SVG)\n\nfunction inkSvg(item: WhiteboardInkItem, ox: number, oy: number): string {\n const points = item.Points.map((p) => `${n(p.X - ox)},${n(p.Y - oy)}`).join(' ');\n return `<polyline points=\"${points}\" fill=\"none\" stroke=\"${escapeHtml(item.Color)}\" stroke-width=\"${n(item.StrokeWidth)}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>`;\n}\n\nfunction connectorSvg(item: WhiteboardConnectorItem, state: WhiteboardState, ox: number, oy: number): string {\n // Reuse the engine's own bounds math: endpoints anchor to the referenced item's center.\n const from = state.ResolveEndpoint(item, 'from');\n const to = state.ResolveEndpoint(item, 'to');\n const stroke = item.Author === 'agent' ? PALETTE.ConnectorAgent : PALETTE.ConnectorUser;\n return `<line x1=\"${n(from.X - ox)}\" y1=\"${n(from.Y - oy)}\" x2=\"${n(to.X - ox)}\" y2=\"${n(to.Y - oy)}\" ` +\n `stroke=\"${stroke}\" stroke-width=\"2\" marker-end=\"url(#wb-arrow)\"/>`;\n}\n\nfunction highlightSvg(item: WhiteboardHighlightItem, ox: number, oy: number): string {\n const stroke = item.Author === 'agent' ? PALETTE.HighlightAgent : PALETTE.HighlightUser;\n const rect = `<rect x=\"${n(item.X - ox)}\" y=\"${n(item.Y - oy)}\" width=\"${n(item.W)}\" height=\"${n(item.H)}\" rx=\"10\" ` +\n `fill=\"none\" stroke=\"${stroke}\" stroke-width=\"2\" stroke-dasharray=\"7 5\"/>`;\n const label = item.Label\n ? `<text x=\"${n(item.X - ox + 6)}\" y=\"${n(item.Y - oy - 7)}\" font-size=\"11\" fill=\"${stroke}\">${escapeHtml(item.Label)}</text>`\n : '';\n return rect + label;\n}\n\n/** The single vector layer: ink + connectors + highlight outlines, in render (Z) order. */\nfunction vectorLayerSvg(state: WhiteboardState, b: WhiteboardBounds): string {\n const parts: string[] = [];\n for (const item of state.Items) {\n if (item.Kind === 'ink') {\n parts.push(inkSvg(item, b.X, b.Y));\n }\n else if (item.Kind === 'connector') {\n parts.push(connectorSvg(item, state, b.X, b.Y));\n }\n else if (item.Kind === 'highlight') {\n parts.push(highlightSvg(item, b.X, b.Y));\n }\n }\n return `<svg class=\"vector\" width=\"${n(b.W)}\" height=\"${n(b.H)}\" viewBox=\"0 0 ${n(b.W)} ${n(b.H)}\" xmlns=\"http://www.w3.org/2000/svg\">` +\n `<defs><marker id=\"wb-arrow\" markerWidth=\"8\" markerHeight=\"8\" refX=\"7\" refY=\"3\" orient=\"auto\">` +\n `<path d=\"M0,0 L7,3 L0,6 Z\" fill=\"${PALETTE.ConnectorUser}\"/></marker></defs>${parts.join('')}</svg>`;\n}\n\n/** All positioned box-item divs (+ ink ownership chips), in render (Z) order. */\nfunction boxLayerHtml(state: WhiteboardState, b: WhiteboardBounds, agentName: string): string {\n const parts: string[] = [];\n for (const item of state.Items) {\n switch (item.Kind) {\n case 'sticky': parts.push(stickyHtml(item, b.X, b.Y, agentName)); break;\n case 'shape': parts.push(shapeHtml(item, b.X, b.Y, agentName)); break;\n case 'text': parts.push(textHtml(item, b.X, b.Y, agentName)); break;\n case 'image': parts.push(imageHtml(item, b.X, b.Y, agentName)); break;\n case 'markdown': parts.push(markdownItemHtml(item, b.X, b.Y, agentName)); break;\n case 'html': parts.push(htmlWidgetItemHtml(item, b.X, b.Y, agentName)); break;\n case 'ink': parts.push(inkChipHtml(item, state, b.X, b.Y, agentName)); break;\n case 'connector':\n case 'highlight':\n break; // vector layer only\n }\n }\n return parts.join('');\n}\n\n// ────────────────────────────────────────────── document chrome\n\nfunction documentCss(): string {\n return `\n * { box-sizing: border-box; }\n body { margin: 0; padding: 24px; background: ${PALETTE.PageBg}; color: ${PALETTE.TextPrimary};\n font-family: ${FONT_STACKS.sans}; }\n .exp-head { margin-bottom: 14px; }\n .exp-head h1 { margin: 0 0 4px; font-size: 19px; }\n .exp-meta { font-size: 12px; color: ${PALETTE.TextMuted}; }\n .board-wrap { overflow: auto; }\n .board { position: relative; background: ${PALETTE.PaperBg}; border: 1px solid ${PALETTE.PaperBorder};\n border-radius: 8px; box-shadow: 0 2px 10px rgba(15, 23, 42, 0.08); overflow: hidden; }\n .vector { position: absolute; left: 0; top: 0; }\n .it { position: absolute; border: 1px solid transparent; border-radius: 6px; padding: 18px 10px 10px;\n font-size: 12px; line-height: 1.35; box-shadow: 0 1px 4px rgba(15, 23, 42, 0.10); }\n .it-text { white-space: pre-wrap; word-break: break-word; }\n .it.shape { display: flex; flex-direction: column; align-items: center; justify-content: center;\n text-align: center; padding: 10px; }\n .it-label { font-weight: 600; }\n .it-sub { font-size: 10.5px; color: ${PALETTE.TextMuted}; margin-top: 2px; }\n .it.label { background: transparent; border: none; box-shadow: none; padding: 14px 2px 2px; }\n .it.image { background: ${PALETTE.ImageBg}; border-color: ${PALETTE.ImageBorder}; display: flex;\n flex-direction: column; align-items: center; justify-content: center; gap: 6px; }\n .image-glyph { font-size: 22px; color: ${PALETTE.TextMuted}; }\n .image-name { font-size: 10.5px; color: ${PALETTE.TextMuted}; max-width: 100%; overflow: hidden;\n text-overflow: ellipsis; white-space: nowrap; }\n .ink-chip { position: absolute; }\n .it.md { background: ${PALETTE.PaperBg}; border-color: ${PALETTE.PaperBorder}; }\n .md-body h1 { font-size: 16px; margin: 2px 0 6px; }\n .md-body h2 { font-size: 14px; margin: 2px 0 6px; }\n .md-body h3, .md-body h4, .md-body h5, .md-body h6 { font-size: 12.5px; margin: 2px 0 4px; }\n .md-body p { margin: 0 0 6px; }\n .md-body ul, .md-body ol { margin: 0 0 6px; padding-left: 18px; }\n .md-body pre { background: ${PALETTE.ImageBg}; border: 1px solid ${PALETTE.ImageBorder}; border-radius: 4px;\n padding: 6px 8px; margin: 0 0 6px; font-size: 10.5px; overflow: auto; white-space: pre-wrap; }\n .md-body code { font-family: ${FONT_STACKS.mono}; font-size: 10.5px; }\n .md-body a { color: ${PALETTE.AgentChipText}; }\n .it.htmlw { background: ${PALETTE.ImageBg}; border-color: ${PALETTE.ImageBorder}; border-style: dashed; }\n .htmlw-title { font-weight: 700; margin-bottom: 4px; }\n .htmlw-note { font-size: 10.5px; color: ${PALETTE.TextMuted}; margin-bottom: 6px; }\n .htmlw-src summary { font-size: 10.5px; color: ${PALETTE.TextMuted}; cursor: pointer; }\n .htmlw-src pre { background: ${PALETTE.PaperBg}; border: 1px solid ${PALETTE.ImageBorder}; border-radius: 4px;\n padding: 6px 8px; margin: 4px 0 0; font-size: 9.5px; font-family: ${FONT_STACKS.mono};\n overflow: auto; white-space: pre-wrap; word-break: break-word; max-height: 220px; }\n .chip { position: absolute; top: -9px; left: 8px; font-size: 9px; font-weight: 700; letter-spacing: 0.02em;\n padding: 1px 7px; border-radius: 999px; border: 1px solid ${PALETTE.UserChipBorder};\n background: ${PALETTE.UserChipBg}; color: ${PALETTE.UserChipText}; white-space: nowrap; }\n .chip--agent { border-color: ${PALETTE.AgentChipBorder}; background: ${PALETTE.AgentChipBg};\n color: ${PALETTE.AgentChipText}; }\n .ink-chip .chip { position: static; }\n .exp-empty { padding: 48px 0; text-align: center; color: ${PALETTE.TextMuted}; font-size: 13px; }\n .exp-foot { margin-top: 12px; font-size: 11px; color: ${PALETTE.TextMuted}; }\n .exp-page { margin-bottom: 22px; }\n .exp-page__name { margin: 0 0 8px; font-size: 15px; }\n .exp-page__idx { color: ${PALETTE.TextMuted}; font-weight: 400; font-size: 12px; }\n @media print {\n body { background: #ffffff; padding: 0; }\n .board, .it { box-shadow: none !important; }\n .board-wrap { overflow: visible; }\n .exp-page { break-inside: avoid; }\n .exp-page + .exp-page { break-before: page; }\n }\n @page { margin: 12mm; }`;\n}\n\n/**\n * Build a fully self-contained HTML document for the given board snapshot — inline CSS\n * only, light paper-friendly palette, header (title / generated-at / agent byline), the\n * positioned board, ownership chips, item-count footer and print-friendly `@media print`\n * rules. Deterministic for a given state + options; all text is HTML-escaped.\n *\n * Renders the ACTIVE page only — see {@link BuildWhiteboardExportHtmlAllPages} for the\n * every-page document.\n */\nexport function BuildWhiteboardExportHtml(state: WhiteboardState, opts: WhiteboardExportOptions): string {\n const b = exportBounds(state);\n const title = escapeHtml(opts.Title);\n const agent = escapeHtml(opts.AgentName);\n const empty = state.Items.length === 0;\n const boardInner = empty\n ? `<div class=\"exp-empty\">This whiteboard is empty.</div>`\n : vectorLayerSvg(state, b) + boxLayerHtml(state, b, opts.AgentName);\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>${title}</title>\n<style>${documentCss()}</style>\n</head>\n<body>\n<header class=\"exp-head\">\n<h1>${title}</h1>\n<div class=\"exp-meta\">Generated ${escapeHtml(opts.GeneratedAt)} &middot; Live session with ${agent}</div>\n</header>\n<main class=\"board-wrap\">\n<div class=\"board\" style=\"width:${n(b.W)}px;height:${n(b.H)}px;\">${boardInner}</div>\n</main>\n<footer class=\"exp-foot\">${state.ElementCount} elements &middot; you ${state.CountByAuthor('user')} &middot; ${agent} ${state.CountByAuthor('agent')}</footer>\n</body>\n</html>`;\n}\n\n// ────────────────────────────────────────────── standalone SVG export\n\n/** First line of a (possibly multi-line) text, clipped for single-line SVG rendering. */\nfunction svgLine(text: string, max = 60): string {\n const line = (text ?? '').split('\\n')[0].trim();\n return escapeHtml(line.length > max ? `${line.slice(0, max).trimEnd()}…` : line);\n}\n\nfunction boxItemSvg(item: WhiteboardItem, state: WhiteboardState, ox: number, oy: number): string {\n switch (item.Kind) {\n case 'sticky': {\n const b = state.ItemBounds(item);\n const isAgent = item.Author === 'agent';\n const fill = isAgent ? PALETTE.StickyAgentBg : PALETTE.StickyAmberBg;\n const stroke = isAgent ? PALETTE.StickyAgentBorder : PALETTE.StickyAmberBorder;\n const fs = item.FontSize ?? 12;\n const font = FONT_STACKS[item.FontFamily ?? 'sans'];\n const weight = item.FontWeight ?? 400;\n return `<rect x=\"${n(b.X - ox)}\" y=\"${n(b.Y - oy)}\" width=\"${n(b.W)}\" height=\"${n(b.H)}\" rx=\"6\" fill=\"${fill}\" stroke=\"${stroke}\"/>` +\n `<text x=\"${n(b.X - ox + 10)}\" y=\"${n(b.Y - oy + 10 + fs)}\" font-size=\"${n(fs)}\" font-family=\"${font}\" font-weight=\"${weight}\" fill=\"${PALETTE.TextPrimary}\">${svgLine(item.Text)}</text>`;\n }\n case 'shape': {\n const isAgent = item.Author === 'agent';\n const fill = isAgent ? PALETTE.ShapeAgentBg : PALETTE.ShapeUserBg;\n const stroke = isAgent ? PALETTE.ShapeAgentBorder : PALETTE.ShapeUserBorder;\n const x = item.X - ox, y = item.Y - oy;\n const cx = x + item.W / 2, cy = y + item.H / 2;\n const geom =\n item.Shape === 'ellipse'\n ? `<ellipse cx=\"${n(cx)}\" cy=\"${n(cy)}\" rx=\"${n(item.W / 2)}\" ry=\"${n(item.H / 2)}\" fill=\"${fill}\" stroke=\"${stroke}\"/>`\n : item.Shape === 'diamond'\n ? `<polygon points=\"${n(cx)},${n(y)} ${n(x + item.W)},${n(cy)} ${n(cx)},${n(y + item.H)} ${n(x)},${n(cy)}\" fill=\"${fill}\" stroke=\"${stroke}\"/>`\n : `<rect x=\"${n(x)}\" y=\"${n(y)}\" width=\"${n(item.W)}\" height=\"${n(item.H)}\" rx=\"6\" fill=\"${fill}\" stroke=\"${stroke}\"/>`;\n const sub = item.Sub\n ? `<text x=\"${n(cx)}\" y=\"${n(cy + 16)}\" font-size=\"10.5\" text-anchor=\"middle\" fill=\"${PALETTE.TextMuted}\">${svgLine(item.Sub)}</text>`\n : '';\n return geom +\n `<text x=\"${n(cx)}\" y=\"${n(cy + 4)}\" font-size=\"12\" font-weight=\"600\" text-anchor=\"middle\" fill=\"${PALETTE.TextPrimary}\">${svgLine(item.Label)}</text>` + sub;\n }\n case 'text': {\n const fs = item.FontSize ?? 12;\n const font = FONT_STACKS[item.FontFamily ?? 'sans'];\n const weight = item.FontWeight ?? 400;\n const color = item.Color ? escapeHtml(item.Color) : PALETTE.TextPrimary;\n return `<text x=\"${n(item.X - ox)}\" y=\"${n(item.Y - oy + fs)}\" font-size=\"${n(fs)}\" font-family=\"${font}\" font-weight=\"${weight}\" fill=\"${color}\">${svgLine(item.Text)}</text>`;\n }\n case 'image': {\n const b = state.ItemBounds(item);\n return `<rect x=\"${n(b.X - ox)}\" y=\"${n(b.Y - oy)}\" width=\"${n(b.W)}\" height=\"${n(b.H)}\" rx=\"6\" fill=\"${PALETTE.ImageBg}\" stroke=\"${PALETTE.ImageBorder}\"/>` +\n `<text x=\"${n(b.X - ox + b.W / 2)}\" y=\"${n(b.Y - oy + b.H / 2 + 4)}\" font-size=\"10.5\" text-anchor=\"middle\" fill=\"${PALETTE.TextMuted}\">${svgLine(item.Name)}</text>`;\n }\n case 'markdown': {\n // simple labeled rect — the first markdown line as the label\n const b = state.ItemBounds(item);\n return `<rect x=\"${n(b.X - ox)}\" y=\"${n(b.Y - oy)}\" width=\"${n(b.W)}\" height=\"${n(b.H)}\" rx=\"6\" fill=\"${PALETTE.PaperBg}\" stroke=\"${PALETTE.PaperBorder}\"/>` +\n `<text x=\"${n(b.X - ox + 10)}\" y=\"${n(b.Y - oy + 20)}\" font-size=\"11\" fill=\"${PALETTE.TextPrimary}\">${svgLine(item.Markdown)}</text>` +\n `<text x=\"${n(b.X - ox + 10)}\" y=\"${n(b.Y - oy + 36)}\" font-size=\"9.5\" fill=\"${PALETTE.TextMuted}\">markdown panel</text>`;\n }\n case 'html': {\n // simple labeled rect — title + an \"interactive widget\" note (never live HTML)\n const x = item.X - ox, y = item.Y - oy;\n return `<rect x=\"${n(x)}\" y=\"${n(y)}\" width=\"${n(item.W)}\" height=\"${n(item.H)}\" rx=\"6\" fill=\"${PALETTE.ImageBg}\" stroke=\"${PALETTE.ImageBorder}\" stroke-dasharray=\"5 4\"/>` +\n `<text x=\"${n(x + item.W / 2)}\" y=\"${n(y + item.H / 2 - 4)}\" font-size=\"11\" font-weight=\"600\" text-anchor=\"middle\" fill=\"${PALETTE.TextPrimary}\">${svgLine(item.Title || 'HTML widget')}</text>` +\n `<text x=\"${n(x + item.W / 2)}\" y=\"${n(y + item.H / 2 + 12)}\" font-size=\"9.5\" text-anchor=\"middle\" fill=\"${PALETTE.TextMuted}\">interactive HTML widget</text>`;\n }\n default:\n return '';\n }\n}\n\n/**\n * Build a standalone SVG document of the board snapshot: box items as SVG rects / shapes /\n * single-line text, plus the same vector layer (ink, connectors, highlight outlines).\n * All text is escaped; output is deterministic for a given state.\n *\n * Renders the ACTIVE page only — see {@link BuildWhiteboardExportSvgPages} for one SVG\n * document per page.\n */\nexport function BuildWhiteboardExportSvg(state: WhiteboardState): string {\n const b = exportBounds(state);\n const parts: string[] = [];\n for (const item of state.Items) {\n if (item.Kind === 'ink') {\n parts.push(inkSvg(item, b.X, b.Y));\n }\n else if (item.Kind === 'connector') {\n parts.push(connectorSvg(item, state, b.X, b.Y));\n }\n else if (item.Kind === 'highlight') {\n parts.push(highlightSvg(item, b.X, b.Y));\n }\n else {\n parts.push(boxItemSvg(item, state, b.X, b.Y));\n }\n }\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n` +\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${n(b.W)}\" height=\"${n(b.H)}\" viewBox=\"0 0 ${n(b.W)} ${n(b.H)}\" font-family=\"${FONT_STACKS.sans}\">` +\n `<defs><marker id=\"wb-arrow\" markerWidth=\"8\" markerHeight=\"8\" refX=\"7\" refY=\"3\" orient=\"auto\">` +\n `<path d=\"M0,0 L7,3 L0,6 Z\" fill=\"${PALETTE.ConnectorUser}\"/></marker></defs>` +\n `<rect x=\"0\" y=\"0\" width=\"${n(b.W)}\" height=\"${n(b.H)}\" fill=\"${PALETTE.PaperBg}\"/>` +\n `${parts.join('')}</svg>`;\n}\n\n// ────────────────────────────────────────────── multi-page export\n\n/** One page's rendered export document — the per-page output of the all-pages builders. */\nexport interface WhiteboardPageExport {\n /** The page's stable id (e.g. `page-2`). */\n PageID: string;\n /** The page's display name — callers typically suffix download filenames with it. */\n PageName: string;\n /** The fully rendered export document for that page. */\n Content: string;\n}\n\n/**\n * Enumerate per-page snapshot states WITHOUT mutating the live engine: the board's\n * persisted JSON is rehydrated once per page with that page forced active, so the pure\n * single-page builders (which always render the ACTIVE page) can render ANY page.\n * Pure: the live `state` is only read (`ToJSON` / `Pages`), never switched.\n */\nfunction buildPageStates(state: WhiteboardState): { Page: { ID: string; Name: string }; BoardState: WhiteboardState }[] {\n const raw = JSON.parse(state.ToJSON()) as Record<string, unknown>;\n return state.Pages.map((page) => {\n raw['activePageId'] = page.ID;\n return { Page: { ID: page.ID, Name: page.Name }, BoardState: WhiteboardState.FromJSON(JSON.stringify(raw)) };\n });\n}\n\n/**\n * Build one standalone SVG document PER PAGE (SVG is a single-image format, so \"all\n * pages\" means one file per page — the host downloads them sequentially, suffixing each\n * filename with the page name). Page order matches the board's page strip; each entry's\n * content is exactly what {@link BuildWhiteboardExportSvg} produces for that page.\n */\nexport function BuildWhiteboardExportSvgPages(state: WhiteboardState): WhiteboardPageExport[] {\n return buildPageStates(state).map(({ Page, BoardState }) => ({\n PageID: Page.ID,\n PageName: Page.Name,\n Content: BuildWhiteboardExportSvg(BoardState)\n }));\n}\n\n/**\n * Build ONE fully self-contained HTML document containing EVERY page of the board —\n * each page renders as its own titled section (\"name (n of m)\") with the same\n * board/chip/vector rendering as the single-page export, and the print CSS breaks\n * between pages. The footer totals span all pages. Deterministic and escape-safe like\n * the single-page builder. (The board's JSON/state persistence already carries all\n * pages inherently — this is the human-readable counterpart.)\n */\nexport function BuildWhiteboardExportHtmlAllPages(state: WhiteboardState, opts: WhiteboardExportOptions): string {\n const pages = buildPageStates(state);\n const title = escapeHtml(opts.Title);\n const agent = escapeHtml(opts.AgentName);\n let totalElements = 0;\n let totalUser = 0;\n let totalAgent = 0;\n const sections = pages.map(({ Page, BoardState }, index) => {\n totalElements += BoardState.ElementCount;\n totalUser += BoardState.CountByAuthor('user');\n totalAgent += BoardState.CountByAuthor('agent');\n const b = exportBounds(BoardState);\n const inner = BoardState.Items.length === 0\n ? `<div class=\"exp-empty\">This page is empty.</div>`\n : vectorLayerSvg(BoardState, b) + boxLayerHtml(BoardState, b, opts.AgentName);\n return `<section class=\"exp-page\">\n<h2 class=\"exp-page__name\">${escapeHtml(Page.Name)} <span class=\"exp-page__idx\">(${index + 1} of ${pages.length})</span></h2>\n<div class=\"board-wrap\"><div class=\"board\" style=\"width:${n(b.W)}px;height:${n(b.H)}px;\">${inner}</div></div>\n</section>`;\n }).join('\\n');\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<title>${title}</title>\n<style>${documentCss()}</style>\n</head>\n<body>\n<header class=\"exp-head\">\n<h1>${title}</h1>\n<div class=\"exp-meta\">Generated ${escapeHtml(opts.GeneratedAt)} &middot; Live session with ${agent} &middot; ${pages.length} ${pages.length === 1 ? 'page' : 'pages'}</div>\n</header>\n<main>\n${sections}\n</main>\n<footer class=\"exp-foot\">${totalElements} elements across ${pages.length} ${pages.length === 1 ? 'page' : 'pages'} &middot; you ${totalUser} &middot; ${agent} ${totalAgent}</footer>\n</body>\n</html>`;\n}\n"]}
@@ -0,0 +1,174 @@
1
+ import { EventEmitter, OnDestroy, OnInit } from '@angular/core';
2
+ import { WhiteboardFontFamily, WhiteboardItemAddedEventArgs, WhiteboardItemAddingEventArgs, WhiteboardItemRemovedEventArgs, WhiteboardItemRemovingEventArgs, WhiteboardItemUpdatedEventArgs, WhiteboardItemUpdatingEventArgs, WhiteboardState } from './whiteboard-state';
3
+ import { RealtimeWhiteboardBoardComponent, WhiteboardAgentPresence, WhiteboardContentAppliedEventArgs, WhiteboardContentApplyingEventArgs } from './whiteboard-board.component';
4
+ import { WhiteboardWidgetInteractionEvent, WhiteboardWidgetSubmitEvent, WhiteboardWidgetSubmittingEventArgs } from './whiteboard-widget-bridge';
5
+ import { WhiteboardTool } from './whiteboard-toolbar.component';
6
+ import * as i0 from "@angular/core";
7
+ /**
8
+ * LIVE WHITEBOARD host (`mj-realtime-whiteboard-host`): board header (title / saved chip /
9
+ * ownership legend / "What [Agent] sees" popover / Focus toggle), the board surface with its
10
+ * floating toolbar + zoom cluster, the agent action toast with Undo, and the status footer —
11
+ * everything EXCEPT the overlay/tab chrome, which the session shell owns.
12
+ *
13
+ * Integration contract:
14
+ * - `State` is created by the integration layer (channel state of record) and passed in;
15
+ * - `SceneDelta` emits the debounced (750 ms), coalesced scene-delta JSON on user changes —
16
+ * the perception feed the integration pipes into the live agent context;
17
+ * - `ApplyAgentTool(toolName, argsJson)` executes one agent channel tool
18
+ * (`Whiteboard_AddNote` … see `WHITEBOARD_TOOL_DEFINITIONS`) with the violet pop-in,
19
+ * toast and presence-cursor garnish, returning the result JSON for the tool round-trip;
20
+ * - `AgentUndo` fires when the user clicks Undo on the agent-action toast;
21
+ * - `FocusModeChange` asks the shell to collapse/restore the call rail ("Focus board").
22
+ *
23
+ * Extensibility (before/after events): the host mirrors the engine's cancelable
24
+ * BEFORE / AFTER mutation pairs as outputs (`ItemAdding`/`ItemAdded`,
25
+ * `ItemUpdating`/`ItemUpdated`, `ItemRemoving`/`ItemRemoved`) and forwards the board's
26
+ * editor + widget pairs (`ContentApplying`/`ContentApplied`,
27
+ * `WidgetSubmitting`/`WidgetSubmitted`). All BEFORE events honor `Cancel = true` set
28
+ * synchronously by a handler.
29
+ */
30
+ export declare class RealtimeWhiteboardHostComponent implements OnInit, OnDestroy {
31
+ /** Shared board state engine, owned by the integration layer. */
32
+ State: WhiteboardState;
33
+ /** Display name of the session's agent (legend, chips, popover, toast). */
34
+ AgentName: string;
35
+ /** Board title shown in the header. */
36
+ BoardTitle: string;
37
+ /** Persistence chip text (e.g. "Saved to session · v14"). */
38
+ SavedLabel: string;
39
+ /** Debounced (750 ms), coalesced scene-delta JSON — the live perception feed. */
40
+ SceneDelta: EventEmitter<string>;
41
+ /** The user clicked Undo on the agent-action toast (the undo itself already applied). */
42
+ AgentUndo: EventEmitter<void>;
43
+ /** Focus-board toggle — the session shell collapses/restores the call rail. */
44
+ FocusModeChange: EventEmitter<boolean>;
45
+ /** Emitted when the user picks "Save to artifacts" — the channel plugin persists via its host context. */
46
+ SaveToArtifactsRequested: EventEmitter<void>;
47
+ /**
48
+ * Cancelable BEFORE event (forwarded from the board): a sandboxed HTML widget submitted
49
+ * input via `MJWhiteboard.submit` and it passed validation. Set `Cancel = true`
50
+ * synchronously to drop it before {@link WidgetSubmitted} fires.
51
+ */
52
+ WidgetSubmitting: EventEmitter<WhiteboardWidgetSubmittingEventArgs>;
53
+ /**
54
+ * AFTER event: a sandboxed HTML widget submitted user input via `MJWhiteboard.submit`
55
+ * (validated + size-capped by the board, not canceled). Integration layers forward it
56
+ * to their agent runtime — e.g. MJ's channel plugin sends a `[whiteboard]` context note.
57
+ */
58
+ WidgetSubmitted: EventEmitter<WhiteboardWidgetSubmitEvent>;
59
+ /**
60
+ * AMBIENT widget telemetry (forwarded from the board): the injected recorder observed
61
+ * passive form activity (clicks / changes / typing / focus) inside a sandboxed HTML
62
+ * widget, validated + pre-summarized. Integration layers forward it to their agent
63
+ * runtime as throttled, low-priority background context — e.g. MJ's channel plugin sends
64
+ * an "ambient activity" `[whiteboard]` note at most once per widget per few seconds.
65
+ */
66
+ WidgetInteraction: EventEmitter<WhiteboardWidgetInteractionEvent>;
67
+ /**
68
+ * Cancelable BEFORE event (forwarded from the board): an in-board editor commit is
69
+ * about to write to the state engine. Set `Cancel = true` synchronously to discard it.
70
+ */
71
+ ContentApplying: EventEmitter<WhiteboardContentApplyingEventArgs>;
72
+ /** AFTER event (forwarded from the board): an editor commit applied. */
73
+ ContentApplied: EventEmitter<WhiteboardContentAppliedEventArgs>;
74
+ /** Cancelable BEFORE mirror of {@link WhiteboardState.ItemAdding$}. */
75
+ ItemAdding: EventEmitter<WhiteboardItemAddingEventArgs>;
76
+ /** AFTER mirror of {@link WhiteboardState.ItemAdded$}. */
77
+ ItemAdded: EventEmitter<WhiteboardItemAddedEventArgs>;
78
+ /** Cancelable BEFORE mirror of {@link WhiteboardState.ItemUpdating$} (update / move / reorder). */
79
+ ItemUpdating: EventEmitter<WhiteboardItemUpdatingEventArgs>;
80
+ /** AFTER mirror of {@link WhiteboardState.ItemUpdated$}. */
81
+ ItemUpdated: EventEmitter<WhiteboardItemUpdatedEventArgs>;
82
+ /** Cancelable BEFORE mirror of {@link WhiteboardState.ItemRemoving$}. */
83
+ ItemRemoving: EventEmitter<WhiteboardItemRemovingEventArgs>;
84
+ /** AFTER mirror of {@link WhiteboardState.ItemRemoved$}. */
85
+ ItemRemoved: EventEmitter<WhiteboardItemRemovedEventArgs>;
86
+ Board?: RealtimeWhiteboardBoardComponent;
87
+ Tool: WhiteboardTool;
88
+ PenColor: string;
89
+ PenWidth: number;
90
+ ShapeKind: 'rect' | 'ellipse' | 'diamond';
91
+ TextSize: number;
92
+ TextFamily: WhiteboardFontFamily;
93
+ TextBold: boolean;
94
+ TextColor: string | null;
95
+ SeesOpen: boolean;
96
+ FocusMode: boolean;
97
+ ExportOpen: boolean;
98
+ AgentPresence: WhiteboardAgentPresence | null;
99
+ ToastText: string | null;
100
+ private toastPhrases;
101
+ private toastTimer;
102
+ private presenceTimer;
103
+ LastDeltaJson: string;
104
+ private lastDeltaToken;
105
+ private lastDeltaAt;
106
+ private deltaTimer;
107
+ NowTick: number;
108
+ private ticker;
109
+ private changedSub?;
110
+ private mirrorSubs;
111
+ private cdr;
112
+ ngOnInit(): void;
113
+ ngOnDestroy(): void;
114
+ /**
115
+ * Execute one agent whiteboard tool (author `'agent'`, one undo batch), with the UI
116
+ * garnish: presence cursor glides to the mutation point, the new item pops in violet,
117
+ * and the action toast (with Undo) appears. Returns the result JSON string that the
118
+ * integration layer feeds back to the realtime model as the `tool_response`.
119
+ */
120
+ ApplyAgentTool(toolName: string, argsJson: string): string;
121
+ ToggleSees(event: Event): void;
122
+ CloseSees(): void;
123
+ ToggleFocus(): void;
124
+ ToggleExport(event: Event): void;
125
+ CloseExport(): void;
126
+ /** Download the board as one self-contained HTML document. */
127
+ /** Request a first-class artifact snapshot of the board (handled by the channel plugin). */
128
+ ExportSaveToArtifacts(): void;
129
+ ExportDownloadHtml(): void;
130
+ /** Download ONE self-contained HTML document containing EVERY page (titled sections). */
131
+ ExportDownloadHtmlAllPages(): void;
132
+ /** Download the ACTIVE page as a standalone SVG document. */
133
+ ExportDownloadSvg(): void;
134
+ /**
135
+ * Download EVERY page as its own standalone SVG document (SVG is single-image, so
136
+ * "all pages" is one file per page, downloaded sequentially with the page name
137
+ * slug-suffixed into each filename).
138
+ */
139
+ ExportDownloadSvgAllPages(): void;
140
+ /** Whether the board has more than one page (gates the "all pages" export entries). */
141
+ get HasMultiplePages(): boolean;
142
+ /**
143
+ * Print the board: open a blank window, write the self-contained export document and
144
+ * invoke the print dialog (same precedent as the artifact viewer's print path). When the
145
+ * popup is blocked this is a logged no-op — nothing breaks, the user can retry.
146
+ */
147
+ ExportPrint(): void;
148
+ private buildExportHtml;
149
+ /** Shared options for the HTML export builders (single page + all pages). */
150
+ private exportOptions;
151
+ /** Safe filename fragment from a page name (lowercased, non-alphanumerics collapse to '-'). */
152
+ private static fileNameSlug;
153
+ private downloadBlob;
154
+ private static exportDateStamp;
155
+ OnToastUndo(event: Event): void;
156
+ OnKeydown(event: KeyboardEvent): void;
157
+ get ElementCount(): number;
158
+ get UserCount(): number;
159
+ get AgentCount(): number;
160
+ get CurrentSeq(): number;
161
+ /** "2 s ago" style age of the last emitted delta (the ticker keeps it fresh). */
162
+ get LastDeltaLabel(): string;
163
+ get SceneDeltaDebounceMs(): number;
164
+ private scheduleSceneDelta;
165
+ private emitSceneDelta;
166
+ private showAgentPresence;
167
+ private pushToastPhrase;
168
+ private hideToast;
169
+ private static toolPhrase;
170
+ private static toolForKey;
171
+ static ɵfac: i0.ɵɵFactoryDeclaration<RealtimeWhiteboardHostComponent, never>;
172
+ static ɵcmp: i0.ɵɵComponentDeclaration<RealtimeWhiteboardHostComponent, "mj-realtime-whiteboard-host", never, { "State": { "alias": "State"; "required": true; }; "AgentName": { "alias": "AgentName"; "required": false; }; "BoardTitle": { "alias": "BoardTitle"; "required": false; }; "SavedLabel": { "alias": "SavedLabel"; "required": false; }; }, { "SceneDelta": "SceneDelta"; "AgentUndo": "AgentUndo"; "FocusModeChange": "FocusModeChange"; "SaveToArtifactsRequested": "SaveToArtifactsRequested"; "WidgetSubmitting": "WidgetSubmitting"; "WidgetSubmitted": "WidgetSubmitted"; "WidgetInteraction": "WidgetInteraction"; "ContentApplying": "ContentApplying"; "ContentApplied": "ContentApplied"; "ItemAdding": "ItemAdding"; "ItemAdded": "ItemAdded"; "ItemUpdating": "ItemUpdating"; "ItemUpdated": "ItemUpdated"; "ItemRemoving": "ItemRemoving"; "ItemRemoved": "ItemRemoved"; }, never, never, true, never>;
173
+ }
174
+ //# sourceMappingURL=whiteboard-host.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whiteboard-host.component.d.ts","sourceRoot":"","sources":["../../src/lib/whiteboard-host.component.ts"],"names":[],"mappings":"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"}