dsh-web-annotator 0.0.0-stage → 0.2.0-alpha.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/CONTRIBUTING.md +90 -0
  3. package/LICENSE +21 -0
  4. package/README.md +110 -2
  5. package/README_en.md +136 -0
  6. package/THIRD_PARTY_NOTICES.md +15 -0
  7. package/cordis.patch.yml +15 -0
  8. package/docs/AGENTS.md +16 -0
  9. package/docs/README.md +25 -0
  10. package/docs/architecture.md +170 -0
  11. package/docs/browser-integration.md +94 -0
  12. package/docs/distribution.md +66 -0
  13. package/docs/harness-browser-annotation.patch +1909 -0
  14. package/docs/images/annotation-expanded-dark.png +0 -0
  15. package/docs/images/annotation-expanded.png +0 -0
  16. package/docs/images/annotation-image.png +0 -0
  17. package/docs/images/annotation-message.png +0 -0
  18. package/docs/images/annotation-region.png +0 -0
  19. package/docs/marketplace/cslkkl__dsh-web-annotator.yml +7 -0
  20. package/docs/publishing.md +169 -0
  21. package/docs/roadmap.md +31 -0
  22. package/docs/verification.md +179 -0
  23. package/dsh-plugin.naming.json +27 -0
  24. package/examples/responsive-demo/AGENTS.md +12 -0
  25. package/examples/responsive-demo/README.md +33 -0
  26. package/examples/responsive-demo/index.html +13 -0
  27. package/examples/responsive-demo/src/main.tsx +110 -0
  28. package/examples/responsive-demo/src/style.css +344 -0
  29. package/examples/responsive-demo/vite.config.ts +9 -0
  30. package/lib/THIRD_PARTY_LICENSES.md +345 -0
  31. package/lib/bridge.js +890 -0
  32. package/lib/bridge.js.map +7 -0
  33. package/lib/client.js +1083 -0
  34. package/lib/client.js.map +7 -0
  35. package/lib/host/THIRD_PARTY_NOTICES.md +15 -0
  36. package/lib/host/browser-provider/LICENSE +21 -0
  37. package/lib/host/browser-provider/README.md +130 -0
  38. package/lib/host/browser-provider/lib/client.css +217 -0
  39. package/lib/host/browser-provider/lib/client.css.map +7 -0
  40. package/lib/host/browser-provider/lib/client.js +2360 -0
  41. package/lib/host/browser-provider/lib/client.js.map +7 -0
  42. package/lib/host/browser-provider/lib/index.js +7 -0
  43. package/lib/host/browser-provider/lib/index.js.map +7 -0
  44. package/lib/host/browser-provider/package.json +23 -0
  45. package/lib/host/bundle.json +27 -0
  46. package/lib/host/chat-provider/LICENSE +21 -0
  47. package/lib/host/chat-provider/README.md +186 -0
  48. package/lib/host/chat-provider/lib/client.css +1604 -0
  49. package/lib/host/chat-provider/lib/client.css.map +7 -0
  50. package/lib/host/chat-provider/lib/client.js +11074 -0
  51. package/lib/host/chat-provider/lib/client.js.map +7 -0
  52. package/lib/host/chat-provider/lib/index.js +911 -0
  53. package/lib/host/chat-provider/lib/index.js.map +7 -0
  54. package/lib/host/chat-provider/package.json +31 -0
  55. package/lib/host/layout-provider/LICENSE +21 -0
  56. package/lib/host/layout-provider/README.md +109 -0
  57. package/lib/host/layout-provider/lib/client.css +177 -0
  58. package/lib/host/layout-provider/lib/client.css.map +7 -0
  59. package/lib/host/layout-provider/lib/client.js +565 -0
  60. package/lib/host/layout-provider/lib/client.js.map +7 -0
  61. package/lib/host/layout-provider/lib/index.js +7 -0
  62. package/lib/host/layout-provider/lib/index.js.map +7 -0
  63. package/lib/host/layout-provider/package.json +25 -0
  64. package/lib/index.d.ts +2 -0
  65. package/lib/index.js +9 -0
  66. package/lib/index.js.map +7 -0
  67. package/lib/vite.d.ts +8 -0
  68. package/lib/vite.js +1254 -0
  69. package/lib/vite.js.map +7 -0
  70. package/licenses/deepseek-harness-MIT.txt +21 -0
  71. package/locale/AGENTS.md +11 -0
  72. package/locale/README.md +11 -0
  73. package/locale/en.json +6 -0
  74. package/locale/zh.json +6 -0
  75. package/package.json +154 -4
  76. package/screenshots.json +7 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/browser/page-inspector.ts", "../src/browser/protocol.ts", "../src/browser/bridge.ts"],
4
+ "sourcesContent": ["/** Data returned by one explicit, in-page annotation gesture. */\nexport interface BrowserAnnotation {\n /** Provider-captured viewport with the saved area marked; never part of DOM evidence. */\n readonly screenshot?: BrowserAnnotationImage;\n /** Requested CSS values for the precisely selected element. */\n readonly styleChanges?: Record<string, { before: string; after: string }>;\n readonly intent: 'comment' | 'question';\n readonly note: string;\n readonly url: string;\n readonly title: string;\n readonly viewport: { width: number; height: number };\n readonly selection: {\n kind: 'element' | 'region' | 'point';\n /** CSS pixels in the document, never substituted with a parent element. */\n rect: { x: number; y: number; width: number; height: number };\n viewportRect: { x: number; y: number; width: number; height: number };\n scroll: { x: number; y: number };\n candidates: BrowserAnnotationElement[];\n };\n}\n\n/** Bounded JPEG capture supplied by Browser, not by a visited page. */\nexport interface BrowserAnnotationImage {\n readonly mediaType: 'image/jpeg';\n readonly data: string;\n readonly width: number;\n readonly height: number;\n}\n\n/** Bounded DOM evidence; candidates do not redefine a point or region. */\nexport interface BrowserAnnotationElement {\n selector: string;\n shadowHosts: string[];\n matchCount: number;\n tag: string;\n text: string;\n rect: { x: number; y: number; width: number; height: number };\n styles: Record<string, string>;\n source?: string;\n}\n\n/** Copy and theme supplied by the owning Harness plugin, never by the page. */\nexport interface BrowserAnnotationOptions {\n readonly intent: 'comment' | 'question';\n readonly dark: boolean;\n readonly copy: {\n select: string;\n comment: string;\n question: string;\n placeholder: string;\n settings: string;\n save: string;\n cancel: string;\n parent: string;\n child: string;\n targetGone: string;\n empty: string;\n region: string;\n point: string;\n interact: string;\n color: string;\n background: string;\n opacity: string;\n font: string;\n fontSize: string;\n fontWeight: string;\n spacing: string;\n elementOnly: string;\n invalidStyle: string;\n applyStyles: string;\n styleHint: string;\n };\n}\n\ndeclare global {\n interface Window {\n __DSH_PAGE_ANNOTATION_CANCEL__?: () => void;\n }\n}\n\n/**\n * Run a bounded picker inside the inspected document. This function is self-contained\n * so Desktop can execute its compiled body in an approved guest, without a preload.\n * @param options - localized copy, initial intent, and host theme.\n * @returns the saved annotation, or a cancellation when no annotation was saved.\n */\nexport function annotatePage(\n options: BrowserAnnotationOptions,\n): Promise<BrowserAnnotation | { cancelled: true }> {\n window.__DSH_PAGE_ANNOTATION_CANCEL__?.();\n const doc = document;\n const originalUrl = location.href;\n const originalFocus = doc.activeElement;\n const root = doc.createElement('div');\n root.setAttribute('data-dsh-page-annotation', '');\n root.style.cssText = 'position:fixed;inset:0;z-index:2147483647;pointer-events:none;';\n const shadow = root.attachShadow({ mode: 'open' });\n const style = doc.createElement('style');\n style.textContent = `\n :host{all:initial;color-scheme:${options.dark ? 'dark' : 'light'}}\n *{box-sizing:border-box}\n .outline{position:fixed;pointer-events:none;border:2px solid #2979ff;border-radius:5px;background:#2979ff0c}\n .hint{position:fixed;top:12px;left:50%;transform:translateX(-50%);padding:8px 12px;border-radius:8px;background:#181a20;color:#fff;font:13px/20px system-ui;max-width:calc(100vw - 24px);pointer-events:none}\n .editor,.options{position:fixed;pointer-events:auto;border:0;background:${options.dark ? '#292a2d' : '#fff'};color:${options.dark ? '#ededee' : '#303338'};box-shadow:0 0 0 .5px ${options.dark ? '#55565b' : '#dcdfe3'},0 2px 8px #00000014;font:14px/22px system-ui}\n .editor{border-radius:26px;corner-shape:round;padding:7px 8px;width:min(384px,calc(100vw - 24px));overflow:hidden;max-height:calc(100vh - 24px);display:flex;flex-direction:column}\n .editor.expanded{width:min(420px,calc(100vw - 24px));border-radius:24px;padding:0}\n .expanded>.row{padding:12px 14px;flex:none}\n .expanded>.row>.save{display:none}\n .expanded textarea{max-height:min(66px,20vh)}\n .editor:focus-within{box-shadow:0 0 0 .5px ${options.dark ? '#85868b' : '#bfc4cc'},0 2px 8px #00000014}\n .row{display:flex;align-items:center;gap:10px}\n button,select,textarea{font:inherit;color:inherit}\n button{border:0;border-radius:8px;padding:6px 8px;background:transparent;cursor:pointer;flex:none}\n button:disabled{opacity:.4;cursor:default}\n button:hover:not(:disabled){background:${options.dark ? '#3b3c40' : '#f0f1f3'}}\n button:focus-visible,select:focus-visible{outline:2px solid #2979ff;outline-offset:2px}\n .options-toggle,.save{display:flex;align-items:center;justify-content:center;padding:0;width:30px;height:30px;border-radius:50%;corner-shape:round}\n .options-toggle{color:${options.dark ? '#bdc0c5' : '#737880'}}\n .save,.save:disabled{background:${options.dark ? '#797c82' : '#a2a5a9'};color:#fff;opacity:1}\n .save:not(:disabled){background:${options.dark ? '#d2d3d6' : '#777c83'};color:${options.dark ? '#242529' : '#fff'}}\n .save:hover:not(:disabled){background:${options.dark ? '#eeeff1' : '#60656d'}}\n textarea{display:block;flex:1;width:100%;min-width:0;height:22px;max-height:110px;resize:none;border:0;background:transparent;padding:0;margin:0;outline:0;line-height:22px;overflow-y:auto}\n textarea::placeholder{color:${options.dark ? '#aaaeb5' : '#888e96'};opacity:1}\n .options{position:static;box-shadow:none;flex:1;min-height:0;overflow:auto;font-size:14px;line-height:22px;scrollbar-width:thin}\n .target-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 20px;background:${options.dark ? '#35363a' : '#f4f4f4'}}\n .target{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:${options.dark ? '#c9ccd1' : '#656b73'}}\n .target-controls{display:flex;gap:2px;flex:none}\n .target-controls button{font-size:13px;padding:0;width:24px;height:24px}\n .properties{padding:12px 20px;display:grid;gap:10px}\n .property{display:grid;grid-template-columns:minmax(90px,1fr) minmax(0,180px);align-items:center;gap:12px;color:${options.dark ? '#c9ccd1' : '#6e747b'}}\n .field{display:flex;align-items:center;gap:9px;border:.5px solid ${options.dark ? '#57595f' : '#dedfe2'};border-radius:13px;padding:7px 10px;min-width:0}\n .field input{font:13px/20px ui-monospace,monospace;background:transparent;color:inherit;border:0;outline:0;width:100%;min-width:0}\n .field:focus-within{border-color:${options.dark ? '#a2a5ac' : '#a5a9b1'}}\n .swatch{width:22px;height:22px;border-radius:7px;flex:none;box-shadow:inset 0 0 0 .5px #8886}\n .intent{display:flex;align-items:center;justify-content:space-between;padding:0 20px 12px;gap:8px;font-size:13px;color:${options.dark ? '#c9ccd1' : '#6e747b'}}\n select{font:inherit;border:.5px solid ${options.dark ? '#57595f' : '#dedfe2'};background:transparent;border-radius:10px;padding:5px 8px;max-width:160px}\n .footer{border-top:.5px solid ${options.dark ? '#44464b' : '#eee'};display:flex;align-items:center;justify-content:space-between;padding:10px 12px;flex:none}\n .footer>.cancel{border:.5px solid ${options.dark ? '#55565b' : '#e5e6e9'};border-radius:20px;padding:6px 12px;font-size:13px}\n .style-hint{font-size:12px;line-height:18px;margin:3px 0;color:${options.dark ? '#adb1b8' : '#8a9097'}}\n .error{color:${options.dark ? '#ffb0a9' : '#b82920'};font-size:12px;padding:3px 40px 1px}\n .hidden{display:none!important}\n `;\n const outline = doc.createElement('div');\n outline.className = 'outline hidden';\n const hint = doc.createElement('div');\n hint.className = 'hint';\n hint.textContent = options.copy.select;\n const editor = doc.createElement('form');\n editor.className = 'editor hidden';\n editor.setAttribute('aria-label', options.copy.placeholder);\n const row = doc.createElement('div');\n row.className = 'row';\n // The injected picker reuses the shared SlidersTwoOutline and CheckOutline artwork.\n function icon(parts: readonly (readonly [string, Record<string, string>])[]) {\n const svg = doc.createElementNS('http://www.w3.org/2000/svg', 'svg');\n for (const [name, value] of Object.entries({\n width: '18',\n height: '18',\n viewBox: '0 0 16 16',\n fill: 'none',\n stroke: 'currentColor',\n 'stroke-width': '1.3',\n 'stroke-linecap': 'round',\n 'stroke-linejoin': 'round',\n 'aria-hidden': 'true',\n }))\n svg.setAttribute(name, value);\n for (const [tag, attributes] of parts) {\n const node = doc.createElementNS('http://www.w3.org/2000/svg', tag);\n for (const [name, value] of Object.entries(attributes)) node.setAttribute(name, value);\n svg.append(node);\n }\n return svg;\n }\n const settings = doc.createElement('button');\n settings.type = 'button';\n settings.className = 'options-toggle';\n settings.title = options.copy.settings;\n settings.setAttribute('aria-label', options.copy.settings);\n settings.setAttribute('aria-expanded', 'false');\n settings.setAttribute('aria-haspopup', 'dialog');\n settings.append(\n icon([\n ['path', { d: 'M2.3 5h5.85M12.05 5h1.65' }],\n ['circle', { cx: '9.95', cy: '5', r: '1.45' }],\n ['path', { d: 'M2.3 11h1.65M7.85 11h5.85' }],\n ['circle', { cx: '5.75', cy: '11', r: '1.45' }],\n ]),\n );\n const optionsPanel = doc.createElement('section');\n optionsPanel.className = 'options hidden';\n optionsPanel.setAttribute('role', 'dialog');\n optionsPanel.setAttribute('aria-label', options.copy.settings);\n const intentRow = doc.createElement('div');\n intentRow.className = 'intent';\n const intentLabel = doc.createElement('span');\n intentLabel.textContent = options.copy.comment + ' / ' + options.copy.question;\n const intent = doc.createElement('select');\n intent.setAttribute('aria-label', options.copy.comment + ' / ' + options.copy.question);\n for (const [value, label] of [\n ['comment', options.copy.comment],\n ['question', options.copy.question],\n ]) {\n const option = doc.createElement('option');\n option.value = value!;\n option.textContent = label!;\n intent.append(option);\n }\n intent.value = options.intent;\n const input = doc.createElement('textarea');\n input.placeholder = options.copy.placeholder;\n input.setAttribute('aria-label', options.copy.placeholder);\n input.maxLength = 1000;\n const save = doc.createElement('button');\n save.type = 'submit';\n save.className = 'save';\n save.disabled = true;\n save.append(\n icon([\n [\n 'path',\n { d: 'M2.25 8.5L5.49732 11.7473C5.90519 12.1552 6.57263 12.1344 6.95426 11.7018L13.75 4' },\n ],\n ]),\n );\n save.title = options.copy.save;\n save.setAttribute('aria-label', options.copy.save);\n row.append(settings, input, save);\n const targetLabel = doc.createElement('span');\n targetLabel.className = 'target';\n const controls = doc.createElement('div');\n controls.className = 'controls';\n function control(label: string, glyph: string) {\n const button = doc.createElement('button');\n button.type = 'button';\n button.title = label;\n button.setAttribute('aria-label', label);\n button.textContent = glyph + ' ' + label;\n controls.append(button);\n return button;\n }\n const parent = control(options.copy.parent, '\u2191');\n const child = control(options.copy.child, '\u2193');\n const cancel = control(options.copy.cancel, '\u00D7');\n const error = doc.createElement('div');\n error.className = 'error hidden';\n error.setAttribute('role', 'alert');\n intentRow.append(intentLabel, intent);\n const targetRow = doc.createElement('div');\n targetRow.className = 'target-row';\n controls.className = 'target-controls';\n cancel.remove();\n parent.textContent = '\u2191';\n child.textContent = '\u2193';\n targetRow.append(targetLabel, controls);\n const properties = doc.createElement('div');\n properties.className = 'properties';\n const styleHint = doc.createElement('p');\n styleHint.className = 'style-hint';\n const fields = new Map<\n string,\n { input: HTMLInputElement; before: string; swatch?: HTMLElement }\n >();\n for (const [property, label] of [\n ['color', options.copy.color],\n ['background-color', options.copy.background],\n ['opacity', options.copy.opacity],\n ['font-family', options.copy.font],\n ['font-size', options.copy.fontSize],\n ['font-weight', options.copy.fontWeight],\n ['gap', options.copy.spacing],\n ]) {\n const item = doc.createElement('label');\n item.className = 'property';\n const labelText = doc.createElement('span');\n labelText.textContent = label!;\n const field = doc.createElement('div');\n field.className = 'field';\n const value = doc.createElement('input');\n value.setAttribute('aria-label', label!);\n value.dataset.property = property;\n value.maxLength = 1000;\n let swatch: HTMLElement | undefined;\n if (property === 'color' || property === 'background-color') {\n swatch = doc.createElement('span');\n swatch.className = 'swatch';\n swatch.setAttribute('aria-hidden', 'true');\n field.append(swatch);\n }\n field.append(value);\n item.append(labelText, field);\n properties.append(item);\n fields.set(property!, { input: value, before: '', ...(swatch ? { swatch } : {}) });\n }\n properties.append(styleHint);\n const footer = doc.createElement('div');\n footer.className = 'footer hidden';\n cancel.className = 'cancel';\n cancel.textContent = options.copy.cancel;\n const expandedSave = save.cloneNode(true) as HTMLButtonElement;\n footer.append(cancel, expandedSave);\n optionsPanel.append(targetRow, properties, intentRow);\n editor.append(row, optionsPanel, error, footer);\n shadow.append(style, outline, hint, editor);\n const surface = doc.createElement('div');\n surface.style.cssText =\n 'position:fixed;inset:0;pointer-events:auto;cursor:crosshair;touch-action:none';\n shadow.prepend(surface);\n doc.documentElement.append(root);\n\n let target: Element | null = null;\n let hovered: Element | null = null;\n let selection: {\n kind: 'element' | 'region' | 'point';\n rect: { x: number; y: number; width: number; height: number };\n } | null = null;\n let gesture: {\n id: number;\n x: number;\n y: number;\n clientX: number;\n clientY: number;\n dragging: boolean;\n } | null = null;\n let suspended = false;\n let suppressClick = false;\n const descendants: Element[] = [];\n let animation = 0;\n let ended = false;\n let settle!: (value: BrowserAnnotation | { cancelled: true }) => void;\n const result = new Promise<BrowserAnnotation | { cancelled: true }>((resolve) => {\n settle = resolve;\n });\n const lifecycle = new AbortController();\n function changes(): Record<string, { before: string; after: string }> {\n if (selection?.kind !== 'element') return {};\n return Object.fromEntries(\n [...fields].flatMap(([key, field]) => {\n let after = field.input.value.trim();\n if ((key === 'font-size' || key === 'gap') && /^\\d+(\\.\\d+)?$/.test(after)) after += 'px';\n return after === field.before ? [] : [[key, { before: field.before, after }]];\n }),\n );\n }\n function refreshProperties(element: Element | null) {\n const computed = element ? getComputedStyle(element) : null;\n for (const [key, field] of fields) {\n field.before = computed?.getPropertyValue(key) || '';\n field.input.value = field.before;\n field.input.disabled = !element;\n if (field.swatch) field.swatch.style.background = field.before;\n }\n properties.classList.toggle('area', !element);\n for (const field of fields.values())\n field.input.closest('.property')?.classList.toggle('hidden', !element);\n styleHint.textContent = element ? options.copy.styleHint : options.copy.elementOnly;\n }\n for (const [key, field] of fields) {\n field.input.addEventListener(\n 'input',\n () => {\n if (field.swatch && CSS.supports(key, field.input.value))\n field.swatch.style.background = field.input.value;\n intent.value = 'comment';\n error.classList.add('hidden');\n draw();\n },\n { signal: lifecycle.signal },\n );\n field.input.addEventListener(\n 'keydown',\n (event) => {\n if (event.key === 'Enter' && !event.isComposing && event.keyCode !== 229) {\n event.preventDefault();\n event.stopPropagation();\n submit(event);\n }\n },\n { signal: lifecycle.signal },\n );\n }\n const observer = new ResizeObserver(draw);\n\n function finish(value: BrowserAnnotation | { cancelled: true }) {\n if (ended) return;\n ended = true;\n lifecycle.abort();\n cancelAnimationFrame(animation);\n observer.disconnect();\n root.remove();\n if (window.__DSH_PAGE_ANNOTATION_CANCEL__ === dismiss)\n delete window.__DSH_PAGE_ANNOTATION_CANCEL__;\n if (originalFocus instanceof HTMLElement && originalFocus.isConnected)\n originalFocus.focus({ preventScroll: true });\n settle(value);\n }\n function dismiss() {\n finish({ cancelled: true });\n }\n window.__DSH_PAGE_ANNOTATION_CANCEL__ = dismiss;\n function showError(message: string) {\n error.textContent = message;\n error.classList.remove('hidden');\n }\n function valid(element: Element | null): element is Element {\n return (\n !!element &&\n element !== doc.body &&\n element !== doc.documentElement &&\n !element.closest('[data-dsh-page-annotation]')\n );\n }\n function hit(x: number, y: number): Element | null {\n surface.style.pointerEvents = 'none';\n editor.style.pointerEvents = 'none';\n let node = doc.elementFromPoint(x, y);\n while (node?.shadowRoot) {\n const inner = node.shadowRoot.elementFromPoint(x, y);\n if (!inner || inner === node) break;\n node = inner;\n }\n surface.style.pointerEvents = suspended ? 'none' : 'auto';\n editor.style.pointerEvents = 'auto';\n return valid(node) ? node : null;\n }\n function rectInDocument(element: Element) {\n const rect = element.getBoundingClientRect();\n return { x: rect.x + scrollX, y: rect.y + scrollY, width: rect.width, height: rect.height };\n }\n function gestureRect(x: number, y: number) {\n return {\n x: Math.min(gesture!.x, x),\n y: Math.min(gesture!.y, y),\n width: Math.max(1, Math.abs(x - gesture!.x)),\n height: Math.max(1, Math.abs(y - gesture!.y)),\n };\n }\n function selector(element: Element): string {\n const scope = element.getRootNode() as Document | ShadowRoot;\n if (element.id) {\n const id = '#' + CSS.escape(element.id);\n if (scope.querySelectorAll(id).length === 1) return id;\n }\n const pieces: string[] = [];\n let node: Element | null = element;\n while (node) {\n let part = node.localName;\n const peers = node.parentElement\n ? Array.from(node.parentElement.children).filter((x) => x.localName === node!.localName)\n : [];\n if (peers.length > 1) part += `:nth-of-type(${peers.indexOf(node) + 1})`;\n pieces.unshift(part);\n const path = pieces.join(' > ');\n if (scope.querySelectorAll(path).length === 1 && scope.querySelector(path) === element)\n return path;\n node = node.parentElement;\n }\n return pieces.join(' > ');\n }\n function locator(element: Element) {\n const shadowHosts: string[] = [];\n let scope = element.getRootNode();\n while (scope instanceof ShadowRoot) {\n shadowHosts.unshift(selector(scope.host));\n scope = scope.host.getRootNode();\n }\n return {\n selector: selector(element),\n shadowHosts,\n matchCount: (element.getRootNode() as Document | ShadowRoot).querySelectorAll(\n selector(element),\n ).length,\n };\n }\n function draw() {\n if (ended) return;\n if (location.href !== originalUrl) {\n dismiss();\n return;\n }\n if (suspended) return;\n const node = target || hovered;\n if (selection?.kind === 'element' && !target?.isConnected) {\n outline.classList.add('hidden');\n showError(options.copy.targetGone);\n save.disabled = expandedSave.disabled = true;\n return;\n }\n save.disabled = expandedSave.disabled =\n !selection || (!input.value.trim() && !Object.keys(changes()).length);\n const documentRect =\n selection?.kind === 'element' && target\n ? rectInDocument(target)\n : selection?.rect || (node?.isConnected ? rectInDocument(node) : null);\n if (!documentRect) {\n outline.classList.add('hidden');\n return;\n }\n const rect = {\n left: documentRect.x - scrollX,\n top: documentRect.y - scrollY,\n width: documentRect.width,\n height: documentRect.height,\n bottom: documentRect.y - scrollY + documentRect.height,\n };\n outline.classList.remove('hidden');\n Object.assign(outline.style, {\n left: `${rect.left - (selection?.kind === 'point' ? 5 : 0)}px`,\n top: `${rect.top - (selection?.kind === 'point' ? 5 : 0)}px`,\n width: `${selection?.kind === 'point' ? 10 : rect.width}px`,\n height: `${selection?.kind === 'point' ? 10 : rect.height}px`,\n borderStyle: selection?.kind === 'region' ? 'dashed' : 'solid',\n });\n if (editor.classList.contains('hidden')) return;\n const width = editor.getBoundingClientRect().width;\n const height = editor.getBoundingClientRect().height;\n const left = Math.max(12, Math.min(rect.left, innerWidth - width - 12));\n const below = rect.bottom + 8;\n const above = rect.top - height - 8;\n const top = Math.max(\n 12,\n Math.min(\n below + height <= innerHeight - 12 ? below : above >= 12 ? above : rect.top + 8,\n innerHeight - height - 12,\n ),\n );\n Object.assign(editor.style, { left: `${left}px`, top: `${top}px` });\n }\n function setOptions(open: boolean, restoreFocus = false) {\n optionsPanel.classList.toggle('hidden', !open);\n editor.classList.toggle('expanded', open);\n footer.classList.toggle('hidden', !open);\n settings.setAttribute('aria-expanded', String(open));\n draw();\n if (open) settings.focus({ preventScroll: true });\n else if (restoreFocus) settings.focus({ preventScroll: true });\n }\n settings.addEventListener(\n 'click',\n () => {\n setOptions(optionsPanel.classList.contains('hidden'));\n },\n { signal: lifecycle.signal },\n );\n intent.addEventListener(\n 'change',\n () => {\n setOptions(false);\n input.focus({ preventScroll: true });\n },\n { signal: lifecycle.signal },\n );\n input.addEventListener(\n 'input',\n () => {\n input.style.height = '22px';\n input.style.height = `${Math.min(110, input.scrollHeight)}px`;\n error.classList.add('hidden');\n draw();\n },\n { signal: lifecycle.signal },\n );\n function track() {\n draw();\n if (!ended) animation = requestAnimationFrame(track);\n }\n function choose(element: Element) {\n if (!valid(element)) return;\n observer.disconnect();\n target = element;\n selection = { kind: 'element', rect: rectInDocument(element) };\n observer.observe(element);\n hint.classList.add('hidden');\n editor.classList.remove('hidden');\n error.classList.add('hidden');\n const where = locator(element);\n targetLabel.textContent = `<${element.localName}>`;\n targetLabel.title = [...where.shadowHosts, where.selector].join(' \u203A ');\n refreshProperties(element);\n parent.disabled =\n !valid(element.parentElement) && !(element.getRootNode() instanceof ShadowRoot);\n child.disabled = descendants.length === 0;\n draw();\n if (!animation) animation = requestAnimationFrame(track);\n input.focus({ preventScroll: true });\n }\n function chooseArea(\n kind: 'region' | 'point',\n rect: { x: number; y: number; width: number; height: number },\n ) {\n observer.disconnect();\n target = null;\n selection = { kind, rect };\n hint.classList.add('hidden');\n editor.classList.remove('hidden');\n error.classList.add('hidden');\n targetLabel.textContent =\n kind === 'region'\n ? `${options.copy.region} \u00B7 ${Math.round(rect.width)} \u00D7 ${Math.round(rect.height)}`\n : options.copy.point;\n parent.disabled = child.disabled = true;\n targetLabel.title = '';\n refreshProperties(null);\n draw();\n if (!animation) animation = requestAnimationFrame(track);\n input.focus({ preventScroll: true });\n }\n function isOverlay(event: Event) {\n return event.composedPath().includes(root);\n }\n window.addEventListener(\n 'pointermove',\n (event) => {\n if (suspended || !editor.classList.contains('hidden')) return;\n if (gesture && gesture.id === event.pointerId) {\n gesture.dragging ||=\n Math.hypot(event.clientX - gesture.clientX, event.clientY - gesture.clientY) >= 5;\n if (gesture.dragging) {\n selection = {\n kind: 'region',\n rect: gestureRect(event.clientX + scrollX, event.clientY + scrollY),\n };\n draw();\n return;\n }\n }\n const node = hit(event.clientX, event.clientY);\n hovered = event.shiftKey && valid(node?.parentElement || null) ? node!.parentElement : node;\n draw();\n },\n { capture: true, signal: lifecycle.signal },\n );\n window.addEventListener(\n 'pointerdown',\n (event) => {\n if (suspended) {\n suppressClick = false;\n return;\n }\n if (isOverlay(event) && !event.composedPath().includes(surface)) return;\n setOptions(false);\n event.preventDefault();\n event.stopImmediatePropagation();\n suppressClick = true;\n if (event.button !== 0 || !editor.classList.contains('hidden')) return;\n gesture = {\n id: event.pointerId,\n x: event.clientX + scrollX,\n y: event.clientY + scrollY,\n clientX: event.clientX,\n clientY: event.clientY,\n dragging: false,\n };\n surface.setPointerCapture(event.pointerId);\n },\n { capture: true, signal: lifecycle.signal },\n );\n window.addEventListener(\n 'pointerup',\n (event) => {\n if (!gesture || gesture.id !== event.pointerId || suspended) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n const current = gesture;\n const area = gestureRect(event.clientX + scrollX, event.clientY + scrollY);\n gesture = null;\n if (surface.hasPointerCapture(event.pointerId))\n surface.releasePointerCapture(event.pointerId);\n if (\n current.dragging ||\n Math.hypot(event.clientX - current.clientX, event.clientY - current.clientY) >= 5\n )\n chooseArea('region', area);\n else {\n const node = hit(event.clientX, event.clientY);\n descendants.length = 0;\n if (node) choose(event.shiftKey && valid(node.parentElement) ? node.parentElement : node);\n else\n chooseArea('point', {\n x: event.clientX + scrollX,\n y: event.clientY + scrollY,\n width: 0,\n height: 0,\n });\n }\n },\n { capture: true, signal: lifecycle.signal },\n );\n function abortGesture() {\n if (!gesture) return;\n if (surface.hasPointerCapture(gesture.id)) surface.releasePointerCapture(gesture.id);\n gesture = null;\n if (editor.classList.contains('hidden')) selection = null;\n draw();\n }\n window.addEventListener('pointercancel', abortGesture, {\n capture: true,\n signal: lifecycle.signal,\n });\n window.addEventListener(\n 'click',\n (event) => {\n if (isOverlay(event) && !event.composedPath().includes(surface)) return;\n if (suspended && !suppressClick) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n suppressClick = false;\n },\n { capture: true, signal: lifecycle.signal },\n );\n function resume() {\n if (!suspended) return;\n suspended = false;\n surface.style.pointerEvents = 'auto';\n hint.textContent = options.copy.select;\n if (selection) {\n editor.classList.remove('hidden');\n hint.classList.add('hidden');\n } else hint.classList.remove('hidden');\n draw();\n }\n window.addEventListener(\n 'keydown',\n (event) => {\n if (event.isComposing || event.keyCode === 229) return;\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopImmediatePropagation();\n if (optionsPanel.classList.contains('hidden')) dismiss();\n else setOptions(false, true);\n return;\n }\n // The comment editor owns spaces. The page receives normal keys while suspended.\n if (isOverlay(event) && !event.composedPath().includes(surface)) return;\n if (event.code === 'Space' && !event.altKey && !event.ctrlKey && !event.metaKey) {\n event.preventDefault();\n event.stopImmediatePropagation();\n abortGesture();\n suspended = true;\n setOptions(false);\n surface.style.pointerEvents = 'none';\n outline.classList.add('hidden');\n editor.classList.add('hidden');\n hint.classList.remove('hidden');\n hint.textContent = options.copy.interact;\n } else if (!suspended && !isOverlay(event)) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n },\n { capture: true, signal: lifecycle.signal },\n );\n window.addEventListener(\n 'keyup',\n (event) => {\n if (event.code === 'Space' && suspended) {\n event.preventDefault();\n event.stopImmediatePropagation();\n resume();\n }\n },\n { capture: true, signal: lifecycle.signal },\n );\n window.addEventListener(\n 'blur',\n () => {\n abortGesture();\n resume();\n },\n { signal: lifecycle.signal },\n );\n doc.addEventListener(\n 'visibilitychange',\n () => {\n if (doc.hidden) {\n abortGesture();\n resume();\n }\n },\n { signal: lifecycle.signal },\n );\n window.addEventListener('pagehide', dismiss, { once: true, signal: lifecycle.signal });\n parent.addEventListener(\n 'click',\n () => {\n if (!target) return;\n const scope = target.getRootNode();\n const node = target.parentElement || (scope instanceof ShadowRoot ? scope.host : null);\n if (valid(node)) {\n setOptions(false);\n descendants.push(target);\n choose(node);\n }\n },\n { signal: lifecycle.signal },\n );\n child.addEventListener(\n 'click',\n () => {\n const node = descendants.pop();\n if (node?.isConnected) {\n setOptions(false);\n choose(node);\n }\n },\n { signal: lifecycle.signal },\n );\n cancel.addEventListener('click', dismiss, { signal: lifecycle.signal });\n function evidence(element: Element): BrowserAnnotationElement {\n const where = locator(element);\n const computed = getComputedStyle(element);\n const styles: Record<string, string> = {};\n for (const name of [\n 'display',\n 'position',\n 'font-size',\n 'font-family',\n 'color',\n 'background-color',\n 'padding',\n 'margin',\n 'gap',\n 'opacity',\n 'font-weight',\n ])\n styles[name] = computed.getPropertyValue(name).slice(0, 1000);\n const source = element\n .closest('[data-web-annotator-source]')\n ?.getAttribute('data-web-annotator-source')\n ?.slice(0, 1000);\n return {\n ...where,\n tag: element.localName,\n text: (element instanceof HTMLElement ? element.innerText : element.textContent || '')\n .replace(/\\s+/g, ' ')\n .trim()\n .slice(0, 400),\n rect: rectInDocument(element),\n styles,\n ...(source ? { source } : {}),\n };\n }\n function candidates(rect: { x: number; y: number; width: number; height: number }) {\n const found = new Set<Element>();\n // Bounded samples also reach open Shadow DOM and avoid scanning the whole page.\n for (let row = 0; row < 5; row++)\n for (let col = 0; col < 5; col++) {\n const node = hit(\n rect.x - scrollX + (rect.width * (col + 0.5)) / 5,\n rect.y - scrollY + (rect.height * (row + 0.5)) / 5,\n );\n if (node) found.add(node);\n }\n return [...found].slice(0, 12).map(evidence);\n }\n function submit(event: Event) {\n event.preventDefault();\n if (\n !selection ||\n (selection.kind === 'element' && !target?.isConnected) ||\n location.href !== originalUrl\n ) {\n showError(options.copy.targetGone);\n return;\n }\n const styleChanges = changes();\n for (const [property, { after }] of Object.entries(styleChanges)) {\n if (\n !CSS.supports(property, after) ||\n (property === 'opacity' && !(Number(after) >= 0 && Number(after) <= 1))\n ) {\n showError(options.copy.invalidStyle);\n setOptions(true);\n fields.get(property)?.input.focus();\n return;\n }\n }\n if (!input.value.trim() && !Object.keys(styleChanges).length) {\n showError(options.copy.empty);\n input.focus();\n return;\n }\n const rect = selection.kind === 'element' ? rectInDocument(target!) : selection.rect;\n const items = selection.kind === 'element' ? [evidence(target!)] : candidates(rect);\n finish({\n intent: intent.value === 'question' ? 'question' : 'comment',\n note: input.value.trim() || options.copy.applyStyles,\n ...(Object.keys(styleChanges).length ? { styleChanges } : {}),\n url: originalUrl,\n title: doc.title.slice(0, 300),\n viewport: { width: innerWidth, height: innerHeight },\n selection: {\n kind: selection.kind,\n rect,\n viewportRect: { ...rect, x: rect.x - scrollX, y: rect.y - scrollY },\n scroll: { x: scrollX, y: scrollY },\n candidates: items,\n },\n });\n }\n editor.addEventListener('submit', submit, { signal: lifecycle.signal });\n input.addEventListener(\n 'keydown',\n (event) => {\n if (event.key === 'Enter' && !event.shiftKey && !event.isComposing && event.keyCode !== 229) {\n event.preventDefault();\n event.stopPropagation();\n submit(event);\n }\n },\n { signal: lifecycle.signal },\n );\n animation = requestAnimationFrame(track);\n return result;\n}\n", "/** Validation for page and guest process results, not same-process slot props. */\nimport type { BrowserAnnotation, BrowserAnnotationOptions } from './page-inspector';\n\n/** Result of one annotation operation. */\nexport type AnnotationResult = BrowserAnnotation | { cancelled: true };\n\nfunction object(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value);\n}\nfunction string(value: unknown, limit: number): value is string {\n return typeof value === 'string' && value.length <= limit;\n}\nfunction number(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && Math.abs(value) <= 1e7;\n}\nfunction rect(value: unknown): boolean {\n return (\n object(value) &&\n number(value.x) &&\n number(value.y) &&\n number(value.width) &&\n number(value.height) &&\n value.width >= 0 &&\n value.height >= 0\n );\n}\n/** Validate bounded JSON evidence received from a visited document.\n * @param value - process or MessagePort result.\n * @returns whether the result can be retained and rendered.\n */\nexport function isAnnotationResult(value: unknown): value is AnnotationResult {\n if (!object(value)) return false;\n if (value.cancelled === true) return Object.keys(value).length === 1;\n if (\n (value.intent !== 'comment' && value.intent !== 'question') ||\n !string(value.note, 1000) ||\n !value.note.trim() ||\n !string(value.url, 8192) ||\n !string(value.title, 300)\n )\n return false;\n if (\n value.styleChanges !== undefined &&\n (!object(value.styleChanges) ||\n Object.keys(value.styleChanges).length > 10 ||\n !Object.entries(value.styleChanges).every(\n ([key, change]) =>\n [\n 'color',\n 'background-color',\n 'opacity',\n 'font-family',\n 'font-size',\n 'font-weight',\n 'padding',\n 'margin',\n 'gap',\n ].includes(key) &&\n object(change) &&\n string(change.before, 1000) &&\n string(change.after, 1000),\n ))\n )\n return false;\n if (\n value.screenshot !== undefined &&\n (!object(value.screenshot) ||\n value.screenshot.mediaType !== 'image/jpeg' ||\n !string(value.screenshot.data, 4000000) ||\n !/^[A-Za-z0-9+/]+={0,2}$/.test(value.screenshot.data) ||\n !number(value.screenshot.width) ||\n !number(value.screenshot.height) ||\n value.screenshot.width <= 0 ||\n value.screenshot.width > 1600 ||\n value.screenshot.height <= 0 ||\n value.screenshot.height > 1600)\n )\n return false;\n try {\n if (!['http:', 'https:'].includes(new URL(value.url).protocol)) return false;\n } catch {\n return false;\n }\n if (\n !object(value.viewport) ||\n !number(value.viewport.width) ||\n !number(value.viewport.height) ||\n value.viewport.width <= 0 ||\n value.viewport.height <= 0\n )\n return false;\n const selection = value.selection;\n if (\n !object(selection) ||\n !['element', 'region', 'point'].includes(String(selection.kind)) ||\n !rect(selection.rect) ||\n !rect(selection.viewportRect) ||\n !object(selection.scroll) ||\n !number(selection.scroll.x) ||\n !number(selection.scroll.y) ||\n !Array.isArray(selection.candidates) ||\n selection.candidates.length > 12\n )\n return false;\n if (selection.kind === 'element' && selection.candidates.length !== 1) return false;\n for (const item of selection.candidates) {\n if (\n !object(item) ||\n !string(item.selector, 8192) ||\n !Array.isArray(item.shadowHosts) ||\n item.shadowHosts.length > 32 ||\n !item.shadowHosts.every((x) => string(x, 8192)) ||\n item.matchCount !== 1 ||\n !string(item.tag, 200) ||\n !string(item.text, 400) ||\n !rect(item.rect) ||\n !object(item.styles) ||\n Object.keys(item.styles).length > 16 ||\n !Object.entries(item.styles).every(([key, val]) => string(key, 100) && string(val, 1000)) ||\n (item.source !== undefined && !string(item.source, 1000))\n )\n return false;\n }\n try {\n return JSON.stringify({ ...value, screenshot: undefined }).length <= 64000;\n } catch {\n return false;\n }\n}\n\n/** Validate picker configuration crossing the iframe bridge.\n * @param value - parent message options.\n * @returns whether all localized fields are bounded strings.\n */\nexport function isAnnotationOptions(value: unknown): value is BrowserAnnotationOptions {\n return (\n object(value) &&\n (value.intent === 'comment' || value.intent === 'question') &&\n typeof value.dark === 'boolean' &&\n object(value.copy) &&\n [\n 'select',\n 'comment',\n 'question',\n 'placeholder',\n 'settings',\n 'save',\n 'cancel',\n 'parent',\n 'child',\n 'targetGone',\n 'empty',\n 'region',\n 'point',\n 'interact',\n 'color',\n 'background',\n 'opacity',\n 'font',\n 'fontSize',\n 'fontWeight',\n 'spacing',\n 'elementOnly',\n 'invalidStyle',\n 'applyStyles',\n 'styleHint',\n ].every((key) => string(value.copy && object(value.copy) ? value.copy[key] : null, 500))\n );\n}\n", "/** Development-page transport for the existing Harness Browser iframe.\n *\n * This bundle runs inside the visited page, so every message is untrusted input:\n * only the page's own parent may connect, only from an allowed origin, and only\n * with a validated option payload. The picker itself stays in `page-inspector.ts`.\n */\nimport {\n annotatePage,\n type BrowserAnnotation,\n type BrowserAnnotationOptions,\n} from './page-inspector';\nimport { isAnnotationOptions } from './protocol';\n\n/** The saved result or an explicit cancellation, as produced by the picker. */\nexport type AnnotationOutcome = BrowserAnnotation | { cancelled: true };\n\n/** Origins permitted to drive the picker. Loopback only, plus explicit configuration. */\nexport function isAllowedParentOrigin(origin: string, configured: readonly string[]): boolean {\n try {\n const url = new URL(origin);\n if (url.origin !== origin) return false;\n if (configured.includes(origin)) return ['http:', 'https:'].includes(url.protocol);\n return (\n url.protocol === 'http:' &&\n (url.hostname === 'localhost' ||\n url.hostname === '[::1]' ||\n /^127(?:\\.\\d{1,3}){3}$/.test(url.hostname))\n );\n } catch {\n return false;\n }\n}\n\ndeclare global {\n interface Window {\n /** Inline configuration emitted by `src/vite.ts` before this bundle loads. */\n __WEB_ANNOTATOR_CONFIG__?: { allowedParentOrigins?: string[] };\n __DSH_PAGE_ANNOTATION_BRIDGE_DISPOSE__?: () => void;\n }\n}\n\n/** Install the picker transport. Disposal closes the channel and any active picker.\n * @param win - the visited page's own window.\n * @param pick - the picker to run; injectable so the transport can be tested without a DOM.\n * @returns a disposer that removes every listener and open channel. Calling it twice is a no-op.\n */\nexport function installAnnotationBridge(\n win: Window,\n pick: (options: BrowserAnnotationOptions) => Promise<AnnotationOutcome> = annotatePage,\n): () => void {\n const lifecycle = new AbortController();\n const configured = win.__WEB_ANNOTATOR_CONFIG__?.allowedParentOrigins ?? [];\n let current: MessagePort | undefined;\n let disposed = false;\n const release = (port: MessagePort) => {\n port.onmessage = null;\n port.close();\n if (current === port) current = undefined;\n };\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n lifecycle.abort();\n const port = current;\n if (port) {\n port.postMessage({ cancelled: true });\n release(port);\n }\n win.__DSH_PAGE_ANNOTATION_CANCEL__?.();\n };\n win.addEventListener(\n 'message',\n (event) => {\n if (\n disposed ||\n win === win.parent ||\n event.source !== win.parent ||\n !isAllowedParentOrigin(event.origin, configured) ||\n event.data?.channel !== 'dsh-browser-annotation-v1' ||\n event.data?.type !== 'start' ||\n !isAnnotationOptions(event.data.options) ||\n event.ports.length !== 1\n )\n return;\n const port = event.ports[0]!;\n // A page may only hold one picker at a time; the previous channel is told why it ended.\n if (current) {\n current.postMessage({ cancelled: true });\n release(current);\n }\n win.__DSH_PAGE_ANNOTATION_CANCEL__?.();\n current = port;\n port.onmessage = (message) => {\n if (message.data?.type === 'cancel' && current === port)\n win.__DSH_PAGE_ANNOTATION_CANCEL__?.();\n };\n port.postMessage({ ready: true });\n const settle = (value: AnnotationOutcome) => {\n if (disposed || current !== port) return;\n port.postMessage(value);\n release(port);\n };\n let started: Promise<AnnotationOutcome>;\n try {\n started = pick(event.data.options);\n } catch {\n settle({ cancelled: true });\n return;\n }\n void started.then(settle, () => {\n settle({ cancelled: true });\n });\n },\n { signal: lifecycle.signal },\n );\n win.addEventListener('pagehide', dispose, { once: true, signal: lifecycle.signal });\n return dispose;\n}\n\nif (typeof window !== 'undefined') {\n window.__DSH_PAGE_ANNOTATION_BRIDGE_DISPOSE__?.();\n window.__DSH_PAGE_ANNOTATION_BRIDGE_DISPOSE__ = installAnnotationBridge(window);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["row"]
7
+ }