@ourroadmaps/web-sdk 0.3.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-46WI5367.cjs +900 -0
- package/dist/chunk-46WI5367.cjs.map +1 -0
- package/dist/{chunk-ZPPQHIRO.cjs → chunk-EKWWSLHU.cjs} +11 -2
- package/dist/chunk-EKWWSLHU.cjs.map +1 -0
- package/dist/chunk-HOJDCIWN.js +897 -0
- package/dist/chunk-HOJDCIWN.js.map +1 -0
- package/dist/{chunk-XFAAEDJK.js → chunk-JPUN7P3T.js} +11 -2
- package/dist/chunk-JPUN7P3T.js.map +1 -0
- package/dist/index.cjs +16 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +12 -3
- package/dist/index.js.map +1 -1
- package/dist/overlay/index.cjs +3 -3
- package/dist/overlay/index.js +1 -1
- package/dist/overlay.global.js +2 -2
- package/dist/overlay.global.js.map +1 -1
- package/dist/review/index.cjs +13 -0
- package/dist/review/index.cjs.map +1 -0
- package/dist/review/index.d.cts +42 -0
- package/dist/review/index.d.ts +42 -0
- package/dist/review/index.js +4 -0
- package/dist/review/index.js.map +1 -0
- package/dist/review.global.js +338 -0
- package/dist/review.global.js.map +1 -0
- package/package.json +11 -10
- package/dist/chunk-XFAAEDJK.js.map +0 -1
- package/dist/chunk-ZPPQHIRO.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/review/api.ts","../src/review/ElementCapture.ts","../src/review/styles.ts","../src/review/PinManager.ts","../src/review/CommentCard.ts","../src/review/ReviewMode.ts","../src/review/TriageMode.ts","../src/review/Review.ts"],"names":["__publicField"],"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,CAAA;AAyQtB,IAAM,mBAAA,GAAsB;AAAA;A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","file":"chunk-46WI5367.cjs","sourcesContent":["import type { PinData, ReviewComment, ReviewInitData } from './types'\n\n// Default to production, override with env var for local dev\nconst API_URL = (() => {\n // Vite dev mode\n if (typeof import.meta !== 'undefined' && import.meta.env?.VITE_API_URL) {\n return import.meta.env.VITE_API_URL\n }\n return 'https://api.ourroadmaps.com'\n})()\n\nexport async function validateToken(token: string): Promise<ReviewInitData> {\n const res = await fetch(`${API_URL}/v1/prototype-review/${token}`)\n if (res.status === 410) throw new ReviewError('expired', 'This feedback session has expired')\n if (res.status === 404) throw new ReviewError('invalid', 'This review link is not valid')\n if (!res.ok) throw new ReviewError('error', 'Something went wrong')\n const body = await res.json()\n return body.data\n}\n\n// TODO: Wire into SDK — show name prompt on first visit, call identify() to transition invite status from 'pending' to 'opened'\nexport async function identify(token: string, name: string): Promise<void> {\n const res = await fetch(`${API_URL}/v1/prototype-review/${token}/identify`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ name }),\n })\n if (!res.ok) throw new ReviewError('error', 'Failed to identify')\n}\n\nexport async function submitComment(\n token: string,\n comment: { commentText: string; pinNumber: number | null; pinData: PinData | null; pageUrl: string | null },\n): Promise<{ id: string; pinNumber: number | null; createdAt: string }> {\n const res = await fetch(`${API_URL}/v1/prototype-review/${token}/comments`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(comment),\n })\n if (!res.ok) throw new ReviewError('error', 'Failed to submit comment')\n const body = await res.json()\n return body.data\n}\n\nexport async function fetchComments(token: string): Promise<ReviewComment[]> {\n const res = await fetch(`${API_URL}/v1/prototype-review/${token}/comments`)\n if (!res.ok) throw new ReviewError('error', 'Failed to load comments')\n const body = await res.json()\n return body.data\n}\n\nexport class ReviewError extends Error {\n constructor(\n public code: 'expired' | 'invalid' | 'error',\n message: string,\n ) {\n super(message)\n this.name = 'ReviewError'\n }\n}\n","import type { PinData } from './types'\n\nexport function captureElementContext(clientX: number, clientY: number): PinData {\n const el = document.elementFromPoint(clientX, clientY) as HTMLElement | null\n const docEl = document.documentElement\n\n const pinX = ((clientX + window.scrollX) / docEl.scrollWidth) * 100\n const pinY = ((clientY + window.scrollY) / docEl.scrollHeight) * 100\n\n if (!el || el === document.body || el === docEl) {\n return {\n pinX,\n pinY,\n element: {\n selector: 'body',\n tag: 'body',\n text: '',\n ariaLabel: null,\n className: '',\n boundingBox: { x: 0, y: 0, w: docEl.scrollWidth, h: docEl.scrollHeight },\n },\n context: {\n parentTag: '',\n parentText: '',\n grandparentTag: '',\n siblings: [],\n nearbyText: '',\n },\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n }\n }\n\n const rect = el.getBoundingClientRect()\n\n return {\n pinX,\n pinY,\n element: {\n selector: buildSelector(el),\n tag: el.tagName.toLowerCase(),\n text: getDirectText(el).slice(0, 200),\n ariaLabel: el.getAttribute('aria-label'),\n className: el.className && typeof el.className === 'string' ? el.className : '',\n boundingBox: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n },\n },\n context: {\n parentTag: el.parentElement ? `${el.parentElement.tagName.toLowerCase()}${classStr(el.parentElement)}` : '',\n parentText: el.parentElement ? getDirectText(el.parentElement).slice(0, 100) : '',\n grandparentTag: el.parentElement?.parentElement\n ? `${el.parentElement.parentElement.tagName.toLowerCase()}${classStr(el.parentElement.parentElement)}`\n : '',\n siblings: getSiblingsSummary(el),\n nearbyText: getNearbyText(el).slice(0, 200),\n },\n viewportWidth: window.innerWidth,\n viewportHeight: window.innerHeight,\n }\n}\n\nfunction buildSelector(el: HTMLElement): string {\n const parts: string[] = []\n let current: HTMLElement | null = el\n\n while (current && current !== document.body) {\n if (current.id) {\n parts.unshift(`#${current.id}`)\n break\n }\n\n let part = current.tagName.toLowerCase()\n if (current.className && typeof current.className === 'string') {\n const classes = current.className.trim().split(/\\s+/).slice(0, 2).join('.')\n if (classes) part += `.${classes}`\n }\n\n parts.unshift(part)\n current = current.parentElement\n }\n\n return parts.join(' > ')\n}\n\nfunction getDirectText(el: HTMLElement): string {\n let text = ''\n for (const node of el.childNodes) {\n if (node.nodeType === Node.TEXT_NODE) {\n text += node.textContent?.trim() || ''\n }\n }\n return text.trim() || el.textContent?.trim().slice(0, 200) || ''\n}\n\nfunction classStr(el: HTMLElement): string {\n if (!el.className || typeof el.className !== 'string') return ''\n const cls = el.className.trim().split(/\\s+/).slice(0, 2).join('.')\n return cls ? `.${cls}` : ''\n}\n\nfunction getSiblingsSummary(el: HTMLElement): string[] {\n if (!el.parentElement) return []\n const siblings: string[] = []\n for (const child of el.parentElement.children) {\n if (child === el) continue\n const tag = child.tagName.toLowerCase()\n const text = (child.textContent?.trim() || '').slice(0, 50)\n siblings.push(text ? `${tag}:${text}` : tag)\n if (siblings.length >= 4) break\n }\n return siblings\n}\n\nfunction getNearbyText(el: HTMLElement): string {\n // Walk up to find the nearest container with meaningful text\n let current: HTMLElement | null = el.parentElement\n let depth = 0\n while (current && depth < 3) {\n const text = getDirectText(current)\n if (text && text !== getDirectText(el)) return text\n current = current.parentElement\n depth++\n }\n return ''\n}\n","export const REVIEW_STYLES = `\n:host {\n all: initial;\n}\n\n/* ─── Pin Container (rendered outside shadow DOM) ─── */\n.pin-container {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 10000;\n}\n\n/* ─── Pin Marker ─── */\n.review-pin {\n position: absolute;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: #7c3aed;\n color: #fff;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 12px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n transform: translate(-50%, -50%);\n pointer-events: auto;\n cursor: pointer;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25);\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n user-select: none;\n z-index: 1;\n}\n\n.review-pin:hover {\n transform: translate(-50%, -50%) scale(1.15);\n box-shadow: 0 3px 10px rgba(124, 58, 237, 0.4);\n}\n\n.review-pin--other {\n opacity: 0.5;\n}\n\n.review-pin--highlighted {\n transform: translate(-50%, -50%) scale(1.2);\n box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.3), 0 3px 10px rgba(124, 58, 237, 0.4);\n z-index: 2;\n}\n\n/* ─── Toolbar ─── */\n.review-toolbar {\n position: fixed;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.85);\n color: #fff;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n border-radius: 12px 12px 0 0;\n padding: 10px 20px;\n display: flex;\n flex-direction: row;\n align-items: center;\n gap: 12px;\n z-index: 10001;\n backdrop-filter: blur(8px);\n box-shadow: 0 -2px 16px rgba(0, 0, 0, 0.2);\n}\n\n/* ─── Comment Card ─── */\n.review-comment-card {\n position: fixed;\n background: #fff;\n border-radius: 10px;\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.15), 0 1px 4px rgba(0, 0, 0, 0.08);\n width: 300px;\n padding: 16px;\n z-index: 10002;\n font-family: system-ui, -apple-system, sans-serif;\n border: 1px solid rgba(0, 0, 0, 0.08);\n}\n\n/* ─── Comment Textarea ─── */\n.review-comment-input {\n width: 100%;\n border: 1px solid #d1d5db;\n border-radius: 8px;\n padding: 10px 12px;\n resize: vertical;\n font-family: inherit;\n font-size: 14px;\n line-height: 1.5;\n color: #1f2937;\n background: #fafafa;\n box-sizing: border-box;\n outline: none;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n}\n\n.review-comment-input:focus {\n border-color: #7c3aed;\n box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.15);\n background: #fff;\n}\n\n.review-comment-input::placeholder {\n color: #9ca3af;\n}\n\n.review-comment-input:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n/* ─── Comment Actions ─── */\n.review-comment-actions {\n display: flex;\n flex-direction: row;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 12px;\n}\n\n/* ─── Buttons ─── */\n.review-btn {\n padding: 6px 14px;\n border-radius: 6px;\n cursor: pointer;\n font-family: inherit;\n font-size: 13px;\n font-weight: 500;\n border: none;\n transition: background 0.15s ease, opacity 0.15s ease;\n}\n\n.review-btn--cancel {\n color: #6b7280;\n background: transparent;\n}\n\n.review-btn--cancel:hover {\n background: #f3f4f6;\n}\n\n.review-btn--submit {\n background: #7c3aed;\n color: #fff;\n}\n\n.review-btn--submit:hover {\n background: #6d28d9;\n}\n\n.review-btn--submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n/* ─── Comment Error ─── */\n.review-comment-error {\n color: #dc2626;\n font-size: 12px;\n margin-top: 8px;\n font-family: system-ui, -apple-system, sans-serif;\n}\n\n/* ─── Name Prompt ─── */\n.review-prompt {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: #fff;\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.2), 0 1px 4px rgba(0, 0, 0, 0.08);\n border-radius: 12px;\n padding: 28px 32px;\n z-index: 10002;\n text-align: center;\n font-family: system-ui, -apple-system, sans-serif;\n border: 1px solid rgba(0, 0, 0, 0.06);\n max-width: 360px;\n width: 90%;\n}\n\n/* ─── Expired Overlay ─── */\n.review-expired-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.6);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10003;\n backdrop-filter: blur(2px);\n}\n\n.review-expired-card {\n background: #fff;\n border-radius: 12px;\n padding: 28px 32px;\n text-align: center;\n font-family: system-ui, -apple-system, sans-serif;\n box-shadow: 0 8px 30px rgba(0, 0, 0, 0.2);\n max-width: 400px;\n width: 90%;\n border: 1px solid rgba(0, 0, 0, 0.06);\n}\n\n/* ─── Toast ─── */\n.review-toast {\n position: fixed;\n bottom: 80px;\n left: 50%;\n transform: translateX(-50%);\n background: rgba(0, 0, 0, 0.85);\n color: #fff;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n padding: 10px 20px;\n border-radius: 8px;\n z-index: 10003;\n pointer-events: none;\n animation: review-toast-fade 2.5s ease forwards;\n backdrop-filter: blur(8px);\n}\n\n@keyframes review-toast-fade {\n 0% { opacity: 0; transform: translateX(-50%) translateY(8px); }\n 10% { opacity: 1; transform: translateX(-50%) translateY(0); }\n 80% { opacity: 1; transform: translateX(-50%) translateY(0); }\n 100% { opacity: 0; transform: translateX(-50%) translateY(-4px); }\n}\n\n/* ─── Tooltip ─── */\n.review-tooltip {\n position: absolute;\n background: rgba(0, 0, 0, 0.85);\n color: #fff;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 13px;\n line-height: 1.4;\n border-radius: 6px;\n padding: 8px 12px;\n max-width: 280px;\n z-index: 10002;\n pointer-events: none;\n backdrop-filter: blur(8px);\n}\n\n/* ─── Reduced Motion ─── */\n@media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n transition-duration: 0.01ms !important;\n }\n}\n`\n\n/**\n * Subset of styles for pins that render outside the shadow DOM.\n * Injected into document.head by PinManager.\n */\nexport const PIN_DOCUMENT_STYLES = `\n.pin-container {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 10000;\n}\n\n.review-pin {\n position: absolute;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: #7c3aed;\n color: #fff;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 12px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n transform: translate(-50%, -50%);\n pointer-events: auto;\n cursor: pointer;\n box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25);\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n user-select: none;\n z-index: 1;\n}\n\n.review-pin:hover {\n transform: translate(-50%, -50%) scale(1.15);\n box-shadow: 0 3px 10px rgba(124, 58, 237, 0.4);\n}\n\n.review-pin--other {\n opacity: 0.5;\n}\n\n.review-pin--highlighted {\n transform: translate(-50%, -50%) scale(1.2);\n box-shadow: 0 0 0 3px rgba(124, 58, 237, 0.3), 0 3px 10px rgba(124, 58, 237, 0.4);\n z-index: 2;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .review-pin, .review-pin:hover, .review-pin--highlighted {\n transition-duration: 0.01ms !important;\n }\n}\n`\n","import { PIN_DOCUMENT_STYLES } from './styles'\n\nconst STYLE_ID = 'roadmaps-review-pin-styles'\n\nexport class PinManager {\n private container: HTMLDivElement\n private pins: Map<number, HTMLElement> = new Map()\n private styleEl: HTMLStyleElement | null = null\n\n constructor() {\n this.container = document.createElement('div')\n this.container.className = 'pin-container'\n }\n\n mount(): void {\n // Inject pin styles into document.head (pins live outside shadow DOM)\n if (!document.getElementById(STYLE_ID)) {\n this.styleEl = document.createElement('style')\n this.styleEl.id = STYLE_ID\n this.styleEl.textContent = PIN_DOCUMENT_STYLES\n document.head.appendChild(this.styleEl)\n }\n\n document.body.appendChild(this.container)\n }\n\n addPin(pinNumber: number, x: number, y: number, isMine: boolean): void {\n const pin = document.createElement('div')\n pin.className = isMine ? 'review-pin' : 'review-pin review-pin--other'\n pin.textContent = String(pinNumber)\n pin.style.left = `${x}%`\n pin.style.top = `${y}%`\n pin.dataset.pinNumber = String(pinNumber)\n this.container.appendChild(pin)\n this.pins.set(pinNumber, pin)\n }\n\n removePin(pinNumber: number): void {\n const pin = this.pins.get(pinNumber)\n if (pin) {\n pin.remove()\n this.pins.delete(pinNumber)\n }\n }\n\n highlightPin(pinNumber: number): void {\n for (const [num, el] of this.pins) {\n el.classList.toggle('review-pin--highlighted', num === pinNumber)\n }\n }\n\n clearHighlight(): void {\n for (const el of this.pins.values()) {\n el.classList.remove('review-pin--highlighted')\n }\n }\n\n destroy(): void {\n this.container.remove()\n this.pins.clear()\n\n // Clean up injected style element\n if (this.styleEl) {\n this.styleEl.remove()\n this.styleEl = null\n } else {\n document.getElementById(STYLE_ID)?.remove()\n }\n }\n}\n","export class CommentCard {\n private card: HTMLElement | null = null\n private onSubmit: ((text: string) => Promise<void>) | null = null\n private onCancel: (() => void) | null = null\n\n constructor(private shadowRoot: ShadowRoot) {}\n\n show(options: {\n x: number\n y: number\n onSubmit: (text: string) => Promise<void>\n onCancel: () => void\n }): void {\n this.hide()\n this.onSubmit = options.onSubmit\n this.onCancel = options.onCancel\n\n this.card = document.createElement('div')\n this.card.className = 'review-comment-card'\n // Position near click point, adjust to stay in viewport\n this.card.style.left = `${Math.min(options.x, window.innerWidth - 320)}px`\n this.card.style.top = `${Math.min(options.y + 20, window.innerHeight - 200)}px`\n\n this.card.innerHTML = `\n <textarea class=\"review-comment-input\" placeholder=\"Leave your feedback...\" rows=\"3\"></textarea>\n <div class=\"review-comment-actions\">\n <button class=\"review-btn review-btn--cancel\">Cancel</button>\n <button class=\"review-btn review-btn--submit\">Submit</button>\n </div>\n <div class=\"review-comment-error\" style=\"display:none\"></div>\n `\n\n this.attachListeners()\n this.shadowRoot.appendChild(this.card)\n\n const textarea = this.card.querySelector('textarea')\n textarea?.focus()\n }\n\n hide(): void {\n this.card?.remove()\n this.card = null\n }\n\n showForGeneral(options: {\n onSubmit: (text: string) => Promise<void>\n onCancel: () => void\n }): void {\n // Show centered for general (non-pinned) comments\n this.show({\n x: window.innerWidth / 2 - 150,\n y: window.innerHeight / 2 - 100,\n onSubmit: options.onSubmit,\n onCancel: options.onCancel,\n })\n }\n\n private attachListeners(): void {\n if (!this.card) return\n\n this.card.querySelector('.review-btn--cancel')?.addEventListener('click', () => {\n this.onCancel?.()\n this.hide()\n })\n\n this.card.querySelector('.review-btn--submit')?.addEventListener('click', () => this.handleSubmit())\n\n this.card.querySelector('textarea')?.addEventListener('keydown', (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') {\n e.preventDefault()\n this.handleSubmit()\n }\n })\n }\n\n private async handleSubmit(): Promise<void> {\n if (!this.card) return\n const textarea = this.card.querySelector('textarea') as HTMLTextAreaElement\n const text = textarea.value.trim()\n if (!text) return\n\n const submitBtn = this.card.querySelector('.review-btn--submit') as HTMLButtonElement\n const errorEl = this.card.querySelector('.review-comment-error') as HTMLElement\n submitBtn.disabled = true\n submitBtn.textContent = 'Submitting...'\n textarea.disabled = true\n errorEl.style.display = 'none'\n\n try {\n await this.onSubmit?.(text)\n this.hide()\n } catch (err) {\n submitBtn.disabled = false\n submitBtn.textContent = 'Submit'\n textarea.disabled = false\n errorEl.textContent = err instanceof Error ? err.message : 'Failed to submit'\n errorEl.style.display = 'block'\n }\n }\n}\n","import { submitComment, fetchComments } from './api'\nimport { captureElementContext } from './ElementCapture'\nimport { PinManager } from './PinManager'\nimport { CommentCard } from './CommentCard'\nimport type { ReviewInitData } from './types'\n\nexport class ReviewMode {\n private pinManager: PinManager\n private commentCard: CommentCard\n private nextPinNumber: number\n private pendingPinNumber: number | null = null\n private promptEl: HTMLElement | null = null\n private toolbarEl: HTMLElement | null = null\n private clickHandler: ((e: MouseEvent) => void) | null = null\n\n constructor(\n private token: string,\n private shadowRoot: ShadowRoot,\n private initData: ReviewInitData,\n ) {\n this.pinManager = new PinManager()\n this.commentCard = new CommentCard(shadowRoot)\n this.nextPinNumber = initData.nextPinNumber\n }\n\n async init(): Promise<void> {\n // Set crosshair cursor on body\n document.body.style.cursor = 'crosshair'\n\n // Mount pin manager\n this.pinManager.mount()\n\n // Render first-visit prompt\n this.showPrompt()\n\n // Render bottom toolbar\n this.renderToolbar()\n\n // Fetch and render existing pins\n await this.loadExistingPins()\n\n // Listen for clicks to drop pins\n this.clickHandler = (e: MouseEvent) => this.handleClick(e)\n document.addEventListener('click', this.clickHandler, true)\n }\n\n private showPrompt(): void {\n this.promptEl = document.createElement('div')\n this.promptEl.className = 'review-prompt'\n this.promptEl.innerHTML = `\n <h3 style=\"margin:0 0 8px;font-size:16px;\">Click anywhere to leave feedback</h3>\n <p style=\"margin:0;color:#666;font-size:14px;\">Drop numbered pins on elements you want to comment on</p>\n `\n this.shadowRoot.appendChild(this.promptEl)\n\n // Auto-dismiss after 5 seconds\n setTimeout(() => this.dismissPrompt(), 5000)\n }\n\n private dismissPrompt(): void {\n if (this.promptEl) {\n this.promptEl.remove()\n this.promptEl = null\n }\n }\n\n private renderToolbar(): void {\n this.toolbarEl = document.createElement('div')\n this.toolbarEl.className = 'review-toolbar'\n this.updateToolbar()\n this.shadowRoot.appendChild(this.toolbarEl)\n }\n\n private updateToolbar(): void {\n if (!this.toolbarEl) return\n const pinCount = this.nextPinNumber - 1\n this.toolbarEl.innerHTML = `\n <span style=\"font-weight:500;\">${this.initData.session.name}</span>\n <span style=\"opacity:0.7;\">${pinCount} pin${pinCount !== 1 ? 's' : ''}</span>\n <button class=\"review-btn review-btn--submit\" style=\"margin-left:auto;padding:6px 12px;font-size:13px;\">General Comment</button>\n `\n this.toolbarEl.querySelector('button')?.addEventListener('click', (e) => {\n e.stopPropagation()\n this.handleGeneralComment()\n })\n }\n\n private async loadExistingPins(): Promise<void> {\n try {\n const comments = await fetchComments(this.token)\n for (const c of comments) {\n if (c.pinNumber != null && c.pinData) {\n // commentText being non-null means it's the current reviewer's pin\n const isMine = c.commentText != null\n this.pinManager.addPin(c.pinNumber, c.pinData.pinX, c.pinData.pinY, isMine)\n }\n }\n } catch {\n // Silently fail - pins just won't show up\n }\n }\n\n private handleClick(e: MouseEvent): void {\n // Don't intercept clicks on our own shadow DOM elements\n const path = e.composedPath()\n if (path.some((el) => el instanceof HTMLElement && el.closest?.('#ourroadmaps-review'))) return\n\n // Don't intercept if comment card is open\n if (this.pendingPinNumber != null) return\n\n // Dismiss first-visit prompt on first click\n this.dismissPrompt()\n\n const pinData = captureElementContext(e.clientX, e.clientY)\n const pinNumber = this.nextPinNumber\n\n // Add pin at click position\n this.pinManager.addPin(pinNumber, pinData.pinX, pinData.pinY, true)\n this.pendingPinNumber = pinNumber\n\n // Show comment card\n this.commentCard.show({\n x: e.clientX,\n y: e.clientY,\n onSubmit: async (text: string) => {\n await submitComment(this.token, {\n commentText: text,\n pinNumber,\n pinData,\n pageUrl: window.location.pathname,\n })\n this.pendingPinNumber = null\n this.nextPinNumber++\n this.updateToolbar()\n this.showToast('Comment saved')\n },\n onCancel: () => {\n // Remove the pending pin\n this.pinManager.removePin(pinNumber)\n this.pendingPinNumber = null\n },\n })\n\n e.preventDefault()\n e.stopPropagation()\n }\n\n private handleGeneralComment(): void {\n if (this.pendingPinNumber != null) return\n\n this.commentCard.showForGeneral({\n onSubmit: async (text: string) => {\n await submitComment(this.token, {\n commentText: text,\n pinNumber: null,\n pinData: null,\n pageUrl: window.location.pathname,\n })\n this.showToast('Comment saved')\n },\n onCancel: () => {},\n })\n }\n\n private showToast(message: string): void {\n const toast = document.createElement('div')\n toast.className = 'review-toast'\n toast.textContent = message\n this.shadowRoot.appendChild(toast)\n setTimeout(() => toast.remove(), 2500)\n }\n\n destroy(): void {\n document.body.style.cursor = ''\n if (this.clickHandler) {\n document.removeEventListener('click', this.clickHandler, true)\n }\n this.dismissPrompt()\n this.toolbarEl?.remove()\n this.commentCard.hide()\n this.pinManager.destroy()\n }\n}\n","import { fetchComments } from './api'\nimport { PinManager } from './PinManager'\nimport type { ReviewComment } from './types'\n\nexport class TriageMode {\n private pinManager: PinManager\n private toolbarEl: HTMLElement | null = null\n private tooltipEl: HTMLElement | null = null\n private comments: ReviewComment[] = []\n private pinClickHandler: ((e: MouseEvent) => void) | null = null\n\n constructor(\n private token: string,\n private shadowRoot: ShadowRoot,\n ) {\n this.pinManager = new PinManager()\n }\n\n async init(): Promise<void> {\n this.pinManager.mount()\n\n // Fetch all comments\n try {\n this.comments = await fetchComments(this.token)\n for (const c of this.comments) {\n if (c.pinNumber != null && c.pinData) {\n this.pinManager.addPin(c.pinNumber, c.pinData.pinX, c.pinData.pinY, true)\n }\n }\n } catch {\n // Show error state\n }\n\n this.renderToolbar()\n\n // Listen for clicks on pins\n this.pinClickHandler = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n if (target.classList?.contains('review-pin')) {\n const num = Number(target.dataset.pinNumber)\n if (num) this.handlePinClick(num, e)\n }\n }\n document.addEventListener('click', this.pinClickHandler, true)\n }\n\n private renderToolbar(): void {\n this.toolbarEl = document.createElement('div')\n this.toolbarEl.className = 'review-toolbar'\n const count = this.comments.filter((c) => c.pinNumber != null).length\n this.toolbarEl.innerHTML = `\n <span style=\"font-weight:500;\">Triage Mode</span>\n <span style=\"opacity:0.7;\">${count} pin${count !== 1 ? 's' : ''}</span>\n `\n this.shadowRoot.appendChild(this.toolbarEl)\n }\n\n private handlePinClick(pinNumber: number, e: MouseEvent): void {\n this.hideTooltip()\n this.pinManager.highlightPin(pinNumber)\n\n const comment = this.comments.find((c) => c.pinNumber === pinNumber)\n if (!comment) return\n\n this.tooltipEl = document.createElement('div')\n this.tooltipEl.className = 'review-tooltip'\n\n const time = new Date(comment.createdAt).toLocaleString()\n this.tooltipEl.innerHTML = `\n <div style=\"font-weight:500;margin-bottom:4px;\">Pin #${pinNumber}</div>\n <div style=\"margin-bottom:4px;\">${comment.commentText || '(no text)'}</div>\n <div style=\"font-size:11px;opacity:0.7;\">${time}</div>\n `\n\n // Position near pin\n this.tooltipEl.style.position = 'fixed'\n this.tooltipEl.style.left = `${Math.min(e.clientX + 16, window.innerWidth - 300)}px`\n this.tooltipEl.style.top = `${Math.min(e.clientY - 10, window.innerHeight - 150)}px`\n this.shadowRoot.appendChild(this.tooltipEl)\n\n // Click elsewhere to dismiss\n const dismiss = (ev: MouseEvent) => {\n if (ev.target !== this.tooltipEl && !this.tooltipEl?.contains(ev.target as Node)) {\n this.hideTooltip()\n this.pinManager.clearHighlight()\n document.removeEventListener('click', dismiss, true)\n }\n }\n setTimeout(() => document.addEventListener('click', dismiss, true), 0)\n }\n\n private hideTooltip(): void {\n this.tooltipEl?.remove()\n this.tooltipEl = null\n }\n\n destroy(): void {\n if (this.pinClickHandler) {\n document.removeEventListener('click', this.pinClickHandler, true)\n }\n this.hideTooltip()\n this.toolbarEl?.remove()\n this.pinManager.destroy()\n }\n}\n","import { validateToken, ReviewError } from './api'\nimport { ReviewMode } from './ReviewMode'\nimport { TriageMode } from './TriageMode'\nimport { REVIEW_STYLES } from './styles'\nimport type { ReviewOptions } from './types'\n\nexport class Review {\n private root: HTMLElement\n private shadow: ShadowRoot\n private mode: ReviewMode | TriageMode | null = null\n private _isDestroyed = false\n\n constructor(_options: ReviewOptions = {}) {\n this.root = document.createElement('div')\n this.root.id = 'ourroadmaps-review'\n this.shadow = this.root.attachShadow({ mode: 'open' })\n\n const styleEl = document.createElement('style')\n styleEl.textContent = REVIEW_STYLES\n this.shadow.appendChild(styleEl)\n\n document.body.appendChild(this.root)\n }\n\n async init(): Promise<void> {\n const params = new URLSearchParams(window.location.search)\n const reviewToken = params.get('review')\n const triageToken = params.get('triage')\n\n if (reviewToken) {\n try {\n const data = await validateToken(reviewToken)\n this.mode = new ReviewMode(reviewToken, this.shadow, data)\n await this.mode.init()\n } catch (err) {\n if (err instanceof ReviewError) {\n this.showErrorOverlay(\n err.code === 'expired'\n ? 'This feedback session has expired'\n : 'This review link is no longer valid',\n )\n }\n }\n } else if (triageToken) {\n try {\n await validateToken(triageToken)\n this.mode = new TriageMode(triageToken, this.shadow)\n await this.mode.init()\n } catch (err) {\n if (err instanceof ReviewError) {\n this.showErrorOverlay(\n err.code === 'expired'\n ? 'This feedback session has expired'\n : 'This review link is no longer valid',\n )\n }\n }\n }\n }\n\n private showErrorOverlay(message: string): void {\n const overlay = document.createElement('div')\n overlay.className = 'review-expired-overlay'\n overlay.innerHTML = `\n <div class=\"review-expired-card\">\n <h2 style=\"margin:0 0 8px;font-size:18px;\">Session Unavailable</h2>\n <p style=\"margin:0;color:#666;font-size:14px;\">${message}</p>\n <p style=\"margin:12px 0 0;color:#999;font-size:13px;\">Contact the prototype owner for a new link.</p>\n </div>\n `\n this.shadow.appendChild(overlay)\n\n // Apply grayscale to body\n document.body.style.filter = 'grayscale(0.8)'\n }\n\n destroy(): void {\n if (this._isDestroyed) return\n this._isDestroyed = true\n this.mode?.destroy()\n this.root.remove()\n document.body.style.filter = ''\n }\n}\n"]}
|
|
@@ -186,6 +186,7 @@ var Arrow = class extends BaseAnnotation {
|
|
|
186
186
|
createElement() {
|
|
187
187
|
const g = document.createElementNS("http://www.w3.org/2000/svg", "g");
|
|
188
188
|
g.classList.add("arrow");
|
|
189
|
+
g.style.color = this.config.color ?? "#3B82F6";
|
|
189
190
|
const markerId = `arrowhead-${this.id}`;
|
|
190
191
|
this.markerDef = document.createElementNS("http://www.w3.org/2000/svg", "defs");
|
|
191
192
|
const marker = document.createElementNS("http://www.w3.org/2000/svg", "marker");
|
|
@@ -291,6 +292,10 @@ var Box = class extends BaseAnnotation {
|
|
|
291
292
|
createElement() {
|
|
292
293
|
const rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
|
|
293
294
|
rect.classList.add("box");
|
|
295
|
+
const color = this.config.color ?? "#3B82F6";
|
|
296
|
+
rect.setAttribute("stroke", color);
|
|
297
|
+
rect.setAttribute("stroke-width", "2");
|
|
298
|
+
rect.setAttribute("fill", "none");
|
|
294
299
|
rect.setAttribute("rx", String(DEFAULT_RADIUS));
|
|
295
300
|
rect.setAttribute("ry", String(DEFAULT_RADIUS));
|
|
296
301
|
if (this.config.dashed) {
|
|
@@ -348,6 +353,10 @@ var Circle = class extends BaseAnnotation {
|
|
|
348
353
|
createElement() {
|
|
349
354
|
const ellipse = document.createElementNS("http://www.w3.org/2000/svg", "ellipse");
|
|
350
355
|
ellipse.classList.add("circle");
|
|
356
|
+
const color = this.config.color ?? "#3B82F6";
|
|
357
|
+
ellipse.setAttribute("stroke", color);
|
|
358
|
+
ellipse.setAttribute("stroke-width", "2");
|
|
359
|
+
ellipse.setAttribute("fill", "none");
|
|
351
360
|
return ellipse;
|
|
352
361
|
}
|
|
353
362
|
/**
|
|
@@ -1250,5 +1259,5 @@ function createOverlay(options) {
|
|
|
1250
1259
|
|
|
1251
1260
|
exports.Overlay = Overlay;
|
|
1252
1261
|
exports.createOverlay = createOverlay;
|
|
1253
|
-
//# sourceMappingURL=chunk-
|
|
1254
|
-
//# sourceMappingURL=chunk-
|
|
1262
|
+
//# sourceMappingURL=chunk-EKWWSLHU.cjs.map
|
|
1263
|
+
//# sourceMappingURL=chunk-EKWWSLHU.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/overlay/targeting.ts","../src/overlay/animations.ts","../src/overlay/annotations/Base.ts","../src/overlay/annotations/Arrow.ts","../src/overlay/annotations/Badge.ts","../src/overlay/annotations/Box.ts","../src/overlay/annotations/Circle.ts","../src/overlay/annotations/Label.ts","../src/overlay/AnnotationManager.ts","../src/shared/colors.ts","../src/overlay/scroller.ts","../src/overlay/Cursor.ts","../src/overlay/styles.ts","../src/overlay/Timeline.ts","../src/overlay/Overlay.ts","../src/overlay/index.ts"],"names":["__publicField","DEFAULT_PADDING"],"mappings":"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","file":"chunk-EKWWSLHU.cjs","sourcesContent":["import type { Anchor, Coordinates, CursorTarget, SelectorTarget, Target } from './types'\n\n/**\n * Type guard for SelectorTarget\n */\nexport function isSelectorTarget(target: Target): target is SelectorTarget {\n return typeof target === 'object' && 'selector' in target\n}\n\n/**\n * Type guard for CursorTarget\n */\nexport function isCursorTarget(target: Target): target is CursorTarget {\n return typeof target === 'object' && 'cursor' in target && target.cursor === true\n}\n\n/**\n * Type guard for Coordinates\n */\nexport function isCoordinates(target: Target): target is Coordinates {\n return typeof target === 'object' && 'x' in target && 'y' in target && !('selector' in target)\n}\n\n/**\n * Resolve a selector to an element\n */\nexport function resolveElement(target: Target): HTMLElement | null {\n if (isSelectorTarget(target)) {\n return document.querySelector(target.selector)\n }\n return null\n}\n\n/**\n * Calculate anchor position on a rect\n */\nfunction getAnchorPosition(rect: DOMRect, anchor: Anchor = 'center'): Coordinates {\n switch (anchor) {\n case 'top':\n return { x: rect.left + rect.width / 2, y: rect.top }\n case 'bottom':\n return { x: rect.left + rect.width / 2, y: rect.bottom }\n case 'left':\n return { x: rect.left, y: rect.top + rect.height / 2 }\n case 'right':\n return { x: rect.right, y: rect.top + rect.height / 2 }\n case 'top-left':\n return { x: rect.left, y: rect.top }\n case 'top-right':\n return { x: rect.right, y: rect.top }\n case 'bottom-left':\n return { x: rect.left, y: rect.bottom }\n case 'bottom-right':\n return { x: rect.right, y: rect.bottom }\n case 'center':\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 }\n }\n}\n\n/**\n * Resolve a target to coordinates\n * @param target - The target to resolve\n * @param cursorPosition - Current cursor position (for CursorTarget)\n */\nexport function resolveCoordinates(\n target: Target,\n cursorPosition: Coordinates | null,\n): Coordinates | null {\n if (isCoordinates(target)) {\n return target\n }\n\n if (isCursorTarget(target)) {\n return cursorPosition\n }\n\n if (isSelectorTarget(target)) {\n const element = document.querySelector(target.selector)\n if (!element) {\n return target.fallback ?? null\n }\n\n const rect = element.getBoundingClientRect()\n const position = getAnchorPosition(rect, target.anchor)\n\n if (target.offset) {\n position.x += target.offset.x\n position.y += target.offset.y\n }\n\n return position\n }\n\n return null\n}\n\n/**\n * Get bounding rect for a target\n */\nexport function getTargetRect(target: Target): DOMRect | null {\n if (isSelectorTarget(target)) {\n const element = document.querySelector(target.selector)\n return element?.getBoundingClientRect() ?? null\n }\n return null\n}\n\n/**\n * Check if an element is in the viewport\n */\nexport function isInViewport(element: HTMLElement): boolean {\n const rect = element.getBoundingClientRect()\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= window.innerHeight &&\n rect.right <= window.innerWidth\n )\n}\n","/**\n * Animation duration constants (in milliseconds)\n */\nexport const DURATIONS = {\n cursorMove: 600,\n cursorClick: 150,\n clickRipple: 400,\n annotationIn: 200,\n annotationOut: 150,\n scrollPause: 300,\n} as const\n\n/**\n * CSS easing functions\n */\nexport const EASINGS = {\n easeOut: 'cubic-bezier(0, 0, 0.2, 1)',\n easeInOut: 'cubic-bezier(0.4, 0, 0.2, 1)',\n linear: 'linear',\n} as const\n\n/**\n * Promise-based delay utility\n */\nexport function delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Create keyframes for fade-in animation with scale\n */\nexport function fadeInKeyframes(): Keyframe[] {\n return [\n { opacity: 0, transform: 'scale(0.9)' },\n { opacity: 1, transform: 'scale(1)' },\n ]\n}\n\n/**\n * Create keyframes for fade-out animation\n */\nexport function fadeOutKeyframes(): Keyframe[] {\n return [{ opacity: 1 }, { opacity: 0 }]\n}\n\n/**\n * Run animation and return promise\n */\nexport function animate(\n element: HTMLElement | SVGElement,\n keyframes: Keyframe[],\n options: KeyframeAnimationOptions,\n): Animation {\n return element.animate(keyframes, options)\n}\n","import { DURATIONS, EASINGS, fadeInKeyframes, fadeOutKeyframes } from '../animations'\nimport type { Annotation } from '../types'\n\nexport abstract class BaseAnnotation {\n readonly id: string\n readonly config: Annotation\n protected element: HTMLElement | SVGElement | null = null\n protected container: Element\n protected reducedMotion: boolean\n private hideTimeout: ReturnType<typeof setTimeout> | null = null\n private currentAnimation: Animation | null = null\n\n constructor(id: string, config: Annotation, container: Element, reducedMotion: boolean) {\n this.id = id\n this.config = config\n this.container = container\n this.reducedMotion = reducedMotion\n }\n\n /**\n * Create and return the DOM/SVG element\n * Subclasses must implement this\n */\n protected abstract createElement(): HTMLElement | SVGElement\n\n /**\n * Render the annotation with animation\n */\n async show(): Promise<void> {\n // Wait for delay if specified\n if (this.config.delay && this.config.delay > 0) {\n await new Promise((r) => setTimeout(r, this.config.delay))\n }\n\n // Create element\n this.element = this.createElement()\n\n // Apply color if specified\n if (this.config.color) {\n this.element.style.setProperty('--annotation-color', this.config.color)\n }\n\n // Add to DOM\n this.container.appendChild(this.element)\n\n // Animate in\n const duration = this.reducedMotion ? 1 : DURATIONS.annotationIn\n this.currentAnimation = this.element.animate(fadeInKeyframes(), {\n duration,\n easing: EASINGS.easeOut,\n fill: 'forwards',\n })\n\n await this.currentAnimation.finished\n this.currentAnimation = null\n\n // Set up auto-hide if duration is specified\n if (this.config.duration && this.config.duration > 0) {\n this.hideTimeout = setTimeout(() => this.hide(), this.config.duration)\n }\n }\n\n /**\n * Hide and remove the annotation\n */\n async hide(): Promise<void> {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout)\n this.hideTimeout = null\n }\n\n if (!this.element) return\n\n // Animate out\n const duration = this.reducedMotion ? 1 : DURATIONS.annotationOut\n this.currentAnimation = this.element.animate(fadeOutKeyframes(), {\n duration,\n easing: EASINGS.linear,\n fill: 'forwards',\n })\n\n await this.currentAnimation.finished\n this.currentAnimation = null\n\n // Remove from DOM\n this.element.remove()\n this.element = null\n }\n\n /**\n * Cancel any running animations\n */\n cancelAnimations(): void {\n this.currentAnimation?.cancel()\n this.currentAnimation = null\n }\n\n /**\n * Clean up resources\n */\n destroy(): void {\n if (this.hideTimeout) {\n clearTimeout(this.hideTimeout)\n }\n this.cancelAnimations()\n this.element?.remove()\n }\n}\n","import { isCoordinates, isCursorTarget, isSelectorTarget, resolveCoordinates } from '../targeting'\nimport type { ArrowAnnotation, Coordinates } from '../types'\nimport { BaseAnnotation } from './Base'\n\nconst ARROWHEAD_LENGTH = 12\nconst ARROWHEAD_WIDTH = 8\n\nexport class Arrow extends BaseAnnotation {\n declare readonly config: ArrowAnnotation\n private cursorPosition: Coordinates | null\n private pathElement: SVGPathElement | null = null\n private markerDef: SVGDefsElement | null = null\n\n constructor(\n id: string,\n config: ArrowAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): SVGGElement {\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n g.classList.add('arrow')\n g.style.color = this.config.color ?? '#3B82F6'\n\n // Create marker definition for arrowhead\n const markerId = `arrowhead-${this.id}`\n this.markerDef = document.createElementNS('http://www.w3.org/2000/svg', 'defs')\n const marker = document.createElementNS('http://www.w3.org/2000/svg', 'marker')\n marker.setAttribute('id', markerId)\n marker.setAttribute('markerWidth', String(ARROWHEAD_LENGTH))\n marker.setAttribute('markerHeight', String(ARROWHEAD_WIDTH))\n marker.setAttribute('refX', String(ARROWHEAD_LENGTH))\n marker.setAttribute('refY', String(ARROWHEAD_WIDTH / 2))\n marker.setAttribute('orient', 'auto')\n marker.setAttribute('markerUnits', 'userSpaceOnUse')\n\n const polygon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon')\n polygon.setAttribute(\n 'points',\n `0,0 ${ARROWHEAD_LENGTH},${ARROWHEAD_WIDTH / 2} 0,${ARROWHEAD_WIDTH}`,\n )\n polygon.setAttribute('fill', 'currentColor')\n\n marker.appendChild(polygon)\n this.markerDef.appendChild(marker)\n g.appendChild(this.markerDef)\n\n // Create path for the line\n this.pathElement = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n this.pathElement.setAttribute('marker-end', `url(#${markerId})`)\n this.pathElement.setAttribute('fill', 'none')\n this.pathElement.setAttribute('stroke', 'currentColor')\n g.appendChild(this.pathElement)\n\n return g\n }\n\n /**\n * Update the cursor position for relative positioning\n */\n setCursorPosition(coords: Coordinates): void {\n this.cursorPosition = coords\n if (this.element) {\n this.updatePosition()\n }\n }\n\n private resolveTargetPoint(\n target: Coordinates | { selector: string } | { cursor: true },\n ): Coordinates | null {\n if (isCoordinates(target)) {\n return resolveCoordinates(target, this.cursorPosition)\n }\n\n if (isCursorTarget(target)) {\n return this.cursorPosition\n }\n\n if (isSelectorTarget(target)) {\n const element = document.querySelector(target.selector)\n if (!element) {\n return target.fallback ?? null\n }\n const rect = element.getBoundingClientRect()\n // Calculate center of element\n return { x: rect.left + rect.width / 2, y: rect.top + rect.height / 2 }\n }\n\n return null\n }\n\n private updatePosition(): void {\n if (!this.pathElement) return\n\n const from = this.config.from\n const to = this.config.to\n\n const startPoint = this.resolveTargetPoint(from)\n const endPoint = this.resolveTargetPoint(to)\n\n if (!startPoint || !endPoint) return\n\n // Calculate path - straight line for now\n const d = `M ${startPoint.x} ${startPoint.y} L ${endPoint.x} ${endPoint.y}`\n this.pathElement.setAttribute('d', d)\n }\n\n override async show(): Promise<void> {\n await super.show()\n this.updatePosition()\n }\n\n override destroy(): void {\n this.pathElement = null\n this.markerDef = null\n super.destroy()\n }\n}\n","import { resolveCoordinates } from '../targeting'\nimport type { BadgeAnnotation, Coordinates } from '../types'\nimport { BaseAnnotation } from './Base'\n\nexport class Badge extends BaseAnnotation {\n declare readonly config: BadgeAnnotation\n private cursorPosition: Coordinates | null\n\n constructor(\n id: string,\n config: BadgeAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): HTMLElement {\n const badge = document.createElement('div')\n badge.className = 'badge'\n badge.textContent = String(this.config.number)\n\n // Position the badge\n const coords = resolveCoordinates(this.config.target, this.cursorPosition)\n if (coords) {\n badge.style.left = `${coords.x}px`\n badge.style.top = `${coords.y}px`\n }\n\n return badge\n }\n}\n","import { isCoordinates, isSelectorTarget, resolveCoordinates } from '../targeting'\nimport type { BoxAnnotation, Coordinates } from '../types'\nimport { BaseAnnotation } from './Base'\n\nconst DEFAULT_PADDING = 4\nconst DEFAULT_RADIUS = 4\n\nexport class Box extends BaseAnnotation {\n declare readonly config: BoxAnnotation\n private cursorPosition: Coordinates | null\n\n constructor(\n id: string,\n config: BoxAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): SVGRectElement {\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n rect.classList.add('box')\n\n const color = this.config.color ?? '#3B82F6'\n rect.setAttribute('stroke', color)\n rect.setAttribute('stroke-width', '2')\n rect.setAttribute('fill', 'none')\n\n rect.setAttribute('rx', String(DEFAULT_RADIUS))\n rect.setAttribute('ry', String(DEFAULT_RADIUS))\n\n if (this.config.dashed) {\n rect.setAttribute('stroke-dasharray', '8 4')\n }\n\n return rect\n }\n\n /**\n * Update the cursor position for relative positioning\n */\n setCursorPosition(coords: Coordinates): void {\n this.cursorPosition = coords\n if (this.element) {\n this.updatePosition()\n }\n }\n\n private updatePosition(): void {\n if (!this.element) return\n\n const rect = this.element as SVGRectElement\n const target = this.config.target\n const padding = this.config.padding ?? DEFAULT_PADDING\n\n let bounds: DOMRect\n\n if (isSelectorTarget(target)) {\n const el = document.querySelector(target.selector)\n if (!el) return\n bounds = el.getBoundingClientRect()\n } else if (isCoordinates(target)) {\n const resolved = resolveCoordinates(target, this.cursorPosition)\n if (!resolved) return\n // For coordinates, use width/height from config or default to 100x100\n const width = this.config.size?.width ?? 100\n const height = this.config.size?.height ?? 100\n bounds = new DOMRect(resolved.x, resolved.y, width, height)\n } else {\n return\n }\n\n rect.setAttribute('x', String(bounds.left - padding))\n rect.setAttribute('y', String(bounds.top - padding))\n rect.setAttribute('width', String(bounds.width + padding * 2))\n rect.setAttribute('height', String(bounds.height + padding * 2))\n }\n\n override async show(): Promise<void> {\n await super.show()\n this.updatePosition()\n }\n}\n","import { isCoordinates, isSelectorTarget, resolveCoordinates } from '../targeting'\nimport type { CircleAnnotation, Coordinates } from '../types'\nimport { BaseAnnotation } from './Base'\n\nconst DEFAULT_PADDING = 4\n\nexport class Circle extends BaseAnnotation {\n declare readonly config: CircleAnnotation\n private cursorPosition: Coordinates | null\n\n constructor(\n id: string,\n config: CircleAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): SVGEllipseElement {\n const ellipse = document.createElementNS('http://www.w3.org/2000/svg', 'ellipse')\n ellipse.classList.add('circle')\n\n const color = this.config.color ?? '#3B82F6'\n ellipse.setAttribute('stroke', color)\n ellipse.setAttribute('stroke-width', '2')\n ellipse.setAttribute('fill', 'none')\n\n return ellipse\n }\n\n /**\n * Update the cursor position for relative positioning\n */\n setCursorPosition(coords: Coordinates): void {\n this.cursorPosition = coords\n if (this.element) {\n this.updatePosition()\n }\n }\n\n private updatePosition(): void {\n if (!this.element) return\n\n const ellipse = this.element as SVGEllipseElement\n const target = this.config.target\n const padding = this.config.padding ?? DEFAULT_PADDING\n\n let bounds: DOMRect\n\n if (isSelectorTarget(target)) {\n const el = document.querySelector(target.selector)\n if (!el) return\n bounds = el.getBoundingClientRect()\n } else if (isCoordinates(target)) {\n const resolved = resolveCoordinates(target, this.cursorPosition)\n if (!resolved) return\n // For coordinates, use width/height from config or default to 100x100\n const width = this.config.size?.width ?? 100\n const height = this.config.size?.height ?? 100\n bounds = new DOMRect(resolved.x, resolved.y, width, height)\n } else {\n return\n }\n\n // Calculate center and radii\n const cx = bounds.left + bounds.width / 2\n const cy = bounds.top + bounds.height / 2\n const rx = bounds.width / 2 + padding\n const ry = bounds.height / 2 + padding\n\n ellipse.setAttribute('cx', String(cx))\n ellipse.setAttribute('cy', String(cy))\n ellipse.setAttribute('rx', String(rx))\n ellipse.setAttribute('ry', String(ry))\n }\n\n override async show(): Promise<void> {\n await super.show()\n this.updatePosition()\n }\n}\n","import { isCoordinates, isCursorTarget, isSelectorTarget, resolveCoordinates } from '../targeting'\nimport type { Coordinates, LabelAnnotation, LabelPosition } from '../types'\nimport { BaseAnnotation } from './Base'\n\nconst DEFAULT_GAP = 8\n\nexport class Label extends BaseAnnotation {\n declare readonly config: LabelAnnotation\n private cursorPosition: Coordinates | null\n\n constructor(\n id: string,\n config: LabelAnnotation,\n container: Element,\n reducedMotion: boolean,\n cursorPosition: Coordinates | null,\n ) {\n super(id, config, container, reducedMotion)\n this.cursorPosition = cursorPosition\n }\n\n protected createElement(): HTMLElement {\n const el = document.createElement('div')\n el.className = 'label'\n el.textContent = this.config.text\n return el\n }\n\n /**\n * Update the cursor position for relative positioning\n */\n setCursorPosition(coords: Coordinates): void {\n this.cursorPosition = coords\n if (this.element) {\n this.updatePosition()\n }\n }\n\n private updatePosition(): void {\n if (!this.element) return\n\n const target = this.config.target\n const position = this.config.position || 'top'\n const gap = this.config.gap ?? DEFAULT_GAP\n\n let anchorRect: DOMRect\n\n if (isCursorTarget(target)) {\n if (!this.cursorPosition) return\n // Create a synthetic DOMRect for cursor position\n anchorRect = new DOMRect(this.cursorPosition.x, this.cursorPosition.y, 0, 0)\n } else if (isCoordinates(target)) {\n const resolved = resolveCoordinates(target, this.cursorPosition)\n if (!resolved) return\n anchorRect = new DOMRect(resolved.x, resolved.y, 0, 0)\n } else if (isSelectorTarget(target)) {\n const el = document.querySelector(target.selector)\n if (!el) return\n anchorRect = el.getBoundingClientRect()\n } else {\n return\n }\n\n const coords = this.calculatePosition(anchorRect, position, gap)\n this.element.style.left = `${coords.x}px`\n this.element.style.top = `${coords.y}px`\n this.element.style.transform = this.getTransform(position)\n }\n\n private calculatePosition(rect: DOMRect, position: LabelPosition, gap: number): Coordinates {\n const centerX = rect.left + rect.width / 2\n const centerY = rect.top + rect.height / 2\n\n switch (position) {\n case 'top':\n return { x: centerX, y: rect.top - gap }\n case 'top-left':\n return { x: rect.left, y: rect.top - gap }\n case 'top-right':\n return { x: rect.right, y: rect.top - gap }\n case 'bottom':\n return { x: centerX, y: rect.bottom + gap }\n case 'bottom-left':\n return { x: rect.left, y: rect.bottom + gap }\n case 'bottom-right':\n return { x: rect.right, y: rect.bottom + gap }\n case 'left':\n return { x: rect.left - gap, y: centerY }\n case 'right':\n return { x: rect.right + gap, y: centerY }\n default:\n return { x: centerX, y: rect.top - gap }\n }\n }\n\n private getTransform(position: LabelPosition): string {\n switch (position) {\n case 'top':\n case 'bottom':\n return 'translate(-50%, -100%)'\n case 'top-left':\n case 'bottom-left':\n return 'translate(0, -100%)'\n case 'top-right':\n case 'bottom-right':\n return 'translate(-100%, -100%)'\n case 'left':\n return 'translate(-100%, -50%)'\n case 'right':\n return 'translate(0, -50%)'\n default:\n return 'translate(-50%, -100%)'\n }\n }\n\n override async show(): Promise<void> {\n await super.show()\n this.updatePosition()\n }\n}\n","import { Arrow, Badge, type BaseAnnotation, Box, Circle, Label } from './annotations'\nimport type {\n Annotation,\n AnnotationsConfig,\n AnnotationsController,\n ArrowAnnotation,\n BadgeAnnotation,\n BoxAnnotation,\n CircleAnnotation,\n Coordinates,\n LabelAnnotation,\n Target,\n} from './types'\n\ntype ArrowOptions = Omit<Partial<ArrowAnnotation>, 'type' | 'from' | 'to'>\ntype BadgeOptions = Omit<Partial<BadgeAnnotation>, 'type' | 'target' | 'number'>\ntype BoxOptions = Omit<Partial<BoxAnnotation>, 'type' | 'target'>\ntype CircleOptions = Omit<Partial<CircleAnnotation>, 'type' | 'target'>\ntype LabelOptions = Omit<Partial<LabelAnnotation>, 'type' | 'target' | 'text'>\n\nlet idCounter = 0\n\nfunction generateId(): string {\n return `ann-${++idCounter}`\n}\n\nexport class AnnotationManager implements AnnotationsController {\n private config: AnnotationsConfig\n private domContainer: HTMLElement\n private svgContainer: SVGSVGElement\n private annotations = new Map<string, BaseAnnotation>()\n private reducedMotion: boolean\n private getCursorPosition: () => Coordinates | null\n\n constructor(\n config: AnnotationsConfig,\n domContainer: HTMLElement,\n svgContainer: SVGSVGElement,\n reducedMotion: boolean,\n getCursorPosition: () => Coordinates | null,\n ) {\n this.config = config\n this.domContainer = domContainer\n this.svgContainer = svgContainer\n this.reducedMotion = reducedMotion\n this.getCursorPosition = getCursorPosition\n }\n\n get activeIds(): string[] {\n return Array.from(this.annotations.keys())\n }\n\n // Overloaded show method\n show(annotation: Annotation): string\n show(annotations: Annotation[]): string[]\n show(input: Annotation | Annotation[]): string | string[] {\n if (Array.isArray(input)) {\n return input.map((a) => this.showOne(a))\n }\n return this.showOne(input)\n }\n\n private showOne(annotation: Annotation): string {\n const id = annotation.id ?? generateId()\n const cursorPos = this.getCursorPosition()\n\n // Apply default color from config if not specified\n const annotationWithDefaults = {\n ...annotation,\n color: annotation.color ?? this.config.color,\n }\n\n let instance: BaseAnnotation\n\n switch (annotation.type) {\n case 'arrow':\n instance = new Arrow(\n id,\n annotationWithDefaults as ArrowAnnotation,\n this.svgContainer, // SVG for arrows\n this.reducedMotion,\n cursorPos,\n )\n break\n case 'badge':\n instance = new Badge(\n id,\n annotationWithDefaults as BadgeAnnotation,\n this.domContainer,\n this.reducedMotion,\n cursorPos,\n )\n break\n case 'box':\n instance = new Box(\n id,\n annotationWithDefaults as BoxAnnotation,\n this.svgContainer, // SVG for boxes\n this.reducedMotion,\n cursorPos,\n )\n break\n case 'circle':\n instance = new Circle(\n id,\n annotationWithDefaults as CircleAnnotation,\n this.svgContainer, // SVG for circles\n this.reducedMotion,\n cursorPos,\n )\n break\n case 'label':\n instance = new Label(\n id,\n annotationWithDefaults as LabelAnnotation,\n this.domContainer,\n this.reducedMotion,\n cursorPos,\n )\n break\n default:\n throw new Error(`Unknown annotation type: ${(annotation as Annotation).type}`)\n }\n\n this.annotations.set(id, instance)\n instance.show()\n\n return id\n }\n\n // Overloaded hide method\n hide(id: string): void\n hide(ids: string[]): void\n hide(input: string | string[]): void {\n const ids = Array.isArray(input) ? input : [input]\n for (const id of ids) {\n const annotation = this.annotations.get(id)\n if (annotation) {\n annotation.hide()\n this.annotations.delete(id)\n }\n }\n }\n\n hideAll(): void {\n for (const annotation of this.annotations.values()) {\n annotation.hide()\n }\n this.annotations.clear()\n }\n\n // Convenience methods\n arrow(from: Target, to: Target, options?: ArrowOptions): string {\n return this.show({ type: 'arrow', from, to, ...options })\n }\n\n badge(target: Target, number: number, options?: BadgeOptions): string {\n return this.show({ type: 'badge', target, number, ...options })\n }\n\n box(target: Target, options?: BoxOptions): string {\n return this.show({ type: 'box', target, ...options })\n }\n\n circle(target: Target, options?: CircleOptions): string {\n return this.show({ type: 'circle', target, ...options })\n }\n\n label(target: Target, text: string, options?: LabelOptions): string {\n return this.show({ type: 'label', target, text, ...options })\n }\n\n cancelAllAnimations(): void {\n for (const annotation of this.annotations.values()) {\n annotation.cancelAnimations()\n }\n }\n\n destroy(): void {\n for (const annotation of this.annotations.values()) {\n annotation.destroy()\n }\n this.annotations.clear()\n }\n}\n","/**\n * Convert hex color to RGB array\n */\nexport function hexToRgb(hex: string): [number, number, number] {\n const cleaned = hex.replace('#', '')\n const bigint = parseInt(cleaned, 16)\n return [(bigint >> 16) & 255, (bigint >> 8) & 255, bigint & 255]\n}\n\n/**\n * Calculate relative luminance per WCAG 2.1\n */\nexport function getLuminance(hex: string): number {\n const [r, g, b] = hexToRgb(hex).map((c) => {\n const sRGB = c / 255\n return sRGB <= 0.03928 ? sRGB / 12.92 : ((sRGB + 0.055) / 1.055) ** 2.4\n })\n return 0.2126 * r + 0.7152 * g + 0.0722 * b\n}\n\n/**\n * Get contrasting text color for a background\n */\nexport function getContrastColor(hex: string): 'white' | 'black' {\n return getLuminance(hex) > 0.5 ? 'black' : 'white'\n}\n","/**\n * Scroll element into view if not fully visible\n * Returns a promise that resolves when scroll is complete\n */\nexport async function scrollIntoViewIfNeeded(element: HTMLElement): Promise<void> {\n const rect = element.getBoundingClientRect()\n const isFullyVisible =\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= window.innerHeight &&\n rect.right <= window.innerWidth\n\n if (isFullyVisible) {\n return\n }\n\n return new Promise((resolve) => {\n // Use scrollIntoView with smooth behavior\n element.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n inline: 'center',\n })\n\n // Wait for scroll to complete using IntersectionObserver\n const observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0]\n if (entry?.isIntersecting) {\n observer.disconnect()\n resolve()\n }\n },\n { threshold: 0.5 },\n )\n\n observer.observe(element)\n\n // Fallback timeout in case observer doesn't fire\n setTimeout(() => {\n observer.disconnect()\n resolve()\n }, 1000)\n })\n}\n","import { getContrastColor } from '../shared/colors'\nimport { DURATIONS, delay, EASINGS } from './animations'\nimport { scrollIntoViewIfNeeded } from './scroller'\nimport { isInViewport, resolveCoordinates, resolveElement } from './targeting'\nimport type { Coordinates, CursorController, Target } from './types'\n\nconst CURSOR_ARROW_SVG = `<svg class=\"cursor-arrow\" viewBox=\"0 0 24 24\">\n <path d=\"M5.5 3.21V20.8c0 .45.54.67.85.35l4.86-4.86a.5.5 0 0 1 .35-.15h6.87a.5.5 0 0 0 .35-.85L6.35 2.85a.5.5 0 0 0-.85.36Z\"/>\n</svg>`\n\nexport class Cursor implements CursorController {\n private container: HTMLElement\n private element: HTMLDivElement\n private labelElement: HTMLDivElement\n private rippleElement: HTMLDivElement\n private currentAnimation: Animation | null = null\n private activeRipples = new Set<HTMLDivElement>()\n private _position: Coordinates | null = null\n private _isVisible = true\n private reducedMotion: boolean\n\n constructor(container: HTMLElement, reducedMotion: boolean) {\n this.container = container\n this.reducedMotion = reducedMotion\n\n // Create cursor element\n this.element = document.createElement('div')\n this.element.className = 'cursor'\n this.element.innerHTML = `${CURSOR_ARROW_SVG}<div class=\"cursor-label\">Guide</div>`\n this.labelElement = this.element.querySelector('.cursor-label') as HTMLDivElement\n\n // Create ripple element\n this.rippleElement = document.createElement('div')\n this.rippleElement.className = 'click-ripple'\n\n container.appendChild(this.element)\n container.appendChild(this.rippleElement)\n }\n\n get position(): Coordinates | null {\n return this._position\n }\n\n get isVisible(): boolean {\n return this._isVisible\n }\n\n show(): void {\n this._isVisible = true\n this.element.classList.remove('hidden')\n }\n\n hide(): void {\n this._isVisible = false\n this.element.classList.add('hidden')\n }\n\n setName(name: string): void {\n this.labelElement.textContent = name\n }\n\n setColor(color: string): void {\n this.element.style.setProperty('--cursor-color', color)\n this.element.style.setProperty('--cursor-text-color', getContrastColor(color))\n }\n\n async moveTo(target: Target, options?: { duration?: number }): Promise<void> {\n // Scroll element into view if needed\n const el = resolveElement(target)\n if (el && !isInViewport(el)) {\n await scrollIntoViewIfNeeded(el)\n await delay(DURATIONS.scrollPause)\n }\n\n // Resolve target coordinates\n const coords = resolveCoordinates(target, this._position)\n if (!coords) {\n console.warn('[Overlay] Target not found:', target)\n return\n }\n\n // Cancel any existing animation\n this.currentAnimation?.cancel()\n\n const duration = this.reducedMotion ? 1 : (options?.duration ?? DURATIONS.cursorMove)\n\n const from = this._position ?? coords\n\n this.currentAnimation = this.element.animate(\n [\n { transform: `translate(${from.x}px, ${from.y}px)` },\n { transform: `translate(${coords.x}px, ${coords.y}px)` },\n ],\n { duration, easing: EASINGS.easeInOut, fill: 'forwards' },\n )\n\n try {\n await this.currentAnimation.finished\n this._position = coords\n } catch {\n // Animation was cancelled\n } finally {\n this.currentAnimation = null\n }\n }\n\n async click(target?: Target): Promise<void> {\n // Move to target if provided\n if (target) {\n await this.moveTo(target)\n }\n\n if (!this._position) return\n\n const duration = this.reducedMotion ? 1 : DURATIONS.cursorClick\n\n // Press animation\n const pressAnimation = this.element.animate(\n [\n { transform: `translate(${this._position.x}px, ${this._position.y}px) scale(1)` },\n { transform: `translate(${this._position.x}px, ${this._position.y}px) scale(0.85)` },\n { transform: `translate(${this._position.x}px, ${this._position.y}px) scale(1)` },\n ],\n { duration, easing: EASINGS.easeOut },\n )\n\n // Show ripple\n this.showRipple(this._position)\n\n await pressAnimation.finished\n }\n\n private showRipple(position: Coordinates): void {\n const ripple = this.rippleElement.cloneNode() as HTMLDivElement\n ripple.style.left = `${position.x}px`\n ripple.style.top = `${position.y}px`\n this.container.appendChild(ripple)\n this.activeRipples.add(ripple)\n\n const duration = this.reducedMotion ? 1 : DURATIONS.clickRipple\n\n const animation = ripple.animate(\n [\n { opacity: 0.4, transform: 'translate(-50%, -50%) scale(0)' },\n { opacity: 0, transform: 'translate(-50%, -50%) scale(2)' },\n ],\n { duration, easing: EASINGS.easeOut },\n )\n\n animation.onfinish = () => {\n ripple.remove()\n this.activeRipples.delete(ripple)\n }\n }\n\n cancelAnimations(): void {\n this.currentAnimation?.cancel()\n this.currentAnimation = null\n for (const r of this.activeRipples) {\n r.remove()\n }\n this.activeRipples.clear()\n }\n\n destroy(): void {\n this.cancelAnimations()\n this.element.remove()\n this.rippleElement.remove()\n }\n}\n","export const OVERLAY_STYLES = `\n:host {\n all: initial;\n}\n\n.overlay-container {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: var(--overlay-z-index, 9999);\n overflow: hidden;\n}\n\n/* Cursor */\n.cursor {\n position: absolute;\n display: flex;\n align-items: flex-start;\n gap: 2px;\n filter: drop-shadow(0 2px 4px rgba(0,0,0,0.2));\n will-change: transform;\n transition: opacity 0.15s ease-out;\n}\n\n.cursor.hidden {\n opacity: 0;\n pointer-events: none;\n}\n\n.cursor-arrow {\n width: 20px;\n height: 20px;\n fill: var(--cursor-color, #3B82F6);\n}\n\n.cursor-label {\n background: var(--cursor-color, #3B82F6);\n color: var(--cursor-text-color, white);\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 12px;\n font-weight: 500;\n padding: 4px 8px;\n border-radius: 4px;\n white-space: nowrap;\n margin-top: 12px;\n}\n\n/* Click Ripple */\n.click-ripple {\n position: absolute;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n background: var(--cursor-color, #3B82F6);\n opacity: 0;\n transform: translate(-50%, -50%) scale(0);\n pointer-events: none;\n}\n\n/* Annotations SVG Layer */\n.annotations-svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n overflow: visible;\n}\n\n/* Annotations DOM Layer */\n.annotations-dom {\n position: absolute;\n inset: 0;\n}\n\n/* Badge */\n.badge {\n position: absolute;\n width: 28px;\n height: 28px;\n border-radius: 50%;\n background: var(--annotation-color, #EF4444);\n color: white;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n transform: translate(-50%, -50%);\n}\n\n/* Label */\n.label {\n position: absolute;\n background: var(--annotation-color, #EF4444);\n color: white;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 14px;\n font-weight: 500;\n padding: 6px 12px;\n border-radius: 6px;\n max-width: 280px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n}\n\n/* Note: Box, Circle, and Arrow annotations use SVG elements\n styled via attributes, not CSS classes */\n\n/* Reduced Motion */\n@media (prefers-reduced-motion: reduce) {\n *, *::before, *::after {\n animation-duration: 0.01ms !important;\n transition-duration: 0.01ms !important;\n }\n}\n`\n","import type { AnnotationManager } from './AnnotationManager'\nimport { delay } from './animations'\nimport type { Cursor } from './Cursor'\nimport type {\n Action,\n ClickAction,\n HideAnnotationsAction,\n MoveAction,\n OverlayScript,\n SetCursorAction,\n ShowAnnotationsAction,\n WaitAction,\n} from './types'\n\nexport interface TimelineCallbacks {\n onStart: () => void\n onComplete: () => void\n onStop: () => void\n onError: (error: Error, action?: Action) => void\n onAction: (action: Action, index: number, phase: 'start' | 'complete') => void\n}\n\nexport class Timeline {\n private cursor: Cursor\n private annotations: AnnotationManager\n private callbacks: TimelineCallbacks\n private isRunning = false\n private currentIndex = 0\n private abortController: AbortController | null = null\n\n constructor(cursor: Cursor, annotations: AnnotationManager, callbacks: TimelineCallbacks) {\n this.cursor = cursor\n this.annotations = annotations\n this.callbacks = callbacks\n }\n\n get running(): boolean {\n return this.isRunning\n }\n\n get actionIndex(): number | null {\n return this.isRunning ? this.currentIndex : null\n }\n\n async play(script: OverlayScript): Promise<void> {\n if (this.isRunning) {\n console.warn('[Overlay] Stopping current playback to start new script')\n this.stop()\n }\n\n this.isRunning = true\n this.currentIndex = 0\n this.abortController = new AbortController()\n\n // Apply script-level config\n if (script.cursor) {\n if (script.cursor.name) this.cursor.setName(script.cursor.name)\n if (script.cursor.color) this.cursor.setColor(script.cursor.color)\n if (script.cursor.visible === false) this.cursor.hide()\n else this.cursor.show()\n }\n\n this.callbacks.onStart()\n\n try {\n for (let i = 0; i < script.actions.length; i++) {\n if (!this.isRunning) break\n\n this.currentIndex = i\n const action = script.actions[i]\n\n this.callbacks.onAction(action, i, 'start')\n\n try {\n await this.executeAction(action)\n } catch (err) {\n if (err instanceof Error && err.name === 'AbortError') {\n break\n }\n this.callbacks.onError(err as Error, action)\n // Continue to next action after error\n }\n\n this.callbacks.onAction(action, i, 'complete')\n }\n\n if (this.isRunning) {\n this.callbacks.onComplete()\n }\n } finally {\n this.isRunning = false\n this.abortController = null\n }\n }\n\n stop(): void {\n if (!this.isRunning) return\n\n this.isRunning = false\n this.abortController?.abort()\n\n // Cancel all animations\n this.cursor.cancelAnimations()\n this.annotations.cancelAllAnimations()\n\n this.callbacks.onStop()\n }\n\n private async executeAction(action: Action): Promise<void> {\n switch (action.type) {\n case 'move':\n await this.executeMove(action)\n break\n case 'click':\n await this.executeClick(action)\n break\n case 'wait':\n await this.executeWait(action)\n break\n case 'setCursor':\n this.executeSetCursor(action)\n break\n case 'showAnnotations':\n this.executeShowAnnotations(action)\n break\n case 'hideAnnotations':\n this.executeHideAnnotations(action)\n break\n default:\n console.warn('[Overlay] Unknown action type:', (action as Action).type)\n }\n }\n\n private async executeMove(action: MoveAction): Promise<void> {\n await this.cursor.moveTo(action.target, { duration: action.duration })\n\n // Simple mode: show annotations on arrival\n if (action.showAnnotations) {\n this.annotations.show(action.showAnnotations)\n }\n }\n\n private async executeClick(action: ClickAction): Promise<void> {\n await this.cursor.click(action.target)\n }\n\n private async executeWait(action: WaitAction): Promise<void> {\n await delay(action.duration)\n }\n\n private executeSetCursor(action: SetCursorAction): void {\n if (action.visible !== undefined) {\n if (action.visible) this.cursor.show()\n else this.cursor.hide()\n }\n if (action.name) this.cursor.setName(action.name)\n if (action.color) this.cursor.setColor(action.color)\n }\n\n private executeShowAnnotations(action: ShowAnnotationsAction): void {\n this.annotations.show(action.annotations)\n }\n\n private executeHideAnnotations(action: HideAnnotationsAction): void {\n if (action.ids) {\n this.annotations.hide(action.ids)\n } else {\n this.annotations.hideAll()\n }\n }\n\n destroy(): void {\n this.stop()\n }\n}\n","import { AnnotationManager } from './AnnotationManager'\nimport { Cursor } from './Cursor'\nimport { OVERLAY_STYLES } from './styles'\nimport { Timeline } from './Timeline'\nimport type {\n Action,\n AnnotationsController,\n CursorController,\n OverlayController,\n OverlayError,\n OverlayEventType,\n OverlayOptions,\n OverlayScript,\n ValidationResult,\n} from './types'\n\nconst DEFAULT_CURSOR_COLOR = '#3B82F6'\nconst DEFAULT_ANNOTATION_COLOR = '#EF4444'\nconst DEFAULT_Z_INDEX = 9999\n\ntype EventHandler =\n | (() => void)\n | ((error: OverlayError) => void)\n | ((action: Action, index: number, phase: 'start' | 'complete') => void)\n\nexport class Overlay implements OverlayController {\n private root: HTMLElement\n private shadow: ShadowRoot\n private container: HTMLElement\n private svgContainer: SVGSVGElement\n private domContainer: HTMLElement\n\n private _cursor: Cursor\n private _annotations: AnnotationManager\n private timeline: Timeline\n\n private reducedMotion: boolean\n private motionQuery: MediaQueryList\n\n private eventHandlers = new Map<OverlayEventType, Set<EventHandler>>()\n private _isDestroyed = false\n\n constructor(options: OverlayOptions = {}) {\n const parentContainer = options.container ?? document.body\n const zIndex = options.zIndex ?? DEFAULT_Z_INDEX\n\n // Check for reduced motion preference\n this.motionQuery = window.matchMedia('(prefers-reduced-motion: reduce)')\n this.reducedMotion = this.motionQuery.matches\n this.motionQuery.addEventListener('change', this.handleMotionChange)\n\n // Create root element\n this.root = document.createElement('div')\n this.root.id = 'ourroadmaps-overlay'\n\n // Create shadow DOM\n this.shadow = this.root.attachShadow({ mode: 'open' })\n\n // Add styles\n const styleEl = document.createElement('style')\n styleEl.textContent = OVERLAY_STYLES\n this.shadow.appendChild(styleEl)\n\n // Create container structure\n this.container = document.createElement('div')\n this.container.className = 'overlay-container'\n this.container.style.setProperty('--overlay-z-index', String(zIndex))\n this.shadow.appendChild(this.container)\n\n // Create SVG layer for arrows\n this.svgContainer = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n this.svgContainer.setAttribute('class', 'annotations-svg')\n this.container.appendChild(this.svgContainer)\n\n // Create DOM layer for other annotations\n this.domContainer = document.createElement('div')\n this.domContainer.className = 'annotations-dom'\n this.container.appendChild(this.domContainer)\n\n // Initialize cursor\n const cursorConfig = {\n name: options.cursor?.name ?? 'Guide',\n color: options.cursor?.color ?? DEFAULT_CURSOR_COLOR,\n visible: options.cursor?.visible ?? true,\n }\n\n this._cursor = new Cursor(this.container, this.reducedMotion)\n this._cursor.setName(cursorConfig.name)\n this._cursor.setColor(cursorConfig.color)\n if (!cursorConfig.visible) this._cursor.hide()\n\n // Initialize annotation manager\n const annotationsConfig = {\n color: options.annotations?.color ?? DEFAULT_ANNOTATION_COLOR,\n strokeWidth: options.annotations?.strokeWidth ?? 3,\n }\n\n this._annotations = new AnnotationManager(\n annotationsConfig,\n this.domContainer,\n this.svgContainer,\n this.reducedMotion,\n () => this._cursor.position,\n )\n\n // Initialize timeline\n this.timeline = new Timeline(this._cursor, this._annotations, {\n onStart: () => this.emit('start'),\n onComplete: () => this.emit('complete'),\n onStop: () => this.emit('stop'),\n onError: (error, action) => {\n this.emit('error', {\n code: 'ANIMATION_FAILED',\n message: error.message,\n action,\n })\n },\n onAction: (action, index, phase) => this.emit('action', action, index, phase),\n })\n\n // Mount to DOM\n parentContainer.appendChild(this.root)\n }\n\n // Note: Reduced motion preference is checked at construction time for cursor/annotations.\n // This handler updates our flag but doesn't propagate to already-constructed components.\n // This is acceptable since reduced motion is typically set before page interaction.\n private handleMotionChange = (e: MediaQueryListEvent): void => {\n this.reducedMotion = e.matches\n }\n\n // Controller interface\n get cursor(): CursorController {\n return this._cursor\n }\n\n get annotations(): AnnotationsController {\n return this._annotations\n }\n\n get isPlaying(): boolean {\n return this.timeline.running\n }\n\n get currentActionIndex(): number | null {\n return this.timeline.actionIndex\n }\n\n get isDestroyed(): boolean {\n return this._isDestroyed\n }\n\n private static readonly VALID_ACTION_TYPES = [\n 'move',\n 'click',\n 'wait',\n 'setCursor',\n 'showAnnotations',\n 'hideAnnotations',\n ]\n\n private validateAction(action: unknown, index: number): string[] {\n const errors: string[] = []\n\n if (!action || typeof action !== 'object') {\n errors.push(`Action ${index} must be an object`)\n return errors\n }\n\n const a = action as Record<string, unknown>\n\n if (!Overlay.VALID_ACTION_TYPES.includes(a.type as string)) {\n errors.push(`Action ${index} has invalid type: ${a.type}`)\n }\n\n if (a.type === 'wait' && typeof a.duration !== 'number') {\n errors.push(`Wait action ${index} must have a numeric duration`)\n }\n\n if (a.type === 'move' && !a.target) {\n errors.push(`Move action ${index} must have a target`)\n }\n\n return errors\n }\n\n validate(script: unknown): ValidationResult {\n const errors: string[] = []\n const warnings: string[] = []\n\n if (!script || typeof script !== 'object') {\n errors.push('Script must be an object')\n return { valid: false, errors, warnings }\n }\n\n const s = script as Record<string, unknown>\n\n if (s.version !== 1) {\n errors.push('Script version must be 1')\n }\n\n if (!Array.isArray(s.actions)) {\n errors.push('Script must have an actions array')\n } else {\n for (let i = 0; i < s.actions.length; i++) {\n errors.push(...this.validateAction(s.actions[i], i))\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n }\n\n async play(script: OverlayScript): Promise<void> {\n if (this._isDestroyed) {\n throw new Error('Overlay has been destroyed')\n }\n\n const validation = this.validate(script)\n if (!validation.valid) {\n throw new Error(`Invalid script: ${validation.errors.join(', ')}`)\n }\n\n await this.timeline.play(script)\n }\n\n stop(): void {\n this.timeline.stop()\n }\n\n on(event: 'start', handler: () => void): () => void\n on(event: 'complete', handler: () => void): () => void\n on(event: 'stop', handler: () => void): () => void\n on(event: 'error', handler: (error: OverlayError) => void): () => void\n on(\n event: 'action',\n handler: (action: Action, index: number, phase: 'start' | 'complete') => void,\n ): () => void\n on(event: OverlayEventType, handler: EventHandler): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler)\n\n return () => {\n this.eventHandlers.get(event)?.delete(handler)\n }\n }\n\n private emit(event: 'start' | 'complete' | 'stop'): void\n private emit(event: 'error', error: OverlayError): void\n private emit(event: 'action', action: Action, index: number, phase: 'start' | 'complete'): void\n private emit(event: OverlayEventType, ...args: unknown[]): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n for (const handler of handlers) {\n try {\n // biome-ignore lint/suspicious/noExplicitAny: Event handler args vary by event type\n ;(handler as any)(...args)\n } catch (err) {\n console.error(`[Overlay] Error in ${event} handler:`, err)\n }\n }\n }\n }\n\n destroy(): void {\n if (this._isDestroyed) return\n\n this._isDestroyed = true\n\n // Stop any running playback\n this.timeline.destroy()\n\n // Clean up components\n this._cursor.destroy()\n this._annotations.destroy()\n\n // Clean up motion listener\n this.motionQuery.removeEventListener('change', this.handleMotionChange)\n\n // Clear event handlers\n this.eventHandlers.clear()\n\n // Remove from DOM\n this.root.remove()\n }\n}\n","import { Overlay } from './Overlay'\nimport type { OverlayController, OverlayOptions } from './types'\n\nexport { Overlay }\n\nexport function createOverlay(options?: OverlayOptions): OverlayController {\n return new Overlay(options)\n}\n\n// Re-export types\nexport type {\n Action,\n Anchor,\n Annotation,\n AnnotationBase,\n AnnotationsConfig,\n AnnotationsController,\n ArrowAnnotation,\n BadgeAnnotation,\n BoxAnnotation,\n CircleAnnotation,\n ClickAction,\n Coordinates,\n CursorConfig,\n CursorController,\n CursorTarget,\n HideAnnotationsAction,\n LabelAnnotation,\n LabelPosition,\n MoveAction,\n OverlayController,\n OverlayError,\n OverlayOptions,\n OverlayScript,\n OverlayScriptV1,\n SelectorTarget,\n SetCursorAction,\n ShowAnnotationsAction,\n Target,\n ValidationResult,\n WaitAction,\n} from './types'\n"]}
|