carboncanvas 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentsRuntime-CRhC_WJU.js","sources":["../src/CommentLayer/MentionTextarea.tsx","../src/CommentLayer/Composer.tsx","../src/CommentLayer/layout.ts","../src/CommentLayer/selector.ts","../src/CommentLayer/pan.ts","../src/CommentLayer/pinAnchor.ts","../src/CommentLayer/PreviewImage.tsx","../src/CommentLayer/mentions.tsx","../src/CommentLayer/types.ts","../src/CommentLayer/CommentsSidebar.tsx","../src/CommentLayer/PinLayer.tsx","../src/CommentLayer/Thread.tsx","../src/CommentLayer/mockClient.ts","../src/CommentLayer/networkClient.ts","../src/CommentLayer/useComments.ts","../node_modules/engine.io-parser/build/esm/commons.js","../node_modules/engine.io-parser/build/esm/encodePacket.browser.js","../node_modules/engine.io-parser/build/esm/contrib/base64-arraybuffer.js","../node_modules/engine.io-parser/build/esm/decodePacket.browser.js","../node_modules/engine.io-parser/build/esm/index.js","../node_modules/@socket.io/component-emitter/lib/esm/index.js","../node_modules/engine.io-client/build/esm/globals.js","../node_modules/engine.io-client/build/esm/util.js","../node_modules/engine.io-client/build/esm/contrib/parseqs.js","../node_modules/engine.io-client/build/esm/transport.js","../node_modules/engine.io-client/build/esm/transports/polling.js","../node_modules/engine.io-client/build/esm/contrib/has-cors.js","../node_modules/engine.io-client/build/esm/transports/polling-xhr.js","../node_modules/engine.io-client/build/esm/transports/websocket.js","../node_modules/engine.io-client/build/esm/transports/webtransport.js","../node_modules/engine.io-client/build/esm/transports/index.js","../node_modules/engine.io-client/build/esm/contrib/parseuri.js","../node_modules/engine.io-client/build/esm/socket.js","../node_modules/socket.io-client/build/esm/url.js","../node_modules/socket.io-parser/build/esm/is-binary.js","../node_modules/socket.io-parser/build/esm/binary.js","../node_modules/socket.io-parser/build/esm/index.js","../node_modules/socket.io-client/build/esm/on.js","../node_modules/socket.io-client/build/esm/socket.js","../node_modules/socket.io-client/build/esm/contrib/backo2.js","../node_modules/socket.io-client/build/esm/manager.js","../node_modules/socket.io-client/build/esm/index.js","../src/CommentLayer/realtimeClient.ts","../src/CommentLayer/useRealtime.ts","../src/CommentLayer/CursorLayer.tsx","../src/BrandMark.tsx","../src/CommentLayer/Facepile.tsx","../src/CommentLayer/SignInDialog.tsx","../src/CommentLayer/CommentsRuntime.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { CSSProperties } from 'react';\nimport type { DirectoryPerson } from './types';\nimport { Avatar, FONT, textareaStyle } from './ui';\n\n/**\n * A `@`-mention input. Type `@` + a name, pick from the dropdown, and the mention\n * lands as an atomic blue chip — a single Backspace deletes the whole thing, and it\n * renders as `@Name` (no `@[brackets]` leaking through).\n *\n * It's a `contenteditable` div, not a <textarea>, because a textarea can only hold\n * flat text — it can't paint an inline chip or treat one as a single deletable unit.\n * Each mention is a `contenteditable=\"false\"` <span>; browsers delete such a span\n * atomically for free. We keep the DOM FLAT (text nodes + chip spans + `\\n` text,\n * no <div>/<br> wrappers) by intercepting Enter and sanitizing paste, so reading the\n * value back out is a simple childNodes walk.\n *\n * The component is effectively uncontrolled: it owns its DOM and reports changes via\n * `onChange(display, serialized)`. `value` is only read to detect an external reset\n * (parent clears the field to '' after submit) — see the reset effect.\n *\n * - display: text with `@[Name]` tokens — what the parent length-checks.\n * - serialized: `@[Name](rc:id)` — what gets submitted + the backend parses.\n *\n * The dropdown is portaled to <body> and positioned `fixed` from the editor's screen\n * rect: the composer rides inside the (transformed, overflow-hidden) canvas pin\n * wrapper, so an in-flow dropdown would be clipped/mis-scaled.\n */\n\n// Active query = a trailing `@word` at the caret, only when the `@` starts a token\n// (start-of-node — i.e. start-of-text or right after a chip — or after whitespace),\n// so emails like \"a@b\" don't trigger it. No spaces in the query.\nconst QUERY_RE = /(?:^|\\s)@([^@\\s[\\]\\n]*)$/;\n\nconst NBSP = ' ';\n\ninterface ActiveQuery {\n node: Text; // the text node holding the `@query`\n atIndex: number; // offset of `@` within node\n caretOffset: number; // caret offset within node\n query: string;\n}\n\n/** Read the editor DOM back into (display, serialized) strings. Assumes a flat tree. */\nfunction readEditor(root: HTMLElement): { display: string; serialized: string } {\n let display = '';\n let serialized = '';\n root.childNodes.forEach((node) => {\n if (node.nodeType === Node.TEXT_NODE) {\n const t = node.textContent || '';\n display += t;\n serialized += t;\n } else if (node.nodeType === Node.ELEMENT_NODE) {\n const el = node as HTMLElement;\n if ('mention' in el.dataset) {\n const name = el.dataset.name || '';\n const id = el.dataset.id || '';\n display += `@[${name}]`;\n serialized += id ? `@[${name}](rc:${id})` : `@[${name}]`;\n } else if (el.tagName === 'BR') {\n display += '\\n';\n serialized += '\\n';\n } else {\n // Defensive: an unexpected nested element (stray paste) → flatten its text.\n const t = el.textContent || '';\n display += t;\n serialized += t;\n }\n }\n });\n const norm = (s: string) => s.replace(/ /g, ' '); // nbsp → space for the stored body\n return { display: norm(display), serialized: norm(serialized) };\n}\n\nfunction makeChip(p: DirectoryPerson): HTMLSpanElement {\n const span = document.createElement('span');\n span.dataset.mention = '';\n span.dataset.id = p.personId;\n span.dataset.name = p.name;\n span.contentEditable = 'false';\n span.textContent = `@${p.name}`;\n span.style.cssText =\n 'color:#9aa6bb;background:rgba(154,166,187,0.12);border-radius:5px;padding:1px 5px;font-weight:600;white-space:nowrap;';\n return span;\n}\n\nexport function MentionTextarea({\n value,\n onChange,\n searchDirectory,\n placeholder,\n autoFocus,\n minHeight,\n onSubmitKey,\n onEscape,\n}: {\n /** Display string (with `@[Name]` tokens). Read-only here except for external resets. */\n value: string;\n /** (displayString, serializedMarkup) — store the markup, length-check the display. */\n onChange: (display: string, serialized: string) => void;\n searchDirectory: (q: string) => Promise<DirectoryPerson[]>;\n placeholder?: string;\n autoFocus?: boolean;\n minHeight?: number;\n /** Enter (or Cmd/Ctrl+Enter) while the dropdown is closed — post. Shift+Enter = newline. */\n onSubmitKey?: () => void;\n /** Esc while the dropdown is closed. */\n onEscape?: () => void;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n const activeQuery = useRef<ActiveQuery | null>(null);\n const searchSeq = useRef(0);\n const debounce = useRef<ReturnType<typeof setTimeout>>();\n\n const [results, setResults] = useState<DirectoryPerson[]>([]);\n const [open, setOpen] = useState(false);\n const [sel, setSel] = useState(0);\n const [pos, setPos] = useState<{ left: number; top: number; width: number } | null>(null);\n const [empty, setEmpty] = useState(true);\n\n // Display order = canvas participants first, then everyone else (the service\n // already ranks this way, but partitioning here keeps the headers correct even\n // if it doesn't). `groupStart` is the index where \"Everyone else\" begins, or -1\n // when there's nothing to split — a flat list (no participant tags = mock client\n // / no canvasId, or an all-one-group result) renders with no headers at all.\n const { ordered, groupStart } = useMemo(() => {\n const here = results.filter((p) => p.isParticipant);\n const rest = results.filter((p) => !p.isParticipant);\n return {\n ordered: here.length ? [...here, ...rest] : results,\n groupStart: here.length && rest.length ? here.length : -1,\n };\n }, [results]);\n\n // Focus across the next few frames: the composer's pin wrapper mounts display:none\n // and is revealed a frame later by PinLayer, so a focus() at mount lands on a\n // hidden node.\n useEffect(() => {\n if (!autoFocus) return;\n let raf = 0;\n let tries = 0;\n const tryFocus = () => {\n const el = ref.current;\n if (el && el.offsetParent !== null) {\n el.focus();\n placeCaretAtEnd(el);\n return;\n }\n if (tries++ < 8) raf = requestAnimationFrame(tryFocus);\n };\n tryFocus();\n return () => cancelAnimationFrame(raf);\n }, [autoFocus]);\n\n // External reset: when the parent clears `value` to '' (e.g. after submitting a\n // reply) but the editor still has content, wipe the DOM. This is the only path by\n // which `value` drives the DOM — otherwise the editor is uncontrolled.\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n if (value === '' && readEditor(el).display !== '') {\n el.innerHTML = '';\n setEmpty(true);\n onChange('', '');\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value]);\n\n const closeDropdown = () => {\n setOpen(false);\n setResults([]);\n activeQuery.current = null;\n };\n\n const runSearch = (q: string) => {\n const seq = ++searchSeq.current;\n clearTimeout(debounce.current);\n debounce.current = setTimeout(async () => {\n try {\n const r = await searchDirectory(q);\n if (seq === searchSeq.current) {\n setResults(r);\n setSel(0);\n }\n } catch {\n if (seq === searchSeq.current) setResults([]);\n }\n }, 150);\n };\n\n const getActiveQuery = (): ActiveQuery | null => {\n const el = ref.current;\n const selection = window.getSelection();\n if (!el || !selection || !selection.isCollapsed || selection.rangeCount === 0) return null;\n const node = selection.anchorNode;\n // The caret must sit in a text node (the typing area), not on a chip.\n if (!node || node.nodeType !== Node.TEXT_NODE || !el.contains(node)) return null;\n const offset = selection.anchorOffset;\n const before = (node.textContent || '').slice(0, offset);\n const m = before.match(QUERY_RE);\n if (!m) return null;\n return { node: node as Text, atIndex: before.lastIndexOf('@'), caretOffset: offset, query: m[1] ?? '' };\n };\n\n // Recompute value + the active @query after any edit. The single source of truth\n // for \"what's in the box\" and \"is the picker open\".\n const sync = () => {\n const el = ref.current;\n if (!el) return;\n const { display, serialized } = readEditor(el);\n setEmpty(display === '');\n onChange(display, serialized);\n const q = getActiveQuery();\n if (q) {\n activeQuery.current = q;\n const rect = el.getBoundingClientRect();\n setPos({ left: rect.left, top: rect.bottom + 4, width: Math.max(220, Math.min(300, rect.width)) });\n setOpen(true);\n runSearch(q.query.trim());\n } else {\n activeQuery.current = null;\n closeDropdown();\n }\n };\n\n const insertTextAtCaret = (text: string) => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const range = selection.getRangeAt(0);\n range.deleteContents();\n const tn = document.createTextNode(text);\n range.insertNode(tn);\n range.setStartAfter(tn);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n };\n\n const pick = (p: DirectoryPerson) => {\n const el = ref.current;\n const q = activeQuery.current;\n const selection = window.getSelection();\n if (!el || !selection) return;\n el.focus();\n\n const range = document.createRange();\n if (q) {\n // Replace the typed `@query` with the chip.\n range.setStart(q.node, q.atIndex);\n range.setEnd(q.node, q.caretOffset);\n } else {\n // No active query (shouldn't happen via the dropdown) — drop the chip at the end.\n range.selectNodeContents(el);\n range.collapse(false);\n }\n range.deleteContents();\n\n const chip = makeChip(p);\n const space = document.createTextNode(NBSP); // a real space after the chip; caret lands here\n const frag = document.createDocumentFragment();\n frag.append(chip, space);\n range.insertNode(frag);\n\n const after = document.createRange();\n after.setStartAfter(space);\n after.collapse(true);\n selection.removeAllRanges();\n selection.addRange(after);\n\n closeDropdown();\n const { display, serialized } = readEditor(el);\n setEmpty(display === '');\n onChange(display, serialized);\n };\n\n const onKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (open && ordered.length) {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSel((s) => (s + 1) % ordered.length);\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSel((s) => (s - 1 + ordered.length) % ordered.length);\n return;\n }\n if (e.key === 'Enter' || e.key === 'Tab') {\n e.preventDefault();\n pick(ordered[sel]!);\n return;\n }\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation(); // don't also close the composer\n closeDropdown();\n return;\n }\n }\n if (e.key === 'Enter') {\n // Dropdown closed: Shift+Enter = newline, plain Enter (or Cmd/Ctrl+Enter) = post.\n e.preventDefault();\n if (e.shiftKey) {\n // Insert a flat `\\n` ourselves so the browser doesn't wrap lines in\n // <div>/<br> (which would break the flat childNodes read).\n insertTextAtCaret('\\n');\n sync();\n } else {\n onSubmitKey?.();\n }\n return;\n }\n if (e.key === 'Escape') onEscape?.();\n };\n\n const onPaste = (e: React.ClipboardEvent<HTMLDivElement>) => {\n // Plain text only — keep the tree flat (no pasted markup/chips).\n e.preventDefault();\n const text = e.clipboardData?.getData('text/plain') ?? '';\n insertTextAtCaret(text.replace(/\\r\\n?/g, '\\n'));\n sync();\n };\n\n return (\n <>\n <div style={{ position: 'relative' }}>\n {empty && placeholder && <div style={placeholderStyle}>{placeholder}</div>}\n <div\n ref={ref}\n role=\"textbox\"\n aria-multiline=\"true\"\n contentEditable\n suppressContentEditableWarning\n onInput={sync}\n onKeyDown={onKeyDown}\n onPaste={onPaste}\n onBlur={() => setTimeout(closeDropdown, 120)}\n style={{ ...editorStyle, ...(minHeight ? { minHeight } : null) }}\n />\n </div>\n {open &&\n pos &&\n createPortal(\n <div data-cl-ui style={{ ...dropdownStyle, left: pos.left, top: pos.top, width: pos.width }}>\n {ordered.length === 0 ? (\n <div style={hintStyle}>Type a name to mention…</div>\n ) : (\n ordered.map((p, i) => (\n <div key={p.personId}>\n {groupStart >= 0 && i === 0 && <div style={sectionStyle}>On this canvas</div>}\n {groupStart >= 0 && i === groupStart && <div style={sectionStyle}>Everyone else</div>}\n <div\n // mousedown+preventDefault keeps editor focus (no blur → no caret loss)\n onMouseDown={(e) => {\n e.preventDefault();\n pick(p);\n }}\n onMouseEnter={() => setSel(i)}\n style={{ ...rowStyle, background: i === sel ? '#f1f5ff' : 'transparent' }}\n >\n <Avatar user={{ id: p.personId, username: p.name, displayName: p.name, avatarUrl: null }} size={22} />\n <div style={{ minWidth: 0 }}>\n <div style={nameStyle}>{p.name}</div>\n <div style={emailStyle}>{p.email}</div>\n </div>\n </div>\n </div>\n ))\n )}\n </div>,\n document.body,\n )}\n </>\n );\n}\n\n/** Place the caret at the end of a contenteditable element. */\nfunction placeCaretAtEnd(el: HTMLElement) {\n const selection = window.getSelection();\n if (!selection) return;\n const range = document.createRange();\n range.selectNodeContents(el);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n\nconst editorStyle: CSSProperties = {\n ...textareaStyle,\n resize: undefined,\n whiteSpace: 'pre-wrap',\n overflowWrap: 'anywhere',\n lineHeight: 1.5,\n cursor: 'text',\n overflowY: 'auto',\n maxHeight: 160,\n};\n\nconst placeholderStyle: CSSProperties = {\n position: 'absolute',\n left: 11,\n top: 8,\n fontSize: 13,\n color: '#9a9aa2',\n pointerEvents: 'none',\n fontFamily: FONT,\n};\n\nconst dropdownStyle: CSSProperties = {\n position: 'fixed',\n zIndex: 2147483647,\n maxHeight: 240,\n overflowY: 'auto',\n background: '#fff',\n border: '1px solid #e4e4e7',\n borderRadius: 10,\n boxShadow: '0 10px 30px rgba(0,0,0,0.20)',\n padding: 4,\n fontFamily: FONT,\n};\n\nconst rowStyle: CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '6px 8px',\n borderRadius: 7,\n cursor: 'pointer',\n};\n\nconst nameStyle: CSSProperties = {\n fontSize: 13,\n fontWeight: 600,\n color: '#1f1f23',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n};\n\nconst emailStyle: CSSProperties = {\n fontSize: 11.5,\n color: '#9a9aa2',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n};\n\nconst hintStyle: CSSProperties = { padding: '8px 10px', fontSize: 12.5, color: '#9a9aa2' };\n\nconst sectionStyle: CSSProperties = {\n padding: '6px 8px 3px',\n fontSize: 10.5,\n fontWeight: 700,\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n color: '#a1a1aa',\n};\n","import { useRef, useState } from 'react';\nimport { MentionTextarea } from './MentionTextarea';\nimport type { DirectoryPerson } from './types';\nimport { cardStyle, ghostBtn, primaryBtn } from './ui';\n\n/**\n * New-comment composer popover, anchored to a freshly dropped pin. The textarea is\n * a MentionTextarea: type `@` to mention a collaborator. It surfaces both the\n * display string (with `@[Name]` tokens, for the UI) and the serialized markup\n * (`@[Name](rc:id)`, what we submit + the backend parses).\n *\n * No \"may not survive edits\" nag — every host element carries a build-stamped\n * `data-anchor`, so pins anchor durably; the anchor-lost ⚠ is the honest signal.\n */\nexport function Composer({\n busy,\n error,\n searchDirectory,\n onSubmit,\n onCancel,\n}: {\n busy?: boolean;\n /** Inline error kept below the textarea when a post fails (P2.1) — the draft\n * stays open so the reviewer can retry without losing what they typed. */\n error?: string | null;\n searchDirectory: (q: string) => Promise<DirectoryPerson[]>;\n onSubmit: (body: string) => void;\n onCancel: () => void;\n}) {\n const [display, setDisplay] = useState('');\n const serialized = useRef('');\n\n const submit = () => {\n const t = serialized.current.trim();\n if (t) onSubmit(t);\n };\n\n return (\n <div style={cardStyle} onClick={(e) => e.stopPropagation()}>\n <div style={{ padding: 12 }}>\n <MentionTextarea\n value={display}\n onChange={(d, s) => {\n setDisplay(d);\n serialized.current = s;\n }}\n searchDirectory={searchDirectory}\n placeholder=\"Add a comment… @ to mention\"\n autoFocus\n onSubmitKey={submit}\n onEscape={onCancel}\n />\n {error && (\n <div role=\"alert\" style={{ marginTop: 8, color: '#e88', fontSize: 12, lineHeight: 1.4 }}>\n {error}\n </div>\n )}\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8, marginTop: 10 }}>\n <button type=\"button\" style={ghostBtn} onClick={onCancel} disabled={busy}>\n Cancel\n </button>\n <button\n type=\"button\"\n style={{ ...primaryBtn, opacity: busy || !display.trim() ? 0.5 : 1 }}\n onClick={submit}\n disabled={busy || !display.trim()}\n >\n {busy ? 'Posting…' : 'Comment'}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","// Comments-panel layout constants. One source of truth shared by the sidebar\n// (CommentsSidebar) and the auto-pan math (pan.ts, which leaves room for the\n// right rail + the pin popover) so the two never drift.\nexport const PANEL_W = 320;\nexport const PANEL_GAP = 16;\n","// Layer 2 of the pin anchor — a stable, artboard-scoped CSS selector.\n//\n// Reality check (see PLAN.md): in this Tailwind-only, JSX-edited codebase,\n// `data-name` is the ONLY anchor that survives a real refactor. Everything else\n// degrades gracefully toward \"anchor lost\". So this builder prioritizes durable\n// attributes hard, and only falls back to `tag:nth-of-type(n)` as a last resort.\n\n// Priority order. Authored attrs first (they survive a JSX refactor because you\n// carry them with the element), then `data-anchor` — the build-time source\n// `relPath:line:col` stamp every host element gets (tools/babel-plugin-data-anchor.js).\n// data-anchor is globally unique + stable across runtime DOM changes and edits\n// elsewhere in the file; it only drifts if lines are inserted *above* the element.\n// That makes it a far stronger default than `tag:nth-of-type(n)`.\nconst DURABLE_ATTRS = ['data-name', 'data-comment-anchor', 'data-testid', 'data-anchor'] as const;\n\n// Tailwind / Spring utility-class prefixes — skipped when picking a \"semantic\"\n// class, because they carry no identity and change constantly. Anything NOT\n// matching is treated as semantic (e.g. `hero-card`, `composer`).\nconst UTILITY_PREFIX =\n /^(text|bg|border|rounded|shadow|ring|outline|p|px|py|pt|pb|pl|pr|m|mx|my|mt|mb|ml|mr|w|h|min|max|size|flex|grid|gap|space|divide|items|justify|self|content|place|order|col|row|basis|grow|shrink|absolute|relative|fixed|sticky|static|inset|top|left|right|bottom|z|opacity|overflow|object|leading|tracking|font|italic|uppercase|lowercase|capitalize|truncate|whitespace|break|cursor|select|pointer|transition|duration|ease|delay|animate|transform|translate|scale|rotate|skew|origin|will|backdrop|filter|blur|brightness|contrast|aspect|table|list|align|inline|hidden|visible|sr|antialiased|sui)([-:]|$)/;\n\nfunction isSemanticClass(cls: string): boolean {\n if (!cls) return false;\n // Strip Tailwind variant prefixes (hover:, md:, etc.) before testing.\n const base = cls.includes(':') ? cls.slice(cls.lastIndexOf(':') + 1) : cls;\n if (!base || /^[[(]/.test(base)) return false; // arbitrary values like [w-4]\n return !UTILITY_PREFIX.test(base);\n}\n\nfunction cssEscape(s: string): string {\n // CSS.escape exists in all evergreen browsers; fall back for SSR/tests.\n const fn = (globalThis as { CSS?: { escape?: (s: string) => string } }).CSS?.escape;\n return fn ? fn(s) : s.replace(/[^a-zA-Z0-9_-]/g, (c) => `\\\\${c}`);\n}\n\nfunction attrSelector(name: string, value: string): string {\n return `[${name}=\"${value.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"]`;\n}\n\n/** nth-of-type index (1-based) among same-tag siblings. */\nfunction nthOfType(el: Element): number {\n const tag = el.tagName;\n let i = 1;\n let sib = el.previousElementSibling;\n while (sib) {\n if (sib.tagName === tag) i++;\n sib = sib.previousElementSibling;\n }\n return i;\n}\n\n/** The most stable single-element selector segment available for `el`. */\nfunction segmentFor(el: Element): string {\n for (const attr of DURABLE_ATTRS) {\n const v = el.getAttribute(attr);\n if (v) return attrSelector(attr, v);\n }\n const id = el.getAttribute('id');\n if (id && /^[A-Za-z][\\w-]*$/.test(id)) return `#${cssEscape(id)}`;\n\n const tag = el.tagName.toLowerCase();\n const classes = (el.getAttribute('class') || '').split(/\\s+/).filter(Boolean);\n const semantic = classes.find(isSemanticClass);\n if (semantic) return `${tag}.${cssEscape(semantic)}`;\n\n return `${tag}:nth-of-type(${nthOfType(el)})`;\n}\n\nfunction isUnique(root: Element, selector: string): boolean {\n try {\n return root.querySelectorAll(selector).length === 1;\n } catch {\n return false;\n }\n}\n\n/**\n * Build the shortest selector that uniquely resolves `el` within `artboardRoot`.\n * Walks up from the element, prepending parent segments (direct-child combinator)\n * only until uniqueness is reached — don't over-specify. Scoped to the artboard so\n * it never matches an identical element in another artboard on the same canvas.\n */\nexport function buildStableSelector(el: Element, artboardRoot: Element): string {\n const segments: string[] = [];\n let cur: Element | null = el;\n while (cur && cur !== artboardRoot) {\n segments.unshift(segmentFor(cur));\n const candidate = segments.join(' > ');\n if (isUnique(artboardRoot, candidate)) return candidate;\n cur = cur.parentElement;\n }\n // The optimized walk didn't reach uniqueness — common with library components\n // (Spring/MUI) whose shared classes like `MuiButtonBase-root` look semantic but\n // repeat across the tree. Fall back to an absolute, `:scope`-anchored structural\n // path: guaranteed to resolve to exactly this element so the pin never falsely\n // reports anchor-lost. Less durable than data-anchor, but correct.\n return structuralPath(el, artboardRoot);\n}\n\n/** Absolute direct-child path from the artboard root to `el` (always unique). */\nfunction structuralPath(el: Element, artboardRoot: Element): string {\n const segs: string[] = [];\n let cur: Element | null = el;\n while (cur && cur !== artboardRoot) {\n segs.unshift(`${cur.tagName.toLowerCase()}:nth-of-type(${nthOfType(cur)})`);\n cur = cur.parentElement;\n }\n // `:scope` binds the path to the artboard root we query against in resolveSelector.\n return `:scope > ${segs.join(' > ')}`;\n}\n\n/** Resolve a selector within an artboard, returning the single match or null. */\nexport function resolveSelector(selector: string, artboardRoot: Element): HTMLElement | null {\n try {\n const matches = artboardRoot.querySelectorAll(selector);\n return matches.length === 1 ? (matches[0] as HTMLElement) : null;\n } catch {\n return null;\n }\n}\n\n/** Layer 4 — 60-char text snapshot used to detect anchor drift. */\nexport function textSnapshot(el: Element): string {\n return (el.textContent || '').slice(0, 60).trim();\n}\n\n/** Find the artboard slot element an element belongs to (or null). */\nexport function artboardRootOf(el: Element): HTMLElement | null {\n return el.closest('[data-dc-slot]') as HTMLElement | null;\n}\n\n/** The artboard id (`data-dc-slot` value) for an element, or null. */\nexport function artboardIdOf(el: Element): string | null {\n return artboardRootOf(el)?.getAttribute('data-dc-slot') ?? null;\n}\n","import { getAncestorScale } from '../DesignCanvas/getAncestorScale';\nimport { PANEL_W, PANEL_GAP } from './layout';\nimport { resolveSelector } from './selector';\nimport type { Thread } from './types';\n\ntype ViewportEl = HTMLElement & {\n __dcViewport?: {\n getTransform: () => { x: number; y: number; scale: number };\n animateTransform: (t: { x: number; y: number; scale: number }, ms?: number) => void;\n };\n};\n\nfunction viewport(): { vpEl: ViewportEl; api: NonNullable<ViewportEl['__dcViewport']> } | null {\n const vpEl = document.querySelector('[data-dc-viewport]') as ViewportEl | null;\n const api = vpEl?.__dcViewport;\n return vpEl && api ? { vpEl, api } : null;\n}\n\n/** Pan/zoom the canvas so `el` sits centered in the area left of the rail. */\nexport function panToElement(el: Element) {\n const vp = viewport();\n if (!vp) {\n // Page mode (no DesignCanvas viewport — the embed's in-page review mode):\n // the document scrolls instead of a canvas panning.\n el.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' });\n return;\n }\n const { vpEl, api } = vp;\n const vpRect = vpEl.getBoundingClientRect();\n const tf = api.getTransform();\n const r = el.getBoundingClientRect();\n if (r.width === 0 && r.height === 0) return;\n\n const screenMax = Math.max(r.width, r.height);\n let newScale = tf.scale;\n if (screenMax < 60) newScale = tf.scale * (150 / screenMax);\n else if (screenMax > 600) newScale = tf.scale * (400 / screenMax);\n newScale = Math.min(4, Math.max(0.15, newScale));\n\n const leftRegionRight = vpRect.right - PANEL_GAP - PANEL_W - 16;\n const targetScreenX = vpRect.left + (leftRegionRight - vpRect.left) * 0.42;\n const targetScreenY = vpRect.top + vpRect.height / 2;\n\n const worldCx = (r.left + r.width / 2 - vpRect.left - tf.x) / tf.scale;\n const worldCy = (r.top + r.height / 2 - vpRect.top - tf.y) / tf.scale;\n const newX = targetScreenX - vpRect.left - worldCx * newScale;\n const newY = targetScreenY - vpRect.top - worldCy * newScale;\n api.animateTransform({ x: newX, y: newY, scale: newScale }, 260);\n}\n\n/**\n * Pan the canvas so an ARTBOARD-LOCAL point (the Layer-5 `artboardX/Y` fallback\n * coords) sits centered in the area left of the rail — the orphan panel's\n * \"jump to last-known position\" when no element resolves anymore. Keeps the\n * current zoom (there's no element rect to fit). No-op if the artboard isn't\n * mounted.\n */\nexport function panToArtboardPoint(artboardId: string, x: number, y: number) {\n const artboard = document.querySelector(\n `[data-dc-slot=\"${CSS.escape(artboardId)}\"]`,\n ) as HTMLElement | null;\n if (!artboard) return;\n const vp = viewport();\n if (!vp) {\n // Page mode: the artboard is the page body — scroll the window so the\n // last-known point sits mid-viewport.\n const r = artboard.getBoundingClientRect();\n window.scrollTo({\n left: window.scrollX + r.left + x - window.innerWidth / 2,\n top: window.scrollY + r.top + y - window.innerHeight / 2,\n behavior: 'smooth',\n });\n return;\n }\n const { vpEl, api } = vp;\n const vpRect = vpEl.getBoundingClientRect();\n const tf = api.getTransform();\n\n // Artboard-local → screen through the live canvas transform (same mapping as\n // pinAnchor.ts's Layer-5 fallback), then screen → world for the new transform.\n const scale = getAncestorScale(artboard) || 1;\n const slotRect = artboard.getBoundingClientRect();\n const screenX = slotRect.left + x * scale;\n const screenY = slotRect.top + y * scale;\n const worldX = (screenX - vpRect.left - tf.x) / tf.scale;\n const worldY = (screenY - vpRect.top - tf.y) / tf.scale;\n\n const leftRegionRight = vpRect.right - PANEL_GAP - PANEL_W - 16;\n const targetScreenX = vpRect.left + (leftRegionRight - vpRect.left) * 0.42;\n const targetScreenY = vpRect.top + vpRect.height / 2;\n const newX = targetScreenX - vpRect.left - worldX * tf.scale;\n const newY = targetScreenY - vpRect.top - worldY * tf.scale;\n api.animateTransform({ x: newX, y: newY, scale: tf.scale }, 260);\n}\n\n/** The live DOM element a thread's pin anchors to (null if its artboard isn't mounted). */\nexport function resolveThreadEl(t: Thread): Element | null {\n const artboard = document.querySelector(`[data-dc-slot=\"${CSS.escape(t.root.artboardId)}\"]`);\n return artboard ? resolveSelector(t.root.anchor.selector, artboard) : null;\n}\n\n/**\n * Open path: pan to a thread's pin. If it lives on another page, switch there\n * first, then pan once the artboard mounts (it was unmounted while hidden).\n * Shared by the sidebar row-click and the `?pin=` deeplink.\n */\nexport function panToThread(\n t: Thread,\n opts: { paged: boolean; activePageId: string | null; onSwitchPage?: (id: string) => void },\n) {\n const onActivePage = !opts.paged || t.root.pageId === opts.activePageId;\n if (onActivePage) {\n const el = resolveThreadEl(t);\n if (el) panToElement(el);\n return;\n }\n if (t.root.pageId && opts.onSwitchPage) opts.onSwitchPage(t.root.pageId);\n let tries = 0;\n const tick = () => {\n const el = resolveThreadEl(t);\n if (el) {\n panToElement(el);\n return;\n }\n if (tries++ < 40) requestAnimationFrame(tick); // ~0.6s for the page to mount\n };\n requestAnimationFrame(tick);\n}\n","import { getAncestorScale } from '../DesignCanvas/getAncestorScale';\nimport {\n FRAME_ATTR,\n contentDocOf,\n descendIntoFrame,\n rectInHost,\n} from '../DesignCanvas/frameInspect';\nimport {\n artboardRootOf,\n buildStableSelector,\n resolveSelector,\n textSnapshot,\n} from './selector';\nimport type { PinAnchor, PinTarget } from './types';\n\nconst clamp01 = (n: number) => Math.min(1, Math.max(0, n));\n\n/**\n * Capture a pin target from a clicked element + click position. Builds all\n * persisted anchor layers (2–5 + identity hints). Returns null if the element\n * isn't inside an artboard.\n */\nexport function capturePinAnchor(el: Element, clientX: number, clientY: number): PinTarget | null {\n const artboard = artboardRootOf(el);\n const artboardId = artboard?.getAttribute('data-dc-slot');\n if (!artboard || !artboardId) return null;\n\n // Live-frame clicks (in-app canvas mode) land on the tile's transparent\n // overlay — descend into the same-origin frame and scope the selector to its\n // body. That scope matches page-mode review (which stamps the page BODY as\n // the artboard slot), so pins dropped on the canvas and pins dropped in-page\n // on the same route resolve each other's selectors.\n let selectorRoot: Element = artboard;\n const framed = descendIntoFrame(el, clientX, clientY);\n if (framed) {\n el = framed.el;\n selectorRoot = framed.frameBody;\n }\n\n // rectInHost = getBoundingClientRect for host elements; for frame content it\n // maps out to host coords — the same space clientX/clientY arrive in.\n const rect = rectInHost(el);\n const relX = rect.width ? clamp01((clientX - rect.left) / rect.width) : 0.5;\n const relY = rect.height ? clamp01((clientY - rect.top) / rect.height) : 0.5;\n\n // Artboard-local coords (pre-canvas-transform) for the Layer-5 fallback.\n const scale = getAncestorScale(artboard) || 1;\n const slotRect = artboard.getBoundingClientRect();\n const artboardX = (clientX - slotRect.left) / scale;\n const artboardY = (clientY - slotRect.top) / scale;\n\n return {\n artboardId,\n selector: buildStableSelector(el, selectorRoot),\n relX,\n relY,\n artboardX,\n artboardY,\n anchorText: textSnapshot(el) || null,\n elementTag: el.tagName.toLowerCase(),\n dataName:\n el.getAttribute('data-name') ||\n el.getAttribute('data-comment-anchor') ||\n el.getAttribute('data-testid') ||\n null,\n };\n}\n\nexport interface PinScreenPos {\n /** Screen-space coords of the pin tip. */\n x: number;\n y: number;\n /** False = artboard offscreen / hidden element — don't paint. */\n visible: boolean;\n /** True = no element resolved; floating at last-known artboard coords. */\n lost: boolean;\n}\n\nconst HIDDEN: PinScreenPos = { x: 0, y: 0, visible: false, lost: false };\n\n// Cull margin (px) beyond the viewport before we stop resolving a pin.\nconst CULL_MARGIN = 200;\n\n/**\n * Resolve the live DOM element a pin anchors to within its (mounted) artboard:\n * Layer 1 (in-session data-cl-pin) → Layer 2 (artboard-scoped selector) with\n * the Layer-4 text/tag drift check. Null = LOST (no element in the current\n * DOM). Shared by resolvePinScreen and the sidebar's orphan section, so \"lost\"\n * means exactly the same thing everywhere.\n */\nexport function resolvePinEl(\n pin: { id: string; anchor: PinAnchor },\n artboard: HTMLElement,\n): HTMLElement | null {\n return resolvePinElWithReason(pin, artboard).el;\n}\n\n/**\n * Why a pin's anchor detached, recorded when the Layer 1→2→frame→4 cascade fails\n * (P2.11). `selector-miss` = no element resolved at all (removed / restructured\n * DOM). `tag-mismatch` / `text-drift` = an element resolved but the Layer-4 drift\n * check rejected it as the wrong node. Surfaced on the sidebar's orphan rows so a\n * reviewer knows whether the pinned element vanished or merely changed — and is\n * the substrate for a future \"re-attach here\" affordance (product feature,\n * deferred). `null` = not lost (an element resolved cleanly).\n */\nexport type PinLostReason = 'selector-miss' | 'tag-mismatch' | 'text-drift';\n\n/**\n * The resolve cascade plus the reason it failed. `resolvePinEl` is the el-only\n * façade; `pinLostReason` is the reason-only façade — both share this so \"lost\"\n * and \"why\" can never disagree.\n */\nfunction resolvePinElWithReason(\n pin: { id: string; anchor: PinAnchor },\n artboard: HTMLElement,\n): { el: HTMLElement | null; reason: PinLostReason | null } {\n // Layer 1 (in-session) then Layer 2 (selector).\n let el: HTMLElement | null =\n pin.id !== 'draft'\n ? (artboard.querySelector(`[data-cl-pin=\"${cssAttr(pin.id)}\"]`) as HTMLElement | null)\n : null;\n if (!el) el = resolveSelector(pin.anchor.selector, artboard);\n // Frame fallback — selectors captured inside a live route frame (in-app\n // canvas mode) live in another document entirely. Scoped to the frame BODY,\n // the same root capturePinAnchor built them against.\n if (!el) el = resolveSelectorInFrames(pin.anchor.selector, artboard);\n\n // Nothing resolved anywhere → the element is gone from the DOM.\n if (!el) return { el: null, reason: 'selector-miss' };\n\n // Layer 4 — text/tag drift check; rejects a *wrong-element* match. Skipped when\n // the selector is a single precise identity (data-anchor / data-name / #id):\n // that already pins the exact element, so editing its text mustn't detach it.\n //\n // Tag mismatch is a HARD reject (a wrong-kind element is never the target).\n // Text, by contrast, is a FUZZY signal (P2.11): the old code hard-rejected on\n // ANY difference, so a live timestamp / counter / re-rendered label inside the\n // element orphaned a pin whose selector still resolved uniquely — the worst\n // false-negative for a durable-anchor product. Now we only reject when the text\n // has diverged *substantially* (normalized prefix + token-overlap), tolerating\n // small embedded changes.\n if (!isAtomicPrecise(pin.anchor.selector)) {\n if (pin.anchor.elementTag && el.tagName.toLowerCase() !== pin.anchor.elementTag) {\n return { el: null, reason: 'tag-mismatch' };\n }\n if (pin.anchor.anchorText && !textLooselyMatches(textSnapshot(el), pin.anchor.anchorText)) {\n return { el: null, reason: 'text-drift' };\n }\n }\n return { el, reason: null };\n}\n\n/**\n * Why is this pin's anchor lost right now, if it is? `null` = not lost OR\n * undecidable (its artboard isn't mounted — off-page, not lost). Mirrors\n * `isPinLost`'s mounting guard so the two never disagree.\n */\nexport function pinLostReason(pin: {\n id: string;\n artboardId: string;\n anchor: PinAnchor;\n}): PinLostReason | null {\n const artboard = document.querySelector(\n `[data-dc-slot=\"${cssAttr(pin.artboardId)}\"]`,\n ) as HTMLElement | null;\n if (!artboard) return null;\n return resolvePinElWithReason(pin, artboard).reason;\n}\n\n/**\n * Is this pin's anchor LOST right now? `true` = its artboard is mounted but no\n * element resolves (the orphan-panel condition); `false` = the element is\n * there; `null` = undecidable — the artboard isn't in the DOM (another page),\n * which is \"off-page\", not lost.\n */\nexport function isPinLost(pin: { id: string; artboardId: string; anchor: PinAnchor }): boolean | null {\n const artboard = document.querySelector(\n `[data-dc-slot=\"${cssAttr(pin.artboardId)}\"]`,\n ) as HTMLElement | null;\n if (!artboard) return null;\n return resolvePinEl(pin, artboard) === null;\n}\n\n/**\n * Resolve a pin to a screen-space position for the current frame. Runs the\n * 5-layer cascade: data-cl-pin (in-session) → artboard-scoped selector (with a\n * Layer-4 text/tag drift check) → artboard-local fallback (anchor-lost).\n *\n * Returns screen coords directly (the pin badge is a fixed screen size — do NOT\n * divide by getAncestorScale here; that's only for the lost-fallback conversion).\n */\nexport function resolvePinScreen(pin: { id: string; artboardId: string; anchor: PinAnchor }): PinScreenPos {\n const artboard = document.querySelector(\n `[data-dc-slot=\"${cssAttr(pin.artboardId)}\"]`,\n ) as HTMLElement | null;\n if (!artboard) return HIDDEN;\n\n const slotRect = artboard.getBoundingClientRect();\n // Guardrail 2 — viewport intersection cull.\n if (\n slotRect.right < -CULL_MARGIN ||\n slotRect.bottom < -CULL_MARGIN ||\n slotRect.left > window.innerWidth + CULL_MARGIN ||\n slotRect.top > window.innerHeight + CULL_MARGIN\n ) {\n return HIDDEN;\n }\n\n const el = resolvePinEl(pin, artboard);\n\n if (el) {\n // Host-space rect (identity for host elements; frame content maps out\n // through the frame element + canvas scale).\n const r = rectInHost(el);\n // Visibility: zero-box / display:none / collapsed → hide.\n if (r.width === 0 && r.height === 0) return HIDDEN;\n return {\n x: r.left + r.width * pin.anchor.relX,\n y: r.top + r.height * pin.anchor.relY,\n visible: true,\n lost: false,\n };\n }\n\n // Layer 5 — anchor-lost: float at last-known artboard-local coords.\n const lostPos = artboardLocalToScreen(artboard, slotRect, pin.anchor.artboardX, pin.anchor.artboardY);\n return { ...lostPos, visible: true, lost: true };\n}\n\n/** The Layer-5 mapping: artboard-local coords → screen px through the live\n * canvas transform. Shared by the pin anchor-lost fallback and CursorLayer\n * (a remote cursor is a \"Layer-5-only pin\"). */\nfunction artboardLocalToScreen(\n artboard: HTMLElement,\n slotRect: DOMRect,\n x: number,\n y: number,\n): { x: number; y: number } {\n const scale = getAncestorScale(artboard) || 1;\n return { x: slotRect.left + x * scale, y: slotRect.top + y * scale };\n}\n\n/**\n * Resolve a remote cursor (artboard-local coords) to screen space for the\n * current frame. Hidden when the artboard isn't mounted (other page) or is\n * outside the viewport.\n */\n/** The mounted+on-screen frame of an artboard: its screen rect + canvas scale.\n * Null when the artboard isn't mounted (other page) or is culled off-screen.\n * Factored out of resolveCursorScreen so CursorLayer can resolve each artboard\n * ONCE per animation frame and reuse it for every cursor sitting on it (P2.5)\n * — the query + getBoundingClientRect + getAncestorScale walk were previously\n * repeated per-cursor per-frame. */\nexport function resolveArtboardFrame(\n artboardId: string,\n): { slotRect: DOMRect; scale: number } | null {\n const artboard = document.querySelector(\n `[data-dc-slot=\"${cssAttr(artboardId)}\"]`,\n ) as HTMLElement | null;\n if (!artboard) return null;\n const slotRect = artboard.getBoundingClientRect();\n if (\n slotRect.right < -CULL_MARGIN ||\n slotRect.bottom < -CULL_MARGIN ||\n slotRect.left > window.innerWidth + CULL_MARGIN ||\n slotRect.top > window.innerHeight + CULL_MARGIN\n ) {\n return null;\n }\n return { slotRect, scale: getAncestorScale(artboard) || 1 };\n}\n\n/** Map artboard-local coords → screen px through a resolved artboard frame.\n * Same math as artboardLocalToScreen, but takes the pre-resolved frame so the\n * scale isn't re-walked per point. */\nexport function screenFromArtboardFrame(\n frame: { slotRect: DOMRect; scale: number },\n x: number,\n y: number,\n): { x: number; y: number } {\n return {\n x: frame.slotRect.left + x * frame.scale,\n y: frame.slotRect.top + y * frame.scale,\n };\n}\n\nexport function resolveCursorScreen(\n artboardId: string,\n x: number,\n y: number,\n): { x: number; y: number; visible: boolean } {\n const frame = resolveArtboardFrame(artboardId);\n if (!frame) return { x: 0, y: 0, visible: false };\n return { ...screenFromArtboardFrame(frame, x, y), visible: true };\n}\n\n/**\n * Frame fallback for live route tiles (in-app canvas mode): search each\n * same-origin quilt canvas frame under the artboard, scoped to the frame BODY\n * — the exact root capturePinAnchor built the selector against (and the same\n * scope page-mode review uses, so cross-surface pins converge).\n */\nfunction resolveSelectorInFrames(selector: string, artboard: Element): HTMLElement | null {\n for (const frame of Array.from(\n artboard.querySelectorAll<HTMLIFrameElement>(`iframe[${FRAME_ATTR}]`),\n )) {\n const doc = contentDocOf(frame);\n if (!doc) continue;\n const el = resolveSelector(selector, doc.body);\n if (el) return el;\n }\n return null;\n}\n\n/** Collapse whitespace + lowercase, for tolerant text comparison. */\nfunction normalizeText(s: string): string {\n return s.replace(/\\s+/g, ' ').trim().toLowerCase();\n}\n\n/**\n * Layer-4 text DRIFT tolerance (P2.11). Returns true when `current` is still\n * \"the same\" text as the captured `original`, allowing for small dynamic changes\n * (an embedded timestamp, counter, or a couple of edited words). Only a\n * substantial divergence returns false → orphans the pin. Both inputs are the\n * 60-char textSnapshot, so this is inherently a prefix comparison already.\n *\n * Signals (any one passes):\n * - exact (normalized) equality;\n * - one is a prefix of the other (append/truncate of a trailing dynamic bit);\n * - equal once digit runs are neutralized — numbers (timestamps, counters,\n * prices) are the volatile part, so \"3 items\" still matches \"5 items\" and\n * \"Updated 3:45 PM\" matches \"Updated 4:02 PM\" (the core P2.11 case, which\n * short strings would otherwise fail the token-overlap test on);\n * - Jaccard token overlap ≥ 0.5 (tolerates an interior token changing).\n */\nexport function textLooselyMatches(current: string, original: string): boolean {\n const a = normalizeText(current);\n const b = normalizeText(original);\n if (!b) return true; // no baseline text → nothing to disprove\n if (a === b) return true;\n if (a.startsWith(b) || b.startsWith(a)) return true;\n const maskNums = (s: string) => s.replace(/\\d+/g, '#');\n if (maskNums(a) === maskNums(b)) return true;\n const ta = new Set(a.split(' ').filter(Boolean));\n const tb = new Set(b.split(' ').filter(Boolean));\n if (!ta.size || !tb.size) return false;\n let inter = 0;\n for (const t of ta) if (tb.has(t)) inter++;\n const union = ta.size + tb.size - inter;\n return union > 0 && inter / union >= 0.5;\n}\n\n/** A single-segment selector that pins one exact element by identity. */\nfunction isAtomicPrecise(selector: string): boolean {\n if (selector.includes(' ')) return false; // has a combinator → ambiguous target\n return (\n selector.startsWith('#') ||\n /^\\[data-(anchor|name|comment-anchor|testid)=/.test(selector)\n );\n}\n\nfunction cssAttr(s: string): string {\n const fn = (globalThis as { CSS?: { escape?: (s: string) => string } }).CSS?.escape;\n return fn ? fn(s) : s.replace(/[\"\\\\]/g, '\\\\$&');\n}\n","import { resolveSelector } from './selector';\nimport type { PinAnchor } from './types';\nimport { FONT } from './ui';\n\n/**\n * Renders the frozen snapshot captured when a comment was created — the true\n * point-in-time record of what the commenter was looking at, so it never drifts\n * as the design changes underneath it.\n *\n * No live DOM clone: if there's no stored image (capture failed, or a legacy\n * comment from before snapshots), we fall back to a small descriptor chip rather\n * than re-deriving a preview from the current — possibly changed — element.\n */\nexport function PreviewImage({\n src,\n artboardId,\n anchor,\n height = 124,\n}: {\n src: string | null;\n artboardId: string;\n anchor: PinAnchor;\n height?: number;\n}) {\n // Has the anchored element survived? Only used to tune the fallback copy.\n const artboard =\n typeof document !== 'undefined'\n ? document.querySelector(`[data-dc-slot=\"${CSS.escape(artboardId)}\"]`)\n : null;\n const stillThere = !!(artboard && resolveSelector(anchor.selector, artboard));\n\n return (\n <div\n style={{\n position: 'relative',\n height,\n background: src ? '#f4f4f6' : '#fafafb',\n borderRadius: 8,\n border: '1px solid #ededf0',\n overflow: 'hidden',\n }}\n >\n {src ? (\n <img\n src={src}\n alt=\"Snapshot at comment time\"\n draggable={false}\n style={{ width: '100%', height: '100%', objectFit: 'cover', objectPosition: 'top center', display: 'block' }}\n />\n ) : (\n <div\n style={{\n position: 'absolute',\n inset: 0,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 4,\n padding: 12,\n textAlign: 'center',\n font: `500 12px ${FONT}`,\n color: '#9a9aa2',\n }}\n >\n <code style={{ fontSize: 11, color: '#6b6b73' }}>\n &lt;{anchor.elementTag || 'element'}\n {anchor.dataName ? ` · ${anchor.dataName}` : ''}&gt;\n </code>\n <span style={{ fontStyle: 'italic' }}>\n {stillThere ? 'No snapshot' : 'Element no longer on canvas'}\n </span>\n </div>\n )}\n </div>\n );\n}\n","import type { CSSProperties, ReactNode } from 'react';\n\n/**\n * Mentions live INSIDE the comment body as markup, so both root comments and\n * replies carry them with no extra wire fields, and the backend can parse the\n * same body to fire the @mention notification.\n *\n * - Stored / sent form: `@[Display Name](rc:<personId>)`\n * - Composer display form (while typing, before serialize): `@[Display Name]`\n * - Rendered form: a highlighted `@Display Name` chip\n *\n * The composer shows the bracketed name (no id noise) and a name→id map is kept\n * alongside; MentionTextarea folds the id back in at submit time.\n */\n\n/** Stored markup: @[Name](rc:id) — name in group 1, id in group 2. */\nexport const MENTION_MARKUP_RE = /@\\[([^\\]]+)\\]\\(rc:([^)]+)\\)/g;\n\n/** Stored markup → plain \"@Name\" text (sidebar snippets, length checks, etc.). */\nexport function stripMentions(body: string): string {\n return body.replace(MENTION_MARKUP_RE, (_w, name: string) => `@${name}`);\n}\n\nconst mentionChip: CSSProperties = {\n color: '#9aa6bb',\n fontWeight: 600,\n background: 'rgba(154,166,187,0.10)',\n borderRadius: 4,\n padding: '0 2px',\n};\n\n/** Render a body with its mentions as highlighted `@Name` chips. */\nexport function renderMentionBody(body: string): ReactNode[] {\n const out: ReactNode[] = [];\n const re = new RegExp(MENTION_MARKUP_RE.source, 'g');\n let last = 0;\n let key = 0;\n let m: RegExpExecArray | null;\n while ((m = re.exec(body))) {\n if (m.index > last) out.push(body.slice(last, m.index));\n out.push(\n <span key={key++} style={mentionChip}>\n @{m[1]}\n </span>,\n );\n last = m.index + m[0].length;\n }\n if (last < body.length) out.push(body.slice(last));\n return out;\n}\n","// Shared types for the CommentLayer — kept in lockstep with the comments-service\n// API shapes. The mock client and the network client both satisfy `CommentsClient`.\n\n/** A person from the directory, for the @mention picker (GET /api/directory?q=). */\nexport interface DirectoryPerson {\n /** Stable directory id for the picked person (the service's user id). */\n personId: string;\n name: string;\n /** Shown to disambiguate same-named people. */\n email: string;\n /**\n * True when this person has already participated on the queried canvas (commented\n * or been @mentioned). Server-set, only present when a `canvasId` is sent with the\n * query; drives the \"On this canvas\" grouping in the picker. Undefined for the mock\n * client and any query without a canvas → the picker shows a flat, ungrouped list.\n */\n isParticipant?: boolean;\n}\n\n/** Curated public identity — what threads render. Never an email. */\nexport interface PublicUser {\n id: string;\n username: string;\n displayName: string;\n avatarUrl: string | null;\n}\n\n/** Signed-in profile (extends PublicUser with the write gate). */\nexport interface Me extends PublicUser {\n canWrite: boolean;\n}\n\n/** A user present on the canvas right now (realtime roster). `color` is the\n * server-assigned stable cursor color, so cursor and facepile avatar match. */\nexport interface PresenceUser extends PublicUser {\n color: string;\n}\n\n/** A remote user's live cursor — artboard-local coords (pre-canvas-transform),\n * the same space as PinAnchor's Layer-5 `artboardX/Y`. */\nexport interface RemoteCursor {\n userId: string;\n artboardId: string;\n x: number;\n y: number;\n}\n\n/**\n * The 5-layer pin anchor (minus Layer 1, the in-session `data-cl-pin` attr,\n * which is a runtime decoration not persisted). This is exactly what the\n * backend stores and returns.\n */\nexport interface PinAnchor {\n /** Layer 2 — artboard-scoped stable CSS selector. */\n selector: string;\n /** Layer 3 — fractional offset within the element rect (0..1). */\n relX: number;\n relY: number;\n /** Layer 5 — artboard-local coords (pre-canvas-transform) for anchor-lost fallback. */\n artboardX: number;\n artboardY: number;\n /** Layer 4 — 60-char text snapshot for identity disambiguation. */\n anchorText: string | null;\n /** Identity hints. */\n elementTag: string | null;\n dataName: string | null;\n}\n\n/** A captured pin target at drop time — the anchor plus its artboard. */\nexport interface PinTarget extends PinAnchor {\n artboardId: string;\n}\n\n/** A comment as returned by the service (root or reply). */\nexport interface Comment {\n id: string;\n canvasId: string;\n /**\n * DCPage id this comment lives on (`null` = unpaged canvas / pre-pages row).\n * The sidebar lists comments from ALL pages; pins only render for the comment\n * whose `pageId` matches the active page (other pages' artboards are unmounted).\n */\n pageId: string | null;\n artboardId: string;\n parentCommentId: string | null;\n author: PublicUser | null;\n body: string;\n anchor: PinAnchor;\n /**\n * Frozen rasterised snapshot of the area around the cursor, captured at\n * creation time — the point-in-time record of what the commenter saw. Only\n * root comments carry one (always null on replies). Stored as a data-URL\n * text column (comments.preview_image) by the service; a hosted `previewUrl`\n * can replace it when blob storage lands. Null = capture failed / dropped\n * for size / legacy comment.\n */\n previewImage: string | null;\n resolvedAt: string | null;\n resolvedBy: PublicUser | null;\n createdAt: string;\n updatedAt: string;\n}\n\n/** Root comment + its flat, ordered replies. Derived client-side from the flat list. */\nexport interface Thread {\n root: Comment;\n replies: Comment[];\n}\n\nexport interface ListResult {\n comments: Comment[];\n /**\n * Per-thread last-read timestamp for the CURRENT user: `rootCommentId → ISO8601`.\n * A missing key means the user has never opened that thread (→ unread). Server\n * computes it per requester; the mock keeps it in memory.\n */\n reads: Record<string, string>;\n /**\n * TOMBSTONES for an incremental (`since`) poll: ids of comments soft-deleted\n * in the `(since, serverTime]` window (P2.3). Lets a since-poll surface\n * deletions that the `deletedAt IS NULL` list filter otherwise hides forever.\n * Absent / empty on a full list (no `since`) — there, a deleted row is simply\n * not present, so the client's full replace already drops it.\n */\n deletedIds?: string[];\n /**\n * The server's clock at the moment the query ran, captured BEFORE the read so\n * rows committed during the query aren't skipped by the next `gt(since)` poll.\n * The client feeds this back as the next `since`.\n */\n serverTime: string;\n}\n\nexport interface CreateCommentInput {\n canvasId: string;\n /** DCPage the comment is being dropped on (the active page). Null = unpaged. */\n pageId?: string | null;\n artboardId: string;\n body: string;\n anchor: PinAnchor;\n /**\n * Frozen snapshot captured at creation time (data URL). Best-effort: the\n * service drops (nulls) anything over 2,000,000 chars rather than failing\n * the comment.\n */\n previewImage?: string | null;\n}\n\n/**\n * The data layer. Both the in-memory mock and the network client implement this,\n * so the UI is swappable behind `comments.devMode`.\n */\nexport interface CommentsClient {\n /** Current user, or null if signed out / read-only. */\n me(): Promise<Me | null>;\n /** Trigger interactive sign-in (network client only; mock resolves a fake user). */\n signIn?(): Promise<Me | null>;\n /**\n * Sign in with an identity the host UI already collected (the sign-in dialog).\n * Preferred over `signIn` when present — no window.prompt fallback needed.\n */\n signInWith?(input: { name: string; email?: string }): Promise<Me | null>;\n signOut?(): Promise<void>;\n\n /**\n * Realtime connection parameters, when this client supports the socket layer:\n * the Socket.io endpoint (same origin as the HTTP service) and the live bearer\n * token. Undefined / null url → realtime stays off (the mock, unconfigured\n * service). Token is read lazily so a sign-in mid-session picks up.\n */\n realtimeAuth?(): { url: string; token: string | null } | null;\n\n /**\n * List ALL comments for the canvas across every page (flat). `since` for\n * incremental polling. Carries the current user's per-thread read map.\n */\n list(opts: { since?: string }): Promise<ListResult>;\n create(input: CreateCommentInput): Promise<Comment>;\n reply(rootId: string, body: string): Promise<Comment>;\n resolve(id: string): Promise<Comment>;\n unresolve(id: string): Promise<Comment>;\n edit(id: string, body: string): Promise<Comment>;\n /**\n * Re-point a ROOT comment's pin anchor to a freshly-picked element (P2.11\n * orphan re-attach). Sends the full `PinTarget` — artboardId + the 5-layer\n * anchor — exactly as `create` does, captured by the same `capturePinAnchor`.\n * The thread keeps its id and replies; only the root's anchor columns change.\n * Server authz: the comment's author OR the canvas owner.\n */\n reattach(id: string, target: PinTarget): Promise<Comment>;\n remove(id: string): Promise<void>;\n /** Mark a thread (by root id) read for the current user. */\n markRead(rootId: string): Promise<void>;\n /** Clear the read mark so the thread shows as unread again (personal, per-user). */\n markUnread(rootId: string): Promise<void>;\n\n /** @mention typeahead. Empty/whitespace query → []. */\n searchDirectory(q: string): Promise<DirectoryPerson[]>;\n}\n\n/**\n * Pluggable authentication strategy for the network client. The default\n * (`accountlessAuthProvider`) is account-less: a sign-in is just a name (and an\n * optional email) — no password, no external identity provider, no verification.\n * Swap in your own provider to integrate OAuth / SSO / a real account system.\n */\nexport interface AuthProvider {\n /** Resolve the current user for a stored bearer token (null = signed out). */\n me(token: string | null): Promise<Me | null>;\n /** Establish a session from the given identity; returns the bearer token + user. */\n signIn(input: { name: string; email?: string }): Promise<{ token: string; me: Me }>;\n /** Best-effort server-side session teardown for the given token. */\n signOut?(token: string): Promise<void>;\n}\n\n/**\n * Optional directory backend for the @mention typeahead. When omitted, the\n * network client falls back to its own `/api/directory` endpoint.\n */\nexport interface DirectoryProvider {\n search(q: string): Promise<DirectoryPerson[]>;\n}\n\n/** Public `comments` prop on DesignCanvas. */\nexport interface CommentsConfig {\n canvasId: string;\n /** The hosted comments service base URL (required for network mode). */\n serviceUrl?: string;\n /** Use the in-memory mock store instead of the network. */\n devMode?: boolean;\n /** Authentication strategy. Defaults to `accountlessAuthProvider` (name-only sign-in). */\n auth?: AuthProvider;\n /**\n * Multiplayer presence: live cursors + the who's-here facepile (network mode\n * only; needs the realtime socket). Default true — set false to run\n * comments-only with no socket connection.\n */\n presence?: boolean;\n /** Directory backend for @mention typeahead. Defaults to the service's `/api/directory`. */\n directory?: DirectoryProvider;\n /**\n * Hostnames matching any of these patterns are treated as NON-stable (e.g.\n * rotating preview/dev hosts) and fall back to the explicit per-project\n * canvasId instead of auto-scoping by hostname. Default `[]` → every host is\n * its own canvas.\n */\n unstableHostPatterns?: RegExp[];\n /**\n * Auto-provision hint sent on the first write to an unregistered canvas, so the\n * service can resolve the canvas owner deterministically rather than from\n * whoever comments first. Ignored once the canvas exists.\n */\n provisionHint?: string;\n /**\n * Where the comments upsell's \"Enable / Renew\" CTA points — your dashboard or\n * checkout URL (Workstream B). Shown when the canvas owner isn't entitled\n * (the always-visible comments tab renders the upsell instead of the live\n * runtime). Optional; a missing/placeholder value renders a non-navigating CTA.\n */\n enableUrl?: string;\n}\n\n// Empty = must be configured (no default host). e.g. 'https://comments.example.com'\nexport const DEFAULT_SERVICE_URL = '';\n\n/** Group a flat comment list into threads, roots ordered by creation. */\nexport function groupThreads(comments: Comment[]): Thread[] {\n const roots = comments.filter((c) => !c.parentCommentId);\n const repliesByRoot = new Map<string, Comment[]>();\n for (const c of comments) {\n if (c.parentCommentId) {\n const arr = repliesByRoot.get(c.parentCommentId) ?? [];\n arr.push(c);\n repliesByRoot.set(c.parentCommentId, arr);\n }\n }\n const byCreated = (a: Comment, b: Comment) => a.createdAt.localeCompare(b.createdAt);\n return roots\n .slice()\n .sort(byCreated)\n .map((root) => ({\n root,\n replies: (repliesByRoot.get(root.id) ?? []).sort(byCreated),\n }));\n}\n\n/**\n * Is this thread unread *for the given user*? Unread = it has at least one\n * comment authored by someone else that's newer than the user's last-read mark\n * (or the user has never opened it). Your own comments never make a thread\n * unread; a signed-out user has nothing \"unread to them\".\n */\nexport function isThreadUnread(\n thread: Thread,\n me: Me | null,\n reads: Record<string, string>,\n): boolean {\n if (!me) return false;\n const lastRead = reads[thread.root.id] ?? null;\n let latestOther: string | null = null;\n for (const c of [thread.root, ...thread.replies]) {\n if (c.author?.id === me.id) continue;\n if (!latestOther || c.createdAt > latestOther) latestOther = c.createdAt;\n }\n if (!latestOther) return false; // nothing from anyone else\n return lastRead === null || latestOther > lastRead;\n}\n","import { useEffect, useRef, useState, type CSSProperties } from 'react';\nimport { panToArtboardPoint, panToThread } from './pan';\nimport { isPinLost, pinLostReason } from './pinAnchor';\nimport type { PinLostReason } from './pinAnchor';\nimport { PreviewImage } from './PreviewImage';\nimport { Avatar, FONT, relativeTime } from './ui';\nimport { stripMentions } from './mentions';\nimport { PANEL_W, PANEL_GAP } from './layout';\nimport { isThreadUnread, type Comment, type Me, type Thread as ThreadModel } from './types';\n\nconst DARK = '#18191b'; // matches the canvas bg\n\n/** A readable location chip from a `${sectionId}/${artboardId}` slot. */\nfunction locationLabel(artboardId: string): string {\n const part = artboardId.includes('/') ? artboardId.slice(artboardId.indexOf('/') + 1) : artboardId;\n return part.replace(/[-_]+/g, ' ').replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\n/**\n * Is this thread's pin anchor LOST in the live DOM right now? Computed\n * CLIENT-side at render time (lost-ness is a function of the current DOM —\n * nothing is persisted): pinAnchor.ts `isPinLost` runs the same Layer 1→2(+4)\n * resolution as the pin layer; `true` only when the artboard IS mounted but no\n * element resolves. An unmounted artboard (another page) returns null = off-page,\n * not lost.\n */\nfunction threadLost(t: ThreadModel): boolean {\n return (\n isPinLost({ id: t.root.id, artboardId: t.root.artboardId, anchor: t.root.anchor }) === true\n );\n}\n\n/** Human-readable cause for an orphan row — WHY the anchor detached (P2.11). */\nfunction lostReasonLabel(reason: PinLostReason | null): string | null {\n switch (reason) {\n case 'selector-miss': return 'element no longer in the page';\n case 'tag-mismatch': return 'element type changed';\n case 'text-drift': return 'element text changed substantially';\n default: return null;\n }\n}\n\n/** The last segment of the stored selector — a recognisable identity hint. */\nfunction selectorTail(selector: string): string {\n const parts = selector.trim().split(/\\s+/);\n return parts[parts.length - 1] ?? selector;\n}\n\n/** Small link-style action button for the orphan triage row. */\nfunction orphanActionStyle(color: string): CSSProperties {\n return {\n font: `600 11.5px ${FONT}`,\n border: 'none',\n background: 'transparent',\n color,\n cursor: 'pointer',\n padding: 0,\n };\n}\n\n/** Up to two distinct participants (root author first), for the avatar stack. */\nfunction participants(thread: ThreadModel): Comment['author'][] {\n const seen = new Set<string>();\n const out: Comment['author'][] = [];\n for (const c of [thread.root, ...thread.replies]) {\n const id = c.author?.id ?? 'anon';\n if (seen.has(id)) continue;\n seen.add(id);\n out.push(c.author);\n if (out.length === 2) break;\n }\n return out;\n}\n\nexport function CommentsSidebar({\n threads,\n reads,\n me,\n activePageId = null,\n pages,\n onSwitchPage,\n canWrite: canWriteProp,\n signedOut,\n needsAuth,\n previewReadOnly,\n onSignIn,\n onSignOut,\n openId,\n busy,\n showResolved,\n onSetShowResolved,\n onMarkUnread,\n onOpen,\n onResolve,\n onUnresolve,\n onReattach,\n onDelete,\n onClose,\n}: {\n threads: ThreadModel[];\n /** Per-thread last-read map for the current user (rootId → ISO). */\n reads: Record<string, string>;\n me: Me | null;\n /** Active page; threads on other pages still list but need a page switch to pan. */\n activePageId?: string | null;\n pages?: { id: string; title: string }[];\n onSwitchPage?: (id: string) => void;\n /** Host-gated write permission (read-only on dev/preview). Defaults to me.canWrite. */\n canWrite?: boolean;\n /** Network mode, no session at all — offer Sign in. */\n signedOut?: boolean;\n /** Network mode, signed-out OR signed-in-but-read-only. */\n needsAuth?: boolean;\n /** Posting is off because this is a dev/preview/localhost host, not a real deploy. */\n previewReadOnly?: boolean;\n onSignIn?: () => void;\n onSignOut?: () => void;\n openId: string | null;\n busy?: boolean;\n showResolved: boolean;\n onSetShowResolved: (v: boolean) => void;\n /** Mark a thread unread without opening it (personal read state). */\n onMarkUnread?: (id: string) => void;\n onOpen: (id: string | null) => void;\n onResolve: (id: string) => void;\n onUnresolve: (id: string) => void;\n /**\n * Enter re-attach mode for an orphaned thread (P2.11): the runtime turns the\n * cursor into a dropper so the reviewer picks the element the pin should point\n * at now. Author-or-owner is server-enforced on persist.\n */\n onReattach?: (id: string) => void;\n /** Delete a comment (author-only on the network; the server enforces it). */\n onDelete: (id: string) => void;\n onClose: () => void;\n}) {\n const rowRefs = useRef(new Map<string, HTMLDivElement>());\n const canWrite = canWriteProp ?? !!me?.canWrite;\n // Which row's \"⋯\" menu is open (read/unread toggle). One at a time.\n const [menuId, setMenuId] = useState<string | null>(null);\n useEffect(() => {\n if (!menuId) return;\n const close = (e: MouseEvent) => {\n if (!(e.target as HTMLElement | null)?.closest('[data-cl-rowmenu]')) setMenuId(null);\n };\n document.addEventListener('mousedown', close, true);\n return () => document.removeEventListener('mousedown', close, true);\n }, [menuId]);\n const paged = !!pages && pages.length > 0;\n const pageTitle = (id: string | null) =>\n (id && pages?.find((p) => p.id === id)?.title) || id || '';\n\n // Visible threads + 1-based GLOBAL index (across all pages), mirroring the pin\n // numbering exactly. The list spans every page; pins only show on their own.\n // Indices are assigned oldest-first (so pin numbers never shift as comments\n // arrive), then the list is reversed so the newest thread sits at the top.\n const visible: { thread: ThreadModel; index: number }[] = [];\n let n = 0;\n for (const t of threads) {\n const resolved = !!t.root.resolvedAt;\n if (resolved && !showResolved) continue;\n visible.push({ thread: t, index: ++n });\n }\n visible.reverse();\n const resolvedCount = threads.filter((t) => t.root.resolvedAt).length;\n const unreadCount = visible.filter(({ thread }) => isThreadUnread(thread, me, reads)).length;\n\n // Lost-ness is a live-DOM query (isPinLost does a per-thread selector\n // resolve). It was computed twice per render — once for the orphan filter and\n // again for each visible row — an O(N)×2 layout cascade compounded by P2.3's\n // now-stable thread identity. Resolve it ONCE per render into a map keyed by\n // thread id (still every render, so the \"tracks DOM changes\" contract holds),\n // then look it up in both places.\n const lostById = new Map<string, boolean>();\n for (const t of threads) lostById.set(t.root.id, threadLost(t));\n\n // Orphaned = UNRESOLVED threads whose pin anchor is LOST in the current DOM\n // (launch spec §4: dormant comments surface for human triage). Re-evaluated on\n // every render — the poll/refresh cycle keeps it tracking DOM changes.\n const [orphansOpen, setOrphansOpen] = useState(false);\n const orphans = threads.filter((t) => !t.root.resolvedAt && lostById.get(t.root.id));\n\n // When a pin is opened from the canvas, scroll its row into view.\n useEffect(() => {\n if (!openId) return;\n rowRefs.current.get(openId)?.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n }, [openId]);\n\n const onActivePage = (t: ThreadModel) => !paged || t.root.pageId === activePageId;\n\n // Click a row → open the thread popover at its pin + pan there (Figma-style),\n // switching pages first if it's off-page. Shared with the `?pin=` deeplink.\n const select = (t: ThreadModel) => {\n onOpen(t.root.id);\n panToThread(t, { paged, activePageId, onSwitchPage });\n };\n\n return (\n <div\n data-cl-ui\n style={{\n position: 'fixed',\n top: 16,\n right: PANEL_GAP,\n bottom: 16,\n width: PANEL_W,\n zIndex: 2000,\n background: DARK,\n borderRadius: 10,\n border: '1px solid rgba(255,255,255,0.12)',\n boxShadow: '0 16px 48px rgba(0,0,0,0.4)',\n display: 'flex',\n flexDirection: 'column',\n fontFamily: FONT,\n color: '#f5f1e8',\n overflow: 'hidden',\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n style={{\n padding: '12px 14px',\n borderBottom: '1px solid rgba(255,255,255,0.08)',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}\n >\n <span style={{ fontSize: 16, fontWeight: 600, color: '#fff', letterSpacing: -0.2 }}>\n Comments\n </span>\n <span style={{ fontSize: 12, color: 'rgba(245,241,232,0.5)' }}>{visible.length}</span>\n {unreadCount > 0 && (\n <span\n title={`${unreadCount} unread`}\n style={{\n fontSize: 11,\n fontWeight: 700,\n color: '#16181b',\n background: 'linear-gradient(135deg,#cbd2de 0%,#868fa0 100%)',\n borderRadius: 999,\n padding: '1px 7px',\n lineHeight: 1.5,\n }}\n >\n {unreadCount} new\n </span>\n )}\n <button\n type=\"button\"\n aria-label=\"Close comments\"\n onClick={onClose}\n style={{\n marginLeft: 'auto',\n border: 'none',\n background: 'transparent',\n color: 'rgba(245,241,232,0.7)',\n fontSize: 18,\n lineHeight: 1,\n cursor: 'pointer',\n }}\n >\n ✕\n </button>\n </div>\n\n {/* Auth prompt (network mode): sign in to comment, or read-only note. */}\n {needsAuth && (\n <div\n style={{\n padding: '12px 14px',\n borderBottom: '1px solid rgba(255,255,255,0.06)',\n background: 'rgba(154,166,187,0.10)',\n }}\n >\n {signedOut ? (\n <>\n <div style={{ fontSize: 12.5, color: 'rgba(245,241,232,0.8)', marginBottom: 4, lineHeight: 1.5 }}>\n Sign in to comment.\n </div>\n <div style={{ fontSize: 11.5, color: 'rgba(245,241,232,0.55)', marginBottom: 8, lineHeight: 1.5 }}>\n Add your name so others know who left a comment.\n </div>\n <button\n type=\"button\"\n onClick={onSignIn}\n style={{\n font: `600 13px ${FONT}`,\n border: 'none',\n borderRadius: 8,\n padding: '7px 14px',\n background: 'linear-gradient(135deg,#cbd2de 0%,#868fa0 100%)',\n color: '#16181b',\n cursor: 'pointer',\n }}\n >\n Sign in\n </button>\n </>\n ) : (\n <>\n <div style={{ fontSize: 12, color: 'rgba(245,241,232,0.65)', lineHeight: 1.5 }}>\n Signed in as <strong style={{ color: '#fff' }}>{me?.displayName}</strong>. You have\n read-only access.\n </div>\n <div style={{ fontSize: 11.5, color: 'rgba(245,241,232,0.55)', marginTop: 8, lineHeight: 1.5 }}>\n Wrong account?{' '}\n <button\n type=\"button\"\n onClick={onSignOut}\n style={{\n font: `600 11.5px ${FONT}`,\n border: 'none',\n background: 'transparent',\n color: '#9aa6bb',\n cursor: 'pointer',\n padding: 0,\n textDecoration: 'underline',\n }}\n >\n Log out\n </button>{' '}\n and sign back in.\n </div>\n </>\n )}\n </div>\n )}\n\n {/* Read-only on a dev/preview host: explain why there's no composer. */}\n {previewReadOnly && (\n <div\n style={{\n padding: '12px 14px',\n borderBottom: '1px solid rgba(255,255,255,0.06)',\n background: 'rgba(245,193,46,0.14)',\n borderLeft: '3px solid #F5C12E',\n }}\n >\n <div\n style={{\n fontSize: 12.5,\n fontWeight: 700,\n color: '#F7CE54',\n lineHeight: 1.5,\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n <span aria-hidden>⚠</span> Comments are read-only here\n </div>\n <div style={{ fontSize: 11.5, color: 'rgba(245,241,232,0.72)', marginTop: 5, lineHeight: 1.5 }}>\n This is a dev or testing build. Comments can only be posted on a{' '}\n <strong style={{ color: 'rgba(245,241,232,0.9)' }}>published link</strong>. Open the\n published canvas to leave a comment.\n </div>\n </div>\n )}\n\n {/* Resolved toggle */}\n {resolvedCount > 0 && (\n <button\n type=\"button\"\n onClick={() => onSetShowResolved(!showResolved)}\n style={{\n textAlign: 'left',\n padding: '8px 14px',\n border: 'none',\n borderBottom: '1px solid rgba(255,255,255,0.06)',\n background: 'transparent',\n color: 'rgba(245,241,232,0.7)',\n font: `600 12px ${FONT}`,\n cursor: 'pointer',\n }}\n >\n {showResolved ? '✓ Showing resolved' : `Show resolved (${resolvedCount})`}\n </button>\n )}\n\n {/* Orphaned threads — unresolved comments whose anchor no longer resolves\n in the live DOM. Hidden entirely when there are none; collapsed into a\n one-line header otherwise. Each entry keeps the historical snapshot +\n identity hints so a human can triage what it pointed at. */}\n {orphans.length > 0 && (\n <div style={{ borderBottom: '1px solid rgba(255,255,255,0.06)', flexShrink: 0 }}>\n <button\n type=\"button\"\n onClick={() => setOrphansOpen(!orphansOpen)}\n style={{\n width: '100%',\n textAlign: 'left',\n padding: '8px 14px',\n border: 'none',\n background: 'rgba(200,132,28,0.10)',\n color: '#e8b05a',\n font: `600 12px ${FONT}`,\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n }}\n >\n <span aria-hidden>⚠</span>\n Orphaned ({orphans.length})\n <span style={{ marginLeft: 'auto', fontSize: 10, opacity: 0.8 }}>\n {orphansOpen ? '▾' : '▸'}\n </span>\n </button>\n {orphansOpen && (\n <div style={{ maxHeight: 300, overflowY: 'auto', padding: '4px 8px 8px' }}>\n {orphans.map((t) => {\n const mine = !!me && t.root.author?.id === me.id;\n // WHY it detached (P2.11) — resolved live from the DOM, same\n // cascade as isPinLost. Only the (few, on-screen) orphan rows\n // pay this, not every thread.\n const whyLost = lostReasonLabel(\n pinLostReason({ id: t.root.id, artboardId: t.root.artboardId, anchor: t.root.anchor }),\n );\n return (\n <div\n key={t.root.id}\n style={{\n padding: 8,\n marginTop: 4,\n borderRadius: 8,\n background: 'rgba(255,255,255,0.04)',\n border: '1px solid rgba(200,132,28,0.25)',\n }}\n >\n {/* What it pointed at — identity hints from the stored anchor. */}\n <div\n style={{\n fontSize: 11,\n color: '#e8b05a',\n fontWeight: 600,\n marginBottom: 6,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n title={t.root.anchor.selector}\n >\n <code style={{ font: `600 10.5px ui-monospace, Menlo, monospace` }}>\n &lt;{t.root.anchor.elementTag || 'element'}&gt;\n {t.root.anchor.dataName ? ` · ${t.root.anchor.dataName}` : ''}\n {' · '}\n {selectorTail(t.root.anchor.selector)}\n </code>\n </div>\n\n {/* Why the anchor detached (P2.11) — text-drift vs a vanished\n element — so a reviewer can tell \"it moved\" from \"it's gone\". */}\n {whyLost && (\n <div\n style={{\n fontSize: 10.5,\n color: 'rgba(245,241,232,0.4)',\n marginBottom: 6,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n Lost · {whyLost}\n </div>\n )}\n\n {/* Historical snapshot — what it looked like at comment time. */}\n <div style={{ marginBottom: 6 }}>\n <PreviewImage\n src={t.root.previewImage}\n artboardId={t.root.artboardId}\n anchor={t.root.anchor}\n height={88}\n />\n </div>\n\n {/* Author + time */}\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 6, marginBottom: 2 }}>\n <span style={{ fontSize: 12, fontWeight: 600, color: 'rgba(245,241,232,0.85)' }}>\n {t.root.author?.displayName ?? 'Unknown'}\n </span>\n <span style={{ fontSize: 11, color: 'rgba(245,241,232,0.45)' }}>\n {relativeTime(t.root.createdAt)}\n </span>\n </div>\n\n {/* Body snippet */}\n <div\n style={{\n fontSize: 12,\n lineHeight: 1.45,\n color: 'rgba(245,241,232,0.6)',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n wordBreak: 'break-word',\n marginBottom: 6,\n }}\n >\n {stripMentions(t.root.body)}\n </div>\n\n {/* Triage actions */}\n <div style={{ display: 'flex', gap: 10, flexWrap: 'wrap' }}>\n {onReattach && (\n <button\n type=\"button\"\n disabled={busy || !canWrite}\n title={\n canWrite\n ? 'Pick the element this comment should point to now'\n : 'Read-only — published links only'\n }\n onClick={() => onReattach(t.root.id)}\n style={orphanActionStyle('#e8b05a')}\n >\n Re-attach\n </button>\n )}\n <button\n type=\"button\"\n title=\"Pan to the pin's last-known position on the artboard\"\n onClick={() => {\n onOpen(t.root.id);\n panToArtboardPoint(\n t.root.artboardId,\n t.root.anchor.artboardX,\n t.root.anchor.artboardY,\n );\n }}\n style={orphanActionStyle('#9aa6bb')}\n >\n Jump to position\n </button>\n <button\n type=\"button\"\n disabled={busy || !canWrite}\n onClick={() => onResolve(t.root.id)}\n style={orphanActionStyle('#5fbe85')}\n >\n Resolve\n </button>\n {mine && (\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => onDelete(t.root.id)}\n style={orphanActionStyle('#e07a6a')}\n >\n Delete\n </button>\n )}\n </div>\n </div>\n );\n })}\n </div>\n )}\n </div>\n )}\n\n {/* Comment list */}\n <div style={{ flex: 1, overflowY: 'auto', padding: 6 }}>\n {visible.length === 0 && (\n <div\n style={{\n padding: '32px 16px',\n textAlign: 'center',\n color: 'rgba(245,241,232,0.45)',\n fontSize: 13,\n lineHeight: 1.6,\n }}\n >\n No comments yet.\n <br />\n Click any element on the canvas to add one.\n </div>\n )}\n {visible.map(({ thread, index }) => {\n const open = openId === thread.root.id;\n const resolved = !!thread.root.resolvedAt;\n const active = onActivePage(thread);\n const lost = lostById.get(thread.root.id) ?? false; // off-page (unmounted) ≠ lost\n const unread = isThreadUnread(thread, me, reads);\n const people = participants(thread);\n // Brightness encodes read state: unread = full white, read = muted.\n const authorColor = unread ? '#fff' : 'rgba(245,241,232,0.55)';\n const snippetColor = unread ? 'rgba(245,241,232,0.85)' : 'rgba(245,241,232,0.42)';\n const chipColor = unread ? 'rgba(245,241,232,0.55)' : 'rgba(245,241,232,0.38)';\n const dotColor = resolved ? '#1C8B4B' : lost ? '#C8841C' : '#9aa6bb';\n const dotTitle = resolved\n ? 'Resolved'\n : lost\n ? 'Anchor lost'\n : !active\n ? `On ${pageTitle(thread.root.pageId)}`\n : 'Open';\n return (\n <div\n key={thread.root.id}\n ref={(el) => {\n if (el) rowRefs.current.set(thread.root.id, el);\n else rowRefs.current.delete(thread.root.id);\n }}\n role=\"button\"\n tabIndex={0}\n onClick={() => select(thread)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n select(thread);\n }\n }}\n style={{\n padding: '10px 10px 11px 10px',\n borderRadius: 8,\n cursor: 'pointer',\n // Open = cool-grey selection tint; unread (unopened) = a subtle\n // lighter fill (instead of the old blue left rail); read = transparent.\n background: open\n ? 'rgba(154,166,187,0.22)'\n : unread\n ? 'rgba(245,241,232,0.06)'\n : 'transparent',\n transition: 'background 100ms ease',\n }}\n >\n {/* Top row: avatars + resolve check */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, marginBottom: 6 }}>\n <span style={{ display: 'flex' }}>\n {people.map((p, i) => (\n <span key={i} style={{ marginLeft: i ? -8 : 0, boxShadow: i ? `0 0 0 2px ${open ? '#34373e' : DARK}` : 'none', borderRadius: '50%' }}>\n <Avatar user={p} size={22} />\n </span>\n ))}\n </span>\n <span\n style={{ width: 7, height: 7, borderRadius: '50%', flexShrink: 0, background: dotColor }}\n title={dotTitle}\n />\n <div style={{ marginLeft: 'auto', display: 'flex', alignItems: 'center', gap: 4 }}>\n {/* Per-row \"⋯\" menu — catch-all for row actions. Today: Mark as\n unread (personal read state), disabled when already unread. */}\n {me && onMarkUnread && (\n <div data-cl-rowmenu style={{ position: 'relative', display: 'flex', alignItems: 'center' }}>\n <button\n type=\"button\"\n aria-label=\"More\"\n title=\"More\"\n onClick={(e) => {\n e.stopPropagation();\n setMenuId(menuId === thread.root.id ? null : thread.root.id);\n }}\n style={{\n width: 22,\n height: 22,\n borderRadius: 6,\n border: 'none',\n background: menuId === thread.root.id ? 'rgba(245,241,232,0.12)' : 'transparent',\n color: 'rgba(245,241,232,0.55)',\n cursor: 'pointer',\n fontSize: 16,\n lineHeight: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n ⋯\n </button>\n {menuId === thread.root.id && (\n <div\n style={{\n position: 'absolute',\n top: 26,\n right: 0,\n zIndex: 20,\n minWidth: 150,\n background: '#202123',\n border: '1px solid rgba(255,255,255,0.1)',\n borderRadius: 8,\n boxShadow: '0 8px 24px rgba(0,0,0,0.45)',\n padding: 4,\n }}\n >\n <button\n type=\"button\"\n disabled={unread}\n title={unread ? 'Already unread' : undefined}\n onClick={(e) => {\n e.stopPropagation();\n setMenuId(null);\n if (!unread) onMarkUnread?.(thread.root.id);\n }}\n style={{\n display: 'block',\n width: '100%',\n textAlign: 'left',\n border: 'none',\n background: 'transparent',\n color: unread ? 'rgba(245,241,232,0.32)' : 'rgba(245,241,232,0.85)',\n font: `500 12.5px ${FONT}`,\n padding: '7px 9px',\n borderRadius: 6,\n cursor: unread ? 'default' : 'pointer',\n }}\n onMouseEnter={(e) => {\n if (!unread) e.currentTarget.style.background = 'rgba(245,241,232,0.08)';\n }}\n onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')}\n >\n Mark as unread\n </button>\n </div>\n )}\n </div>\n )}\n <button\n type=\"button\"\n aria-label={resolved ? 'Reopen' : 'Resolve'}\n disabled={busy || !canWrite}\n onClick={(e) => {\n e.stopPropagation();\n resolved ? onUnresolve(thread.root.id) : onResolve(thread.root.id);\n }}\n title={canWrite ? (resolved ? 'Reopen' : 'Mark resolved') : 'Read-only — published links only'}\n style={{\n width: 22,\n height: 22,\n borderRadius: '50%',\n border: '1.5px solid',\n borderColor: resolved ? '#1C8B4B' : 'rgba(245,241,232,0.3)',\n background: resolved ? '#1C8B4B' : 'transparent',\n color: resolved ? '#fff' : 'rgba(245,241,232,0.6)',\n fontSize: 12,\n lineHeight: 1,\n cursor: busy || !canWrite ? 'default' : 'pointer',\n opacity: !canWrite ? 0.4 : 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n ✓\n </button>\n </div>\n </div>\n\n {/* Location chip — includes the page name on paged canvases, with a\n ↗ hint when the comment is on another page (click jumps there). */}\n <div style={{ fontSize: 11.5, color: chipColor, fontWeight: 600, marginBottom: 3 }}>\n #{index} ·{' '}\n {paged && thread.root.pageId ? `${pageTitle(thread.root.pageId)} · ` : ''}\n {locationLabel(thread.root.artboardId)}\n {!active && <span style={{ marginLeft: 4, color: '#9aa6bb' }}>↗</span>}\n </div>\n\n {/* Frozen comment-time snapshot — the historical record of what the\n commenter saw. Only rendered when one was captured; legacy\n comments (pre-snapshot) just skip it rather than show a chip. */}\n {thread.root.previewImage && (\n <div style={{ marginBottom: 6 }}>\n <PreviewImage\n src={thread.root.previewImage}\n artboardId={thread.root.artboardId}\n anchor={thread.root.anchor}\n height={96}\n />\n </div>\n )}\n\n {/* Author + time */}\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 6, marginBottom: 3 }}>\n <span style={{ fontSize: 12.5, fontWeight: unread ? 700 : 600, color: authorColor }}>\n {thread.root.author?.displayName ?? 'Unknown'}\n </span>\n <span style={{ fontSize: 11.5, color: 'rgba(245,241,232,0.45)' }}>\n {relativeTime(thread.root.createdAt)}\n </span>\n </div>\n\n {/* Snippet (2-line clamp) */}\n <div\n style={{\n fontSize: 12.5,\n lineHeight: 1.45,\n color: snippetColor,\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n wordBreak: 'break-word',\n }}\n >\n {stripMentions(thread.root.body)}\n </div>\n\n {/* Reply count */}\n {thread.replies.length > 0 && (\n <div style={{ fontSize: 11.5, color: '#9aa6bb', fontWeight: 600, marginTop: 5 }}>\n {thread.replies.length} {thread.replies.length === 1 ? 'reply' : 'replies'}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","import {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n} from 'react';\nimport { resolvePinScreen } from './pinAnchor';\nimport type { PinAnchor } from './types';\n\nexport interface PinView {\n id: string; // root comment id, or 'draft'\n artboardId: string;\n anchor: PinAnchor;\n kind: 'unresolved' | 'resolved' | 'draft';\n /** Badge number (1-based) for saved pins; undefined for the draft. */\n index?: number;\n}\n\nconst COLORS = {\n unresolved: '#9aa6bb',\n resolved: '#1C8B4B',\n draft: '#9aa6bb',\n lost: '#C8841C',\n};\n\n/**\n * Renders all pins as screen-space markers, glued to their targets by splitting\n * the work in two so pan/zoom stays buttery:\n *\n * • reposition() — runs on every viewport transform write (the DCViewport\n * subscriber feed, fired synchronously inside its own `apply()`), so pins move\n * in the SAME frame as the canvas. Pure math from each pin's cached world-space\n * coords — no `getBoundingClientRect`, no layout — so it's frame-locked and\n * cheap even during a fast pan.\n * • resolve() — the layout-reading 5-layer cascade that (re)finds each anchor and\n * backs out its world coords + anchor-lost flag. Throttled (~100ms) and skipped\n * while interacting; the transform feed keeps positions live in the meantime.\n *\n * Positions are written straight to each wrapper's `transform` (no per-frame React\n * render); only anchor-lost *flips* trigger a re-render. Each wrapper also hosts\n * that pin's popover (`renderPopover`), so the open thread rides along for free.\n */\nexport function PinLayer({\n pins,\n openId,\n onOpen,\n renderPopover,\n}: {\n pins: PinView[];\n openId: string | null;\n onOpen: (id: string | null) => void;\n renderPopover: (pin: PinView, lost: boolean) => ReactNode;\n}) {\n const wrapRefs = useRef(new Map<string, HTMLDivElement>());\n const pinsRef = useRef(pins);\n pinsRef.current = pins;\n const lostRef = useRef(new Map<string, boolean>());\n // Per-pin cache: the anchor's position in the UNTRANSFORMED world layer (lx,ly)\n // + flags. resolve() refreshes it (slow); reposition() reads it (every frame).\n const worldRef = useRef(new Map<string, { lx: number; ly: number; visible: boolean; lost: boolean }>());\n const [, forceLostTick] = useState(0);\n\n useEffect(() => {\n const vpEl = document.querySelector('[data-dc-viewport]') as\n | (HTMLElement & {\n __dcViewport?: {\n subscribe: (fn: (tf: { x: number; y: number; scale: number }) => void) => () => void;\n getTransform: () => { x: number; y: number; scale: number };\n };\n })\n | null;\n const api = vpEl?.__dcViewport ?? null;\n // Page mode (no DesignCanvas viewport — the embed's in-page review mode):\n // there is no canvas transform, so screen coords ARE world coords. A\n // zero-origin rect + the identity transform make all the math below hold;\n // the scroll/resize listeners + the rAF re-resolve are what track window\n // scroll there (no transform feed exists to subscribe to).\n const PAGE_ORIGIN = { left: 0, top: 0 } as DOMRect;\n // The viewport's screen origin only shifts on window resize/scroll (never\n // during a pan — the world layer moves inside it), so cache it.\n let vpRect: DOMRect | null = vpEl ? vpEl.getBoundingClientRect() : PAGE_ORIGIN;\n\n // Place every pin from its cached world coords through the live transform.\n // The world layer is `translate(tf.x,tf.y) scale(tf.scale)` at origin 0,0, so\n // a world point (lx,ly) lands at screen (vpLeft + tf.x + lx*scale, …). No\n // layout reads → safe to run on every transform tick.\n const reposition = (tf: { x: number; y: number; scale: number }) => {\n if (!vpRect) return;\n for (const pin of pinsRef.current) {\n const wrap = wrapRefs.current.get(pin.id);\n if (!wrap) continue;\n const w = worldRef.current.get(pin.id);\n if (!w || !w.visible) {\n wrap.style.display = 'none';\n continue;\n }\n const sx = vpRect.left + tf.x + w.lx * tf.scale;\n const sy = vpRect.top + tf.y + w.ly * tf.scale;\n wrap.style.display = 'block';\n wrap.style.transform = `translate3d(${sx}px, ${sy}px, 0)`;\n }\n };\n\n // Run the 5-layer cascade to (re)find each anchor, then back out its world\n // coords for reposition(). Catches content reflow / anchor loss.\n const resolve = () => {\n const tf = api ? api.getTransform() : { x: 0, y: 0, scale: 1 };\n let flipped = false;\n for (const pin of pinsRef.current) {\n const pos = resolvePinScreen(pin);\n if (!pos.visible) {\n worldRef.current.set(pin.id, { lx: 0, ly: 0, visible: false, lost: false });\n continue;\n }\n const lx = vpRect ? (pos.x - vpRect.left - tf.x) / tf.scale : 0;\n const ly = vpRect ? (pos.y - vpRect.top - tf.y) / tf.scale : 0;\n worldRef.current.set(pin.id, { lx, ly, visible: true, lost: pos.lost });\n if (lostRef.current.get(pin.id) !== pos.lost) {\n lostRef.current.set(pin.id, pos.lost);\n flipped = true;\n }\n }\n reposition(tf);\n if (flipped) forceLostTick((v) => v + 1);\n };\n\n resolve(); // seed world coords before the transform feed starts\n const unsub = api ? api.subscribe(reposition) : null;\n\n // Slow re-resolve to catch content reflow. Skipped while panning/zooming —\n // the subscriber keeps positions live, so there's no need to thrash layout.\n // ~100ms is already ~6× less work than the old every-frame resolve.\n let raf = 0;\n let last = 0;\n const tick = (now: number) => {\n // Only the viewport carries data-dc-interacting; check the cached vpEl\n // instead of a document querySelector every animation frame (P2.5).\n if (!vpEl?.hasAttribute('data-dc-interacting') && now - last > 100) {\n last = now;\n resolve();\n }\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n\n const refresh = () => {\n vpRect = vpEl ? vpEl.getBoundingClientRect() : PAGE_ORIGIN;\n resolve();\n };\n window.addEventListener('resize', refresh);\n window.addEventListener('scroll', refresh, true);\n\n return () => {\n unsub?.();\n cancelAnimationFrame(raf);\n window.removeEventListener('resize', refresh);\n window.removeEventListener('scroll', refresh, true);\n };\n }, []);\n\n return (\n <>\n {pins.map((pin) => {\n const lost = lostRef.current.get(pin.id) ?? false;\n const open = openId === pin.id;\n const color = lost ? COLORS.lost : COLORS[pin.kind];\n return (\n <div\n key={pin.id}\n ref={(el) => {\n if (el) wrapRefs.current.set(pin.id, el);\n else wrapRefs.current.delete(pin.id);\n }}\n data-cl-pin\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n display: 'none', // shown by the loop once positioned\n pointerEvents: 'none',\n // Open pin rides ABOVE the comments rail (z 2000) + ModeBar (2001)\n // so its popover is never clipped by the rail; closed pins stay low.\n zIndex: open ? 2200 : 1500,\n }}\n >\n {/* Badge — tip points at the pin coordinate (bottom-left corner). */}\n <button\n type=\"button\"\n data-cl-pin-badge\n aria-label={pinLabel(pin, lost)}\n aria-expanded={pin.kind === 'draft' ? undefined : open}\n onClick={(e) => {\n e.stopPropagation();\n if (pin.kind !== 'draft') onOpen(open ? null : pin.id);\n }}\n style={{\n position: 'absolute',\n left: 0,\n bottom: 0,\n width: 26,\n height: 26,\n padding: 0,\n border: open ? '2px solid #fff' : '2px solid rgba(255,255,255,0.9)',\n borderRadius: '13px 13px 13px 2px',\n background: color,\n color: '#fff',\n fontSize: 12,\n fontWeight: 700,\n lineHeight: 1,\n cursor: pin.kind === 'draft' ? 'default' : 'pointer',\n pointerEvents: 'auto',\n boxShadow: open\n ? '0 0 0 3px rgba(154,166,187,0.35), 0 2px 8px rgba(0,0,0,0.25)'\n : '0 1px 4px rgba(0,0,0,0.3)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: 'system-ui, sans-serif',\n }}\n title={lost ? 'Anchor lost — element no longer found' : undefined}\n >\n {lost ? '!' : pin.kind === 'draft' ? '•' : (pin.index ?? '')}\n </button>\n\n {open && <PopoverFrame>{renderPopover(pin, lost)}</PopoverFrame>}\n </div>\n );\n })}\n </>\n );\n}\n\n// Accessible name for a pin badge — screen readers get the badge number + state\n// (there's no reply count in PinView, so we surface what's available).\nfunction pinLabel(pin: PinView, lost: boolean): string {\n if (pin.kind === 'draft') return 'New comment';\n const state = lost ? ', anchor lost' : pin.kind === 'resolved' ? ', resolved' : '';\n return `Comment ${pin.index ?? ''}${state}`.trim();\n}\n\n// The badge's default placement: to the right of the pin (past the 26px badge),\n// bottom-aligned so the thread grows upward from the pin coordinate.\nconst POPOVER_GAP = 34; // right-side offset from the pin x (clears the badge)\nconst POPOVER_MARGIN = 8; // min gap kept from every viewport edge\n\n/**\n * Wraps the open thread popover and keeps it inside the viewport: measures the\n * rendered box (in a layout effect, before paint — no flash) against the pin's\n * screen origin (its `offsetParent`, the fixed pin wrapper at the pin coord) and\n * flips to the pin's left when it would overflow the right edge, then clamps top\n * and left so no edge is clipped. Positions via left/top RELATIVE to the wrapper\n * so it stays glued to the pin as the canvas pans (the wrapper's transform moves\n * everything together). Default (no overflow) reproduces the old left:34/bottom:0.\n */\nfunction PopoverFrame({ children }: { children: ReactNode }) {\n const ref = useRef<HTMLDivElement>(null);\n const [style, setStyle] = useState<CSSProperties>({\n position: 'absolute',\n left: POPOVER_GAP,\n bottom: 0,\n pointerEvents: 'auto',\n });\n\n useLayoutEffect(() => {\n const place = () => {\n const el = ref.current;\n const wrap = el?.parentElement; // the fixed pin wrapper, at the pin coord\n if (!el || !wrap) return;\n const box = el.getBoundingClientRect();\n const origin = wrap.getBoundingClientRect(); // {left: sx, top: sy}\n const w = box.width;\n const h = box.height;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const m = POPOVER_MARGIN;\n\n // Horizontal: default right of the pin; flip left if it would overflow.\n let left = origin.left + POPOVER_GAP;\n if (left + w + m > vw) left = origin.left - m - w; // flip to the pin's left\n left = Math.min(Math.max(left, m), Math.max(m, vw - w - m)); // clamp\n\n // Vertical: default grows up from the pin; clamp into the viewport.\n let top = origin.top - h;\n top = Math.min(Math.max(top, m), Math.max(m, vh - h - m));\n\n setStyle({\n position: 'absolute',\n left: left - origin.left,\n top: top - origin.top,\n pointerEvents: 'auto',\n });\n };\n place();\n window.addEventListener('resize', place);\n return () => window.removeEventListener('resize', place);\n }, [children]);\n\n return (\n <div ref={ref} style={style}>\n {children}\n </div>\n );\n}\n","import { useRef, useState } from 'react';\nimport { MentionTextarea } from './MentionTextarea';\nimport { renderMentionBody } from './mentions';\nimport type { Comment, DirectoryPerson, Me, Thread as ThreadModel } from './types';\nimport { Avatar, cardStyle, ghostBtn, linkBtn, primaryBtn, relativeTime } from './ui';\n\nfunction Row({\n comment,\n me,\n canWrite,\n onDelete,\n}: {\n comment: Comment;\n me: Me | null;\n canWrite: boolean;\n onDelete?: (id: string) => void;\n}) {\n const mine = me && comment.author?.id === me.id;\n return (\n <div style={{ display: 'flex', gap: 8, padding: '10px 12px' }}>\n <Avatar user={comment.author} />\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 6 }}>\n <span style={{ fontWeight: 700 }}>{comment.author?.displayName ?? 'Unknown'}</span>\n <span style={{ color: '#9a9aa2', fontSize: 11.5 }}>{relativeTime(comment.createdAt)}</span>\n {mine && canWrite && onDelete && (\n <button\n type=\"button\"\n style={{ ...linkBtn, color: '#9a9aa2', marginLeft: 'auto', fontSize: 11.5 }}\n onClick={() => onDelete(comment.id)}\n >\n Delete\n </button>\n )}\n </div>\n <div style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-word', marginTop: 2 }}>\n {renderMentionBody(comment.body)}\n </div>\n </div>\n </div>\n );\n}\n\n/** Thread popover — root + flat replies, resolve toggle, reply composer. */\nexport function Thread({\n thread,\n me,\n canWrite: canWriteProp,\n lost,\n busy,\n searchDirectory,\n onReply,\n onResolve,\n onUnresolve,\n onDelete,\n onClose,\n}: {\n thread: ThreadModel;\n me: Me | null;\n /** Host-gated write permission (read-only on dev/preview). Defaults to me.canWrite. */\n canWrite?: boolean;\n lost: boolean;\n busy?: boolean;\n searchDirectory: (q: string) => Promise<DirectoryPerson[]>;\n onReply: (body: string) => void;\n onResolve: () => void;\n onUnresolve: () => void;\n onDelete: (id: string) => void;\n onClose?: () => void;\n}) {\n const [reply, setReply] = useState('');\n const replySerialized = useRef('');\n const resolved = !!thread.root.resolvedAt;\n const canWrite = canWriteProp ?? !!me?.canWrite;\n\n const submitReply = () => {\n const t = replySerialized.current.trim();\n if (t) {\n onReply(t);\n setReply('');\n replySerialized.current = '';\n }\n };\n\n return (\n <div\n style={{ ...cardStyle, width: 320 }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '8px 10px 8px 12px',\n borderBottom: '1px solid #efeff1',\n }}\n >\n {resolved ? (\n <button type=\"button\" style={{ ...ghostBtn, padding: '4px 10px' }} onClick={onUnresolve} disabled={busy}>\n ✓ Resolved · Reopen\n </button>\n ) : (\n <button type=\"button\" style={{ ...ghostBtn, padding: '4px 10px' }} onClick={onResolve} disabled={busy || !canWrite}>\n ✓ Resolve\n </button>\n )}\n {lost && (\n <span style={{ color: '#C8841C', fontSize: 11.5, fontStyle: 'italic' }} title=\"Element no longer found\">\n ⚠ anchor lost\n </span>\n )}\n <button\n type=\"button\"\n aria-label=\"Close\"\n style={{ ...linkBtn, color: '#9a9aa2', marginLeft: 'auto', fontSize: 16, lineHeight: 1 }}\n onClick={onClose}\n >\n ✕\n </button>\n </div>\n\n {/* Comments */}\n <div style={{ maxHeight: 320, overflowY: 'auto' }}>\n <Row comment={thread.root} me={me} canWrite={canWrite} onDelete={onDelete} />\n {thread.replies.map((r) => (\n <div key={r.id} style={{ borderTop: '1px solid #f5f5f6' }}>\n <Row comment={r} me={me} canWrite={canWrite} onDelete={onDelete} />\n </div>\n ))}\n </div>\n\n {/* Reply composer */}\n {canWrite && (\n <div style={{ borderTop: '1px solid #efeff1', padding: 10 }}>\n <MentionTextarea\n value={reply}\n onChange={(d, s) => {\n setReply(d);\n replySerialized.current = s;\n }}\n searchDirectory={searchDirectory}\n placeholder=\"Reply… @ to mention\"\n minHeight={40}\n onSubmitKey={submitReply}\n />\n <div style={{ display: 'flex', justifyContent: 'flex-end', marginTop: 8 }}>\n <button\n type=\"button\"\n style={{ ...primaryBtn, opacity: busy || !reply.trim() ? 0.5 : 1 }}\n onClick={submitReply}\n disabled={busy || !reply.trim()}\n >\n Reply\n </button>\n </div>\n </div>\n )}\n </div>\n );\n}\n","import type {\n Comment,\n CommentsClient,\n CreateCommentInput,\n DirectoryPerson,\n ListResult,\n Me,\n PinTarget,\n PublicUser,\n} from './types';\n\n// In-memory comments store with the same surface as the network client, so the\n// whole UX can be built + demoed without a running comments-service. Pins persist\n// for the session (Vite HMR is fine; a full reload clears). Used during initial\n// integration and any `comments.devMode` usage.\n\nconst MOCK_ME: Me = {\n id: 'mock-you',\n username: 'you',\n displayName: 'You (dev)',\n avatarUrl: null,\n canWrite: true,\n};\n\nfunction publicMe(): PublicUser {\n const { id, username, displayName, avatarUrl } = MOCK_ME;\n return { id, username, displayName, avatarUrl };\n}\n\nlet seq = 0;\nfunction genId(): string {\n return `cmt_mock_${Date.now().toString(36)}_${(seq++).toString(36)}`;\n}\n\n// A tiny fake org directory so @mention works in devMode demos (no backend).\nconst MOCK_DIRECTORY: DirectoryPerson[] = [\n { personId: 'p1', name: 'Ava Chen', email: 'ava@example.com' },\n { personId: 'p2', name: 'Sam Rivera', email: 'sam@example.com' },\n { personId: 'p3', name: 'Jordan Lee', email: 'jordan@example.com' },\n { personId: 'p4', name: 'Maria Garcia', email: 'maria@example.com' },\n { personId: 'p5', name: 'Wei Zhang', email: 'wei@example.com' },\n { personId: 'p6', name: 'Priya Nair', email: 'priya@example.com' },\n];\n\nexport function createMockCommentsClient(canvasId: string): CommentsClient {\n const store: Comment[] = [];\n const reads: Record<string, string> = {}; // rootId → last-read ISO (this session)\n // Tombstone log for incremental (`since`) polls (P2.3) — mirrors the server:\n // a removed row leaves an { id, at } marker so a since-poll can surface it.\n const deletedLog: { id: string; at: string }[] = [];\n const now = () => new Date().toISOString();\n\n const find = (id: string) => store.find((c) => c.id === id);\n const patch = (id: string, p: Partial<Comment>): Comment => {\n const c = find(id);\n if (!c) throw new Error(`Comment ${id} not found`);\n Object.assign(c, p, { updatedAt: now() });\n return { ...c };\n };\n\n return {\n async me() {\n return MOCK_ME;\n },\n async signIn() {\n return MOCK_ME;\n },\n async signOut() {\n /* no-op in dev */\n },\n\n async list(opts: { since?: string } = {}): Promise<ListResult> {\n const serverTime = now();\n const since = opts.since;\n if (!since) {\n return { comments: store.map((c) => ({ ...c })), reads: { ...reads }, deletedIds: [], serverTime };\n }\n // Incremental: only rows changed since the cursor + tombstones in the window\n // (ISO-8601 strings sort lexicographically, so `>` is a valid time compare).\n const comments = store.filter((c) => c.updatedAt > since).map((c) => ({ ...c }));\n const deletedIds = deletedLog.filter((d) => d.at > since).map((d) => d.id);\n return { comments, reads: { ...reads }, deletedIds, serverTime };\n },\n\n async create(input: CreateCommentInput): Promise<Comment> {\n const c: Comment = {\n id: genId(),\n canvasId,\n pageId: input.pageId ?? null,\n artboardId: input.artboardId,\n parentCommentId: null,\n author: publicMe(),\n body: input.body,\n anchor: input.anchor,\n previewImage: input.previewImage ?? null,\n resolvedAt: null,\n resolvedBy: null,\n createdAt: now(),\n updatedAt: now(),\n };\n store.push(c);\n return { ...c };\n },\n\n async reply(rootId: string, body: string): Promise<Comment> {\n const root = find(rootId);\n if (!root) throw new Error(`Root comment ${rootId} not found`);\n const c: Comment = {\n id: genId(),\n canvasId,\n pageId: root.pageId,\n artboardId: root.artboardId,\n parentCommentId: rootId,\n author: publicMe(),\n body,\n anchor: root.anchor, // replies share the root anchor\n previewImage: null, // only roots carry a snapshot\n resolvedAt: null,\n resolvedBy: null,\n createdAt: now(),\n updatedAt: now(),\n };\n store.push(c);\n return { ...c };\n },\n\n async resolve(id: string): Promise<Comment> {\n return patch(id, { resolvedAt: now(), resolvedBy: publicMe() });\n },\n async unresolve(id: string): Promise<Comment> {\n return patch(id, { resolvedAt: null, resolvedBy: null });\n },\n async edit(id: string, body: string): Promise<Comment> {\n return patch(id, { body });\n },\n async reattach(id: string, target: PinTarget): Promise<Comment> {\n // Re-point the root's pin to the freshly-picked element (P2.11) — mirrors\n // the network client: artboardId + anchor overwrite the root's, same id.\n const { artboardId, ...anchor } = target;\n return patch(id, { artboardId, anchor });\n },\n\n async remove(id: string): Promise<void> {\n const target = find(id);\n const isRoot = target && !target.parentCommentId;\n const at = now();\n for (let i = store.length - 1; i >= 0; i--) {\n const c = store[i]!;\n if (c.id === id || (isRoot && c.parentCommentId === id)) {\n deletedLog.push({ id: c.id, at }); // tombstone for since-polls\n store.splice(i, 1);\n }\n }\n delete reads[id];\n },\n\n async markRead(rootId: string): Promise<void> {\n reads[rootId] = now();\n },\n\n async markUnread(rootId: string): Promise<void> {\n delete reads[rootId];\n },\n\n async searchDirectory(q: string): Promise<DirectoryPerson[]> {\n const s = q.trim().toLowerCase();\n if (!s) return [];\n return MOCK_DIRECTORY.filter(\n (p) => p.name.toLowerCase().includes(s) || p.email.toLowerCase().includes(s),\n ).slice(0, 8);\n },\n };\n}\n","import {\n DEFAULT_SERVICE_URL,\n type AuthProvider,\n type Comment,\n type CommentsClient,\n type CreateCommentInput,\n type DirectoryPerson,\n type DirectoryProvider,\n type ListResult,\n type Me,\n type PinTarget,\n} from './types';\nimport { resolveCanvasId } from './hostScope';\n\n// Re-export for back-compat: callers historically imported isLiveCommentsHost\n// from networkClient. The implementation now lives in hostScope (so the comments\n// shell can use it without bundling this heavy realtime module).\nexport { isLiveCommentsHost } from './hostScope';\n\n// Network client — the production data layer. Talks to the hosted comments-service\n// (a small Express + Postgres backend; see CommentLayer/BACKEND.md). Mirror of\n// `createMockCommentsClient`'s surface, so the UI is swappable behind\n// `comments.devMode`.\n//\n// Auth is a BEARER TOKEN, not a cookie. The service lives on a different origin\n// from the prototype, so its session cookie is third-party (Safari ITP / Chrome\n// 3p-cookie deprecation block it). Instead the auth provider returns a `token`;\n// we stash it and send it as `Authorization: Bearer <token>` on every call.\n// localhost is allow-listed by the service's CORS, so this works in local dev too.\n\n// Build-time-baked provision-hint value (Vite `define` in vite.config.base.ts).\n// `typeof` guard so non-Vite consumers don't ReferenceError; '' when undefined.\ndeclare const __CANVAS_OWNER__: string | undefined;\nconst PROVISION_HINT = typeof __CANVAS_OWNER__ !== 'undefined' ? __CANVAS_OWNER__ : '';\n\n// Host classification + canvasId resolution now live in ./hostScope (so the\n// lightweight comments shell can reuse them without bundling this module).\n\n/** Typed error carrying the HTTP status + the service's machine-readable code. */\nexport class CommentsApiError extends Error {\n status: number;\n code: string;\n constructor(status: number, code: string, message: string) {\n super(message);\n this.name = 'CommentsApiError';\n this.status = status;\n this.code = code;\n }\n}\n\n/**\n * Build the default ACCOUNT-LESS auth provider for a SPECIFIC service base URL\n * (P2.4). Sign-in is just a name (and optional email) — no password, no external\n * identity provider, no verification. The service mints a bearer token for the\n * supplied identity.\n *\n * The provider closes over its own `base`, so two `<DesignCanvas>` instances with\n * different `serviceUrl`s each sign in against the RIGHT backend. (The former\n * module-level `_authBase` singleton cross-wired them: the provider used whichever\n * base the most-recently-constructed client happened to set.)\n *\n * Backend contract:\n * - POST {serviceUrl}/api/auth/guest { name, email? } → { token, me }\n * - GET {serviceUrl}/api/me (bearer token) → Me\n * - POST {serviceUrl}/api/auth/logout (bearer token) → 204/ok\n */\nexport function accountlessAuthProviderFor(serviceUrl: string): AuthProvider {\n const base = (serviceUrl || '').replace(/\\/+$/, '');\n return {\n async me(token) {\n if (!token) return null;\n const res = await fetch(`${base}/api/me`, {\n headers: { Authorization: `Bearer ${token}` },\n });\n if (res.status === 401) return null;\n if (!res.ok) return null;\n return (await res.json()) as Me;\n },\n async signIn({ name, email }) {\n const res = await fetch(`${base}/api/auth/guest`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name, email }),\n });\n if (!res.ok) {\n const data = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n throw new Error((data.message as string) || 'Sign-in failed.');\n }\n return (await res.json()) as { token: string; me: Me };\n },\n async signOut(token) {\n await fetch(`${base}/api/auth/logout`, {\n method: 'POST',\n headers: { Authorization: `Bearer ${token}` },\n }).catch(() => {\n /* best-effort */\n });\n },\n };\n}\n\n/**\n * Back-compat: the default provider bound to `DEFAULT_SERVICE_URL`. Prefer\n * `accountlessAuthProviderFor(base)` — this fixed-base instance only works when\n * the default service URL is configured. `createNetworkCommentsClient` builds a\n * per-service provider from its own `serviceUrl`, so this export is unused by the\n * runtime and kept only for external importers of the old symbol.\n */\nexport const accountlessAuthProvider: AuthProvider = accountlessAuthProviderFor(DEFAULT_SERVICE_URL);\n\nexport function createNetworkCommentsClient(\n canvasId: string,\n serviceUrl: string = DEFAULT_SERVICE_URL,\n opts: {\n auth?: AuthProvider;\n directory?: DirectoryProvider;\n unstableHostPatterns?: RegExp[];\n provisionHint?: string;\n } = {},\n): CommentsClient {\n const base = serviceUrl.replace(/\\/+$/, '');\n // Default provider is built PER-SERVICE (P2.4) so multi-canvas apps with\n // different serviceUrls each authenticate against their own backend.\n const auth = opts.auth ?? accountlessAuthProviderFor(base);\n const directory = opts.directory;\n const provisionHint = opts.provisionHint ?? PROVISION_HINT;\n // The canvas this client reads/writes is the explicit canvasId — authoritative\n // everywhere (the dashboard mints an opaque cnv_… id; the library never derives\n // it from the hostname).\n const effectiveCanvasId = resolveCanvasId(canvasId);\n // Scope the stored token per service origin so dev + prod don't collide.\n const serviceOrigin = base ? new URL(base).origin : '';\n const tokenKey = `quilt-comments-token:${serviceOrigin}`;\n\n let token: string | null = readToken();\n\n function readToken(): string | null {\n try {\n return window.localStorage.getItem(tokenKey);\n } catch {\n return null;\n }\n }\n function writeToken(t: string | null) {\n token = t;\n try {\n if (t) window.localStorage.setItem(tokenKey, t);\n else window.localStorage.removeItem(tokenKey);\n } catch {\n /* private mode / disabled storage — keep the in-memory copy */\n }\n }\n\n async function request<T>(path: string, init?: RequestInit): Promise<T> {\n const headers: Record<string, string> = { ...(init?.headers as Record<string, string>) };\n if (init?.body) headers['Content-Type'] = 'application/json';\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await fetch(`${base}${path}`, {\n ...init,\n headers,\n // No `credentials` — the bearer token above is the ONLY auth mechanism, and\n // the service is third-party to the customer's prototype so its cookie would\n // be blocked anyway (Safari ITP / Chrome 3p-cookie). Crucially, sending NO\n // credentials is what lets the API open CORS to ANY customer origin: a\n // credentialed cross-origin request would require the server to echo a\n // specific origin + Allow-Credentials (no wildcard), which can't scale to\n // churning preview URLs. (server.ts: `cors({ origin: true })`, no credentials.)\n });\n\n if (res.status === 204) return undefined as T;\n const data = (await res.json().catch(() => ({}))) as Record<string, unknown>;\n if (!res.ok) {\n const code = (data.error as string) ?? `http_${res.status}`;\n const message = (data.message as string) ?? code;\n // A stale/rejected token: drop it so the next me() reflects signed-out.\n if (res.status === 401) writeToken(null);\n throw new CommentsApiError(res.status, code, message);\n }\n return data as T;\n }\n\n return {\n async me() {\n try {\n return await auth.me(token);\n } catch {\n return null;\n }\n },\n\n async signIn() {\n // Account-less by default: collect a display name (and don't require more).\n // A custom AuthProvider can ignore this and run its own flow; here we gather\n // the minimal identity the default provider needs.\n const name = typeof window !== 'undefined' ? window.prompt('Your name')?.trim() : '';\n if (!name) return null;\n const { token: t, me } = await auth.signIn({ name });\n writeToken(t);\n return me;\n },\n\n async signInWith(input: { name: string; email?: string }) {\n const { token: t, me } = await auth.signIn(input);\n writeToken(t);\n return me;\n },\n\n realtimeAuth() {\n if (!base) return null;\n return { url: base, token };\n },\n\n async signOut() {\n try {\n if (token && auth.signOut) await auth.signOut(token);\n } catch {\n /* best-effort; clear locally regardless */\n }\n writeToken(null);\n },\n\n async list(opts: { since?: string }): Promise<ListResult> {\n // No `#page` suffix → the service returns the WHOLE canvas (all pages); the\n // package filters pins by each comment's pageId client-side.\n const params = new URLSearchParams({ canvasId: effectiveCanvasId });\n if (opts.since) params.set('since', opts.since);\n const res = await request<ListResult>(`/api/comments?${params.toString()}`);\n // Tolerate an older backend that doesn't yet send `reads`.\n return { ...res, reads: res.reads ?? {} };\n },\n\n async create(input: CreateCommentInput): Promise<Comment> {\n // The service takes a FLAT body (anchor fields at top level), unlike the\n // nested shape it returns. Bridge it here.\n // Use the client's own canvasId (not input.canvasId); suffix the ACTIVE page\n // so the service tags the row's page_id (it strips at the first '#').\n // `previewImage` is the comment-time snapshot (a data URL, root comments\n // only) — persisted to comments.preview_image. The service caps it at\n // 2,000,000 chars; an oversize image is DROPPED server-side (stored as\n // null), never a comment failure.\n const { artboardId, body, anchor, pageId, previewImage } = input;\n const cid = pageId ? `${effectiveCanvasId}#${pageId}` : effectiveCanvasId;\n return request<Comment>('/api/comments', {\n method: 'POST',\n // `provisionHint` is an auto-provision hint: when this write is the first\n // one for an unregistered canvas, the service creates the canvas and\n // resolves the owner from this hint (rather than from whoever happens to\n // comment first). Ignored once the canvas exists. Empty → service falls\n // back to first-writer.\n body: JSON.stringify({\n canvasId: cid,\n artboardId,\n body,\n ...anchor,\n previewImage: previewImage ?? null,\n provisionHint,\n }),\n });\n },\n\n async reply(rootId: string, body: string): Promise<Comment> {\n return request<Comment>(`/api/comments/${encodeURIComponent(rootId)}/replies`, {\n method: 'POST',\n body: JSON.stringify({ body }),\n });\n },\n\n async resolve(id: string): Promise<Comment> {\n return request<Comment>(`/api/comments/${encodeURIComponent(id)}/resolve`, { method: 'POST' });\n },\n\n async unresolve(id: string): Promise<Comment> {\n return request<Comment>(`/api/comments/${encodeURIComponent(id)}/unresolve`, {\n method: 'POST',\n });\n },\n\n async edit(id: string, body: string): Promise<Comment> {\n return request<Comment>(`/api/comments/${encodeURIComponent(id)}`, {\n method: 'PATCH',\n body: JSON.stringify({ body }),\n });\n },\n\n async reattach(id: string, target: PinTarget): Promise<Comment> {\n // Re-point a root comment's pin to a new element (P2.11). Like `create`,\n // the service takes a FLAT body (artboardId + anchor fields at top level);\n // the returned Comment carries them back nested under `anchor`. Dedicated\n // sub-resource PATCH (distinct from the body-edit PATCH, which is\n // author-only — re-attach also admits the canvas owner, server-enforced).\n const { artboardId, ...anchor } = target;\n return request<Comment>(`/api/comments/${encodeURIComponent(id)}/anchor`, {\n method: 'PATCH',\n body: JSON.stringify({ artboardId, ...anchor }),\n });\n },\n\n async remove(id: string): Promise<void> {\n await request<{ ok: true }>(`/api/comments/${encodeURIComponent(id)}`, { method: 'DELETE' });\n },\n\n async markRead(rootId: string): Promise<void> {\n await request<{ ok: true }>(`/api/comments/${encodeURIComponent(rootId)}/read`, {\n method: 'POST',\n });\n },\n\n async markUnread(rootId: string): Promise<void> {\n // Clears the per-user read mark → the thread reads as unread again.\n await request<{ ok: true }>(`/api/comments/${encodeURIComponent(rootId)}/read`, {\n method: 'DELETE',\n });\n },\n\n async searchDirectory(q: string): Promise<DirectoryPerson[]> {\n const query = q.trim();\n if (!query) return [];\n // A custom directory provider takes precedence over the service endpoint.\n if (directory) {\n try {\n return await directory.search(query);\n } catch {\n return [];\n }\n }\n try {\n // Pass the BASE canvasId so the service can rank people who've already\n // participated on THIS canvas (commented or been @mentioned) ahead of the\n // org-wide fallback. effectiveCanvasId carries no `#page` suffix — directory\n // priority is per-canvas, not per-page. The service tags each row with\n // `isParticipant` for the grouped dropdown; ranking itself is server-side.\n // (A service that ignores canvasId simply omits isParticipant → flat list.)\n const res = await request<{\n results: { personId: string; email: string; name: string | null; isParticipant?: boolean }[];\n }>(\n `/api/directory?q=${encodeURIComponent(query)}&canvasId=${encodeURIComponent(effectiveCanvasId)}`,\n );\n return (res.results ?? []).map((r) => ({\n personId: r.personId,\n email: r.email,\n name: r.name || r.email,\n isParticipant: r.isParticipant,\n }));\n } catch {\n // Typeahead is best-effort — a 401 (signed out) or transient error → no matches.\n return [];\n }\n },\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { groupThreads, type Comment, type CommentsClient, type CreateCommentInput, type Me, type PinTarget } from './types';\n\n/**\n * Owns the comment list + identity for one canvas. Loads on mount, polls every\n * `pollMs` (default 3s) while the tab is visible, and exposes mutators that\n * merge the server's returned row back into local state. Polling pauses on\n * hidden tabs. When the realtime socket is connected, the caller backs the\n * poll off (~25s) — `comment:changed` pings become the freshness signal and\n * the poll only covers dropped-connection gaps (REALTIME.md).\n */\nexport function useComments(client: CommentsClient, opts: { pollMs?: number } = {}) {\n const pollMs = opts.pollMs ?? 3000;\n const [comments, setComments] = useState<Comment[]>([]);\n const [reads, setReads] = useState<Record<string, string>>({});\n const [me, setMe] = useState<Me | null>(null);\n const [ready, setReady] = useState(false);\n // rootId → ISO of when we optimistically marked it UNREAD. A poll can land\n // before the server has recorded the delete and would re-add the stale read\n // mark, flashing the thread back to read; while a thread is \"pending unread\" we\n // suppress any server read mark at-or-older-than that stamp (mirrors markRead's\n // later-timestamp-wins rule, but for a deletion, which has no timestamp).\n const pendingUnread = useRef<Record<string, string>>({});\n // The last serverTime we ingested — fed back as `since` for the next\n // INCREMENTAL poll (P2.3). Null until the first full resync completes.\n const sinceRef = useRef<string | null>(null);\n // A list fetch (refresh or poll) is in flight. The interval defers when set so\n // a slow response can't overlap the next tick — and, critically, so a periodic\n // full-resync never lands on top of an incremental poll and drops a row the\n // poll had just merged (its full replace would predate that row).\n const inFlight = useRef(false);\n\n const mergeOne = (c: Comment) =>\n setComments((prev) => {\n const i = prev.findIndex((x) => x.id === c.id);\n if (i === -1) return [...prev, c];\n const next = prev.slice();\n next[i] = c;\n return next;\n });\n\n const removeLocal = (id: string) =>\n setComments((prev) => prev.filter((c) => c.id !== id && c.parentCommentId !== id));\n\n // Merge server reads with any optimistic local marks, keeping the LATER\n // timestamp per thread — so a poll that lands before the server has recorded a\n // just-opened thread doesn't flash it back to unread.\n const applyReads = (serverReads: Record<string, string> | undefined) => {\n setReads((prev) => {\n const merged = { ...prev };\n for (const [id, ts] of Object.entries(serverReads ?? {})) {\n // Skip a server read mark that's stale relative to a pending mark-unread\n // (the server hasn't processed our delete yet). A genuinely newer read\n // (e.g. opened on another device) outranks the pending unread and applies.\n const pending = pendingUnread.current[id];\n if (pending && ts <= pending) continue;\n if (pending) delete pendingUnread.current[id]; // server caught up → stop suppressing\n if (!merged[id] || ts > merged[id]) merged[id] = ts;\n }\n return merged;\n });\n };\n\n // FULL resync — replace the whole list. Authoritative: used on mount, on the\n // realtime `comment:changed` ping, and periodically as a belt-and-braces guard\n // against a missed incremental delta. Establishes the `since` cursor.\n const refresh = useCallback(async () => {\n inFlight.current = true;\n try {\n const res = await client.list({});\n setComments(res.comments);\n applyReads(res.reads);\n sinceRef.current = res.serverTime ?? sinceRef.current;\n } finally {\n inFlight.current = false;\n }\n }, [client]);\n\n // INCREMENTAL poll — fetch only rows changed since the last cursor and merge by\n // id (P2.3). Untouched rows keep their object identity (we never rebuild them),\n // which is what stops the sidebar's per-poll render churn. Deletions arrive as\n // `deletedIds` tombstones. Falls back to a full resync until a cursor exists.\n const poll = useCallback(async () => {\n const since = sinceRef.current;\n if (!since) {\n await refresh();\n return;\n }\n inFlight.current = true;\n try {\n const res = await client.list({ since });\n if (res.comments.length || (res.deletedIds?.length ?? 0)) {\n setComments((prev) => {\n const dead = new Set(res.deletedIds ?? []);\n const byId = new Map(prev.map((c) => [c.id, c]));\n for (const c of res.comments) byId.set(c.id, c); // upsert changed/new by id\n const next: Comment[] = [];\n for (const c of byId.values()) {\n // Drop tombstoned rows + any reply orphaned by a root tombstone.\n if (dead.has(c.id) || (c.parentCommentId && dead.has(c.parentCommentId))) continue;\n next.push(c);\n }\n return next;\n });\n }\n applyReads(res.reads);\n sinceRef.current = res.serverTime ?? since;\n } finally {\n inFlight.current = false;\n }\n }, [client, refresh]);\n\n useEffect(() => {\n let alive = true;\n setReady(false);\n sinceRef.current = null; // new client → re-establish the cursor from scratch\n (async () => {\n const m = await client.me().catch(() => null);\n if (!alive) return;\n setMe(m);\n await refresh().catch(() => {});\n if (alive) setReady(true);\n })();\n return () => {\n alive = false;\n };\n }, [client, refresh]);\n\n useEffect(() => {\n // Incremental every tick; a FULL resync every Nth tick as a safety net for a\n // dropped delta (a delete tombstone missed while the tab was hidden, etc.).\n const FULL_RESYNC_EVERY = 10;\n let n = 0;\n const timer = setInterval(() => {\n if (document.visibilityState !== 'visible') return;\n if (inFlight.current) return; // a list op (this poll, mount, or a socket refresh) is still running\n n = (n + 1) % FULL_RESYNC_EVERY;\n const run = n === 0 ? refresh : poll;\n void run().catch(() => {});\n }, pollMs);\n return () => clearInterval(timer);\n }, [refresh, poll, pollMs]);\n\n const actions = useMemo(\n () => ({\n async create(input: CreateCommentInput) {\n const c = await client.create(input);\n mergeOne(c);\n return c;\n },\n async reply(rootId: string, body: string) {\n const c = await client.reply(rootId, body);\n mergeOne(c);\n return c;\n },\n async resolve(id: string) {\n mergeOne(await client.resolve(id));\n },\n async unresolve(id: string) {\n mergeOne(await client.unresolve(id));\n },\n async reattach(id: string, target: PinTarget) {\n // The server returns the updated root; merge by id so it lands in state\n // identity-stably (P2.3 upsert) — the pin re-resolves at the new anchor\n // and the sidebar's orphan filter re-evaluates on the next render.\n const c = await client.reattach(id, target);\n mergeOne(c);\n return c;\n },\n async remove(id: string) {\n await client.remove(id);\n removeLocal(id);\n },\n async markRead(rootId: string) {\n // Optimistic: flip to read immediately, then persist. The merge in\n // refresh() keeps this from being clobbered by an in-flight poll.\n delete pendingUnread.current[rootId]; // a read supersedes any pending unread\n setReads((prev) => ({ ...prev, [rootId]: new Date().toISOString() }));\n await client.markRead(rootId).catch(() => {});\n },\n async markUnread(rootId: string) {\n // Optimistic: drop the read mark so it shows unread immediately, then persist.\n // Record the stamp so an in-flight poll can't re-add the stale read mark.\n pendingUnread.current[rootId] = new Date().toISOString();\n setReads((prev) => {\n const next = { ...prev };\n delete next[rootId];\n return next;\n });\n await client.markUnread(rootId).catch(() => {});\n },\n async signIn() {\n const m = client.signIn ? await client.signIn() : me;\n setMe(m);\n await refresh().catch(() => {});\n return m;\n },\n async signInWith(input: { name: string; email?: string }) {\n if (!client.signInWith) return me;\n const m = await client.signInWith(input);\n setMe(m);\n await refresh().catch(() => {});\n return m;\n },\n async signOut() {\n if (client.signOut) await client.signOut();\n setMe(null);\n },\n refresh,\n }),\n [client, refresh, me],\n );\n\n const threads = useMemo(() => groupThreads(comments), [comments]);\n\n return { comments, threads, reads, me, ready, ...actions };\n}\n","const PACKET_TYPES = Object.create(null); // no Map = no polyfill\nPACKET_TYPES[\"open\"] = \"0\";\nPACKET_TYPES[\"close\"] = \"1\";\nPACKET_TYPES[\"ping\"] = \"2\";\nPACKET_TYPES[\"pong\"] = \"3\";\nPACKET_TYPES[\"message\"] = \"4\";\nPACKET_TYPES[\"upgrade\"] = \"5\";\nPACKET_TYPES[\"noop\"] = \"6\";\nconst PACKET_TYPES_REVERSE = Object.create(null);\nObject.keys(PACKET_TYPES).forEach((key) => {\n PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key;\n});\nconst ERROR_PACKET = { type: \"error\", data: \"parser error\" };\nexport { PACKET_TYPES, PACKET_TYPES_REVERSE, ERROR_PACKET };\n","import { PACKET_TYPES } from \"./commons.js\";\nconst withNativeBlob = typeof Blob === \"function\" ||\n (typeof Blob !== \"undefined\" &&\n Object.prototype.toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\n// ArrayBuffer.isView method is not defined in IE10\nconst isView = (obj) => {\n return typeof ArrayBuffer.isView === \"function\"\n ? ArrayBuffer.isView(obj)\n : obj && obj.buffer instanceof ArrayBuffer;\n};\nconst encodePacket = ({ type, data }, supportsBinary, callback) => {\n if (withNativeBlob && data instanceof Blob) {\n if (supportsBinary) {\n return callback(data);\n }\n else {\n return encodeBlobAsBase64(data, callback);\n }\n }\n else if (withNativeArrayBuffer &&\n (data instanceof ArrayBuffer || isView(data))) {\n if (supportsBinary) {\n return callback(data);\n }\n else {\n return encodeBlobAsBase64(new Blob([data]), callback);\n }\n }\n // plain string\n return callback(PACKET_TYPES[type] + (data || \"\"));\n};\nconst encodeBlobAsBase64 = (data, callback) => {\n const fileReader = new FileReader();\n fileReader.onload = function () {\n const content = fileReader.result.split(\",\")[1];\n callback(\"b\" + (content || \"\"));\n };\n return fileReader.readAsDataURL(data);\n};\nfunction toArray(data) {\n if (data instanceof Uint8Array) {\n return data;\n }\n else if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n else {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n}\nlet TEXT_ENCODER;\nexport function encodePacketToBinary(packet, callback) {\n if (withNativeBlob && packet.data instanceof Blob) {\n return packet.data.arrayBuffer().then(toArray).then(callback);\n }\n else if (withNativeArrayBuffer &&\n (packet.data instanceof ArrayBuffer || isView(packet.data))) {\n return callback(toArray(packet.data));\n }\n encodePacket(packet, false, (encoded) => {\n if (!TEXT_ENCODER) {\n TEXT_ENCODER = new TextEncoder();\n }\n callback(TEXT_ENCODER.encode(encoded));\n });\n}\nexport { encodePacket };\n","// imported from https://github.com/socketio/base64-arraybuffer\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nexport const encode = (arraybuffer) => {\n let bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n return base64;\n};\nexport const decode = (base64) => {\n let bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n const arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return arraybuffer;\n};\n","import { ERROR_PACKET, PACKET_TYPES_REVERSE, } from \"./commons.js\";\nimport { decode } from \"./contrib/base64-arraybuffer.js\";\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nexport const decodePacket = (encodedPacket, binaryType) => {\n if (typeof encodedPacket !== \"string\") {\n return {\n type: \"message\",\n data: mapBinary(encodedPacket, binaryType),\n };\n }\n const type = encodedPacket.charAt(0);\n if (type === \"b\") {\n return {\n type: \"message\",\n data: decodeBase64Packet(encodedPacket.substring(1), binaryType),\n };\n }\n const packetType = PACKET_TYPES_REVERSE[type];\n if (!packetType) {\n return ERROR_PACKET;\n }\n return encodedPacket.length > 1\n ? {\n type: PACKET_TYPES_REVERSE[type],\n data: encodedPacket.substring(1),\n }\n : {\n type: PACKET_TYPES_REVERSE[type],\n };\n};\nconst decodeBase64Packet = (data, binaryType) => {\n if (withNativeArrayBuffer) {\n const decoded = decode(data);\n return mapBinary(decoded, binaryType);\n }\n else {\n return { base64: true, data }; // fallback for old browsers\n }\n};\nconst mapBinary = (data, binaryType) => {\n switch (binaryType) {\n case \"blob\":\n if (data instanceof Blob) {\n // from WebSocket + binaryType \"blob\"\n return data;\n }\n else {\n // from HTTP long-polling or WebTransport\n return new Blob([data]);\n }\n case \"arraybuffer\":\n default:\n if (data instanceof ArrayBuffer) {\n // from HTTP long-polling (base64) or WebSocket + binaryType \"arraybuffer\"\n return data;\n }\n else {\n // from WebTransport (Uint8Array)\n return data.buffer;\n }\n }\n};\n","import { encodePacket, encodePacketToBinary } from \"./encodePacket.js\";\nimport { decodePacket } from \"./decodePacket.js\";\nimport { ERROR_PACKET, } from \"./commons.js\";\nconst SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text\nconst encodePayload = (packets, callback) => {\n // some packets may be added to the array while encoding, so the initial length must be saved\n const length = packets.length;\n const encodedPackets = new Array(length);\n let count = 0;\n packets.forEach((packet, i) => {\n // force base64 encoding for binary packets\n encodePacket(packet, false, (encodedPacket) => {\n encodedPackets[i] = encodedPacket;\n if (++count === length) {\n callback(encodedPackets.join(SEPARATOR));\n }\n });\n });\n};\nconst decodePayload = (encodedPayload, binaryType) => {\n const encodedPackets = encodedPayload.split(SEPARATOR);\n const packets = [];\n for (let i = 0; i < encodedPackets.length; i++) {\n const decodedPacket = decodePacket(encodedPackets[i], binaryType);\n packets.push(decodedPacket);\n if (decodedPacket.type === \"error\") {\n break;\n }\n }\n return packets;\n};\nexport function createPacketEncoderStream() {\n return new TransformStream({\n transform(packet, controller) {\n encodePacketToBinary(packet, (encodedPacket) => {\n const payloadLength = encodedPacket.length;\n let header;\n // inspired by the WebSocket format: https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#decoding_payload_length\n if (payloadLength < 126) {\n header = new Uint8Array(1);\n new DataView(header.buffer).setUint8(0, payloadLength);\n }\n else if (payloadLength < 65536) {\n header = new Uint8Array(3);\n const view = new DataView(header.buffer);\n view.setUint8(0, 126);\n view.setUint16(1, payloadLength);\n }\n else {\n header = new Uint8Array(9);\n const view = new DataView(header.buffer);\n view.setUint8(0, 127);\n view.setBigUint64(1, BigInt(payloadLength));\n }\n // first bit indicates whether the payload is plain text (0) or binary (1)\n if (packet.data && typeof packet.data !== \"string\") {\n header[0] |= 0x80;\n }\n controller.enqueue(header);\n controller.enqueue(encodedPacket);\n });\n },\n });\n}\nlet TEXT_DECODER;\nfunction totalLength(chunks) {\n return chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n}\nfunction concatChunks(chunks, size) {\n if (chunks[0].length === size) {\n return chunks.shift();\n }\n const buffer = new Uint8Array(size);\n let j = 0;\n for (let i = 0; i < size; i++) {\n buffer[i] = chunks[0][j++];\n if (j === chunks[0].length) {\n chunks.shift();\n j = 0;\n }\n }\n if (chunks.length && j < chunks[0].length) {\n chunks[0] = chunks[0].slice(j);\n }\n return buffer;\n}\nexport function createPacketDecoderStream(maxPayload, binaryType) {\n if (!TEXT_DECODER) {\n TEXT_DECODER = new TextDecoder();\n }\n const chunks = [];\n let state = 0 /* State.READ_HEADER */;\n let expectedLength = -1;\n let isBinary = false;\n return new TransformStream({\n transform(chunk, controller) {\n chunks.push(chunk);\n while (true) {\n if (state === 0 /* State.READ_HEADER */) {\n if (totalLength(chunks) < 1) {\n break;\n }\n const header = concatChunks(chunks, 1);\n isBinary = (header[0] & 0x80) === 0x80;\n expectedLength = header[0] & 0x7f;\n if (expectedLength < 126) {\n state = 3 /* State.READ_PAYLOAD */;\n }\n else if (expectedLength === 126) {\n state = 1 /* State.READ_EXTENDED_LENGTH_16 */;\n }\n else {\n state = 2 /* State.READ_EXTENDED_LENGTH_64 */;\n }\n }\n else if (state === 1 /* State.READ_EXTENDED_LENGTH_16 */) {\n if (totalLength(chunks) < 2) {\n break;\n }\n const headerArray = concatChunks(chunks, 2);\n expectedLength = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length).getUint16(0);\n state = 3 /* State.READ_PAYLOAD */;\n }\n else if (state === 2 /* State.READ_EXTENDED_LENGTH_64 */) {\n if (totalLength(chunks) < 8) {\n break;\n }\n const headerArray = concatChunks(chunks, 8);\n const view = new DataView(headerArray.buffer, headerArray.byteOffset, headerArray.length);\n const n = view.getUint32(0);\n if (n > Math.pow(2, 53 - 32) - 1) {\n // the maximum safe integer in JavaScript is 2^53 - 1\n controller.enqueue(ERROR_PACKET);\n break;\n }\n expectedLength = n * Math.pow(2, 32) + view.getUint32(4);\n state = 3 /* State.READ_PAYLOAD */;\n }\n else {\n if (totalLength(chunks) < expectedLength) {\n break;\n }\n const data = concatChunks(chunks, expectedLength);\n controller.enqueue(decodePacket(isBinary ? data : TEXT_DECODER.decode(data), binaryType));\n state = 0 /* State.READ_HEADER */;\n }\n if (expectedLength === 0 || expectedLength > maxPayload) {\n controller.enqueue(ERROR_PACKET);\n break;\n }\n }\n },\n });\n}\nexport const protocol = 4;\nexport { encodePacket, encodePayload, decodePacket, decodePayload, };\n","/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nexport function Emitter(obj) {\n if (obj) return mixin(obj);\n}\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n for (var key in Emitter.prototype) {\n obj[key] = Emitter.prototype[key];\n }\n return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n .push(fn);\n return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n function on() {\n this.off(event, on);\n fn.apply(this, arguments);\n }\n\n on.fn = fn;\n this.on(event, on);\n return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n\n // all\n if (0 == arguments.length) {\n this._callbacks = {};\n return this;\n }\n\n // specific event\n var callbacks = this._callbacks['$' + event];\n if (!callbacks) return this;\n\n // remove all handlers\n if (1 == arguments.length) {\n delete this._callbacks['$' + event];\n return this;\n }\n\n // remove specific handler\n var cb;\n for (var i = 0; i < callbacks.length; i++) {\n cb = callbacks[i];\n if (cb === fn || cb.fn === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n\n // Remove event specific arrays for event types that no\n // one is subscribed for to avoid memory leak.\n if (callbacks.length === 0) {\n delete this._callbacks['$' + event];\n }\n\n return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n this._callbacks = this._callbacks || {};\n\n var args = new Array(arguments.length - 1)\n , callbacks = this._callbacks['$' + event];\n\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n\n if (callbacks) {\n callbacks = callbacks.slice(0);\n for (var i = 0, len = callbacks.length; i < len; ++i) {\n callbacks[i].apply(this, args);\n }\n }\n\n return this;\n};\n\n// alias used for reserved events (protected method)\nEmitter.prototype.emitReserved = Emitter.prototype.emit;\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n this._callbacks = this._callbacks || {};\n return this._callbacks['$' + event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n return !! this.listeners(event).length;\n};\n","export const nextTick = (() => {\n const isPromiseAvailable = typeof Promise === \"function\" && typeof Promise.resolve === \"function\";\n if (isPromiseAvailable) {\n return (cb) => Promise.resolve().then(cb);\n }\n else {\n return (cb, setTimeoutFn) => setTimeoutFn(cb, 0);\n }\n})();\nexport const globalThisShim = (() => {\n if (typeof self !== \"undefined\") {\n return self;\n }\n else if (typeof window !== \"undefined\") {\n return window;\n }\n else {\n return Function(\"return this\")();\n }\n})();\nexport const defaultBinaryType = \"arraybuffer\";\nexport function createCookieJar() { }\n","import { globalThisShim as globalThis } from \"./globals.node.js\";\nexport function pick(obj, ...attr) {\n return attr.reduce((acc, k) => {\n if (obj.hasOwnProperty(k)) {\n acc[k] = obj[k];\n }\n return acc;\n }, {});\n}\n// Keep a reference to the real timeout functions so they can be used when overridden\nconst NATIVE_SET_TIMEOUT = globalThis.setTimeout;\nconst NATIVE_CLEAR_TIMEOUT = globalThis.clearTimeout;\nexport function installTimerFunctions(obj, opts) {\n if (opts.useNativeTimers) {\n obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThis);\n obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThis);\n }\n else {\n obj.setTimeoutFn = globalThis.setTimeout.bind(globalThis);\n obj.clearTimeoutFn = globalThis.clearTimeout.bind(globalThis);\n }\n}\n// base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64)\nconst BASE64_OVERHEAD = 1.33;\n// we could also have used `new Blob([obj]).size`, but it isn't supported in IE9\nexport function byteLength(obj) {\n if (typeof obj === \"string\") {\n return utf8Length(obj);\n }\n // arraybuffer or blob\n return Math.ceil((obj.byteLength || obj.size) * BASE64_OVERHEAD);\n}\nfunction utf8Length(str) {\n let c = 0, length = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n length += 1;\n }\n else if (c < 0x800) {\n length += 2;\n }\n else if (c < 0xd800 || c >= 0xe000) {\n length += 3;\n }\n else {\n i++;\n length += 4;\n }\n }\n return length;\n}\n/**\n * Generates a random 8-characters string.\n */\nexport function randomString() {\n return (Date.now().toString(36).substring(3) +\n Math.random().toString(36).substring(2, 5));\n}\n","// imported from https://github.com/galkn/querystring\n/**\n * Compiles a querystring\n * Returns string representation of the object\n *\n * @param {Object}\n * @api private\n */\nexport function encode(obj) {\n let str = '';\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n if (str.length)\n str += '&';\n str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\n }\n }\n return str;\n}\n/**\n * Parses a simple querystring into an object\n *\n * @param {String} qs\n * @api private\n */\nexport function decode(qs) {\n let qry = {};\n let pairs = qs.split('&');\n for (let i = 0, l = pairs.length; i < l; i++) {\n let pair = pairs[i].split('=');\n qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n }\n return qry;\n}\n","import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nimport { encode } from \"./contrib/parseqs.js\";\nexport class TransportError extends Error {\n constructor(reason, description, context) {\n super(reason);\n this.description = description;\n this.context = context;\n this.type = \"TransportError\";\n }\n}\nexport class Transport extends Emitter {\n /**\n * Transport abstract constructor.\n *\n * @param {Object} opts - options\n * @protected\n */\n constructor(opts) {\n super();\n this.writable = false;\n installTimerFunctions(this, opts);\n this.opts = opts;\n this.query = opts.query;\n this.socket = opts.socket;\n this.supportsBinary = !opts.forceBase64;\n }\n /**\n * Emits an error.\n *\n * @param {String} reason\n * @param description\n * @param context - the error context\n * @return {Transport} for chaining\n * @protected\n */\n onError(reason, description, context) {\n super.emitReserved(\"error\", new TransportError(reason, description, context));\n return this;\n }\n /**\n * Opens the transport.\n */\n open() {\n this.readyState = \"opening\";\n this.doOpen();\n return this;\n }\n /**\n * Closes the transport.\n */\n close() {\n if (this.readyState === \"opening\" || this.readyState === \"open\") {\n this.doClose();\n this.onClose();\n }\n return this;\n }\n /**\n * Sends multiple packets.\n *\n * @param {Array} packets\n */\n send(packets) {\n if (this.readyState === \"open\") {\n this.write(packets);\n }\n else {\n // this might happen if the transport was silently closed in the beforeunload event handler\n }\n }\n /**\n * Called upon open\n *\n * @protected\n */\n onOpen() {\n this.readyState = \"open\";\n this.writable = true;\n super.emitReserved(\"open\");\n }\n /**\n * Called with data.\n *\n * @param {String} data\n * @protected\n */\n onData(data) {\n const packet = decodePacket(data, this.socket.binaryType);\n this.onPacket(packet);\n }\n /**\n * Called with a decoded packet.\n *\n * @protected\n */\n onPacket(packet) {\n super.emitReserved(\"packet\", packet);\n }\n /**\n * Called upon close.\n *\n * @protected\n */\n onClose(details) {\n this.readyState = \"closed\";\n super.emitReserved(\"close\", details);\n }\n /**\n * Pauses the transport, in order not to lose packets during an upgrade.\n *\n * @param onPause\n */\n pause(onPause) { }\n createUri(schema, query = {}) {\n return (schema +\n \"://\" +\n this._hostname() +\n this._port() +\n this.opts.path +\n this._query(query));\n }\n _hostname() {\n const hostname = this.opts.hostname;\n return hostname.indexOf(\":\") === -1 ? hostname : \"[\" + hostname + \"]\";\n }\n _port() {\n if (this.opts.port &&\n ((this.opts.secure && Number(this.opts.port) !== 443) ||\n (!this.opts.secure && Number(this.opts.port) !== 80))) {\n return \":\" + this.opts.port;\n }\n else {\n return \"\";\n }\n }\n _query(query) {\n const encodedQuery = encode(query);\n return encodedQuery.length ? \"?\" + encodedQuery : \"\";\n }\n}\n","import { Transport } from \"../transport.js\";\nimport { randomString } from \"../util.js\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nexport class Polling extends Transport {\n constructor() {\n super(...arguments);\n this._polling = false;\n }\n get name() {\n return \"polling\";\n }\n /**\n * Opens the socket (triggers polling). We write a PING message to determine\n * when the transport is open.\n *\n * @protected\n */\n doOpen() {\n this._poll();\n }\n /**\n * Pauses polling.\n *\n * @param {Function} onPause - callback upon buffers are flushed and transport is paused\n * @package\n */\n pause(onPause) {\n this.readyState = \"pausing\";\n const pause = () => {\n this.readyState = \"paused\";\n onPause();\n };\n if (this._polling || !this.writable) {\n let total = 0;\n if (this._polling) {\n total++;\n this.once(\"pollComplete\", function () {\n --total || pause();\n });\n }\n if (!this.writable) {\n total++;\n this.once(\"drain\", function () {\n --total || pause();\n });\n }\n }\n else {\n pause();\n }\n }\n /**\n * Starts polling cycle.\n *\n * @private\n */\n _poll() {\n this._polling = true;\n this.doPoll();\n this.emitReserved(\"poll\");\n }\n /**\n * Overloads onData to detect payloads.\n *\n * @protected\n */\n onData(data) {\n const callback = (packet) => {\n // if its the first message we consider the transport open\n if (\"opening\" === this.readyState && packet.type === \"open\") {\n this.onOpen();\n }\n // if its a close packet, we close the ongoing requests\n if (\"close\" === packet.type) {\n this.onClose({ description: \"transport closed by the server\" });\n return false;\n }\n // otherwise bypass onData and handle the message\n this.onPacket(packet);\n };\n // decode payload\n decodePayload(data, this.socket.binaryType).forEach(callback);\n // if an event did not trigger closing\n if (\"closed\" !== this.readyState) {\n // if we got data we're not polling\n this._polling = false;\n this.emitReserved(\"pollComplete\");\n if (\"open\" === this.readyState) {\n this._poll();\n }\n else {\n }\n }\n }\n /**\n * For polling, send a close packet.\n *\n * @protected\n */\n doClose() {\n const close = () => {\n this.write([{ type: \"close\" }]);\n };\n if (\"open\" === this.readyState) {\n close();\n }\n else {\n // in case we're trying to close while\n // handshaking is in progress (GH-164)\n this.once(\"open\", close);\n }\n }\n /**\n * Writes a packets payload.\n *\n * @param {Array} packets - data packets\n * @protected\n */\n write(packets) {\n this.writable = false;\n encodePayload(packets, (data) => {\n this.doWrite(data, () => {\n this.writable = true;\n this.emitReserved(\"drain\");\n });\n });\n }\n /**\n * Generates uri for connection.\n *\n * @private\n */\n uri() {\n const schema = this.opts.secure ? \"https\" : \"http\";\n const query = this.query || {};\n // cache busting is forced\n if (false !== this.opts.timestampRequests) {\n query[this.opts.timestampParam] = randomString();\n }\n if (!this.supportsBinary && !query.sid) {\n query.b64 = 1;\n }\n return this.createUri(schema, query);\n }\n}\n","// imported from https://github.com/component/has-cors\nlet value = false;\ntry {\n value = typeof XMLHttpRequest !== 'undefined' &&\n 'withCredentials' in new XMLHttpRequest();\n}\ncatch (err) {\n // if XMLHttp support is disabled in IE then it will throw\n // when trying to create\n}\nexport const hasCORS = value;\n","import { Polling } from \"./polling.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions, pick } from \"../util.js\";\nimport { globalThisShim as globalThis } from \"../globals.node.js\";\nimport { hasCORS } from \"../contrib/has-cors.js\";\nfunction empty() { }\nexport class BaseXHR extends Polling {\n /**\n * XHR Polling constructor.\n *\n * @param {Object} opts\n * @package\n */\n constructor(opts) {\n super(opts);\n if (typeof location !== \"undefined\") {\n const isSSL = \"https:\" === location.protocol;\n let port = location.port;\n // some user agents have empty `location.port`\n if (!port) {\n port = isSSL ? \"443\" : \"80\";\n }\n this.xd =\n (typeof location !== \"undefined\" &&\n opts.hostname !== location.hostname) ||\n port !== opts.port;\n }\n }\n /**\n * Sends data.\n *\n * @param {String} data - data to send.\n * @param {Function} fn - called upon flush.\n * @private\n */\n doWrite(data, fn) {\n const req = this.request({\n method: \"POST\",\n data: data,\n });\n req.on(\"success\", fn);\n req.on(\"error\", (xhrStatus, context) => {\n this.onError(\"xhr post error\", xhrStatus, context);\n });\n }\n /**\n * Starts a poll cycle.\n *\n * @private\n */\n doPoll() {\n const req = this.request();\n req.on(\"data\", this.onData.bind(this));\n req.on(\"error\", (xhrStatus, context) => {\n this.onError(\"xhr poll error\", xhrStatus, context);\n });\n this.pollXhr = req;\n }\n}\nexport class Request extends Emitter {\n /**\n * Request constructor\n *\n * @param {Object} options\n * @package\n */\n constructor(createRequest, uri, opts) {\n super();\n this.createRequest = createRequest;\n installTimerFunctions(this, opts);\n this._opts = opts;\n this._method = opts.method || \"GET\";\n this._uri = uri;\n this._data = undefined !== opts.data ? opts.data : null;\n this._create();\n }\n /**\n * Creates the XHR object and sends the request.\n *\n * @private\n */\n _create() {\n var _a;\n const opts = pick(this._opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n opts.xdomain = !!this._opts.xd;\n const xhr = (this._xhr = this.createRequest(opts));\n try {\n xhr.open(this._method, this._uri, true);\n try {\n if (this._opts.extraHeaders) {\n // @ts-ignore\n xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n for (let i in this._opts.extraHeaders) {\n if (this._opts.extraHeaders.hasOwnProperty(i)) {\n xhr.setRequestHeader(i, this._opts.extraHeaders[i]);\n }\n }\n }\n }\n catch (e) { }\n if (\"POST\" === this._method) {\n try {\n xhr.setRequestHeader(\"Content-type\", \"text/plain;charset=UTF-8\");\n }\n catch (e) { }\n }\n try {\n xhr.setRequestHeader(\"Accept\", \"*/*\");\n }\n catch (e) { }\n (_a = this._opts.cookieJar) === null || _a === void 0 ? void 0 : _a.addCookies(xhr);\n // ie6 check\n if (\"withCredentials\" in xhr) {\n xhr.withCredentials = this._opts.withCredentials;\n }\n if (this._opts.requestTimeout) {\n xhr.timeout = this._opts.requestTimeout;\n }\n xhr.onreadystatechange = () => {\n var _a;\n if (xhr.readyState === 3) {\n (_a = this._opts.cookieJar) === null || _a === void 0 ? void 0 : _a.parseCookies(\n // @ts-ignore\n xhr.getResponseHeader(\"set-cookie\"));\n }\n if (4 !== xhr.readyState)\n return;\n if (200 === xhr.status || 1223 === xhr.status) {\n this._onLoad();\n }\n else {\n // make sure the `error` event handler that's user-set\n // does not throw in the same tick and gets caught here\n this.setTimeoutFn(() => {\n this._onError(typeof xhr.status === \"number\" ? xhr.status : 0);\n }, 0);\n }\n };\n xhr.send(this._data);\n }\n catch (e) {\n // Need to defer since .create() is called directly from the constructor\n // and thus the 'error' event can only be only bound *after* this exception\n // occurs. Therefore, also, we cannot throw here at all.\n this.setTimeoutFn(() => {\n this._onError(e);\n }, 0);\n return;\n }\n if (typeof document !== \"undefined\") {\n this._index = Request.requestsCount++;\n Request.requests[this._index] = this;\n }\n }\n /**\n * Called upon error.\n *\n * @private\n */\n _onError(err) {\n this.emitReserved(\"error\", err, this._xhr);\n this._cleanup(true);\n }\n /**\n * Cleans up house.\n *\n * @private\n */\n _cleanup(fromError) {\n if (\"undefined\" === typeof this._xhr || null === this._xhr) {\n return;\n }\n this._xhr.onreadystatechange = empty;\n if (fromError) {\n try {\n this._xhr.abort();\n }\n catch (e) { }\n }\n if (typeof document !== \"undefined\") {\n delete Request.requests[this._index];\n }\n this._xhr = null;\n }\n /**\n * Called upon load.\n *\n * @private\n */\n _onLoad() {\n const data = this._xhr.responseText;\n if (data !== null) {\n this.emitReserved(\"data\", data);\n this.emitReserved(\"success\");\n this._cleanup();\n }\n }\n /**\n * Aborts the request.\n *\n * @package\n */\n abort() {\n this._cleanup();\n }\n}\nRequest.requestsCount = 0;\nRequest.requests = {};\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\nif (typeof document !== \"undefined\") {\n // @ts-ignore\n if (typeof attachEvent === \"function\") {\n // @ts-ignore\n attachEvent(\"onunload\", unloadHandler);\n }\n else if (typeof addEventListener === \"function\") {\n const terminationEvent = \"onpagehide\" in globalThis ? \"pagehide\" : \"unload\";\n addEventListener(terminationEvent, unloadHandler, false);\n }\n}\nfunction unloadHandler() {\n for (let i in Request.requests) {\n if (Request.requests.hasOwnProperty(i)) {\n Request.requests[i].abort();\n }\n }\n}\nconst hasXHR2 = (function () {\n const xhr = newRequest({\n xdomain: false,\n });\n return xhr && xhr.responseType !== null;\n})();\n/**\n * HTTP long-polling based on the built-in `XMLHttpRequest` object.\n *\n * Usage: browser\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest\n */\nexport class XHR extends BaseXHR {\n constructor(opts) {\n super(opts);\n const forceBase64 = opts && opts.forceBase64;\n this.supportsBinary = hasXHR2 && !forceBase64;\n }\n request(opts = {}) {\n Object.assign(opts, { xd: this.xd }, this.opts);\n return new Request(newRequest, this.uri(), opts);\n }\n}\nfunction newRequest(opts) {\n const xdomain = opts.xdomain;\n // XMLHttpRequest can be disabled on IE\n try {\n if (\"undefined\" !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n return new XMLHttpRequest();\n }\n }\n catch (e) { }\n if (!xdomain) {\n try {\n return new globalThis[[\"Active\"].concat(\"Object\").join(\"X\")](\"Microsoft.XMLHTTP\");\n }\n catch (e) { }\n }\n}\n","import { Transport } from \"../transport.js\";\nimport { pick, randomString } from \"../util.js\";\nimport { encodePacket } from \"engine.io-parser\";\nimport { globalThisShim as globalThis, nextTick } from \"../globals.node.js\";\n// detect ReactNative environment\nconst isReactNative = typeof navigator !== \"undefined\" &&\n typeof navigator.product === \"string\" &&\n navigator.product.toLowerCase() === \"reactnative\";\nexport class BaseWS extends Transport {\n get name() {\n return \"websocket\";\n }\n doOpen() {\n const uri = this.uri();\n const protocols = this.opts.protocols;\n // React Native only supports the 'headers' option, and will print a warning if anything else is passed\n const opts = isReactNative\n ? {}\n : pick(this.opts, \"agent\", \"perMessageDeflate\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"localAddress\", \"protocolVersion\", \"origin\", \"maxPayload\", \"family\", \"checkServerIdentity\");\n if (this.opts.extraHeaders) {\n opts.headers = this.opts.extraHeaders;\n }\n try {\n this.ws = this.createSocket(uri, protocols, opts);\n }\n catch (err) {\n return this.emitReserved(\"error\", err);\n }\n this.ws.binaryType = this.socket.binaryType;\n this.addEventListeners();\n }\n /**\n * Adds event listeners to the socket\n *\n * @private\n */\n addEventListeners() {\n this.ws.onopen = () => {\n if (this.opts.autoUnref) {\n this.ws._socket.unref();\n }\n this.onOpen();\n };\n this.ws.onclose = (closeEvent) => this.onClose({\n description: \"websocket connection closed\",\n context: closeEvent,\n });\n this.ws.onmessage = (ev) => this.onData(ev.data);\n this.ws.onerror = (e) => this.onError(\"websocket error\", e);\n }\n write(packets) {\n this.writable = false;\n // encodePacket efficient as it uses WS framing\n // no need for encodePayload\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n encodePacket(packet, this.supportsBinary, (data) => {\n // Sometimes the websocket has already been closed but the browser didn't\n // have a chance of informing us about it yet, in that case send will\n // throw an error\n try {\n this.doWrite(packet, data);\n }\n catch (e) {\n }\n if (lastPacket) {\n // fake drain\n // defer to next tick to allow Socket to clear writeBuffer\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n }\n }\n doClose() {\n if (typeof this.ws !== \"undefined\") {\n this.ws.onerror = () => { };\n this.ws.close();\n this.ws = null;\n }\n }\n /**\n * Generates uri for connection.\n *\n * @private\n */\n uri() {\n const schema = this.opts.secure ? \"wss\" : \"ws\";\n const query = this.query || {};\n // append timestamp to URI\n if (this.opts.timestampRequests) {\n query[this.opts.timestampParam] = randomString();\n }\n // communicate binary support capabilities\n if (!this.supportsBinary) {\n query.b64 = 1;\n }\n return this.createUri(schema, query);\n }\n}\nconst WebSocketCtor = globalThis.WebSocket || globalThis.MozWebSocket;\n/**\n * WebSocket transport based on the built-in `WebSocket` object.\n *\n * Usage: browser, Node.js (since v21), Deno, Bun\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @see https://caniuse.com/mdn-api_websocket\n * @see https://nodejs.org/api/globals.html#websocket\n */\nexport class WS extends BaseWS {\n createSocket(uri, protocols, opts) {\n return !isReactNative\n ? protocols\n ? new WebSocketCtor(uri, protocols)\n : new WebSocketCtor(uri)\n : new WebSocketCtor(uri, protocols, opts);\n }\n doWrite(_packet, data) {\n this.ws.send(data);\n }\n}\n","import { Transport } from \"../transport.js\";\nimport { nextTick } from \"../globals.node.js\";\nimport { createPacketDecoderStream, createPacketEncoderStream, } from \"engine.io-parser\";\n/**\n * WebTransport transport based on the built-in `WebTransport` object.\n *\n * Usage: browser, Node.js (with the `@fails-components/webtransport` package)\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebTransport\n * @see https://caniuse.com/webtransport\n */\nexport class WT extends Transport {\n get name() {\n return \"webtransport\";\n }\n doOpen() {\n try {\n // @ts-ignore\n this._transport = new WebTransport(this.createUri(\"https\"), this.opts.transportOptions[this.name]);\n }\n catch (err) {\n return this.emitReserved(\"error\", err);\n }\n this._transport.closed\n .then(() => {\n this.onClose();\n })\n .catch((err) => {\n this.onError(\"webtransport error\", err);\n });\n // note: we could have used async/await, but that would require some additional polyfills\n this._transport.ready.then(() => {\n this._transport.createBidirectionalStream().then((stream) => {\n const decoderStream = createPacketDecoderStream(Number.MAX_SAFE_INTEGER, this.socket.binaryType);\n const reader = stream.readable.pipeThrough(decoderStream).getReader();\n const encoderStream = createPacketEncoderStream();\n encoderStream.readable.pipeTo(stream.writable);\n this._writer = encoderStream.writable.getWriter();\n const read = () => {\n reader\n .read()\n .then(({ done, value }) => {\n if (done) {\n return;\n }\n this.onPacket(value);\n read();\n })\n .catch((err) => {\n });\n };\n read();\n const packet = { type: \"open\" };\n if (this.query.sid) {\n packet.data = `{\"sid\":\"${this.query.sid}\"}`;\n }\n this._writer.write(packet).then(() => this.onOpen());\n });\n });\n }\n write(packets) {\n this.writable = false;\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n this._writer.write(packet).then(() => {\n if (lastPacket) {\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n }\n }\n doClose() {\n var _a;\n (_a = this._transport) === null || _a === void 0 ? void 0 : _a.close();\n }\n}\n","import { XHR } from \"./polling-xhr.node.js\";\nimport { WS } from \"./websocket.node.js\";\nimport { WT } from \"./webtransport.js\";\nexport const transports = {\n websocket: WS,\n webtransport: WT,\n polling: XHR,\n};\n","// imported from https://github.com/galkn/parseuri\n/**\n * Parses a URI\n *\n * Note: we could also have used the built-in URL object, but it isn't supported on all platforms.\n *\n * See:\n * - https://developer.mozilla.org/en-US/docs/Web/API/URL\n * - https://caniuse.com/url\n * - https://www.rfc-editor.org/rfc/rfc3986#appendix-B\n *\n * History of the parse() method:\n * - first commit: https://github.com/socketio/socket.io-client/commit/4ee1d5d94b3906a9c052b459f1a818b15f38f91c\n * - export into its own module: https://github.com/socketio/engine.io-client/commit/de2c561e4564efeb78f1bdb1ba39ef81b2822cb3\n * - reimport: https://github.com/socketio/engine.io-client/commit/df32277c3f6d622eec5ed09f493cae3f3391d242\n *\n * @author Steven Levithan <stevenlevithan.com> (MIT license)\n * @api private\n */\nconst re = /^(?:(?![^:@\\/?#]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@\\/?#]*)(?::([^:@\\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\nconst parts = [\n 'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\nexport function parse(str) {\n if (str.length > 8000) {\n throw \"URI too long\";\n }\n const src = str, b = str.indexOf('['), e = str.indexOf(']');\n if (b != -1 && e != -1) {\n str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\n }\n let m = re.exec(str || ''), uri = {}, i = 14;\n while (i--) {\n uri[parts[i]] = m[i] || '';\n }\n if (b != -1 && e != -1) {\n uri.source = src;\n uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\n uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\n uri.ipv6uri = true;\n }\n uri.pathNames = pathNames(uri, uri['path']);\n uri.queryKey = queryKey(uri, uri['query']);\n return uri;\n}\nfunction pathNames(obj, path) {\n const regx = /\\/{2,9}/g, names = path.replace(regx, \"/\").split(\"/\");\n if (path.slice(0, 1) == '/' || path.length === 0) {\n names.splice(0, 1);\n }\n if (path.slice(-1) == '/') {\n names.splice(names.length - 1, 1);\n }\n return names;\n}\nfunction queryKey(uri, query) {\n const data = {};\n query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) {\n if ($1) {\n data[$1] = $2;\n }\n });\n return data;\n}\n","import { transports as DEFAULT_TRANSPORTS } from \"./transports/index.js\";\nimport { installTimerFunctions, byteLength } from \"./util.js\";\nimport { decode } from \"./contrib/parseqs.js\";\nimport { parse } from \"./contrib/parseuri.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { protocol } from \"engine.io-parser\";\nimport { createCookieJar, defaultBinaryType, nextTick, } from \"./globals.node.js\";\nconst withEventListeners = typeof addEventListener === \"function\" &&\n typeof removeEventListener === \"function\";\nconst OFFLINE_EVENT_LISTENERS = [];\nif (withEventListeners) {\n // within a ServiceWorker, any event handler for the 'offline' event must be added on the initial evaluation of the\n // script, so we create one single event listener here which will forward the event to the socket instances\n addEventListener(\"offline\", () => {\n OFFLINE_EVENT_LISTENERS.forEach((listener) => listener());\n }, false);\n}\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes without upgrade mechanism, which means that it will keep the first low-level transport that\n * successfully establishes the connection.\n *\n * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.\n *\n * @example\n * import { SocketWithoutUpgrade, WebSocket } from \"engine.io-client\";\n *\n * const socket = new SocketWithoutUpgrade({\n * transports: [WebSocket]\n * });\n *\n * socket.on(\"open\", () => {\n * socket.send(\"hello\");\n * });\n *\n * @see SocketWithUpgrade\n * @see Socket\n */\nexport class SocketWithoutUpgrade extends Emitter {\n /**\n * Socket constructor.\n *\n * @param {String|Object} uri - uri or options\n * @param {Object} opts - options\n */\n constructor(uri, opts) {\n super();\n this.binaryType = defaultBinaryType;\n this.writeBuffer = [];\n this._prevBufferLen = 0;\n this._pingInterval = -1;\n this._pingTimeout = -1;\n this._maxPayload = -1;\n /**\n * The expiration timestamp of the {@link _pingTimeoutTimer} object is tracked, in case the timer is throttled and the\n * callback is not fired on time. This can happen for example when a laptop is suspended or when a phone is locked.\n */\n this._pingTimeoutTime = Infinity;\n if (uri && \"object\" === typeof uri) {\n opts = uri;\n uri = null;\n }\n if (uri) {\n const parsedUri = parse(uri);\n opts.hostname = parsedUri.host;\n opts.secure =\n parsedUri.protocol === \"https\" || parsedUri.protocol === \"wss\";\n opts.port = parsedUri.port;\n if (parsedUri.query)\n opts.query = parsedUri.query;\n }\n else if (opts.host) {\n opts.hostname = parse(opts.host).host;\n }\n installTimerFunctions(this, opts);\n this.secure =\n null != opts.secure\n ? opts.secure\n : typeof location !== \"undefined\" && \"https:\" === location.protocol;\n if (opts.hostname && !opts.port) {\n // if no port is specified manually, use the protocol default\n opts.port = this.secure ? \"443\" : \"80\";\n }\n this.hostname =\n opts.hostname ||\n (typeof location !== \"undefined\" ? location.hostname : \"localhost\");\n this.port =\n opts.port ||\n (typeof location !== \"undefined\" && location.port\n ? location.port\n : this.secure\n ? \"443\"\n : \"80\");\n this.transports = [];\n this._transportsByName = {};\n opts.transports.forEach((t) => {\n const transportName = t.prototype.name;\n this.transports.push(transportName);\n this._transportsByName[transportName] = t;\n });\n this.opts = Object.assign({\n path: \"/engine.io\",\n agent: false,\n withCredentials: false,\n upgrade: true,\n timestampParam: \"t\",\n rememberUpgrade: false,\n addTrailingSlash: true,\n rejectUnauthorized: true,\n perMessageDeflate: {\n threshold: 1024,\n },\n transportOptions: {},\n closeOnBeforeunload: false,\n }, opts);\n this.opts.path =\n this.opts.path.replace(/\\/$/, \"\") +\n (this.opts.addTrailingSlash ? \"/\" : \"\");\n if (typeof this.opts.query === \"string\") {\n this.opts.query = decode(this.opts.query);\n }\n if (withEventListeners) {\n if (this.opts.closeOnBeforeunload) {\n // Firefox closes the connection when the \"beforeunload\" event is emitted but not Chrome. This event listener\n // ensures every browser behaves the same (no \"disconnect\" event at the Socket.IO level when the page is\n // closed/reloaded)\n this._beforeunloadEventListener = () => {\n if (this.transport) {\n // silently close the transport\n this.transport.removeAllListeners();\n this.transport.close();\n }\n };\n addEventListener(\"beforeunload\", this._beforeunloadEventListener, false);\n }\n if (this.hostname !== \"localhost\") {\n this._offlineEventListener = () => {\n this._onClose(\"transport close\", {\n description: \"network connection lost\",\n });\n };\n OFFLINE_EVENT_LISTENERS.push(this._offlineEventListener);\n }\n }\n if (this.opts.withCredentials) {\n this._cookieJar = createCookieJar();\n }\n this._open();\n }\n /**\n * Creates transport of the given type.\n *\n * @param {String} name - transport name\n * @return {Transport}\n * @private\n */\n createTransport(name) {\n const query = Object.assign({}, this.opts.query);\n // append engine.io protocol identifier\n query.EIO = protocol;\n // transport name\n query.transport = name;\n // session id if we already have one\n if (this.id)\n query.sid = this.id;\n const opts = Object.assign({}, this.opts, {\n query,\n socket: this,\n hostname: this.hostname,\n secure: this.secure,\n port: this.port,\n }, this.opts.transportOptions[name]);\n return new this._transportsByName[name](opts);\n }\n /**\n * Initializes transport to use and starts probe.\n *\n * @private\n */\n _open() {\n if (this.transports.length === 0) {\n // Emit error on next tick so it can be listened to\n this.setTimeoutFn(() => {\n this.emitReserved(\"error\", \"No transports available\");\n }, 0);\n return;\n }\n const transportName = this.opts.rememberUpgrade &&\n SocketWithoutUpgrade.priorWebsocketSuccess &&\n this.transports.indexOf(\"websocket\") !== -1\n ? \"websocket\"\n : this.transports[0];\n this.readyState = \"opening\";\n const transport = this.createTransport(transportName);\n transport.open();\n this.setTransport(transport);\n }\n /**\n * Sets the current transport. Disables the existing one (if any).\n *\n * @private\n */\n setTransport(transport) {\n if (this.transport) {\n this.transport.removeAllListeners();\n }\n // set up transport\n this.transport = transport;\n // set up transport listeners\n transport\n .on(\"drain\", this._onDrain.bind(this))\n .on(\"packet\", this._onPacket.bind(this))\n .on(\"error\", this._onError.bind(this))\n .on(\"close\", (reason) => this._onClose(\"transport close\", reason));\n }\n /**\n * Called when connection is deemed open.\n *\n * @private\n */\n onOpen() {\n this.readyState = \"open\";\n SocketWithoutUpgrade.priorWebsocketSuccess =\n \"websocket\" === this.transport.name;\n this.emitReserved(\"open\");\n this.flush();\n }\n /**\n * Handles a packet.\n *\n * @private\n */\n _onPacket(packet) {\n if (\"opening\" === this.readyState ||\n \"open\" === this.readyState ||\n \"closing\" === this.readyState) {\n this.emitReserved(\"packet\", packet);\n // Socket is live - any packet counts\n this.emitReserved(\"heartbeat\");\n switch (packet.type) {\n case \"open\":\n this.onHandshake(JSON.parse(packet.data));\n break;\n case \"ping\":\n this._sendPacket(\"pong\");\n this.emitReserved(\"ping\");\n this.emitReserved(\"pong\");\n this._resetPingTimeout();\n break;\n case \"error\":\n const err = new Error(\"server error\");\n // @ts-ignore\n err.code = packet.data;\n this._onError(err);\n break;\n case \"message\":\n this.emitReserved(\"data\", packet.data);\n this.emitReserved(\"message\", packet.data);\n break;\n }\n }\n else {\n }\n }\n /**\n * Called upon handshake completion.\n *\n * @param {Object} data - handshake obj\n * @private\n */\n onHandshake(data) {\n this.emitReserved(\"handshake\", data);\n this.id = data.sid;\n this.transport.query.sid = data.sid;\n this._pingInterval = data.pingInterval;\n this._pingTimeout = data.pingTimeout;\n this._maxPayload = data.maxPayload;\n this.onOpen();\n // In case open handler closes socket\n if (\"closed\" === this.readyState)\n return;\n this._resetPingTimeout();\n }\n /**\n * Sets and resets ping timeout timer based on server pings.\n *\n * @private\n */\n _resetPingTimeout() {\n this.clearTimeoutFn(this._pingTimeoutTimer);\n const delay = this._pingInterval + this._pingTimeout;\n this._pingTimeoutTime = Date.now() + delay;\n this._pingTimeoutTimer = this.setTimeoutFn(() => {\n this._onClose(\"ping timeout\");\n }, delay);\n if (this.opts.autoUnref) {\n this._pingTimeoutTimer.unref();\n }\n }\n /**\n * Called on `drain` event\n *\n * @private\n */\n _onDrain() {\n this.writeBuffer.splice(0, this._prevBufferLen);\n // setting prevBufferLen = 0 is very important\n // for example, when upgrading, upgrade packet is sent over,\n // and a nonzero prevBufferLen could cause problems on `drain`\n this._prevBufferLen = 0;\n if (0 === this.writeBuffer.length) {\n this.emitReserved(\"drain\");\n }\n else {\n this.flush();\n }\n }\n /**\n * Flush write buffers.\n *\n * @private\n */\n flush() {\n if (\"closed\" !== this.readyState &&\n this.transport.writable &&\n !this.upgrading &&\n this.writeBuffer.length) {\n const packets = this._getWritablePackets();\n this.transport.send(packets);\n // keep track of current length of writeBuffer\n // splice writeBuffer and callbackBuffer on `drain`\n this._prevBufferLen = packets.length;\n this.emitReserved(\"flush\");\n }\n }\n /**\n * Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP\n * long-polling)\n *\n * @private\n */\n _getWritablePackets() {\n const shouldCheckPayloadSize = this._maxPayload &&\n this.transport.name === \"polling\" &&\n this.writeBuffer.length > 1;\n if (!shouldCheckPayloadSize) {\n return this.writeBuffer;\n }\n let payloadSize = 1; // first packet type\n for (let i = 0; i < this.writeBuffer.length; i++) {\n const data = this.writeBuffer[i].data;\n if (data) {\n payloadSize += byteLength(data);\n }\n if (i > 0 && payloadSize > this._maxPayload) {\n return this.writeBuffer.slice(0, i);\n }\n payloadSize += 2; // separator + packet type\n }\n return this.writeBuffer;\n }\n /**\n * Checks whether the heartbeat timer has expired but the socket has not yet been notified.\n *\n * Note: this method is private for now because it does not really fit the WebSocket API, but if we put it in the\n * `write()` method then the message would not be buffered by the Socket.IO client.\n *\n * @return {boolean}\n * @private\n */\n /* private */ _hasPingExpired() {\n if (!this._pingTimeoutTime)\n return true;\n const hasExpired = Date.now() > this._pingTimeoutTime;\n if (hasExpired) {\n this._pingTimeoutTime = 0;\n nextTick(() => {\n this._onClose(\"ping timeout\");\n }, this.setTimeoutFn);\n }\n return hasExpired;\n }\n /**\n * Sends a message.\n *\n * @param {String} msg - message.\n * @param {Object} options.\n * @param {Function} fn - callback function.\n * @return {Socket} for chaining.\n */\n write(msg, options, fn) {\n this._sendPacket(\"message\", msg, options, fn);\n return this;\n }\n /**\n * Sends a message. Alias of {@link Socket#write}.\n *\n * @param {String} msg - message.\n * @param {Object} options.\n * @param {Function} fn - callback function.\n * @return {Socket} for chaining.\n */\n send(msg, options, fn) {\n this._sendPacket(\"message\", msg, options, fn);\n return this;\n }\n /**\n * Sends a packet.\n *\n * @param {String} type - packet type.\n * @param {String} data.\n * @param {Object} options.\n * @param {Function} fn - callback function.\n * @private\n */\n _sendPacket(type, data, options, fn) {\n if (\"function\" === typeof data) {\n fn = data;\n data = undefined;\n }\n if (\"function\" === typeof options) {\n fn = options;\n options = null;\n }\n if (\"closing\" === this.readyState || \"closed\" === this.readyState) {\n return;\n }\n options = options || {};\n options.compress = false !== options.compress;\n const packet = {\n type: type,\n data: data,\n options: options,\n };\n this.emitReserved(\"packetCreate\", packet);\n this.writeBuffer.push(packet);\n if (fn)\n this.once(\"flush\", fn);\n this.flush();\n }\n /**\n * Closes the connection.\n */\n close() {\n const close = () => {\n this._onClose(\"forced close\");\n this.transport.close();\n };\n const cleanupAndClose = () => {\n this.off(\"upgrade\", cleanupAndClose);\n this.off(\"upgradeError\", cleanupAndClose);\n close();\n };\n const waitForUpgrade = () => {\n // wait for upgrade to finish since we can't send packets while pausing a transport\n this.once(\"upgrade\", cleanupAndClose);\n this.once(\"upgradeError\", cleanupAndClose);\n };\n if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n this.readyState = \"closing\";\n if (this.writeBuffer.length) {\n this.once(\"drain\", () => {\n if (this.upgrading) {\n waitForUpgrade();\n }\n else {\n close();\n }\n });\n }\n else if (this.upgrading) {\n waitForUpgrade();\n }\n else {\n close();\n }\n }\n return this;\n }\n /**\n * Called upon transport error\n *\n * @private\n */\n _onError(err) {\n SocketWithoutUpgrade.priorWebsocketSuccess = false;\n if (this.opts.tryAllTransports &&\n this.transports.length > 1 &&\n this.readyState === \"opening\") {\n this.transports.shift();\n return this._open();\n }\n this.emitReserved(\"error\", err);\n this._onClose(\"transport error\", err);\n }\n /**\n * Called upon transport close.\n *\n * @private\n */\n _onClose(reason, description) {\n if (\"opening\" === this.readyState ||\n \"open\" === this.readyState ||\n \"closing\" === this.readyState) {\n // clear timers\n this.clearTimeoutFn(this._pingTimeoutTimer);\n // stop event from firing again for transport\n this.transport.removeAllListeners(\"close\");\n // ensure transport won't stay open\n this.transport.close();\n // ignore further transport communication\n this.transport.removeAllListeners();\n if (withEventListeners) {\n if (this._beforeunloadEventListener) {\n removeEventListener(\"beforeunload\", this._beforeunloadEventListener, false);\n }\n if (this._offlineEventListener) {\n const i = OFFLINE_EVENT_LISTENERS.indexOf(this._offlineEventListener);\n if (i !== -1) {\n OFFLINE_EVENT_LISTENERS.splice(i, 1);\n }\n }\n }\n // set ready state\n this.readyState = \"closed\";\n // clear session id\n this.id = null;\n // emit close event\n this.emitReserved(\"close\", reason, description);\n // clean buffers after, so users can still\n // grab the buffers on `close` event\n this.writeBuffer = [];\n this._prevBufferLen = 0;\n }\n }\n}\nSocketWithoutUpgrade.protocol = protocol;\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes with an upgrade mechanism, which means that once the connection is established with the first\n * low-level transport, it will try to upgrade to a better transport.\n *\n * In order to allow tree-shaking, there are no transports included, that's why the `transports` option is mandatory.\n *\n * @example\n * import { SocketWithUpgrade, WebSocket } from \"engine.io-client\";\n *\n * const socket = new SocketWithUpgrade({\n * transports: [WebSocket]\n * });\n *\n * socket.on(\"open\", () => {\n * socket.send(\"hello\");\n * });\n *\n * @see SocketWithoutUpgrade\n * @see Socket\n */\nexport class SocketWithUpgrade extends SocketWithoutUpgrade {\n constructor() {\n super(...arguments);\n this._upgrades = [];\n }\n onOpen() {\n super.onOpen();\n if (\"open\" === this.readyState && this.opts.upgrade) {\n for (let i = 0; i < this._upgrades.length; i++) {\n this._probe(this._upgrades[i]);\n }\n }\n }\n /**\n * Probes a transport.\n *\n * @param {String} name - transport name\n * @private\n */\n _probe(name) {\n let transport = this.createTransport(name);\n let failed = false;\n SocketWithoutUpgrade.priorWebsocketSuccess = false;\n const onTransportOpen = () => {\n if (failed)\n return;\n transport.send([{ type: \"ping\", data: \"probe\" }]);\n transport.once(\"packet\", (msg) => {\n if (failed)\n return;\n if (\"pong\" === msg.type && \"probe\" === msg.data) {\n this.upgrading = true;\n this.emitReserved(\"upgrading\", transport);\n if (!transport)\n return;\n SocketWithoutUpgrade.priorWebsocketSuccess =\n \"websocket\" === transport.name;\n this.transport.pause(() => {\n if (failed)\n return;\n if (\"closed\" === this.readyState)\n return;\n cleanup();\n this.setTransport(transport);\n transport.send([{ type: \"upgrade\" }]);\n this.emitReserved(\"upgrade\", transport);\n transport = null;\n this.upgrading = false;\n this.flush();\n });\n }\n else {\n const err = new Error(\"probe error\");\n // @ts-ignore\n err.transport = transport.name;\n this.emitReserved(\"upgradeError\", err);\n }\n });\n };\n function freezeTransport() {\n if (failed)\n return;\n // Any callback called by transport should be ignored since now\n failed = true;\n cleanup();\n transport.close();\n transport = null;\n }\n // Handle any error that happens while probing\n const onerror = (err) => {\n const error = new Error(\"probe error: \" + err);\n // @ts-ignore\n error.transport = transport.name;\n freezeTransport();\n this.emitReserved(\"upgradeError\", error);\n };\n function onTransportClose() {\n onerror(\"transport closed\");\n }\n // When the socket is closed while we're probing\n function onclose() {\n onerror(\"socket closed\");\n }\n // When the socket is upgraded while we're probing\n function onupgrade(to) {\n if (transport && to.name !== transport.name) {\n freezeTransport();\n }\n }\n // Remove all listeners on the transport and on self\n const cleanup = () => {\n transport.removeListener(\"open\", onTransportOpen);\n transport.removeListener(\"error\", onerror);\n transport.removeListener(\"close\", onTransportClose);\n this.off(\"close\", onclose);\n this.off(\"upgrading\", onupgrade);\n };\n transport.once(\"open\", onTransportOpen);\n transport.once(\"error\", onerror);\n transport.once(\"close\", onTransportClose);\n this.once(\"close\", onclose);\n this.once(\"upgrading\", onupgrade);\n if (this._upgrades.indexOf(\"webtransport\") !== -1 &&\n name !== \"webtransport\") {\n // favor WebTransport\n this.setTimeoutFn(() => {\n if (!failed) {\n transport.open();\n }\n }, 200);\n }\n else {\n transport.open();\n }\n }\n onHandshake(data) {\n this._upgrades = this._filterUpgrades(data.upgrades);\n super.onHandshake(data);\n }\n /**\n * Filters upgrades, returning only those matching client transports.\n *\n * @param {Array} upgrades - server upgrades\n * @private\n */\n _filterUpgrades(upgrades) {\n const filteredUpgrades = [];\n for (let i = 0; i < upgrades.length; i++) {\n if (~this.transports.indexOf(upgrades[i]))\n filteredUpgrades.push(upgrades[i]);\n }\n return filteredUpgrades;\n }\n}\n/**\n * This class provides a WebSocket-like interface to connect to an Engine.IO server. The connection will be established\n * with one of the available low-level transports, like HTTP long-polling, WebSocket or WebTransport.\n *\n * This class comes with an upgrade mechanism, which means that once the connection is established with the first\n * low-level transport, it will try to upgrade to a better transport.\n *\n * @example\n * import { Socket } from \"engine.io-client\";\n *\n * const socket = new Socket();\n *\n * socket.on(\"open\", () => {\n * socket.send(\"hello\");\n * });\n *\n * @see SocketWithoutUpgrade\n * @see SocketWithUpgrade\n */\nexport class Socket extends SocketWithUpgrade {\n constructor(uri, opts = {}) {\n const o = typeof uri === \"object\" ? uri : opts;\n if (!o.transports ||\n (o.transports && typeof o.transports[0] === \"string\")) {\n o.transports = (o.transports || [\"polling\", \"websocket\", \"webtransport\"])\n .map((transportName) => DEFAULT_TRANSPORTS[transportName])\n .filter((t) => !!t);\n }\n super(uri, o);\n }\n}\n","import { parse } from \"engine.io-client\";\n/**\n * URL parser.\n *\n * @param uri - url\n * @param path - the request path of the connection\n * @param loc - An object meant to mimic window.location.\n * Defaults to window.location.\n * @public\n */\nexport function url(uri, path = \"\", loc) {\n let obj = uri;\n // default to window.location\n loc = loc || (typeof location !== \"undefined\" && location);\n if (null == uri)\n uri = loc.protocol + \"//\" + loc.host;\n // relative path support\n if (typeof uri === \"string\") {\n if (\"/\" === uri.charAt(0)) {\n if (\"/\" === uri.charAt(1)) {\n uri = loc.protocol + uri;\n }\n else {\n uri = loc.host + uri;\n }\n }\n if (!/^(https?|wss?):\\/\\//.test(uri)) {\n if (\"undefined\" !== typeof loc) {\n uri = loc.protocol + \"//\" + uri;\n }\n else {\n uri = \"https://\" + uri;\n }\n }\n // parse\n obj = parse(uri);\n }\n // make sure we treat `localhost:80` and `localhost` equally\n if (!obj.port) {\n if (/^(http|ws)$/.test(obj.protocol)) {\n obj.port = \"80\";\n }\n else if (/^(http|ws)s$/.test(obj.protocol)) {\n obj.port = \"443\";\n }\n }\n obj.path = obj.path || \"/\";\n const ipv6 = obj.host.indexOf(\":\") !== -1;\n const host = ipv6 ? \"[\" + obj.host + \"]\" : obj.host;\n // define unique id\n obj.id = obj.protocol + \"://\" + host + \":\" + obj.port + path;\n // define href\n obj.href =\n obj.protocol +\n \"://\" +\n host +\n (loc && loc.port === obj.port ? \"\" : \":\" + obj.port);\n return obj;\n}\n","const withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst isView = (obj) => {\n return typeof ArrayBuffer.isView === \"function\"\n ? ArrayBuffer.isView(obj)\n : obj.buffer instanceof ArrayBuffer;\n};\nconst toString = Object.prototype.toString;\nconst withNativeBlob = typeof Blob === \"function\" ||\n (typeof Blob !== \"undefined\" &&\n toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeFile = typeof File === \"function\" ||\n (typeof File !== \"undefined\" &&\n toString.call(File) === \"[object FileConstructor]\");\n/**\n * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File.\n *\n * @private\n */\nexport function isBinary(obj) {\n return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) ||\n (withNativeBlob && obj instanceof Blob) ||\n (withNativeFile && obj instanceof File));\n}\nexport function hasBinary(obj, toJSON) {\n if (!obj || typeof obj !== \"object\") {\n return false;\n }\n if (Array.isArray(obj)) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (hasBinary(obj[i])) {\n return true;\n }\n }\n return false;\n }\n if (isBinary(obj)) {\n return true;\n }\n if (obj.toJSON &&\n typeof obj.toJSON === \"function\" &&\n arguments.length === 1) {\n return hasBinary(obj.toJSON(), true);\n }\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n return true;\n }\n }\n return false;\n}\n","import { isBinary } from \"./is-binary.js\";\n/**\n * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @public\n */\nexport function deconstructPacket(packet) {\n const buffers = [];\n const packetData = packet.data;\n const pack = packet;\n pack.data = _deconstructPacket(packetData, buffers);\n pack.attachments = buffers.length; // number of binary 'attachments'\n return { packet: pack, buffers: buffers };\n}\nfunction _deconstructPacket(data, buffers) {\n if (!data)\n return data;\n if (isBinary(data)) {\n const placeholder = { _placeholder: true, num: buffers.length };\n buffers.push(data);\n return placeholder;\n }\n else if (Array.isArray(data)) {\n const newData = new Array(data.length);\n for (let i = 0; i < data.length; i++) {\n newData[i] = _deconstructPacket(data[i], buffers);\n }\n return newData;\n }\n else if (typeof data === \"object\" && !(data instanceof Date)) {\n const newData = {};\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n newData[key] = _deconstructPacket(data[key], buffers);\n }\n }\n return newData;\n }\n return data;\n}\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @public\n */\nexport function reconstructPacket(packet, buffers) {\n packet.data = _reconstructPacket(packet.data, buffers);\n delete packet.attachments; // no longer useful\n return packet;\n}\nfunction _reconstructPacket(data, buffers) {\n if (!data)\n return data;\n if (data && data._placeholder === true) {\n const isIndexValid = typeof data.num === \"number\" &&\n data.num >= 0 &&\n data.num < buffers.length;\n if (isIndexValid) {\n return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n }\n else {\n throw new Error(\"illegal attachments\");\n }\n }\n else if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n data[i] = _reconstructPacket(data[i], buffers);\n }\n }\n else if (typeof data === \"object\") {\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n data[key] = _reconstructPacket(data[key], buffers);\n }\n }\n }\n return data;\n}\n","import { Emitter } from \"@socket.io/component-emitter\";\nimport { deconstructPacket, reconstructPacket } from \"./binary.js\";\nimport { isBinary, hasBinary } from \"./is-binary.js\";\n/**\n * These strings must not be used as event names, as they have a special meaning.\n */\nconst RESERVED_EVENTS = [\n \"connect\", // used on the client side\n \"connect_error\", // used on the client side\n \"disconnect\", // used on both sides\n \"disconnecting\", // used on the server side\n \"newListener\", // used by the Node.js EventEmitter\n \"removeListener\", // used by the Node.js EventEmitter\n];\n/**\n * Protocol version.\n *\n * @public\n */\nexport const protocol = 5;\nexport var PacketType;\n(function (PacketType) {\n PacketType[PacketType[\"CONNECT\"] = 0] = \"CONNECT\";\n PacketType[PacketType[\"DISCONNECT\"] = 1] = \"DISCONNECT\";\n PacketType[PacketType[\"EVENT\"] = 2] = \"EVENT\";\n PacketType[PacketType[\"ACK\"] = 3] = \"ACK\";\n PacketType[PacketType[\"CONNECT_ERROR\"] = 4] = \"CONNECT_ERROR\";\n PacketType[PacketType[\"BINARY_EVENT\"] = 5] = \"BINARY_EVENT\";\n PacketType[PacketType[\"BINARY_ACK\"] = 6] = \"BINARY_ACK\";\n})(PacketType || (PacketType = {}));\n/**\n * A socket.io Encoder instance\n */\nexport class Encoder {\n /**\n * Encoder constructor\n *\n * @param {function} replacer - custom replacer to pass down to JSON.parse\n */\n constructor(replacer) {\n this.replacer = replacer;\n }\n /**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n */\n encode(obj) {\n if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {\n if (hasBinary(obj)) {\n return this.encodeAsBinary({\n type: obj.type === PacketType.EVENT\n ? PacketType.BINARY_EVENT\n : PacketType.BINARY_ACK,\n nsp: obj.nsp,\n data: obj.data,\n id: obj.id,\n });\n }\n }\n return [this.encodeAsString(obj)];\n }\n /**\n * Encode packet as string.\n */\n encodeAsString(obj) {\n // first is type\n let str = \"\" + obj.type;\n // attachments if we have them\n if (obj.type === PacketType.BINARY_EVENT ||\n obj.type === PacketType.BINARY_ACK) {\n str += obj.attachments + \"-\";\n }\n // if we have a namespace other than `/`\n // we append it followed by a comma `,`\n if (obj.nsp && \"/\" !== obj.nsp) {\n str += obj.nsp + \",\";\n }\n // immediately followed by the id\n if (null != obj.id) {\n str += obj.id;\n }\n // json data\n if (null != obj.data) {\n str += JSON.stringify(obj.data, this.replacer);\n }\n return str;\n }\n /**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n */\n encodeAsBinary(obj) {\n const deconstruction = deconstructPacket(obj);\n const pack = this.encodeAsString(deconstruction.packet);\n const buffers = deconstruction.buffers;\n buffers.unshift(pack); // add packet info to beginning of data list\n return buffers; // write all the buffers\n }\n}\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n */\nexport class Decoder extends Emitter {\n /**\n * Decoder constructor\n */\n constructor(opts) {\n super();\n this.opts = Object.assign({\n reviver: undefined,\n maxAttachments: 10,\n }, typeof opts === \"function\" ? { reviver: opts } : opts);\n }\n /**\n * Decodes an encoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n */\n add(obj) {\n let packet;\n if (typeof obj === \"string\") {\n if (this.reconstructor) {\n throw new Error(\"got plaintext data when reconstructing a packet\");\n }\n packet = this.decodeString(obj);\n const isBinaryEvent = packet.type === PacketType.BINARY_EVENT;\n if (isBinaryEvent || packet.type === PacketType.BINARY_ACK) {\n packet.type = isBinaryEvent ? PacketType.EVENT : PacketType.ACK;\n // binary packet's json\n this.reconstructor = new BinaryReconstructor(packet);\n // no attachments, labeled binary but no binary data to follow\n if (packet.attachments === 0) {\n super.emitReserved(\"decoded\", packet);\n }\n }\n else {\n // non-binary full packet\n super.emitReserved(\"decoded\", packet);\n }\n }\n else if (isBinary(obj) || obj.base64) {\n // raw binary data\n if (!this.reconstructor) {\n throw new Error(\"got binary data when not reconstructing a packet\");\n }\n else {\n packet = this.reconstructor.takeBinaryData(obj);\n if (packet) {\n // received final buffer\n this.reconstructor = null;\n super.emitReserved(\"decoded\", packet);\n }\n }\n }\n else {\n throw new Error(\"Unknown type: \" + obj);\n }\n }\n /**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n */\n decodeString(str) {\n let i = 0;\n // look up type\n const p = {\n type: Number(str.charAt(0)),\n };\n if (PacketType[p.type] === undefined) {\n throw new Error(\"unknown packet type \" + p.type);\n }\n // look up attachments if type binary\n if (p.type === PacketType.BINARY_EVENT ||\n p.type === PacketType.BINARY_ACK) {\n const start = i + 1;\n while (str.charAt(++i) !== \"-\" && i != str.length) { }\n const buf = str.substring(start, i);\n if (buf != Number(buf) || str.charAt(i) !== \"-\") {\n throw new Error(\"Illegal attachments\");\n }\n const n = Number(buf);\n if (!isInteger(n) || n < 0) {\n throw new Error(\"Illegal attachments\");\n }\n else if (n > this.opts.maxAttachments) {\n throw new Error(\"too many attachments\");\n }\n p.attachments = n;\n }\n // look up namespace (if any)\n if (\"/\" === str.charAt(i + 1)) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (\",\" === c)\n break;\n if (i === str.length)\n break;\n }\n p.nsp = str.substring(start, i);\n }\n else {\n p.nsp = \"/\";\n }\n // look up id\n const next = str.charAt(i + 1);\n if (\"\" !== next && Number(next) == next) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (null == c || Number(c) != c) {\n --i;\n break;\n }\n if (i === str.length)\n break;\n }\n p.id = Number(str.substring(start, i + 1));\n }\n // look up json data\n if (str.charAt(++i)) {\n const payload = this.tryParse(str.substr(i));\n if (Decoder.isPayloadValid(p.type, payload)) {\n p.data = payload;\n }\n else {\n throw new Error(\"invalid payload\");\n }\n }\n return p;\n }\n tryParse(str) {\n try {\n return JSON.parse(str, this.opts.reviver);\n }\n catch (e) {\n return false;\n }\n }\n static isPayloadValid(type, payload) {\n switch (type) {\n case PacketType.CONNECT:\n return isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n case PacketType.ACK:\n case PacketType.BINARY_ACK:\n return Array.isArray(payload);\n }\n }\n /**\n * Deallocates a parser's resources\n */\n destroy() {\n if (this.reconstructor) {\n this.reconstructor.finishedReconstruction();\n this.reconstructor = null;\n }\n }\n}\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n */\nclass BinaryReconstructor {\n constructor(packet) {\n this.packet = packet;\n this.buffers = [];\n this.reconPack = packet;\n }\n /**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n * a reconstructed packet object if all buffers have been received.\n */\n takeBinaryData(binData) {\n this.buffers.push(binData);\n if (this.buffers.length === this.reconPack.attachments) {\n // done with buffer list\n const packet = reconstructPacket(this.reconPack, this.buffers);\n this.finishedReconstruction();\n return packet;\n }\n return null;\n }\n /**\n * Cleans up binary packet reconstruction variables.\n */\n finishedReconstruction() {\n this.reconPack = null;\n this.buffers = [];\n }\n}\nfunction isNamespaceValid(nsp) {\n return typeof nsp === \"string\";\n}\n// see https://caniuse.com/mdn-javascript_builtins_number_isinteger\nconst isInteger = Number.isInteger ||\n function (value) {\n return (typeof value === \"number\" &&\n isFinite(value) &&\n Math.floor(value) === value);\n };\nfunction isAckIdValid(id) {\n return id === undefined || isInteger(id);\n}\n// see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript\nfunction isObject(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n}\nfunction isDataValid(type, payload) {\n switch (type) {\n case PacketType.CONNECT:\n return payload === undefined || isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n case PacketType.ACK:\n return Array.isArray(payload);\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n default:\n return false;\n }\n}\nexport function isPacketValid(packet) {\n return (isNamespaceValid(packet.nsp) &&\n isAckIdValid(packet.id) &&\n isDataValid(packet.type, packet.data));\n}\n","export function on(obj, ev, fn) {\n obj.on(ev, fn);\n return function subDestroy() {\n obj.off(ev, fn);\n };\n}\n","import { PacketType } from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\n/**\n * Internal events.\n * These events can't be emitted by the user.\n */\nconst RESERVED_EVENTS = Object.freeze({\n connect: 1,\n connect_error: 1,\n disconnect: 1,\n disconnecting: 1,\n // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener\n newListener: 1,\n removeListener: 1,\n});\n/**\n * A Socket is the fundamental class for interacting with the server.\n *\n * A Socket belongs to a certain Namespace (by default /) and uses an underlying {@link Manager} to communicate.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(\"connected\");\n * });\n *\n * // send an event to the server\n * socket.emit(\"foo\", \"bar\");\n *\n * socket.on(\"foobar\", () => {\n * // an event was received from the server\n * });\n *\n * // upon disconnection\n * socket.on(\"disconnect\", (reason) => {\n * console.log(`disconnected due to ${reason}`);\n * });\n */\nexport class Socket extends Emitter {\n /**\n * `Socket` constructor.\n */\n constructor(io, nsp, opts) {\n super();\n /**\n * Whether the socket is currently connected to the server.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(socket.connected); // true\n * });\n *\n * socket.on(\"disconnect\", () => {\n * console.log(socket.connected); // false\n * });\n */\n this.connected = false;\n /**\n * Whether the connection state was recovered after a temporary disconnection. In that case, any missed packets will\n * be transmitted by the server.\n */\n this.recovered = false;\n /**\n * Buffer for packets received before the CONNECT packet\n */\n this.receiveBuffer = [];\n /**\n * Buffer for packets that will be sent once the socket is connected\n */\n this.sendBuffer = [];\n /**\n * The queue of packets to be sent with retry in case of failure.\n *\n * Packets are sent one by one, each waiting for the server acknowledgement, in order to guarantee the delivery order.\n * @private\n */\n this._queue = [];\n /**\n * A sequence to generate the ID of the {@link QueuedPacket}.\n * @private\n */\n this._queueSeq = 0;\n this.ids = 0;\n /**\n * A map containing acknowledgement handlers.\n *\n * The `withError` attribute is used to differentiate handlers that accept an error as first argument:\n *\n * - `socket.emit(\"test\", (err, value) => { ... })` with `ackTimeout` option\n * - `socket.timeout(5000).emit(\"test\", (err, value) => { ... })`\n * - `const value = await socket.emitWithAck(\"test\")`\n *\n * From those that don't:\n *\n * - `socket.emit(\"test\", (value) => { ... });`\n *\n * In the first case, the handlers will be called with an error when:\n *\n * - the timeout is reached\n * - the socket gets disconnected\n *\n * In the second case, the handlers will be simply discarded upon disconnection, since the client will never receive\n * an acknowledgement from the server.\n *\n * @private\n */\n this.acks = {};\n this.flags = {};\n this.io = io;\n this.nsp = nsp;\n if (opts && opts.auth) {\n this.auth = opts.auth;\n }\n this._opts = Object.assign({}, opts);\n if (this.io._autoConnect)\n this.open();\n }\n /**\n * Whether the socket is currently disconnected\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(socket.disconnected); // false\n * });\n *\n * socket.on(\"disconnect\", () => {\n * console.log(socket.disconnected); // true\n * });\n */\n get disconnected() {\n return !this.connected;\n }\n /**\n * Subscribe to open, close and packet events\n *\n * @private\n */\n subEvents() {\n if (this.subs)\n return;\n const io = this.io;\n this.subs = [\n on(io, \"open\", this.onopen.bind(this)),\n on(io, \"packet\", this.onpacket.bind(this)),\n on(io, \"error\", this.onerror.bind(this)),\n on(io, \"close\", this.onclose.bind(this)),\n ];\n }\n /**\n * Whether the Socket will try to reconnect when its Manager connects or reconnects.\n *\n * @example\n * const socket = io();\n *\n * console.log(socket.active); // true\n *\n * socket.on(\"disconnect\", (reason) => {\n * if (reason === \"io server disconnect\") {\n * // the disconnection was initiated by the server, you need to manually reconnect\n * console.log(socket.active); // false\n * }\n * // else the socket will automatically try to reconnect\n * console.log(socket.active); // true\n * });\n */\n get active() {\n return !!this.subs;\n }\n /**\n * \"Opens\" the socket.\n *\n * @example\n * const socket = io({\n * autoConnect: false\n * });\n *\n * socket.connect();\n */\n connect() {\n if (this.connected)\n return this;\n this.subEvents();\n if (!this.io[\"_reconnecting\"])\n this.io.open(); // ensure open\n if (\"open\" === this.io._readyState)\n this.onopen();\n return this;\n }\n /**\n * Alias for {@link connect()}.\n */\n open() {\n return this.connect();\n }\n /**\n * Sends a `message` event.\n *\n * This method mimics the WebSocket.send() method.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send\n *\n * @example\n * socket.send(\"hello\");\n *\n * // this is equivalent to\n * socket.emit(\"message\", \"hello\");\n *\n * @return self\n */\n send(...args) {\n args.unshift(\"message\");\n this.emit.apply(this, args);\n return this;\n }\n /**\n * Override `emit`.\n * If the event is in `events`, it's emitted normally.\n *\n * @example\n * socket.emit(\"hello\", \"world\");\n *\n * // all serializable datastructures are supported (no need to call JSON.stringify)\n * socket.emit(\"hello\", 1, \"2\", { 3: [\"4\"], 5: Uint8Array.from([6]) });\n *\n * // with an acknowledgement from the server\n * socket.emit(\"hello\", \"world\", (val) => {\n * // ...\n * });\n *\n * @return self\n */\n emit(ev, ...args) {\n var _a, _b, _c;\n if (RESERVED_EVENTS.hasOwnProperty(ev)) {\n throw new Error('\"' + ev.toString() + '\" is a reserved event name');\n }\n args.unshift(ev);\n if (this._opts.retries && !this.flags.fromQueue && !this.flags.volatile) {\n this._addToQueue(args);\n return this;\n }\n const packet = {\n type: PacketType.EVENT,\n data: args,\n };\n packet.options = {};\n packet.options.compress = this.flags.compress !== false;\n // event ack callback\n if (\"function\" === typeof args[args.length - 1]) {\n const id = this.ids++;\n const ack = args.pop();\n this._registerAckCallback(id, ack);\n packet.id = id;\n }\n const isTransportWritable = (_b = (_a = this.io.engine) === null || _a === void 0 ? void 0 : _a.transport) === null || _b === void 0 ? void 0 : _b.writable;\n const isConnected = this.connected && !((_c = this.io.engine) === null || _c === void 0 ? void 0 : _c._hasPingExpired());\n const discardPacket = this.flags.volatile && !isTransportWritable;\n if (discardPacket) {\n }\n else if (isConnected) {\n this.notifyOutgoingListeners(packet);\n this.packet(packet);\n }\n else {\n this.sendBuffer.push(packet);\n }\n this.flags = {};\n return this;\n }\n /**\n * @private\n */\n _registerAckCallback(id, ack) {\n var _a;\n const timeout = (_a = this.flags.timeout) !== null && _a !== void 0 ? _a : this._opts.ackTimeout;\n if (timeout === undefined) {\n this.acks[id] = ack;\n return;\n }\n // @ts-ignore\n const timer = this.io.setTimeoutFn(() => {\n delete this.acks[id];\n for (let i = 0; i < this.sendBuffer.length; i++) {\n if (this.sendBuffer[i].id === id) {\n this.sendBuffer.splice(i, 1);\n }\n }\n ack.call(this, new Error(\"operation has timed out\"));\n }, timeout);\n const fn = (...args) => {\n // @ts-ignore\n this.io.clearTimeoutFn(timer);\n ack.apply(this, args);\n };\n fn.withError = true;\n this.acks[id] = fn;\n }\n /**\n * Emits an event and waits for an acknowledgement\n *\n * @example\n * // without timeout\n * const response = await socket.emitWithAck(\"hello\", \"world\");\n *\n * // with a specific timeout\n * try {\n * const response = await socket.timeout(1000).emitWithAck(\"hello\", \"world\");\n * } catch (err) {\n * // the server did not acknowledge the event in the given delay\n * }\n *\n * @return a Promise that will be fulfilled when the server acknowledges the event\n */\n emitWithAck(ev, ...args) {\n return new Promise((resolve, reject) => {\n const fn = (arg1, arg2) => {\n return arg1 ? reject(arg1) : resolve(arg2);\n };\n fn.withError = true;\n args.push(fn);\n this.emit(ev, ...args);\n });\n }\n /**\n * Add the packet to the queue.\n * @param args\n * @private\n */\n _addToQueue(args) {\n let ack;\n if (typeof args[args.length - 1] === \"function\") {\n ack = args.pop();\n }\n const packet = {\n id: this._queueSeq++,\n tryCount: 0,\n pending: false,\n args,\n flags: Object.assign({ fromQueue: true }, this.flags),\n };\n args.push((err, ...responseArgs) => {\n if (packet !== this._queue[0]) {\n }\n const hasError = err !== null;\n if (hasError) {\n if (packet.tryCount > this._opts.retries) {\n this._queue.shift();\n if (ack) {\n ack(err);\n }\n }\n }\n else {\n this._queue.shift();\n if (ack) {\n ack(null, ...responseArgs);\n }\n }\n packet.pending = false;\n return this._drainQueue();\n });\n this._queue.push(packet);\n this._drainQueue();\n }\n /**\n * Send the first packet of the queue, and wait for an acknowledgement from the server.\n * @param force - whether to resend a packet that has not been acknowledged yet\n *\n * @private\n */\n _drainQueue(force = false) {\n if (!this.connected || this._queue.length === 0) {\n return;\n }\n const packet = this._queue[0];\n if (packet.pending && !force) {\n return;\n }\n packet.pending = true;\n packet.tryCount++;\n this.flags = packet.flags;\n this.emit.apply(this, packet.args);\n }\n /**\n * Sends a packet.\n *\n * @param packet\n * @private\n */\n packet(packet) {\n packet.nsp = this.nsp;\n this.io._packet(packet);\n }\n /**\n * Called upon engine `open`.\n *\n * @private\n */\n onopen() {\n if (typeof this.auth == \"function\") {\n this.auth((data) => {\n this._sendConnectPacket(data);\n });\n }\n else {\n this._sendConnectPacket(this.auth);\n }\n }\n /**\n * Sends a CONNECT packet to initiate the Socket.IO session.\n *\n * @param data\n * @private\n */\n _sendConnectPacket(data) {\n this.packet({\n type: PacketType.CONNECT,\n data: this._pid\n ? Object.assign({ pid: this._pid, offset: this._lastOffset }, data)\n : data,\n });\n }\n /**\n * Called upon engine or manager `error`.\n *\n * @param err\n * @private\n */\n onerror(err) {\n if (!this.connected) {\n this.emitReserved(\"connect_error\", err);\n }\n }\n /**\n * Called upon engine `close`.\n *\n * @param reason\n * @param description\n * @private\n */\n onclose(reason, description) {\n this.connected = false;\n delete this.id;\n this.emitReserved(\"disconnect\", reason, description);\n this._clearAcks();\n }\n /**\n * Clears the acknowledgement handlers upon disconnection, since the client will never receive an acknowledgement from\n * the server.\n *\n * @private\n */\n _clearAcks() {\n Object.keys(this.acks).forEach((id) => {\n const isBuffered = this.sendBuffer.some((packet) => String(packet.id) === id);\n if (!isBuffered) {\n // note: handlers that do not accept an error as first argument are ignored here\n const ack = this.acks[id];\n delete this.acks[id];\n if (ack.withError) {\n ack.call(this, new Error(\"socket has been disconnected\"));\n }\n }\n });\n }\n /**\n * Called with socket packet.\n *\n * @param packet\n * @private\n */\n onpacket(packet) {\n const sameNamespace = packet.nsp === this.nsp;\n if (!sameNamespace)\n return;\n switch (packet.type) {\n case PacketType.CONNECT:\n if (packet.data && packet.data.sid) {\n this.onconnect(packet.data.sid, packet.data.pid);\n }\n else {\n this.emitReserved(\"connect_error\", new Error(\"It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)\"));\n }\n break;\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n this.onevent(packet);\n break;\n case PacketType.ACK:\n case PacketType.BINARY_ACK:\n this.onack(packet);\n break;\n case PacketType.DISCONNECT:\n this.ondisconnect();\n break;\n case PacketType.CONNECT_ERROR:\n this.destroy();\n const err = new Error(packet.data.message);\n // @ts-ignore\n err.data = packet.data.data;\n this.emitReserved(\"connect_error\", err);\n break;\n }\n }\n /**\n * Called upon a server event.\n *\n * @param packet\n * @private\n */\n onevent(packet) {\n const args = packet.data || [];\n if (null != packet.id) {\n args.push(this.ack(packet.id));\n }\n if (this.connected) {\n this.emitEvent(args);\n }\n else {\n this.receiveBuffer.push(Object.freeze(args));\n }\n }\n emitEvent(args) {\n if (this._anyListeners && this._anyListeners.length) {\n const listeners = this._anyListeners.slice();\n for (const listener of listeners) {\n listener.apply(this, args);\n }\n }\n super.emit.apply(this, args);\n if (this._pid && args.length && typeof args[args.length - 1] === \"string\") {\n this._lastOffset = args[args.length - 1];\n }\n }\n /**\n * Produces an ack callback to emit with an event.\n *\n * @private\n */\n ack(id) {\n const self = this;\n let sent = false;\n return function (...args) {\n // prevent double callbacks\n if (sent)\n return;\n sent = true;\n self.packet({\n type: PacketType.ACK,\n id: id,\n data: args,\n });\n };\n }\n /**\n * Called upon a server acknowledgement.\n *\n * @param packet\n * @private\n */\n onack(packet) {\n const ack = this.acks[packet.id];\n if (typeof ack !== \"function\") {\n return;\n }\n delete this.acks[packet.id];\n // @ts-ignore FIXME ack is incorrectly inferred as 'never'\n if (ack.withError) {\n packet.data.unshift(null);\n }\n // @ts-ignore\n ack.apply(this, packet.data);\n }\n /**\n * Called upon server connect.\n *\n * @private\n */\n onconnect(id, pid) {\n this.id = id;\n this.recovered = pid && this._pid === pid;\n this._pid = pid; // defined only if connection state recovery is enabled\n this.connected = true;\n this.emitBuffered();\n this._drainQueue(true);\n this.emitReserved(\"connect\");\n }\n /**\n * Emit buffered events (received and emitted).\n *\n * @private\n */\n emitBuffered() {\n this.receiveBuffer.forEach((args) => this.emitEvent(args));\n this.receiveBuffer = [];\n this.sendBuffer.forEach((packet) => {\n this.notifyOutgoingListeners(packet);\n this.packet(packet);\n });\n this.sendBuffer = [];\n }\n /**\n * Called upon server disconnect.\n *\n * @private\n */\n ondisconnect() {\n this.destroy();\n this.onclose(\"io server disconnect\");\n }\n /**\n * Called upon forced client/server side disconnections,\n * this method ensures the manager stops tracking us and\n * that reconnections don't get triggered for this.\n *\n * @private\n */\n destroy() {\n if (this.subs) {\n // clean subscriptions to avoid reconnections\n this.subs.forEach((subDestroy) => subDestroy());\n this.subs = undefined;\n }\n this.io[\"_destroy\"](this);\n }\n /**\n * Disconnects the socket manually. In that case, the socket will not try to reconnect.\n *\n * If this is the last active Socket instance of the {@link Manager}, the low-level connection will be closed.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"disconnect\", (reason) => {\n * // console.log(reason); prints \"io client disconnect\"\n * });\n *\n * socket.disconnect();\n *\n * @return self\n */\n disconnect() {\n if (this.connected) {\n this.packet({ type: PacketType.DISCONNECT });\n }\n // remove socket from pool\n this.destroy();\n if (this.connected) {\n // fire events\n this.onclose(\"io client disconnect\");\n }\n return this;\n }\n /**\n * Alias for {@link disconnect()}.\n *\n * @return self\n */\n close() {\n return this.disconnect();\n }\n /**\n * Sets the compress flag.\n *\n * @example\n * socket.compress(false).emit(\"hello\");\n *\n * @param compress - if `true`, compresses the sending data\n * @return self\n */\n compress(compress) {\n this.flags.compress = compress;\n return this;\n }\n /**\n * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not\n * ready to send messages.\n *\n * @example\n * socket.volatile.emit(\"hello\"); // the server may or may not receive it\n *\n * @returns self\n */\n get volatile() {\n this.flags.volatile = true;\n return this;\n }\n /**\n * Sets a modifier for a subsequent event emission that the callback will be called with an error when the\n * given number of milliseconds have elapsed without an acknowledgement from the server:\n *\n * @example\n * socket.timeout(5000).emit(\"my-event\", (err) => {\n * if (err) {\n * // the server did not acknowledge the event in the given delay\n * }\n * });\n *\n * @returns self\n */\n timeout(timeout) {\n this.flags.timeout = timeout;\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback.\n *\n * @example\n * socket.onAny((event, ...args) => {\n * console.log(`got ${event}`);\n * });\n *\n * @param listener\n */\n onAny(listener) {\n this._anyListeners = this._anyListeners || [];\n this._anyListeners.push(listener);\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback. The listener is added to the beginning of the listeners array.\n *\n * @example\n * socket.prependAny((event, ...args) => {\n * console.log(`got event ${event}`);\n * });\n *\n * @param listener\n */\n prependAny(listener) {\n this._anyListeners = this._anyListeners || [];\n this._anyListeners.unshift(listener);\n return this;\n }\n /**\n * Removes the listener that will be fired when any event is emitted.\n *\n * @example\n * const catchAllListener = (event, ...args) => {\n * console.log(`got event ${event}`);\n * }\n *\n * socket.onAny(catchAllListener);\n *\n * // remove a specific listener\n * socket.offAny(catchAllListener);\n *\n * // or remove all listeners\n * socket.offAny();\n *\n * @param listener\n */\n offAny(listener) {\n if (!this._anyListeners) {\n return this;\n }\n if (listener) {\n const listeners = this._anyListeners;\n for (let i = 0; i < listeners.length; i++) {\n if (listener === listeners[i]) {\n listeners.splice(i, 1);\n return this;\n }\n }\n }\n else {\n this._anyListeners = [];\n }\n return this;\n }\n /**\n * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n * e.g. to remove listeners.\n */\n listenersAny() {\n return this._anyListeners || [];\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback.\n *\n * Note: acknowledgements sent to the server are not included.\n *\n * @example\n * socket.onAnyOutgoing((event, ...args) => {\n * console.log(`sent event ${event}`);\n * });\n *\n * @param listener\n */\n onAnyOutgoing(listener) {\n this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n this._anyOutgoingListeners.push(listener);\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback. The listener is added to the beginning of the listeners array.\n *\n * Note: acknowledgements sent to the server are not included.\n *\n * @example\n * socket.prependAnyOutgoing((event, ...args) => {\n * console.log(`sent event ${event}`);\n * });\n *\n * @param listener\n */\n prependAnyOutgoing(listener) {\n this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n this._anyOutgoingListeners.unshift(listener);\n return this;\n }\n /**\n * Removes the listener that will be fired when any event is emitted.\n *\n * @example\n * const catchAllListener = (event, ...args) => {\n * console.log(`sent event ${event}`);\n * }\n *\n * socket.onAnyOutgoing(catchAllListener);\n *\n * // remove a specific listener\n * socket.offAnyOutgoing(catchAllListener);\n *\n * // or remove all listeners\n * socket.offAnyOutgoing();\n *\n * @param [listener] - the catch-all listener (optional)\n */\n offAnyOutgoing(listener) {\n if (!this._anyOutgoingListeners) {\n return this;\n }\n if (listener) {\n const listeners = this._anyOutgoingListeners;\n for (let i = 0; i < listeners.length; i++) {\n if (listener === listeners[i]) {\n listeners.splice(i, 1);\n return this;\n }\n }\n }\n else {\n this._anyOutgoingListeners = [];\n }\n return this;\n }\n /**\n * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n * e.g. to remove listeners.\n */\n listenersAnyOutgoing() {\n return this._anyOutgoingListeners || [];\n }\n /**\n * Notify the listeners for each packet sent\n *\n * @param packet\n *\n * @private\n */\n notifyOutgoingListeners(packet) {\n if (this._anyOutgoingListeners && this._anyOutgoingListeners.length) {\n const listeners = this._anyOutgoingListeners.slice();\n for (const listener of listeners) {\n listener.apply(this, packet.data);\n }\n }\n }\n}\n","/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\nexport function Backoff(opts) {\n opts = opts || {};\n this.ms = opts.min || 100;\n this.max = opts.max || 10000;\n this.factor = opts.factor || 2;\n this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n this.attempts = 0;\n}\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\nBackoff.prototype.duration = function () {\n var ms = this.ms * Math.pow(this.factor, this.attempts++);\n if (this.jitter) {\n var rand = Math.random();\n var deviation = Math.floor(rand * this.jitter * ms);\n ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation;\n }\n return Math.min(ms, this.max) | 0;\n};\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\nBackoff.prototype.reset = function () {\n this.attempts = 0;\n};\n/**\n * Set the minimum duration\n *\n * @api public\n */\nBackoff.prototype.setMin = function (min) {\n this.ms = min;\n};\n/**\n * Set the maximum duration\n *\n * @api public\n */\nBackoff.prototype.setMax = function (max) {\n this.max = max;\n};\n/**\n * Set the jitter\n *\n * @api public\n */\nBackoff.prototype.setJitter = function (jitter) {\n this.jitter = jitter;\n};\n","import { Socket as Engine, installTimerFunctions, nextTick, } from \"engine.io-client\";\nimport { Socket } from \"./socket.js\";\nimport * as parser from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Backoff } from \"./contrib/backo2.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\nexport class Manager extends Emitter {\n constructor(uri, opts) {\n var _a;\n super();\n this.nsps = {};\n this.subs = [];\n if (uri && \"object\" === typeof uri) {\n opts = uri;\n uri = undefined;\n }\n opts = opts || {};\n opts.path = opts.path || \"/socket.io\";\n this.opts = opts;\n installTimerFunctions(this, opts);\n this.reconnection(opts.reconnection !== false);\n this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n this.reconnectionDelay(opts.reconnectionDelay || 1000);\n this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n this.randomizationFactor((_a = opts.randomizationFactor) !== null && _a !== void 0 ? _a : 0.5);\n this.backoff = new Backoff({\n min: this.reconnectionDelay(),\n max: this.reconnectionDelayMax(),\n jitter: this.randomizationFactor(),\n });\n this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n this._readyState = \"closed\";\n this.uri = uri;\n const _parser = opts.parser || parser;\n this.encoder = new _parser.Encoder();\n this.decoder = new _parser.Decoder();\n this._autoConnect = opts.autoConnect !== false;\n if (this._autoConnect)\n this.open();\n }\n reconnection(v) {\n if (!arguments.length)\n return this._reconnection;\n this._reconnection = !!v;\n if (!v) {\n this.skipReconnect = true;\n }\n return this;\n }\n reconnectionAttempts(v) {\n if (v === undefined)\n return this._reconnectionAttempts;\n this._reconnectionAttempts = v;\n return this;\n }\n reconnectionDelay(v) {\n var _a;\n if (v === undefined)\n return this._reconnectionDelay;\n this._reconnectionDelay = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v);\n return this;\n }\n randomizationFactor(v) {\n var _a;\n if (v === undefined)\n return this._randomizationFactor;\n this._randomizationFactor = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v);\n return this;\n }\n reconnectionDelayMax(v) {\n var _a;\n if (v === undefined)\n return this._reconnectionDelayMax;\n this._reconnectionDelayMax = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v);\n return this;\n }\n timeout(v) {\n if (!arguments.length)\n return this._timeout;\n this._timeout = v;\n return this;\n }\n /**\n * Starts trying to reconnect if reconnection is enabled and we have not\n * started reconnecting yet\n *\n * @private\n */\n maybeReconnectOnOpen() {\n // Only try to reconnect if it's the first time we're connecting\n if (!this._reconnecting &&\n this._reconnection &&\n this.backoff.attempts === 0) {\n // keeps reconnection from firing twice for the same reconnection loop\n this.reconnect();\n }\n }\n /**\n * Sets the current transport `socket`.\n *\n * @param {Function} fn - optional, callback\n * @return self\n * @public\n */\n open(fn) {\n if (~this._readyState.indexOf(\"open\"))\n return this;\n this.engine = new Engine(this.uri, this.opts);\n const socket = this.engine;\n const self = this;\n this._readyState = \"opening\";\n this.skipReconnect = false;\n // emit `open`\n const openSubDestroy = on(socket, \"open\", function () {\n self.onopen();\n fn && fn();\n });\n const onError = (err) => {\n this.cleanup();\n this._readyState = \"closed\";\n this.emitReserved(\"error\", err);\n if (fn) {\n fn(err);\n }\n else {\n // Only do this if there is no fn to handle the error\n this.maybeReconnectOnOpen();\n }\n };\n // emit `error`\n const errorSub = on(socket, \"error\", onError);\n if (false !== this._timeout) {\n const timeout = this._timeout;\n // set timer\n const timer = this.setTimeoutFn(() => {\n openSubDestroy();\n onError(new Error(\"timeout\"));\n socket.close();\n }, timeout);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(() => {\n this.clearTimeoutFn(timer);\n });\n }\n this.subs.push(openSubDestroy);\n this.subs.push(errorSub);\n return this;\n }\n /**\n * Alias for open()\n *\n * @return self\n * @public\n */\n connect(fn) {\n return this.open(fn);\n }\n /**\n * Called upon transport open.\n *\n * @private\n */\n onopen() {\n // clear old subs\n this.cleanup();\n // mark as open\n this._readyState = \"open\";\n this.emitReserved(\"open\");\n // add new subs\n const socket = this.engine;\n this.subs.push(on(socket, \"ping\", this.onping.bind(this)), on(socket, \"data\", this.ondata.bind(this)), on(socket, \"error\", this.onerror.bind(this)), on(socket, \"close\", this.onclose.bind(this)), \n // @ts-ignore\n on(this.decoder, \"decoded\", this.ondecoded.bind(this)));\n }\n /**\n * Called upon a ping.\n *\n * @private\n */\n onping() {\n this.emitReserved(\"ping\");\n }\n /**\n * Called with data.\n *\n * @private\n */\n ondata(data) {\n try {\n this.decoder.add(data);\n }\n catch (e) {\n this.onclose(\"parse error\", e);\n }\n }\n /**\n * Called when parser fully decodes a packet.\n *\n * @private\n */\n ondecoded(packet) {\n // the nextTick call prevents an exception in a user-provided event listener from triggering a disconnection due to a \"parse error\"\n nextTick(() => {\n this.emitReserved(\"packet\", packet);\n }, this.setTimeoutFn);\n }\n /**\n * Called upon socket error.\n *\n * @private\n */\n onerror(err) {\n this.emitReserved(\"error\", err);\n }\n /**\n * Creates a new socket for the given `nsp`.\n *\n * @return {Socket}\n * @public\n */\n socket(nsp, opts) {\n let socket = this.nsps[nsp];\n if (!socket) {\n socket = new Socket(this, nsp, opts);\n this.nsps[nsp] = socket;\n }\n else if (this._autoConnect && !socket.active) {\n socket.connect();\n }\n return socket;\n }\n /**\n * Called upon a socket close.\n *\n * @param socket\n * @private\n */\n _destroy(socket) {\n const nsps = Object.keys(this.nsps);\n for (const nsp of nsps) {\n const socket = this.nsps[nsp];\n if (socket.active) {\n return;\n }\n }\n this._close();\n }\n /**\n * Writes a packet.\n *\n * @param packet\n * @private\n */\n _packet(packet) {\n const encodedPackets = this.encoder.encode(packet);\n for (let i = 0; i < encodedPackets.length; i++) {\n this.engine.write(encodedPackets[i], packet.options);\n }\n }\n /**\n * Clean up transport subscriptions and packet buffer.\n *\n * @private\n */\n cleanup() {\n this.subs.forEach((subDestroy) => subDestroy());\n this.subs.length = 0;\n this.decoder.destroy();\n }\n /**\n * Close the current socket.\n *\n * @private\n */\n _close() {\n this.skipReconnect = true;\n this._reconnecting = false;\n this.onclose(\"forced close\");\n }\n /**\n * Alias for close()\n *\n * @private\n */\n disconnect() {\n return this._close();\n }\n /**\n * Called when:\n *\n * - the low-level engine is closed\n * - the parser encountered a badly formatted packet\n * - all sockets are disconnected\n *\n * @private\n */\n onclose(reason, description) {\n var _a;\n this.cleanup();\n (_a = this.engine) === null || _a === void 0 ? void 0 : _a.close();\n this.backoff.reset();\n this._readyState = \"closed\";\n this.emitReserved(\"close\", reason, description);\n if (this._reconnection && !this.skipReconnect) {\n this.reconnect();\n }\n }\n /**\n * Attempt a reconnection.\n *\n * @private\n */\n reconnect() {\n if (this._reconnecting || this.skipReconnect)\n return this;\n const self = this;\n if (this.backoff.attempts >= this._reconnectionAttempts) {\n this.backoff.reset();\n this.emitReserved(\"reconnect_failed\");\n this._reconnecting = false;\n }\n else {\n const delay = this.backoff.duration();\n this._reconnecting = true;\n const timer = this.setTimeoutFn(() => {\n if (self.skipReconnect)\n return;\n this.emitReserved(\"reconnect_attempt\", self.backoff.attempts);\n // check again for the case socket closed in above events\n if (self.skipReconnect)\n return;\n self.open((err) => {\n if (err) {\n self._reconnecting = false;\n self.reconnect();\n this.emitReserved(\"reconnect_error\", err);\n }\n else {\n self.onreconnect();\n }\n });\n }, delay);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(() => {\n this.clearTimeoutFn(timer);\n });\n }\n }\n /**\n * Called upon successful reconnect.\n *\n * @private\n */\n onreconnect() {\n const attempt = this.backoff.attempts;\n this._reconnecting = false;\n this.backoff.reset();\n this.emitReserved(\"reconnect\", attempt);\n }\n}\n","import { url } from \"./url.js\";\nimport { Manager } from \"./manager.js\";\nimport { Socket } from \"./socket.js\";\n/**\n * Managers cache.\n */\nconst cache = {};\nfunction lookup(uri, opts) {\n if (typeof uri === \"object\") {\n opts = uri;\n uri = undefined;\n }\n opts = opts || {};\n const parsed = url(uri, opts.path || \"/socket.io\");\n const source = parsed.source;\n const id = parsed.id;\n const path = parsed.path;\n const sameNamespace = cache[id] && path in cache[id][\"nsps\"];\n const newConnection = opts.forceNew ||\n opts[\"force new connection\"] ||\n false === opts.multiplex ||\n sameNamespace;\n let io;\n if (newConnection) {\n io = new Manager(source, opts);\n }\n else {\n if (!cache[id]) {\n cache[id] = new Manager(source, opts);\n }\n io = cache[id];\n }\n if (parsed.query && !opts.query) {\n opts.query = parsed.queryKey;\n }\n return io.socket(parsed.path, opts);\n}\n// so that \"lookup\" can be used both as a function (e.g. `io(...)`) and as a\n// namespace (e.g. `io.connect(...)`), for backward compatibility\nObject.assign(lookup, {\n Manager,\n Socket,\n io: lookup,\n connect: lookup,\n});\n/**\n * Protocol version.\n *\n * @public\n */\nexport { protocol } from \"socket.io-parser\";\n/**\n * Expose constructors for standalone build.\n *\n * @public\n */\nexport { Manager, Socket, lookup as io, lookup as connect, lookup as default, };\nexport { Fetch, NodeXHR, XHR, NodeWebSocket, WebSocket, WebTransport, } from \"engine.io-client\";\n","// Realtime client — wraps socket.io-client against the quilt-server socket\n// layer (server/src/realtime/socket.ts). The contract (REALTIME.md):\n//\n// connect auth: { token } — the same opaque bearer token as HTTP;\n// rejected at handshake when invalid\n// join / leave { canvasId } — one room per BASE canvasId\n// presence S→C { users } — full roster on every join/leave\n// cursor:move C↔S { artboardId, x, y } (+ userId from the server) — volatile,\n// artboard-local coords (pin Layer-5 space)\n// cursor:gone C↔S {} → { userId }\n// comment:changed S→C { canvasId, change } — invalidation ping after DB writes\n//\n// Cursors/viewport are ephemeral relays; comments stay HTTP + Postgres. This\n// module is transport only — state lives in useRealtime.\n\nimport { io, type Socket } from 'socket.io-client';\nimport type { PresenceUser, RemoteCursor } from './types';\n\nexport interface RealtimeHandlers {\n onConnected?(connected: boolean): void;\n onPresence?(users: PresenceUser[]): void;\n onCursorMove?(cursor: RemoteCursor): void;\n onCursorGone?(userId: string): void;\n onCommentChanged?(): void;\n}\n\nexport interface RealtimeConnection {\n /** Volatile — frames drop over a backpressured connection instead of queueing. */\n sendCursor(artboardId: string, x: number, y: number): void;\n sendCursorGone(): void;\n close(): void;\n}\n\nexport function connectRealtime(\n url: string,\n token: string,\n canvasId: string,\n handlers: RealtimeHandlers,\n): RealtimeConnection {\n const socket: Socket = io(url, {\n auth: { token },\n // Default transports (polling → websocket upgrade) — survives proxies that\n // block raw websockets while upgrading everywhere else.\n });\n\n socket.on('connect', () => {\n socket.emit('join', { canvasId });\n handlers.onConnected?.(true);\n });\n socket.on('disconnect', () => handlers.onConnected?.(false));\n // Auth rejection at handshake surfaces here; socket.io retries with backoff,\n // which is wrong for a bad token — stop trying until reconnected explicitly.\n socket.on('connect_error', (err) => {\n if (err.message === 'unauthorized') socket.disconnect();\n });\n\n socket.on('presence', (payload: { users?: PresenceUser[] }) => {\n if (Array.isArray(payload?.users)) handlers.onPresence?.(payload.users);\n });\n\n socket.on(\n 'cursor:move',\n (payload: { userId?: string; artboardId?: string; x?: number; y?: number }) => {\n if (\n typeof payload?.userId === 'string' &&\n typeof payload.artboardId === 'string' &&\n typeof payload.x === 'number' &&\n typeof payload.y === 'number'\n ) {\n handlers.onCursorMove?.({\n userId: payload.userId,\n artboardId: payload.artboardId,\n x: payload.x,\n y: payload.y,\n });\n }\n },\n );\n\n socket.on('cursor:gone', (payload: { userId?: string }) => {\n if (typeof payload?.userId === 'string') handlers.onCursorGone?.(payload.userId);\n });\n\n socket.on('comment:changed', () => handlers.onCommentChanged?.());\n\n return {\n sendCursor(artboardId, x, y) {\n if (socket.connected) socket.volatile.emit('cursor:move', { artboardId, x, y });\n },\n sendCursorGone() {\n if (socket.connected) socket.emit('cursor:gone');\n },\n close() {\n socket.emit('leave', { canvasId });\n socket.disconnect();\n },\n };\n}\n","import { useEffect, useRef, useState } from 'react';\nimport { getAncestorScale } from '../DesignCanvas/getAncestorScale';\nimport { connectRealtime, type RealtimeConnection } from './realtimeClient';\nimport type { CommentsClient, PresenceUser, RemoteCursor } from './types';\n\n/**\n * Owns the live socket for one canvas: presence roster, remote cursors, the\n * `comment:changed` → refresh wire, and broadcasting the local pointer.\n *\n * - No-ops cleanly when disabled (mock mode, `presence: false`, no serviceUrl)\n * or signed out (no token → the server would reject the handshake anyway).\n * - Keyed on `meId` so a sign-in/sign-out mid-session reconnects with the\n * fresh token (read lazily from the client at connect time).\n * - Remote cursor POSITIONS live in a ref, not state — they arrive at ~20-30 Hz\n * per user and CursorLayer repositions imperatively each frame (the PinLayer\n * pattern). Only roster changes re-render React.\n */\nexport function useRealtime(opts: {\n client: CommentsClient;\n canvasId: string;\n enabled: boolean;\n /** Broadcast the local pointer (the `presence` config flag). The socket itself\n * stays on regardless — live comments ride it even with cursors off. */\n cursors?: boolean;\n /** Current user id — presence requires a session; changes trigger reconnect. */\n meId: string | null;\n /** Called on every `comment:changed` ping (coalesce/refresh is the caller's job). */\n onCommentChanged: () => void;\n}) {\n const { client, canvasId, enabled, meId, cursors = true } = opts;\n const [connected, setConnected] = useState(false);\n const [peers, setPeers] = useState<PresenceUser[]>([]);\n // userId → live cursor. Mutated in place at relay frequency; read by\n // CursorLayer's rAF loop. The `peers` state change covers mount/unmount.\n const cursorsRef = useRef(new Map<string, RemoteCursor>());\n\n // Keep the changed-callback in a ref so a new closure never tears the socket.\n const onChangedRef = useRef(opts.onCommentChanged);\n onChangedRef.current = opts.onCommentChanged;\n\n const connRef = useRef<RealtimeConnection | null>(null);\n\n useEffect(() => {\n if (!enabled || !meId) return;\n const rt = client.realtimeAuth?.();\n if (!rt || !rt.url || !rt.token) return;\n\n const conn = connectRealtime(rt.url, rt.token, canvasId, {\n onConnected: (c) => {\n setConnected(c);\n if (!c) {\n cursorsRef.current.clear();\n setPeers([]);\n }\n },\n onPresence: (users) => {\n setPeers(users);\n // Prune cursors of users who left (their cursor:gone can race the roster).\n const present = new Set(users.map((u) => u.id));\n for (const id of [...cursorsRef.current.keys()]) {\n if (!present.has(id)) cursorsRef.current.delete(id);\n }\n },\n onCursorMove: (cursor) => {\n cursorsRef.current.set(cursor.userId, cursor);\n },\n onCursorGone: (userId) => {\n cursorsRef.current.delete(userId);\n },\n onCommentChanged: () => onChangedRef.current(),\n });\n connRef.current = conn;\n\n return () => {\n connRef.current = null;\n cursorsRef.current.clear();\n setPeers([]);\n setConnected(false);\n conn.close();\n };\n }, [client, canvasId, enabled, meId]);\n\n // ---------------------------------------------------------------------------\n // Local cursor broadcast — throttled pointermove over artboards, converted to\n // artboard-local coords (the pin Layer-5 space: screen px ÷ canvas scale), so\n // every peer renders it correctly under their own pan/zoom. Off-artboard\n // (canvas background, our UI, the sidebar) → cursor:gone, once.\n // ---------------------------------------------------------------------------\n useEffect(() => {\n if (!connected || !cursors) return;\n let last = 0;\n let wasOnArtboard = false;\n\n const onMove = (e: PointerEvent) => {\n const conn = connRef.current;\n if (!conn) return;\n const now = performance.now();\n if (now - last < 33) return; // ~30 Hz cap\n last = now;\n\n const target = e.target as HTMLElement | null;\n const artboard = target?.closest?.('[data-dc-slot]') as HTMLElement | null;\n const artboardId = artboard?.getAttribute('data-dc-slot');\n if (!artboard || !artboardId) {\n if (wasOnArtboard) {\n wasOnArtboard = false;\n conn.sendCursorGone();\n }\n return;\n }\n wasOnArtboard = true;\n const rect = artboard.getBoundingClientRect();\n const scale = getAncestorScale(artboard) || 1;\n conn.sendCursor(artboardId, (e.clientX - rect.left) / scale, (e.clientY - rect.top) / scale);\n };\n\n const onLeave = () => {\n if (wasOnArtboard) {\n wasOnArtboard = false;\n connRef.current?.sendCursorGone();\n }\n };\n\n document.addEventListener('pointermove', onMove, { passive: true });\n document.documentElement.addEventListener('pointerleave', onLeave);\n return () => {\n document.removeEventListener('pointermove', onMove);\n document.documentElement.removeEventListener('pointerleave', onLeave);\n };\n }, [connected, cursors]);\n\n return { connected, peers, cursorsRef };\n}\n","import { useEffect, useMemo, useRef, type MutableRefObject } from 'react';\nimport { resolveArtboardFrame, screenFromArtboardFrame } from './pinAnchor';\nimport type { PresenceUser, RemoteCursor } from './types';\n\n/**\n * Live multiplayer cursors — one labelled arrow per remote user, glued to the\n * canvas through the same artboard-local → screen mapping as pins (a remote\n * cursor is a \"Layer-5-only pin\", REALTIME.md).\n *\n * React renders a marker per roster user (rare); positions are written straight\n * to each wrapper's transform in a rAF loop reading `cursorsRef` (the ~20-30 Hz\n * relay feed) — no per-frame React work, the PinLayer split. A short CSS\n * transform transition smooths the gaps between relay frames.\n *\n * NOTE: cursors keyed by userId — the same user in two tabs shares one marker\n * (last write wins). Fine in practice; socketId isn't in the relay payload.\n */\nexport function CursorLayer({\n peers,\n cursorsRef,\n}: {\n peers: PresenceUser[];\n cursorsRef: MutableRefObject<Map<string, RemoteCursor>>;\n}) {\n const wrapRefs = useRef(new Map<string, HTMLDivElement>());\n\n // The roster is per-SOCKET: one user in two tabs arrives twice with the same\n // id. Cursors are keyed by userId (one marker per user), so dedupe here.\n const users = useMemo(() => {\n const seen = new Map<string, PresenceUser>();\n for (const p of peers) if (!seen.has(p.id)) seen.set(p.id, p);\n return [...seen.values()];\n }, [peers]);\n\n useEffect(() => {\n let raf = 0;\n const tick = () => {\n // Resolve each artboard's frame (query + rect + canvas-scale walk) at most\n // once per tick; many cursors typically share the same artboard (P2.5).\n // `null` is a real cached value (unmounted/culled) — distinguish it from\n // \"not yet resolved\" via has().\n const frames = new Map<\n string,\n { slotRect: DOMRect; scale: number } | null\n >();\n for (const [userId, wrap] of wrapRefs.current) {\n const cursor = cursorsRef.current.get(userId);\n if (!cursor) {\n wrap.style.opacity = '0';\n continue;\n }\n if (!frames.has(cursor.artboardId)) {\n frames.set(cursor.artboardId, resolveArtboardFrame(cursor.artboardId));\n }\n const frame = frames.get(cursor.artboardId) ?? null;\n if (!frame) {\n wrap.style.opacity = '0';\n continue;\n }\n const pos = screenFromArtboardFrame(frame, cursor.x, cursor.y);\n wrap.style.opacity = '1';\n wrap.style.transform = `translate3d(${pos.x}px, ${pos.y}px, 0)`;\n }\n raf = requestAnimationFrame(tick);\n };\n raf = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(raf);\n }, [cursorsRef]);\n\n return (\n <>\n {users.map((peer) => (\n <div\n key={peer.id}\n ref={(el) => {\n if (el) wrapRefs.current.set(peer.id, el);\n else wrapRefs.current.delete(peer.id);\n }}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n opacity: 0, // shown by the loop once positioned\n pointerEvents: 'none',\n zIndex: 1900, // above pins (1500), below the sidebar/ModeBar (2000+)\n transition: 'transform 80ms linear, opacity 120ms ease',\n willChange: 'transform',\n }}\n >\n {/* Arrow — tip at the cursor coordinate (top-left of the wrapper). */}\n <svg width=\"16\" height=\"18\" viewBox=\"0 0 16 18\" style={{ display: 'block' }}>\n <path\n d=\"M1 1 L1 14.5 L4.8 11.2 L7.4 16.6 L9.8 15.4 L7.2 10.2 L12.4 9.8 Z\"\n fill={peer.color}\n stroke=\"#fff\"\n strokeWidth=\"1.2\"\n />\n </svg>\n <div\n style={{\n marginLeft: 10,\n marginTop: 2,\n padding: '2px 7px',\n borderRadius: 10,\n background: peer.color,\n color: '#fff',\n fontSize: 11,\n fontWeight: 600,\n lineHeight: '14px',\n whiteSpace: 'nowrap',\n boxShadow: '0 1px 3px rgba(0,0,0,0.25)',\n width: 'fit-content',\n }}\n >\n {peer.displayName}\n </div>\n </div>\n ))}\n </>\n );\n}\n","import { useId } from 'react';\n\n/**\n * Carbon Canvas logo mark (placeholder-quality, but real SVG so it scales).\n *\n * The concept: two minimalist artboards side by side — the product is a canvas\n * of artboards — each holding a \"C\", so the mark reads \"CC\". The artboard frames\n * are a faint light stroke; the letterforms use the cool-grey metallic gradient\n * that is the app's highlight accent. `grid` adds a faint dot field behind the\n * artboards (the canvas), for larger standalone placements.\n *\n * Colors are self-contained and tuned for a DARK surface (the toolbar-style\n * pill / carbon dashboard). Everything is `currentColor`-independent so it looks\n * identical wherever it's dropped.\n */\nexport function BrandMark({ size = 24, grid = false, title = 'Carbon Canvas' }: { size?: number; grid?: boolean; title?: string }) {\n const raw = useId();\n const uid = raw.replace(/[:]/g, '');\n const gradId = `cc-grad-${uid}`;\n const dotId = `cc-dots-${uid}`;\n\n return (\n <svg width={size} height={size} viewBox=\"0 0 40 40\" fill=\"none\" role=\"img\" aria-label={title}>\n <title>{title}</title>\n <defs>\n <linearGradient id={gradId} x1=\"4\" y1=\"6\" x2=\"36\" y2=\"34\" gradientUnits=\"userSpaceOnUse\">\n <stop offset=\"0\" stopColor=\"#cbd2de\" />\n <stop offset=\"1\" stopColor=\"#868fa0\" />\n </linearGradient>\n {grid && (\n <pattern id={dotId} width=\"5.2\" height=\"5.2\" patternUnits=\"userSpaceOnUse\">\n <circle cx=\"0.9\" cy=\"0.9\" r=\"0.7\" fill=\"rgba(255,255,255,0.12)\" />\n </pattern>\n )}\n </defs>\n\n {grid && <rect x=\"1\" y=\"1\" width=\"38\" height=\"38\" rx=\"8\" fill={`url(#${dotId})`} />}\n\n {/* two artboards */}\n <rect x=\"3.5\" y=\"9.5\" width=\"15\" height=\"21\" rx=\"3\" stroke=\"rgba(255,255,255,0.30)\" strokeWidth=\"1.4\" />\n <rect x=\"21.5\" y=\"9.5\" width=\"15\" height=\"21\" rx=\"3\" stroke=\"rgba(255,255,255,0.30)\" strokeWidth=\"1.4\" />\n\n {/* a \"C\" centered in each artboard */}\n <path d=\"M14.2 16.2 A5 5 0 1 0 14.2 23.8\" stroke={`url(#${gradId})`} strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n <path d=\"M32.2 16.2 A5 5 0 1 0 32.2 23.8\" stroke={`url(#${gradId})`} strokeWidth=\"2.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n","import { useMemo } from 'react';\nimport { FONT } from './ui';\nimport { BRAND_NAME } from '../brand';\nimport { BrandMark } from '../BrandMark';\nimport type { PresenceUser } from './types';\n\nconst PANEL_BG = '#18191b';\nconst PANEL_BORDER = 'rgba(255,255,255,0.12)';\n\n/**\n * Top-left brand lockup + presence avatar stack, wrapped in a toolbar-style\n * pill (same bg/border as the ModeBar). The \"CC\" monogram is a placeholder for\n * the real logo. Avatars are deduped by userId (the roster is per-socket, so\n * one user in two tabs appears twice on the wire) and rimmed in the user's\n * stable cursor color so faces and cursors match. Clear of the ModeBar\n * (bottom) and the comments sidebar (right).\n */\nexport function Facepile({ peers, meId }: { peers: PresenceUser[]; meId: string | null }) {\n const users = useMemo(() => {\n const seen = new Map<string, PresenceUser>();\n for (const p of peers) if (!seen.has(p.id)) seen.set(p.id, p);\n // Self first, then by name — a stable order that doesn't shuffle on joins.\n return [...seen.values()].sort((a, b) =>\n a.id === meId ? -1 : b.id === meId ? 1 : a.displayName.localeCompare(b.displayName),\n );\n }, [peers, meId]);\n\n return (\n <div\n data-cl-ui\n style={{\n position: 'fixed',\n top: 12,\n left: 12,\n display: 'flex',\n alignItems: 'center',\n gap: 9,\n padding: '4px 12px 4px 4px',\n background: PANEL_BG,\n border: `1px solid ${PANEL_BORDER}`,\n borderRadius: 999,\n boxShadow: '0 6px 22px rgba(0,0,0,0.32)',\n zIndex: 2001,\n fontFamily: FONT,\n }}\n >\n {/* Brand lockup — two-artboards \"CC\" mark. */}\n <BrandMark size={28} />\n <span style={{ fontSize: 12.5, fontWeight: 600, color: 'rgba(245,247,250,0.92)', letterSpacing: 0.2, whiteSpace: 'nowrap' }}>\n {BRAND_NAME}\n </span>\n\n {users.length > 0 && (\n <>\n <div style={{ width: 1, alignSelf: 'stretch', margin: '2px 1px', background: PANEL_BORDER }} />\n <div style={{ display: 'flex', alignItems: 'center' }}>\n {users.slice(0, 8).map((u, i) => (\n <div\n key={u.id}\n title={u.id === meId ? `${u.displayName} (you)` : u.displayName}\n style={{\n width: 26,\n height: 26,\n borderRadius: '50%',\n marginLeft: i === 0 ? 0 : -8,\n border: `2px solid ${u.color}`,\n boxShadow: `0 0 0 2px ${PANEL_BG}, 0 1px 3px rgba(0,0,0,0.3)`,\n background: u.avatarUrl ? `center / cover url(${JSON.stringify(u.avatarUrl)})` : '#e9eaed',\n color: u.color,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 12,\n fontWeight: 700,\n zIndex: users.length - i, // leftmost on top of the overlap\n }}\n >\n {!u.avatarUrl && initials(u.displayName)}\n </div>\n ))}\n {users.length > 8 && (\n <div style={{ marginLeft: 6, fontSize: 12, fontWeight: 600, color: 'rgba(245,247,250,0.6)' }}>\n +{users.length - 8}\n </div>\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n\nfunction initials(name: string): string {\n const parts = name.trim().split(/\\s+/);\n const a = parts[0]?.[0] ?? '';\n const b = parts.length > 1 ? parts[parts.length - 1]?.[0] ?? '' : '';\n return (a + b).toUpperCase() || '?';\n}\n","import { useEffect, useRef, useState, type FormEvent } from 'react';\nimport { cardStyle, ghostBtn, primaryBtn, textareaStyle, FONT } from './ui';\n\n/**\n * Accountless sign-in (Wave 3b) — the name + optional-email prompt, replacing\n * the network client's bare `window.prompt` fallback. No password, no\n * verification: the identity is whatever the reviewer types (the whole point —\n * a review link must cost nothing to act on). Email is only a notification\n * address and is never shown to other users.\n */\nexport function SignInDialog({\n busy,\n error,\n onSubmit,\n onCancel,\n}: {\n busy: boolean;\n error: string | null;\n onSubmit: (input: { name: string; email?: string }) => void;\n onCancel: () => void;\n}) {\n const [name, setName] = useState('');\n const [email, setEmail] = useState('');\n const nameRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => nameRef.current?.focus(), []);\n\n const submit = (e: FormEvent) => {\n e.preventDefault();\n const n = name.trim();\n if (!n || busy) return;\n const m = email.trim();\n onSubmit(m ? { name: n, email: m } : { name: n });\n };\n\n const inputStyle = { ...textareaStyle, minHeight: 0, resize: 'none' as const, height: 34 };\n\n return (\n <div\n data-cl-ui\n onClick={onCancel}\n style={{\n position: 'fixed',\n inset: 0,\n zIndex: 2400, // above everything, including open pin popovers (2200)\n background: 'rgba(0,0,0,0.35)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: FONT,\n }}\n >\n <form\n onClick={(e) => e.stopPropagation()}\n onSubmit={submit}\n style={{ ...cardStyle, width: 320, padding: 20, boxSizing: 'border-box' }}\n >\n <div style={{ fontSize: 15, fontWeight: 700, marginBottom: 4 }}>\n Join the review\n </div>\n <div style={{ color: '#6b6b76', marginBottom: 14, lineHeight: 1.45 }}>\n Add your name so people know who's commenting. No account needed.\n </div>\n\n <label style={{ display: 'block', fontWeight: 600, marginBottom: 4 }}>Name</label>\n <input\n ref={nameRef}\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Your name\"\n disabled={busy}\n style={{ ...inputStyle, marginBottom: 12 }}\n />\n\n <label style={{ display: 'block', fontWeight: 600, marginBottom: 4 }}>\n Email <span style={{ fontWeight: 400, color: '#6b6b76' }}>(optional — for reply notifications)</span>\n </label>\n <input\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n placeholder=\"you@example.com\"\n type=\"email\"\n disabled={busy}\n style={{ ...inputStyle, marginBottom: error ? 8 : 16 }}\n />\n\n {error && (\n <div style={{ color: '#C8203A', marginBottom: 12, fontSize: 12 }}>{error}</div>\n )}\n\n <div style={{ display: 'flex', justifyContent: 'flex-end', gap: 8 }}>\n <button type=\"button\" style={ghostBtn} onClick={onCancel} disabled={busy}>\n Cancel\n </button>\n <button type=\"submit\" style={{ ...primaryBtn, opacity: !name.trim() || busy ? 0.6 : 1 }} disabled={!name.trim() || busy}>\n {busy ? 'Joining…' : 'Continue'}\n </button>\n </div>\n </form>\n </div>\n );\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { getPortalRoot } from '../DesignCanvas/portalRoot';\nimport { Composer } from './Composer';\nimport { CommentsSidebar } from './CommentsSidebar';\nimport { PinLayer, type PinView } from './PinLayer';\nimport { Thread } from './Thread';\nimport { panToThread } from './pan';\nimport { capturePinAnchor } from './pinAnchor';\nimport { createMockCommentsClient } from './mockClient';\nimport { CommentsApiError, createNetworkCommentsClient, isLiveCommentsHost } from './networkClient';\nimport { useComments } from './useComments';\nimport { useRealtime } from './useRealtime';\nimport { CursorLayer } from './CursorLayer';\nimport { Facepile } from './Facepile';\nimport { SignInDialog } from './SignInDialog';\nimport { FONT } from './ui';\nimport { isThreadUnread } from './types';\nimport type { CommentsConfig, PinTarget } from './types';\nimport type { CanvasMode } from '../DesignCanvas/ModeBar';\n\n// CommentsRuntime — the heavy, ENTITLED comments engine (Workstream B).\n//\n// This module statically imports the comments network client, the realtime layer\n// (useRealtime → realtimeClient → socket.io-client), the mock store, and all the\n// thread/pin/sidebar UI. It is loaded ONLY via the lazy `import()` in\n// CommentLayer.tsx, gated by the lock-state machine — so a free install that\n// never unlocks comments ships ZERO of these bytes in its main entry (they land\n// in a separate dynamically-imported chunk; see vite.lib.config / dist-lib).\n//\n// The lock decision is made by the shell (CommentLayer). This component assumes\n// it's allowed to run, but still treats the BACKEND as the source of truth: a\n// 402 returned at write time (the live gate) is surfaced via `onPaymentRequired`\n// so the shell can flip to the inactive/upgrade upsell.\n\n// Custom comment-dropper cursor: a small white speech bubble, tail pointing\n// down-left. Layered strokes give it a thin dark outline with a 2px white\n// border outside that (so it reads on any background) — the wide white stroke\n// is drawn first, the thin dark stroke on top. The hotspot sits at the tail\n// tip so the comment drops where the point lands. Falls back to crosshair if\n// SVG cursors are unsupported.\nconst COMMENT_BUBBLE_PATH =\n 'M5 3 H17 A2 2 0 0 1 19 5 V13 A2 2 0 0 1 17 15 H9 L5 18 V15 A2 2 0 0 1 3 13 V5 A2 2 0 0 1 5 3 Z';\nconst COMMENT_CURSOR_SVG =\n `<svg xmlns='http://www.w3.org/2000/svg' width='22' height='22' viewBox='0 0 22 22'>` +\n `<path d='${COMMENT_BUBBLE_PATH}' fill='#ffffff' stroke='#ffffff' stroke-width='5' stroke-linejoin='round'/>` +\n `<path d='${COMMENT_BUBBLE_PATH}' fill='none' stroke='#444444' stroke-width='1' stroke-linejoin='round'/>` +\n `</svg>`;\nconst COMMENT_CURSOR = `url(\"data:image/svg+xml,${encodeURIComponent(COMMENT_CURSOR_SVG)}\") 4 19, crosshair`;\n\n/** Human-readable message for a non-402 write failure (P2.1). */\nfunction friendlyWriteError(err: unknown): string {\n if (err instanceof CommentsApiError) {\n if (err.status === 401) return 'Your session expired — sign in again to continue.';\n if (err.status === 403) return 'You don’t have permission to do that here.';\n if (err.status === 429) return 'You’re doing that too quickly — try again in a moment.';\n return err.message || 'Something went wrong. Please try again.';\n }\n return 'Couldn’t reach the comments service — check your connection and try again.';\n}\n\n/**\n * The live comment overlay for a DesignCanvas. Active while the shared canvas\n * mode is 'comment' (driven by the bottom-left ModeBar). Drop pins on artboard\n * elements → read/reply/resolve in the right-hand comments sidebar.\n *\n * `devMode` swaps the in-memory mock store for the hosted comments-service\n * (pluggable auth, bearer-token sign-in). The mock gives a full, testable UX\n * with no network/sign-in; the network client is the production path.\n */\nexport default function CommentsRuntime({\n config,\n mode,\n setMode,\n activePageId = null,\n pages,\n onSwitchPage,\n onUnreadChange,\n onPaymentRequired,\n onAuthChanged,\n}: {\n config: CommentsConfig;\n mode: CanvasMode;\n setMode: (m: CanvasMode) => void;\n /** Active DCPage id (null = unpaged canvas). Pins render only for this page. */\n activePageId?: string | null;\n /** All pages, for the sidebar's cross-page location labels + jumps. */\n pages?: { id: string; title: string }[];\n /** Switch the canvas to another page (used when a sidebar row is off-page). */\n onSwitchPage?: (id: string) => void;\n /** Reports the count of unread (unresolved) threads up to the ModeBar so the\n * Comment tab can show an unread dot when you're in another mode. */\n onUnreadChange?: (count: number) => void;\n /** A write hit the live 402 gate — the shell flips to the upgrade upsell. */\n onPaymentRequired?: () => void;\n /** Sign-in / sign-out happened — the shell re-checks entitlement. */\n onAuthChanged?: () => void;\n}) {\n // The connection \"secrets\" (auth / directory / host-patterns / provisionHint)\n // are latched at MOUNT (P2.5). They're commonly fresh object/function\n // identities on each render (inline props), so keying the client memo on them\n // recreated the whole client — dropping the session and re-fetching — on every\n // parent render. The client is now rebuilt only when a PRIMITIVE identity of\n // the connection changes (canvasId / serviceUrl / devMode). Documented\n // trade-off: swapping the auth or directory provider on a live canvas needs a\n // remount (they don't change in practice for a given canvas).\n const latched = useRef({\n auth: config.auth,\n directory: config.directory,\n unstableHostPatterns: config.unstableHostPatterns,\n provisionHint: config.provisionHint,\n });\n const client = useMemo(\n () =>\n config.devMode\n ? createMockCommentsClient(config.canvasId)\n : createNetworkCommentsClient(config.canvasId, config.serviceUrl, {\n auth: latched.current.auth,\n directory: latched.current.directory,\n unstableHostPatterns: latched.current.unstableHostPatterns,\n provisionHint: latched.current.provisionHint,\n }),\n [config.canvasId, config.devMode, config.serviceUrl],\n );\n\n // Write-error handling (P2.1). A 402 (the live entitlement gate) bubbles to the\n // shell, which flips to the upgrade upsell. EVERY OTHER failure (network drop,\n // 500, expired session, rate limit) is surfaced as a transient banner — it must\n // NOT re-throw into a voided .catch, which is what silently dropped a reviewer's\n // reply/resolve/delete. `handleWriteError` is terminal: it never throws, so a\n // caller's follow-up (closing a thread, etc.) should run only on SUCCESS.\n const guard = useRef(onPaymentRequired);\n guard.current = onPaymentRequired;\n const [writeError, setWriteError] = useState<string | null>(null);\n const [composerError, setComposerError] = useState<string | null>(null);\n function handleWriteError(err: unknown): void {\n if (err instanceof CommentsApiError && err.status === 402) {\n guard.current?.();\n return;\n }\n setWriteError(friendlyWriteError(err));\n }\n // Auto-dismiss the banner so a one-off failure doesn't linger after a later\n // action succeeds.\n useEffect(() => {\n if (!writeError) return;\n const t = setTimeout(() => setWriteError(null), 6000);\n return () => clearTimeout(t);\n }, [writeError]);\n\n // While the socket is connected, `comment:changed` is the freshness signal —\n // the poll backs off to a reconnect-gap fallback (REALTIME.md).\n const [rtConnected, setRtConnected] = useState(false);\n const {\n threads, reads, me, ready,\n signIn, signInWith, signOut,\n create, reply, resolve, unresolve, reattach, remove, markRead, markUnread, refresh,\n } = useComments(client, { pollMs: rtConnected ? 25000 : 3000 });\n\n // Posting is gated to real, published deployments — dev/preview/localhost are\n // READ-ONLY so iterating on a prototype doesn't scatter throwaway comments onto\n // a canvas. The mock store (devMode) stays writable (it's a self-contained\n // sandbox), and an explicit `?comments-write` URL opt-in re-enables posting on a\n // dev host when you genuinely want to test the flow there. Host classification\n // is the same robust signal resolveCanvasId trusts — nothing hardcoded per canvas.\n const writeAllowedHere = useMemo(() => {\n if (config.devMode) return true; // mock sandbox — always writable\n if (isLiveCommentsHost(config.unstableHostPatterns)) return true; // real public domain\n try {\n return new URLSearchParams(window.location.search).has('comments-write'); // dev opt-in\n } catch {\n return false;\n }\n }, [config.devMode, config.unstableHostPatterns]);\n\n // Mock users always have write access; on the network the panel must show a\n // sign-in prompt when signed-out or read-only. Hide it until the first /me\n // resolves so it doesn't flash before sign-in state is known. Suppressed on\n // read-only preview hosts — signing in there still wouldn't let you post.\n const needsAuth = !config.devMode && ready && !me?.canWrite && writeAllowedHere;\n // True only when posting is blocked *because* this is a dev/preview host (vs an\n // auth/permission gap) — drives the sidebar's read-only note.\n const previewReadOnly = !config.devMode && !writeAllowedHere;\n\n // Realtime: live comments always ride the socket; cursors + facepile are the\n // `presence` flag (default on). The mock never connects.\n const presenceOn = config.presence !== false;\n const realtime = useRealtime({\n client,\n canvasId: config.canvasId,\n enabled: !config.devMode,\n cursors: presenceOn,\n meId: me?.id ?? null,\n onCommentChanged: () => void refresh().catch(() => {}),\n });\n useEffect(() => setRtConnected(realtime.connected), [realtime.connected]);\n\n // Accountless sign-in dialog (Wave 3b) — used when the client supports\n // signInWith; otherwise fall back to the client's own signIn flow.\n const [signInOpen, setSignInOpen] = useState(false);\n const [signInBusy, setSignInBusy] = useState(false);\n const [signInError, setSignInError] = useState<string | null>(null);\n const startSignIn = () => {\n if (client.signInWith) {\n setSignInError(null);\n setSignInOpen(true);\n } else {\n void signIn().then(() => onAuthChanged?.());\n }\n };\n const submitSignIn = async (input: { name: string; email?: string }) => {\n setSignInBusy(true);\n setSignInError(null);\n try {\n const m = await signInWith(input);\n if (m) {\n setSignInOpen(false);\n onAuthChanged?.(); // re-resolve the owner's entitlement now we have a token\n } else setSignInError('Sign-in failed. Try again.');\n } catch (err) {\n setSignInError(err instanceof Error ? err.message : 'Sign-in failed. Try again.');\n } finally {\n setSignInBusy(false);\n }\n };\n\n const enabled = mode === 'comment';\n const [showResolved, setShowResolved] = useState(false);\n const [draft, setDraft] = useState<PinTarget | null>(null);\n const [openId, setOpenId] = useState<string | null>(null);\n const [busy, setBusy] = useState(false);\n // Orphan re-attach (P2.11): the root-comment id whose pin we're re-pointing, or\n // null. While set, normal comment-drop is suspended and the next artboard click\n // re-anchors this thread instead of creating a new one. Only ONE at a time.\n const [reattachId, setReattachId] = useState<string | null>(null);\n\n const canWrite = !!me?.canWrite && writeAllowedHere;\n\n // Unread (unresolved) thread count, mirroring the sidebar's \"N new\" rule.\n // Surfaced to the ModeBar so the Comment tab can flag unread comments while\n // you're in cursor/dev mode.\n const unreadCount = useMemo(\n () => threads.filter((t) => !t.root.resolvedAt && isThreadUnread(t, me, reads)).length,\n [threads, me, reads],\n );\n useEffect(() => { onUnreadChange?.(unreadCount); }, [unreadCount, onUnreadChange]);\n\n const closeAll = () => {\n setDraft(null);\n setOpenId(null);\n setReattachId(null);\n };\n\n // Enter re-attach mode for an orphaned thread (P2.11). Suspends any open draft\n // (only one picking interaction at a time); the picking effect below takes over.\n const startReattach = (id: string) => {\n setDraft(null);\n setOpenId(null);\n setComposerError(null);\n setReattachId(id);\n };\n\n // Persist a re-attach: run capturePinAnchor's target through the client, then\n // land back at the new pin. Failure → the P2.1 terminal-error banner (never a\n // silent drop); we leave re-attach mode either way so the reviewer isn't stuck.\n async function commitReattach(id: string, target: PinTarget) {\n setBusy(true);\n try {\n const updated = await reattach(id, target);\n setReattachId(null);\n setOpenId(updated.id); // reveal the thread at its re-resolved position\n } catch (err) {\n setReattachId(null);\n handleWriteError(err);\n } finally {\n setBusy(false);\n }\n }\n\n // Click-to-drop while Comment mode is on. Suspended during a re-attach (the\n // re-attach picker owns the click then, so a pick can't also spawn a new pin).\n useEffect(() => {\n if (!enabled || reattachId) return;\n const onClick = (e: MouseEvent) => {\n const t = e.target as HTMLElement | null;\n if (!t) return;\n if (t.closest('[data-cl-ui]') || t.closest('[data-inspector-ui]')) return; // our own UI\n // Only the artboard frame itself (.dc-card) accepts drops. The artboard\n // title / focus / share chrome are siblings of the card inside the slot,\n // so gating on the slot let pins land on the title — gate on the card.\n const inFrame = t.closest('.dc-card');\n if (!inFrame) {\n if (!t.closest('[data-dc-slot]')) closeAll(); // empty canvas — dismiss; chrome → leave its own handler\n return;\n }\n if (!canWrite) return;\n e.preventDefault();\n e.stopPropagation();\n const target = capturePinAnchor(t, e.clientX, e.clientY);\n if (!target) return;\n setDraft(target);\n setOpenId('draft');\n };\n document.addEventListener('click', onClick, true);\n return () => document.removeEventListener('click', onClick, true);\n }, [enabled, canWrite, reattachId]);\n\n // Re-attach picking (P2.11): while re-attaching, the next click on an artboard\n // element captures a fresh anchor (same path a new comment uses — artboard-frame\n // /slot handling, frame descent) and re-points the thread's root. Mirrors the\n // drop handler but calls commitReattach instead of opening a draft. A click off\n // any artboard is ignored (stay in the mode); Esc cancels (below).\n useEffect(() => {\n if (!enabled || !reattachId) return;\n const onClick = (e: MouseEvent) => {\n const t = e.target as HTMLElement | null;\n if (!t) return;\n if (t.closest('[data-cl-ui]') || t.closest('[data-inspector-ui]')) return; // our own UI\n const inFrame = t.closest('.dc-card');\n if (!inFrame) return; // off-artboard click — keep waiting for a valid pick\n e.preventDefault();\n e.stopPropagation();\n const target = capturePinAnchor(t, e.clientX, e.clientY);\n if (!target) return; // not inside an artboard → nothing to anchor to\n void commitReattach(reattachId, target);\n };\n document.addEventListener('click', onClick, true);\n return () => document.removeEventListener('click', onClick, true);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [enabled, reattachId]);\n\n // Single-element hover highlight while re-attaching, so it's obvious WHICH\n // element the click will pin to (paired with the dropper cursor). Toggles a data\n // attribute on the hovered element (a <style> rule paints the outline) — no\n // inline-style mutation of the customer's DOM, trivially reversible on teardown.\n useEffect(() => {\n if (!enabled || !reattachId) return;\n let hovered: Element | null = null;\n const clear = () => {\n hovered?.removeAttribute('data-cl-reattach-hover');\n hovered = null;\n };\n const onMove = (e: PointerEvent) => {\n const t = e.target as HTMLElement | null;\n const el =\n t && !t.closest('[data-cl-ui]') && !t.closest('[data-inspector-ui]') && t.closest('.dc-card')\n ? t\n : null;\n if (el === hovered) return;\n clear();\n if (el) {\n el.setAttribute('data-cl-reattach-hover', '');\n hovered = el;\n }\n };\n document.addEventListener('pointermove', onMove, true);\n return () => {\n document.removeEventListener('pointermove', onMove, true);\n clear();\n };\n }, [enabled, reattachId]);\n\n // Leaving comment mode tears down any draft/open thread + re-attach.\n useEffect(() => {\n if (!enabled) closeAll();\n }, [enabled]);\n\n // Esc cancels re-attach first, then a draft / open thread; exits the mode otherwise.\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n if (reattachId) setReattachId(null);\n else if (draft || openId) closeAll();\n else if (enabled) setMode('cursor');\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [draft, openId, enabled, reattachId]);\n\n // Build the pin list. Pins render ONLY for the active page (other pages'\n // artboards are unmounted), but the numbering is GLOBAL across all visible\n // threads so a pin's number matches its sidebar row exactly (the sidebar lists\n // every page) — a page can legitimately show pins #2, #5, #7.\n const pins: PinView[] = useMemo(() => {\n const list: PinView[] = [];\n let globalIndex = 0;\n for (const t of threads) {\n const resolved = !!t.root.resolvedAt;\n if (resolved && !showResolved) continue;\n globalIndex++; // counts all visible threads, matching the sidebar's order\n if (t.root.pageId !== activePageId) continue; // pin lives on its own page only\n list.push({\n id: t.root.id,\n artboardId: t.root.artboardId,\n anchor: t.root.anchor,\n kind: resolved ? 'resolved' : 'unresolved',\n index: globalIndex,\n });\n }\n if (draft) {\n list.push({ id: 'draft', artboardId: draft.artboardId, anchor: draft, kind: 'draft' });\n }\n return list;\n }, [threads, showResolved, draft, activePageId]);\n\n // Opening a thread (from a pin or the sidebar) marks it read for this user.\n // markRead is idempotent + bumps the timestamp, so reopening after new replies\n // re-reads correctly. Kept in a ref so the effect only depends on openId.\n const markReadRef = useRef(markRead);\n markReadRef.current = markRead;\n useEffect(() => {\n if (!openId || openId === 'draft') return;\n void markReadRef.current(openId);\n }, [openId]);\n\n // Deeplink from a bot notification: `?pin=<commentId>`. On arrival, switch into\n // comment mode immediately; then, once the list has loaded, open the thread and\n // pan to its pin (switching to its page first if needed). Reveals it even if\n // resolved. Resolves once — a missing id just keeps checking on the next poll\n // (the target may land a beat later), which is harmless.\n useEffect(() => {\n if (typeof window === 'undefined') return;\n if (new URLSearchParams(window.location.search).has('pin')) setMode('comment');\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const deeplinkDone = useRef(false);\n useEffect(() => {\n if (deeplinkDone.current || !ready || typeof window === 'undefined') return;\n const pin = new URLSearchParams(window.location.search).get('pin');\n if (!pin) {\n deeplinkDone.current = true;\n return;\n }\n const t = threads.find((x) => x.root.id === pin);\n if (!t) return; // not loaded yet (or resolved/deleted) — recheck on the next poll\n deeplinkDone.current = true;\n if (t.root.resolvedAt) setShowResolved(true); // a resolved target is hidden by default\n setOpenId(pin);\n panToThread(t, { paged: !!pages, activePageId, onSwitchPage });\n }, [ready, threads, activePageId, pages, onSwitchPage]);\n\n async function submitDraft(body: string) {\n if (!draft) return;\n const { artboardId, selector, relX, relY, artboardX, artboardY, anchorText, elementTag, dataName } =\n draft;\n setBusy(true);\n setComposerError(null);\n try {\n // Live-first (2026-06-14): no comment-time snapshot. Comments survive\n // iterations by re-pinning via the 5-layer anchor, not by a frozen image;\n // `previewImage: null` is the supported shape (contract keeps the field).\n const created = await create({\n canvasId: config.canvasId,\n pageId: activePageId,\n artboardId,\n body,\n anchor: { selector, relX, relY, artboardX, artboardY, anchorText, elementTag, dataName },\n previewImage: null,\n });\n setDraft(null);\n setOpenId(created.id);\n } catch (err) {\n // A 402 is the live gate — flip to the upsell. Any other failure KEEPS the\n // draft open with an inline composer error so the reviewer can retry without\n // losing what they typed (P2.1 — never silently drop the comment).\n if (err instanceof CommentsApiError && err.status === 402) handleWriteError(err);\n else setComposerError(friendlyWriteError(err));\n } finally {\n setBusy(false);\n }\n }\n\n // On-canvas popover at the pin: the composer for a fresh draft, the full\n // thread for a saved comment (Figma-style — the rail is the index, the\n // popover at the drop spot is where you read & reply).\n const renderPopover = (pin: PinView, lost: boolean) => {\n if (pin.id === 'draft') {\n return (\n <Composer\n busy={busy}\n error={composerError}\n searchDirectory={(q) => client.searchDirectory(q)}\n onSubmit={submitDraft}\n onCancel={() => {\n setComposerError(null);\n closeAll();\n }}\n />\n );\n }\n const thread = threads.find((t) => t.root.id === pin.id);\n if (!thread) return null;\n return (\n <Thread\n thread={thread}\n me={me}\n canWrite={canWrite}\n lost={lost}\n busy={busy}\n searchDirectory={(q) => client.searchDirectory(q)}\n onReply={(body) => void reply(pin.id, body).catch(handleWriteError)}\n onResolve={async () => {\n try {\n await resolve(pin.id);\n if (!showResolved) setOpenId(null);\n } catch (err) {\n handleWriteError(err);\n }\n }}\n onUnresolve={() => void unresolve(pin.id).catch(handleWriteError)}\n onDelete={async (id) => {\n try {\n await remove(id);\n if (id === pin.id) setOpenId(null);\n } catch (err) {\n handleWriteError(err);\n }\n }}\n onClose={() => setOpenId(null)}\n />\n );\n };\n\n return createPortal(\n <div data-cl-ui style={{ fontFamily: FONT }}>\n {/* Multiplayer overlay — live cursors + who's-here, in EVERY canvas mode\n (presence isn't a comment-mode feature; you see collaborators while\n browsing the prototypes too). */}\n {presenceOn && realtime.connected && (\n <>\n <CursorLayer peers={realtime.peers} cursorsRef={realtime.cursorsRef} />\n <Facepile peers={realtime.peers} meId={me?.id ?? null} />\n </>\n )}\n\n {/* Transient write-failure banner (P2.1) — a non-402 reply/resolve/delete\n failure surfaces here instead of being silently dropped. Sits top-center\n above the sidebar; auto-dismisses. */}\n {writeError && (\n <div\n role=\"alert\"\n data-cl-ui\n style={{\n position: 'fixed',\n top: 16,\n right: 372,\n zIndex: 2147483647,\n maxWidth: 340,\n padding: '10px 14px',\n borderRadius: 8,\n background: '#3a1f22',\n border: '1px solid #7f2b31',\n color: '#f4d7d9',\n fontSize: 13,\n lineHeight: 1.4,\n boxShadow: '0 6px 24px rgba(0,0,0,0.4)',\n display: 'flex',\n gap: 10,\n alignItems: 'flex-start',\n }}\n >\n <span style={{ flex: 1 }}>{writeError}</span>\n <button\n type=\"button\"\n onClick={() => setWriteError(null)}\n aria-label=\"Dismiss\"\n style={{\n background: 'none',\n border: 'none',\n color: '#f4d7d9',\n cursor: 'pointer',\n fontSize: 15,\n lineHeight: 1,\n padding: 0,\n }}\n >\n ×\n </button>\n </div>\n )}\n\n {/* Accountless sign-in (name + optional email). */}\n {signInOpen && (\n <SignInDialog\n busy={signInBusy}\n error={signInError}\n onSubmit={(input) => void submitSignIn(input)}\n onCancel={() => setSignInOpen(false)}\n />\n )}\n\n {/* Comment-dropper cursor while dropping. No hover highlight — the cursor\n signals intent and the pin lands on the click target directly, so the\n inspect-style outline/tint just adds noise for comment dropping. */}\n {enabled && canWrite && (\n <style>{`[data-dc-slot] * { cursor: ${COMMENT_CURSOR} !important; }`}</style>\n )}\n\n {/* Re-attach picking (P2.11): keep the dropper cursor + paint a single-\n element outline on whatever the pointer is over, so the pick target is\n unambiguous. Amber to match the orphan panel's \"lost\" accent. */}\n {enabled && reattachId && (\n <style>{`\n [data-dc-slot] * { cursor: ${COMMENT_CURSOR} !important; }\n [data-cl-reattach-hover] { outline: 2px solid #C8841C !important; outline-offset: -1px !important; }\n `}</style>\n )}\n\n {/* Re-attach hint banner — top-center, above the canvas. Makes the picking\n state obvious and offers a cancel (Esc also cancels). */}\n {enabled && reattachId && (\n <div\n role=\"status\"\n data-cl-ui\n style={{\n position: 'fixed',\n top: 16,\n left: '50%',\n transform: 'translateX(-50%)',\n zIndex: 2147483647,\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n padding: '9px 12px 9px 14px',\n borderRadius: 999,\n background: '#202123',\n border: '1px solid rgba(200,132,28,0.5)',\n boxShadow: '0 6px 24px rgba(0,0,0,0.4)',\n color: '#f5f1e8',\n fontSize: 13,\n fontFamily: FONT,\n }}\n >\n <span aria-hidden style={{ color: '#e8b05a' }}>⚑</span>\n <span>Click the element this comment should point to</span>\n <button\n type=\"button\"\n onClick={() => setReattachId(null)}\n style={{\n font: `600 12px ${FONT}`,\n border: '1px solid rgba(245,241,232,0.25)',\n borderRadius: 999,\n background: 'transparent',\n color: 'rgba(245,241,232,0.8)',\n padding: '3px 10px',\n cursor: 'pointer',\n }}\n >\n Esc to cancel\n </button>\n </div>\n )}\n\n {/* Pins ride the canvas; only the draft carries an on-canvas popover. */}\n {enabled && (\n <PinLayer pins={pins} openId={openId} onOpen={setOpenId} renderPopover={renderPopover} />\n )}\n\n {/* Right-hand reading surface: element preview + comment chain per thread. */}\n {enabled && (\n <CommentsSidebar\n threads={threads}\n reads={reads}\n me={me}\n canWrite={canWrite}\n activePageId={activePageId}\n pages={pages}\n onSwitchPage={onSwitchPage}\n signedOut={config.devMode ? false : !me}\n needsAuth={needsAuth}\n previewReadOnly={previewReadOnly}\n onSignIn={startSignIn}\n onSignOut={() => void signOut().then(() => onAuthChanged?.())}\n openId={openId === 'draft' ? null : openId}\n busy={busy}\n showResolved={showResolved}\n onSetShowResolved={setShowResolved}\n onMarkUnread={(id) => void markUnread(id)}\n onOpen={setOpenId}\n onResolve={async (id) => {\n try {\n await resolve(id);\n if (!showResolved) setOpenId((cur) => (cur === id ? null : cur));\n } catch (err) {\n handleWriteError(err);\n }\n }}\n onUnresolve={(id) => void unresolve(id).catch(handleWriteError)}\n onReattach={canWrite ? startReattach : undefined}\n onDelete={async (id) => {\n try {\n await remove(id);\n setOpenId((cur) => (cur === id ? null : cur));\n } catch (err) {\n handleWriteError(err);\n }\n }}\n onClose={() => setMode('cursor')}\n />\n )}\n </div>,\n getPortalRoot(),\n );\n}\n"],"names":["value","empty","seq","_a","pick","re","parts","_b","opts","withNativeBlob","withNativeArrayBuffer","isView","lookup","decode","isBinary","on","globalThis","DEFAULT_TRANSPORTS","RESERVED_EVENTS","PacketType","self","Engine","socket","url","io"],"mappings":"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","x_google_ignoreList":[15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]}