@mahmulp/feedback-sdk 0.0.3 → 0.0.5
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/dist/index.cjs +104 -29
- package/dist/index.cjs.map +1 -1
- package/dist/index.global.js +11 -11
- package/dist/index.global.js.map +1 -1
- package/dist/index.js +104 -29
- package/dist/index.js.map +1 -1
- package/dist/svelte.js +104 -29
- package/dist/svelte.js.map +1 -1
- package/package.json +1 -1
package/dist/svelte.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/coordinates.ts","../src/identity.ts","../src/selector.ts","../src/launcher.ts","../src/popover.ts","../src/overlay.ts","../src/screenshot.ts","../src/transport.ts","../src/controller.ts","../src/svelte.ts"],"names":["feedback","clamp01","HOST_ATTR"],"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;A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","file":"svelte.js","sourcesContent":["import type { FeedbackCoordinates, ViewportInfo } from \"./types.js\";\n\n/**\n * Compute pin coordinates for a click on a target element.\n *\n * - xPercent / yPercent are relative to the target's bounding box (clamped 0..1),\n * used to re-render the pin after layout changes.\n * - xPx / yPx are absolute page coordinates, used as the orphaned-pin fallback.\n */\nexport function computeCoordinates(\n target: Element,\n clientX: number,\n clientY: number\n): FeedbackCoordinates {\n const rect = target.getBoundingClientRect();\n const width = rect.width || 1;\n const height = rect.height || 1;\n\n const xPercent = clamp01((clientX - rect.left) / width);\n const yPercent = clamp01((clientY - rect.top) / height);\n\n const xPx = Math.round(clientX + window.scrollX);\n const yPx = Math.round(clientY + window.scrollY);\n\n return { xPercent, yPercent, xPx, yPx };\n}\n\nexport function getViewportInfo(): ViewportInfo {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n devicePixelRatio: window.devicePixelRatio || 1,\n };\n}\n\n/**\n * Project stored coordinates back onto a (possibly resolved) target element.\n * If `target` is null (orphaned), fall back to absolute page pixels.\n *\n * Returns coordinates in the **page** coordinate space (account for scroll separately\n * when positioning fixed-overlay elements).\n */\nexport function projectCoordinates(\n target: Element | null,\n coords: FeedbackCoordinates\n): { x: number; y: number; orphaned: boolean } {\n if (target) {\n const rect = target.getBoundingClientRect();\n return {\n x: rect.left + window.scrollX + rect.width * coords.xPercent,\n y: rect.top + window.scrollY + rect.height * coords.yPercent,\n orphaned: false,\n };\n }\n return { x: coords.xPx, y: coords.yPx, orphaned: true };\n}\n\nfunction clamp01(n: number): number {\n if (Number.isNaN(n)) return 0;\n if (n < 0) return 0;\n if (n > 1) return 1;\n return n;\n}\n","/**\n * Author identity persistence.\n *\n * The SDK needs to know who is leaving a comment. We don't ship an auth\n * system in the SDK itself; instead we cache a `{ name, email? }` blob in\n * `localStorage`, scoped per project, and let consumers override the\n * read/write through `getAuthor` / `setAuthor` options when they have\n * a real auth integration.\n */\n\nimport type { FeedbackAuthor } from \"./types.js\";\n\nconst STORAGE_KEY_PREFIX = \"mahmulp-fb-author:\";\n\nfunction storageKey(projectId: string): string {\n return `${STORAGE_KEY_PREFIX}${projectId}`;\n}\n\nfunction getStorage(): Storage | null {\n try {\n if (typeof localStorage === \"undefined\") return null;\n return localStorage;\n } catch {\n // localStorage can throw in privacy-mode contexts\n return null;\n }\n}\n\nexport function loadAuthor(projectId: string): FeedbackAuthor | null {\n const storage = getStorage();\n if (!storage) return null;\n try {\n const raw = storage.getItem(storageKey(projectId));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as unknown;\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"name\" in parsed &&\n typeof (parsed as { name: unknown }).name === \"string\"\n ) {\n const name = (parsed as { name: string }).name.trim();\n if (name.length === 0) return null;\n const emailValue = (parsed as { email?: unknown }).email;\n const email = typeof emailValue === \"string\" ? emailValue.trim() : \"\";\n return email.length > 0 ? { name, email } : { name };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function saveAuthor(projectId: string, author: FeedbackAuthor): void {\n const storage = getStorage();\n if (!storage) return;\n try {\n storage.setItem(storageKey(projectId), JSON.stringify(author));\n } catch {\n // Quota / privacy errors are non-fatal.\n }\n}\n\nexport function clearAuthor(projectId: string): void {\n const storage = getStorage();\n if (!storage) return;\n try {\n storage.removeItem(storageKey(projectId));\n } catch {\n /* ignore */\n }\n}\n","/**\n * DOM selector utilities. Deterministic and side-effect-free.\n *\n * Selector priority (see `.kiro/steering/feedback-data-model.md`):\n * 1. data-feedback-id on the target or any ancestor\n * 2. id=\"…\" if it looks stable (no hashes, no auto-generated suffixes)\n * 3. structural tag + nth-child chain, capped at MAX_DEPTH levels\n * 4. tag.classname (single semantic class) as a last resort\n */\n\nconst MAX_DEPTH = 5;\n\n/** True if the id looks human-authored, not auto-generated. */\nfunction isStableId(id: string): boolean {\n if (id.length === 0 || id.length > 64) return false;\n // Reject ids that contain long hex/digit runs (likely UUID/hash fragments)\n if (/[0-9a-f]{8,}/i.test(id)) return false;\n // Reject ids with whitespace or characters that need escaping\n if (/[\\s\"'<>`]/.test(id)) return false;\n return true;\n}\n\n/** True if a single class name is a reasonable selector candidate. */\nfunction isStableClass(cls: string): boolean {\n if (cls.length === 0 || cls.length > 48) return false;\n // Reject hashed class names (CSS Modules, etc.) and long hex runs\n if (/[0-9a-f]{6,}/i.test(cls)) return false;\n // Reject classes that look like Tailwind utilities (start with breakpoint or contain \":\")\n if (/[:[\\]]/.test(cls)) return false;\n if (/^(sm|md|lg|xl|2xl|hover|focus|active|dark)-/.test(cls)) return false;\n return true;\n}\n\n/** Find the closest ancestor (including the element itself) carrying `data-feedback-id`. */\nfunction nearestFeedbackId(el: Element): { id: string; node: Element } | null {\n let cur: Element | null = el;\n while (cur && cur !== document.documentElement) {\n const id = cur.getAttribute(\"data-feedback-id\");\n if (id && id.length > 0) return { id, node: cur };\n cur = cur.parentElement;\n }\n return null;\n}\n\n/** True when a data-feedback-id value is safe to embed in an attribute selector unescaped. */\nfunction isSlugSafe(value: string): boolean {\n if (value.length === 0 || value.length > 96) return false;\n return /^[A-Za-z0-9_.:\\-]+$/.test(value);\n}\n\nfunction pickStableClass(el: Element): string | null {\n const list = Array.from(el.classList);\n for (const cls of list) {\n if (isStableClass(cls)) return cls;\n }\n return null;\n}\n\nfunction nthOfType(el: Element): number {\n const parent = el.parentElement;\n if (!parent) return 1;\n let n = 0;\n for (const sibling of Array.from(parent.children)) {\n if (sibling.tagName === el.tagName) {\n n++;\n if (sibling === el) return n;\n }\n }\n return n;\n}\n\nfunction structuralStep(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const parent = el.parentElement;\n if (!parent) return tag;\n const siblings = Array.from(parent.children).filter((c) => c.tagName === el.tagName);\n if (siblings.length === 1) return tag;\n return `${tag}:nth-of-type(${nthOfType(el)})`;\n}function buildStructuralSelector(el: Element): string {\n const parts: string[] = [];\n let cur: Element | null = el;\n let depth = 0;\n while (cur && cur !== document.body && cur !== document.documentElement && depth < MAX_DEPTH) {\n parts.unshift(structuralStep(cur));\n cur = cur.parentElement;\n depth++;\n }\n return parts.join(\" > \");\n}\n\n/**\n * Build the most stable selector we can for the given element.\n */\nexport function resolveSelector(target: Element): string {\n if (!(target instanceof Element)) {\n throw new TypeError(\"resolveSelector: target must be an Element\");\n }\n\n // 1. data-feedback-id on the element or an ancestor (only if it's a safe slug).\n const fid = nearestFeedbackId(target);\n if (fid && isSlugSafe(fid.id)) {\n return `[data-feedback-id=\"${fid.id}\"]`;\n }\n\n // 2. stable id\n const id = target.id;\n if (id && isStableId(id)) {\n return `#${CSS.escape(id)}`;\n }\n\n // 3. structural selector\n const structural = buildStructuralSelector(target);\n if (structural.length > 0) return structural;\n\n // 4. fallback: tag + single class\n const tag = target.tagName.toLowerCase();\n const cls = pickStableClass(target);\n return cls ? `${tag}.${CSS.escape(cls)}` : tag;\n}\n\n/**\n * Resolve a previously-stored selector back to an Element. Returns null if not found.\n * Never throws on malformed selectors.\n */\nexport function findElement(selector: string, root: ParentNode = document): Element | null {\n if (typeof selector !== \"string\" || selector.length === 0) return null;\n try {\n return root.querySelector(selector);\n } catch {\n return null;\n }\n}\n","/**\n * Floating launcher: 3-button pill anchored to the bottom-right corner.\n *\n * [ Start feedback ] | 👁 show pins | × hide launcher\n *\n * The launcher lives inside the SDK's Shadow DOM, so its CSS is isolated\n * from the prototype. When hidden it leaves a tiny circular re-show button\n * behind so users can bring it back.\n */\n\nexport interface LauncherCallbacks {\n onToggleFeedback: () => void;\n onTogglePins: () => void;\n onHideLauncher: () => void;\n}\n\nexport interface LauncherState {\n enabled: boolean;\n pinsVisible: boolean;\n launcherVisible: boolean;\n}\n\nexport class LauncherManager {\n private launcherEl: HTMLDivElement;\n private revealEl: HTMLButtonElement;\n private toggleBtn!: HTMLButtonElement;\n private pinBtn!: HTMLButtonElement;\n private state: LauncherState = {\n enabled: false,\n pinsVisible: true,\n launcherVisible: true,\n };\n\n constructor(parent: ShadowRoot, callbacks: LauncherCallbacks) {\n this.launcherEl = document.createElement(\"div\");\n this.launcherEl.className = \"launcher\";\n this.launcherEl.setAttribute(\"role\", \"toolbar\");\n this.launcherEl.setAttribute(\"aria-label\", \"Feedback controls\");\n\n this.toggleBtn = document.createElement(\"button\");\n this.toggleBtn.type = \"button\";\n this.toggleBtn.className = \"launcher-btn primary\";\n this.toggleBtn.setAttribute(\"aria-pressed\", \"false\");\n this.toggleBtn.addEventListener(\"click\", () => callbacks.onToggleFeedback());\n\n const divider = document.createElement(\"span\");\n divider.className = \"launcher-divider\";\n divider.setAttribute(\"aria-hidden\", \"true\");\n\n this.pinBtn = document.createElement(\"button\");\n this.pinBtn.type = \"button\";\n this.pinBtn.className = \"launcher-btn\";\n this.pinBtn.setAttribute(\"aria-pressed\", \"true\");\n this.pinBtn.addEventListener(\"click\", () => callbacks.onTogglePins());\n\n const closeBtn = document.createElement(\"button\");\n closeBtn.type = \"button\";\n closeBtn.className = \"launcher-btn muted\";\n closeBtn.setAttribute(\"aria-label\", \"Hide feedback launcher\");\n closeBtn.title = \"Hide launcher (Ctrl/⌘+Shift+F to reopen)\";\n closeBtn.innerHTML = ICON_X;\n closeBtn.addEventListener(\"click\", () => callbacks.onHideLauncher());\n\n this.launcherEl.append(this.toggleBtn, divider, this.pinBtn, closeBtn);\n\n this.revealEl = document.createElement(\"button\");\n this.revealEl.type = \"button\";\n this.revealEl.className = \"launcher-reveal\";\n this.revealEl.setAttribute(\"aria-label\", \"Show feedback launcher\");\n this.revealEl.title = \"Show feedback launcher\";\n this.revealEl.innerHTML = ICON_BUBBLE;\n this.revealEl.addEventListener(\"click\", () => callbacks.onHideLauncher());\n\n parent.append(this.launcherEl, this.revealEl);\n this.render();\n }\n\n setEnabled(enabled: boolean): void {\n this.state.enabled = enabled;\n this.render();\n }\n\n setPinsVisible(pinsVisible: boolean): void {\n this.state.pinsVisible = pinsVisible;\n this.render();\n }\n\n setLauncherVisible(launcherVisible: boolean): void {\n this.state.launcherVisible = launcherVisible;\n this.render();\n }\n\n /** True when an event originated from the launcher's own UI. */\n ownsNode(node: EventTarget | Element | null): boolean {\n if (!node) return false;\n // composedPath() can include `Window`, `Document`, and shadow roots — none\n // of which are valid arguments to `Node.contains`. Guard with `instanceof`\n // so we never throw `parameter 1 is not of type 'Node'`.\n if (typeof Node === \"undefined\" || !(node instanceof Node)) return false;\n return this.launcherEl.contains(node) || this.revealEl.contains(node);\n }\n\n destroy(): void {\n this.launcherEl.remove();\n this.revealEl.remove();\n }\n\n private render(): void {\n const { enabled, pinsVisible, launcherVisible } = this.state;\n\n this.launcherEl.classList.toggle(\"hidden\", !launcherVisible);\n this.revealEl.classList.toggle(\"visible\", !launcherVisible);\n\n this.toggleBtn.classList.toggle(\"active\", enabled);\n this.toggleBtn.setAttribute(\"aria-pressed\", enabled ? \"true\" : \"false\");\n this.toggleBtn.title = enabled\n ? \"Stop feedback mode (Esc)\"\n : \"Start feedback mode (Ctrl/⌘+Shift+F)\";\n this.toggleBtn.innerHTML = enabled\n ? `${ICON_DOT} <span>Stop</span>`\n : `${ICON_PIN} <span>Feedback</span>`;\n\n this.pinBtn.classList.toggle(\"muted\", !pinsVisible);\n this.pinBtn.setAttribute(\"aria-pressed\", pinsVisible ? \"true\" : \"false\");\n this.pinBtn.setAttribute(\"aria-label\", pinsVisible ? \"Hide pins\" : \"Show pins\");\n this.pinBtn.title = pinsVisible ? \"Hide pins\" : \"Show pins\";\n this.pinBtn.innerHTML = pinsVisible ? ICON_EYE : ICON_EYE_OFF;\n }\n}\n\n// ---- Inline SVG icons (16-line each, currentColor stroke) ----\n// Keeping them inline avoids a separate asset and stays inside the Shadow DOM.\n\nconst ICON_PIN = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 21s7-7.5 7-12a7 7 0 1 0-14 0c0 4.5 7 12 7 12Z\" />\n <circle cx=\"12\" cy=\"9\" r=\"2.5\" />\n</svg>`;\n\nconst ICON_DOT = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n</svg>`;\n\nconst ICON_EYE = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12Z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n</svg>`;\n\nconst ICON_EYE_OFF = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 3l18 18\" />\n <path d=\"M10.6 10.6a3 3 0 0 0 4.2 4.2\" />\n <path d=\"M9.9 5.1A10.4 10.4 0 0 1 12 5c6.5 0 10 7 10 7a17.3 17.3 0 0 1-3.6 4.5\" />\n <path d=\"M6.6 6.6A17.4 17.4 0 0 0 2 12s3.5 7 10 7c1.6 0 3-.3 4.2-.8\" />\n</svg>`;\n\nconst ICON_X = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M6 6l12 12M18 6L6 18\" />\n</svg>`;\n\nconst ICON_BUBBLE = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 12a8 8 0 1 1-3.4-6.5\" />\n <path d=\"M21 4v5h-5\" />\n</svg>`;\n","import type { Feedback, FeedbackAuthor, FeedbackStatus } from \"./types.js\";\n\n/**\n * Popover renderer for the composer (new pin) and thread (existing pin) UIs.\n *\n * Anchors are stored in **page space** (`pageX`, `pageY`). On scroll/resize\n * the popover re-projects to viewport space so it stays attached to the\n * underlying click point or pin.\n */\n\nconst POPOVER_OFFSET = 18;\nconst VIEWPORT_PADDING = 8;\n\nexport interface ComposerCallbacks {\n initialAuthor: FeedbackAuthor | null;\n onSubmit(body: string, author: FeedbackAuthor): void | Promise<void>;\n onCancel(): void;\n}\n\nexport interface ThreadCallbacks {\n initialAuthor: FeedbackAuthor | null;\n onReply(body: string, author: FeedbackAuthor): void | Promise<void>;\n onStatus(status: FeedbackStatus): void | Promise<void>;\n onClose(): void;\n}\n\nexport interface PopoverAnchor {\n /** Document-space x coordinate (page pixels). */\n pageX: number;\n /** Document-space y coordinate (page pixels). */\n pageY: number;\n}\n\ninterface OpenState {\n type: \"composer\" | \"thread\";\n el: HTMLDivElement;\n pageX: number;\n pageY: number;\n}\n\nexport class PopoverManager {\n private layer: HTMLDivElement;\n private current: OpenState | null = null;\n\n constructor(layer: HTMLDivElement) {\n this.layer = layer;\n }\n\n isOpen(): boolean {\n return this.current !== null;\n }\n\n /** True when the event originated inside the currently-open popover element. */\n ownsEvent(event: Event): boolean {\n if (!this.current) return false;\n const path = event.composedPath();\n return path.includes(this.current.el);\n }\n\n hide(): void {\n if (!this.current) return;\n this.current.el.remove();\n this.current = null;\n }\n\n showComposer(anchor: PopoverAnchor, cb: ComposerCallbacks): HTMLDivElement {\n this.hide();\n const el = this.buildComposer(cb);\n this.layer.appendChild(el);\n this.current = { type: \"composer\", el, pageX: anchor.pageX, pageY: anchor.pageY };\n this.repositionInternal();\n queueMicrotask(() => {\n const focusTarget = el.querySelector(\"textarea, input\") as HTMLElement | null;\n focusTarget?.focus();\n });\n return el;\n }\n\n showThread(feedback: Feedback, anchor: PopoverAnchor, cb: ThreadCallbacks): HTMLDivElement {\n this.hide();\n const el = this.buildThread(feedback, cb);\n this.layer.appendChild(el);\n this.current = { type: \"thread\", el, pageX: anchor.pageX, pageY: anchor.pageY };\n this.repositionInternal();\n return el;\n }\n\n /** Re-project to viewport coordinates after a scroll/resize. */\n reposition(anchor?: PopoverAnchor): void {\n if (!this.current) return;\n if (anchor) {\n this.current.pageX = anchor.pageX;\n this.current.pageY = anchor.pageY;\n }\n this.repositionInternal();\n }\n\n private repositionInternal(): void {\n if (!this.current) return;\n const viewportX = this.current.pageX - window.scrollX;\n const viewportY = this.current.pageY - window.scrollY;\n this.applyPosition(this.current.el, viewportX, viewportY);\n }\n\n private applyPosition(el: HTMLElement, anchorX: number, anchorY: number): void {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const rect = el.getBoundingClientRect();\n const w = rect.width || 320;\n const h = rect.height || 200;\n\n let x = anchorX + POPOVER_OFFSET;\n if (x + w > vw - VIEWPORT_PADDING) x = anchorX - POPOVER_OFFSET - w;\n if (x < VIEWPORT_PADDING) x = VIEWPORT_PADDING;\n\n let y = anchorY;\n if (y + h > vh - VIEWPORT_PADDING) y = vh - h - VIEWPORT_PADDING;\n if (y < VIEWPORT_PADDING) y = VIEWPORT_PADDING;\n\n el.style.left = `${x}px`;\n el.style.top = `${y}px`;\n }\n\n // ---------- Composer ----------\n\n private buildComposer(cb: ComposerCallbacks): HTMLDivElement {\n const root = this.makeShell(\"New comment\", () => cb.onCancel());\n const body = root.querySelector(\".popover-body\") as HTMLDivElement;\n\n const identity = this.buildIdentityFields(cb.initialAuthor);\n body.appendChild(identity.el);\n\n const textarea = document.createElement(\"textarea\");\n textarea.className = \"popover-textarea\";\n textarea.placeholder = \"Describe what you see...\";\n textarea.rows = 4;\n body.appendChild(textarea);\n\n const actions = document.createElement(\"div\");\n actions.className = \"popover-actions\";\n\n const cancel = document.createElement(\"button\");\n cancel.type = \"button\";\n cancel.className = \"btn btn-ghost\";\n cancel.textContent = \"Cancel\";\n cancel.addEventListener(\"click\", () => cb.onCancel());\n\n const submit = document.createElement(\"button\");\n submit.type = \"button\";\n submit.className = \"btn btn-primary popover-submit\";\n submit.textContent = \"Send\";\n submit.addEventListener(\"click\", async () => {\n const text = textarea.value.trim();\n if (text.length === 0) {\n textarea.focus();\n return;\n }\n const author = identity.read();\n if (!author) return;\n submit.disabled = true;\n try {\n await cb.onSubmit(text, author);\n } finally {\n submit.disabled = false;\n }\n });\n\n actions.appendChild(cancel);\n actions.appendChild(submit);\n body.appendChild(actions);\n\n return root;\n }\n\n // ---------- Thread ----------\n\n private buildThread(feedback: Feedback, cb: ThreadCallbacks): HTMLDivElement {\n const titleText = `Status: ${feedback.status}`;\n const root = this.makeShell(titleText, () => cb.onClose());\n root.classList.add(\"popover-thread\");\n root.dataset.status = feedback.status;\n const body = root.querySelector(\".popover-body\") as HTMLDivElement;\n\n const toolbar = document.createElement(\"div\");\n toolbar.className = \"popover-toolbar\";\n const transitions = nextStatuses(feedback.status);\n for (const status of transitions) {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"btn btn-toolbar\";\n btn.dataset.status = status;\n btn.textContent = labelForStatusTransition(status);\n btn.addEventListener(\"click\", () => {\n void cb.onStatus(status);\n });\n toolbar.appendChild(btn);\n }\n body.appendChild(toolbar);\n\n const list = document.createElement(\"ul\");\n list.className = \"popover-thread-list\";\n if (feedback.thread.length === 0) {\n const empty = document.createElement(\"li\");\n empty.className = \"popover-empty\";\n empty.textContent = \"No comments yet.\";\n list.appendChild(empty);\n } else {\n for (const c of feedback.thread) {\n const item = document.createElement(\"li\");\n item.className = \"popover-comment\";\n const meta = document.createElement(\"div\");\n meta.className = \"popover-comment-meta\";\n meta.textContent = c.author.name;\n const text = document.createElement(\"div\");\n text.className = \"popover-comment-body\";\n text.textContent = c.body;\n item.appendChild(meta);\n item.appendChild(text);\n list.appendChild(item);\n }\n }\n body.appendChild(list);\n\n const identity = this.buildIdentityFields(cb.initialAuthor);\n body.appendChild(identity.el);\n\n const reply = document.createElement(\"textarea\");\n reply.className = \"popover-textarea\";\n reply.placeholder = \"Reply...\";\n reply.rows = 3;\n body.appendChild(reply);\n\n const actions = document.createElement(\"div\");\n actions.className = \"popover-actions\";\n const submit = document.createElement(\"button\");\n submit.type = \"button\";\n submit.className = \"btn btn-primary popover-submit\";\n submit.textContent = \"Reply\";\n submit.addEventListener(\"click\", async () => {\n const text = reply.value.trim();\n if (text.length === 0) {\n reply.focus();\n return;\n }\n const author = identity.read();\n if (!author) return;\n submit.disabled = true;\n try {\n await cb.onReply(text, author);\n } finally {\n submit.disabled = false;\n }\n });\n actions.appendChild(submit);\n body.appendChild(actions);\n\n return root;\n }\n\n // ---------- Shared bits ----------\n\n private makeShell(title: string, onClose: () => void): HTMLDivElement {\n const root = document.createElement(\"div\");\n root.className = \"popover\";\n root.setAttribute(\"role\", \"dialog\");\n root.setAttribute(\"aria-label\", title);\n\n const header = document.createElement(\"div\");\n header.className = \"popover-header\";\n const titleEl = document.createElement(\"span\");\n titleEl.className = \"popover-title\";\n titleEl.textContent = title;\n header.appendChild(titleEl);\n\n const closeBtn = document.createElement(\"button\");\n closeBtn.type = \"button\";\n closeBtn.className = \"popover-close\";\n closeBtn.setAttribute(\"aria-label\", \"Close\");\n closeBtn.textContent = \"\\u00D7\";\n closeBtn.addEventListener(\"click\", () => onClose());\n header.appendChild(closeBtn);\n root.appendChild(header);\n\n const body = document.createElement(\"div\");\n body.className = \"popover-body\";\n root.appendChild(body);\n\n return root;\n }\n\n private buildIdentityFields(initial: FeedbackAuthor | null): {\n el: HTMLElement;\n read: () => FeedbackAuthor | null;\n } {\n const wrap = document.createElement(\"div\");\n wrap.className = \"popover-identity\";\n\n const nameInput = document.createElement(\"input\");\n nameInput.type = \"text\";\n nameInput.placeholder = \"Your name\";\n nameInput.className = \"popover-input popover-name\";\n nameInput.required = true;\n nameInput.autocomplete = \"name\";\n\n const emailInput = document.createElement(\"input\");\n emailInput.type = \"email\";\n emailInput.placeholder = \"Email (optional)\";\n emailInput.className = \"popover-input popover-email\";\n emailInput.autocomplete = \"email\";\n\n if (initial) {\n nameInput.value = initial.name;\n if (initial.email) emailInput.value = initial.email;\n }\n\n wrap.appendChild(nameInput);\n wrap.appendChild(emailInput);\n\n return {\n el: wrap,\n read(): FeedbackAuthor | null {\n const name = nameInput.value.trim();\n if (name.length === 0) {\n nameInput.focus();\n return null;\n }\n const email = emailInput.value.trim();\n return email.length > 0 ? { name, email } : { name };\n },\n };\n }\n}\n\nfunction nextStatuses(current: FeedbackStatus): FeedbackStatus[] {\n switch (current) {\n case \"open\":\n return [\"resolved\", \"archived\"];\n case \"resolved\":\n return [\"open\", \"archived\"];\n case \"archived\":\n return [\"open\"];\n }\n}\n\nfunction labelForStatusTransition(target: FeedbackStatus): string {\n switch (target) {\n case \"open\":\n return \"Reopen\";\n case \"resolved\":\n return \"Resolve\";\n case \"archived\":\n return \"Archive\";\n }\n}\n","import type { Feedback } from \"./types.js\";\nimport { findElement } from \"./selector.js\";\nimport { projectCoordinates } from \"./coordinates.js\";\nimport { LauncherManager, type LauncherCallbacks } from \"./launcher.js\";\nimport { PopoverManager } from \"./popover.js\";\n\n/**\n * Owns the Shadow DOM host that holds the SDK's UI:\n * - hover highlight ring\n * - selection HUD (tag + classes of current candidate)\n * - rendered pins for existing feedback\n * - composer / thread popover layer\n *\n * Everything is rendered inside a Shadow Root attached to a single host\n * appended to <body>, so prototype CSS can't leak in or out.\n */\n\nconst HOST_ATTR = \"data-mahmulp-feedback-host\";\n\nconst OVERLAY_STYLES = `\n:host { all: initial; }\n\n.layer {\n position: fixed;\n inset: 0;\n pointer-events: none;\n}\n\n.highlight {\n position: fixed;\n border: 2px solid #1F5132;\n background: rgba(31, 81, 50, 0.08);\n border-radius: 4px;\n box-shadow: 0 0 0 1px rgba(255,255,255,0.6) inset;\n transition: top 60ms linear, left 60ms linear, width 60ms linear, height 60ms linear;\n display: none;\n pointer-events: none;\n z-index: 1;\n}\n\n.hud {\n position: fixed;\n padding: 6px 10px;\n background: #1F5132;\n color: #F5FFF8;\n font: 500 12px/1.2 ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif;\n border-radius: 4px;\n pointer-events: none;\n display: none;\n z-index: 2;\n max-width: 320px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.pin {\n position: fixed;\n width: 28px;\n height: 28px;\n margin-left: -14px;\n margin-top: -28px;\n background: #1F5132;\n color: #F5FFF8;\n border: 2px solid #F5FFF8;\n border-radius: 50% 50% 50% 0;\n transform: rotate(-45deg);\n display: flex;\n align-items: center;\n justify-content: center;\n font: 600 11px/1 ui-sans-serif, system-ui, sans-serif;\n cursor: pointer;\n pointer-events: auto;\n box-shadow: 0 2px 6px rgba(0,0,0,0.25);\n transition: transform 80ms ease;\n z-index: 3;\n}\n.pin:hover { transform: rotate(-45deg) scale(1.08); }\n.pin > span { transform: rotate(45deg); }\n.pin.orphaned { opacity: 0.55; filter: grayscale(0.4); }\n.pin.resolved { background: #2F7A4D; }\n.pin.archived { background: #6B7280; }\n.pin.dragging { cursor: grabbing; transform: rotate(-45deg) scale(1.18); }\n\n.pinLayer.hidden { display: none; }\n\n/* ---------- Floating launcher ---------- */\n.launcher {\n position: fixed;\n right: 20px;\n bottom: 20px;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px;\n background: rgba(255, 255, 255, 0.96);\n color: #1F5132;\n border: 1px solid rgba(31, 81, 50, 0.18);\n border-radius: 999px;\n box-shadow: 0 12px 24px -10px rgba(15, 35, 24, 0.32),\n 0 4px 8px -2px rgba(15, 35, 24, 0.16);\n pointer-events: auto;\n z-index: 5;\n font: 600 12px/1 ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif;\n user-select: none;\n transition: opacity 120ms ease, transform 120ms ease;\n}\n.launcher.hidden {\n opacity: 0;\n transform: translateY(8px);\n pointer-events: none;\n}\n.launcher-btn {\n appearance: none;\n width: 36px;\n height: 36px;\n border-radius: 999px;\n border: 0;\n background: transparent;\n color: inherit;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: background 120ms ease;\n}\n.launcher-btn:hover { background: rgba(31, 81, 50, 0.08); }\n.launcher-btn:focus-visible {\n outline: 2px solid #1F5132;\n outline-offset: 2px;\n}\n.launcher-btn svg { width: 18px; height: 18px; pointer-events: none; }\n.launcher-btn.primary {\n background: #1F5132;\n color: #F5FFF8;\n width: auto;\n padding: 0 14px 0 12px;\n border-radius: 999px;\n gap: 6px;\n}\n.launcher-btn.primary:hover { background: #265E3B; }\n.launcher-btn.primary.active {\n background: #B91C1C;\n color: #FFE8E8;\n}\n.launcher-btn.primary.active:hover { background: #A11616; }\n.launcher-divider {\n width: 1px;\n height: 22px;\n background: rgba(31, 81, 50, 0.14);\n}\n.launcher-btn.muted { color: #6B7280; }\n\n/* ---------- Re-show launcher pill ---------- */\n.launcher-reveal {\n position: fixed;\n right: 20px;\n bottom: 20px;\n width: 36px;\n height: 36px;\n border-radius: 999px;\n background: #1F5132;\n color: #F5FFF8;\n border: 0;\n display: none;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n pointer-events: auto;\n box-shadow: 0 8px 16px -8px rgba(15, 35, 24, 0.4);\n z-index: 5;\n}\n.launcher-reveal.visible { display: inline-flex; }\n.launcher-reveal:hover { background: #265E3B; }\n.launcher-reveal svg { width: 18px; height: 18px; }\n\n@media (prefers-color-scheme: dark) {\n .launcher {\n background: #0F1F17;\n color: #B6D8C5;\n border-color: rgba(120, 200, 160, 0.22);\n }\n .launcher-btn.primary { color: #0F1F17; background: #B6D8C5; }\n .launcher-btn.primary:hover { background: #C7E2D2; }\n .launcher-divider { background: rgba(120, 200, 160, 0.22); }\n}\n\n.popover-layer {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 4;\n}\n\n.popover {\n position: fixed;\n width: 320px;\n max-height: min(70vh, 520px);\n display: flex;\n flex-direction: column;\n background: #FFFFFF;\n color: #111827;\n border: 1px solid rgba(31, 81, 50, 0.18);\n border-radius: 10px;\n box-shadow: 0 18px 36px -12px rgba(15, 35, 24, 0.32),\n 0 4px 8px -2px rgba(15, 35, 24, 0.16);\n font: 14px/1.45 ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif;\n pointer-events: auto;\n overflow: hidden;\n}\n\n.popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: #1F5132;\n color: #F5FFF8;\n}\n.popover-title {\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n text-transform: capitalize;\n}\n.popover-close {\n background: transparent;\n color: inherit;\n border: 0;\n font-size: 18px;\n line-height: 1;\n padding: 2px 6px;\n cursor: pointer;\n border-radius: 4px;\n}\n.popover-close:hover { background: rgba(255,255,255,0.15); }\n\n.popover-body {\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n overflow-y: auto;\n}\n\n.popover-toolbar {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.popover-thread-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n max-height: 200px;\n overflow-y: auto;\n}\n.popover-comment {\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n padding: 8px 10px;\n background: #F9FAFB;\n}\n.popover-comment-meta {\n font-size: 11px;\n font-weight: 600;\n color: #374151;\n margin-bottom: 2px;\n}\n.popover-comment-body { white-space: pre-wrap; word-break: break-word; }\n.popover-empty {\n font-size: 12px;\n color: #6B7280;\n font-style: italic;\n}\n\n.popover-identity {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px;\n}\n\n.popover-input,\n.popover-textarea {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n font: inherit;\n color: inherit;\n background: #FFFFFF;\n resize: vertical;\n}\n.popover-input:focus,\n.popover-textarea:focus {\n outline: none;\n border-color: #1F5132;\n box-shadow: 0 0 0 3px rgba(31, 81, 50, 0.15);\n}\n\n.popover-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n}\n\n.btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 7px 14px;\n border-radius: 6px;\n border: 1px solid transparent;\n font: 600 13px/1 inherit;\n cursor: pointer;\n}\n.btn[disabled] { opacity: 0.6; cursor: not-allowed; }\n.btn-primary {\n background: #1F5132;\n color: #F5FFF8;\n}\n.btn-primary:hover { background: #295F3D; }\n.btn-ghost {\n background: transparent;\n color: #1F5132;\n border-color: rgba(31, 81, 50, 0.3);\n}\n.btn-ghost:hover { background: rgba(31, 81, 50, 0.05); }\n.btn-toolbar {\n background: rgba(31, 81, 50, 0.08);\n color: #1F5132;\n border-color: rgba(31, 81, 50, 0.18);\n font-weight: 500;\n font-size: 12px;\n padding: 5px 10px;\n}\n.btn-toolbar:hover { background: rgba(31, 81, 50, 0.16); }\n\n@media (prefers-color-scheme: dark) {\n .popover {\n background: #0F1F17;\n color: #E5F2EB;\n border-color: rgba(120, 200, 160, 0.22);\n }\n .popover-comment {\n background: #102A20;\n border-color: rgba(120, 200, 160, 0.18);\n }\n .popover-comment-meta { color: #B6D8C5; }\n .popover-empty { color: #94B3A4; }\n .popover-input,\n .popover-textarea {\n background: #102A20;\n color: inherit;\n border-color: rgba(120, 200, 160, 0.22);\n }\n .btn-ghost { color: #B6D8C5; border-color: rgba(120, 200, 160, 0.3); }\n .btn-ghost:hover { background: rgba(120, 200, 160, 0.08); }\n .btn-toolbar {\n background: rgba(120, 200, 160, 0.12);\n color: #B6D8C5;\n border-color: rgba(120, 200, 160, 0.22);\n }\n .btn-toolbar:hover { background: rgba(120, 200, 160, 0.2); }\n}\n`;\n\nexport interface PinClickHandler {\n (feedback: Feedback): void;\n}\n\nexport interface PinDragHandler {\n (\n feedbackId: string,\n next: { xPercent: number; yPercent: number; xPx: number; yPx: number }\n ): void;\n}\n\nexport class Overlay {\n private host: HTMLDivElement;\n private root: ShadowRoot;\n private highlight: HTMLDivElement;\n private hud: HTMLDivElement;\n private pinLayer: HTMLDivElement;\n private popoverLayer: HTMLDivElement;\n private popover: PopoverManager;\n private launcher: LauncherManager | null = null;\n private rafHandle: number | null = null;\n private pendingFeedback: Feedback[] = [];\n private onPinClick: PinClickHandler | null = null;\n private onPinDragEnd: PinDragHandler | null = null;\n private draggingPin: string | null = null;\n\n constructor() {\n this.host = document.createElement(\"div\");\n this.host.setAttribute(HOST_ATTR, \"\");\n this.host.style.cssText = [\n \"position: fixed\",\n \"inset: 0\",\n \"width: 0\",\n \"height: 0\",\n \"pointer-events: none\",\n \"z-index: 2147483647\",\n ].join(\";\");\n document.body.appendChild(this.host);\n\n this.root = this.host.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = OVERLAY_STYLES;\n this.root.appendChild(style);\n\n this.pinLayer = makeLayer(\"pinLayer\");\n this.highlight = makeLayer(\"highlight\", \"div\");\n this.hud = makeLayer(\"hud\", \"div\");\n this.popoverLayer = makeLayer(\"popover-layer\");\n this.root.append(this.pinLayer, this.highlight, this.hud, this.popoverLayer);\n\n this.popover = new PopoverManager(this.popoverLayer);\n }\n\n /** Called by the controller when the user enters/leaves feedback mode. */\n setEnabledStyles(enabled: boolean) {\n if (!enabled) {\n this.hideHighlight();\n this.hideHud();\n }\n }\n\n showHighlight(target: Element) {\n const rect = target.getBoundingClientRect();\n this.highlight.style.display = \"block\";\n this.highlight.style.left = `${rect.left}px`;\n this.highlight.style.top = `${rect.top}px`;\n this.highlight.style.width = `${rect.width}px`;\n this.highlight.style.height = `${rect.height}px`;\n }\n\n hideHighlight() {\n this.highlight.style.display = \"none\";\n }\n\n showHud(target: Element) {\n const tag = target.tagName.toLowerCase();\n const cls = (target.getAttribute(\"class\") || \"\").trim();\n const fid = target.getAttribute(\"data-feedback-id\");\n const label = fid\n ? `${tag} [data-feedback-id=\"${fid}\"]`\n : cls\n ? `${tag}.${cls.split(/\\s+/).slice(0, 2).join(\".\")}`\n : tag;\n\n const rect = target.getBoundingClientRect();\n this.hud.textContent = label;\n this.hud.style.display = \"block\";\n const hudHeight = 28;\n const top =\n rect.top - hudHeight - 6 > 0\n ? rect.top - hudHeight - 6\n : Math.min(rect.bottom + 6, window.innerHeight - hudHeight);\n const left = Math.max(8, Math.min(rect.left, window.innerWidth - 320));\n this.hud.style.top = `${top}px`;\n this.hud.style.left = `${left}px`;\n }\n\n hideHud() {\n this.hud.style.display = \"none\";\n }\n\n /** True if the event originated from the SDK's own UI (so we ignore it). */\n ownsEvent(event: Event): boolean {\n const path = event.composedPath();\n if (path.includes(this.host)) return true;\n if (path.some((n) => n === this.root)) return true;\n if (this.launcher) {\n for (const node of path) {\n if (this.launcher.ownsNode(node as Element | EventTarget)) return true;\n }\n }\n return false;\n }\n\n /** True if the event originated from the popover specifically. */\n popoverOwnsEvent(event: Event): boolean {\n return this.popover.ownsEvent(event);\n }\n\n /** Render the given feedback list as pins. */\n renderPins(\n feedbacks: Feedback[],\n onClick: PinClickHandler | null,\n onDragEnd: PinDragHandler | null = null\n ) {\n this.onPinClick = onClick;\n this.onPinDragEnd = onDragEnd;\n this.pendingFeedback = feedbacks;\n this.scheduleRepositionPins();\n }\n\n /** Re-position pins after layout changes. Called on resize/scroll. */\n reposition() {\n this.scheduleRepositionPins();\n this.popover.reposition();\n }\n\n popoverManager(): PopoverManager {\n return this.popover;\n }\n\n /** Wire the floating launcher to controller callbacks. Idempotent. */\n installLauncher(callbacks: LauncherCallbacks): LauncherManager {\n if (this.launcher) return this.launcher;\n this.launcher = new LauncherManager(this.root, callbacks);\n return this.launcher;\n }\n\n /** Show or hide the pin layer entirely (e.g. via the eye toggle). */\n setPinsVisible(visible: boolean): void {\n this.pinLayer.classList.toggle(\"hidden\", !visible);\n }\n\n private scheduleRepositionPins() {\n if (this.rafHandle !== null) return;\n this.rafHandle = requestAnimationFrame(() => {\n this.rafHandle = null;\n this.layoutPins();\n });\n }\n\n private layoutPins() {\n const next = document.createDocumentFragment();\n for (const fb of this.pendingFeedback) {\n const target = findElement(fb.selector);\n const projected = projectCoordinates(target, fb.coordinates);\n const pin = document.createElement(\"button\");\n pin.type = \"button\";\n const classes = [\"pin\"];\n if (projected.orphaned) classes.push(\"orphaned\");\n if (fb.status === \"resolved\") classes.push(\"resolved\");\n if (fb.status === \"archived\") classes.push(\"archived\");\n pin.className = classes.join(\" \");\n pin.setAttribute(\"data-feedback-id\", fb.id);\n pin.setAttribute(\"aria-label\", `Feedback ${fb.id}`);\n pin.style.left = `${projected.x - window.scrollX}px`;\n pin.style.top = `${projected.y - window.scrollY}px`;\n const label = document.createElement(\"span\");\n label.textContent = String(fb.thread.length || 1);\n pin.appendChild(label);\n pin.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n if (this.draggingPin === fb.id) return; // suppress click after a drag\n this.onPinClick?.(fb);\n });\n this.attachDragHandlers(pin, fb);\n next.appendChild(pin);\n }\n this.pinLayer.replaceChildren(next);\n }\n\n destroy() {\n if (this.rafHandle !== null) {\n cancelAnimationFrame(this.rafHandle);\n this.rafHandle = null;\n }\n this.popover.hide();\n this.launcher?.destroy();\n this.launcher = null;\n this.host.remove();\n }\n\n private attachDragHandlers(pin: HTMLButtonElement, fb: Feedback): void {\n let startClientX = 0;\n let startClientY = 0;\n let pointerDownAt = 0;\n let isDragging = false;\n let pointerId: number | null = null;\n let originLeft = 0;\n let originTop = 0;\n const DRAG_THRESHOLD = 4; // pixels before we treat it as a drag\n\n const onPointerMove = (e: PointerEvent) => {\n if (pointerId === null || e.pointerId !== pointerId) return;\n const dx = e.clientX - startClientX;\n const dy = e.clientY - startClientY;\n if (!isDragging && Math.hypot(dx, dy) < DRAG_THRESHOLD) return;\n if (!isDragging) {\n isDragging = true;\n this.draggingPin = fb.id;\n pin.classList.add(\"dragging\");\n }\n const nextLeft = Math.max(0, Math.min(window.innerWidth, originLeft + dx));\n const nextTop = Math.max(0, Math.min(window.innerHeight, originTop + dy));\n pin.style.left = `${nextLeft}px`;\n pin.style.top = `${nextTop}px`;\n };\n\n const finish = (e: PointerEvent) => {\n if (pointerId === null || e.pointerId !== pointerId) return;\n pin.removeEventListener(\"pointermove\", onPointerMove);\n pin.removeEventListener(\"pointerup\", finish);\n pin.removeEventListener(\"pointercancel\", finish);\n try {\n pin.releasePointerCapture(pointerId);\n } catch {\n /* ignore */\n }\n pointerId = null;\n pin.classList.remove(\"dragging\");\n\n if (!isDragging) return;\n // Re-project from final viewport position back into the pin's selector.\n const target = findElement(fb.selector);\n const rect = pin.getBoundingClientRect();\n // The pin's tail tip sits at center-x, bottom of the bounding box.\n const tipX = rect.left + rect.width / 2;\n const tipY = rect.top + rect.height;\n const next = {\n xPx: Math.round(tipX + window.scrollX),\n yPx: Math.round(tipY + window.scrollY),\n xPercent: 0,\n yPercent: 0,\n };\n if (target) {\n const t = target.getBoundingClientRect();\n next.xPercent = clamp01((tipX - t.left) / (t.width || 1));\n next.yPercent = clamp01((tipY - t.top) / (t.height || 1));\n } else {\n next.xPercent = clamp01(tipX / (window.innerWidth || 1));\n next.yPercent = clamp01(tipY / (window.innerHeight || 1));\n }\n\n this.onPinDragEnd?.(fb.id, next);\n\n // Clear the drag flag on the next click tick so the click handler can\n // see it. RAF gives the browser one frame, plenty of time for the\n // synthetic click to fire and bail out.\n const releasedId = fb.id;\n requestAnimationFrame(() => {\n if (this.draggingPin === releasedId) this.draggingPin = null;\n });\n // Make sure the duration check matches a \"real click\" definition\n // (< 250ms and no movement) so accidental drags don't open the thread.\n pointerDownAt = 0;\n isDragging = false;\n };\n\n pin.addEventListener(\"pointerdown\", (e) => {\n if (e.button !== 0) return;\n pointerId = e.pointerId;\n startClientX = e.clientX;\n startClientY = e.clientY;\n pointerDownAt = Date.now();\n const rect = pin.getBoundingClientRect();\n originLeft = rect.left;\n originTop = rect.top;\n try {\n pin.setPointerCapture(e.pointerId);\n } catch {\n /* ignore */\n }\n pin.addEventListener(\"pointermove\", onPointerMove);\n pin.addEventListener(\"pointerup\", finish);\n pin.addEventListener(\"pointercancel\", finish);\n // Avoid native drag start interfering on Safari-flavored browsers.\n e.preventDefault();\n });\n void pointerDownAt;\n }\n}\n\nfunction clamp01(n: number): number {\n if (Number.isNaN(n)) return 0;\n if (n < 0) return 0;\n if (n > 1) return 1;\n return n;\n}\n\nfunction makeLayer(className: string, tag: \"div\" = \"div\"): HTMLDivElement {\n const el = document.createElement(tag);\n el.className = className;\n if (className === \"pinLayer\" || className === \"popover-layer\") {\n el.classList.add(\"layer\");\n }\n return el as HTMLDivElement;\n}\n","/**\n * Optional screenshot capture for new pins.\n *\n * `html2canvas-pro` is **dynamically imported** so prototypes that never create\n * a pin don't pay for it. Capture is best-effort: any failure logs and\n * resolves to null rather than blocking pin creation.\n *\n * We use `html2canvas-pro` (a maintained fork of `html2canvas`) instead of the\n * original because it understands modern CSS color spaces (`oklch`, `lab`,\n * `color-mix`, etc.) that ship with Tailwind v4 / shadcn / modern design\n * systems. The original errors out on these and the capture silently fails.\n */\n\nconst HOST_ATTR = \"data-mahmulp-feedback-host\";\n\nexport interface CaptureOptions {\n /** Output mime type. Defaults to image/png. */\n mimeType?: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n /** Quality (0..1) used for jpeg/webp. Ignored for png. */\n quality?: number;\n /** Viewport scale. Defaults to 1 to keep file sizes small. */\n scale?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<CaptureOptions> = {\n mimeType: \"image/png\",\n quality: 0.92,\n scale: 1,\n};\n\n/**\n * Capture a screenshot of the current viewport.\n *\n * Hides the SDK's own overlay host before capture and restores it after,\n * so the screenshot reflects the prototype, not the SDK chrome.\n */\nexport async function captureViewport(options: CaptureOptions = {}): Promise<Blob | null> {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return null;\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const html2canvas = await loadHtml2Canvas();\n if (!html2canvas) return null;\n\n const host = document.querySelector(`[${HOST_ATTR}]`) as HTMLElement | null;\n const previousVisibility = host?.style.visibility ?? \"\";\n if (host) host.style.visibility = \"hidden\";\n\n try {\n const canvas: HTMLCanvasElement = await html2canvas(document.documentElement, {\n backgroundColor: null,\n scale: opts.scale,\n width: window.innerWidth,\n height: window.innerHeight,\n x: window.scrollX,\n y: window.scrollY,\n windowWidth: window.innerWidth,\n windowHeight: window.innerHeight,\n logging: false,\n useCORS: true,\n allowTaint: false,\n });\n\n return await canvasToBlob(canvas, opts.mimeType, opts.quality);\n } catch (err) {\n // Surface the failure so debugging \"no screenshot captured\" doesn't\n // require opening the SDK source. Capture is still best-effort: we\n // resolve null so pin creation can proceed.\n if (typeof console !== \"undefined\") {\n console.warn(\"[feedback-sdk] screenshot capture failed:\", err);\n }\n return null;\n } finally {\n if (host) host.style.visibility = previousVisibility;\n }\n}\n\nlet html2canvasPromise: Promise<Html2CanvasFn | null> | null = null;\nlet html2canvasMissingWarned = false;\n\nasync function loadHtml2Canvas(): Promise<Html2CanvasFn | null> {\n if (html2canvasPromise) return html2canvasPromise;\n html2canvasPromise = (async () => {\n try {\n const mod = (await import(\"html2canvas-pro\")) as unknown as {\n default?: Html2CanvasFn;\n } & Html2CanvasFn;\n return (mod.default ?? (mod as unknown as Html2CanvasFn)) ?? null;\n } catch (err) {\n if (!html2canvasMissingWarned && typeof console !== \"undefined\") {\n html2canvasMissingWarned = true;\n // html2canvas-pro is bundled with the SDK — if the dynamic import\n // still fails, something is wrong with the consumer's bundler config.\n console.warn(\n \"[feedback-sdk] screenshot capture disabled: failed to load `html2canvas-pro`. \" +\n \"This shouldn't normally happen — html2canvas-pro is a direct dependency of the SDK. \" +\n \"Pass `captureScreenshots: false` to silence this warning if intended.\",\n err\n );\n }\n return null;\n }\n })();\n return html2canvasPromise;\n}\n\nfunction canvasToBlob(\n canvas: HTMLCanvasElement,\n mimeType: string,\n quality: number\n): Promise<Blob | null> {\n return new Promise((resolve) => {\n if (typeof canvas.toBlob === \"function\") {\n canvas.toBlob(resolve, mimeType, quality);\n } else {\n // Fallback: data URL → Blob.\n try {\n const dataUrl = canvas.toDataURL(mimeType, quality);\n const [meta, b64] = dataUrl.split(\",\");\n const bin = atob(b64 ?? \"\");\n const arr = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) arr[i] = bin.charCodeAt(i);\n const detectedMime = meta?.match(/data:([^;]+);/)?.[1] ?? mimeType;\n resolve(new Blob([arr], { type: detectedMime }));\n } catch {\n resolve(null);\n }\n }\n });\n}\n\n// Loose type — html2canvas's published .d.ts is broad; we don't need most of it.\ntype Html2CanvasFn = (\n element: HTMLElement,\n options?: Record<string, unknown>\n) => Promise<HTMLCanvasElement>;\n\n/** @internal — exposed for tests. */\nexport function _resetForTests() {\n html2canvasPromise = null;\n html2canvasMissingWarned = false;\n}\n","import type {\n CreateFeedbackInput,\n Feedback,\n FeedbackAuthor,\n FeedbackCoordinates,\n FeedbackStatus,\n FeedbackTransport,\n ListFeedbackResult,\n} from \"./types.js\";\n\nexport type { FeedbackTransport };\n\n/**\n * Default HTTP transport: talks to the API at `apiUrl` using a per-project\n * API key (`apiKey`, sent as `x-feedback-key`).\n *\n * GET /v1/feedback?pageUrl=…&status=…\n * POST /v1/feedback\n * POST /v1/feedback/:id/comments\n * PATCH /v1/feedback/:id { status } (admin-only; SDK rarely calls this)\n * PATCH /v1/feedback/:id/coordinates { coordinates } (drag-to-move)\n * POST /v1/feedback/:id/screenshot (multipart, field \"file\")\n *\n * The SDK never sends `projectId` — the server resolves the project from\n * the API key.\n */\nexport interface HttpTransportOptions {\n apiUrl: string;\n /** Per-project ingest key sent as `x-feedback-key`. Required. */\n apiKey: string;\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n}\n\nexport function createHttpTransport(options: HttpTransportOptions): FeedbackTransport {\n if (!options.apiKey) {\n throw new Error(\"createHttpTransport: `apiKey` is required\");\n }\n const fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);\n const base = options.apiUrl.replace(/\\/$/, \"\");\n\n function jsonHeaders(): HeadersInit {\n return {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n \"x-feedback-key\": options.apiKey,\n ...(options.headers ?? {}),\n };\n }\n\n function authHeaders(): Record<string, string> {\n return { \"x-feedback-key\": options.apiKey, ...(options.headers ?? {}) };\n }\n\n async function asJson<T>(res: Response): Promise<T> {\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`feedback-sdk: ${res.status} ${res.statusText} ${text}`);\n }\n return (await res.json()) as T;\n }\n\n return {\n async list(query): Promise<ListFeedbackResult> {\n const params = new URLSearchParams();\n if (query.pageUrl) params.set(\"pageUrl\", query.pageUrl);\n if (query.status) params.set(\"status\", query.status);\n const qs = params.toString();\n const res = await fetchImpl(`${base}/v1/feedback${qs ? `?${qs}` : \"\"}`, {\n method: \"GET\",\n headers: jsonHeaders(),\n });\n return asJson<ListFeedbackResult>(res);\n },\n\n async create(input): Promise<Feedback> {\n // The server fills in `projectId` from the API key; we never send it.\n const { projectId: _ignored, ...payload } = input as CreateFeedbackInput & {\n projectId?: string;\n };\n void _ignored;\n const res = await fetchImpl(`${base}/v1/feedback`, {\n method: \"POST\",\n headers: jsonHeaders(),\n body: JSON.stringify(payload),\n });\n return asJson<Feedback>(res);\n },\n\n async reply(feedbackId, comment: { author: FeedbackAuthor; body: string }): Promise<Feedback> {\n const res = await fetchImpl(`${base}/v1/feedback/${encodeURIComponent(feedbackId)}/comments`, {\n method: \"POST\",\n headers: jsonHeaders(),\n body: JSON.stringify(comment),\n });\n return asJson<Feedback>(res);\n },\n\n async setStatus(feedbackId, status: FeedbackStatus): Promise<Feedback> {\n const res = await fetchImpl(`${base}/v1/feedback/${encodeURIComponent(feedbackId)}`, {\n method: \"PATCH\",\n headers: jsonHeaders(),\n body: JSON.stringify({ status }),\n });\n return asJson<Feedback>(res);\n },\n\n async move(feedbackId, coordinates: FeedbackCoordinates): Promise<Feedback> {\n const res = await fetchImpl(\n `${base}/v1/feedback/${encodeURIComponent(feedbackId)}/coordinates`,\n {\n method: \"PATCH\",\n headers: jsonHeaders(),\n body: JSON.stringify({ coordinates }),\n }\n );\n return asJson<Feedback>(res);\n },\n\n async uploadScreenshot(feedbackId, blob: Blob): Promise<Feedback> {\n const form = new FormData();\n form.append(\"file\", blob, `${feedbackId}.png`);\n const res = await fetchImpl(\n `${base}/v1/feedback/${encodeURIComponent(feedbackId)}/screenshot`,\n {\n method: \"POST\",\n headers: authHeaders(),\n body: form,\n }\n );\n return asJson<Feedback>(res);\n },\n };\n}\n","import type {\n CreateFeedbackInput,\n Feedback,\n FeedbackAuthor,\n FeedbackStatus,\n FeedbackTransport,\n} from \"./types.js\";\nimport { computeCoordinates, getViewportInfo } from \"./coordinates.js\";\nimport { loadAuthor, saveAuthor } from \"./identity.js\";\nimport { Overlay } from \"./overlay.js\";\nimport { captureViewport } from \"./screenshot.js\";\nimport { findElement, resolveSelector } from \"./selector.js\";\nimport { createHttpTransport } from \"./transport.js\";\n\nexport interface InitFeedbackOptions {\n /** Base URL of the API (used when no `transport` is provided). */\n apiUrl?: string;\n /** Per-project ingest key (sent as `x-feedback-key` to the API). Required when using the HTTP transport. */\n apiKey?: string;\n /** Custom transport override. Useful for tests, mocks, or non-HTTP backends. */\n transport?: FeedbackTransport;\n /**\n * Identifier used for client-side caching (author identity per project).\n * Defaults to `apiKey`'s prefix when omitted; safe to leave unset.\n */\n cacheNamespace?: string;\n /** Start with feedback mode enabled. Defaults to `false` (caller toggles via UI). */\n enabled?: boolean;\n /** Override how the page URL is captured. Defaults to `window.location.pathname + search`. */\n getPageUrl?: () => string;\n /**\n * Modifier key used to \"select parent\" while picking a target.\n * Defaults to \"Alt\".\n */\n selectParentModifier?: \"Alt\" | \"Shift\" | \"Meta\" | \"Control\";\n /** Override how the author identity is read. Defaults to a localStorage cache. */\n getAuthor?: () => FeedbackAuthor | null;\n /** Override how the author identity is persisted after a successful submit. */\n setAuthor?: (author: FeedbackAuthor) => void;\n /** Capture a screenshot when a new pin is created. Defaults to `true`. */\n captureScreenshots?: boolean;\n /** Override the screenshot capture function. Returns null to skip silently. */\n captureScreenshot?: () => Promise<Blob | null>;\n /** Render the floating launcher widget. Defaults to `true`. */\n showLauncher?: boolean;\n /** Initial pin visibility. Defaults to `true`. */\n pinsVisible?: boolean;\n /** Called when a pin is clicked in display mode. Use to render a thread popover. */\n onPinClick?: (feedback: Feedback) => void;\n /** Called after a new pin is created. */\n onPinCreate?: (feedback: Feedback) => void;\n /** Called when an error happens during a SDK action. */\n onError?: (err: unknown) => void;\n}\n\nexport interface FeedbackController {\n /** Toggle / set feedback creation mode. */\n setEnabled(enabled: boolean): void;\n /** Read the current enabled state. */\n isEnabled(): boolean;\n /** Show or hide all pins (the floating launcher's eye toggle calls this). */\n setPinsVisible(visible: boolean): void;\n /** Show or hide the floating launcher widget. */\n setLauncherVisible(visible: boolean): void;\n /** Trigger a fresh fetch of feedback for the current project. */\n refresh(): Promise<void>;\n /** Tear down: remove DOM, listeners, and observers. Idempotent. */\n destroy(): void;\n}\n\ninterface InternalState {\n enabled: boolean;\n hoverTarget: Element | null;\n /** When the user \"selects up\" with the modifier, this is the locked candidate. */\n candidate: Element | null;\n feedbacks: Feedback[];\n destroyed: boolean;\n}\n\ninterface PendingPin {\n selector: string;\n coordinates: ReturnType<typeof computeCoordinates>;\n pageX: number;\n pageY: number;\n}\n\nexport function initFeedback(options: InitFeedbackOptions): FeedbackController {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return ssrNoopController();\n }\n\n const transport: FeedbackTransport =\n options.transport ??\n (() => {\n if (!options.apiUrl) {\n throw new Error(\"initFeedback: provide either `transport` or `apiUrl`\");\n }\n if (!options.apiKey) {\n throw new Error(\"initFeedback: `apiKey` is required when using the default HTTP transport\");\n }\n return createHttpTransport({ apiUrl: options.apiUrl, apiKey: options.apiKey });\n })();\n\n const namespace =\n options.cacheNamespace ?? (options.apiKey ? options.apiKey.slice(0, 12) : \"default\");\n\n const overlay = new Overlay();\n\n const state: InternalState = {\n enabled: !!options.enabled,\n hoverTarget: null,\n candidate: null,\n feedbacks: [],\n destroyed: false,\n };\n\n let pendingPin: PendingPin | null = null;\n let activeThreadId: string | null = null;\n\n const getPageUrl =\n options.getPageUrl ?? (() => window.location.pathname + window.location.search);\n const modKey = options.selectParentModifier ?? \"Alt\";\n const getAuthor = options.getAuthor ?? (() => loadAuthor(namespace));\n const setAuthor =\n options.setAuthor ??\n ((author: FeedbackAuthor) => {\n saveAuthor(namespace, author);\n });\n const wantsScreenshots = options.captureScreenshots !== false;\n const captureFn = options.captureScreenshot ?? (() => captureViewport());\n\n function isModifierActive(e: MouseEvent | KeyboardEvent): boolean {\n switch (modKey) {\n case \"Alt\":\n return e.altKey;\n case \"Shift\":\n return e.shiftKey;\n case \"Meta\":\n return e.metaKey;\n case \"Control\":\n return e.ctrlKey;\n }\n }\n\n function reportError(err: unknown) {\n if (options.onError) {\n try {\n options.onError(err);\n } catch {\n /* swallow */\n }\n } else if (typeof console !== \"undefined\") {\n console.error(\"[feedback-sdk]\", err);\n }\n }\n\n // ---------- Event handlers ----------\n\n function onMouseMove(e: MouseEvent) {\n if (!state.enabled) return;\n if (overlay.ownsEvent(e)) return;\n if (pendingPin || activeThreadId) return; // freeze hover while a popover is open\n\n const target = elementAtFiltered(e.clientX, e.clientY, overlay);\n if (!target) {\n state.hoverTarget = null;\n overlay.hideHighlight();\n overlay.hideHud();\n return;\n }\n state.hoverTarget = target;\n state.candidate = target;\n overlay.showHighlight(target);\n overlay.showHud(target);\n }\n\n function onClick(e: MouseEvent) {\n // Always allow clicks inside the popover to behave normally.\n if (overlay.popoverOwnsEvent(e)) return;\n if (!state.enabled) return;\n if (overlay.ownsEvent(e)) return; // SDK's own UI (pins handle their own click)\n\n if (isModifierActive(e)) {\n const next = state.candidate?.parentElement ?? null;\n if (next && next !== document.body && next !== document.documentElement) {\n state.candidate = next;\n overlay.showHighlight(next);\n overlay.showHud(next);\n }\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n const target = state.candidate ?? state.hoverTarget;\n if (!target) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n openComposerAt(target, e.clientX, e.clientY);\n }\n\n function onKeyDown(e: KeyboardEvent) {\n // Global shortcut: Ctrl/⌘+Shift+F toggles feedback mode + reveals launcher.\n if ((e.metaKey || e.ctrlKey) && e.shiftKey && (e.key === \"F\" || e.key === \"f\")) {\n e.preventDefault();\n e.stopPropagation();\n if (!launcherState.launcherVisible) {\n launcherState.launcherVisible = true;\n syncLauncher();\n }\n publicSetEnabled(!state.enabled);\n return;\n }\n if (e.key === \"Escape\") {\n if (pendingPin || activeThreadId) {\n cancelComposer();\n closeThread();\n return;\n }\n if (state.enabled) {\n state.candidate = null;\n state.hoverTarget = null;\n overlay.hideHighlight();\n overlay.hideHud();\n }\n }\n }\n\n function onWindowReposition() {\n overlay.reposition();\n }\n\n // ---------- Composer & thread ----------\n\n function openComposerAt(target: Element, clientX: number, clientY: number) {\n const selector = resolveSelector(target);\n const coordinates = computeCoordinates(target, clientX, clientY);\n pendingPin = {\n selector,\n coordinates,\n pageX: clientX + window.scrollX,\n pageY: clientY + window.scrollY,\n };\n\n overlay.hideHighlight();\n overlay.hideHud();\n\n // Kick off screenshot capture in the background while the user types.\n // We hide the overlay's host inside captureViewport, so it never appears\n // in the resulting image even though the popover renders during typing.\n let screenshotPromise: Promise<Blob | null> | null = null;\n if (wantsScreenshots) {\n screenshotPromise = captureFn().catch(() => null);\n }\n\n overlay.popoverManager().showComposer(\n { pageX: pendingPin.pageX, pageY: pendingPin.pageY },\n {\n initialAuthor: getAuthor(),\n onSubmit: async (body, author) => {\n const pin = pendingPin;\n if (!pin) return;\n try {\n const fb = await createPin(pin, { author, body });\n setAuthor(author);\n options.onPinCreate?.(fb);\n pendingPin = null;\n overlay.popoverManager().hide();\n\n if (screenshotPromise && transport.uploadScreenshot) {\n void screenshotPromise\n .then(async (blob) => {\n if (!blob) return;\n const updated = await transport.uploadScreenshot!(fb.id, blob);\n replaceFeedback(updated);\n })\n .catch((err) => reportError(err));\n }\n } catch (err) {\n reportError(err);\n }\n },\n onCancel: () => cancelComposer(),\n }\n );\n }\n\n function cancelComposer() {\n if (!pendingPin) return;\n pendingPin = null;\n overlay.popoverManager().hide();\n }\n\n function openThread(fb: Feedback) {\n activeThreadId = fb.id;\n const anchor = computeThreadAnchor(fb);\n overlay.popoverManager().showThread(fb, anchor, {\n initialAuthor: getAuthor(),\n onReply: async (body, author) => {\n try {\n const updated = await transport.reply(fb.id, { author, body });\n setAuthor(author);\n replaceFeedback(updated);\n // Re-render the thread with the new comment.\n overlay.popoverManager().hide();\n activeThreadId = null;\n openThread(updated);\n } catch (err) {\n reportError(err);\n }\n },\n onStatus: async (status: FeedbackStatus) => {\n try {\n const updated = await transport.setStatus(fb.id, status);\n replaceFeedback(updated);\n overlay.popoverManager().hide();\n activeThreadId = null;\n openThread(updated);\n } catch (err) {\n reportError(err);\n }\n },\n onClose: () => closeThread(),\n });\n }\n\n function closeThread() {\n if (!activeThreadId) return;\n activeThreadId = null;\n overlay.popoverManager().hide();\n }\n\n function computeThreadAnchor(fb: Feedback): { pageX: number; pageY: number } {\n const target = findElement(fb.selector);\n if (target) {\n const rect = target.getBoundingClientRect();\n return {\n pageX: rect.left + window.scrollX + rect.width * fb.coordinates.xPercent,\n pageY: rect.top + window.scrollY + rect.height * fb.coordinates.yPercent,\n };\n }\n return { pageX: fb.coordinates.xPx, pageY: fb.coordinates.yPx };\n }\n\n // ---------- Pin lifecycle ----------\n\n async function createPin(\n pin: PendingPin,\n comment: { author: FeedbackAuthor; body: string }\n ): Promise<Feedback> {\n const viewport = getViewportInfo();\n const pageUrl = getPageUrl();\n\n const input: CreateFeedbackInput = {\n projectId: \"\", // server resolves from API key — kept here only to satisfy the type\n pageUrl,\n selector: pin.selector,\n coordinates: pin.coordinates,\n viewport,\n comment,\n };\n\n const fb = await transport.create(input);\n state.feedbacks = [...state.feedbacks, fb];\n overlay.renderPins(state.feedbacks, openThread, onPinDragEnd);\n return fb;\n }\n\n function replaceFeedback(updated: Feedback) {\n state.feedbacks = state.feedbacks.map((f) => (f.id === updated.id ? updated : f));\n overlay.renderPins(state.feedbacks, openThread, onPinDragEnd);\n }\n\n async function refresh(): Promise<void> {\n try {\n // The transport's list() filters server-side by the API key's project,\n // so we just pass an empty query and trust the response.\n const result = await transport.list({ projectId: \"\" });\n state.feedbacks = result.items;\n overlay.renderPins(state.feedbacks, openThread, onPinDragEnd);\n } catch (err) {\n reportError(err);\n }\n }\n\n async function onPinDragEnd(\n id: string,\n next: { xPercent: number; yPercent: number; xPx: number; yPx: number }\n ): Promise<void> {\n // Optimistic update so the pin doesn't snap back during the request.\n const previous = state.feedbacks.find((f) => f.id === id);\n if (!previous) return;\n const optimistic: Feedback = {\n ...previous,\n coordinates: { ...previous.coordinates, ...next },\n updatedAt: new Date().toISOString(),\n };\n replaceFeedback(optimistic);\n\n if (!transport.move) return;\n try {\n const persisted = await transport.move(id, optimistic.coordinates);\n replaceFeedback(persisted);\n } catch (err) {\n // Roll back on failure so the UI doesn't drift from the server.\n replaceFeedback(previous);\n reportError(err);\n }\n }\n\n // ---------- Wire up listeners ----------\n\n document.addEventListener(\"mousemove\", onMouseMove, true);\n document.addEventListener(\"click\", onClick, true);\n document.addEventListener(\"keydown\", onKeyDown, true);\n window.addEventListener(\"scroll\", onWindowReposition, true);\n window.addEventListener(\"resize\", onWindowReposition);\n\n void refresh();\n overlay.setEnabledStyles(state.enabled);\n\n // ---------- Floating launcher ----------\n const wantsLauncher = options.showLauncher !== false;\n const launcherState = {\n pinsVisible: options.pinsVisible !== false,\n launcherVisible: true,\n };\n overlay.setPinsVisible(launcherState.pinsVisible);\n\n function syncLauncher(): void {\n launcher?.setEnabled(state.enabled);\n launcher?.setPinsVisible(launcherState.pinsVisible);\n launcher?.setLauncherVisible(launcherState.launcherVisible);\n }\n\n const launcher = wantsLauncher\n ? overlay.installLauncher({\n onToggleFeedback: () => {\n publicSetEnabled(!state.enabled);\n },\n onTogglePins: () => {\n publicSetPinsVisible(!launcherState.pinsVisible);\n },\n onHideLauncher: () => {\n publicSetLauncherVisible(!launcherState.launcherVisible);\n },\n })\n : null;\n syncLauncher();\n\n function publicSetEnabled(enabled: boolean) {\n if (state.destroyed) return;\n state.enabled = enabled;\n overlay.setEnabledStyles(enabled);\n if (!enabled) cancelComposer();\n syncLauncher();\n }\n function publicSetPinsVisible(visible: boolean) {\n if (state.destroyed) return;\n launcherState.pinsVisible = visible;\n overlay.setPinsVisible(visible);\n syncLauncher();\n }\n function publicSetLauncherVisible(visible: boolean) {\n if (state.destroyed) return;\n launcherState.launcherVisible = visible;\n syncLauncher();\n }\n\n return {\n setEnabled: publicSetEnabled,\n isEnabled() {\n return state.enabled;\n },\n setPinsVisible: publicSetPinsVisible,\n setLauncherVisible: publicSetLauncherVisible,\n async refresh() {\n if (state.destroyed) return;\n await refresh();\n },\n destroy() {\n if (state.destroyed) return;\n state.destroyed = true;\n document.removeEventListener(\"mousemove\", onMouseMove, true);\n document.removeEventListener(\"click\", onClick, true);\n document.removeEventListener(\"keydown\", onKeyDown, true);\n window.removeEventListener(\"scroll\", onWindowReposition, true);\n window.removeEventListener(\"resize\", onWindowReposition);\n overlay.destroy();\n },\n };\n}\n\nfunction elementAtFiltered(x: number, y: number, overlay: Overlay): Element | null {\n const stack = document.elementsFromPoint(x, y);\n for (const node of stack) {\n if (overlay.ownsEvent({ composedPath: () => [node] } as unknown as Event)) continue;\n if (node === document.documentElement || node === document.body) continue;\n return node;\n }\n return null;\n}\n\nfunction ssrNoopController(): FeedbackController {\n return {\n setEnabled() {},\n isEnabled() {\n return false;\n },\n setPinsVisible() {},\n setLauncherVisible() {},\n async refresh() {},\n destroy() {},\n };\n}\n","/**\n * Svelte adapter — thin lifecycle wrapper around the framework-agnostic core.\n *\n * import { feedback, feedbackEnabled } from '@mahmulp/feedback-sdk/svelte'\n *\n * Usage:\n *\n * <script lang=\"ts\">\n * import { feedback, feedbackEnabled } from '@mahmulp/feedback-sdk/svelte'\n * const enabled = feedbackEnabled()\n * </script>\n *\n * <div use:feedback={{ apiUrl: '/api', apiKey: 'mp_…' }}>\n * <slot />\n * </div>\n *\n * <button on:click={() => enabled.toggle()}>\n * {$enabled ? 'Stop' : 'Start'} feedback\n * </button>\n */\n\nimport { initFeedback } from \"./controller.js\";\nimport type { FeedbackController, InitFeedbackOptions } from \"./controller.js\";\n\nexport type FeedbackActionParams = InitFeedbackOptions;\n\nexport interface FeedbackAction {\n destroy(): void;\n update(params: FeedbackActionParams): void;\n}\n\n/**\n * Svelte action: `use:feedback={{ apiUrl, apiKey }}`.\n *\n * The action is a no-op during SSR (`initFeedback` already returns an SSR-safe\n * controller, but we still skip it to avoid even constructing the host).\n */\nexport function feedback(node: HTMLElement, params: FeedbackActionParams): FeedbackAction {\n let controller: FeedbackController | null = null;\n let lastParams = params;\n\n if (typeof window !== \"undefined\") {\n controller = initFeedback(params);\n enabledStore.attach(controller);\n }\n\n return {\n update(next: FeedbackActionParams) {\n // If the apiKey / apiUrl meaningfully change, restart.\n const restart =\n next.apiKey !== lastParams.apiKey ||\n next.apiUrl !== lastParams.apiUrl ||\n next.transport !== lastParams.transport;\n lastParams = next;\n if (restart && controller) {\n controller.destroy();\n enabledStore.detach();\n if (typeof window !== \"undefined\") {\n controller = initFeedback(next);\n enabledStore.attach(controller);\n }\n }\n },\n destroy() {\n controller?.destroy();\n controller = null;\n enabledStore.detach();\n // Reference node so eslint and friends don't complain about unused params.\n void node;\n },\n };\n}\n\n// ---------- enabled store ----------\n\ninterface EnabledStoreApi {\n subscribe(run: (value: boolean) => void): () => void;\n set(value: boolean): void;\n toggle(): void;\n}\n\ninterface InternalStore extends EnabledStoreApi {\n attach(c: FeedbackController): void;\n detach(): void;\n}\n\nfunction createInternalStore(): InternalStore {\n const subs = new Set<(value: boolean) => void>();\n let value = false;\n let attached: FeedbackController | null = null;\n\n function emit() {\n for (const s of subs) s(value);\n }\n\n return {\n subscribe(run) {\n subs.add(run);\n run(value);\n return () => subs.delete(run);\n },\n set(next: boolean) {\n value = next;\n attached?.setEnabled(next);\n emit();\n },\n toggle() {\n this.set(!value);\n },\n attach(c) {\n attached = c;\n // Sync from the controller's initial state.\n value = c.isEnabled();\n emit();\n },\n detach() {\n attached = null;\n value = false;\n emit();\n },\n };\n}\n\nconst enabledStore = createInternalStore();\n\n/**\n * Returns a writable-ish store of the \"feedback mode\" flag.\n *\n * const enabled = feedbackEnabled()\n * $: console.log($enabled)\n * enabled.toggle()\n */\nexport function feedbackEnabled(): EnabledStoreApi {\n return {\n subscribe: enabledStore.subscribe.bind(enabledStore),\n set: enabledStore.set.bind(enabledStore),\n toggle: enabledStore.toggle.bind(enabledStore),\n };\n}\n\n// Re-exports useful for typing in SvelteKit.\nexport type { FeedbackController, InitFeedbackOptions } from \"./controller.js\";\nexport type {\n CreateFeedbackInput,\n Feedback,\n FeedbackStatus,\n FeedbackTransport,\n} from \"./types.js\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/coordinates.ts","../src/identity.ts","../src/selector.ts","../src/launcher.ts","../src/popover.ts","../src/overlay.ts","../src/screenshot.ts","../src/transport.ts","../src/controller.ts","../src/svelte.ts"],"names":["feedback","clamp01","HOST_ATTR"],"mappings":"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","file":"svelte.js","sourcesContent":["import type { FeedbackCoordinates, ViewportInfo } from \"./types.js\";\n\n/**\n * Compute pin coordinates for a click on a target element.\n *\n * - xPercent / yPercent are relative to the target's bounding box (clamped 0..1),\n * used to re-render the pin after layout changes.\n * - xPx / yPx are absolute page coordinates, used as the orphaned-pin fallback.\n */\nexport function computeCoordinates(\n target: Element,\n clientX: number,\n clientY: number\n): FeedbackCoordinates {\n const rect = target.getBoundingClientRect();\n const width = rect.width || 1;\n const height = rect.height || 1;\n\n const xPercent = clamp01((clientX - rect.left) / width);\n const yPercent = clamp01((clientY - rect.top) / height);\n\n const xPx = Math.round(clientX + window.scrollX);\n const yPx = Math.round(clientY + window.scrollY);\n\n return { xPercent, yPercent, xPx, yPx };\n}\n\nexport function getViewportInfo(): ViewportInfo {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n devicePixelRatio: window.devicePixelRatio || 1,\n };\n}\n\n/**\n * Project stored coordinates back onto a (possibly resolved) target element.\n * If `target` is null (orphaned), fall back to absolute page pixels.\n *\n * Returns coordinates in the **page** coordinate space (account for scroll separately\n * when positioning fixed-overlay elements).\n */\nexport function projectCoordinates(\n target: Element | null,\n coords: FeedbackCoordinates\n): { x: number; y: number; orphaned: boolean } {\n if (target) {\n const rect = target.getBoundingClientRect();\n return {\n x: rect.left + window.scrollX + rect.width * coords.xPercent,\n y: rect.top + window.scrollY + rect.height * coords.yPercent,\n orphaned: false,\n };\n }\n return { x: coords.xPx, y: coords.yPx, orphaned: true };\n}\n\nfunction clamp01(n: number): number {\n if (Number.isNaN(n)) return 0;\n if (n < 0) return 0;\n if (n > 1) return 1;\n return n;\n}\n","/**\n * Author identity persistence.\n *\n * The SDK needs to know who is leaving a comment. We don't ship an auth\n * system in the SDK itself; instead we cache a `{ name, email? }` blob in\n * `localStorage`, scoped per project, and let consumers override the\n * read/write through `getAuthor` / `setAuthor` options when they have\n * a real auth integration.\n */\n\nimport type { FeedbackAuthor } from \"./types.js\";\n\nconst STORAGE_KEY_PREFIX = \"mahmulp-fb-author:\";\n\nfunction storageKey(projectId: string): string {\n return `${STORAGE_KEY_PREFIX}${projectId}`;\n}\n\nfunction getStorage(): Storage | null {\n try {\n if (typeof localStorage === \"undefined\") return null;\n return localStorage;\n } catch {\n // localStorage can throw in privacy-mode contexts\n return null;\n }\n}\n\nexport function loadAuthor(projectId: string): FeedbackAuthor | null {\n const storage = getStorage();\n if (!storage) return null;\n try {\n const raw = storage.getItem(storageKey(projectId));\n if (!raw) return null;\n const parsed = JSON.parse(raw) as unknown;\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"name\" in parsed &&\n typeof (parsed as { name: unknown }).name === \"string\"\n ) {\n const name = (parsed as { name: string }).name.trim();\n if (name.length === 0) return null;\n const emailValue = (parsed as { email?: unknown }).email;\n const email = typeof emailValue === \"string\" ? emailValue.trim() : \"\";\n return email.length > 0 ? { name, email } : { name };\n }\n return null;\n } catch {\n return null;\n }\n}\n\nexport function saveAuthor(projectId: string, author: FeedbackAuthor): void {\n const storage = getStorage();\n if (!storage) return;\n try {\n storage.setItem(storageKey(projectId), JSON.stringify(author));\n } catch {\n // Quota / privacy errors are non-fatal.\n }\n}\n\nexport function clearAuthor(projectId: string): void {\n const storage = getStorage();\n if (!storage) return;\n try {\n storage.removeItem(storageKey(projectId));\n } catch {\n /* ignore */\n }\n}\n","/**\n * DOM selector utilities. Deterministic and side-effect-free.\n *\n * Selector priority (see `.kiro/steering/feedback-data-model.md`):\n * 1. data-feedback-id on the target or any ancestor\n * 2. id=\"…\" if it looks stable (no hashes, no auto-generated suffixes)\n * 3. structural tag + nth-child chain, capped at MAX_DEPTH levels\n * 4. tag.classname (single semantic class) as a last resort\n */\n\nconst MAX_DEPTH = 5;\n\n/** True if the id looks human-authored, not auto-generated. */\nfunction isStableId(id: string): boolean {\n if (id.length === 0 || id.length > 64) return false;\n // Reject ids that contain long hex/digit runs (likely UUID/hash fragments)\n if (/[0-9a-f]{8,}/i.test(id)) return false;\n // Reject ids with whitespace or characters that need escaping\n if (/[\\s\"'<>`]/.test(id)) return false;\n return true;\n}\n\n/** True if a single class name is a reasonable selector candidate. */\nfunction isStableClass(cls: string): boolean {\n if (cls.length === 0 || cls.length > 48) return false;\n // Reject hashed class names (CSS Modules, etc.) and long hex runs\n if (/[0-9a-f]{6,}/i.test(cls)) return false;\n // Reject classes that look like Tailwind utilities (start with breakpoint or contain \":\")\n if (/[:[\\]]/.test(cls)) return false;\n if (/^(sm|md|lg|xl|2xl|hover|focus|active|dark)-/.test(cls)) return false;\n return true;\n}\n\n/** Find the closest ancestor (including the element itself) carrying `data-feedback-id`. */\nfunction nearestFeedbackId(el: Element): { id: string; node: Element } | null {\n let cur: Element | null = el;\n while (cur && cur !== document.documentElement) {\n const id = cur.getAttribute(\"data-feedback-id\");\n if (id && id.length > 0) return { id, node: cur };\n cur = cur.parentElement;\n }\n return null;\n}\n\n/** True when a data-feedback-id value is safe to embed in an attribute selector unescaped. */\nfunction isSlugSafe(value: string): boolean {\n if (value.length === 0 || value.length > 96) return false;\n return /^[A-Za-z0-9_.:\\-]+$/.test(value);\n}\n\nfunction pickStableClass(el: Element): string | null {\n const list = Array.from(el.classList);\n for (const cls of list) {\n if (isStableClass(cls)) return cls;\n }\n return null;\n}\n\nfunction nthOfType(el: Element): number {\n const parent = el.parentElement;\n if (!parent) return 1;\n let n = 0;\n for (const sibling of Array.from(parent.children)) {\n if (sibling.tagName === el.tagName) {\n n++;\n if (sibling === el) return n;\n }\n }\n return n;\n}\n\nfunction structuralStep(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const parent = el.parentElement;\n if (!parent) return tag;\n const siblings = Array.from(parent.children).filter((c) => c.tagName === el.tagName);\n if (siblings.length === 1) return tag;\n return `${tag}:nth-of-type(${nthOfType(el)})`;\n}function buildStructuralSelector(el: Element): string {\n const parts: string[] = [];\n let cur: Element | null = el;\n let depth = 0;\n while (cur && cur !== document.body && cur !== document.documentElement && depth < MAX_DEPTH) {\n parts.unshift(structuralStep(cur));\n cur = cur.parentElement;\n depth++;\n }\n return parts.join(\" > \");\n}\n\n/**\n * Build the most stable selector we can for the given element.\n */\nexport function resolveSelector(target: Element): string {\n if (!(target instanceof Element)) {\n throw new TypeError(\"resolveSelector: target must be an Element\");\n }\n\n // 1. data-feedback-id on the element or an ancestor (only if it's a safe slug).\n const fid = nearestFeedbackId(target);\n if (fid && isSlugSafe(fid.id)) {\n return `[data-feedback-id=\"${fid.id}\"]`;\n }\n\n // 2. stable id\n const id = target.id;\n if (id && isStableId(id)) {\n return `#${CSS.escape(id)}`;\n }\n\n // 3. structural selector\n const structural = buildStructuralSelector(target);\n if (structural.length > 0) return structural;\n\n // 4. fallback: tag + single class\n const tag = target.tagName.toLowerCase();\n const cls = pickStableClass(target);\n return cls ? `${tag}.${CSS.escape(cls)}` : tag;\n}\n\n/**\n * Resolve a previously-stored selector back to an Element. Returns null if not found.\n * Never throws on malformed selectors.\n */\nexport function findElement(selector: string, root: ParentNode = document): Element | null {\n if (typeof selector !== \"string\" || selector.length === 0) return null;\n try {\n return root.querySelector(selector);\n } catch {\n return null;\n }\n}\n","/**\n * Floating launcher: 3-button pill anchored to the bottom-right corner.\n *\n * [ Start feedback ] | 👁 show pins | × hide launcher\n *\n * The launcher lives inside the SDK's Shadow DOM, so its CSS is isolated\n * from the prototype. When hidden it leaves a tiny circular re-show button\n * behind so users can bring it back.\n */\n\nexport interface LauncherCallbacks {\n onToggleFeedback: () => void;\n onTogglePins: () => void;\n onHideLauncher: () => void;\n}\n\nexport interface LauncherState {\n enabled: boolean;\n pinsVisible: boolean;\n launcherVisible: boolean;\n}\n\nexport class LauncherManager {\n private launcherEl: HTMLDivElement;\n private revealEl: HTMLButtonElement;\n private toggleBtn!: HTMLButtonElement;\n private pinBtn!: HTMLButtonElement;\n private state: LauncherState = {\n enabled: false,\n pinsVisible: true,\n launcherVisible: true,\n };\n\n constructor(parent: ShadowRoot, callbacks: LauncherCallbacks) {\n this.launcherEl = document.createElement(\"div\");\n this.launcherEl.className = \"launcher\";\n this.launcherEl.setAttribute(\"role\", \"toolbar\");\n this.launcherEl.setAttribute(\"aria-label\", \"Feedback controls\");\n\n this.toggleBtn = document.createElement(\"button\");\n this.toggleBtn.type = \"button\";\n this.toggleBtn.className = \"launcher-btn primary\";\n this.toggleBtn.setAttribute(\"aria-pressed\", \"false\");\n this.toggleBtn.addEventListener(\"click\", () => callbacks.onToggleFeedback());\n\n const divider = document.createElement(\"span\");\n divider.className = \"launcher-divider\";\n divider.setAttribute(\"aria-hidden\", \"true\");\n\n this.pinBtn = document.createElement(\"button\");\n this.pinBtn.type = \"button\";\n this.pinBtn.className = \"launcher-btn\";\n this.pinBtn.setAttribute(\"aria-pressed\", \"true\");\n this.pinBtn.addEventListener(\"click\", () => callbacks.onTogglePins());\n\n const closeBtn = document.createElement(\"button\");\n closeBtn.type = \"button\";\n closeBtn.className = \"launcher-btn muted\";\n closeBtn.setAttribute(\"aria-label\", \"Hide feedback launcher\");\n closeBtn.title = \"Hide launcher (Ctrl/⌘+Shift+F to reopen)\";\n closeBtn.innerHTML = ICON_X;\n closeBtn.addEventListener(\"click\", () => callbacks.onHideLauncher());\n\n this.launcherEl.append(this.toggleBtn, divider, this.pinBtn, closeBtn);\n\n this.revealEl = document.createElement(\"button\");\n this.revealEl.type = \"button\";\n this.revealEl.className = \"launcher-reveal\";\n this.revealEl.setAttribute(\"aria-label\", \"Show feedback launcher\");\n this.revealEl.title = \"Show feedback launcher\";\n this.revealEl.innerHTML = ICON_BUBBLE;\n this.revealEl.addEventListener(\"click\", () => callbacks.onHideLauncher());\n\n parent.append(this.launcherEl, this.revealEl);\n this.render();\n }\n\n setEnabled(enabled: boolean): void {\n this.state.enabled = enabled;\n this.render();\n }\n\n setPinsVisible(pinsVisible: boolean): void {\n this.state.pinsVisible = pinsVisible;\n this.render();\n }\n\n setLauncherVisible(launcherVisible: boolean): void {\n this.state.launcherVisible = launcherVisible;\n this.render();\n }\n\n /** True when an event originated from the launcher's own UI. */\n ownsNode(node: EventTarget | Element | null): boolean {\n if (!node) return false;\n // composedPath() can include `Window`, `Document`, and shadow roots — none\n // of which are valid arguments to `Node.contains`. Guard with `instanceof`\n // so we never throw `parameter 1 is not of type 'Node'`.\n if (typeof Node === \"undefined\" || !(node instanceof Node)) return false;\n return this.launcherEl.contains(node) || this.revealEl.contains(node);\n }\n\n destroy(): void {\n this.launcherEl.remove();\n this.revealEl.remove();\n }\n\n private render(): void {\n const { enabled, pinsVisible, launcherVisible } = this.state;\n\n this.launcherEl.classList.toggle(\"hidden\", !launcherVisible);\n this.revealEl.classList.toggle(\"visible\", !launcherVisible);\n\n this.toggleBtn.classList.toggle(\"active\", enabled);\n this.toggleBtn.setAttribute(\"aria-pressed\", enabled ? \"true\" : \"false\");\n this.toggleBtn.title = enabled\n ? \"Stop feedback mode (Esc)\"\n : \"Start feedback mode (Ctrl/⌘+Shift+F)\";\n this.toggleBtn.innerHTML = enabled\n ? `${ICON_DOT} <span>Stop</span>`\n : `${ICON_PIN} <span>Feedback</span>`;\n\n this.pinBtn.classList.toggle(\"muted\", !pinsVisible);\n this.pinBtn.setAttribute(\"aria-pressed\", pinsVisible ? \"true\" : \"false\");\n this.pinBtn.setAttribute(\"aria-label\", pinsVisible ? \"Hide pins\" : \"Show pins\");\n this.pinBtn.title = pinsVisible ? \"Hide pins\" : \"Show pins\";\n this.pinBtn.innerHTML = pinsVisible ? ICON_EYE : ICON_EYE_OFF;\n }\n}\n\n// ---- Inline SVG icons (16-line each, currentColor stroke) ----\n// Keeping them inline avoids a separate asset and stays inside the Shadow DOM.\n\nconst ICON_PIN = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M12 21s7-7.5 7-12a7 7 0 1 0-14 0c0 4.5 7 12 7 12Z\" />\n <circle cx=\"12\" cy=\"9\" r=\"2.5\" />\n</svg>`;\n\nconst ICON_DOT = `<svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n</svg>`;\n\nconst ICON_EYE = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12Z\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n</svg>`;\n\nconst ICON_EYE_OFF = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 3l18 18\" />\n <path d=\"M10.6 10.6a3 3 0 0 0 4.2 4.2\" />\n <path d=\"M9.9 5.1A10.4 10.4 0 0 1 12 5c6.5 0 10 7 10 7a17.3 17.3 0 0 1-3.6 4.5\" />\n <path d=\"M6.6 6.6A17.4 17.4 0 0 0 2 12s3.5 7 10 7c1.6 0 3-.3 4.2-.8\" />\n</svg>`;\n\nconst ICON_X = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M6 6l12 12M18 6L6 18\" />\n</svg>`;\n\nconst ICON_BUBBLE = `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M21 12a8 8 0 1 1-3.4-6.5\" />\n <path d=\"M21 4v5h-5\" />\n</svg>`;\n","import type { Feedback, FeedbackAuthor, FeedbackStatus } from \"./types.js\";\n\n/**\n * Popover renderer for the composer (new pin) and thread (existing pin) UIs.\n *\n * Anchors are stored in **page space** (`pageX`, `pageY`). On scroll/resize\n * the popover re-projects to viewport space so it stays attached to the\n * underlying click point or pin.\n */\n\nconst POPOVER_OFFSET = 18;\nconst VIEWPORT_PADDING = 8;\n\nexport interface ComposerCallbacks {\n initialAuthor: FeedbackAuthor | null;\n onSubmit(body: string, author: FeedbackAuthor): void | Promise<void>;\n onCancel(): void;\n}\n\nexport interface ThreadCallbacks {\n initialAuthor: FeedbackAuthor | null;\n onReply(body: string, author: FeedbackAuthor): void | Promise<void>;\n onStatus(status: FeedbackStatus): void | Promise<void>;\n onClose(): void;\n}\n\nexport interface PopoverAnchor {\n /** Document-space x coordinate (page pixels). */\n pageX: number;\n /** Document-space y coordinate (page pixels). */\n pageY: number;\n}\n\ninterface OpenState {\n type: \"composer\" | \"thread\";\n el: HTMLDivElement;\n pageX: number;\n pageY: number;\n /** For thread popovers, the feedback id this popover renders. Used to\n * decide whether a re-render can swap content in place vs. close+reopen. */\n feedbackId?: string;\n}\n\nexport class PopoverManager {\n private layer: HTMLDivElement;\n private current: OpenState | null = null;\n\n constructor(layer: HTMLDivElement) {\n this.layer = layer;\n }\n\n isOpen(): boolean {\n return this.current !== null;\n }\n\n /** True when the event originated inside the currently-open popover element. */\n ownsEvent(event: Event): boolean {\n if (!this.current) return false;\n const path = event.composedPath();\n return path.includes(this.current.el);\n }\n\n hide(): void {\n if (!this.current) return;\n this.current.el.remove();\n this.current = null;\n }\n\n showComposer(anchor: PopoverAnchor, cb: ComposerCallbacks): HTMLDivElement {\n this.hide();\n const el = this.buildComposer(cb);\n this.layer.appendChild(el);\n this.current = { type: \"composer\", el, pageX: anchor.pageX, pageY: anchor.pageY };\n this.repositionInternal();\n queueMicrotask(() => {\n const focusTarget = el.querySelector(\"textarea, input\") as HTMLElement | null;\n focusTarget?.focus();\n });\n return el;\n }\n\n /** True when a thread for this feedback is already open. */\n isThreadOpenFor(feedbackId: string): boolean {\n return this.current?.type === \"thread\" && this.current.feedbackId === feedbackId;\n }\n\n showThread(feedback: Feedback, anchor: PopoverAnchor, cb: ThreadCallbacks): HTMLDivElement {\n // If we're already showing this exact thread, swap the content in place\n // instead of remove+rebuild. This is what kills the \"blink\" the user sees\n // when replying / changing status (which trigger a re-open under the hood).\n if (this.current?.type === \"thread\" && this.current.feedbackId === feedback.id) {\n const fresh = this.buildThread(feedback, cb);\n this.current.el.replaceWith(fresh);\n this.current = {\n type: \"thread\",\n el: fresh,\n pageX: anchor.pageX,\n pageY: anchor.pageY,\n feedbackId: feedback.id,\n };\n this.repositionInternal();\n return fresh;\n }\n this.hide();\n const el = this.buildThread(feedback, cb);\n this.layer.appendChild(el);\n this.current = {\n type: \"thread\",\n el,\n pageX: anchor.pageX,\n pageY: anchor.pageY,\n feedbackId: feedback.id,\n };\n this.repositionInternal();\n return el;\n }\n\n /** Re-project to viewport coordinates after a scroll/resize. */\n reposition(anchor?: PopoverAnchor): void {\n if (!this.current) return;\n if (anchor) {\n this.current.pageX = anchor.pageX;\n this.current.pageY = anchor.pageY;\n }\n this.repositionInternal();\n }\n\n private repositionInternal(): void {\n if (!this.current) return;\n const viewportX = this.current.pageX - window.scrollX;\n const viewportY = this.current.pageY - window.scrollY;\n this.applyPosition(this.current.el, viewportX, viewportY);\n }\n\n private applyPosition(el: HTMLElement, anchorX: number, anchorY: number): void {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const rect = el.getBoundingClientRect();\n const w = rect.width || 320;\n const h = rect.height || 200;\n\n let x = anchorX + POPOVER_OFFSET;\n if (x + w > vw - VIEWPORT_PADDING) x = anchorX - POPOVER_OFFSET - w;\n if (x < VIEWPORT_PADDING) x = VIEWPORT_PADDING;\n\n let y = anchorY;\n if (y + h > vh - VIEWPORT_PADDING) y = vh - h - VIEWPORT_PADDING;\n if (y < VIEWPORT_PADDING) y = VIEWPORT_PADDING;\n\n el.style.left = `${x}px`;\n el.style.top = `${y}px`;\n }\n\n // ---------- Composer ----------\n\n private buildComposer(cb: ComposerCallbacks): HTMLDivElement {\n const root = this.makeShell(\"New comment\", () => cb.onCancel());\n const body = root.querySelector(\".popover-body\") as HTMLDivElement;\n\n const identity = this.buildIdentityFields(cb.initialAuthor);\n body.appendChild(identity.el);\n\n const textarea = document.createElement(\"textarea\");\n textarea.className = \"popover-textarea\";\n textarea.placeholder = \"Describe what you see...\";\n textarea.rows = 4;\n body.appendChild(textarea);\n\n const actions = document.createElement(\"div\");\n actions.className = \"popover-actions\";\n\n const cancel = document.createElement(\"button\");\n cancel.type = \"button\";\n cancel.className = \"btn btn-ghost\";\n cancel.textContent = \"Cancel\";\n cancel.addEventListener(\"click\", () => cb.onCancel());\n\n const submit = document.createElement(\"button\");\n submit.type = \"button\";\n submit.className = \"btn btn-primary popover-submit\";\n submit.textContent = \"Send\";\n submit.addEventListener(\"click\", async () => {\n const text = textarea.value.trim();\n if (text.length === 0) {\n textarea.focus();\n return;\n }\n const author = identity.read();\n if (!author) return;\n submit.disabled = true;\n try {\n await cb.onSubmit(text, author);\n } finally {\n submit.disabled = false;\n }\n });\n\n actions.appendChild(cancel);\n actions.appendChild(submit);\n body.appendChild(actions);\n\n return root;\n }\n\n // ---------- Thread ----------\n\n private buildThread(feedback: Feedback, cb: ThreadCallbacks): HTMLDivElement {\n const titleText = `Status: ${feedback.status}`;\n const root = this.makeShell(titleText, () => cb.onClose());\n root.classList.add(\"popover-thread\");\n root.dataset.status = feedback.status;\n const body = root.querySelector(\".popover-body\") as HTMLDivElement;\n\n const toolbar = document.createElement(\"div\");\n toolbar.className = \"popover-toolbar\";\n const transitions = nextStatuses(feedback.status);\n for (const status of transitions) {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"btn btn-toolbar\";\n btn.dataset.status = status;\n btn.textContent = labelForStatusTransition(status);\n btn.addEventListener(\"click\", () => {\n void cb.onStatus(status);\n });\n toolbar.appendChild(btn);\n }\n body.appendChild(toolbar);\n\n const list = document.createElement(\"ul\");\n list.className = \"popover-thread-list\";\n if (feedback.thread.length === 0) {\n const empty = document.createElement(\"li\");\n empty.className = \"popover-empty\";\n empty.textContent = \"No comments yet.\";\n list.appendChild(empty);\n } else {\n for (const c of feedback.thread) {\n const item = document.createElement(\"li\");\n item.className = \"popover-comment\";\n const meta = document.createElement(\"div\");\n meta.className = \"popover-comment-meta\";\n meta.textContent = c.author.name;\n const text = document.createElement(\"div\");\n text.className = \"popover-comment-body\";\n text.textContent = c.body;\n item.appendChild(meta);\n item.appendChild(text);\n list.appendChild(item);\n }\n }\n body.appendChild(list);\n\n const identity = this.buildIdentityFields(cb.initialAuthor);\n body.appendChild(identity.el);\n\n const reply = document.createElement(\"textarea\");\n reply.className = \"popover-textarea\";\n reply.placeholder = \"Reply...\";\n reply.rows = 3;\n body.appendChild(reply);\n\n const actions = document.createElement(\"div\");\n actions.className = \"popover-actions\";\n const submit = document.createElement(\"button\");\n submit.type = \"button\";\n submit.className = \"btn btn-primary popover-submit\";\n submit.textContent = \"Reply\";\n submit.addEventListener(\"click\", async () => {\n const text = reply.value.trim();\n if (text.length === 0) {\n reply.focus();\n return;\n }\n const author = identity.read();\n if (!author) return;\n submit.disabled = true;\n try {\n await cb.onReply(text, author);\n } finally {\n submit.disabled = false;\n }\n });\n actions.appendChild(submit);\n body.appendChild(actions);\n\n return root;\n }\n\n // ---------- Shared bits ----------\n\n private makeShell(title: string, onClose: () => void): HTMLDivElement {\n const root = document.createElement(\"div\");\n root.className = \"popover\";\n root.setAttribute(\"role\", \"dialog\");\n root.setAttribute(\"aria-label\", title);\n\n const header = document.createElement(\"div\");\n header.className = \"popover-header\";\n const titleEl = document.createElement(\"span\");\n titleEl.className = \"popover-title\";\n titleEl.textContent = title;\n header.appendChild(titleEl);\n\n const closeBtn = document.createElement(\"button\");\n closeBtn.type = \"button\";\n closeBtn.className = \"popover-close\";\n closeBtn.setAttribute(\"aria-label\", \"Close\");\n closeBtn.textContent = \"\\u00D7\";\n closeBtn.addEventListener(\"click\", () => onClose());\n header.appendChild(closeBtn);\n root.appendChild(header);\n\n const body = document.createElement(\"div\");\n body.className = \"popover-body\";\n root.appendChild(body);\n\n return root;\n }\n\n private buildIdentityFields(initial: FeedbackAuthor | null): {\n el: HTMLElement;\n read: () => FeedbackAuthor | null;\n } {\n const wrap = document.createElement(\"div\");\n wrap.className = \"popover-identity\";\n\n const nameInput = document.createElement(\"input\");\n nameInput.type = \"text\";\n nameInput.placeholder = \"Your name\";\n nameInput.className = \"popover-input popover-name\";\n nameInput.required = true;\n nameInput.autocomplete = \"name\";\n\n const emailInput = document.createElement(\"input\");\n emailInput.type = \"email\";\n emailInput.placeholder = \"Email (optional)\";\n emailInput.className = \"popover-input popover-email\";\n emailInput.autocomplete = \"email\";\n\n if (initial) {\n nameInput.value = initial.name;\n if (initial.email) emailInput.value = initial.email;\n }\n\n wrap.appendChild(nameInput);\n wrap.appendChild(emailInput);\n\n return {\n el: wrap,\n read(): FeedbackAuthor | null {\n const name = nameInput.value.trim();\n if (name.length === 0) {\n nameInput.focus();\n return null;\n }\n const email = emailInput.value.trim();\n return email.length > 0 ? { name, email } : { name };\n },\n };\n }\n}\n\nfunction nextStatuses(current: FeedbackStatus): FeedbackStatus[] {\n switch (current) {\n case \"open\":\n return [\"resolved\", \"archived\"];\n case \"resolved\":\n return [\"open\", \"archived\"];\n case \"archived\":\n return [\"open\"];\n }\n}\n\nfunction labelForStatusTransition(target: FeedbackStatus): string {\n switch (target) {\n case \"open\":\n return \"Reopen\";\n case \"resolved\":\n return \"Resolve\";\n case \"archived\":\n return \"Archive\";\n }\n}\n","import type { Feedback } from \"./types.js\";\nimport { findElement } from \"./selector.js\";\nimport { projectCoordinates } from \"./coordinates.js\";\nimport { LauncherManager, type LauncherCallbacks } from \"./launcher.js\";\nimport { PopoverManager } from \"./popover.js\";\n\n/**\n * Owns the Shadow DOM host that holds the SDK's UI:\n * - hover highlight ring\n * - selection HUD (tag + classes of current candidate)\n * - rendered pins for existing feedback\n * - composer / thread popover layer\n *\n * Everything is rendered inside a Shadow Root attached to a single host\n * appended to <body>, so prototype CSS can't leak in or out.\n */\n\nconst HOST_ATTR = \"data-mahmulp-feedback-host\";\n\nconst OVERLAY_STYLES = `\n:host { all: initial; }\n\n.layer {\n position: fixed;\n inset: 0;\n pointer-events: none;\n}\n\n.highlight {\n position: fixed;\n border: 2px solid #1F5132;\n background: rgba(31, 81, 50, 0.08);\n border-radius: 4px;\n box-shadow: 0 0 0 1px rgba(255,255,255,0.6) inset;\n transition: top 60ms linear, left 60ms linear, width 60ms linear, height 60ms linear;\n display: none;\n pointer-events: none;\n z-index: 1;\n}\n\n.hud {\n position: fixed;\n padding: 6px 10px;\n background: #1F5132;\n color: #F5FFF8;\n font: 500 12px/1.2 ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif;\n border-radius: 4px;\n pointer-events: none;\n display: none;\n z-index: 2;\n max-width: 320px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.pin {\n position: fixed;\n width: 28px;\n height: 28px;\n margin-left: -14px;\n margin-top: -28px;\n background: #1F5132;\n color: #F5FFF8;\n border: 2px solid #F5FFF8;\n border-radius: 50% 50% 50% 0;\n transform: rotate(-45deg);\n display: flex;\n align-items: center;\n justify-content: center;\n font: 600 11px/1 ui-sans-serif, system-ui, sans-serif;\n cursor: pointer;\n pointer-events: auto;\n box-shadow: 0 2px 6px rgba(0,0,0,0.25);\n transition: transform 80ms ease;\n z-index: 3;\n}\n.pin:hover { transform: rotate(-45deg) scale(1.08); }\n.pin > span { transform: rotate(45deg); }\n.pin.orphaned { opacity: 0.55; filter: grayscale(0.4); }\n.pin.resolved { background: #2F7A4D; }\n.pin.archived { background: #6B7280; }\n.pin.dragging { cursor: grabbing; transform: rotate(-45deg) scale(1.18); }\n\n.pinLayer.hidden { display: none; }\n\n/* ---------- Floating launcher ---------- */\n.launcher {\n position: fixed;\n right: 20px;\n bottom: 20px;\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px;\n background: rgba(255, 255, 255, 0.96);\n color: #1F5132;\n border: 1px solid rgba(31, 81, 50, 0.18);\n border-radius: 999px;\n box-shadow: 0 12px 24px -10px rgba(15, 35, 24, 0.32),\n 0 4px 8px -2px rgba(15, 35, 24, 0.16);\n pointer-events: auto;\n z-index: 5;\n font: 600 12px/1 ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif;\n user-select: none;\n transition: opacity 120ms ease, transform 120ms ease;\n}\n.launcher.hidden {\n opacity: 0;\n transform: translateY(8px);\n pointer-events: none;\n}\n.launcher-btn {\n appearance: none;\n width: 36px;\n height: 36px;\n border-radius: 999px;\n border: 0;\n background: transparent;\n color: inherit;\n cursor: pointer;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n transition: background 120ms ease;\n}\n.launcher-btn:hover { background: rgba(31, 81, 50, 0.08); }\n.launcher-btn:focus-visible {\n outline: 2px solid #1F5132;\n outline-offset: 2px;\n}\n.launcher-btn svg { width: 18px; height: 18px; pointer-events: none; }\n.launcher-btn.primary {\n background: #1F5132;\n color: #F5FFF8;\n width: auto;\n padding: 0 14px 0 12px;\n border-radius: 999px;\n gap: 6px;\n}\n.launcher-btn.primary:hover { background: #265E3B; }\n.launcher-btn.primary.active {\n background: #B91C1C;\n color: #FFE8E8;\n}\n.launcher-btn.primary.active:hover { background: #A11616; }\n.launcher-divider {\n width: 1px;\n height: 22px;\n background: rgba(31, 81, 50, 0.14);\n}\n.launcher-btn.muted { color: #6B7280; }\n\n/* ---------- Re-show launcher pill ---------- */\n.launcher-reveal {\n position: fixed;\n right: 20px;\n bottom: 20px;\n width: 36px;\n height: 36px;\n border-radius: 999px;\n background: #1F5132;\n color: #F5FFF8;\n border: 0;\n display: none;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n pointer-events: auto;\n box-shadow: 0 8px 16px -8px rgba(15, 35, 24, 0.4);\n z-index: 5;\n}\n.launcher-reveal.visible { display: inline-flex; }\n.launcher-reveal:hover { background: #265E3B; }\n.launcher-reveal svg { width: 18px; height: 18px; }\n\n@media (prefers-color-scheme: dark) {\n .launcher {\n background: #0F1F17;\n color: #B6D8C5;\n border-color: rgba(120, 200, 160, 0.22);\n }\n .launcher-btn.primary { color: #0F1F17; background: #B6D8C5; }\n .launcher-btn.primary:hover { background: #C7E2D2; }\n .launcher-divider { background: rgba(120, 200, 160, 0.22); }\n}\n\n.popover-layer {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 4;\n}\n\n.popover {\n position: fixed;\n width: 320px;\n max-height: min(70vh, 520px);\n display: flex;\n flex-direction: column;\n background: #FFFFFF;\n color: #111827;\n border: 1px solid rgba(31, 81, 50, 0.18);\n border-radius: 10px;\n box-shadow: 0 18px 36px -12px rgba(15, 35, 24, 0.32),\n 0 4px 8px -2px rgba(15, 35, 24, 0.16);\n font: 14px/1.45 ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif;\n pointer-events: auto;\n overflow: hidden;\n}\n\n.popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 12px;\n background: #1F5132;\n color: #F5FFF8;\n}\n.popover-title {\n font-weight: 600;\n font-size: 13px;\n letter-spacing: 0.01em;\n text-transform: capitalize;\n}\n.popover-close {\n background: transparent;\n color: inherit;\n border: 0;\n font-size: 18px;\n line-height: 1;\n padding: 2px 6px;\n cursor: pointer;\n border-radius: 4px;\n}\n.popover-close:hover { background: rgba(255,255,255,0.15); }\n\n.popover-body {\n padding: 12px;\n display: flex;\n flex-direction: column;\n gap: 10px;\n overflow-y: auto;\n}\n\n.popover-toolbar {\n display: flex;\n gap: 6px;\n flex-wrap: wrap;\n}\n\n.popover-thread-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 8px;\n max-height: 200px;\n overflow-y: auto;\n}\n.popover-comment {\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n padding: 8px 10px;\n background: #F9FAFB;\n}\n.popover-comment-meta {\n font-size: 11px;\n font-weight: 600;\n color: #374151;\n margin-bottom: 2px;\n}\n.popover-comment-body { white-space: pre-wrap; word-break: break-word; }\n.popover-empty {\n font-size: 12px;\n color: #6B7280;\n font-style: italic;\n}\n\n.popover-identity {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 6px;\n}\n\n.popover-input,\n.popover-textarea {\n width: 100%;\n box-sizing: border-box;\n padding: 8px 10px;\n border: 1px solid #D1D5DB;\n border-radius: 6px;\n font: inherit;\n color: inherit;\n background: #FFFFFF;\n resize: vertical;\n}\n.popover-input:focus,\n.popover-textarea:focus {\n outline: none;\n border-color: #1F5132;\n box-shadow: 0 0 0 3px rgba(31, 81, 50, 0.15);\n}\n\n.popover-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n}\n\n.btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 7px 14px;\n border-radius: 6px;\n border: 1px solid transparent;\n font: 600 13px/1 inherit;\n cursor: pointer;\n}\n.btn[disabled] { opacity: 0.6; cursor: not-allowed; }\n.btn-primary {\n background: #1F5132;\n color: #F5FFF8;\n}\n.btn-primary:hover { background: #295F3D; }\n.btn-ghost {\n background: transparent;\n color: #1F5132;\n border-color: rgba(31, 81, 50, 0.3);\n}\n.btn-ghost:hover { background: rgba(31, 81, 50, 0.05); }\n.btn-toolbar {\n background: rgba(31, 81, 50, 0.08);\n color: #1F5132;\n border-color: rgba(31, 81, 50, 0.18);\n font-weight: 500;\n font-size: 12px;\n padding: 5px 10px;\n}\n.btn-toolbar:hover { background: rgba(31, 81, 50, 0.16); }\n\n@media (prefers-color-scheme: dark) {\n .popover {\n background: #0F1F17;\n color: #E5F2EB;\n border-color: rgba(120, 200, 160, 0.22);\n }\n .popover-comment {\n background: #102A20;\n border-color: rgba(120, 200, 160, 0.18);\n }\n .popover-comment-meta { color: #B6D8C5; }\n .popover-empty { color: #94B3A4; }\n .popover-input,\n .popover-textarea {\n background: #102A20;\n color: inherit;\n border-color: rgba(120, 200, 160, 0.22);\n }\n .btn-ghost { color: #B6D8C5; border-color: rgba(120, 200, 160, 0.3); }\n .btn-ghost:hover { background: rgba(120, 200, 160, 0.08); }\n .btn-toolbar {\n background: rgba(120, 200, 160, 0.12);\n color: #B6D8C5;\n border-color: rgba(120, 200, 160, 0.22);\n }\n .btn-toolbar:hover { background: rgba(120, 200, 160, 0.2); }\n}\n`;\n\nexport interface PinClickHandler {\n (feedback: Feedback): void;\n}\n\nexport interface PinDragHandler {\n (\n feedbackId: string,\n next: { xPercent: number; yPercent: number; xPx: number; yPx: number }\n ): void;\n}\n\nexport class Overlay {\n private host: HTMLDivElement;\n private root: ShadowRoot;\n private highlight: HTMLDivElement;\n private hud: HTMLDivElement;\n private pinLayer: HTMLDivElement;\n private popoverLayer: HTMLDivElement;\n private popover: PopoverManager;\n private launcher: LauncherManager | null = null;\n private rafHandle: number | null = null;\n private pendingFeedback: Feedback[] = [];\n private onPinClick: PinClickHandler | null = null;\n private onPinDragEnd: PinDragHandler | null = null;\n private draggingPin: string | null = null;\n\n constructor() {\n this.host = document.createElement(\"div\");\n this.host.setAttribute(HOST_ATTR, \"\");\n this.host.style.cssText = [\n \"position: fixed\",\n \"inset: 0\",\n \"width: 0\",\n \"height: 0\",\n \"pointer-events: none\",\n \"z-index: 2147483647\",\n ].join(\";\");\n document.body.appendChild(this.host);\n\n this.root = this.host.attachShadow({ mode: \"open\" });\n const style = document.createElement(\"style\");\n style.textContent = OVERLAY_STYLES;\n this.root.appendChild(style);\n\n this.pinLayer = makeLayer(\"pinLayer\");\n this.highlight = makeLayer(\"highlight\", \"div\");\n this.hud = makeLayer(\"hud\", \"div\");\n this.popoverLayer = makeLayer(\"popover-layer\");\n this.root.append(this.pinLayer, this.highlight, this.hud, this.popoverLayer);\n\n this.popover = new PopoverManager(this.popoverLayer);\n }\n\n /** Called by the controller when the user enters/leaves feedback mode. */\n setEnabledStyles(enabled: boolean) {\n if (!enabled) {\n this.hideHighlight();\n this.hideHud();\n }\n }\n\n showHighlight(target: Element) {\n const rect = target.getBoundingClientRect();\n this.highlight.style.display = \"block\";\n this.highlight.style.left = `${rect.left}px`;\n this.highlight.style.top = `${rect.top}px`;\n this.highlight.style.width = `${rect.width}px`;\n this.highlight.style.height = `${rect.height}px`;\n }\n\n hideHighlight() {\n this.highlight.style.display = \"none\";\n }\n\n showHud(target: Element) {\n const tag = target.tagName.toLowerCase();\n const cls = (target.getAttribute(\"class\") || \"\").trim();\n const fid = target.getAttribute(\"data-feedback-id\");\n const label = fid\n ? `${tag} [data-feedback-id=\"${fid}\"]`\n : cls\n ? `${tag}.${cls.split(/\\s+/).slice(0, 2).join(\".\")}`\n : tag;\n\n const rect = target.getBoundingClientRect();\n this.hud.textContent = label;\n this.hud.style.display = \"block\";\n const hudHeight = 28;\n const top =\n rect.top - hudHeight - 6 > 0\n ? rect.top - hudHeight - 6\n : Math.min(rect.bottom + 6, window.innerHeight - hudHeight);\n const left = Math.max(8, Math.min(rect.left, window.innerWidth - 320));\n this.hud.style.top = `${top}px`;\n this.hud.style.left = `${left}px`;\n }\n\n hideHud() {\n this.hud.style.display = \"none\";\n }\n\n /** True if the event originated from the SDK's own UI (so we ignore it). */\n ownsEvent(event: Event): boolean {\n const path = event.composedPath();\n if (path.includes(this.host)) return true;\n if (path.some((n) => n === this.root)) return true;\n if (this.launcher) {\n for (const node of path) {\n if (this.launcher.ownsNode(node as Element | EventTarget)) return true;\n }\n }\n return false;\n }\n\n /** True if the event originated from the popover specifically. */\n popoverOwnsEvent(event: Event): boolean {\n return this.popover.ownsEvent(event);\n }\n\n /** Render the given feedback list as pins. */\n renderPins(\n feedbacks: Feedback[],\n onClick: PinClickHandler | null,\n onDragEnd: PinDragHandler | null = null\n ) {\n this.onPinClick = onClick;\n this.onPinDragEnd = onDragEnd;\n this.pendingFeedback = feedbacks;\n this.scheduleRepositionPins();\n }\n\n /** Re-position pins after layout changes. Called on resize/scroll. */\n reposition() {\n this.scheduleRepositionPins();\n this.popover.reposition();\n }\n\n popoverManager(): PopoverManager {\n return this.popover;\n }\n\n /** Wire the floating launcher to controller callbacks. Idempotent. */\n installLauncher(callbacks: LauncherCallbacks): LauncherManager {\n if (this.launcher) return this.launcher;\n this.launcher = new LauncherManager(this.root, callbacks);\n return this.launcher;\n }\n\n /** Show or hide the pin layer entirely (e.g. via the eye toggle). */\n setPinsVisible(visible: boolean): void {\n this.pinLayer.classList.toggle(\"hidden\", !visible);\n }\n\n private scheduleRepositionPins() {\n if (this.rafHandle !== null) return;\n this.rafHandle = requestAnimationFrame(() => {\n this.rafHandle = null;\n this.layoutPins();\n });\n }\n\n private layoutPins() {\n // Diff-based rendering: keep existing pin DOM nodes whenever possible\n // so that interactive state (focus, pointer capture, drag listeners)\n // doesn't get blown away mid-interaction. Rebuilding via\n // `replaceChildren` on every state change caused the \"blink + reopen\"\n // flicker users saw when replying / changing status.\n const existing = new Map<string, HTMLButtonElement>();\n for (const node of Array.from(this.pinLayer.children) as HTMLButtonElement[]) {\n const id = node.dataset.feedbackId;\n if (id) existing.set(id, node);\n }\n\n const desiredOrder: HTMLButtonElement[] = [];\n const seen = new Set<string>();\n\n for (const fb of this.pendingFeedback) {\n seen.add(fb.id);\n const target = findElement(fb.selector);\n const projected = projectCoordinates(target, fb.coordinates);\n const left = `${projected.x - window.scrollX}px`;\n const top = `${projected.y - window.scrollY}px`;\n\n let pin = existing.get(fb.id);\n if (pin) {\n // Update an existing node in place.\n const classes = [\"pin\"];\n if (projected.orphaned) classes.push(\"orphaned\");\n if (fb.status === \"resolved\") classes.push(\"resolved\");\n if (fb.status === \"archived\") classes.push(\"archived\");\n // Preserve the \"dragging\" class if a drag is in flight for this pin.\n if (pin.classList.contains(\"dragging\")) classes.push(\"dragging\");\n pin.className = classes.join(\" \");\n if (pin.style.left !== left) pin.style.left = left;\n if (pin.style.top !== top) pin.style.top = top;\n const label = pin.firstElementChild as HTMLSpanElement | null;\n const nextLabel = String(fb.thread.length || 1);\n if (label && label.textContent !== nextLabel) label.textContent = nextLabel;\n } else {\n // Brand-new pin: build it from scratch.\n pin = document.createElement(\"button\");\n pin.type = \"button\";\n const classes = [\"pin\"];\n if (projected.orphaned) classes.push(\"orphaned\");\n if (fb.status === \"resolved\") classes.push(\"resolved\");\n if (fb.status === \"archived\") classes.push(\"archived\");\n pin.className = classes.join(\" \");\n pin.dataset.feedbackId = fb.id;\n pin.setAttribute(\"aria-label\", `Feedback ${fb.id}`);\n pin.style.left = left;\n pin.style.top = top;\n const label = document.createElement(\"span\");\n label.textContent = String(fb.thread.length || 1);\n pin.appendChild(label);\n pin.addEventListener(\"click\", (e) => {\n e.stopPropagation();\n // Resolve the click against the *current* pendingFeedback list so\n // updates to status/thread length are reflected on click instead\n // of the stale closure value captured at first render.\n if (this.draggingPin === fb.id) return;\n const fresh = this.pendingFeedback.find((f) => f.id === fb.id) ?? fb;\n this.onPinClick?.(fresh);\n });\n this.attachDragHandlers(pin, fb);\n }\n desiredOrder.push(pin);\n }\n\n // Remove pins that no longer exist in the feedback list.\n for (const [id, node] of existing) {\n if (!seen.has(id)) node.remove();\n }\n\n // Make sure DOM order matches desired order. We compare child-by-child\n // and only insert when needed; this keeps the DOM stable for nodes that\n // didn't move.\n for (let i = 0; i < desiredOrder.length; i++) {\n const want = desiredOrder[i]!;\n const have = this.pinLayer.children[i] as HTMLElement | undefined;\n if (have !== want) this.pinLayer.insertBefore(want, have ?? null);\n }\n }\n\n destroy() {\n if (this.rafHandle !== null) {\n cancelAnimationFrame(this.rafHandle);\n this.rafHandle = null;\n }\n this.popover.hide();\n this.launcher?.destroy();\n this.launcher = null;\n this.host.remove();\n }\n\n private attachDragHandlers(pin: HTMLButtonElement, fb: Feedback): void {\n let startClientX = 0;\n let startClientY = 0;\n let pointerDownAt = 0;\n let isDragging = false;\n let pointerId: number | null = null;\n let originLeft = 0;\n let originTop = 0;\n const DRAG_THRESHOLD = 4; // pixels before we treat it as a drag\n\n const onPointerMove = (e: PointerEvent) => {\n if (pointerId === null || e.pointerId !== pointerId) return;\n const dx = e.clientX - startClientX;\n const dy = e.clientY - startClientY;\n if (!isDragging && Math.hypot(dx, dy) < DRAG_THRESHOLD) return;\n if (!isDragging) {\n isDragging = true;\n this.draggingPin = fb.id;\n pin.classList.add(\"dragging\");\n }\n const nextLeft = Math.max(0, Math.min(window.innerWidth, originLeft + dx));\n const nextTop = Math.max(0, Math.min(window.innerHeight, originTop + dy));\n pin.style.left = `${nextLeft}px`;\n pin.style.top = `${nextTop}px`;\n };\n\n const finish = (e: PointerEvent) => {\n if (pointerId === null || e.pointerId !== pointerId) return;\n pin.removeEventListener(\"pointermove\", onPointerMove);\n pin.removeEventListener(\"pointerup\", finish);\n pin.removeEventListener(\"pointercancel\", finish);\n try {\n pin.releasePointerCapture(pointerId);\n } catch {\n /* ignore */\n }\n pointerId = null;\n pin.classList.remove(\"dragging\");\n\n if (!isDragging) return;\n // Re-project from final viewport position back into the pin's selector.\n const target = findElement(fb.selector);\n const rect = pin.getBoundingClientRect();\n // The pin's tail tip sits at center-x, bottom of the bounding box.\n const tipX = rect.left + rect.width / 2;\n const tipY = rect.top + rect.height;\n const next = {\n xPx: Math.round(tipX + window.scrollX),\n yPx: Math.round(tipY + window.scrollY),\n xPercent: 0,\n yPercent: 0,\n };\n if (target) {\n const t = target.getBoundingClientRect();\n next.xPercent = clamp01((tipX - t.left) / (t.width || 1));\n next.yPercent = clamp01((tipY - t.top) / (t.height || 1));\n } else {\n next.xPercent = clamp01(tipX / (window.innerWidth || 1));\n next.yPercent = clamp01(tipY / (window.innerHeight || 1));\n }\n\n this.onPinDragEnd?.(fb.id, next);\n\n // Clear the drag flag on the next click tick so the click handler can\n // see it. RAF gives the browser one frame, plenty of time for the\n // synthetic click to fire and bail out.\n const releasedId = fb.id;\n requestAnimationFrame(() => {\n if (this.draggingPin === releasedId) this.draggingPin = null;\n });\n // Make sure the duration check matches a \"real click\" definition\n // (< 250ms and no movement) so accidental drags don't open the thread.\n pointerDownAt = 0;\n isDragging = false;\n };\n\n pin.addEventListener(\"pointerdown\", (e) => {\n if (e.button !== 0) return;\n pointerId = e.pointerId;\n startClientX = e.clientX;\n startClientY = e.clientY;\n pointerDownAt = Date.now();\n const rect = pin.getBoundingClientRect();\n originLeft = rect.left;\n originTop = rect.top;\n try {\n pin.setPointerCapture(e.pointerId);\n } catch {\n /* ignore */\n }\n pin.addEventListener(\"pointermove\", onPointerMove);\n pin.addEventListener(\"pointerup\", finish);\n pin.addEventListener(\"pointercancel\", finish);\n // Avoid native drag start interfering on Safari-flavored browsers.\n e.preventDefault();\n });\n void pointerDownAt;\n }\n}\n\nfunction clamp01(n: number): number {\n if (Number.isNaN(n)) return 0;\n if (n < 0) return 0;\n if (n > 1) return 1;\n return n;\n}\n\nfunction makeLayer(className: string, tag: \"div\" = \"div\"): HTMLDivElement {\n const el = document.createElement(tag);\n el.className = className;\n if (className === \"pinLayer\" || className === \"popover-layer\") {\n el.classList.add(\"layer\");\n }\n return el as HTMLDivElement;\n}\n","/**\n * Optional screenshot capture for new pins.\n *\n * `html2canvas-pro` is **dynamically imported** so prototypes that never create\n * a pin don't pay for it. Capture is best-effort: any failure logs and\n * resolves to null rather than blocking pin creation.\n *\n * We use `html2canvas-pro` (a maintained fork of `html2canvas`) instead of the\n * original because it understands modern CSS color spaces (`oklch`, `lab`,\n * `color-mix`, etc.) that ship with Tailwind v4 / shadcn / modern design\n * systems. The original errors out on these and the capture silently fails.\n */\n\nconst HOST_ATTR = \"data-mahmulp-feedback-host\";\n\nexport interface CaptureOptions {\n /** Output mime type. Defaults to image/png. */\n mimeType?: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n /** Quality (0..1) used for jpeg/webp. Ignored for png. */\n quality?: number;\n /** Viewport scale. Defaults to 1 to keep file sizes small. */\n scale?: number;\n}\n\nconst DEFAULT_OPTIONS: Required<CaptureOptions> = {\n mimeType: \"image/png\",\n quality: 0.92,\n scale: 1,\n};\n\n/**\n * Capture a screenshot of the current viewport.\n *\n * Hides the SDK's own overlay host before capture and restores it after,\n * so the screenshot reflects the prototype, not the SDK chrome.\n */\nexport async function captureViewport(options: CaptureOptions = {}): Promise<Blob | null> {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return null;\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const html2canvas = await loadHtml2Canvas();\n if (!html2canvas) return null;\n\n const host = document.querySelector(`[${HOST_ATTR}]`) as HTMLElement | null;\n const previousVisibility = host?.style.visibility ?? \"\";\n if (host) host.style.visibility = \"hidden\";\n\n try {\n const canvas: HTMLCanvasElement = await html2canvas(document.documentElement, {\n backgroundColor: null,\n scale: opts.scale,\n width: window.innerWidth,\n height: window.innerHeight,\n x: window.scrollX,\n y: window.scrollY,\n windowWidth: window.innerWidth,\n windowHeight: window.innerHeight,\n logging: false,\n useCORS: true,\n allowTaint: false,\n });\n\n return await canvasToBlob(canvas, opts.mimeType, opts.quality);\n } catch (err) {\n // Surface the failure so debugging \"no screenshot captured\" doesn't\n // require opening the SDK source. Capture is still best-effort: we\n // resolve null so pin creation can proceed.\n if (typeof console !== \"undefined\") {\n console.warn(\"[feedback-sdk] screenshot capture failed:\", err);\n }\n return null;\n } finally {\n if (host) host.style.visibility = previousVisibility;\n }\n}\n\nlet html2canvasPromise: Promise<Html2CanvasFn | null> | null = null;\nlet html2canvasMissingWarned = false;\n\nasync function loadHtml2Canvas(): Promise<Html2CanvasFn | null> {\n if (html2canvasPromise) return html2canvasPromise;\n html2canvasPromise = (async () => {\n try {\n const mod = (await import(\"html2canvas-pro\")) as unknown as {\n default?: Html2CanvasFn;\n } & Html2CanvasFn;\n return (mod.default ?? (mod as unknown as Html2CanvasFn)) ?? null;\n } catch (err) {\n if (!html2canvasMissingWarned && typeof console !== \"undefined\") {\n html2canvasMissingWarned = true;\n // html2canvas-pro is bundled with the SDK — if the dynamic import\n // still fails, something is wrong with the consumer's bundler config.\n console.warn(\n \"[feedback-sdk] screenshot capture disabled: failed to load `html2canvas-pro`. \" +\n \"This shouldn't normally happen — html2canvas-pro is a direct dependency of the SDK. \" +\n \"Pass `captureScreenshots: false` to silence this warning if intended.\",\n err\n );\n }\n return null;\n }\n })();\n return html2canvasPromise;\n}\n\nfunction canvasToBlob(\n canvas: HTMLCanvasElement,\n mimeType: string,\n quality: number\n): Promise<Blob | null> {\n return new Promise((resolve) => {\n if (typeof canvas.toBlob === \"function\") {\n canvas.toBlob(resolve, mimeType, quality);\n } else {\n // Fallback: data URL → Blob.\n try {\n const dataUrl = canvas.toDataURL(mimeType, quality);\n const [meta, b64] = dataUrl.split(\",\");\n const bin = atob(b64 ?? \"\");\n const arr = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) arr[i] = bin.charCodeAt(i);\n const detectedMime = meta?.match(/data:([^;]+);/)?.[1] ?? mimeType;\n resolve(new Blob([arr], { type: detectedMime }));\n } catch {\n resolve(null);\n }\n }\n });\n}\n\n// Loose type — html2canvas's published .d.ts is broad; we don't need most of it.\ntype Html2CanvasFn = (\n element: HTMLElement,\n options?: Record<string, unknown>\n) => Promise<HTMLCanvasElement>;\n\n/** @internal — exposed for tests. */\nexport function _resetForTests() {\n html2canvasPromise = null;\n html2canvasMissingWarned = false;\n}\n","import type {\n CreateFeedbackInput,\n Feedback,\n FeedbackAuthor,\n FeedbackCoordinates,\n FeedbackStatus,\n FeedbackTransport,\n ListFeedbackResult,\n} from \"./types.js\";\n\nexport type { FeedbackTransport };\n\n/**\n * Default HTTP transport: talks to the API at `apiUrl` using a per-project\n * API key (`apiKey`, sent as `x-feedback-key`).\n *\n * GET /v1/feedback?pageUrl=…&status=…\n * POST /v1/feedback\n * POST /v1/feedback/:id/comments\n * PATCH /v1/feedback/:id { status } (admin-only; SDK rarely calls this)\n * PATCH /v1/feedback/:id/coordinates { coordinates } (drag-to-move)\n * POST /v1/feedback/:id/screenshot (multipart, field \"file\")\n *\n * The SDK never sends `projectId` — the server resolves the project from\n * the API key.\n */\nexport interface HttpTransportOptions {\n apiUrl: string;\n /** Per-project ingest key sent as `x-feedback-key`. Required. */\n apiKey: string;\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n}\n\nexport function createHttpTransport(options: HttpTransportOptions): FeedbackTransport {\n if (!options.apiKey) {\n throw new Error(\"createHttpTransport: `apiKey` is required\");\n }\n const fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);\n const base = options.apiUrl.replace(/\\/$/, \"\");\n\n function jsonHeaders(): HeadersInit {\n return {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n \"x-feedback-key\": options.apiKey,\n ...(options.headers ?? {}),\n };\n }\n\n function authHeaders(): Record<string, string> {\n return { \"x-feedback-key\": options.apiKey, ...(options.headers ?? {}) };\n }\n\n async function asJson<T>(res: Response): Promise<T> {\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new Error(`feedback-sdk: ${res.status} ${res.statusText} ${text}`);\n }\n return (await res.json()) as T;\n }\n\n return {\n async list(query): Promise<ListFeedbackResult> {\n const params = new URLSearchParams();\n if (query.pageUrl) params.set(\"pageUrl\", query.pageUrl);\n if (query.status) params.set(\"status\", query.status);\n const qs = params.toString();\n const res = await fetchImpl(`${base}/v1/feedback${qs ? `?${qs}` : \"\"}`, {\n method: \"GET\",\n headers: jsonHeaders(),\n });\n return asJson<ListFeedbackResult>(res);\n },\n\n async create(input): Promise<Feedback> {\n // The server fills in `projectId` from the API key; we never send it.\n const { projectId: _ignored, ...payload } = input as CreateFeedbackInput & {\n projectId?: string;\n };\n void _ignored;\n const res = await fetchImpl(`${base}/v1/feedback`, {\n method: \"POST\",\n headers: jsonHeaders(),\n body: JSON.stringify(payload),\n });\n return asJson<Feedback>(res);\n },\n\n async reply(feedbackId, comment: { author: FeedbackAuthor; body: string }): Promise<Feedback> {\n const res = await fetchImpl(`${base}/v1/feedback/${encodeURIComponent(feedbackId)}/comments`, {\n method: \"POST\",\n headers: jsonHeaders(),\n body: JSON.stringify(comment),\n });\n return asJson<Feedback>(res);\n },\n\n async setStatus(feedbackId, status: FeedbackStatus): Promise<Feedback> {\n const res = await fetchImpl(`${base}/v1/feedback/${encodeURIComponent(feedbackId)}`, {\n method: \"PATCH\",\n headers: jsonHeaders(),\n body: JSON.stringify({ status }),\n });\n return asJson<Feedback>(res);\n },\n\n async move(feedbackId, coordinates: FeedbackCoordinates): Promise<Feedback> {\n const res = await fetchImpl(\n `${base}/v1/feedback/${encodeURIComponent(feedbackId)}/coordinates`,\n {\n method: \"PATCH\",\n headers: jsonHeaders(),\n body: JSON.stringify({ coordinates }),\n }\n );\n return asJson<Feedback>(res);\n },\n\n async uploadScreenshot(feedbackId, blob: Blob): Promise<Feedback> {\n const form = new FormData();\n form.append(\"file\", blob, `${feedbackId}.png`);\n const res = await fetchImpl(\n `${base}/v1/feedback/${encodeURIComponent(feedbackId)}/screenshot`,\n {\n method: \"POST\",\n headers: authHeaders(),\n body: form,\n }\n );\n return asJson<Feedback>(res);\n },\n };\n}\n","import type {\n CreateFeedbackInput,\n Feedback,\n FeedbackAuthor,\n FeedbackStatus,\n FeedbackTransport,\n} from \"./types.js\";\nimport { computeCoordinates, getViewportInfo } from \"./coordinates.js\";\nimport { loadAuthor, saveAuthor } from \"./identity.js\";\nimport { Overlay } from \"./overlay.js\";\nimport { captureViewport } from \"./screenshot.js\";\nimport { findElement, resolveSelector } from \"./selector.js\";\nimport { createHttpTransport } from \"./transport.js\";\n\nexport interface InitFeedbackOptions {\n /** Base URL of the API (used when no `transport` is provided). */\n apiUrl?: string;\n /** Per-project ingest key (sent as `x-feedback-key` to the API). Required when using the HTTP transport. */\n apiKey?: string;\n /** Custom transport override. Useful for tests, mocks, or non-HTTP backends. */\n transport?: FeedbackTransport;\n /**\n * Identifier used for client-side caching (author identity per project).\n * Defaults to `apiKey`'s prefix when omitted; safe to leave unset.\n */\n cacheNamespace?: string;\n /** Start with feedback mode enabled. Defaults to `false` (caller toggles via UI). */\n enabled?: boolean;\n /** Override how the page URL is captured. Defaults to `window.location.pathname + search`. */\n getPageUrl?: () => string;\n /**\n * Modifier key used to \"select parent\" while picking a target.\n * Defaults to \"Alt\".\n */\n selectParentModifier?: \"Alt\" | \"Shift\" | \"Meta\" | \"Control\";\n /** Override how the author identity is read. Defaults to a localStorage cache. */\n getAuthor?: () => FeedbackAuthor | null;\n /** Override how the author identity is persisted after a successful submit. */\n setAuthor?: (author: FeedbackAuthor) => void;\n /** Capture a screenshot when a new pin is created. Defaults to `true`. */\n captureScreenshots?: boolean;\n /** Override the screenshot capture function. Returns null to skip silently. */\n captureScreenshot?: () => Promise<Blob | null>;\n /** Render the floating launcher widget. Defaults to `true`. */\n showLauncher?: boolean;\n /** Initial pin visibility. Defaults to `true`. */\n pinsVisible?: boolean;\n /** Called when a pin is clicked in display mode. Use to render a thread popover. */\n onPinClick?: (feedback: Feedback) => void;\n /** Called after a new pin is created. */\n onPinCreate?: (feedback: Feedback) => void;\n /** Called when an error happens during a SDK action. */\n onError?: (err: unknown) => void;\n}\n\nexport interface FeedbackController {\n /** Toggle / set feedback creation mode. */\n setEnabled(enabled: boolean): void;\n /** Read the current enabled state. */\n isEnabled(): boolean;\n /** Show or hide all pins (the floating launcher's eye toggle calls this). */\n setPinsVisible(visible: boolean): void;\n /** Show or hide the floating launcher widget. */\n setLauncherVisible(visible: boolean): void;\n /** Trigger a fresh fetch of feedback for the current project. */\n refresh(): Promise<void>;\n /** Tear down: remove DOM, listeners, and observers. Idempotent. */\n destroy(): void;\n}\n\ninterface InternalState {\n enabled: boolean;\n hoverTarget: Element | null;\n /** When the user \"selects up\" with the modifier, this is the locked candidate. */\n candidate: Element | null;\n feedbacks: Feedback[];\n destroyed: boolean;\n}\n\ninterface PendingPin {\n selector: string;\n coordinates: ReturnType<typeof computeCoordinates>;\n pageX: number;\n pageY: number;\n}\n\nexport function initFeedback(options: InitFeedbackOptions): FeedbackController {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return ssrNoopController();\n }\n\n const transport: FeedbackTransport =\n options.transport ??\n (() => {\n if (!options.apiUrl) {\n throw new Error(\"initFeedback: provide either `transport` or `apiUrl`\");\n }\n if (!options.apiKey) {\n throw new Error(\"initFeedback: `apiKey` is required when using the default HTTP transport\");\n }\n return createHttpTransport({ apiUrl: options.apiUrl, apiKey: options.apiKey });\n })();\n\n const namespace =\n options.cacheNamespace ?? (options.apiKey ? options.apiKey.slice(0, 12) : \"default\");\n\n const overlay = new Overlay();\n\n const state: InternalState = {\n enabled: !!options.enabled,\n hoverTarget: null,\n candidate: null,\n feedbacks: [],\n destroyed: false,\n };\n\n let pendingPin: PendingPin | null = null;\n let activeThreadId: string | null = null;\n\n const getPageUrl =\n options.getPageUrl ?? (() => window.location.pathname + window.location.search);\n const modKey = options.selectParentModifier ?? \"Alt\";\n const getAuthor = options.getAuthor ?? (() => loadAuthor(namespace));\n const setAuthor =\n options.setAuthor ??\n ((author: FeedbackAuthor) => {\n saveAuthor(namespace, author);\n });\n const wantsScreenshots = options.captureScreenshots !== false;\n const captureFn = options.captureScreenshot ?? (() => captureViewport());\n\n function isModifierActive(e: MouseEvent | KeyboardEvent): boolean {\n switch (modKey) {\n case \"Alt\":\n return e.altKey;\n case \"Shift\":\n return e.shiftKey;\n case \"Meta\":\n return e.metaKey;\n case \"Control\":\n return e.ctrlKey;\n }\n }\n\n function reportError(err: unknown) {\n if (options.onError) {\n try {\n options.onError(err);\n } catch {\n /* swallow */\n }\n } else if (typeof console !== \"undefined\") {\n console.error(\"[feedback-sdk]\", err);\n }\n }\n\n // ---------- Event handlers ----------\n\n function onMouseMove(e: MouseEvent) {\n if (!state.enabled) return;\n if (overlay.ownsEvent(e)) return;\n if (pendingPin || activeThreadId) return; // freeze hover while a popover is open\n\n const target = elementAtFiltered(e.clientX, e.clientY, overlay);\n if (!target) {\n state.hoverTarget = null;\n overlay.hideHighlight();\n overlay.hideHud();\n return;\n }\n state.hoverTarget = target;\n state.candidate = target;\n overlay.showHighlight(target);\n overlay.showHud(target);\n }\n\n function onClick(e: MouseEvent) {\n // Always allow clicks inside the popover to behave normally.\n if (overlay.popoverOwnsEvent(e)) return;\n if (!state.enabled) return;\n if (overlay.ownsEvent(e)) return; // SDK's own UI (pins handle their own click)\n\n if (isModifierActive(e)) {\n const next = state.candidate?.parentElement ?? null;\n if (next && next !== document.body && next !== document.documentElement) {\n state.candidate = next;\n overlay.showHighlight(next);\n overlay.showHud(next);\n }\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n\n const target = state.candidate ?? state.hoverTarget;\n if (!target) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n openComposerAt(target, e.clientX, e.clientY);\n }\n\n function onKeyDown(e: KeyboardEvent) {\n // Global shortcut: Ctrl/⌘+Shift+F toggles feedback mode + reveals launcher.\n if ((e.metaKey || e.ctrlKey) && e.shiftKey && (e.key === \"F\" || e.key === \"f\")) {\n e.preventDefault();\n e.stopPropagation();\n if (!launcherState.launcherVisible) {\n launcherState.launcherVisible = true;\n syncLauncher();\n }\n publicSetEnabled(!state.enabled);\n return;\n }\n if (e.key === \"Escape\") {\n if (pendingPin || activeThreadId) {\n cancelComposer();\n closeThread();\n return;\n }\n if (state.enabled) {\n state.candidate = null;\n state.hoverTarget = null;\n overlay.hideHighlight();\n overlay.hideHud();\n }\n }\n }\n\n function onWindowReposition() {\n overlay.reposition();\n }\n\n // ---------- Composer & thread ----------\n\n function openComposerAt(target: Element, clientX: number, clientY: number) {\n const selector = resolveSelector(target);\n const coordinates = computeCoordinates(target, clientX, clientY);\n pendingPin = {\n selector,\n coordinates,\n pageX: clientX + window.scrollX,\n pageY: clientY + window.scrollY,\n };\n\n overlay.hideHighlight();\n overlay.hideHud();\n\n // Kick off screenshot capture in the background while the user types.\n // We hide the overlay's host inside captureViewport, so it never appears\n // in the resulting image even though the popover renders during typing.\n let screenshotPromise: Promise<Blob | null> | null = null;\n if (wantsScreenshots) {\n screenshotPromise = captureFn().catch(() => null);\n }\n\n overlay.popoverManager().showComposer(\n { pageX: pendingPin.pageX, pageY: pendingPin.pageY },\n {\n initialAuthor: getAuthor(),\n onSubmit: async (body, author) => {\n const pin = pendingPin;\n if (!pin) return;\n try {\n const fb = await createPin(pin, { author, body });\n setAuthor(author);\n options.onPinCreate?.(fb);\n pendingPin = null;\n overlay.popoverManager().hide();\n\n if (screenshotPromise && transport.uploadScreenshot) {\n void screenshotPromise\n .then(async (blob) => {\n if (!blob) return;\n const updated = await transport.uploadScreenshot!(fb.id, blob);\n replaceFeedback(updated);\n })\n .catch((err) => reportError(err));\n }\n } catch (err) {\n reportError(err);\n }\n },\n onCancel: () => cancelComposer(),\n }\n );\n }\n\n function cancelComposer() {\n if (!pendingPin) return;\n pendingPin = null;\n overlay.popoverManager().hide();\n }\n\n function openThread(fb: Feedback) {\n activeThreadId = fb.id;\n const anchor = computeThreadAnchor(fb);\n overlay.popoverManager().showThread(fb, anchor, {\n initialAuthor: getAuthor(),\n onReply: async (body, author) => {\n try {\n const updated = await transport.reply(fb.id, { author, body });\n setAuthor(author);\n replaceFeedback(updated);\n // Re-render the thread with the new comment. The popover manager\n // detects we're already showing this feedback and swaps content\n // in place instead of close + reopen, so there's no flicker.\n openThread(updated);\n } catch (err) {\n reportError(err);\n }\n },\n onStatus: async (status: FeedbackStatus) => {\n try {\n const updated = await transport.setStatus(fb.id, status);\n replaceFeedback(updated);\n openThread(updated);\n } catch (err) {\n reportError(err);\n }\n },\n onClose: () => closeThread(),\n });\n }\n\n function closeThread() {\n if (!activeThreadId) return;\n activeThreadId = null;\n overlay.popoverManager().hide();\n }\n\n function computeThreadAnchor(fb: Feedback): { pageX: number; pageY: number } {\n const target = findElement(fb.selector);\n if (target) {\n const rect = target.getBoundingClientRect();\n return {\n pageX: rect.left + window.scrollX + rect.width * fb.coordinates.xPercent,\n pageY: rect.top + window.scrollY + rect.height * fb.coordinates.yPercent,\n };\n }\n return { pageX: fb.coordinates.xPx, pageY: fb.coordinates.yPx };\n }\n\n // ---------- Pin lifecycle ----------\n\n async function createPin(\n pin: PendingPin,\n comment: { author: FeedbackAuthor; body: string }\n ): Promise<Feedback> {\n const viewport = getViewportInfo();\n const pageUrl = getPageUrl();\n\n const input: CreateFeedbackInput = {\n projectId: \"\", // server resolves from API key — kept here only to satisfy the type\n pageUrl,\n selector: pin.selector,\n coordinates: pin.coordinates,\n viewport,\n comment,\n };\n\n const fb = await transport.create(input);\n state.feedbacks = [...state.feedbacks, fb];\n overlay.renderPins(state.feedbacks, openThread, onPinDragEnd);\n return fb;\n }\n\n function replaceFeedback(updated: Feedback) {\n state.feedbacks = state.feedbacks.map((f) => (f.id === updated.id ? updated : f));\n overlay.renderPins(state.feedbacks, openThread, onPinDragEnd);\n }\n\n async function refresh(): Promise<void> {\n try {\n // Scope the list to the current page so SPA prototypes only render\n // pins relevant to the route the user is on. Without this, pins from\n // /dashboard would render on /dashboard/inventory and friends.\n const pageUrl = getPageUrl();\n const result = await transport.list({ projectId: \"\", pageUrl });\n state.feedbacks = result.items;\n overlay.renderPins(state.feedbacks, openThread, onPinDragEnd);\n } catch (err) {\n reportError(err);\n }\n }\n\n async function onPinDragEnd(\n id: string,\n next: { xPercent: number; yPercent: number; xPx: number; yPx: number }\n ): Promise<void> {\n // Optimistic update so the pin doesn't snap back during the request.\n const previous = state.feedbacks.find((f) => f.id === id);\n if (!previous) return;\n const optimistic: Feedback = {\n ...previous,\n coordinates: { ...previous.coordinates, ...next },\n updatedAt: new Date().toISOString(),\n };\n replaceFeedback(optimistic);\n\n if (!transport.move) return;\n try {\n const persisted = await transport.move(id, optimistic.coordinates);\n replaceFeedback(persisted);\n } catch (err) {\n // Roll back on failure so the UI doesn't drift from the server.\n replaceFeedback(previous);\n reportError(err);\n }\n }\n\n // ---------- Wire up listeners ----------\n\n document.addEventListener(\"mousemove\", onMouseMove, true);\n document.addEventListener(\"click\", onClick, true);\n document.addEventListener(\"keydown\", onKeyDown, true);\n window.addEventListener(\"scroll\", onWindowReposition, true);\n window.addEventListener(\"resize\", onWindowReposition);\n\n // Refresh on SPA navigation. SvelteKit / Next.js / React Router all use\n // history.pushState + replaceState under the hood and emit a `popstate`\n // event for back/forward, but no native event for programmatic navigation.\n // We monkey-patch both methods to dispatch a synthetic event so we can\n // listen uniformly. This is scoped to the SDK's lifetime and reverted in\n // destroy().\n let lastSeenUrl = getPageUrl();\n function onMaybeNavigate(): void {\n const next = getPageUrl();\n if (next === lastSeenUrl) return;\n lastSeenUrl = next;\n void refresh();\n }\n const originalPushState = history.pushState.bind(history);\n const originalReplaceState = history.replaceState.bind(history);\n history.pushState = function patchedPushState(...args) {\n const result = originalPushState(...args);\n queueMicrotask(onMaybeNavigate);\n return result;\n };\n history.replaceState = function patchedReplaceState(...args) {\n const result = originalReplaceState(...args);\n queueMicrotask(onMaybeNavigate);\n return result;\n };\n window.addEventListener(\"popstate\", onMaybeNavigate);\n\n void refresh();\n overlay.setEnabledStyles(state.enabled);\n\n // ---------- Floating launcher ----------\n const wantsLauncher = options.showLauncher !== false;\n const launcherState = {\n pinsVisible: options.pinsVisible !== false,\n launcherVisible: true,\n };\n overlay.setPinsVisible(launcherState.pinsVisible);\n\n function syncLauncher(): void {\n launcher?.setEnabled(state.enabled);\n launcher?.setPinsVisible(launcherState.pinsVisible);\n launcher?.setLauncherVisible(launcherState.launcherVisible);\n }\n\n const launcher = wantsLauncher\n ? overlay.installLauncher({\n onToggleFeedback: () => {\n publicSetEnabled(!state.enabled);\n },\n onTogglePins: () => {\n publicSetPinsVisible(!launcherState.pinsVisible);\n },\n onHideLauncher: () => {\n publicSetLauncherVisible(!launcherState.launcherVisible);\n },\n })\n : null;\n syncLauncher();\n\n function publicSetEnabled(enabled: boolean) {\n if (state.destroyed) return;\n state.enabled = enabled;\n overlay.setEnabledStyles(enabled);\n if (!enabled) cancelComposer();\n syncLauncher();\n }\n function publicSetPinsVisible(visible: boolean) {\n if (state.destroyed) return;\n launcherState.pinsVisible = visible;\n overlay.setPinsVisible(visible);\n syncLauncher();\n }\n function publicSetLauncherVisible(visible: boolean) {\n if (state.destroyed) return;\n launcherState.launcherVisible = visible;\n syncLauncher();\n }\n\n return {\n setEnabled: publicSetEnabled,\n isEnabled() {\n return state.enabled;\n },\n setPinsVisible: publicSetPinsVisible,\n setLauncherVisible: publicSetLauncherVisible,\n async refresh() {\n if (state.destroyed) return;\n await refresh();\n },\n destroy() {\n if (state.destroyed) return;\n state.destroyed = true;\n document.removeEventListener(\"mousemove\", onMouseMove, true);\n document.removeEventListener(\"click\", onClick, true);\n document.removeEventListener(\"keydown\", onKeyDown, true);\n window.removeEventListener(\"scroll\", onWindowReposition, true);\n window.removeEventListener(\"resize\", onWindowReposition);\n window.removeEventListener(\"popstate\", onMaybeNavigate);\n // Restore the original history methods so the prototype isn't left\n // with our monkey-patched versions if the SDK is torn down.\n history.pushState = originalPushState;\n history.replaceState = originalReplaceState;\n overlay.destroy();\n },\n };\n}\n\nfunction elementAtFiltered(x: number, y: number, overlay: Overlay): Element | null {\n const stack = document.elementsFromPoint(x, y);\n for (const node of stack) {\n if (overlay.ownsEvent({ composedPath: () => [node] } as unknown as Event)) continue;\n if (node === document.documentElement || node === document.body) continue;\n return node;\n }\n return null;\n}\n\nfunction ssrNoopController(): FeedbackController {\n return {\n setEnabled() {},\n isEnabled() {\n return false;\n },\n setPinsVisible() {},\n setLauncherVisible() {},\n async refresh() {},\n destroy() {},\n };\n}\n","/**\n * Svelte adapter — thin lifecycle wrapper around the framework-agnostic core.\n *\n * import { feedback, feedbackEnabled } from '@mahmulp/feedback-sdk/svelte'\n *\n * Usage:\n *\n * <script lang=\"ts\">\n * import { feedback, feedbackEnabled } from '@mahmulp/feedback-sdk/svelte'\n * const enabled = feedbackEnabled()\n * </script>\n *\n * <div use:feedback={{ apiUrl: '/api', apiKey: 'mp_…' }}>\n * <slot />\n * </div>\n *\n * <button on:click={() => enabled.toggle()}>\n * {$enabled ? 'Stop' : 'Start'} feedback\n * </button>\n */\n\nimport { initFeedback } from \"./controller.js\";\nimport type { FeedbackController, InitFeedbackOptions } from \"./controller.js\";\n\nexport type FeedbackActionParams = InitFeedbackOptions;\n\nexport interface FeedbackAction {\n destroy(): void;\n update(params: FeedbackActionParams): void;\n}\n\n/**\n * Svelte action: `use:feedback={{ apiUrl, apiKey }}`.\n *\n * The action is a no-op during SSR (`initFeedback` already returns an SSR-safe\n * controller, but we still skip it to avoid even constructing the host).\n */\nexport function feedback(node: HTMLElement, params: FeedbackActionParams): FeedbackAction {\n let controller: FeedbackController | null = null;\n let lastParams = params;\n\n if (typeof window !== \"undefined\") {\n controller = initFeedback(params);\n enabledStore.attach(controller);\n }\n\n return {\n update(next: FeedbackActionParams) {\n // If the apiKey / apiUrl meaningfully change, restart.\n const restart =\n next.apiKey !== lastParams.apiKey ||\n next.apiUrl !== lastParams.apiUrl ||\n next.transport !== lastParams.transport;\n lastParams = next;\n if (restart && controller) {\n controller.destroy();\n enabledStore.detach();\n if (typeof window !== \"undefined\") {\n controller = initFeedback(next);\n enabledStore.attach(controller);\n }\n }\n },\n destroy() {\n controller?.destroy();\n controller = null;\n enabledStore.detach();\n // Reference node so eslint and friends don't complain about unused params.\n void node;\n },\n };\n}\n\n// ---------- enabled store ----------\n\ninterface EnabledStoreApi {\n subscribe(run: (value: boolean) => void): () => void;\n set(value: boolean): void;\n toggle(): void;\n}\n\ninterface InternalStore extends EnabledStoreApi {\n attach(c: FeedbackController): void;\n detach(): void;\n}\n\nfunction createInternalStore(): InternalStore {\n const subs = new Set<(value: boolean) => void>();\n let value = false;\n let attached: FeedbackController | null = null;\n\n function emit() {\n for (const s of subs) s(value);\n }\n\n return {\n subscribe(run) {\n subs.add(run);\n run(value);\n return () => subs.delete(run);\n },\n set(next: boolean) {\n value = next;\n attached?.setEnabled(next);\n emit();\n },\n toggle() {\n this.set(!value);\n },\n attach(c) {\n attached = c;\n // Sync from the controller's initial state.\n value = c.isEnabled();\n emit();\n },\n detach() {\n attached = null;\n value = false;\n emit();\n },\n };\n}\n\nconst enabledStore = createInternalStore();\n\n/**\n * Returns a writable-ish store of the \"feedback mode\" flag.\n *\n * const enabled = feedbackEnabled()\n * $: console.log($enabled)\n * enabled.toggle()\n */\nexport function feedbackEnabled(): EnabledStoreApi {\n return {\n subscribe: enabledStore.subscribe.bind(enabledStore),\n set: enabledStore.set.bind(enabledStore),\n toggle: enabledStore.toggle.bind(enabledStore),\n };\n}\n\n// Re-exports useful for typing in SvelteKit.\nexport type { FeedbackController, InitFeedbackOptions } from \"./controller.js\";\nexport type {\n CreateFeedbackInput,\n Feedback,\n FeedbackStatus,\n FeedbackTransport,\n} from \"./types.js\";\n"]}
|