@designfever/web-review-kit 0.3.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +18 -1
- package/dist/{chunk-I76WEDLA.js → chunk-6L2KJ7XL.js} +1115 -110
- package/dist/chunk-6L2KJ7XL.js.map +1 -0
- package/dist/index.cjs +1114 -109
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/react-shell.cjs +3256 -855
- package/dist/react-shell.cjs.map +1 -1
- package/dist/react-shell.d.cts +11 -3
- package/dist/react-shell.d.ts +11 -3
- package/dist/react-shell.js +2089 -689
- package/dist/react-shell.js.map +1 -1
- package/dist/{types-Cf2x5ky6.d.cts → types-D_qYtwTs.d.cts} +4 -1
- package/dist/{types-Cf2x5ky6.d.ts → types-D_qYtwTs.d.ts} +4 -1
- package/docs/adaptor.sample.ts +2 -0
- package/docs/architecture.md +3 -0
- package/docs/installation.md +26 -1
- package/docs/release-notes-0.3.0.md +94 -0
- package/docs/release-notes-0.4.0.md +144 -0
- package/package.json +2 -2
- package/dist/chunk-I76WEDLA.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/status.ts","../src/route.ts","../src/adapters/local.ts","../src/core/review/scope.ts","../src/core/geometry.ts","../src/core/dom.anchor.ts","../src/core/id.ts","../src/core/hotkey.ts","../src/core/location.ts","../src/core/review/item.ts","../src/core/scroll.ts","../src/core/overlay.style.ts","../src/core/review/format.ts","../src/core/web.review.kit.view.ts","../src/core/web.review.kit.app.ts"],"sourcesContent":["import type { ReviewItemStatus, ReviewWorkflowStatus } from './types';\n\nexport const REVIEW_WORKFLOW_STATUS_OPTIONS: Array<{\n value: ReviewWorkflowStatus;\n label: string;\n}> = [\n { value: 'todo', label: 'Todo' },\n { value: 'doing', label: 'Doing' },\n { value: 'review', label: 'Review' },\n { value: 'hold', label: 'Hold' },\n { value: 'done', label: 'Done' },\n];\n\nexport function normalizeReviewItemStatus(\n status: ReviewItemStatus | undefined\n): ReviewWorkflowStatus {\n if (status === 'resolved') return 'done';\n if (status === 'open' || !status) return 'todo';\n return status;\n}\n\nexport function matchesReviewItemStatus(\n itemStatus: ReviewItemStatus | undefined,\n queryStatus: ReviewItemStatus\n) {\n return (\n normalizeReviewItemStatus(itemStatus) === normalizeReviewItemStatus(queryStatus)\n );\n}\n","import type { ReviewItem } from './types';\n\nexport function getItemRouteKey(\n item: Pick<ReviewItem, 'routeKey' | 'normalizedPath'>\n) {\n return item.routeKey || normalizeRoutePath(item.normalizedPath);\n}\n\nexport function normalizeRoutePath(pathname: string) {\n const [pathWithoutQuery] = pathname.split(/[?#]/);\n const path = (pathWithoutQuery || '/').replace(/\\/index\\.html$/, '/');\n return path.startsWith('/') ? path : `/${path}`;\n}\n","import { getItemRouteKey } from '../route';\nimport { matchesReviewItemStatus } from '../status';\nimport type {\n LocalAdapterOptions,\n ReviewItem,\n WebReviewKitAdapter,\n} from '../types';\n\nconst DEFAULT_STORAGE_KEY = 'df-web-review-kit:items';\n\nexport function localAdapter(\n options: LocalAdapterOptions = {}\n): WebReviewKitAdapter {\n const storageKey = options.storageKey ?? DEFAULT_STORAGE_KEY;\n\n const write = (items: ReviewItem[]) => {\n window.localStorage.setItem(storageKey, JSON.stringify(items));\n };\n\n const read = (): ReviewItem[] => {\n if (typeof window === 'undefined') return [];\n\n const raw = window.localStorage.getItem(storageKey);\n if (!raw) return [];\n\n try {\n const value = JSON.parse(raw);\n if (!Array.isArray(value)) return [];\n\n let changed = false;\n const items = value.flatMap((item) => {\n const normalized = normalizeStoredReviewItem(item);\n if (!normalized || normalized !== item) changed = true;\n return normalized ? [normalized] : [];\n });\n\n if (changed) write(items);\n return items;\n } catch {\n return [];\n }\n };\n\n return {\n async get(id) {\n return read().find((item) => item.id === id) ?? null;\n },\n\n async list(query) {\n return read().filter((item) => {\n if (item.projectId !== query.projectId) return false;\n const queryRouteKey = query.routeKey ?? query.normalizedPath;\n if (\n queryRouteKey &&\n getItemRouteKey(item) !== queryRouteKey\n ) {\n return false;\n }\n if (query.status && !matchesReviewItemStatus(item.status, query.status)) {\n return false;\n }\n return true;\n });\n },\n\n async create(item) {\n const items = read();\n items.unshift(item);\n write(items);\n return item;\n },\n\n async update(id, patch) {\n const items = read();\n const index = items.findIndex((item) => item.id === id);\n\n if (index < 0) {\n throw new Error(`Review item not found: ${id}`);\n }\n\n const next: ReviewItem = {\n ...items[index],\n ...patch,\n id,\n createdAt: items[index].createdAt,\n updatedAt: new Date().toISOString(),\n };\n\n items[index] = next;\n write(items);\n return next;\n },\n\n async remove(id) {\n write(read().filter((item) => item.id !== id));\n },\n };\n}\n\nfunction normalizeStoredReviewItem(value: unknown): ReviewItem | undefined {\n if (!value || typeof value !== 'object') return undefined;\n\n const raw = value as Omit<ReviewItem, 'kind'> & {\n kind?: string;\n reviewNumber?: unknown;\n screenshot?: unknown;\n };\n const kind =\n raw.kind === 'text' ? 'note' :\n raw.kind === 'capture' ? 'area' :\n raw.kind;\n\n if (kind !== 'note' && kind !== 'area') return undefined;\n\n const { screenshot: _screenshot, reviewNumber: _reviewNumber, ...item } = raw;\n\n if (\n kind === raw.kind &&\n _screenshot === undefined &&\n _reviewNumber === undefined\n ) {\n return raw as ReviewItem;\n }\n\n return {\n ...item,\n kind,\n } as ReviewItem;\n}\n","import type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemScope,\n ReviewViewportPreset,\n ViewportSize,\n} from '../../types';\n\n/** Default viewport presets used when a host project does not provide its own. */\nexport const DEFAULT_REVIEW_VIEWPORTS: ReviewViewportPreset[] = [\n { label: 'Mobile', width: 390, height: 720, scope: 'mobile' },\n { label: 'Tablet', width: 768, height: 1024, scope: 'tablet' },\n { label: 'Desktop', width: 1440, height: 900, scope: 'desktop' },\n { label: 'Wide', width: 1980, height: 1080, scope: 'wide' },\n];\n\nconst REVIEW_SCOPE_LABELS: Record<ReviewItemScope, string> = {\n mobile: 'Mobile',\n tablet: 'Tablet',\n desktop: 'Desktop',\n wide: 'Wide',\n dom: 'Element',\n};\n\nconst normalizeReviewItemScope = (value: unknown): ReviewItemScope | undefined => {\n if (value === 'element') return 'dom';\n if (\n value === 'mobile' ||\n value === 'tablet' ||\n value === 'desktop' ||\n value === 'wide' ||\n value === 'dom'\n ) {\n return value;\n }\n\n return undefined;\n};\n\nconst getViewportPresetDistance = (\n preset: ReviewViewportPreset,\n viewport: ViewportSize\n) =>\n Math.abs(preset.width - viewport.width) +\n Math.abs(preset.height - viewport.height);\n\nconst inferViewportScope = (\n preset: ReviewViewportPreset\n): Exclude<ReviewItemScope, 'dom'> => {\n if (preset.scope) return preset.scope;\n\n const label = preset.label.toLowerCase();\n\n if (label.includes('mobile') || label.includes('phone')) return 'mobile';\n if (label.includes('tablet') || label.includes('pad')) return 'tablet';\n if (\n label.includes('wide') ||\n label.includes('1980') ||\n label.includes('1940') ||\n label.includes('1920')\n ) {\n return 'wide';\n }\n if (label.includes('desktop')) return 'desktop';\n if (preset.width >= 1800) return 'wide';\n if (preset.width >= 1000) return 'desktop';\n if (preset.width >= 700) return 'tablet';\n return 'mobile';\n};\n\n/** Finds the nearest configured preset for a viewport size. */\nexport function findReviewViewportPreset(\n viewport: ViewportSize,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n) {\n const fallback = presets[0] ?? DEFAULT_REVIEW_VIEWPORTS[0];\n const exact = presets.find(\n (preset) =>\n preset.width === viewport.width && preset.height === viewport.height\n );\n\n if (exact) return exact;\n\n return presets.reduce((closest, preset) => {\n const closestDistance = getViewportPresetDistance(closest, viewport);\n const presetDistance = getViewportPresetDistance(preset, viewport);\n return presetDistance < closestDistance ? preset : closest;\n }, fallback);\n}\n\n/** Resolves a viewport size to the review scope used for item grouping. */\nexport function getReviewViewportScope(\n viewport: ViewportSize,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): Exclude<ReviewItemScope, 'dom'> {\n return inferViewportScope(findReviewViewportPreset(viewport, presets));\n}\n\n/** Resolves an item's persisted scope, falling back to its captured viewport. */\nexport function getReviewItemScope(\n item: ReviewItem,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): ReviewItemScope {\n const scope = normalizeReviewItemScope(item.scope);\n if (scope && scope !== 'dom') return scope;\n return getReviewViewportScope(item.viewport, presets);\n}\n\n/** Returns the display label for an item's resolved review scope. */\nexport function getReviewItemScopeLabel(\n item: ReviewItem,\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n) {\n const scope = getReviewItemScope(item, presets);\n if (scope === 'dom') return REVIEW_SCOPE_LABELS.dom;\n\n const preset = findReviewViewportPreset(item.viewport, presets);\n return preset.label || REVIEW_SCOPE_LABELS[scope];\n}\n\n/** Adds scope-aware display labels to review items without mutating them. */\nexport function getNumberedReviewItems(\n items: ReviewItem[],\n presets: ReviewViewportPreset[] = DEFAULT_REVIEW_VIEWPORTS\n): NumberedReviewItem[] {\n const draftLabels = new Map<string, string>();\n let nextDraftNumber = 1;\n\n [...items]\n .sort((a, b) => {\n const createdOrder = a.createdAt.localeCompare(b.createdAt);\n if (createdOrder !== 0) return createdOrder;\n return a.id.localeCompare(b.id);\n })\n .forEach((item) => {\n if (!getReviewItemNumber(item)) {\n draftLabels.set(item.id, `draft-${nextDraftNumber++}`);\n }\n });\n\n return items.map((item) => {\n const scope = getReviewItemScope(item, presets);\n const label = getReviewItemScopeLabel(item, presets);\n const number = getReviewItemNumber(item);\n\n return {\n item,\n scope,\n label,\n number,\n displayLabel: number ? `#${number}` : draftLabels.get(item.id) ?? 'draft',\n };\n });\n}\n\n/** Reads a persisted review number when present. */\nexport function getReviewItemNumber(item: Pick<ReviewItem, 'reviewNumber'>) {\n return normalizeReviewNumber(item.reviewNumber);\n}\n\n\nfunction normalizeReviewNumber(value: unknown) {\n if (typeof value !== 'number') return undefined;\n if (!Number.isInteger(value) || value < 1) return undefined;\n return value;\n}\n","import type {\n RelativeSelection,\n ReviewPoint,\n ViewportSize,\n} from '../types';\n\n/** Rectangle expressed in the target viewport coordinate space. */\nexport interface ViewportSelection {\n left: number;\n top: number;\n width: number;\n height: number;\n}\n\n/** Same-origin target document plus its placement inside the host shell. */\nexport interface ReviewEnvironment {\n window: Window;\n document: Document;\n viewportRect: {\n left: number;\n top: number;\n width: number;\n height: number;\n };\n overlayRect: {\n left: number;\n top: number;\n width: number;\n height: number;\n };\n}\n\n/** Returns true when two viewport rectangles overlap. */\nexport function rectanglesIntersect(\n a: ViewportSelection,\n b: ViewportSelection\n) {\n return (\n a.left < b.left + b.width &&\n a.left + a.width > b.left &&\n a.top < b.top + b.height &&\n a.top + a.height > b.top\n );\n}\n\n/** Converts a point into a 1x1 selection for shared selection handling. */\nexport function getPointSelection(point: ReviewPoint): ViewportSelection {\n return {\n left: point.x,\n top: point.y,\n width: 1,\n height: 1,\n };\n}\n\n/** Converts public API selection fields into internal viewport rectangle fields. */\nexport function toViewportSelection(\n selection: RelativeSelection\n): ViewportSelection {\n return {\n left: selection.x,\n top: selection.y,\n width: selection.width,\n height: selection.height,\n };\n}\n\n/** Rounds an internal viewport rectangle back to the public selection shape. */\nexport function toPublicSelection(\n selection: ViewportSelection\n): RelativeSelection {\n return {\n x: Math.round(selection.left),\n y: Math.round(selection.top),\n width: Math.round(selection.width),\n height: Math.round(selection.height),\n };\n}\n\n/** Finds the center point of either internal or public selection shapes. */\nexport function getSelectionCenter(\n selection: ViewportSelection | RelativeSelection\n): ReviewPoint {\n if ('left' in selection) {\n return {\n x: selection.left + selection.width / 2,\n y: selection.top + selection.height / 2,\n };\n }\n\n return {\n x: selection.x + selection.width / 2,\n y: selection.y + selection.height / 2,\n };\n}\n\n/** Runtime guard for legacy and current persisted selection values. */\nexport function isRelativeSelection(value: unknown): value is RelativeSelection {\n if (!value || typeof value !== 'object') return false;\n\n const selection = value as Partial<RelativeSelection>;\n return (\n typeof selection.x === 'number' &&\n typeof selection.y === 'number' &&\n typeof selection.width === 'number' &&\n typeof selection.height === 'number'\n );\n}\n\n/** Reads the active target viewport size, falling back to the host window. */\nexport function getViewportSize(\n environment?: ReviewEnvironment\n): ViewportSize {\n const targetWindow = environment?.window ?? window;\n return {\n width: targetWindow.innerWidth,\n height: targetWindow.innerHeight,\n };\n}\n\n/** Returns whether a target-space point is currently visible in the target viewport. */\nexport function isPointInViewport(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return (\n point.x >= 0 &&\n point.y >= 0 &&\n point.x <= viewport.width &&\n point.y <= viewport.height\n );\n}\n\n/** Returns whether any part of a target-space selection is visible. */\nexport function isSelectionInViewport(\n selection: ViewportSelection,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return rectanglesIntersect(selection, {\n left: 0,\n top: 0,\n width: viewport.width,\n height: viewport.height,\n });\n}\n\n/** Clamps a target-space point to the visible target viewport. */\nexport function clampPoint(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n const viewport = getViewportSize(environment);\n return {\n x: clamp(point.x, 0, viewport.width),\n y: clamp(point.y, 0, viewport.height),\n };\n}\n\n/** Places a popover inside the current overlay bounds near a host-space point. */\nexport function getPopoverPosition(\n point: ReviewPoint,\n environment?: ReviewEnvironment,\n options?: {\n width?: number;\n estimatedHeight?: number;\n offset?: number;\n }\n) {\n const bounds = getPopoverBounds(environment);\n const margin = 12;\n const width = Math.min(\n options?.width ?? 320,\n Math.max(240, bounds.width - margin * 2)\n );\n const estimatedHeight = options?.estimatedHeight ?? 178;\n const offset = options?.offset ?? 12;\n\n return {\n left: clamp(\n point.x + offset,\n bounds.left + margin,\n bounds.left + bounds.width - width - margin\n ),\n top: clamp(\n point.y + offset,\n bounds.top + margin,\n bounds.top + bounds.height - estimatedHeight - margin\n ),\n };\n}\n\n/** Places the area draft popover near the selected area edge. */\nexport function getAreaPopoverPosition(\n selection: ViewportSelection,\n environment: ReviewEnvironment\n) {\n return getPopoverPosition(\n {\n x: selection.left + selection.width,\n y: selection.top,\n },\n environment,\n {\n width: 360,\n estimatedHeight: 206,\n }\n );\n}\n\n/** Uses overlay bounds when embedded in a shell, otherwise the host viewport. */\nexport function getPopoverBounds(environment?: ReviewEnvironment) {\n if (!environment) {\n return {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n }\n\n return environment.overlayRect;\n}\n\n/** Converts a target-space point to the host shell coordinate space. */\nexport function toHostPoint(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n if (!environment) return point;\n\n return {\n x: point.x + environment.viewportRect.left,\n y: point.y + environment.viewportRect.top,\n };\n}\n\n/** Converts a target-space rectangle to the host shell coordinate space. */\nexport function toHostSelection(\n selection: ViewportSelection,\n environment: ReviewEnvironment\n): ViewportSelection {\n return {\n left: selection.left + environment.viewportRect.left,\n top: selection.top + environment.viewportRect.top,\n width: selection.width,\n height: selection.height,\n };\n}\n\n/** Converts a host-space point back into target viewport coordinates. */\nexport function toTargetPoint(\n point: ReviewPoint,\n environment?: ReviewEnvironment\n) {\n if (!environment) return point;\n\n return {\n x: point.x - environment.viewportRect.left,\n y: point.y - environment.viewportRect.top,\n };\n}\n\n/** Extracts a host pointer event position as a target-space point. */\nexport function toTargetPointFromHostEvent(\n event: Pick<PointerEvent, 'clientX' | 'clientY'>,\n environment?: ReviewEnvironment\n) {\n return toTargetPoint(\n {\n x: event.clientX,\n y: event.clientY,\n },\n environment\n );\n}\n\n/** Sizes and positions an overlay layer to cover the target viewport in host space. */\nexport function placeLayerOverTarget(\n layer: HTMLElement,\n environment: ReviewEnvironment\n) {\n layer.style.left = `${environment.viewportRect.left}px`;\n layer.style.top = `${environment.viewportRect.top}px`;\n layer.style.width = `${environment.viewportRect.width}px`;\n layer.style.height = `${environment.viewportRect.height}px`;\n layer.style.right = 'auto';\n layer.style.bottom = 'auto';\n}\n\n/** Clamps a value even when max is smaller than min. */\nexport function clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), Math.max(min, max));\n}\n\n/** Keeps persisted relative coordinates stable without excessive precision. */\nexport function roundRatio(value: number) {\n return Math.round(value * 10000) / 10000;\n}\n\n/** Rounds a point to pixel coordinates for persisted review data. */\nexport function roundPoint(point: ReviewPoint): ReviewPoint {\n return {\n x: Math.round(point.x),\n y: Math.round(point.y),\n };\n}\n","import type {\n DomAnchor,\n DomAnchorCandidate,\n DomSourceHint,\n RelativeSelection,\n ReviewPoint,\n} from '../types';\nimport {\n clamp,\n roundRatio,\n type ReviewEnvironment,\n type ViewportSelection,\n} from './geometry';\n\nconst COMMON_ANCHOR_ATTRIBUTES = [\n 'data-testid',\n 'data-test-id',\n 'data-cy',\n 'data-test',\n 'data-qa',\n 'data-section-id',\n 'data-component',\n];\n\nconst SEMANTIC_ANCHOR_ATTRIBUTES = [\n 'aria-label',\n 'title',\n 'name',\n 'href',\n];\n\n/** Resolves a DOM anchor from the center of a target-space selection. */\nexport function getDomAnchor(\n selection: ViewportSelection,\n configuredAttribute = 'data-qa-id',\n environment: ReviewEnvironment\n): DomAnchor | undefined {\n const x = selection.left + selection.width / 2;\n const y = selection.top + selection.height / 2;\n return getDomAnchorFromPoint({ x, y }, configuredAttribute, environment);\n}\n\n/** Builds the best DOM anchor candidate set from a target-space point. */\nexport function getDomAnchorFromPoint(\n point: ReviewPoint,\n configuredAttribute = 'data-qa-id',\n environment: ReviewEnvironment\n): DomAnchor | undefined {\n const target = environment.document.elementFromPoint(point.x, point.y);\n if (!target) return undefined;\n\n const candidates = createAnchorCandidates(target, configuredAttribute);\n const primary = candidates[0];\n if (!primary) return undefined;\n\n return {\n ...primary,\n candidates,\n htmlSnippet: getElementHtmlSnippet(\n getAnchorSourceElement(target, primary, configuredAttribute) ?? target\n ),\n source: getDomSourceHint(target),\n };\n}\n\n/** Reads the current target-space rectangle for a previously captured anchor. */\nexport function getElementViewportSelection(\n anchor: DomAnchor,\n environment: ReviewEnvironment,\n preferredSelection?: ViewportSelection\n): ViewportSelection | undefined {\n const element = getAnchorElement(anchor, environment, preferredSelection);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return undefined;\n\n return {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n };\n}\n\n/** Stores a selection relative to an anchor so it can survive layout shifts. */\nexport function getRelativeSelection(\n selection: ViewportSelection,\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n): RelativeSelection | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return undefined;\n\n return {\n x: roundRatio((selection.left - rect.left) / rect.width),\n y: roundRatio((selection.top - rect.top) / rect.height),\n width: roundRatio(selection.width / rect.width),\n height: roundRatio(selection.height / rect.height),\n };\n}\n\n/** Stores a point relative to an anchor so marker positions can be rebound. */\nexport function getRelativePoint(\n point: ReviewPoint,\n anchor: DomAnchor | string,\n environment: ReviewEnvironment\n): ReviewPoint | undefined {\n const element = getAnchorElement(anchor, environment);\n if (!element) return undefined;\n\n const rect = element.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return undefined;\n\n return {\n x: roundRatio((point.x - rect.left) / rect.width),\n y: roundRatio((point.y - rect.top) / rect.height),\n };\n}\n\n/** Returns the primary anchor plus any fallback candidates without duplicates. */\nexport function getAnchorCandidates(anchor: DomAnchor) {\n return dedupeAnchorCandidates([\n anchor,\n ...(anchor.candidates ?? []),\n ]);\n}\n\n/** Finds the best current DOM element for a persisted anchor candidate set. */\nexport function resolveAnchorElement(\n anchor: DomAnchor,\n environment: ReviewEnvironment,\n preferredSelection?: ViewportSelection\n) {\n // Try every persisted candidate because IDs/classes can disappear between builds.\n const matches = getAnchorCandidates(anchor).flatMap((candidate) => {\n const textFingerprint = candidate.textFingerprint ?? anchor.textFingerprint;\n\n if (!preferredSelection) {\n const match = queryBestAnchorCandidate(\n candidate,\n textFingerprint,\n environment\n );\n\n if (!match) return [];\n\n const confidence = roundRatio(\n (candidate.confidence ?? 0.5) * match.score\n );\n\n return [{\n element: match.element,\n candidate,\n confidence,\n }];\n }\n\n return queryAnchorElements(candidate.selector, environment).map((element) => {\n const confidence = roundRatio(\n (candidate.confidence ?? 0.5) *\n getTextFingerprintScore(textFingerprint, getTextFingerprint(element)) *\n getSelectionMatchScore(element, preferredSelection)\n );\n\n return {\n element,\n candidate,\n confidence,\n };\n });\n });\n\n return matches.sort((a, b) => b.confidence - a.confidence)[0];\n}\n\n/** CSS.escape wrapper with a small fallback for older browsers. */\nexport function cssEscape(value: string) {\n if ('CSS' in window && typeof window.CSS.escape === 'function') {\n return window.CSS.escape(value);\n }\n\n return value.replace(/[^a-zA-Z0-9_-]/g, '\\\\$&');\n}\n\nfunction getAnchorElement(\n anchor: DomAnchor | string,\n environment: ReviewEnvironment,\n preferredSelection?: ViewportSelection\n) {\n return typeof anchor === 'string'\n ? queryAnchorElement(anchor, environment)\n : resolveAnchorElement(anchor, environment, preferredSelection)?.element;\n}\n\nfunction createAnchorCandidates(\n target: Element,\n configuredAttribute: string\n): DomAnchorCandidate[] {\n const targetCandidates: DomAnchorCandidate[] = [];\n\n // Prefer the deepest clicked element. Ancestor anchors are kept as fallbacks.\n const configuredAnchor = getExactAttributeAnchorCandidate(\n target,\n configuredAttribute,\n 0.98,\n 'configured-attribute'\n );\n if (configuredAnchor) targetCandidates.push(configuredAnchor);\n\n const targetAttributeAnchor = getAttributeAnchorCandidate(\n target,\n COMMON_ANCHOR_ATTRIBUTES.filter((name) => name !== configuredAttribute),\n 0.9\n );\n if (targetAttributeAnchor) targetCandidates.push(targetAttributeAnchor);\n\n if (isMeaningfulId(target.id)) {\n targetCandidates.push({\n selector: `#${cssEscape(target.id)}`,\n strategy: 'id',\n confidence: 0.94,\n textFingerprint: getTextFingerprint(target),\n });\n }\n\n const semanticAnchor = getAttributeAnchorCandidate(\n target,\n SEMANTIC_ANCHOR_ATTRIBUTES,\n 0.84\n );\n if (semanticAnchor) targetCandidates.push(semanticAnchor);\n\n const targetClassName = getMeaningfulClassName(target);\n if (targetClassName) {\n targetCandidates.push({\n selector: `${target.tagName.toLowerCase()}.${cssEscape(targetClassName)}`,\n strategy: 'class',\n confidence: 0.82,\n textFingerprint: getTextFingerprint(target),\n });\n }\n\n const scopedPath = getScopedDomPathCandidate(target, configuredAttribute);\n if (scopedPath) targetCandidates.push(scopedPath);\n\n const targetDomPath: DomAnchorCandidate = {\n selector: getDomPath(target),\n strategy: 'dom-path',\n confidence: targetCandidates.length > 0 ? 0.8 : 0.5,\n textFingerprint: getTextFingerprint(target),\n };\n\n const parentCandidates: DomAnchorCandidate[] = [];\n\n const parent = target.parentElement;\n const parentConfiguredAnchor = parent\n ? findClosestAttributeAnchor(parent, [configuredAttribute], 0.72, {\n strategy: 'configured-attribute',\n })\n : undefined;\n if (parentConfiguredAnchor) parentCandidates.push(parentConfiguredAnchor);\n\n const anchoredByAttribute = parent\n ? findClosestAttributeAnchor(\n parent,\n COMMON_ANCHOR_ATTRIBUTES.filter((name) => name !== configuredAttribute),\n 0.7\n )\n : undefined;\n if (anchoredByAttribute) parentCandidates.push(anchoredByAttribute);\n\n const anchoredById = parent\n ? findClosest(parent, (element) => isMeaningfulId(element.id))\n : undefined;\n if (anchoredById?.id) {\n parentCandidates.push({\n selector: `#${cssEscape(anchoredById.id)}`,\n strategy: 'id',\n confidence: 0.72,\n textFingerprint: getTextFingerprint(anchoredById),\n });\n }\n\n const anchoredByClass = parent\n ? findClosest(parent, (element) => Boolean(getMeaningfulClassName(element)))\n : undefined;\n const className = anchoredByClass\n ? getMeaningfulClassName(anchoredByClass)\n : undefined;\n\n if (anchoredByClass && className) {\n parentCandidates.push({\n selector: `${anchoredByClass.tagName.toLowerCase()}.${cssEscape(\n className\n )}`,\n strategy: 'class',\n confidence: 0.58,\n textFingerprint: getTextFingerprint(anchoredByClass),\n });\n }\n\n const candidates =\n targetCandidates.length > 0\n ? [...targetCandidates, targetDomPath, ...parentCandidates]\n : [...parentCandidates, targetDomPath];\n\n return dedupeAnchorCandidates(candidates);\n}\n\nfunction findClosestAttributeAnchor(\n target: Element,\n attributeNames: string[],\n confidence: number,\n options?: {\n strategy?: DomAnchorCandidate['strategy'];\n }\n): DomAnchorCandidate | undefined {\n for (const attributeName of attributeNames) {\n const selector = `[${attributeName}]`;\n const element = safeClosest(target, selector);\n if (!element) continue;\n\n const value = getStableAttributeValue(element, attributeName);\n if (!value) continue;\n\n return {\n selector: `[${attributeName}=\"${cssEscape(value)}\"]`,\n strategy: options?.strategy ?? 'attribute',\n confidence,\n textFingerprint: getTextFingerprint(element),\n };\n }\n\n return undefined;\n}\n\nfunction getExactAttributeAnchorCandidate(\n element: Element,\n attributeName: string,\n confidence: number,\n strategy: DomAnchorCandidate['strategy']\n): DomAnchorCandidate | undefined {\n const value = getStableAttributeValue(element, attributeName);\n if (!value) return undefined;\n\n return {\n selector: `[${attributeName}=\"${cssEscape(value)}\"]`,\n strategy,\n confidence,\n textFingerprint: getTextFingerprint(element),\n };\n}\n\nfunction getAttributeAnchorCandidate(\n element: Element,\n attributeNames: string[],\n confidence: number\n): DomAnchorCandidate | undefined {\n for (const attributeName of attributeNames) {\n const value = getStableAttributeValue(element, attributeName);\n if (!value) continue;\n\n return {\n selector: `${element.tagName.toLowerCase()}[${attributeName}=\"${cssEscape(\n value\n )}\"]`,\n strategy: 'attribute',\n confidence,\n textFingerprint: getTextFingerprint(element),\n };\n }\n\n return undefined;\n}\n\nfunction getScopedDomPathCandidate(\n target: Element,\n configuredAttribute: string\n): DomAnchorCandidate | undefined {\n const parent = target.parentElement;\n if (!parent) return undefined;\n\n const anchor = findStableAncestorSelector(parent, configuredAttribute);\n if (!anchor) return undefined;\n\n const selector = getDomPathBetween(anchor.element, target, anchor.selector);\n if (!selector) return undefined;\n\n return {\n selector,\n strategy: 'dom-path',\n confidence: anchor.confidence,\n textFingerprint: getTextFingerprint(target),\n };\n}\n\nfunction findStableAncestorSelector(\n start: Element,\n configuredAttribute: string\n) {\n let element: Element | null = start;\n const root = start.ownerDocument.documentElement;\n\n while (element && element !== root) {\n const configuredValue = getStableAttributeValue(element, configuredAttribute);\n if (configuredValue) {\n return {\n element,\n selector: `[${configuredAttribute}=\"${cssEscape(configuredValue)}\"]`,\n confidence: 0.88,\n };\n }\n\n const attributeAnchor = getAttributeAnchorCandidate(\n element,\n COMMON_ANCHOR_ATTRIBUTES.filter((name) => name !== configuredAttribute),\n 0.84\n );\n if (attributeAnchor) {\n return {\n element,\n selector: attributeAnchor.selector,\n confidence: 0.84,\n };\n }\n\n if (isMeaningfulId(element.id)) {\n return {\n element,\n selector: `#${cssEscape(element.id)}`,\n confidence: 0.82,\n };\n }\n\n const className = getMeaningfulClassName(element);\n if (className) {\n return {\n element,\n selector: `${element.tagName.toLowerCase()}.${cssEscape(className)}`,\n confidence: 0.76,\n };\n }\n\n element = element.parentElement;\n }\n\n return undefined;\n}\n\nfunction getAnchorSourceElement(\n target: Element,\n candidate: DomAnchorCandidate,\n configuredAttribute: string\n) {\n if (candidate.strategy === 'configured-attribute') {\n return target.closest(`[${configuredAttribute}]`);\n }\n\n if (candidate.strategy === 'dom-path') return target;\n\n try {\n return target.closest(candidate.selector);\n } catch {\n return target;\n }\n}\n\nfunction safeClosest(element: Element, selector: string) {\n try {\n return element.closest(selector);\n } catch {\n return null;\n }\n}\n\nfunction getElementHtmlSnippet(element: Element, maxLength = 1000) {\n const html = decodeHtmlEntities(element.outerHTML.replace(/\\s+/g, ' ').trim());\n if (html.length <= maxLength) return html;\n return `${html.slice(0, maxLength - 3)}...`;\n}\n\nfunction decodeHtmlEntities(value: string) {\n return value.replace(\n /&(#\\d+|#x[\\da-f]+|lt|gt|quot|apos|amp);/gi,\n (match, entity: string) => {\n const normalized = entity.toLowerCase();\n\n if (normalized === 'lt') return '<';\n if (normalized === 'gt') return '>';\n if (normalized === 'quot') return '\"';\n if (normalized === 'apos') return \"'\";\n if (normalized === 'amp') return '&';\n\n const codePoint = normalized.startsWith('#x')\n ? Number.parseInt(normalized.slice(2), 16)\n : Number.parseInt(normalized.slice(1), 10);\n\n return Number.isFinite(codePoint)\n ? String.fromCodePoint(codePoint)\n : match;\n }\n );\n}\n\nfunction getDomSourceHint(target: Element): DomSourceHint | undefined {\n const sourceElement = target.closest(\n [\n '[data-wrk-source-file]',\n '[data-wrk-source-component]',\n '[data-wrk-source-line]',\n '[data-wrk-source-column]',\n '[data-file]',\n '[data-component]',\n '[data-section-index]',\n '[data-section-id]',\n ].join(', ')\n );\n if (!sourceElement) return undefined;\n\n const source: DomSourceHint = {\n component: getSourceAttribute(\n sourceElement,\n 'data-wrk-source-component',\n 'data-component'\n ),\n file: getSourceAttribute(sourceElement, 'data-wrk-source-file', 'data-file'),\n line: getSourceAttribute(sourceElement, 'data-wrk-source-line'),\n column: getSourceAttribute(sourceElement, 'data-wrk-source-column'),\n sectionId: getSourceAttribute(sourceElement, 'data-section-id'),\n sectionIndex: getSourceAttribute(sourceElement, 'data-section-index'),\n };\n\n return Object.values(source).some(Boolean) ? source : undefined;\n}\n\nfunction getSourceAttribute(element: Element, ...names: string[]) {\n for (const name of names) {\n const value = element.getAttribute(name)?.trim();\n if (value) return value;\n }\n\n return undefined;\n}\n\nfunction dedupeAnchorCandidates(candidates: DomAnchorCandidate[]) {\n const seen = new Set<string>();\n\n return candidates.filter((candidate) => {\n const key = `${candidate.strategy}:${candidate.selector}`;\n if (seen.has(key)) return false;\n\n seen.add(key);\n return true;\n });\n}\n\nfunction queryBestAnchorCandidate(\n candidate: DomAnchorCandidate,\n textFingerprint: string | undefined,\n environment: ReviewEnvironment\n) {\n const elements = queryAnchorElements(candidate.selector, environment);\n if (elements.length === 0) return undefined;\n if (!textFingerprint) {\n return {\n element: elements[0],\n score: 1,\n };\n }\n\n // If a selector matches multiple nodes, text similarity keeps restore deterministic.\n return elements\n .map((element) => ({\n element,\n score: getTextFingerprintScore(\n textFingerprint,\n getTextFingerprint(element)\n ),\n }))\n .sort((a, b) => b.score - a.score)[0];\n}\n\nfunction queryAnchorElement(selector: string, environment: ReviewEnvironment) {\n return queryAnchorElements(selector, environment)[0];\n}\n\nfunction queryAnchorElements(selector: string, environment: ReviewEnvironment) {\n try {\n return Array.from(environment.document.querySelectorAll(selector));\n } catch {\n return [];\n }\n}\n\nfunction findClosest(\n start: Element,\n predicate: (element: Element) => boolean\n) {\n let element: Element | null = start;\n const root = start.ownerDocument.documentElement;\n\n while (element && element !== root) {\n if (predicate(element)) return element;\n element = element.parentElement;\n }\n\n return undefined;\n}\n\nfunction getDomPath(element: Element) {\n const parts: string[] = [];\n let current: Element | null = element;\n const ownerDocument = element.ownerDocument;\n\n while (\n current &&\n current !== ownerDocument.body &&\n current !== ownerDocument.documentElement\n ) {\n const parent: Element | null = current.parentElement;\n const tag = current.tagName.toLowerCase();\n\n if (!parent) {\n parts.unshift(tag);\n break;\n }\n\n const currentTagName = current.tagName;\n const siblings: Element[] = Array.from(parent.children).filter(\n (child) => child.tagName === currentTagName\n );\n const index = siblings.indexOf(current) + 1;\n parts.unshift(`${tag}:nth-of-type(${index})`);\n current = parent;\n }\n\n return `body > ${parts.join(' > ')}`;\n}\n\nfunction getDomPathBetween(\n ancestor: Element,\n target: Element,\n ancestorSelector: string\n) {\n const parts: string[] = [];\n let current: Element | null = target;\n\n while (current && current !== ancestor) {\n parts.unshift(getDomPathPart(current));\n current = current.parentElement;\n }\n\n if (current !== ancestor || parts.length === 0) return undefined;\n\n return `${ancestorSelector} > ${parts.join(' > ')}`;\n}\n\nfunction getDomPathPart(element: Element) {\n const parent: Element | null = element.parentElement;\n const tag = element.tagName.toLowerCase();\n\n if (!parent) return tag;\n\n const currentTagName = element.tagName;\n const siblings: Element[] = Array.from(parent.children).filter(\n (child) => child.tagName === currentTagName\n );\n const index = siblings.indexOf(element) + 1;\n return `${tag}:nth-of-type(${index})`;\n}\n\nfunction getTextFingerprint(element: Element) {\n const text = element.textContent?.replace(/\\s+/g, ' ').trim();\n return text ? text.slice(0, 120) : undefined;\n}\n\nfunction getStableAttributeValue(element: Element, attributeName: string) {\n const value = element.getAttribute(attributeName)?.trim();\n if (!value || value.length > 160) return undefined;\n if (/^(true|false)$/i.test(value)) return undefined;\n if (/^\\d+$/.test(value) && value.length < 3) return undefined;\n\n return value;\n}\n\nfunction getTextFingerprintScore(expected?: string, actual?: string) {\n if (!expected) return 1;\n if (!actual) return 0.5;\n if (expected === actual) return 1;\n if (actual.includes(expected) || expected.includes(actual)) return 0.82;\n\n const expectedTokens = getFingerprintTokens(expected);\n const actualTokens = new Set(getFingerprintTokens(actual));\n if (expectedTokens.length === 0 || actualTokens.size === 0) return 0.5;\n\n const matches = expectedTokens.filter((token) => actualTokens.has(token));\n return clamp(matches.length / expectedTokens.length, 0.25, 0.76);\n}\n\nfunction getSelectionMatchScore(\n element: Element,\n selection: ViewportSelection\n) {\n const rect = element.getBoundingClientRect();\n if (rect.width <= 0 || rect.height <= 0) return 0.05;\n\n const overlapLeft = Math.max(rect.left, selection.left);\n const overlapTop = Math.max(rect.top, selection.top);\n const overlapRight = Math.min(rect.right, selection.left + selection.width);\n const overlapBottom = Math.min(rect.bottom, selection.top + selection.height);\n const overlapWidth = Math.max(0, overlapRight - overlapLeft);\n const overlapHeight = Math.max(0, overlapBottom - overlapTop);\n const overlapArea = overlapWidth * overlapHeight;\n\n if (overlapArea > 0) {\n const selectionArea = Math.max(1, selection.width * selection.height);\n const rectArea = Math.max(1, rect.width * rect.height);\n return 1 + overlapArea / Math.min(selectionArea, rectArea);\n }\n\n const rectCenterX = rect.left + rect.width / 2;\n const rectCenterY = rect.top + rect.height / 2;\n const selectionCenterX = selection.left + selection.width / 2;\n const selectionCenterY = selection.top + selection.height / 2;\n const distance = Math.hypot(\n rectCenterX - selectionCenterX,\n rectCenterY - selectionCenterY\n );\n const basis = Math.max(\n 1,\n rect.width,\n rect.height,\n selection.width,\n selection.height\n );\n\n return clamp(1 / (1 + distance / basis), 0.05, 0.95);\n}\n\nfunction getFingerprintTokens(value: string) {\n return value\n .toLowerCase()\n .split(/[\\s/|,.:;()[\\]{}\"'`~!?<>]+/)\n .map((token) => token.trim())\n .filter((token) => token.length > 1);\n}\n\nfunction isMeaningfulId(value: string) {\n const normalized = value.trim().toLowerCase();\n if (normalized.length <= 1) return false;\n\n return ![\n 'app',\n 'main',\n 'page',\n 'root',\n '__next',\n '__nuxt',\n ].includes(normalized);\n}\n\nfunction getMeaningfulClassName(element: Element) {\n return Array.from(element.classList).find((name) => isMeaningfulClass(name));\n}\n\nfunction isMeaningfulClass(value: string) {\n const normalized = value.trim();\n if (\n [\n 'absolute',\n 'block',\n 'contents',\n 'fixed',\n 'flex',\n 'grid',\n 'hidden',\n 'relative',\n 'sticky',\n ].includes(normalized)\n ) {\n return false;\n }\n\n return (\n normalized.length > 2 &&\n !normalized.includes(':') &&\n !/^(aspect|basis|bg|border|bottom|col|content|delay|duration|ease|font|from|gap|grow|h|inset|items|justify|leading|left|m|max-h|max-w|mb|ml|mr|mt|mx|my|min-h|min-w|object|opacity|order|origin|overflow|p|pb|pl|place|pointer|pr|pt|px|py|right|rotate|rounded|row|scale|self|shadow|shrink|text|to|top|tracking|transition|translate|via|w|z)-/.test(\n normalized\n ) &&\n !normalized.startsWith('mq-')\n );\n}\n","/** Creates a stable item id with crypto UUID when available. */\nexport function createId() {\n if ('randomUUID' in crypto) return crypto.randomUUID();\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n","/** Matches configured hotkeys while supporting common Korean keyboard aliases. */\nexport function isHotkey(event: KeyboardEvent, hotkey: string) {\n const parts = hotkey\n .split('+')\n .map((part) => part.trim().toLowerCase())\n .filter(Boolean);\n const key = parts.find(\n (part) => !['shift', 'ctrl', 'control', 'alt', 'meta', 'cmd'].includes(part)\n );\n\n if (!key) return false;\n if (parts.includes('shift') !== event.shiftKey) return false;\n if (\n (parts.includes('ctrl') || parts.includes('control')) !== event.ctrlKey\n ) {\n return false;\n }\n if (parts.includes('alt') !== event.altKey) return false;\n if ((parts.includes('meta') || parts.includes('cmd')) !== event.metaKey) {\n return false;\n }\n\n return isHotkeyKey(event, key);\n}\n\nfunction isHotkeyKey(event: KeyboardEvent, key: string) {\n const normalizedKey = key.toLowerCase();\n\n if (event.key.toLowerCase() === normalizedKey) return true;\n\n if (getHotkeyCode(normalizedKey) === event.code) return true;\n\n const aliases: Record<string, string[]> = {\n q: ['ㅂ', 'ㅃ'],\n };\n\n return aliases[normalizedKey]?.includes(event.key) ?? false;\n}\n\nfunction getHotkeyCode(key: string) {\n if (/^[a-z]$/.test(key)) return `Key${key.toUpperCase()}`;\n if (/^[0-9]$/.test(key)) return `Digit${key}`;\n return undefined;\n}\n","import { normalizeRoutePath } from '../route';\nimport type { ReviewEnvironment } from './geometry';\n\nconst INTERNAL_QUERY_PARAMS = ['__dfwr_target'];\n\n/** Returns the public target URL without review-only query params. */\nexport function getPageUrl(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n const search = getPublicSearch(location);\n return `${location.origin}${location.pathname}${search}${location.hash}`;\n}\n\n/** Mirrors page URL today, kept separate for future canonical/original URL support. */\nexport function getOriginalUrl(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n const search = getPublicSearch(location);\n return `${location.origin}${location.pathname}${search}${location.hash}`;\n}\n\n/** Returns the normalized route key used for adapter queries. */\nexport function getRouteKey(environment?: ReviewEnvironment) {\n const location = environment?.window.location ?? window.location;\n return normalizeRoutePath(location.pathname);\n}\n\n/** Alias for route key until route and path concepts diverge. */\nexport function getNormalizedPath(environment?: ReviewEnvironment) {\n return getRouteKey(environment);\n}\n\nfunction getPublicSearch(location: Location) {\n const params = new URLSearchParams(location.search);\n\n INTERNAL_QUERY_PARAMS.forEach((key) => params.delete(key));\n\n const value = params.toString();\n return value ? `?${value}` : '';\n}\n","import type {\n DomAnchor,\n RelativeSelection,\n ReviewItem,\n ReviewItemScope,\n ReviewMarker,\n ReviewSelection,\n} from '../../types';\nimport {\n getElementViewportSelection,\n getRelativePoint,\n resolveAnchorElement,\n} from '../dom.anchor';\nimport {\n getSelectionCenter,\n isRelativeSelection,\n isSelectionInViewport,\n roundPoint,\n toViewportSelection,\n type ReviewEnvironment,\n type ViewportSelection,\n} from '../geometry';\n\n/** Rendering mode used by marker and highlight overlays. */\nexport type ReviewItemHighlightMode = 'note' | 'area' | 'dom';\n\n/** Target-space highlight rectangle plus whether it was rebound to an anchor. */\nexport interface ReviewItemHighlightSelection {\n viewport: ViewportSelection;\n isBound: boolean;\n}\n\n/** Resolves a review marker to its current viewport point, with scroll fallback. */\nexport function getBoundMarkerPoint(\n item: ReviewItem,\n environment: ReviewEnvironment\n) {\n const marker = getItemMarker(item);\n if (!marker) return undefined;\n\n // Prefer anchor-relative positions because absolute viewport points drift after layout changes.\n if (item.kind !== 'area' && item.anchor && marker.relative) {\n const resolved = resolveAnchorElement(item.anchor, environment);\n const element = resolved?.element;\n\n if (element) {\n const rect = element.getBoundingClientRect();\n\n if (rect.width > 0 && rect.height > 0) {\n return {\n viewport: roundPoint({\n x: rect.left + rect.width * marker.relative.x,\n y: rect.top + rect.height * marker.relative.y,\n }),\n isBound: true,\n confidence: resolved.confidence,\n selector: resolved.candidate.selector,\n };\n }\n }\n }\n\n const sourceScroll = item.scroll ?? { x: 0, y: 0 };\n\n return {\n viewport: roundPoint({\n x: marker.viewport.x + sourceScroll.x - environment.window.scrollX,\n y: marker.viewport.y + sourceScroll.y - environment.window.scrollY,\n }),\n isBound: false,\n confidence: 0,\n };\n}\n\n/** Chooses the best visible highlight selection for the current target viewport. */\nexport function getItemHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n if (item.kind === 'area') {\n return getVisibleHighlightSelection(\n [\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n }\n\n if (isDomReviewItem(item)) {\n return getVisibleHighlightSelection(\n [\n getAnchorHighlightSelection(item, environment),\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n }\n\n return getVisibleHighlightSelection(\n [\n getAnchorHighlightSelection(item, environment),\n getBoundSelection(item, environment),\n getPointHighlightSelection(item, environment),\n ],\n environment\n );\n}\n\n/** Maps an item to its overlay visual treatment. */\nexport function getReviewItemHighlightMode(\n item: ReviewItem\n): ReviewItemHighlightMode {\n if (isDomReviewItem(item)) return 'dom';\n if (item.kind === 'area') return 'area';\n return 'note';\n}\n\n/** Returns an explicit marker or derives one from the item's selection center. */\nexport function getItemMarker(item: ReviewItem): ReviewMarker | undefined {\n if (item.marker) return item.marker;\n\n const selection = getItemSelection(item);\n if (!selection?.viewport) return undefined;\n\n return {\n viewport: roundPoint(getSelectionCenter(selection.viewport)),\n relative: selection.relative\n ? roundPoint(getSelectionCenter(selection.relative))\n : undefined,\n };\n}\n\n/** Normalizes current and legacy selection shapes into ReviewSelection. */\nexport function getItemSelection(item: ReviewItem): ReviewSelection | undefined {\n const value = item.selection as ReviewSelection | RelativeSelection | undefined;\n if (!value) return undefined;\n\n if ('viewport' in value && isRelativeSelection(value.viewport)) {\n return value;\n }\n\n if (isRelativeSelection(value)) {\n return {\n viewport: value,\n };\n }\n\n return undefined;\n}\n\n/** Filters markers to the active viewport scope. */\nexport function shouldShowMarkerForScope(\n scope: ReviewItemScope,\n currentScope: ReviewItemScope\n) {\n return scope === currentScope;\n}\n\n/** Creates a marker at the selection center and stores an anchor-relative fallback. */\nexport function createSelectionCenterMarker(\n selection: ViewportSelection,\n anchor: DomAnchor | undefined,\n environment: ReviewEnvironment\n): ReviewMarker {\n const centerPoint = getSelectionCenter(selection);\n\n return {\n viewport: roundPoint(centerPoint),\n relative: anchor ? getRelativePoint(centerPoint, anchor, environment) : undefined,\n };\n}\n\nfunction getBoundSelection(item: ReviewItem, environment: ReviewEnvironment) {\n const selection = getItemSelection(item);\n if (!selection?.viewport) return undefined;\n\n // Rebuild the rectangle from the anchor when possible, then fall back to scroll offset.\n if (item.kind !== 'area' && item.anchor && selection.relative) {\n const resolved = resolveAnchorElement(item.anchor, environment);\n const element = resolved?.element;\n\n if (element) {\n const rect = element.getBoundingClientRect();\n\n if (rect.width > 0 && rect.height > 0) {\n return {\n viewport: {\n left: rect.left + rect.width * selection.relative.x,\n top: rect.top + rect.height * selection.relative.y,\n width: rect.width * selection.relative.width,\n height: rect.height * selection.relative.height,\n },\n isBound: true,\n confidence: resolved.confidence,\n selector: resolved.candidate.selector,\n };\n }\n }\n }\n\n const sourceScroll = item.scroll ?? { x: 0, y: 0 };\n const viewportSelection = toViewportSelection(selection.viewport);\n\n return {\n viewport: {\n left: viewportSelection.left + sourceScroll.x - environment.window.scrollX,\n top: viewportSelection.top + sourceScroll.y - environment.window.scrollY,\n width: viewportSelection.width,\n height: viewportSelection.height,\n },\n isBound: item.kind === 'area',\n confidence: 0,\n };\n}\n\nfunction getAnchorHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n if (!item.anchor) return undefined;\n\n const viewport = getElementViewportSelection(item.anchor, environment);\n if (!viewport) return undefined;\n\n return {\n viewport,\n isBound: true,\n };\n}\n\nfunction getPointHighlightSelection(\n item: ReviewItem,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n const point = getBoundMarkerPoint(item, environment);\n if (!point) return undefined;\n\n const size = 16;\n return {\n viewport: {\n left: point.viewport.x - size / 2,\n top: point.viewport.y - size / 2,\n width: size,\n height: size,\n },\n isBound: point.isBound,\n };\n}\n\nfunction getVisibleHighlightSelection(\n candidates: Array<ReviewItemHighlightSelection | undefined>,\n environment: ReviewEnvironment\n): ReviewItemHighlightSelection | undefined {\n // Candidate order encodes item-type priority; this only discards offscreen options.\n return candidates.find(\n (candidate): candidate is ReviewItemHighlightSelection =>\n Boolean(candidate && isSelectionInViewport(candidate.viewport, environment))\n );\n}\n\nfunction isDomReviewItem(item: ReviewItem) {\n return (\n item.scope === 'dom' ||\n (item.kind === 'note' && Boolean(item.anchor && getItemSelection(item)))\n );\n}\n","import type { ReviewEnvironment } from './geometry';\n\n/** Waits one target animation frame before reading/restoring overlay state. */\nexport function waitForNextFrame(environment?: ReviewEnvironment) {\n return new Promise<void>((resolve) => {\n (environment?.window ?? window).requestAnimationFrame(() => resolve());\n });\n}\n\n/** Temporarily disables smooth scroll so restore lands synchronously. */\nexport function runWithAutoScrollBehavior(\n targetDocument: Document,\n callback: () => void\n) {\n const elements = [\n targetDocument.documentElement,\n targetDocument.body,\n ].filter((element): element is HTMLElement => Boolean(element));\n const previousValues = elements.map((element) => element.style.scrollBehavior);\n\n elements.forEach((element) => {\n element.style.scrollBehavior = 'auto';\n });\n\n try {\n callback();\n } finally {\n elements.forEach((element, index) => {\n element.style.scrollBehavior = previousValues[index] ?? '';\n });\n }\n}\n\n/** Restores target document scroll without relying on smooth scrolling behavior. */\nexport function setDocumentScrollInstantly(\n environment: ReviewEnvironment,\n position: { x: number; y: number }\n) {\n const scrollElement = environment.document.scrollingElement as HTMLElement | null;\n\n if (scrollElement) {\n scrollElement.scrollLeft = Math.max(0, Math.round(position.x));\n scrollElement.scrollTop = Math.max(0, Math.round(position.y));\n return;\n }\n\n environment.window.scrollTo(\n Math.max(0, Math.round(position.x)),\n Math.max(0, Math.round(position.y))\n );\n}\n","/** Creates the shadow-root stylesheet for the standalone core overlay. */\nexport function createStyleElement() {\n const style = document.createElement('style');\n style.textContent = `\n :host {\n color-scheme: dark;\n --df-review-font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n --df-review-font-size-2xs: 10px;\n --df-review-font-size-xs: 11px;\n --df-review-font-size-sm: 12px;\n --df-review-font-size-md: 13px;\n --df-review-font-size-xl: 15px;\n --df-review-space-1: 4px;\n --df-review-space-1-5: 6px;\n --df-review-space-2: 8px;\n --df-review-space-2-5: 10px;\n --df-review-space-3: 12px;\n --df-review-space-3-5: 14px;\n --df-review-space-4: 16px;\n --df-review-control-height-sm: 32px;\n --df-review-control-height-md: 34px;\n --df-review-radius-xs: 3px;\n --df-review-radius-sm: 6px;\n --df-review-radius-md: 8px;\n --df-review-radius-pill: 999px;\n --df-review-color-canvas: #111820;\n --df-review-color-panel: #1f2428;\n --df-review-color-panel-strong: #15191d;\n --df-review-color-control: #2c3338;\n --df-review-color-control-hover: #3b444b;\n --df-review-color-border: rgba(255, 255, 255, 0.14);\n --df-review-color-border-strong: rgba(255, 255, 255, 0.18);\n --df-review-color-text: #f7f7f2;\n --df-review-color-text-muted: rgba(247, 247, 242, 0.62);\n --df-review-color-text-subtle: rgba(247, 247, 242, 0.46);\n --df-review-color-accent: #d7ff5f;\n --df-review-color-accent-contrast: #171b1e;\n --df-review-color-accent-soft: rgba(215, 255, 95, 0.16);\n --df-review-color-accent-ring: rgba(215, 255, 95, 0.6);\n --df-review-color-area: #63d7c7;\n --df-review-color-error: #ffb7a7;\n --df-review-shadow-panel: 0 18px 48px rgba(0, 0, 0, 0.34);\n --df-review-shadow-popover: 0 16px 38px rgba(0, 0, 0, 0.32);\n --df-review-shadow-highlight: 0 10px 30px rgba(0, 0, 0, 0.22);\n font-family: var(--df-review-font-sans);\n }\n\n * {\n box-sizing: border-box;\n }\n\n .dfwr-shell {\n display: none;\n position: fixed;\n inset: 0;\n z-index: 500;\n pointer-events: none;\n }\n\n .dfwr-shell.is-open {\n display: block;\n }\n\n .dfwr-shell.has-dismissible-draft {\n z-index: 900;\n }\n\n .dfwr-draft-cancel-layer {\n position: fixed;\n inset: 0;\n z-index: 2;\n pointer-events: auto;\n background: transparent;\n cursor: default;\n }\n\n .dfwr-panel {\n position: fixed;\n right: 16px;\n top: 16px;\n z-index: 3;\n width: min(380px, calc(100vw - 32px));\n max-height: calc(100vh - 32px);\n overflow: auto;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid var(--df-review-color-border);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-panel);\n }\n\n .dfwr-header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n padding: 14px 14px 10px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n }\n\n .dfwr-title {\n font-size: 15px;\n font-weight: 700;\n line-height: 1.25;\n }\n\n .dfwr-meta {\n max-width: 292px;\n margin-top: 4px;\n overflow: hidden;\n color: rgba(247, 247, 242, 0.56);\n font-size: var(--df-review-font-size-xs);\n line-height: 1.35;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .dfwr-toolbar,\n .dfwr-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n padding: 12px 14px;\n }\n\n .dfwr-body,\n .dfwr-list {\n padding: 0 14px 14px;\n }\n\n .dfwr-list {\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n padding-top: 12px;\n }\n\n .dfwr-button,\n .dfwr-icon-button {\n appearance: none;\n border: 1px solid var(--df-review-color-border-strong);\n background: var(--df-review-color-control);\n color: var(--df-review-color-text);\n cursor: pointer;\n font: inherit;\n }\n\n .dfwr-button {\n min-height: var(--df-review-control-height-md);\n padding: 0 12px;\n border-radius: var(--df-review-radius-sm);\n font-size: var(--df-review-font-size-sm);\n font-weight: 650;\n }\n\n .dfwr-button:hover,\n .dfwr-icon-button:hover,\n .dfwr-button.is-active {\n border-color: rgba(255, 255, 255, 0.4);\n background: var(--df-review-color-control-hover);\n }\n\n .dfwr-button.is-primary {\n border-color: var(--df-review-color-accent);\n background: var(--df-review-color-accent);\n color: var(--df-review-color-accent-contrast);\n }\n\n .dfwr-icon-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: var(--df-review-control-height-sm);\n padding: 0 8px;\n border-radius: var(--df-review-radius-sm);\n font-size: var(--df-review-font-size-xs);\n font-weight: 700;\n line-height: 1;\n text-transform: uppercase;\n }\n\n .dfwr-marker-layer {\n position: fixed;\n inset: 0;\n z-index: 1;\n pointer-events: none;\n }\n\n .dfwr-area-preview-layer {\n position: fixed;\n inset: 0;\n z-index: 3;\n pointer-events: none;\n }\n\n .dfwr-selection-highlight {\n position: fixed;\n z-index: 1;\n border: 2px solid #d7ff5f;\n border-radius: var(--df-review-radius-xs);\n background: rgba(215, 255, 95, 0.08);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.12),\n 0 10px 30px rgba(0, 0, 0, 0.22);\n animation: dfwr-selection-pulse 900ms ease 0s 2;\n }\n\n .dfwr-selection-highlight.is-draft {\n border-color: #63d7c7;\n background: rgba(99, 215, 199, 0.1);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.08),\n 0 10px 30px rgba(0, 0, 0, 0.2);\n animation: none;\n }\n\n .dfwr-dom-hover {\n position: fixed;\n z-index: 2;\n border: 1px solid #d7ff5f;\n border-radius: var(--df-review-radius-xs);\n background: rgba(215, 255, 95, 0.1);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.72),\n 0 0 0 9999px rgba(0, 0, 0, 0.08);\n pointer-events: none;\n }\n\n .dfwr-dom-hover[hidden] {\n display: none;\n }\n\n .dfwr-bound-marker,\n .dfwr-item-scope {\n --dfwr-scope: #7cc7ff;\n --dfwr-scope-rgb: 124, 199, 255;\n }\n\n .dfwr-bound-marker.is-scope-tablet,\n .dfwr-item-scope.is-scope-tablet {\n --dfwr-scope: #63d7c7;\n --dfwr-scope-rgb: 99, 215, 199;\n }\n\n .dfwr-bound-marker.is-scope-desktop,\n .dfwr-item-scope.is-scope-desktop {\n --dfwr-scope: #f3b75f;\n --dfwr-scope-rgb: 243, 183, 95;\n }\n\n .dfwr-bound-marker.is-scope-wide,\n .dfwr-item-scope.is-scope-wide {\n --dfwr-scope: #c99cff;\n --dfwr-scope-rgb: 201, 156, 255;\n }\n\n .dfwr-bound-marker.is-scope-dom,\n .dfwr-item-scope.is-scope-dom {\n --dfwr-scope: #ff8f61;\n --dfwr-scope-rgb: 255, 143, 97;\n }\n\n .dfwr-item-target-highlight,\n .dfwr-item-target-label {\n --dfwr-item-color: #7cc7ff;\n --dfwr-item-color-rgb: 124, 199, 255;\n }\n\n .dfwr-item-target-highlight.is-mode-area,\n .dfwr-item-target-label.is-mode-area {\n --dfwr-item-color: #63d7c7;\n --dfwr-item-color-rgb: 99, 215, 199;\n }\n\n .dfwr-item-target-highlight.is-mode-dom,\n .dfwr-item-target-label.is-mode-dom {\n --dfwr-item-color: #ff8f61;\n --dfwr-item-color-rgb: 255, 143, 97;\n }\n\n .dfwr-item-target-highlight {\n position: fixed;\n z-index: 2;\n border: 2px solid var(--dfwr-item-color);\n border-radius: 4px;\n background: rgba(var(--dfwr-item-color-rgb), 0.08);\n box-shadow:\n 0 0 0 1px rgba(31, 36, 40, 0.78),\n 0 0 0 9999px rgba(0, 0, 0, 0.08),\n 0 12px 30px rgba(0, 0, 0, 0.24);\n pointer-events: none;\n }\n\n .dfwr-item-target-highlight.is-fallback {\n border-style: dashed;\n }\n\n .dfwr-item-target-highlight.is-highlighted {\n border-width: 3px;\n background: rgba(var(--dfwr-item-color-rgb), 0.12);\n }\n\n .dfwr-item-target-highlight.is-highlighted::after {\n content: \"\";\n position: absolute;\n inset: -6px;\n border: 2px solid var(--dfwr-item-color);\n border-radius: var(--df-review-radius-md);\n opacity: 0;\n animation: dfwr-target-ring-blink 1000ms ease-in-out infinite;\n pointer-events: none;\n }\n\n .dfwr-item-target-label {\n position: fixed;\n z-index: 3;\n display: inline-flex;\n align-items: center;\n min-width: 24px;\n height: 20px;\n padding: 0 7px;\n border: 1px solid var(--dfwr-item-color);\n border-radius: 4px;\n background: var(--dfwr-item-color);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-item-color-rgb), 0.2),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n color: #111820;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 900;\n line-height: 1;\n pointer-events: none;\n }\n\n .dfwr-item-target-label.is-highlighted {\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker {\n position: fixed;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 4px;\n min-width: 28px;\n height: 22px;\n padding: 0 6px;\n transform: translate(-50%, -50%);\n border: 1px solid var(--dfwr-scope);\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-color-panel);\n box-shadow: 0 0 0 4px rgba(var(--dfwr-scope-rgb), 0.18);\n color: var(--dfwr-scope);\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n }\n\n .dfwr-bound-marker.is-highlighted {\n min-width: 32px;\n height: 26px;\n border-width: 2px;\n box-shadow:\n 0 0 0 5px rgba(var(--dfwr-scope-rgb), 0.22),\n 0 12px 26px rgba(0, 0, 0, 0.34);\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker.is-fallback {\n border-style: dashed;\n }\n\n .dfwr-bound-marker.is-note-callout,\n .dfwr-bound-marker.is-note-callout.is-highlighted {\n --dfwr-scope: #7cc7ff;\n --dfwr-scope-rgb: 124, 199, 255;\n min-width: 0;\n width: 0;\n height: 0;\n padding: 0;\n transform: none;\n border: 0;\n border-radius: 0;\n background: transparent;\n box-shadow: none;\n color: var(--dfwr-scope);\n animation: none;\n overflow: visible;\n }\n\n .dfwr-bound-marker.is-note-callout::before {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n width: 8px;\n height: 8px;\n transform: translate(-50%, -50%);\n border: 2px solid #111820;\n border-radius: var(--df-review-radius-pill);\n background: var(--dfwr-scope);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-scope-rgb), 0.22),\n 0 6px 16px rgba(0, 0, 0, 0.28);\n }\n\n .dfwr-bound-marker.is-note-callout.is-highlighted::before {\n animation: dfwr-note-dot-pulse 1000ms ease-in-out infinite;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon {\n position: absolute;\n left: 0;\n top: 0;\n width: 31px;\n height: 2px;\n transform: rotate(-42deg);\n transform-origin: left center;\n border-radius: var(--df-review-radius-pill);\n background: currentColor;\n opacity: 1;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon::before,\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-icon::after {\n display: none;\n }\n\n .dfwr-bound-marker.is-note-callout .dfwr-bound-marker-number {\n position: absolute;\n left: 24px;\n top: -41px;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 28px;\n height: 20px;\n padding: 0 7px;\n border: 1px solid var(--dfwr-scope);\n border-radius: 4px;\n background: var(--dfwr-scope);\n box-shadow:\n 0 0 0 3px rgba(var(--dfwr-scope-rgb), 0.18),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n color: #111820;\n text-align: center;\n line-height: 1;\n white-space: nowrap;\n }\n\n .dfwr-bound-marker.is-note-callout.is-highlighted .dfwr-bound-marker-icon,\n .dfwr-bound-marker.is-note-callout.is-highlighted .dfwr-bound-marker-number {\n animation: dfwr-selected-blink 1000ms ease-in-out infinite;\n }\n\n .dfwr-area-preview-layer .dfwr-bound-marker {\n border-color: #63d7c7;\n background: var(--df-review-color-panel);\n box-shadow:\n 0 0 0 5px rgba(99, 215, 199, 0.2),\n 0 12px 26px rgba(0, 0, 0, 0.3);\n color: #63d7c7;\n }\n\n .dfwr-bound-marker-icon {\n position: relative;\n display: inline-block;\n width: 10px;\n height: 10px;\n flex: 0 0 auto;\n }\n\n .dfwr-bound-marker-icon::before,\n .dfwr-bound-marker-icon::after {\n content: \"\";\n position: absolute;\n display: block;\n }\n\n .dfwr-bound-marker-icon::before {\n inset: 1px 2px;\n border: 1.5px solid currentColor;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-mobile .dfwr-bound-marker-icon::before {\n inset: 0 2.5px;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-tablet .dfwr-bound-marker-icon::before {\n inset: 0.5px 1.5px;\n border-radius: 2px;\n }\n\n .dfwr-bound-marker.is-scope-desktop .dfwr-bound-marker-icon::before {\n inset: 1px 0 3px;\n border-radius: 1px;\n }\n\n .dfwr-bound-marker.is-scope-desktop .dfwr-bound-marker-icon::after {\n left: 3px;\n right: 3px;\n bottom: 0;\n height: 1.5px;\n background: currentColor;\n }\n\n .dfwr-bound-marker.is-scope-wide .dfwr-bound-marker-icon::before {\n inset: 2px 0;\n border-radius: 1px;\n }\n\n .dfwr-bound-marker.is-scope-dom .dfwr-bound-marker-icon::before {\n inset: 2px;\n border-radius: 1px;\n transform: rotate(45deg);\n }\n\n .dfwr-bound-marker-number {\n min-width: 6px;\n text-align: center;\n line-height: 1;\n }\n\n .dfwr-note-draft {\n position: fixed;\n inset: 0;\n z-index: 4;\n pointer-events: none;\n }\n\n .dfwr-note-pin {\n appearance: none;\n position: fixed;\n z-index: 5;\n width: 18px;\n height: 18px;\n padding: 0;\n transform: translate(-50%, -50%);\n border: 2px solid #1f2428;\n border-radius: var(--df-review-radius-pill);\n background: var(--df-review-color-accent);\n box-shadow:\n 0 0 0 4px rgba(215, 255, 95, 0.22),\n 0 8px 18px rgba(0, 0, 0, 0.28);\n cursor: grab;\n pointer-events: auto;\n }\n\n .dfwr-note-pin:active {\n cursor: grabbing;\n }\n\n .dfwr-note-popover {\n position: fixed;\n z-index: 4;\n width: min(320px, calc(100vw - 24px));\n padding: 12px;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid rgba(215, 255, 95, 0.56);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-popover);\n }\n\n .dfwr-note-popover.is-composer,\n .dfwr-area-draft.is-composer {\n max-height: min(360px, calc(100vh - 32px));\n overflow: auto;\n border-color: rgba(99, 215, 199, 0.56);\n }\n\n .dfwr-note-popover.is-dragging,\n .dfwr-area-draft.is-dragging {\n user-select: none;\n }\n\n .dfwr-draft-drag-handle {\n display: block;\n width: 42px;\n height: 6px;\n margin: 0 auto 10px;\n padding: 0;\n cursor: grab;\n pointer-events: auto;\n background: rgba(247, 247, 242, 0.28);\n border: 0;\n border-radius: 999px;\n }\n\n .dfwr-draft-drag-handle:hover,\n .dfwr-draft-drag-handle:focus-visible {\n background: rgba(215, 255, 95, 0.62);\n }\n\n .dfwr-draft-drag-handle:active {\n cursor: grabbing;\n }\n\n .dfwr-area-draft {\n position: fixed;\n right: 16px;\n top: 16px;\n z-index: 4;\n width: min(360px, calc(100vw - 32px));\n max-height: calc(100vh - 32px);\n overflow: auto;\n padding: 12px;\n pointer-events: auto;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel);\n border: 1px solid rgba(215, 255, 95, 0.56);\n border-radius: var(--df-review-radius-md);\n box-shadow: var(--df-review-shadow-popover);\n }\n\n .dfwr-note-popover .dfwr-actions {\n padding: 0;\n }\n\n .dfwr-note-actions {\n justify-content: flex-end;\n }\n\n .dfwr-note-actions .dfwr-button:first-child {\n margin-right: auto;\n }\n\n .dfwr-area-draft .dfwr-actions {\n padding: 0;\n }\n\n .dfwr-form {\n display: grid;\n gap: 10px;\n }\n\n .dfwr-textarea {\n width: 100%;\n min-height: 92px;\n resize: vertical;\n border: 1px solid rgba(255, 255, 255, 0.16);\n border-radius: var(--df-review-radius-sm);\n padding: 10px;\n color: var(--df-review-color-text);\n background: var(--df-review-color-panel-strong);\n font: inherit;\n font-size: var(--df-review-font-size-md);\n line-height: 1.45;\n }\n\n .dfwr-textarea:focus {\n outline: 2px solid var(--df-review-color-accent-ring);\n outline-offset: 1px;\n }\n\n .dfwr-adjust-panel {\n display: grid;\n gap: 4px;\n padding: 8px 10px;\n border: 1px solid rgba(255, 255, 255, 0.12);\n border-radius: var(--df-review-radius-sm);\n background: rgba(255, 255, 255, 0.04);\n }\n\n .dfwr-adjust-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n min-width: 0;\n }\n\n .dfwr-adjust-panel-header .dfwr-adjust-help {\n flex: 1 1 auto;\n min-width: 0;\n }\n\n .dfwr-adjust-panel.is-active {\n border-color: rgba(215, 255, 95, 0.5);\n background: var(--df-review-color-accent-soft);\n }\n\n .dfwr-adjust-help,\n .dfwr-adjust-status {\n margin: 0;\n color: var(--df-review-color-text-muted);\n font-size: var(--df-review-font-size-xs);\n line-height: 1.35;\n }\n\n .dfwr-adjust-status {\n color: var(--df-review-color-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", monospace;\n }\n\n .dfwr-adjust-toggle {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 34px;\n height: 30px;\n padding: 0;\n border: 1px solid rgba(255, 255, 255, 0.2);\n border-radius: var(--df-review-radius-sm);\n background: rgba(255, 255, 255, 0.04);\n color: var(--df-review-color-text);\n cursor: pointer;\n font: inherit;\n font-size: 14px;\n font-weight: 800;\n line-height: 1;\n }\n\n .dfwr-adjust-toggle:hover,\n .dfwr-adjust-toggle:focus-visible,\n .dfwr-adjust-toggle.is-active {\n border-color: rgba(215, 255, 95, 0.68);\n background: var(--df-review-color-accent-soft);\n outline: none;\n }\n\n .dfwr-adjust-toggle svg {\n width: 18px;\n height: 18px;\n pointer-events: none;\n }\n\n .dfwr-empty,\n .dfwr-error {\n margin: 0;\n color: rgba(247, 247, 242, 0.62);\n font-size: var(--df-review-font-size-sm);\n line-height: 1.45;\n }\n\n .dfwr-error {\n color: var(--df-review-color-error);\n }\n\n .dfwr-preview,\n .dfwr-thumb {\n display: block;\n width: 100%;\n border: 1px solid var(--df-review-color-border);\n border-radius: var(--df-review-radius-sm);\n object-fit: cover;\n background: var(--df-review-color-canvas);\n }\n\n .dfwr-preview {\n max-height: 180px;\n }\n\n .dfwr-thumb {\n max-height: 120px;\n margin-top: 10px;\n }\n\n .dfwr-list-heading {\n margin-bottom: 10px;\n color: rgba(247, 247, 242, 0.74);\n font-size: var(--df-review-font-size-sm);\n font-weight: 700;\n }\n\n .dfwr-item {\n display: flex;\n gap: 12px;\n justify-content: space-between;\n padding: 12px 0;\n border-top: 1px solid rgba(255, 255, 255, 0.08);\n cursor: pointer;\n }\n\n .dfwr-item:first-of-type {\n border-top: 0;\n }\n\n .dfwr-item:focus-visible {\n outline: 2px solid rgba(215, 255, 95, 0.72);\n outline-offset: 4px;\n }\n\n .dfwr-item-body {\n min-width: 0;\n flex: 1;\n }\n\n .dfwr-item-badges {\n display: flex;\n align-items: center;\n gap: 6px;\n flex-wrap: wrap;\n }\n\n .dfwr-item-scope,\n .dfwr-item-kind {\n display: inline-flex;\n align-items: center;\n min-height: 20px;\n border-radius: var(--df-review-radius-pill);\n padding: 0 7px;\n font-size: var(--df-review-font-size-2xs);\n font-weight: 800;\n line-height: 1;\n letter-spacing: 0;\n text-transform: uppercase;\n }\n\n .dfwr-item-scope {\n border: 1px solid rgba(var(--dfwr-scope-rgb), 0.38);\n background: rgba(var(--dfwr-scope-rgb), 0.12);\n color: var(--dfwr-scope);\n }\n\n .dfwr-item-kind {\n border: 1px solid rgba(255, 255, 255, 0.12);\n background: rgba(255, 255, 255, 0.05);\n color: rgba(247, 247, 242, 0.64);\n }\n\n .dfwr-item-comment {\n margin: 4px 0;\n color: var(--df-review-color-text);\n font-size: var(--df-review-font-size-md);\n line-height: 1.42;\n overflow-wrap: anywhere;\n white-space: pre-wrap;\n }\n\n .dfwr-item-date {\n color: rgba(247, 247, 242, 0.46);\n font-size: var(--df-review-font-size-xs);\n }\n\n .dfwr-item-actions {\n display: flex;\n flex-direction: column;\n gap: 6px;\n flex: 0 0 auto;\n }\n\n .dfwr-text-layer,\n .dfwr-element-layer,\n .dfwr-area-layer {\n position: fixed;\n inset: 0;\n z-index: 1;\n pointer-events: auto;\n }\n\n .dfwr-text-layer {\n cursor: crosshair;\n background: rgba(0, 0, 0, 0.06);\n }\n\n .dfwr-element-layer {\n cursor: cell;\n background: rgba(0, 0, 0, 0.06);\n }\n\n .dfwr-area-layer {\n cursor: crosshair;\n background: rgba(0, 0, 0, 0.22);\n }\n\n .dfwr-area-box {\n position: fixed;\n z-index: 2;\n width: 0;\n height: 0;\n border: 1px solid #d7ff5f;\n background: rgba(215, 255, 95, 0.16);\n box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.18);\n }\n\n @keyframes dfwr-marker-pulse {\n 0% {\n transform: translate(-50%, -50%) scale(0.92);\n }\n 45% {\n transform: translate(-50%, -50%) scale(1.1);\n }\n 100% {\n transform: translate(-50%, -50%) scale(1);\n }\n }\n\n @keyframes dfwr-note-dot-pulse {\n 0% {\n transform: translate(-50%, -50%) scale(0.88);\n }\n 45% {\n transform: translate(-50%, -50%) scale(1.3);\n }\n 100% {\n transform: translate(-50%, -50%) scale(1);\n }\n }\n\n @keyframes dfwr-selected-blink {\n 0%,\n 100% {\n opacity: 0.78;\n }\n 50% {\n opacity: 1;\n }\n }\n\n @keyframes dfwr-target-ring-blink {\n 0%,\n 100% {\n opacity: 0;\n transform: scale(0.98);\n }\n 50% {\n opacity: 0.82;\n transform: scale(1);\n }\n }\n\n @keyframes dfwr-selection-pulse {\n 0% {\n opacity: 0.72;\n }\n 45% {\n opacity: 1;\n }\n 100% {\n opacity: 0.86;\n }\n }\n\n @media (max-width: 520px) {\n .dfwr-panel {\n right: 8px;\n top: 8px;\n width: calc(100vw - 16px);\n max-height: calc(100vh - 16px);\n }\n }\n `;\n return style;\n}\n","import type {\n DomAnchor,\n RelativeSelection,\n ReviewItem,\n ReviewPoint,\n ViewportSize,\n} from '../../types';\nimport { getAnchorCandidates } from '../dom.anchor';\nimport type { AreaDraft, NoteDraft } from './draft';\nimport { getItemMarker, getItemSelection } from './item';\n\n/** Formats area draft metadata for compact debug display in the overlay UI. */\nexport function formatAreaDraftMeta(draft: AreaDraft) {\n const parts = [`viewport ${formatSize(draft.viewport)}`];\n\n if (draft.selection) {\n parts.push(`rect ${formatSelection(draft.selection.viewport)}`);\n }\n\n if (draft.marker) {\n parts.push(`point ${formatPoint(draft.marker.viewport)}`);\n }\n\n return parts.join(' / ');\n}\n\n/** Formats note draft metadata for compact debug display in the overlay UI. */\nexport function formatNoteDraftMeta(draft: NoteDraft) {\n const parts = [\n `viewport ${formatSize(draft.viewport)}`,\n `point ${formatPoint(draft.marker.viewport)}`,\n ];\n\n if (draft.anchor) {\n parts.push(formatAnchorMeta(draft.anchor));\n }\n\n return parts.join(' / ');\n}\n\n/** Formats persisted item metadata for list rows, marker titles, and overlays. */\nexport function formatItemMeta(item: ReviewItem) {\n const parts = [formatDate(item.createdAt)];\n const marker = getItemMarker(item);\n const selection = getItemSelection(item);\n\n if (item.viewport) {\n parts.push(`viewport ${formatSize(item.viewport)}`);\n }\n\n if (marker) {\n parts.push(`point ${formatPoint(marker.viewport)}`);\n }\n\n if (selection) {\n parts.push(`rect ${formatSelection(selection.viewport)}`);\n }\n\n if (item.anchor) {\n parts.push(formatAnchorMeta(item.anchor));\n }\n\n return parts.join(' / ');\n}\n\nfunction formatDate(value: string) {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return value;\n\n return date.toLocaleString(undefined, {\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nfunction formatSize(size: ViewportSize) {\n return `${Math.round(size.width)}x${Math.round(size.height)}`;\n}\n\nfunction formatPoint(point: ReviewPoint) {\n return `${Math.round(point.x)},${Math.round(point.y)}`;\n}\n\nfunction formatSelection(selection: RelativeSelection) {\n return [\n Math.round(selection.x),\n Math.round(selection.y),\n Math.round(selection.width),\n Math.round(selection.height),\n ].join(',');\n}\n\nfunction formatAnchorMeta(anchor: DomAnchor) {\n const parts = [`dom ${anchor.strategy}`];\n\n if (typeof anchor.confidence === 'number') {\n parts.push(`${Math.round(anchor.confidence * 100)}%`);\n }\n\n const candidates = getAnchorCandidates(anchor);\n if (candidates.length > 1) {\n parts.push(`${candidates.length} candidates`);\n }\n\n return parts.join(' ');\n}\n","import type {\n NumberedReviewItem,\n ReviewItem,\n ReviewItemScope,\n ReviewMode,\n ReviewPoint,\n ViewportSize,\n WebReviewKitOptions,\n} from '../types';\nimport {\n getDomAnchorFromPoint,\n getElementViewportSelection,\n resolveAnchorElement,\n} from './dom.anchor';\nimport {\n clampPoint,\n clamp,\n getPopoverPosition,\n getViewportSize,\n isPointInViewport,\n placeLayerOverTarget,\n roundPoint,\n toHostPoint,\n toHostSelection,\n toTargetPoint,\n toTargetPointFromHostEvent,\n toViewportSelection,\n type ReviewEnvironment,\n type ViewportSelection,\n} from './geometry';\nimport { getRouteKey } from './location';\nimport { createStyleElement } from './overlay.style';\nimport type { AreaDraft, NoteDraft } from './review/draft';\nimport { formatItemMeta, formatNoteDraftMeta } from './review/format';\nimport {\n getBoundMarkerPoint,\n getItemHighlightSelection,\n getReviewItemHighlightMode,\n shouldShowMarkerForScope,\n} from './review/item';\nimport {\n findReviewViewportPreset,\n getNumberedReviewItems,\n getReviewViewportScope,\n} from './review/scope';\n\n/** Minimal item payload collected by the view before the app fills persistence metadata. */\nexport type CreateReviewItemInput = Pick<ReviewItem, 'kind' | 'comment'> &\n Partial<\n Pick<ReviewItem, 'scope' | 'viewport' | 'anchor' | 'marker' | 'selection'>\n >;\n\nconst DEFAULT_ADJUSTMENT_LABEL = 'Responsive CSS px adjustments';\n\ninterface WebReviewKitViewState {\n isOpen: boolean;\n mode: ReviewMode;\n items: ReviewItem[];\n noteDraft?: NoteDraft;\n areaDraft?: AreaDraft;\n isSelectingArea: boolean;\n highlightedItemId?: string;\n}\n\ninterface WebReviewKitViewActions {\n close: () => void;\n render: () => void;\n reload: () => Promise<ReviewItem[]>;\n restoreItem: (item: ReviewItem) => Promise<void>;\n removeItem: (itemId: string) => Promise<void>;\n setModeState: (mode: ReviewMode) => void;\n clearDrafts: () => void;\n setNoteDraft: (draft?: NoteDraft) => void;\n setAreaDraft: (draft?: AreaDraft) => void;\n setSelectingArea: (isSelectingArea: boolean) => void;\n createItem: (input: CreateReviewItemInput) => Promise<void>;\n bindNoteDraftToPoint: (point: ReviewPoint, comment?: string) => Promise<void>;\n bindElementDraftToPoint: (\n point: ReviewPoint,\n comment?: string\n ) => Promise<void>;\n createAreaDraft: (selection: ViewportSelection) => Promise<void>;\n}\n\ninterface WebReviewKitViewConfig {\n options: WebReviewKitOptions;\n getState: () => WebReviewKitViewState;\n getEnvironment: () => ReviewEnvironment | undefined;\n actions: WebReviewKitViewActions;\n}\n\ntype DraftPreviewElement = HTMLElement | SVGElement;\n\ninterface DraftPreviewSnapshot {\n element: DraftPreviewElement;\n clone: DraftPreviewElement;\n visibility: string;\n}\n\n/** Vanilla DOM renderer for the core overlay, separate from React shell chrome. */\nexport class WebReviewKitView {\n private draftPreview?: DraftPreviewSnapshot;\n\n constructor(private readonly config: WebReviewKitViewConfig) {}\n\n clearDraftPreview() {\n this.restoreDraftPreview();\n }\n\n render(shadow: ShadowRoot, hiddenItemsStyle: HTMLStyleElement) {\n const state = this.state;\n this.syncDraftPreview(\n state.isOpen && state.mode === 'element' ? state.noteDraft : undefined\n );\n\n shadow.replaceChildren();\n shadow.append(createStyleElement());\n shadow.append(hiddenItemsStyle);\n\n const hasDismissableDraft = Boolean(state.noteDraft || state.areaDraft);\n const shell = document.createElement('div');\n shell.className = [\n 'dfwr-shell',\n state.isOpen ? 'is-open' : '',\n hasDismissableDraft ? 'has-dismissible-draft' : '',\n ]\n .filter(Boolean)\n .join(' ');\n shell.setAttribute('aria-hidden', state.isOpen ? 'false' : 'true');\n\n if (this.config.options.ui?.panel !== false) {\n // Standalone core usage gets a built-in panel; React shell disables this.\n const panel = document.createElement('div');\n panel.className = 'dfwr-panel';\n panel.setAttribute('role', 'dialog');\n panel.setAttribute('aria-label', 'Web review kit');\n\n panel.append(\n this.createHeader(),\n this.createToolbar(),\n this.createBody(),\n this.createList()\n );\n\n shell.append(panel);\n }\n\n shell.append(this.createMarkerLayer());\n if (state.isOpen && hasDismissableDraft) {\n shell.append(this.createDraftCancelLayer());\n }\n\n if (state.isOpen && (state.mode === 'note' || state.mode === 'element')) {\n shell.append(\n state.noteDraft\n ? this.createNotePopover(state.noteDraft)\n : state.mode === 'element'\n ? this.createElementLayer()\n : this.createNoteLayer()\n );\n }\n\n if (state.isOpen && state.mode === 'area' && !state.areaDraft) {\n shell.append(this.createAreaLayer());\n }\n\n if (\n state.isOpen &&\n state.mode === 'area' &&\n state.areaDraft &&\n this.config.options.ui?.panel === false\n ) {\n // Shell mode renders the draft form near the target because the side panel is React-owned.\n if (state.areaDraft.selection) {\n shell.append(this.createAreaDraftOverlay(state.areaDraft));\n }\n shell.append(this.createAreaDraftPopover(state.areaDraft));\n }\n\n shadow.append(shell);\n }\n\n private get state() {\n return this.config.getState();\n }\n\n private createDraftCancelLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-draft-cancel-layer';\n layer.setAttribute('aria-hidden', 'true');\n\n const cancel = (event: Event) => {\n event.preventDefault();\n event.stopPropagation();\n event.stopImmediatePropagation();\n this.config.actions.setModeState('idle');\n this.config.actions.clearDrafts();\n this.config.actions.setSelectingArea(false);\n this.config.actions.render();\n };\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n cancel(event);\n });\n\n return layer;\n }\n\n private getDraftAdjustmentMetrics(draft: NoteDraft) {\n const adjustment = draft.adjustment;\n const x = adjustment?.x ?? 0;\n const y = adjustment?.y ?? 0;\n const scale = adjustment?.scale ?? 0;\n const {\n scale: viewportScale,\n designWidth,\n presetLabel,\n } = this.getDraftViewportScale(draft.viewport);\n const selection = draft.selection\n ? toViewportSelection(draft.selection.viewport)\n : undefined;\n const scaleCssDelta = scale * viewportScale;\n const scaleFactor =\n selection && selection.width > 0\n ? Math.max(\n 1 / selection.width,\n (selection.width + scaleCssDelta) / selection.width\n )\n : 1;\n\n return {\n x,\n y,\n scale,\n cssX: x * viewportScale,\n cssY: y * viewportScale,\n scaleFactor,\n viewportScale,\n designWidth,\n presetLabel,\n viewportWidth: draft.viewport.width,\n };\n }\n\n private hasDraftAdjustment(draft: NoteDraft) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return metrics.x !== 0 || metrics.y !== 0 || metrics.scale !== 0;\n }\n\n private getAdjustedDraftPoint(point: ReviewPoint, draft: NoteDraft) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return {\n x: point.x + metrics.cssX,\n y: point.y + metrics.cssY,\n };\n }\n\n private getAdjustedDraftSelection(\n selection: ViewportSelection,\n draft: NoteDraft\n ) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return {\n ...selection,\n left: selection.left + metrics.cssX,\n top: selection.top + metrics.cssY,\n width: selection.width * metrics.scaleFactor,\n height: selection.height * metrics.scaleFactor,\n };\n }\n\n private getDraftViewportScale(viewport: ViewportSize) {\n const preset = findReviewViewportPreset(\n viewport,\n this.config.options.viewports?.presets\n );\n const designWidth =\n typeof preset.designWidth === 'number' && preset.designWidth > 0\n ? preset.designWidth\n : viewport.width;\n const scale = designWidth > 0 ? viewport.width / designWidth : 1;\n\n return { scale, designWidth, presetLabel: preset.label };\n }\n\n private getDraftComposerWidth(environment: ReviewEnvironment) {\n const bounds = environment.overlayRect;\n const margin = 12;\n return Math.min(360, Math.max(240, bounds.width - margin * 2));\n }\n\n private getClampedComposerPosition(\n position: ReviewPoint,\n environment: ReviewEnvironment,\n size?: { width?: number; height?: number },\n bounds = environment.overlayRect\n ) {\n const margin = 12;\n const width = size?.width ?? this.getDraftComposerWidth(environment);\n const height = size?.height ?? 236;\n\n return {\n x: clamp(\n position.x,\n bounds.left + margin,\n bounds.left + bounds.width - width - margin\n ),\n y: clamp(\n position.y,\n bounds.top + margin,\n bounds.top + bounds.height - height - margin\n ),\n };\n }\n\n private getHostComposerBounds() {\n const root = document.documentElement;\n return {\n left: 0,\n top: 0,\n width: root.clientWidth || window.innerWidth,\n height: root.clientHeight || window.innerHeight,\n };\n }\n\n private getInitialDraftComposerPosition(\n selection: ViewportSelection | undefined,\n environment: ReviewEnvironment,\n size: { width: number; height?: number }\n ) {\n const bounds = this.getHostComposerBounds();\n const margin = 12;\n const gap = 20;\n\n if (!selection) {\n return this.getClampedComposerPosition(\n {\n x: environment.overlayRect.left + margin,\n y: environment.overlayRect.top + margin,\n },\n environment,\n size,\n bounds\n );\n }\n\n const preferredX = selection.left + selection.width + gap;\n const maxX = bounds.left + bounds.width - size.width - margin;\n const x =\n preferredX <= maxX\n ? preferredX\n : selection.left - size.width - gap;\n\n return this.getClampedComposerPosition(\n {\n x,\n y: selection.top,\n },\n environment,\n size,\n bounds\n );\n }\n\n private getDraftComposerPosition({\n selection,\n environment,\n composerPosition,\n estimatedHeight,\n }: {\n selection?: ViewportSelection;\n environment: ReviewEnvironment;\n composerPosition?: ReviewPoint;\n estimatedHeight?: number;\n }) {\n const width = this.getDraftComposerWidth(environment);\n\n if (composerPosition) {\n const clamped = this.getClampedComposerPosition(\n composerPosition,\n environment,\n { width, height: estimatedHeight },\n this.getHostComposerBounds()\n );\n return { width, left: clamped.x, top: clamped.y };\n }\n\n const position = this.getInitialDraftComposerPosition(selection, environment, {\n width,\n height: estimatedHeight,\n });\n\n return { width, left: position.x, top: position.y };\n }\n\n private getSelectionMqMetrics(\n selection: ViewportSelection,\n viewport: ViewportSize\n ) {\n const { scale } = this.getDraftViewportScale(viewport);\n const ratio = scale > 0 ? 1 / scale : 1;\n\n return {\n x: selection.left * ratio,\n y: selection.top * ratio,\n width: selection.width * ratio,\n height: selection.height * ratio,\n };\n }\n\n private formatSignedPx(value: number) {\n if (value === 0) return '+0px';\n return `${value > 0 ? '+' : ''}${value}px`;\n }\n\n private formatRoundedPx(value: number) {\n return `${Math.round(value)}px`;\n }\n\n private getAdjustmentLabel() {\n return (\n this.config.options.adjustmentLabel?.trim() || DEFAULT_ADJUSTMENT_LABEL\n );\n }\n\n private getSelectionMetricLines(\n selection: ViewportSelection | undefined,\n viewport: ViewportSize\n ) {\n if (!selection) return ['area', 'x none / y none', 'w none / h none'];\n\n const metrics = this.getSelectionMqMetrics(selection, viewport);\n return [\n 'area',\n `x ${this.formatRoundedPx(metrics.x)} / y ${this.formatRoundedPx(\n metrics.y\n )}`,\n `w ${this.formatRoundedPx(metrics.width)} / h ${this.formatRoundedPx(\n metrics.height\n )}`,\n ];\n }\n\n private getAreaDraftMetricSelection(draft: AreaDraft) {\n if (!draft.selection) return undefined;\n\n return toViewportSelection(draft.selection.viewport);\n }\n\n private getDraftAdjustmentMetricLines(draft: NoteDraft) {\n const metrics = this.getDraftAdjustmentMetrics(draft);\n return [\n `x ${this.formatSignedPx(metrics.x)} / y ${this.formatSignedPx(\n metrics.y\n )}`,\n `scale ${this.formatSignedPx(metrics.scale)}`,\n ];\n }\n\n private withDraftAdjustmentComment(comment: string, draft: NoteDraft) {\n if (!this.hasDraftAdjustment(draft)) return comment;\n\n const trimmedComment = comment.trim();\n const metrics = this.getDraftAdjustmentMetrics(draft);\n const adjustment = [\n `${this.getAdjustmentLabel()}: x ${this.formatSignedPx(\n metrics.x\n )}, y ${this.formatSignedPx(metrics.y)}, scale ${this.formatSignedPx(\n metrics.scale\n )}`,\n `(${metrics.presetLabel} viewport, ${Math.round(\n metrics.viewportWidth\n )}/design ${Math.round(metrics.designWidth)})`,\n ].join(' ');\n\n return trimmedComment ? `${trimmedComment}\\n${adjustment}` : adjustment;\n }\n\n private getStyleableDraftElement(\n draft: NoteDraft,\n environment: ReviewEnvironment\n ): DraftPreviewElement | undefined {\n if (\n draft.previewElement &&\n draft.previewElement.ownerDocument === environment.document &&\n 'style' in draft.previewElement\n ) {\n return draft.previewElement;\n }\n\n if (!draft.anchor) return undefined;\n\n const preferredSelection = draft.selection\n ? toViewportSelection(draft.selection.viewport)\n : undefined;\n const element = resolveAnchorElement(\n draft.anchor,\n environment,\n preferredSelection\n )?.element;\n if (!element) return undefined;\n\n if ('style' in element) return element as DraftPreviewElement;\n\n return undefined;\n }\n\n private syncDraftPreview(draft?: NoteDraft) {\n const environment = this.config.getEnvironment();\n if (!draft || !environment || !this.hasDraftAdjustment(draft)) {\n this.restoreDraftPreview();\n return;\n }\n\n const element = this.getStyleableDraftElement(draft, environment);\n if (!element) {\n this.restoreDraftPreview();\n return;\n }\n\n if (this.draftPreview?.element !== element) {\n this.restoreDraftPreview();\n }\n\n if (!this.draftPreview) {\n const computedStyle = environment.window.getComputedStyle(element);\n const clone = element.cloneNode(true) as DraftPreviewElement;\n this.removeDuplicateIds(clone);\n this.copyComputedStyle(element, clone, environment);\n this.positionDraftPreviewClone(clone, element, computedStyle);\n environment.document.body?.appendChild(clone);\n this.draftPreview = {\n element,\n clone,\n visibility: element.style.visibility,\n };\n element.style.visibility = 'hidden';\n }\n\n const metrics = this.getDraftAdjustmentMetrics(draft);\n const translate = `translate(${this.toCssNumber(metrics.cssX)}px, ${this.toCssNumber(\n metrics.cssY\n )}px)`;\n const scale =\n metrics.scaleFactor === 1\n ? ''\n : `scale(${this.toCssNumber(metrics.scaleFactor)})`;\n this.draftPreview.clone.style.transform = [translate, scale]\n .filter(Boolean)\n .join(' ');\n }\n\n private restoreDraftPreview() {\n if (!this.draftPreview) return;\n\n const { element, clone, visibility } = this.draftPreview;\n clone.remove();\n element.style.visibility = visibility;\n this.draftPreview = undefined;\n }\n\n private positionDraftPreviewClone(\n clone: DraftPreviewElement,\n element: DraftPreviewElement,\n computedStyle: CSSStyleDeclaration\n ) {\n const rect = element.getBoundingClientRect();\n clone.setAttribute('data-dfwr-adjust-preview', 'true');\n clone.setAttribute('aria-hidden', 'true');\n clone.style.position = 'fixed';\n clone.style.left = `${this.toCssNumber(rect.left)}px`;\n clone.style.top = `${this.toCssNumber(rect.top)}px`;\n clone.style.right = 'auto';\n clone.style.bottom = 'auto';\n clone.style.width = `${this.toCssNumber(rect.width)}px`;\n clone.style.height = `${this.toCssNumber(rect.height)}px`;\n clone.style.maxWidth = 'none';\n clone.style.maxHeight = 'none';\n clone.style.margin = '0';\n clone.style.boxSizing = 'border-box';\n clone.style.display = this.getDraftPreviewDisplay(computedStyle.display);\n clone.style.zIndex = '2147483646';\n clone.style.pointerEvents = 'none';\n clone.style.transition = 'none';\n clone.style.willChange = 'transform';\n clone.style.transformOrigin = 'top left';\n clone.style.transform = 'none';\n }\n\n private getDraftPreviewDisplay(display: string) {\n if (display === 'inline' || display === 'contents') return 'inline-block';\n return display || 'block';\n }\n\n private copyComputedStyle(\n element: DraftPreviewElement,\n clone: DraftPreviewElement,\n environment: ReviewEnvironment\n ) {\n const computedStyle = environment.window.getComputedStyle(element);\n for (let index = 0; index < computedStyle.length; index += 1) {\n const property = computedStyle.item(index);\n clone.style.setProperty(\n property,\n computedStyle.getPropertyValue(property),\n computedStyle.getPropertyPriority(property)\n );\n }\n }\n\n private removeDuplicateIds(element: Element) {\n element.removeAttribute('id');\n element.querySelectorAll('[id]').forEach((child) => {\n child.removeAttribute('id');\n });\n }\n\n private toCssNumber(value: number) {\n return Math.round(value * 1000) / 1000;\n }\n\n private createHeader() {\n const header = document.createElement('div');\n header.className = 'dfwr-header';\n\n const title = document.createElement('div');\n title.className = 'dfwr-title';\n title.textContent = 'Review Kit';\n\n const meta = document.createElement('div');\n meta.className = 'dfwr-meta';\n meta.textContent = getRouteKey(this.config.getEnvironment());\n\n const titleGroup = document.createElement('div');\n titleGroup.append(title, meta);\n\n const close = document.createElement('button');\n close.className = 'dfwr-icon-button';\n close.type = 'button';\n close.textContent = 'x';\n close.setAttribute('aria-label', 'Close');\n close.addEventListener('click', () => this.config.actions.close());\n\n header.append(titleGroup, close);\n return header;\n }\n\n private createToolbar() {\n const toolbar = document.createElement('div');\n toolbar.className = 'dfwr-toolbar';\n\n toolbar.append(\n this.createToolbarButton('Note', this.state.mode === 'note', () => {\n const mode = this.state.mode;\n this.config.actions.setModeState(mode === 'note' ? 'idle' : 'note');\n this.config.actions.clearDrafts();\n this.config.actions.render();\n }),\n this.createToolbarButton('Element', this.state.mode === 'element', () => {\n const mode = this.state.mode;\n this.config.actions.setModeState(\n mode === 'element' ? 'idle' : 'element'\n );\n this.config.actions.clearDrafts();\n this.config.actions.render();\n }),\n this.createToolbarButton(\n this.state.isSelectingArea ? 'Selecting' : 'Area',\n this.state.mode === 'area',\n () => {\n const mode = this.state.mode;\n this.config.actions.setModeState(mode === 'area' ? 'idle' : 'area');\n this.config.actions.clearDrafts();\n this.config.actions.render();\n }\n ),\n this.createToolbarButton('Refresh', false, () => {\n void this.config.actions.reload();\n })\n );\n\n return toolbar;\n }\n\n private createToolbarButton(\n label: string,\n active: boolean,\n onClick: () => void\n ) {\n const button = document.createElement('button');\n button.className = `dfwr-button${active ? ' is-active' : ''}`;\n button.type = 'button';\n button.textContent = label;\n button.addEventListener('click', onClick);\n return button;\n }\n\n private createBody() {\n const body = document.createElement('div');\n body.className = 'dfwr-body';\n const state = this.state;\n\n if (state.mode === 'idle') {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'Add a note or mark an area.';\n body.append(empty);\n return body;\n }\n\n if (state.mode === 'note' || state.mode === 'element') {\n body.append(this.createNoteBody());\n return body;\n }\n\n body.append(this.createAreaForm());\n return body;\n }\n\n private createNoteBody() {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = this.state.noteDraft\n ? 'Write the note in the page box.'\n : this.state.mode === 'element'\n ? 'Click an element to add QA.'\n : 'Click on the page to place a note.';\n return empty;\n }\n\n private createNotePopover(draft: NoteDraft) {\n const environment = this.config.getEnvironment();\n const group = document.createElement('div');\n group.className = 'dfwr-note-draft';\n if (!environment) return group;\n\n const isElementDraft = this.state.mode === 'element' && Boolean(draft.selection);\n const hostPoint = toHostPoint(\n isElementDraft\n ? this.getAdjustedDraftPoint(draft.marker.viewport, draft)\n : draft.marker.viewport,\n environment\n );\n let selectionHighlight: HTMLDivElement | undefined;\n\n if (draft.selection) {\n const selection = toViewportSelection(draft.selection.viewport);\n selectionHighlight = this.createSelectionHighlight(\n isElementDraft\n ? this.getAdjustedDraftSelection(selection, draft)\n : selection,\n environment,\n true\n );\n group.append(selectionHighlight);\n }\n\n const pin = document.createElement('button');\n pin.className = 'dfwr-note-pin';\n pin.type = 'button';\n pin.setAttribute('aria-label', 'Move note point');\n pin.style.left = `${hostPoint.x}px`;\n pin.style.top = `${hostPoint.y}px`;\n\n const popover = document.createElement('div');\n const position = getPopoverPosition(hostPoint, environment);\n\n popover.className = `dfwr-note-popover${\n isElementDraft ? ' is-composer' : ''\n }`;\n if (isElementDraft) {\n const selection = draft.selection\n ? toHostSelection(\n this.getAdjustedDraftSelection(\n toViewportSelection(draft.selection.viewport),\n draft\n ),\n environment\n )\n : undefined;\n const composer = this.getDraftComposerPosition({\n selection,\n environment,\n composerPosition: draft.composerPosition,\n estimatedHeight: 252,\n });\n popover.style.left = `${composer.left}px`;\n popover.style.top = `${composer.top}px`;\n popover.style.width = `${composer.width}px`;\n } else {\n popover.style.left = `${position.left}px`;\n popover.style.top = `${position.top}px`;\n }\n\n const form = document.createElement('form');\n form.className = 'dfwr-form';\n\n const meta = isElementDraft ? undefined : document.createElement('div');\n if (meta) {\n meta.className = 'dfwr-item-date';\n meta.textContent = formatNoteDraftMeta(draft);\n }\n\n const textarea = document.createElement('textarea');\n textarea.className = 'dfwr-textarea';\n textarea.placeholder = 'Review comment';\n textarea.rows = 4;\n textarea.value = draft.comment ?? '';\n textarea.addEventListener('input', () => {\n const noteDraft = this.state.noteDraft;\n if (!noteDraft) return;\n this.config.actions.setNoteDraft({\n ...noteDraft,\n comment: textarea.value,\n });\n });\n\n const saveDraft = () => {\n const comment = textarea.value.trim();\n const currentDraft = this.state.noteDraft ?? draft;\n if (!comment && !this.hasDraftAdjustment(currentDraft)) return;\n void this.config.actions.createItem({\n kind: 'note',\n comment: this.withDraftAdjustmentComment(comment, currentDraft),\n viewport: currentDraft.viewport,\n anchor: currentDraft.anchor,\n marker: currentDraft.marker,\n selection: currentDraft.selection,\n });\n };\n\n const adjustmentControls = isElementDraft\n ? this.createAdjustmentControls({\n draft,\n pin,\n popover,\n selectionHighlight,\n textarea,\n })\n : undefined;\n\n const actions = this.createFormActions('Save note', saveDraft);\n\n form.append(\n ...(meta ? [meta] : []),\n ...(adjustmentControls ? [adjustmentControls.panel] : []),\n textarea,\n actions\n );\n const dragHandle = isElementDraft\n ? this.createDraftDragHandle('Move DOM composer')\n : undefined;\n popover.append(...(dragHandle ? [dragHandle] : []), form);\n group.append(pin, popover);\n\n if (dragHandle) {\n this.attachDraftComposerDrag(popover, dragHandle, (composerPosition) => {\n const noteDraft = this.state.noteDraft ?? draft;\n this.config.actions.setNoteDraft({\n ...noteDraft,\n composerPosition,\n comment: textarea.value,\n });\n });\n }\n\n this.attachDraftPinDrag(\n pin,\n isElementDraft ? undefined : popover,\n meta,\n textarea\n );\n\n window.setTimeout(() => {\n if (draft.adjustment?.isActive) {\n adjustmentControls?.focusTarget.focus();\n return;\n }\n\n textarea.focus();\n }, 0);\n\n return group;\n }\n\n private createDraftDragHandle(label: string) {\n const handle = document.createElement('button');\n handle.className = 'dfwr-draft-drag-handle';\n handle.type = 'button';\n handle.setAttribute('aria-label', label);\n return handle;\n }\n\n private createIcon(paths: string[]) {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('aria-hidden', 'true');\n svg.setAttribute('viewBox', '0 0 24 24');\n svg.setAttribute('fill', 'none');\n svg.setAttribute('stroke', 'currentColor');\n svg.setAttribute('stroke-width', '2.4');\n svg.setAttribute('stroke-linecap', 'round');\n svg.setAttribute('stroke-linejoin', 'round');\n\n paths.forEach((d) => {\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n path.setAttribute('d', d);\n svg.append(path);\n });\n\n return svg;\n }\n\n private setAdjustmentToggleIcon(button: HTMLButtonElement, isActive: boolean) {\n const paths = isActive\n ? ['M20 6 9 17l-5-5']\n : [\n 'M12 2v20',\n 'M2 12h20',\n 'm9 5 3-3 3 3',\n 'm9 19 3 3 3-3',\n 'm5 9-3 3 3 3',\n 'm19 9 3 3-3 3',\n ];\n button.replaceChildren(this.createIcon(paths));\n }\n\n private attachDraftComposerDrag(\n popover: HTMLDivElement,\n handle: HTMLButtonElement,\n onMove: (position: ReviewPoint) => void\n ) {\n let isDragging = false;\n let offsetX = 0;\n let offsetY = 0;\n\n const movePopover = (event: PointerEvent) => {\n const environment = this.config.getEnvironment();\n if (!environment) return;\n\n const position = this.getClampedComposerPosition(\n {\n x: event.clientX - offsetX,\n y: event.clientY - offsetY,\n },\n environment,\n {\n width: popover.offsetWidth,\n height: popover.offsetHeight,\n },\n this.getHostComposerBounds()\n );\n\n popover.style.left = `${position.x}px`;\n popover.style.top = `${position.y}px`;\n onMove(position);\n };\n\n handle.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n\n const rect = popover.getBoundingClientRect();\n offsetX = event.clientX - rect.left;\n offsetY = event.clientY - rect.top;\n isDragging = true;\n\n event.preventDefault();\n event.stopPropagation();\n handle.setPointerCapture(event.pointerId);\n popover.classList.add('is-dragging');\n });\n\n handle.addEventListener('pointermove', (event) => {\n if (!isDragging || !handle.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n movePopover(event);\n });\n\n const stopDrag = (event: PointerEvent) => {\n if (!isDragging || !handle.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = false;\n handle.releasePointerCapture(event.pointerId);\n popover.classList.remove('is-dragging');\n movePopover(event);\n };\n\n handle.addEventListener('pointerup', stopDrag);\n handle.addEventListener('pointercancel', stopDrag);\n }\n\n private createAdjustmentControls({\n draft,\n pin,\n popover,\n selectionHighlight,\n textarea,\n }: {\n draft: NoteDraft;\n pin: HTMLButtonElement;\n popover: HTMLDivElement;\n selectionHighlight?: HTMLDivElement;\n textarea: HTMLTextAreaElement;\n }) {\n const panel = document.createElement('div');\n panel.className = 'dfwr-adjust-panel is-dom-adjust-panel';\n\n const header = document.createElement('div');\n header.className = 'dfwr-adjust-panel-header';\n const help = document.createElement('div');\n help.className = 'dfwr-adjust-help';\n help.textContent = this.getAdjustmentLabel();\n\n const adjust = document.createElement('button');\n adjust.className = 'dfwr-adjust-toggle';\n adjust.type = 'button';\n adjust.title = 'Adjust DOM element with keyboard arrows';\n adjust.setAttribute('aria-label', 'Adjust DOM element with keyboard arrows');\n\n const xyStatus = document.createElement('div');\n xyStatus.className = 'dfwr-adjust-status';\n\n const scaleStatus = document.createElement('div');\n scaleStatus.className = 'dfwr-adjust-status';\n\n const syncControls = (nextDraft: NoteDraft) => {\n const isActive = nextDraft.adjustment?.isActive === true;\n panel.classList.toggle('is-active', isActive);\n adjust.classList.toggle('is-active', isActive);\n adjust.setAttribute('aria-pressed', isActive ? 'true' : 'false');\n this.setAdjustmentToggleIcon(adjust, isActive);\n adjust.title = isActive\n ? 'Finish DOM adjustment'\n : 'Adjust DOM element with keyboard arrows';\n adjust.setAttribute(\n 'aria-label',\n isActive\n ? 'Finish DOM adjustment'\n : 'Adjust DOM element with keyboard arrows'\n );\n const [xyLine, scaleLine] = this.getDraftAdjustmentMetricLines(nextDraft);\n xyStatus.textContent = xyLine;\n scaleStatus.textContent = scaleLine;\n this.syncDraftAdjustmentUi({\n draft: nextDraft,\n pin,\n selectionHighlight,\n });\n };\n\n const updateDraft = (updater: (current: NoteDraft) => NoteDraft) => {\n const currentDraft = this.state.noteDraft ?? draft;\n const nextDraft = updater(currentDraft);\n this.config.actions.setNoteDraft({\n ...nextDraft,\n comment: textarea.value,\n });\n syncControls(nextDraft);\n };\n\n adjust.addEventListener('click', () => {\n updateDraft((currentDraft) => ({\n ...currentDraft,\n adjustment: {\n x: currentDraft.adjustment?.x ?? 0,\n y: currentDraft.adjustment?.y ?? 0,\n scale: currentDraft.adjustment?.scale ?? 0,\n isActive: currentDraft.adjustment?.isActive !== true,\n },\n }));\n adjust.focus();\n });\n\n popover.addEventListener('keydown', (event) => {\n const currentDraft = this.state.noteDraft ?? draft;\n if (currentDraft.adjustment?.isActive !== true) return;\n\n const keyDelta = this.getAdjustmentKeyDelta(event);\n if (!keyDelta) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n updateDraft((activeDraft) => ({\n ...activeDraft,\n adjustment: {\n x: (activeDraft.adjustment?.x ?? 0) + keyDelta.x,\n y: (activeDraft.adjustment?.y ?? 0) + keyDelta.y,\n scale: (activeDraft.adjustment?.scale ?? 0) + keyDelta.scale,\n isActive: true,\n },\n }));\n });\n\n header.append(help, adjust);\n panel.append(header, xyStatus, scaleStatus);\n syncControls(draft);\n\n return {\n panel,\n focusTarget: adjust,\n };\n }\n\n private getAdjustmentKeyDelta(event: KeyboardEvent) {\n const step = event.shiftKey ? 10 : 1;\n\n if (event.key === 'ArrowLeft') return { x: -step, y: 0, scale: 0 };\n if (event.key === 'ArrowRight') return { x: step, y: 0, scale: 0 };\n if (event.key === 'ArrowUp') return { x: 0, y: -step, scale: 0 };\n if (event.key === 'ArrowDown') return { x: 0, y: step, scale: 0 };\n if (event.key.toLowerCase() === 'w') return { x: 0, y: 0, scale: step };\n if (event.key.toLowerCase() === 's') return { x: 0, y: 0, scale: -step };\n\n return undefined;\n }\n\n private syncDraftAdjustmentUi({\n draft,\n pin,\n selectionHighlight,\n }: {\n draft: NoteDraft;\n pin: HTMLButtonElement;\n selectionHighlight?: HTMLDivElement;\n }) {\n const environment = this.config.getEnvironment();\n if (!environment) return;\n\n const hostPoint = toHostPoint(\n this.getAdjustedDraftPoint(draft.marker.viewport, draft),\n environment\n );\n pin.style.left = `${hostPoint.x}px`;\n pin.style.top = `${hostPoint.y}px`;\n\n if (draft.selection && selectionHighlight) {\n const rect = toHostSelection(\n this.getAdjustedDraftSelection(\n toViewportSelection(draft.selection.viewport),\n draft\n ),\n environment\n );\n selectionHighlight.style.left = `${rect.left}px`;\n selectionHighlight.style.top = `${rect.top}px`;\n selectionHighlight.style.width = `${rect.width}px`;\n selectionHighlight.style.height = `${rect.height}px`;\n }\n\n this.syncDraftPreview(draft);\n }\n\n private createAreaForm() {\n const form = document.createElement('form');\n form.className = 'dfwr-form';\n const areaDraft = this.state.areaDraft;\n\n if (!areaDraft) {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'Drag on the page to select an area.';\n form.append(empty);\n return form;\n }\n\n form.append(this.createAreaMetricsPanel(areaDraft));\n\n const textarea = document.createElement('textarea');\n textarea.className = 'dfwr-textarea';\n textarea.placeholder = 'Area comment';\n textarea.rows = 4;\n textarea.value = areaDraft.comment ?? '';\n textarea.addEventListener('input', () => {\n const draft = this.state.areaDraft;\n if (!draft) return;\n this.config.actions.setAreaDraft({\n ...draft,\n comment: textarea.value,\n });\n });\n\n const actions = this.createFormActions('Save area', () => {\n const comment = textarea.value.trim();\n const draft = this.state.areaDraft;\n if (!comment || !draft) return;\n void this.config.actions.createItem({\n kind: 'area',\n comment,\n viewport: draft.viewport,\n anchor: draft.anchor,\n marker: draft.marker,\n selection: draft.selection,\n });\n });\n\n form.append(textarea, actions);\n return form;\n }\n\n private createAreaMetricsPanel(draft: AreaDraft) {\n const panel = document.createElement('div');\n panel.className = 'dfwr-adjust-panel is-area-metrics-panel';\n\n const help = document.createElement('div');\n help.className = 'dfwr-adjust-help';\n const [labelLine, xyLine, sizeLine] = this.getSelectionMetricLines(\n this.getAreaDraftMetricSelection(draft),\n draft.viewport\n );\n help.textContent = labelLine;\n\n const xyStatus = document.createElement('div');\n xyStatus.className = 'dfwr-adjust-status';\n xyStatus.textContent = xyLine;\n\n const sizeStatus = document.createElement('div');\n sizeStatus.className = 'dfwr-adjust-status';\n sizeStatus.textContent = sizeLine;\n\n panel.append(help, xyStatus, sizeStatus);\n return panel;\n }\n\n private createAreaDraftOverlay(draft: AreaDraft) {\n const layer = document.createElement('div');\n layer.className = 'dfwr-area-preview-layer';\n\n const environment = this.config.getEnvironment();\n if (!environment || !draft.selection) return layer;\n\n const selection = toViewportSelection(draft.selection.viewport);\n layer.append(this.createSelectionHighlight(selection, environment, true));\n\n if (draft.marker) {\n const hostPoint = toHostPoint(draft.marker.viewport, environment);\n layer.append(\n this.createMarkerElement(\n undefined,\n hostPoint,\n '•',\n getReviewViewportScope(\n draft.viewport,\n this.config.options.viewports?.presets\n ),\n true,\n true\n )\n );\n }\n\n return layer;\n }\n\n private createAreaDraftPopover(draft: AreaDraft) {\n const environment = this.config.getEnvironment();\n const popover = document.createElement('div');\n popover.className = 'dfwr-area-draft is-composer';\n if (environment && draft.selection) {\n const selection = toHostSelection(\n toViewportSelection(draft.selection.viewport),\n environment\n );\n const composer = this.getDraftComposerPosition({\n selection,\n environment,\n composerPosition: draft.composerPosition,\n estimatedHeight: 220,\n });\n popover.style.left = `${composer.left}px`;\n popover.style.top = `${composer.top}px`;\n popover.style.width = `${composer.width}px`;\n popover.style.right = 'auto';\n }\n const dragHandle = this.createDraftDragHandle('Move area composer');\n popover.append(dragHandle, this.createAreaForm());\n this.attachDraftComposerDrag(popover, dragHandle, (composerPosition) => {\n const areaDraft = this.state.areaDraft ?? draft;\n this.config.actions.setAreaDraft({\n ...areaDraft,\n composerPosition,\n });\n });\n return popover;\n }\n\n private createFormActions(\n saveLabel: string,\n onSave: () => void,\n options?: {\n beforeSave?: HTMLButtonElement[];\n className?: string;\n }\n ) {\n const actions = document.createElement('div');\n actions.className = ['dfwr-actions', options?.className]\n .filter(Boolean)\n .join(' ');\n\n const save = document.createElement('button');\n save.className = 'dfwr-button is-primary';\n save.type = 'button';\n save.textContent = saveLabel;\n save.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n onSave();\n });\n\n const cancel = document.createElement('button');\n cancel.className = 'dfwr-button';\n cancel.type = 'button';\n cancel.textContent = 'Cancel';\n cancel.addEventListener('click', (event) => {\n event.preventDefault();\n event.stopPropagation();\n this.config.actions.setModeState('idle');\n this.config.actions.clearDrafts();\n this.config.actions.render();\n });\n\n if (options?.beforeSave?.length || options?.className) {\n actions.append(cancel, ...(options.beforeSave ?? []), save);\n return actions;\n }\n\n actions.append(save, cancel);\n return actions;\n }\n\n private createList() {\n const section = document.createElement('div');\n section.className = 'dfwr-list';\n const state = this.state;\n\n const heading = document.createElement('div');\n heading.className = 'dfwr-list-heading';\n heading.textContent = `Review items (${state.items.length})`;\n section.append(heading);\n\n if (state.items.length === 0) {\n const empty = document.createElement('p');\n empty.className = 'dfwr-empty';\n empty.textContent = 'No review items on this page.';\n section.append(empty);\n return section;\n }\n\n for (const numberedItem of getNumberedReviewItems(\n state.items,\n this.config.options.viewports?.presets\n )) {\n section.append(this.createListItem(numberedItem));\n }\n\n return section;\n }\n\n private createListItem(numberedItem: NumberedReviewItem) {\n const { item } = numberedItem;\n const row = document.createElement('article');\n row.className = 'dfwr-item';\n row.tabIndex = 0;\n row.setAttribute('role', 'button');\n row.setAttribute(\n 'aria-label',\n `Restore review item: ${item.title ?? item.comment}`\n );\n row.addEventListener('click', () => {\n void this.config.actions.restoreItem(item);\n });\n row.addEventListener('keydown', (event) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n\n event.preventDefault();\n void this.config.actions.restoreItem(item);\n });\n\n const body = document.createElement('div');\n body.className = 'dfwr-item-body';\n\n const badges = document.createElement('div');\n badges.className = 'dfwr-item-badges';\n\n const scope = document.createElement('div');\n scope.className = `dfwr-item-scope is-scope-${numberedItem.scope}`;\n scope.textContent = numberedItem.displayLabel;\n\n const kind = document.createElement('div');\n kind.className = 'dfwr-item-kind';\n kind.textContent = item.kind;\n badges.append(scope, kind);\n\n const comment = document.createElement('p');\n comment.className = 'dfwr-item-comment';\n comment.textContent = item.comment;\n\n const date = document.createElement('time');\n date.className = 'dfwr-item-date';\n date.dateTime = item.createdAt;\n date.textContent = formatItemMeta(item);\n\n body.append(badges, comment, date);\n\n const actions = document.createElement('div');\n actions.className = 'dfwr-item-actions';\n actions.addEventListener('click', (event) => event.stopPropagation());\n actions.addEventListener('keydown', (event) => event.stopPropagation());\n\n const remove = document.createElement('button');\n remove.className = 'dfwr-icon-button';\n remove.type = 'button';\n remove.textContent = 'x';\n remove.setAttribute('aria-label', 'Delete');\n remove.addEventListener('click', (event) => {\n event.stopPropagation();\n void this.config.actions\n .removeItem(item.id)\n .then(() => this.config.actions.reload());\n });\n\n actions.append(remove);\n row.append(body, actions);\n return row;\n }\n\n private createMarkerLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-marker-layer';\n const environment = this.config.getEnvironment();\n if (!environment) return layer;\n\n const currentScope = getReviewViewportScope(\n getViewportSize(environment),\n this.config.options.viewports?.presets\n );\n\n getNumberedReviewItems(\n this.state.items,\n this.config.options.viewports?.presets\n ).forEach((numberedItem) => {\n const { item, scope, displayLabel } = numberedItem;\n if (!shouldShowMarkerForScope(scope, currentScope)) {\n return;\n }\n\n const isHighlighted = item.id === this.state.highlightedItemId;\n const highlightMode = getReviewItemHighlightMode(item);\n if (\n highlightMode !== 'note' &&\n (!this.state.highlightedItemId || isHighlighted)\n ) {\n const selection = getItemHighlightSelection(item, environment);\n if (selection) {\n layer.append(\n ...this.createItemHighlightElements(\n selection.viewport,\n environment,\n item,\n displayLabel,\n selection.isBound,\n isHighlighted\n )\n );\n return;\n }\n }\n\n const point = getBoundMarkerPoint(item, environment);\n if (!point || !isPointInViewport(point.viewport, environment)) {\n return;\n }\n\n const hostPoint = toHostPoint(point.viewport, environment);\n const marker = this.createMarkerElement(\n item.id,\n hostPoint,\n displayLabel,\n scope,\n point.isBound,\n isHighlighted,\n highlightMode === 'note' ? 'note' : 'default'\n );\n marker.title = `${displayLabel} / ${item.comment}\\n${formatItemMeta(item)}`;\n layer.append(marker);\n });\n\n return layer;\n }\n\n private createItemHighlightElements(\n selection: ViewportSelection,\n environment: ReviewEnvironment,\n item: ReviewItem,\n label: string,\n isBound: boolean,\n isHighlighted: boolean\n ) {\n const rect = toHostSelection(selection, environment);\n const mode = getReviewItemHighlightMode(item);\n const highlight = document.createElement('div');\n highlight.className = [\n 'dfwr-item-target-highlight',\n `is-mode-${mode}`,\n isBound ? 'is-bound' : 'is-fallback',\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n highlight.style.left = `${rect.left}px`;\n highlight.style.top = `${rect.top}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n highlight.dataset.reviewItemId = item.id;\n\n const labelElement = document.createElement('div');\n labelElement.className = [\n 'dfwr-item-target-label',\n `is-mode-${mode}`,\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n labelElement.textContent = label;\n labelElement.style.left = `${Math.max(4, rect.left)}px`;\n labelElement.style.top = `${Math.max(4, rect.top - 24)}px`;\n labelElement.dataset.reviewItemId = item.id;\n\n return [highlight, labelElement];\n }\n\n private createSelectionHighlight(\n selection: ViewportSelection,\n environment: ReviewEnvironment,\n isDraft: boolean\n ) {\n const rect = toHostSelection(selection, environment);\n const highlight = document.createElement('div');\n highlight.className = `dfwr-selection-highlight${\n isDraft ? ' is-draft' : ''\n }`;\n highlight.style.left = `${rect.left}px`;\n highlight.style.top = `${rect.top}px`;\n highlight.style.width = `${rect.width}px`;\n highlight.style.height = `${rect.height}px`;\n return highlight;\n }\n\n private createMarkerElement(\n itemId: string | undefined,\n hostPoint: ReviewPoint,\n label: string,\n scope: ReviewItemScope,\n isBound: boolean,\n isHighlighted: boolean,\n variant: 'default' | 'note' = 'default'\n ) {\n const isNoteCallout = variant === 'note';\n const marker = document.createElement('div');\n marker.className = [\n 'dfwr-bound-marker',\n isNoteCallout ? 'is-note-callout' : '',\n `is-scope-${scope}`,\n isBound ? 'is-bound' : 'is-fallback',\n isHighlighted ? 'is-highlighted' : '',\n ]\n .filter(Boolean)\n .join(' ');\n marker.style.left = `${hostPoint.x}px`;\n marker.style.top = `${hostPoint.y}px`;\n marker.dataset.scope = scope;\n if (itemId) {\n marker.dataset.reviewItemId = itemId;\n }\n\n const iconElement = document.createElement('span');\n iconElement.className = 'dfwr-bound-marker-icon';\n iconElement.setAttribute('aria-hidden', 'true');\n const labelElement = document.createElement('span');\n labelElement.className = 'dfwr-bound-marker-number';\n labelElement.textContent = label;\n marker.append(iconElement, labelElement);\n\n return marker;\n }\n\n private attachDraftPinDrag(\n pin: HTMLButtonElement,\n popover: HTMLDivElement | undefined,\n meta: HTMLDivElement | undefined,\n textarea: HTMLTextAreaElement\n ) {\n let isDragging = false;\n\n const moveDraftUi = (hostPoint: ReviewPoint) => {\n const environment = this.config.getEnvironment();\n if (!environment) return;\n\n const nextPoint = clampPoint(toTargetPoint(hostPoint, environment), environment);\n const nextHostPoint = toHostPoint(nextPoint, environment);\n\n pin.style.left = `${nextHostPoint.x}px`;\n pin.style.top = `${nextHostPoint.y}px`;\n if (popover) {\n const position = getPopoverPosition(nextHostPoint, environment);\n popover.style.left = `${position.left}px`;\n popover.style.top = `${position.top}px`;\n }\n\n const noteDraft = this.state.noteDraft;\n if (!noteDraft) return;\n\n const nextDraft = {\n ...noteDraft,\n marker: {\n ...noteDraft.marker,\n viewport: roundPoint(nextPoint),\n },\n comment: textarea.value,\n };\n this.config.actions.setNoteDraft(nextDraft);\n if (meta) {\n meta.textContent = formatNoteDraftMeta(nextDraft);\n }\n };\n\n pin.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = true;\n pin.setPointerCapture(event.pointerId);\n });\n\n pin.addEventListener('pointermove', (event) => {\n if (!isDragging || !pin.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n moveDraftUi({\n x: event.clientX,\n y: event.clientY,\n });\n });\n\n pin.addEventListener('pointerup', (event) => {\n if (!isDragging || !pin.hasPointerCapture(event.pointerId)) return;\n\n event.preventDefault();\n event.stopPropagation();\n isDragging = false;\n pin.releasePointerCapture(event.pointerId);\n\n const nextPoint = toTargetPointFromHostEvent(\n event,\n this.config.getEnvironment()\n );\n void (this.state.mode === 'element'\n ? this.config.actions.bindElementDraftToPoint(nextPoint, textarea.value)\n : this.config.actions.bindNoteDraftToPoint(nextPoint, textarea.value));\n });\n }\n\n private createNoteLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-text-layer';\n const environment = this.config.getEnvironment();\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n void this.config.actions.bindNoteDraftToPoint(\n toTargetPointFromHostEvent(event, this.config.getEnvironment())\n );\n });\n\n return layer;\n }\n\n private createElementLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-element-layer';\n const environment = this.config.getEnvironment();\n const hover = document.createElement('div');\n hover.className = 'dfwr-dom-hover';\n hover.hidden = true;\n layer.append(hover);\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n const updateHover = (point: ReviewPoint) => {\n const nextEnvironment = this.config.getEnvironment();\n if (!nextEnvironment) return;\n\n const anchor = getDomAnchorFromPoint(\n clampPoint(point, nextEnvironment),\n this.config.options.anchors?.attribute,\n nextEnvironment\n );\n const selection = anchor\n ? getElementViewportSelection(anchor, nextEnvironment)\n : undefined;\n\n if (!selection) {\n hover.hidden = true;\n return;\n }\n\n const rect = toHostSelection(selection, nextEnvironment);\n hover.hidden = false;\n hover.style.left = `${rect.left}px`;\n hover.style.top = `${rect.top}px`;\n hover.style.width = `${rect.width}px`;\n hover.style.height = `${rect.height}px`;\n };\n\n layer.addEventListener('pointermove', (event) => {\n updateHover(toTargetPointFromHostEvent(event, this.config.getEnvironment()));\n });\n\n layer.addEventListener('pointerleave', () => {\n hover.hidden = true;\n });\n\n layer.addEventListener('pointerdown', (event) => {\n if (event.button !== 0) return;\n event.preventDefault();\n void this.config.actions.bindElementDraftToPoint(\n toTargetPointFromHostEvent(event, this.config.getEnvironment())\n );\n });\n\n return layer;\n }\n\n private createAreaLayer() {\n const layer = document.createElement('div');\n layer.className = 'dfwr-area-layer';\n const environment = this.config.getEnvironment();\n\n if (environment) {\n placeLayerOverTarget(layer, environment);\n }\n\n const box = document.createElement('div');\n box.className = 'dfwr-area-box';\n layer.append(box);\n\n let startX = 0;\n let startY = 0;\n let selection: ViewportSelection | undefined;\n\n const updateBox = (event: PointerEvent) => {\n const nextPoint = toTargetPointFromHostEvent(\n event,\n this.config.getEnvironment()\n );\n const left = Math.min(startX, nextPoint.x);\n const top = Math.min(startY, nextPoint.y);\n const width = Math.abs(nextPoint.x - startX);\n const height = Math.abs(nextPoint.y - startY);\n const hostPoint = toHostPoint(\n { x: left, y: top },\n this.config.getEnvironment()\n );\n\n selection = { left, top, width, height };\n box.style.left = `${hostPoint.x}px`;\n box.style.top = `${hostPoint.y}px`;\n box.style.width = `${width}px`;\n box.style.height = `${height}px`;\n };\n\n layer.addEventListener('pointerdown', (event) => {\n event.preventDefault();\n layer.setPointerCapture(event.pointerId);\n const startPoint = toTargetPointFromHostEvent(\n event,\n this.config.getEnvironment()\n );\n startX = startPoint.x;\n startY = startPoint.y;\n updateBox(event);\n });\n\n layer.addEventListener('pointermove', (event) => {\n if (!layer.hasPointerCapture(event.pointerId)) return;\n updateBox(event);\n });\n\n layer.addEventListener('pointerup', (event) => {\n if (!layer.hasPointerCapture(event.pointerId)) return;\n layer.releasePointerCapture(event.pointerId);\n updateBox(event);\n\n if (!selection || selection.width < 8 || selection.height < 8) return;\n\n this.config.actions.setSelectingArea(true);\n this.config.actions.render();\n void this.config.actions.createAreaDraft(selection);\n });\n\n return layer;\n }\n}\n","import { localAdapter } from '../adapters/local';\nimport type {\n DomAnchor,\n ReviewItem,\n ReviewMarker,\n ReviewMode,\n ReviewPoint,\n ReviewSelection,\n WebReviewKitAdapter,\n WebReviewKitController,\n WebReviewKitOptions,\n} from '../types';\nimport {\n cssEscape,\n getDomAnchor,\n getDomAnchorFromPoint,\n getElementViewportSelection,\n getRelativePoint,\n getRelativeSelection,\n} from './dom.anchor';\nimport {\n createId,\n} from './id';\nimport {\n clampPoint,\n getPointSelection,\n getSelectionCenter,\n getViewportSize,\n roundPoint,\n toPublicSelection,\n type ReviewEnvironment,\n type ViewportSelection,\n} from './geometry';\nimport { isHotkey } from './hotkey';\nimport {\n getOriginalUrl,\n getPageUrl,\n getRouteKey,\n} from './location';\nimport { getReviewViewportScope } from './review/scope';\nimport { createSelectionCenterMarker } from './review/item';\nimport type {\n AreaDraft,\n NoteDraft,\n ReviewDraftPreviewElement,\n} from './review/draft';\nimport {\n runWithAutoScrollBehavior,\n setDocumentScrollInstantly,\n waitForNextFrame,\n} from './scroll';\nimport {\n WebReviewKitView,\n type CreateReviewItemInput,\n} from './web.review.kit.view';\n\nconst ROOT_ID = 'df-web-review-kit-root';\n\nfunction isEditableEventTarget(event: KeyboardEvent) {\n const path = event.composedPath?.() ?? [];\n const element = (path[0] ?? event.target) as HTMLElement | null;\n if (!element || typeof element.tagName !== 'string') return false;\n\n const tag = element.tagName;\n return (\n tag === 'INPUT' ||\n tag === 'TEXTAREA' ||\n tag === 'SELECT' ||\n element.isContentEditable === true\n );\n}\n\n/** Creates the vanilla runtime controller that mounts review overlays on a target page. */\nexport function createWebReviewKit(\n options: WebReviewKitOptions\n): WebReviewKitController {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return createNoopController();\n }\n\n const app = new WebReviewKitApp(options);\n app.mount();\n\n return {\n open: () => app.open(),\n close: () => app.close(),\n toggle: () => app.toggle(),\n setMode: (mode) => app.setMode(mode),\n getMode: () => app.getMode(),\n highlightItem: (itemId) => app.highlightItem(itemId),\n setHiddenItemIds: (itemIds) => app.setHiddenItemIds(itemIds),\n reload: () => app.reload(),\n getItems: () => app.getItems(),\n destroy: () => app.destroy(),\n };\n}\n\nclass WebReviewKitApp {\n private readonly adapter: WebReviewKitAdapter;\n private readonly hotkey: string;\n private readonly view: WebReviewKitView;\n private root?: HTMLDivElement;\n private shadow?: ShadowRoot;\n private isOpen = false;\n private mode: ReviewMode = 'idle';\n private items: ReviewItem[] = [];\n private noteDraft?: NoteDraft;\n private areaDraft?: AreaDraft;\n private isSelectingArea = false;\n private highlightedItemId?: string;\n private hiddenItemIds?: Set<string>;\n private renderFrame?: number;\n\n constructor(private readonly options: WebReviewKitOptions) {\n this.adapter = options.adapter ?? localAdapter();\n this.hotkey = options.hotkeys?.qa ?? 'Shift+Q';\n this.view = new WebReviewKitView({\n options,\n getState: () => ({\n isOpen: this.isOpen,\n mode: this.mode,\n items: this.items,\n noteDraft: this.noteDraft,\n areaDraft: this.areaDraft,\n isSelectingArea: this.isSelectingArea,\n highlightedItemId: this.highlightedItemId,\n }),\n getEnvironment: () => this.getEnvironment(),\n actions: {\n close: () => this.close(),\n render: () => this.render(),\n reload: () => this.reload(),\n restoreItem: (item) => this.restoreItem(item),\n removeItem: (itemId) => this.adapter.remove(itemId),\n setModeState: (mode) => this.setModeState(mode),\n clearDrafts: () => {\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n },\n setNoteDraft: (draft) => {\n this.noteDraft = draft;\n },\n setAreaDraft: (draft) => {\n this.areaDraft = draft;\n },\n setSelectingArea: (isSelectingArea) => {\n this.isSelectingArea = isSelectingArea;\n },\n createItem: (input) => this.createItem(input),\n bindNoteDraftToPoint: (point, comment) =>\n this.bindNoteDraftToPoint(point, comment),\n bindElementDraftToPoint: (point, comment) =>\n this.bindElementDraftToPoint(point, comment),\n createAreaDraft: (selection) => this.createAreaDraft(selection),\n },\n });\n }\n\n mount() {\n if (this.root) return;\n\n const existing = document.getElementById(ROOT_ID);\n if (existing) existing.remove();\n\n this.root = document.createElement('div');\n this.root.id = ROOT_ID;\n this.root.style.display = 'contents';\n\n this.shadow = this.root.attachShadow({ mode: 'open' });\n document.body.appendChild(this.root);\n document.addEventListener('keydown', this.handleKeyDown, true);\n window.addEventListener('scroll', this.handleViewportChange, true);\n window.addEventListener('resize', this.handleViewportChange);\n\n this.render();\n }\n\n destroy() {\n this.view.clearDraftPreview();\n document.removeEventListener('keydown', this.handleKeyDown, true);\n window.removeEventListener('scroll', this.handleViewportChange, true);\n window.removeEventListener('resize', this.handleViewportChange);\n if (this.renderFrame) {\n window.cancelAnimationFrame(this.renderFrame);\n this.renderFrame = undefined;\n }\n this.root?.remove();\n this.root = undefined;\n this.shadow = undefined;\n }\n\n open() {\n if (this.isOpen) return;\n\n this.isOpen = true;\n void this.reload();\n }\n\n close() {\n this.isOpen = false;\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.isSelectingArea = false;\n this.render();\n }\n\n toggle() {\n if (this.isOpen) {\n this.close();\n return;\n }\n\n this.open();\n }\n\n setMode(mode: ReviewMode) {\n if (!this.isOpen) {\n this.isOpen = true;\n }\n\n this.setModeState(this.mode === mode ? 'idle' : mode);\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.render();\n }\n\n getMode() {\n return this.mode;\n }\n\n getItems() {\n return this.items;\n }\n\n highlightItem(itemId?: string) {\n if (!itemId) {\n this.clearHighlightedItem();\n return;\n }\n\n if (!this.isOpen) {\n this.isOpen = true;\n }\n\n this.highlightedItemId = itemId;\n this.render();\n }\n\n setHiddenItemIds(itemIds?: string[]) {\n this.hiddenItemIds = itemIds ? new Set(itemIds) : undefined;\n this.updateHiddenItemsStyle();\n }\n\n private clearHighlightedItem() {\n if (!this.highlightedItemId) return;\n\n this.highlightedItemId = undefined;\n this.render();\n }\n\n private createHiddenItemsStyleElement() {\n const style = document.createElement('style');\n style.dataset.dfwrHiddenItems = 'true';\n style.textContent = this.getHiddenItemsCss();\n return style;\n }\n\n private updateHiddenItemsStyle() {\n if (!this.shadow) return;\n\n let style = this.shadow.querySelector<HTMLStyleElement>(\n 'style[data-dfwr-hidden-items=\"true\"]'\n );\n if (!style) {\n style = this.createHiddenItemsStyleElement();\n this.shadow.prepend(style);\n return;\n }\n\n style.textContent = this.getHiddenItemsCss();\n }\n\n private getHiddenItemsCss() {\n if (!this.hiddenItemIds?.size) return '';\n\n return Array.from(this.hiddenItemIds)\n .map(\n (itemId) =>\n `[data-review-item-id=\"${cssEscape(itemId)}\"] { display: none !important; }`\n )\n .join('\\n');\n }\n\n private setModeState(mode: ReviewMode) {\n if (this.mode === mode) return;\n\n this.mode = mode;\n this.options.onModeChange?.(mode);\n }\n\n private cancelMode() {\n if (\n this.mode === 'idle' &&\n !this.noteDraft &&\n !this.areaDraft &&\n !this.isSelectingArea\n ) {\n return false;\n }\n\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.isSelectingArea = false;\n this.render();\n return true;\n }\n\n private readonly handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && this.cancelMode()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n\n if (isEditableEventTarget(event) || !isHotkey(event, this.hotkey)) return;\n\n event.preventDefault();\n event.stopPropagation();\n this.toggle();\n };\n\n private readonly handleViewportChange = () => {\n if (!this.isOpen || this.renderFrame) return;\n\n this.renderFrame = window.requestAnimationFrame(() => {\n this.renderFrame = undefined;\n this.render();\n });\n };\n\n private getEnvironment(): ReviewEnvironment | undefined {\n const target =\n typeof this.options.target === 'function'\n ? this.options.target()\n : this.options.target;\n\n if (!target) {\n return {\n window,\n document,\n viewportRect: {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n },\n overlayRect: {\n left: 0,\n top: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n },\n };\n }\n\n try {\n const rect = target.getViewportRect?.() ?? {\n left: 0,\n top: 0,\n width: target.window.innerWidth,\n height: target.window.innerHeight,\n };\n const overlayRect = target.getOverlayRect?.() ?? rect;\n\n return {\n window: target.window,\n document: target.document,\n viewportRect: {\n left: rect.left,\n top: rect.top,\n width: rect.width,\n height: rect.height,\n },\n overlayRect: {\n left: overlayRect.left,\n top: overlayRect.top,\n width: overlayRect.width,\n height: overlayRect.height,\n },\n };\n } catch {\n return undefined;\n }\n }\n\n async reload() {\n const environment = this.getEnvironment();\n if (!environment) return this.items;\n\n this.items = await this.adapter.list({\n projectId: this.options.projectId,\n routeKey: getRouteKey(environment),\n });\n this.options.onItemsChange?.(this.items);\n if (this.isOpen) {\n this.render();\n }\n return this.items;\n }\n\n private render() {\n if (!this.shadow) return;\n\n this.view.render(this.shadow, this.createHiddenItemsStyleElement());\n }\n\n private async bindNoteDraftToPoint(point: ReviewPoint, comment?: string) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n const nextPoint = clampPoint(point, environment);\n\n const draft = await this.withOverlayHidden(() => {\n const selection = getPointSelection(nextPoint);\n const anchor = getDomAnchor(\n selection,\n this.options.anchors?.attribute,\n environment\n );\n const marker: ReviewMarker = {\n viewport: roundPoint(nextPoint),\n relative: anchor\n ? getRelativePoint(nextPoint, anchor, environment)\n : undefined,\n };\n\n return {\n viewport,\n anchor,\n marker,\n comment,\n };\n });\n\n this.noteDraft = draft;\n this.render();\n }\n\n private async bindElementDraftToPoint(point: ReviewPoint, comment?: string) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n const nextPoint = clampPoint(point, environment);\n\n const draft = await this.withOverlayHidden(() => {\n const pointSelection = getPointSelection(nextPoint);\n const targetElement = environment.document.elementFromPoint(\n nextPoint.x,\n nextPoint.y\n );\n const previewElement =\n targetElement && 'style' in targetElement\n ? (targetElement as ReviewDraftPreviewElement)\n : undefined;\n const targetRect = targetElement?.getBoundingClientRect();\n const clickedSelection =\n targetRect && targetRect.width > 0 && targetRect.height > 0\n ? {\n left: targetRect.left,\n top: targetRect.top,\n width: targetRect.width,\n height: targetRect.height,\n }\n : undefined;\n const anchor = getDomAnchorFromPoint(\n nextPoint,\n this.options.anchors?.attribute,\n environment\n );\n const elementSelection = anchor\n ? (clickedSelection ??\n getElementViewportSelection(anchor, environment, pointSelection))\n : undefined;\n const selection = elementSelection ?? pointSelection;\n const markerPoint = elementSelection\n ? { x: selection.left, y: selection.top }\n : getSelectionCenter(selection);\n const reviewSelection = elementSelection\n ? {\n viewport: toPublicSelection(elementSelection),\n relative: getRelativeSelection(\n elementSelection,\n anchor as DomAnchor,\n environment\n ),\n }\n : undefined;\n const marker: ReviewMarker = {\n viewport: roundPoint(markerPoint),\n relative: anchor\n ? getRelativePoint(markerPoint, anchor, environment)\n : undefined,\n };\n\n return {\n viewport,\n anchor,\n marker,\n selection: reviewSelection,\n comment,\n previewElement,\n };\n });\n\n this.noteDraft = draft;\n this.render();\n }\n\n private async createAreaDraft(selection: ViewportSelection) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const viewport = getViewportSize(environment);\n\n this.areaDraft = await this.withOverlayHidden(() => {\n const marker = createSelectionCenterMarker(\n selection,\n undefined,\n environment\n );\n const reviewSelection: ReviewSelection = {\n viewport: toPublicSelection(selection),\n };\n\n return {\n viewport,\n marker,\n selection: reviewSelection,\n };\n });\n this.isSelectingArea = false;\n this.setModeState('area');\n this.render();\n }\n\n private async withOverlayHidden<T>(callback: () => Promise<T> | T) {\n if (!this.root) return callback();\n\n const previousDisplay = this.root.style.display;\n this.root.style.display = 'none';\n\n try {\n // Hide our own overlay while sampling elementFromPoint so we anchor to the page.\n return await callback();\n } finally {\n this.root.style.display = previousDisplay;\n }\n }\n\n private async createItem(input: CreateReviewItemInput) {\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const now = new Date().toISOString();\n const routeKey = getRouteKey(environment);\n const viewport = input.viewport ?? getViewportSize(environment);\n const createdBy = this.options.userId?.trim();\n const item: ReviewItem = {\n id: createId(),\n projectId: this.options.projectId,\n routeKey,\n pageUrl: getPageUrl(environment),\n originalUrl: getOriginalUrl(environment),\n normalizedPath: routeKey,\n scope:\n input.scope ??\n getReviewViewportScope(viewport, this.options.viewports?.presets),\n kind: input.kind,\n title: input.comment.split('\\n')[0]?.slice(0, 80),\n comment: input.comment,\n createdBy: createdBy || undefined,\n status: 'todo',\n viewport,\n devicePixelRatio: environment.window.devicePixelRatio || 1,\n scroll: {\n x: environment.window.scrollX,\n y: environment.window.scrollY,\n },\n anchor: input.anchor,\n marker: input.marker,\n selection: input.selection,\n createdAt: now,\n updatedAt: now,\n };\n\n const createdItem = await this.adapter.create(item);\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n this.highlightItem(createdItem.id);\n await this.reload();\n await this.options.onCreateItem?.(createdItem);\n }\n\n private async restoreItem(item: ReviewItem) {\n this.setModeState('idle');\n this.noteDraft = undefined;\n this.areaDraft = undefined;\n\n if (this.options.onRestoreItem) {\n await this.options.onRestoreItem(item);\n return;\n }\n\n const environment = this.getEnvironment();\n if (!environment) return;\n\n const scroll = item.scroll;\n if (scroll) {\n runWithAutoScrollBehavior(environment.document, () => {\n setDocumentScrollInstantly(environment, scroll);\n });\n await waitForNextFrame(environment);\n }\n\n this.highlightItem(item.id);\n this.render();\n }\n}\n\nfunction createNoopController(): WebReviewKitController {\n return {\n open() {},\n close() {},\n toggle() {},\n setMode() {},\n getMode() {\n return 'idle';\n },\n highlightItem() {},\n setHiddenItemIds() {},\n async reload() {\n return [];\n },\n getItems() {\n return [];\n },\n destroy() {},\n };\n}\n"],"mappings":"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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":[]}
|