@ascribed/review 0.4.4 → 0.4.5-next.34

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.
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/overlay/overlay.ts"],"names":[],"mappings":"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","sourcesContent":["// The review overlay: a pull request's threads beside the blocks of a rendered\n// page. It reads the page's source anchors to find each thread's block, gets\n// everything else from its host (`OverlayHost`), and draws in shadow roots of\n// its own, so the page's styles and the overlay's stay apart:\n//\n// - above the page, the threads with no block on it (detached);\n// - over the page, in a layer: at wide widths, a column of threads beside the\n// page, each aligned with its block, with a line between them on hover and\n// focus; at narrow widths, the panel a block's count marker opens; and the\n// dialogs (submit, all comments);\n// - below the page, a bar while there are unsent comments;\n// - in the page, on the block under the pointer or focus, a Comment button,\n// at narrow widths a count marker on each block with threads, and on a\n// tab's label and a `<details>`' summary how many comments they hold. These are\n// elements with `data-ascribe-ui`, as the marks' are, each holding a shadow\n// root, so they sit in the page's reading and tab order.\n//\n// Comment bodies are rendered by `markdown.ts`, as DOM nodes.\nimport { findBlock, goTo, reveal, tabButton, titleNodes } from \"../marks/index.js\";\nimport { anchorKey, formatSource, type Anchor } from \"../place/anchor.js\";\nimport type { LocatedThread } from \"../place/place.js\";\nimport { renderMarkdown } from \"./markdown.js\";\nimport { OVERLAY_CSS } from \"./style.js\";\nimport {\n authorName,\n blockText,\n hasUnsent,\n initials,\n linesLabel,\n listLabel,\n onRemovedText,\n plural,\n relativeTime,\n whereLabel,\n} from \"./text.js\";\nimport type {\n CommentTarget,\n HostError,\n OverlayData,\n OverlayHost,\n PromptRequest,\n ReviewEvent,\n ThreadSummary,\n} from \"./types.js\";\nimport {\n DATA_CHANGE,\n DATA_OVERLAY,\n DATA_SHOW,\n DATA_SOURCE,\n DATA_UI,\n DATA_VIA,\n DATA_WAS_SOURCE,\n ELEMENT_TAB,\n} from \"../names.js\";\n\n/** Options for `createOverlay`. */\nexport interface OverlayOptions {\n /** The rendered page, with source anchors. */\n root: HTMLElement;\n host: OverlayHost;\n /**\n * The least width, in pixels, of the page's container at which threads\n * show in a column beside the page. Narrower, each block with threads gets\n * a count marker that opens a panel. Default 600.\n */\n columnAt?: number;\n /** Called after the overlay redraws: for a host showing the thread count. */\n onUpdate?: () => void;\n /**\n * Whether to draw the bar of unsent comments below the page. Default true.\n * A host that shows the count itself (`unsentCount`) turns it off and opens\n * the submit dialog with `submitReview`.\n */\n unsentBar?: boolean;\n}\n\n/** The overlay on one page. */\nexport interface Overlay {\n /** Reads the threads again from the host and redraws. */\n refresh(): Promise<void>;\n /** Places the threads again, after the page changed size or what it shows. */\n layout(): void;\n /** Goes to a thread on this page, now or once the threads are read. Whether it's on the page. */\n goToThread(threadId: string): boolean;\n /** Opens the list of every thread on the pull request's pages. */\n showAllComments(): void;\n /** How many threads the pull request has on its pages, once read. */\n threadCount(): number | undefined;\n /** How many comments are unsent, once read. */\n unsentCount(): number | undefined;\n /**\n * Where the column of threads starts, in the viewport's pixels from its\n * left, while it shows: for a host that keeps its own controls clear of it.\n */\n columnStart(): number | undefined;\n /** Opens the submit dialog, when there's something to submit. */\n submitReview(): void;\n /** Removes the overlay and everything it put on the page. */\n dispose(): void;\n}\n\nconst COLUMN_WIDTH = 250;\nconst COLUMN_GAP = 12;\nconst MARKER_ROOM = \"44px\";\n\n/** A block with threads, or one being commented on, in the page's order. */\ninterface Entry {\n key: string;\n anchor: Anchor;\n threads: LocatedThread[];\n /** On removed text: the block is the marks' stand-in for what was removed. */\n removed: boolean;\n element: HTMLElement | null;\n}\n\ninterface Composer {\n key: string;\n anchor: Anchor;\n /** `undefined` while the host works it out. */\n target: CommentTarget | undefined;\n busy: boolean;\n error: string | undefined;\n}\n\ntype Filter = \"open\" | \"resolved\" | \"detached\" | \"unsent\";\n\nconst EVENTS: [ReviewEvent, string][] = [\n [\"COMMENT\", \"Comment\"],\n [\"APPROVE\", \"Approve\"],\n [\"REQUEST_CHANGES\", \"Request changes\"],\n];\n\n/** Puts the review overlay on a rendered page. */\nexport function createOverlay(options: OverlayOptions): Overlay {\n return new ReviewOverlay(options);\n}\n\nclass ReviewOverlay implements Overlay {\n private readonly root: HTMLElement;\n private readonly host: OverlayHost;\n private readonly doc: Document;\n private readonly columnAt: number;\n private readonly onUpdate: (() => void) | undefined;\n private readonly unsentBar: boolean;\n\n private readonly beforeHost: HTMLElement;\n private readonly afterHost: HTMLElement;\n private readonly layerHost: HTMLElement;\n private readonly toolsHost: HTMLElement;\n private readonly before: ShadowRoot;\n private readonly after: ShadowRoot;\n private readonly layer: ShadowRoot;\n private readonly tools: ShadowRoot;\n private readonly live: HTMLElement;\n\n private data: OverlayData | undefined;\n private all: ThreadSummary[] | undefined;\n private entries: Entry[] = [];\n private wide = true;\n private loadSeq = 0;\n private composer: Composer | undefined;\n private panel: string | undefined;\n /** The block the panel is for, which may have no threads yet. */\n private panelAnchor: Anchor | undefined;\n private dialog: \"submit\" | \"all\" | undefined;\n private discardAsk = false;\n private submitting = false;\n private dialogError: string | undefined;\n private filter: Filter = \"open\";\n private event: ReviewEvent = \"COMMENT\";\n private readonly expanded = new Set<string>();\n private readonly original = new Set<string>();\n private readonly drafts = new Map<string, string>();\n private readonly busy = new Set<string>();\n private readonly errors = new Map<string, string>();\n private linked: string | undefined;\n /** Which entries were hidden in the page when last drawn. */\n private drawnHidden = \"\";\n private linkTimer: ReturnType<typeof setTimeout> | undefined;\n private pendingGoTo: string | undefined;\n /** The read whose threads are drawn. */\n private loaded = 0;\n /** The block the Comment button is on. */\n private toolsOn: HTMLElement | undefined;\n /** What had focus before a dialog or the panel opened, to give it back. */\n private opener: HTMLElement | undefined;\n /** The page's blocks this overlay made focusable, and the blocks it made room on. */\n private focusable: HTMLElement[] = [];\n private padded: { element: HTMLElement; before: string }[] = [];\n private markers: { host: HTMLElement; block: HTMLElement }[] = [];\n /** The comment counts on tabs' labels and `<details>`' summaries. */\n private hints: HTMLElement[] = [];\n private containerPosition: string | undefined;\n /** The padding below the page for the column to end in, in pixels. */\n private room = 0;\n private readonly cleanups: (() => void)[] = [];\n private disposed = false;\n\n constructor(options: OverlayOptions) {\n this.root = options.root;\n this.host = options.host;\n this.doc = this.root.ownerDocument;\n this.columnAt = options.columnAt ?? 600;\n this.onUpdate = options.onUpdate;\n this.unsentBar = options.unsentBar ?? true;\n\n this.beforeHost = this.uiHost(\"div\");\n this.afterHost = this.uiHost(\"div\");\n this.layerHost = this.uiHost(\"div\");\n this.toolsHost = this.uiHost(\"span\");\n this.before = this.shadow(this.beforeHost);\n this.after = this.shadow(this.afterHost);\n this.layer = this.shadow(this.layerHost);\n this.tools = this.shadow(this.toolsHost);\n\n const container = this.container();\n if (this.doc.defaultView?.getComputedStyle(container).position === \"static\") {\n this.containerPosition = container.style.position;\n container.style.position = \"relative\";\n }\n this.root.before(this.beforeHost);\n this.root.after(this.afterHost);\n this.afterHost.after(this.layerHost);\n Object.assign(this.afterHost.style, { position: \"sticky\", bottom: \"0\", zIndex: \"3\" });\n Object.assign(this.layerHost.style, {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"none\",\n });\n Object.assign(this.toolsHost.style, { position: \"absolute\", zIndex: \"2\" });\n this.toolsHost.hidden = true;\n\n this.live = this.el(\"div\", \"sr-only\");\n this.live.setAttribute(\"role\", \"status\");\n this.live.setAttribute(\"aria-live\", \"polite\");\n this.layer.append(this.live);\n\n this.listen();\n this.host.onDidChange(() => {\n if (!this.disposed) void this.refresh();\n });\n void this.refresh();\n }\n\n // --- Public ---\n\n async refresh(): Promise<void> {\n const seq = ++this.loadSeq;\n let data: OverlayData;\n let all: ThreadSummary[] | undefined;\n try {\n [data, all] = await Promise.all([\n this.host.load(),\n this.host.allThreads().catch(() => undefined),\n ]);\n } catch (error) {\n if (seq !== this.loadSeq || this.disposed) return;\n this.announce(messageOf(error));\n return;\n }\n if (seq !== this.loadSeq || this.disposed) return;\n this.data = data;\n this.loaded = seq;\n if (all !== undefined) this.all = all;\n this.render();\n const goal = this.pendingGoTo;\n if (goal !== undefined) {\n this.pendingGoTo = undefined;\n this.goToThread(goal);\n }\n }\n\n layout(): void {\n if (this.disposed || this.data === undefined) return;\n // Crossing the column's width, or a tab or `<details>` showing or hiding\n // a block with threads, changes what's drawn, not only where.\n if (this.measureWide() !== this.wide || this.hiddenState() !== this.drawnHidden) {\n this.render();\n return;\n }\n this.place();\n }\n\n goToThread(threadId: string): boolean {\n // Until the threads being read arrive: the page may have just changed.\n if (this.data === undefined || this.loaded !== this.loadSeq) {\n this.pendingGoTo = threadId;\n return true;\n }\n const entry = this.entries.find((e) => e.threads.some((t) => t.id === threadId));\n const detached = this.data.threads.detached.some((t) => t.id === threadId);\n if (entry === undefined && !detached) return false;\n this.dialog = undefined;\n this.expanded.add(threadId);\n if (entry?.element) {\n reveal(entry.element);\n if (!this.wide) {\n this.panel = entry.key;\n this.panelAnchor = entry.removed ? undefined : entry.anchor;\n }\n this.render();\n goTo(entry.element);\n if (this.wide) this.link(entry.key, 1800);\n } else {\n this.render();\n }\n const card = this.findCard(threadId);\n if (card) {\n if (typeof card.scrollIntoView === \"function\" && !entry?.element) {\n card.scrollIntoView({ block: \"center\" });\n }\n card.focus({ preventScroll: true });\n }\n return true;\n }\n\n showAllComments(): void {\n this.openDialog(\"all\");\n }\n\n threadCount(): number | undefined {\n return this.all?.length;\n }\n\n unsentCount(): number | undefined {\n return this.data?.pending.count;\n }\n\n columnStart(): number | undefined {\n if (this.disposed || !this.wide || this.data === undefined) return undefined;\n return this.root.getBoundingClientRect().right + COLUMN_GAP;\n }\n\n submitReview(): void {\n if ((this.data?.pending.count ?? 0) > 0) this.openDialog(\"submit\");\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const cleanup of this.cleanups) cleanup();\n this.undecorate();\n this.beforeHost.remove();\n this.afterHost.remove();\n this.layerHost.remove();\n this.toolsHost.remove();\n if (this.containerPosition !== undefined) {\n this.container().style.position = this.containerPosition;\n }\n this.root.style.removeProperty(\"margin-inline-end\");\n this.makeRoom(0);\n if (this.linkTimer) clearTimeout(this.linkTimer);\n }\n\n // --- Setup ---\n\n private container(): HTMLElement {\n return this.root.parentElement ?? this.doc.body;\n }\n\n private uiHost(tag: \"div\" | \"span\"): HTMLElement {\n const host = this.doc.createElement(tag);\n host.setAttribute(DATA_UI, \"\");\n host.setAttribute(DATA_OVERLAY, \"\");\n return host;\n }\n\n private shadow(host: HTMLElement): ShadowRoot {\n const shadow = host.attachShadow({ mode: \"open\" });\n adoptStyles(shadow, this.doc);\n return shadow;\n }\n\n private listen(): void {\n const on = <K extends keyof HTMLElementEventMap>(\n target: HTMLElement | ShadowRoot | Window,\n type: K,\n handler: (event: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n ): void => {\n target.addEventListener(type, handler as EventListener, options);\n this.cleanups.push(() => target.removeEventListener(type, handler as EventListener, options));\n };\n on(this.root, \"mouseover\", (event) => this.pointAt(event.target));\n on(this.root, \"focusin\", (event) => this.pointAt(event.target));\n on(this.root, \"mouseout\", (event) => {\n const to = event.relatedTarget;\n if (to instanceof Node && this.toolsOn?.contains(to)) return;\n if (to instanceof Node && (this.toolsHost.contains(to) || to === this.toolsHost)) return;\n if (!this.toolsOn?.contains(this.doc.activeElement)) this.hideTools();\n this.link(undefined);\n });\n on(this.root, \"focusout\", (event) => {\n const to = event.relatedTarget;\n if (to instanceof Node && this.toolsOn?.contains(to)) return;\n this.hideTools();\n this.link(undefined);\n });\n on(this.root, \"click\", (event) => this.clickBlock(event));\n on(this.root, \"keydown\", (event) => this.keyOnBlock(event));\n // A tab or a `<details>` in the page changed what shows: place again.\n on(this.root, \"toggle\", () => this.layout(), { capture: true });\n on(this.root, \"click\", () => requestFrame(this.doc, () => this.layout()));\n for (const shadow of [this.before, this.after, this.layer, this.tools]) {\n on(shadow, \"click\", (event) => this.clickLink(event));\n on(shadow, \"keydown\", (event) => this.keyInOverlay(event));\n on(shadow, \"dblclick\", (event) => event.stopPropagation());\n }\n const view = this.doc.defaultView;\n if (view) on(view, \"resize\", () => this.layout());\n if (view && \"ResizeObserver\" in view) {\n // Placed in the next frame: placing can pad the page, which resizes\n // what's observed, and doing that inside the observer's callback is a\n // \"ResizeObserver loop\" error on the page (a dev server reports it).\n let queued = false;\n const observer = new view.ResizeObserver(() => {\n if (queued) return;\n queued = true;\n requestFrame(this.doc, () => {\n queued = false;\n this.layout();\n });\n });\n observer.observe(this.root);\n observer.observe(this.container());\n this.cleanups.push(() => observer.disconnect());\n }\n }\n\n // --- Reading the page ---\n\n private measureWide(): boolean {\n return this.container().clientWidth >= this.columnAt;\n }\n\n private anchorOf(element: Element): Anchor | undefined {\n const source = element.getAttribute(DATA_SOURCE);\n if (source === null) return undefined;\n const via = (element.getAttribute(DATA_VIA) ?? \"\").split(\" \").filter(Boolean);\n return { source, via };\n }\n\n /** The block an event's target is in: the innermost anchored element. */\n private blockOf(target: EventTarget | null): HTMLElement | undefined {\n if (!(target instanceof Element)) return undefined;\n if (target.closest(`[${DATA_OVERLAY}]`) && target !== this.toolsHost) {\n // A marker: the block it's on.\n const marker = this.markers.find((m) => m.host === target.closest(`[${DATA_OVERLAY}]`));\n if (marker) return marker.block;\n }\n const block = target.closest<HTMLElement>(`[${DATA_SOURCE}]`);\n return block && this.root.contains(block) ? block : undefined;\n }\n\n /** The block's text as the page shows it, for a comment to quote. */\n private shownText(anchor: Anchor): string | undefined {\n const key = anchorKey(anchor);\n for (const el of Array.from(this.root.querySelectorAll<HTMLElement>(`[${DATA_SOURCE}]`))) {\n const at = this.anchorOf(el);\n if (at && anchorKey(at) === key) return blockText(el) || undefined;\n }\n return undefined;\n }\n\n private removedElement(anchor: Anchor): HTMLElement | null {\n for (const el of Array.from(this.root.querySelectorAll<HTMLElement>(`[${DATA_WAS_SOURCE}]`))) {\n if (el.getAttribute(DATA_WAS_SOURCE) === anchor.source) return el;\n }\n return null;\n }\n\n private readEntries(): Entry[] {\n const data = this.data;\n if (!data) return [];\n const entries: Entry[] = [];\n for (const { anchor, threads } of data.threads.blocks) {\n entries.push({\n key: anchorKey(anchor),\n anchor,\n threads,\n removed: false,\n element: findBlock(this.root, anchor),\n });\n }\n for (const { anchor, threads } of data.threads.removed) {\n entries.push({\n key: `removed ${anchorKey(anchor)}`,\n anchor,\n threads,\n removed: true,\n element: this.removedElement(anchor),\n });\n }\n // A block being commented on, or whose panel is open, may have no threads yet.\n for (const anchor of [this.composer?.anchor, this.panelAnchor]) {\n if (anchor === undefined) continue;\n const key = anchorKey(anchor);\n if (entries.some((e) => e.key === key)) continue;\n entries.push({\n key,\n anchor,\n threads: [],\n removed: false,\n element: findBlock(this.root, anchor),\n });\n }\n // Page order.\n entries.sort((a, b) => {\n if (!a.element || !b.element || a.element === b.element) return 0;\n return a.element.compareDocumentPosition(b.element) & Node.DOCUMENT_POSITION_FOLLOWING\n ? -1\n : 1;\n });\n return entries;\n }\n\n /** Whether what the page shows hides a block: removed text in \"as it will be\", new text in \"as it was\". */\n private hiddenByShow(element: HTMLElement): boolean {\n const show = this.root.getAttribute(DATA_SHOW);\n const kind = element.closest(`[${DATA_CHANGE}]`)?.getAttribute(DATA_CHANGE);\n if (show === \"will\") return kind === \"removed\" || kind === \"moved-from\";\n if (show === \"was\") return kind === \"added\" || kind === \"moved\";\n return false;\n }\n\n /** Where a block is hidden in the page: an unselected tab or a closed `<details>`. */\n private hiddenIn(element: HTMLElement): string | undefined {\n for (\n let node: HTMLElement | null = element.parentElement;\n node !== null && node !== this.root.parentElement;\n node = node.parentElement\n ) {\n if (node.localName === ELEMENT_TAB && node.hidden) {\n return `In the ${node.getAttribute(\"label\") ?? \"\"} tab, which isn't showing.`;\n }\n if (node.localName === \"details\" && !(node as HTMLDetailsElement).open) {\n const summary = node.querySelector(\":scope > summary\");\n if (summary?.contains(element)) continue;\n return `Inside “${summary ? blockText(summary) : \"\"}”, which is closed.`;\n }\n }\n return undefined;\n }\n\n private hiddenState(): string {\n return this.entries\n .map((e) => (e.element && (this.hiddenIn(e.element) || this.hiddenByShow(e.element)) ? 1 : 0))\n .join(\"\");\n }\n\n /**\n * The element to align a block's threads with: the block, or, while it's\n * in an unselected tab or a closed `<details>`, the tabs or the details.\n */\n private visibleFor(element: HTMLElement | null): HTMLElement | null {\n let shown = element;\n for (\n let node = element?.parentElement ?? null;\n node !== null && node !== this.root;\n node = node.parentElement\n ) {\n if (node.localName === ELEMENT_TAB && node.hidden) shown = node.parentElement;\n if (node.localName === \"details\" && !(node as HTMLDetailsElement).open) {\n const summary = node.querySelector(\":scope > summary\");\n if (!(shown && summary?.contains(shown))) shown = node;\n }\n }\n return shown;\n }\n\n // --- Drawing ---\n\n private render(): void {\n if (this.disposed) return;\n const focus = this.focusKey();\n this.wide = this.measureWide();\n this.entries = this.readEntries();\n if (this.panel !== undefined && !this.entries.some((e) => e.key === this.panel)) {\n this.panel = undefined;\n this.panelAnchor = undefined;\n }\n this.drawnHidden = this.hiddenState();\n this.decorate();\n this.before.replaceChildren(...this.styleNodes(this.before), ...this.drawDetached());\n this.after.replaceChildren(...this.styleNodes(this.after), ...this.drawUnsentBar());\n const layer = this.el(\"div\", \"layer\");\n if (this.wide) layer.append(...this.drawColumn());\n const sheet = this.wide ? null : this.drawSheet();\n if (sheet) layer.append(sheet);\n const dialog = this.drawDialog();\n if (dialog) layer.append(dialog);\n this.layer.replaceChildren(...this.styleNodes(this.layer), layer, this.live);\n this.drawTools();\n this.restoreFocus(focus);\n this.place();\n this.onUpdate?.();\n }\n\n /** A `<style>` element where constructed stylesheets aren't available. */\n private styleNodes(shadow: ShadowRoot): Node[] {\n return Array.from(shadow.children).filter(\n (child) => child.localName === \"style\" && child.hasAttribute(\"data-overlay\"),\n );\n }\n\n /** Makes the page's blocks focusable, and at narrow widths puts count markers on them. */\n private decorate(): void {\n this.undecorate();\n const threadsOn = this.data !== undefined;\n if (!threadsOn) {\n this.root.style.removeProperty(\"margin-inline-end\");\n return;\n }\n if (this.wide)\n this.root.style.setProperty(\"margin-inline-end\", `${COLUMN_WIDTH + COLUMN_GAP}px`);\n else this.root.style.removeProperty(\"margin-inline-end\");\n for (const el of Array.from(this.root.querySelectorAll<HTMLElement>(`[${DATA_SOURCE}]`))) {\n if (el.hasAttribute(\"tabindex\")) continue;\n el.tabIndex = 0;\n this.focusable.push(el);\n }\n this.drawHints();\n if (this.wide) return;\n for (const entry of this.entries) {\n const count = entry.threads.length;\n if (count === 0 || !entry.element || this.hiddenByShow(entry.element)) continue;\n const host = this.uiHost(\"span\");\n Object.assign(host.style, { position: \"absolute\", zIndex: \"1\" });\n const shadow = this.shadow(host);\n const marker = this.button(\"marker\", String(count), () => this.openEntry(entry));\n marker.setAttribute(\n \"aria-label\",\n `${plural(count, \"comment\")} on this block. Show ${count === 1 ? \"it\" : \"them\"}.`,\n );\n marker.setAttribute(\"aria-haspopup\", \"dialog\");\n shadow.append(marker);\n // A block in a closed `<details>` or an unselected tab has its marker\n // on what shows in its place; its panel says where it is.\n const element = this.visibleFor(entry.element) ?? entry.element;\n if (this.markers.some((m) => m.block === element)) continue;\n if (isVoid(element)) element.after(host);\n else element.append(host);\n this.markers.push({ host, block: element });\n this.padded.push({ element, before: element.style.paddingInlineEnd });\n element.style.paddingInlineEnd = MARKER_ROOM;\n }\n }\n\n /**\n * On each tab's label and each `<details>`' summary, how many comments are\n * on the blocks they can hide, which an unselected tab or a closed\n * `<details>` would otherwise keep out of sight.\n */\n private drawHints(): void {\n const counts = new Map<HTMLElement, number>();\n for (const entry of this.entries) {\n const element = entry.element;\n const count = entry.threads.length;\n if (count === 0 || !element || this.hiddenByShow(element)) continue;\n for (\n let node = element.parentElement;\n node !== null && node !== this.root;\n node = node.parentElement\n ) {\n let on: HTMLElement | null = null;\n if (node.localName === ELEMENT_TAB) on = tabButton(node);\n if (node.localName === \"details\") {\n const summary = node.querySelector<HTMLElement>(\":scope > summary\");\n if (summary && !summary.contains(element)) on = summary;\n }\n if (on) counts.set(on, (counts.get(on) ?? 0) + count);\n }\n }\n // Each count starts with a space, as the marks' hints do, so the label\n // reads \"Linux 1 change 1 comment\".\n for (const [on, count] of counts) {\n const host = this.uiHost(\"span\");\n this.shadow(host).append(this.el(\"span\", \"hint-count\", ` ${plural(count, \"comment\")}`));\n on.append(host);\n this.hints.push(host);\n }\n }\n\n private undecorate(): void {\n for (const host of this.hints) host.remove();\n this.hints = [];\n for (const el of this.focusable) el.removeAttribute(\"tabindex\");\n this.focusable = [];\n for (const { element, before } of this.padded) element.style.paddingInlineEnd = before;\n this.padded = [];\n for (const { host } of this.markers) host.remove();\n this.markers = [];\n }\n\n private drawDetached(): HTMLElement[] {\n const detached = this.data?.threads.detached ?? [];\n if (detached.length === 0) return [];\n const box = this.el(\"section\", \"detached\");\n box.setAttribute(\"aria-label\", \"Comments with no block on this page\");\n box.append(\n this.el(\n \"div\",\n \"\",\n detached.length === 1\n ? \"1 comment has no block on this page any more:\"\n : `${detached.length} comments have no block on this page any more:`,\n ),\n ...detached.map((thread) => this.card(thread, \"detached\", undefined)),\n );\n return [box];\n }\n\n private drawUnsentBar(): HTMLElement[] {\n const count = this.data?.pending.count ?? 0;\n if (count === 0 || !this.unsentBar) return [];\n const bar = this.el(\"div\", \"unsent-bar\");\n bar.setAttribute(\"role\", \"region\");\n bar.setAttribute(\"aria-label\", \"Unsent comments\");\n bar.append(\n this.el(\"b\", \"\", plural(count, \"unsent comment\")),\n this.el(\"span\", \"hint\", `Only you can see ${count === 1 ? \"it\" : \"them\"} until you submit.`),\n this.el(\"span\", \"spacer\"),\n this.button(\"primary\", \"Submit review…\", () => this.openDialog(\"submit\"), \"submit-open\"),\n );\n return [bar];\n }\n\n private drawColumn(): Element[] {\n const column = this.el(\"div\", \"column\");\n for (const entry of this.entries) {\n if (entry.element && this.hiddenByShow(entry.element)) continue;\n const cards = this.cardsFor(entry, \"column\");\n if (cards.length === 0) continue;\n const slot = this.el(\"div\", \"slot\");\n slot.dataset[\"key\"] = entry.key;\n slot.append(...cards);\n slot.addEventListener(\"mouseenter\", () => this.link(entry.key));\n slot.addEventListener(\"mouseleave\", () => this.link(undefined));\n slot.addEventListener(\"focusin\", () => this.link(entry.key));\n slot.addEventListener(\"focusout\", (event) => {\n if (!(event.relatedTarget instanceof Node && slot.contains(event.relatedTarget))) {\n this.link(undefined);\n }\n });\n column.append(slot);\n }\n const highlight = this.el(\"div\", \"highlight\");\n highlight.hidden = true;\n const svg = this.doc.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"connector\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n return [highlight, svg, column];\n }\n\n private cardsFor(entry: Entry, view: \"column\" | \"panel\"): HTMLElement[] {\n const cards = entry.threads.map((thread) => this.card(thread, view, entry));\n if (this.composer?.key === entry.key) cards.push(this.drawComposer(this.composer));\n return cards;\n }\n\n private drawSheet(): HTMLElement | null {\n const entry = this.entries.find((e) => e.key === this.panel);\n if (!entry) return null;\n const sheet = this.el(\"div\", \"sheet\");\n sheet.setAttribute(\"role\", \"dialog\");\n sheet.setAttribute(\"aria-label\", \"Comments on this block\");\n const head = this.el(\"div\", \"head\");\n head.append(\n this.el(\"b\", \"\", entry.removed ? \"Removed text\" : sourceLabel(entry.anchor)),\n this.el(\"span\", \"spacer\"),\n );\n if (!entry.removed) {\n head.append(this.button(\"ghost\", \"Source\", () => this.host.openSource(entry.anchor)));\n if (this.composer?.key !== entry.key) {\n head.append(this.button(\"ghost\", \"Comment\", () => this.startComment(entry.anchor)));\n }\n }\n head.append(this.button(\"ghost\", \"Close\", () => this.closePanel(), \"panel-close\"));\n sheet.append(head);\n const cards = this.cardsFor(entry, \"panel\");\n if (cards.length === 0) sheet.append(this.el(\"p\", \"hint\", \"No comments on this block yet.\"));\n sheet.append(...cards);\n return sheet;\n }\n\n private card(\n thread: LocatedThread,\n view: \"column\" | \"panel\" | \"detached\",\n entry: Entry | undefined,\n ): HTMLElement {\n const data = this.data;\n const viewer = data?.viewer ?? \"\";\n const collapsed = thread.resolved && !this.expanded.has(thread.id);\n const card = this.el(\"article\", `thread${collapsed ? \" collapsed\" : \"\"}`);\n card.dataset[\"thread\"] = thread.id;\n card.dataset[\"focus\"] = `thread:${thread.id}`;\n card.tabIndex = -1;\n const first = thread.comments[0];\n card.setAttribute(\n \"aria-label\",\n `Comment by ${first ? authorName(first.author, viewer) : \"someone\"} on ${whereLabel(thread)}`,\n );\n\n const head = this.el(\"div\", \"th\");\n const where = whereLabel(thread);\n // In the narrow panel, the sheet's title already names the block.\n if (!(view === \"panel\" && entry && !entry.removed && where === sourceLabel(entry.anchor))) {\n head.append(this.el(\"span\", \"\", where));\n }\n if (onRemovedText(thread)) head.append(this.badge(\"removed\", \"On removed text\"));\n if (thread.resolved) head.append(this.badge(\"resolved\", \"Resolved\"));\n if (thread.detached !== undefined) head.append(this.badge(\"detached\", \"Detached\"));\n if (thread.outdated && thread.detached === undefined) {\n head.append(this.badge(\"outdated\", \"Outdated\"));\n }\n if (thread.kind === \"conversation\") head.append(this.badge(\"summary\", \"In the review summary\"));\n if (hasUnsent(thread)) head.append(this.badge(\"unsent\", \"Unsent\"));\n if (head.childElementCount > 0) card.append(head);\n\n // Actions sit on their own row, so the header never pushes one onto a line by itself.\n const acts = this.el(\"div\", \"acts\");\n if (thread.resolved) {\n acts.append(\n this.button(\n \"link\",\n collapsed ? \"Expand\" : \"Collapse\",\n () => {\n if (collapsed) this.expanded.add(thread.id);\n else this.expanded.delete(thread.id);\n this.render();\n },\n `expand:${thread.id}`,\n ),\n );\n }\n if (thread.outdated && thread.detached === undefined && thread.quote !== undefined) {\n const open = this.original.has(thread.id);\n acts.append(\n this.button(\n \"link\",\n open ? \"Hide original text\" : \"Original text\",\n () => {\n if (open) this.original.delete(thread.id);\n else this.original.add(thread.id);\n this.render();\n },\n `original:${thread.id}`,\n ),\n );\n }\n if (entry && !entry.removed) {\n acts.append(\n this.button(\"link\", \"Open source\", () => this.host.openSource(threadSource(thread, entry))),\n );\n }\n if (this.host.promptAgent) {\n const prompt = this.button(\n \"link\",\n \"Prompt agent\",\n () => void this.promptAgent({ kind: \"thread\", threadId: thread.id }),\n `prompt:${thread.id}`,\n );\n prompt.title = \"Prompt agent: address this comment\";\n acts.append(prompt);\n }\n // A detached thread has no block to go to: GitHub shows it in full.\n const url = thread.comments.at(-1)?.url ?? thread.comments[0]?.url;\n if (thread.detached !== undefined && url !== undefined && /^https?:\\/\\//i.test(url)) {\n const github = this.el(\"a\", \"link\", \"View on GitHub\");\n github.setAttribute(\"href\", url);\n github.setAttribute(\"target\", \"_blank\");\n github.setAttribute(\"rel\", \"noopener noreferrer\");\n acts.append(github);\n }\n if (thread.kind === \"review\") {\n const can = thread.resolved ? thread.canUnresolve : thread.canResolve;\n if (can) {\n const resolve = this.button(\n \"link\",\n thread.resolved ? \"Reopen\" : \"Resolve\",\n () => void this.resolve(thread),\n `resolve:${thread.id}`,\n );\n resolve.title = \"Sent to GitHub right away, not held with your review\";\n resolve.disabled = this.busy.has(thread.id);\n acts.append(resolve);\n }\n }\n if (acts.childElementCount > 0) card.append(acts);\n\n const hidden = view !== \"detached\" && entry?.element ? this.hiddenIn(entry.element) : undefined;\n if (hidden && entry?.element) {\n const element = entry.element;\n const inside = this.el(\"div\", \"inside\", `${hidden} `);\n inside.append(\n this.button(\"link\", \"Show it\", () => {\n reveal(element);\n this.render();\n goTo(element);\n this.link(entry.key, 1800);\n }),\n );\n card.append(inside);\n }\n if (collapsed) return card;\n\n if (\n thread.quote !== undefined &&\n thread.quote.trim() !== \"\" &&\n (thread.detached !== undefined || this.original.has(thread.id))\n ) {\n const orig = this.el(\"div\", \"orig\");\n orig.append(\n this.el(\n \"span\",\n \"\",\n thread.detached !== undefined\n ? \"The comment was on this text, which is no longer on the page: \"\n : \"The text when the comment was made: \",\n ),\n this.el(\"q\", \"\", thread.quote),\n );\n card.append(orig);\n }\n\n const now = Date.now();\n for (const comment of thread.comments) {\n const row = this.el(\"div\", \"comment\");\n const avatar = this.el(\"span\", \"avatar\", initials(comment.author));\n avatar.setAttribute(\"aria-hidden\", \"true\");\n const text = this.el(\"div\", \"\");\n text.append(\n this.el(\"span\", \"who\", authorName(comment.author, viewer)),\n this.el(\n \"span\",\n \"when\",\n comment.pending ? \"not sent yet\" : relativeTime(comment.createdAt, now),\n ),\n );\n const body = this.el(\"div\", \"body\");\n body.append(renderMarkdown(this.doc, comment.body));\n text.append(body);\n row.append(avatar, text);\n card.append(row);\n }\n\n if (thread.kind === \"review\" && thread.canReply) {\n card.append(this.drawReply(thread));\n }\n return card;\n }\n\n private drawReply(thread: LocatedThread): HTMLElement {\n const key = `reply:${thread.id}`;\n const box = this.el(\"div\", \"reply\");\n const input = this.doc.createElement(\"textarea\");\n input.rows = 1;\n input.placeholder = \"Reply…\";\n input.setAttribute(\"aria-label\", \"Reply to thread\");\n input.dataset[\"focus\"] = key;\n input.value = this.drafts.get(key) ?? \"\";\n const busy = this.busy.has(thread.id);\n input.disabled = busy;\n input.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\" && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n void this.reply(thread, \"withReview\");\n }\n });\n const held = (this.data?.pending.count ?? 0) > 0;\n const now = this.button(\n \"ghost\",\n \"Reply now\",\n () => {\n if (held) {\n this.announce(HELD_REASON);\n return;\n }\n void this.reply(thread, \"now\");\n },\n `reply-now:${thread.id}`,\n );\n // GitHub adds every reply to the review while it has unsent comments, so\n // a reply can't go at once until it's submitted or discarded. The button\n // stays focusable, so the reason can be read.\n if (held) {\n now.setAttribute(\"aria-disabled\", \"true\");\n now.title = HELD_REASON;\n const reason = this.el(\"span\", \"sr-only\", HELD_REASON);\n reason.id = `held-${cssId(thread.id)}`;\n now.setAttribute(\"aria-describedby\", reason.id);\n box.append(reason);\n } else {\n now.title = \"Send this reply to GitHub right away\";\n }\n const add = this.button(\n \"ghost\",\n \"Add to review\",\n () => void this.reply(thread, \"withReview\"),\n `reply-add:${thread.id}`,\n );\n add.title = \"Hold this reply until you submit the review\";\n // Nothing to send until there's a reply. \"Reply now\" stays focusable\n // while it's held, so its reason can be read.\n const enable = () => {\n const empty = input.value.trim() === \"\";\n now.disabled = busy || (empty && !held);\n add.disabled = busy || empty;\n };\n enable();\n input.addEventListener(\"input\", () => {\n this.drafts.set(key, input.value);\n enable();\n });\n box.prepend(input);\n box.append(now, add);\n const error = this.errors.get(key);\n if (error) {\n const line = this.el(\"div\", \"error\", error);\n line.setAttribute(\"role\", \"alert\");\n box.append(line);\n }\n return box;\n }\n\n private drawComposer(composer: Composer): HTMLElement {\n const key = `comment:${composer.key}`;\n const box = this.el(\"div\", \"composer\");\n box.setAttribute(\"role\", \"group\");\n box.setAttribute(\"aria-label\", `Comment on ${sourceLabel(composer.anchor)}`);\n const target = composer.target;\n const refused = target?.kind === \"push-first\";\n if (target === undefined)\n box.append(this.el(\"div\", \"hint\", \"Checking where this comment can go…\"));\n if (target?.kind === \"summary\") {\n box.append(\n this.el(\n \"div\",\n \"hint\",\n target.reason === \"file\"\n ? \"This page's file isn't in the pull request, so GitHub can't put a comment on its lines. Your comment will go in your review's summary and still show here.\"\n : \"GitHub only takes comments on the lines a pull request changes and the few around them. Your comment will go in your review's summary and still show here.\",\n ),\n );\n }\n if (target?.kind === \"push-first\") {\n const refuse = this.el(\"div\", \"refuse\", target.message);\n refuse.setAttribute(\"role\", \"alert\");\n box.append(refuse);\n }\n const text = this.doc.createElement(\"textarea\");\n text.setAttribute(\"aria-label\", \"Comment\");\n text.placeholder = `Comment on ${sourceLabel(composer.anchor)}`;\n text.dataset[\"focus\"] = key;\n text.value = this.drafts.get(key) ?? \"\";\n text.disabled = refused || composer.busy;\n text.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\" && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n void this.addComment();\n }\n });\n box.append(text);\n if (composer.error) {\n const error = this.el(\"div\", \"error\", composer.error);\n error.setAttribute(\"role\", \"alert\");\n box.append(error);\n }\n const row = this.el(\"div\", \"row\");\n const add = this.button(\n \"primary\",\n \"Add to review\",\n () => void this.addComment(),\n \"composer-add\",\n );\n const enable = () => {\n add.disabled = refused || composer.busy || target === undefined || text.value.trim() === \"\";\n };\n enable();\n text.addEventListener(\"input\", () => {\n this.drafts.set(key, text.value);\n enable();\n });\n row.append(\n add,\n this.button(\"ghost\", \"Cancel\", () => this.cancelComment(), \"composer-cancel\"),\n );\n if (!refused)\n row.append(this.el(\"span\", \"hint\", \"Nothing is sent until you submit the review.\"));\n box.append(row);\n return box;\n }\n\n private drawDialog(): HTMLElement | null {\n const data = this.data;\n if (!data || this.dialog === undefined) return null;\n const backdrop = this.el(\"div\", \"backdrop\");\n backdrop.addEventListener(\"click\", (event) => {\n if (event.target === backdrop) this.closeDialog();\n });\n const dialog = this.el(\"div\", \"dialog\");\n dialog.setAttribute(\"role\", \"dialog\");\n dialog.setAttribute(\"aria-modal\", \"true\");\n backdrop.append(dialog);\n if (this.dialog === \"all\") this.drawAll(dialog, data);\n else this.drawSubmit(dialog, data);\n return backdrop;\n }\n\n private drawAll(dialog: HTMLElement, data: OverlayData): void {\n dialog.setAttribute(\"aria-label\", \"All comments\");\n const head = this.el(\"div\", \"row\");\n head.append(\n this.el(\"h2\", \"\", `All comments on #${data.pullRequest.number}`),\n this.el(\"span\", \"spacer\"),\n );\n const open = this.all?.some(\n (s) => !s.thread.resolved && !s.thread.comments.every((c) => c.pending),\n );\n if (this.host.promptAgent && open) {\n const prompt = this.button(\n \"ghost\",\n \"Prompt agent: all open\",\n () => void this.promptAgent({ kind: \"open-threads\" }),\n \"prompt-all\",\n );\n prompt.title = \"A prompt for your agent to address every open comment\";\n head.append(prompt);\n }\n head.append(this.button(\"ghost\", \"Close\", () => this.closeDialog(), \"dialog-close\"));\n dialog.append(head);\n const all = this.all;\n if (all === undefined) {\n dialog.append(this.el(\"p\", \"hint\", \"Reading the comments…\"));\n return;\n }\n const groups: Record<Filter, ThreadSummary[]> = {\n open: all.filter((s) => !s.thread.resolved && s.thread.detached === undefined),\n resolved: all.filter((s) => s.thread.resolved),\n detached: all.filter((s) => s.thread.detached !== undefined),\n unsent: all.filter((s) => hasUnsent(s.thread)),\n };\n const filters = this.el(\"div\", \"segmented\");\n filters.setAttribute(\"role\", \"group\");\n filters.setAttribute(\"aria-label\", \"Filter\");\n for (const [filter, label] of [\n [\"open\", \"Open\"],\n [\"resolved\", \"Resolved\"],\n [\"detached\", \"Detached\"],\n [\"unsent\", \"Unsent\"],\n ] as const) {\n const choice = this.button(\n \"\",\n `${label} ${groups[filter].length}`,\n () => {\n this.filter = filter;\n this.render();\n },\n `filter:${filter}`,\n );\n choice.setAttribute(\"aria-pressed\", String(this.filter === filter));\n filters.append(choice);\n }\n dialog.append(filters);\n const list = this.el(\"ul\", \"thread-list\");\n for (const summary of groups[this.filter]) {\n const { thread, pages } = summary;\n const first = thread.comments[0];\n const only = pages.length === 1 ? pages[0] : undefined;\n const page = only\n ? titleNodes(only.formatted_title, only.title ?? only.path, this.doc)\n : pages.length > 1\n ? [`on ${pages.length} pages`]\n : [];\n // As on its card: a thread with no block is detached, not outdated.\n const outdated = thread.outdated && thread.detached === undefined;\n const where = this.el(\"span\", \"where\");\n where.append([listLabel(thread), outdated ? \"outdated\" : \"\"].filter(Boolean).join(\" · \"));\n if (page.length > 0) {\n if (where.textContent) where.append(\" · \");\n where.append(...page);\n }\n const more = thread.comments.length > 1 ? ` (+${thread.comments.length - 1})` : \"\";\n const item = this.el(\"li\", \"\");\n const jump = this.button(\"\", \"\", () => this.jump(summary), `jump:${thread.id}`);\n jump.append(\n where,\n this.el(\n \"span\",\n \"first\",\n first ? `${authorName(first.author, data.viewer)}: ${oneLine(first.body)}${more}` : \"\",\n ),\n );\n item.append(jump);\n list.append(item);\n }\n if (groups[this.filter].length === 0) list.append(this.el(\"li\", \"hint\", \"None.\"));\n dialog.append(list);\n }\n\n private drawSubmit(dialog: HTMLElement, data: OverlayData): void {\n dialog.setAttribute(\"aria-label\", \"Submit review\");\n const count = data.pending.count;\n dialog.append(this.el(\"h2\", \"\", `Submit review to #${data.pullRequest.number}`));\n if (count > 0) {\n dialog.append(\n this.el(\n \"span\",\n \"hint\",\n count === 1 ? \"This one will be sent:\" : `These ${count} will be sent:`,\n ),\n );\n const list = this.el(\"ul\", \"unsent-list\");\n for (const summary of this.all ?? []) {\n const { thread } = summary;\n thread.comments.forEach((comment, index) => {\n if (!comment.pending) return;\n const item = this.el(\"li\", \"\");\n item.append(this.button(\"link\", listLabel(thread), () => this.jump(summary)));\n const how =\n index > 0\n ? \" (reply): \"\n : thread.kind === \"conversation\"\n ? \" (in the summary): \"\n : \": \";\n item.append(this.el(\"span\", \"\", `${how}${oneLine(comment.body)}`));\n list.append(item);\n });\n }\n dialog.append(list);\n }\n const choices = this.doc.createElement(\"fieldset\");\n const legend = this.el(\"legend\", \"hint\", \"Submit as\");\n choices.append(legend);\n for (const [event, label] of EVENTS) {\n const option = this.doc.createElement(\"label\");\n const radio = this.doc.createElement(\"input\");\n radio.type = \"radio\";\n radio.name = \"event\";\n radio.value = event;\n radio.checked = this.event === event;\n radio.dataset[\"focus\"] = `event:${event}`;\n radio.addEventListener(\"change\", () => {\n if (radio.checked) this.event = event;\n });\n option.append(radio, ` ${label}`);\n choices.append(option);\n }\n dialog.append(choices);\n const summary = this.doc.createElement(\"textarea\");\n summary.placeholder = \"Summary (optional)\";\n summary.setAttribute(\"aria-label\", \"Summary (optional)\");\n summary.dataset[\"focus\"] = \"summary\";\n summary.value = this.drafts.get(\"summary\") ?? \"\";\n summary.addEventListener(\"input\", () => this.drafts.set(\"summary\", summary.value));\n dialog.append(summary);\n if (this.dialogError) {\n const error = this.el(\"div\", \"error\", this.dialogError);\n error.setAttribute(\"role\", \"alert\");\n dialog.append(error);\n }\n if (this.discardAsk) {\n const confirm = this.el(\"div\", \"confirm\");\n confirm.setAttribute(\"role\", \"alert\");\n const row = this.el(\"div\", \"row\");\n row.append(\n this.button(\"danger\", \"Discard comments\", () => void this.discard(), \"discard-yes\"),\n this.button(\n \"ghost\",\n \"Keep review\",\n () => {\n this.discardAsk = false;\n this.render();\n },\n \"discard-no\",\n ),\n );\n confirm.append(\n this.el(\"b\", \"\", `Discard ${plural(count, \"unsent comment\")}?`),\n this.el(\"span\", \"\", \" They will be deleted and can't be brought back.\"),\n row,\n );\n dialog.append(confirm);\n return;\n }\n const row = this.el(\"div\", \"row\");\n const submit = this.button(\"primary\", \"Submit review\", () => void this.submit(), \"submit\");\n submit.disabled = this.submitting;\n row.append(\n submit,\n this.button(\"ghost\", \"Cancel\", () => this.closeDialog(), \"dialog-close\"),\n this.el(\"span\", \"spacer\"),\n );\n if (count > 0) {\n row.append(\n this.button(\n \"link\",\n \"Discard…\",\n () => {\n this.discardAsk = true;\n this.render();\n this.focusOn(\"discard-no\");\n },\n \"discard\",\n ),\n );\n }\n dialog.append(row);\n }\n\n /** The Comment button, on the block under the pointer or focus. */\n private drawTools(): void {\n const button = this.button(\n \"tool\",\n \"Comment\",\n () => {\n const block = this.toolsOn;\n const anchor = block && this.anchorOf(block);\n if (anchor) this.startComment(anchor);\n },\n \"tools\",\n );\n button.setAttribute(\"aria-label\", \"Comment on this block\");\n this.tools.replaceChildren(...this.styleNodes(this.tools), button);\n if (!this.wide || this.data === undefined) this.hideTools();\n }\n\n // --- Placing ---\n\n private place(): void {\n if (this.disposed) return;\n const base = this.layerHost.getBoundingClientRect();\n const column = this.layer.querySelector<HTMLElement>(\".column\");\n if (column) {\n const page = this.root.getBoundingClientRect();\n column.style.left = `${page.right - base.left + COLUMN_GAP}px`;\n column.style.width = `${COLUMN_WIDTH}px`;\n let previous = 0;\n for (const slot of Array.from(column.querySelectorAll<HTMLElement>(\":scope > .slot\"))) {\n const entry = this.entries.find((e) => e.key === slot.dataset[\"key\"]);\n const element = this.visibleFor(entry?.element ?? null);\n const at = element ? element.getBoundingClientRect().top - base.top : previous;\n const top = Math.max(at, previous);\n slot.style.top = `${top}px`;\n previous = top + slot.offsetHeight + 2;\n }\n column.style.height = `${previous}px`;\n // The column can run past the page: make room below it. The room\n // already made isn't the page's, or making it would undo it.\n const overrun = Math.ceil(previous - (page.bottom - this.room - base.top));\n this.makeRoom(overrun > 0 ? overrun : 0);\n } else {\n this.makeRoom(0);\n }\n for (const { host, block } of this.markers) this.pin(host, block);\n if (this.toolsOn && !this.toolsHost.hidden) this.pin(this.toolsHost, this.toolsOn);\n if (this.linked !== undefined) this.drawLink(this.linked);\n }\n\n /** Pads the page's bottom by `room` pixels, for the column to end in. */\n private makeRoom(room: number): void {\n if (room === this.room) return;\n this.room = room;\n if (room > 0) this.root.style.setProperty(\"padding-bottom\", `${room}px`);\n else this.root.style.removeProperty(\"padding-bottom\");\n }\n\n /** Positions an element of the page at a block's top right corner. */\n private pin(host: HTMLElement, block: HTMLElement): void {\n const parent = host.offsetParent ?? this.doc.body;\n const outer = parent.getBoundingClientRect();\n const box = block.getBoundingClientRect();\n host.style.top = `${box.top - outer.top - parent.clientTop}px`;\n host.style.left = `${box.right - outer.left - parent.clientLeft - host.offsetWidth}px`;\n }\n\n private pointAt(target: EventTarget | null): void {\n if (this.data === undefined) return;\n const block = this.blockOf(target);\n if (!block) return;\n if (this.wide) {\n const key = this.anchorKeyOf(block);\n if (key !== undefined && this.entries.some((e) => e.key === key)) this.link(key);\n if (block !== this.toolsOn || this.toolsHost.hidden) this.showTools(block);\n }\n }\n\n private anchorKeyOf(block: HTMLElement): string | undefined {\n const anchor = this.anchorOf(block);\n return anchor && anchorKey(anchor);\n }\n\n private showTools(block: HTMLElement): void {\n if (this.toolsHost.parentElement !== block) {\n if (isVoid(block)) block.after(this.toolsHost);\n else block.append(this.toolsHost);\n }\n this.toolsOn = block;\n this.toolsHost.hidden = false;\n this.pin(this.toolsHost, block);\n }\n\n private hideTools(): void {\n this.toolsHost.hidden = true;\n }\n\n /** Highlights a block and its threads and joins them with a line; `undefined` clears it. */\n private link(key: string | undefined, forMs?: number): void {\n if (this.linkTimer) clearTimeout(this.linkTimer);\n this.linkTimer = undefined;\n this.linked = key;\n this.drawLink(key);\n if (key !== undefined && forMs !== undefined) {\n this.linkTimer = setTimeout(() => this.link(undefined), forMs);\n }\n }\n\n private drawLink(key: string | undefined): void {\n const svg = this.layer.querySelector(\"svg.connector\");\n const highlight = this.layer.querySelector<HTMLElement>(\".highlight\");\n for (const slot of Array.from(this.layer.querySelectorAll(\".slot.linked\"))) {\n slot.classList.remove(\"linked\");\n }\n svg?.replaceChildren();\n if (highlight) highlight.hidden = true;\n if (key === undefined || !svg || !highlight) return;\n const entry = this.entries.find((e) => e.key === key);\n const element = this.visibleFor(entry?.element ?? null);\n const slot = Array.from(this.layer.querySelectorAll<HTMLElement>(\".slot\")).find(\n (s) => s.dataset[\"key\"] === key,\n );\n if (!element || !slot) return;\n slot.classList.add(\"linked\");\n const base = this.layerHost.getBoundingClientRect();\n const a = element.getBoundingClientRect();\n const s = slot.getBoundingClientRect();\n Object.assign(highlight.style, {\n top: `${a.top - base.top}px`,\n left: `${a.left - base.left}px`,\n width: `${a.width}px`,\n height: `${a.height}px`,\n });\n highlight.hidden = false;\n const x1 = a.right - base.left;\n const y1 = a.top - base.top + 12;\n const x2 = s.left - base.left;\n const y2 = s.top - base.top + 14;\n const mid = (x1 + x2) / 2;\n const path = this.doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttribute(\"d\", `M${x1} ${y1} H${mid} V${y2} H${x2}`);\n svg.append(path);\n }\n\n // --- What the reviewer does ---\n\n private clickBlock(event: MouseEvent): void {\n if (this.data === undefined || this.wide || event.defaultPrevented) return;\n const target = event.target instanceof Element ? event.target : null;\n if (!target || target.closest(\"a, button, input, textarea, select, summary, [role=tab]\"))\n return;\n if (this.doc.getSelection()?.isCollapsed === false) return;\n const block = this.blockOf(target);\n const anchor = block && this.anchorOf(block);\n if (anchor) this.openPanel(anchor);\n }\n\n private keyOnBlock(event: KeyboardEvent): void {\n if (this.data === undefined) return;\n if (event.key === \"Escape\") {\n this.escape();\n return;\n }\n const block = event.target instanceof HTMLElement ? event.target : null;\n if (!block || !this.focusable.includes(block)) return;\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n const anchor = this.anchorOf(block);\n if (!anchor) return;\n if (this.wide) this.startComment(anchor);\n else this.openPanel(anchor);\n }\n\n private keyInOverlay(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n this.escape();\n return;\n }\n if (event.key === \"Tab\" && this.dialog !== undefined) this.trapFocus(event);\n }\n\n private escape(): void {\n if (this.dialog !== undefined) this.closeDialog();\n else if (this.composer !== undefined) this.cancelComment();\n else if (this.panel !== undefined) this.closePanel();\n }\n\n private clickLink(event: MouseEvent): void {\n const target = event.composedPath()[0];\n const link = target instanceof Element ? target.closest(\"a[href]\") : null;\n if (!link || !this.host.openLink) return;\n event.preventDefault();\n this.host.openLink(link.getAttribute(\"href\") ?? \"\");\n }\n\n private startComment(anchor: Anchor): void {\n const key = anchorKey(anchor);\n if (this.composer?.key === key) {\n this.focusOn(`comment:${key}`);\n return;\n }\n this.rememberOpener();\n this.composer = { key, anchor, target: undefined, busy: false, error: undefined };\n if (!this.wide) {\n this.panel = key;\n this.panelAnchor = anchor;\n }\n this.render();\n this.focusOn(`comment:${key}`);\n const composer = this.composer;\n this.host.commentTarget(anchor).then(\n (target) => {\n if (this.composer !== composer) return;\n composer.target = target;\n this.render();\n if (target.kind !== \"push-first\") this.focusOn(`comment:${key}`);\n else this.focusOn(\"composer-cancel\");\n },\n () => {\n if (this.composer !== composer) return;\n // Nothing to say up front: try it, and the session holds it if it must.\n composer.target = { kind: \"thread\" };\n this.render();\n },\n );\n }\n\n private cancelComment(): void {\n const composer = this.composer;\n if (!composer) return;\n this.composer = undefined;\n this.drafts.delete(`comment:${composer.key}`);\n this.render();\n this.giveBackFocus();\n }\n\n private async addComment(): Promise<void> {\n const composer = this.composer;\n const key = composer && `comment:${composer.key}`;\n const body = key ? (this.drafts.get(key) ?? \"\").trim() : \"\";\n if (!composer || !key || composer.busy || body === \"\") return;\n composer.busy = true;\n composer.error = undefined;\n this.render();\n try {\n const thread = await this.host.comment(\n composer.anchor,\n body,\n this.shownText(composer.anchor),\n );\n this.composer = undefined;\n this.drafts.delete(key);\n this.announce(\n thread.kind === \"conversation\"\n ? \"Added to your review's summary. Nothing is sent until you submit the review.\"\n : \"Added to your review. Nothing is sent until you submit the review.\",\n );\n await this.refresh();\n if (!this.focusOn(`reply:${thread.id}`)) this.findCard(thread.id)?.focus();\n } catch (error) {\n composer.busy = false;\n composer.error = messageOf(error);\n if (codeOf(error) === \"push-first\")\n composer.target = { kind: \"push-first\", message: composer.error };\n this.announce(composer.error);\n this.render();\n }\n }\n\n private async reply(thread: LocatedThread, when: \"now\" | \"withReview\"): Promise<void> {\n const key = `reply:${thread.id}`;\n const body = (this.drafts.get(key) ?? \"\").trim();\n if (body === \"\" || this.busy.has(thread.id)) return;\n this.busy.add(thread.id);\n this.errors.delete(key);\n this.render();\n try {\n await this.host.reply(thread.id, body, when);\n this.drafts.delete(key);\n this.busy.delete(thread.id);\n const message = when === \"now\" ? \"Reply sent to GitHub.\" : \"Reply added to your review.\";\n this.announce(message);\n if (when === \"now\") this.host.notify?.(message);\n await this.refresh();\n this.focusOn(key);\n } catch (error) {\n this.busy.delete(thread.id);\n this.errors.set(key, messageOf(error));\n this.announce(messageOf(error));\n // The session refused because the review has unsent comments: read again, so the bar shows them.\n if (codeOf(error) === \"reply-held\") await this.refresh();\n else this.render();\n this.focusOn(key);\n }\n }\n\n /** Asks the host for a prompt; says so when it couldn't build one. */\n private async promptAgent(request: PromptRequest): Promise<void> {\n try {\n await this.host.promptAgent?.(request);\n } catch (error) {\n const message = `The prompt couldn't be built: ${messageOf(error)}`;\n if (this.host.notify) this.host.notify(message);\n else this.announce(message);\n }\n }\n\n private async resolve(thread: LocatedThread): Promise<void> {\n if (this.busy.has(thread.id)) return;\n const resolved = !thread.resolved;\n this.busy.add(thread.id);\n this.render();\n try {\n await this.host.resolve(thread.id, resolved);\n this.busy.delete(thread.id);\n this.expanded.delete(thread.id);\n const message = resolved\n ? \"Resolved on GitHub. Resolving is sent right away, not held with your review.\"\n : \"Reopened on GitHub.\";\n this.announce(message);\n this.host.notify?.(message);\n await this.refresh();\n if (!this.focusOn(`resolve:${thread.id}`)) this.focusOn(`expand:${thread.id}`);\n } catch (error) {\n this.busy.delete(thread.id);\n this.announce(messageOf(error));\n this.host.notify?.(messageOf(error));\n this.render();\n }\n }\n\n private async submit(): Promise<void> {\n const data = this.data;\n if (!data || this.submitting) return;\n this.submitting = true;\n this.dialogError = undefined;\n this.render();\n const summary = (this.drafts.get(\"summary\") ?? \"\").trim();\n try {\n await this.host.submit(this.event, summary === \"\" ? undefined : summary);\n this.submitting = false;\n this.drafts.delete(\"summary\");\n this.dialog = undefined;\n const number = data.pullRequest.number;\n const done =\n this.event === \"APPROVE\"\n ? `Approved #${number}.`\n : this.event === \"REQUEST_CHANGES\"\n ? `Requested changes on #${number}.`\n : `Review submitted to #${number}.`;\n const message = `${done} Your comments are now on GitHub.`;\n this.event = \"COMMENT\";\n this.announce(message);\n this.host.notify?.(message);\n await this.refresh();\n this.giveBackFocus();\n } catch (error) {\n this.submitting = false;\n this.dialogError = messageOf(error);\n this.announce(this.dialogError);\n this.render();\n }\n }\n\n private async discard(): Promise<void> {\n try {\n await this.host.discard();\n this.dialog = undefined;\n this.discardAsk = false;\n const message = \"Discarded your unsent comments.\";\n this.announce(message);\n this.host.notify?.(message);\n await this.refresh();\n this.giveBackFocus();\n } catch (error) {\n this.discardAsk = false;\n this.dialogError = messageOf(error);\n this.announce(this.dialogError);\n this.render();\n }\n }\n\n /** Goes to a thread from a list: on this page, or on the page the host opens. */\n private jump(summary: ThreadSummary): void {\n const { thread, pages } = summary;\n this.dialog = undefined;\n this.discardAsk = false;\n if (this.goToThread(thread.id)) return;\n this.render();\n const page = pages[0];\n if (page) {\n this.host.openThread(thread.id, page.path);\n return;\n }\n const lines = thread.lines ?? { first: 1, last: 1 };\n this.host.openSource({\n source: formatSource({ path: thread.path, first: lines.first, last: lines.last }),\n via: [],\n });\n }\n\n private openPanel(anchor: Anchor): void {\n this.rememberOpener();\n this.panel = anchorKey(anchor);\n this.panelAnchor = anchor;\n this.render();\n const sheet = this.layer.querySelector<HTMLElement>(\".sheet\");\n (\n sheet?.querySelector<HTMLElement>(\".thread\") ?? sheet?.querySelector<HTMLElement>(\"button\")\n )?.focus();\n }\n\n /** Opens the panel of a block with threads (which may be removed text). */\n private openEntry(entry: Entry): void {\n this.rememberOpener();\n this.panel = entry.key;\n this.panelAnchor = entry.removed ? undefined : entry.anchor;\n this.render();\n const sheet = this.layer.querySelector<HTMLElement>(\".sheet\");\n (\n sheet?.querySelector<HTMLElement>(\".thread\") ?? sheet?.querySelector<HTMLElement>(\"button\")\n )?.focus();\n }\n\n private closePanel(): void {\n this.panel = undefined;\n this.panelAnchor = undefined;\n this.composer = undefined;\n this.render();\n this.giveBackFocus();\n }\n\n private openDialog(dialog: \"submit\" | \"all\"): void {\n if (this.data === undefined) return;\n this.rememberOpener();\n this.dialog = dialog;\n this.discardAsk = false;\n this.dialogError = undefined;\n this.render();\n this.focusDialog();\n // The lists need every thread; read them again, since they may have changed.\n void this.host.allThreads().then(\n (all) => {\n if (this.disposed) return;\n this.all = all;\n if (this.dialog === dialog) {\n const focus = this.focusKey();\n this.render();\n if (!this.restoreFocus(focus)) this.focusDialog();\n }\n },\n () => undefined,\n );\n }\n\n private closeDialog(): void {\n this.dialog = undefined;\n this.discardAsk = false;\n this.render();\n this.giveBackFocus();\n }\n\n private focusDialog(): void {\n const dialog = this.layer.querySelector<HTMLElement>(\".dialog\");\n const first = dialog?.querySelector<HTMLElement>(\n this.dialog === \"submit\" ? \"input[type=radio]:checked\" : \"[aria-pressed=true]\",\n );\n first?.focus();\n }\n\n private trapFocus(event: KeyboardEvent): void {\n const dialog = this.layer.querySelector<HTMLElement>(\".dialog\");\n if (!dialog) return;\n const focusable = Array.from(\n dialog.querySelectorAll<HTMLElement>(\"button, textarea, input, [tabindex]\"),\n ).filter((el) => !(el as HTMLButtonElement).disabled && el.tabIndex >= 0);\n const first = focusable[0];\n const last = focusable.at(-1);\n const active = this.layer.activeElement;\n if (event.shiftKey && active === first) {\n event.preventDefault();\n last?.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first?.focus();\n }\n }\n\n // --- Focus ---\n\n private rememberOpener(): void {\n if (this.opener !== undefined) return;\n const active = this.activeElement();\n this.opener = active instanceof HTMLElement ? active : undefined;\n }\n\n private giveBackFocus(): void {\n const opener = this.opener;\n this.opener = undefined;\n if (opener?.isConnected) opener.focus({ preventScroll: true });\n }\n\n /** The focused element, inside the overlay's shadow roots or out. */\n private activeElement(): Element | null {\n let active = this.doc.activeElement;\n while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;\n return active;\n }\n\n private focusKey(): { key: string; start: number; end: number } | undefined {\n const active = this.activeElement();\n const key = active instanceof HTMLElement ? active.dataset[\"focus\"] : undefined;\n if (key === undefined || !active) return undefined;\n const field = active as HTMLTextAreaElement;\n return {\n key,\n start: typeof field.selectionStart === \"number\" ? field.selectionStart : 0,\n end: typeof field.selectionEnd === \"number\" ? field.selectionEnd : 0,\n };\n }\n\n private restoreFocus(focus: { key: string; start: number; end: number } | undefined): boolean {\n if (!focus) return false;\n const el = this.byFocusKey(focus.key);\n if (!el || (el as HTMLButtonElement).disabled) return false;\n el.focus({ preventScroll: true });\n if (el instanceof HTMLTextAreaElement) el.setSelectionRange(focus.start, focus.end);\n return true;\n }\n\n private byFocusKey(key: string): HTMLElement | undefined {\n for (const shadow of [this.layer, this.before, this.after, this.tools]) {\n for (const el of Array.from(shadow.querySelectorAll<HTMLElement>(\"[data-focus]\"))) {\n if (el.dataset[\"focus\"] === key) return el;\n }\n }\n return undefined;\n }\n\n private focusOn(key: string): boolean {\n const el = this.byFocusKey(key);\n if (!el || (el as HTMLButtonElement).disabled) return false;\n el.focus({ preventScroll: true });\n return true;\n }\n\n private findCard(threadId: string): HTMLElement | undefined {\n for (const shadow of [this.layer, this.before]) {\n for (const el of Array.from(shadow.querySelectorAll<HTMLElement>(\".thread\"))) {\n if (el.dataset[\"thread\"] === threadId) return el;\n }\n }\n return undefined;\n }\n\n private announce(message: string): void {\n // A change of text is what's announced: clear it first, so the same message is said again.\n this.live.textContent = \"\";\n requestFrame(this.doc, () => {\n this.live.textContent = message;\n });\n }\n\n // --- Elements ---\n\n private el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className: string,\n text?: string,\n ): HTMLElementTagNameMap[K] {\n const el = this.doc.createElement(tag);\n if (className) el.className = className;\n if (text !== undefined) el.textContent = text;\n return el;\n }\n\n private button(\n className: string,\n text: string,\n onClick: () => void,\n focusKey?: string,\n ): HTMLButtonElement {\n const button = this.el(\"button\", className, text);\n button.type = \"button\";\n if (focusKey !== undefined) button.dataset[\"focus\"] = focusKey;\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n onClick();\n });\n return button;\n }\n\n private badge(kind: string, text: string): HTMLElement {\n return this.el(\"span\", `badge ${kind}`, text);\n }\n}\n\nconst HELD_REASON =\n \"You have unsent comments, so GitHub adds replies to your review. Submit or discard it to reply at once.\";\n\n/** `rollouts.md:28`, from a block's anchor. */\nfunction sourceLabel(anchor: Anchor): string {\n const colon = anchor.source.lastIndexOf(\":\");\n const match = /^(\\d+)-(\\d+)$/.exec(anchor.source.slice(colon + 1));\n if (colon < 0 || !match) return anchor.source;\n let path = anchor.source.slice(0, colon);\n try {\n path = decodeURIComponent(path);\n } catch {\n // Show it as it is.\n }\n return linesLabel(path, { first: Number(match[1]), last: Number(match[2]) });\n}\n\n/** A comment's first line, for a list. */\nfunction oneLine(body: string): string {\n return body.replace(/\\s+/g, \" \").trim();\n}\n\nfunction messageOf(error: unknown): string {\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n return String((error as HostError).message);\n }\n return String(error);\n}\n\nfunction codeOf(error: unknown): string | undefined {\n if (typeof error === \"object\" && error !== null && \"code\" in error) {\n const code = (error as HostError).code;\n return typeof code === \"string\" ? code : undefined;\n }\n return undefined;\n}\n\n/** An element that can't hold children: the overlay's things go after it. */\nfunction isVoid(element: Element): boolean {\n return /^(img|hr|br|input|video|audio|iframe|embed|object|svg|math|canvas)$/.test(\n element.localName,\n );\n}\n\nfunction cssId(text: string): string {\n return text.replace(/[^A-Za-z0-9_-]/g, \"_\");\n}\n\nfunction requestFrame(doc: Document, callback: () => void): void {\n const view = doc.defaultView;\n if (view && typeof view.requestAnimationFrame === \"function\")\n view.requestAnimationFrame(callback);\n else setTimeout(callback, 0);\n}\n\nlet sheet: { doc: Document; sheet: CSSStyleSheet } | undefined;\n\n/**\n * Gives a shadow root the overlay's stylesheet: one constructed stylesheet,\n * shared, where the browser has them (a content security policy that allows\n * no inline styles still allows these); a `<style>` element elsewhere.\n */\nfunction adoptStyles(shadow: ShadowRoot, doc: Document): void {\n const view = doc.defaultView as (Window & { CSSStyleSheet?: typeof CSSStyleSheet }) | null;\n if (view?.CSSStyleSheet && \"adoptedStyleSheets\" in shadow) {\n try {\n if (sheet?.doc !== doc) {\n const constructed = new view.CSSStyleSheet();\n constructed.replaceSync(OVERLAY_CSS);\n sheet = { doc, sheet: constructed };\n }\n shadow.adoptedStyleSheets = [sheet.sheet];\n return;\n } catch {\n // Not constructable here: fall back to an element.\n }\n }\n const style = doc.createElement(\"style\");\n style.setAttribute(\"data-overlay\", \"\");\n style.textContent = OVERLAY_CSS;\n shadow.append(style);\n}\n\n/** Where a thread's Open source goes: its own lines when it has them, else its block's. */\nfunction threadSource(thread: LocatedThread, entry: { anchor: Anchor }): Anchor {\n if (thread.lines === undefined || (thread.kind === \"review\" && thread.side === \"LEFT\")) {\n return entry.anchor;\n }\n return {\n source: formatSource({ path: thread.path, first: thread.lines.first, last: thread.lines.last }),\n via: entry.anchor.via,\n };\n}\n"]}
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../../src/overlay/overlay.ts"],"names":[],"mappings":"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","sourcesContent":["// The review overlay: a pull request's threads beside the blocks of a rendered\n// page. It reads the page's source anchors to find each thread's block, gets\n// everything else from its host (`OverlayHost`), and draws in shadow roots of\n// its own, so the page's styles and the overlay's stay apart:\n//\n// - above the page, the threads with no block on it (detached);\n// - over the page, in a layer: at wide widths, a column of threads beside the\n// page, each aligned with its block, with a line between them on hover and\n// focus; at narrow widths, the panel a block's count marker opens; and the\n// dialogs (submit, all comments);\n// - below the page, a bar while there are unsent comments;\n// - in the page, on the block under the pointer or focus, a Comment button,\n// at narrow widths a count marker on each block with threads, and on a\n// tab's label and a `<details>`' summary how many comments they hold. These are\n// elements with `data-ascribe-ui`, as the marks' are, each holding a shadow\n// root, so they sit in the page's reading and tab order.\n//\n// Comment bodies are rendered by `markdown.ts`, as DOM nodes.\nimport { findBlock, goTo, reveal, tabButton, titleNodes } from \"../marks/index.js\";\nimport { anchorKey, formatSource, type Anchor } from \"../place/anchor.js\";\nimport type { LocatedThread } from \"../place/place.js\";\nimport { renderMarkdown } from \"./markdown.js\";\nimport { OVERLAY_CSS } from \"./style.js\";\nimport {\n authorName,\n blockText,\n hasUnsent,\n initials,\n linesLabel,\n listLabel,\n onRemovedText,\n plural,\n relativeTime,\n whereLabel,\n} from \"./text.js\";\nimport type {\n CommentTarget,\n HostError,\n OverlayData,\n OverlayHost,\n PromptRequest,\n ReviewEvent,\n ThreadSummary,\n} from \"./types.js\";\nimport {\n DATA_CHANGE,\n DATA_OVERLAY,\n DATA_SHOW,\n DATA_SOURCE,\n DATA_UI,\n DATA_VIA,\n DATA_WAS_SOURCE,\n ELEMENT_TAB,\n} from \"../names.js\";\n\n/** Options for `createOverlay`. */\nexport interface OverlayOptions {\n /** The rendered page, with source anchors. */\n root: HTMLElement;\n host: OverlayHost;\n /**\n * The least width, in pixels, of the page's container at which threads\n * show in a column beside the page. Narrower, each block with threads gets\n * a count marker that opens a panel. Default 600.\n */\n columnAt?: number;\n /** Called after the overlay redraws: for a host showing the thread count. */\n onUpdate?: () => void;\n /**\n * Whether to draw the bar of unsent comments below the page. Default true.\n * A host that shows the count itself (`unsentCount`) turns it off and opens\n * the submit dialog with `submitReview`.\n */\n unsentBar?: boolean;\n}\n\n/** The overlay on one page. */\nexport interface Overlay {\n /** Reads the threads again from the host and redraws. */\n refresh(): Promise<void>;\n /** Places the threads again, after the page changed size or what it shows. */\n layout(): void;\n /** Goes to a thread on this page, now or once the threads are read. Whether it's on the page. */\n goToThread(threadId: string): boolean;\n /** Opens the list of every thread on the pull request's pages. */\n showAllComments(): void;\n /** How many threads the pull request has on its pages, once read. */\n threadCount(): number | undefined;\n /** How many comments are unsent, once read. */\n unsentCount(): number | undefined;\n /**\n * Where the column of threads starts, in the viewport's pixels from its\n * left, while it shows: for a host that keeps its own controls clear of it.\n */\n columnStart(): number | undefined;\n /** Opens the submit dialog, when there's something to submit. */\n submitReview(): void;\n /** Removes the overlay and everything it put on the page. */\n dispose(): void;\n}\n\nconst COLUMN_WIDTH = 250;\nconst COLUMN_GAP = 12;\nconst MARKER_ROOM = \"44px\";\n\n/** A block with threads, or one being commented on, in the page's order. */\ninterface Entry {\n key: string;\n anchor: Anchor;\n threads: LocatedThread[];\n /** On removed text: the block is the marks' stand-in for what was removed. */\n removed: boolean;\n element: HTMLElement | null;\n}\n\ninterface Composer {\n key: string;\n anchor: Anchor;\n /** `undefined` while the host works it out. */\n target: CommentTarget | undefined;\n busy: boolean;\n error: string | undefined;\n}\n\ntype Filter = \"open\" | \"resolved\" | \"detached\" | \"unsent\";\n\nconst EVENTS: [ReviewEvent, string][] = [\n [\"COMMENT\", \"Comment\"],\n [\"APPROVE\", \"Approve\"],\n [\"REQUEST_CHANGES\", \"Request changes\"],\n];\n\n/** Puts the review overlay on a rendered page. */\nexport function createOverlay(options: OverlayOptions): Overlay {\n return new ReviewOverlay(options);\n}\n\nclass ReviewOverlay implements Overlay {\n private readonly root: HTMLElement;\n private readonly host: OverlayHost;\n private readonly doc: Document;\n private readonly columnAt: number;\n private readonly onUpdate: (() => void) | undefined;\n private readonly unsentBar: boolean;\n\n private readonly beforeHost: HTMLElement;\n private readonly afterHost: HTMLElement;\n private readonly layerHost: HTMLElement;\n private readonly toolsHost: HTMLElement;\n private readonly before: ShadowRoot;\n private readonly after: ShadowRoot;\n private readonly layer: ShadowRoot;\n private readonly tools: ShadowRoot;\n private readonly live: HTMLElement;\n\n private data: OverlayData | undefined;\n private all: ThreadSummary[] | undefined;\n private entries: Entry[] = [];\n private wide = true;\n private loadSeq = 0;\n private composer: Composer | undefined;\n private panel: string | undefined;\n /** The block the panel is for, which may have no threads yet. */\n private panelAnchor: Anchor | undefined;\n private dialog: \"submit\" | \"all\" | undefined;\n private discardAsk = false;\n private submitting = false;\n private dialogError: string | undefined;\n private filter: Filter = \"open\";\n private event: ReviewEvent = \"COMMENT\";\n private readonly expanded = new Set<string>();\n private readonly original = new Set<string>();\n private readonly drafts = new Map<string, string>();\n private readonly busy = new Set<string>();\n private readonly errors = new Map<string, string>();\n private linked: string | undefined;\n /** Which entries were hidden in the page when last drawn. */\n private drawnHidden = \"\";\n private linkTimer: ReturnType<typeof setTimeout> | undefined;\n private pendingGoTo: string | undefined;\n /** The read whose threads are drawn. */\n private loaded = 0;\n /** The block the Comment button is on. */\n private toolsOn: HTMLElement | undefined;\n /** What had focus before a dialog or the panel opened, to give it back. */\n private opener: HTMLElement | undefined;\n /** The page's blocks this overlay made focusable, and the blocks it made room on. */\n private focusable: HTMLElement[] = [];\n private padded: { element: HTMLElement; before: string }[] = [];\n private markers: { host: HTMLElement; block: HTMLElement }[] = [];\n /** The comment counts on tabs' labels and `<details>`' summaries. */\n private hints: HTMLElement[] = [];\n private containerPosition: string | undefined;\n /** The padding below the page for the column to end in, in pixels. */\n private room = 0;\n private readonly cleanups: (() => void)[] = [];\n private disposed = false;\n\n constructor(options: OverlayOptions) {\n this.root = options.root;\n this.host = options.host;\n this.doc = this.root.ownerDocument;\n this.columnAt = options.columnAt ?? 600;\n this.onUpdate = options.onUpdate;\n this.unsentBar = options.unsentBar ?? true;\n\n this.beforeHost = this.uiHost(\"div\");\n this.afterHost = this.uiHost(\"div\");\n this.layerHost = this.uiHost(\"div\");\n this.toolsHost = this.uiHost(\"span\");\n this.before = this.shadow(this.beforeHost);\n this.after = this.shadow(this.afterHost);\n this.layer = this.shadow(this.layerHost);\n this.tools = this.shadow(this.toolsHost);\n\n const container = this.container();\n if (this.doc.defaultView?.getComputedStyle(container).position === \"static\") {\n this.containerPosition = container.style.position;\n container.style.position = \"relative\";\n }\n this.root.before(this.beforeHost);\n this.root.after(this.afterHost);\n this.afterHost.after(this.layerHost);\n Object.assign(this.afterHost.style, { position: \"sticky\", bottom: \"0\", zIndex: \"3\" });\n Object.assign(this.layerHost.style, {\n position: \"absolute\",\n top: \"0\",\n left: \"0\",\n width: \"100%\",\n height: \"100%\",\n pointerEvents: \"none\",\n });\n Object.assign(this.toolsHost.style, { position: \"absolute\", zIndex: \"2\" });\n this.toolsHost.hidden = true;\n\n this.live = this.el(\"div\", \"sr-only\");\n this.live.setAttribute(\"role\", \"status\");\n this.live.setAttribute(\"aria-live\", \"polite\");\n this.layer.append(this.live);\n\n this.listen();\n this.host.onDidChange(() => {\n if (!this.disposed) void this.refresh();\n });\n void this.refresh();\n }\n\n // --- Public ---\n\n async refresh(): Promise<void> {\n const seq = ++this.loadSeq;\n let data: OverlayData;\n let all: ThreadSummary[] | undefined;\n try {\n [data, all] = await Promise.all([\n this.host.load(),\n this.host.allThreads().catch(() => undefined),\n ]);\n } catch (error) {\n if (seq !== this.loadSeq || this.disposed) return;\n this.announce(messageOf(error));\n return;\n }\n if (seq !== this.loadSeq || this.disposed) return;\n this.data = data;\n this.loaded = seq;\n if (all !== undefined) this.all = all;\n this.render();\n const goal = this.pendingGoTo;\n if (goal !== undefined) {\n this.pendingGoTo = undefined;\n this.goToThread(goal);\n }\n }\n\n layout(): void {\n if (this.disposed || this.data === undefined) return;\n // Crossing the column's width, or a tab or `<details>` showing or hiding\n // a block with threads, changes what's drawn, not only where.\n if (this.measureWide() !== this.wide || this.hiddenState() !== this.drawnHidden) {\n this.render();\n return;\n }\n this.place();\n }\n\n goToThread(threadId: string): boolean {\n // Until the threads being read arrive: the page may have just changed.\n if (this.data === undefined || this.loaded !== this.loadSeq) {\n this.pendingGoTo = threadId;\n return true;\n }\n const entry = this.entries.find((e) => e.threads.some((t) => t.id === threadId));\n const detached = this.data.threads.detached.some((t) => t.id === threadId);\n if (entry === undefined && !detached) return false;\n this.dialog = undefined;\n this.expanded.add(threadId);\n if (entry?.element) {\n reveal(entry.element);\n if (!this.wide) {\n this.panel = entry.key;\n this.panelAnchor = entry.removed ? undefined : entry.anchor;\n }\n this.render();\n goTo(entry.element);\n if (this.wide) this.link(entry.key, 1800);\n } else {\n this.render();\n }\n const card = this.findCard(threadId);\n if (card) {\n if (typeof card.scrollIntoView === \"function\" && !entry?.element) {\n card.scrollIntoView({ block: \"center\" });\n }\n card.focus({ preventScroll: true });\n }\n return true;\n }\n\n showAllComments(): void {\n this.openDialog(\"all\");\n }\n\n threadCount(): number | undefined {\n return this.all?.length;\n }\n\n unsentCount(): number | undefined {\n return this.data?.pending.count;\n }\n\n columnStart(): number | undefined {\n if (this.disposed || !this.wide || this.data === undefined) return undefined;\n return this.root.getBoundingClientRect().right + COLUMN_GAP;\n }\n\n submitReview(): void {\n if ((this.data?.pending.count ?? 0) > 0) this.openDialog(\"submit\");\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n for (const cleanup of this.cleanups) cleanup();\n this.undecorate();\n this.beforeHost.remove();\n this.afterHost.remove();\n this.layerHost.remove();\n this.toolsHost.remove();\n if (this.containerPosition !== undefined) {\n this.container().style.position = this.containerPosition;\n }\n this.root.style.removeProperty(\"margin-inline-end\");\n this.makeRoom(0);\n if (this.linkTimer) clearTimeout(this.linkTimer);\n }\n\n // --- Setup ---\n\n private container(): HTMLElement {\n return this.root.parentElement ?? this.doc.body;\n }\n\n private uiHost(tag: \"div\" | \"span\"): HTMLElement {\n const host = this.doc.createElement(tag);\n host.setAttribute(DATA_UI, \"\");\n host.setAttribute(DATA_OVERLAY, \"\");\n return host;\n }\n\n private shadow(host: HTMLElement): ShadowRoot {\n const shadow = host.attachShadow({ mode: \"open\" });\n adoptStyles(shadow, this.doc);\n return shadow;\n }\n\n private listen(): void {\n const on = <K extends keyof HTMLElementEventMap>(\n target: HTMLElement | ShadowRoot | Window,\n type: K,\n handler: (event: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n ): void => {\n target.addEventListener(type, handler as EventListener, options);\n this.cleanups.push(() => target.removeEventListener(type, handler as EventListener, options));\n };\n on(this.root, \"mouseover\", (event) => this.pointAt(event.target));\n on(this.root, \"focusin\", (event) => this.pointAt(event.target));\n on(this.root, \"mouseout\", (event) => {\n const to = event.relatedTarget;\n if (to instanceof Node && this.toolsOn?.contains(to)) return;\n if (to instanceof Node && (this.toolsHost.contains(to) || to === this.toolsHost)) return;\n if (!this.toolsOn?.contains(this.doc.activeElement)) this.hideTools();\n this.link(undefined);\n });\n on(this.root, \"focusout\", (event) => {\n const to = event.relatedTarget;\n if (to instanceof Node && this.toolsOn?.contains(to)) return;\n this.hideTools();\n this.link(undefined);\n });\n on(this.root, \"click\", (event) => this.clickBlock(event));\n on(this.root, \"keydown\", (event) => this.keyOnBlock(event));\n // A tab or a `<details>` in the page changed what shows: place again.\n on(this.root, \"toggle\", () => this.layout(), { capture: true });\n on(this.root, \"click\", () => requestFrame(this.doc, () => this.layout()));\n for (const shadow of [this.before, this.after, this.layer, this.tools]) {\n on(shadow, \"click\", (event) => this.clickLink(event));\n on(shadow, \"keydown\", (event) => this.keyInOverlay(event));\n on(shadow, \"dblclick\", (event) => event.stopPropagation());\n }\n const view = this.doc.defaultView;\n if (view) on(view, \"resize\", () => this.layout());\n if (view && \"ResizeObserver\" in view) {\n // Placed in the next frame: placing can pad the page, which resizes\n // what's observed, and doing that inside the observer's callback is a\n // \"ResizeObserver loop\" error on the page (a dev server reports it).\n let queued = false;\n const observer = new view.ResizeObserver(() => {\n if (queued) return;\n queued = true;\n requestFrame(this.doc, () => {\n queued = false;\n this.layout();\n });\n });\n observer.observe(this.root);\n observer.observe(this.container());\n this.cleanups.push(() => observer.disconnect());\n }\n }\n\n // --- Reading the page ---\n\n private measureWide(): boolean {\n return this.container().clientWidth >= this.columnAt;\n }\n\n private anchorOf(element: Element): Anchor | undefined {\n const source = element.getAttribute(DATA_SOURCE);\n if (source === null) return undefined;\n const via = (element.getAttribute(DATA_VIA) ?? \"\").split(\" \").filter(Boolean);\n return { source, via };\n }\n\n /** The block an event's target is in: the innermost anchored element. */\n private blockOf(target: EventTarget | null): HTMLElement | undefined {\n if (!(target instanceof Element)) return undefined;\n if (target.closest(`[${DATA_OVERLAY}]`) && target !== this.toolsHost) {\n // A marker: the block it's on.\n const marker = this.markers.find((m) => m.host === target.closest(`[${DATA_OVERLAY}]`));\n if (marker) return marker.block;\n }\n const block = target.closest<HTMLElement>(`[${DATA_SOURCE}]`);\n return block && this.root.contains(block) ? block : undefined;\n }\n\n /** The block's text as the page shows it, for a comment to quote. */\n private shownText(anchor: Anchor): string | undefined {\n const key = anchorKey(anchor);\n for (const el of Array.from(this.root.querySelectorAll<HTMLElement>(`[${DATA_SOURCE}]`))) {\n const at = this.anchorOf(el);\n if (at && anchorKey(at) === key) return blockText(el) || undefined;\n }\n return undefined;\n }\n\n private removedElement(anchor: Anchor): HTMLElement | null {\n for (const el of Array.from(this.root.querySelectorAll<HTMLElement>(`[${DATA_WAS_SOURCE}]`))) {\n if (el.getAttribute(DATA_WAS_SOURCE) === anchor.source) return el;\n }\n return null;\n }\n\n private readEntries(): Entry[] {\n const data = this.data;\n if (!data) return [];\n const entries: Entry[] = [];\n for (const { anchor, threads } of data.threads.blocks) {\n entries.push({\n key: anchorKey(anchor),\n anchor,\n threads,\n removed: false,\n element: findBlock(this.root, anchor),\n });\n }\n for (const { anchor, threads } of data.threads.removed) {\n entries.push({\n key: `removed ${anchorKey(anchor)}`,\n anchor,\n threads,\n removed: true,\n element: this.removedElement(anchor),\n });\n }\n // A block being commented on, or whose panel is open, may have no threads yet.\n for (const anchor of [this.composer?.anchor, this.panelAnchor]) {\n if (anchor === undefined) continue;\n const key = anchorKey(anchor);\n if (entries.some((e) => e.key === key)) continue;\n entries.push({\n key,\n anchor,\n threads: [],\n removed: false,\n element: findBlock(this.root, anchor),\n });\n }\n // Page order.\n entries.sort((a, b) => {\n if (!a.element || !b.element || a.element === b.element) return 0;\n return a.element.compareDocumentPosition(b.element) & Node.DOCUMENT_POSITION_FOLLOWING\n ? -1\n : 1;\n });\n return entries;\n }\n\n /** Whether what the page shows hides a block: removed text in \"as it will be\", new text in \"as it was\". */\n private hiddenByShow(element: HTMLElement): boolean {\n const show = this.root.getAttribute(DATA_SHOW);\n const kind = element.closest(`[${DATA_CHANGE}]`)?.getAttribute(DATA_CHANGE);\n if (show === \"will\") return kind === \"removed\" || kind === \"moved-from\";\n if (show === \"was\") return kind === \"added\" || kind === \"moved\";\n return false;\n }\n\n /** Where a block is hidden in the page: an unselected tab or a closed `<details>`. */\n private hiddenIn(element: HTMLElement): string | undefined {\n for (\n let node: HTMLElement | null = element.parentElement;\n node !== null && node !== this.root.parentElement;\n node = node.parentElement\n ) {\n if (node.localName === ELEMENT_TAB && node.hidden) {\n return `In the ${node.getAttribute(\"label\") ?? \"\"} tab, which isn't showing.`;\n }\n if (node.localName === \"details\" && !(node as HTMLDetailsElement).open) {\n const summary = node.querySelector(\":scope > summary\");\n if (summary?.contains(element)) continue;\n return `Inside “${summary ? blockText(summary) : \"\"}”, which is closed.`;\n }\n }\n return undefined;\n }\n\n private hiddenState(): string {\n return this.entries\n .map((e) => (e.element && (this.hiddenIn(e.element) || this.hiddenByShow(e.element)) ? 1 : 0))\n .join(\"\");\n }\n\n /**\n * The element to align a block's threads with: the block, or, while it's\n * in an unselected tab or a closed `<details>`, the tabs or the details.\n */\n private visibleFor(element: HTMLElement | null): HTMLElement | null {\n let shown = element;\n for (\n let node = element?.parentElement ?? null;\n node !== null && node !== this.root;\n node = node.parentElement\n ) {\n if (node.localName === ELEMENT_TAB && node.hidden) shown = node.parentElement;\n if (node.localName === \"details\" && !(node as HTMLDetailsElement).open) {\n const summary = node.querySelector(\":scope > summary\");\n if (!(shown && summary?.contains(shown))) shown = node;\n }\n }\n return shown;\n }\n\n // --- Drawing ---\n\n private render(): void {\n if (this.disposed) return;\n const focus = this.focusKey();\n this.wide = this.measureWide();\n this.entries = this.readEntries();\n if (this.panel !== undefined && !this.entries.some((e) => e.key === this.panel)) {\n this.panel = undefined;\n this.panelAnchor = undefined;\n }\n this.drawnHidden = this.hiddenState();\n this.decorate();\n this.before.replaceChildren(...this.styleNodes(this.before), ...this.drawDetached());\n this.after.replaceChildren(...this.styleNodes(this.after), ...this.drawUnsentBar());\n const layer = this.el(\"div\", \"layer\");\n if (this.wide) layer.append(...this.drawColumn());\n const sheet = this.wide ? null : this.drawSheet();\n if (sheet) layer.append(sheet);\n const dialog = this.drawDialog();\n if (dialog) layer.append(dialog);\n this.layer.replaceChildren(...this.styleNodes(this.layer), layer, this.live);\n this.drawTools();\n this.restoreFocus(focus);\n this.place();\n this.onUpdate?.();\n }\n\n /** A `<style>` element where constructed stylesheets aren't available. */\n private styleNodes(shadow: ShadowRoot): Node[] {\n return Array.from(shadow.children).filter(\n (child) => child.localName === \"style\" && child.hasAttribute(\"data-overlay\"),\n );\n }\n\n /** Makes the page's blocks focusable, and at narrow widths puts count markers on them. */\n private decorate(): void {\n this.undecorate();\n const threadsOn = this.data !== undefined;\n if (!threadsOn) {\n this.root.style.removeProperty(\"margin-inline-end\");\n return;\n }\n if (this.wide)\n this.root.style.setProperty(\"margin-inline-end\", `${COLUMN_WIDTH + COLUMN_GAP}px`);\n else this.root.style.removeProperty(\"margin-inline-end\");\n for (const el of Array.from(this.root.querySelectorAll<HTMLElement>(`[${DATA_SOURCE}]`))) {\n if (el.hasAttribute(\"tabindex\")) continue;\n el.tabIndex = 0;\n this.focusable.push(el);\n }\n this.drawHints();\n if (this.wide) return;\n for (const entry of this.entries) {\n const count = entry.threads.length;\n if (count === 0 || !entry.element || this.hiddenByShow(entry.element)) continue;\n const host = this.uiHost(\"span\");\n Object.assign(host.style, { position: \"absolute\", zIndex: \"1\" });\n const shadow = this.shadow(host);\n const marker = this.button(\"marker\", String(count), () => this.openEntry(entry));\n marker.setAttribute(\n \"aria-label\",\n `${plural(count, \"comment\")} on this block. Show ${count === 1 ? \"it\" : \"them\"}.`,\n );\n marker.setAttribute(\"aria-haspopup\", \"dialog\");\n shadow.append(marker);\n // A block in a closed `<details>` or an unselected tab has its marker\n // on what shows in its place; its panel says where it is.\n const element = this.visibleFor(entry.element) ?? entry.element;\n if (this.markers.some((m) => m.block === element)) continue;\n if (isVoid(element)) element.after(host);\n else element.append(host);\n this.markers.push({ host, block: element });\n this.padded.push({ element, before: element.style.paddingInlineEnd });\n element.style.paddingInlineEnd = MARKER_ROOM;\n }\n }\n\n /**\n * On each tab's label and each `<details>`' summary, how many comments are\n * on the blocks they can hide, which an unselected tab or a closed\n * `<details>` would otherwise keep out of sight.\n */\n private drawHints(): void {\n const counts = new Map<HTMLElement, number>();\n for (const entry of this.entries) {\n const element = entry.element;\n const count = entry.threads.length;\n if (count === 0 || !element || this.hiddenByShow(element)) continue;\n for (\n let node = element.parentElement;\n node !== null && node !== this.root;\n node = node.parentElement\n ) {\n let on: HTMLElement | null = null;\n if (node.localName === ELEMENT_TAB) on = tabButton(node);\n if (node.localName === \"details\") {\n const summary = node.querySelector<HTMLElement>(\":scope > summary\");\n if (summary && !summary.contains(element)) on = summary;\n }\n if (on) counts.set(on, (counts.get(on) ?? 0) + count);\n }\n }\n // Each count starts with a space, as the marks' hints do, so the label\n // reads \"Linux 1 change 1 comment\".\n for (const [on, count] of counts) {\n const host = this.uiHost(\"span\");\n this.shadow(host).append(this.el(\"span\", \"hint-count\", ` ${plural(count, \"comment\")}`));\n on.append(host);\n this.hints.push(host);\n }\n }\n\n private undecorate(): void {\n for (const host of this.hints) host.remove();\n this.hints = [];\n for (const el of this.focusable) el.removeAttribute(\"tabindex\");\n this.focusable = [];\n for (const { element, before } of this.padded) element.style.paddingInlineEnd = before;\n this.padded = [];\n for (const { host } of this.markers) host.remove();\n this.markers = [];\n }\n\n /**\n * The text a thread was on, quoted, or in words when it's empty or can't\n * be read: an empty quote reads as a mistake.\n */\n private originalText(thread: LocatedThread): HTMLElement {\n const orig = this.el(\"div\", \"orig\");\n const quote = thread.quote?.trim() ? thread.quote : undefined;\n if (thread.detached !== undefined) {\n if (quote !== undefined) {\n orig.append(\n this.el(\"span\", \"\", \"The comment was on this text, which is no longer on the page: \"),\n this.el(\"q\", \"\", quote),\n );\n } else {\n orig.append(\n onRemovedText(thread)\n ? \"The comment was on a line that's since been removed.\"\n : \"The comment was on text that's no longer on the page.\",\n );\n }\n } else if (quote !== undefined) {\n orig.append(\n this.el(\"span\", \"\", \"The text when the comment was made: \"),\n this.el(\"q\", \"\", quote),\n );\n } else {\n orig.append(\"The text when the comment was made can't be shown.\");\n }\n return orig;\n }\n\n private drawDetached(): HTMLElement[] {\n const detached = this.data?.threads.detached ?? [];\n if (detached.length === 0) return [];\n const box = this.el(\"section\", \"detached\");\n box.setAttribute(\"aria-label\", \"Comments with no block on this page\");\n box.append(\n this.el(\n \"div\",\n \"\",\n detached.length === 1\n ? \"1 comment has no block on this page any more:\"\n : `${detached.length} comments have no block on this page any more:`,\n ),\n ...detached.map((thread) => this.card(thread, \"detached\", undefined)),\n );\n return [box];\n }\n\n private drawUnsentBar(): HTMLElement[] {\n const count = this.data?.pending.count ?? 0;\n if (count === 0 || !this.unsentBar) return [];\n const bar = this.el(\"div\", \"unsent-bar\");\n bar.setAttribute(\"role\", \"region\");\n bar.setAttribute(\"aria-label\", \"Unsent comments\");\n bar.append(\n this.el(\"b\", \"\", plural(count, \"unsent comment\")),\n this.el(\"span\", \"hint\", `Only you can see ${count === 1 ? \"it\" : \"them\"} until you submit.`),\n this.el(\"span\", \"spacer\"),\n this.button(\"primary\", \"Submit review…\", () => this.openDialog(\"submit\"), \"submit-open\"),\n );\n return [bar];\n }\n\n private drawColumn(): Element[] {\n const column = this.el(\"div\", \"column\");\n for (const entry of this.entries) {\n if (entry.element && this.hiddenByShow(entry.element)) continue;\n const cards = this.cardsFor(entry, \"column\");\n if (cards.length === 0) continue;\n const slot = this.el(\"div\", \"slot\");\n slot.dataset[\"key\"] = entry.key;\n slot.append(...cards);\n slot.addEventListener(\"mouseenter\", () => this.link(entry.key));\n slot.addEventListener(\"mouseleave\", () => this.link(undefined));\n slot.addEventListener(\"focusin\", () => this.link(entry.key));\n slot.addEventListener(\"focusout\", (event) => {\n if (!(event.relatedTarget instanceof Node && slot.contains(event.relatedTarget))) {\n this.link(undefined);\n }\n });\n column.append(slot);\n }\n const highlight = this.el(\"div\", \"highlight\");\n highlight.hidden = true;\n const svg = this.doc.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n svg.setAttribute(\"class\", \"connector\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n return [highlight, svg, column];\n }\n\n private cardsFor(entry: Entry, view: \"column\" | \"panel\"): HTMLElement[] {\n const cards = entry.threads.map((thread) => this.card(thread, view, entry));\n if (this.composer?.key === entry.key) cards.push(this.drawComposer(this.composer));\n return cards;\n }\n\n private drawSheet(): HTMLElement | null {\n const entry = this.entries.find((e) => e.key === this.panel);\n if (!entry) return null;\n const sheet = this.el(\"div\", \"sheet\");\n sheet.setAttribute(\"role\", \"dialog\");\n sheet.setAttribute(\"aria-label\", \"Comments on this block\");\n const head = this.el(\"div\", \"head\");\n head.append(\n this.el(\"b\", \"\", entry.removed ? \"Removed text\" : sourceLabel(entry.anchor)),\n this.el(\"span\", \"spacer\"),\n );\n if (!entry.removed) {\n head.append(this.button(\"ghost\", \"Source\", () => this.host.openSource(entry.anchor)));\n if (this.composer?.key !== entry.key) {\n head.append(this.button(\"ghost\", \"Comment\", () => this.startComment(entry.anchor)));\n }\n }\n head.append(this.button(\"ghost\", \"Close\", () => this.closePanel(), \"panel-close\"));\n sheet.append(head);\n const cards = this.cardsFor(entry, \"panel\");\n if (cards.length === 0) sheet.append(this.el(\"p\", \"hint\", \"No comments on this block yet.\"));\n sheet.append(...cards);\n return sheet;\n }\n\n private card(\n thread: LocatedThread,\n view: \"column\" | \"panel\" | \"detached\",\n entry: Entry | undefined,\n ): HTMLElement {\n const data = this.data;\n const viewer = data?.viewer ?? \"\";\n const collapsed = thread.resolved && !this.expanded.has(thread.id);\n const card = this.el(\"article\", `thread${collapsed ? \" collapsed\" : \"\"}`);\n card.dataset[\"thread\"] = thread.id;\n card.dataset[\"focus\"] = `thread:${thread.id}`;\n card.tabIndex = -1;\n const first = thread.comments[0];\n card.setAttribute(\n \"aria-label\",\n `Comment by ${first ? authorName(first.author, viewer) : \"someone\"} on ${whereLabel(thread)}`,\n );\n\n const head = this.el(\"div\", \"th\");\n const where = whereLabel(thread);\n // In the narrow panel, the sheet's title already names the block.\n if (!(view === \"panel\" && entry && !entry.removed && where === sourceLabel(entry.anchor))) {\n head.append(this.el(\"span\", \"\", where));\n }\n // One label for where the thread stands against the page, the most\n // specific: on removed text says why a thread is detached, and a\n // detached thread is past being outdated.\n if (onRemovedText(thread)) head.append(this.badge(\"removed\", \"On removed text\"));\n else if (thread.detached !== undefined) head.append(this.badge(\"detached\", \"Detached\"));\n else if (thread.outdated) head.append(this.badge(\"outdated\", \"Outdated\"));\n if (thread.resolved) head.append(this.badge(\"resolved\", \"Resolved\"));\n if (thread.kind === \"conversation\") head.append(this.badge(\"summary\", \"In the review summary\"));\n if (hasUnsent(thread)) head.append(this.badge(\"unsent\", \"Unsent\"));\n if (head.childElementCount > 0) card.append(head);\n\n // Actions sit on their own row, so the header never pushes one onto a line by itself.\n const acts = this.el(\"div\", \"acts\");\n if (thread.resolved) {\n acts.append(\n this.button(\n \"link\",\n collapsed ? \"Expand\" : \"Collapse\",\n () => {\n if (collapsed) this.expanded.add(thread.id);\n else this.expanded.delete(thread.id);\n this.render();\n },\n `expand:${thread.id}`,\n ),\n );\n }\n if (thread.outdated && thread.detached === undefined && thread.quote !== undefined) {\n const open = this.original.has(thread.id);\n acts.append(\n this.button(\n \"link\",\n open ? \"Hide original text\" : \"Original text\",\n () => {\n if (open) this.original.delete(thread.id);\n else this.original.add(thread.id);\n this.render();\n },\n `original:${thread.id}`,\n ),\n );\n }\n if (entry && !entry.removed) {\n acts.append(\n this.button(\"link\", \"Open source\", () => this.host.openSource(threadSource(thread, entry))),\n );\n }\n if (this.host.promptAgent) {\n const prompt = this.button(\n \"link\",\n \"Prompt agent\",\n () => void this.promptAgent({ kind: \"thread\", threadId: thread.id }),\n `prompt:${thread.id}`,\n );\n prompt.title = \"Prompt agent: address this comment\";\n acts.append(prompt);\n }\n // A detached thread has no block to go to: GitHub shows it in full.\n const url = thread.comments.at(-1)?.url ?? thread.comments[0]?.url;\n if (thread.detached !== undefined && url !== undefined && /^https?:\\/\\//i.test(url)) {\n const github = this.el(\"a\", \"link\", \"View on GitHub\");\n github.setAttribute(\"href\", url);\n github.setAttribute(\"target\", \"_blank\");\n github.setAttribute(\"rel\", \"noopener noreferrer\");\n acts.append(github);\n }\n if (thread.kind === \"review\") {\n const can = thread.resolved ? thread.canUnresolve : thread.canResolve;\n if (can) {\n const resolve = this.button(\n \"link\",\n thread.resolved ? \"Reopen\" : \"Resolve\",\n () => void this.resolve(thread),\n `resolve:${thread.id}`,\n );\n resolve.title = \"Sent to GitHub right away, not held with your review\";\n resolve.disabled = this.busy.has(thread.id);\n acts.append(resolve);\n }\n }\n if (acts.childElementCount > 0) card.append(acts);\n\n const hidden = view !== \"detached\" && entry?.element ? this.hiddenIn(entry.element) : undefined;\n if (hidden && entry?.element) {\n const element = entry.element;\n const inside = this.el(\"div\", \"inside\", `${hidden} `);\n inside.append(\n this.button(\"link\", \"Show it\", () => {\n reveal(element);\n this.render();\n goTo(element);\n this.link(entry.key, 1800);\n }),\n );\n card.append(inside);\n }\n if (collapsed) return card;\n\n if (thread.detached !== undefined || this.original.has(thread.id)) {\n card.append(this.originalText(thread));\n }\n\n const now = Date.now();\n for (const comment of thread.comments) {\n const row = this.el(\"div\", \"comment\");\n const avatar = this.el(\"span\", \"avatar\", initials(comment.author));\n avatar.setAttribute(\"aria-hidden\", \"true\");\n const text = this.el(\"div\", \"\");\n text.append(\n this.el(\"span\", \"who\", authorName(comment.author, viewer)),\n this.el(\n \"span\",\n \"when\",\n comment.pending ? \"not sent yet\" : relativeTime(comment.createdAt, now),\n ),\n );\n const body = this.el(\"div\", \"body\");\n body.append(renderMarkdown(this.doc, comment.body));\n text.append(body);\n row.append(avatar, text);\n card.append(row);\n }\n\n if (thread.kind === \"review\" && thread.canReply) {\n card.append(this.drawReply(thread));\n }\n return card;\n }\n\n private drawReply(thread: LocatedThread): HTMLElement {\n const key = `reply:${thread.id}`;\n const box = this.el(\"div\", \"reply\");\n const input = this.doc.createElement(\"textarea\");\n input.rows = 1;\n input.placeholder = \"Reply…\";\n input.setAttribute(\"aria-label\", \"Reply to thread\");\n input.dataset[\"focus\"] = key;\n input.value = this.drafts.get(key) ?? \"\";\n const busy = this.busy.has(thread.id);\n input.disabled = busy;\n input.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\" && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n void this.reply(thread, \"withReview\");\n }\n });\n const held = (this.data?.pending.count ?? 0) > 0;\n const now = this.button(\n \"ghost\",\n \"Reply now\",\n () => {\n if (held) {\n this.announce(HELD_REASON);\n return;\n }\n void this.reply(thread, \"now\");\n },\n `reply-now:${thread.id}`,\n );\n // GitHub adds every reply to the review while it has unsent comments, so\n // a reply can't go at once until it's submitted or discarded. The button\n // stays focusable, so the reason can be read.\n if (held) {\n now.setAttribute(\"aria-disabled\", \"true\");\n now.title = HELD_REASON;\n const reason = this.el(\"span\", \"sr-only\", HELD_REASON);\n reason.id = `held-${cssId(thread.id)}`;\n now.setAttribute(\"aria-describedby\", reason.id);\n box.append(reason);\n } else {\n now.title = \"Send this reply to GitHub right away\";\n }\n const add = this.button(\n \"ghost\",\n \"Add to review\",\n () => void this.reply(thread, \"withReview\"),\n `reply-add:${thread.id}`,\n );\n add.title = \"Hold this reply until you submit the review\";\n // Nothing to send until there's a reply. \"Reply now\" stays focusable\n // while it's held, so its reason can be read.\n const enable = () => {\n const empty = input.value.trim() === \"\";\n now.disabled = busy || (empty && !held);\n add.disabled = busy || empty;\n };\n enable();\n input.addEventListener(\"input\", () => {\n this.drafts.set(key, input.value);\n enable();\n });\n box.prepend(input);\n box.append(now, add);\n const error = this.errors.get(key);\n if (error) {\n const line = this.el(\"div\", \"error\", error);\n line.setAttribute(\"role\", \"alert\");\n box.append(line);\n }\n return box;\n }\n\n private drawComposer(composer: Composer): HTMLElement {\n const key = `comment:${composer.key}`;\n const box = this.el(\"div\", \"composer\");\n box.setAttribute(\"role\", \"group\");\n box.setAttribute(\"aria-label\", `Comment on ${sourceLabel(composer.anchor)}`);\n const target = composer.target;\n const refused = target?.kind === \"push-first\";\n if (target === undefined)\n box.append(this.el(\"div\", \"hint\", \"Checking where this comment can go…\"));\n if (target?.kind === \"summary\") {\n box.append(\n this.el(\n \"div\",\n \"hint\",\n target.reason === \"file\"\n ? \"This page's file isn't in the pull request, so GitHub can't put a comment on its lines. Your comment will go in your review's summary and still show here.\"\n : \"GitHub only takes comments on the lines a pull request changes and the few around them. Your comment will go in your review's summary and still show here.\",\n ),\n );\n }\n if (target?.kind === \"push-first\") {\n const refuse = this.el(\"div\", \"refuse\", target.message);\n refuse.setAttribute(\"role\", \"alert\");\n box.append(refuse);\n }\n const text = this.doc.createElement(\"textarea\");\n text.setAttribute(\"aria-label\", \"Comment\");\n text.placeholder = `Comment on ${sourceLabel(composer.anchor)}`;\n text.dataset[\"focus\"] = key;\n text.value = this.drafts.get(key) ?? \"\";\n text.disabled = refused || composer.busy;\n text.addEventListener(\"keydown\", (event) => {\n if (event.key === \"Enter\" && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n void this.addComment();\n }\n });\n box.append(text);\n if (composer.error) {\n const error = this.el(\"div\", \"error\", composer.error);\n error.setAttribute(\"role\", \"alert\");\n box.append(error);\n }\n const row = this.el(\"div\", \"row\");\n const add = this.button(\n \"primary\",\n \"Add to review\",\n () => void this.addComment(),\n \"composer-add\",\n );\n const enable = () => {\n add.disabled = refused || composer.busy || target === undefined || text.value.trim() === \"\";\n };\n enable();\n text.addEventListener(\"input\", () => {\n this.drafts.set(key, text.value);\n enable();\n });\n row.append(\n add,\n this.button(\"ghost\", \"Cancel\", () => this.cancelComment(), \"composer-cancel\"),\n );\n if (!refused)\n row.append(this.el(\"span\", \"hint\", \"Nothing is sent until you submit the review.\"));\n box.append(row);\n return box;\n }\n\n private drawDialog(): HTMLElement | null {\n const data = this.data;\n if (!data || this.dialog === undefined) return null;\n const backdrop = this.el(\"div\", \"backdrop\");\n backdrop.addEventListener(\"click\", (event) => {\n if (event.target === backdrop) this.closeDialog();\n });\n const dialog = this.el(\"div\", \"dialog\");\n dialog.setAttribute(\"role\", \"dialog\");\n dialog.setAttribute(\"aria-modal\", \"true\");\n backdrop.append(dialog);\n if (this.dialog === \"all\") this.drawAll(dialog, data);\n else this.drawSubmit(dialog, data);\n return backdrop;\n }\n\n private drawAll(dialog: HTMLElement, data: OverlayData): void {\n dialog.setAttribute(\"aria-label\", \"All comments\");\n const head = this.el(\"div\", \"row\");\n head.append(\n this.el(\"h2\", \"\", `All comments on #${data.pullRequest.number}`),\n this.el(\"span\", \"spacer\"),\n );\n const open = this.all?.some(\n (s) => !s.thread.resolved && !s.thread.comments.every((c) => c.pending),\n );\n if (this.host.promptAgent && open) {\n const prompt = this.button(\n \"ghost\",\n \"Prompt agent: all open\",\n () => void this.promptAgent({ kind: \"open-threads\" }),\n \"prompt-all\",\n );\n prompt.title = \"A prompt for your agent to address every open comment\";\n head.append(prompt);\n }\n head.append(this.button(\"ghost\", \"Close\", () => this.closeDialog(), \"dialog-close\"));\n dialog.append(head);\n const all = this.all;\n if (all === undefined) {\n dialog.append(this.el(\"p\", \"hint\", \"Reading the comments…\"));\n return;\n }\n const groups: Record<Filter, ThreadSummary[]> = {\n open: all.filter((s) => !s.thread.resolved && s.thread.detached === undefined),\n resolved: all.filter((s) => s.thread.resolved),\n detached: all.filter((s) => s.thread.detached !== undefined),\n unsent: all.filter((s) => hasUnsent(s.thread)),\n };\n const filters = this.el(\"div\", \"segmented\");\n filters.setAttribute(\"role\", \"group\");\n filters.setAttribute(\"aria-label\", \"Filter\");\n for (const [filter, label] of [\n [\"open\", \"Open\"],\n [\"resolved\", \"Resolved\"],\n [\"detached\", \"Detached\"],\n [\"unsent\", \"Unsent\"],\n ] as const) {\n const choice = this.button(\n \"\",\n `${label} ${groups[filter].length}`,\n () => {\n this.filter = filter;\n this.render();\n },\n `filter:${filter}`,\n );\n choice.setAttribute(\"aria-pressed\", String(this.filter === filter));\n filters.append(choice);\n }\n dialog.append(filters);\n const list = this.el(\"ul\", \"thread-list\");\n for (const summary of groups[this.filter]) {\n const { thread, pages } = summary;\n const first = thread.comments[0];\n const only = pages.length === 1 ? pages[0] : undefined;\n const page = only\n ? titleNodes(only.formatted_title, only.title ?? only.path, this.doc)\n : pages.length > 1\n ? [`on ${pages.length} pages`]\n : [];\n // As on its card: a thread with no block is detached, not outdated.\n const outdated = thread.outdated && thread.detached === undefined;\n const where = this.el(\"span\", \"where\");\n where.append([listLabel(thread), outdated ? \"outdated\" : \"\"].filter(Boolean).join(\" · \"));\n if (page.length > 0) {\n if (where.textContent) where.append(\" · \");\n where.append(...page);\n }\n const more = thread.comments.length > 1 ? ` (+${thread.comments.length - 1})` : \"\";\n const item = this.el(\"li\", \"\");\n const jump = this.button(\"\", \"\", () => this.jump(summary), `jump:${thread.id}`);\n jump.append(\n where,\n this.el(\n \"span\",\n \"first\",\n first ? `${authorName(first.author, data.viewer)}: ${oneLine(first.body)}${more}` : \"\",\n ),\n );\n item.append(jump);\n list.append(item);\n }\n if (groups[this.filter].length === 0) list.append(this.el(\"li\", \"hint\", \"None.\"));\n dialog.append(list);\n }\n\n private drawSubmit(dialog: HTMLElement, data: OverlayData): void {\n dialog.setAttribute(\"aria-label\", \"Submit review\");\n const count = data.pending.count;\n dialog.append(this.el(\"h2\", \"\", `Submit review to #${data.pullRequest.number}`));\n if (count > 0) {\n dialog.append(\n this.el(\n \"span\",\n \"hint\",\n count === 1 ? \"This one will be sent:\" : `These ${count} will be sent:`,\n ),\n );\n const list = this.el(\"ul\", \"unsent-list\");\n for (const summary of this.all ?? []) {\n const { thread } = summary;\n thread.comments.forEach((comment, index) => {\n if (!comment.pending) return;\n const item = this.el(\"li\", \"\");\n item.append(this.button(\"link\", listLabel(thread), () => this.jump(summary)));\n const how =\n index > 0\n ? \" (reply): \"\n : thread.kind === \"conversation\"\n ? \" (in the summary): \"\n : \": \";\n item.append(this.el(\"span\", \"\", `${how}${oneLine(comment.body)}`));\n list.append(item);\n });\n }\n dialog.append(list);\n }\n const choices = this.doc.createElement(\"fieldset\");\n const legend = this.el(\"legend\", \"hint\", \"Submit as\");\n choices.append(legend);\n for (const [event, label] of EVENTS) {\n const option = this.doc.createElement(\"label\");\n const radio = this.doc.createElement(\"input\");\n radio.type = \"radio\";\n radio.name = \"event\";\n radio.value = event;\n radio.checked = this.event === event;\n radio.dataset[\"focus\"] = `event:${event}`;\n radio.addEventListener(\"change\", () => {\n if (radio.checked) this.event = event;\n });\n option.append(radio, ` ${label}`);\n choices.append(option);\n }\n dialog.append(choices);\n const summary = this.doc.createElement(\"textarea\");\n summary.placeholder = \"Summary (optional)\";\n summary.setAttribute(\"aria-label\", \"Summary (optional)\");\n summary.dataset[\"focus\"] = \"summary\";\n summary.value = this.drafts.get(\"summary\") ?? \"\";\n summary.addEventListener(\"input\", () => this.drafts.set(\"summary\", summary.value));\n dialog.append(summary);\n if (this.dialogError) {\n const error = this.el(\"div\", \"error\", this.dialogError);\n error.setAttribute(\"role\", \"alert\");\n dialog.append(error);\n }\n if (this.discardAsk) {\n const confirm = this.el(\"div\", \"confirm\");\n confirm.setAttribute(\"role\", \"alert\");\n const row = this.el(\"div\", \"row\");\n row.append(\n this.button(\"danger\", \"Discard comments\", () => void this.discard(), \"discard-yes\"),\n this.button(\n \"ghost\",\n \"Keep review\",\n () => {\n this.discardAsk = false;\n this.render();\n },\n \"discard-no\",\n ),\n );\n confirm.append(\n this.el(\"b\", \"\", `Discard ${plural(count, \"unsent comment\")}?`),\n this.el(\"span\", \"\", \" They will be deleted and can't be brought back.\"),\n row,\n );\n dialog.append(confirm);\n return;\n }\n const row = this.el(\"div\", \"row\");\n const submit = this.button(\"primary\", \"Submit review\", () => void this.submit(), \"submit\");\n submit.disabled = this.submitting;\n row.append(\n submit,\n this.button(\"ghost\", \"Cancel\", () => this.closeDialog(), \"dialog-close\"),\n this.el(\"span\", \"spacer\"),\n );\n if (count > 0) {\n row.append(\n this.button(\n \"link\",\n \"Discard…\",\n () => {\n this.discardAsk = true;\n this.render();\n this.focusOn(\"discard-no\");\n },\n \"discard\",\n ),\n );\n }\n dialog.append(row);\n }\n\n /** The Comment button, on the block under the pointer or focus. */\n private drawTools(): void {\n const button = this.button(\n \"tool\",\n \"Comment\",\n () => {\n const block = this.toolsOn;\n const anchor = block && this.anchorOf(block);\n if (anchor) this.startComment(anchor);\n },\n \"tools\",\n );\n button.setAttribute(\"aria-label\", \"Comment on this block\");\n this.tools.replaceChildren(...this.styleNodes(this.tools), button);\n if (!this.wide || this.data === undefined) this.hideTools();\n }\n\n // --- Placing ---\n\n private place(): void {\n if (this.disposed) return;\n const base = this.layerHost.getBoundingClientRect();\n const column = this.layer.querySelector<HTMLElement>(\".column\");\n if (column) {\n const page = this.root.getBoundingClientRect();\n column.style.left = `${page.right - base.left + COLUMN_GAP}px`;\n column.style.width = `${COLUMN_WIDTH}px`;\n let previous = 0;\n for (const slot of Array.from(column.querySelectorAll<HTMLElement>(\":scope > .slot\"))) {\n const entry = this.entries.find((e) => e.key === slot.dataset[\"key\"]);\n const element = this.visibleFor(entry?.element ?? null);\n const at = element ? element.getBoundingClientRect().top - base.top : previous;\n const top = Math.max(at, previous);\n slot.style.top = `${top}px`;\n previous = top + slot.offsetHeight + 2;\n }\n column.style.height = `${previous}px`;\n // The column can run past the page: make room below it. The room\n // already made isn't the page's, or making it would undo it.\n const overrun = Math.ceil(previous - (page.bottom - this.room - base.top));\n this.makeRoom(overrun > 0 ? overrun : 0);\n } else {\n this.makeRoom(0);\n }\n for (const { host, block } of this.markers) this.pin(host, block);\n if (this.toolsOn && !this.toolsHost.hidden) this.pin(this.toolsHost, this.toolsOn);\n if (this.linked !== undefined) this.drawLink(this.linked);\n }\n\n /** Pads the page's bottom by `room` pixels, for the column to end in. */\n private makeRoom(room: number): void {\n if (room === this.room) return;\n this.room = room;\n if (room > 0) this.root.style.setProperty(\"padding-bottom\", `${room}px`);\n else this.root.style.removeProperty(\"padding-bottom\");\n }\n\n /** Positions an element of the page at a block's top right corner. */\n private pin(host: HTMLElement, block: HTMLElement): void {\n const parent = host.offsetParent ?? this.doc.body;\n const outer = parent.getBoundingClientRect();\n const box = block.getBoundingClientRect();\n host.style.top = `${box.top - outer.top - parent.clientTop}px`;\n host.style.left = `${box.right - outer.left - parent.clientLeft - host.offsetWidth}px`;\n }\n\n private pointAt(target: EventTarget | null): void {\n if (this.data === undefined) return;\n const block = this.blockOf(target);\n if (!block) return;\n if (this.wide) {\n const key = this.anchorKeyOf(block);\n if (key !== undefined && this.entries.some((e) => e.key === key)) this.link(key);\n if (block !== this.toolsOn || this.toolsHost.hidden) this.showTools(block);\n }\n }\n\n private anchorKeyOf(block: HTMLElement): string | undefined {\n const anchor = this.anchorOf(block);\n return anchor && anchorKey(anchor);\n }\n\n private showTools(block: HTMLElement): void {\n if (this.toolsHost.parentElement !== block) {\n if (isVoid(block)) block.after(this.toolsHost);\n else block.append(this.toolsHost);\n }\n this.toolsOn = block;\n this.toolsHost.hidden = false;\n this.pin(this.toolsHost, block);\n }\n\n private hideTools(): void {\n this.toolsHost.hidden = true;\n }\n\n /** Highlights a block and its threads and joins them with a line; `undefined` clears it. */\n private link(key: string | undefined, forMs?: number): void {\n if (this.linkTimer) clearTimeout(this.linkTimer);\n this.linkTimer = undefined;\n this.linked = key;\n this.drawLink(key);\n if (key !== undefined && forMs !== undefined) {\n this.linkTimer = setTimeout(() => this.link(undefined), forMs);\n }\n }\n\n private drawLink(key: string | undefined): void {\n const svg = this.layer.querySelector(\"svg.connector\");\n const highlight = this.layer.querySelector<HTMLElement>(\".highlight\");\n for (const slot of Array.from(this.layer.querySelectorAll(\".slot.linked\"))) {\n slot.classList.remove(\"linked\");\n }\n svg?.replaceChildren();\n if (highlight) highlight.hidden = true;\n if (key === undefined || !svg || !highlight) return;\n const entry = this.entries.find((e) => e.key === key);\n const element = this.visibleFor(entry?.element ?? null);\n const slot = Array.from(this.layer.querySelectorAll<HTMLElement>(\".slot\")).find(\n (s) => s.dataset[\"key\"] === key,\n );\n if (!element || !slot) return;\n slot.classList.add(\"linked\");\n const base = this.layerHost.getBoundingClientRect();\n const a = element.getBoundingClientRect();\n const s = slot.getBoundingClientRect();\n Object.assign(highlight.style, {\n top: `${a.top - base.top}px`,\n left: `${a.left - base.left}px`,\n width: `${a.width}px`,\n height: `${a.height}px`,\n });\n highlight.hidden = false;\n const x1 = a.right - base.left;\n const y1 = a.top - base.top + 12;\n const x2 = s.left - base.left;\n const y2 = s.top - base.top + 14;\n const mid = (x1 + x2) / 2;\n const path = this.doc.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n path.setAttribute(\"d\", `M${x1} ${y1} H${mid} V${y2} H${x2}`);\n svg.append(path);\n }\n\n // --- What the reviewer does ---\n\n private clickBlock(event: MouseEvent): void {\n if (this.data === undefined || this.wide || event.defaultPrevented) return;\n const target = event.target instanceof Element ? event.target : null;\n if (!target || target.closest(\"a, button, input, textarea, select, summary, [role=tab]\"))\n return;\n if (this.doc.getSelection()?.isCollapsed === false) return;\n const block = this.blockOf(target);\n const anchor = block && this.anchorOf(block);\n if (anchor) this.openPanel(anchor);\n }\n\n private keyOnBlock(event: KeyboardEvent): void {\n if (this.data === undefined) return;\n if (event.key === \"Escape\") {\n this.escape();\n return;\n }\n const block = event.target instanceof HTMLElement ? event.target : null;\n if (!block || !this.focusable.includes(block)) return;\n if (event.key !== \"Enter\") return;\n event.preventDefault();\n const anchor = this.anchorOf(block);\n if (!anchor) return;\n if (this.wide) this.startComment(anchor);\n else this.openPanel(anchor);\n }\n\n private keyInOverlay(event: KeyboardEvent): void {\n if (event.key === \"Escape\") {\n event.stopPropagation();\n this.escape();\n return;\n }\n if (event.key === \"Tab\" && this.dialog !== undefined) this.trapFocus(event);\n }\n\n private escape(): void {\n if (this.dialog !== undefined) this.closeDialog();\n else if (this.composer !== undefined) this.cancelComment();\n else if (this.panel !== undefined) this.closePanel();\n }\n\n private clickLink(event: MouseEvent): void {\n const target = event.composedPath()[0];\n const link = target instanceof Element ? target.closest(\"a[href]\") : null;\n if (!link || !this.host.openLink) return;\n event.preventDefault();\n this.host.openLink(link.getAttribute(\"href\") ?? \"\");\n }\n\n private startComment(anchor: Anchor): void {\n const key = anchorKey(anchor);\n if (this.composer?.key === key) {\n this.focusOn(`comment:${key}`);\n return;\n }\n this.rememberOpener();\n this.composer = { key, anchor, target: undefined, busy: false, error: undefined };\n if (!this.wide) {\n this.panel = key;\n this.panelAnchor = anchor;\n }\n this.render();\n this.focusOn(`comment:${key}`);\n const composer = this.composer;\n this.host.commentTarget(anchor).then(\n (target) => {\n if (this.composer !== composer) return;\n composer.target = target;\n this.render();\n if (target.kind !== \"push-first\") this.focusOn(`comment:${key}`);\n else this.focusOn(\"composer-cancel\");\n },\n () => {\n if (this.composer !== composer) return;\n // Nothing to say up front: try it, and the session holds it if it must.\n composer.target = { kind: \"thread\" };\n this.render();\n },\n );\n }\n\n private cancelComment(): void {\n const composer = this.composer;\n if (!composer) return;\n this.composer = undefined;\n this.drafts.delete(`comment:${composer.key}`);\n this.render();\n this.giveBackFocus();\n }\n\n private async addComment(): Promise<void> {\n const composer = this.composer;\n const key = composer && `comment:${composer.key}`;\n const body = key ? (this.drafts.get(key) ?? \"\").trim() : \"\";\n if (!composer || !key || composer.busy || body === \"\") return;\n composer.busy = true;\n composer.error = undefined;\n this.render();\n try {\n const thread = await this.host.comment(\n composer.anchor,\n body,\n this.shownText(composer.anchor),\n );\n this.composer = undefined;\n this.drafts.delete(key);\n this.announce(\n thread.kind === \"conversation\"\n ? \"Added to your review's summary. Nothing is sent until you submit the review.\"\n : \"Added to your review. Nothing is sent until you submit the review.\",\n );\n await this.refresh();\n if (!this.focusOn(`reply:${thread.id}`)) this.findCard(thread.id)?.focus();\n } catch (error) {\n composer.busy = false;\n composer.error = messageOf(error);\n if (codeOf(error) === \"push-first\")\n composer.target = { kind: \"push-first\", message: composer.error };\n this.announce(composer.error);\n this.render();\n }\n }\n\n private async reply(thread: LocatedThread, when: \"now\" | \"withReview\"): Promise<void> {\n const key = `reply:${thread.id}`;\n const body = (this.drafts.get(key) ?? \"\").trim();\n if (body === \"\" || this.busy.has(thread.id)) return;\n this.busy.add(thread.id);\n this.errors.delete(key);\n this.render();\n try {\n await this.host.reply(thread.id, body, when);\n this.drafts.delete(key);\n this.busy.delete(thread.id);\n const message = when === \"now\" ? \"Reply sent to GitHub.\" : \"Reply added to your review.\";\n this.announce(message);\n if (when === \"now\") this.host.notify?.(message);\n await this.refresh();\n this.focusOn(key);\n } catch (error) {\n this.busy.delete(thread.id);\n this.errors.set(key, messageOf(error));\n this.announce(messageOf(error));\n // The session refused because the review has unsent comments: read again, so the bar shows them.\n if (codeOf(error) === \"reply-held\") await this.refresh();\n else this.render();\n this.focusOn(key);\n }\n }\n\n /** Asks the host for a prompt; says so when it couldn't build one. */\n private async promptAgent(request: PromptRequest): Promise<void> {\n try {\n await this.host.promptAgent?.(request);\n } catch (error) {\n const message = `The prompt couldn't be built: ${messageOf(error)}`;\n if (this.host.notify) this.host.notify(message);\n else this.announce(message);\n }\n }\n\n private async resolve(thread: LocatedThread): Promise<void> {\n if (this.busy.has(thread.id)) return;\n const resolved = !thread.resolved;\n this.busy.add(thread.id);\n this.render();\n try {\n await this.host.resolve(thread.id, resolved);\n this.busy.delete(thread.id);\n this.expanded.delete(thread.id);\n const message = resolved\n ? \"Resolved on GitHub. Resolving is sent right away, not held with your review.\"\n : \"Reopened on GitHub.\";\n this.announce(message);\n this.host.notify?.(message);\n await this.refresh();\n if (!this.focusOn(`resolve:${thread.id}`)) this.focusOn(`expand:${thread.id}`);\n } catch (error) {\n this.busy.delete(thread.id);\n this.announce(messageOf(error));\n this.host.notify?.(messageOf(error));\n this.render();\n }\n }\n\n private async submit(): Promise<void> {\n const data = this.data;\n if (!data || this.submitting) return;\n this.submitting = true;\n this.dialogError = undefined;\n this.render();\n const summary = (this.drafts.get(\"summary\") ?? \"\").trim();\n try {\n await this.host.submit(this.event, summary === \"\" ? undefined : summary);\n this.submitting = false;\n this.drafts.delete(\"summary\");\n this.dialog = undefined;\n const number = data.pullRequest.number;\n const done =\n this.event === \"APPROVE\"\n ? `Approved #${number}.`\n : this.event === \"REQUEST_CHANGES\"\n ? `Requested changes on #${number}.`\n : `Review submitted to #${number}.`;\n const message = `${done} Your comments are now on GitHub.`;\n this.event = \"COMMENT\";\n this.announce(message);\n this.host.notify?.(message);\n await this.refresh();\n this.giveBackFocus();\n } catch (error) {\n this.submitting = false;\n this.dialogError = messageOf(error);\n this.announce(this.dialogError);\n this.render();\n }\n }\n\n private async discard(): Promise<void> {\n try {\n await this.host.discard();\n this.dialog = undefined;\n this.discardAsk = false;\n const message = \"Discarded your unsent comments.\";\n this.announce(message);\n this.host.notify?.(message);\n await this.refresh();\n this.giveBackFocus();\n } catch (error) {\n this.discardAsk = false;\n this.dialogError = messageOf(error);\n this.announce(this.dialogError);\n this.render();\n }\n }\n\n /** Goes to a thread from a list: on this page, or on the page the host opens. */\n private jump(summary: ThreadSummary): void {\n const { thread, pages } = summary;\n this.dialog = undefined;\n this.discardAsk = false;\n if (this.goToThread(thread.id)) return;\n this.render();\n const page = pages[0];\n if (page) {\n this.host.openThread(thread.id, page.path);\n return;\n }\n const lines = thread.lines ?? { first: 1, last: 1 };\n this.host.openSource({\n source: formatSource({ path: thread.path, first: lines.first, last: lines.last }),\n via: [],\n });\n }\n\n private openPanel(anchor: Anchor): void {\n this.rememberOpener();\n this.panel = anchorKey(anchor);\n this.panelAnchor = anchor;\n this.render();\n const sheet = this.layer.querySelector<HTMLElement>(\".sheet\");\n (\n sheet?.querySelector<HTMLElement>(\".thread\") ?? sheet?.querySelector<HTMLElement>(\"button\")\n )?.focus();\n }\n\n /** Opens the panel of a block with threads (which may be removed text). */\n private openEntry(entry: Entry): void {\n this.rememberOpener();\n this.panel = entry.key;\n this.panelAnchor = entry.removed ? undefined : entry.anchor;\n this.render();\n const sheet = this.layer.querySelector<HTMLElement>(\".sheet\");\n (\n sheet?.querySelector<HTMLElement>(\".thread\") ?? sheet?.querySelector<HTMLElement>(\"button\")\n )?.focus();\n }\n\n private closePanel(): void {\n this.panel = undefined;\n this.panelAnchor = undefined;\n this.composer = undefined;\n this.render();\n this.giveBackFocus();\n }\n\n private openDialog(dialog: \"submit\" | \"all\"): void {\n if (this.data === undefined) return;\n this.rememberOpener();\n this.dialog = dialog;\n this.discardAsk = false;\n this.dialogError = undefined;\n this.render();\n this.focusDialog();\n // The lists need every thread; read them again, since they may have changed.\n void this.host.allThreads().then(\n (all) => {\n if (this.disposed) return;\n this.all = all;\n if (this.dialog === dialog) {\n const focus = this.focusKey();\n this.render();\n if (!this.restoreFocus(focus)) this.focusDialog();\n }\n },\n () => undefined,\n );\n }\n\n private closeDialog(): void {\n this.dialog = undefined;\n this.discardAsk = false;\n this.render();\n this.giveBackFocus();\n }\n\n private focusDialog(): void {\n const dialog = this.layer.querySelector<HTMLElement>(\".dialog\");\n const first = dialog?.querySelector<HTMLElement>(\n this.dialog === \"submit\" ? \"input[type=radio]:checked\" : \"[aria-pressed=true]\",\n );\n first?.focus();\n }\n\n private trapFocus(event: KeyboardEvent): void {\n const dialog = this.layer.querySelector<HTMLElement>(\".dialog\");\n if (!dialog) return;\n const focusable = Array.from(\n dialog.querySelectorAll<HTMLElement>(\"button, textarea, input, [tabindex]\"),\n ).filter((el) => !(el as HTMLButtonElement).disabled && el.tabIndex >= 0);\n const first = focusable[0];\n const last = focusable.at(-1);\n const active = this.layer.activeElement;\n if (event.shiftKey && active === first) {\n event.preventDefault();\n last?.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first?.focus();\n }\n }\n\n // --- Focus ---\n\n private rememberOpener(): void {\n if (this.opener !== undefined) return;\n const active = this.activeElement();\n this.opener = active instanceof HTMLElement ? active : undefined;\n }\n\n private giveBackFocus(): void {\n const opener = this.opener;\n this.opener = undefined;\n if (opener?.isConnected) opener.focus({ preventScroll: true });\n }\n\n /** The focused element, inside the overlay's shadow roots or out. */\n private activeElement(): Element | null {\n let active = this.doc.activeElement;\n while (active?.shadowRoot?.activeElement) active = active.shadowRoot.activeElement;\n return active;\n }\n\n private focusKey(): { key: string; start: number; end: number } | undefined {\n const active = this.activeElement();\n const key = active instanceof HTMLElement ? active.dataset[\"focus\"] : undefined;\n if (key === undefined || !active) return undefined;\n const field = active as HTMLTextAreaElement;\n return {\n key,\n start: typeof field.selectionStart === \"number\" ? field.selectionStart : 0,\n end: typeof field.selectionEnd === \"number\" ? field.selectionEnd : 0,\n };\n }\n\n private restoreFocus(focus: { key: string; start: number; end: number } | undefined): boolean {\n if (!focus) return false;\n const el = this.byFocusKey(focus.key);\n if (!el || (el as HTMLButtonElement).disabled) return false;\n el.focus({ preventScroll: true });\n if (el instanceof HTMLTextAreaElement) el.setSelectionRange(focus.start, focus.end);\n return true;\n }\n\n private byFocusKey(key: string): HTMLElement | undefined {\n for (const shadow of [this.layer, this.before, this.after, this.tools]) {\n for (const el of Array.from(shadow.querySelectorAll<HTMLElement>(\"[data-focus]\"))) {\n if (el.dataset[\"focus\"] === key) return el;\n }\n }\n return undefined;\n }\n\n private focusOn(key: string): boolean {\n const el = this.byFocusKey(key);\n if (!el || (el as HTMLButtonElement).disabled) return false;\n el.focus({ preventScroll: true });\n return true;\n }\n\n private findCard(threadId: string): HTMLElement | undefined {\n for (const shadow of [this.layer, this.before]) {\n for (const el of Array.from(shadow.querySelectorAll<HTMLElement>(\".thread\"))) {\n if (el.dataset[\"thread\"] === threadId) return el;\n }\n }\n return undefined;\n }\n\n private announce(message: string): void {\n // A change of text is what's announced: clear it first, so the same message is said again.\n this.live.textContent = \"\";\n requestFrame(this.doc, () => {\n this.live.textContent = message;\n });\n }\n\n // --- Elements ---\n\n private el<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className: string,\n text?: string,\n ): HTMLElementTagNameMap[K] {\n const el = this.doc.createElement(tag);\n if (className) el.className = className;\n if (text !== undefined) el.textContent = text;\n return el;\n }\n\n private button(\n className: string,\n text: string,\n onClick: () => void,\n focusKey?: string,\n ): HTMLButtonElement {\n const button = this.el(\"button\", className, text);\n button.type = \"button\";\n if (focusKey !== undefined) button.dataset[\"focus\"] = focusKey;\n button.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n onClick();\n });\n return button;\n }\n\n private badge(kind: string, text: string): HTMLElement {\n return this.el(\"span\", `badge ${kind}`, text);\n }\n}\n\nconst HELD_REASON =\n \"You have unsent comments, so GitHub adds replies to your review. Submit or discard it to reply at once.\";\n\n/** `rollouts.md:28`, from a block's anchor. */\nfunction sourceLabel(anchor: Anchor): string {\n const colon = anchor.source.lastIndexOf(\":\");\n const match = /^(\\d+)-(\\d+)$/.exec(anchor.source.slice(colon + 1));\n if (colon < 0 || !match) return anchor.source;\n let path = anchor.source.slice(0, colon);\n try {\n path = decodeURIComponent(path);\n } catch {\n // Show it as it is.\n }\n return linesLabel(path, { first: Number(match[1]), last: Number(match[2]) });\n}\n\n/** A comment's first line, for a list. */\nfunction oneLine(body: string): string {\n return body.replace(/\\s+/g, \" \").trim();\n}\n\nfunction messageOf(error: unknown): string {\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n return String((error as HostError).message);\n }\n return String(error);\n}\n\nfunction codeOf(error: unknown): string | undefined {\n if (typeof error === \"object\" && error !== null && \"code\" in error) {\n const code = (error as HostError).code;\n return typeof code === \"string\" ? code : undefined;\n }\n return undefined;\n}\n\n/** An element that can't hold children: the overlay's things go after it. */\nfunction isVoid(element: Element): boolean {\n return /^(img|hr|br|input|video|audio|iframe|embed|object|svg|math|canvas)$/.test(\n element.localName,\n );\n}\n\nfunction cssId(text: string): string {\n return text.replace(/[^A-Za-z0-9_-]/g, \"_\");\n}\n\nfunction requestFrame(doc: Document, callback: () => void): void {\n const view = doc.defaultView;\n if (view && typeof view.requestAnimationFrame === \"function\")\n view.requestAnimationFrame(callback);\n else setTimeout(callback, 0);\n}\n\nlet sheet: { doc: Document; sheet: CSSStyleSheet } | undefined;\n\n/**\n * Gives a shadow root the overlay's stylesheet: one constructed stylesheet,\n * shared, where the browser has them (a content security policy that allows\n * no inline styles still allows these); a `<style>` element elsewhere.\n */\nfunction adoptStyles(shadow: ShadowRoot, doc: Document): void {\n const view = doc.defaultView as (Window & { CSSStyleSheet?: typeof CSSStyleSheet }) | null;\n if (view?.CSSStyleSheet && \"adoptedStyleSheets\" in shadow) {\n try {\n if (sheet?.doc !== doc) {\n const constructed = new view.CSSStyleSheet();\n constructed.replaceSync(OVERLAY_CSS);\n sheet = { doc, sheet: constructed };\n }\n shadow.adoptedStyleSheets = [sheet.sheet];\n return;\n } catch {\n // Not constructable here: fall back to an element.\n }\n }\n const style = doc.createElement(\"style\");\n style.setAttribute(\"data-overlay\", \"\");\n style.textContent = OVERLAY_CSS;\n shadow.append(style);\n}\n\n/** Where a thread's Open source goes: its own lines when it has them, else its block's. */\nfunction threadSource(thread: LocatedThread, entry: { anchor: Anchor }): Anchor {\n if (thread.lines === undefined || (thread.kind === \"review\" && thread.side === \"LEFT\")) {\n return entry.anchor;\n }\n return {\n source: formatSource({ path: thread.path, first: thread.lines.first, last: thread.lines.last }),\n via: entry.anchor.via,\n };\n}\n"]}