makethisbetter 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.
Files changed (168) hide show
  1. package/LICENSE +62 -0
  2. package/README.md +113 -0
  3. package/dist/annotate/draw.d.ts +21 -0
  4. package/dist/annotate/draw.d.ts.map +1 -0
  5. package/dist/annotate/draw.test.d.ts +2 -0
  6. package/dist/annotate/draw.test.d.ts.map +1 -0
  7. package/dist/annotate/highlighter.d.ts +11 -0
  8. package/dist/annotate/highlighter.d.ts.map +1 -0
  9. package/dist/annotate/highlighter.test.d.ts +2 -0
  10. package/dist/annotate/highlighter.test.d.ts.map +1 -0
  11. package/dist/annotate/overlay.d.ts +17 -0
  12. package/dist/annotate/overlay.d.ts.map +1 -0
  13. package/dist/annotate/overlay.test.d.ts +2 -0
  14. package/dist/annotate/overlay.test.d.ts.map +1 -0
  15. package/dist/annotate/pin.d.ts +10 -0
  16. package/dist/annotate/pin.d.ts.map +1 -0
  17. package/dist/annotate/pin.test.d.ts +2 -0
  18. package/dist/annotate/pin.test.d.ts.map +1 -0
  19. package/dist/annotate/session.d.ts +20 -0
  20. package/dist/annotate/session.d.ts.map +1 -0
  21. package/dist/annotate/session.test.d.ts +2 -0
  22. package/dist/annotate/session.test.d.ts.map +1 -0
  23. package/dist/annotate/toolbar.d.ts +17 -0
  24. package/dist/annotate/toolbar.d.ts.map +1 -0
  25. package/dist/annotate/toolbar.test.d.ts +2 -0
  26. package/dist/annotate/toolbar.test.d.ts.map +1 -0
  27. package/dist/api/client.d.ts +10 -0
  28. package/dist/api/client.d.ts.map +1 -0
  29. package/dist/api/client.test.d.ts +2 -0
  30. package/dist/api/client.test.d.ts.map +1 -0
  31. package/dist/context/collector.d.ts +10 -0
  32. package/dist/context/collector.d.ts.map +1 -0
  33. package/dist/context/collector.test.d.ts +2 -0
  34. package/dist/context/collector.test.d.ts.map +1 -0
  35. package/dist/context/console.d.ts +10 -0
  36. package/dist/context/console.d.ts.map +1 -0
  37. package/dist/context/console.test.d.ts +2 -0
  38. package/dist/context/console.test.d.ts.map +1 -0
  39. package/dist/context/error-source.d.ts +21 -0
  40. package/dist/context/error-source.d.ts.map +1 -0
  41. package/dist/context/error-source.test.d.ts +2 -0
  42. package/dist/context/error-source.test.d.ts.map +1 -0
  43. package/dist/context/frustration.d.ts +27 -0
  44. package/dist/context/frustration.d.ts.map +1 -0
  45. package/dist/context/frustration.test.d.ts +2 -0
  46. package/dist/context/frustration.test.d.ts.map +1 -0
  47. package/dist/global.d.ts +3 -0
  48. package/dist/global.d.ts.map +1 -0
  49. package/dist/i18n/en.d.ts +47 -0
  50. package/dist/i18n/en.d.ts.map +1 -0
  51. package/dist/i18n/index.d.ts +4 -0
  52. package/dist/i18n/index.d.ts.map +1 -0
  53. package/dist/i18n/index.test.d.ts +2 -0
  54. package/dist/i18n/index.test.d.ts.map +1 -0
  55. package/dist/i18n/zh-CN.d.ts +47 -0
  56. package/dist/i18n/zh-CN.d.ts.map +1 -0
  57. package/dist/index.d.mts +8 -0
  58. package/dist/index.d.ts +8 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/makethisbetter.cjs.js +84 -0
  61. package/dist/makethisbetter.cjs.js.map +1 -0
  62. package/dist/makethisbetter.esm.js +1433 -0
  63. package/dist/makethisbetter.esm.js.map +1 -0
  64. package/dist/makethisbetter.js +84 -0
  65. package/dist/makethisbetter.js.map +1 -0
  66. package/dist/popup/comment.d.ts +31 -0
  67. package/dist/popup/comment.d.ts.map +1 -0
  68. package/dist/popup/comment.test.d.ts +2 -0
  69. package/dist/popup/comment.test.d.ts.map +1 -0
  70. package/dist/popup/success.d.ts +8 -0
  71. package/dist/popup/success.d.ts.map +1 -0
  72. package/dist/popup/success.test.d.ts +2 -0
  73. package/dist/popup/success.test.d.ts.map +1 -0
  74. package/dist/record/control-bar.d.ts +12 -0
  75. package/dist/record/control-bar.d.ts.map +1 -0
  76. package/dist/record/control-bar.test.d.ts +2 -0
  77. package/dist/record/control-bar.test.d.ts.map +1 -0
  78. package/dist/record/session.d.ts +26 -0
  79. package/dist/record/session.d.ts.map +1 -0
  80. package/dist/record/session.test.d.ts +2 -0
  81. package/dist/record/session.test.d.ts.map +1 -0
  82. package/dist/screenshot/capture.d.ts +3 -0
  83. package/dist/screenshot/capture.d.ts.map +1 -0
  84. package/dist/screenshot/capture.test.d.ts +2 -0
  85. package/dist/screenshot/capture.test.d.ts.map +1 -0
  86. package/dist/styles.d.ts +9 -0
  87. package/dist/styles.d.ts.map +1 -0
  88. package/dist/types.d.ts +45 -0
  89. package/dist/types.d.ts.map +1 -0
  90. package/dist/widget/controller.d.ts +37 -0
  91. package/dist/widget/controller.d.ts.map +1 -0
  92. package/dist/widget/controller.test.d.ts +2 -0
  93. package/dist/widget/controller.test.d.ts.map +1 -0
  94. package/dist/widget/frustration-prompt.d.ts +11 -0
  95. package/dist/widget/frustration-prompt.d.ts.map +1 -0
  96. package/dist/widget/frustration-prompt.test.d.ts +2 -0
  97. package/dist/widget/frustration-prompt.test.d.ts.map +1 -0
  98. package/dist/widget/payload.d.ts +5 -0
  99. package/dist/widget/payload.d.ts.map +1 -0
  100. package/dist/widget/payload.test.d.ts +2 -0
  101. package/dist/widget/payload.test.d.ts.map +1 -0
  102. package/dist/widget/pet.d.ts +12 -0
  103. package/dist/widget/pet.d.ts.map +1 -0
  104. package/dist/widget/pet.test.d.ts +2 -0
  105. package/dist/widget/pet.test.d.ts.map +1 -0
  106. package/dist/widget/shadow.d.ts +11 -0
  107. package/dist/widget/shadow.d.ts.map +1 -0
  108. package/dist/widget/shadow.test.d.ts +2 -0
  109. package/dist/widget/shadow.test.d.ts.map +1 -0
  110. package/dist/widget/tab.d.ts +10 -0
  111. package/dist/widget/tab.d.ts.map +1 -0
  112. package/dist/widget/tab.test.d.ts +2 -0
  113. package/dist/widget/tab.test.d.ts.map +1 -0
  114. package/package.json +64 -0
  115. package/src/annotate/draw.test.ts +168 -0
  116. package/src/annotate/draw.ts +108 -0
  117. package/src/annotate/highlighter.test.ts +47 -0
  118. package/src/annotate/highlighter.ts +84 -0
  119. package/src/annotate/overlay.test.ts +91 -0
  120. package/src/annotate/overlay.ts +44 -0
  121. package/src/annotate/pin.test.ts +87 -0
  122. package/src/annotate/pin.ts +28 -0
  123. package/src/annotate/session.test.ts +219 -0
  124. package/src/annotate/session.ts +104 -0
  125. package/src/annotate/toolbar.test.ts +132 -0
  126. package/src/annotate/toolbar.ts +81 -0
  127. package/src/api/client.test.ts +75 -0
  128. package/src/api/client.ts +77 -0
  129. package/src/context/collector.test.ts +14 -0
  130. package/src/context/collector.ts +41 -0
  131. package/src/context/console.test.ts +44 -0
  132. package/src/context/console.ts +34 -0
  133. package/src/context/error-source.test.ts +115 -0
  134. package/src/context/error-source.ts +62 -0
  135. package/src/context/frustration.test.ts +134 -0
  136. package/src/context/frustration.ts +145 -0
  137. package/src/global.ts +3 -0
  138. package/src/i18n/en.ts +47 -0
  139. package/src/i18n/index.test.ts +24 -0
  140. package/src/i18n/index.ts +16 -0
  141. package/src/i18n/zh-CN.ts +47 -0
  142. package/src/index.ts +32 -0
  143. package/src/popup/comment.test.ts +73 -0
  144. package/src/popup/comment.ts +177 -0
  145. package/src/popup/success.test.ts +75 -0
  146. package/src/popup/success.ts +33 -0
  147. package/src/record/control-bar.test.ts +110 -0
  148. package/src/record/control-bar.ts +46 -0
  149. package/src/record/session.test.ts +153 -0
  150. package/src/record/session.ts +139 -0
  151. package/src/screenshot/capture.test.ts +68 -0
  152. package/src/screenshot/capture.ts +96 -0
  153. package/src/styles/widget.css +847 -0
  154. package/src/styles.ts +9 -0
  155. package/src/types.ts +46 -0
  156. package/src/vite-env.d.ts +6 -0
  157. package/src/widget/controller.test.ts +62 -0
  158. package/src/widget/controller.ts +249 -0
  159. package/src/widget/frustration-prompt.test.ts +86 -0
  160. package/src/widget/frustration-prompt.ts +34 -0
  161. package/src/widget/payload.test.ts +167 -0
  162. package/src/widget/payload.ts +31 -0
  163. package/src/widget/pet.test.ts +63 -0
  164. package/src/widget/pet.ts +67 -0
  165. package/src/widget/shadow.test.ts +25 -0
  166. package/src/widget/shadow.ts +41 -0
  167. package/src/widget/tab.test.ts +92 -0
  168. package/src/widget/tab.ts +31 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"makethisbetter.js","sources":["../src/widget/shadow.ts","../src/widget/tab.ts","../src/styles.ts","../src/widget/pet.ts","../src/widget/frustration-prompt.ts","../src/annotate/toolbar.ts","../src/annotate/overlay.ts","../src/annotate/highlighter.ts","../src/annotate/pin.ts","../src/annotate/draw.ts","../src/annotate/session.ts","../src/popup/comment.ts","../src/popup/success.ts","../node_modules/html-to-image/es/util.js","../node_modules/html-to-image/es/clone-pseudos.js","../node_modules/html-to-image/es/mimes.js","../node_modules/html-to-image/es/dataurl.js","../node_modules/html-to-image/es/clone-node.js","../node_modules/html-to-image/es/embed-resources.js","../node_modules/html-to-image/es/embed-images.js","../node_modules/html-to-image/es/apply-style.js","../node_modules/html-to-image/es/embed-webfonts.js","../node_modules/html-to-image/es/index.js","../src/screenshot/capture.ts","../src/context/error-source.ts","../src/context/console.ts","../src/context/frustration.ts","../src/context/collector.ts","../src/api/client.ts","../src/widget/payload.ts","../src/i18n/index.ts","../src/i18n/en.ts","../src/i18n/zh-CN.ts","../src/record/session.ts","../src/record/control-bar.ts","../src/widget/controller.ts","../src/index.ts"],"sourcesContent":["import cssText from '../styles/widget.css?inline'\nimport type { MakeThisBetterConfig } from '../types'\n\nexport class ShadowContainer {\n private host: HTMLElement\n readonly root: ShadowRoot\n\n constructor(theme: MakeThisBetterConfig['theme'] = 'auto') {\n this.host = document.createElement('div')\n this.host.id = 'mtb-widget-host'\n this.host.style.cssText = 'position:fixed;top:0;left:0;width:0;height:0;overflow:visible;z-index:2147483646;'\n this.host.setAttribute('data-mtb-theme', theme)\n document.body.appendChild(this.host)\n\n this.root = this.host.attachShadow({ mode: 'open' })\n\n const style = document.createElement('style')\n style.textContent = cssText\n this.root.appendChild(style)\n }\n\n el<T extends HTMLElement = HTMLElement>(tag: string, className?: string): T {\n const el = document.createElement(tag) as T\n if (className) el.className = className\n return el\n }\n\n append(...nodes: Node[]): void {\n for (const n of nodes) this.root.appendChild(n)\n }\n\n remove(...nodes: Node[]): void {\n for (const n of nodes) {\n if (n.parentNode === this.root) this.root.removeChild(n)\n }\n }\n\n destroy(): void {\n document.body.removeChild(this.host)\n }\n}\n","import type { ShadowContainer } from './shadow'\nimport type { I18nMessages } from '../i18n'\n\nexport class FeedbackTab {\n private el: HTMLButtonElement\n private onClick: () => void\n\n constructor(\n shadow: ShadowContainer,\n messages: I18nMessages,\n position: 'left' | 'right',\n onClick: () => void,\n ) {\n this.onClick = onClick\n this.el = shadow.el<HTMLButtonElement>('button', 'mtb-tab')\n if (position === 'left') this.el.classList.add('left')\n this.el.textContent = messages.tab\n this.el.setAttribute('aria-label', messages.tab)\n this.el.addEventListener('click', onClick)\n shadow.append(this.el)\n }\n\n setActive(active: boolean): void {\n this.el.classList.toggle('active', active)\n }\n\n destroy(): void {\n this.el.removeEventListener('click', this.onClick)\n this.el.remove()\n }\n}\n","export const BRAND_COLOR = '#059669'\n\nexport const DRAW_STROKE = {\n color: BRAND_COLOR,\n width: '3.5',\n linecap: 'round',\n linejoin: 'round',\n filter: 'drop-shadow(0 1px 2px rgba(5,150,105,0.35))',\n} as const\n","import type { ShadowContainer } from './shadow'\nimport type { I18nMessages } from '../i18n'\nimport { BRAND_COLOR } from '../styles'\n\nexport class PetEntry {\n private el: HTMLDivElement\n private bubble: HTMLDivElement\n private onClick: () => void\n\n constructor(\n shadow: ShadowContainer,\n messages: I18nMessages,\n onClick: () => void,\n ) {\n this.onClick = onClick\n\n this.el = shadow.el<HTMLDivElement>('div', 'mtb-pet')\n this.el.innerHTML = this.buildSVG()\n this.el.setAttribute('role', 'button')\n this.el.setAttribute('aria-label', messages.tab)\n this.el.tabIndex = 0\n\n this.bubble = shadow.el<HTMLDivElement>('div', 'mtb-pet-bubble')\n this.bubble.textContent = messages.pet.bubble\n this.el.appendChild(this.bubble)\n\n this.el.addEventListener('click', this.onClick)\n this.el.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n this.onClick()\n }\n })\n\n shadow.append(this.el)\n }\n\n private buildSVG(): string {\n return `<svg class=\"mtb-pet-svg\" width=\"48\" height=\"48\" viewBox=\"0 0 48 48\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"24\" cy=\"28\" r=\"16\" fill=\"${BRAND_COLOR}\"/>\n <circle cx=\"24\" cy=\"28\" r=\"14\" fill=\"#10b981\"/>\n <circle cx=\"19\" cy=\"25\" r=\"3\" fill=\"#fff\"/>\n <circle cx=\"29\" cy=\"25\" r=\"3\" fill=\"#fff\"/>\n <circle cx=\"20\" cy=\"24.5\" r=\"1.5\" fill=\"#064e3b\"/>\n <circle cx=\"30\" cy=\"24.5\" r=\"1.5\" fill=\"#064e3b\"/>\n <ellipse cx=\"19.5\" cy=\"23.5\" rx=\"0.8\" ry=\"0.6\" fill=\"#fff\" opacity=\"0.7\"/>\n <ellipse cx=\"29.5\" cy=\"23.5\" rx=\"0.8\" ry=\"0.6\" fill=\"#fff\" opacity=\"0.7\"/>\n <path d=\"M20 31 Q24 34 28 31\" stroke=\"#064e3b\" stroke-width=\"1.5\" stroke-linecap=\"round\" fill=\"none\"/>\n <circle cx=\"15\" cy=\"30\" r=\"2.5\" fill=\"${BRAND_COLOR}\" opacity=\"0.4\"/>\n <circle cx=\"33\" cy=\"30\" r=\"2.5\" fill=\"${BRAND_COLOR}\" opacity=\"0.4\"/>\n <path d=\"M14 17 Q16 12 20 15\" stroke=\"#10b981\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n <path d=\"M34 17 Q32 12 28 15\" stroke=\"#10b981\" stroke-width=\"2\" stroke-linecap=\"round\" fill=\"none\"/>\n </svg>`\n }\n\n setActive(active: boolean): void {\n this.el.classList.toggle('active', active)\n if (active) {\n this.bubble.classList.add('hidden')\n }\n }\n\n destroy(): void {\n this.el.removeEventListener('click', this.onClick)\n this.el.remove()\n }\n}\n","import type { ShadowContainer } from './shadow'\nimport type { I18nMessages } from '../i18n'\n\nconst FRUSTRATION_DISMISS_MS = 8000\n\nexport class FrustrationPromptCard {\n private el: HTMLDivElement\n\n constructor(\n shadow: ShadowContainer,\n messages: I18nMessages,\n handlers: { onTell: () => void; onDismiss: () => void },\n ) {\n this.el = shadow.el<HTMLDivElement>('div', 'mtb-frustration-prompt')\n this.el.innerHTML = `\n <div class=\"mtb-frustration-icon\">&#9888;&#65039;</div>\n <span class=\"mtb-frustration-text\">${messages.frustration.prompt}</span>\n <div class=\"mtb-frustration-actions\">\n <button class=\"mtb-frustration-tell\">${messages.frustration.action}</button>\n <button class=\"mtb-frustration-dismiss\">${messages.frustration.dismiss}</button>\n </div>\n `\n\n this.el.querySelector('.mtb-frustration-tell')!.addEventListener('click', handlers.onTell)\n this.el.querySelector('.mtb-frustration-dismiss')!.addEventListener('click', handlers.onDismiss)\n\n shadow.append(this.el)\n setTimeout(handlers.onDismiss, FRUSTRATION_DISMISS_MS)\n }\n\n destroy(): void {\n this.el.remove()\n }\n}\n","import type { ShadowContainer } from '../widget/shadow'\nimport type { I18nMessages } from '../i18n'\n\nexport type ToolbarMode = 'markup' | 'record'\n\nexport class AnnotationToolbar {\n private el: HTMLDivElement\n private hintEl!: HTMLSpanElement\n private markupBtn!: HTMLButtonElement\n private recordBtn!: HTMLButtonElement\n private messages: I18nMessages\n private currentMode: ToolbarMode = 'markup'\n\n constructor(\n shadow: ShadowContainer,\n messages: I18nMessages,\n onExit: () => void,\n onModeChange?: (mode: ToolbarMode) => void,\n ) {\n this.messages = messages\n\n this.el = shadow.el<HTMLDivElement>('div', 'mtb-toolbar')\n this.el.innerHTML = this.buildHTML(messages)\n shadow.append(this.el)\n\n this.hintEl = this.el.querySelector('.mtb-toolbar-hint')!\n this.markupBtn = this.el.querySelector('.mtb-toolbar-mode-markup')!\n this.recordBtn = this.el.querySelector('.mtb-toolbar-mode-record')!\n\n this.markupBtn.addEventListener('click', () => {\n this.setMode('markup')\n onModeChange?.('markup')\n })\n this.recordBtn.addEventListener('click', () => {\n this.setMode('record')\n onModeChange?.('record')\n })\n this.el.querySelector('.mtb-exit-btn')!.addEventListener('click', onExit)\n }\n\n private buildHTML(m: I18nMessages): string {\n return `\n <div class=\"mtb-toolbar-modes\">\n <button class=\"mtb-toolbar-mode-btn mtb-toolbar-mode-markup active\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"7\"/><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"/><line x1=\"3\" y1=\"12\" x2=\"7\" y2=\"12\"/><line x1=\"17\" y1=\"12\" x2=\"21\" y2=\"12\"/></svg>${m.toolbar.markup}\n </button>\n <button class=\"mtb-toolbar-mode-btn mtb-toolbar-mode-record\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"9\"/><circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"currentColor\" stroke=\"none\"/></svg>${m.toolbar.record}\n </button>\n </div>\n <span class=\"mtb-toolbar-hint\">${m.toolbar.hint}</span>\n <span class=\"mtb-toolbar-sep\"></span>\n <button class=\"mtb-exit-btn\">\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 6L6 18M6 6l12 12\"/>\n </svg>${m.toolbar.exit}\n </button>\n `\n }\n\n setMode(mode: ToolbarMode): void {\n this.currentMode = mode\n if (mode === 'markup') {\n this.markupBtn.classList.add('active')\n this.recordBtn.classList.remove('active')\n this.hintEl.textContent = this.messages.toolbar.hint\n } else {\n this.markupBtn.classList.remove('active')\n this.recordBtn.classList.add('active')\n this.hintEl.textContent = this.messages.toolbar.hintRecord\n }\n }\n\n getMode(): ToolbarMode {\n return this.currentMode\n }\n\n destroy(): void {\n this.el.remove()\n }\n}\n","import type { ShadowContainer } from '../widget/shadow'\n\nexport class AnnotationOverlay {\n private overlayEl: HTMLDivElement\n private dimEl: HTMLDivElement\n private onMouseDown: (e: MouseEvent) => void\n private onMouseMove: (e: MouseEvent) => void\n private onMouseUp: (e: MouseEvent) => void\n private onMouseLeave: (e: MouseEvent) => void\n\n constructor(\n shadow: ShadowContainer,\n handlers: {\n onMouseDown: (e: MouseEvent) => void\n onMouseMove: (e: MouseEvent) => void\n onMouseUp: (e: MouseEvent) => void\n onMouseLeave: (e: MouseEvent) => void\n },\n ) {\n this.onMouseDown = handlers.onMouseDown\n this.onMouseMove = handlers.onMouseMove\n this.onMouseUp = handlers.onMouseUp\n this.onMouseLeave = handlers.onMouseLeave\n\n this.overlayEl = shadow.el<HTMLDivElement>('div', 'mtb-overlay')\n this.overlayEl.addEventListener('mousedown', this.onMouseDown)\n this.overlayEl.addEventListener('mousemove', this.onMouseMove)\n this.overlayEl.addEventListener('mouseup', this.onMouseUp)\n this.overlayEl.addEventListener('mouseleave', this.onMouseLeave)\n shadow.append(this.overlayEl)\n\n this.dimEl = shadow.el<HTMLDivElement>('div', 'mtb-dim')\n shadow.append(this.dimEl)\n }\n\n destroy(): void {\n this.overlayEl.removeEventListener('mousedown', this.onMouseDown)\n this.overlayEl.removeEventListener('mousemove', this.onMouseMove)\n this.overlayEl.removeEventListener('mouseup', this.onMouseUp)\n this.overlayEl.removeEventListener('mouseleave', this.onMouseLeave)\n this.overlayEl.remove()\n this.dimEl.remove()\n }\n}\n","import type { ShadowContainer } from '../widget/shadow'\n\nexport class ElementHighlighter {\n private highlightEl: HTMLDivElement\n\n constructor(shadow: ShadowContainer) {\n this.highlightEl = shadow.el<HTMLDivElement>('div', 'mtb-highlight')\n this.hide()\n shadow.append(this.highlightEl)\n }\n\n highlight(el: Element): void {\n const rect = el.getBoundingClientRect()\n this.highlightEl.style.top = `${rect.top - 2}px`\n this.highlightEl.style.left = `${rect.left - 2}px`\n this.highlightEl.style.width = `${rect.width + 4}px`\n this.highlightEl.style.height = `${rect.height + 4}px`\n this.highlightEl.style.display = 'block'\n }\n\n hide(): void {\n this.highlightEl.style.display = 'none'\n }\n\n destroy(): void {\n this.highlightEl.remove()\n }\n}\n\nexport function getElementName(el: Element): string {\n if (el instanceof HTMLElement) {\n const label = el.getAttribute('aria-label')\n if (label) return label\n\n const title = el.getAttribute('title')\n if (title) return title\n\n const text = el.textContent?.trim().slice(0, 40)\n if (text) return text\n\n const placeholder = (el as HTMLInputElement).placeholder\n if (placeholder) return placeholder\n\n const alt = (el as HTMLImageElement).alt\n if (alt) return alt\n\n const dataMark = el.getAttribute('data-mark')\n if (dataMark) return dataMark\n }\n return el.tagName.toLowerCase()\n}\n\nexport function getCssSelector(el: Element): string {\n const parts: string[] = []\n let current: Element | null = el\n while (current && current !== document.body && parts.length < 5) {\n let selector = current.tagName.toLowerCase()\n if (current.id) {\n selector = `#${current.id}`\n parts.unshift(selector)\n break\n }\n const classNames = Array.from(current.classList)\n .filter(c => !c.startsWith('mtb-'))\n .slice(0, 2)\n .join('.')\n if (classNames) selector += `.${classNames}`\n\n const parent = current.parentElement\n if (parent) {\n const siblings = Array.from(parent.children).filter(\n c => c.tagName === current!.tagName,\n )\n if (siblings.length > 1) {\n const idx = siblings.indexOf(current) + 1\n selector += `:nth-child(${idx})`\n }\n }\n\n parts.unshift(selector)\n current = current.parentElement\n }\n return parts.join(' > ')\n}\n","import type { ShadowContainer } from '../widget/shadow'\n\nexport class PinMarker {\n private pins: HTMLDivElement[] = []\n private shadow: ShadowContainer\n\n constructor(shadow: ShadowContainer) {\n this.shadow = shadow\n }\n\n addPin(x: number, y: number, index: number): void {\n const pin = this.shadow.el<HTMLDivElement>('div', 'mtb-pin')\n pin.textContent = String(index)\n pin.style.top = `${y}px`\n pin.style.left = `${x}px`\n this.shadow.append(pin)\n this.pins.push(pin)\n }\n\n clearAll(): void {\n for (const pin of this.pins) pin.remove()\n this.pins = []\n }\n\n destroy(): void {\n this.clearAll()\n }\n}\n","import type { ShadowContainer } from '../widget/shadow'\nimport type { Annotation } from '../types'\nimport { DRAW_STROKE } from '../styles'\n\nexport class DrawLayer {\n private svg: SVGSVGElement\n private path: SVGPathElement | null = null\n private points: [number, number][] = []\n private isDrawing = false\n private onDrawComplete: (annotation: Annotation) => void\n\n constructor(shadow: ShadowContainer, onDrawComplete: (annotation: Annotation) => void) {\n this.onDrawComplete = onDrawComplete\n\n this.svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n this.svg.setAttribute('class', 'mtb-draw-svg')\n shadow.append(this.svg)\n }\n\n startDraw(x: number, y: number): void {\n this.isDrawing = true\n this.points = [[x, y]]\n\n this.path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n this.path.setAttribute('fill', 'none')\n this.path.setAttribute('stroke', DRAW_STROKE.color)\n this.path.setAttribute('stroke-width', DRAW_STROKE.width)\n this.path.setAttribute('stroke-linecap', DRAW_STROKE.linecap)\n this.path.setAttribute('stroke-linejoin', DRAW_STROKE.linejoin)\n this.path.setAttribute('style', `filter:${DRAW_STROKE.filter}`)\n this.svg.appendChild(this.path)\n }\n\n continueDraw(x: number, y: number): void {\n if (!this.isDrawing || !this.path) return\n this.points.push([x, y])\n this.path.setAttribute('d', this.buildPathD())\n }\n\n endDraw(): void {\n if (!this.isDrawing || this.points.length < 2) {\n this.isDrawing = false\n if (this.path) {\n this.path.remove()\n this.path = null\n }\n return\n }\n this.isDrawing = false\n\n const center = this.getCenter()\n const pathD = this.buildPathD()\n\n const annotation: Annotation = {\n type: 'draw',\n x: center[0],\n y: center[1],\n drawPath: pathD,\n }\n\n this.onDrawComplete(annotation)\n }\n\n private buildPathD(): string {\n if (this.points.length === 0) return ''\n const [fx, fy] = this.points[0]\n let d = `M ${fx} ${fy}`\n for (let i = 1; i < this.points.length; i++) {\n const [x, y] = this.points[i]\n d += ` L ${x} ${y}`\n }\n return d\n }\n\n private getCenter(): [number, number] {\n const xs = this.points.map(p => p[0])\n const ys = this.points.map(p => p[1])\n const cx = (Math.min(...xs) + Math.max(...xs)) / 2\n const cy = (Math.min(...ys) + Math.max(...ys)) / 2\n return [cx, cy]\n }\n\n clearAll(): void {\n while (this.svg.firstChild) this.svg.removeChild(this.svg.firstChild)\n this.path = null\n this.isDrawing = false\n this.points = []\n }\n\n cancelCurrentDraw(): void {\n this.path?.remove()\n this.path = null\n this.isDrawing = false\n this.points = []\n }\n\n isCurrentlyDrawing(): boolean {\n return this.isDrawing\n }\n\n getPointCount(): number {\n return this.points.length\n }\n\n destroy(): void {\n this.svg.remove()\n }\n}\n","import type { ShadowContainer } from '../widget/shadow'\nimport type { I18nMessages } from '../i18n'\nimport type { Annotation } from '../types'\nimport { AnnotationOverlay } from './overlay'\nimport { ElementHighlighter, getElementName, getCssSelector } from './highlighter'\nimport { PinMarker } from './pin'\nimport { DrawLayer } from './draw'\n\nconst DRAW_MIN_POINTS = 5\n\nexport class AnnotationSession {\n private overlay: AnnotationOverlay\n private highlighter: ElementHighlighter\n private pinMarker: PinMarker\n private drawLayer: DrawLayer\n private pinCount = 0\n private interactionActive = true\n\n constructor(\n shadow: ShadowContainer,\n private messages: I18nMessages,\n private onReady: (annotation: Annotation, targetName: string) => void,\n ) {\n this.highlighter = new ElementHighlighter(shadow)\n this.pinMarker = new PinMarker(shadow)\n this.drawLayer = new DrawLayer(shadow, (annotation) => {\n this.onReady(annotation, this.messages.annotation.drawing)\n })\n this.overlay = new AnnotationOverlay(shadow, {\n onMouseDown: (e) => this.handleMouseDown(e),\n onMouseMove: (e) => this.handleMouseMove(e),\n onMouseUp: (e) => this.handleMouseUp(e),\n onMouseLeave: () => {\n if (this.drawLayer.isCurrentlyDrawing()) this.drawLayer.endDraw()\n this.highlighter.hide()\n },\n })\n }\n\n private handleMouseDown(e: MouseEvent): void {\n e.preventDefault()\n this.drawLayer.startDraw(e.clientX, e.clientY)\n }\n\n private handleMouseMove(e: MouseEvent): void {\n if (this.drawLayer.isCurrentlyDrawing()) {\n this.drawLayer.continueDraw(e.clientX, e.clientY)\n this.highlighter.hide()\n return\n }\n\n const underEl = getElementUnder(e.clientX, e.clientY)\n if (underEl) this.highlighter.highlight(underEl)\n else this.highlighter.hide()\n }\n\n private handleMouseUp(e: MouseEvent): void {\n if (!this.drawLayer.isCurrentlyDrawing()) return\n\n if (this.drawLayer.getPointCount() >= DRAW_MIN_POINTS) {\n this.drawLayer.endDraw()\n return\n }\n\n this.drawLayer.cancelCurrentDraw()\n const underEl = getElementUnder(e.clientX, e.clientY)\n const targetName = underEl ? getElementName(underEl) : this.messages.annotation.element\n const annotation: Annotation = {\n type: 'pin',\n x: e.clientX,\n y: e.clientY,\n targetSelector: underEl ? getCssSelector(underEl) : undefined,\n targetText: underEl?.textContent?.trim().slice(0, 200) ?? '',\n targetName,\n }\n this.pinMarker.addPin(e.clientX, e.clientY, ++this.pinCount)\n this.drawLayer.clearAll()\n this.highlighter.hide()\n this.onReady(annotation, targetName)\n }\n\n dismissInteraction(): void {\n if (!this.interactionActive) return\n this.interactionActive = false\n this.overlay.destroy()\n this.highlighter.destroy()\n }\n\n destroy(): void {\n this.dismissInteraction()\n this.pinMarker.destroy()\n this.drawLayer.destroy()\n }\n}\n\nfunction getElementUnder(x: number, y: number): Element | null {\n const host = document.getElementById('mtb-widget-host')\n if (host) host.style.display = 'none'\n\n const el = document.elementFromPoint(x, y)\n\n if (host) host.style.display = ''\n return el\n}\n","import type { ShadowContainer } from '../widget/shadow'\nimport type { I18nMessages } from '../i18n'\n\ninterface PopupOptions {\n targetName: string\n x: number\n y: number\n onSubmit: (description: string) => void\n onClose: () => void\n messages: I18nMessages\n}\n\nexport class CommentPopup {\n private el: HTMLDivElement\n private textarea!: HTMLTextAreaElement\n private submitBtn!: HTMLButtonElement\n private errorEl!: HTMLDivElement\n private onSubmit: (description: string) => void\n private onClose: () => void\n private submitLabel: string\n private loading = false\n\n constructor(shadow: ShadowContainer, opts: PopupOptions) {\n this.onSubmit = opts.onSubmit\n this.onClose = opts.onClose\n this.submitLabel = opts.messages.popup.submit\n\n this.el = shadow.el<HTMLDivElement>('div', 'mtb-popup')\n this.el.innerHTML = this.buildHTML(opts)\n shadow.append(this.el)\n\n this.textarea = this.el.querySelector('.mtb-textarea')!\n this.submitBtn = this.el.querySelector('.mtb-submit-btn')!\n\n this.positionPopup(opts.x, opts.y)\n this.bindEvents(opts.messages)\n this.textarea.focus()\n }\n\n private buildHTML(opts: PopupOptions): string {\n const m = opts.messages\n const quickOpts = m.popup.quickOptions\n .map(\n o => `\n <button class=\"mtb-quick-option\" data-quick=\"${escapeHtml(o.label)}\">\n <span class=\"mtb-quick-option-emoji\">${o.emoji}</span>\n <span>${escapeHtml(o.label)}</span>\n </button>`,\n )\n .join('')\n\n return `\n <div class=\"mtb-popup-header\">\n <div class=\"mtb-popup-icon\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#059669\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/>\n </svg>\n </div>\n <span class=\"mtb-popup-title\">${m.popup.about} \"${escapeHtml(opts.targetName)}\"</span>\n <button class=\"mtb-popup-close\" aria-label=\"Close\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M18 6L6 18M6 6l12 12\"/>\n </svg>\n </button>\n </div>\n <div class=\"mtb-popup-body\">\n <div class=\"mtb-quick-options\">\n ${quickOpts}\n </div>\n <div class=\"mtb-textarea-wrap\">\n <textarea class=\"mtb-textarea\" placeholder=\"${escapeHtml(m.popup.placeholder)}\"></textarea>\n </div>\n <div class=\"mtb-popup-error\" role=\"alert\"></div>\n <div class=\"mtb-popup-actions\">\n <button class=\"mtb-cancel-btn\" type=\"button\">${escapeHtml(m.popup.cancel)}</button>\n <button class=\"mtb-submit-btn\" type=\"button\" disabled>${escapeHtml(m.popup.submit)}</button>\n </div>\n </div>\n `\n }\n\n private positionPopup(x: number, y: number): void {\n const popupW = 320\n const popupH = 260\n const vw = window.innerWidth\n const vh = window.innerHeight\n const margin = 12\n\n let left = x + 12\n let top = y + 12\n\n if (left + popupW > vw - margin) {\n left = x - popupW - 12\n }\n if (left < margin) left = margin\n\n if (top + popupH > vh - margin) {\n top = vh - popupH - margin\n }\n if (top < margin) top = margin\n\n this.el.style.left = `${left}px`\n this.el.style.top = `${top}px`\n }\n\n private bindEvents(messages: I18nMessages): void {\n this.el.querySelector('.mtb-popup-close')!.addEventListener('click', () => this.onClose())\n this.el.querySelector('.mtb-cancel-btn')!.addEventListener('click', () => this.onClose())\n this.errorEl = this.el.querySelector('.mtb-popup-error')!\n\n this.el.querySelectorAll('.mtb-quick-option').forEach(btn => {\n btn.addEventListener('click', () => {\n const label = (btn as HTMLElement).dataset['quick'] ?? ''\n this.textarea.value = label\n this.updateSubmitState()\n this.textarea.focus()\n })\n })\n\n this.textarea.addEventListener('input', () => this.updateSubmitState())\n\n this.textarea.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault()\n this.submit()\n }\n })\n\n this.submitBtn.addEventListener('click', () => this.submit())\n }\n\n private updateSubmitState(): void {\n const hasText = this.textarea.value.trim().length > 0\n this.submitBtn.classList.toggle('ready', hasText && !this.loading)\n this.submitBtn.disabled = !hasText || this.loading\n this.errorEl.hidden = true\n this.errorEl.textContent = ''\n }\n\n private submit(): void {\n const text = this.textarea.value.trim()\n if (!text || this.loading) return\n this.onSubmit(text)\n }\n\n setLoading(loading: boolean): void {\n this.loading = loading\n if (loading) {\n this.submitBtn.classList.add('loading')\n this.submitBtn.innerHTML = `<span class=\"mtb-dot\"></span><span class=\"mtb-dot\"></span><span class=\"mtb-dot\"></span>`\n this.textarea.disabled = true\n } else {\n this.submitBtn.classList.remove('loading')\n this.submitBtn.textContent = this.submitLabel\n this.textarea.disabled = false\n }\n this.updateSubmitState()\n }\n\n setError(message: string): void {\n this.errorEl.textContent = message\n this.errorEl.hidden = false\n }\n\n destroy(): void {\n this.el.remove()\n }\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n}\n","import type { ShadowContainer } from '../widget/shadow'\nimport type { I18nMessages } from '../i18n'\nimport { BRAND_COLOR } from '../styles'\n\nconst SUCCESS_AUTO_CLOSE_MS = 5000\n\nexport class SuccessCard {\n private el: HTMLDivElement\n\n constructor(shadow: ShadowContainer, messages: I18nMessages, onClose: () => void) {\n this.el = shadow.el<HTMLDivElement>('div', 'mtb-success')\n this.el.style.right = '20px'\n this.el.style.bottom = '20px'\n this.el.innerHTML = `\n <div class=\"mtb-success-icon\">\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${BRAND_COLOR}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\"/>\n </svg>\n </div>\n <div class=\"mtb-success-title\">${messages.success.title}</div>\n <div class=\"mtb-success-msg\">${messages.success.message}</div>\n <button class=\"mtb-close-link\">${messages.success.close}</button>\n `\n shadow.append(this.el)\n this.el.querySelector('.mtb-close-link')!.addEventListener('click', onClose)\n\n setTimeout(() => onClose(), SUCCESS_AUTO_CLOSE_MS)\n }\n\n destroy(): void {\n this.el.remove()\n }\n}\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","import { toPng } from 'html-to-image'\nimport type { Annotation } from '../types'\n\nexport async function captureScreenshot(annotations: Annotation[] = []): Promise<Blob | null> {\n const annotationLayer = mountCaptureAnnotations(annotations)\n\n try {\n const dataUrl = await toPng(document.body, {\n cacheBust: true,\n skipAutoScale: false,\n filter: (node) => {\n if (node instanceof HTMLElement && node.id === 'mtb-widget-host') return false\n return true\n },\n })\n return dataUrlToBlob(dataUrl)\n } catch {\n return null\n } finally {\n annotationLayer?.remove()\n }\n}\n\nfunction mountCaptureAnnotations(annotations: Annotation[]): HTMLDivElement | null {\n if (annotations.length === 0) return null\n\n const layer = document.createElement('div')\n layer.setAttribute('data-mtb-capture-annotations', 'true')\n layer.setAttribute('aria-hidden', 'true')\n layer.style.cssText = 'position:fixed;inset:0;pointer-events:none;z-index:2147483645;'\n\n for (const [index, annotation] of annotations.entries()) {\n if (annotation.type === 'pin') {\n layer.appendChild(buildCapturePin(annotation, index + 1))\n } else if (annotation.type === 'draw' && annotation.drawPath) {\n layer.appendChild(buildCaptureDraw(annotation.drawPath))\n }\n }\n\n document.body.appendChild(layer)\n return layer\n}\n\nfunction buildCapturePin(annotation: Annotation, index: number): HTMLDivElement {\n const pin = document.createElement('div')\n pin.textContent = String(index)\n pin.style.cssText = [\n 'position:fixed',\n `left:${annotation.x}px`,\n `top:${annotation.y}px`,\n 'width:22px',\n 'height:22px',\n 'border-radius:50% 50% 50% 2px',\n 'background:#059669',\n 'border:2px solid #fff',\n 'display:flex',\n 'align-items:center',\n 'justify-content:center',\n 'font:700 10px -apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif',\n 'color:#fff',\n 'box-shadow:0 2px 8px rgba(5,150,105,0.45)',\n 'transform:translate(-50%,-50%)',\n ].join(';')\n return pin\n}\n\nfunction buildCaptureDraw(drawPath: string): SVGSVGElement {\n const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n svg.setAttribute('width', '100%')\n svg.setAttribute('height', '100%')\n svg.setAttribute('viewBox', `0 0 ${window.innerWidth} ${window.innerHeight}`)\n svg.style.cssText = 'position:fixed;inset:0;width:100%;height:100%;overflow:visible;'\n\n const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')\n path.setAttribute('d', drawPath)\n path.setAttribute('fill', 'none')\n path.setAttribute('stroke', '#059669')\n path.setAttribute('stroke-width', '3.5')\n path.setAttribute('stroke-linecap', 'round')\n path.setAttribute('stroke-linejoin', 'round')\n path.setAttribute('filter', 'drop-shadow(0 1px 2px rgba(5,150,105,0.35))')\n svg.appendChild(path)\n\n return svg\n}\n\nfunction dataUrlToBlob(dataUrl: string): Blob {\n const [header, data] = dataUrl.split(',')\n const mime = header.match(/:(.*?);/)?.[1] ?? 'image/png'\n const binary = atob(data)\n const bytes = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return new Blob([bytes], { type: mime })\n}\n","export interface ErrorSourceEvent {\n message: string\n source?: string\n line?: number\n col?: number\n error?: unknown\n}\n\ntype ErrorListener = (event: ErrorSourceEvent) => void\n\nclass ErrorSource {\n private listeners = new Set<ErrorListener>()\n private originalOnError: OnErrorEventHandler | null = null\n private rejectionHandler: ((e: PromiseRejectionEvent) => void) | null = null\n private hooked = false\n\n subscribe(listener: ErrorListener): () => void {\n this.listeners.add(listener)\n this.hook()\n return () => {\n this.listeners.delete(listener)\n if (this.listeners.size === 0) this.unhook()\n }\n }\n\n private hook(): void {\n if (this.hooked) return\n this.hooked = true\n\n this.originalOnError = window.onerror\n window.onerror = (msg, source, line, col, error) => {\n this.emit({ message: String(msg), source, line, col, error })\n if (this.originalOnError) {\n return this.originalOnError.call(window, msg, source, line, col, error)\n }\n return false\n }\n\n this.rejectionHandler = (e: PromiseRejectionEvent) => {\n const reason = e.reason instanceof Error ? e.reason.message : String(e.reason)\n this.emit({ message: `Unhandled rejection: ${reason}` })\n }\n window.addEventListener('unhandledrejection', this.rejectionHandler)\n }\n\n private unhook(): void {\n if (!this.hooked) return\n this.hooked = false\n window.onerror = this.originalOnError\n this.originalOnError = null\n if (this.rejectionHandler) {\n window.removeEventListener('unhandledrejection', this.rejectionHandler)\n this.rejectionHandler = null\n }\n }\n\n private emit(event: ErrorSourceEvent): void {\n for (const listener of this.listeners) listener(event)\n }\n}\n\nexport const errorSource = new ErrorSource()\n","import { errorSource, type ErrorSourceEvent } from './error-source'\n\nconst MAX_CONSOLE_ERRORS = 20\n\nexport class ConsoleErrorCollector {\n private errors: string[] = []\n private unsubscribe: (() => void) | null = null\n\n start(): void {\n if (this.unsubscribe) return\n this.unsubscribe = errorSource.subscribe((e) => this.record(e))\n }\n\n private record(e: ErrorSourceEvent): void {\n const location = e.line != null ? ` (${e.line}:${e.col ?? 0})` : ''\n this.addError(`${e.message}${location}`)\n }\n\n private addError(msg: string): void {\n if (this.errors.length >= MAX_CONSOLE_ERRORS) return\n if (!this.errors.includes(msg)) {\n this.errors.push(msg)\n }\n }\n\n getErrors(): string[] {\n return [...this.errors]\n }\n\n stop(): void {\n this.unsubscribe?.()\n this.unsubscribe = null\n }\n}\n","import { errorSource } from './error-source'\n\nexport type FrustrationSignal = 'rage_click' | 'dead_click' | 'console_error'\n\nexport interface FrustrationEvent {\n signal: FrustrationSignal\n target?: string\n detail?: string\n timestamp: number\n}\n\ninterface ClickRecord {\n target: EventTarget | null\n time: number\n}\n\nconst RAGE_CLICK_THRESHOLD = 3\nconst RAGE_CLICK_WINDOW_MS = 1000\n\nconst INTERACTIVE_TAGS = new Set([\n 'A', 'BUTTON', 'INPUT', 'SELECT', 'TEXTAREA', 'LABEL', 'SUMMARY', 'DETAILS',\n])\n\nconst INTERACTIVE_ROLES = new Set([\n 'button', 'link', 'checkbox', 'radio', 'tab', 'menuitem', 'option',\n 'switch', 'textbox', 'combobox', 'listbox', 'slider', 'spinbutton',\n])\n\nexport class FrustrationDetector {\n private clickHistory: ClickRecord[] = []\n private onFrustration: (event: FrustrationEvent) => void\n private boundClickHandler: (e: MouseEvent) => void\n private unsubscribeErrors: (() => void) | null = null\n private active = false\n private errorCount = 0\n private deadClickCount = 0\n private cooldownUntil = 0\n private static readonly COOLDOWN_MS = 60_000\n\n constructor(onFrustration: (event: FrustrationEvent) => void) {\n this.onFrustration = onFrustration\n this.boundClickHandler = (e: MouseEvent) => this.handleClick(e)\n }\n\n start(): void {\n if (this.active) return\n this.active = true\n document.addEventListener('click', this.boundClickHandler, true)\n this.unsubscribeErrors = errorSource.subscribe((_e) => {\n this.errorCount++\n })\n }\n\n stop(): void {\n if (!this.active) return\n this.active = false\n document.removeEventListener('click', this.boundClickHandler, true)\n this.unsubscribeErrors?.()\n this.unsubscribeErrors = null\n this.clickHistory = []\n }\n\n private handleClick(e: MouseEvent): void {\n const target = e.target as Element | null\n if (!target) return\n\n if (this.isWidgetElement(target)) return\n\n const now = Date.now()\n this.clickHistory.push({ target, time: now })\n\n const cutoff = now - RAGE_CLICK_WINDOW_MS\n this.clickHistory = this.clickHistory.filter(r => r.time > cutoff)\n\n const sameTargetClicks = this.clickHistory.filter(r => r.target === target)\n if (sameTargetClicks.length >= RAGE_CLICK_THRESHOLD) {\n this.clickHistory = []\n this.emitHighPriority({\n signal: 'rage_click',\n target: describeElement(target),\n timestamp: now,\n })\n return\n }\n\n if (!this.isInteractive(target)) {\n this.deadClickCount++\n if (this.deadClickCount >= 3 && this.errorCount > 0) {\n this.deadClickCount = 0\n this.errorCount = 0\n this.emitIfReady({\n signal: 'dead_click',\n target: describeElement(target),\n timestamp: now,\n })\n }\n }\n }\n\n private isInteractive(el: Element): boolean {\n if (INTERACTIVE_TAGS.has(el.tagName)) return true\n\n const role = el.getAttribute('role')\n if (role && INTERACTIVE_ROLES.has(role)) return true\n\n if (el.hasAttribute('onclick') || el.hasAttribute('tabindex')) return true\n if ((el as HTMLElement).contentEditable === 'true') return true\n\n const style = window.getComputedStyle(el)\n if (style.cursor === 'pointer') return true\n\n const parent = el.closest('a, button, [role=\"button\"], [role=\"link\"], label')\n if (parent) return true\n\n return false\n }\n\n private isWidgetElement(el: Element): boolean {\n const host = document.getElementById('mtb-widget-host')\n if (!host) return false\n return host === el || host.contains(el)\n }\n\n private emitIfReady(event: FrustrationEvent): void {\n const now = Date.now()\n if (now < this.cooldownUntil) return\n this.cooldownUntil = now + FrustrationDetector.COOLDOWN_MS\n this.onFrustration(event)\n }\n\n private emitHighPriority(event: FrustrationEvent): void {\n this.cooldownUntil = Date.now() + FrustrationDetector.COOLDOWN_MS\n this.onFrustration(event)\n }\n}\n\nfunction describeElement(el: Element): string {\n const tag = el.tagName.toLowerCase()\n const id = el.id ? `#${el.id}` : ''\n const cls = el.className && typeof el.className === 'string'\n ? '.' + el.className.trim().split(/\\s+/).slice(0, 2).join('.')\n : ''\n const text = el.textContent?.trim().slice(0, 30) ?? ''\n return `<${tag}${id}${cls}>${text ? ` \"${text}\"` : ''}`\n}\n","export interface PageContext {\n page_url: string\n user_agent: string\n browser: string\n os: string\n screen_width: number\n screen_height: number\n}\n\nexport function collectPageContext(): PageContext {\n return {\n page_url: window.location.href,\n user_agent: navigator.userAgent,\n browser: detectBrowser(),\n os: detectOS(),\n screen_width: window.screen.width,\n screen_height: window.screen.height,\n }\n}\n\nfunction detectBrowser(): string {\n const ua = navigator.userAgent\n if (/Edg\\//.test(ua)) return `Edge ${ua.match(/Edg\\/(\\S+)/)?.[1] ?? ''}`\n if (/OPR\\//.test(ua)) return `Opera ${ua.match(/OPR\\/(\\S+)/)?.[1] ?? ''}`\n if (/Chrome\\//.test(ua)) return `Chrome ${ua.match(/Chrome\\/(\\S+)/)?.[1] ?? ''}`\n if (/Safari\\//.test(ua) && /Version\\//.test(ua)) return `Safari ${ua.match(/Version\\/(\\S+)/)?.[1] ?? ''}`\n if (/Firefox\\//.test(ua)) return `Firefox ${ua.match(/Firefox\\/(\\S+)/)?.[1] ?? ''}`\n return 'Unknown'\n}\n\nfunction detectOS(): string {\n const ua = navigator.userAgent\n if (/Windows NT 10/.test(ua)) return 'Windows 10/11'\n if (/Windows NT/.test(ua)) return 'Windows'\n if (/Mac OS X 10_15|macOS 1[56789]/.test(ua)) return 'macOS'\n if (/Mac OS X/.test(ua)) return 'macOS'\n if (/Android/.test(ua)) return `Android ${ua.match(/Android (\\d+)/)?.[1] ?? ''}`\n if (/iPhone|iPad|iPod/.test(ua)) return 'iOS'\n if (/Linux/.test(ua)) return 'Linux'\n return 'Unknown'\n}\n","import type { FeedbackPayload } from '../types'\n\nconst DEFAULT_API_URL = 'https://makethisbetter.dev/api/v1'\n\nexport class ApiClient {\n private apiUrl: string\n private projectKey: string\n private retryDelayMs: number\n\n constructor(projectKey: string, apiUrl?: string, retryDelayMs = 1000) {\n this.projectKey = projectKey\n this.apiUrl = (apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, '')\n this.retryDelayMs = retryDelayMs\n }\n\n async submitFeedback(payload: FeedbackPayload, screenshot: Blob | null): Promise<void> {\n const form = new FormData()\n form.append('feedback[description]', payload.description)\n form.append('feedback[page_url]', payload.page_url)\n form.append('feedback[user_agent]', payload.user_agent)\n form.append('feedback[browser]', payload.browser)\n form.append('feedback[os]', payload.os)\n form.append('feedback[screen_width]', String(payload.screen_width))\n form.append('feedback[screen_height]', String(payload.screen_height))\n form.append('feedback[console_errors]', JSON.stringify(payload.console_errors))\n form.append('feedback[annotations]', JSON.stringify(payload.annotations))\n\n if (payload.target_element) {\n form.append('feedback[target_element]', JSON.stringify(payload.target_element))\n }\n if (payload.user_id) form.append('feedback[user_id]', payload.user_id)\n if (payload.user_email) form.append('feedback[user_email]', payload.user_email)\n if (payload.user_name) form.append('feedback[user_name]', payload.user_name)\n\n if (payload.recording_events && payload.recording_events.length > 0) {\n const json = JSON.stringify(payload.recording_events)\n const blob = new Blob([json], { type: 'application/json' })\n form.append('feedback[recording]', blob, 'recording.json')\n form.append('feedback[recording_duration]', String(payload.recording_duration ?? 0))\n }\n\n if (screenshot) {\n form.append('feedback[screenshot]', screenshot, 'screenshot.png')\n }\n\n await this.fetchWithRetry(`${this.apiUrl}/widget/feedbacks`, {\n method: 'POST',\n headers: { 'X-Project-Key': this.projectKey },\n body: form,\n })\n }\n\n private async fetchWithRetry(url: string, init: RequestInit, retries = 1): Promise<Response> {\n let res: Response\n try {\n res = await fetch(url, init)\n } catch (err) {\n if (retries > 0) {\n await delay(this.retryDelayMs)\n return this.fetchWithRetry(url, init, retries - 1)\n }\n throw err\n }\n\n if (res.ok) return res\n if (res.status >= 500 && retries > 0) {\n await delay(this.retryDelayMs)\n return this.fetchWithRetry(url, init, retries - 1)\n }\n throw new Error(`HTTP ${res.status}`)\n }\n}\n\nfunction delay(ms: number): Promise<void> {\n if (ms <= 0) return Promise.resolve()\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n","import type { PageContext } from '../context/collector'\nimport type { Annotation, FeedbackPayload, MakeThisBetterConfig } from '../types'\nimport type { RecordingResult } from '../record/session'\n\nexport function buildPayload(\n description: string,\n pageContext: PageContext,\n consoleErrors: string[],\n annotation: Annotation | null,\n user: MakeThisBetterConfig['user'],\n recording?: RecordingResult,\n): FeedbackPayload {\n return {\n description,\n ...pageContext,\n console_errors: consoleErrors,\n annotations: annotation ? [annotation] : [],\n target_element: annotation?.targetSelector\n ? {\n selector: annotation.targetSelector,\n text: annotation.targetText ?? '',\n name: annotation.targetName ?? '',\n }\n : undefined,\n user_id: user?.id,\n user_email: user?.email,\n user_name: user?.name,\n recording_events: recording?.events,\n recording_duration: recording?.duration,\n }\n}\n","import en from './en'\nimport zhCN from './zh-CN'\n\nexport type I18nMessages = typeof en\n\nconst locales: Record<string, I18nMessages> = {\n en,\n 'zh-CN': zhCN,\n}\n\nexport function getMessages(locale: string): I18nMessages {\n if (locales[locale]) return locales[locale]\n const lang = locale.split('-')[0]\n if (locales[lang]) return locales[lang]\n return locales['en']\n}\n","export default {\n tab: 'Feedback',\n toolbar: {\n markup: 'Mark up',\n record: 'Record',\n hint: 'Click any element to annotate · drag to draw',\n hintRecord: 'Recording your screen',\n exit: 'Exit',\n },\n popup: {\n about: 'About',\n placeholder: 'Describe the issue or suggestion...',\n submit: 'Submit',\n cancel: 'Cancel',\n quickOptions: [\n { emoji: '🐛', label: 'Something is broken' },\n { emoji: '💡', label: 'I wish this worked differently' },\n { emoji: '🤔', label: \"I don't understand this\" },\n { emoji: '✨', label: 'I have an idea' },\n ],\n },\n success: {\n title: 'Thanks!',\n message: 'Your feedback has been received.',\n close: 'Close',\n },\n error: {\n submit: 'Failed to submit. Please try again.',\n },\n pet: {\n bubble: 'Need help?',\n },\n frustration: {\n prompt: 'Something not working? Tell us.',\n action: 'Annotate',\n dismiss: 'Dismiss',\n },\n annotation: {\n drawing: 'Drawing',\n element: 'element',\n },\n record: {\n stop: 'Stop',\n timer_label: 'Recording',\n max_reached: 'Maximum recording time reached',\n },\n}\n","export default {\n tab: '反馈',\n toolbar: {\n markup: '标注',\n record: '录屏',\n hint: '点击任意元素进行标注 · 拖拽可自由绘制',\n hintRecord: '正在录制屏幕',\n exit: '退出',\n },\n popup: {\n about: '关于',\n placeholder: '描述问题或建议...',\n submit: '提交',\n cancel: '取消',\n quickOptions: [\n { emoji: '🐛', label: '这里有问题' },\n { emoji: '💡', label: '我希望它能更好用' },\n { emoji: '🤔', label: '我看不懂这里' },\n { emoji: '✨', label: '我有个想法' },\n ],\n },\n success: {\n title: '感谢!',\n message: '您的反馈已收到。',\n close: '关闭',\n },\n error: {\n submit: '提交失败,请重试。',\n },\n pet: {\n bubble: '需要帮助吗?',\n },\n frustration: {\n prompt: '遇到问题了?告诉我们。',\n action: '标注',\n dismiss: '关闭',\n },\n annotation: {\n drawing: '绘制',\n element: '元素',\n },\n record: {\n stop: '停止',\n timer_label: '录制中',\n max_reached: '已达到最大录制时长',\n },\n}\n","import type { ShadowContainer } from '../widget/shadow'\n\ntype RRWebEvent = Record<string, unknown>\ntype StopFn = () => void\n\ninterface RRWebRecordFn {\n (options: { emit: (event: RRWebEvent) => void }): StopFn\n addCustomEvent: (tag: string, payload: Record<string, unknown>) => void\n}\n\nexport interface RecordingResult {\n events: RRWebEvent[]\n duration: number\n}\n\nconst MAX_DURATION_S = 60\nconst RRWEB_CDN = 'https://cdn.jsdelivr.net/npm/rrweb@2/dist/rrweb.min.js'\n\nlet rrwebLoaded: Promise<RRWebRecordFn> | null = null\n\nfunction loadRrweb(): Promise<RRWebRecordFn> {\n if (rrwebLoaded) return rrwebLoaded\n rrwebLoaded = loadViaImport().catch(() => loadViaCdn())\n return rrwebLoaded\n}\n\nasync function loadViaImport(): Promise<RRWebRecordFn> {\n const mod = await import('rrweb')\n return mod.record as unknown as RRWebRecordFn\n}\n\nfunction loadViaCdn(): Promise<RRWebRecordFn> {\n return new Promise((resolve, reject) => {\n const win = globalThis as unknown as Window & { rrweb?: { record: RRWebRecordFn } }\n if (win.rrweb?.record) { resolve(win.rrweb.record); return }\n const script = document.createElement('script')\n script.src = RRWEB_CDN\n script.onload = () => {\n const w = globalThis as unknown as Window & { rrweb?: { record: RRWebRecordFn } }\n if (w.rrweb?.record) resolve(w.rrweb.record)\n else reject(new Error('rrweb global not found after script load'))\n }\n script.onerror = () => reject(new Error('Failed to load rrweb from CDN'))\n document.head.appendChild(script)\n })\n}\n\nexport class RecordSession {\n private events: RRWebEvent[] = []\n private stopFn: StopFn | null = null\n private startedAt = 0\n private timer: ReturnType<typeof setTimeout> | null = null\n private clickHandler: ((e: MouseEvent) => void) | null = null\n private shadow: ShadowContainer\n private onMaxReached?: () => void\n private stopped = false\n\n constructor(shadow: ShadowContainer, onMaxReached?: () => void) {\n this.shadow = shadow\n this.onMaxReached = onMaxReached\n }\n\n async start(): Promise<void> {\n const record = await loadRrweb()\n\n this.startedAt = Date.now()\n this.stopped = false\n\n this.stopFn = record({\n emit: (event: RRWebEvent) => {\n if (!this.stopped) this.events.push(event)\n },\n })\n\n this.clickHandler = (e: MouseEvent) => {\n this.showClickRipple(e.clientX, e.clientY)\n record.addCustomEvent?.('mtb-click', {\n x: e.clientX,\n y: e.clientY,\n target: e.target instanceof HTMLElement ? e.target.tagName : '',\n })\n }\n document.addEventListener('click', this.clickHandler, true)\n\n this.timer = setTimeout(() => {\n this.onMaxReached?.()\n }, MAX_DURATION_S * 1000)\n }\n\n stop(): RecordingResult {\n this.stopped = true\n this.stopFn?.()\n this.stopFn = null\n this.cleanupTimer()\n this.cleanupClickHandler()\n\n return {\n events: this.events,\n duration: this.getDuration(),\n }\n }\n\n getDuration(): number {\n if (this.startedAt === 0) return 0\n return Math.round((Date.now() - this.startedAt) / 1000)\n }\n\n destroy(): void {\n this.stopped = true\n this.stopFn?.()\n this.stopFn = null\n this.cleanupTimer()\n this.cleanupClickHandler()\n this.events = []\n this.startedAt = 0\n }\n\n private cleanupTimer(): void {\n if (this.timer) {\n clearTimeout(this.timer)\n this.timer = null\n }\n }\n\n private cleanupClickHandler(): void {\n if (this.clickHandler) {\n document.removeEventListener('click', this.clickHandler, true)\n this.clickHandler = null\n }\n }\n\n private showClickRipple(x: number, y: number): void {\n const ripple = this.shadow.el<HTMLDivElement>('div', 'mtb-click-ripple')\n ripple.style.left = `${x}px`\n ripple.style.top = `${y}px`\n this.shadow.append(ripple)\n ripple.addEventListener('animationend', () => ripple.remove())\n }\n}\n","import type { ShadowContainer } from '../widget/shadow'\nimport type { I18nMessages } from '../i18n'\n\nexport class RecordControlBar {\n private el: HTMLDivElement\n private timerEl!: HTMLSpanElement\n private intervalId: ReturnType<typeof setInterval> | null = null\n private getDuration: () => number\n\n constructor(\n shadow: ShadowContainer,\n messages: I18nMessages,\n getDuration: () => number,\n onStop: () => void,\n ) {\n this.getDuration = getDuration\n\n this.el = shadow.el<HTMLDivElement>('div', 'mtb-record-bar')\n this.el.innerHTML = `\n <span class=\"mtb-record-dot\"></span>\n <span class=\"mtb-record-timer\">00:00</span>\n <button class=\"mtb-record-stop\" type=\"button\">${messages.record.stop}</button>\n `\n shadow.append(this.el)\n\n this.timerEl = this.el.querySelector('.mtb-record-timer')!\n this.el.querySelector('.mtb-record-stop')!.addEventListener('click', onStop)\n\n this.intervalId = setInterval(() => this.updateTimer(), 1000)\n }\n\n private updateTimer(): void {\n const secs = this.getDuration()\n const mm = String(Math.floor(secs / 60)).padStart(2, '0')\n const ss = String(secs % 60).padStart(2, '0')\n this.timerEl.textContent = `${mm}:${ss}`\n }\n\n destroy(): void {\n if (this.intervalId) {\n clearInterval(this.intervalId)\n this.intervalId = null\n }\n this.el.remove()\n }\n}\n","import { ShadowContainer } from './shadow'\nimport { FeedbackTab } from './tab'\nimport { PetEntry } from './pet'\nimport { FrustrationPromptCard } from './frustration-prompt'\nimport { AnnotationToolbar } from '../annotate/toolbar'\nimport type { ToolbarMode } from '../annotate/toolbar'\nimport { AnnotationSession } from '../annotate/session'\nimport { CommentPopup } from '../popup/comment'\nimport { SuccessCard } from '../popup/success'\nimport { captureScreenshot } from '../screenshot/capture'\nimport { ConsoleErrorCollector } from '../context/console'\nimport { FrustrationDetector } from '../context/frustration'\nimport { collectPageContext } from '../context/collector'\nimport { ApiClient } from '../api/client'\nimport { buildPayload } from './payload'\nimport { getMessages } from '../i18n'\nimport { RecordSession } from '../record/session'\nimport type { RecordingResult } from '../record/session'\nimport { RecordControlBar } from '../record/control-bar'\nimport type { MakeThisBetterConfig, Annotation } from '../types'\n\ntype Mode = 'idle' | 'annotating' | 'recording' | 'popup'\n\nexport class WidgetController {\n private config: MakeThisBetterConfig\n private shadow!: ShadowContainer\n private tab: FeedbackTab | null = null\n private pet: PetEntry | null = null\n private toolbar: AnnotationToolbar | null = null\n private session: AnnotationSession | null = null\n private popup: CommentPopup | null = null\n private success: SuccessCard | null = null\n private frustrationPrompt: FrustrationPromptCard | null = null\n private apiClient: ApiClient\n private consoleCollector: ConsoleErrorCollector\n private frustrationDetector: FrustrationDetector | null = null\n private messages: ReturnType<typeof getMessages>\n private mode: Mode = 'idle'\n private currentAnnotation: Annotation | null = null\n private recordSession: RecordSession | null = null\n private recordBar: RecordControlBar | null = null\n private currentRecording: RecordingResult | null = null\n\n constructor(config: MakeThisBetterConfig) {\n this.config = config\n this.messages = getMessages(config.locale ?? 'en')\n this.apiClient = new ApiClient(config.projectKey, config.apiUrl)\n this.consoleCollector = new ConsoleErrorCollector()\n this.consoleCollector.start()\n this.buildUI()\n\n if (config.frustrationDetection !== false) {\n this.frustrationDetector = new FrustrationDetector(() => this.handleFrustration())\n this.frustrationDetector.start()\n }\n }\n\n private buildUI(): void {\n this.shadow = new ShadowContainer(this.config.theme ?? 'auto')\n\n if ((this.config.entryMode ?? 'button') === 'pet') {\n this.pet = new PetEntry(this.shadow, this.messages, () => this.handleTabClick())\n } else {\n this.tab = new FeedbackTab(\n this.shadow,\n this.messages,\n this.config.position ?? 'right',\n () => this.handleTabClick(),\n )\n }\n }\n\n private handleTabClick(): void {\n if (this.mode === 'idle') {\n this.dismissFrustrationPrompt()\n this.enterAnnotationMode()\n } else {\n this.exitAll()\n }\n }\n\n private handleFrustration(): void {\n if (this.mode !== 'idle' || this.frustrationPrompt) return\n\n this.frustrationPrompt = new FrustrationPromptCard(this.shadow, this.messages, {\n onTell: () => {\n this.dismissFrustrationPrompt()\n this.enterAnnotationMode()\n },\n onDismiss: () => this.dismissFrustrationPrompt(),\n })\n }\n\n private dismissFrustrationPrompt(): void {\n this.frustrationPrompt?.destroy()\n this.frustrationPrompt = null\n }\n\n private enterAnnotationMode(): void {\n this.mode = 'annotating'\n this.tab?.setActive(true)\n this.pet?.setActive(true)\n\n this.toolbar = new AnnotationToolbar(\n this.shadow,\n this.messages,\n () => this.exitAll(),\n (mode: ToolbarMode) => this.handleToolbarModeChange(mode),\n )\n this.session = new AnnotationSession(this.shadow, this.messages, (annotation, targetName) => {\n this.currentAnnotation = annotation\n this.showPopup(annotation.x, annotation.y, targetName)\n })\n }\n\n private handleToolbarModeChange(mode: ToolbarMode): void {\n if (mode === 'record') {\n this.enterRecordingMode()\n } else {\n this.exitRecordingMode()\n if (!this.session) {\n this.session = new AnnotationSession(this.shadow, this.messages, (annotation, targetName) => {\n this.currentAnnotation = annotation\n this.showPopup(annotation.x, annotation.y, targetName)\n })\n }\n this.mode = 'annotating'\n }\n }\n\n private async enterRecordingMode(): Promise<void> {\n this.mode = 'recording'\n this.session?.destroy()\n this.session = null\n\n this.recordSession = new RecordSession(this.shadow, () => this.stopRecording())\n this.recordBar = new RecordControlBar(\n this.shadow,\n this.messages,\n () => this.recordSession?.getDuration() ?? 0,\n () => this.stopRecording(),\n )\n\n await this.recordSession.start()\n }\n\n private stopRecording(): void {\n if (!this.recordSession) return\n this.currentRecording = this.recordSession.stop()\n this.exitRecordingMode()\n this.showPopup(\n window.innerWidth / 2,\n window.innerHeight / 2,\n this.messages.record.timer_label,\n )\n }\n\n private exitRecordingMode(): void {\n this.recordSession?.destroy()\n this.recordSession = null\n this.recordBar?.destroy()\n this.recordBar = null\n }\n\n private showPopup(x: number, y: number, targetName: string): void {\n this.mode = 'popup'\n this.session?.dismissInteraction()\n\n this.popup = new CommentPopup(this.shadow, {\n targetName,\n x,\n y,\n messages: this.messages,\n onSubmit: (description) => this.handleSubmit(description),\n onClose: () => this.exitAll(),\n })\n }\n\n private async handleSubmit(description: string): Promise<void> {\n if (!this.popup) return\n this.popup.setLoading(true)\n const annotation = this.currentAnnotation\n const recording = this.currentRecording ?? undefined\n\n const [screenshot, pageContext] = await Promise.all([\n captureScreenshot(annotation ? [annotation] : []),\n Promise.resolve(collectPageContext()),\n ])\n\n const payload = buildPayload(\n description,\n pageContext,\n this.consoleCollector.getErrors(),\n annotation,\n this.config.user,\n recording,\n )\n\n try {\n await this.apiClient.submitFeedback(payload, screenshot)\n this.popup?.destroy()\n this.popup = null\n this.session?.destroy()\n this.session = null\n this.currentRecording = null\n this.showSuccess()\n } catch {\n this.popup?.setLoading(false)\n this.popup?.setError(this.messages.error.submit)\n }\n }\n\n private showSuccess(): void {\n this.mode = 'idle'\n this.tab?.setActive(false)\n this.pet?.setActive(false)\n this.success = new SuccessCard(this.shadow, this.messages, () => {\n this.success?.destroy()\n this.success = null\n })\n }\n\n private exitAll(): void {\n this.mode = 'idle'\n this.tab?.setActive(false)\n this.pet?.setActive(false)\n this.toolbar?.destroy()\n this.toolbar = null\n this.session?.destroy()\n this.session = null\n this.popup?.destroy()\n this.popup = null\n this.currentAnnotation = null\n this.currentRecording = null\n this.exitRecordingMode()\n }\n\n destroy(): void {\n this.exitAll()\n this.consoleCollector.stop()\n this.frustrationDetector?.stop()\n this.dismissFrustrationPrompt()\n this.success?.destroy()\n this.tab?.destroy()\n this.pet?.destroy()\n this.exitRecordingMode()\n this.shadow.destroy()\n }\n}\n","import { WidgetController } from './widget/controller'\nimport type { MakeThisBetterConfig } from './types'\n\nlet instance: WidgetController | null = null\n\nconst MakeThisBetter = {\n init(config: MakeThisBetterConfig): void {\n if (instance) {\n instance.destroy()\n instance = null\n }\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => {\n instance = new WidgetController(config)\n })\n } else {\n instance = new WidgetController(config)\n }\n },\n\n destroy(): void {\n instance?.destroy()\n instance = null\n },\n}\n\nexport { MakeThisBetter }\nexport type { MakeThisBetterConfig }\n\nif (typeof window !== 'undefined') {\n (window as Window & { MakeThisBetter?: typeof MakeThisBetter }).MakeThisBetter = MakeThisBetter\n}\n"],"names":["ShadowContainer","theme","style","cssText","tag","className","el","nodes","n","FeedbackTab","shadow","messages","position","onClick","active","BRAND_COLOR","DRAW_STROKE","PetEntry","e","FRUSTRATION_DISMISS_MS","FrustrationPromptCard","handlers","AnnotationToolbar","onExit","onModeChange","m","mode","AnnotationOverlay","ElementHighlighter","rect","getElementName","label","title","text","placeholder","alt","dataMark","getCssSelector","parts","current","selector","classNames","c","parent","siblings","idx","PinMarker","x","y","index","pin","DrawLayer","onDrawComplete","center","pathD","annotation","fx","fy","d","i","xs","p","ys","cx","cy","DRAW_MIN_POINTS","AnnotationSession","onReady","underEl","getElementUnder","targetName","host","CommentPopup","opts","quickOpts","o","escapeHtml","vw","vh","margin","left","top","btn","hasText","loading","message","SUCCESS_AUTO_CLOSE_MS","SuccessCard","onClose","resolveUrl","url","baseUrl","doc","base","a","uuid","counter","random","toArray","arrayLike","arr","l","styleProps","getStyleProperties","options","px","node","styleProperty","val","getNodeWidth","leftBorder","rightBorder","getNodeHeight","topBorder","bottomBorder","getImageSize","targetNode","width","height","getPixelRatio","ratio","FINAL_PROCESS","canvasDimensionLimit","checkCanvasDimensions","canvas","createImage","resolve","reject","img","svgToDataURL","svg","html","nodeToDataURL","xmlns","foreignObject","isInstanceOfElement","instance","nodePrototype","formatCSSText","content","formatCSSProperties","name","value","priority","getPseudoElementStyle","pseudo","clonePseudoElement","nativeNode","clonedNode","styleElement","clonePseudoElements","WOFF","JPEG","mimes","getExtension","match","getMimeType","extension","getContentFromDataUrl","dataURL","isDataUrl","makeDataUrl","mimeType","fetchAsDataURL","init","process","res","blob","reader","error","cache","getCacheKey","contentType","includeQueryParams","key","resourceToDataURL","resourceUrl","cacheKey","result","msg","cloneCanvasElement","cloneVideoElement","video","ctx","poster","cloneIFrameElement","iframe","_a","cloneNode","cloneSingleNode","isSVGElement","isSlotElement","cloneChildren","_b","children","deferred","child","clonedChild","cloneCSSStyle","targetStyle","sourceStyle","cloneInputValue","cloneSelectValue","clonedSelect","selectedOption","decorate","ensureSVGSymbols","clone","uses","processedDefs","id","exist","definition","ns","defs","isRoot","URL_REGEX","URL_WITH_FORMAT_REGEX","FONT_SRC_REGEX","toRegex","escaped","parseURLs","urls","raw","quotation","embed","resourceURL","baseURL","getContentFromUrl","resolvedURL","filterPreferredFontFormat","str","preferredFontFormat","src","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","item","importIndex","metadata","rule","inline","err","getWebFontRules","cssRules","parseWebFontRules","normalizeFontFamily","font","getUsedFonts","fonts","traverse","getWebFontCSS","rules","usedFonts","embedWebFonts","styleNode","sytleContent","toSvg","toCanvas","context","canvasWidth","canvasHeight","toPng","captureScreenshot","annotations","annotationLayer","mountCaptureAnnotations","dataUrl","dataUrlToBlob","layer","buildCapturePin","buildCaptureDraw","drawPath","path","header","mime","binary","bytes","ErrorSource","listener","line","col","reason","event","errorSource","MAX_CONSOLE_ERRORS","ConsoleErrorCollector","location","RAGE_CLICK_THRESHOLD","RAGE_CLICK_WINDOW_MS","INTERACTIVE_TAGS","INTERACTIVE_ROLES","_FrustrationDetector","onFrustration","_e","target","now","cutoff","r","describeElement","role","FrustrationDetector","cls","collectPageContext","detectBrowser","detectOS","ua","DEFAULT_API_URL","ApiClient","projectKey","apiUrl","retryDelayMs","payload","screenshot","form","json","retries","delay","ms","buildPayload","description","pageContext","consoleErrors","user","recording","locales","getMessages","locale","lang","MAX_DURATION_S","RRWEB_CDN","rrwebLoaded","loadRrweb","loadViaImport","loadViaCdn","win","script","w","RecordSession","onMaxReached","record","ripple","RecordControlBar","getDuration","onStop","secs","mm","ss","WidgetController","config","MakeThisBetter"],"mappings":"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","x_google_ignoreList":[13,14,15,16,17,18,19,20,21,22]}
@@ -0,0 +1,31 @@
1
+ import type { ShadowContainer } from '../widget/shadow';
2
+ import type { I18nMessages } from '../i18n';
3
+ interface PopupOptions {
4
+ targetName: string;
5
+ x: number;
6
+ y: number;
7
+ onSubmit: (description: string) => void;
8
+ onClose: () => void;
9
+ messages: I18nMessages;
10
+ }
11
+ export declare class CommentPopup {
12
+ private el;
13
+ private textarea;
14
+ private submitBtn;
15
+ private errorEl;
16
+ private onSubmit;
17
+ private onClose;
18
+ private submitLabel;
19
+ private loading;
20
+ constructor(shadow: ShadowContainer, opts: PopupOptions);
21
+ private buildHTML;
22
+ private positionPopup;
23
+ private bindEvents;
24
+ private updateSubmitState;
25
+ private submit;
26
+ setLoading(loading: boolean): void;
27
+ setError(message: string): void;
28
+ destroy(): void;
29
+ }
30
+ export {};
31
+ //# sourceMappingURL=comment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment.d.ts","sourceRoot":"","sources":["../../src/popup/comment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,UAAU,YAAY;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAA;IACvC,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,QAAQ,EAAE,YAAY,CAAA;CACvB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,OAAO,CAAQ;gBAEX,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY;IAiBvD,OAAO,CAAC,SAAS;IA0CjB,OAAO,CAAC,aAAa;IAwBrB,OAAO,CAAC,UAAU;IA0BlB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,MAAM;IAMd,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAclC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK/B,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=comment.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment.test.d.ts","sourceRoot":"","sources":["../../src/popup/comment.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import type { ShadowContainer } from '../widget/shadow';
2
+ import type { I18nMessages } from '../i18n';
3
+ export declare class SuccessCard {
4
+ private el;
5
+ constructor(shadow: ShadowContainer, messages: I18nMessages, onClose: () => void);
6
+ destroy(): void;
7
+ }
8
+ //# sourceMappingURL=success.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"success.d.ts","sourceRoot":"","sources":["../../src/popup/success.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAK3C,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAgB;gBAEd,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,IAAI;IAoBhF,OAAO,IAAI,IAAI;CAGhB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=success.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"success.test.d.ts","sourceRoot":"","sources":["../../src/popup/success.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ import type { ShadowContainer } from '../widget/shadow';
2
+ import type { I18nMessages } from '../i18n';
3
+ export declare class RecordControlBar {
4
+ private el;
5
+ private timerEl;
6
+ private intervalId;
7
+ private getDuration;
8
+ constructor(shadow: ShadowContainer, messages: I18nMessages, getDuration: () => number, onStop: () => void);
9
+ private updateTimer;
10
+ destroy(): void;
11
+ }
12
+ //# sourceMappingURL=control-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-bar.d.ts","sourceRoot":"","sources":["../../src/record/control-bar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,WAAW,CAAc;gBAG/B,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,MAAM,MAAM,EACzB,MAAM,EAAE,MAAM,IAAI;IAkBpB,OAAO,CAAC,WAAW;IAOnB,OAAO,IAAI,IAAI;CAOhB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=control-bar.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"control-bar.test.d.ts","sourceRoot":"","sources":["../../src/record/control-bar.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import type { ShadowContainer } from '../widget/shadow';
2
+ type RRWebEvent = Record<string, unknown>;
3
+ export interface RecordingResult {
4
+ events: RRWebEvent[];
5
+ duration: number;
6
+ }
7
+ export declare class RecordSession {
8
+ private events;
9
+ private stopFn;
10
+ private startedAt;
11
+ private timer;
12
+ private clickHandler;
13
+ private shadow;
14
+ private onMaxReached?;
15
+ private stopped;
16
+ constructor(shadow: ShadowContainer, onMaxReached?: () => void);
17
+ start(): Promise<void>;
18
+ stop(): RecordingResult;
19
+ getDuration(): number;
20
+ destroy(): void;
21
+ private cleanupTimer;
22
+ private cleanupClickHandler;
23
+ private showClickRipple;
24
+ }
25
+ export {};
26
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/record/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEvD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAQzC,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,UAAU,EAAE,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAkCD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,KAAK,CAA6C;IAC1D,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,YAAY,CAAC,CAAY;IACjC,OAAO,CAAC,OAAO,CAAQ;gBAEX,MAAM,EAAE,eAAe,EAAE,YAAY,CAAC,EAAE,MAAM,IAAI;IAKxD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2B5B,IAAI,IAAI,eAAe;IAavB,WAAW,IAAI,MAAM;IAKrB,OAAO,IAAI,IAAI;IAUf,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,eAAe;CAOxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=session.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.test.d.ts","sourceRoot":"","sources":["../../src/record/session.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { Annotation } from '../types';
2
+ export declare function captureScreenshot(annotations?: Annotation[]): Promise<Blob | null>;
3
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/screenshot/capture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAE1C,wBAAsB,iBAAiB,CAAC,WAAW,GAAE,UAAU,EAAO,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAkB5F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=capture.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.test.d.ts","sourceRoot":"","sources":["../../src/screenshot/capture.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,9 @@
1
+ export declare const BRAND_COLOR = "#059669";
2
+ export declare const DRAW_STROKE: {
3
+ readonly color: "#059669";
4
+ readonly width: "3.5";
5
+ readonly linecap: "round";
6
+ readonly linejoin: "round";
7
+ readonly filter: "drop-shadow(0 1px 2px rgba(5,150,105,0.35))";
8
+ };
9
+ //# sourceMappingURL=styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,YAAY,CAAA;AAEpC,eAAO,MAAM,WAAW;;;;;;CAMd,CAAA"}
@@ -0,0 +1,45 @@
1
+ export interface MakeThisBetterConfig {
2
+ projectKey: string;
3
+ entryMode?: 'button' | 'pet';
4
+ locale?: string;
5
+ position?: 'left' | 'right';
6
+ theme?: 'light' | 'dark' | 'auto';
7
+ apiUrl?: string;
8
+ frustrationDetection?: boolean;
9
+ user?: {
10
+ id?: string;
11
+ email?: string;
12
+ name?: string;
13
+ };
14
+ }
15
+ export interface Annotation {
16
+ type: 'pin' | 'draw';
17
+ x: number;
18
+ y: number;
19
+ targetSelector?: string;
20
+ targetText?: string;
21
+ targetName?: string;
22
+ drawPath?: string;
23
+ }
24
+ export interface FeedbackPayload {
25
+ description: string;
26
+ page_url: string;
27
+ user_agent: string;
28
+ browser: string;
29
+ os: string;
30
+ screen_width: number;
31
+ screen_height: number;
32
+ console_errors: string[];
33
+ annotations: Annotation[];
34
+ target_element?: {
35
+ selector: string;
36
+ text: string;
37
+ name: string;
38
+ };
39
+ user_id?: string;
40
+ user_email?: string;
41
+ user_name?: string;
42
+ recording_events?: Record<string, unknown>[];
43
+ recording_duration?: number;
44
+ }
45
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IAC3B,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAA;IACjC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,IAAI,CAAC,EAAE;QACL,EAAE,CAAC,EAAE,MAAM,CAAA;QACX,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,KAAK,GAAG,MAAM,CAAA;IACpB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;IACV,YAAY,EAAE,MAAM,CAAA;IACpB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,WAAW,EAAE,UAAU,EAAE,CAAA;IACzB,cAAc,CAAC,EAAE;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IAC5C,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B"}