@launchsecure/launch-beacon 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +148 -0
- package/dist/beacon.es.js +722 -0
- package/dist/beacon.es.js.map +1 -0
- package/dist/beacon.umd.js +75 -0
- package/dist/beacon.umd.js.map +1 -0
- package/dist/capture/element.d.ts +3 -0
- package/dist/capture/element.d.ts.map +1 -0
- package/dist/capture/framework.d.ts +3 -0
- package/dist/capture/framework.d.ts.map +1 -0
- package/dist/capture/metadata.d.ts +3 -0
- package/dist/capture/metadata.d.ts.map +1 -0
- package/dist/capture/overlay.d.ts +7 -0
- package/dist/capture/overlay.d.ts.map +1 -0
- package/dist/capture/picker.d.ts +10 -0
- package/dist/capture/picker.d.ts.map +1 -0
- package/dist/capture/screenshot.d.ts +7 -0
- package/dist/capture/screenshot.d.ts.map +1 -0
- package/dist/capture/selector.d.ts +2 -0
- package/dist/capture/selector.d.ts.map +1 -0
- package/dist/element.d.ts +29 -0
- package/dist/element.d.ts.map +1 -0
- package/dist/index-DAIDnjfR.js +513 -0
- package/dist/index-DAIDnjfR.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/transport/submit.d.ts +3 -0
- package/dist/transport/submit.d.ts.map +1 -0
- package/dist/types.d.ts +88 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/ui/button.d.ts +2 -0
- package/dist/ui/button.d.ts.map +1 -0
- package/dist/ui/drawer.d.ts +29 -0
- package/dist/ui/drawer.d.ts.map +1 -0
- package/dist/ui/icons.d.ts +9 -0
- package/dist/ui/icons.d.ts.map +1 -0
- package/dist/ui/pin-popover.d.ts +13 -0
- package/dist/ui/pin-popover.d.ts.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"beacon.umd.js","sources":["../src/ui/icons.ts","../src/ui/button.ts","../src/ui/drawer.ts","../src/ui/pin-popover.ts","../src/capture/picker.ts","../src/capture/selector.ts","../src/capture/framework.ts","../src/capture/element.ts","../src/capture/metadata.ts","../src/capture/screenshot.ts","../src/capture/overlay.ts","../src/transport/submit.ts","../src/element.ts","../src/index.ts","../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/util.js","../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/clone-pseudos.js","../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/mimes.js","../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/dataurl.js","../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/clone-node.js","../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/embed-resources.js","../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/embed-images.js","../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/apply-style.js","../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/embed-webfonts.js","../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/index.js"],"sourcesContent":["// Inline SVGs to avoid an icon library dep. Returns innerHTML strings (caller assigns).\n\nexport const ICONS = {\n feedback: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg>`,\n pin: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 17v5\"/><path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\"/></svg>`,\n close: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>`,\n trash: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 6h18\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"/><path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></svg>`,\n send: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m22 2-7 20-4-9-9-4Z\"/><path d=\"M22 2 11 13\"/></svg>`,\n check: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n} as const;\n","// Default floating trigger button. Rendered into the Shadow DOM unless a slot=\"trigger\"\n// child is provided by the consumer.\n\nimport { ICONS } from './icons';\n\nexport function createTriggerButton(label = 'Feedback'): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'beacon-default-trigger';\n btn.setAttribute('aria-label', label);\n btn.innerHTML = `${ICONS.feedback}<span>${label}</span>`;\n return btn;\n}\n","// The form drawer: description textarea + severity picker + pin list + actions.\n// Built imperatively (no JSX). The element class is the controller; this module\n// handles markup + small DOM helpers.\n\nimport { ICONS } from './icons';\nimport type { Pin, Severity } from '../types';\n\nconst DEFAULT_SEVERITIES: Severity[] = ['bug', 'idea', 'ux', 'a11y'];\n\nexport interface DrawerCallbacks {\n onClose: () => void;\n onAnnotate: () => void;\n onSubmit: () => void;\n onPinNoteChange: (pinNumber: number, note: string) => void;\n onPinDelete: (pinNumber: number) => void;\n onDescriptionChange: (value: string) => void;\n onSeverityChange: (sev: Severity) => void;\n}\n\nexport class DrawerView {\n readonly root: HTMLDivElement;\n readonly bodyEl: HTMLDivElement;\n private severities: Severity[];\n private callbacks: DrawerCallbacks;\n private state = {\n description: '',\n severity: 'bug' as Severity,\n pins: [] as Pin[],\n annotatedScreenshot: undefined as string | undefined,\n submitting: false,\n status: '' as string,\n statusKind: '' as '' | 'error' | 'success',\n };\n\n constructor(severities: Severity[], callbacks: DrawerCallbacks) {\n this.severities = severities.length > 0 ? severities : DEFAULT_SEVERITIES;\n this.callbacks = callbacks;\n this.root = document.createElement('div');\n this.root.className = 'beacon-drawer';\n this.root.innerHTML = `\n <div class=\"beacon-drawer-header\">\n <div class=\"beacon-drawer-title\">Send feedback</div>\n <button type=\"button\" class=\"beacon-icon-btn\" data-action=\"close\" aria-label=\"Close\">${ICONS.close}</button>\n </div>\n <div class=\"beacon-drawer-body\"></div>\n `;\n this.bodyEl = this.root.querySelector('.beacon-drawer-body') as HTMLDivElement;\n this.root.querySelector('[data-action=\"close\"]')!.addEventListener('click', () => this.callbacks.onClose());\n this.render();\n }\n\n open() {\n this.root.classList.remove('minimized');\n this.root.classList.add('open');\n }\n\n close() {\n this.root.classList.remove('open');\n }\n\n minimize() {\n this.root.classList.add('minimized');\n this.root.classList.remove('open');\n }\n\n setPins(pins: Pin[], annotatedScreenshot?: string) {\n this.state.pins = pins;\n if (annotatedScreenshot !== undefined) this.state.annotatedScreenshot = annotatedScreenshot;\n this.render();\n }\n\n setSubmitting(submitting: boolean) {\n this.state.submitting = submitting;\n this.render();\n }\n\n setStatus(status: string, kind: '' | 'error' | 'success' = '') {\n this.state.status = status;\n this.state.statusKind = kind;\n this.render();\n }\n\n reset() {\n this.state = {\n description: '',\n severity: 'bug',\n pins: [],\n annotatedScreenshot: undefined,\n submitting: false,\n status: '',\n statusKind: '',\n };\n this.render();\n }\n\n getDescription() { return this.state.description; }\n getSeverity() { return this.state.severity; }\n\n private render() {\n const canSubmit = this.state.description.trim().length > 0 && !this.state.submitting;\n\n this.bodyEl.innerHTML = `\n <div class=\"beacon-field\">\n <label class=\"beacon-label\" for=\"beacon-desc\">What's the issue?</label>\n <textarea id=\"beacon-desc\" class=\"beacon-textarea\" placeholder=\"Describe what you saw, what you expected, anything that helps reproduce…\">${escapeHtml(this.state.description)}</textarea>\n </div>\n\n <div class=\"beacon-field\">\n <span class=\"beacon-label\">Severity</span>\n <div class=\"beacon-severity\" role=\"radiogroup\">\n ${this.severities.map((sev) => `\n <label class=\"beacon-severity-opt ${sev === this.state.severity ? 'selected' : ''}\" data-sev=\"${sev}\">\n <input type=\"radio\" name=\"beacon-severity\" value=\"${sev}\" ${sev === this.state.severity ? 'checked' : ''}>\n ${sev}\n </label>\n `).join('')}\n </div>\n </div>\n\n ${this.state.annotatedScreenshot ? `\n <div class=\"beacon-field\">\n <span class=\"beacon-label\">Annotated screenshot</span>\n <img src=\"${this.state.annotatedScreenshot}\" class=\"beacon-thumb\" alt=\"Annotated screenshot preview\">\n </div>\n ` : ''}\n\n ${this.state.pins.length > 0 ? `\n <div class=\"beacon-field\">\n <span class=\"beacon-label\">Pins (${this.state.pins.length})</span>\n <div class=\"beacon-pin-list\">\n ${this.state.pins.map((p) => `\n <div class=\"beacon-pin-item\" data-pin=\"${p.number}\">\n <span class=\"beacon-pin-num\">${p.number}</span>\n <div class=\"beacon-pin-meta\">\n <div class=\"beacon-pin-selector\" title=\"${escapeHtml(p.selector)}\">${escapeHtml(p.selector)}</div>\n <input type=\"text\" class=\"beacon-pin-note-input\" placeholder=\"Add a note (optional)\" value=\"${escapeHtml(p.note ?? '')}\">\n </div>\n <button type=\"button\" class=\"beacon-icon-btn\" data-pin-delete=\"${p.number}\" aria-label=\"Remove pin ${p.number}\">${ICONS.trash}</button>\n </div>\n `).join('')}\n </div>\n </div>\n ` : ''}\n\n <div class=\"beacon-actions\">\n <button type=\"button\" class=\"beacon-btn secondary\" data-action=\"annotate\" ${this.state.submitting ? 'disabled' : ''}>\n ${ICONS.pin} ${this.state.pins.length > 0 ? 'Add another pin' : 'Annotate elements'}\n </button>\n <span style=\"flex:1\"></span>\n <button type=\"button\" class=\"beacon-btn primary\" data-action=\"submit\" ${canSubmit ? '' : 'disabled'}>\n ${ICONS.send} ${this.state.submitting ? 'Sending…' : 'Send'}\n </button>\n </div>\n\n ${this.state.status ? `<div class=\"beacon-status ${this.state.statusKind}\">${escapeHtml(this.state.status)}</div>` : ''}\n `;\n\n // Wire events.\n const desc = this.bodyEl.querySelector('#beacon-desc') as HTMLTextAreaElement;\n desc.addEventListener('input', () => {\n this.state.description = desc.value;\n this.callbacks.onDescriptionChange(desc.value);\n // Re-render only the submit button's disabled state — full re-render kills focus, so skip it here.\n const submitBtn = this.bodyEl.querySelector('[data-action=\"submit\"]') as HTMLButtonElement | null;\n if (submitBtn) {\n submitBtn.disabled = !(desc.value.trim().length > 0) || this.state.submitting;\n }\n });\n\n this.bodyEl.querySelectorAll<HTMLInputElement>('input[name=\"beacon-severity\"]').forEach((input) => {\n input.addEventListener('change', () => {\n if (input.checked) {\n this.state.severity = input.value as Severity;\n this.callbacks.onSeverityChange(this.state.severity);\n this.render();\n }\n });\n });\n\n this.bodyEl.querySelector('[data-action=\"annotate\"]')?.addEventListener('click', () => this.callbacks.onAnnotate());\n this.bodyEl.querySelector('[data-action=\"submit\"]')?.addEventListener('click', () => this.callbacks.onSubmit());\n\n this.bodyEl.querySelectorAll<HTMLButtonElement>('[data-pin-delete]').forEach((btn) => {\n btn.addEventListener('click', () => {\n const num = Number(btn.getAttribute('data-pin-delete'));\n this.callbacks.onPinDelete(num);\n });\n });\n\n this.bodyEl.querySelectorAll<HTMLInputElement>('.beacon-pin-note-input').forEach((input) => {\n const item = input.closest('[data-pin]');\n const num = Number(item?.getAttribute('data-pin') ?? 0);\n input.addEventListener('input', () => this.callbacks.onPinNoteChange(num, input.value));\n });\n }\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n","// Small contextual popover that opens next to a picked element so the user can\n// optionally type a note. \"Save\" attaches the note to the pin; \"Skip\" creates the\n// pin with no note.\n\nimport { ICONS } from './icons';\n\nexport interface PinPopoverResult {\n note?: string;\n cancelled: boolean;\n}\n\nexport function showPinPopover(opts: {\n shadowRoot: ShadowRoot;\n anchor: { x: number; y: number }; // viewport coords\n pinNumber: number;\n}): Promise<PinPopoverResult> {\n return new Promise((resolve) => {\n const popover = document.createElement('div');\n popover.className = 'beacon-pin-popover open';\n popover.innerHTML = `\n <div style=\"display:flex;align-items:center;gap:6px;font-weight:600;font-size:13px;\">\n <span class=\"beacon-pin-num\">${opts.pinNumber}</span>\n <span>Note for this pin</span>\n </div>\n <textarea class=\"beacon-textarea\" rows=\"2\" placeholder=\"Optional — describe what's wrong here…\" style=\"min-height:48px;\"></textarea>\n <div class=\"beacon-pin-popover-actions\">\n <button type=\"button\" class=\"beacon-btn secondary\" data-action=\"skip\">Skip</button>\n <button type=\"button\" class=\"beacon-btn primary\" data-action=\"save\">${ICONS.check} Save</button>\n </div>\n `;\n\n // Position below the picked point, clamped to viewport.\n const POPOVER_W = 240;\n const POPOVER_H = 160;\n const left = Math.min(Math.max(8, opts.anchor.x), window.innerWidth - POPOVER_W - 8);\n const top = Math.min(Math.max(8, opts.anchor.y + 12), window.innerHeight - POPOVER_H - 8);\n popover.style.left = `${left}px`;\n popover.style.top = `${top}px`;\n\n opts.shadowRoot.appendChild(popover);\n\n const textarea = popover.querySelector('textarea')!;\n textarea.focus();\n\n function close(result: PinPopoverResult) {\n popover.remove();\n resolve(result);\n }\n\n popover.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const action = target.closest('[data-action]')?.getAttribute('data-action');\n if (action === 'skip') close({ cancelled: false });\n if (action === 'save') {\n const note = textarea.value.trim();\n close({ ...(note ? { note } : {}), cancelled: false });\n }\n });\n\n textarea.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n const note = textarea.value.trim();\n close({ ...(note ? { note } : {}), cancelled: false });\n }\n if (e.key === 'Escape') {\n close({ cancelled: true });\n }\n });\n });\n}\n","// Hover/click element picker. Draws an outline overlay over the hovered element\n// and resolves with the clicked element. Skips the widget's own elements via\n// composedPath check against the provided shadow root.\n\nexport interface PickerOptions {\n shadowRoot: ShadowRoot;\n onHover?: (el: Element | null) => void;\n}\n\nexport interface PickerHandle {\n cancel: () => void;\n promise: Promise<Element | null>; // resolves with picked element, or null on Escape\n}\n\nexport function startPicker(opts: PickerOptions): PickerHandle {\n const { shadowRoot, onHover } = opts;\n\n // Outline overlay — appended to body, position: fixed, pointer-events: none.\n const outline = document.createElement('div');\n outline.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n 'z-index: 2147483646',\n 'border: 2px solid #0ea5e9',\n 'background: rgba(14, 165, 233, 0.08)',\n 'transition: all 60ms ease-out',\n 'box-sizing: border-box',\n 'border-radius: 2px',\n ].join('; ');\n document.body.appendChild(outline);\n\n const tooltip = document.createElement('div');\n tooltip.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n 'z-index: 2147483647',\n 'background: #0f172a',\n 'color: #fff',\n 'font: 11px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace',\n 'padding: 3px 6px',\n 'border-radius: 3px',\n 'max-width: 280px',\n 'overflow: hidden',\n 'text-overflow: ellipsis',\n 'white-space: nowrap',\n ].join('; ');\n document.body.appendChild(tooltip);\n\n const previousCursor = document.body.style.cursor;\n document.body.style.cursor = 'crosshair';\n\n let resolved = false;\n let resolvePromise: (v: Element | null) => void = () => {};\n const promise = new Promise<Element | null>((res) => { resolvePromise = res; });\n\n function isWidgetElement(el: EventTarget | null): boolean {\n if (!el || !(el instanceof Node)) return false;\n // composedPath gives us shadow boundaries.\n let node: Node | null = el;\n while (node) {\n if (node === shadowRoot || node === shadowRoot.host) return true;\n node = node.parentNode ?? (node as ShadowRoot).host ?? null;\n }\n return false;\n }\n\n function findTarget(x: number, y: number): Element | null {\n // Hide overlay so it doesn't appear in elementsFromPoint, then use elementsFromPoint\n // and pick the first non-widget element.\n outline.style.display = 'none';\n tooltip.style.display = 'none';\n const candidates = document.elementsFromPoint(x, y);\n outline.style.display = 'block';\n tooltip.style.display = 'block';\n for (const c of candidates) {\n if (!isWidgetElement(c)) return c;\n }\n return null;\n }\n\n function positionOutline(el: Element) {\n const rect = el.getBoundingClientRect();\n outline.style.left = `${rect.left}px`;\n outline.style.top = `${rect.top}px`;\n outline.style.width = `${rect.width}px`;\n outline.style.height = `${rect.height}px`;\n\n const tag = el.tagName.toLowerCase();\n const cls = el.classList.length > 0 ? '.' + Array.from(el.classList).slice(0, 2).join('.') : '';\n tooltip.textContent = tag + cls;\n // Place tooltip just above the element, or below if it would clip the top.\n const above = rect.top - 22;\n tooltip.style.left = `${rect.left}px`;\n tooltip.style.top = `${above >= 0 ? above : rect.bottom + 4}px`;\n }\n\n function handleMove(e: MouseEvent) {\n const el = findTarget(e.clientX, e.clientY);\n if (el) {\n positionOutline(el);\n onHover?.(el);\n } else {\n outline.style.display = 'none';\n tooltip.style.display = 'none';\n onHover?.(null);\n }\n }\n\n function handleClick(e: MouseEvent) {\n e.preventDefault();\n e.stopPropagation();\n const el = findTarget(e.clientX, e.clientY);\n if (el) finish(el);\n }\n\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n finish(null);\n }\n }\n\n function finish(el: Element | null) {\n if (resolved) return;\n resolved = true;\n document.removeEventListener('mousemove', handleMove, true);\n document.removeEventListener('click', handleClick, true);\n document.removeEventListener('keydown', handleKey, true);\n outline.remove();\n tooltip.remove();\n document.body.style.cursor = previousCursor;\n resolvePromise(el);\n }\n\n document.addEventListener('mousemove', handleMove, true);\n document.addEventListener('click', handleClick, true);\n document.addEventListener('keydown', handleKey, true);\n\n return {\n cancel: () => finish(null),\n promise,\n };\n}\n","// Build a unique-ish CSS selector path for an element by walking up the parent chain.\n// Strategy per ancestor: id (if unique) → tag.classes (if unique among siblings) → tag:nth-of-type(n).\n// Stops at <body> or after a depth limit.\n\nconst MAX_DEPTH = 8;\n\nfunction isUniqueId(id: string, root: Document | ShadowRoot = document): boolean {\n if (!id) return false;\n try {\n return root.querySelectorAll(`#${CSS.escape(id)}`).length === 1;\n } catch {\n return false;\n }\n}\n\nfunction tagWithClasses(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const classes = Array.from(el.classList)\n // Drop classes that look like generated atomic / hashed names (heuristic — keep stable-looking ones).\n .filter((c) => c.length > 0 && c.length < 40)\n .slice(0, 3)\n .map((c) => `.${CSS.escape(c)}`)\n .join('');\n return tag + classes;\n}\n\nfunction nthOfTypeIndex(el: Element): number {\n const parent = el.parentElement;\n if (!parent) return 1;\n const sameTag = Array.from(parent.children).filter((c) => c.tagName === el.tagName);\n return sameTag.indexOf(el) + 1;\n}\n\nexport function buildSelector(target: Element): string {\n if (!target || target.nodeType !== Node.ELEMENT_NODE) return '';\n\n // Fast path: unique id on the target itself.\n if (target.id && isUniqueId(target.id)) {\n return `#${CSS.escape(target.id)}`;\n }\n\n const parts: string[] = [];\n let el: Element | null = target;\n let depth = 0;\n\n while (el && el.tagName.toLowerCase() !== 'body' && depth < MAX_DEPTH) {\n const current: Element = el;\n\n if (current.id && isUniqueId(current.id)) {\n parts.unshift(`#${CSS.escape(current.id)}`);\n break;\n }\n\n const base = tagWithClasses(current);\n const parent: HTMLElement | null = current.parentElement;\n\n // If this base matches multiple siblings, disambiguate with :nth-of-type.\n let part = base;\n if (parent) {\n try {\n const currentClasses = Array.from(current.classList).join(' ');\n const siblings: Element[] = Array.from(parent.children).filter(\n (c: Element) => c.tagName === current.tagName && Array.from(c.classList).join(' ') === currentClasses,\n );\n if (siblings.length > 1) {\n part = `${current.tagName.toLowerCase()}:nth-of-type(${nthOfTypeIndex(current)})`;\n }\n } catch {\n // ignore — fall back to base\n }\n }\n\n parts.unshift(part);\n el = parent;\n depth++;\n }\n\n return parts.join(' > ');\n}\n","// Best-effort framework component name detection.\n// Production builds usually minify component names — return null quietly when unavailable.\n\nimport type { Pin } from '../types';\n\ntype FW = NonNullable<Pin['framework']>;\n\nfunction detectReact(el: Element): FW | null {\n // React stores fiber refs on properties like __reactFiber$<hash> / __reactInternalInstance$<hash>.\n const keys = Object.keys(el).filter((k) => k.startsWith('__reactFiber$') || k.startsWith('__reactInternalInstance$'));\n if (keys.length === 0) return null;\n\n let fiber: unknown = (el as unknown as Record<string, unknown>)[keys[0]!];\n // Walk up the fiber chain to find the nearest function/class component (skip host elements).\n for (let i = 0; i < 10 && fiber; i++) {\n const f = fiber as { type?: unknown; return?: unknown };\n const type = f.type;\n if (typeof type === 'function') {\n const name = (type as { displayName?: string; name?: string }).displayName ?? (type as { name?: string }).name;\n if (name && name !== '_default') return { lib: 'react', name };\n }\n if (typeof type === 'object' && type !== null) {\n const name = (type as { displayName?: string; name?: string }).displayName ?? (type as { name?: string }).name;\n if (name) return { lib: 'react', name };\n }\n fiber = f.return;\n }\n return { lib: 'react' };\n}\n\nfunction detectVue(el: Element): FW | null {\n const anyEl = el as unknown as Record<string, unknown>;\n const vueParent = anyEl.__vueParentComponent as { type?: { name?: string; __name?: string } } | undefined;\n if (vueParent) {\n const name = vueParent.type?.name ?? vueParent.type?.__name;\n return { lib: 'vue', ...(name ? { name } : {}) };\n }\n if (anyEl.__vue__) return { lib: 'vue' };\n return null;\n}\n\nfunction detectAngular(el: Element): FW | null {\n // Angular dev mode exposes window.ng.getComponent(el).\n const ng = (window as unknown as { ng?: { getComponent?: (el: Element) => unknown } }).ng;\n if (!ng?.getComponent) return null;\n try {\n const cmp = ng.getComponent(el);\n if (!cmp) return null;\n const ctor = (cmp as { constructor?: { name?: string } }).constructor;\n return { lib: 'angular', ...(ctor?.name ? { name: ctor.name } : {}) };\n } catch {\n return null;\n }\n}\n\nfunction detectSvelte(el: Element): FW | null {\n // Svelte exposes very little at runtime. Look for $$ properties on the host.\n const anyEl = el as unknown as Record<string, unknown>;\n if ('__svelte_meta' in anyEl) return { lib: 'svelte' };\n return null;\n}\n\nexport function detectFramework(el: Element): Pin['framework'] | undefined {\n const result = detectReact(el) ?? detectVue(el) ?? detectAngular(el) ?? detectSvelte(el);\n return result ?? undefined;\n}\n","// Capture per-pin element data: outerHTML (truncated), selector, computed styles, bounding rect, framework hint.\n\nimport type { RawPinCapture } from '../types';\nimport { buildSelector } from './selector';\nimport { detectFramework } from './framework';\n\nconst OUTER_HTML_LIMIT = 5000;\nconst PARENT_OUTER_HTML_LIMIT = 1000;\n\n// A focused, useful subset of computed style properties. Dumping all 400+ resolved\n// properties is noise; this list covers layout, typography, color, and key visual hints.\nconst USEFUL_STYLE_PROPS = [\n 'display', 'position', 'top', 'right', 'bottom', 'left',\n 'width', 'height', 'min-width', 'min-height', 'max-width', 'max-height',\n 'margin', 'padding',\n 'font-family', 'font-size', 'font-weight', 'line-height', 'text-align',\n 'color', 'background-color', 'background-image',\n 'border', 'border-radius',\n 'opacity', 'visibility', 'overflow',\n 'z-index', 'transform', 'transition',\n 'flex', 'flex-direction', 'justify-content', 'align-items', 'gap',\n 'grid-template-columns', 'grid-template-rows',\n] as const;\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max) + `\\n\\n/* … truncated, original was ${s.length} chars */`;\n}\n\nfunction pickStyles(el: Element): Record<string, string> {\n const computed = getComputedStyle(el);\n const out: Record<string, string> = {};\n for (const prop of USEFUL_STYLE_PROPS) {\n const value = computed.getPropertyValue(prop);\n if (value && value !== 'normal' && value !== 'none' && value !== 'auto' && value !== '0px') {\n out[prop] = value.trim();\n }\n }\n return out;\n}\n\nexport function capturePin(el: Element): RawPinCapture {\n const rect = el.getBoundingClientRect();\n return {\n selector: buildSelector(el),\n tagName: el.tagName.toLowerCase(),\n id: el.id || null,\n classList: Array.from(el.classList),\n outerHTML: truncate(el.outerHTML, OUTER_HTML_LIMIT),\n ...(el.parentElement\n ? { parentOuterHTML: truncate(el.parentElement.outerHTML, PARENT_OUTER_HTML_LIMIT) }\n : {}),\n computedStyles: pickStyles(el),\n boundingRect: {\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 ...(detectFramework(el) ? { framework: detectFramework(el)! } : {}),\n };\n}\n","// Capture browser / viewport / locale metadata. Pure read-only — no instrumentation.\n\nimport type { Metadata } from '../types';\n\ninterface UADataLike {\n brands: Array<{ brand: string; version: string }>;\n mobile: boolean;\n platform: string;\n}\n\nfunction getUaData(): Metadata['uaData'] {\n const nav = navigator as Navigator & { userAgentData?: UADataLike };\n if (!nav.userAgentData) return undefined;\n // Pick the first non-\"Not.A/Brand\" brand for legibility.\n const brand = nav.userAgentData.brands.find((b) => !/Not[.\\-]?A.?Brand/i.test(b.brand))?.brand\n ?? nav.userAgentData.brands[0]?.brand\n ?? 'unknown';\n return {\n brand,\n mobile: nav.userAgentData.mobile,\n platform: nav.userAgentData.platform,\n };\n}\n\nfunction getTheme(): Metadata['theme'] {\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) return 'dark';\n if (window.matchMedia('(prefers-color-scheme: light)').matches) return 'light';\n return undefined;\n}\n\nexport function captureMetadata(): Metadata {\n return {\n url: window.location.href,\n ...(document.referrer ? { referrer: document.referrer } : {}),\n userAgent: navigator.userAgent,\n ...(getUaData() ? { uaData: getUaData()! } : {}),\n viewport: {\n w: window.innerWidth,\n h: window.innerHeight,\n dpr: window.devicePixelRatio || 1,\n },\n screen: {\n w: window.screen.width,\n h: window.screen.height,\n },\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n locale: navigator.language,\n ...(getTheme() ? { theme: getTheme()! } : {}),\n capturedAt: new Date().toISOString(),\n };\n}\n","// Lazy-loaded screenshot capture via html-to-image.\n// Captures the viewport (document.documentElement) as a JPEG data URL.\n\nlet htmlToImage: typeof import('html-to-image') | null = null;\n\nasync function load() {\n if (!htmlToImage) {\n htmlToImage = await import('html-to-image');\n }\n return htmlToImage;\n}\n\nexport interface ScreenshotOptions {\n quality?: number; // 0..1, default 0.7\n pixelRatio?: number; // default min(devicePixelRatio, 2) — capping to keep file size sane\n excludeShadowRoot?: ShadowRoot; // skip our own widget elements\n}\n\nexport async function captureScreenshot(opts: ScreenshotOptions = {}): Promise<string> {\n const { quality = 0.7, pixelRatio = Math.min(window.devicePixelRatio || 1, 2), excludeShadowRoot } = opts;\n const lib = await load();\n\n const filter = excludeShadowRoot\n ? (node: Node) => {\n // Skip the widget's host element.\n let cur: Node | null = node;\n while (cur) {\n if (cur === excludeShadowRoot.host) return false;\n cur = cur.parentNode;\n }\n return true;\n }\n : undefined;\n\n return lib.toJpeg(document.documentElement, {\n quality,\n pixelRatio,\n cacheBust: true,\n ...(filter ? { filter } : {}),\n // Cap dimensions to viewport so we don't accidentally capture full document height.\n width: window.innerWidth,\n height: window.innerHeight,\n style: {\n // Avoid scrolling artifacts.\n transform: 'none',\n },\n });\n}\n","// Draw numbered pin markers onto a screenshot. Takes the viewport screenshot data URL\n// and a list of pins (with bounding rects in viewport coords) and returns a new data URL\n// with circular numbered badges overlaid at each pin's position.\n\nimport type { Pin } from '../types';\n\nconst MARKER_RADIUS = 14;\nconst MARKER_FILL = '#0ea5e9';\nconst MARKER_STROKE = '#ffffff';\nconst MARKER_TEXT = '#ffffff';\n\nexport async function drawMarkers(\n screenshotDataUrl: string,\n pins: Pin[],\n viewportSize: { w: number; h: number; dpr: number },\n): Promise<string> {\n const img = await loadImage(screenshotDataUrl);\n\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2D canvas context');\n\n ctx.drawImage(img, 0, 0);\n\n // Map viewport coords → screenshot pixel coords using the ratio between image size\n // and the captured viewport dimensions.\n const scaleX = canvas.width / viewportSize.w;\n const scaleY = canvas.height / viewportSize.h;\n\n for (const pin of pins) {\n // Anchor the marker at the top-left of the element's rect, with a small inset.\n const cx = (pin.boundingRect.x + 8) * scaleX;\n const cy = (pin.boundingRect.y + 8) * scaleY;\n\n // Filled circle.\n ctx.beginPath();\n ctx.fillStyle = MARKER_FILL;\n ctx.arc(cx, cy, MARKER_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n // White outer stroke for contrast.\n ctx.lineWidth = 3;\n ctx.strokeStyle = MARKER_STROKE;\n ctx.stroke();\n\n // Number text.\n ctx.fillStyle = MARKER_TEXT;\n ctx.font = 'bold 16px system-ui, -apple-system, sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(String(pin.number), cx, cy + 1);\n }\n\n return canvas.toDataURL('image/jpeg', 0.85);\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = (err) => reject(err);\n img.src = src;\n });\n}\n","// POST the feedback payload to the configured endpoint.\n\nimport type { FeedbackPayload, SubmitResponse } from '../types';\n\nexport async function submitFeedback(\n endpoint: string,\n payload: FeedbackPayload,\n headers?: Record<string, string>,\n): Promise<SubmitResponse> {\n const res = await fetch(endpoint, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n ...(headers ?? {}),\n },\n body: JSON.stringify(payload),\n });\n\n let body: unknown = null;\n const contentType = res.headers.get('Content-Type') ?? '';\n if (contentType.includes('application/json')) {\n try {\n body = await res.json();\n } catch {\n body = null;\n }\n } else {\n try {\n body = await res.text();\n } catch {\n body = null;\n }\n }\n\n return {\n ok: res.ok,\n status: res.status,\n body,\n };\n}\n","// <launchkit-beacon> custom element. Orchestrates the capture pipeline + UI.\n\nimport stylesCss from './styles.css?inline';\n\nimport type { BeaconConfig, FeedbackPayload, Pin, RawPinCapture, Severity } from './types';\nimport { createTriggerButton } from './ui/button';\nimport { DrawerView } from './ui/drawer';\nimport { showPinPopover } from './ui/pin-popover';\nimport { startPicker } from './capture/picker';\nimport { capturePin } from './capture/element';\nimport { captureMetadata } from './capture/metadata';\nimport { captureScreenshot } from './capture/screenshot';\nimport { drawMarkers } from './capture/overlay';\nimport { submitFeedback } from './transport/submit';\n\nconst ATTRS = ['endpoint', 'position', 'theme', 'severities'] as const;\n\nexport class LaunchkitBeacon extends HTMLElement {\n static get observedAttributes() { return ATTRS as unknown as string[]; }\n\n private shadow!: ShadowRoot;\n private trigger?: HTMLElement;\n private drawer?: DrawerView;\n private slotEl?: HTMLSlotElement;\n\n private _config: BeaconConfig | null = null;\n private pins: Pin[] = [];\n private description = '';\n private severity: Severity = 'bug';\n\n /** Public — wrappers can set `widget.config = {...}` for dynamic endpoint/headers/context. */\n set config(value: BeaconConfig) {\n this._config = value;\n }\n get config(): BeaconConfig | null {\n if (this._config) return this._config;\n const endpoint = this.getAttribute('endpoint');\n return endpoint ? { endpoint } : null;\n }\n\n connectedCallback() {\n if (!this.shadow) {\n this.shadow = this.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = stylesCss;\n this.shadow.appendChild(style);\n\n // Slot for custom trigger override.\n this.slotEl = document.createElement('slot');\n this.slotEl.name = 'trigger';\n this.shadow.appendChild(this.slotEl);\n\n // Default trigger (shown unless slot is filled or position=\"hidden\").\n this.trigger = createTriggerButton();\n this.shadow.appendChild(this.trigger);\n this.trigger.addEventListener('click', () => this.open());\n\n // If consumer provided a slot=\"trigger\" child, hook clicks on it.\n this.slotEl.addEventListener('slotchange', () => {\n const assigned = this.slotEl!.assignedElements();\n if (assigned.length > 0) {\n // Hide the default; wire all assigned elements to open the drawer.\n if (this.trigger) (this.trigger as HTMLElement).style.display = 'none';\n assigned.forEach((el) => el.addEventListener('click', () => this.open()));\n }\n });\n\n this.drawer = new DrawerView(this.parseSeverities(), {\n onClose: () => this.close(),\n onAnnotate: () => this.startAnnotate(),\n onSubmit: () => this.handleSubmit(),\n onPinNoteChange: (n, note) => this.updatePinNote(n, note),\n onPinDelete: (n) => this.deletePin(n),\n onDescriptionChange: (v) => { this.description = v; },\n onSeverityChange: (s) => { this.severity = s; },\n });\n this.shadow.appendChild(this.drawer.root);\n }\n\n // Default attributes if not set.\n if (!this.hasAttribute('position')) this.setAttribute('position', 'bottom-right');\n if (!this.hasAttribute('theme')) this.setAttribute('theme', 'auto');\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, _newValue: string | null) {\n if (name === 'severities' && this.drawer) {\n // Re-create drawer with new severities. Keep current state.\n // Cheapest path: instruct drawer to refresh — but our drawer captures severities at construction.\n // Acceptable simplification: log a warning if attribute changes mid-life.\n // Production wrappers should set severities at construction via initial attribute.\n console.warn('[launchkit-beacon] severities attribute changed after mount; not yet hot-reloaded.');\n }\n }\n\n // ── Public API ──────────────────────────────────────────\n\n open() {\n if (!this.drawer) return;\n // Edge-aware positioning when consumer is using a slotted trigger\n // (typical pattern when position=\"hidden\" — e.g., the trigger lives in a header).\n // Otherwise fall back to CSS-driven default position (bottom-right / bottom-left).\n if (this.getAttribute('position') === 'hidden') {\n const triggerEl = this.slotEl?.assignedElements()[0] as HTMLElement | undefined;\n if (triggerEl) {\n positionDrawerRelativeTo(this.drawer.root, triggerEl);\n }\n }\n this.drawer.open();\n }\n\n close() {\n this.drawer?.close();\n }\n\n async openWithPicker() {\n this.open();\n // Defer to next tick so the drawer is in DOM before we minimize it.\n setTimeout(() => this.startAnnotate(), 0);\n }\n\n // ── Annotate flow ──────────────────────────────────────────\n\n private async startAnnotate() {\n if (!this.drawer) return;\n this.drawer.minimize();\n\n let next = true;\n while (next) {\n const handle = startPicker({ shadowRoot: this.shadow });\n const el = await handle.promise;\n if (!el) break; // user pressed Escape\n\n const rect = el.getBoundingClientRect();\n const popoverResult = await showPinPopover({\n shadowRoot: this.shadow,\n anchor: { x: rect.left, y: rect.bottom },\n pinNumber: this.pins.length + 1,\n });\n if (popoverResult.cancelled) break;\n\n const raw = capturePin(el);\n const pin: Pin = {\n number: this.pins.length + 1,\n ...raw,\n ...(popoverResult.note ? { note: popoverResult.note } : {}),\n };\n this.pins.push(pin);\n\n // Ask the user if they want to pick another. Simple: confirm dialog\n // would be jarring; default behavior is \"user closes by pressing Escape\".\n // We loop and re-enter pick mode immediately. The user pressing Escape\n // (handled by picker.promise resolving null) ends the loop.\n // No prompt needed.\n }\n\n // Capture final screenshot + draw markers + reopen drawer with preview.\n if (this.pins.length > 0) {\n try {\n const meta = captureMetadata();\n const raw = await captureScreenshot({ excludeShadowRoot: this.shadow });\n const annotated = await drawMarkers(raw, this.pins, meta.viewport);\n this.drawer.setPins(this.pins, annotated);\n } catch (err) {\n // Screenshot failure shouldn't block submit — pins still post without image.\n console.warn('[launchkit-beacon] screenshot capture failed:', err);\n this.drawer.setPins(this.pins);\n }\n }\n\n this.drawer.open();\n }\n\n private updatePinNote(num: number, note: string) {\n const pin = this.pins.find((p) => p.number === num);\n if (!pin) return;\n if (note.trim()) {\n pin.note = note;\n } else {\n delete pin.note;\n }\n // Don't re-render — the input is already up to date; rerender would lose focus.\n }\n\n private deletePin(num: number) {\n this.pins = this.pins.filter((p) => p.number !== num);\n // Renumber.\n this.pins.forEach((p, i) => { p.number = i + 1; });\n this.drawer?.setPins(this.pins, undefined);\n }\n\n // ── Submit flow ──────────────────────────────────────────\n\n private async handleSubmit() {\n if (!this.drawer) return;\n const cfg = this.config;\n if (!cfg?.endpoint) {\n this.drawer.setStatus('Missing endpoint configuration', 'error');\n return;\n }\n\n const description = this.drawer.getDescription().trim();\n const severity = this.drawer.getSeverity();\n if (!description) {\n this.drawer.setStatus('Description is required', 'error');\n return;\n }\n\n const meta = captureMetadata();\n\n // If we have pins but no annotated screenshot yet (e.g., user submitted before annotate finished),\n // try to grab a fresh screenshot now.\n let screenshotDataUrl: string | undefined;\n if (this.pins.length > 0) {\n try {\n const raw = await captureScreenshot({ excludeShadowRoot: this.shadow });\n screenshotDataUrl = await drawMarkers(raw, this.pins, meta.viewport);\n } catch {\n // No screenshot is fine.\n }\n }\n\n const payload: FeedbackPayload = {\n description,\n severity,\n ...(screenshotDataUrl ? { screenshot: { dataUrl: screenshotDataUrl, mime: 'image/jpeg' } } : {}),\n metadata: meta,\n pins: this.pins,\n ...(this.resolveContext() ? { context: this.resolveContext() } : {}),\n };\n\n // Pre-submit hook (cancellable).\n const beforeEvent = new CustomEvent('beacon-before-submit', {\n detail: { payload },\n cancelable: true,\n bubbles: true,\n composed: true,\n });\n const proceed = this.dispatchEvent(beforeEvent);\n if (!proceed) {\n this.drawer.setStatus('Submission cancelled', 'error');\n return;\n }\n\n this.drawer.setSubmitting(true);\n this.drawer.setStatus('Sending…');\n\n try {\n const headers = this.resolveHeaders();\n const response = await submitFeedback(cfg.endpoint, payload, headers);\n this.drawer.setSubmitting(false);\n\n if (response.ok) {\n this.drawer.setStatus('Sent — thanks!', 'success');\n this.dispatchEvent(new CustomEvent('beacon-after-submit', {\n detail: { response },\n bubbles: true,\n composed: true,\n }));\n // Reset state and close after a moment.\n setTimeout(() => {\n this.pins = [];\n this.description = '';\n this.severity = 'bug';\n this.drawer!.reset();\n this.drawer!.close();\n }, 1500);\n } else {\n this.drawer.setStatus(`Failed: ${response.status}`, 'error');\n }\n } catch (err) {\n this.drawer.setSubmitting(false);\n const msg = err instanceof Error ? err.message : 'Network error';\n this.drawer.setStatus(`Failed: ${msg}`, 'error');\n }\n }\n\n // ── Helpers ──────────────────────────────────────────\n\n private resolveHeaders(): Record<string, string> | undefined {\n const h = this.config?.headers;\n if (!h) return undefined;\n return typeof h === 'function' ? h() : h;\n }\n\n private resolveContext(): Record<string, unknown> | undefined {\n const c = this.config?.context;\n if (!c) return undefined;\n return typeof c === 'function' ? c() : c;\n }\n\n private parseSeverities(): Severity[] {\n const attr = this.getAttribute('severities');\n if (!attr) return ['bug', 'idea', 'ux', 'a11y'];\n return attr.split(',').map((s) => s.trim()).filter(Boolean) as Severity[];\n }\n}\n\nexport function defineBeacon(tagName = 'launchkit-beacon'): void {\n if (typeof window === 'undefined') return;\n if (!customElements.get(tagName)) {\n customElements.define(tagName, LaunchkitBeacon);\n }\n}\n\n// ── Helpers ──────────────────────────────────────────\n\nconst DRAWER_WIDTH = 380;\nconst VIEWPORT_MARGIN = 8;\nconst ESTIMATED_DRAWER_HEIGHT = 520;\n\n/**\n * Position the drawer relative to a trigger element, edge-aware.\n *\n * Default placement: directly below the trigger, with the drawer's right edge\n * aligned to the trigger's right edge. Falls back to opening above the trigger\n * if there isn't enough space below. Always clamps within the viewport so the\n * drawer never overflows off-screen.\n */\nfunction positionDrawerRelativeTo(drawer: HTMLElement, trigger: HTMLElement): void {\n const rect = trigger.getBoundingClientRect();\n const viewportW = window.innerWidth;\n const viewportH = window.innerHeight;\n\n // ── Horizontal: align drawer's right edge to trigger's right edge ─────────\n // Compute desired right offset; clamp so drawer never overflows past either edge.\n let rightOffset = Math.max(VIEWPORT_MARGIN, viewportW - rect.right);\n // If aligning right would push the drawer's left edge past the viewport, shift it.\n const leftEdgeIfApplied = viewportW - rightOffset - DRAWER_WIDTH;\n if (leftEdgeIfApplied < VIEWPORT_MARGIN) {\n rightOffset = Math.max(VIEWPORT_MARGIN, viewportW - DRAWER_WIDTH - VIEWPORT_MARGIN);\n }\n\n // ── Vertical: prefer below trigger, fall back to above ────────────────────\n const spaceBelow = viewportH - rect.bottom - VIEWPORT_MARGIN;\n const spaceAbove = rect.top - VIEWPORT_MARGIN;\n\n // Set ALL four anchors explicitly. Use 'auto' (not '') to override CSS defaults\n // (the drawer's CSS has `bottom: 20px` for the floating-trigger case — empty\n // string falls back to that; 'auto' is the only way to truly clear it).\n drawer.style.left = 'auto';\n drawer.style.right = `${rightOffset}px`;\n\n if (spaceBelow >= ESTIMATED_DRAWER_HEIGHT || spaceBelow >= spaceAbove) {\n drawer.style.top = `${rect.bottom + VIEWPORT_MARGIN}px`;\n drawer.style.bottom = 'auto';\n } else {\n drawer.style.top = 'auto';\n drawer.style.bottom = `${viewportH - rect.top + VIEWPORT_MARGIN}px`;\n }\n}\n","// Entry point for @launchsecure/launch-beacon.\n// Importing this module auto-registers the <launchkit-beacon> custom element.\n\nimport { defineBeacon, LaunchkitBeacon } from './element';\n\nexport { LaunchkitBeacon, defineBeacon };\nexport type {\n BeaconConfig,\n FeedbackPayload,\n Pin,\n Metadata,\n Severity,\n HeaderProvider,\n ContextProvider,\n SubmitResponse,\n} from './types';\n\n// Auto-register on import. Consumers who want to control the tag name can call\n// defineBeacon('my-tag') themselves before any <launchkit-beacon> elements are parsed.\ndefineBeacon();\n","export function resolveUrl(url, baseUrl) {\n // url is absolute already\n if (url.match(/^[a-z]+:\\/\\//i)) {\n return url;\n }\n // url is absolute already, without protocol\n if (url.match(/^\\/\\//)) {\n return window.location.protocol + url;\n }\n // dataURI, mailto:, tel:, etc.\n if (url.match(/^[a-z]+:/i)) {\n return url;\n }\n const doc = document.implementation.createHTMLDocument();\n const base = doc.createElement('base');\n const a = doc.createElement('a');\n doc.head.appendChild(base);\n doc.body.appendChild(a);\n if (baseUrl) {\n base.href = baseUrl;\n }\n a.href = url;\n return a.href;\n}\nexport const uuid = (() => {\n // generate uuid for className of pseudo elements.\n // We should not use GUIDs, otherwise pseudo elements sometimes cannot be captured.\n let counter = 0;\n // ref: http://stackoverflow.com/a/6248722/2519373\n const random = () => \n // eslint-disable-next-line no-bitwise\n `0000${((Math.random() * 36 ** 4) << 0).toString(36)}`.slice(-4);\n return () => {\n counter += 1;\n return `u${random()}${counter}`;\n };\n})();\nexport function delay(ms) {\n return (args) => new Promise((resolve) => {\n setTimeout(() => resolve(args), ms);\n });\n}\nexport function toArray(arrayLike) {\n const arr = [];\n for (let i = 0, l = arrayLike.length; i < l; i++) {\n arr.push(arrayLike[i]);\n }\n return arr;\n}\nlet styleProps = null;\nexport function getStyleProperties(options = {}) {\n if (styleProps) {\n return styleProps;\n }\n if (options.includeStyleProperties) {\n styleProps = options.includeStyleProperties;\n return styleProps;\n }\n styleProps = toArray(window.getComputedStyle(document.documentElement));\n return styleProps;\n}\nfunction px(node, styleProperty) {\n const win = node.ownerDocument.defaultView || window;\n const val = win.getComputedStyle(node).getPropertyValue(styleProperty);\n return val ? parseFloat(val.replace('px', '')) : 0;\n}\nfunction getNodeWidth(node) {\n const leftBorder = px(node, 'border-left-width');\n const rightBorder = px(node, 'border-right-width');\n return node.clientWidth + leftBorder + rightBorder;\n}\nfunction getNodeHeight(node) {\n const topBorder = px(node, 'border-top-width');\n const bottomBorder = px(node, 'border-bottom-width');\n return node.clientHeight + topBorder + bottomBorder;\n}\nexport function getImageSize(targetNode, options = {}) {\n const width = options.width || getNodeWidth(targetNode);\n const height = options.height || getNodeHeight(targetNode);\n return { width, height };\n}\nexport function getPixelRatio() {\n let ratio;\n let FINAL_PROCESS;\n try {\n FINAL_PROCESS = process;\n }\n catch (e) {\n // pass\n }\n const val = FINAL_PROCESS && FINAL_PROCESS.env\n ? FINAL_PROCESS.env.devicePixelRatio\n : null;\n if (val) {\n ratio = parseInt(val, 10);\n if (Number.isNaN(ratio)) {\n ratio = 1;\n }\n }\n return ratio || window.devicePixelRatio || 1;\n}\n// @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#maximum_canvas_size\nconst canvasDimensionLimit = 16384;\nexport function checkCanvasDimensions(canvas) {\n if (canvas.width > canvasDimensionLimit ||\n canvas.height > canvasDimensionLimit) {\n if (canvas.width > canvasDimensionLimit &&\n canvas.height > canvasDimensionLimit) {\n if (canvas.width > canvas.height) {\n canvas.height *= canvasDimensionLimit / canvas.width;\n canvas.width = canvasDimensionLimit;\n }\n else {\n canvas.width *= canvasDimensionLimit / canvas.height;\n canvas.height = canvasDimensionLimit;\n }\n }\n else if (canvas.width > canvasDimensionLimit) {\n canvas.height *= canvasDimensionLimit / canvas.width;\n canvas.width = canvasDimensionLimit;\n }\n else {\n canvas.width *= canvasDimensionLimit / canvas.height;\n canvas.height = canvasDimensionLimit;\n }\n }\n}\nexport function canvasToBlob(canvas, options = {}) {\n if (canvas.toBlob) {\n return new Promise((resolve) => {\n canvas.toBlob(resolve, options.type ? options.type : 'image/png', options.quality ? options.quality : 1);\n });\n }\n return new Promise((resolve) => {\n const binaryString = window.atob(canvas\n .toDataURL(options.type ? options.type : undefined, options.quality ? options.quality : undefined)\n .split(',')[1]);\n const len = binaryString.length;\n const binaryArray = new Uint8Array(len);\n for (let i = 0; i < len; i += 1) {\n binaryArray[i] = binaryString.charCodeAt(i);\n }\n resolve(new Blob([binaryArray], {\n type: options.type ? options.type : 'image/png',\n }));\n });\n}\nexport function createImage(url) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n img.decode().then(() => {\n requestAnimationFrame(() => resolve(img));\n });\n };\n img.onerror = reject;\n img.crossOrigin = 'anonymous';\n img.decoding = 'async';\n img.src = url;\n });\n}\nexport async function svgToDataURL(svg) {\n return Promise.resolve()\n .then(() => new XMLSerializer().serializeToString(svg))\n .then(encodeURIComponent)\n .then((html) => `data:image/svg+xml;charset=utf-8,${html}`);\n}\nexport async function nodeToDataURL(node, width, height) {\n const xmlns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(xmlns, 'svg');\n const foreignObject = document.createElementNS(xmlns, 'foreignObject');\n svg.setAttribute('width', `${width}`);\n svg.setAttribute('height', `${height}`);\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`);\n foreignObject.setAttribute('width', '100%');\n foreignObject.setAttribute('height', '100%');\n foreignObject.setAttribute('x', '0');\n foreignObject.setAttribute('y', '0');\n foreignObject.setAttribute('externalResourcesRequired', 'true');\n svg.appendChild(foreignObject);\n foreignObject.appendChild(node);\n return svgToDataURL(svg);\n}\nexport const isInstanceOfElement = (node, instance) => {\n if (node instanceof instance)\n return true;\n const nodePrototype = Object.getPrototypeOf(node);\n if (nodePrototype === null)\n return false;\n return (nodePrototype.constructor.name === instance.name ||\n isInstanceOfElement(nodePrototype, instance));\n};\n//# sourceMappingURL=util.js.map","import { uuid, getStyleProperties } from './util';\nfunction formatCSSText(style) {\n const content = style.getPropertyValue('content');\n return `${style.cssText} content: '${content.replace(/'|\"/g, '')}';`;\n}\nfunction formatCSSProperties(style, options) {\n return getStyleProperties(options)\n .map((name) => {\n const value = style.getPropertyValue(name);\n const priority = style.getPropertyPriority(name);\n return `${name}: ${value}${priority ? ' !important' : ''};`;\n })\n .join(' ');\n}\nfunction getPseudoElementStyle(className, pseudo, style, options) {\n const selector = `.${className}:${pseudo}`;\n const cssText = style.cssText\n ? formatCSSText(style)\n : formatCSSProperties(style, options);\n return document.createTextNode(`${selector}{${cssText}}`);\n}\nfunction clonePseudoElement(nativeNode, clonedNode, pseudo, options) {\n const style = window.getComputedStyle(nativeNode, pseudo);\n const content = style.getPropertyValue('content');\n if (content === '' || content === 'none') {\n return;\n }\n const className = uuid();\n try {\n clonedNode.className = `${clonedNode.className} ${className}`;\n }\n catch (err) {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.appendChild(getPseudoElementStyle(className, pseudo, style, options));\n clonedNode.appendChild(styleElement);\n}\nexport function clonePseudoElements(nativeNode, clonedNode, options) {\n clonePseudoElement(nativeNode, clonedNode, ':before', options);\n clonePseudoElement(nativeNode, clonedNode, ':after', options);\n}\n//# sourceMappingURL=clone-pseudos.js.map","const WOFF = 'application/font-woff';\nconst JPEG = 'image/jpeg';\nconst mimes = {\n woff: WOFF,\n woff2: WOFF,\n ttf: 'application/font-truetype',\n eot: 'application/vnd.ms-fontobject',\n png: 'image/png',\n jpg: JPEG,\n jpeg: JPEG,\n gif: 'image/gif',\n tiff: 'image/tiff',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n};\nfunction getExtension(url) {\n const match = /\\.([^./]*?)$/g.exec(url);\n return match ? match[1] : '';\n}\nexport function getMimeType(url) {\n const extension = getExtension(url).toLowerCase();\n return mimes[extension] || '';\n}\n//# sourceMappingURL=mimes.js.map","function getContentFromDataUrl(dataURL) {\n return dataURL.split(/,/)[1];\n}\nexport function isDataUrl(url) {\n return url.search(/^(data:)/) !== -1;\n}\nexport function makeDataUrl(content, mimeType) {\n return `data:${mimeType};base64,${content}`;\n}\nexport async function fetchAsDataURL(url, init, process) {\n const res = await fetch(url, init);\n if (res.status === 404) {\n throw new Error(`Resource \"${res.url}\" not found`);\n }\n const blob = await res.blob();\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = () => {\n try {\n resolve(process({ res, result: reader.result }));\n }\n catch (error) {\n reject(error);\n }\n };\n reader.readAsDataURL(blob);\n });\n}\nconst cache = {};\nfunction getCacheKey(url, contentType, includeQueryParams) {\n let key = url.replace(/\\?.*/, '');\n if (includeQueryParams) {\n key = url;\n }\n // font resource\n if (/ttf|otf|eot|woff2?/i.test(key)) {\n key = key.replace(/.*\\//, '');\n }\n return contentType ? `[${contentType}]${key}` : key;\n}\nexport async function resourceToDataURL(resourceUrl, contentType, options) {\n const cacheKey = getCacheKey(resourceUrl, contentType, options.includeQueryParams);\n if (cache[cacheKey] != null) {\n return cache[cacheKey];\n }\n // ref: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n if (options.cacheBust) {\n // eslint-disable-next-line no-param-reassign\n resourceUrl += (/\\?/.test(resourceUrl) ? '&' : '?') + new Date().getTime();\n }\n let dataURL;\n try {\n const content = await fetchAsDataURL(resourceUrl, options.fetchRequestInit, ({ res, result }) => {\n if (!contentType) {\n // eslint-disable-next-line no-param-reassign\n contentType = res.headers.get('Content-Type') || '';\n }\n return getContentFromDataUrl(result);\n });\n dataURL = makeDataUrl(content, contentType);\n }\n catch (error) {\n dataURL = options.imagePlaceholder || '';\n let msg = `Failed to fetch resource: ${resourceUrl}`;\n if (error) {\n msg = typeof error === 'string' ? error : error.message;\n }\n if (msg) {\n console.warn(msg);\n }\n }\n cache[cacheKey] = dataURL;\n return dataURL;\n}\n//# sourceMappingURL=dataurl.js.map","import { clonePseudoElements } from './clone-pseudos';\nimport { createImage, toArray, isInstanceOfElement, getStyleProperties, } from './util';\nimport { getMimeType } from './mimes';\nimport { resourceToDataURL } from './dataurl';\nasync function cloneCanvasElement(canvas) {\n const dataURL = canvas.toDataURL();\n if (dataURL === 'data:,') {\n return canvas.cloneNode(false);\n }\n return createImage(dataURL);\n}\nasync function cloneVideoElement(video, options) {\n if (video.currentSrc) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n canvas.width = video.clientWidth;\n canvas.height = video.clientHeight;\n ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n const dataURL = canvas.toDataURL();\n return createImage(dataURL);\n }\n const poster = video.poster;\n const contentType = getMimeType(poster);\n const dataURL = await resourceToDataURL(poster, contentType, options);\n return createImage(dataURL);\n}\nasync function cloneIFrameElement(iframe, options) {\n var _a;\n try {\n if ((_a = iframe === null || iframe === void 0 ? void 0 : iframe.contentDocument) === null || _a === void 0 ? void 0 : _a.body) {\n return (await cloneNode(iframe.contentDocument.body, options, true));\n }\n }\n catch (_b) {\n // Failed to clone iframe\n }\n return iframe.cloneNode(false);\n}\nasync function cloneSingleNode(node, options) {\n if (isInstanceOfElement(node, HTMLCanvasElement)) {\n return cloneCanvasElement(node);\n }\n if (isInstanceOfElement(node, HTMLVideoElement)) {\n return cloneVideoElement(node, options);\n }\n if (isInstanceOfElement(node, HTMLIFrameElement)) {\n return cloneIFrameElement(node, options);\n }\n return node.cloneNode(isSVGElement(node));\n}\nconst isSlotElement = (node) => node.tagName != null && node.tagName.toUpperCase() === 'SLOT';\nconst isSVGElement = (node) => node.tagName != null && node.tagName.toUpperCase() === 'SVG';\nasync function cloneChildren(nativeNode, clonedNode, options) {\n var _a, _b;\n if (isSVGElement(clonedNode)) {\n return clonedNode;\n }\n let children = [];\n if (isSlotElement(nativeNode) && nativeNode.assignedNodes) {\n children = toArray(nativeNode.assignedNodes());\n }\n else if (isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n ((_a = nativeNode.contentDocument) === null || _a === void 0 ? void 0 : _a.body)) {\n children = toArray(nativeNode.contentDocument.body.childNodes);\n }\n else {\n children = toArray(((_b = nativeNode.shadowRoot) !== null && _b !== void 0 ? _b : nativeNode).childNodes);\n }\n if (children.length === 0 ||\n isInstanceOfElement(nativeNode, HTMLVideoElement)) {\n return clonedNode;\n }\n await children.reduce((deferred, child) => deferred\n .then(() => cloneNode(child, options))\n .then((clonedChild) => {\n if (clonedChild) {\n clonedNode.appendChild(clonedChild);\n }\n }), Promise.resolve());\n return clonedNode;\n}\nfunction cloneCSSStyle(nativeNode, clonedNode, options) {\n const targetStyle = clonedNode.style;\n if (!targetStyle) {\n return;\n }\n const sourceStyle = window.getComputedStyle(nativeNode);\n if (sourceStyle.cssText) {\n targetStyle.cssText = sourceStyle.cssText;\n targetStyle.transformOrigin = sourceStyle.transformOrigin;\n }\n else {\n getStyleProperties(options).forEach((name) => {\n let value = sourceStyle.getPropertyValue(name);\n if (name === 'font-size' && value.endsWith('px')) {\n const reducedFont = Math.floor(parseFloat(value.substring(0, value.length - 2))) - 0.1;\n value = `${reducedFont}px`;\n }\n if (isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n name === 'display' &&\n value === 'inline') {\n value = 'block';\n }\n if (name === 'd' && clonedNode.getAttribute('d')) {\n value = `path(${clonedNode.getAttribute('d')})`;\n }\n targetStyle.setProperty(name, value, sourceStyle.getPropertyPriority(name));\n });\n }\n}\nfunction cloneInputValue(nativeNode, clonedNode) {\n if (isInstanceOfElement(nativeNode, HTMLTextAreaElement)) {\n clonedNode.innerHTML = nativeNode.value;\n }\n if (isInstanceOfElement(nativeNode, HTMLInputElement)) {\n clonedNode.setAttribute('value', nativeNode.value);\n }\n}\nfunction cloneSelectValue(nativeNode, clonedNode) {\n if (isInstanceOfElement(nativeNode, HTMLSelectElement)) {\n const clonedSelect = clonedNode;\n const selectedOption = Array.from(clonedSelect.children).find((child) => nativeNode.value === child.getAttribute('value'));\n if (selectedOption) {\n selectedOption.setAttribute('selected', '');\n }\n }\n}\nfunction decorate(nativeNode, clonedNode, options) {\n if (isInstanceOfElement(clonedNode, Element)) {\n cloneCSSStyle(nativeNode, clonedNode, options);\n clonePseudoElements(nativeNode, clonedNode, options);\n cloneInputValue(nativeNode, clonedNode);\n cloneSelectValue(nativeNode, clonedNode);\n }\n return clonedNode;\n}\nasync function ensureSVGSymbols(clone, options) {\n const uses = clone.querySelectorAll ? clone.querySelectorAll('use') : [];\n if (uses.length === 0) {\n return clone;\n }\n const processedDefs = {};\n for (let i = 0; i < uses.length; i++) {\n const use = uses[i];\n const id = use.getAttribute('xlink:href');\n if (id) {\n const exist = clone.querySelector(id);\n const definition = document.querySelector(id);\n if (!exist && definition && !processedDefs[id]) {\n // eslint-disable-next-line no-await-in-loop\n processedDefs[id] = (await cloneNode(definition, options, true));\n }\n }\n }\n const nodes = Object.values(processedDefs);\n if (nodes.length) {\n const ns = 'http://www.w3.org/1999/xhtml';\n const svg = document.createElementNS(ns, 'svg');\n svg.setAttribute('xmlns', ns);\n svg.style.position = 'absolute';\n svg.style.width = '0';\n svg.style.height = '0';\n svg.style.overflow = 'hidden';\n svg.style.display = 'none';\n const defs = document.createElementNS(ns, 'defs');\n svg.appendChild(defs);\n for (let i = 0; i < nodes.length; i++) {\n defs.appendChild(nodes[i]);\n }\n clone.appendChild(svg);\n }\n return clone;\n}\nexport async function cloneNode(node, options, isRoot) {\n if (!isRoot && options.filter && !options.filter(node)) {\n return null;\n }\n return Promise.resolve(node)\n .then((clonedNode) => cloneSingleNode(clonedNode, options))\n .then((clonedNode) => cloneChildren(node, clonedNode, options))\n .then((clonedNode) => decorate(node, clonedNode, options))\n .then((clonedNode) => ensureSVGSymbols(clonedNode, options));\n}\n//# sourceMappingURL=clone-node.js.map","import { resolveUrl } from './util';\nimport { getMimeType } from './mimes';\nimport { isDataUrl, makeDataUrl, resourceToDataURL } from './dataurl';\nconst URL_REGEX = /url\\((['\"]?)([^'\"]+?)\\1\\)/g;\nconst URL_WITH_FORMAT_REGEX = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g;\nconst FONT_SRC_REGEX = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;\nfunction toRegex(url) {\n // eslint-disable-next-line no-useless-escape\n const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, '\\\\$1');\n return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, 'g');\n}\nexport function parseURLs(cssText) {\n const urls = [];\n cssText.replace(URL_REGEX, (raw, quotation, url) => {\n urls.push(url);\n return raw;\n });\n return urls.filter((url) => !isDataUrl(url));\n}\nexport async function embed(cssText, resourceURL, baseURL, options, getContentFromUrl) {\n try {\n const resolvedURL = baseURL ? resolveUrl(resourceURL, baseURL) : resourceURL;\n const contentType = getMimeType(resourceURL);\n let dataURL;\n if (getContentFromUrl) {\n const content = await getContentFromUrl(resolvedURL);\n dataURL = makeDataUrl(content, contentType);\n }\n else {\n dataURL = await resourceToDataURL(resolvedURL, contentType, options);\n }\n return cssText.replace(toRegex(resourceURL), `$1${dataURL}$3`);\n }\n catch (error) {\n // pass\n }\n return cssText;\n}\nfunction filterPreferredFontFormat(str, { preferredFontFormat }) {\n return !preferredFontFormat\n ? str\n : str.replace(FONT_SRC_REGEX, (match) => {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const [src, , format] = URL_WITH_FORMAT_REGEX.exec(match) || [];\n if (!format) {\n return '';\n }\n if (format === preferredFontFormat) {\n return `src: ${src};`;\n }\n }\n });\n}\nexport function shouldEmbed(url) {\n return url.search(URL_REGEX) !== -1;\n}\nexport async function embedResources(cssText, baseUrl, options) {\n if (!shouldEmbed(cssText)) {\n return cssText;\n }\n const filteredCSSText = filterPreferredFontFormat(cssText, options);\n const urls = parseURLs(filteredCSSText);\n return urls.reduce((deferred, url) => deferred.then((css) => embed(css, url, baseUrl, options)), Promise.resolve(filteredCSSText));\n}\n//# sourceMappingURL=embed-resources.js.map","import { embedResources } from './embed-resources';\nimport { toArray, isInstanceOfElement } from './util';\nimport { isDataUrl, resourceToDataURL } from './dataurl';\nimport { getMimeType } from './mimes';\nasync function embedProp(propName, node, options) {\n var _a;\n const propValue = (_a = node.style) === null || _a === void 0 ? void 0 : _a.getPropertyValue(propName);\n if (propValue) {\n const cssString = await embedResources(propValue, null, options);\n node.style.setProperty(propName, cssString, node.style.getPropertyPriority(propName));\n return true;\n }\n return false;\n}\nasync function embedBackground(clonedNode, options) {\n ;\n (await embedProp('background', clonedNode, options)) ||\n (await embedProp('background-image', clonedNode, options));\n (await embedProp('mask', clonedNode, options)) ||\n (await embedProp('-webkit-mask', clonedNode, options)) ||\n (await embedProp('mask-image', clonedNode, options)) ||\n (await embedProp('-webkit-mask-image', clonedNode, options));\n}\nasync function embedImageNode(clonedNode, options) {\n const isImageElement = isInstanceOfElement(clonedNode, HTMLImageElement);\n if (!(isImageElement && !isDataUrl(clonedNode.src)) &&\n !(isInstanceOfElement(clonedNode, SVGImageElement) &&\n !isDataUrl(clonedNode.href.baseVal))) {\n return;\n }\n const url = isImageElement ? clonedNode.src : clonedNode.href.baseVal;\n const dataURL = await resourceToDataURL(url, getMimeType(url), options);\n await new Promise((resolve, reject) => {\n clonedNode.onload = resolve;\n clonedNode.onerror = options.onImageErrorHandler\n ? (...attributes) => {\n try {\n resolve(options.onImageErrorHandler(...attributes));\n }\n catch (error) {\n reject(error);\n }\n }\n : reject;\n const image = clonedNode;\n if (image.decode) {\n image.decode = resolve;\n }\n if (image.loading === 'lazy') {\n image.loading = 'eager';\n }\n if (isImageElement) {\n clonedNode.srcset = '';\n clonedNode.src = dataURL;\n }\n else {\n clonedNode.href.baseVal = dataURL;\n }\n });\n}\nasync function embedChildren(clonedNode, options) {\n const children = toArray(clonedNode.childNodes);\n const deferreds = children.map((child) => embedImages(child, options));\n await Promise.all(deferreds).then(() => clonedNode);\n}\nexport async function embedImages(clonedNode, options) {\n if (isInstanceOfElement(clonedNode, Element)) {\n await embedBackground(clonedNode, options);\n await embedImageNode(clonedNode, options);\n await embedChildren(clonedNode, options);\n }\n}\n//# sourceMappingURL=embed-images.js.map","export function applyStyle(node, options) {\n const { style } = node;\n if (options.backgroundColor) {\n style.backgroundColor = options.backgroundColor;\n }\n if (options.width) {\n style.width = `${options.width}px`;\n }\n if (options.height) {\n style.height = `${options.height}px`;\n }\n const manual = options.style;\n if (manual != null) {\n Object.keys(manual).forEach((key) => {\n style[key] = manual[key];\n });\n }\n return node;\n}\n//# sourceMappingURL=apply-style.js.map","import { toArray } from './util';\nimport { fetchAsDataURL } from './dataurl';\nimport { shouldEmbed, embedResources } from './embed-resources';\nconst cssFetchCache = {};\nasync function fetchCSS(url) {\n let cache = cssFetchCache[url];\n if (cache != null) {\n return cache;\n }\n const res = await fetch(url);\n const cssText = await res.text();\n cache = { url, cssText };\n cssFetchCache[url] = cache;\n return cache;\n}\nasync function embedFonts(data, options) {\n let cssText = data.cssText;\n const regexUrl = /url\\([\"']?([^\"')]+)[\"']?\\)/g;\n const fontLocs = cssText.match(/url\\([^)]+\\)/g) || [];\n const loadFonts = fontLocs.map(async (loc) => {\n let url = loc.replace(regexUrl, '$1');\n if (!url.startsWith('https://')) {\n url = new URL(url, data.url).href;\n }\n return fetchAsDataURL(url, options.fetchRequestInit, ({ result }) => {\n cssText = cssText.replace(loc, `url(${result})`);\n return [loc, result];\n });\n });\n return Promise.all(loadFonts).then(() => cssText);\n}\nfunction parseCSS(source) {\n if (source == null) {\n return [];\n }\n const result = [];\n const commentsRegex = /(\\/\\*[\\s\\S]*?\\*\\/)/gi;\n // strip out comments\n let cssText = source.replace(commentsRegex, '');\n // eslint-disable-next-line prefer-regex-literals\n const keyframesRegex = new RegExp('((@.*?keyframes [\\\\s\\\\S]*?){([\\\\s\\\\S]*?}\\\\s*?)})', 'gi');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const matches = keyframesRegex.exec(cssText);\n if (matches === null) {\n break;\n }\n result.push(matches[0]);\n }\n cssText = cssText.replace(keyframesRegex, '');\n const importRegex = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi;\n // to match css & media queries together\n const combinedCSSRegex = '((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]' +\n '*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})';\n // unified regex\n const unifiedRegex = new RegExp(combinedCSSRegex, 'gi');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let matches = importRegex.exec(cssText);\n if (matches === null) {\n matches = unifiedRegex.exec(cssText);\n if (matches === null) {\n break;\n }\n else {\n importRegex.lastIndex = unifiedRegex.lastIndex;\n }\n }\n else {\n unifiedRegex.lastIndex = importRegex.lastIndex;\n }\n result.push(matches[0]);\n }\n return result;\n}\nasync function getCSSRules(styleSheets, options) {\n const ret = [];\n const deferreds = [];\n // First loop inlines imports\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray(sheet.cssRules || []).forEach((item, index) => {\n if (item.type === CSSRule.IMPORT_RULE) {\n let importIndex = index + 1;\n const url = item.href;\n const deferred = fetchCSS(url)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) => parseCSS(cssText).forEach((rule) => {\n try {\n sheet.insertRule(rule, rule.startsWith('@import')\n ? (importIndex += 1)\n : sheet.cssRules.length);\n }\n catch (error) {\n console.error('Error inserting rule from remote css', {\n rule,\n error,\n });\n }\n }))\n .catch((e) => {\n console.error('Error loading remote css', e.toString());\n });\n deferreds.push(deferred);\n }\n });\n }\n catch (e) {\n const inline = styleSheets.find((a) => a.href == null) || document.styleSheets[0];\n if (sheet.href != null) {\n deferreds.push(fetchCSS(sheet.href)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) => parseCSS(cssText).forEach((rule) => {\n inline.insertRule(rule, inline.cssRules.length);\n }))\n .catch((err) => {\n console.error('Error loading remote stylesheet', err);\n }));\n }\n console.error('Error inlining remote css file', e);\n }\n }\n });\n return Promise.all(deferreds).then(() => {\n // Second loop parses rules\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray(sheet.cssRules || []).forEach((item) => {\n ret.push(item);\n });\n }\n catch (e) {\n console.error(`Error while reading CSS rules from ${sheet.href}`, e);\n }\n }\n });\n return ret;\n });\n}\nfunction getWebFontRules(cssRules) {\n return cssRules\n .filter((rule) => rule.type === CSSRule.FONT_FACE_RULE)\n .filter((rule) => shouldEmbed(rule.style.getPropertyValue('src')));\n}\nasync function parseWebFontRules(node, options) {\n if (node.ownerDocument == null) {\n throw new Error('Provided element is not within a Document');\n }\n const styleSheets = toArray(node.ownerDocument.styleSheets);\n const cssRules = await getCSSRules(styleSheets, options);\n return getWebFontRules(cssRules);\n}\nfunction normalizeFontFamily(font) {\n return font.trim().replace(/[\"']/g, '');\n}\nfunction getUsedFonts(node) {\n const fonts = new Set();\n function traverse(node) {\n const fontFamily = node.style.fontFamily || getComputedStyle(node).fontFamily;\n fontFamily.split(',').forEach((font) => {\n fonts.add(normalizeFontFamily(font));\n });\n Array.from(node.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n traverse(child);\n }\n });\n }\n traverse(node);\n return fonts;\n}\nexport async function getWebFontCSS(node, options) {\n const rules = await parseWebFontRules(node, options);\n const usedFonts = getUsedFonts(node);\n const cssTexts = await Promise.all(rules\n .filter((rule) => usedFonts.has(normalizeFontFamily(rule.style.fontFamily)))\n .map((rule) => {\n const baseUrl = rule.parentStyleSheet\n ? rule.parentStyleSheet.href\n : null;\n return embedResources(rule.cssText, baseUrl, options);\n }));\n return cssTexts.join('\\n');\n}\nexport async function embedWebFonts(clonedNode, options) {\n const cssText = options.fontEmbedCSS != null\n ? options.fontEmbedCSS\n : options.skipFonts\n ? null\n : await getWebFontCSS(clonedNode, options);\n if (cssText) {\n const styleNode = document.createElement('style');\n const sytleContent = document.createTextNode(cssText);\n styleNode.appendChild(sytleContent);\n if (clonedNode.firstChild) {\n clonedNode.insertBefore(styleNode, clonedNode.firstChild);\n }\n else {\n clonedNode.appendChild(styleNode);\n }\n }\n}\n//# sourceMappingURL=embed-webfonts.js.map","import { cloneNode } from './clone-node';\nimport { embedImages } from './embed-images';\nimport { applyStyle } from './apply-style';\nimport { embedWebFonts, getWebFontCSS } from './embed-webfonts';\nimport { getImageSize, getPixelRatio, createImage, canvasToBlob, nodeToDataURL, checkCanvasDimensions, } from './util';\nexport async function toSvg(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const clonedNode = (await cloneNode(node, options, true));\n await embedWebFonts(clonedNode, options);\n await embedImages(clonedNode, options);\n applyStyle(clonedNode, options);\n const datauri = await nodeToDataURL(clonedNode, width, height);\n return datauri;\n}\nexport async function toCanvas(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const svg = await toSvg(node, options);\n const img = await createImage(svg);\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n const ratio = options.pixelRatio || getPixelRatio();\n const canvasWidth = options.canvasWidth || width;\n const canvasHeight = options.canvasHeight || height;\n canvas.width = canvasWidth * ratio;\n canvas.height = canvasHeight * ratio;\n if (!options.skipAutoScale) {\n checkCanvasDimensions(canvas);\n }\n canvas.style.width = `${canvasWidth}`;\n canvas.style.height = `${canvasHeight}`;\n if (options.backgroundColor) {\n context.fillStyle = options.backgroundColor;\n context.fillRect(0, 0, canvas.width, canvas.height);\n }\n context.drawImage(img, 0, 0, canvas.width, canvas.height);\n return canvas;\n}\nexport async function toPixelData(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const canvas = await toCanvas(node, options);\n const ctx = canvas.getContext('2d');\n return ctx.getImageData(0, 0, width, height).data;\n}\nexport async function toPng(node, options = {}) {\n const canvas = await toCanvas(node, options);\n return canvas.toDataURL();\n}\nexport async function toJpeg(node, options = {}) {\n const canvas = await toCanvas(node, options);\n return canvas.toDataURL('image/jpeg', options.quality || 1);\n}\nexport async function toBlob(node, options = {}) {\n const canvas = await toCanvas(node, options);\n const blob = await canvasToBlob(canvas);\n return blob;\n}\nexport async function getFontEmbedCSS(node, options = {}) {\n return getWebFontCSS(node, options);\n}\n//# sourceMappingURL=index.js.map"],"names":["ICONS","createTriggerButton","label","btn","DEFAULT_SEVERITIES","DrawerView","severities","callbacks","pins","annotatedScreenshot","submitting","status","kind","canSubmit","escapeHtml","sev","p","desc","submitBtn","input","_a","_b","num","item","s","showPinPopover","opts","resolve","popover","POPOVER_W","POPOVER_H","left","top","textarea","close","result","e","action","note","startPicker","shadowRoot","onHover","outline","tooltip","previousCursor","resolved","resolvePromise","promise","res","isWidgetElement","el","node","findTarget","x","y","candidates","c","positionOutline","rect","tag","cls","above","handleMove","handleClick","handleKey","finish","MAX_DEPTH","isUniqueId","id","root","tagWithClasses","classes","nthOfTypeIndex","parent","buildSelector","target","parts","depth","current","base","part","currentClasses","detectReact","keys","k","fiber","i","f","type","name","detectVue","anyEl","vueParent","detectAngular","ng","cmp","ctor","detectSvelte","detectFramework","OUTER_HTML_LIMIT","PARENT_OUTER_HTML_LIMIT","USEFUL_STYLE_PROPS","truncate","max","pickStyles","computed","out","prop","value","capturePin","getUaData","nav","b","getTheme","captureMetadata","htmlToImage","load","index","captureScreenshot","quality","pixelRatio","excludeShadowRoot","lib","filter","cur","MARKER_RADIUS","MARKER_FILL","MARKER_STROKE","MARKER_TEXT","drawMarkers","screenshotDataUrl","viewportSize","img","loadImage","canvas","ctx","scaleX","scaleY","pin","cx","cy","src","reject","err","submitFeedback","endpoint","payload","headers","body","ATTRS","LaunchkitBeacon","style","stylesCss","assigned","v","_oldValue","_newValue","triggerEl","positionDrawerRelativeTo","next","popoverResult","raw","meta","annotated","cfg","description","severity","beforeEvent","response","msg","h","attr","defineBeacon","tagName","DRAWER_WIDTH","VIEWPORT_MARGIN","ESTIMATED_DRAWER_HEIGHT","drawer","trigger","viewportW","viewportH","rightOffset","spaceBelow","spaceAbove","resolveUrl","url","baseUrl","doc","a","uuid","counter","random","toArray","arrayLike","arr","l","styleProps","getStyleProperties","options","px","styleProperty","val","getNodeWidth","leftBorder","rightBorder","getNodeHeight","topBorder","bottomBorder","getImageSize","targetNode","width","height","getPixelRatio","ratio","FINAL_PROCESS","canvasDimensionLimit","checkCanvasDimensions","canvasToBlob","binaryString","len","binaryArray","createImage","svgToDataURL","svg","html","nodeToDataURL","xmlns","foreignObject","isInstanceOfElement","instance","nodePrototype","formatCSSText","content","formatCSSProperties","priority","getPseudoElementStyle","className","pseudo","selector","cssText","clonePseudoElement","nativeNode","clonedNode","styleElement","clonePseudoElements","WOFF","JPEG","mimes","getExtension","match","getMimeType","extension","getContentFromDataUrl","dataURL","isDataUrl","makeDataUrl","mimeType","fetchAsDataURL","init","process","blob","reader","error","cache","getCacheKey","contentType","includeQueryParams","key","resourceToDataURL","resourceUrl","cacheKey","cloneCanvasElement","cloneVideoElement","video","poster","cloneIFrameElement","iframe","cloneNode","cloneSingleNode","isSVGElement","isSlotElement","cloneChildren","children","deferred","child","clonedChild","cloneCSSStyle","targetStyle","sourceStyle","cloneInputValue","cloneSelectValue","clonedSelect","selectedOption","decorate","ensureSVGSymbols","clone","uses","processedDefs","exist","definition","nodes","ns","defs","isRoot","URL_REGEX","URL_WITH_FORMAT_REGEX","FONT_SRC_REGEX","toRegex","escaped","parseURLs","urls","quotation","embed","resourceURL","baseURL","getContentFromUrl","resolvedURL","filterPreferredFontFormat","str","preferredFontFormat","format","shouldEmbed","embedResources","filteredCSSText","css","embedProp","propName","propValue","cssString","embedBackground","embedImageNode","isImageElement","attributes","image","embedChildren","deferreds","embedImages","applyStyle","manual","cssFetchCache","fetchCSS","embedFonts","data","regexUrl","loadFonts","loc","parseCSS","source","commentsRegex","keyframesRegex","matches","importRegex","combinedCSSRegex","unifiedRegex","getCSSRules","styleSheets","ret","sheet","importIndex","metadata","rule","inline","getWebFontRules","cssRules","parseWebFontRules","normalizeFontFamily","font","getUsedFonts","fonts","traverse","getWebFontCSS","rules","usedFonts","embedWebFonts","styleNode","sytleContent","toSvg","toCanvas","context","canvasWidth","canvasHeight","toPixelData","toPng","toJpeg","toBlob","getFontEmbedCSS"],"mappings":"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","x_google_ignoreList":[14,15,16,17,18,19,20,21,22,23]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../src/capture/element.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAuC9C,wBAAgB,UAAU,CAAC,EAAE,EAAE,OAAO,GAAG,aAAa,CAoBrD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"framework.d.ts","sourceRoot":"","sources":["../../src/capture/framework.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AA2DpC,wBAAgB,eAAe,CAAC,EAAE,EAAE,OAAO,GAAG,GAAG,CAAC,WAAW,CAAC,GAAG,SAAS,CAGzE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/capture/metadata.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AA4BzC,wBAAgB,eAAe,IAAI,QAAQ,CAoB1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/capture/overlay.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAOpC,wBAAsB,WAAW,CAC/B,iBAAiB,EAAE,MAAM,EACzB,IAAI,EAAE,GAAG,EAAE,EACX,YAAY,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAClD,OAAO,CAAC,MAAM,CAAC,CAyCjB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface PickerOptions {
|
|
2
|
+
shadowRoot: ShadowRoot;
|
|
3
|
+
onHover?: (el: Element | null) => void;
|
|
4
|
+
}
|
|
5
|
+
export interface PickerHandle {
|
|
6
|
+
cancel: () => void;
|
|
7
|
+
promise: Promise<Element | null>;
|
|
8
|
+
}
|
|
9
|
+
export declare function startPicker(opts: PickerOptions): PickerHandle;
|
|
10
|
+
//# sourceMappingURL=picker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker.d.ts","sourceRoot":"","sources":["../../src/capture/picker.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CAClC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CAgI7D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot.d.ts","sourceRoot":"","sources":["../../src/capture/screenshot.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,UAAU,CAAC;CAChC;AAED,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BrF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selector.d.ts","sourceRoot":"","sources":["../../src/capture/selector.ts"],"names":[],"mappings":"AAiCA,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CA6CrD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { BeaconConfig } from './types';
|
|
2
|
+
export declare class LaunchkitBeacon extends HTMLElement {
|
|
3
|
+
static get observedAttributes(): string[];
|
|
4
|
+
private shadow;
|
|
5
|
+
private trigger?;
|
|
6
|
+
private drawer?;
|
|
7
|
+
private slotEl?;
|
|
8
|
+
private _config;
|
|
9
|
+
private pins;
|
|
10
|
+
private description;
|
|
11
|
+
private severity;
|
|
12
|
+
/** Public — wrappers can set `widget.config = {...}` for dynamic endpoint/headers/context. */
|
|
13
|
+
set config(value: BeaconConfig);
|
|
14
|
+
get config(): BeaconConfig | null;
|
|
15
|
+
connectedCallback(): void;
|
|
16
|
+
attributeChangedCallback(name: string, _oldValue: string | null, _newValue: string | null): void;
|
|
17
|
+
open(): void;
|
|
18
|
+
close(): void;
|
|
19
|
+
openWithPicker(): Promise<void>;
|
|
20
|
+
private startAnnotate;
|
|
21
|
+
private updatePinNote;
|
|
22
|
+
private deletePin;
|
|
23
|
+
private handleSubmit;
|
|
24
|
+
private resolveHeaders;
|
|
25
|
+
private resolveContext;
|
|
26
|
+
private parseSeverities;
|
|
27
|
+
}
|
|
28
|
+
export declare function defineBeacon(tagName?: string): void;
|
|
29
|
+
//# sourceMappingURL=element.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../src/element.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAiD,MAAM,SAAS,CAAC;AAa3F,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,MAAM,KAAK,kBAAkB,IAAgC,MAAM,EAAE,CAAG;IAExE,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAa;IAC5B,OAAO,CAAC,MAAM,CAAC,CAAkB;IAEjC,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAmB;IAEnC,8FAA8F;IAC9F,IAAI,MAAM,CAAC,KAAK,EAAE,YAAY,EAE7B;IACD,IAAI,MAAM,IAAI,YAAY,GAAG,IAAI,CAIhC;IAED,iBAAiB;IA4CjB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAYzF,IAAI;IAcJ,KAAK;IAIC,cAAc;YAQN,aAAa;IAkD3B,OAAO,CAAC,aAAa;IAWrB,OAAO,CAAC,SAAS;YASH,YAAY;IAsF1B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,eAAe;CAKxB;AAED,wBAAgB,YAAY,CAAC,OAAO,SAAqB,GAAG,IAAI,CAK/D"}
|