@launchsecure/launch-kit 0.0.29 → 0.0.30

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 (191) hide show
  1. package/dist/beacon/beacon.mjs +2759 -1246
  2. package/dist/beacon/beacon.mjs.map +1 -1
  3. package/dist/beacon/beacon.umd.js +710 -95
  4. package/dist/beacon/beacon.umd.js.map +1 -1
  5. package/dist/beacon/types/core.d.ts +14 -0
  6. package/dist/beacon/types/core.d.ts.map +1 -0
  7. package/dist/beacon/types/ctx.d.ts +14 -0
  8. package/dist/beacon/types/ctx.d.ts.map +1 -0
  9. package/dist/beacon/types/element.d.ts +16 -48
  10. package/dist/beacon/types/element.d.ts.map +1 -1
  11. package/dist/beacon/types/index.d.ts +5 -4
  12. package/dist/beacon/types/index.d.ts.map +1 -1
  13. package/dist/beacon/types/internal/annotation-cache.d.ts +10 -0
  14. package/dist/beacon/types/internal/annotation-cache.d.ts.map +1 -0
  15. package/dist/beacon/types/internal/element-capture.d.ts +19 -0
  16. package/dist/beacon/types/internal/element-capture.d.ts.map +1 -0
  17. package/dist/beacon/types/internal/event-buffer.d.ts +16 -0
  18. package/dist/beacon/types/internal/event-buffer.d.ts.map +1 -0
  19. package/dist/beacon/types/internal/framework-detect.d.ts +6 -0
  20. package/dist/beacon/types/internal/framework-detect.d.ts.map +1 -0
  21. package/dist/beacon/types/internal/markers.d.ts +17 -0
  22. package/dist/beacon/types/internal/markers.d.ts.map +1 -0
  23. package/dist/beacon/types/internal/monitor/capture-dom.d.ts +14 -0
  24. package/dist/beacon/types/internal/monitor/capture-dom.d.ts.map +1 -0
  25. package/dist/beacon/types/internal/monitor/capture-network.d.ts +12 -0
  26. package/dist/beacon/types/internal/monitor/capture-network.d.ts.map +1 -0
  27. package/dist/beacon/types/internal/monitor/overlay.d.ts +16 -0
  28. package/dist/beacon/types/internal/monitor/overlay.d.ts.map +1 -0
  29. package/dist/beacon/types/internal/monitor/session.d.ts +41 -0
  30. package/dist/beacon/types/internal/monitor/session.d.ts.map +1 -0
  31. package/dist/beacon/types/{monitor → internal/monitor}/transport.d.ts +3 -3
  32. package/dist/beacon/types/internal/monitor/transport.d.ts.map +1 -0
  33. package/dist/beacon/types/{monitor/types.d.ts → internal/monitor/wire.d.ts} +69 -27
  34. package/dist/beacon/types/internal/monitor/wire.d.ts.map +1 -0
  35. package/dist/beacon/types/{ui → internal}/pick-mode-overlay.d.ts +4 -5
  36. package/dist/beacon/types/internal/pick-mode-overlay.d.ts.map +1 -0
  37. package/dist/beacon/types/{capture → internal}/picker.d.ts +0 -1
  38. package/dist/beacon/types/internal/picker.d.ts.map +1 -0
  39. package/dist/beacon/types/{ui → internal}/pin-popover.d.ts +1 -1
  40. package/dist/beacon/types/internal/pin-popover.d.ts.map +1 -0
  41. package/dist/beacon/types/{capture → internal}/screenshot.d.ts +1 -0
  42. package/dist/beacon/types/internal/screenshot.d.ts.map +1 -0
  43. package/dist/beacon/types/internal/selector.d.ts.map +1 -0
  44. package/dist/beacon/types/plugins/domEle.d.ts +14 -0
  45. package/dist/beacon/types/plugins/domEle.d.ts.map +1 -0
  46. package/dist/beacon/types/plugins/domSS.d.ts +8 -0
  47. package/dist/beacon/types/plugins/domSS.d.ts.map +1 -0
  48. package/dist/beacon/types/plugins/errors.d.ts +3 -0
  49. package/dist/beacon/types/plugins/errors.d.ts.map +1 -0
  50. package/dist/beacon/types/plugins/index.d.ts +8 -0
  51. package/dist/beacon/types/plugins/index.d.ts.map +1 -0
  52. package/dist/beacon/types/plugins/liveMonitor.d.ts +14 -0
  53. package/dist/beacon/types/plugins/liveMonitor.d.ts.map +1 -0
  54. package/dist/beacon/types/plugins/metadata.d.ts +3 -0
  55. package/dist/beacon/types/plugins/metadata.d.ts.map +1 -0
  56. package/dist/beacon/types/registry.d.ts +33 -0
  57. package/dist/beacon/types/registry.d.ts.map +1 -0
  58. package/dist/beacon/types/styles.d.ts +8 -0
  59. package/dist/beacon/types/styles.d.ts.map +1 -0
  60. package/dist/beacon/types/transport.d.ts +3 -0
  61. package/dist/beacon/types/transport.d.ts.map +1 -0
  62. package/dist/beacon/types/types.d.ts +152 -68
  63. package/dist/beacon/types/types.d.ts.map +1 -1
  64. package/dist/beacon/types/ui/dialog.d.ts +53 -0
  65. package/dist/beacon/types/ui/dialog.d.ts.map +1 -0
  66. package/dist/beacon/types/ui/form.d.ts +7 -0
  67. package/dist/beacon/types/ui/form.d.ts.map +1 -0
  68. package/dist/beacon/types/ui/overlay.d.ts +6 -0
  69. package/dist/beacon/types/ui/overlay.d.ts.map +1 -0
  70. package/dist/deck-client/assets/{_baseUniq-W2JQDmje.js → _baseUniq-DCt2IMRR.js} +1 -1
  71. package/dist/deck-client/assets/{arc-DIBWAId9.js → arc-h-ifqmNR.js} +1 -1
  72. package/dist/deck-client/assets/{architectureDiagram-Q4EWVU46-CAIRMvJK.js → architectureDiagram-Q4EWVU46-C9dITSPv.js} +1 -1
  73. package/dist/deck-client/assets/{blockDiagram-DXYQGD6D-BeNaNiOi.js → blockDiagram-DXYQGD6D-BHuJT34t.js} +1 -1
  74. package/dist/deck-client/assets/{c4Diagram-AHTNJAMY-B9Ozi62h.js → c4Diagram-AHTNJAMY-CpvMGtDG.js} +1 -1
  75. package/dist/deck-client/assets/channel-2PZVMiXf.js +1 -0
  76. package/dist/deck-client/assets/{chunk-4BX2VUAB-D7AZ47dt.js → chunk-4BX2VUAB-B6md1VIm.js} +1 -1
  77. package/dist/deck-client/assets/{chunk-4TB4RGXK-DnVnNPcI.js → chunk-4TB4RGXK-BmEnX8ik.js} +1 -1
  78. package/dist/deck-client/assets/{chunk-55IACEB6-UKYs-YNd.js → chunk-55IACEB6-BZPUyZAZ.js} +1 -1
  79. package/dist/deck-client/assets/{chunk-EDXVE4YY-D43b-SKn.js → chunk-EDXVE4YY-BWwNUK-l.js} +1 -1
  80. package/dist/deck-client/assets/{chunk-FMBD7UC4-QzBAoyyW.js → chunk-FMBD7UC4-o7gSppGI.js} +1 -1
  81. package/dist/deck-client/assets/{chunk-OYMX7WX6-Cjif4r6W.js → chunk-OYMX7WX6-C4KoTL5p.js} +1 -1
  82. package/dist/deck-client/assets/{chunk-QZHKN3VN-CqLDirEI.js → chunk-QZHKN3VN-jkf68sDs.js} +1 -1
  83. package/dist/deck-client/assets/{chunk-YZCP3GAM-_FQvmMs4.js → chunk-YZCP3GAM-Cd4yBE7o.js} +1 -1
  84. package/dist/deck-client/assets/classDiagram-6PBFFD2Q-Bt8xBAof.js +1 -0
  85. package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-Bt8xBAof.js +1 -0
  86. package/dist/deck-client/assets/clone-BHQryoDl.js +1 -0
  87. package/dist/deck-client/assets/{cose-bilkent-S5V4N54A-rfrocesE.js → cose-bilkent-S5V4N54A-DeGFUgAV.js} +1 -1
  88. package/dist/deck-client/assets/{dagre-KV5264BT-Bv_7DJat.js → dagre-KV5264BT-ekcYJuUV.js} +1 -1
  89. package/dist/deck-client/assets/{diagram-5BDNPKRD-4F1414G5.js → diagram-5BDNPKRD-YHPk4rV2.js} +1 -1
  90. package/dist/deck-client/assets/{diagram-G4DWMVQ6-C4-Pszqm.js → diagram-G4DWMVQ6-DM-JCd_B.js} +1 -1
  91. package/dist/deck-client/assets/{diagram-MMDJMWI5-B647TIx9.js → diagram-MMDJMWI5-l5FK1ybk.js} +1 -1
  92. package/dist/deck-client/assets/{diagram-TYMM5635-BFAqpezd.js → diagram-TYMM5635-CIN4_1-j.js} +1 -1
  93. package/dist/deck-client/assets/{erDiagram-SMLLAGMA-BfBfrJOC.js → erDiagram-SMLLAGMA-MyinSkEl.js} +1 -1
  94. package/dist/deck-client/assets/{flowDiagram-DWJPFMVM-DX9YAYes.js → flowDiagram-DWJPFMVM-Dk8nn42x.js} +1 -1
  95. package/dist/deck-client/assets/{ganttDiagram-T4ZO3ILL-DCuiy7wF.js → ganttDiagram-T4ZO3ILL-BU1ihicu.js} +1 -1
  96. package/dist/deck-client/assets/{gitGraphDiagram-UUTBAWPF-CGp1IXUh.js → gitGraphDiagram-UUTBAWPF-BjsTL13C.js} +1 -1
  97. package/dist/deck-client/assets/{graph-B7g8aoxv.js → graph-DJmh-xi7.js} +1 -1
  98. package/dist/deck-client/assets/{index-Dg1r-WSN.js → index-KsShfCV-.js} +3 -3
  99. package/dist/deck-client/assets/{infoDiagram-42DDH7IO-L3fahMkF.js → infoDiagram-42DDH7IO-Dxvy_RB4.js} +1 -1
  100. package/dist/deck-client/assets/{ishikawaDiagram-UXIWVN3A-aS_EjWBZ.js → ishikawaDiagram-UXIWVN3A-DPOaNF1l.js} +1 -1
  101. package/dist/deck-client/assets/{journeyDiagram-VCZTEJTY-djTSQZF9.js → journeyDiagram-VCZTEJTY-DMew3K5c.js} +1 -1
  102. package/dist/deck-client/assets/{kanban-definition-6JOO6SKY-CcTHo4CM.js → kanban-definition-6JOO6SKY-csciJFuk.js} +1 -1
  103. package/dist/deck-client/assets/{layout-mEJiadb7.js → layout-Dg4yyms2.js} +1 -1
  104. package/dist/deck-client/assets/{linear-XgTKqyRu.js → linear-BA3zU6gq.js} +1 -1
  105. package/dist/deck-client/assets/{min-Ct9jZdpd.js → min-lz-Ird-p.js} +1 -1
  106. package/dist/deck-client/assets/{mindmap-definition-QFDTVHPH-BaFxCGNU.js → mindmap-definition-QFDTVHPH-CCEN8OQV.js} +1 -1
  107. package/dist/deck-client/assets/{pieDiagram-DEJITSTG-CIbYYjtw.js → pieDiagram-DEJITSTG-DM6n1HY7.js} +1 -1
  108. package/dist/deck-client/assets/{quadrantDiagram-34T5L4WZ-D9EtCOvh.js → quadrantDiagram-34T5L4WZ-_ULoR66n.js} +1 -1
  109. package/dist/deck-client/assets/{requirementDiagram-MS252O5E-xeni9eVG.js → requirementDiagram-MS252O5E-BuwJs7Tn.js} +1 -1
  110. package/dist/deck-client/assets/{sankeyDiagram-XADWPNL6-LYeknz9h.js → sankeyDiagram-XADWPNL6-BEsuzkW4.js} +1 -1
  111. package/dist/deck-client/assets/{sequenceDiagram-FGHM5R23-RDbsKFZf.js → sequenceDiagram-FGHM5R23-CP2H0YWf.js} +1 -1
  112. package/dist/deck-client/assets/{stateDiagram-FHFEXIEX-BH1Zjglk.js → stateDiagram-FHFEXIEX-B5Gw_NNL.js} +1 -1
  113. package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-4T4wMDXr.js +1 -0
  114. package/dist/deck-client/assets/{timeline-definition-GMOUNBTQ-IFXxKptt.js → timeline-definition-GMOUNBTQ-DsoYydQa.js} +1 -1
  115. package/dist/deck-client/assets/{vennDiagram-DHZGUBPP-D-sLkQs9.js → vennDiagram-DHZGUBPP-Dz8JT_ob.js} +1 -1
  116. package/dist/deck-client/assets/wardley-RL74JXVD-DGHQ_Ijv.js +162 -0
  117. package/dist/deck-client/assets/{wardleyDiagram-NUSXRM2D-BTjjuDU3.js → wardleyDiagram-NUSXRM2D-DN1LJMB1.js} +1 -1
  118. package/dist/deck-client/assets/{xychartDiagram-5P7HB3ND-AYbv92n-.js → xychartDiagram-5P7HB3ND-nb0oSfrQ.js} +1 -1
  119. package/dist/deck-client/index.html +1 -1
  120. package/dist/server/beacon-monitor-entry.js +548 -6
  121. package/dist/server/chart-serve.js +917 -248
  122. package/dist/server/cli.js +1368 -374
  123. package/dist/server/council-entry.js +0 -0
  124. package/dist/server/fb-wizard.js +0 -0
  125. package/dist/server/graph-mcp-entry.js +1326 -322
  126. package/dist/server/init-entry.js +16 -11
  127. package/dist/server/orbit-entry.js +135 -7
  128. package/dist/server/parse-worker-entry.js +918 -247
  129. package/package.json +22 -22
  130. package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-array.md +107 -0
  131. package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-clear.md +94 -0
  132. package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-pulse.md +82 -0
  133. package/scaffolds/ls-marketplace/plugins/kit/skills/beacon-scan.md +66 -0
  134. package/scaffolds/ls-marketplace/plugins/kit/skills/blast-radius.md +101 -0
  135. package/scaffolds/ls-marketplace/plugins/kit/skills/brief.md +112 -0
  136. package/scaffolds/ls-marketplace/plugins/kit/skills/course.md +84 -0
  137. package/scaffolds/ls-marketplace/plugins/kit/skills/debug.md +92 -0
  138. package/scaffolds/ls-marketplace/plugins/kit/skills/deploy-check.md +160 -0
  139. package/scaffolds/ls-marketplace/plugins/kit/skills/diagram.md +134 -0
  140. package/scaffolds/ls-marketplace/plugins/kit/skills/orbit.md +87 -0
  141. package/scaffolds/ls-marketplace/plugins/kit/skills/prototype.md +90 -0
  142. package/scaffolds/ls-marketplace/plugins/kit/skills/recall.md +83 -0
  143. package/scaffolds/ls-marketplace/plugins/kit/{commands → skills}/show-mcp-status.md +4 -4
  144. package/scaffolds/ls-marketplace/plugins/kit/skills/wireframe.md +70 -0
  145. package/scaffolds/migrate-safety/scripts/migrate-with-backup.sh +0 -0
  146. package/scaffolds/recall-hook/scripts/ensure-recall.sh +0 -0
  147. package/scaffolds/statusline/statusline-mcp.sh +21 -9
  148. package/dist/beacon/types/capture/element.d.ts +0 -3
  149. package/dist/beacon/types/capture/element.d.ts.map +0 -1
  150. package/dist/beacon/types/capture/events.d.ts +0 -20
  151. package/dist/beacon/types/capture/events.d.ts.map +0 -1
  152. package/dist/beacon/types/capture/framework.d.ts +0 -3
  153. package/dist/beacon/types/capture/framework.d.ts.map +0 -1
  154. package/dist/beacon/types/capture/metadata.d.ts +0 -3
  155. package/dist/beacon/types/capture/metadata.d.ts.map +0 -1
  156. package/dist/beacon/types/capture/overlay.d.ts +0 -7
  157. package/dist/beacon/types/capture/overlay.d.ts.map +0 -1
  158. package/dist/beacon/types/capture/picker.d.ts.map +0 -1
  159. package/dist/beacon/types/capture/screenshot.d.ts.map +0 -1
  160. package/dist/beacon/types/capture/selector.d.ts.map +0 -1
  161. package/dist/beacon/types/monitor/dom.d.ts +0 -13
  162. package/dist/beacon/types/monitor/dom.d.ts.map +0 -1
  163. package/dist/beacon/types/monitor/index.d.ts +0 -19
  164. package/dist/beacon/types/monitor/index.d.ts.map +0 -1
  165. package/dist/beacon/types/monitor/network.d.ts +0 -12
  166. package/dist/beacon/types/monitor/network.d.ts.map +0 -1
  167. package/dist/beacon/types/monitor/transport.d.ts.map +0 -1
  168. package/dist/beacon/types/monitor/types.d.ts.map +0 -1
  169. package/dist/beacon/types/transport/submit.d.ts +0 -3
  170. package/dist/beacon/types/transport/submit.d.ts.map +0 -1
  171. package/dist/beacon/types/ui/button.d.ts +0 -2
  172. package/dist/beacon/types/ui/button.d.ts.map +0 -1
  173. package/dist/beacon/types/ui/drawer.d.ts +0 -33
  174. package/dist/beacon/types/ui/drawer.d.ts.map +0 -1
  175. package/dist/beacon/types/ui/icons.d.ts +0 -9
  176. package/dist/beacon/types/ui/icons.d.ts.map +0 -1
  177. package/dist/beacon/types/ui/monitor-panel.d.ts +0 -19
  178. package/dist/beacon/types/ui/monitor-panel.d.ts.map +0 -1
  179. package/dist/beacon/types/ui/pick-mode-overlay.d.ts.map +0 -1
  180. package/dist/beacon/types/ui/pin-popover.d.ts.map +0 -1
  181. package/dist/deck-client/assets/channel-CRdozqbp.js +0 -1
  182. package/dist/deck-client/assets/classDiagram-6PBFFD2Q-lIZMp57W.js +0 -1
  183. package/dist/deck-client/assets/classDiagram-v2-HSJHXN6E-lIZMp57W.js +0 -1
  184. package/dist/deck-client/assets/clone-BtWeSTyJ.js +0 -1
  185. package/dist/deck-client/assets/stateDiagram-v2-QKLJ7IA2-BrV78NDR.js +0 -1
  186. package/dist/deck-client/assets/wardley-RL74JXVD-C010F8l4.js +0 -162
  187. package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-array.md +0 -92
  188. package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-clear.md +0 -68
  189. package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-pulse.md +0 -80
  190. package/scaffolds/ls-marketplace/plugins/kit/commands/beacon-scan.md +0 -62
  191. /package/dist/beacon/types/{capture → internal}/selector.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"beacon.umd.js","sources":["../../src/beacon-client/ui/icons.ts","../../src/beacon-client/ui/button.ts","../../src/beacon-client/ui/drawer.ts","../../src/beacon-client/ui/pin-popover.ts","../../src/beacon-client/ui/pick-mode-overlay.ts","../../src/beacon-client/capture/picker.ts","../../src/beacon-client/capture/selector.ts","../../src/beacon-client/capture/framework.ts","../../src/beacon-client/capture/element.ts","../../src/beacon-client/capture/metadata.ts","../../src/beacon-client/capture/screenshot.ts","../../src/beacon-client/capture/overlay.ts","../../src/beacon-client/capture/events.ts","../../src/beacon-client/transport/submit.ts","../../src/beacon-client/element.ts","../../src/beacon-client/monitor/dom.ts","../../src/beacon-client/monitor/network.ts","../../src/beacon-client/monitor/transport.ts","../../src/beacon-client/monitor/index.ts","../../src/beacon-client/index.ts","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/util.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/clone-pseudos.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/mimes.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/dataurl.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/clone-node.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/embed-resources.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/embed-images.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/apply-style.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/embed-webfonts.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/index.js"],"sourcesContent":["// Inline SVGs to avoid an icon library dep. Returns innerHTML strings (caller assigns).\n\nexport const ICONS = {\n feedback: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"/></svg>`,\n pin: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 17v5\"/><path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\"/></svg>`,\n close: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/></svg>`,\n trash: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"M3 6h18\"/><path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\"/><path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\"/></svg>`,\n send: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><path d=\"m22 2-7 20-4-9-9-4Z\"/><path d=\"M22 2 11 13\"/></svg>`,\n check: `<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"/></svg>`,\n} as const;\n","// Default floating trigger button. Rendered into the Shadow DOM unless a slot=\"trigger\"\n// child is provided by the consumer.\n\nimport { ICONS } from './icons';\n\nexport function createTriggerButton(label = 'Feedback'): HTMLButtonElement {\n const btn = document.createElement('button');\n btn.type = 'button';\n btn.className = 'beacon-default-trigger';\n btn.setAttribute('aria-label', label);\n btn.innerHTML = `${ICONS.feedback}<span>${label}</span>`;\n return btn;\n}\n","// The form drawer: description textarea + severity picker + pin list + actions.\n// Built imperatively (no JSX). The element class is the controller; this module\n// handles markup + small DOM helpers.\n\nimport { ICONS } from './icons';\nimport type { CapturedEvent, Pin, Severity } from '../types';\n\nconst DEFAULT_SEVERITIES: Severity[] = ['bug', 'idea', 'ux', 'a11y'];\n\nexport interface DrawerCallbacks {\n onClose: () => void;\n onAnnotate: () => void;\n onSubmit: () => void;\n onPinNoteChange: (pinNumber: number, note: string) => void;\n onPinDelete: (pinNumber: number) => void;\n onDescriptionChange: (value: string) => void;\n onSeverityChange: (sev: Severity) => void;\n}\n\nexport class DrawerView {\n readonly root: HTMLDivElement;\n readonly bodyEl: HTMLDivElement;\n private severities: Severity[];\n private callbacks: DrawerCallbacks;\n private state = {\n description: '',\n severity: 'bug' as Severity,\n pins: [] as Pin[],\n events: [] as CapturedEvent[],\n annotatedScreenshot: undefined as string | undefined,\n submitting: false,\n status: '' as string,\n statusKind: '' as '' | 'error' | 'success',\n };\n\n constructor(severities: Severity[], callbacks: DrawerCallbacks) {\n this.severities = severities.length > 0 ? severities : DEFAULT_SEVERITIES;\n this.callbacks = callbacks;\n this.root = document.createElement('div');\n this.root.className = 'beacon-drawer';\n this.root.innerHTML = `\n <div class=\"beacon-drawer-header\">\n <div class=\"beacon-drawer-title\">Send feedback</div>\n <button type=\"button\" class=\"beacon-icon-btn\" data-action=\"close\" aria-label=\"Close\">${ICONS.close}</button>\n </div>\n <div class=\"beacon-drawer-body\"></div>\n `;\n this.bodyEl = this.root.querySelector('.beacon-drawer-body') as HTMLDivElement;\n this.root.querySelector('[data-action=\"close\"]')!.addEventListener('click', () => this.callbacks.onClose());\n this.render();\n }\n\n open() {\n this.root.classList.remove('minimized');\n this.root.classList.add('open');\n }\n\n close() {\n this.root.classList.remove('open');\n }\n\n minimize() {\n this.root.classList.add('minimized');\n this.root.classList.remove('open');\n }\n\n setPins(pins: Pin[], annotatedScreenshot?: string) {\n this.state.pins = pins;\n if (annotatedScreenshot !== undefined) this.state.annotatedScreenshot = annotatedScreenshot;\n this.render();\n }\n\n // Push the latest events buffer into the drawer. element.ts calls this both\n // on open() (initial snapshot) AND from a subscriber so the chip ticks up\n // live as errors fire. We partial-update the chip element only — a full\n // re-render of bodyEl would blow away the textarea's focus + cursor while\n // the user is typing, which is much worse than the chip never animating.\n setEvents(events: CapturedEvent[]) {\n this.state.events = events;\n this.updateEventsChip();\n }\n\n private updateEventsChip() {\n const chip = this.bodyEl.querySelector<HTMLDetailsElement>('.beacon-events');\n if (!chip) {\n // First setEvents before any render — fall back to full render so the\n // chip element is created in the DOM. Subsequent updates will partial.\n this.render();\n return;\n }\n const count = this.state.events.length;\n if (count === 0) {\n chip.hidden = true;\n return;\n }\n chip.hidden = false;\n chip.dataset.count = String(count);\n\n const summaryLabel = chip.querySelector<HTMLElement>('.beacon-events-label');\n if (summaryLabel) {\n summaryLabel.textContent = `${count} runtime ${count === 1 ? 'error' : 'errors'} will be included`;\n }\n\n const list = chip.querySelector<HTMLUListElement>('.beacon-events-list');\n if (list) {\n list.innerHTML = this.state.events.map((ev) => `\n <li class=\"beacon-events-item\">\n <span class=\"beacon-events-kind ${ev.kind === 'unhandledrejection' ? 'rejection' : 'error'}\">${ev.kind === 'unhandledrejection' ? 'rejection' : 'error'}</span>\n <span class=\"beacon-events-msg\">${escapeHtml(ev.message)}</span>\n </li>\n `).join('');\n }\n }\n\n getAnnotatedScreenshot(): string | undefined {\n return this.state.annotatedScreenshot;\n }\n\n setAnnotatedScreenshot(value: string | undefined) {\n this.state.annotatedScreenshot = value;\n this.render();\n }\n\n setSubmitting(submitting: boolean) {\n this.state.submitting = submitting;\n this.render();\n }\n\n setStatus(status: string, kind: '' | 'error' | 'success' = '') {\n this.state.status = status;\n this.state.statusKind = kind;\n this.render();\n }\n\n reset() {\n this.state = {\n description: '',\n severity: 'bug',\n pins: [],\n events: [],\n annotatedScreenshot: undefined,\n submitting: false,\n status: '',\n statusKind: '',\n };\n this.render();\n }\n\n getDescription() { return this.state.description; }\n getSeverity() { return this.state.severity; }\n\n private render() {\n const canSubmit = this.state.description.trim().length > 0 && !this.state.submitting;\n\n this.bodyEl.innerHTML = `\n <div class=\"beacon-field\">\n <label class=\"beacon-label\" for=\"beacon-desc\">What's the issue?</label>\n <textarea id=\"beacon-desc\" class=\"beacon-textarea\" placeholder=\"Describe what you saw, what you expected, anything that helps reproduce…\">${escapeHtml(this.state.description)}</textarea>\n </div>\n\n <div class=\"beacon-field\">\n <span class=\"beacon-label\">Severity</span>\n <div class=\"beacon-severity\" role=\"radiogroup\">\n ${this.severities.map((sev) => `\n <label class=\"beacon-severity-opt ${sev === this.state.severity ? 'selected' : ''}\" data-sev=\"${sev}\">\n <input type=\"radio\" name=\"beacon-severity\" value=\"${sev}\" ${sev === this.state.severity ? 'checked' : ''}>\n ${sev}\n </label>\n `).join('')}\n </div>\n </div>\n\n ${this.state.annotatedScreenshot ? `\n <div class=\"beacon-field\">\n <span class=\"beacon-label\">Annotated screenshot</span>\n <img src=\"${this.state.annotatedScreenshot}\" class=\"beacon-thumb\" alt=\"Annotated screenshot preview\">\n </div>\n ` : ''}\n\n ${this.state.pins.length > 0 ? `\n <div class=\"beacon-field\">\n <span class=\"beacon-label\">Pins (${this.state.pins.length})</span>\n <div class=\"beacon-pin-list\">\n ${this.state.pins.map((p) => `\n <div class=\"beacon-pin-item\" data-pin=\"${p.number}\">\n <span class=\"beacon-pin-num\">${p.number}</span>\n <div class=\"beacon-pin-meta\">\n <div class=\"beacon-pin-selector\" title=\"${escapeHtml(p.selector)}\">${escapeHtml(p.selector)}</div>\n <input type=\"text\" class=\"beacon-pin-note-input\" placeholder=\"Add a note (optional)\" value=\"${escapeHtml(p.note ?? '')}\">\n </div>\n <button type=\"button\" class=\"beacon-icon-btn\" data-pin-delete=\"${p.number}\" aria-label=\"Remove pin ${p.number}\">${ICONS.trash}</button>\n </div>\n `).join('')}\n </div>\n </div>\n ` : ''}\n\n <details class=\"beacon-events\" data-count=\"${this.state.events.length}\" ${this.state.events.length === 0 ? 'hidden' : ''}>\n <summary class=\"beacon-events-summary\">\n <span class=\"beacon-events-dot\" aria-hidden=\"true\">●</span>\n <span class=\"beacon-events-label\">${this.state.events.length} runtime ${this.state.events.length === 1 ? 'error' : 'errors'} will be included</span>\n </summary>\n <ul class=\"beacon-events-list\">\n ${this.state.events.map((ev) => `\n <li class=\"beacon-events-item\">\n <span class=\"beacon-events-kind ${ev.kind === 'unhandledrejection' ? 'rejection' : 'error'}\">${ev.kind === 'unhandledrejection' ? 'rejection' : 'error'}</span>\n <span class=\"beacon-events-msg\">${escapeHtml(ev.message)}</span>\n </li>\n `).join('')}\n </ul>\n </details>\n\n <div class=\"beacon-actions\">\n <button type=\"button\" class=\"beacon-btn secondary\" data-action=\"annotate\" ${this.state.submitting ? 'disabled' : ''}>\n ${ICONS.pin} ${this.state.pins.length > 0 ? 'Add another pin' : 'Annotate elements'}\n </button>\n <span style=\"flex:1\"></span>\n <button type=\"button\" class=\"beacon-btn primary\" data-action=\"submit\" ${canSubmit ? '' : 'disabled'}>\n ${ICONS.send} ${this.state.submitting ? 'Sending…' : 'Send'}\n </button>\n </div>\n\n ${this.state.status ? `<div class=\"beacon-status ${this.state.statusKind}\">${escapeHtml(this.state.status)}</div>` : ''}\n `;\n\n // Wire events.\n const desc = this.bodyEl.querySelector('#beacon-desc') as HTMLTextAreaElement;\n desc.addEventListener('input', () => {\n this.state.description = desc.value;\n this.callbacks.onDescriptionChange(desc.value);\n // Re-render only the submit button's disabled state — full re-render kills focus, so skip it here.\n const submitBtn = this.bodyEl.querySelector('[data-action=\"submit\"]') as HTMLButtonElement | null;\n if (submitBtn) {\n submitBtn.disabled = !(desc.value.trim().length > 0) || this.state.submitting;\n }\n });\n\n this.bodyEl.querySelectorAll<HTMLInputElement>('input[name=\"beacon-severity\"]').forEach((input) => {\n input.addEventListener('change', () => {\n if (input.checked) {\n this.state.severity = input.value as Severity;\n this.callbacks.onSeverityChange(this.state.severity);\n this.render();\n }\n });\n });\n\n this.bodyEl.querySelector('[data-action=\"annotate\"]')?.addEventListener('click', () => this.callbacks.onAnnotate());\n this.bodyEl.querySelector('[data-action=\"submit\"]')?.addEventListener('click', () => this.callbacks.onSubmit());\n\n this.bodyEl.querySelectorAll<HTMLButtonElement>('[data-pin-delete]').forEach((btn) => {\n btn.addEventListener('click', () => {\n const num = Number(btn.getAttribute('data-pin-delete'));\n this.callbacks.onPinDelete(num);\n });\n });\n\n this.bodyEl.querySelectorAll<HTMLInputElement>('.beacon-pin-note-input').forEach((input) => {\n const item = input.closest('[data-pin]');\n const num = Number(item?.getAttribute('data-pin') ?? 0);\n input.addEventListener('input', () => this.callbacks.onPinNoteChange(num, input.value));\n });\n }\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n","// Small contextual popover that opens next to a picked element so the user can\n// optionally type a note. The cross icon discards this pin and lets the user keep\n// picking; Save attaches the (optional) note. Escape ends annotation entirely.\n\nimport { ICONS } from './icons';\n\nexport type PinPopoverCancel = 'pin' | 'all' | false;\n\nexport interface PinPopoverResult {\n note?: string;\n // 'pin' = discard this pin, keep picking. 'all' = end annotation. false = save.\n cancelled: PinPopoverCancel;\n}\n\nexport function showPinPopover(opts: {\n shadowRoot: ShadowRoot;\n anchor: { x: number; y: number }; // viewport coords\n pinNumber: number;\n}): Promise<PinPopoverResult> {\n return new Promise((resolve) => {\n const popover = document.createElement('div');\n // Mount on body (not shadow root) so we escape transformed-ancestor stacking\n // contexts. beacon-no-capture keeps it out of the screenshot. theme-auto follows\n // OS preference; if a future caller needs explicit theme, add an opts.theme.\n popover.className = 'beacon-pin-popover open beacon-no-capture beacon-theme-auto';\n popover.innerHTML = `\n <div class=\"beacon-pin-popover-header\">\n <div style=\"display:flex;align-items:center;gap:6px;font-weight:600;font-size:13px;\">\n <span class=\"beacon-pin-num\">${opts.pinNumber}</span>\n <span>Note for this pin</span>\n </div>\n <button type=\"button\" class=\"beacon-icon-btn\" data-action=\"cancel\" aria-label=\"Discard this pin\">${ICONS.close}</button>\n </div>\n <textarea class=\"beacon-textarea\" rows=\"2\" placeholder=\"Optional — describe what's wrong here…\" style=\"min-height:48px;\"></textarea>\n <div class=\"beacon-pin-popover-actions\">\n <button type=\"button\" class=\"beacon-btn primary\" data-action=\"save\">${ICONS.check} Save</button>\n </div>\n `;\n\n // Position below the picked point, clamped to viewport.\n const POPOVER_W = 240;\n const POPOVER_H = 160;\n const left = Math.min(Math.max(8, opts.anchor.x), window.innerWidth - POPOVER_W - 8);\n const top = Math.min(Math.max(8, opts.anchor.y + 12), window.innerHeight - POPOVER_H - 8);\n popover.style.left = `${left}px`;\n popover.style.top = `${top}px`;\n\n document.body.appendChild(popover);\n\n const textarea = popover.querySelector('textarea')!;\n textarea.focus();\n\n function close(result: PinPopoverResult) {\n document.removeEventListener('keydown', handleGlobalKey, true);\n popover.remove();\n resolve(result);\n }\n\n // Document-level Escape handler so it works regardless of focus location\n // (textarea, popover background, anywhere on the page). Escape ends the whole\n // annotation session — use the cross icon to drop just this pin.\n function handleGlobalKey(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n close({ cancelled: 'all' });\n }\n }\n document.addEventListener('keydown', handleGlobalKey, true);\n\n popover.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const action = target.closest('[data-action]')?.getAttribute('data-action');\n if (action === 'cancel') close({ cancelled: 'pin' });\n if (action === 'save') {\n const note = textarea.value.trim();\n close({ ...(note ? { note } : {}), cancelled: false });\n }\n });\n\n // Cmd/Ctrl+Enter inside the textarea = save (Enter alone inserts newlines).\n textarea.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n const note = textarea.value.trim();\n close({ ...(note ? { note } : {}), cancelled: false });\n }\n });\n });\n}\n","// Visual overlay shown during pin-mode. Three layers:\n// 1. Subtle dotted viewport border + soft inset glow → \"you're in pin mode\"\n// 2. Top-center hint pill → \"press Esc to finish\"\n// 3. Numbered markers → over each already-pinned\n// element so the user can\n// see what they pinned\n//\n// Mounted on document.body (NOT the beacon Shadow DOM) because position:fixed\n// children of transformed/filtered/contained ancestors get anchored to that\n// ancestor instead of the viewport — and many host pages put a transform on\n// sticky headers, which is exactly where the slotted trigger lives.\n//\n// Each element carries the `beacon-no-capture` class so the screenshot filter\n// in capture/screenshot.ts skips them. All use pointer-events: none so they\n// don't block elementsFromPoint during picking.\n\nconst NO_CAPTURE_CLASS = 'beacon-no-capture';\nconst DEFAULT_ACCENT = '#0ea5e9';\nconst DEFAULT_HINT = 'Click any element to pin it · Press Esc to finish';\n\nexport interface PinAnchor {\n target: Element;\n /** Selector to re-query if `target` is detached from DOM (React re-render, conditional unmount). */\n selector?: string;\n /** Last-known viewport rect from pin time. Used as a faded \"anchor lost\" marker if both\n * the live ref and the selector lookup fail. */\n fallbackRect?: { x: number; y: number; w: number; h: number };\n}\n\nexport interface PickModeOverlay {\n addPin(pinNumber: number, anchor: PinAnchor): void;\n /** Swap the hint pill into a loading state (with spinner). Pass undefined to restore the default hint. */\n setLoading(message?: string): void;\n destroy(): void;\n}\n\nexport interface PickModeOverlayOptions {\n /** Accent color for border, hint pill, markers, and outlines. Defaults to sky-blue. */\n accent?: string;\n}\n\n/** Append a hex alpha suffix only when the color is a 7-char hex. Other formats\n * (`rgb(...)`, named colors) pass through unchanged — the alpha effect is lost\n * but the value stays valid. */\nfunction withAlpha(color: string, alphaHex: string): string {\n return /^#[0-9a-fA-F]{6}$/.test(color) ? `${color}${alphaHex}` : color;\n}\n\nexport function createPickModeOverlay(opts: PickModeOverlayOptions = {}): PickModeOverlay {\n const ACCENT = opts.accent ?? DEFAULT_ACCENT;\n const ACCENT_BORDER = withAlpha(ACCENT, 'b3'); // ~70% alpha for dashed viewport border\n const ACCENT_GLOW = withAlpha(ACCENT, '2e'); // ~18% alpha for inset glow\n // One-time keyframes for the loading spinner. Kept in <head> with the\n // beacon-no-capture class — <style> tags don't render so they don't affect\n // the screenshot, but we mark them anyway for filter consistency.\n const styleTag = document.createElement('style');\n styleTag.className = NO_CAPTURE_CLASS;\n styleTag.textContent = '@keyframes beacon-spin { to { transform: rotate(360deg); } }';\n document.head.appendChild(styleTag);\n\n const frame = document.createElement('div');\n frame.className = NO_CAPTURE_CLASS;\n frame.setAttribute('aria-hidden', 'true');\n frame.style.cssText = [\n 'position: fixed',\n 'inset: 0',\n 'pointer-events: none',\n 'z-index: 2147483646',\n `border: 2px dashed ${ACCENT_BORDER}`,\n 'border-radius: 4px',\n `box-shadow: inset 0 0 56px ${ACCENT_GLOW}`,\n 'box-sizing: border-box',\n ].join('; ');\n\n const hint = document.createElement('div');\n hint.className = NO_CAPTURE_CLASS;\n hint.setAttribute('role', 'status');\n hint.style.cssText = [\n 'position: fixed',\n 'top: 16px',\n 'left: 50%',\n 'transform: translateX(-50%)',\n `background: ${ACCENT}`,\n 'color: #fff',\n 'padding: 6px 14px',\n 'border-radius: 999px',\n 'font: 500 12px/1.4 system-ui, -apple-system, sans-serif',\n 'letter-spacing: 0.01em',\n 'box-shadow: 0 4px 12px #0000004d',\n 'pointer-events: none',\n 'white-space: nowrap',\n 'z-index: 2147483646',\n ].join('; ');\n hint.textContent = DEFAULT_HINT;\n\n const SPINNER_HTML = `<span style=\"\n display: inline-block;\n width: 12px;\n height: 12px;\n border: 2px solid #fff;\n border-top-color: transparent;\n border-radius: 50%;\n animation: beacon-spin 800ms linear infinite;\n vertical-align: middle;\n margin-right: 8px;\n \"></span>`;\n\n function escapeHtml(s: string): string {\n return s.replace(/[<>&]/g, (c) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;' }[c] as string));\n }\n\n document.body.appendChild(frame);\n document.body.appendChild(hint);\n\n const tracked = new Map<number, { anchor: PinAnchor; marker: HTMLDivElement; outline: HTMLDivElement }>();\n\n function makeMarker(num: number): HTMLDivElement {\n const m = document.createElement('div');\n m.className = NO_CAPTURE_CLASS;\n m.setAttribute('aria-hidden', 'true');\n m.style.cssText = [\n 'position: fixed',\n 'width: 24px',\n 'height: 24px',\n 'border-radius: 999px',\n `background: ${ACCENT}`,\n 'color: #fff',\n 'display: flex',\n 'align-items: center',\n 'justify-content: center',\n 'font: 700 12px/1 system-ui, -apple-system, sans-serif',\n 'border: 2px solid #fff',\n 'box-shadow: 0 2px 8px #00000066',\n 'pointer-events: none',\n 'z-index: 2147483646',\n ].join('; ');\n m.textContent = String(num);\n document.body.appendChild(m);\n return m;\n }\n\n function makeOutline(): HTMLDivElement {\n const o = document.createElement('div');\n o.className = NO_CAPTURE_CLASS;\n o.setAttribute('aria-hidden', 'true');\n o.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n `border: 2px solid ${ACCENT}`,\n 'border-radius: 2px',\n 'box-sizing: border-box',\n // Slightly below marker z so the marker visually \"sits on\" the outline corner.\n 'z-index: 2147483645',\n ].join('; ');\n document.body.appendChild(o);\n return o;\n }\n\n function placeAt(\n entry: { marker: HTMLDivElement; outline: HTMLDivElement },\n rect: { x: number; y: number; w: number; h: number },\n isStale: boolean,\n ) {\n const opacity = isStale ? '0.5' : '1';\n\n entry.outline.style.display = 'block';\n entry.outline.style.opacity = opacity;\n entry.outline.style.left = `${rect.x}px`;\n entry.outline.style.top = `${rect.y}px`;\n entry.outline.style.width = `${rect.w}px`;\n entry.outline.style.height = `${rect.h}px`;\n\n entry.marker.style.display = 'flex';\n entry.marker.style.opacity = opacity;\n entry.marker.style.left = `${rect.x + rect.w - 12}px`;\n entry.marker.style.top = `${Math.max(2, rect.y - 12)}px`;\n }\n\n function hide(entry: { marker: HTMLDivElement; outline: HTMLDivElement }) {\n entry.marker.style.display = 'none';\n entry.outline.style.display = 'none';\n }\n\n function reposition() {\n tracked.forEach((entry) => {\n // Tier 1: live element ref still in DOM\n let liveTarget: Element | null = entry.anchor.target;\n if (!document.contains(liveTarget)) liveTarget = null;\n\n // Tier 2: re-query by selector (handles React re-renders that swap the node)\n if (!liveTarget && entry.anchor.selector) {\n liveTarget = document.querySelector(entry.anchor.selector);\n if (liveTarget) entry.anchor.target = liveTarget; // refresh for next reposition\n }\n\n if (liveTarget) {\n const r = liveTarget.getBoundingClientRect();\n if (r.width > 0 || r.height > 0) {\n placeAt(entry, { x: r.left, y: r.top, w: r.width, h: r.height }, false);\n return;\n }\n }\n\n // Tier 3: fallback to the rect captured at pin time. Honest \"anchor lost\"\n // signal — half opacity so the user can see this isn't tracking anymore.\n const fr = entry.anchor.fallbackRect;\n if (fr && (fr.w > 0 || fr.h > 0)) {\n placeAt(entry, fr, true);\n return;\n }\n\n hide(entry);\n });\n }\n\n let raf: number | null = null;\n function schedule() {\n if (raf !== null) return;\n raf = requestAnimationFrame(() => {\n raf = null;\n reposition();\n });\n }\n\n window.addEventListener('scroll', schedule, true);\n window.addEventListener('resize', schedule);\n\n return {\n addPin(num, anchor) {\n const marker = makeMarker(num);\n const outline = makeOutline();\n tracked.set(num, { anchor, marker, outline });\n reposition();\n },\n setLoading(message) {\n if (message) {\n hint.innerHTML = SPINNER_HTML + escapeHtml(message);\n } else {\n hint.textContent = DEFAULT_HINT;\n }\n },\n destroy() {\n window.removeEventListener('scroll', schedule, true);\n window.removeEventListener('resize', schedule);\n if (raf !== null) cancelAnimationFrame(raf);\n frame.remove();\n hint.remove();\n styleTag.remove();\n tracked.forEach(({ marker, outline }) => {\n marker.remove();\n outline.remove();\n });\n tracked.clear();\n },\n };\n}\n","// Hover/click element picker. Draws an outline overlay over the hovered element\n// and resolves with the clicked element. Skips the widget's own elements via\n// composedPath check against the provided shadow root.\n\nexport interface PickerOptions {\n shadowRoot: ShadowRoot;\n onHover?: (el: Element | null) => void;\n /** Outline color for the hovered-element highlight. Defaults to sky-blue. */\n accent?: string;\n}\n\nconst DEFAULT_ACCENT = '#0ea5e9';\n\n/** Append hex alpha suffix only for 7-char hex; other color formats pass through unchanged. */\nfunction withAlpha(color: string, alphaHex: string): string {\n return /^#[0-9a-fA-F]{6}$/.test(color) ? `${color}${alphaHex}` : color;\n}\n\nexport interface PickerHandle {\n cancel: () => void;\n promise: Promise<Element | null>; // resolves with picked element, or null on Escape\n}\n\nexport function startPicker(opts: PickerOptions): PickerHandle {\n const { shadowRoot, onHover } = opts;\n const accent = opts.accent ?? DEFAULT_ACCENT;\n const accentFill = withAlpha(accent, '14'); // ~8% alpha hover-fill tint\n\n // Outline overlay — appended to body, position: fixed, pointer-events: none.\n const outline = document.createElement('div');\n outline.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n 'z-index: 2147483646',\n `border: 2px solid ${accent}`,\n `background: ${accentFill}`,\n 'transition: all 60ms ease-out',\n 'box-sizing: border-box',\n 'border-radius: 2px',\n ].join('; ');\n document.body.appendChild(outline);\n\n const tooltip = document.createElement('div');\n tooltip.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n 'z-index: 2147483647',\n 'background: #0f172a',\n 'color: #fff',\n 'font: 11px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace',\n 'padding: 3px 6px',\n 'border-radius: 3px',\n 'max-width: 280px',\n 'overflow: hidden',\n 'text-overflow: ellipsis',\n 'white-space: nowrap',\n ].join('; ');\n document.body.appendChild(tooltip);\n\n const previousCursor = document.body.style.cursor;\n document.body.style.cursor = 'crosshair';\n\n let resolved = false;\n let resolvePromise: (v: Element | null) => void = () => {};\n const promise = new Promise<Element | null>((res) => { resolvePromise = res; });\n\n function isWidgetElement(el: EventTarget | null): boolean {\n if (!el || !(el instanceof Node)) return false;\n // composedPath gives us shadow boundaries.\n let node: Node | null = el;\n while (node) {\n if (node === shadowRoot || node === shadowRoot.host) return true;\n node = node.parentNode ?? (node as ShadowRoot).host ?? null;\n }\n return false;\n }\n\n function findTarget(x: number, y: number): Element | null {\n // Hide overlay so it doesn't appear in elementsFromPoint, then use elementsFromPoint\n // and pick the first non-widget element.\n outline.style.display = 'none';\n tooltip.style.display = 'none';\n const candidates = document.elementsFromPoint(x, y);\n outline.style.display = 'block';\n tooltip.style.display = 'block';\n for (const c of candidates) {\n if (!isWidgetElement(c)) return c;\n }\n return null;\n }\n\n function positionOutline(el: Element) {\n const rect = el.getBoundingClientRect();\n outline.style.left = `${rect.left}px`;\n outline.style.top = `${rect.top}px`;\n outline.style.width = `${rect.width}px`;\n outline.style.height = `${rect.height}px`;\n\n const tag = el.tagName.toLowerCase();\n const cls = el.classList.length > 0 ? '.' + Array.from(el.classList).slice(0, 2).join('.') : '';\n tooltip.textContent = tag + cls;\n // Place tooltip just above the element, or below if it would clip the top.\n const above = rect.top - 22;\n tooltip.style.left = `${rect.left}px`;\n tooltip.style.top = `${above >= 0 ? above : rect.bottom + 4}px`;\n }\n\n function handleMove(e: MouseEvent) {\n const el = findTarget(e.clientX, e.clientY);\n if (el) {\n positionOutline(el);\n onHover?.(el);\n } else {\n outline.style.display = 'none';\n tooltip.style.display = 'none';\n onHover?.(null);\n }\n }\n\n // Listen on pointerdown (NOT click) so we intercept the press BEFORE the host\n // page reacts. Radix Select / Popover / Dialog open on pointerdown — by the\n // time `click` fires, the page state has changed (dropdown open, focus moved,\n // layout shifted) and elementsFromPoint at click coords returns the wrong thing.\n // pointerdown + capture phase + preventDefault + stopPropagation gives us the\n // element under the cursor exactly as the user saw it, before any host handlers run.\n function handlePointerDown(e: PointerEvent) {\n if (e.button !== 0) return; // ignore right/middle clicks\n e.preventDefault();\n e.stopPropagation();\n const el = findTarget(e.clientX, e.clientY);\n if (el) finish(el);\n }\n\n // Also swallow the trailing click/mouseup so a host-page handler doesn't fire\n // anyway. We've already finished by this point but keep listeners briefly.\n function swallow(e: Event) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n finish(null);\n }\n }\n\n function finish(el: Element | null) {\n if (resolved) return;\n resolved = true;\n document.removeEventListener('mousemove', handleMove, true);\n document.removeEventListener('pointerdown', handlePointerDown, true);\n document.removeEventListener('click', swallow, true);\n document.removeEventListener('mouseup', swallow, true);\n document.removeEventListener('keydown', handleKey, true);\n outline.remove();\n tooltip.remove();\n document.body.style.cursor = previousCursor;\n resolvePromise(el);\n }\n\n document.addEventListener('mousemove', handleMove, true);\n document.addEventListener('pointerdown', handlePointerDown, true);\n document.addEventListener('click', swallow, true);\n document.addEventListener('mouseup', swallow, true);\n document.addEventListener('keydown', handleKey, true);\n\n return {\n cancel: () => finish(null),\n promise,\n };\n}\n","// Build a unique-ish CSS selector path for an element by walking up the parent chain.\n// Strategy per ancestor: id (if unique) → tag.classes (if unique among siblings) → tag:nth-of-type(n).\n// Stops at <body> or after a depth limit.\n\nconst MAX_DEPTH = 8;\n\nfunction isUniqueId(id: string, root: Document | ShadowRoot = document): boolean {\n if (!id) return false;\n try {\n return root.querySelectorAll(`#${CSS.escape(id)}`).length === 1;\n } catch {\n return false;\n }\n}\n\nfunction tagWithClasses(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const classes = Array.from(el.classList)\n // Drop classes that look like generated atomic / hashed names (heuristic — keep stable-looking ones).\n .filter((c) => c.length > 0 && c.length < 40)\n .slice(0, 3)\n .map((c) => `.${CSS.escape(c)}`)\n .join('');\n return tag + classes;\n}\n\nfunction nthOfTypeIndex(el: Element): number {\n const parent = el.parentElement;\n if (!parent) return 1;\n const sameTag = Array.from(parent.children).filter((c) => c.tagName === el.tagName);\n return sameTag.indexOf(el) + 1;\n}\n\nexport function buildSelector(target: Element): string {\n if (!target || target.nodeType !== Node.ELEMENT_NODE) return '';\n\n // Fast path: unique id on the target itself.\n if (target.id && isUniqueId(target.id)) {\n return `#${CSS.escape(target.id)}`;\n }\n\n const parts: string[] = [];\n let el: Element | null = target;\n let depth = 0;\n\n while (el && el.tagName.toLowerCase() !== 'body' && depth < MAX_DEPTH) {\n const current: Element = el;\n\n if (current.id && isUniqueId(current.id)) {\n parts.unshift(`#${CSS.escape(current.id)}`);\n break;\n }\n\n const base = tagWithClasses(current);\n const parent: HTMLElement | null = current.parentElement;\n\n // If this base matches multiple siblings, disambiguate with :nth-of-type.\n let part = base;\n if (parent) {\n try {\n const currentClasses = Array.from(current.classList).join(' ');\n const siblings: Element[] = Array.from(parent.children).filter(\n (c: Element) => c.tagName === current.tagName && Array.from(c.classList).join(' ') === currentClasses,\n );\n if (siblings.length > 1) {\n part = `${current.tagName.toLowerCase()}:nth-of-type(${nthOfTypeIndex(current)})`;\n }\n } catch {\n // ignore — fall back to base\n }\n }\n\n parts.unshift(part);\n el = parent;\n depth++;\n }\n\n return parts.join(' > ');\n}\n","// Best-effort framework component name detection.\n// Production builds usually minify component names — return null quietly when unavailable.\n\nimport type { Pin } from '../types';\n\ntype FW = NonNullable<Pin['framework']>;\n\nfunction detectReact(el: Element): FW | null {\n // React stores fiber refs on properties like __reactFiber$<hash> / __reactInternalInstance$<hash>.\n const keys = Object.keys(el).filter((k) => k.startsWith('__reactFiber$') || k.startsWith('__reactInternalInstance$'));\n if (keys.length === 0) return null;\n\n let fiber: unknown = (el as unknown as Record<string, unknown>)[keys[0]!];\n // Walk up the fiber chain to find the nearest function/class component (skip host elements).\n for (let i = 0; i < 10 && fiber; i++) {\n const f = fiber as { type?: unknown; return?: unknown };\n const type = f.type;\n if (typeof type === 'function') {\n const name = (type as { displayName?: string; name?: string }).displayName ?? (type as { name?: string }).name;\n if (name && name !== '_default') return { lib: 'react', name };\n }\n if (typeof type === 'object' && type !== null) {\n const name = (type as { displayName?: string; name?: string }).displayName ?? (type as { name?: string }).name;\n if (name) return { lib: 'react', name };\n }\n fiber = f.return;\n }\n return { lib: 'react' };\n}\n\nfunction detectVue(el: Element): FW | null {\n const anyEl = el as unknown as Record<string, unknown>;\n const vueParent = anyEl.__vueParentComponent as { type?: { name?: string; __name?: string } } | undefined;\n if (vueParent) {\n const name = vueParent.type?.name ?? vueParent.type?.__name;\n return { lib: 'vue', ...(name ? { name } : {}) };\n }\n if (anyEl.__vue__) return { lib: 'vue' };\n return null;\n}\n\nfunction detectAngular(el: Element): FW | null {\n // Angular dev mode exposes window.ng.getComponent(el).\n const ng = (window as unknown as { ng?: { getComponent?: (el: Element) => unknown } }).ng;\n if (!ng?.getComponent) return null;\n try {\n const cmp = ng.getComponent(el);\n if (!cmp) return null;\n const ctor = (cmp as { constructor?: { name?: string } }).constructor;\n return { lib: 'angular', ...(ctor?.name ? { name: ctor.name } : {}) };\n } catch {\n return null;\n }\n}\n\nfunction detectSvelte(el: Element): FW | null {\n // Svelte exposes very little at runtime. Look for $$ properties on the host.\n const anyEl = el as unknown as Record<string, unknown>;\n if ('__svelte_meta' in anyEl) return { lib: 'svelte' };\n return null;\n}\n\nexport function detectFramework(el: Element): Pin['framework'] | undefined {\n const result = detectReact(el) ?? detectVue(el) ?? detectAngular(el) ?? detectSvelte(el);\n return result ?? undefined;\n}\n","// Capture per-pin element data: outerHTML (truncated), selector, computed styles, bounding rect, framework hint.\n\nimport type { RawPinCapture } from '../types';\nimport { buildSelector } from './selector';\nimport { detectFramework } from './framework';\n\n// Limits matched to the /api/feedback zod schema. The route caps each list / string\n// length defensively — exceed any of these and the entire payload 400s with no\n// useful detail surfaced in the beacon UI, so we mirror the caps here.\nconst OUTER_HTML_LIMIT = 5000; // schema: outerHTML max 8000\nconst PARENT_OUTER_HTML_LIMIT = 1000; // schema: parentOuterHTML max 2000\nconst SELECTOR_LIMIT = 1000; // schema: selector max 1000\nconst ID_LIMIT = 200; // schema: id max 200\nconst CLASSLIST_MAX_ENTRIES = 50; // schema: classList array max 50\nconst CLASS_NAME_LIMIT = 200; // schema: each class max 200\nconst STYLE_VALUE_LIMIT = 500; // schema: computedStyles value max 500\n\n// A focused, useful subset of computed style properties. Dumping all 400+ resolved\n// properties is noise; this list covers layout, typography, color, and key visual hints.\nconst USEFUL_STYLE_PROPS = [\n 'display', 'position', 'top', 'right', 'bottom', 'left',\n 'width', 'height', 'min-width', 'min-height', 'max-width', 'max-height',\n 'margin', 'padding',\n 'font-family', 'font-size', 'font-weight', 'line-height', 'text-align',\n 'color', 'background-color', 'background-image',\n 'border', 'border-radius',\n 'opacity', 'visibility', 'overflow',\n 'z-index', 'transform', 'transition',\n 'flex', 'flex-direction', 'justify-content', 'align-items', 'gap',\n 'grid-template-columns', 'grid-template-rows',\n] as const;\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max) + `\\n\\n/* … truncated, original was ${s.length} chars */`;\n}\n\nfunction pickStyles(el: Element): Record<string, string> {\n const computed = getComputedStyle(el);\n const out: Record<string, string> = {};\n for (const prop of USEFUL_STYLE_PROPS) {\n const value = computed.getPropertyValue(prop);\n if (value && value !== 'normal' && value !== 'none' && value !== 'auto' && value !== '0px') {\n out[prop] = value.trim().slice(0, STYLE_VALUE_LIMIT);\n }\n }\n return out;\n}\n\nfunction capClassList(el: Element): string[] {\n const all = Array.from(el.classList);\n // First slice to the entry cap, then truncate each class name. Order matters:\n // truncating first and then slicing would still produce >50 entries.\n return all\n .slice(0, CLASSLIST_MAX_ENTRIES)\n .map((c) => (c.length > CLASS_NAME_LIMIT ? c.slice(0, CLASS_NAME_LIMIT) : c));\n}\n\nexport function capturePin(el: Element): RawPinCapture {\n const rect = el.getBoundingClientRect();\n const rawSelector = buildSelector(el);\n const rawId = el.id || null;\n return {\n selector: rawSelector.length > SELECTOR_LIMIT ? rawSelector.slice(0, SELECTOR_LIMIT) : rawSelector,\n tagName: el.tagName.toLowerCase(),\n id: rawId && rawId.length > ID_LIMIT ? rawId.slice(0, ID_LIMIT) : rawId,\n classList: capClassList(el),\n outerHTML: truncate(el.outerHTML, OUTER_HTML_LIMIT),\n ...(el.parentElement\n ? { parentOuterHTML: truncate(el.parentElement.outerHTML, PARENT_OUTER_HTML_LIMIT) }\n : {}),\n computedStyles: pickStyles(el),\n boundingRect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n },\n ...(detectFramework(el) ? { framework: detectFramework(el)! } : {}),\n };\n}\n","// Capture browser / viewport / locale metadata. Pure read-only — no instrumentation.\n\nimport type { Metadata } from '../types';\n\ninterface UADataLike {\n brands: Array<{ brand: string; version: string }>;\n mobile: boolean;\n platform: string;\n}\n\nfunction getUaData(): Metadata['uaData'] {\n const nav = navigator as Navigator & { userAgentData?: UADataLike };\n if (!nav.userAgentData) return undefined;\n // Pick the first non-\"Not.A/Brand\" brand for legibility.\n const brand = nav.userAgentData.brands.find((b) => !/Not[.\\-]?A.?Brand/i.test(b.brand))?.brand\n ?? nav.userAgentData.brands[0]?.brand\n ?? 'unknown';\n return {\n brand,\n mobile: nav.userAgentData.mobile,\n platform: nav.userAgentData.platform,\n };\n}\n\nfunction getTheme(): Metadata['theme'] {\n if (window.matchMedia('(prefers-color-scheme: dark)').matches) return 'dark';\n if (window.matchMedia('(prefers-color-scheme: light)').matches) return 'light';\n return undefined;\n}\n\nexport function captureMetadata(): Metadata {\n return {\n url: window.location.href,\n ...(document.referrer ? { referrer: document.referrer } : {}),\n userAgent: navigator.userAgent,\n ...(getUaData() ? { uaData: getUaData()! } : {}),\n viewport: {\n w: window.innerWidth,\n h: window.innerHeight,\n dpr: window.devicePixelRatio || 1,\n },\n screen: {\n w: window.screen.width,\n h: window.screen.height,\n },\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n locale: navigator.language,\n ...(getTheme() ? { theme: getTheme()! } : {}),\n capturedAt: new Date().toISOString(),\n };\n}\n","// Lazy-loaded screenshot capture via html-to-image.\n// Captures the viewport (document.documentElement) as a JPEG data URL.\n//\n// Cross-origin images that don't return CORS headers (e.g., GitHub avatar redirects\n// from github.com → avatars.githubusercontent.com) cause html-to-image to taint\n// the canvas → toJpeg throws SecurityError. Filter alone wasn't reliable because\n// html-to-image fetches some images outside the filter's reach. Belt-and-suspenders:\n// physically swap cross-origin <img>.src to a transparent pixel before capture,\n// restore after. The user sees a brief blank where the avatar was during capture\n// (~hundreds of ms); the page never sees a screenshot failure.\n\nlet htmlToImage: typeof import('html-to-image') | null = null;\n\nasync function load() {\n if (!htmlToImage) {\n htmlToImage = await import('html-to-image');\n }\n return htmlToImage;\n}\n\nexport interface ScreenshotOptions {\n quality?: number; // 0..1, default 0.7\n pixelRatio?: number; // default min(devicePixelRatio, 2) — capping to keep file size sane\n excludeShadowRoot?: ShadowRoot; // skip our own widget elements\n}\n\nconst TRANSPARENT_PIXEL =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkAAIAAAoAAv/lxKUAAAAASUVORK5CYII=';\n\nfunction isUrlSafeForCanvas(rawUrl: string, crossOriginAttr?: string | null): boolean {\n if (!rawUrl) return true;\n if (rawUrl.startsWith('data:') || rawUrl.startsWith('blob:')) return true;\n if (rawUrl.startsWith('/') || rawUrl.startsWith('#')) return true;\n try {\n const u = new URL(rawUrl, window.location.href);\n if (u.origin === window.location.origin) return true;\n } catch {\n return false;\n }\n return crossOriginAttr === 'anonymous' || crossOriginAttr === 'use-credentials';\n}\n\n/**\n * Replace cross-origin image sources with a transparent pixel for the duration of\n * the capture so html-to-image can't even attempt to fetch them. Returns a restore\n * function that puts the originals back.\n *\n * Covers two element types:\n * - HTML <img> (uses .src)\n * - SVG <image> (uses href / xlink:href) — used by AstronautAvatar for GitHub avatars\n */\nfunction neutralizeCrossOriginImages(): () => void {\n const stashedImg: Array<{ el: HTMLImageElement; src: string }> = [];\n const stashedSvg: Array<{ el: SVGImageElement; href: string | null; xlink: string | null }> = [];\n\n document.querySelectorAll('img').forEach((img) => {\n if (!isUrlSafeForCanvas(img.src, img.crossOrigin)) {\n stashedImg.push({ el: img, src: img.src });\n img.src = TRANSPARENT_PIXEL;\n }\n });\n\n document.querySelectorAll('image').forEach((img) => {\n const svgImg = img as unknown as SVGImageElement;\n const href = svgImg.getAttribute('href');\n const xlink = svgImg.getAttributeNS('http://www.w3.org/1999/xlink', 'href');\n const url = href || xlink || '';\n if (url && !isUrlSafeForCanvas(url)) {\n stashedSvg.push({ el: svgImg, href, xlink });\n if (href !== null) svgImg.setAttribute('href', TRANSPARENT_PIXEL);\n if (xlink !== null) svgImg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', TRANSPARENT_PIXEL);\n }\n });\n\n return () => {\n for (const { el, src } of stashedImg) {\n el.src = src;\n }\n for (const { el, href, xlink } of stashedSvg) {\n if (href !== null) el.setAttribute('href', href);\n if (xlink !== null) el.setAttributeNS('http://www.w3.org/1999/xlink', 'href', xlink);\n }\n };\n}\n\nexport async function captureScreenshot(opts: ScreenshotOptions = {}): Promise<string> {\n const { quality = 0.7, pixelRatio = Math.min(window.devicePixelRatio || 1, 2), excludeShadowRoot } = opts;\n const lib = await load();\n\n // Skip:\n // - the widget's host element (drawer / floating trigger)\n // - any element marked .beacon-no-capture (overlays mounted to document.body\n // because shadow-DOM children get trapped inside transformed ancestors)\n const filter = excludeShadowRoot\n ? (node: Node) => {\n let cur: Node | null = node;\n while (cur) {\n if (cur === excludeShadowRoot.host) return false;\n if (cur instanceof Element && cur.classList.contains('beacon-no-capture')) return false;\n cur = cur.parentNode;\n }\n return true;\n }\n : undefined;\n\n const restore = neutralizeCrossOriginImages();\n\n try {\n return await lib.toJpeg(document.documentElement, {\n quality,\n pixelRatio,\n cacheBust: true,\n ...(filter ? { filter } : {}),\n imagePlaceholder: TRANSPARENT_PIXEL,\n // Cap dimensions to viewport so we don't accidentally capture full document height.\n width: window.innerWidth,\n height: window.innerHeight,\n style: {\n // Avoid scrolling artifacts.\n transform: 'none',\n },\n });\n } finally {\n restore();\n }\n}\n","// Draw the captured pins onto a screenshot. Takes the viewport screenshot data\n// URL and the pin list, returns a new data URL with two things baked per pin:\n//\n// 1. An outline rectangle around the pinned element (so triagers can tell\n// WHICH element was pinned without clicking into the pin data).\n// 2. A numbered circle at the outline's top-right corner.\n//\n// Rect freshness: pin.boundingRect is captured at pin time. If the user scrolls\n// between pinning and screenshot capture, that rect is in stale viewport coords.\n// We recompute via the same fallback chain the live overlay uses:\n// live element ref → selector lookup → captured rect\n// This keeps outlines and markers correctly anchored to what was pinned.\n\nimport type { Pin } from '../types';\n\nconst MARKER_RADIUS = 14;\nconst MARKER_STROKE = '#ffffff';\nconst MARKER_TEXT = '#ffffff';\nconst OUTLINE_WIDTH = 3;\nconst DEFAULT_ACCENT = '#0ea5e9';\n\nexport async function drawMarkers(\n screenshotDataUrl: string,\n pins: Pin[],\n viewportSize: { w: number; h: number; dpr: number },\n pinElements?: WeakMap<Pin, Element>,\n accent: string = DEFAULT_ACCENT,\n): Promise<string> {\n const MARKER_FILL = accent;\n const OUTLINE_COLOR = accent;\n const img = await loadImage(screenshotDataUrl);\n\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2D canvas context');\n\n ctx.drawImage(img, 0, 0);\n\n // Map viewport coords → screenshot pixel coords using the ratio between image\n // size and the captured viewport dimensions.\n const scaleX = canvas.width / viewportSize.w;\n const scaleY = canvas.height / viewportSize.h;\n\n for (const pin of pins) {\n const rect = getFreshRect(pin, pinElements);\n if (!rect) continue;\n\n const x = rect.x * scaleX;\n const y = rect.y * scaleY;\n const w = rect.w * scaleX;\n const h = rect.h * scaleY;\n\n // ── Outline rectangle ──\n ctx.lineWidth = OUTLINE_WIDTH;\n ctx.strokeStyle = OUTLINE_COLOR;\n ctx.strokeRect(x, y, w, h);\n\n // ── Numbered marker at top-right corner (matches the live overlay placement\n // so what users saw during pin mode looks like what triagers see later). ──\n const cx = x + w;\n const cy = y;\n\n // Filled circle.\n ctx.beginPath();\n ctx.fillStyle = MARKER_FILL;\n ctx.arc(cx, cy, MARKER_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n // White outer stroke for contrast.\n ctx.lineWidth = 3;\n ctx.strokeStyle = MARKER_STROKE;\n ctx.stroke();\n\n // Number text.\n ctx.fillStyle = MARKER_TEXT;\n ctx.font = 'bold 16px system-ui, -apple-system, sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(String(pin.number), cx, cy + 1);\n }\n\n return canvas.toDataURL('image/jpeg', 0.85);\n}\n\n/**\n * Three-tier fallback for \"where is this pinned element NOW\":\n * 1. Live element ref via WeakMap (most accurate — handles scroll, layout shift)\n * 2. Selector re-query (handles React re-render swapping the node identity)\n * 3. Original captured rect (last resort — may be stale relative to current viewport)\n */\nfunction getFreshRect(\n pin: Pin,\n pinElements?: WeakMap<Pin, Element>,\n): { x: number; y: number; w: number; h: number } | null {\n const target = pinElements?.get(pin);\n if (target && document.contains(target)) {\n const r = target.getBoundingClientRect();\n if (r.width > 0 || r.height > 0) {\n return { x: r.left, y: r.top, w: r.width, h: r.height };\n }\n }\n\n if (pin.selector) {\n try {\n const found = document.querySelector(pin.selector);\n if (found) {\n const r = found.getBoundingClientRect();\n if (r.width > 0 || r.height > 0) {\n return { x: r.left, y: r.top, w: r.width, h: r.height };\n }\n }\n } catch {\n // Invalid selector — fall through to captured rect.\n }\n }\n\n return pin.boundingRect;\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = (err) => reject(err);\n img.src = src;\n });\n}\n","// Capture runtime errors + unhandled promise rejections into a small ring buffer.\n// Drained by element.ts at submit time and attached to the feedback payload so the\n// reviewer (often Claude) can see what failed silently around the moment the user\n// hit the report button. Listeners are passive — zero cost on the happy path.\n//\n// Intentionally narrow: only `error` and `unhandledrejection`. No fetch monkey-\n// patching, no PerformanceObserver. Those can come later if real reports show the\n// gap; today's reports have nothing at all in this slot.\n\nimport type { CapturedEvent } from '../types';\n\nconst MAX_EVENTS = 30;\nconst MESSAGE_LIMIT = 500;\nconst STACK_LIMIT = 2000;\nconst SOURCE_LIMIT = 500;\nconst DEDUPE_WINDOW_MS = 5000;\n\n// Stack frame fragments that mean \"this came from the beacon itself\" — used to\n// avoid recursion (capturing our own errors would loop the report payload).\n// Patterns match both source-mode (dev consumer) and bundled output names.\nconst BEACON_STACK_PATTERN = /launch-kit-beacon|beacon-client|beacon\\.(?:es|umd|mjs)/i;\n\nconst buffer: CapturedEvent[] = [];\nconst recentSignatures = new Map<string, number>();\nconst listeners = new Set<() => void>();\nlet installed = false;\n\nfunction trunc(value: string | undefined, limit: number): string | undefined {\n if (!value) return undefined;\n return value.length > limit ? value.slice(0, limit) : value;\n}\n\nfunction signature(message: string, stack: string | undefined): string {\n // Top three frames are enough to distinguish \"same bug\" from \"different bug\"\n // without making the signature sensitive to async boundaries far up the stack.\n const stackHead = stack?.split('\\n').slice(0, 3).join('|') ?? '';\n return `${message}::${stackHead}`;\n}\n\nfunction fromBeacon(stack: string | undefined): boolean {\n return !!stack && BEACON_STACK_PATTERN.test(stack);\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value).slice(0, MESSAGE_LIMIT);\n } catch {\n return String(value);\n }\n}\n\nfunction push(event: CapturedEvent): void {\n // 1. Self-capture guard. If the failure came from inside the beacon, swallow it —\n // otherwise reporting a bug could itself generate the bug we report next time.\n if (fromBeacon(event.stack)) return;\n\n // 2. Drop AbortError. SPAs cancel fetches as a normal part of routing/cleanup\n // and they surface as unhandled rejections; they aren't bugs.\n if (event.kind === 'unhandledrejection' && /AbortError/i.test(event.message)) return;\n\n // 3. Dedupe within a short window so a render loop firing 200x doesn't blow the buffer.\n const sig = signature(event.message, event.stack);\n const last = recentSignatures.get(sig);\n if (last !== undefined && event.ts - last < DEDUPE_WINDOW_MS) {\n recentSignatures.set(sig, event.ts);\n return;\n }\n recentSignatures.set(sig, event.ts);\n\n buffer.push(event);\n if (buffer.length > MAX_EVENTS) buffer.shift();\n\n // Notify subscribers AFTER buffer mutation so they see the new state. Each\n // listener is wrapped — a throw here would block remaining listeners and\n // recursively trip the global error handler.\n for (const fn of listeners) {\n try { fn(); } catch { /* swallow */ }\n }\n}\n\n/**\n * Attach `error` and `unhandledrejection` listeners on `window`. Idempotent — safe\n * to call repeatedly (e.g., HMR reloads). No-op in non-browser environments.\n *\n * Called at module load from index.ts so we start capturing before the beacon\n * element mounts. Errors that fire during initial page hydration are exactly\n * the ones users are most likely to report and least able to describe.\n */\nexport function installEventCapture(): void {\n if (installed) return;\n if (typeof window === 'undefined') return;\n installed = true;\n\n window.addEventListener('error', (e: ErrorEvent) => {\n try {\n const errMessage = e.error instanceof Error ? e.error.message : undefined;\n const errStack = e.error instanceof Error ? e.error.stack : undefined;\n push({\n ts: Date.now(),\n kind: 'error',\n message: trunc(e.message || errMessage || 'Unknown error', MESSAGE_LIMIT) ?? 'Unknown error',\n ...(errStack ? { stack: trunc(errStack, STACK_LIMIT)! } : {}),\n ...(e.filename ? { source: trunc(e.filename, SOURCE_LIMIT)! } : {}),\n ...(Number.isFinite(e.lineno) ? { line: e.lineno } : {}),\n ...(Number.isFinite(e.colno) ? { col: e.colno } : {}),\n });\n } catch {\n // Never let our handler throw — it'd reenter the same listener.\n }\n });\n\n window.addEventListener('unhandledrejection', (e: PromiseRejectionEvent) => {\n try {\n const reason: unknown = e.reason;\n const message = reason instanceof Error\n ? reason.message\n : typeof reason === 'string'\n ? reason\n : safeStringify(reason);\n const stack = reason instanceof Error ? reason.stack : undefined;\n push({\n ts: Date.now(),\n kind: 'unhandledrejection',\n message: trunc(message || 'Unknown rejection', MESSAGE_LIMIT) ?? 'Unknown rejection',\n ...(stack ? { stack: trunc(stack, STACK_LIMIT)! } : {}),\n });\n } catch {\n // Same — swallow.\n }\n });\n}\n\n/** Snapshot of the captured events buffer. Returns a copy; callers can mutate it. */\nexport function getCapturedEvents(): CapturedEvent[] {\n return buffer.slice();\n}\n\n/**\n * Register a callback that fires every time a new event is added to the buffer.\n * Returns an unsubscribe function. Used by the drawer to live-update its chip\n * count so users see errors arrive in real-time, regardless of whether the\n * widget was opened before or after the error fired.\n */\nexport function subscribeToEvents(fn: () => void): () => void {\n listeners.add(fn);\n return () => { listeners.delete(fn); };\n}\n","// POST the feedback payload to the configured endpoint.\n\nimport type { FeedbackPayload, SubmitResponse } from '../types';\n\nexport async function submitFeedback(\n endpoint: string,\n payload: FeedbackPayload,\n headers?: Record<string, string>,\n): Promise<SubmitResponse> {\n const res = await fetch(endpoint, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n ...(headers ?? {}),\n },\n body: JSON.stringify(payload),\n });\n\n let body: unknown = null;\n const contentType = res.headers.get('Content-Type') ?? '';\n if (contentType.includes('application/json')) {\n try {\n body = await res.json();\n } catch {\n body = null;\n }\n } else {\n try {\n body = await res.text();\n } catch {\n body = null;\n }\n }\n\n return {\n ok: res.ok,\n status: res.status,\n body,\n };\n}\n","// <launch-kit-beacon> custom element. Orchestrates the capture pipeline + UI.\n\nimport stylesCss from './styles.css?inline';\n\nimport type { BeaconConfig, FeedbackPayload, Pin, RawPinCapture, Severity } from './types';\nimport { createTriggerButton } from './ui/button';\nimport { DrawerView } from './ui/drawer';\nimport { showPinPopover } from './ui/pin-popover';\nimport { createPickModeOverlay } from './ui/pick-mode-overlay';\nimport { startPicker } from './capture/picker';\nimport { capturePin } from './capture/element';\nimport { captureMetadata } from './capture/metadata';\nimport { captureScreenshot } from './capture/screenshot';\nimport { drawMarkers } from './capture/overlay';\nimport { getCapturedEvents, subscribeToEvents } from './capture/events';\nimport { submitFeedback } from './transport/submit';\n\nconst ATTRS = ['endpoint', 'position', 'theme', 'severities'] as const;\n\n// Inject the beacon stylesheet into <head> once, idempotently. Needed because the\n// drawer + pin popover are appended to document.body to escape transformed-ancestor\n// stacking contexts (sticky headers, etc.) — they're outside the shadow root, so the\n// shadow-scoped <style> doesn't reach them.\nconst GLOBAL_STYLE_ID = 'launch-kit-beacon-portal-styles';\nfunction ensureGlobalStyles(stylesText: string): void {\n if (document.getElementById(GLOBAL_STYLE_ID)) return;\n const tag = document.createElement('style');\n tag.id = GLOBAL_STYLE_ID;\n tag.textContent = stylesText;\n document.head.appendChild(tag);\n}\n\n// CSS custom properties consumers can override. The drawer's stylesheet uses\n// var(--beacon-*); after the body-mount refactor we copy the host's resolved\n// values onto the body-mounted drawer/popover (CSS inheritance no longer reaches\n// across the body boundary).\nconst CUSTOMIZABLE_VARS = [\n '--beacon-accent',\n '--beacon-bg',\n '--beacon-fg',\n '--beacon-muted',\n '--beacon-border',\n '--beacon-radius',\n '--beacon-shadow',\n '--beacon-z-index',\n '--beacon-bug',\n '--beacon-idea',\n '--beacon-ux',\n '--beacon-a11y',\n] as const;\n\nconst DEFAULT_ACCENT = '#0ea5e9';\n\nexport class LaunchKitBeacon extends HTMLElement {\n static get observedAttributes() { return ATTRS as unknown as string[]; }\n\n private shadow!: ShadowRoot;\n private trigger?: HTMLElement;\n private drawer?: DrawerView;\n private slotEl?: HTMLSlotElement;\n\n private _config: BeaconConfig | null = null;\n private pins: Pin[] = [];\n // Tracks the live DOM element each pin came from so re-entering annotate mode\n // can restore visual markers for previously pinned items. Off-payload by design.\n private pinElements = new WeakMap<Pin, Element>();\n private description = '';\n private severity: Severity = 'bug';\n // While drawer is open, block clicks on the host page so users can't accidentally\n // navigate away mid-feedback (and lose their pins). Same approach as a modal.\n private documentClickBlocker?: (e: MouseEvent) => void;\n // Set when submit succeeds so the close() warn skips during the 1.5s delay before\n // auto-close — without this, users who click the X during that window would see\n // \"Discard your feedback?\" right after they just sent it.\n private submitSucceeded = false;\n // Unsubscribe from the runtime-events buffer when the element is removed\n // (HMR, framework teardown). Without this the listener leaks across reloads.\n private eventsUnsubscribe?: () => void;\n\n /** Public — wrappers can set `widget.config = {...}` for dynamic endpoint/headers/context. */\n set config(value: BeaconConfig) {\n this._config = value;\n }\n get config(): BeaconConfig | null {\n if (this._config) return this._config;\n const endpoint = this.getAttribute('endpoint');\n return endpoint ? { endpoint } : null;\n }\n\n connectedCallback() {\n if (!this.shadow) {\n this.shadow = this.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = stylesCss;\n this.shadow.appendChild(style);\n\n // Slot for custom trigger override.\n this.slotEl = document.createElement('slot');\n this.slotEl.name = 'trigger';\n this.shadow.appendChild(this.slotEl);\n\n // Default trigger (shown unless slot is filled or position=\"hidden\").\n this.trigger = createTriggerButton();\n this.shadow.appendChild(this.trigger);\n this.trigger.addEventListener('click', () => this.open());\n\n // If consumer provided a slot=\"trigger\" child, hook clicks on it.\n this.slotEl.addEventListener('slotchange', () => {\n const assigned = this.slotEl!.assignedElements();\n if (assigned.length > 0) {\n // Hide the default; wire all assigned elements to open the drawer.\n if (this.trigger) (this.trigger as HTMLElement).style.display = 'none';\n assigned.forEach((el) => el.addEventListener('click', () => this.open()));\n }\n });\n\n this.drawer = new DrawerView(this.parseSeverities(), {\n onClose: () => this.close(),\n onAnnotate: () => this.startAnnotate(),\n onSubmit: () => this.handleSubmit(),\n onPinNoteChange: (n, note) => this.updatePinNote(n, note),\n onPinDelete: (n) => this.deletePin(n),\n onDescriptionChange: (v) => { this.description = v; },\n onSeverityChange: (s) => { this.severity = s; },\n });\n // Mount the drawer at document.body so it escapes any transformed ancestor\n // (sticky headers, blurred toolbars) that would otherwise trap it in a sub-\n // stacking-context and put it underneath other floating UI like a Command\n // Center / PDA shell. The trigger stays in shadow DOM (slotted from the\n // header is fine; that's where the user expects to see it).\n ensureGlobalStyles(stylesCss);\n this.drawer.root.classList.add('beacon-no-capture');\n this.drawer.root.classList.add(`beacon-theme-${this.getAttribute('theme') ?? 'auto'}`);\n document.body.appendChild(this.drawer.root);\n\n // Live-update the chip as new runtime errors come in. Without this the\n // count is frozen at whatever the buffer held at drawer-open time, so\n // errors fired while the widget is open would silently miss the chip\n // (though they're still in the payload at submit). The chip update is a\n // partial DOM patch — it does NOT re-render bodyEl, so the user's\n // textarea focus/cursor survive.\n this.eventsUnsubscribe = subscribeToEvents(() => {\n this.drawer?.setEvents(getCapturedEvents());\n });\n }\n\n // Default attributes if not set.\n if (!this.hasAttribute('position')) this.setAttribute('position', 'bottom-right');\n if (!this.hasAttribute('theme')) this.setAttribute('theme', 'auto');\n }\n\n attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n if (name === 'severities' && this.drawer) {\n // Re-create drawer with new severities. Keep current state.\n // Cheapest path: instruct drawer to refresh — but our drawer captures severities at construction.\n // Acceptable simplification: log a warning if attribute changes mid-life.\n // Production wrappers should set severities at construction via initial attribute.\n console.warn('[launch-kit-beacon] severities attribute changed after mount; not yet hot-reloaded.');\n }\n if (name === 'theme' && this.drawer && oldValue !== newValue) {\n this.drawer.root.classList.remove(`beacon-theme-${oldValue ?? 'auto'}`);\n this.drawer.root.classList.add(`beacon-theme-${newValue ?? 'auto'}`);\n }\n }\n\n // ── Public API ──────────────────────────────────────────\n\n open() {\n if (!this.drawer) return;\n // Edge-aware positioning when consumer is using a slotted trigger\n // (typical pattern when position=\"hidden\" — e.g., the trigger lives in a header).\n // Otherwise fall back to CSS-driven default position (bottom-right / bottom-left).\n if (this.getAttribute('position') === 'hidden') {\n const triggerEl = this.slotEl?.assignedElements()[0] as HTMLElement | undefined;\n if (triggerEl) {\n positionDrawerRelativeTo(this.drawer.root, triggerEl);\n }\n }\n this.submitSucceeded = false;\n // Snapshot the runtime-events buffer so the drawer shows a count. The\n // payload at submit time re-drains the buffer separately, so anything\n // captured between open and submit is still attached.\n this.drawer.setEvents(getCapturedEvents());\n this.syncCustomProperties();\n this.installClickBlocker();\n this.drawer.open();\n }\n\n close() {\n if (!this.drawer) return;\n if (!this.submitSucceeded && this.hasUnsavedData()) {\n // eslint-disable-next-line no-alert\n const ok = window.confirm('You have unsaved feedback. Close and discard it?');\n if (!ok) return;\n }\n this.forceClose();\n }\n\n disconnectedCallback() {\n // Custom element being removed from DOM (e.g., HMR or framework teardown).\n // Make sure we don't leak the document-level click listener.\n this.uninstallClickBlocker();\n this.eventsUnsubscribe?.();\n this.eventsUnsubscribe = undefined;\n // Drawer is mounted at body level — pull it out so we don't leave orphans\n // behind on HMR or framework teardown.\n if (this.drawer && this.drawer.root.parentNode) {\n this.drawer.root.parentNode.removeChild(this.drawer.root);\n }\n }\n\n async openWithPicker() {\n this.open();\n // Defer to next tick so the drawer is in DOM before we minimize it.\n setTimeout(() => this.startAnnotate(), 0);\n }\n\n // ── Annotate flow ──────────────────────────────────────────\n\n private async startAnnotate() {\n if (!this.drawer) return;\n this.drawer.minimize();\n\n const accent = this.getAccentColor();\n const overlay = createPickModeOverlay({ accent });\n\n // Restore markers for pins from prior annotate sessions. Use the WeakMap'd\n // element ref if it's still in the DOM; the overlay's reposition logic also\n // falls back to selector and captured rect if this ref is stale.\n for (const pin of this.pins) {\n const target = this.pinElements.get(pin);\n if (target) {\n overlay.addPin(pin.number, {\n target,\n selector: pin.selector,\n fallbackRect: pin.boundingRect,\n });\n }\n }\n\n try {\n let next = true;\n while (next) {\n const handle = startPicker({ shadowRoot: this.shadow, accent });\n const el = await handle.promise;\n if (!el) break; // user pressed Escape\n\n const rect = el.getBoundingClientRect();\n const popoverResult = await showPinPopover({\n shadowRoot: this.shadow,\n anchor: { x: rect.left, y: rect.bottom },\n pinNumber: this.pins.length + 1,\n });\n // 'all' (Escape) ends annotation; 'pin' (cross icon) drops this one and\n // re-enters pick mode for the next element. false falls through to capture.\n if (popoverResult.cancelled === 'all') break;\n if (popoverResult.cancelled === 'pin') continue;\n\n const raw = capturePin(el);\n const pin: Pin = {\n number: this.pins.length + 1,\n ...raw,\n ...(popoverResult.note ? { note: popoverResult.note } : {}),\n };\n this.pins.push(pin);\n this.pinElements.set(pin, el);\n overlay.addPin(pin.number, {\n target: el,\n selector: raw.selector,\n fallbackRect: raw.boundingRect,\n });\n\n // Loop continues — user picks another element OR presses Escape to finish.\n }\n\n // Capture final screenshot + draw markers + reopen drawer with preview.\n if (this.pins.length > 0) {\n // Swap the hint pill into a spinner BEFORE the capture so the user has\n // visible feedback during the 500ms-2s html-to-image walks the DOM.\n // Yield one frame so the swap actually paints before the main thread\n // gets busy with capture work.\n overlay.setLoading('Capturing screenshot…');\n await new Promise<void>((r) => requestAnimationFrame(() => r()));\n\n try {\n const meta = captureMetadata();\n const raw = await captureScreenshot({ excludeShadowRoot: this.shadow });\n const annotated = await drawMarkers(raw, this.pins, meta.viewport, this.pinElements, accent);\n this.drawer.setPins(this.pins, annotated);\n } catch (err) {\n // Don't drop the report — pins still post. But surface the failure so users\n // know why their preview is missing instead of guessing.\n const msg = err instanceof Error ? err.message : String(err);\n console.error('[launch-kit-beacon] screenshot capture failed:', err);\n this.drawer.setPins(this.pins);\n this.drawer.setStatus(`Screenshot capture failed: ${msg}`, 'error');\n }\n }\n } finally {\n overlay.destroy();\n }\n\n this.drawer.open();\n }\n\n private updatePinNote(num: number, note: string) {\n const pin = this.pins.find((p) => p.number === num);\n if (!pin) return;\n if (note.trim()) {\n pin.note = note;\n } else {\n delete pin.note;\n }\n // Don't re-render — the input is already up to date; rerender would lose focus.\n }\n\n private deletePin(num: number) {\n this.pins = this.pins.filter((p) => p.number !== num);\n // Renumber.\n this.pins.forEach((p, i) => { p.number = i + 1; });\n // Invalidate the cached annotated screenshot — it bakes the deleted pin's\n // marker into the JPEG. handleSubmit will recapture if needed.\n this.drawer?.setAnnotatedScreenshot(undefined);\n this.drawer?.setPins(this.pins);\n }\n\n // ── Submit flow ──────────────────────────────────────────\n\n private async handleSubmit() {\n if (!this.drawer) return;\n const cfg = this.config;\n if (!cfg?.endpoint) {\n this.drawer.setStatus('Missing endpoint configuration', 'error');\n return;\n }\n\n const description = this.drawer.getDescription().trim();\n const severity = this.drawer.getSeverity();\n if (!description) {\n this.drawer.setStatus('Description is required', 'error');\n return;\n }\n\n // Show the loading state IMMEDIATELY after validation, before any expensive\n // async work. Without this, the user clicks Save and sees nothing change for\n // 500ms-2s while captureScreenshot walks the DOM. Yield one frame so the\n // disabled state actually paints before the main thread gets busy.\n this.drawer.setSubmitting(true);\n\n // Reuse the screenshot already produced at end of annotate. Only recapture\n // if missing — invalidated by deletePin or never produced (e.g., user typed\n // a description and clicked Save without annotating).\n let screenshotDataUrl = this.drawer.getAnnotatedScreenshot();\n const needsCapture = !screenshotDataUrl && this.pins.length > 0;\n\n this.drawer.setStatus(needsCapture ? 'Capturing screenshot…' : 'Sending…');\n await new Promise<void>((r) => requestAnimationFrame(() => r()));\n\n const meta = captureMetadata();\n\n if (needsCapture) {\n try {\n const raw = await captureScreenshot({ excludeShadowRoot: this.shadow });\n screenshotDataUrl = await drawMarkers(raw, this.pins, meta.viewport, this.pinElements, this.getAccentColor());\n } catch (err) {\n console.error('[launch-kit-beacon] screenshot capture failed at submit:', err);\n }\n }\n\n // Drain any errors / unhandled rejections captured since page load. These let\n // the reviewer see what failed silently around the moment the user reported.\n const events = getCapturedEvents();\n\n const payload: FeedbackPayload = {\n description,\n severity,\n ...(screenshotDataUrl ? { screenshot: { dataUrl: screenshotDataUrl, mime: 'image/jpeg' } } : {}),\n metadata: meta,\n pins: this.pins,\n ...(events.length > 0 ? { events } : {}),\n ...(this.resolveContext() ? { context: this.resolveContext() } : {}),\n };\n\n // Pre-submit hook (cancellable).\n const beforeEvent = new CustomEvent('beacon-before-submit', {\n detail: { payload },\n cancelable: true,\n bubbles: true,\n composed: true,\n });\n const proceed = this.dispatchEvent(beforeEvent);\n if (!proceed) {\n this.drawer.setSubmitting(false);\n this.drawer.setStatus('Submission cancelled', 'error');\n return;\n }\n\n this.drawer.setStatus('Sending…');\n\n try {\n const headers = this.resolveHeaders();\n const response = await submitFeedback(cfg.endpoint, payload, headers);\n this.drawer.setSubmitting(false);\n\n if (response.ok) {\n this.submitSucceeded = true;\n this.drawer.setStatus('Sent — thanks!', 'success');\n this.dispatchEvent(new CustomEvent('beacon-after-submit', {\n detail: { response },\n bubbles: true,\n composed: true,\n }));\n // Reset state and close after a moment. forceClose skips the \"discard?\"\n // warn (because submitSucceeded is true) and tears down the click blocker.\n setTimeout(() => {\n this.forceClose();\n }, 1500);\n } else {\n this.drawer.setStatus(`Failed: ${response.status}`, 'error');\n }\n } catch (err) {\n this.drawer.setSubmitting(false);\n const msg = err instanceof Error ? err.message : 'Network error';\n this.drawer.setStatus(`Failed: ${msg}`, 'error');\n }\n }\n\n // ── Helpers ──────────────────────────────────────────\n\n /**\n * Resolved accent color — reads --beacon-accent from the host's computed style\n * (which picks up any inline `style=\"--beacon-accent: …\"` or stylesheet override\n * targeting the host). Falls back to the default sky-blue if unset.\n */\n private getAccentColor(): string {\n if (typeof window === 'undefined') return DEFAULT_ACCENT;\n const v = getComputedStyle(this).getPropertyValue('--beacon-accent').trim();\n return v || DEFAULT_ACCENT;\n }\n\n /**\n * Mirror every customizable --beacon-* var from the host onto the body-mounted\n * drawer. CSS inheritance stops at the body boundary, so we copy the host's\n * resolved values forward. Called on open() so changes mid-session are picked up.\n */\n private syncCustomProperties(): void {\n if (!this.drawer) return;\n const cs = getComputedStyle(this);\n for (const name of CUSTOMIZABLE_VARS) {\n const val = cs.getPropertyValue(name).trim();\n if (val) this.drawer.root.style.setProperty(name, val);\n }\n }\n\n private hasUnsavedData(): boolean {\n if (this.pins.length > 0) return true;\n const desc = this.drawer?.getDescription() ?? '';\n return desc.trim().length > 0;\n }\n\n private resetState(): void {\n this.pins = [];\n this.description = '';\n this.severity = 'bug';\n this.pinElements = new WeakMap();\n this.drawer?.reset();\n }\n\n private forceClose(): void {\n this.uninstallClickBlocker();\n this.resetState();\n this.submitSucceeded = false;\n this.drawer?.close();\n }\n\n private installClickBlocker(): void {\n if (this.documentClickBlocker) return;\n this.documentClickBlocker = (e: MouseEvent) => {\n const path = e.composedPath();\n // Allow:\n // 1. Clicks inside the shadow root or on the slotted trigger — both go\n // through the host element on their composed path.\n // 2. Clicks on body-mounted beacon UI — drawer, popover, and any future\n // body-mounted UI carry the `beacon-no-capture` class, so we allowlist\n // anything whose path crosses such an element.\n // Pick-mode border/hint/markers are pointer-events:none and never appear in\n // an event path, so they don't need to be allowlisted explicitly.\n if (path.includes(this.shadow.host)) return;\n for (const node of path) {\n if (node instanceof Element && node.classList.contains('beacon-no-capture')) return;\n }\n e.preventDefault();\n e.stopPropagation();\n };\n document.addEventListener('click', this.documentClickBlocker, true);\n }\n\n private uninstallClickBlocker(): void {\n if (!this.documentClickBlocker) return;\n document.removeEventListener('click', this.documentClickBlocker, true);\n this.documentClickBlocker = undefined;\n }\n\n private resolveHeaders(): Record<string, string> | undefined {\n const h = this.config?.headers;\n if (!h) return undefined;\n return typeof h === 'function' ? h() : h;\n }\n\n private resolveContext(): Record<string, unknown> | undefined {\n const c = this.config?.context;\n if (!c) return undefined;\n return typeof c === 'function' ? c() : c;\n }\n\n private parseSeverities(): Severity[] {\n const attr = this.getAttribute('severities');\n if (!attr) return ['bug', 'idea', 'ux', 'a11y'];\n return attr.split(',').map((s) => s.trim()).filter(Boolean) as Severity[];\n }\n}\n\nexport function defineBeacon(tagName = 'launch-kit-beacon'): void {\n if (typeof window === 'undefined') return;\n if (!customElements.get(tagName)) {\n customElements.define(tagName, LaunchKitBeacon);\n }\n}\n\n// ── Helpers ──────────────────────────────────────────\n\nconst DRAWER_WIDTH = 380;\nconst VIEWPORT_MARGIN = 8;\nconst ESTIMATED_DRAWER_HEIGHT = 520;\n\n/**\n * Position the drawer relative to a trigger element, edge-aware.\n *\n * Default placement: directly below the trigger, with the drawer's right edge\n * aligned to the trigger's right edge. Falls back to opening above the trigger\n * if there isn't enough space below. Always clamps within the viewport so the\n * drawer never overflows off-screen.\n */\nfunction positionDrawerRelativeTo(drawer: HTMLElement, trigger: HTMLElement): void {\n const rect = trigger.getBoundingClientRect();\n const viewportW = window.innerWidth;\n const viewportH = window.innerHeight;\n\n // ── Horizontal: align drawer's right edge to trigger's right edge ─────────\n // Compute desired right offset; clamp so drawer never overflows past either edge.\n let rightOffset = Math.max(VIEWPORT_MARGIN, viewportW - rect.right);\n // If aligning right would push the drawer's left edge past the viewport, shift it.\n const leftEdgeIfApplied = viewportW - rightOffset - DRAWER_WIDTH;\n if (leftEdgeIfApplied < VIEWPORT_MARGIN) {\n rightOffset = Math.max(VIEWPORT_MARGIN, viewportW - DRAWER_WIDTH - VIEWPORT_MARGIN);\n }\n\n // ── Vertical: prefer below trigger, fall back to above ────────────────────\n const spaceBelow = viewportH - rect.bottom - VIEWPORT_MARGIN;\n const spaceAbove = rect.top - VIEWPORT_MARGIN;\n\n // Set ALL four anchors explicitly. Use 'auto' (not '') to override CSS defaults\n // (the drawer's CSS has `bottom: 20px` for the floating-trigger case — empty\n // string falls back to that; 'auto' is the only way to truly clear it).\n drawer.style.left = 'auto';\n drawer.style.right = `${rightOffset}px`;\n\n if (spaceBelow >= ESTIMATED_DRAWER_HEIGHT || spaceBelow >= spaceAbove) {\n drawer.style.top = `${rect.bottom + VIEWPORT_MARGIN}px`;\n drawer.style.bottom = 'auto';\n } else {\n drawer.style.top = 'auto';\n drawer.style.bottom = `${viewportH - rect.top + VIEWPORT_MARGIN}px`;\n }\n}\n","// DOM-level capture for monitor mode: clicks, route changes, dialog mounts.\n//\n// Click capture is the differentiating feature. The recurring debugging shape we\n// see is \"user clicked X, nothing happened (or the wrong thing happened)\". A bare\n// click event tells you the target, but the *interesting* information is usually\n// further up the stack: what other overlays are sitting at the click coordinates,\n// is the body's pointer-events disabled, are there open Radix dialogs whose\n// dismissable layer is intercepting. We snapshot all of that on every click.\n//\n// We listen in the capture phase so we see the event even if a handler later\n// calls stopPropagation(). We do NOT preventDefault — capture is observational.\n\nimport type { MonitorClickEvent, MonitorClickTarget, MonitorDialogEvent, MonitorOverlayInfo, MonitorRouteEvent } from './types';\n\ntype Emit<E> = (event: Omit<E, 'ts' | 'sessionId' | 'seq'>) => void;\n\ninterface CaptureCallbacks {\n emitClick: Emit<MonitorClickEvent>;\n emitRoute: Emit<MonitorRouteEvent>;\n emitDialog: Emit<MonitorDialogEvent>;\n}\n\ninterface Installation {\n uninstall(): void;\n}\n\nconst HTML_LIMIT = 1024;\nconst MAX_OVERLAYS = 5;\n\nfunction truncate(s: string, n: number): string {\n return s.length > n ? s.slice(0, n) : s;\n}\n\n/**\n * Build a stable CSS selector for an element. Prefer #id, then tag.class.class,\n * walking up at most 3 levels. Not guaranteed unique but good enough for\n * \"the developer looking at the events stream can find this element.\"\n */\nfunction buildSelector(el: Element): string {\n if (el.id) return `#${CSS.escape(el.id)}`;\n const parts: string[] = [];\n let cur: Element | null = el;\n for (let i = 0; i < 3 && cur; i++) {\n const tag = cur.tagName.toLowerCase();\n const id = cur.id ? `#${CSS.escape(cur.id)}` : '';\n const cls = cur.classList.length > 0\n ? '.' + Array.from(cur.classList).slice(0, 3).map(CSS.escape).join('.')\n : '';\n parts.unshift(`${tag}${id}${cls}`);\n if (id) break; // id is unique-enough; stop walking\n cur = cur.parentElement;\n }\n return parts.join(' > ');\n}\n\nfunction describeTarget(el: Element): MonitorClickTarget {\n return {\n tag: el.tagName.toLowerCase(),\n id: el.id || null,\n classes: Array.from(el.classList).slice(0, 10),\n role: el.getAttribute('role'),\n selector: buildSelector(el),\n };\n}\n\n/**\n * Snapshot the overlay stack at a point. Walks all fixed/sticky candidates whose\n * computed `inset:0px` (or close to it) covers the entire viewport — these are\n * the elements most likely to be intercepting clicks. Returns the top N by z-index.\n */\nfunction overlaysAtPoint(x: number, y: number): MonitorOverlayInfo[] {\n // querySelectorAll('*') is expensive on large DOMs (10k+ nodes); only do this\n // when monitor is on. The result drives debugging of click-through bugs which\n // is exactly the kind of thing you turn monitor on for.\n const candidates: MonitorOverlayInfo[] = [];\n const all = document.querySelectorAll<HTMLElement>('body *');\n for (const el of Array.from(all)) {\n const cs = getComputedStyle(el);\n if (cs.position !== 'fixed' && cs.position !== 'sticky') continue;\n const rect = el.getBoundingClientRect();\n // Must cover the click point.\n if (x < rect.left || x > rect.right || y < rect.top || y > rect.bottom) continue;\n const z = parseInt(cs.zIndex, 10);\n if (!Number.isFinite(z) && cs.zIndex !== 'auto') continue;\n candidates.push({\n tag: el.tagName.toLowerCase(),\n zIndex: Number.isFinite(z) ? z : 0,\n pointerEvents: cs.pointerEvents,\n classes: Array.from(el.classList).slice(0, 5).join(' '),\n });\n }\n return candidates\n .sort((a, b) => b.zIndex - a.zIndex)\n .slice(0, MAX_OVERLAYS);\n}\n\n/**\n * Install click/mousedown capture. Both events fire because they expose\n * different things — mousedown is the one Radix DismissableLayer listens to\n * for outside-click dismissal, click is the one navigation actions hang off of.\n */\nfunction installClickCapture(cb: CaptureCallbacks): () => void {\n const handle = (kind: 'click' | 'mousedown') => (e: Event): void => {\n const me = e as MouseEvent;\n const target = me.target;\n if (!(target instanceof Element)) return;\n\n const x = me.clientX;\n const y = me.clientY;\n // elementFromPoint may differ from target if there's an overlay above it —\n // that mismatch is itself diagnostic (\"the element you wanted is being\n // occluded by X\"). Compare and surface.\n const hit = document.elementFromPoint(x, y);\n const hitMatches = hit === target || (hit ? target.contains(hit) || hit.contains(target) : false);\n\n const openDialogs = document.querySelectorAll('[role=\"dialog\"][data-state=\"open\"]').length;\n const bodyPe = getComputedStyle(document.body).pointerEvents;\n const overlays = overlaysAtPoint(x, y);\n\n cb.emitClick({\n kind,\n target: describeTarget(target),\n hitMatchesTarget: hitMatches,\n ...(!hitMatches && hit instanceof Element ? { hitTarget: describeTarget(hit) } : {}),\n coords: { x, y },\n openDialogs,\n bodyPointerEvents: bodyPe,\n ...(overlays.length > 0 ? { overlaysAtPoint: overlays } : {}),\n });\n };\n\n const onClick = handle('click');\n const onMouseDown = handle('mousedown');\n // Capture-phase + passive so we never block the underlying handler. We use\n // the capture phase to ensure we see the event even when a downstream handler\n // calls stopPropagation/stopImmediatePropagation.\n document.addEventListener('click', onClick, { capture: true, passive: true });\n document.addEventListener('mousedown', onMouseDown, { capture: true, passive: true });\n\n return () => {\n document.removeEventListener('click', onClick, { capture: true });\n document.removeEventListener('mousedown', onMouseDown, { capture: true });\n };\n}\n\n/**\n * Capture SPA route changes. History.pushState + replaceState don't fire any\n * event; we monkey-patch to emit. popstate + hashchange are real events.\n */\nfunction installRouteCapture(cb: CaptureCallbacks): () => void {\n const originalPush = history.pushState;\n const originalReplace = history.replaceState;\n let lastUrl = window.location.href;\n\n const emit = (via: MonitorRouteEvent['via']): void => {\n const to = window.location.href;\n if (to === lastUrl) return;\n const from = lastUrl;\n lastUrl = to;\n cb.emitRoute({ kind: 'route', from, to, via });\n };\n\n history.pushState = function patchedPushState(...args: Parameters<typeof history.pushState>) {\n const ret = originalPush.apply(this, args);\n emit('pushState');\n return ret;\n };\n history.replaceState = function patchedReplaceState(...args: Parameters<typeof history.replaceState>) {\n const ret = originalReplace.apply(this, args);\n emit('replaceState');\n return ret;\n };\n\n const onPop = (): void => emit('popstate');\n const onHash = (): void => emit('hashchange');\n window.addEventListener('popstate', onPop);\n window.addEventListener('hashchange', onHash);\n\n return () => {\n history.pushState = originalPush;\n history.replaceState = originalReplace;\n window.removeEventListener('popstate', onPop);\n window.removeEventListener('hashchange', onHash);\n };\n}\n\n/**\n * Watch for [role=\"dialog\"] subtree changes. Mount + unmount drive most modal\n * bugs in this codebase (Radix dismissable, stuck overlay, focus trap). We\n * also watch data-state changes for \"the dialog visibly closed but kept its\n * element / outside-click handler\" cases.\n */\nfunction installDialogCapture(cb: CaptureCallbacks): () => void {\n // Track currently-open dialog elements so we can emit unmount for the right ones.\n const seen = new WeakSet<Element>();\n\n const handle = (el: Element, action: 'mount' | 'unmount' | 'state'): void => {\n const selector = buildSelector(el);\n cb.emitDialog({\n kind: 'dialog',\n action,\n selector,\n state: el.getAttribute('data-state'),\n ...(action === 'mount' ? { outerHTML: truncate(el.outerHTML, HTML_LIMIT) } : {}),\n });\n };\n\n // Seed with already-mounted dialogs at install time so we get unmount events\n // for them when they later disappear.\n for (const el of Array.from(document.querySelectorAll('[role=\"dialog\"]'))) {\n seen.add(el);\n }\n\n const obs = new MutationObserver((mutations) => {\n for (const m of mutations) {\n for (const node of Array.from(m.addedNodes)) {\n if (!(node instanceof Element)) continue;\n // The dialog itself, OR a descendant added in a subtree (rare but possible).\n const dialogs = node.matches?.('[role=\"dialog\"]')\n ? [node]\n : Array.from(node.querySelectorAll?.('[role=\"dialog\"]') ?? []);\n for (const d of dialogs) {\n if (seen.has(d)) continue;\n seen.add(d);\n handle(d, 'mount');\n }\n }\n for (const node of Array.from(m.removedNodes)) {\n if (!(node instanceof Element)) continue;\n const dialogs = node.matches?.('[role=\"dialog\"]')\n ? [node]\n : Array.from(node.querySelectorAll?.('[role=\"dialog\"]') ?? []);\n for (const d of dialogs) {\n if (!seen.has(d)) continue;\n seen.delete(d);\n handle(d, 'unmount');\n }\n }\n if (m.type === 'attributes' && m.attributeName === 'data-state' && m.target instanceof Element) {\n if (m.target.getAttribute('role') === 'dialog') handle(m.target, 'state');\n }\n }\n });\n obs.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-state'],\n });\n\n return () => obs.disconnect();\n}\n\nexport function installDomCapture(cb: CaptureCallbacks): Installation {\n const undoClick = installClickCapture(cb);\n const undoRoute = installRouteCapture(cb);\n const undoDialog = installDialogCapture(cb);\n return {\n uninstall() {\n undoClick();\n undoRoute();\n undoDialog();\n },\n };\n}\n","// Capture fetch + XMLHttpRequest activity for monitor mode.\n//\n// Default policy: emit only failed requests (status >= 400 OR threw). Successful\n// requests are silently skipped — capturing every successful API call drowns the\n// signal. Verbose mode (passed in via start()) captures everything.\n//\n// We never read request/response bodies. They are PII-shaped (user input, tokens\n// in response payloads) and can be large. URL + method + status + duration is\n// usually enough to triage; the dev can re-run with verbose tooling if needed.\n\nimport type { MonitorNetworkEvent } from './types';\n\ntype Emit = (event: Omit<MonitorNetworkEvent, 'ts' | 'sessionId' | 'seq'>) => void;\n\ninterface InstallOptions {\n emit: Emit;\n verbose: boolean;\n}\n\ninterface Installation {\n uninstall(): void;\n}\n\nconst URL_LIMIT = 1000;\n\nfunction trunc(s: string, n: number): string {\n return s.length > n ? s.slice(0, n) : s;\n}\n\n/**\n * Wrap window.fetch. Captures method, URL, status, duration, and whether the\n * call failed. Restores the original on uninstall.\n *\n * We wrap (rather than register an Observer / PerformanceObserver) because we\n * need the *URL the developer wrote*, not the resolved one — and because\n * PerformanceObserver doesn't tell us whether the response was an error.\n */\nfunction wrapFetch(opts: InstallOptions): () => void {\n const original = window.fetch;\n if (typeof original !== 'function') return () => { /* nothing to restore */ };\n\n const wrapped: typeof fetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const start = performance.now();\n const method = (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase();\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n try {\n // Call bound to window so fetch's internal `this`-dependent paths still\n // work. Arrow function doesn't have its own `this`; passing globalThis\n // explicitly is the spec-correct way to invoke a free-standing fetch.\n const res = await original.call(window, input as RequestInfo, init);\n const durationMs = Math.round(performance.now() - start);\n const failed = res.status >= 400;\n if (failed || opts.verbose) {\n opts.emit({\n kind: 'fetch',\n url: trunc(url, URL_LIMIT),\n method,\n status: res.status,\n durationMs,\n failed,\n });\n }\n return res;\n } catch (err) {\n const durationMs = Math.round(performance.now() - start);\n opts.emit({\n kind: 'fetch',\n url: trunc(url, URL_LIMIT),\n method,\n status: 0,\n durationMs,\n failed: true,\n error: err instanceof Error ? err.message : String(err),\n });\n throw err;\n }\n };\n\n // Tag so we can detect \"is this still our wrapper\" on uninstall.\n // (window.fetch can be re-wrapped by analytics SDKs after us — in which case\n // we should NOT restore over their wrapper. We leave it; they'll handle their\n // own teardown.)\n (wrapped as unknown as { __lsBeaconWrapped: true }).__lsBeaconWrapped = true;\n window.fetch = wrapped;\n\n return () => {\n if ((window.fetch as unknown as { __lsBeaconWrapped?: true }).__lsBeaconWrapped) {\n window.fetch = original;\n }\n // else: someone wrapped over us. Leave their wrapper in place — restoring\n // would break their instrumentation. Our wrapper still gets called via theirs.\n };\n}\n\n/**\n * Wrap XMLHttpRequest. Tracks method+URL+start via open()/send(), reads status\n * on loadend. Same emission policy as fetch.\n */\nfunction wrapXhr(opts: InstallOptions): () => void {\n const proto = XMLHttpRequest.prototype;\n const originalOpen = proto.open;\n const originalSend = proto.send;\n\n // Stash per-XHR metadata in a WeakMap so we don't pollute the prototype.\n const state = new WeakMap<XMLHttpRequest, { method: string; url: string; start: number }>();\n\n proto.open = function patchedOpen(\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ): void {\n state.set(this, {\n method: method.toUpperCase(),\n url: typeof url === 'string' ? url : url.toString(),\n start: 0,\n });\n // @ts-expect-error — passthrough overload matrix is unwieldy; rest is forwarded as-is.\n return originalOpen.call(this, method, url, ...rest);\n };\n\n proto.send = function patchedSend(this: XMLHttpRequest, body?: Document | XMLHttpRequestBodyInit | null): void {\n const meta = state.get(this);\n if (meta) meta.start = performance.now();\n\n const onLoadEnd = (): void => {\n this.removeEventListener('loadend', onLoadEnd);\n const m = state.get(this);\n if (!m) return;\n const durationMs = Math.round(performance.now() - m.start);\n // status === 0 indicates the request errored or was aborted before a response.\n const failed = this.status === 0 || this.status >= 400;\n if (failed || opts.verbose) {\n opts.emit({\n kind: 'xhr',\n url: trunc(m.url, URL_LIMIT),\n method: m.method,\n status: this.status,\n durationMs,\n failed,\n });\n }\n state.delete(this);\n };\n this.addEventListener('loadend', onLoadEnd);\n return originalSend.call(this, body as XMLHttpRequestBodyInit | null);\n };\n\n return () => {\n proto.open = originalOpen;\n proto.send = originalSend;\n };\n}\n\nexport function installNetworkCapture(opts: InstallOptions): Installation {\n const undoFetch = wrapFetch(opts);\n const undoXhr = wrapXhr(opts);\n return {\n uninstall() {\n undoFetch();\n undoXhr();\n },\n };\n}\n","// Batched POST transport for monitor events.\n//\n// Buffers events in memory and flushes to the configured URL on a timer, on a\n// size threshold, or synchronously on pagehide via navigator.sendBeacon.\n//\n// Why not fire-per-event:\n// - A burst of clicks during a repro can be 50+ events/sec. Per-event POSTs\n// would flood the receiver and the network panel.\n// - Some events (route changes, navigation) arrive right before the browser\n// tears the page down — only sendBeacon survives that.\n\nimport type { MonitorBatch, MonitorEvent } from './types';\n\nconst FLUSH_INTERVAL_MS = 1000;\nconst FLUSH_AT_COUNT = 50;\nconst MAX_BUFFER = 500;\n\nexport interface TransportOptions {\n url: string;\n sessionId: string;\n /** Called when a flush attempt failed (network error or non-2xx). For UI badge. */\n onError?: (err: Error) => void;\n}\n\nexport class MonitorTransport {\n private url: string;\n private sessionId: string;\n private onError?: (err: Error) => void;\n private buffer: MonitorEvent[] = [];\n private inflight = false;\n private timer: ReturnType<typeof setInterval> | null = null;\n private pagehideHandler?: () => void;\n private destroyed = false;\n\n constructor(opts: TransportOptions) {\n this.url = opts.url;\n this.sessionId = opts.sessionId;\n this.onError = opts.onError;\n\n this.timer = setInterval(() => this.flush(), FLUSH_INTERVAL_MS);\n this.pagehideHandler = () => this.flushSync();\n // pagehide fires for both unload AND bfcache eviction. Prefer it over\n // beforeunload (which doesn't fire on mobile when the user switches tabs).\n window.addEventListener('pagehide', this.pagehideHandler);\n // visibilitychange to 'hidden' is the only reliable signal on iOS Safari\n // when the user backgrounds the tab. Flush sync there too.\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n }\n\n private handleVisibilityChange = (): void => {\n if (document.visibilityState === 'hidden') this.flushSync();\n };\n\n enqueue(event: MonitorEvent): void {\n if (this.destroyed) return;\n this.buffer.push(event);\n if (this.buffer.length >= MAX_BUFFER) {\n // Drop the oldest non-flushed event rather than grow unbounded.\n this.buffer.shift();\n }\n if (this.buffer.length >= FLUSH_AT_COUNT) this.flush();\n }\n\n /** Async flush via fetch. No-op when in-flight or empty. */\n async flush(): Promise<void> {\n if (this.destroyed) return;\n if (this.inflight || this.buffer.length === 0) return;\n const events = this.buffer.splice(0, FLUSH_AT_COUNT);\n const batch = this.makeBatch(events);\n this.inflight = true;\n try {\n const res = await fetch(this.url, {\n method: 'POST',\n // No credentials — this is going to the developer's local server,\n // not the app's own backend. Avoid leaking session cookies.\n credentials: 'omit',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch),\n // keepalive lets the request survive a same-tick navigation when\n // we missed pagehide (e.g. a window.location.assign from script).\n keepalive: true,\n });\n if (!res.ok) {\n this.onError?.(new Error(`monitor flush: HTTP ${res.status}`));\n }\n } catch (err) {\n // Network failure (server gone, CORS, etc.) — surface but don't crash.\n // Events in this batch are LOST — re-queueing risks duplicates and we\n // can't tell the receiver \"this is a retry.\" Acceptable trade for dev tooling.\n this.onError?.(err instanceof Error ? err : new Error(String(err)));\n } finally {\n this.inflight = false;\n }\n }\n\n /** Synchronous flush via sendBeacon, used on pagehide. */\n private flushSync(): void {\n if (this.destroyed || this.buffer.length === 0) return;\n if (!navigator.sendBeacon) {\n // Old browsers — best-effort fetch with keepalive (no await; we're tearing down).\n void this.flush();\n return;\n }\n const events = this.buffer.splice(0);\n const batch = this.makeBatch(events);\n // sendBeacon doesn't accept Content-Type; the receiver should detect JSON\n // by best-effort parsing (or treat as application/x-www-form-urlencoded\n // and JSON.parse the body anyway).\n const blob = new Blob([JSON.stringify(batch)], { type: 'application/json' });\n try {\n navigator.sendBeacon(this.url, blob);\n } catch {\n // sendBeacon can throw on payloads too large (~64KB). Drop the batch.\n }\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.timer) clearInterval(this.timer);\n if (this.pagehideHandler) window.removeEventListener('pagehide', this.pagehideHandler);\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n // Best-effort final flush so events from the moment of stop() make it out.\n this.flushSync();\n }\n\n private makeBatch(events: MonitorEvent[]): MonitorBatch {\n return {\n sessionId: this.sessionId,\n events,\n meta: {\n url: window.location.href,\n userAgent: navigator.userAgent,\n viewport: {\n w: window.innerWidth,\n h: window.innerHeight,\n dpr: window.devicePixelRatio || 1,\n },\n v: 1,\n },\n };\n }\n}\n","// Monitor mode orchestrator + window.__lsBeacon public API.\n//\n// Lifecycle:\n// start(cfg) → install capture modules, kick off transport, persist URL in\n// sessionStorage so a page reload within the same tab resumes\n// stop() → uninstall capture, destroy transport, clear sessionStorage\n// probe() → emit a custom event (no-op when inactive)\n//\n// Subscribes to the existing capture/events.ts buffer so errors that arrive\n// before monitor mode is enabled are still picked up (one-shot drain on start).\n\nimport { getCapturedEvents, subscribeToEvents } from '../capture/events';\nimport type { CapturedEvent } from '../types';\nimport { installDomCapture } from './dom';\nimport { installNetworkCapture } from './network';\nimport { MonitorTransport } from './transport';\nimport type {\n MonitorConfig,\n MonitorEvent,\n MonitorPublicAPI,\n} from './types';\n\n// Distributive Omit so the union members keep their discriminant + body when\n// we strip the auto-filled ts/sessionId/seq fields. Without distribution,\n// TypeScript collapses to \"only fields all members share\" — which excludes\n// label, data, etc., breaking every emit call site.\ntype EventInput<T> = T extends unknown ? Omit<T, 'ts' | 'sessionId' | 'seq'> : never;\ntype MonitorEventInput = EventInput<MonitorEvent>;\n\nconst SESSION_URL_KEY = '__lsBeaconMonitorUrl';\nconst SESSION_ID_KEY = '__lsBeaconMonitorSession';\nconst SESSION_VERBOSE_KEY = '__lsBeaconMonitorVerbose';\nconst SESSION_DEADLINE_KEY = '__lsBeaconMonitorDeadline';\nconst DEFAULT_MAX_SESSION_MS = 30 * 60_000;\nconst PROBE_DATA_LIMIT = 4_096;\n\ntype Listener = (active: boolean, url: string | null) => void;\n\ninterface ActiveSession {\n url: string;\n sessionId: string;\n verbose: boolean;\n deadlineMs: number;\n seq: number;\n transport: MonitorTransport;\n uninstallNetwork: () => void;\n uninstallDom: () => void;\n uninstallErrors: () => void;\n deadlineTimer: ReturnType<typeof setTimeout>;\n}\n\nlet active: ActiveSession | null = null;\nconst listeners = new Set<Listener>();\n// Track the last error event index we drained on start, so we can\n// re-drain newly-arriving errors via subscribeToEvents.\nlet drainedThrough = 0;\n\nfunction randomSessionId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n // crypto.randomUUID() always returns \"xxxxxxxx-xxxx-...\" so split[0] exists.\n // Slice instead of split to keep TS happy under noUncheckedIndexedAccess.\n return crypto.randomUUID().slice(0, 8);\n }\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction safeSerialize(value: unknown): unknown {\n // Defend against cyclic refs + functions + large blobs. Strings come through\n // truncated; objects/arrays round-trip through JSON which strips functions\n // and throws on cycles (we catch and stringify defensively).\n const seen = new WeakSet<object>();\n const walk = (v: unknown): unknown => {\n if (v === null || typeof v !== 'object') {\n if (typeof v === 'string') return v.length > PROBE_DATA_LIMIT ? v.slice(0, PROBE_DATA_LIMIT) : v;\n return v;\n }\n if (seen.has(v as object)) return '[cyclic]';\n seen.add(v as object);\n if (Array.isArray(v)) return v.map(walk);\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(v as object).slice(0, 50)) {\n try {\n out[k] = walk((v as Record<string, unknown>)[k]);\n } catch {\n out[k] = '[unreadable]';\n }\n }\n return out;\n };\n try {\n return walk(value);\n } catch {\n return '[unserialisable]';\n }\n}\n\nfunction notify(): void {\n for (const fn of listeners) {\n try {\n fn(active !== null, active?.url ?? null);\n } catch {\n // listeners must not throw; ignore.\n }\n }\n}\n\nfunction stamp(partial: MonitorEventInput): MonitorEvent {\n if (!active) {\n // Programmer error — caller should check isActive() first. Throwing here\n // would crash the host page, so synthesize a no-op event instead.\n return {\n ...(partial as object),\n ts: Date.now(),\n sessionId: '',\n seq: 0,\n } as unknown as MonitorEvent;\n }\n active.seq += 1;\n return {\n ...(partial as object),\n ts: Date.now(),\n sessionId: active.sessionId,\n seq: active.seq,\n } as unknown as MonitorEvent;\n}\n\nfunction enqueue(partial: MonitorEventInput): void {\n if (!active) return;\n const event = stamp(partial);\n active.transport.enqueue(event);\n}\n\nfunction persistSession(): void {\n if (!active) return;\n try {\n sessionStorage.setItem(SESSION_URL_KEY, active.url);\n sessionStorage.setItem(SESSION_ID_KEY, active.sessionId);\n sessionStorage.setItem(SESSION_VERBOSE_KEY, active.verbose ? '1' : '0');\n sessionStorage.setItem(SESSION_DEADLINE_KEY, String(active.deadlineMs));\n } catch {\n // sessionStorage can be disabled (Safari private mode). The session still\n // works, just doesn't survive reload.\n }\n}\n\nfunction clearPersistedSession(): void {\n try {\n sessionStorage.removeItem(SESSION_URL_KEY);\n sessionStorage.removeItem(SESSION_ID_KEY);\n sessionStorage.removeItem(SESSION_VERBOSE_KEY);\n sessionStorage.removeItem(SESSION_DEADLINE_KEY);\n } catch {\n // ignore\n }\n}\n\nfunction readPersistedSession(): { url: string; sessionId: string; verbose: boolean; deadlineMs: number } | null {\n try {\n const url = sessionStorage.getItem(SESSION_URL_KEY);\n if (!url) return null;\n const sessionId = sessionStorage.getItem(SESSION_ID_KEY) ?? randomSessionId();\n const verbose = sessionStorage.getItem(SESSION_VERBOSE_KEY) === '1';\n const deadlineRaw = sessionStorage.getItem(SESSION_DEADLINE_KEY);\n const deadlineMs = deadlineRaw ? Number(deadlineRaw) : Date.now() + DEFAULT_MAX_SESSION_MS;\n if (Number.isFinite(deadlineMs) && deadlineMs <= Date.now()) {\n clearPersistedSession();\n return null;\n }\n return { url, sessionId, verbose, deadlineMs };\n } catch {\n return null;\n }\n}\n\nfunction start(config: MonitorConfig): void {\n if (active) stop();\n if (!config.url) return;\n\n const maxMs = config.maxSessionMs ?? DEFAULT_MAX_SESSION_MS;\n const deadlineMs = Date.now() + maxMs;\n const sessionId = randomSessionId();\n const verbose = !!config.verbose;\n\n const transport = new MonitorTransport({\n url: config.url,\n sessionId,\n onError: (err) => {\n // Soft-fail. We don't tear down on transient errors — the dev's local\n // server might just be restarting. But we surface to the console once,\n // so the user knows monitor isn't reaching anything.\n console.warn('[launch-kit-beacon] monitor transport error:', err.message);\n },\n });\n\n // Bridge: drain any errors already captured by capture/events.ts before\n // monitor was started, and subscribe to future ones.\n const existing = getCapturedEvents();\n drainedThrough = existing.length;\n for (const ev of existing) emitErrorEvent(ev, transport, sessionId);\n let seqForErrors = 0;\n const errorsUnsub = subscribeToEvents(() => {\n const all = getCapturedEvents();\n while (drainedThrough < all.length) {\n const ev = all[drainedThrough];\n if (ev) emitErrorEvent(ev, transport, sessionId);\n drainedThrough += 1;\n seqForErrors += 1;\n }\n });\n\n const net = installNetworkCapture({\n emit: (partial) => enqueue(partial),\n verbose,\n });\n\n const dom = installDomCapture({\n emitClick: (partial) => enqueue(partial),\n emitRoute: (partial) => enqueue(partial),\n emitDialog: (partial) => enqueue(partial),\n });\n\n const deadlineTimer = setTimeout(() => {\n console.info('[launch-kit-beacon] monitor session expired (max duration reached)');\n stop();\n }, Math.max(0, deadlineMs - Date.now()));\n\n active = {\n url: config.url,\n sessionId,\n verbose,\n deadlineMs,\n seq: 0,\n transport,\n uninstallNetwork: net.uninstall,\n uninstallDom: dom.uninstall,\n uninstallErrors: errorsUnsub,\n deadlineTimer,\n };\n // Track seqForErrors to satisfy lint about unused — it's incremented for\n // possible future use (per-source counters) but currently piggybacks on\n // the unified seq via emitErrorEvent. Suppress with a void.\n void seqForErrors;\n\n persistSession();\n notify();\n}\n\n/** Emit a CapturedEvent (from capture/events.ts) into the monitor stream. */\nfunction emitErrorEvent(ev: CapturedEvent, transport: MonitorTransport, sessionId: string): void {\n if (!active) return;\n active.seq += 1;\n transport.enqueue({\n kind: ev.kind,\n ts: ev.ts,\n sessionId,\n seq: active.seq,\n message: ev.message,\n ...(ev.stack ? { stack: ev.stack } : {}),\n ...(ev.source ? { source: ev.source } : {}),\n ...(typeof ev.line === 'number' ? { line: ev.line } : {}),\n ...(typeof ev.col === 'number' ? { col: ev.col } : {}),\n });\n}\n\nfunction stop(): void {\n if (!active) return;\n clearTimeout(active.deadlineTimer);\n active.uninstallNetwork();\n active.uninstallDom();\n active.uninstallErrors();\n active.transport.destroy();\n active = null;\n drainedThrough = 0;\n clearPersistedSession();\n notify();\n}\n\nfunction probe(label: string, data?: unknown): void {\n if (!active) return;\n enqueue({\n kind: 'probe',\n label: label.slice(0, 200),\n data: safeSerialize(data),\n });\n}\n\nfunction isActive(): boolean {\n return active !== null;\n}\n\nfunction currentUrl(): string | null {\n return active?.url ?? null;\n}\n\n/** Subscribe to active-state changes. Used by the panel UI to update its display. */\nexport function subscribeToMonitor(fn: Listener): () => void {\n listeners.add(fn);\n return () => { listeners.delete(fn); };\n}\n\nexport const monitor: MonitorPublicAPI = {\n start,\n stop,\n probe,\n isActive,\n currentUrl,\n};\n\n/**\n * Resume a persisted session if one exists in sessionStorage. Called at module\n * load. Without this, a page reload during active monitoring silently drops\n * capture even though the URL is still configured.\n */\nexport function resumeIfPersisted(): void {\n if (active) return;\n const persisted = readPersistedSession();\n if (!persisted) return;\n start({\n url: persisted.url,\n verbose: persisted.verbose,\n maxSessionMs: Math.max(60_000, persisted.deadlineMs - Date.now()),\n });\n}\n\n/**\n * Install the public API on window. Idempotent. Called from index.ts at module\n * load so consumers can call `window.__lsBeacon.start(...)` from devtools or\n * a bookmarklet without waiting for the element to mount.\n */\nexport function installPublicAPI(): void {\n if (typeof window === 'undefined') return;\n const w = window as unknown as { __lsBeacon?: MonitorPublicAPI };\n if (w.__lsBeacon) return; // don't overwrite (e.g. on HMR)\n w.__lsBeacon = monitor;\n}\n","// Entry point for the launch-kit beacon Web Component.\n// Importing this module auto-registers the <launch-kit-beacon> custom element.\n// Exposed via the @launchsecure/launch-kit/beacon subpath export.\n\nimport { defineBeacon, LaunchKitBeacon } from './element';\nimport { installEventCapture } from './capture/events';\nimport { installPublicAPI, resumeIfPersisted } from './monitor';\n\nexport { LaunchKitBeacon, defineBeacon };\nexport type {\n BeaconConfig,\n CapturedEvent,\n FeedbackPayload,\n Pin,\n Metadata,\n Severity,\n HeaderProvider,\n ContextProvider,\n SubmitResponse,\n} from './types';\nexport type {\n MonitorConfig,\n MonitorEvent,\n MonitorEventKind,\n MonitorBatch,\n MonitorPublicAPI,\n MonitorErrorEvent,\n MonitorNetworkEvent,\n MonitorClickEvent,\n MonitorRouteEvent,\n MonitorDialogEvent,\n MonitorProbeEvent,\n} from './monitor/types';\n\n// Auto-register on import. Consumers who want to control the tag name can call\n// defineBeacon('my-tag') themselves before any <launch-kit-beacon> elements are parsed.\ndefineBeacon();\n\n// Start listening for runtime errors immediately — well before any beacon element\n// is mounted. Bugs that happen during initial hydration are exactly the ones users\n// can't describe later, and the listeners are passive (zero cost on the happy path).\ninstallEventCapture();\n\n// Expose window.__lsBeacon so devs can call start()/stop()/probe() from devtools\n// without waiting for the element to mount. Also resume any session that was\n// active in this tab before reload (sessionStorage-backed) — without this, a\n// page reload mid-debug silently drops the stream.\ninstallPublicAPI();\nresumeIfPersisted();\n","export function resolveUrl(url, baseUrl) {\n // url is absolute already\n if (url.match(/^[a-z]+:\\/\\//i)) {\n return url;\n }\n // url is absolute already, without protocol\n if (url.match(/^\\/\\//)) {\n return window.location.protocol + url;\n }\n // dataURI, mailto:, tel:, etc.\n if (url.match(/^[a-z]+:/i)) {\n return url;\n }\n const doc = document.implementation.createHTMLDocument();\n const base = doc.createElement('base');\n const a = doc.createElement('a');\n doc.head.appendChild(base);\n doc.body.appendChild(a);\n if (baseUrl) {\n base.href = baseUrl;\n }\n a.href = url;\n return a.href;\n}\nexport const uuid = (() => {\n // generate uuid for className of pseudo elements.\n // We should not use GUIDs, otherwise pseudo elements sometimes cannot be captured.\n let counter = 0;\n // ref: http://stackoverflow.com/a/6248722/2519373\n const random = () => \n // eslint-disable-next-line no-bitwise\n `0000${((Math.random() * 36 ** 4) << 0).toString(36)}`.slice(-4);\n return () => {\n counter += 1;\n return `u${random()}${counter}`;\n };\n})();\nexport function delay(ms) {\n return (args) => new Promise((resolve) => {\n setTimeout(() => resolve(args), ms);\n });\n}\nexport function toArray(arrayLike) {\n const arr = [];\n for (let i = 0, l = arrayLike.length; i < l; i++) {\n arr.push(arrayLike[i]);\n }\n return arr;\n}\nlet styleProps = null;\nexport function getStyleProperties(options = {}) {\n if (styleProps) {\n return styleProps;\n }\n if (options.includeStyleProperties) {\n styleProps = options.includeStyleProperties;\n return styleProps;\n }\n styleProps = toArray(window.getComputedStyle(document.documentElement));\n return styleProps;\n}\nfunction px(node, styleProperty) {\n const win = node.ownerDocument.defaultView || window;\n const val = win.getComputedStyle(node).getPropertyValue(styleProperty);\n return val ? parseFloat(val.replace('px', '')) : 0;\n}\nfunction getNodeWidth(node) {\n const leftBorder = px(node, 'border-left-width');\n const rightBorder = px(node, 'border-right-width');\n return node.clientWidth + leftBorder + rightBorder;\n}\nfunction getNodeHeight(node) {\n const topBorder = px(node, 'border-top-width');\n const bottomBorder = px(node, 'border-bottom-width');\n return node.clientHeight + topBorder + bottomBorder;\n}\nexport function getImageSize(targetNode, options = {}) {\n const width = options.width || getNodeWidth(targetNode);\n const height = options.height || getNodeHeight(targetNode);\n return { width, height };\n}\nexport function getPixelRatio() {\n let ratio;\n let FINAL_PROCESS;\n try {\n FINAL_PROCESS = process;\n }\n catch (e) {\n // pass\n }\n const val = FINAL_PROCESS && FINAL_PROCESS.env\n ? FINAL_PROCESS.env.devicePixelRatio\n : null;\n if (val) {\n ratio = parseInt(val, 10);\n if (Number.isNaN(ratio)) {\n ratio = 1;\n }\n }\n return ratio || window.devicePixelRatio || 1;\n}\n// @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#maximum_canvas_size\nconst canvasDimensionLimit = 16384;\nexport function checkCanvasDimensions(canvas) {\n if (canvas.width > canvasDimensionLimit ||\n canvas.height > canvasDimensionLimit) {\n if (canvas.width > canvasDimensionLimit &&\n canvas.height > canvasDimensionLimit) {\n if (canvas.width > canvas.height) {\n canvas.height *= canvasDimensionLimit / canvas.width;\n canvas.width = canvasDimensionLimit;\n }\n else {\n canvas.width *= canvasDimensionLimit / canvas.height;\n canvas.height = canvasDimensionLimit;\n }\n }\n else if (canvas.width > canvasDimensionLimit) {\n canvas.height *= canvasDimensionLimit / canvas.width;\n canvas.width = canvasDimensionLimit;\n }\n else {\n canvas.width *= canvasDimensionLimit / canvas.height;\n canvas.height = canvasDimensionLimit;\n }\n }\n}\nexport function canvasToBlob(canvas, options = {}) {\n if (canvas.toBlob) {\n return new Promise((resolve) => {\n canvas.toBlob(resolve, options.type ? options.type : 'image/png', options.quality ? options.quality : 1);\n });\n }\n return new Promise((resolve) => {\n const binaryString = window.atob(canvas\n .toDataURL(options.type ? options.type : undefined, options.quality ? options.quality : undefined)\n .split(',')[1]);\n const len = binaryString.length;\n const binaryArray = new Uint8Array(len);\n for (let i = 0; i < len; i += 1) {\n binaryArray[i] = binaryString.charCodeAt(i);\n }\n resolve(new Blob([binaryArray], {\n type: options.type ? options.type : 'image/png',\n }));\n });\n}\nexport function createImage(url) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n img.decode().then(() => {\n requestAnimationFrame(() => resolve(img));\n });\n };\n img.onerror = reject;\n img.crossOrigin = 'anonymous';\n img.decoding = 'async';\n img.src = url;\n });\n}\nexport async function svgToDataURL(svg) {\n return Promise.resolve()\n .then(() => new XMLSerializer().serializeToString(svg))\n .then(encodeURIComponent)\n .then((html) => `data:image/svg+xml;charset=utf-8,${html}`);\n}\nexport async function nodeToDataURL(node, width, height) {\n const xmlns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(xmlns, 'svg');\n const foreignObject = document.createElementNS(xmlns, 'foreignObject');\n svg.setAttribute('width', `${width}`);\n svg.setAttribute('height', `${height}`);\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`);\n foreignObject.setAttribute('width', '100%');\n foreignObject.setAttribute('height', '100%');\n foreignObject.setAttribute('x', '0');\n foreignObject.setAttribute('y', '0');\n foreignObject.setAttribute('externalResourcesRequired', 'true');\n svg.appendChild(foreignObject);\n foreignObject.appendChild(node);\n return svgToDataURL(svg);\n}\nexport const isInstanceOfElement = (node, instance) => {\n if (node instanceof instance)\n return true;\n const nodePrototype = Object.getPrototypeOf(node);\n if (nodePrototype === null)\n return false;\n return (nodePrototype.constructor.name === instance.name ||\n isInstanceOfElement(nodePrototype, instance));\n};\n//# sourceMappingURL=util.js.map","import { uuid, getStyleProperties } from './util';\nfunction formatCSSText(style) {\n const content = style.getPropertyValue('content');\n return `${style.cssText} content: '${content.replace(/'|\"/g, '')}';`;\n}\nfunction formatCSSProperties(style, options) {\n return getStyleProperties(options)\n .map((name) => {\n const value = style.getPropertyValue(name);\n const priority = style.getPropertyPriority(name);\n return `${name}: ${value}${priority ? ' !important' : ''};`;\n })\n .join(' ');\n}\nfunction getPseudoElementStyle(className, pseudo, style, options) {\n const selector = `.${className}:${pseudo}`;\n const cssText = style.cssText\n ? formatCSSText(style)\n : formatCSSProperties(style, options);\n return document.createTextNode(`${selector}{${cssText}}`);\n}\nfunction clonePseudoElement(nativeNode, clonedNode, pseudo, options) {\n const style = window.getComputedStyle(nativeNode, pseudo);\n const content = style.getPropertyValue('content');\n if (content === '' || content === 'none') {\n return;\n }\n const className = uuid();\n try {\n clonedNode.className = `${clonedNode.className} ${className}`;\n }\n catch (err) {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.appendChild(getPseudoElementStyle(className, pseudo, style, options));\n clonedNode.appendChild(styleElement);\n}\nexport function clonePseudoElements(nativeNode, clonedNode, options) {\n clonePseudoElement(nativeNode, clonedNode, ':before', options);\n clonePseudoElement(nativeNode, clonedNode, ':after', options);\n}\n//# sourceMappingURL=clone-pseudos.js.map","const WOFF = 'application/font-woff';\nconst JPEG = 'image/jpeg';\nconst mimes = {\n woff: WOFF,\n woff2: WOFF,\n ttf: 'application/font-truetype',\n eot: 'application/vnd.ms-fontobject',\n png: 'image/png',\n jpg: JPEG,\n jpeg: JPEG,\n gif: 'image/gif',\n tiff: 'image/tiff',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n};\nfunction getExtension(url) {\n const match = /\\.([^./]*?)$/g.exec(url);\n return match ? match[1] : '';\n}\nexport function getMimeType(url) {\n const extension = getExtension(url).toLowerCase();\n return mimes[extension] || '';\n}\n//# sourceMappingURL=mimes.js.map","function getContentFromDataUrl(dataURL) {\n return dataURL.split(/,/)[1];\n}\nexport function isDataUrl(url) {\n return url.search(/^(data:)/) !== -1;\n}\nexport function makeDataUrl(content, mimeType) {\n return `data:${mimeType};base64,${content}`;\n}\nexport async function fetchAsDataURL(url, init, process) {\n const res = await fetch(url, init);\n if (res.status === 404) {\n throw new Error(`Resource \"${res.url}\" not found`);\n }\n const blob = await res.blob();\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = () => {\n try {\n resolve(process({ res, result: reader.result }));\n }\n catch (error) {\n reject(error);\n }\n };\n reader.readAsDataURL(blob);\n });\n}\nconst cache = {};\nfunction getCacheKey(url, contentType, includeQueryParams) {\n let key = url.replace(/\\?.*/, '');\n if (includeQueryParams) {\n key = url;\n }\n // font resource\n if (/ttf|otf|eot|woff2?/i.test(key)) {\n key = key.replace(/.*\\//, '');\n }\n return contentType ? `[${contentType}]${key}` : key;\n}\nexport async function resourceToDataURL(resourceUrl, contentType, options) {\n const cacheKey = getCacheKey(resourceUrl, contentType, options.includeQueryParams);\n if (cache[cacheKey] != null) {\n return cache[cacheKey];\n }\n // ref: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n if (options.cacheBust) {\n // eslint-disable-next-line no-param-reassign\n resourceUrl += (/\\?/.test(resourceUrl) ? '&' : '?') + new Date().getTime();\n }\n let dataURL;\n try {\n const content = await fetchAsDataURL(resourceUrl, options.fetchRequestInit, ({ res, result }) => {\n if (!contentType) {\n // eslint-disable-next-line no-param-reassign\n contentType = res.headers.get('Content-Type') || '';\n }\n return getContentFromDataUrl(result);\n });\n dataURL = makeDataUrl(content, contentType);\n }\n catch (error) {\n dataURL = options.imagePlaceholder || '';\n let msg = `Failed to fetch resource: ${resourceUrl}`;\n if (error) {\n msg = typeof error === 'string' ? error : error.message;\n }\n if (msg) {\n console.warn(msg);\n }\n }\n cache[cacheKey] = dataURL;\n return dataURL;\n}\n//# sourceMappingURL=dataurl.js.map","import { clonePseudoElements } from './clone-pseudos';\nimport { createImage, toArray, isInstanceOfElement, getStyleProperties, } from './util';\nimport { getMimeType } from './mimes';\nimport { resourceToDataURL } from './dataurl';\nasync function cloneCanvasElement(canvas) {\n const dataURL = canvas.toDataURL();\n if (dataURL === 'data:,') {\n return canvas.cloneNode(false);\n }\n return createImage(dataURL);\n}\nasync function cloneVideoElement(video, options) {\n if (video.currentSrc) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n canvas.width = video.clientWidth;\n canvas.height = video.clientHeight;\n ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n const dataURL = canvas.toDataURL();\n return createImage(dataURL);\n }\n const poster = video.poster;\n const contentType = getMimeType(poster);\n const dataURL = await resourceToDataURL(poster, contentType, options);\n return createImage(dataURL);\n}\nasync function cloneIFrameElement(iframe, options) {\n var _a;\n try {\n if ((_a = iframe === null || iframe === void 0 ? void 0 : iframe.contentDocument) === null || _a === void 0 ? void 0 : _a.body) {\n return (await cloneNode(iframe.contentDocument.body, options, true));\n }\n }\n catch (_b) {\n // Failed to clone iframe\n }\n return iframe.cloneNode(false);\n}\nasync function cloneSingleNode(node, options) {\n if (isInstanceOfElement(node, HTMLCanvasElement)) {\n return cloneCanvasElement(node);\n }\n if (isInstanceOfElement(node, HTMLVideoElement)) {\n return cloneVideoElement(node, options);\n }\n if (isInstanceOfElement(node, HTMLIFrameElement)) {\n return cloneIFrameElement(node, options);\n }\n return node.cloneNode(isSVGElement(node));\n}\nconst isSlotElement = (node) => node.tagName != null && node.tagName.toUpperCase() === 'SLOT';\nconst isSVGElement = (node) => node.tagName != null && node.tagName.toUpperCase() === 'SVG';\nasync function cloneChildren(nativeNode, clonedNode, options) {\n var _a, _b;\n if (isSVGElement(clonedNode)) {\n return clonedNode;\n }\n let children = [];\n if (isSlotElement(nativeNode) && nativeNode.assignedNodes) {\n children = toArray(nativeNode.assignedNodes());\n }\n else if (isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n ((_a = nativeNode.contentDocument) === null || _a === void 0 ? void 0 : _a.body)) {\n children = toArray(nativeNode.contentDocument.body.childNodes);\n }\n else {\n children = toArray(((_b = nativeNode.shadowRoot) !== null && _b !== void 0 ? _b : nativeNode).childNodes);\n }\n if (children.length === 0 ||\n isInstanceOfElement(nativeNode, HTMLVideoElement)) {\n return clonedNode;\n }\n await children.reduce((deferred, child) => deferred\n .then(() => cloneNode(child, options))\n .then((clonedChild) => {\n if (clonedChild) {\n clonedNode.appendChild(clonedChild);\n }\n }), Promise.resolve());\n return clonedNode;\n}\nfunction cloneCSSStyle(nativeNode, clonedNode, options) {\n const targetStyle = clonedNode.style;\n if (!targetStyle) {\n return;\n }\n const sourceStyle = window.getComputedStyle(nativeNode);\n if (sourceStyle.cssText) {\n targetStyle.cssText = sourceStyle.cssText;\n targetStyle.transformOrigin = sourceStyle.transformOrigin;\n }\n else {\n getStyleProperties(options).forEach((name) => {\n let value = sourceStyle.getPropertyValue(name);\n if (name === 'font-size' && value.endsWith('px')) {\n const reducedFont = Math.floor(parseFloat(value.substring(0, value.length - 2))) - 0.1;\n value = `${reducedFont}px`;\n }\n if (isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n name === 'display' &&\n value === 'inline') {\n value = 'block';\n }\n if (name === 'd' && clonedNode.getAttribute('d')) {\n value = `path(${clonedNode.getAttribute('d')})`;\n }\n targetStyle.setProperty(name, value, sourceStyle.getPropertyPriority(name));\n });\n }\n}\nfunction cloneInputValue(nativeNode, clonedNode) {\n if (isInstanceOfElement(nativeNode, HTMLTextAreaElement)) {\n clonedNode.innerHTML = nativeNode.value;\n }\n if (isInstanceOfElement(nativeNode, HTMLInputElement)) {\n clonedNode.setAttribute('value', nativeNode.value);\n }\n}\nfunction cloneSelectValue(nativeNode, clonedNode) {\n if (isInstanceOfElement(nativeNode, HTMLSelectElement)) {\n const clonedSelect = clonedNode;\n const selectedOption = Array.from(clonedSelect.children).find((child) => nativeNode.value === child.getAttribute('value'));\n if (selectedOption) {\n selectedOption.setAttribute('selected', '');\n }\n }\n}\nfunction decorate(nativeNode, clonedNode, options) {\n if (isInstanceOfElement(clonedNode, Element)) {\n cloneCSSStyle(nativeNode, clonedNode, options);\n clonePseudoElements(nativeNode, clonedNode, options);\n cloneInputValue(nativeNode, clonedNode);\n cloneSelectValue(nativeNode, clonedNode);\n }\n return clonedNode;\n}\nasync function ensureSVGSymbols(clone, options) {\n const uses = clone.querySelectorAll ? clone.querySelectorAll('use') : [];\n if (uses.length === 0) {\n return clone;\n }\n const processedDefs = {};\n for (let i = 0; i < uses.length; i++) {\n const use = uses[i];\n const id = use.getAttribute('xlink:href');\n if (id) {\n const exist = clone.querySelector(id);\n const definition = document.querySelector(id);\n if (!exist && definition && !processedDefs[id]) {\n // eslint-disable-next-line no-await-in-loop\n processedDefs[id] = (await cloneNode(definition, options, true));\n }\n }\n }\n const nodes = Object.values(processedDefs);\n if (nodes.length) {\n const ns = 'http://www.w3.org/1999/xhtml';\n const svg = document.createElementNS(ns, 'svg');\n svg.setAttribute('xmlns', ns);\n svg.style.position = 'absolute';\n svg.style.width = '0';\n svg.style.height = '0';\n svg.style.overflow = 'hidden';\n svg.style.display = 'none';\n const defs = document.createElementNS(ns, 'defs');\n svg.appendChild(defs);\n for (let i = 0; i < nodes.length; i++) {\n defs.appendChild(nodes[i]);\n }\n clone.appendChild(svg);\n }\n return clone;\n}\nexport async function cloneNode(node, options, isRoot) {\n if (!isRoot && options.filter && !options.filter(node)) {\n return null;\n }\n return Promise.resolve(node)\n .then((clonedNode) => cloneSingleNode(clonedNode, options))\n .then((clonedNode) => cloneChildren(node, clonedNode, options))\n .then((clonedNode) => decorate(node, clonedNode, options))\n .then((clonedNode) => ensureSVGSymbols(clonedNode, options));\n}\n//# sourceMappingURL=clone-node.js.map","import { resolveUrl } from './util';\nimport { getMimeType } from './mimes';\nimport { isDataUrl, makeDataUrl, resourceToDataURL } from './dataurl';\nconst URL_REGEX = /url\\((['\"]?)([^'\"]+?)\\1\\)/g;\nconst URL_WITH_FORMAT_REGEX = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g;\nconst FONT_SRC_REGEX = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;\nfunction toRegex(url) {\n // eslint-disable-next-line no-useless-escape\n const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, '\\\\$1');\n return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, 'g');\n}\nexport function parseURLs(cssText) {\n const urls = [];\n cssText.replace(URL_REGEX, (raw, quotation, url) => {\n urls.push(url);\n return raw;\n });\n return urls.filter((url) => !isDataUrl(url));\n}\nexport async function embed(cssText, resourceURL, baseURL, options, getContentFromUrl) {\n try {\n const resolvedURL = baseURL ? resolveUrl(resourceURL, baseURL) : resourceURL;\n const contentType = getMimeType(resourceURL);\n let dataURL;\n if (getContentFromUrl) {\n const content = await getContentFromUrl(resolvedURL);\n dataURL = makeDataUrl(content, contentType);\n }\n else {\n dataURL = await resourceToDataURL(resolvedURL, contentType, options);\n }\n return cssText.replace(toRegex(resourceURL), `$1${dataURL}$3`);\n }\n catch (error) {\n // pass\n }\n return cssText;\n}\nfunction filterPreferredFontFormat(str, { preferredFontFormat }) {\n return !preferredFontFormat\n ? str\n : str.replace(FONT_SRC_REGEX, (match) => {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const [src, , format] = URL_WITH_FORMAT_REGEX.exec(match) || [];\n if (!format) {\n return '';\n }\n if (format === preferredFontFormat) {\n return `src: ${src};`;\n }\n }\n });\n}\nexport function shouldEmbed(url) {\n return url.search(URL_REGEX) !== -1;\n}\nexport async function embedResources(cssText, baseUrl, options) {\n if (!shouldEmbed(cssText)) {\n return cssText;\n }\n const filteredCSSText = filterPreferredFontFormat(cssText, options);\n const urls = parseURLs(filteredCSSText);\n return urls.reduce((deferred, url) => deferred.then((css) => embed(css, url, baseUrl, options)), Promise.resolve(filteredCSSText));\n}\n//# sourceMappingURL=embed-resources.js.map","import { embedResources } from './embed-resources';\nimport { toArray, isInstanceOfElement } from './util';\nimport { isDataUrl, resourceToDataURL } from './dataurl';\nimport { getMimeType } from './mimes';\nasync function embedProp(propName, node, options) {\n var _a;\n const propValue = (_a = node.style) === null || _a === void 0 ? void 0 : _a.getPropertyValue(propName);\n if (propValue) {\n const cssString = await embedResources(propValue, null, options);\n node.style.setProperty(propName, cssString, node.style.getPropertyPriority(propName));\n return true;\n }\n return false;\n}\nasync function embedBackground(clonedNode, options) {\n ;\n (await embedProp('background', clonedNode, options)) ||\n (await embedProp('background-image', clonedNode, options));\n (await embedProp('mask', clonedNode, options)) ||\n (await embedProp('-webkit-mask', clonedNode, options)) ||\n (await embedProp('mask-image', clonedNode, options)) ||\n (await embedProp('-webkit-mask-image', clonedNode, options));\n}\nasync function embedImageNode(clonedNode, options) {\n const isImageElement = isInstanceOfElement(clonedNode, HTMLImageElement);\n if (!(isImageElement && !isDataUrl(clonedNode.src)) &&\n !(isInstanceOfElement(clonedNode, SVGImageElement) &&\n !isDataUrl(clonedNode.href.baseVal))) {\n return;\n }\n const url = isImageElement ? clonedNode.src : clonedNode.href.baseVal;\n const dataURL = await resourceToDataURL(url, getMimeType(url), options);\n await new Promise((resolve, reject) => {\n clonedNode.onload = resolve;\n clonedNode.onerror = options.onImageErrorHandler\n ? (...attributes) => {\n try {\n resolve(options.onImageErrorHandler(...attributes));\n }\n catch (error) {\n reject(error);\n }\n }\n : reject;\n const image = clonedNode;\n if (image.decode) {\n image.decode = resolve;\n }\n if (image.loading === 'lazy') {\n image.loading = 'eager';\n }\n if (isImageElement) {\n clonedNode.srcset = '';\n clonedNode.src = dataURL;\n }\n else {\n clonedNode.href.baseVal = dataURL;\n }\n });\n}\nasync function embedChildren(clonedNode, options) {\n const children = toArray(clonedNode.childNodes);\n const deferreds = children.map((child) => embedImages(child, options));\n await Promise.all(deferreds).then(() => clonedNode);\n}\nexport async function embedImages(clonedNode, options) {\n if (isInstanceOfElement(clonedNode, Element)) {\n await embedBackground(clonedNode, options);\n await embedImageNode(clonedNode, options);\n await embedChildren(clonedNode, options);\n }\n}\n//# sourceMappingURL=embed-images.js.map","export function applyStyle(node, options) {\n const { style } = node;\n if (options.backgroundColor) {\n style.backgroundColor = options.backgroundColor;\n }\n if (options.width) {\n style.width = `${options.width}px`;\n }\n if (options.height) {\n style.height = `${options.height}px`;\n }\n const manual = options.style;\n if (manual != null) {\n Object.keys(manual).forEach((key) => {\n style[key] = manual[key];\n });\n }\n return node;\n}\n//# sourceMappingURL=apply-style.js.map","import { toArray } from './util';\nimport { fetchAsDataURL } from './dataurl';\nimport { shouldEmbed, embedResources } from './embed-resources';\nconst cssFetchCache = {};\nasync function fetchCSS(url) {\n let cache = cssFetchCache[url];\n if (cache != null) {\n return cache;\n }\n const res = await fetch(url);\n const cssText = await res.text();\n cache = { url, cssText };\n cssFetchCache[url] = cache;\n return cache;\n}\nasync function embedFonts(data, options) {\n let cssText = data.cssText;\n const regexUrl = /url\\([\"']?([^\"')]+)[\"']?\\)/g;\n const fontLocs = cssText.match(/url\\([^)]+\\)/g) || [];\n const loadFonts = fontLocs.map(async (loc) => {\n let url = loc.replace(regexUrl, '$1');\n if (!url.startsWith('https://')) {\n url = new URL(url, data.url).href;\n }\n return fetchAsDataURL(url, options.fetchRequestInit, ({ result }) => {\n cssText = cssText.replace(loc, `url(${result})`);\n return [loc, result];\n });\n });\n return Promise.all(loadFonts).then(() => cssText);\n}\nfunction parseCSS(source) {\n if (source == null) {\n return [];\n }\n const result = [];\n const commentsRegex = /(\\/\\*[\\s\\S]*?\\*\\/)/gi;\n // strip out comments\n let cssText = source.replace(commentsRegex, '');\n // eslint-disable-next-line prefer-regex-literals\n const keyframesRegex = new RegExp('((@.*?keyframes [\\\\s\\\\S]*?){([\\\\s\\\\S]*?}\\\\s*?)})', 'gi');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const matches = keyframesRegex.exec(cssText);\n if (matches === null) {\n break;\n }\n result.push(matches[0]);\n }\n cssText = cssText.replace(keyframesRegex, '');\n const importRegex = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi;\n // to match css & media queries together\n const combinedCSSRegex = '((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]' +\n '*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})';\n // unified regex\n const unifiedRegex = new RegExp(combinedCSSRegex, 'gi');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let matches = importRegex.exec(cssText);\n if (matches === null) {\n matches = unifiedRegex.exec(cssText);\n if (matches === null) {\n break;\n }\n else {\n importRegex.lastIndex = unifiedRegex.lastIndex;\n }\n }\n else {\n unifiedRegex.lastIndex = importRegex.lastIndex;\n }\n result.push(matches[0]);\n }\n return result;\n}\nasync function getCSSRules(styleSheets, options) {\n const ret = [];\n const deferreds = [];\n // First loop inlines imports\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray(sheet.cssRules || []).forEach((item, index) => {\n if (item.type === CSSRule.IMPORT_RULE) {\n let importIndex = index + 1;\n const url = item.href;\n const deferred = fetchCSS(url)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) => parseCSS(cssText).forEach((rule) => {\n try {\n sheet.insertRule(rule, rule.startsWith('@import')\n ? (importIndex += 1)\n : sheet.cssRules.length);\n }\n catch (error) {\n console.error('Error inserting rule from remote css', {\n rule,\n error,\n });\n }\n }))\n .catch((e) => {\n console.error('Error loading remote css', e.toString());\n });\n deferreds.push(deferred);\n }\n });\n }\n catch (e) {\n const inline = styleSheets.find((a) => a.href == null) || document.styleSheets[0];\n if (sheet.href != null) {\n deferreds.push(fetchCSS(sheet.href)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) => parseCSS(cssText).forEach((rule) => {\n inline.insertRule(rule, inline.cssRules.length);\n }))\n .catch((err) => {\n console.error('Error loading remote stylesheet', err);\n }));\n }\n console.error('Error inlining remote css file', e);\n }\n }\n });\n return Promise.all(deferreds).then(() => {\n // Second loop parses rules\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray(sheet.cssRules || []).forEach((item) => {\n ret.push(item);\n });\n }\n catch (e) {\n console.error(`Error while reading CSS rules from ${sheet.href}`, e);\n }\n }\n });\n return ret;\n });\n}\nfunction getWebFontRules(cssRules) {\n return cssRules\n .filter((rule) => rule.type === CSSRule.FONT_FACE_RULE)\n .filter((rule) => shouldEmbed(rule.style.getPropertyValue('src')));\n}\nasync function parseWebFontRules(node, options) {\n if (node.ownerDocument == null) {\n throw new Error('Provided element is not within a Document');\n }\n const styleSheets = toArray(node.ownerDocument.styleSheets);\n const cssRules = await getCSSRules(styleSheets, options);\n return getWebFontRules(cssRules);\n}\nfunction normalizeFontFamily(font) {\n return font.trim().replace(/[\"']/g, '');\n}\nfunction getUsedFonts(node) {\n const fonts = new Set();\n function traverse(node) {\n const fontFamily = node.style.fontFamily || getComputedStyle(node).fontFamily;\n fontFamily.split(',').forEach((font) => {\n fonts.add(normalizeFontFamily(font));\n });\n Array.from(node.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n traverse(child);\n }\n });\n }\n traverse(node);\n return fonts;\n}\nexport async function getWebFontCSS(node, options) {\n const rules = await parseWebFontRules(node, options);\n const usedFonts = getUsedFonts(node);\n const cssTexts = await Promise.all(rules\n .filter((rule) => usedFonts.has(normalizeFontFamily(rule.style.fontFamily)))\n .map((rule) => {\n const baseUrl = rule.parentStyleSheet\n ? rule.parentStyleSheet.href\n : null;\n return embedResources(rule.cssText, baseUrl, options);\n }));\n return cssTexts.join('\\n');\n}\nexport async function embedWebFonts(clonedNode, options) {\n const cssText = options.fontEmbedCSS != null\n ? options.fontEmbedCSS\n : options.skipFonts\n ? null\n : await getWebFontCSS(clonedNode, options);\n if (cssText) {\n const styleNode = document.createElement('style');\n const sytleContent = document.createTextNode(cssText);\n styleNode.appendChild(sytleContent);\n if (clonedNode.firstChild) {\n clonedNode.insertBefore(styleNode, clonedNode.firstChild);\n }\n else {\n clonedNode.appendChild(styleNode);\n }\n }\n}\n//# sourceMappingURL=embed-webfonts.js.map","import { cloneNode } from './clone-node';\nimport { embedImages } from './embed-images';\nimport { applyStyle } from './apply-style';\nimport { embedWebFonts, getWebFontCSS } from './embed-webfonts';\nimport { getImageSize, getPixelRatio, createImage, canvasToBlob, nodeToDataURL, checkCanvasDimensions, } from './util';\nexport async function toSvg(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const clonedNode = (await cloneNode(node, options, true));\n await embedWebFonts(clonedNode, options);\n await embedImages(clonedNode, options);\n applyStyle(clonedNode, options);\n const datauri = await nodeToDataURL(clonedNode, width, height);\n return datauri;\n}\nexport async function toCanvas(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const svg = await toSvg(node, options);\n const img = await createImage(svg);\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n const ratio = options.pixelRatio || getPixelRatio();\n const canvasWidth = options.canvasWidth || width;\n const canvasHeight = options.canvasHeight || height;\n canvas.width = canvasWidth * ratio;\n canvas.height = canvasHeight * ratio;\n if (!options.skipAutoScale) {\n checkCanvasDimensions(canvas);\n }\n canvas.style.width = `${canvasWidth}`;\n canvas.style.height = `${canvasHeight}`;\n if (options.backgroundColor) {\n context.fillStyle = options.backgroundColor;\n context.fillRect(0, 0, canvas.width, canvas.height);\n }\n context.drawImage(img, 0, 0, canvas.width, canvas.height);\n return canvas;\n}\nexport async function toPixelData(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const canvas = await toCanvas(node, options);\n const ctx = canvas.getContext('2d');\n return ctx.getImageData(0, 0, width, height).data;\n}\nexport async function toPng(node, options = {}) {\n const canvas = await toCanvas(node, options);\n return canvas.toDataURL();\n}\nexport async function toJpeg(node, options = {}) {\n const canvas = await toCanvas(node, options);\n return canvas.toDataURL('image/jpeg', options.quality || 1);\n}\nexport async function toBlob(node, options = {}) {\n const canvas = await toCanvas(node, options);\n const blob = await canvasToBlob(canvas);\n return blob;\n}\nexport async function getFontEmbedCSS(node, options = {}) {\n return getWebFontCSS(node, options);\n}\n//# sourceMappingURL=index.js.map"],"names":["ICONS","createTriggerButton","label","btn","DEFAULT_SEVERITIES","DrawerView","severities","callbacks","pins","annotatedScreenshot","events","chip","count","summaryLabel","list","ev","escapeHtml","value","submitting","status","kind","canSubmit","sev","p","desc","submitBtn","input","_a","_b","num","item","s","showPinPopover","opts","resolve","popover","POPOVER_W","POPOVER_H","left","top","textarea","close","result","handleGlobalKey","e","action","note","NO_CAPTURE_CLASS","DEFAULT_ACCENT","DEFAULT_HINT","withAlpha","color","alphaHex","createPickModeOverlay","ACCENT","ACCENT_BORDER","ACCENT_GLOW","styleTag","frame","hint","SPINNER_HTML","c","tracked","makeMarker","m","makeOutline","o","placeAt","entry","rect","isStale","opacity","hide","reposition","liveTarget","r","fr","raf","schedule","anchor","marker","outline","message","startPicker","shadowRoot","onHover","accent","accentFill","tooltip","previousCursor","resolved","resolvePromise","promise","res","isWidgetElement","el","node","findTarget","x","y","candidates","positionOutline","tag","cls","above","handleMove","handlePointerDown","swallow","handleKey","finish","MAX_DEPTH","isUniqueId","id","root","tagWithClasses","classes","nthOfTypeIndex","parent","buildSelector","target","parts","depth","current","base","part","currentClasses","detectReact","keys","k","fiber","i","f","type","name","detectVue","anyEl","vueParent","detectAngular","ng","cmp","ctor","detectSvelte","detectFramework","OUTER_HTML_LIMIT","PARENT_OUTER_HTML_LIMIT","SELECTOR_LIMIT","ID_LIMIT","CLASSLIST_MAX_ENTRIES","CLASS_NAME_LIMIT","STYLE_VALUE_LIMIT","USEFUL_STYLE_PROPS","truncate","max","pickStyles","computed","out","prop","capClassList","capturePin","rawSelector","rawId","getUaData","nav","b","getTheme","captureMetadata","htmlToImage","load","index","TRANSPARENT_PIXEL","isUrlSafeForCanvas","rawUrl","crossOriginAttr","neutralizeCrossOriginImages","stashedImg","stashedSvg","img","svgImg","href","xlink","url","src","captureScreenshot","quality","pixelRatio","excludeShadowRoot","lib","filter","cur","restore","MARKER_RADIUS","MARKER_STROKE","MARKER_TEXT","OUTLINE_WIDTH","drawMarkers","screenshotDataUrl","viewportSize","pinElements","MARKER_FILL","OUTLINE_COLOR","loadImage","canvas","ctx","scaleX","scaleY","pin","getFreshRect","w","cx","cy","found","reject","err","MAX_EVENTS","MESSAGE_LIMIT","STACK_LIMIT","SOURCE_LIMIT","DEDUPE_WINDOW_MS","BEACON_STACK_PATTERN","buffer","recentSignatures","listeners","installed","trunc","limit","signature","stack","stackHead","fromBeacon","safeStringify","push","event","sig","last","fn","installEventCapture","errMessage","errStack","reason","getCapturedEvents","subscribeToEvents","submitFeedback","endpoint","payload","headers","body","ATTRS","GLOBAL_STYLE_ID","ensureGlobalStyles","stylesText","CUSTOMIZABLE_VARS","LaunchKitBeacon","style","stylesCss","assigned","v","oldValue","newValue","triggerEl","positionDrawerRelativeTo","overlay","next","popoverResult","raw","meta","annotated","msg","cfg","description","severity","needsCapture","beforeEvent","response","cs","val","path","h","attr","defineBeacon","tagName","DRAWER_WIDTH","VIEWPORT_MARGIN","ESTIMATED_DRAWER_HEIGHT","drawer","trigger","viewportW","viewportH","rightOffset","spaceBelow","spaceAbove","HTML_LIMIT","MAX_OVERLAYS","n","describeTarget","overlaysAtPoint","all","z","a","installClickCapture","cb","handle","me","hit","hitMatches","openDialogs","bodyPe","overlays","onClick","onMouseDown","installRouteCapture","originalPush","originalReplace","lastUrl","emit","via","to","from","args","ret","onPop","onHash","installDialogCapture","seen","selector","obs","mutations","dialogs","d","_c","_d","installDomCapture","undoClick","undoRoute","undoDialog","URL_LIMIT","wrapFetch","original","wrapped","init","start","method","durationMs","failed","wrapXhr","proto","originalOpen","originalSend","state","rest","onLoadEnd","installNetworkCapture","undoFetch","undoXhr","FLUSH_INTERVAL_MS","FLUSH_AT_COUNT","MAX_BUFFER","MonitorTransport","batch","blob","SESSION_URL_KEY","SESSION_ID_KEY","SESSION_VERBOSE_KEY","SESSION_DEADLINE_KEY","DEFAULT_MAX_SESSION_MS","PROBE_DATA_LIMIT","active","drainedThrough","randomSessionId","safeSerialize","walk","notify","stamp","partial","enqueue","persistSession","clearPersistedSession","readPersistedSession","sessionId","verbose","deadlineRaw","deadlineMs","config","stop","maxMs","transport","existing","emitErrorEvent","errorsUnsub","net","dom","deadlineTimer","probe","data","isActive","currentUrl","monitor","resumeIfPersisted","persisted","installPublicAPI","resolveUrl","baseUrl","doc","uuid","counter","random","toArray","arrayLike","arr","l","styleProps","getStyleProperties","options","px","styleProperty","getNodeWidth","leftBorder","rightBorder","getNodeHeight","topBorder","bottomBorder","getImageSize","targetNode","width","height","getPixelRatio","ratio","FINAL_PROCESS","canvasDimensionLimit","checkCanvasDimensions","canvasToBlob","binaryString","len","binaryArray","createImage","svgToDataURL","svg","html","nodeToDataURL","xmlns","foreignObject","isInstanceOfElement","instance","nodePrototype","formatCSSText","content","formatCSSProperties","priority","getPseudoElementStyle","className","pseudo","cssText","clonePseudoElement","nativeNode","clonedNode","styleElement","clonePseudoElements","WOFF","JPEG","mimes","getExtension","match","getMimeType","extension","getContentFromDataUrl","dataURL","isDataUrl","makeDataUrl","mimeType","fetchAsDataURL","process","reader","error","cache","getCacheKey","contentType","includeQueryParams","key","resourceToDataURL","resourceUrl","cacheKey","cloneCanvasElement","cloneVideoElement","video","poster","cloneIFrameElement","iframe","cloneNode","cloneSingleNode","isSVGElement","isSlotElement","cloneChildren","children","deferred","child","clonedChild","cloneCSSStyle","targetStyle","sourceStyle","cloneInputValue","cloneSelectValue","clonedSelect","selectedOption","decorate","ensureSVGSymbols","clone","uses","processedDefs","exist","definition","nodes","ns","defs","isRoot","URL_REGEX","URL_WITH_FORMAT_REGEX","FONT_SRC_REGEX","toRegex","escaped","parseURLs","urls","quotation","embed","resourceURL","baseURL","getContentFromUrl","resolvedURL","filterPreferredFontFormat","str","preferredFontFormat","format","shouldEmbed","embedResources","filteredCSSText","css","embedProp","propName","propValue","cssString","embedBackground","embedImageNode","isImageElement","attributes","image","embedChildren","deferreds","embedImages","applyStyle","manual","cssFetchCache","fetchCSS","embedFonts","regexUrl","loadFonts","loc","parseCSS","source","commentsRegex","keyframesRegex","matches","importRegex","combinedCSSRegex","unifiedRegex","getCSSRules","styleSheets","sheet","importIndex","metadata","rule","inline","getWebFontRules","cssRules","parseWebFontRules","normalizeFontFamily","font","getUsedFonts","fonts","traverse","getWebFontCSS","rules","usedFonts","embedWebFonts","styleNode","sytleContent","toSvg","toCanvas","context","canvasWidth","canvasHeight","toPixelData","toPng","toJpeg","toBlob","getFontEmbedCSS"],"mappings":"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","x_google_ignoreList":[20,21,22,23,24,25,26,27,28,29]}
1
+ {"version":3,"file":"beacon.umd.js","sources":["../../src/beacon/styles.ts","../../src/beacon/element.ts","../../src/beacon/ctx.ts","../../src/beacon/registry.ts","../../src/beacon/transport.ts","../../src/beacon/ui/form.ts","../../src/beacon/ui/dialog.ts","../../src/beacon/ui/overlay.ts","../../src/beacon/plugins/metadata.ts","../../src/beacon/internal/event-buffer.ts","../../src/beacon/plugins/errors.ts","../../src/beacon/internal/selector.ts","../../src/beacon/internal/framework-detect.ts","../../src/beacon/internal/element-capture.ts","../../src/beacon/internal/markers.ts","../../src/beacon/internal/pick-mode-overlay.ts","../../src/beacon/internal/pin-popover.ts","../../src/beacon/internal/picker.ts","../../src/beacon/internal/screenshot.ts","../../src/beacon/internal/annotation-cache.ts","../../src/beacon/plugins/domEle.ts","../../src/beacon/types.ts","../../src/beacon/plugins/domSS.ts","../../src/beacon/internal/monitor/overlay.ts","../../src/beacon/internal/monitor/capture-dom.ts","../../src/beacon/internal/monitor/capture-network.ts","../../src/beacon/internal/monitor/transport.ts","../../src/beacon/internal/monitor/session.ts","../../src/beacon/plugins/liveMonitor.ts","../../src/beacon/core.ts","../../src/beacon/index.ts","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/util.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/clone-pseudos.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/mimes.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/dataurl.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/clone-node.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/embed-resources.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/embed-images.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/apply-style.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/embed-webfonts.js","../../../../node_modules/.pnpm/html-to-image@1.11.13/node_modules/html-to-image/es/index.js"],"sourcesContent":["// Shadow-DOM-scoped styles for <launch-kit-beacon>.\n// Exported as a string so the same source compiles cleanly under Vite (UMD\n// bundle) and Next.js (transpilePackages, no ?inline support). The CSS-as-string\n// is shipped inside the bundle; no separate stylesheet fetch.\n\nexport const beaconStyles = String.raw`\n:host {\n --beacon-accent: #0ea5e9;\n --beacon-bg: #ffffff;\n --beacon-fg: #0f172a;\n --beacon-muted: #64748b;\n --beacon-border: #e2e8f0;\n --beacon-radius: 10px;\n --beacon-z-index: 2147483645;\n --beacon-shadow: 0 10px 30px hsl(0 0% 0% / 0.15), 0 2px 6px hsl(0 0% 0% / 0.08);\n --beacon-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --beacon-color-scheme: light dark;\n\n --beacon-bug: #ef4444;\n --beacon-idea: #22c55e;\n --beacon-ux: #a855f7;\n --beacon-a11y: #06b6d4;\n\n position: fixed;\n z-index: var(--beacon-z-index);\n font-family: var(--beacon-font-family);\n font-size: 14px;\n color: var(--beacon-fg);\n line-height: 1.5;\n color-scheme: var(--beacon-color-scheme);\n}\n\n:host([theme='dark']) {\n --beacon-bg: #0f172a;\n --beacon-fg: #f1f5f9;\n --beacon-muted: #94a3b8;\n --beacon-border: #334155;\n --beacon-color-scheme: dark;\n}\n\n@media (prefers-color-scheme: dark) {\n :host([theme='auto']) {\n --beacon-bg: #0f172a;\n --beacon-fg: #f1f5f9;\n --beacon-muted: #94a3b8;\n --beacon-border: #334155;\n }\n}\n\n:host([position='bottom-right']) { right: 20px; bottom: 20px; left: auto; top: auto; }\n:host([position='bottom-left']) { left: 20px; bottom: 20px; right: auto; top: auto; }\n\n:host([position='hidden']) {\n position: static;\n display: contents;\n}\n:host([position='hidden']) .beacon-default-trigger { display: none; }\n\n.beacon-default-trigger {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: var(--beacon-accent);\n color: white;\n border: 0;\n border-radius: 999px;\n padding: 10px 16px;\n font: inherit;\n font-weight: 500;\n cursor: pointer;\n box-shadow: var(--beacon-shadow);\n transition: transform 0.15s ease, box-shadow 0.15s ease;\n}\n.beacon-default-trigger:hover { transform: translateY(-1px); }\n.beacon-default-trigger svg { width: 18px; height: 18px; }\n\n.beacon-health-dot {\n display: none;\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--beacon-bug);\n margin-left: 2px;\n}\n.beacon-health-dot.visible { display: inline-block; }\n\ndialog.beacon-dialog {\n width: 380px;\n max-width: calc(100vw - 24px);\n max-height: calc(100vh - 24px);\n padding: 0;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: var(--beacon-radius);\n box-shadow: var(--beacon-shadow);\n font-family: var(--beacon-font-family);\n font-size: 14px;\n line-height: 1.5;\n}\ndialog.beacon-dialog::backdrop {\n background: hsl(0 0% 0% / 0.8);\n}\n\n.beacon-dialog-inner {\n display: flex;\n flex-direction: column;\n max-height: calc(100vh - 24px);\n}\n\n.beacon-drawer-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--beacon-border);\n}\n.beacon-drawer-title { font-weight: 600; }\n.beacon-icon-btn {\n background: transparent;\n border: 0;\n color: var(--beacon-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: inline-flex;\n}\n.beacon-icon-btn:hover { background: var(--beacon-border); color: var(--beacon-fg); }\n.beacon-icon-btn svg { width: 16px; height: 16px; }\n\n.beacon-drawer-body {\n padding: 16px;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n/* Plugin panels share the same vertical rhythm as the drawer body so sibling\n panels (annotate, monitor, etc.) don't visually collide. Without this, every\n plugin panel renders flush against the previous one. */\n.beacon-plugin-panels {\n display: flex;\n flex-direction: column;\n gap: 14px;\n}\n\n.beacon-field { display: flex; flex-direction: column; gap: 6px; }\n.beacon-label { font-size: 12px; color: var(--beacon-muted); font-weight: 500; }\n.beacon-description { font-size: 12px; color: var(--beacon-muted); }\n\n.beacon-input,\n.beacon-textarea,\n.beacon-select {\n width: 100%;\n padding: 8px 10px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n font: inherit;\n box-sizing: border-box;\n}\n.beacon-textarea { min-height: 80px; resize: vertical; }\n.beacon-input:focus,\n.beacon-textarea:focus,\n.beacon-select:focus { outline: 2px solid var(--beacon-accent); outline-offset: -1px; border-color: var(--beacon-accent); }\n\n.beacon-toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n user-select: none;\n}\n.beacon-toggle input { margin: 0; }\n\n.beacon-radio-group { display: flex; flex-direction: column; gap: 4px; }\n.beacon-radio-opt { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; }\n\n.beacon-severity {\n display: grid;\n grid-template-columns: repeat(4, 1fr);\n gap: 6px;\n}\n.beacon-severity-opt {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 6px 4px;\n background: transparent;\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n color: var(--beacon-fg);\n text-transform: capitalize;\n}\n.beacon-severity-opt input { position: absolute; opacity: 0; pointer-events: none; }\n.beacon-severity-opt:hover { background: var(--beacon-border); }\n.beacon-severity-opt.selected[data-sev='bug'] { border-color: var(--beacon-bug); color: var(--beacon-bug); }\n.beacon-severity-opt.selected[data-sev='idea'] { border-color: var(--beacon-idea); color: var(--beacon-idea); }\n.beacon-severity-opt.selected[data-sev='ux'] { border-color: var(--beacon-ux); color: var(--beacon-ux); }\n.beacon-severity-opt.selected[data-sev='a11y'] { border-color: var(--beacon-a11y); color: var(--beacon-a11y); }\n\n.beacon-actions {\n display: flex;\n gap: 8px;\n align-items: center;\n}\n.beacon-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 8px 14px;\n border-radius: 6px;\n border: 0;\n cursor: pointer;\n font: inherit;\n font-weight: 500;\n font-size: 13px;\n transition: opacity 0.15s ease;\n}\n.beacon-btn[disabled] { opacity: 0.5; cursor: not-allowed; }\n.beacon-btn svg { width: 14px; height: 14px; }\n.beacon-btn.primary { background: var(--beacon-accent); color: white; }\n.beacon-btn.secondary {\n background: transparent;\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n}\n.beacon-btn.secondary:hover { background: var(--beacon-border); }\n\n.beacon-status {\n font-size: 12px;\n color: var(--beacon-muted);\n text-align: center;\n padding: 4px;\n}\n.beacon-status.error { color: var(--beacon-bug); }\n.beacon-status.success { color: var(--beacon-idea); }\n\n.beacon-plugin-panel {\n display: flex;\n flex-direction: column;\n gap: 10px;\n padding: 12px;\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n}\n.beacon-plugin-panel-title {\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--beacon-muted);\n font-weight: 600;\n}\n\n/* ── Pin list (domEle plugin) ─────────────────────────────── */\n.beacon-pin-list-header {\n font-size: 12px;\n color: var(--beacon-muted);\n font-weight: 500;\n}\n.beacon-pin-list {\n display: flex;\n flex-direction: column;\n gap: 6px;\n max-height: 200px;\n overflow-y: auto;\n}\n.beacon-pin-item {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n padding: 8px;\n background: var(--beacon-border);\n border-radius: 6px;\n}\n.beacon-pin-num {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--beacon-accent);\n color: white;\n font-size: 11px;\n font-weight: 600;\n flex-shrink: 0;\n}\n.beacon-pin-meta { flex: 1; min-width: 0; }\n.beacon-pin-selector {\n font: 11px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace;\n color: var(--beacon-muted);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.beacon-pin-note-input {\n margin-top: 4px;\n width: 100%;\n padding: 4px 6px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 4px;\n font: inherit;\n font-size: 12px;\n box-sizing: border-box;\n}\n.beacon-pin-annotate { align-self: flex-start; }\n.beacon-thumb {\n width: 100%;\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n display: block;\n}\n\n/* ── Captured runtime events chip (errors plugin form panel) ─── */\n.beacon-events {\n font-size: 12px;\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n padding: 6px 8px;\n}\n.beacon-events-summary {\n cursor: pointer;\n list-style: none;\n display: flex;\n align-items: center;\n gap: 6px;\n color: var(--beacon-muted);\n user-select: none;\n}\n.beacon-events-summary::-webkit-details-marker { display: none; }\n.beacon-events-dot {\n color: var(--beacon-bug);\n font-size: 10px;\n line-height: 1;\n}\n.beacon-events-list {\n list-style: none;\n margin: 8px 0 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n max-height: 160px;\n overflow-y: auto;\n}\n.beacon-events-item {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n line-height: 1.4;\n}\n.beacon-events-kind {\n flex-shrink: 0;\n padding: 1px 5px;\n border-radius: 3px;\n font-size: 10px;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n.beacon-events-kind.error { background: hsl(0 84% 50% / 0.15); color: var(--beacon-bug); }\n.beacon-events-kind.rejection { background: hsl(38 92% 50% / 0.15); color: hsl(38 92% 50%); }\n.beacon-events-msg {\n word-break: break-word;\n color: var(--beacon-fg);\n}\n\n/* ── liveMonitor plugin panel ─────────────────────────────── */\n.beacon-monitor {\n padding: 0 0 4px;\n font-size: 12px;\n color: var(--beacon-fg);\n display: flex;\n flex-direction: column;\n gap: 6px;\n}\n.beacon-monitor-title {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--beacon-muted);\n font-size: 11px;\n}\n.beacon-monitor-rec {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: var(--beacon-bug);\n animation: beacon-rec-pulse 1.4s ease-in-out infinite;\n}\n@keyframes beacon-rec-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n.beacon-monitor-row {\n display: flex;\n gap: 6px;\n align-items: center;\n}\n.beacon-monitor-input {\n flex: 1;\n font: inherit;\n padding: 6px 8px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n min-width: 0;\n box-sizing: border-box;\n}\n.beacon-monitor-input::placeholder { color: var(--beacon-muted); opacity: 0.7; }\n.beacon-monitor-input:focus {\n outline: 2px solid var(--beacon-accent);\n outline-offset: -1px;\n border-color: var(--beacon-accent);\n}\n.beacon-monitor-btn {\n font: inherit;\n padding: 6px 10px;\n border-radius: 6px;\n border: 1px solid var(--beacon-accent);\n background: var(--beacon-accent);\n color: white;\n cursor: pointer;\n font-weight: 500;\n}\n.beacon-monitor-btn:disabled { opacity: 0.4; cursor: not-allowed; }\n.beacon-monitor-btn.stop {\n background: transparent;\n color: var(--beacon-accent);\n}\n.beacon-monitor-help {\n color: var(--beacon-muted);\n font-size: 11px;\n}\n.beacon-monitor-active-url {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 11px;\n color: var(--beacon-muted);\n word-break: break-all;\n background: hsl(0 0% 0% / 0.18);\n border-radius: 4px;\n padding: 4px 6px;\n}\n.beacon-monitor-verbose {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n color: var(--beacon-muted);\n font-size: 11px;\n cursor: pointer;\n user-select: none;\n}\n\n.beacon-overlay-layer {\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: calc(var(--beacon-z-index) + 1);\n}\n.beacon-overlay-layer > * { pointer-events: auto; }\n\n/* ── Body-mounted UI ──────────────────────────────────────\n Pin-popover and other overlays mount on document.body to escape transformed\n ancestors. Shadow DOM :host vars don't reach them, so we re-declare the\n variables here on each body-mounted root. */\n\n.beacon-pin-popover {\n --beacon-accent: #0ea5e9;\n --beacon-bg: #ffffff;\n --beacon-fg: #0f172a;\n --beacon-muted: #64748b;\n --beacon-border: #e2e8f0;\n --beacon-radius: 10px;\n --beacon-shadow: 0 10px 30px hsl(0 0% 0% / 0.15), 0 2px 6px hsl(0 0% 0% / 0.08);\n --beacon-bug: #ef4444;\n --beacon-idea: #22c55e;\n --beacon-ux: #a855f7;\n --beacon-a11y: #06b6d4;\n\n position: fixed;\n z-index: 2147483647;\n width: 240px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n box-shadow: var(--beacon-shadow);\n padding: 10px;\n display: none;\n flex-direction: column;\n gap: 8px;\n font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n font-size: 14px;\n line-height: 1.5;\n}\n.beacon-pin-popover.open { display: flex; }\n.beacon-pin-popover.beacon-theme-dark {\n --beacon-bg: #0f172a;\n --beacon-fg: #f1f5f9;\n --beacon-muted: #94a3b8;\n --beacon-border: #334155;\n}\n@media (prefers-color-scheme: dark) {\n .beacon-pin-popover.beacon-theme-auto {\n --beacon-bg: #0f172a;\n --beacon-fg: #f1f5f9;\n --beacon-muted: #94a3b8;\n --beacon-border: #334155;\n }\n}\n\n.beacon-pin-popover .beacon-pin-popover-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 6px;\n}\n.beacon-pin-popover .beacon-pin-popover-actions {\n display: flex;\n gap: 6px;\n justify-content: flex-end;\n}\n.beacon-pin-popover .beacon-pin-num {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: var(--beacon-accent);\n color: white;\n font-size: 11px;\n font-weight: 600;\n flex-shrink: 0;\n}\n.beacon-pin-popover .beacon-icon-btn {\n background: transparent;\n border: 0;\n color: var(--beacon-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n display: inline-flex;\n}\n.beacon-pin-popover .beacon-icon-btn:hover { background: var(--beacon-border); color: var(--beacon-fg); }\n.beacon-pin-popover .beacon-icon-btn svg { width: 16px; height: 16px; }\n.beacon-pin-popover .beacon-textarea {\n width: 100%;\n min-height: 48px;\n padding: 6px 8px;\n background: var(--beacon-bg);\n color: var(--beacon-fg);\n border: 1px solid var(--beacon-border);\n border-radius: 6px;\n font: inherit;\n resize: vertical;\n box-sizing: border-box;\n}\n.beacon-pin-popover .beacon-textarea:focus {\n outline: 2px solid var(--beacon-accent);\n outline-offset: -1px;\n border-color: var(--beacon-accent);\n}\n.beacon-pin-popover .beacon-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 12px;\n border-radius: 6px;\n border: 0;\n cursor: pointer;\n font: inherit;\n font-weight: 500;\n font-size: 13px;\n}\n.beacon-pin-popover .beacon-btn.primary { background: var(--beacon-accent); color: white; }\n.beacon-pin-popover .beacon-btn svg { width: 14px; height: 14px; }\n\n/* ── liveMonitor body-portal overlay ───────────────────────\n Dashed viewport frame + draggable status chip. Body-mounted (same reason as\n pick-mode-overlay), so the CSS var --beacon-monitor-accent is set inline on\n the frame and chip elements by the plugin — the shadow root's :host vars\n don't reach here. */\n\n@keyframes beacon-monitor-frame-pulse {\n 0%, 100% { opacity: 0.55; }\n 50% { opacity: 1; }\n}\n\n.beacon-monitor-overlay-frame {\n --beacon-monitor-accent: #10b981;\n position: fixed;\n inset: 0;\n pointer-events: none;\n z-index: 2147483646;\n border: 2px dashed var(--beacon-monitor-accent);\n border-radius: 4px;\n box-shadow: inset 0 0 56px color-mix(in srgb, var(--beacon-monitor-accent) 18%, transparent);\n box-sizing: border-box;\n animation: beacon-monitor-frame-pulse 2.4s ease-in-out infinite;\n}\n\n.beacon-monitor-overlay-chip {\n --beacon-monitor-accent: #10b981;\n position: fixed;\n z-index: 2147483647;\n pointer-events: auto;\n cursor: grab;\n user-select: none;\n background: #0f172a;\n color: #f1f5f9;\n border: 1px solid color-mix(in srgb, var(--beacon-monitor-accent) 50%, transparent);\n border-radius: 999px;\n padding: 6px 6px 6px 12px;\n box-shadow: 0 6px 20px hsl(0 0% 0% / 0.3);\n font: 500 12px/1.2 system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n letter-spacing: 0.01em;\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 140px;\n max-width: min(360px, calc(100vw - 32px));\n touch-action: none;\n}\n.beacon-monitor-overlay-chip[data-dragging] { cursor: grabbing; }\n\n.beacon-monitor-overlay-chip-row {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n\n.beacon-monitor-overlay-rec-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #ef4444;\n flex-shrink: 0;\n animation: beacon-rec-pulse 1.4s ease-in-out infinite;\n}\n\n.beacon-monitor-overlay-rec-label {\n font-weight: 700;\n letter-spacing: 0.06em;\n color: #ef4444;\n font-size: 11px;\n}\n\n.beacon-monitor-overlay-sep {\n color: #64748b;\n}\n\n.beacon-monitor-overlay-timer {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-variant-numeric: tabular-nums;\n font-size: 12px;\n flex: 1;\n min-width: 48px;\n}\n\n.beacon-monitor-overlay-stop {\n font: inherit;\n font-weight: 500;\n font-size: 11px;\n padding: 3px 10px;\n border-radius: 999px;\n background: var(--beacon-monitor-accent);\n color: #ffffff;\n border: 0;\n cursor: pointer;\n flex-shrink: 0;\n}\n.beacon-monitor-overlay-stop:hover {\n background: color-mix(in srgb, var(--beacon-monitor-accent) 85%, white);\n}\n\n.beacon-monitor-overlay-url {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 10px;\n color: #94a3b8;\n padding: 0 6px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n}\n`;\n\nconst GLOBAL_STYLE_ID = 'launch-kit-beacon-portal-styles';\n\n/**\n * Ensure the body-mounted parts of the beacon UI (pin popover, pick-mode\n * overlay) have their stylesheet available in document.head. Idempotent across\n * re-init and HMR. Safe to call before document.head exists (early-returns).\n */\nexport function ensureBeaconBodyStyles(): void {\n if (typeof document === 'undefined' || !document.head) return;\n if (document.getElementById(GLOBAL_STYLE_ID)) return;\n const tag = document.createElement('style');\n tag.id = GLOBAL_STYLE_ID;\n tag.textContent = beaconStyles;\n document.head.appendChild(tag);\n}\n","// <launch-kit-beacon> custom element. Hosts the Shadow DOM tree:\n// - default trigger (slot replaceable)\n// - dialog (top-layer drawer)\n// - overlay layer (Shadow-DOM-internal overlay slot)\n//\n// Auto-injection: if init() runs without a tag in the DOM, the core appends a\n// hidden host. Module load only calls customElements.define — no other side effects.\n\nimport { beaconStyles } from './styles';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nfunction iconMegaphone(): SVGElement {\n const s = document.createElementNS(SVG_NS, 'svg');\n s.setAttribute('viewBox', '0 0 24 24');\n s.setAttribute('fill', 'none');\n s.setAttribute('stroke', 'currentColor');\n s.setAttribute('stroke-width', '2');\n s.setAttribute('stroke-linecap', 'round');\n s.setAttribute('stroke-linejoin', 'round');\n const p1 = document.createElementNS(SVG_NS, 'path');\n p1.setAttribute('d', 'M3 11l18-5v12L3 14v-3z');\n const p2 = document.createElementNS(SVG_NS, 'path');\n p2.setAttribute('d', 'M11.6 16.8a3 3 0 1 1-5.8-1.6');\n s.appendChild(p1); s.appendChild(p2);\n return s;\n}\n\nexport const BEACON_TAG = 'launch-kit-beacon';\n\n// SSR guard: Next renders the AppHeader client component on the server during\n// the initial HTML pass, which evaluates this module's import graph in Node.\n// `HTMLElement` doesn't exist there, so a top-level `extends HTMLElement` throws\n// before defineBeaconElement() ever has a chance to early-return. Stand in with\n// a no-op base class on the server — the class is never instantiated there\n// (customElements.define is guarded), so the methods below are dead code.\nconst HTMLElementBase: typeof HTMLElement =\n typeof HTMLElement !== 'undefined'\n ? HTMLElement\n : (class {} as unknown as typeof HTMLElement);\n\nexport class LaunchKitBeacon extends HTMLElementBase {\n shadow!: ShadowRoot;\n triggerSlot!: HTMLSlotElement;\n defaultTrigger!: HTMLButtonElement;\n healthDot!: HTMLSpanElement;\n\n // Called by core.ts when a beacon is wired up; lets the element invoke show()\n // on click without having to import the core (avoids circular dep + lets the\n // singleton drive). Null until init() runs.\n onTriggerClick: (() => void) | null = null;\n\n connectedCallback() {\n if (this.shadow) return;\n this.shadow = this.attachShadow({ mode: 'open' });\n const style = document.createElement('style');\n style.textContent = beaconStyles;\n this.shadow.appendChild(style);\n\n this.triggerSlot = document.createElement('slot');\n this.triggerSlot.name = 'trigger';\n this.shadow.appendChild(this.triggerSlot);\n\n this.defaultTrigger = document.createElement('button');\n this.defaultTrigger.type = 'button';\n this.defaultTrigger.className = 'beacon-default-trigger';\n this.defaultTrigger.appendChild(iconMegaphone());\n const text = document.createElement('span');\n text.textContent = 'Feedback';\n this.defaultTrigger.appendChild(text);\n\n this.healthDot = document.createElement('span');\n this.healthDot.className = 'beacon-health-dot';\n this.defaultTrigger.appendChild(this.healthDot);\n\n this.shadow.appendChild(this.defaultTrigger);\n this.defaultTrigger.addEventListener('click', () => this.onTriggerClick?.());\n\n this.triggerSlot.addEventListener('slotchange', () => {\n const assigned = this.triggerSlot.assignedElements();\n if (assigned.length > 0) {\n this.defaultTrigger.style.display = 'none';\n for (const el of assigned) {\n el.addEventListener('click', () => this.onTriggerClick?.());\n }\n } else {\n this.defaultTrigger.style.display = '';\n }\n });\n\n if (!this.hasAttribute('position')) this.setAttribute('position', 'bottom-right');\n if (!this.hasAttribute('theme')) this.setAttribute('theme', 'auto');\n }\n\n setTriggerLabel(label: string) {\n if (!this.defaultTrigger) return;\n const span = this.defaultTrigger.querySelector('span');\n if (span) span.textContent = label;\n }\n\n setHealthIndicator(visible: boolean) {\n this.healthDot?.classList.toggle('visible', visible);\n }\n}\n\n/**\n * Register the custom element. Guarded so HMR re-imports don't throw.\n * The only module-load side effect — no listeners, no globals.\n */\nexport function defineBeaconElement(): void {\n if (typeof window === 'undefined' || typeof customElements === 'undefined') return;\n if (!customElements.get(BEACON_TAG)) {\n customElements.define(BEACON_TAG, LaunchKitBeacon);\n }\n}\n","// BeaconCtx factory — one ctx per (plugin, init-cycle).\n//\n// captureSignal() reads the core's _currentSubmit slot at call time, so plugins\n// that capture the signal in a setupOnce closure correctly get `undefined`\n// outside an active submit. ctx.signal is per-init and aborts on re-init/destroy.\n\nimport type {\n BeaconCtx,\n BeaconLifecycleEvent,\n Mode,\n PluginEntry,\n} from './types';\n\nexport interface CtxHost {\n // Captured plugin entries from earlier in the current submit. Empty between submits.\n getCaptured(name: string): PluginEntry | undefined;\n // Mutable form-values bucket scoped to this (plugin, init-cycle).\n getFormValues(pluginName: string): Record<string, unknown>;\n // Current-submit AbortSignal — undefined outside submit.\n getCaptureSignal(): AbortSignal | undefined;\n // Per-init signal — aborts on init() re-call, destroy(), or page navigation.\n getInitSignal(): AbortSignal;\n // Mode mediation (the drawer toggles chrome / closes-reopens dialog).\n requestMode(mode: Mode): Promise<() => void>;\n // Non-modal overlay inside shadow DOM, outside the <dialog>.\n overlay(opts: { render: (slot: HTMLElement) => void | (() => void) }): () => void;\n // Subscribe to per-submit lifecycle events.\n onLifecycle(\n ev: 'open' | 'close' | 'beforeSubmit' | 'afterSubmit',\n handler: (e: BeaconLifecycleEvent) => void,\n ): () => void;\n}\n\nexport function createCtx(pluginName: string, host: CtxHost): BeaconCtx {\n return {\n pluginName,\n captured: (name) => host.getCaptured(name),\n get formValues() { return host.getFormValues(pluginName); },\n requestMode: (mode) => host.requestMode(mode),\n overlay: (opts) => host.overlay(opts),\n on: (ev, handler) => host.onLifecycle(ev, handler),\n get signal() { return host.getInitSignal(); },\n captureSignal: () => host.getCaptureSignal(),\n };\n}\n","// Plugin registry: name uniqueness, capture pipeline with auto-wrap per §6.\n\nimport type {\n BeaconCtx,\n BeaconPlugin,\n PluginEntry,\n PluginStatus,\n} from './types';\n\nexport class DuplicatePluginNameError extends Error {\n constructor(name: string) {\n super(`Duplicate plugin name: \"${name}\"`);\n this.name = 'DuplicatePluginNameError';\n }\n}\n\nexport interface RegisteredPlugin {\n plugin: BeaconPlugin;\n ctx: BeaconCtx;\n status: PluginStatus;\n teardown?: () => void;\n}\n\nexport interface PluginErrorReport {\n plugin: string;\n error: Error;\n at: 'setupOnce' | 'capture' | 'form';\n}\n\nexport interface Registry {\n readonly entries: RegisteredPlugin[];\n install(makeCtx: (name: string) => BeaconCtx, onError: (e: PluginErrorReport) => void): void;\n destroy(): void;\n capture(getCaptured: (name: string) => PluginEntry | undefined, onError: (e: PluginErrorReport) => void): Promise<Record<string, PluginEntry>>;\n status(): Record<string, PluginStatus>;\n}\n\nexport function createRegistry(plugins: BeaconPlugin[]): Registry {\n const seen = new Set<string>();\n for (const p of plugins) {\n if (seen.has(p.name)) throw new DuplicatePluginNameError(p.name);\n seen.add(p.name);\n }\n\n const entries: RegisteredPlugin[] = plugins.map((plugin) => ({\n plugin,\n // Placeholder; install() rebinds with the real ctx factory.\n ctx: null as unknown as BeaconCtx,\n status: { state: 'active', failures: 0 },\n }));\n\n return {\n entries,\n\n install(makeCtx, onError) {\n for (const e of entries) {\n e.ctx = makeCtx(e.plugin.name);\n if (!e.plugin.setupOnce) continue;\n try {\n const teardown = e.plugin.setupOnce(e.ctx);\n if (typeof teardown === 'function') e.teardown = teardown;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n e.status = {\n state: 'failed',\n failures: e.status.failures + 1,\n error: { message: error.message, ...(error.stack ? { stack: error.stack } : {}), at: 'setupOnce' },\n };\n onError({ plugin: e.plugin.name, error, at: 'setupOnce' });\n }\n }\n },\n\n destroy() {\n for (const e of entries) {\n try { e.teardown?.(); } catch { /* swallow */ }\n e.teardown = undefined;\n }\n },\n\n async capture(_getCaptured, onError) {\n const out: Record<string, PluginEntry> = {};\n for (const e of entries) {\n if (!e.plugin.capture) continue;\n try {\n const result = await e.plugin.capture(e.ctx);\n const entry = wrapResult(result, e.plugin.version);\n if (entry !== null) {\n out[e.plugin.name] = entry;\n }\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n out[e.plugin.name] = wrapFailure(error);\n e.status = {\n state: 'failed',\n failures: e.status.failures + 1,\n error: { message: error.message, ...(error.stack ? { stack: error.stack } : {}), at: 'capture' },\n };\n onError({ plugin: e.plugin.name, error, at: 'capture' });\n }\n }\n return out;\n },\n\n status() {\n const out: Record<string, PluginStatus> = {};\n for (const e of entries) {\n out[e.plugin.name] = e.status;\n }\n return out;\n },\n };\n}\n\n/**\n * Auto-wrap rule (§6):\n * plain object → { v, ...result }\n * primitive / array → { v, value: result }\n * null / undefined → null (caller omits the entry)\n * thrown / rejected → handled by caller via wrapFailure\n */\nexport function wrapResult(result: unknown, version?: number): PluginEntry | null {\n if (result === null || result === undefined) return null;\n const v = version ?? 1;\n if (Array.isArray(result) || typeof result !== 'object') {\n return { v, value: result };\n }\n // Plain object — spread into the entry, force v even if the plugin tried to set it.\n return { ...(result as Record<string, unknown>), v };\n}\n\nexport function wrapFailure(error: Error): PluginEntry {\n return {\n error: error.message,\n ...(error.stack ? { stack: error.stack } : {}),\n };\n}\n","// POST per §9. Per-submit AbortSignal lets the drawer cancel an in-flight send.\n\nimport type { FeedbackPayload, HeadersConfig, TransportResponse } from './types';\n\nexport async function postFeedback(\n endpoint: string,\n payload: FeedbackPayload,\n headers: HeadersConfig | undefined,\n signal: AbortSignal,\n credentials: RequestCredentials = 'omit',\n): Promise<TransportResponse> {\n const resolvedHeaders: Record<string, string> = await resolveHeaders(headers);\n const response = await fetch(endpoint, {\n method: 'POST',\n credentials,\n headers: { 'Content-Type': 'application/json', ...resolvedHeaders },\n body: JSON.stringify(payload),\n signal,\n });\n\n const contentType = response.headers.get('content-type') ?? '';\n const body: unknown = contentType.includes('application/json')\n ? await response.json().catch(() => null)\n : await response.text();\n\n return { ok: response.ok, status: response.status, body };\n}\n\nasync function resolveHeaders(headers: HeadersConfig | undefined): Promise<Record<string, string>> {\n if (!headers) return {};\n if (typeof headers === 'function') {\n const result = await headers();\n return result ?? {};\n }\n return headers;\n}\n","// Declarative form renderer. Renders 6 field types (§4.2) into a slot,\n// reading/writing the per-plugin `formValues` namespace via the provided getter/setter.\n//\n// Imperative escape lives in the caller (dialog.ts) — if a plugin returns\n// `{ render }` instead of `{ fields }`, that branch invokes render(slot, ctx) directly.\n\nimport type { FormField } from '../types';\n\nexport interface FieldHost {\n get(name: string): unknown;\n set(name: string, value: unknown): void;\n}\n\nexport function renderFields(slot: HTMLElement, fields: FormField[], host: FieldHost): void {\n for (const field of fields) {\n const wrap = document.createElement('div');\n wrap.className = 'beacon-field';\n\n if (field.label) {\n const label = document.createElement('label');\n label.className = 'beacon-label';\n label.textContent = field.label;\n wrap.appendChild(label);\n }\n if (field.description) {\n const desc = document.createElement('div');\n desc.className = 'beacon-description';\n desc.textContent = field.description;\n wrap.appendChild(desc);\n }\n\n const control = renderControl(field, host);\n wrap.appendChild(control);\n slot.appendChild(wrap);\n }\n}\n\nfunction renderControl(field: FormField, host: FieldHost): HTMLElement {\n const current = host.get(field.name);\n\n switch (field.type) {\n case 'toggle': {\n const root = document.createElement('label');\n root.className = 'beacon-toggle';\n const input = document.createElement('input');\n input.type = 'checkbox';\n input.checked = (current as boolean | undefined) ?? field.defaultValue ?? false;\n input.addEventListener('change', () => host.set(field.name, input.checked));\n root.appendChild(input);\n host.set(field.name, input.checked);\n return root;\n }\n\n case 'text': {\n const input = document.createElement('input');\n input.type = 'text';\n input.className = 'beacon-input';\n const initial = ((current as string | undefined) ?? field.defaultValue ?? '');\n input.value = initial;\n if (field.placeholder) input.placeholder = field.placeholder;\n input.addEventListener('input', () => host.set(field.name, input.value));\n host.set(field.name, initial);\n return input;\n }\n\n case 'textarea': {\n const ta = document.createElement('textarea');\n ta.className = 'beacon-textarea';\n const initial = ((current as string | undefined) ?? field.defaultValue ?? '');\n ta.value = initial;\n if (field.placeholder) ta.placeholder = field.placeholder;\n if (field.rows) ta.rows = field.rows;\n ta.addEventListener('input', () => host.set(field.name, ta.value));\n host.set(field.name, initial);\n return ta;\n }\n\n case 'select': {\n const sel = document.createElement('select');\n sel.className = 'beacon-select';\n const initial = ((current as string | undefined) ?? field.defaultValue ?? field.options[0]?.value ?? '');\n for (const opt of field.options) {\n const o = document.createElement('option');\n o.value = opt.value;\n o.textContent = opt.label ?? opt.value;\n if (opt.value === initial) o.selected = true;\n sel.appendChild(o);\n }\n sel.addEventListener('change', () => host.set(field.name, sel.value));\n host.set(field.name, initial);\n return sel;\n }\n\n case 'radio': {\n const group = document.createElement('div');\n group.className = 'beacon-radio-group';\n const initial = ((current as string | undefined) ?? field.defaultValue ?? field.options[0]?.value ?? '');\n for (const opt of field.options) {\n const label = document.createElement('label');\n label.className = 'beacon-radio-opt';\n const input = document.createElement('input');\n input.type = 'radio';\n input.name = field.name;\n input.value = opt.value;\n if (opt.value === initial) input.checked = true;\n input.addEventListener('change', () => host.set(field.name, opt.value));\n const span = document.createElement('span');\n span.textContent = opt.label ?? opt.value;\n label.appendChild(input);\n label.appendChild(span);\n group.appendChild(label);\n }\n host.set(field.name, initial);\n return group;\n }\n\n case 'number': {\n const input = document.createElement('input');\n input.type = 'number';\n input.className = 'beacon-input';\n const initial = (current as number | undefined) ?? field.defaultValue;\n if (initial !== undefined) input.value = String(initial);\n if (field.min !== undefined) input.min = String(field.min);\n if (field.max !== undefined) input.max = String(field.max);\n if (field.step !== undefined) input.step = String(field.step);\n input.addEventListener('input', () => {\n const v = input.value === '' ? undefined : Number(input.value);\n host.set(field.name, v);\n });\n if (initial !== undefined) host.set(field.name, initial);\n return input;\n }\n }\n}\n","// Drawer dialog. Owns the <dialog> element opened via showModal() (top layer)\n// so it escapes any transformed/blurred ancestor without portal hacks.\n//\n// Mode mediation:\n// pickElement → dialog.close() so pointer events reach host page; restored via showModal()\n// minimize / hide → keep dialog open, hide chrome (toggle inner visibility)\n//\n// Reference-counted per mode so overlapping plugin requests compose cleanly.\n\nimport type {\n BeaconPlugin,\n DeclarativeForm,\n FormField,\n ImperativeForm,\n LabelMap,\n Mode,\n Severity,\n BeaconCtx,\n} from '../types';\nimport { renderFields } from './form';\n\nexport interface DialogCallbacks {\n onSubmit(): void;\n onClose(reason: 'user' | 'submitted'): void;\n}\n\nexport interface PluginPanelSource {\n name: string;\n form: DeclarativeForm | ImperativeForm;\n ctx: BeaconCtx;\n}\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nfunction iconClose(): SVGElement {\n const s = document.createElementNS(SVG_NS, 'svg');\n s.setAttribute('viewBox', '0 0 24 24');\n s.setAttribute('fill', 'none');\n s.setAttribute('stroke', 'currentColor');\n s.setAttribute('stroke-width', '2');\n s.setAttribute('stroke-linecap', 'round');\n s.setAttribute('stroke-linejoin', 'round');\n const p1 = document.createElementNS(SVG_NS, 'line');\n p1.setAttribute('x1', '18'); p1.setAttribute('y1', '6'); p1.setAttribute('x2', '6'); p1.setAttribute('y2', '18');\n const p2 = document.createElementNS(SVG_NS, 'line');\n p2.setAttribute('x1', '6'); p2.setAttribute('y1', '6'); p2.setAttribute('x2', '18'); p2.setAttribute('y2', '18');\n s.appendChild(p1); s.appendChild(p2);\n return s;\n}\n\nexport class DialogView {\n readonly root: HTMLDialogElement;\n private inner: HTMLDivElement;\n private pluginSlot: HTMLDivElement;\n private statusEl: HTMLDivElement;\n private submitBtn: HTMLButtonElement;\n private descTextarea: HTMLTextAreaElement;\n private severitySelected: Severity = 'bug';\n private severitiesContainer!: HTMLDivElement;\n private modeCounts: Record<Mode, number> = { minimize: 0, hide: 0, pickElement: 0 };\n private pluginCleanups: Array<() => void> = [];\n // Track the last focused element so showModal() can restore focus on pickElement release.\n private lastActive: HTMLElement | null = null;\n // Bypasses the discard-confirmation guard for the 1.5s lingering success\n // state — clicking X during \"Sent — thanks!\" shouldn't prompt the user.\n private submitSucceeded = false;\n // Per the HTML spec, `dialog.close()` fires the `close` event via a queued\n // task — async, not sync. A synchronous boolean flag (`= true; close(); = false`)\n // closes before the event fires. Track the number of in-flight programmatic\n // closes we want to suppress; the close listener decrements + skips one per\n // event. Survives whatever microtask the spec chooses.\n private expectedSuppressedCloses = 0;\n\n constructor(\n private labels: LabelMap,\n private severities: Severity[],\n private callbacks: DialogCallbacks,\n ) {\n this.root = document.createElement('dialog');\n this.root.className = 'beacon-dialog';\n\n this.inner = document.createElement('div');\n this.inner.className = 'beacon-dialog-inner';\n this.root.appendChild(this.inner);\n\n // ── Header ──────────────────────────────────────\n const header = document.createElement('div');\n header.className = 'beacon-drawer-header';\n const title = document.createElement('div');\n title.className = 'beacon-drawer-title';\n title.textContent = labels.drawerTitle;\n header.appendChild(title);\n\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = 'beacon-icon-btn';\n closeBtn.setAttribute('aria-label', labels.closeButton);\n closeBtn.appendChild(iconClose());\n closeBtn.addEventListener('click', () => this.userCloseAttempt());\n header.appendChild(closeBtn);\n this.inner.appendChild(header);\n\n // Intercept Esc-close via the dialog's `cancel` event. If there's unsaved\n // user input, preventDefault and prompt — otherwise let the native close\n // proceed.\n this.root.addEventListener('cancel', (e) => {\n if (this.submitSucceeded) return;\n if (!this.hasUnsavedInput()) return;\n e.preventDefault();\n // eslint-disable-next-line no-alert\n if (window.confirm('You have unsaved feedback. Discard?')) {\n this.root.close();\n }\n });\n\n // ── Body ──────────────────────────────────────\n const body = document.createElement('div');\n body.className = 'beacon-drawer-body';\n this.inner.appendChild(body);\n\n // Description (core, always present).\n const descField = document.createElement('div');\n descField.className = 'beacon-field';\n const descLabel = document.createElement('label');\n descLabel.className = 'beacon-label';\n descLabel.textContent = labels.descriptionLabel;\n this.descTextarea = document.createElement('textarea');\n this.descTextarea.className = 'beacon-textarea';\n this.descTextarea.placeholder = labels.descriptionPlaceholder;\n this.descTextarea.rows = 4;\n descField.appendChild(descLabel);\n descField.appendChild(this.descTextarea);\n body.appendChild(descField);\n\n // Severity (core, always present).\n const sevField = document.createElement('div');\n sevField.className = 'beacon-field';\n const sevLabel = document.createElement('label');\n sevLabel.className = 'beacon-label';\n sevLabel.textContent = labels.severityLabel;\n this.severitiesContainer = document.createElement('div');\n this.severitiesContainer.className = 'beacon-severity';\n for (const sev of severities) {\n const opt = document.createElement('label');\n opt.className = 'beacon-severity-opt';\n opt.dataset.sev = sev;\n const input = document.createElement('input');\n input.type = 'radio';\n input.name = 'beacon-severity';\n input.value = sev;\n if (sev === this.severitySelected) {\n input.checked = true;\n opt.classList.add('selected');\n }\n input.addEventListener('change', () => this.setSeverity(sev));\n opt.appendChild(input);\n opt.appendChild(document.createTextNode(this.severityLabel(sev)));\n this.severitiesContainer.appendChild(opt);\n }\n sevField.appendChild(sevLabel);\n sevField.appendChild(this.severitiesContainer);\n body.appendChild(sevField);\n\n // ── Plugin panels ──────────────────────────────────────\n this.pluginSlot = document.createElement('div');\n this.pluginSlot.className = 'beacon-plugin-panels';\n body.appendChild(this.pluginSlot);\n\n // ── Status + actions ──────────────────────────────────────\n this.statusEl = document.createElement('div');\n this.statusEl.className = 'beacon-status';\n body.appendChild(this.statusEl);\n\n const actions = document.createElement('div');\n actions.className = 'beacon-actions';\n this.submitBtn = document.createElement('button');\n this.submitBtn.type = 'button';\n this.submitBtn.className = 'beacon-btn primary';\n this.submitBtn.textContent = labels.send;\n this.submitBtn.addEventListener('click', () => this.callbacks.onSubmit());\n actions.appendChild(this.submitBtn);\n body.appendChild(actions);\n\n // Esc / backdrop default close → treat as user close. Mode-triggered\n // closes (pickElement) suppress this so the panels survive the transition.\n this.root.addEventListener('close', () => {\n if (this.expectedSuppressedCloses > 0) {\n this.expectedSuppressedCloses -= 1;\n return;\n }\n this.callbacks.onClose('user');\n });\n }\n\n // ── Mode handling (§5) ──────────────────────────────────────────\n\n async requestMode(mode: Mode): Promise<() => void> {\n this.modeCounts[mode] += 1;\n if (this.modeCounts[mode] === 1) {\n this.applyMode(mode, true);\n }\n let released = false;\n return () => {\n if (released) return;\n released = true;\n this.modeCounts[mode] -= 1;\n if (this.modeCounts[mode] === 0) {\n this.applyMode(mode, false);\n }\n };\n }\n\n private applyMode(mode: Mode, on: boolean) {\n switch (mode) {\n case 'pickElement': {\n if (on) {\n this.lastActive = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n if (this.root.open) {\n // Increment BEFORE calling close — the queued close event will\n // decrement when it eventually fires, skipping onClose.\n this.expectedSuppressedCloses += 1;\n this.root.close();\n }\n } else {\n if (!this.root.open) this.tryShowModal();\n this.lastActive?.focus?.();\n }\n break;\n }\n case 'hide': {\n this.inner.style.visibility = on ? 'hidden' : '';\n this.root.style.opacity = on ? '0' : '';\n break;\n }\n case 'minimize': {\n // Keep header visible, hide body.\n const body = this.inner.querySelector<HTMLElement>('.beacon-drawer-body');\n if (body) body.style.display = on ? 'none' : '';\n break;\n }\n }\n }\n\n // ── Public surface ──────────────────────────────────────────\n\n open() {\n if (this.root.open) return;\n this.tryShowModal();\n }\n\n close(reason: 'user' | 'submitted' = 'user') {\n if (this.root.open) {\n this.root.close();\n }\n // Even if not open, ensure modes reset and panel cleanups run.\n if (reason === 'submitted') this.statusEl.textContent = '';\n }\n\n private userCloseAttempt() {\n if (!this.submitSucceeded && this.hasUnsavedInput()) {\n // eslint-disable-next-line no-alert\n if (!window.confirm('You have unsaved feedback. Discard?')) return;\n }\n if (this.root.open) this.root.close();\n }\n\n private hasUnsavedInput(): boolean {\n return this.descTextarea.value.trim().length > 0;\n }\n\n setSubmitSucceeded(value: boolean) {\n this.submitSucceeded = value;\n }\n\n getDescription(): string {\n return this.descTextarea.value;\n }\n setDescription(v: string) {\n this.descTextarea.value = v;\n }\n\n getSeverity(): Severity {\n return this.severitySelected;\n }\n setSeverity(sev: Severity) {\n this.severitySelected = sev;\n for (const opt of Array.from(this.severitiesContainer.children) as HTMLElement[]) {\n opt.classList.toggle('selected', opt.dataset.sev === sev);\n const input = opt.querySelector('input');\n if (input) input.checked = opt.dataset.sev === sev;\n }\n }\n\n setStatus(text: string, kind: 'idle' | 'error' | 'success' = 'idle') {\n this.statusEl.textContent = text;\n this.statusEl.classList.remove('error', 'success');\n if (kind !== 'idle') this.statusEl.classList.add(kind);\n }\n\n setSubmitting(submitting: boolean) {\n this.submitBtn.disabled = submitting;\n this.submitBtn.textContent = submitting ? this.labels.sending : this.labels.send;\n }\n\n // Reset drawer state after a successful submit so the next open() starts fresh.\n resetState() {\n this.descTextarea.value = '';\n this.setStatus('', 'idle');\n this.setSubmitting(false);\n this.submitSucceeded = false;\n if (this.severities[0]) this.setSeverity(this.severities[0]);\n }\n\n // ── Plugin panel management ──────────────────────────────────────\n\n installPluginPanels(sources: PluginPanelSource[], formValuesHost: {\n get(plugin: string, name: string): unknown;\n set(plugin: string, name: string, value: unknown): void;\n }): void {\n this.clearPluginPanels();\n for (const src of sources) {\n const panel = document.createElement('div');\n panel.className = 'beacon-plugin-panel';\n\n if (src.form.title) {\n const titleEl = document.createElement('div');\n titleEl.className = 'beacon-plugin-panel-title';\n titleEl.textContent = src.form.title;\n panel.appendChild(titleEl);\n }\n\n if ('fields' in src.form) {\n renderFields(panel, src.form.fields as FormField[], {\n get: (name) => formValuesHost.get(src.name, name),\n set: (name, value) => formValuesHost.set(src.name, name, value),\n });\n } else {\n const cleanup = src.form.render(panel, src.ctx);\n if (typeof cleanup === 'function') this.pluginCleanups.push(cleanup);\n }\n\n this.pluginSlot.appendChild(panel);\n }\n }\n\n clearPluginPanels(): void {\n for (const fn of this.pluginCleanups) {\n try { fn(); } catch { /* swallow */ }\n }\n this.pluginCleanups = [];\n this.pluginSlot.innerHTML = '';\n }\n\n private severityLabel(sev: Severity): string {\n switch (sev) {\n case 'bug': return this.labels.severityBug;\n case 'idea': return this.labels.severityIdea;\n case 'ux': return this.labels.severityUx;\n case 'a11y': return this.labels.severityA11y;\n }\n }\n\n private tryShowModal() {\n try {\n this.root.showModal();\n } catch {\n // Browsers below baseline: fall back to non-modal. Drawer is visible but doesn't escape\n // ancestor containment — internal-use only, our app supports modern browsers.\n this.root.show();\n }\n }\n}\n\nexport function defaultLabels(): LabelMap {\n return {\n triggerButton: 'Feedback',\n drawerTitle: 'Send feedback',\n closeButton: 'Close',\n send: 'Send',\n sending: 'Sending…',\n sentSuccess: 'Sent — thanks!',\n descriptionLabel: 'Description',\n descriptionPlaceholder: 'What happened?',\n severityLabel: 'Severity',\n severityBug: 'bug',\n severityIdea: 'idea',\n severityUx: 'ux',\n severityA11y: 'a11y',\n };\n}\n\n// Re-exporting BeaconPlugin so dialog consumers don't have to round-trip through types.\nexport type { BeaconPlugin };\n","// Shadow-DOM-internal overlay layer. Plugins paint floating UI here during\n// `requestMode('pickElement')` when the <dialog> is temporarily closed.\n//\n// Each overlay() call appends a slot element and returns a destroy fn that\n// removes it. Overlays survive dialog open/close (they live in the shadow root,\n// not the <dialog>) so plugins can keep painting through mode transitions.\n\nexport interface OverlayHost {\n layer: HTMLElement;\n}\n\nexport function createOverlayHost(shadow: ShadowRoot): OverlayHost {\n const layer = document.createElement('div');\n layer.className = 'beacon-overlay-layer';\n shadow.appendChild(layer);\n return { layer };\n}\n\nexport function attachOverlay(\n host: OverlayHost,\n render: (slot: HTMLElement) => void | (() => void),\n): () => void {\n const slot = document.createElement('div');\n host.layer.appendChild(slot);\n let cleanup: void | (() => void);\n try {\n cleanup = render(slot);\n } catch (err) {\n slot.remove();\n throw err;\n }\n return () => {\n try { cleanup?.(); } catch { /* swallow */ }\n if (slot.parentNode) slot.parentNode.removeChild(slot);\n };\n}\n","// metadata plugin — payload metadata is already captured by core.assemblePayload\n// from window.* APIs. This plugin contributes an optional `uaData` block (Client\n// Hints) so high-entropy UA data lands in payload.plugins.metadata.uaData when\n// available — without making it part of the core required payload.\n\nimport type { BeaconPlugin } from '../types';\n\ninterface UADataLike {\n brands: Array<{ brand: string; version: string }>;\n mobile: boolean;\n platform: string;\n}\n\nfunction getUaData(): { brand: string; mobile: boolean; platform: string } | undefined {\n const nav = navigator as Navigator & { userAgentData?: UADataLike };\n if (!nav.userAgentData) return undefined;\n const brand = nav.userAgentData.brands.find((b) => !/Not[.\\-]?A.?Brand/i.test(b.brand))?.brand\n ?? nav.userAgentData.brands[0]?.brand\n ?? 'unknown';\n return {\n brand,\n mobile: nav.userAgentData.mobile,\n platform: nav.userAgentData.platform,\n };\n}\n\nexport function metadata(): BeaconPlugin {\n return {\n name: 'metadata',\n capture() {\n const uaData = getUaData();\n return uaData ? { uaData } : null;\n },\n };\n}\n","// Bounded ring buffer for runtime errors + unhandled rejections. Owned by the\n// errors plugin instance (not a module-level singleton — install/teardown cleanly\n// across init() re-calls).\n\nexport interface CapturedRuntimeEvent {\n ts: number;\n kind: 'error' | 'unhandledrejection';\n message: string;\n stack?: string;\n source?: string;\n line?: number;\n col?: number;\n}\n\nconst MAX_EVENTS = 30;\nconst MESSAGE_LIMIT = 500;\nconst STACK_LIMIT = 2000;\nconst SOURCE_LIMIT = 500;\nconst DEDUPE_WINDOW_MS = 5000;\n\nconst BEACON_STACK_PATTERN = /launch-kit-beacon|beacon\\.(?:es|umd|mjs)|\\/beacon\\//i;\n\nfunction trunc(value: string | undefined, limit: number): string | undefined {\n if (!value) return undefined;\n return value.length > limit ? value.slice(0, limit) : value;\n}\n\nfunction signature(message: string, stack: string | undefined): string {\n const stackHead = stack?.split('\\n').slice(0, 3).join('|') ?? '';\n return `${message}::${stackHead}`;\n}\n\nfunction fromBeacon(stack: string | undefined): boolean {\n return !!stack && BEACON_STACK_PATTERN.test(stack);\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value).slice(0, MESSAGE_LIMIT);\n } catch {\n return String(value);\n }\n}\n\nexport interface EventBuffer {\n install(): () => void;\n snapshot(): CapturedRuntimeEvent[];\n subscribe(fn: () => void): () => void;\n}\n\nexport function createEventBuffer(): EventBuffer {\n const buffer: CapturedRuntimeEvent[] = [];\n const recentSignatures = new Map<string, number>();\n const listeners = new Set<() => void>();\n let installed = false;\n let onError: ((e: ErrorEvent) => void) | undefined;\n let onRejection: ((e: PromiseRejectionEvent) => void) | undefined;\n\n function push(event: CapturedRuntimeEvent): void {\n if (fromBeacon(event.stack)) return;\n if (event.kind === 'unhandledrejection' && /AbortError/i.test(event.message)) return;\n const sig = signature(event.message, event.stack);\n const last = recentSignatures.get(sig);\n if (last !== undefined && event.ts - last < DEDUPE_WINDOW_MS) {\n recentSignatures.set(sig, event.ts);\n return;\n }\n recentSignatures.set(sig, event.ts);\n buffer.push(event);\n if (buffer.length > MAX_EVENTS) buffer.shift();\n for (const fn of listeners) {\n try { fn(); } catch { /* swallow */ }\n }\n }\n\n return {\n install(): () => void {\n if (installed) return () => {};\n if (typeof window === 'undefined') return () => {};\n installed = true;\n\n onError = (e: ErrorEvent) => {\n try {\n const errMessage = e.error instanceof Error ? e.error.message : undefined;\n const errStack = e.error instanceof Error ? e.error.stack : undefined;\n push({\n ts: Date.now(),\n kind: 'error',\n message: trunc(e.message || errMessage || 'Unknown error', MESSAGE_LIMIT) ?? 'Unknown error',\n ...(errStack ? { stack: trunc(errStack, STACK_LIMIT)! } : {}),\n ...(e.filename ? { source: trunc(e.filename, SOURCE_LIMIT)! } : {}),\n ...(Number.isFinite(e.lineno) ? { line: e.lineno } : {}),\n ...(Number.isFinite(e.colno) ? { col: e.colno } : {}),\n });\n } catch { /* never throw */ }\n };\n\n onRejection = (e: PromiseRejectionEvent) => {\n try {\n const reason: unknown = e.reason;\n const message = reason instanceof Error\n ? reason.message\n : typeof reason === 'string'\n ? reason\n : safeStringify(reason);\n const stack = reason instanceof Error ? reason.stack : undefined;\n push({\n ts: Date.now(),\n kind: 'unhandledrejection',\n message: trunc(message || 'Unknown rejection', MESSAGE_LIMIT) ?? 'Unknown rejection',\n ...(stack ? { stack: trunc(stack, STACK_LIMIT)! } : {}),\n });\n } catch { /* never throw */ }\n };\n\n window.addEventListener('error', onError);\n window.addEventListener('unhandledrejection', onRejection);\n\n return () => {\n if (onError) window.removeEventListener('error', onError);\n if (onRejection) window.removeEventListener('unhandledrejection', onRejection);\n installed = false;\n listeners.clear();\n };\n },\n\n snapshot(): CapturedRuntimeEvent[] {\n return buffer.slice();\n },\n\n subscribe(fn: () => void): () => void {\n listeners.add(fn);\n return () => { listeners.delete(fn); };\n },\n };\n}\n","// errors plugin — installs runtime `error` + `unhandledrejection` listeners at\n// setupOnce so the buffer fills before the user clicks Send.\n//\n// Two surfaces:\n// • form() renders an expandable chip in the drawer showing what was\n// captured (\"3 runtime errors captured\" → click to expand the list).\n// Live-updates as new errors fire while the drawer is open.\n// • capture() drains the snapshot into payload.plugins.errors.events.\n\nimport { createEventBuffer, type CapturedRuntimeEvent, type EventBuffer } from '../internal/event-buffer';\nimport type { BeaconPlugin } from '../types';\n\nexport function errors(): BeaconPlugin {\n let buffer: EventBuffer | null = null;\n\n return {\n name: 'errors',\n setupOnce(ctx) {\n buffer = createEventBuffer();\n const uninstall = buffer.install();\n ctx.signal.addEventListener('abort', uninstall, { once: true });\n return uninstall;\n },\n form() {\n return {\n render: (slot) => {\n // `slot` IS the per-plugin .beacon-plugin-panel div — hide it directly\n // when there are no events so the drawer doesn't carry an empty padded\n // box (and an empty red dot). Don't read slot.parentElement: at first\n // render() time the slot isn't attached yet, so the lookup is null.\n const wrapper = document.createElement('details');\n wrapper.className = 'beacon-events';\n\n const summary = document.createElement('summary');\n summary.className = 'beacon-events-summary';\n const dot = document.createElement('span');\n dot.className = 'beacon-events-dot';\n dot.textContent = '●';\n const label = document.createElement('span');\n label.className = 'beacon-events-label';\n summary.appendChild(dot);\n summary.appendChild(label);\n wrapper.appendChild(summary);\n\n const list = document.createElement('ul');\n list.className = 'beacon-events-list';\n wrapper.appendChild(list);\n slot.appendChild(wrapper);\n\n function update() {\n const events: CapturedRuntimeEvent[] = buffer?.snapshot() ?? [];\n const count = events.length;\n if (count === 0) {\n slot.style.display = 'none';\n return;\n }\n slot.style.display = '';\n label.textContent = `${count} runtime error${count !== 1 ? 's' : ''} captured`;\n list.innerHTML = '';\n for (const ev of events) {\n const li = document.createElement('li');\n li.className = 'beacon-events-item';\n const kind = document.createElement('span');\n kind.className = `beacon-events-kind ${ev.kind === 'unhandledrejection' ? 'rejection' : 'error'}`;\n kind.textContent = ev.kind === 'unhandledrejection' ? 'REJ' : 'ERR';\n const msg = document.createElement('span');\n msg.className = 'beacon-events-msg';\n msg.textContent = ev.message;\n li.appendChild(kind);\n li.appendChild(msg);\n list.appendChild(li);\n }\n }\n\n update();\n const unsub = buffer?.subscribe(update);\n return () => { unsub?.(); };\n },\n };\n },\n capture() {\n const events: CapturedRuntimeEvent[] = buffer?.snapshot() ?? [];\n if (events.length === 0) return null;\n return { events };\n },\n };\n}\n","// Build a unique-ish CSS selector path by walking up the parent chain.\n// Strategy per ancestor: id (if unique) → tag.classes (if unique among siblings) → tag:nth-of-type(n).\n\nconst MAX_DEPTH = 8;\n\nfunction isUniqueId(id: string, root: Document | ShadowRoot = document): boolean {\n if (!id) return false;\n try {\n return root.querySelectorAll(`#${CSS.escape(id)}`).length === 1;\n } catch {\n return false;\n }\n}\n\nfunction tagWithClasses(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const classes = Array.from(el.classList)\n .filter((c) => c.length > 0 && c.length < 40)\n .slice(0, 3)\n .map((c) => `.${CSS.escape(c)}`)\n .join('');\n return tag + classes;\n}\n\nfunction nthOfTypeIndex(el: Element): number {\n const parent = el.parentElement;\n if (!parent) return 1;\n const sameTag = Array.from(parent.children).filter((c) => c.tagName === el.tagName);\n return sameTag.indexOf(el) + 1;\n}\n\nexport function buildSelector(target: Element): string {\n if (!target || target.nodeType !== Node.ELEMENT_NODE) return '';\n\n if (target.id && isUniqueId(target.id)) {\n return `#${CSS.escape(target.id)}`;\n }\n\n const parts: string[] = [];\n let el: Element | null = target;\n let depth = 0;\n\n while (el && el.tagName.toLowerCase() !== 'body' && depth < MAX_DEPTH) {\n const current: Element = el;\n if (current.id && isUniqueId(current.id)) {\n parts.unshift(`#${CSS.escape(current.id)}`);\n break;\n }\n\n const base = tagWithClasses(current);\n const parent: HTMLElement | null = current.parentElement;\n let part = base;\n if (parent) {\n try {\n const currentClasses = Array.from(current.classList).join(' ');\n const siblings: Element[] = Array.from(parent.children).filter(\n (c: Element) => c.tagName === current.tagName && Array.from(c.classList).join(' ') === currentClasses,\n );\n if (siblings.length > 1) {\n part = `${current.tagName.toLowerCase()}:nth-of-type(${nthOfTypeIndex(current)})`;\n }\n } catch {\n // fall back to base\n }\n }\n\n parts.unshift(part);\n el = parent;\n depth++;\n }\n\n return parts.join(' > ');\n}\n","// Best-effort framework component name detection for the active element.\n// Production builds usually minify names — return null quietly when unavailable.\n\nexport type FrameworkHint = { lib: 'react' | 'vue' | 'angular' | 'svelte' | null; name?: string };\n\nfunction detectReact(el: Element): FrameworkHint | null {\n const keys = Object.keys(el).filter(\n (k) => k.startsWith('__reactFiber$') || k.startsWith('__reactInternalInstance$'),\n );\n if (keys.length === 0) return null;\n let fiber: unknown = (el as unknown as Record<string, unknown>)[keys[0]!];\n for (let i = 0; i < 10 && fiber; i++) {\n const f = fiber as { type?: unknown; return?: unknown };\n const type = f.type;\n if (typeof type === 'function') {\n const name = (type as { displayName?: string; name?: string }).displayName ?? (type as { name?: string }).name;\n if (name && name !== '_default') return { lib: 'react', name };\n }\n if (typeof type === 'object' && type !== null) {\n const name = (type as { displayName?: string; name?: string }).displayName ?? (type as { name?: string }).name;\n if (name) return { lib: 'react', name };\n }\n fiber = f.return;\n }\n return { lib: 'react' };\n}\n\nfunction detectVue(el: Element): FrameworkHint | null {\n const anyEl = el as unknown as Record<string, unknown>;\n const vueParent = anyEl.__vueParentComponent as { type?: { name?: string; __name?: string } } | undefined;\n if (vueParent) {\n const name = vueParent.type?.name ?? vueParent.type?.__name;\n return { lib: 'vue', ...(name ? { name } : {}) };\n }\n if (anyEl.__vue__) return { lib: 'vue' };\n return null;\n}\n\nfunction detectAngular(el: Element): FrameworkHint | null {\n const ng = (window as unknown as { ng?: { getComponent?: (el: Element) => unknown } }).ng;\n if (!ng?.getComponent) return null;\n try {\n const cmp = ng.getComponent(el);\n if (!cmp) return null;\n const ctor = (cmp as { constructor?: { name?: string } }).constructor;\n return { lib: 'angular', ...(ctor?.name ? { name: ctor.name } : {}) };\n } catch {\n return null;\n }\n}\n\nfunction detectSvelte(el: Element): FrameworkHint | null {\n const anyEl = el as unknown as Record<string, unknown>;\n if ('__svelte_meta' in anyEl) return { lib: 'svelte' };\n return null;\n}\n\nexport function detectFramework(el: Element): FrameworkHint | undefined {\n return detectReact(el) ?? detectVue(el) ?? detectAngular(el) ?? detectSvelte(el) ?? undefined;\n}\n","// Capture per-pin element data: outerHTML, selector, computed styles, bounding rect, framework hint.\n\nimport { buildSelector } from './selector';\nimport { detectFramework, type FrameworkHint } from './framework-detect';\n\nconst OUTER_HTML_LIMIT = 5000;\nconst PARENT_OUTER_HTML_LIMIT = 1000;\nconst SELECTOR_LIMIT = 1000;\nconst ID_LIMIT = 200;\nconst CLASSLIST_MAX_ENTRIES = 50;\nconst CLASS_NAME_LIMIT = 200;\nconst STYLE_VALUE_LIMIT = 500;\n\nconst USEFUL_STYLE_PROPS = [\n 'display', 'position', 'top', 'right', 'bottom', 'left',\n 'width', 'height', 'min-width', 'min-height', 'max-width', 'max-height',\n 'margin', 'padding',\n 'font-family', 'font-size', 'font-weight', 'line-height', 'text-align',\n 'color', 'background-color', 'background-image',\n 'border', 'border-radius',\n 'opacity', 'visibility', 'overflow',\n 'z-index', 'transform', 'transition',\n 'flex', 'flex-direction', 'justify-content', 'align-items', 'gap',\n 'grid-template-columns', 'grid-template-rows',\n] as const;\n\nexport interface ElementCapture {\n selector: string;\n tagName: string;\n id: string | null;\n classList: string[];\n outerHTML: string;\n parentOuterHTML?: string;\n computedStyles: Record<string, string>;\n boundingRect: { x: number; y: number; w: number; h: number };\n framework?: FrameworkHint;\n}\n\nfunction truncate(s: string, max: number): string {\n if (s.length <= max) return s;\n return s.slice(0, max) + `\\n\\n/* … truncated, original was ${s.length} chars */`;\n}\n\nfunction pickStyles(el: Element): Record<string, string> {\n const computed = getComputedStyle(el);\n const out: Record<string, string> = {};\n for (const prop of USEFUL_STYLE_PROPS) {\n const value = computed.getPropertyValue(prop);\n if (value && value !== 'normal' && value !== 'none' && value !== 'auto' && value !== '0px') {\n out[prop] = value.trim().slice(0, STYLE_VALUE_LIMIT);\n }\n }\n return out;\n}\n\nfunction capClassList(el: Element): string[] {\n return Array.from(el.classList)\n .slice(0, CLASSLIST_MAX_ENTRIES)\n .map((c) => (c.length > CLASS_NAME_LIMIT ? c.slice(0, CLASS_NAME_LIMIT) : c));\n}\n\nexport function captureElement(el: Element): ElementCapture {\n const rect = el.getBoundingClientRect();\n const rawSelector = buildSelector(el);\n const rawId = el.id || null;\n const framework = detectFramework(el);\n return {\n selector: rawSelector.length > SELECTOR_LIMIT ? rawSelector.slice(0, SELECTOR_LIMIT) : rawSelector,\n tagName: el.tagName.toLowerCase(),\n id: rawId && rawId.length > ID_LIMIT ? rawId.slice(0, ID_LIMIT) : rawId,\n classList: capClassList(el),\n outerHTML: truncate(el.outerHTML, OUTER_HTML_LIMIT),\n ...(el.parentElement\n ? { parentOuterHTML: truncate(el.parentElement.outerHTML, PARENT_OUTER_HTML_LIMIT) }\n : {}),\n computedStyles: pickStyles(el),\n boundingRect: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n w: Math.round(rect.width),\n h: Math.round(rect.height),\n },\n ...(framework ? { framework } : {}),\n };\n}\n","// Draw captured pins onto a screenshot. Outline rectangle + numbered marker per pin.\n\nexport interface PinMarker {\n number: number;\n selector?: string;\n boundingRect: { x: number; y: number; w: number; h: number };\n liveElement?: Element;\n}\n\nconst MARKER_RADIUS = 14;\nconst MARKER_STROKE = '#ffffff';\nconst MARKER_TEXT = '#ffffff';\nconst OUTLINE_WIDTH = 3;\nconst DEFAULT_ACCENT = '#0ea5e9';\n\nexport async function drawMarkers(\n screenshotDataUrl: string,\n pins: PinMarker[],\n viewport: { w: number; h: number; dpr: number },\n accent: string = DEFAULT_ACCENT,\n): Promise<string> {\n const img = await loadImage(screenshotDataUrl);\n const canvas = document.createElement('canvas');\n canvas.width = img.naturalWidth;\n canvas.height = img.naturalHeight;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get 2D canvas context');\n\n ctx.drawImage(img, 0, 0);\n\n const scaleX = canvas.width / viewport.w;\n const scaleY = canvas.height / viewport.h;\n\n for (const pin of pins) {\n const rect = getFreshRect(pin);\n if (!rect) continue;\n\n const x = rect.x * scaleX;\n const y = rect.y * scaleY;\n const w = rect.w * scaleX;\n const h = rect.h * scaleY;\n\n ctx.lineWidth = OUTLINE_WIDTH;\n ctx.strokeStyle = accent;\n ctx.strokeRect(x, y, w, h);\n\n const cx = x + w;\n const cy = y;\n\n ctx.beginPath();\n ctx.fillStyle = accent;\n ctx.arc(cx, cy, MARKER_RADIUS, 0, Math.PI * 2);\n ctx.fill();\n\n ctx.lineWidth = 3;\n ctx.strokeStyle = MARKER_STROKE;\n ctx.stroke();\n\n ctx.fillStyle = MARKER_TEXT;\n ctx.font = 'bold 16px system-ui, -apple-system, sans-serif';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(String(pin.number), cx, cy + 1);\n }\n\n return canvas.toDataURL('image/jpeg', 0.85);\n}\n\nfunction getFreshRect(pin: PinMarker): { x: number; y: number; w: number; h: number } | null {\n if (pin.liveElement && document.contains(pin.liveElement)) {\n const r = pin.liveElement.getBoundingClientRect();\n if (r.width > 0 || r.height > 0) {\n return { x: r.left, y: r.top, w: r.width, h: r.height };\n }\n }\n if (pin.selector) {\n try {\n const found = document.querySelector(pin.selector);\n if (found) {\n const r = found.getBoundingClientRect();\n if (r.width > 0 || r.height > 0) {\n return { x: r.left, y: r.top, w: r.width, h: r.height };\n }\n }\n } catch { /* fall through */ }\n }\n return pin.boundingRect;\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = (err) => reject(err);\n img.src = src;\n });\n}\n","// Visual overlay shown during pin-mode. Three layers:\n// 1. Subtle dotted viewport border + soft inset glow → \"you're in pin mode\"\n// 2. Top-center hint pill → \"press Esc to finish\"\n// 3. Numbered markers + outlines → over each already-pinned\n// element so the user can\n// see what they pinned\n//\n// Mounted on document.body (NOT the beacon Shadow DOM) because position:fixed\n// children of transformed/filtered/contained ancestors get anchored to that\n// ancestor instead of the viewport — and many host pages put a transform on\n// sticky headers, which is exactly where the slotted trigger lives.\n//\n// Each element carries the `beacon-no-capture` class so the screenshot filter\n// skips them. All use pointer-events: none so they don't block elementsFromPoint\n// during picking.\n\nconst NO_CAPTURE_CLASS = 'beacon-no-capture';\nconst DEFAULT_ACCENT = '#0ea5e9';\nconst DEFAULT_HINT = 'Click any element to pin it · Press Esc to finish';\n\nexport interface PinAnchor {\n target: Element;\n /** Selector to re-query if `target` is detached (React re-render, conditional unmount). */\n selector?: string;\n /** Last-known viewport rect from pin time. Used as a faded \"anchor lost\" marker\n * if both the live ref and the selector lookup fail. */\n fallbackRect?: { x: number; y: number; w: number; h: number };\n}\n\nexport interface PickModeOverlay {\n addPin(pinNumber: number, anchor: PinAnchor): void;\n /** Swap the hint pill into a loading state (with spinner). Pass undefined to restore the default. */\n setLoading(message?: string): void;\n destroy(): void;\n}\n\nexport interface PickModeOverlayOptions {\n accent?: string;\n}\n\nfunction withAlpha(color: string, alphaHex: string): string {\n return /^#[0-9a-fA-F]{6}$/.test(color) ? `${color}${alphaHex}` : color;\n}\n\nexport function createPickModeOverlay(opts: PickModeOverlayOptions = {}): PickModeOverlay {\n const ACCENT = opts.accent ?? DEFAULT_ACCENT;\n const ACCENT_BORDER = withAlpha(ACCENT, 'b3');\n const ACCENT_GLOW = withAlpha(ACCENT, '2e');\n\n const styleTag = document.createElement('style');\n styleTag.className = NO_CAPTURE_CLASS;\n styleTag.textContent = '@keyframes beacon-spin { to { transform: rotate(360deg); } }';\n document.head.appendChild(styleTag);\n\n const frame = document.createElement('div');\n frame.className = NO_CAPTURE_CLASS;\n frame.setAttribute('aria-hidden', 'true');\n frame.style.cssText = [\n 'position: fixed',\n 'inset: 0',\n 'pointer-events: none',\n 'z-index: 2147483646',\n `border: 2px dashed ${ACCENT_BORDER}`,\n 'border-radius: 4px',\n `box-shadow: inset 0 0 56px ${ACCENT_GLOW}`,\n 'box-sizing: border-box',\n ].join('; ');\n\n const hint = document.createElement('div');\n hint.className = NO_CAPTURE_CLASS;\n hint.setAttribute('role', 'status');\n hint.style.cssText = [\n 'position: fixed',\n 'top: 16px',\n 'left: 50%',\n 'transform: translateX(-50%)',\n `background: ${ACCENT}`,\n 'color: #fff',\n 'padding: 6px 14px',\n 'border-radius: 999px',\n 'font: 500 12px/1.4 system-ui, -apple-system, sans-serif',\n 'letter-spacing: 0.01em',\n 'box-shadow: 0 4px 12px hsl(0 0% 0% / 0.3)',\n 'pointer-events: none',\n 'white-space: nowrap',\n 'z-index: 2147483646',\n ].join('; ');\n hint.textContent = DEFAULT_HINT;\n\n const SPINNER_HTML = `<span style=\"\n display: inline-block;\n width: 12px;\n height: 12px;\n border: 2px solid #fff;\n border-top-color: transparent;\n border-radius: 50%;\n animation: beacon-spin 800ms linear infinite;\n vertical-align: middle;\n margin-right: 8px;\n \"></span>`;\n\n function escapeHtml(s: string): string {\n return s.replace(/[<>&]/g, (c) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;' }[c] as string));\n }\n\n document.body.appendChild(frame);\n document.body.appendChild(hint);\n\n const tracked = new Map<number, { anchor: PinAnchor; marker: HTMLDivElement; outline: HTMLDivElement }>();\n\n function makeMarker(num: number): HTMLDivElement {\n const m = document.createElement('div');\n m.className = NO_CAPTURE_CLASS;\n m.setAttribute('aria-hidden', 'true');\n m.style.cssText = [\n 'position: fixed',\n 'width: 24px',\n 'height: 24px',\n 'border-radius: 999px',\n `background: ${ACCENT}`,\n 'color: #fff',\n 'display: flex',\n 'align-items: center',\n 'justify-content: center',\n 'font: 700 12px/1 system-ui, -apple-system, sans-serif',\n 'border: 2px solid #fff',\n 'box-shadow: 0 2px 8px hsl(0 0% 0% / 0.4)',\n 'pointer-events: none',\n 'z-index: 2147483646',\n ].join('; ');\n m.textContent = String(num);\n document.body.appendChild(m);\n return m;\n }\n\n function makeOutline(): HTMLDivElement {\n const o = document.createElement('div');\n o.className = NO_CAPTURE_CLASS;\n o.setAttribute('aria-hidden', 'true');\n o.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n `border: 2px solid ${ACCENT}`,\n 'border-radius: 2px',\n 'box-sizing: border-box',\n 'z-index: 2147483645',\n ].join('; ');\n document.body.appendChild(o);\n return o;\n }\n\n function placeAt(\n entry: { marker: HTMLDivElement; outline: HTMLDivElement },\n rect: { x: number; y: number; w: number; h: number },\n isStale: boolean,\n ) {\n const opacity = isStale ? '0.5' : '1';\n entry.outline.style.display = 'block';\n entry.outline.style.opacity = opacity;\n entry.outline.style.left = `${rect.x}px`;\n entry.outline.style.top = `${rect.y}px`;\n entry.outline.style.width = `${rect.w}px`;\n entry.outline.style.height = `${rect.h}px`;\n\n entry.marker.style.display = 'flex';\n entry.marker.style.opacity = opacity;\n entry.marker.style.left = `${rect.x + rect.w - 12}px`;\n entry.marker.style.top = `${Math.max(2, rect.y - 12)}px`;\n }\n\n function hide(entry: { marker: HTMLDivElement; outline: HTMLDivElement }) {\n entry.marker.style.display = 'none';\n entry.outline.style.display = 'none';\n }\n\n function reposition() {\n tracked.forEach((entry) => {\n let liveTarget: Element | null = entry.anchor.target;\n if (!document.contains(liveTarget)) liveTarget = null;\n\n if (!liveTarget && entry.anchor.selector) {\n liveTarget = document.querySelector(entry.anchor.selector);\n if (liveTarget) entry.anchor.target = liveTarget;\n }\n\n if (liveTarget) {\n const r = liveTarget.getBoundingClientRect();\n if (r.width > 0 || r.height > 0) {\n placeAt(entry, { x: r.left, y: r.top, w: r.width, h: r.height }, false);\n return;\n }\n }\n\n const fr = entry.anchor.fallbackRect;\n if (fr && (fr.w > 0 || fr.h > 0)) {\n placeAt(entry, fr, true);\n return;\n }\n\n hide(entry);\n });\n }\n\n let raf: number | null = null;\n function schedule() {\n if (raf !== null) return;\n raf = requestAnimationFrame(() => {\n raf = null;\n reposition();\n });\n }\n\n window.addEventListener('scroll', schedule, true);\n window.addEventListener('resize', schedule);\n\n return {\n addPin(num, anchor) {\n const marker = makeMarker(num);\n const outline = makeOutline();\n tracked.set(num, { anchor, marker, outline });\n reposition();\n },\n setLoading(message) {\n if (message) {\n hint.innerHTML = SPINNER_HTML + escapeHtml(message);\n } else {\n hint.textContent = DEFAULT_HINT;\n }\n },\n destroy() {\n window.removeEventListener('scroll', schedule, true);\n window.removeEventListener('resize', schedule);\n if (raf !== null) cancelAnimationFrame(raf);\n frame.remove();\n hint.remove();\n styleTag.remove();\n tracked.forEach(({ marker, outline }) => {\n marker.remove();\n outline.remove();\n });\n tracked.clear();\n },\n };\n}\n","// Small contextual popover that opens next to a picked element so the user can\n// optionally type a note. The cross icon discards this pin and lets the user keep\n// picking; Save attaches the (optional) note. Escape ends annotation entirely.\n//\n// Body-mounted (NOT inside the beacon shadow root) so it escapes transformed\n// ancestor stacking contexts. Needs the body-mount style rules registered via\n// the global stylesheet (ensureBeaconBodyStyles).\n\nexport type PinPopoverCancel = 'pin' | 'all' | false;\n\nexport interface PinPopoverResult {\n note?: string;\n /** 'pin' = discard this pin, keep picking. 'all' = end annotation. false = save. */\n cancelled: PinPopoverCancel;\n}\n\nconst ICON_CLOSE =\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' +\n '<line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\nconst ICON_CHECK =\n '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">' +\n '<polyline points=\"20 6 9 17 4 12\"/></svg>';\n\nexport function showPinPopover(opts: {\n anchor: { x: number; y: number };\n pinNumber: number;\n}): Promise<PinPopoverResult> {\n return new Promise((resolve) => {\n const popover = document.createElement('div');\n popover.className = 'beacon-pin-popover open beacon-no-capture beacon-theme-auto';\n popover.innerHTML = `\n <div class=\"beacon-pin-popover-header\">\n <div style=\"display:flex;align-items:center;gap:6px;font-weight:600;font-size:13px;\">\n <span class=\"beacon-pin-num\">${opts.pinNumber}</span>\n <span>Note for this pin</span>\n </div>\n <button type=\"button\" class=\"beacon-icon-btn\" data-action=\"cancel\" aria-label=\"Discard this pin\">${ICON_CLOSE}</button>\n </div>\n <textarea class=\"beacon-textarea\" rows=\"2\" placeholder=\"Optional — describe what's wrong here…\" style=\"min-height:48px;\"></textarea>\n <div class=\"beacon-pin-popover-actions\">\n <button type=\"button\" class=\"beacon-btn primary\" data-action=\"save\">${ICON_CHECK} Save</button>\n </div>\n `;\n\n const POPOVER_W = 240;\n const POPOVER_H = 160;\n const left = Math.min(Math.max(8, opts.anchor.x), window.innerWidth - POPOVER_W - 8);\n const top = Math.min(Math.max(8, opts.anchor.y + 12), window.innerHeight - POPOVER_H - 8);\n popover.style.left = `${left}px`;\n popover.style.top = `${top}px`;\n\n document.body.appendChild(popover);\n\n const textarea = popover.querySelector('textarea')!;\n textarea.focus();\n\n function close(result: PinPopoverResult) {\n document.removeEventListener('keydown', handleGlobalKey, true);\n popover.remove();\n resolve(result);\n }\n\n function handleGlobalKey(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n close({ cancelled: 'all' });\n }\n }\n document.addEventListener('keydown', handleGlobalKey, true);\n\n popover.addEventListener('click', (e) => {\n const target = e.target as HTMLElement;\n const action = target.closest('[data-action]')?.getAttribute('data-action');\n if (action === 'cancel') close({ cancelled: 'pin' });\n if (action === 'save') {\n const note = textarea.value.trim();\n close({ ...(note ? { note } : {}), cancelled: false });\n }\n });\n\n textarea.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n const note = textarea.value.trim();\n close({ ...(note ? { note } : {}), cancelled: false });\n }\n });\n });\n}\n","// Hover/click element picker. Draws an outline + tooltip over the hovered element\n// and resolves with the clicked element. Skips the widget's own elements via\n// composedPath check against the provided shadow root.\n\nexport interface PickerOptions {\n shadowRoot: ShadowRoot;\n onHover?: (el: Element | null) => void;\n accent?: string;\n}\n\nconst DEFAULT_ACCENT = '#0ea5e9';\n\nfunction withAlpha(color: string, alphaHex: string): string {\n return /^#[0-9a-fA-F]{6}$/.test(color) ? `${color}${alphaHex}` : color;\n}\n\nexport interface PickerHandle {\n cancel: () => void;\n promise: Promise<Element | null>;\n}\n\nexport function startPicker(opts: PickerOptions): PickerHandle {\n const { shadowRoot, onHover } = opts;\n const accent = opts.accent ?? DEFAULT_ACCENT;\n const accentFill = withAlpha(accent, '14');\n\n const outline = document.createElement('div');\n outline.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n 'z-index: 2147483646',\n `border: 2px solid ${accent}`,\n `background: ${accentFill}`,\n 'transition: all 60ms ease-out',\n 'box-sizing: border-box',\n 'border-radius: 2px',\n ].join('; ');\n document.body.appendChild(outline);\n\n const tooltip = document.createElement('div');\n tooltip.style.cssText = [\n 'position: fixed',\n 'pointer-events: none',\n 'z-index: 2147483647',\n 'background: #0f172a',\n 'color: #fff',\n 'font: 11px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace',\n 'padding: 3px 6px',\n 'border-radius: 3px',\n 'max-width: 280px',\n 'overflow: hidden',\n 'text-overflow: ellipsis',\n 'white-space: nowrap',\n ].join('; ');\n document.body.appendChild(tooltip);\n\n const previousCursor = document.body.style.cursor;\n document.body.style.cursor = 'crosshair';\n\n let resolved = false;\n let resolvePromise: (v: Element | null) => void = () => {};\n const promise = new Promise<Element | null>((res) => { resolvePromise = res; });\n\n function isWidgetElement(el: EventTarget | null): boolean {\n if (!el || !(el instanceof Node)) return false;\n let node: Node | null = el;\n while (node) {\n if (node === shadowRoot || node === shadowRoot.host) return true;\n node = node.parentNode ?? (node as ShadowRoot).host ?? null;\n }\n return false;\n }\n\n function findTarget(x: number, y: number): Element | null {\n outline.style.display = 'none';\n tooltip.style.display = 'none';\n const candidates = document.elementsFromPoint(x, y);\n outline.style.display = 'block';\n tooltip.style.display = 'block';\n for (const c of candidates) {\n if (!isWidgetElement(c)) return c;\n }\n return null;\n }\n\n function positionOutline(el: Element) {\n const rect = el.getBoundingClientRect();\n outline.style.left = `${rect.left}px`;\n outline.style.top = `${rect.top}px`;\n outline.style.width = `${rect.width}px`;\n outline.style.height = `${rect.height}px`;\n const tag = el.tagName.toLowerCase();\n const cls = el.classList.length > 0 ? '.' + Array.from(el.classList).slice(0, 2).join('.') : '';\n tooltip.textContent = tag + cls;\n const above = rect.top - 22;\n tooltip.style.left = `${rect.left}px`;\n tooltip.style.top = `${above >= 0 ? above : rect.bottom + 4}px`;\n }\n\n function handleMove(e: MouseEvent) {\n const el = findTarget(e.clientX, e.clientY);\n if (el) {\n positionOutline(el);\n onHover?.(el);\n } else {\n outline.style.display = 'none';\n tooltip.style.display = 'none';\n onHover?.(null);\n }\n }\n\n // pointerdown (not click) so Radix Select/Popover/Dialog don't open under us.\n function handlePointerDown(e: PointerEvent) {\n if (e.button !== 0) return;\n e.preventDefault();\n e.stopPropagation();\n const el = findTarget(e.clientX, e.clientY);\n if (el) finish(el);\n }\n\n function swallow(e: Event) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n function handleKey(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n e.preventDefault();\n finish(null);\n }\n }\n\n function finish(el: Element | null) {\n if (resolved) return;\n resolved = true;\n document.removeEventListener('mousemove', handleMove, true);\n document.removeEventListener('pointerdown', handlePointerDown, true);\n document.removeEventListener('click', swallow, true);\n document.removeEventListener('mouseup', swallow, true);\n document.removeEventListener('keydown', handleKey, true);\n outline.remove();\n tooltip.remove();\n document.body.style.cursor = previousCursor;\n resolvePromise(el);\n }\n\n document.addEventListener('mousemove', handleMove, true);\n document.addEventListener('pointerdown', handlePointerDown, true);\n document.addEventListener('click', swallow, true);\n document.addEventListener('mouseup', swallow, true);\n document.addEventListener('keydown', handleKey, true);\n\n return {\n cancel: () => finish(null),\n promise,\n };\n}\n","// Lazy-loaded screenshot capture via html-to-image. Captures the viewport\n// (document.documentElement) as a JPEG data URL.\n//\n// Cross-origin images without CORS taint the canvas. Belt-and-suspenders:\n// swap cross-origin <img>.src to a transparent pixel before capture, restore after.\n\nlet htmlToImage: typeof import('html-to-image') | null = null;\n\nasync function load() {\n if (!htmlToImage) {\n htmlToImage = await import('html-to-image');\n }\n return htmlToImage;\n}\n\nexport interface ScreenshotOptions {\n quality?: number;\n pixelRatio?: number;\n excludeShadowRoot?: ShadowRoot;\n excludeHosts?: Element[];\n}\n\nconst TRANSPARENT_PIXEL =\n 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkAAIAAAoAAv/lxKUAAAAASUVORK5CYII=';\n\nfunction isUrlSafeForCanvas(rawUrl: string, crossOriginAttr?: string | null): boolean {\n if (!rawUrl) return true;\n if (rawUrl.startsWith('data:') || rawUrl.startsWith('blob:')) return true;\n if (rawUrl.startsWith('/') || rawUrl.startsWith('#')) return true;\n try {\n const u = new URL(rawUrl, window.location.href);\n if (u.origin === window.location.origin) return true;\n } catch {\n return false;\n }\n return crossOriginAttr === 'anonymous' || crossOriginAttr === 'use-credentials';\n}\n\nfunction neutralizeCrossOriginImages(): () => void {\n const stashedImg: Array<{ el: HTMLImageElement; src: string }> = [];\n const stashedSvg: Array<{ el: SVGImageElement; href: string | null; xlink: string | null }> = [];\n\n document.querySelectorAll('img').forEach((img) => {\n if (!isUrlSafeForCanvas(img.src, img.crossOrigin)) {\n stashedImg.push({ el: img, src: img.src });\n img.src = TRANSPARENT_PIXEL;\n }\n });\n\n document.querySelectorAll('image').forEach((img) => {\n const svgImg = img as unknown as SVGImageElement;\n const href = svgImg.getAttribute('href');\n const xlink = svgImg.getAttributeNS('http://www.w3.org/1999/xlink', 'href');\n const url = href || xlink || '';\n if (url && !isUrlSafeForCanvas(url)) {\n stashedSvg.push({ el: svgImg, href, xlink });\n if (href !== null) svgImg.setAttribute('href', TRANSPARENT_PIXEL);\n if (xlink !== null) svgImg.setAttributeNS('http://www.w3.org/1999/xlink', 'href', TRANSPARENT_PIXEL);\n }\n });\n\n return () => {\n for (const { el, src } of stashedImg) el.src = src;\n for (const { el, href, xlink } of stashedSvg) {\n if (href !== null) el.setAttribute('href', href);\n if (xlink !== null) el.setAttributeNS('http://www.w3.org/1999/xlink', 'href', xlink);\n }\n };\n}\n\nexport async function captureScreenshot(opts: ScreenshotOptions = {}): Promise<string> {\n const {\n quality = 0.7,\n pixelRatio = Math.min(window.devicePixelRatio || 1, 2),\n excludeShadowRoot,\n excludeHosts,\n } = opts;\n const lib = await load();\n\n // Skip the beacon's own custom-element hosts so the open <dialog> top layer\n // and the shadow-DOM trigger don't appear in the snapshot.\n const filter = (excludeShadowRoot || excludeHosts?.length)\n ? (node: Node) => {\n let cur: Node | null = node;\n while (cur) {\n if (excludeShadowRoot && cur === excludeShadowRoot.host) return false;\n if (excludeHosts && cur instanceof Element && excludeHosts.includes(cur)) return false;\n if (cur instanceof Element && cur.classList.contains('beacon-no-capture')) return false;\n cur = cur.parentNode;\n }\n return true;\n }\n : undefined;\n\n const restore = neutralizeCrossOriginImages();\n try {\n return await lib.toJpeg(document.documentElement, {\n quality,\n pixelRatio,\n cacheBust: true,\n ...(filter ? { filter } : {}),\n imagePlaceholder: TRANSPARENT_PIXEL,\n width: window.innerWidth,\n height: window.innerHeight,\n style: { transform: 'none' },\n });\n } finally {\n restore();\n }\n}\n","// Tiny shared cache so the interactive annotate flow (domEle) and the submit-time\n// screenshot capture (domSS) can hand off an annotated screenshot without\n// round-tripping a multi-MB data URL through the payload's plugin entries.\n//\n// Set after domEle's pick loop completes (with all pin markers drawn onto the\n// snapshot). Read by domSS at capture time — reused verbatim if present, else\n// captured fresh.\n\nlet cached: { dataUrl: string; mime: 'image/jpeg' | 'image/png' } | null = null;\n\nexport function setAnnotationCache(entry: { dataUrl: string; mime: 'image/jpeg' | 'image/png' }): void {\n cached = entry;\n}\n\nexport function getAnnotationCache(): { dataUrl: string; mime: 'image/jpeg' | 'image/png' } | null {\n return cached;\n}\n\nexport function clearAnnotationCache(): void {\n cached = null;\n}\n","// domEle plugin — pin-annotation picker, ported from the old monolithic beacon.\n// Form panel renders an \"Annotate\" button that enters multi-pick mode:\n// • drawer closes (requestMode('pickElement'))\n// • dashed viewport border + hint pill paint\n// • loop: pick element → note popover → either Save, skip, or end\n// • on end, captures a screenshot + draws numbered markers + caches it\n// • drawer reopens with the pin list + preview <img>\n//\n// At submit time capture() returns { pins }. domSS reuses the cached screenshot\n// via beacon/internal/annotation-cache, so the user-visible preview is the\n// exact bytes that ship to the server.\n\nimport { captureElement, type ElementCapture } from '../internal/element-capture';\nimport { drawMarkers, type PinMarker } from '../internal/markers';\nimport { createPickModeOverlay } from '../internal/pick-mode-overlay';\nimport { showPinPopover } from '../internal/pin-popover';\nimport { startPicker } from '../internal/picker';\nimport { captureScreenshot } from '../internal/screenshot';\nimport { setAnnotationCache, clearAnnotationCache } from '../internal/annotation-cache';\nimport type { BeaconPlugin, BeaconCtx } from '../types';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\nfunction iconTrash(): SVGElement {\n const s = document.createElementNS(SVG_NS, 'svg');\n s.setAttribute('viewBox', '0 0 24 24');\n s.setAttribute('fill', 'none');\n s.setAttribute('stroke', 'currentColor');\n s.setAttribute('stroke-width', '2');\n s.setAttribute('stroke-linecap', 'round');\n s.setAttribute('stroke-linejoin', 'round');\n s.setAttribute('aria-hidden', 'true');\n const paths = [\n 'M3 6h18',\n 'M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6',\n 'M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2',\n ];\n for (const d of paths) {\n const p = document.createElementNS(SVG_NS, 'path');\n p.setAttribute('d', d);\n s.appendChild(p);\n }\n return s;\n}\n\nexport interface Pin extends ElementCapture {\n number: number;\n note?: string;\n}\n\nexport interface DomEleOptions {\n /** Picker outline + marker color. Falls back to --beacon-accent. */\n accent?: string;\n /** Cap on pin count. Default 20 — mirrors the server-side schema. */\n maxPins?: number;\n}\n\nexport function domEle(opts: DomEleOptions = {}): BeaconPlugin {\n const maxPins = opts.maxPins ?? 20;\n let pins: Pin[] = [];\n let pinElements = new WeakMap<Pin, Element>();\n let cachedAnnotatedDataUrl: string | null = null;\n\n // Panel-scoped refs — reset each time form() is re-rendered.\n let headerEl: HTMLDivElement | null = null;\n let listEl: HTMLDivElement | null = null;\n let previewEl: HTMLImageElement | null = null;\n let btnEl: HTMLButtonElement | null = null;\n\n function reset(): void {\n pins = [];\n pinElements = new WeakMap();\n cachedAnnotatedDataUrl = null;\n clearAnnotationCache();\n renderList();\n renderPreview();\n }\n\n function findShadowRoot(): ShadowRoot | null {\n const host = document.querySelector('launch-kit-beacon');\n return host?.shadowRoot ?? null;\n }\n\n function resolveAccent(): string {\n if (typeof window === 'undefined') return opts.accent ?? '#0ea5e9';\n if (opts.accent) return opts.accent;\n const host = document.querySelector('launch-kit-beacon');\n if (!host) return '#0ea5e9';\n const v = getComputedStyle(host).getPropertyValue('--beacon-accent').trim();\n return v || '#0ea5e9';\n }\n\n async function enterAnnotateMode(ctx: BeaconCtx): Promise<void> {\n const shadowRoot = findShadowRoot();\n if (!shadowRoot) return;\n const accent = resolveAccent();\n\n const release = await ctx.requestMode('pickElement');\n const overlay = createPickModeOverlay({ accent });\n\n // Restore markers for already-pinned elements so the user can see what\n // they've already pinned while picking the next one.\n for (const pin of pins) {\n const target = pinElements.get(pin);\n if (target) {\n overlay.addPin(pin.number, {\n target,\n selector: pin.selector,\n fallbackRect: pin.boundingRect,\n });\n }\n }\n\n try {\n let keepPicking = true;\n while (keepPicking) {\n if (pins.length >= maxPins) break;\n const handle = startPicker({ shadowRoot, accent });\n const el = await handle.promise;\n if (!el) break; // Escape ends annotation\n\n const rect = el.getBoundingClientRect();\n const popover = await showPinPopover({\n anchor: { x: rect.left, y: rect.bottom },\n pinNumber: pins.length + 1,\n });\n // 'all' (Escape inside popover) ends annotation;\n // 'pin' (cross icon) drops this candidate and re-enters pick mode.\n if (popover.cancelled === 'all') { keepPicking = false; break; }\n if (popover.cancelled === 'pin') continue;\n\n const captured = captureElement(el);\n const pin: Pin = {\n number: pins.length + 1,\n ...captured,\n ...(popover.note ? { note: popover.note } : {}),\n };\n pins.push(pin);\n pinElements.set(pin, el);\n overlay.addPin(pin.number, {\n target: el,\n selector: captured.selector,\n fallbackRect: captured.boundingRect,\n });\n }\n\n // After picks: capture a fresh screenshot, draw markers, cache it for\n // both the in-drawer preview AND the submit-time payload.\n if (pins.length > 0) {\n overlay.setLoading('Capturing screenshot…');\n await new Promise<void>((r) => requestAnimationFrame(() => r()));\n try {\n const beaconHosts = Array.from(document.querySelectorAll('launch-kit-beacon')) as Element[];\n const raw = await captureScreenshot({ excludeHosts: beaconHosts });\n const markers: PinMarker[] = pins.map((p) => ({\n number: p.number,\n selector: p.selector,\n boundingRect: p.boundingRect,\n ...(pinElements.get(p) ? { liveElement: pinElements.get(p)! } : {}),\n }));\n const viewport = {\n w: window.innerWidth,\n h: window.innerHeight,\n dpr: window.devicePixelRatio || 1,\n };\n const annotated = await drawMarkers(raw, markers, viewport, accent);\n cachedAnnotatedDataUrl = annotated;\n setAnnotationCache({ dataUrl: annotated, mime: 'image/jpeg' });\n } catch {\n // Screenshot failure is non-fatal — pins still post.\n cachedAnnotatedDataUrl = null;\n clearAnnotationCache();\n }\n } else {\n cachedAnnotatedDataUrl = null;\n clearAnnotationCache();\n }\n } finally {\n overlay.destroy();\n release();\n }\n\n renderList();\n renderPreview();\n }\n\n function deletePin(n: number) {\n const idx = pins.findIndex((p) => p.number === n);\n if (idx === -1) return;\n pins.splice(idx, 1);\n pins.forEach((p, i) => { p.number = i + 1; });\n // Cached screenshot baked in the deleted marker — invalidate.\n cachedAnnotatedDataUrl = null;\n clearAnnotationCache();\n renderList();\n renderPreview();\n }\n\n function renderList() {\n if (headerEl) {\n headerEl.textContent = `Pins (${pins.length})`;\n headerEl.style.display = pins.length === 0 ? 'none' : '';\n }\n if (btnEl) {\n btnEl.textContent = pins.length === 0 ? 'Annotate elements' : 'Add another pin';\n }\n if (!listEl) return;\n listEl.innerHTML = '';\n listEl.style.display = pins.length === 0 ? 'none' : '';\n for (const pin of pins) {\n const row = document.createElement('div');\n row.className = 'beacon-pin-item';\n row.dataset.pin = String(pin.number);\n\n const num = document.createElement('span');\n num.className = 'beacon-pin-num';\n num.textContent = String(pin.number);\n\n const meta = document.createElement('div');\n meta.className = 'beacon-pin-meta';\n const sel = document.createElement('div');\n sel.className = 'beacon-pin-selector';\n sel.title = pin.selector;\n sel.textContent = pin.selector || pin.tagName;\n const noteInput = document.createElement('input');\n noteInput.type = 'text';\n noteInput.className = 'beacon-pin-note-input';\n noteInput.placeholder = 'Add a note (optional)';\n noteInput.value = pin.note ?? '';\n noteInput.addEventListener('input', () => {\n if (noteInput.value.trim()) pin.note = noteInput.value;\n else delete pin.note;\n });\n meta.appendChild(sel);\n meta.appendChild(noteInput);\n\n const del = document.createElement('button');\n del.type = 'button';\n del.className = 'beacon-icon-btn';\n del.setAttribute('aria-label', `Remove pin ${pin.number}`);\n del.appendChild(iconTrash());\n del.addEventListener('click', () => deletePin(pin.number));\n\n row.appendChild(num);\n row.appendChild(meta);\n row.appendChild(del);\n listEl.appendChild(row);\n }\n }\n\n function renderPreview() {\n if (!previewEl) return;\n if (cachedAnnotatedDataUrl) {\n previewEl.src = cachedAnnotatedDataUrl;\n previewEl.style.display = 'block';\n } else {\n previewEl.removeAttribute('src');\n previewEl.style.display = 'none';\n }\n }\n\n return {\n name: 'domEle',\n setupOnce(ctx) {\n // Reset interactive state when the drawer closes so a fresh open() starts\n // empty. Without this, pins from a previous session linger in the closure.\n const off = ctx.on('close', () => reset());\n return off;\n },\n form(ctx) {\n return {\n render: (slot) => {\n // \"Pins (N)\" header — only painted when there's at least one pin.\n headerEl = document.createElement('div');\n headerEl.className = 'beacon-pin-list-header';\n slot.appendChild(headerEl);\n\n // Pin list.\n listEl = document.createElement('div');\n listEl.className = 'beacon-pin-list';\n slot.appendChild(listEl);\n\n // Annotate / Add another pin button.\n btnEl = document.createElement('button');\n btnEl.type = 'button';\n btnEl.className = 'beacon-btn secondary beacon-pin-annotate';\n btnEl.addEventListener('click', () => { void enterAnnotateMode(ctx); });\n slot.appendChild(btnEl);\n\n // Preview <img>.\n previewEl = document.createElement('img');\n previewEl.className = 'beacon-thumb';\n previewEl.alt = 'Annotated screenshot preview';\n previewEl.style.display = 'none';\n slot.appendChild(previewEl);\n\n renderList();\n renderPreview();\n return () => { headerEl = null; listEl = null; previewEl = null; btnEl = null; };\n },\n };\n },\n capture() {\n if (pins.length === 0) return null;\n return { pins };\n },\n };\n}\n","// Public types for the launch-kit beacon. Exposed via @launchsecure/launch-kit/beacon.\n\nexport type Severity = 'bug' | 'idea' | 'ux' | 'a11y';\n\nexport type Position = 'bottom-right' | 'bottom-left' | 'hidden';\nexport type Theme = 'auto' | 'light' | 'dark';\n\nexport type HeadersConfig =\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>);\n\nexport type ContextConfig = () => Record<string, unknown>;\n\n// ── Payload (§6) ──────────────────────────────────────────\n\nexport interface PayloadMetadata {\n url: string;\n referrer?: string;\n userAgent: string;\n viewport: { w: number; h: number; dpr: number };\n screen: { w: number; h: number };\n timezone: string;\n locale: string;\n theme?: 'light' | 'dark';\n capturedAt: string;\n}\n\nexport interface PluginSuccessEntry {\n v: number;\n [k: string]: unknown;\n}\n\nexport interface PluginFailureEntry {\n error: string;\n stack?: string;\n}\n\nexport type PluginEntry = PluginSuccessEntry | PluginFailureEntry;\n\nexport interface FeedbackPayload {\n description: string;\n severity: Severity;\n metadata: PayloadMetadata;\n context?: Record<string, unknown>;\n plugins: Record<string, PluginEntry>;\n}\n\nexport function isPluginFailure(entry: PluginEntry | undefined): entry is PluginFailureEntry {\n return !!entry && typeof entry === 'object' && !('v' in entry) && 'error' in entry;\n}\n\n// ── Labels (i18n via init({ labels })) ──────────────────────────────────────────\n\nexport interface LabelMap {\n triggerButton: string;\n drawerTitle: string;\n closeButton: string;\n send: string;\n sending: string;\n sentSuccess: string;\n descriptionLabel: string;\n descriptionPlaceholder: string;\n severityLabel: string;\n severityBug: string;\n severityIdea: string;\n severityUx: string;\n severityA11y: string;\n}\n\n// ── Form fields (§4.2) ──────────────────────────────────────────\n\nexport interface BaseField<K extends string> {\n type: K;\n /** Per-plugin key in ctx.formValues. */\n name: string;\n label?: string;\n description?: string;\n}\n\nexport interface ToggleField extends BaseField<'toggle'> { defaultValue?: boolean }\nexport interface TextField extends BaseField<'text'> { defaultValue?: string; placeholder?: string }\nexport interface TextareaField extends BaseField<'textarea'> { defaultValue?: string; placeholder?: string; rows?: number }\nexport interface SelectField extends BaseField<'select'> { defaultValue?: string; options: Array<{ value: string; label?: string }> }\nexport interface RadioField extends BaseField<'radio'> { defaultValue?: string; options: Array<{ value: string; label?: string }> }\nexport interface NumberField extends BaseField<'number'> { defaultValue?: number; min?: number; max?: number; step?: number }\n\nexport type FormField =\n | ToggleField\n | TextField\n | TextareaField\n | SelectField\n | RadioField\n | NumberField;\n\nexport type DeclarativeForm = { title?: string; fields: FormField[] };\nexport type ImperativeForm = { title?: string; render: (slot: HTMLElement, ctx: BeaconCtx) => void | (() => void) };\n\n// ── Ctx (§5) ──────────────────────────────────────────\n\nexport type Mode = 'minimize' | 'hide' | 'pickElement';\n\nexport interface BeaconLifecycleEvent {\n payload?: FeedbackPayload;\n response?: TransportResponse;\n cancel?: (reason: string) => void;\n}\n\nexport interface BeaconCtx {\n readonly pluginName: string;\n captured(name: string): PluginEntry | undefined;\n readonly formValues: Record<string, unknown>;\n requestMode(mode: Mode): Promise<() => void>;\n overlay(opts: { render: (slot: HTMLElement) => void | (() => void) }): () => void;\n on(\n ev: 'open' | 'close' | 'beforeSubmit' | 'afterSubmit',\n handler: (e: BeaconLifecycleEvent) => void,\n ): () => void;\n readonly signal: AbortSignal;\n captureSignal(): AbortSignal | undefined;\n}\n\n// ── Plugins (§4) ──────────────────────────────────────────\n\nexport interface BeaconPlugin {\n name: string;\n version?: number;\n setupOnce?(ctx: BeaconCtx): void | (() => void);\n form?(ctx: BeaconCtx): DeclarativeForm | ImperativeForm;\n capture?(ctx: BeaconCtx): unknown | Promise<unknown>;\n}\n\n// ── Init / system events (§3, §10) ──────────────────────────────────────────\n\nexport interface InitOptions {\n endpoint: string;\n headers?: HeadersConfig;\n context?: ContextConfig;\n /** fetch credentials mode. Default 'omit' per §9 (safe for cross-origin\n * consumers); same-origin apps that gate the endpoint behind cookie auth\n * should pass 'same-origin'. */\n credentials?: RequestCredentials;\n plugins?: BeaconPlugin[];\n defaultPlugins?: boolean;\n position?: Position;\n theme?: Theme;\n labels?: Partial<LabelMap>;\n debug?: boolean;\n healthIndicator?: 'never' | 'dev' | 'always';\n}\n\nexport interface PluginStatus {\n state: 'active' | 'failed';\n failures: number;\n error?: { message: string; stack?: string; at: 'setupOnce' | 'capture' | 'form' };\n}\n\nexport interface BeaconStatus {\n ready: boolean;\n transport: 'ok' | 'error' | 'idle';\n plugins: Record<string, PluginStatus>;\n}\n\nexport type SystemEvent = 'plugin:error' | 'submit:success' | 'submit:error' | 'ready';\n\nexport interface PluginErrorEvent { plugin: string; error: Error; at: 'setupOnce' | 'capture' | 'form' }\nexport interface SubmitSuccessEvent { payload: FeedbackPayload; response: TransportResponse }\nexport interface SubmitErrorEvent { payload: FeedbackPayload; error: Error }\nexport interface ReadyEvent { ready: true }\n\nexport type SystemEventPayload<E extends SystemEvent> =\n E extends 'plugin:error' ? PluginErrorEvent :\n E extends 'submit:success' ? SubmitSuccessEvent :\n E extends 'submit:error' ? SubmitErrorEvent :\n E extends 'ready' ? ReadyEvent :\n never;\n\n// ── Transport ──────────────────────────────────────────\n\nexport interface TransportResponse {\n ok: boolean;\n status: number;\n body: unknown;\n}\n","// domSS plugin — viewport screenshot. Composes with domEle in two ways:\n// 1. If domEle's interactive annotate flow already drew an annotated\n// screenshot, we reuse that exact buffer (so the user-visible preview\n// matches what the server receives, byte-for-byte).\n// 2. Otherwise (pins-less submit, or annotate session never ran), capture\n// a fresh screenshot at submit time using `requestMode('hide')` to keep\n// the dialog chrome out of the snapshot.\n\nimport { drawMarkers, type PinMarker } from '../internal/markers';\nimport { captureScreenshot } from '../internal/screenshot';\nimport { getAnnotationCache } from '../internal/annotation-cache';\nimport type { BeaconPlugin, PluginEntry } from '../types';\nimport { isPluginFailure } from '../types';\n\nexport interface DomSSOptions {\n quality?: number;\n pixelRatio?: number;\n accent?: string;\n}\n\nexport function domSS(opts: DomSSOptions = {}): BeaconPlugin {\n return {\n name: 'domSS',\n async capture(ctx) {\n // Fast path: reuse the cached annotated screenshot if domEle already\n // produced one during the interactive annotate session.\n const cached = getAnnotationCache();\n if (cached) {\n return { dataUrl: cached.dataUrl, mime: cached.mime };\n }\n\n const release = await ctx.requestMode('hide');\n try {\n // Yield one frame so the dialog-hide actually paints before\n // html-to-image walks the DOM — otherwise the open dialog can briefly\n // render into the snapshot.\n await new Promise<void>((r) => requestAnimationFrame(() => r()));\n\n const beaconHosts = Array.from(document.querySelectorAll('launch-kit-beacon')) as Element[];\n const dataUrl = await captureScreenshot({\n quality: opts.quality,\n pixelRatio: opts.pixelRatio,\n excludeHosts: beaconHosts,\n });\n\n // If domEle has pins but didn't pre-cache (rare — error during pre-capture),\n // draw markers on the fresh screenshot.\n const domEleEntry = ctx.captured('domEle');\n const pins = readPinsFromEntry(domEleEntry);\n const viewport = {\n w: window.innerWidth,\n h: window.innerHeight,\n dpr: window.devicePixelRatio || 1,\n };\n const accent = opts.accent ?? readAccent();\n const final = pins.length > 0\n ? await drawMarkers(dataUrl, pins, viewport, accent)\n : dataUrl;\n\n return { dataUrl: final, mime: 'image/jpeg' };\n } finally {\n release();\n }\n },\n };\n}\n\nfunction readPinsFromEntry(entry: PluginEntry | undefined): PinMarker[] {\n if (!entry || isPluginFailure(entry)) return [];\n const pinsRaw = (entry as { pins?: unknown }).pins;\n if (!Array.isArray(pinsRaw)) return [];\n return pinsRaw\n .filter((p): p is Record<string, unknown> => !!p && typeof p === 'object')\n .map((p) => ({\n number: Number(p.number) || 0,\n selector: typeof p.selector === 'string' ? p.selector : undefined,\n boundingRect: (p.boundingRect as PinMarker['boundingRect']) ?? { x: 0, y: 0, w: 0, h: 0 },\n }));\n}\n\nfunction readAccent(): string {\n if (typeof window === 'undefined') return '#0ea5e9';\n const host = document.querySelector('launch-kit-beacon');\n if (!host) return '#0ea5e9';\n const v = getComputedStyle(host).getPropertyValue('--beacon-accent').trim();\n return v || '#0ea5e9';\n}\n","// Body-portal overlay shown while a monitor session is recording. Two parts:\n// 1. Full-viewport dashed frame with soft inset glow — ambient \"you are being\n// recorded\" signal that survives drawer close.\n// 2. Draggable chip with REC dot, elapsed timer, URL, and Stop button.\n//\n// Body-portal (not the beacon Shadow DOM overlay layer) for the same reason as\n// pick-mode-overlay: position:fixed children of transformed/filtered/contained\n// ancestors get anchored to that ancestor instead of the viewport. The shadow\n// root sits inside the host's layout tree; the body does not.\n//\n// Styles ship via beaconStyles which ensureBeaconBodyStyles() injects into\n// document.head — see styles.ts for the class definitions.\n\nconst NO_CAPTURE_CLASS = 'beacon-no-capture';\nconst POS_STORAGE_KEY = '__lsBeaconMonitorChipPos';\nconst DEFAULT_ACCENT = '#10b981';\n\nexport interface MonitorOverlayOptions {\n /** Frame + chip accent. Falls back to emerald (--beacon-monitor-accent default). */\n accent?: string;\n /** Called when the chip's Stop button is clicked. Owner wires to session.stop(). */\n onStop: () => void;\n /** ms-epoch start time for the elapsed timer. Defaults to Date.now() at create. */\n startedAt?: number;\n /** Initial URL to show in the chip's secondary line. */\n url?: string | null;\n}\n\nexport interface MonitorOverlay {\n updateUrl(url: string | null): void;\n destroy(): void;\n}\n\nexport function createMonitorOverlay(opts: MonitorOverlayOptions): MonitorOverlay {\n const accent = opts.accent ?? DEFAULT_ACCENT;\n const startedAt = opts.startedAt ?? Date.now();\n\n // ── Frame ─────────────────────────────────────────────────────────────\n const frame = document.createElement('div');\n frame.className = `${NO_CAPTURE_CLASS} beacon-monitor-overlay-frame`;\n frame.setAttribute('aria-hidden', 'true');\n frame.style.setProperty('--beacon-monitor-accent', accent);\n document.body.appendChild(frame);\n\n // ── Chip ──────────────────────────────────────────────────────────────\n const chip = document.createElement('div');\n chip.className = `${NO_CAPTURE_CLASS} beacon-monitor-overlay-chip`;\n chip.setAttribute('role', 'status');\n chip.setAttribute('aria-label', 'Recording — drag to move');\n chip.style.setProperty('--beacon-monitor-accent', accent);\n\n const row = document.createElement('div');\n row.className = 'beacon-monitor-overlay-chip-row';\n\n const recDot = document.createElement('span');\n recDot.className = 'beacon-monitor-overlay-rec-dot';\n recDot.setAttribute('aria-hidden', 'true');\n\n const recLabel = document.createElement('span');\n recLabel.className = 'beacon-monitor-overlay-rec-label';\n recLabel.textContent = 'REC';\n\n const sep = document.createElement('span');\n sep.className = 'beacon-monitor-overlay-sep';\n sep.setAttribute('aria-hidden', 'true');\n sep.textContent = '·';\n\n const timer = document.createElement('span');\n timer.className = 'beacon-monitor-overlay-timer';\n timer.textContent = '00:00';\n\n const stopBtn = document.createElement('button');\n stopBtn.type = 'button';\n stopBtn.className = 'beacon-monitor-overlay-stop';\n stopBtn.textContent = 'Stop';\n stopBtn.setAttribute('aria-label', 'Stop monitoring');\n\n row.appendChild(recDot);\n row.appendChild(recLabel);\n row.appendChild(sep);\n row.appendChild(timer);\n row.appendChild(stopBtn);\n chip.appendChild(row);\n\n const urlEl = document.createElement('div');\n urlEl.className = 'beacon-monitor-overlay-url';\n if (opts.url) {\n urlEl.textContent = opts.url;\n urlEl.title = opts.url;\n } else {\n urlEl.style.display = 'none';\n }\n chip.appendChild(urlEl);\n\n document.body.appendChild(chip);\n\n // ── Position ──────────────────────────────────────────────────────────\n // Read AFTER appending so getBoundingClientRect() returns real dimensions\n // for the clamp.\n const initial = readSavedPos() ?? defaultPos();\n applyPos(clamp(initial));\n\n function readSavedPos(): { x: number; y: number } | null {\n try {\n const raw = localStorage.getItem(POS_STORAGE_KEY);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { x?: unknown; y?: unknown };\n const x = typeof parsed.x === 'number' ? parsed.x : NaN;\n const y = typeof parsed.y === 'number' ? parsed.y : NaN;\n if (!Number.isFinite(x) || !Number.isFinite(y)) return null;\n return { x, y };\n } catch {\n return null;\n }\n }\n\n function defaultPos(): { x: number; y: number } {\n const rect = chip.getBoundingClientRect();\n const w = rect.width || 200;\n return { x: Math.max(8, Math.floor((window.innerWidth - w) / 2)), y: 16 };\n }\n\n function clamp(pos: { x: number; y: number }): { x: number; y: number } {\n const margin = 8;\n const rect = chip.getBoundingClientRect();\n const w = rect.width || 200;\n const h = rect.height || 40;\n const maxX = Math.max(margin, window.innerWidth - w - margin);\n const maxY = Math.max(margin, window.innerHeight - h - margin);\n return {\n x: Math.min(Math.max(margin, pos.x), maxX),\n y: Math.min(Math.max(margin, pos.y), maxY),\n };\n }\n\n function applyPos(pos: { x: number; y: number }): void {\n chip.style.left = `${pos.x}px`;\n chip.style.top = `${pos.y}px`;\n }\n\n // ── Drag ──────────────────────────────────────────────────────────────\n let dragging = false;\n let activePointerId: number | null = null;\n let grabOffset = { x: 0, y: 0 };\n\n function onPointerDown(e: PointerEvent): void {\n // Skip the Stop button so its click reaches its own listener.\n if (e.target instanceof Element && e.target.closest('.beacon-monitor-overlay-stop')) return;\n e.preventDefault();\n dragging = true;\n activePointerId = e.pointerId;\n try { chip.setPointerCapture(e.pointerId); } catch { /* swallow */ }\n chip.setAttribute('data-dragging', 'true');\n const rect = chip.getBoundingClientRect();\n grabOffset = { x: e.clientX - rect.left, y: e.clientY - rect.top };\n }\n\n function onPointerMove(e: PointerEvent): void {\n if (!dragging || e.pointerId !== activePointerId) return;\n applyPos(clamp({ x: e.clientX - grabOffset.x, y: e.clientY - grabOffset.y }));\n }\n\n function endDrag(e: PointerEvent): void {\n if (!dragging || e.pointerId !== activePointerId) return;\n dragging = false;\n activePointerId = null;\n chip.removeAttribute('data-dragging');\n try { chip.releasePointerCapture(e.pointerId); } catch { /* swallow */ }\n // Persist on release only — saving on every pointermove would hammer storage.\n const rect = chip.getBoundingClientRect();\n try {\n localStorage.setItem(POS_STORAGE_KEY, JSON.stringify({ x: rect.left, y: rect.top }));\n } catch {\n /* swallow — storage disabled (Safari private mode) */\n }\n }\n\n chip.addEventListener('pointerdown', onPointerDown);\n chip.addEventListener('pointermove', onPointerMove);\n chip.addEventListener('pointerup', endDrag);\n chip.addEventListener('pointercancel', endDrag);\n\n // Stop button — attached AFTER drag handlers so the closest('.stop') check in\n // onPointerDown short-circuits before this fires.\n stopBtn.addEventListener('click', (e) => {\n e.stopPropagation();\n opts.onStop();\n });\n\n // ── Reposition on viewport resize ─────────────────────────────────────\n function onResize(): void {\n const rect = chip.getBoundingClientRect();\n applyPos(clamp({ x: rect.left, y: rect.top }));\n }\n window.addEventListener('resize', onResize);\n\n // ── Timer ─────────────────────────────────────────────────────────────\n function tick(): void {\n const elapsed = Math.max(0, Math.floor((Date.now() - startedAt) / 1000));\n timer.textContent = formatElapsed(elapsed);\n }\n tick();\n const timerId = window.setInterval(tick, 1000);\n\n return {\n updateUrl(url) {\n if (url) {\n urlEl.textContent = url;\n urlEl.title = url;\n urlEl.style.display = '';\n } else {\n urlEl.style.display = 'none';\n }\n },\n destroy() {\n window.clearInterval(timerId);\n window.removeEventListener('resize', onResize);\n chip.removeEventListener('pointerdown', onPointerDown);\n chip.removeEventListener('pointermove', onPointerMove);\n chip.removeEventListener('pointerup', endDrag);\n chip.removeEventListener('pointercancel', endDrag);\n frame.remove();\n chip.remove();\n },\n };\n}\n\nfunction formatElapsed(seconds: number): string {\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = seconds % 60;\n if (h > 0) return `${pad(h)}:${pad(m)}:${pad(s)}`;\n return `${pad(m)}:${pad(s)}`;\n}\n\nfunction pad(n: number): string {\n return n < 10 ? `0${n}` : String(n);\n}\n","// DOM-level capture for monitor mode: clicks, route changes, dialog mounts.\n//\n// Click capture is the differentiating signal. The recurring shape we debug is\n// \"user clicked X, nothing happened (or the wrong thing happened).\" A bare\n// click event tells you the target, but the *interesting* info is usually\n// further up: overlays sitting at the click coords, body pointer-events\n// disabled, open Radix dialogs intercepting via DismissableLayer. We snapshot\n// all of that on every click.\n//\n// We listen capture-phase + passive so we see the event even if a downstream\n// handler calls stopPropagation(); we never preventDefault — capture is\n// observational.\n\nimport type {\n MonitorClickEvent,\n MonitorClickTarget,\n MonitorDialogEvent,\n MonitorOverlayInfo,\n MonitorRouteEvent,\n MonitorSubmitEvent,\n MonitorSubmitField,\n} from './wire';\n\ntype Emit<E> = (event: Omit<E, 'ts' | 'sessionId' | 'seq'>) => void;\n\nexport interface DomCaptureCallbacks {\n emitClick: Emit<MonitorClickEvent>;\n emitRoute: Emit<MonitorRouteEvent>;\n emitDialog: Emit<MonitorDialogEvent>;\n emitSubmit: Emit<MonitorSubmitEvent>;\n}\n\nconst TEXT_LIMIT = 80;\nconst INTERACTIVE_SELECTOR = 'button, a, input[type=\"submit\"], input[type=\"button\"], [role=\"button\"], [role=\"link\"], [role=\"menuitem\"], [role=\"tab\"], [role=\"option\"]';\n\nexport interface DomCaptureInstallation {\n uninstall(): void;\n}\n\nconst HTML_LIMIT = 1024;\nconst MAX_OVERLAYS = 5;\n\nfunction truncate(s: string, n: number): string {\n return s.length > n ? s.slice(0, n) : s;\n}\n\n/**\n * Build a stable CSS selector for an element. Prefer #id, then tag.class.class,\n * walking up at most 5 levels. Not guaranteed unique but good enough for\n * \"the developer looking at the stream can find this element.\"\n */\nfunction buildSelector(el: Element): string {\n if (el.id) return `#${CSS.escape(el.id)}`;\n const parts: string[] = [];\n let cur: Element | null = el;\n for (let i = 0; i < 5 && cur; i++) {\n const tag = cur.tagName.toLowerCase();\n const id = cur.id ? `#${CSS.escape(cur.id)}` : '';\n const cls = cur.classList.length > 0\n ? '.' + Array.from(cur.classList).slice(0, 3).map(CSS.escape).join('.')\n : '';\n parts.unshift(`${tag}${id}${cls}`);\n if (id) break; // id is unique-enough; stop walking\n cur = cur.parentElement;\n }\n return parts.join(' > ');\n}\n\nfunction truncText(s: string | null | undefined, n: number): string | undefined {\n if (!s) return undefined;\n const trimmed = s.replace(/\\s+/g, ' ').trim();\n if (!trimmed) return undefined;\n return trimmed.length > n ? trimmed.slice(0, n) : trimmed;\n}\n\nfunction describeTarget(el: Element): MonitorClickTarget {\n const text = truncText(el.textContent, TEXT_LIMIT);\n const ariaLabel = truncText(el.getAttribute('aria-label'), TEXT_LIMIT);\n const testid = el.getAttribute('data-testid') || undefined;\n const name = el.getAttribute('name') || undefined;\n\n // Derived human label — pick the most informative thing we can find.\n // Falls back to the nearest interactive ancestor when the literal target\n // (e.g. an <svg> inside a <button>) has nothing useful on it directly.\n let label: string | undefined = ariaLabel || text;\n if (!label) {\n const ancestor = el.closest(INTERACTIVE_SELECTOR);\n if (ancestor && ancestor !== el) {\n label = truncText(ancestor.getAttribute('aria-label'), TEXT_LIMIT)\n || truncText(ancestor.textContent, TEXT_LIMIT);\n }\n }\n\n return {\n tag: el.tagName.toLowerCase(),\n id: el.id || null,\n classes: Array.from(el.classList).slice(0, 10),\n role: el.getAttribute('role'),\n selector: buildSelector(el),\n ...(text ? { text } : {}),\n ...(ariaLabel ? { ariaLabel } : {}),\n ...(testid ? { testid } : {}),\n ...(name ? { name } : {}),\n // Only include label when it adds something beyond `text` (avoids dup).\n ...(label && label !== text ? { label } : {}),\n };\n}\n\n/**\n * Snapshot the overlay stack at a point. Walks all fixed/sticky candidates and\n * keeps those covering the click. Returns the top N by z-index.\n *\n * querySelectorAll('body *') is expensive on large DOMs (10k+ nodes); we only\n * do this while monitor is on, and only on click. The cost is acceptable\n * because the whole point of monitor is to debug click-through bugs.\n */\nfunction overlaysAtPoint(x: number, y: number): MonitorOverlayInfo[] {\n const candidates: MonitorOverlayInfo[] = [];\n const all = document.querySelectorAll<HTMLElement>('body *');\n for (const el of Array.from(all)) {\n const cs = getComputedStyle(el);\n if (cs.position !== 'fixed' && cs.position !== 'sticky') continue;\n const rect = el.getBoundingClientRect();\n if (x < rect.left || x > rect.right || y < rect.top || y > rect.bottom) continue;\n const z = parseInt(cs.zIndex, 10);\n if (!Number.isFinite(z) && cs.zIndex !== 'auto') continue;\n candidates.push({\n tag: el.tagName.toLowerCase(),\n zIndex: Number.isFinite(z) ? z : 0,\n pointerEvents: cs.pointerEvents,\n classes: Array.from(el.classList).slice(0, 5).join(' '),\n });\n }\n return candidates\n .sort((a, b) => b.zIndex - a.zIndex)\n .slice(0, MAX_OVERLAYS);\n}\n\n/**\n * Click + mousedown capture. Both kinds fire because they expose different\n * things — mousedown is what Radix DismissableLayer listens to for\n * outside-click dismissal; click is what navigation hangs off of.\n */\nfunction installClickCapture(cb: DomCaptureCallbacks): () => void {\n const handle = (kind: 'click' | 'mousedown') => (e: Event): void => {\n const me = e as MouseEvent;\n const target = me.target;\n if (!(target instanceof Element)) return;\n\n const x = me.clientX;\n const y = me.clientY;\n // elementFromPoint may differ from target if an overlay sits above —\n // that mismatch is itself diagnostic (\"the element you wanted is being\n // occluded by X\"). Compare and surface.\n const hit = document.elementFromPoint(x, y);\n const hitMatches = hit === target || (hit ? target.contains(hit) || hit.contains(target) : false);\n\n const openDialogs = document.querySelectorAll('[role=\"dialog\"][data-state=\"open\"]').length;\n const bodyPe = getComputedStyle(document.body).pointerEvents;\n // overlaysAtPoint walks every fixed/sticky element under <body> + calls\n // getComputedStyle on each — measurable cost on 5k+ DOMs. Only run it when\n // the click was intercepted, since that's the only case where the overlay\n // stack is the diagnostic answer. Happy-path clicks skip the walk entirely.\n const overlays = hitMatches ? [] : overlaysAtPoint(x, y);\n\n cb.emitClick({\n kind,\n target: describeTarget(target),\n hitMatchesTarget: hitMatches,\n ...(!hitMatches && hit instanceof Element ? { hitTarget: describeTarget(hit) } : {}),\n coords: { x, y },\n openDialogs,\n bodyPointerEvents: bodyPe,\n ...(overlays.length > 0 ? { overlaysAtPoint: overlays } : {}),\n });\n };\n\n const onClick = handle('click');\n const onMouseDown = handle('mousedown');\n // Capture-phase + passive — see the event even when a downstream handler\n // calls stopPropagation/stopImmediatePropagation.\n document.addEventListener('click', onClick, { capture: true, passive: true });\n document.addEventListener('mousedown', onMouseDown, { capture: true, passive: true });\n\n return () => {\n document.removeEventListener('click', onClick, { capture: true });\n document.removeEventListener('mousedown', onMouseDown, { capture: true });\n };\n}\n\n/**\n * SPA route capture. pushState/replaceState don't fire any event; we\n * monkey-patch to emit. popstate + hashchange are real events.\n */\nfunction installRouteCapture(cb: DomCaptureCallbacks): () => void {\n const originalPush = history.pushState;\n const originalReplace = history.replaceState;\n let lastUrl = window.location.href;\n\n const emit = (via: MonitorRouteEvent['via']): void => {\n const to = window.location.href;\n if (to === lastUrl) return;\n const from = lastUrl;\n lastUrl = to;\n cb.emitRoute({ kind: 'route', from, to, via });\n };\n\n history.pushState = function patchedPushState(...args: Parameters<typeof history.pushState>) {\n const ret = originalPush.apply(this, args);\n emit('pushState');\n return ret;\n };\n history.replaceState = function patchedReplaceState(...args: Parameters<typeof history.replaceState>) {\n const ret = originalReplace.apply(this, args);\n emit('replaceState');\n return ret;\n };\n\n const onPop = (): void => emit('popstate');\n const onHash = (): void => emit('hashchange');\n window.addEventListener('popstate', onPop);\n window.addEventListener('hashchange', onHash);\n\n return () => {\n history.pushState = originalPush;\n history.replaceState = originalReplace;\n window.removeEventListener('popstate', onPop);\n window.removeEventListener('hashchange', onHash);\n };\n}\n\n/**\n * Watch [role=\"dialog\"] subtree changes. Mount + unmount drive most modal bugs\n * (Radix dismissable, stuck overlay, focus trap). We also watch data-state\n * changes for \"dialog visibly closed but kept its element / outside-click\n * handler\" cases.\n */\nfunction installDialogCapture(cb: DomCaptureCallbacks): () => void {\n const seen = new WeakSet<Element>();\n\n const handle = (el: Element, action: 'mount' | 'unmount' | 'state'): void => {\n const selector = buildSelector(el);\n cb.emitDialog({\n kind: 'dialog',\n action,\n selector,\n state: el.getAttribute('data-state'),\n ...(action === 'mount' ? { outerHTML: truncate(el.outerHTML, HTML_LIMIT) } : {}),\n });\n };\n\n // Seed with already-mounted dialogs so we get unmount events when they later\n // disappear.\n for (const el of Array.from(document.querySelectorAll('[role=\"dialog\"]'))) {\n seen.add(el);\n }\n\n const obs = new MutationObserver((mutations) => {\n for (const m of mutations) {\n for (const node of Array.from(m.addedNodes)) {\n if (!(node instanceof Element)) continue;\n const dialogs = node.matches?.('[role=\"dialog\"]')\n ? [node]\n : Array.from(node.querySelectorAll?.('[role=\"dialog\"]') ?? []);\n for (const d of dialogs) {\n if (seen.has(d)) continue;\n seen.add(d);\n handle(d, 'mount');\n }\n }\n for (const node of Array.from(m.removedNodes)) {\n if (!(node instanceof Element)) continue;\n const dialogs = node.matches?.('[role=\"dialog\"]')\n ? [node]\n : Array.from(node.querySelectorAll?.('[role=\"dialog\"]') ?? []);\n for (const d of dialogs) {\n if (!seen.has(d)) continue;\n seen.delete(d);\n handle(d, 'unmount');\n }\n }\n if (m.type === 'attributes' && m.attributeName === 'data-state' && m.target instanceof Element) {\n if (m.target.getAttribute('role') === 'dialog') handle(m.target, 'state');\n }\n }\n });\n obs.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['data-state'],\n });\n\n return () => obs.disconnect();\n}\n\n/**\n * Form submit capture. Emits one event per submitted form with a field-name\n * summary — values are NEVER captured (PII risk). hasValue is the only signal\n * about whether each field was filled. Listens capture-phase so we see\n * submissions even when a handler later calls preventDefault.\n */\nfunction installSubmitCapture(cb: DomCaptureCallbacks): () => void {\n const handler = (e: Event): void => {\n const form = e.target;\n if (!(form instanceof HTMLFormElement)) return;\n const fields: MonitorSubmitField[] = [];\n for (const el of Array.from(form.elements)) {\n if (!(el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLSelectElement)) continue;\n const name = el.getAttribute('name') || '<unnamed>';\n const type = el instanceof HTMLInputElement ? el.type : el.tagName.toLowerCase();\n // hasValue: a non-empty string for text-like inputs; checked for checkboxes/radios.\n let hasValue: boolean;\n if (el instanceof HTMLInputElement && (el.type === 'checkbox' || el.type === 'radio')) {\n hasValue = el.checked;\n } else {\n hasValue = !!(el as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value;\n }\n fields.push({ name, type, hasValue });\n }\n cb.emitSubmit({\n kind: 'submit',\n form: {\n id: form.id || null,\n action: form.getAttribute('action') || null,\n method: (form.getAttribute('method') || 'GET').toUpperCase(),\n selector: buildSelector(form),\n fields,\n },\n });\n };\n document.addEventListener('submit', handler, { capture: true });\n return () => document.removeEventListener('submit', handler, { capture: true });\n}\n\nexport function installDomCapture(cb: DomCaptureCallbacks): DomCaptureInstallation {\n const undoClick = installClickCapture(cb);\n const undoRoute = installRouteCapture(cb);\n const undoDialog = installDialogCapture(cb);\n const undoSubmit = installSubmitCapture(cb);\n return {\n uninstall() {\n undoClick();\n undoRoute();\n undoDialog();\n undoSubmit();\n },\n };\n}\n","// Capture fetch + XMLHttpRequest activity for monitor mode.\n//\n// Default policy: emit only failed requests (status >= 400 OR threw).\n// Successful requests are silently skipped — capturing every successful API\n// call drowns the signal. verbose:true (passed in via start()) captures\n// everything.\n//\n// Body capture (for agent-driven debugging via MCP):\n// • Request body — captured for POST/PUT/PATCH/DELETE so the AI reading the\n// NDJSON sees what was attempted. Skipped for GET (no body) and HEAD.\n// • Response body — captured for failures (status >= 400) always; for 2xx\n// only in verbose mode.\n// • Both capped at 10KB; longer bodies are truncated with a flag.\n// • Both redacted: Authorization-style bearers, ls_pat_ PATs, JWT-shaped\n// strings → [REDACTED]. For JSON payloads, top-level keys matching\n// password/secret/token/apiKey/etc. have their values replaced wholesale.\n// • Authorization header value is NEVER captured — only its presence\n// (`request.hasAuth: true`) so the agent can tell auth was attached.\n\nimport type {\n MonitorBodyCapture,\n MonitorNetworkEvent,\n MonitorRequestCapture,\n} from './wire';\n\ntype Emit = (event: Omit<MonitorNetworkEvent, 'ts' | 'sessionId' | 'seq'>) => void;\n\nexport interface NetworkCaptureOptions {\n emit: Emit;\n verbose: boolean;\n}\n\nexport interface NetworkCaptureInstallation {\n uninstall(): void;\n}\n\nconst URL_LIMIT = 1000;\nconst BODY_LIMIT = 10 * 1024; // 10KB cap per body\nconst REDACTED = '[REDACTED]';\nconst MUTATING_METHODS = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);\n\n// Secret-shaped strings — redacted wherever they appear in a body\nconst SECRET_PATTERNS: RegExp[] = [\n /Bearer\\s+[A-Za-z0-9._\\-+/=]+/gi,\n /\\bls_pat_[A-Za-z0-9_]+/g,\n // JWT: three dot-separated base64url segments starting with eyJ (the b64\n // encoding of the JSON {\"). Matches Auth0/Clerk/most providers' tokens.\n /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\b/g,\n];\n\n// JSON keys whose values get wholesale-redacted regardless of value shape\nconst SENSITIVE_KEYS = /^(password|passwd|secret|token|api[_-]?key|auth|access[_-]?token|refresh[_-]?token|client[_-]?secret|private[_-]?key)$/i;\n\nfunction trunc(s: string, n: number): string {\n return s.length > n ? s.slice(0, n) : s;\n}\n\nfunction redactString(s: string): string {\n let out = s;\n for (const re of SECRET_PATTERNS) {\n out = out.replace(re, REDACTED);\n }\n return out;\n}\n\nfunction redactJsonInPlace(value: unknown): unknown {\n if (value === null || typeof value !== 'object') {\n if (typeof value === 'string') return redactString(value);\n return value;\n }\n if (Array.isArray(value)) return value.map(redactJsonInPlace);\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[k] = SENSITIVE_KEYS.test(k) ? REDACTED : redactJsonInPlace(v);\n }\n return out;\n}\n\nfunction redactBody(text: string, contentType: string | undefined): string {\n if (contentType && contentType.includes('application/json')) {\n try {\n const parsed = JSON.parse(text);\n return JSON.stringify(redactJsonInPlace(parsed));\n } catch {\n // Fall through to regex-only — JSON parse failed (malformed or not JSON).\n }\n }\n return redactString(text);\n}\n\n/** Apply redaction + size cap. Returns the wire-shaped capture object. */\nfunction captureBody(text: string, contentType: string | undefined): MonitorBodyCapture {\n const original = text.length;\n const cap: MonitorBodyCapture = { bodySize: original };\n if (original > BODY_LIMIT) {\n cap.body = redactBody(text.slice(0, BODY_LIMIT), contentType);\n cap.bodyTruncated = true;\n } else {\n cap.body = redactBody(text, contentType);\n }\n if (contentType) cap.contentType = contentType;\n return cap;\n}\n\n/** Read init.body or input.body as text, best-effort. Returns null if unreadable. */\nfunction readRequestBody(input: RequestInfo | URL, init: RequestInit | undefined): string | null {\n const body = init?.body;\n if (body != null) {\n if (typeof body === 'string') return body;\n if (body instanceof URLSearchParams) return body.toString();\n if (body instanceof FormData) {\n // Don't capture values (PII risk); summarize field names + value sizes.\n const fields: string[] = [];\n body.forEach((v, k) => {\n fields.push(`${k}=${typeof v === 'string' ? `[${v.length}b]` : '[file]'}`);\n });\n return `[FormData] ${fields.join('&')}`;\n }\n if (body instanceof Blob) return `[Blob ${body.size}b ${body.type || 'unknown'}]`;\n if (body instanceof ArrayBuffer) return `[binary ${body.byteLength}b]`;\n if (ArrayBuffer.isView(body)) return `[binary ${(body as ArrayBufferView).byteLength}b]`;\n // ReadableStream — can't read without tee()-ing and risking caller breakage. Skip.\n return null;\n }\n // Body might be on a Request object passed as input.\n if (input instanceof Request) {\n // Can't synchronously read; cloning + reading is async. Skip in the request\n // path — the caller of fetch typically passes init.body anyway.\n return null;\n }\n return null;\n}\n\n/** Check whether an Authorization header is attached. Value is never read. */\nfunction detectAuth(input: RequestInfo | URL, init: RequestInit | undefined): boolean {\n const checkHeaders = (h: HeadersInit | undefined): boolean => {\n if (!h) return false;\n if (h instanceof Headers) return h.has('authorization');\n if (Array.isArray(h)) return h.some(([k]) => k.toLowerCase() === 'authorization');\n if (typeof h === 'object') return Object.keys(h).some((k) => k.toLowerCase() === 'authorization');\n return false;\n };\n if (checkHeaders(init?.headers)) return true;\n if (input instanceof Request && input.headers.has('authorization')) return true;\n return false;\n}\n\nfunction getRequestContentType(input: RequestInfo | URL, init: RequestInit | undefined): string | undefined {\n const fromHeaders = (h: HeadersInit | undefined): string | undefined => {\n if (!h) return undefined;\n if (h instanceof Headers) return h.get('content-type') || undefined;\n if (Array.isArray(h)) {\n const e = h.find(([k]) => k.toLowerCase() === 'content-type');\n return e ? e[1] : undefined;\n }\n if (typeof h === 'object') {\n for (const [k, v] of Object.entries(h)) {\n if (k.toLowerCase() === 'content-type') return v;\n }\n }\n return undefined;\n };\n return fromHeaders(init?.headers) ?? (input instanceof Request ? input.headers.get('content-type') || undefined : undefined);\n}\n\nfunction buildRequestCapture(\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n method: string,\n): MonitorRequestCapture | undefined {\n if (!MUTATING_METHODS.has(method)) return undefined;\n const hasAuth = detectAuth(input, init);\n const bodyText = readRequestBody(input, init);\n if (bodyText == null && !hasAuth) return undefined;\n const contentType = getRequestContentType(input, init);\n const capture: MonitorRequestCapture = bodyText != null\n ? captureBody(bodyText, contentType)\n : {};\n if (hasAuth) capture.hasAuth = true;\n return capture;\n}\n\n/**\n * Wrap window.fetch. Captures method, URL, status, duration, and whether the\n * call failed. Restores the original on uninstall — but only if we're still\n * the outermost wrapper.\n *\n * We wrap (rather than PerformanceObserver) because we need the *URL the\n * developer wrote*, not the resolved one, and because PerformanceObserver\n * doesn't tell us whether the response was an error.\n */\nfunction wrapFetch(opts: NetworkCaptureOptions): () => void {\n const original = window.fetch;\n if (typeof original !== 'function') return () => { /* nothing to restore */ };\n\n const wrapped: typeof fetch = async (\n input: RequestInfo | URL,\n init?: RequestInit,\n ): Promise<Response> => {\n const start = performance.now();\n const method = (init?.method ?? (input instanceof Request ? input.method : 'GET')).toUpperCase();\n const url =\n typeof input === 'string'\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n\n // Snapshot the request BEFORE awaiting — init.body may be consumed by the\n // call (it's typically a string for JSON APIs, but defensively read first).\n const request = buildRequestCapture(input, init, method);\n\n try {\n // Call bound to window so fetch's internal `this`-dependent paths still\n // work. Passing globalThis explicitly is the spec-correct way to invoke\n // a free-standing fetch.\n const res = await original.call(window, input as RequestInfo, init);\n const durationMs = Math.round(performance.now() - start);\n const failed = res.status >= 400;\n\n // Capture response body for failures always; 2xx only in verbose mode.\n // Read from a clone so the caller still gets an unconsumed Response.\n let response: MonitorBodyCapture | undefined;\n if (failed || opts.verbose) {\n try {\n const text = await res.clone().text();\n const ct = res.headers.get('content-type') || undefined;\n response = captureBody(text, ct);\n } catch {\n // Body unreadable (already consumed, network error mid-read) — skip.\n }\n }\n\n if (failed || opts.verbose) {\n opts.emit({\n kind: 'fetch',\n url: trunc(url, URL_LIMIT),\n method,\n status: res.status,\n durationMs,\n failed,\n ...(request ? { request } : {}),\n ...(response ? { response } : {}),\n });\n }\n return res;\n } catch (err) {\n const durationMs = Math.round(performance.now() - start);\n opts.emit({\n kind: 'fetch',\n url: trunc(url, URL_LIMIT),\n method,\n status: 0,\n durationMs,\n failed: true,\n error: err instanceof Error ? err.message : String(err),\n ...(request ? { request } : {}),\n });\n throw err;\n }\n };\n\n // Tag so we can detect \"is this still our wrapper\" on uninstall. If another\n // SDK wrapped over us after we installed, leave their wrapper in place —\n // restoring `original` would clobber their instrumentation.\n (wrapped as unknown as { __lsBeaconWrapped: true }).__lsBeaconWrapped = true;\n window.fetch = wrapped;\n\n return () => {\n if ((window.fetch as unknown as { __lsBeaconWrapped?: true }).__lsBeaconWrapped) {\n window.fetch = original;\n }\n };\n}\n\n/**\n * Wrap XMLHttpRequest.prototype. Tracks method+URL+start via open()/send(),\n * reads status on loadend. Same emission policy as fetch.\n */\nfunction readXhrSendBody(body: Document | XMLHttpRequestBodyInit | null | undefined): string | null {\n if (body == null) return null;\n if (typeof body === 'string') return body;\n if (body instanceof URLSearchParams) return body.toString();\n if (body instanceof FormData) {\n const fields: string[] = [];\n body.forEach((v, k) => {\n fields.push(`${k}=${typeof v === 'string' ? `[${v.length}b]` : '[file]'}`);\n });\n return `[FormData] ${fields.join('&')}`;\n }\n if (body instanceof Blob) return `[Blob ${body.size}b ${body.type || 'unknown'}]`;\n if (body instanceof ArrayBuffer) return `[binary ${body.byteLength}b]`;\n if (ArrayBuffer.isView(body)) return `[binary ${(body as ArrayBufferView).byteLength}b]`;\n // Document / XML payloads — rare; skip.\n return null;\n}\n\nfunction wrapXhr(opts: NetworkCaptureOptions): () => void {\n const proto = XMLHttpRequest.prototype;\n const originalOpen = proto.open;\n const originalSend = proto.send;\n const originalSetRequestHeader = proto.setRequestHeader;\n\n interface XhrMeta {\n method: string;\n url: string;\n start: number;\n request?: MonitorRequestCapture;\n /** Last set request content-type — needed for response.body redaction policy when reading. */\n requestContentType?: string;\n /** True if setRequestHeader('authorization', ...) was called. */\n hasAuth: boolean;\n }\n const state = new WeakMap<XMLHttpRequest, XhrMeta>();\n\n proto.open = function patchedOpen(\n method: string,\n url: string | URL,\n ...rest: unknown[]\n ): void {\n state.set(this, {\n method: method.toUpperCase(),\n url: typeof url === 'string' ? url : url.toString(),\n start: 0,\n hasAuth: false,\n });\n // @ts-expect-error — passthrough overload matrix is unwieldy; rest is forwarded as-is.\n return originalOpen.call(this, method, url, ...rest);\n };\n\n proto.setRequestHeader = function patchedSetRequestHeader(\n name: string,\n value: string,\n ): void {\n const meta = state.get(this);\n if (meta) {\n const lower = name.toLowerCase();\n if (lower === 'authorization') meta.hasAuth = true;\n else if (lower === 'content-type') meta.requestContentType = value;\n }\n return originalSetRequestHeader.call(this, name, value);\n };\n\n proto.send = function patchedSend(this: XMLHttpRequest, body?: Document | XMLHttpRequestBodyInit | null): void {\n const meta = state.get(this);\n if (meta) {\n meta.start = performance.now();\n // Build request snapshot for mutating methods.\n if (MUTATING_METHODS.has(meta.method)) {\n const bodyText = readXhrSendBody(body);\n if (bodyText != null) {\n meta.request = captureBody(bodyText, meta.requestContentType);\n } else {\n meta.request = {};\n }\n if (meta.hasAuth) meta.request.hasAuth = true;\n } else if (meta.hasAuth) {\n meta.request = { hasAuth: true };\n }\n }\n\n const onLoadEnd = (): void => {\n this.removeEventListener('loadend', onLoadEnd);\n const m = state.get(this);\n if (!m) return;\n const durationMs = Math.round(performance.now() - m.start);\n // status === 0 indicates the request errored or was aborted before a response.\n const failed = this.status === 0 || this.status >= 400;\n\n let response: MonitorBodyCapture | undefined;\n if ((failed || opts.verbose) && this.status > 0) {\n try {\n // responseText is only valid for text-shaped responseTypes (default + 'text').\n // Defensively gate.\n const rt = (this.responseType === '' || this.responseType === 'text') ? this.responseText : '';\n if (rt) {\n const ct = this.getResponseHeader('content-type') || undefined;\n response = captureBody(rt, ct);\n }\n } catch {\n // responseText access can throw if responseType is incompatible — skip.\n }\n }\n\n if (failed || opts.verbose) {\n opts.emit({\n kind: 'xhr',\n url: trunc(m.url, URL_LIMIT),\n method: m.method,\n status: this.status,\n durationMs,\n failed,\n ...(m.request ? { request: m.request } : {}),\n ...(response ? { response } : {}),\n });\n }\n state.delete(this);\n };\n this.addEventListener('loadend', onLoadEnd);\n return originalSend.call(this, body as XMLHttpRequestBodyInit | null);\n };\n\n return () => {\n proto.open = originalOpen;\n proto.send = originalSend;\n proto.setRequestHeader = originalSetRequestHeader;\n };\n}\n\nexport function installNetworkCapture(opts: NetworkCaptureOptions): NetworkCaptureInstallation {\n const undoFetch = wrapFetch(opts);\n const undoXhr = wrapXhr(opts);\n return {\n uninstall() {\n undoFetch();\n undoXhr();\n },\n };\n}\n","// Batched POST transport for monitor events.\n//\n// Buffers events in memory and flushes to the configured URL on a 1s timer,\n// when buffer hits 50 entries, or synchronously on pagehide / visibility:hidden\n// via navigator.sendBeacon. Per-event POSTs would flood the receiver during\n// click bursts; sendBeacon is the only mechanism that survives a teardown.\n//\n// On flush failure we surface via onError but don't retry — duplicates are\n// worse than gaps for a dev tool. Buffer caps at MAX_BUFFER and drops oldest\n// to bound memory if the receiver is unreachable for a long time.\n\nimport type { MonitorBatch, MonitorEvent } from './wire';\n\nconst FLUSH_INTERVAL_MS = 1000;\nconst FLUSH_AT_COUNT = 50;\nconst MAX_BUFFER = 500;\n\nexport interface TransportOptions {\n url: string;\n sessionId: string;\n /** Called when a flush failed (network error or non-2xx). For UI badge / console warn. */\n onError?: (err: Error) => void;\n}\n\nexport class MonitorTransport {\n private url: string;\n private sessionId: string;\n private onError?: (err: Error) => void;\n private buffer: MonitorEvent[] = [];\n private inflight = false;\n private timer: ReturnType<typeof setInterval> | null = null;\n private pagehideHandler?: () => void;\n private destroyed = false;\n\n constructor(opts: TransportOptions) {\n this.url = opts.url;\n this.sessionId = opts.sessionId;\n this.onError = opts.onError;\n\n this.timer = setInterval(() => { void this.flush(); }, FLUSH_INTERVAL_MS);\n this.pagehideHandler = () => this.flushSync();\n // pagehide fires for both unload AND bfcache eviction. Prefer it over\n // beforeunload (which doesn't fire on mobile when the user switches tabs).\n window.addEventListener('pagehide', this.pagehideHandler);\n // visibilitychange:hidden is the only reliable signal on iOS Safari when\n // the user backgrounds the tab. Flush sync there too.\n document.addEventListener('visibilitychange', this.handleVisibilityChange);\n }\n\n private handleVisibilityChange = (): void => {\n if (document.visibilityState === 'hidden') this.flushSync();\n };\n\n enqueue(event: MonitorEvent): void {\n if (this.destroyed) return;\n this.buffer.push(event);\n if (this.buffer.length > MAX_BUFFER) {\n // Drop oldest non-flushed event rather than grow unbounded.\n this.buffer.shift();\n }\n if (this.buffer.length >= FLUSH_AT_COUNT) void this.flush();\n }\n\n /** Async flush via fetch. No-op when in-flight or empty. */\n async flush(): Promise<void> {\n if (this.destroyed) return;\n if (this.inflight || this.buffer.length === 0) return;\n const events = this.buffer.splice(0, FLUSH_AT_COUNT);\n const batch = this.makeBatch(events);\n this.inflight = true;\n try {\n const res = await fetch(this.url, {\n method: 'POST',\n // credentials:'omit' — going to the dev's local server, not the app\n // backend; avoid leaking session cookies cross-origin.\n credentials: 'omit',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(batch),\n // keepalive lets the request survive a same-tick navigation when\n // pagehide didn't fire (e.g. a window.location.assign from script).\n keepalive: true,\n });\n if (!res.ok) {\n this.onError?.(new Error(`monitor flush: HTTP ${res.status}`));\n }\n } catch (err) {\n // Network failure (server gone, CORS, etc.) — surface but don't crash.\n // Events in this batch are LOST — re-queueing risks duplicates and we\n // can't tell the receiver \"this is a retry.\" Acceptable trade for dev tooling.\n this.onError?.(err instanceof Error ? err : new Error(String(err)));\n } finally {\n this.inflight = false;\n }\n }\n\n /** Synchronous flush via sendBeacon, used on pagehide / visibility:hidden. */\n private flushSync(): void {\n if (this.destroyed || this.buffer.length === 0) return;\n if (!navigator.sendBeacon) {\n // Old browsers — best-effort fetch with keepalive (no await; we're tearing down).\n void this.flush();\n return;\n }\n const events = this.buffer.splice(0);\n const batch = this.makeBatch(events);\n // sendBeacon doesn't accept Content-Type; the receiver detects JSON by\n // best-effort parsing anyway.\n const blob = new Blob([JSON.stringify(batch)], { type: 'application/json' });\n try {\n navigator.sendBeacon(this.url, blob);\n } catch {\n // sendBeacon can throw on payloads > ~64KB. Drop the batch.\n }\n }\n\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.timer) clearInterval(this.timer);\n if (this.pagehideHandler) window.removeEventListener('pagehide', this.pagehideHandler);\n document.removeEventListener('visibilitychange', this.handleVisibilityChange);\n // Best-effort final flush so events from the moment of stop() make it out.\n this.flushSync();\n }\n\n private makeBatch(events: MonitorEvent[]): MonitorBatch {\n return {\n sessionId: this.sessionId,\n events,\n meta: {\n url: window.location.href,\n userAgent: navigator.userAgent,\n viewport: {\n w: window.innerWidth,\n h: window.innerHeight,\n dpr: window.devicePixelRatio || 1,\n },\n v: 1,\n },\n };\n }\n}\n","// Monitor session orchestrator.\n//\n// One active session at a time, owned by module-level state. start(cfg)\n// installs all capture (errors, network, DOM) and kicks off the transport;\n// stop() uninstalls everything. resumeIfPersisted() reads sessionStorage so\n// an SPA reload mid-repro doesn't silently drop capture.\n//\n// Per design decision B1 the monitor owns its own EventBuffer instance for\n// error capture — independent of the `errors` plugin's buffer. Two window\n// listeners total (one per buffer); zero shared state.\n//\n// Module-level state is intentional: only one monitor session can be running\n// per page. Multi-init() is supported because destroy()/start()/stop() is\n// idempotent.\n\nimport { createEventBuffer, type CapturedRuntimeEvent, type EventBuffer } from '../event-buffer';\nimport { installDomCapture } from './capture-dom';\nimport { installNetworkCapture } from './capture-network';\nimport { MonitorTransport } from './transport';\nimport type { MonitorEvent } from './wire';\n\n// Distributive Omit so the union keeps its discriminant + body when we strip\n// the auto-filled fields. Without distribution, TS collapses to \"only fields\n// all members share\", which excludes label, data, etc. and breaks every emit.\ntype EventInput<T> = T extends unknown ? Omit<T, 'ts' | 'sessionId' | 'seq'> : never;\ntype MonitorEventInput = EventInput<MonitorEvent>;\n\nconst SESSION_URL_KEY = '__lsBeaconMonitorUrl';\nconst SESSION_ID_KEY = '__lsBeaconMonitorSession';\nconst SESSION_VERBOSE_KEY = '__lsBeaconMonitorVerbose';\nconst SESSION_DEADLINE_KEY = '__lsBeaconMonitorDeadline';\nconst DEFAULT_MAX_SESSION_MS = 30 * 60_000;\nconst PROBE_DATA_LIMIT = 4_096;\n\nexport interface MonitorConfig {\n /** Endpoint to POST batches to. Cleared on stop(). */\n url: string;\n /** If true, capture successful network calls in addition to failures. Default false. */\n verbose?: boolean;\n /** Hard session cap. Auto-stops monitoring at this point. Default 30 minutes. */\n maxSessionMs?: number;\n}\n\ntype Listener = (active: boolean, url: string | null) => void;\n\ninterface ActiveSession {\n url: string;\n sessionId: string;\n verbose: boolean;\n deadlineMs: number;\n seq: number;\n transport: MonitorTransport;\n errorsBuffer: EventBuffer;\n uninstallNetwork: () => void;\n uninstallDom: () => void;\n uninstallErrors: () => void;\n errorsUnsub: () => void;\n deadlineTimer: ReturnType<typeof setTimeout>;\n /** Index up to which the errors buffer was already drained. */\n drainedThrough: number;\n}\n\nlet active: ActiveSession | null = null;\nconst listeners = new Set<Listener>();\n\nfunction randomSessionId(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n // crypto.randomUUID() returns \"xxxxxxxx-xxxx-...\" — slice keeps TS happy\n // under noUncheckedIndexedAccess.\n return crypto.randomUUID().slice(0, 8);\n }\n return Math.random().toString(36).slice(2, 10);\n}\n\nfunction safeSerialize(value: unknown): unknown {\n // Defend against cyclic refs + functions + large blobs. Strings truncate;\n // objects/arrays round-trip through JSON (which strips functions and throws\n // on cycles — we catch and stringify defensively).\n const seen = new WeakSet<object>();\n const walk = (v: unknown): unknown => {\n if (v === null || typeof v !== 'object') {\n if (typeof v === 'string') return v.length > PROBE_DATA_LIMIT ? v.slice(0, PROBE_DATA_LIMIT) : v;\n return v;\n }\n if (seen.has(v as object)) return '[cyclic]';\n seen.add(v as object);\n if (Array.isArray(v)) return v.map(walk);\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(v as object).slice(0, 50)) {\n try {\n out[k] = walk((v as Record<string, unknown>)[k]);\n } catch {\n out[k] = '[unreadable]';\n }\n }\n return out;\n };\n try {\n return walk(value);\n } catch {\n return '[unserialisable]';\n }\n}\n\nfunction notify(): void {\n for (const fn of listeners) {\n try {\n fn(active !== null, active?.url ?? null);\n } catch {\n // listeners must not throw; ignore.\n }\n }\n}\n\nfunction stamp(partial: MonitorEventInput): MonitorEvent {\n if (!active) {\n // Programmer error — caller should check isActive() first. Throwing would\n // crash the host page, so synthesize a no-op event.\n return {\n ...(partial as object),\n ts: Date.now(),\n sessionId: '',\n seq: 0,\n } as unknown as MonitorEvent;\n }\n active.seq += 1;\n return {\n ...(partial as object),\n ts: Date.now(),\n sessionId: active.sessionId,\n seq: active.seq,\n } as unknown as MonitorEvent;\n}\n\nfunction enqueue(partial: MonitorEventInput): void {\n if (!active) return;\n const event = stamp(partial);\n active.transport.enqueue(event);\n}\n\nfunction persistSession(): void {\n if (!active) return;\n try {\n sessionStorage.setItem(SESSION_URL_KEY, active.url);\n sessionStorage.setItem(SESSION_ID_KEY, active.sessionId);\n sessionStorage.setItem(SESSION_VERBOSE_KEY, active.verbose ? '1' : '0');\n sessionStorage.setItem(SESSION_DEADLINE_KEY, String(active.deadlineMs));\n } catch {\n // sessionStorage disabled (Safari private mode). Session still works,\n // just doesn't survive a reload.\n }\n}\n\nfunction clearPersistedSession(): void {\n try {\n sessionStorage.removeItem(SESSION_URL_KEY);\n sessionStorage.removeItem(SESSION_ID_KEY);\n sessionStorage.removeItem(SESSION_VERBOSE_KEY);\n sessionStorage.removeItem(SESSION_DEADLINE_KEY);\n } catch {\n // ignore\n }\n}\n\nfunction readPersistedSession(): { url: string; verbose: boolean; deadlineMs: number } | null {\n try {\n const url = sessionStorage.getItem(SESSION_URL_KEY);\n if (!url) return null;\n const verbose = sessionStorage.getItem(SESSION_VERBOSE_KEY) === '1';\n const deadlineRaw = sessionStorage.getItem(SESSION_DEADLINE_KEY);\n const deadlineMs = deadlineRaw ? Number(deadlineRaw) : Date.now() + DEFAULT_MAX_SESSION_MS;\n if (Number.isFinite(deadlineMs) && deadlineMs <= Date.now()) {\n clearPersistedSession();\n return null;\n }\n return { url, verbose, deadlineMs };\n } catch {\n return null;\n }\n}\n\nfunction emitErrorEvent(ev: CapturedRuntimeEvent): void {\n if (!active) return;\n active.seq += 1;\n active.transport.enqueue({\n kind: ev.kind,\n ts: ev.ts,\n sessionId: active.sessionId,\n seq: active.seq,\n message: ev.message,\n ...(ev.stack ? { stack: ev.stack } : {}),\n ...(ev.source ? { source: ev.source } : {}),\n ...(typeof ev.line === 'number' ? { line: ev.line } : {}),\n ...(typeof ev.col === 'number' ? { col: ev.col } : {}),\n });\n}\n\nexport function start(config: MonitorConfig): void {\n if (active) stop();\n if (!config.url) return;\n\n const maxMs = config.maxSessionMs ?? DEFAULT_MAX_SESSION_MS;\n const deadlineMs = Date.now() + maxMs;\n const sessionId = randomSessionId();\n const verbose = !!config.verbose;\n\n const transport = new MonitorTransport({\n url: config.url,\n sessionId,\n onError: (err) => {\n // Soft-fail. We don't tear down on transient errors — the dev's local\n // server might just be restarting. Surface once so the user sees\n // \"monitor isn't reaching anything\" without a teardown loop.\n console.warn('[launch-kit-beacon] monitor transport error:', err.message);\n },\n });\n\n // Monitor's own error buffer (per B1 — no sharing with errors plugin).\n const errorsBuffer = createEventBuffer();\n const uninstallErrors = errorsBuffer.install();\n\n // Drain anything captured before subscribe, then keep streaming.\n const existing = errorsBuffer.snapshot();\n for (const ev of existing) emitErrorEvent(ev);\n let drainedThrough = existing.length;\n const errorsUnsub = errorsBuffer.subscribe(() => {\n if (!active) return;\n const all = active.errorsBuffer.snapshot();\n while (active.drainedThrough < all.length) {\n const ev = all[active.drainedThrough];\n if (ev) emitErrorEvent(ev);\n active.drainedThrough += 1;\n }\n });\n\n const net = installNetworkCapture({\n emit: (partial) => enqueue(partial),\n verbose,\n });\n\n const dom = installDomCapture({\n emitClick: (partial) => enqueue(partial),\n emitRoute: (partial) => enqueue(partial),\n emitDialog: (partial) => enqueue(partial),\n emitSubmit: (partial) => enqueue(partial),\n });\n\n const deadlineTimer = setTimeout(() => {\n console.info('[launch-kit-beacon] monitor session expired (max duration reached)');\n stop();\n }, Math.max(0, deadlineMs - Date.now()));\n\n active = {\n url: config.url,\n sessionId,\n verbose,\n deadlineMs,\n seq: 0,\n transport,\n errorsBuffer,\n uninstallNetwork: net.uninstall,\n uninstallDom: dom.uninstall,\n uninstallErrors,\n errorsUnsub,\n deadlineTimer,\n drainedThrough,\n };\n\n persistSession();\n notify();\n}\n\n/**\n * Stop the session AND forget it. Used when the user explicitly clicks Stop or\n * the deadline expires — clears sessionStorage so the next page load doesn't\n * resume. For host-driven teardown (AppHeader unmount, HMR) call suspend()\n * instead so resume can rehydrate.\n */\nexport function stop(): void {\n tearDownActive();\n clearPersistedSession();\n notify();\n}\n\n/**\n * Tear down capture + transport BUT keep sessionStorage intact so the next\n * init() can resumeIfPersisted(). Used when the host (e.g. AppHeader) unmounts\n * mid-session due to a layout swap — without this, crossing Next.js route\n * groups kills the session permanently because destroy() → abort → stop()\n * would clear the persistence keys we rely on for rehydrate.\n */\nexport function suspend(): void {\n if (!active) return;\n tearDownActive();\n notify();\n}\n\nfunction tearDownActive(): void {\n if (!active) return;\n clearTimeout(active.deadlineTimer);\n active.errorsUnsub();\n active.uninstallErrors();\n active.uninstallNetwork();\n active.uninstallDom();\n active.transport.destroy();\n active = null;\n}\n\nexport function probe(label: string, data?: unknown): void {\n if (!active) return;\n enqueue({\n kind: 'probe',\n label: label.slice(0, 200),\n data: safeSerialize(data),\n });\n}\n\nexport function isActive(): boolean {\n return active !== null;\n}\n\nexport function currentUrl(): string | null {\n return active?.url ?? null;\n}\n\n/**\n * Subscribe to active-state changes. Used by the panel UI to update its\n * display when start()/stop() fires.\n */\nexport function subscribe(fn: Listener): () => void {\n listeners.add(fn);\n return () => { listeners.delete(fn); };\n}\n\n/**\n * Resume a persisted session if one exists in sessionStorage. Called from the\n * plugin's setupOnce so an SPA reload during active monitoring doesn't drop\n * capture. No-op when no session was persisted or the deadline has passed.\n */\nexport function resumeIfPersisted(): void {\n if (active) return;\n if (typeof window === 'undefined') return;\n const persisted = readPersistedSession();\n if (!persisted) return;\n start({\n url: persisted.url,\n verbose: persisted.verbose,\n maxSessionMs: Math.max(60_000, persisted.deadlineMs - Date.now()),\n });\n}\n","// liveMonitor plugin — paste-URL panel that drives the live-event side-channel.\n//\n// Lifecycle (per the new plugin contract):\n// setupOnce → resume any sessionStorage-persisted session; wire ctx.signal\n// so destroy() cleanly stops the session and unsubscribes.\n// form → render an imperative panel into the drawer body. Inactive\n// state shows URL input + Start + verbose toggle; active state\n// shows the URL + Stop button + REC indicator. Subscribes to\n// session active-state changes for live updates.\n//\n// Capture is NOT contributed to the feedback payload — liveMonitor lives on\n// its own side-channel (the launch-beacon receiver), not /api/feedback. The\n// plugin omits `capture()` for that reason.\n\nimport { createMonitorOverlay, type MonitorOverlay } from '../internal/monitor/overlay';\nimport * as session from '../internal/monitor/session';\nimport type { BeaconPlugin } from '../types';\n\nexport interface LiveMonitorOptions {\n /** Hard session cap. Auto-stops monitoring at this point. Default 30 minutes. */\n maxSessionMs?: number;\n}\n\nexport function liveMonitor(opts: LiveMonitorOptions = {}): BeaconPlugin {\n let panelRoot: HTMLDivElement | null = null;\n let unsubscribeActive: (() => void) | null = null;\n let lastUrlInput = '';\n let overlay: MonitorOverlay | null = null;\n\n function mountOverlay(): void {\n if (overlay) return;\n overlay = createMonitorOverlay({\n onStop: () => session.stop(),\n url: session.currentUrl(),\n });\n }\n\n function destroyOverlay(): void {\n if (!overlay) return;\n try { overlay.destroy(); } catch { /* swallow */ }\n overlay = null;\n }\n\n function findShadowRoot(): ShadowRoot | null {\n const host = document.querySelector('launch-kit-beacon');\n return host?.shadowRoot ?? null;\n }\n\n function renderInactive(): void {\n if (!panelRoot) return;\n panelRoot.innerHTML = '';\n\n const title = document.createElement('div');\n title.className = 'beacon-monitor-title';\n title.textContent = 'Monitor — paste a stream URL';\n panelRoot.appendChild(title);\n\n const row = document.createElement('div');\n row.className = 'beacon-monitor-row';\n\n const urlInput = document.createElement('input');\n urlInput.type = 'url';\n urlInput.className = 'beacon-monitor-input';\n urlInput.placeholder = 'http://localhost:9876/m/…';\n urlInput.value = lastUrlInput;\n urlInput.autocomplete = 'off';\n urlInput.spellcheck = false;\n row.appendChild(urlInput);\n\n const startBtn = document.createElement('button');\n startBtn.type = 'button';\n startBtn.className = 'beacon-monitor-btn';\n startBtn.textContent = 'Start';\n startBtn.disabled = !lastUrlInput.trim();\n row.appendChild(startBtn);\n\n panelRoot.appendChild(row);\n\n const verboseLabel = document.createElement('label');\n verboseLabel.className = 'beacon-monitor-verbose';\n const verboseInput = document.createElement('input');\n verboseInput.type = 'checkbox';\n verboseInput.dataset.role = 'verbose';\n verboseLabel.appendChild(verboseInput);\n verboseLabel.appendChild(document.createTextNode(' verbose (capture successful network too)'));\n panelRoot.appendChild(verboseLabel);\n\n const help = document.createElement('div');\n help.className = 'beacon-monitor-help';\n help.textContent = 'Streams clicks, failed network, errors, route + dialog changes.';\n panelRoot.appendChild(help);\n\n urlInput.addEventListener('input', () => {\n lastUrlInput = urlInput.value;\n startBtn.disabled = !urlInput.value.trim();\n });\n\n startBtn.addEventListener('click', () => {\n const value = urlInput.value.trim();\n if (!value) return;\n // Validate URL shape — start() doesn't, so surface bad input here.\n try {\n // eslint-disable-next-line no-new\n new URL(value);\n } catch {\n urlInput.setCustomValidity('Enter a valid URL (e.g. http://localhost:9876/m/abc)');\n urlInput.reportValidity();\n return;\n }\n urlInput.setCustomValidity('');\n session.start({\n url: value,\n verbose: verboseInput.checked,\n ...(opts.maxSessionMs !== undefined ? { maxSessionMs: opts.maxSessionMs } : {}),\n });\n });\n }\n\n function renderActive(): void {\n if (!panelRoot) return;\n panelRoot.innerHTML = '';\n const url = session.currentUrl() ?? '';\n\n const title = document.createElement('div');\n title.className = 'beacon-monitor-title';\n const rec = document.createElement('span');\n rec.className = 'beacon-monitor-rec';\n rec.setAttribute('aria-hidden', 'true');\n title.appendChild(rec);\n title.appendChild(document.createTextNode(' Monitor — recording'));\n panelRoot.appendChild(title);\n\n const urlEl = document.createElement('div');\n urlEl.className = 'beacon-monitor-active-url';\n urlEl.title = url;\n urlEl.textContent = url;\n panelRoot.appendChild(urlEl);\n\n const row = document.createElement('div');\n row.className = 'beacon-monitor-row';\n const stopBtn = document.createElement('button');\n stopBtn.type = 'button';\n stopBtn.className = 'beacon-monitor-btn stop';\n stopBtn.textContent = 'Stop monitoring';\n stopBtn.addEventListener('click', () => session.stop());\n row.appendChild(stopBtn);\n panelRoot.appendChild(row);\n\n const help = document.createElement('div');\n help.className = 'beacon-monitor-help';\n help.textContent = 'Events stream to the URL above. Auto-stops after 30 min.';\n panelRoot.appendChild(help);\n }\n\n function render(): void {\n if (session.isActive()) renderActive();\n else renderInactive();\n }\n\n return {\n name: 'liveMonitor',\n setupOnce(ctx) {\n // Resume any sessionStorage-persisted session so an SPA reload mid-repro\n // doesn't drop capture.\n session.resumeIfPersisted();\n\n // Mirror current state into the body-portal overlay. Mount on first\n // active=true (including the resume case), destroy on active=false.\n if (session.isActive()) mountOverlay();\n const unsubscribeOverlay = session.subscribe((active, url) => {\n if (active) {\n mountOverlay();\n overlay?.updateUrl(url);\n } else {\n destroyOverlay();\n }\n });\n\n // SUSPEND (not stop) on destroy() — host-driven teardown (AppHeader\n // unmount on layout swap, HMR) must keep sessionStorage intact so the\n // next init() can resumeIfPersisted(). Only user-initiated Stop or\n // deadline expiry should forget the session.\n const onAbort = () => {\n destroyOverlay();\n unsubscribeOverlay();\n try { session.suspend(); } catch { /* swallow */ }\n };\n ctx.signal.addEventListener('abort', onAbort, { once: true });\n\n // Find shadow root so the panel can attach proper styles. Strictly\n // observational here — setupOnce returns no teardown.\n void findShadowRoot;\n },\n form() {\n return {\n render: (slot) => {\n panelRoot = document.createElement('div');\n panelRoot.className = 'beacon-monitor';\n slot.appendChild(panelRoot);\n\n render();\n unsubscribeActive = session.subscribe(() => render());\n\n return () => {\n unsubscribeActive?.();\n unsubscribeActive = null;\n panelRoot = null;\n };\n },\n };\n },\n // No capture(): liveMonitor is a side-channel, not a feedback payload contributor.\n };\n}\n\n/**\n * Programmatic API exports. Mirrors the plugin's runtime entry points so app\n * code can drive monitor without touching the UI (e.g. emit a probe from a\n * button click handler during a known-bad repro).\n */\nexport { start as startMonitor, stop as stopMonitor, probe, isActive as isMonitorActive, currentUrl as currentMonitorUrl } from '../internal/monitor/session';\nexport type { MonitorConfig } from '../internal/monitor/session';\n","// Core orchestrator: singleton, init/show/hide/destroy/status/on/off, submit lifecycle.\n//\n// Submit lifecycle (§7):\n// 1. validate description → 2. allocate per-submit AbortController →\n// 3. capture plugins in order → 4. wrap → 5. beforeSubmit (cancellable) →\n// 6. POST → 7. afterSubmit + system event → 8. clear _currentSubmit.\n\nimport { createCtx, type CtxHost } from './ctx';\nimport { BEACON_TAG, defineBeaconElement, LaunchKitBeacon } from './element';\nimport { createRegistry, type Registry, type PluginErrorReport } from './registry';\nimport { postFeedback } from './transport';\nimport type {\n BeaconCtx,\n BeaconLifecycleEvent,\n BeaconPlugin,\n BeaconStatus,\n ContextConfig,\n DeclarativeForm,\n FeedbackPayload,\n HeadersConfig,\n ImperativeForm,\n InitOptions,\n LabelMap,\n Mode,\n PayloadMetadata,\n PluginEntry,\n PluginStatus,\n Position,\n Severity,\n SystemEvent,\n SystemEventPayload,\n Theme,\n TransportResponse,\n} from './types';\nimport { DialogView, defaultLabels, type PluginPanelSource } from './ui/dialog';\nimport { attachOverlay, createOverlayHost, type OverlayHost } from './ui/overlay';\nimport { metadata as presetMetadata, errors as presetErrors, domEle as presetDomEle, domSS as presetDomSS } from './plugins';\nimport { ensureBeaconBodyStyles } from './styles';\nimport { clearAnnotationCache } from './internal/annotation-cache';\n\ninterface BeaconInstance {\n endpoint: string;\n headers: HeadersConfig | undefined;\n context: ContextConfig | undefined;\n credentials: RequestCredentials;\n plugins: BeaconPlugin[];\n registry: Registry;\n dialog: DialogView;\n overlayHost: OverlayHost;\n hostElement: LaunchKitBeacon;\n initAbort: AbortController;\n labels: LabelMap;\n debug: boolean;\n healthIndicator: 'never' | 'dev' | 'always';\n position: Position;\n theme: Theme;\n // ── Per-submit state ──\n currentSubmit: AbortController | null;\n capturedEntries: Record<string, PluginEntry>;\n // ── Form values (plugin-namespaced) ──\n formValues: Record<string, Record<string, unknown>>;\n // ── Lifecycle subscribers (per-submit ctx-channel) ──\n lifecycleHandlers: {\n open: Set<(e: BeaconLifecycleEvent) => void>;\n close: Set<(e: BeaconLifecycleEvent) => void>;\n beforeSubmit: Set<(e: BeaconLifecycleEvent) => void>;\n afterSubmit: Set<(e: BeaconLifecycleEvent) => void>;\n };\n // ── Plugin form panels resolved at open() ──\n panelSources: PluginPanelSource[];\n}\n\nlet current: BeaconInstance | null = null;\n\nconst systemHandlers: {\n [E in SystemEvent]: Set<(e: SystemEventPayload<E>) => void>;\n} = {\n 'plugin:error': new Set(),\n 'submit:success': new Set(),\n 'submit:error': new Set(),\n 'ready': new Set(),\n};\n\n// ── Public API ──────────────────────────────────────────\n\nexport function init(opts: InitOptions): void {\n if (typeof window === 'undefined') return;\n if (!opts.endpoint) throw new Error('init: endpoint is required');\n\n defineBeaconElement();\n destroy();\n\n const labels: LabelMap = { ...defaultLabels(), ...(opts.labels ?? {}) };\n const initAbort = new AbortController();\n const plugins = resolvePluginList(opts);\n const position: Position = opts.position ?? 'bottom-right';\n const theme: Theme = opts.theme ?? 'auto';\n\n // Body-mounted UI (pin popover, pick-mode overlay) lives outside the shadow\n // root — its styles must be available in document.head.\n ensureBeaconBodyStyles();\n\n ensureHost(opts, position, theme);\n const hostElement = document.querySelector<LaunchKitBeacon>(BEACON_TAG);\n if (!hostElement) {\n throw new Error('init: failed to acquire <launch-kit-beacon> host');\n }\n // connectedCallback runs synchronously when the element is in the DOM.\n // shadow root + default trigger are guaranteed by this point.\n if (!hostElement.shadow) {\n throw new Error('init: host element shadow root not initialized');\n }\n\n const overlayHost = createOverlayHost(hostElement.shadow);\n const dialog = new DialogView(\n labels,\n ['bug', 'idea', 'ux', 'a11y'],\n {\n onSubmit: () => { void runSubmit(); },\n onClose: (reason) => { dispatchLifecycle('close', {}); if (reason === 'user') resetFormState(); },\n },\n );\n hostElement.shadow.appendChild(dialog.root);\n // Mark host so screenshot plugins can exclude it.\n hostElement.classList.add('beacon-no-capture');\n\n const registry = createRegistry(plugins);\n\n const instance: BeaconInstance = {\n endpoint: opts.endpoint,\n headers: opts.headers,\n context: opts.context,\n credentials: opts.credentials ?? 'omit',\n plugins,\n registry,\n dialog,\n overlayHost,\n hostElement,\n initAbort,\n labels,\n debug: !!opts.debug || debugFromUrl(),\n healthIndicator: opts.healthIndicator ?? 'never',\n position,\n theme,\n currentSubmit: null,\n capturedEntries: {},\n formValues: {},\n lifecycleHandlers: {\n open: new Set(),\n close: new Set(),\n beforeSubmit: new Set(),\n afterSubmit: new Set(),\n },\n panelSources: [],\n };\n\n current = instance;\n\n // Wire trigger BEFORE installing plugins so a setupOnce that opens the dialog\n // synchronously (rare but possible) works.\n hostElement.onTriggerClick = () => show();\n\n // Install plugins. setupOnce errors are caught and reported but never block init.\n registry.install(\n (name) => makeCtxForPlugin(name),\n (err) => handlePluginError(err),\n );\n\n dispatchSystem('ready', { ready: true });\n if (instance.debug) console.info('[beacon] ready', instance.endpoint);\n}\n\nexport function show(): void {\n const inst = current;\n if (!inst) return;\n if (inst.currentSubmit) return; // §7 concurrency: show is a no-op while submit in flight\n // Resolve plugin form panels fresh at open() so plugins can return different\n // forms each time (e.g., based on current page state).\n inst.panelSources = inst.plugins\n .map<PluginPanelSource | null>((p) => {\n if (!p.form) return null;\n const ctx = makeCtxForPlugin(p.name);\n let form: DeclarativeForm | ImperativeForm;\n try {\n form = p.form(ctx);\n } catch (err) {\n handlePluginError({\n plugin: p.name,\n error: err instanceof Error ? err : new Error(String(err)),\n at: 'form',\n });\n return null;\n }\n return { name: p.name, form, ctx };\n })\n .filter((x): x is PluginPanelSource => x !== null);\n\n inst.dialog.installPluginPanels(inst.panelSources, {\n get: (plugin, name) => inst.formValues[plugin]?.[name],\n set: (plugin, name, value) => {\n const ns = (inst.formValues[plugin] ??= {});\n ns[name] = value;\n },\n });\n inst.dialog.open();\n dispatchLifecycle('open', {});\n}\n\nexport function hide(): void {\n const inst = current;\n if (!inst) return;\n inst.dialog.close('user');\n}\n\nexport function destroy(): void {\n const inst = current;\n if (!inst) return;\n // Abort the per-init signal first so plugins observing ctx.signal can clean up.\n inst.initAbort.abort();\n // Cancel any in-flight submit.\n inst.currentSubmit?.abort();\n inst.registry.destroy();\n // Drop any annotated screenshot the prior session cached. Without this an\n // HMR-reload of the consumer would resurrect last-session pins/screenshot.\n clearAnnotationCache();\n // Tear down dialog + overlay from the host's shadow DOM.\n try {\n inst.dialog.root.remove();\n inst.overlayHost.layer.remove();\n } catch { /* swallow */ }\n inst.hostElement.onTriggerClick = null;\n current = null;\n}\n\nexport function status(): BeaconStatus {\n const inst = current;\n if (!inst) {\n return { ready: false, transport: 'idle', plugins: {} };\n }\n return {\n ready: true,\n transport: 'idle',\n plugins: inst.registry.status(),\n };\n}\n\nexport function on<E extends SystemEvent>(\n event: E,\n handler: (payload: SystemEventPayload<E>) => void,\n): () => void {\n (systemHandlers[event] as Set<(p: SystemEventPayload<E>) => void>).add(handler);\n return () => off(event, handler);\n}\n\nexport function off<E extends SystemEvent>(\n event: E,\n handler: (payload: SystemEventPayload<E>) => void,\n): void {\n (systemHandlers[event] as Set<(p: SystemEventPayload<E>) => void>).delete(handler);\n}\n\n// ── Internal ──────────────────────────────────────────\n\nfunction ensureHost(opts: InitOptions, position: Position, theme: Theme): void {\n let existing = document.querySelector<LaunchKitBeacon>(BEACON_TAG);\n if (!existing) {\n // No host in the page — create one with the resolved defaults. Callers can\n // still mount their own <launch-kit-beacon> in JSX for slot trigger control.\n existing = document.createElement(BEACON_TAG) as LaunchKitBeacon;\n existing.setAttribute('position', position);\n existing.setAttribute('theme', theme);\n if (position === 'hidden') {\n existing.style.position = 'absolute';\n existing.style.left = '-9999px';\n }\n (document.body ?? document.documentElement).appendChild(existing);\n return;\n }\n\n // Host already in the DOM (JSX-mounted). §8: JS init wins on attribute\n // conflict — but only when the consumer EXPLICITLY passed that attribute\n // via init(opts). When init() omits position/theme, the JSX attribute is\n // authoritative — overwriting with our default (\"bottom-right\") would\n // silently relocate a slotted-trigger consumer's button to the corner.\n if (opts.position !== undefined) existing.setAttribute('position', position);\n if (opts.theme !== undefined) existing.setAttribute('theme', theme);\n}\n\nfunction resolvePluginList(opts: InitOptions): BeaconPlugin[] {\n // Semantic (§3): `plugins` overrides the default preset.\n // `defaultPlugins: false` strips the preset (relevant when no `plugins` given).\n if (opts.plugins) return opts.plugins;\n if (opts.defaultPlugins === false) return [];\n return defaultPreset();\n}\n\nfunction defaultPreset(): BeaconPlugin[] {\n return [presetMetadata(), presetErrors(), presetDomEle(), presetDomSS()];\n}\n\nfunction debugFromUrl(): boolean {\n if (typeof window === 'undefined') return false;\n try {\n return new URLSearchParams(window.location.search).has('lsbeacon-debug');\n } catch {\n return false;\n }\n}\n\nfunction makeCtxForPlugin(name: string): BeaconCtx {\n const inst = current;\n const host: CtxHost = {\n getCaptured: (n) => inst?.capturedEntries[n],\n getFormValues: (pluginName) => {\n if (!inst) return {};\n return (inst.formValues[pluginName] ??= {});\n },\n getCaptureSignal: () => inst?.currentSubmit?.signal,\n getInitSignal: () => inst!.initAbort.signal,\n requestMode: async (mode: Mode) => {\n if (!inst) return () => {};\n return inst.dialog.requestMode(mode);\n },\n overlay: (opts) => {\n if (!inst) return () => {};\n return attachOverlay(inst.overlayHost, opts.render);\n },\n onLifecycle: (ev, handler) => {\n if (!inst) return () => {};\n const set = inst.lifecycleHandlers[ev];\n set.add(handler);\n return () => set.delete(handler);\n },\n };\n return createCtx(name, host);\n}\n\nfunction dispatchLifecycle(\n ev: 'open' | 'close' | 'beforeSubmit' | 'afterSubmit',\n e: BeaconLifecycleEvent,\n): void {\n const inst = current;\n if (!inst) return;\n for (const fn of inst.lifecycleHandlers[ev]) {\n try { fn(e); } catch (err) {\n if (inst.debug) console.error('[beacon] lifecycle handler threw:', err);\n }\n }\n}\n\nfunction dispatchSystem<E extends SystemEvent>(event: E, payload: SystemEventPayload<E>): void {\n for (const fn of systemHandlers[event] as Set<(p: SystemEventPayload<E>) => void>) {\n try { fn(payload); } catch (err) {\n if (current?.debug) console.error('[beacon] system handler threw:', err);\n }\n }\n}\n\nfunction handlePluginError(err: PluginErrorReport): void {\n dispatchSystem('plugin:error', { plugin: err.plugin, error: err.error, at: err.at });\n const inst = current;\n if (!inst) return;\n if (inst.healthIndicator === 'always' || (inst.healthIndicator === 'dev' && inst.debug)) {\n inst.hostElement.setHealthIndicator(true);\n }\n if (inst.debug) console.warn(`[beacon] plugin \"${err.plugin}\" ${err.at} failed:`, err.error);\n}\n\nfunction resetFormState(): void {\n const inst = current;\n if (!inst) return;\n inst.dialog.resetState();\n inst.dialog.clearPluginPanels();\n inst.formValues = {};\n}\n\nasync function runSubmit(): Promise<void> {\n const inst = current;\n if (!inst) return;\n if (inst.currentSubmit) return;\n\n const description = inst.dialog.getDescription().trim();\n if (!description) {\n inst.dialog.setStatus('Description is required', 'error');\n return;\n }\n\n inst.currentSubmit = new AbortController();\n inst.capturedEntries = {};\n inst.dialog.setSubmitting(true);\n inst.dialog.setStatus('Capturing…');\n\n let payload: FeedbackPayload | null = null;\n try {\n const captured = await inst.registry.capture(\n (n) => inst.capturedEntries[n],\n (err) => handlePluginError(err),\n );\n inst.capturedEntries = captured;\n\n payload = assemblePayload(inst, description, captured);\n\n // beforeSubmit — first veto wins.\n let cancelReason: string | null = null;\n const cancel = (reason: string) => { if (cancelReason === null) cancelReason = reason; };\n dispatchLifecycle('beforeSubmit', { payload, cancel });\n if (cancelReason !== null) {\n inst.dialog.setSubmitting(false);\n inst.dialog.setStatus(`Cancelled: ${cancelReason}`, 'error');\n return;\n }\n\n inst.dialog.setStatus('Sending…');\n const response: TransportResponse = await postFeedback(\n inst.endpoint,\n payload,\n inst.headers,\n inst.currentSubmit.signal,\n inst.credentials,\n );\n\n dispatchLifecycle('afterSubmit', { payload, response });\n inst.dialog.setSubmitting(false);\n\n if (response.ok) {\n dispatchSystem('submit:success', { payload, response });\n inst.dialog.setSubmitSucceeded(true);\n inst.dialog.setStatus(inst.labels.sentSuccess, 'success');\n // Close after a beat so the user sees the confirmation. The\n // submitSucceeded flag short-circuits the discard guard if the user\n // clicks X during this window.\n window.setTimeout(() => {\n if (current === inst) inst.dialog.close('submitted');\n resetFormState();\n }, 1500);\n } else {\n dispatchSystem('submit:error', { payload, error: new Error(`HTTP ${response.status}`) });\n inst.dialog.setStatus(`Failed (${response.status})`, 'error');\n }\n } catch (err) {\n inst.dialog.setSubmitting(false);\n const error = err instanceof Error ? err : new Error(String(err));\n if (payload) {\n dispatchSystem('submit:error', { payload, error });\n }\n inst.dialog.setStatus(`Failed: ${error.message}`, 'error');\n } finally {\n inst.currentSubmit = null;\n }\n}\n\nfunction assemblePayload(\n inst: BeaconInstance,\n description: string,\n pluginEntries: Record<string, PluginEntry>,\n): FeedbackPayload {\n const meta = buildMetadata();\n const ctx = inst.context?.();\n return {\n description,\n severity: inst.dialog.getSeverity(),\n metadata: meta,\n ...(ctx ? { context: ctx } : {}),\n plugins: pluginEntries,\n };\n}\n\nfunction buildMetadata(): PayloadMetadata {\n const url = window.location.href;\n const ref = document.referrer;\n const theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' as const : 'light' as const;\n return {\n url,\n ...(ref ? { referrer: ref } : {}),\n userAgent: navigator.userAgent,\n viewport: {\n w: window.innerWidth,\n h: window.innerHeight,\n dpr: window.devicePixelRatio || 1,\n },\n screen: {\n w: window.screen.width,\n h: window.screen.height,\n },\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n locale: navigator.language,\n theme,\n capturedAt: new Date().toISOString(),\n };\n}\n\n// ── Test access ──────────────────────────────────────────\n// __testing exposes innards for vitest. Not part of public API.\n\nexport const __testing = {\n resetForTests(): void {\n destroy();\n for (const set of Object.values(systemHandlers)) set.clear();\n },\n getCurrent(): unknown {\n return current;\n },\n};\n\n// Re-exports so consumers see Severity etc. via core; primary export route is index.ts.\nexport type { Severity, BeaconStatus, PluginStatus };\n","// Public entry point for the beacon module.\n//\n// Importing this module registers <launch-kit-beacon> via customElements.define.\n// No other side effects. All other behavior is gated behind init().\n\nimport { defineBeaconElement } from './element';\n\ndefineBeaconElement();\n\nexport { init, show, hide, destroy, on, off, status } from './core';\nexport {\n metadata,\n errors,\n domEle,\n domSS,\n liveMonitor,\n startMonitor,\n stopMonitor,\n probe,\n isMonitorActive,\n currentMonitorUrl,\n} from './plugins';\nexport type { LiveMonitorOptions, MonitorConfig } from './plugins';\nexport type {\n BeaconCtx,\n BeaconPlugin,\n BeaconLifecycleEvent,\n BeaconStatus,\n FeedbackPayload,\n FormField,\n InitOptions,\n LabelMap,\n PluginEntry,\n PluginFailureEntry,\n PluginStatus,\n PluginSuccessEntry,\n Position,\n Severity,\n SystemEvent,\n Theme,\n TransportResponse,\n} from './types';\nexport { isPluginFailure } from './types';\n","export function resolveUrl(url, baseUrl) {\n // url is absolute already\n if (url.match(/^[a-z]+:\\/\\//i)) {\n return url;\n }\n // url is absolute already, without protocol\n if (url.match(/^\\/\\//)) {\n return window.location.protocol + url;\n }\n // dataURI, mailto:, tel:, etc.\n if (url.match(/^[a-z]+:/i)) {\n return url;\n }\n const doc = document.implementation.createHTMLDocument();\n const base = doc.createElement('base');\n const a = doc.createElement('a');\n doc.head.appendChild(base);\n doc.body.appendChild(a);\n if (baseUrl) {\n base.href = baseUrl;\n }\n a.href = url;\n return a.href;\n}\nexport const uuid = (() => {\n // generate uuid for className of pseudo elements.\n // We should not use GUIDs, otherwise pseudo elements sometimes cannot be captured.\n let counter = 0;\n // ref: http://stackoverflow.com/a/6248722/2519373\n const random = () => \n // eslint-disable-next-line no-bitwise\n `0000${((Math.random() * 36 ** 4) << 0).toString(36)}`.slice(-4);\n return () => {\n counter += 1;\n return `u${random()}${counter}`;\n };\n})();\nexport function delay(ms) {\n return (args) => new Promise((resolve) => {\n setTimeout(() => resolve(args), ms);\n });\n}\nexport function toArray(arrayLike) {\n const arr = [];\n for (let i = 0, l = arrayLike.length; i < l; i++) {\n arr.push(arrayLike[i]);\n }\n return arr;\n}\nlet styleProps = null;\nexport function getStyleProperties(options = {}) {\n if (styleProps) {\n return styleProps;\n }\n if (options.includeStyleProperties) {\n styleProps = options.includeStyleProperties;\n return styleProps;\n }\n styleProps = toArray(window.getComputedStyle(document.documentElement));\n return styleProps;\n}\nfunction px(node, styleProperty) {\n const win = node.ownerDocument.defaultView || window;\n const val = win.getComputedStyle(node).getPropertyValue(styleProperty);\n return val ? parseFloat(val.replace('px', '')) : 0;\n}\nfunction getNodeWidth(node) {\n const leftBorder = px(node, 'border-left-width');\n const rightBorder = px(node, 'border-right-width');\n return node.clientWidth + leftBorder + rightBorder;\n}\nfunction getNodeHeight(node) {\n const topBorder = px(node, 'border-top-width');\n const bottomBorder = px(node, 'border-bottom-width');\n return node.clientHeight + topBorder + bottomBorder;\n}\nexport function getImageSize(targetNode, options = {}) {\n const width = options.width || getNodeWidth(targetNode);\n const height = options.height || getNodeHeight(targetNode);\n return { width, height };\n}\nexport function getPixelRatio() {\n let ratio;\n let FINAL_PROCESS;\n try {\n FINAL_PROCESS = process;\n }\n catch (e) {\n // pass\n }\n const val = FINAL_PROCESS && FINAL_PROCESS.env\n ? FINAL_PROCESS.env.devicePixelRatio\n : null;\n if (val) {\n ratio = parseInt(val, 10);\n if (Number.isNaN(ratio)) {\n ratio = 1;\n }\n }\n return ratio || window.devicePixelRatio || 1;\n}\n// @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/canvas#maximum_canvas_size\nconst canvasDimensionLimit = 16384;\nexport function checkCanvasDimensions(canvas) {\n if (canvas.width > canvasDimensionLimit ||\n canvas.height > canvasDimensionLimit) {\n if (canvas.width > canvasDimensionLimit &&\n canvas.height > canvasDimensionLimit) {\n if (canvas.width > canvas.height) {\n canvas.height *= canvasDimensionLimit / canvas.width;\n canvas.width = canvasDimensionLimit;\n }\n else {\n canvas.width *= canvasDimensionLimit / canvas.height;\n canvas.height = canvasDimensionLimit;\n }\n }\n else if (canvas.width > canvasDimensionLimit) {\n canvas.height *= canvasDimensionLimit / canvas.width;\n canvas.width = canvasDimensionLimit;\n }\n else {\n canvas.width *= canvasDimensionLimit / canvas.height;\n canvas.height = canvasDimensionLimit;\n }\n }\n}\nexport function canvasToBlob(canvas, options = {}) {\n if (canvas.toBlob) {\n return new Promise((resolve) => {\n canvas.toBlob(resolve, options.type ? options.type : 'image/png', options.quality ? options.quality : 1);\n });\n }\n return new Promise((resolve) => {\n const binaryString = window.atob(canvas\n .toDataURL(options.type ? options.type : undefined, options.quality ? options.quality : undefined)\n .split(',')[1]);\n const len = binaryString.length;\n const binaryArray = new Uint8Array(len);\n for (let i = 0; i < len; i += 1) {\n binaryArray[i] = binaryString.charCodeAt(i);\n }\n resolve(new Blob([binaryArray], {\n type: options.type ? options.type : 'image/png',\n }));\n });\n}\nexport function createImage(url) {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n img.decode().then(() => {\n requestAnimationFrame(() => resolve(img));\n });\n };\n img.onerror = reject;\n img.crossOrigin = 'anonymous';\n img.decoding = 'async';\n img.src = url;\n });\n}\nexport async function svgToDataURL(svg) {\n return Promise.resolve()\n .then(() => new XMLSerializer().serializeToString(svg))\n .then(encodeURIComponent)\n .then((html) => `data:image/svg+xml;charset=utf-8,${html}`);\n}\nexport async function nodeToDataURL(node, width, height) {\n const xmlns = 'http://www.w3.org/2000/svg';\n const svg = document.createElementNS(xmlns, 'svg');\n const foreignObject = document.createElementNS(xmlns, 'foreignObject');\n svg.setAttribute('width', `${width}`);\n svg.setAttribute('height', `${height}`);\n svg.setAttribute('viewBox', `0 0 ${width} ${height}`);\n foreignObject.setAttribute('width', '100%');\n foreignObject.setAttribute('height', '100%');\n foreignObject.setAttribute('x', '0');\n foreignObject.setAttribute('y', '0');\n foreignObject.setAttribute('externalResourcesRequired', 'true');\n svg.appendChild(foreignObject);\n foreignObject.appendChild(node);\n return svgToDataURL(svg);\n}\nexport const isInstanceOfElement = (node, instance) => {\n if (node instanceof instance)\n return true;\n const nodePrototype = Object.getPrototypeOf(node);\n if (nodePrototype === null)\n return false;\n return (nodePrototype.constructor.name === instance.name ||\n isInstanceOfElement(nodePrototype, instance));\n};\n//# sourceMappingURL=util.js.map","import { uuid, getStyleProperties } from './util';\nfunction formatCSSText(style) {\n const content = style.getPropertyValue('content');\n return `${style.cssText} content: '${content.replace(/'|\"/g, '')}';`;\n}\nfunction formatCSSProperties(style, options) {\n return getStyleProperties(options)\n .map((name) => {\n const value = style.getPropertyValue(name);\n const priority = style.getPropertyPriority(name);\n return `${name}: ${value}${priority ? ' !important' : ''};`;\n })\n .join(' ');\n}\nfunction getPseudoElementStyle(className, pseudo, style, options) {\n const selector = `.${className}:${pseudo}`;\n const cssText = style.cssText\n ? formatCSSText(style)\n : formatCSSProperties(style, options);\n return document.createTextNode(`${selector}{${cssText}}`);\n}\nfunction clonePseudoElement(nativeNode, clonedNode, pseudo, options) {\n const style = window.getComputedStyle(nativeNode, pseudo);\n const content = style.getPropertyValue('content');\n if (content === '' || content === 'none') {\n return;\n }\n const className = uuid();\n try {\n clonedNode.className = `${clonedNode.className} ${className}`;\n }\n catch (err) {\n return;\n }\n const styleElement = document.createElement('style');\n styleElement.appendChild(getPseudoElementStyle(className, pseudo, style, options));\n clonedNode.appendChild(styleElement);\n}\nexport function clonePseudoElements(nativeNode, clonedNode, options) {\n clonePseudoElement(nativeNode, clonedNode, ':before', options);\n clonePseudoElement(nativeNode, clonedNode, ':after', options);\n}\n//# sourceMappingURL=clone-pseudos.js.map","const WOFF = 'application/font-woff';\nconst JPEG = 'image/jpeg';\nconst mimes = {\n woff: WOFF,\n woff2: WOFF,\n ttf: 'application/font-truetype',\n eot: 'application/vnd.ms-fontobject',\n png: 'image/png',\n jpg: JPEG,\n jpeg: JPEG,\n gif: 'image/gif',\n tiff: 'image/tiff',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n};\nfunction getExtension(url) {\n const match = /\\.([^./]*?)$/g.exec(url);\n return match ? match[1] : '';\n}\nexport function getMimeType(url) {\n const extension = getExtension(url).toLowerCase();\n return mimes[extension] || '';\n}\n//# sourceMappingURL=mimes.js.map","function getContentFromDataUrl(dataURL) {\n return dataURL.split(/,/)[1];\n}\nexport function isDataUrl(url) {\n return url.search(/^(data:)/) !== -1;\n}\nexport function makeDataUrl(content, mimeType) {\n return `data:${mimeType};base64,${content}`;\n}\nexport async function fetchAsDataURL(url, init, process) {\n const res = await fetch(url, init);\n if (res.status === 404) {\n throw new Error(`Resource \"${res.url}\" not found`);\n }\n const blob = await res.blob();\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onerror = reject;\n reader.onloadend = () => {\n try {\n resolve(process({ res, result: reader.result }));\n }\n catch (error) {\n reject(error);\n }\n };\n reader.readAsDataURL(blob);\n });\n}\nconst cache = {};\nfunction getCacheKey(url, contentType, includeQueryParams) {\n let key = url.replace(/\\?.*/, '');\n if (includeQueryParams) {\n key = url;\n }\n // font resource\n if (/ttf|otf|eot|woff2?/i.test(key)) {\n key = key.replace(/.*\\//, '');\n }\n return contentType ? `[${contentType}]${key}` : key;\n}\nexport async function resourceToDataURL(resourceUrl, contentType, options) {\n const cacheKey = getCacheKey(resourceUrl, contentType, options.includeQueryParams);\n if (cache[cacheKey] != null) {\n return cache[cacheKey];\n }\n // ref: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache\n if (options.cacheBust) {\n // eslint-disable-next-line no-param-reassign\n resourceUrl += (/\\?/.test(resourceUrl) ? '&' : '?') + new Date().getTime();\n }\n let dataURL;\n try {\n const content = await fetchAsDataURL(resourceUrl, options.fetchRequestInit, ({ res, result }) => {\n if (!contentType) {\n // eslint-disable-next-line no-param-reassign\n contentType = res.headers.get('Content-Type') || '';\n }\n return getContentFromDataUrl(result);\n });\n dataURL = makeDataUrl(content, contentType);\n }\n catch (error) {\n dataURL = options.imagePlaceholder || '';\n let msg = `Failed to fetch resource: ${resourceUrl}`;\n if (error) {\n msg = typeof error === 'string' ? error : error.message;\n }\n if (msg) {\n console.warn(msg);\n }\n }\n cache[cacheKey] = dataURL;\n return dataURL;\n}\n//# sourceMappingURL=dataurl.js.map","import { clonePseudoElements } from './clone-pseudos';\nimport { createImage, toArray, isInstanceOfElement, getStyleProperties, } from './util';\nimport { getMimeType } from './mimes';\nimport { resourceToDataURL } from './dataurl';\nasync function cloneCanvasElement(canvas) {\n const dataURL = canvas.toDataURL();\n if (dataURL === 'data:,') {\n return canvas.cloneNode(false);\n }\n return createImage(dataURL);\n}\nasync function cloneVideoElement(video, options) {\n if (video.currentSrc) {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n canvas.width = video.clientWidth;\n canvas.height = video.clientHeight;\n ctx === null || ctx === void 0 ? void 0 : ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n const dataURL = canvas.toDataURL();\n return createImage(dataURL);\n }\n const poster = video.poster;\n const contentType = getMimeType(poster);\n const dataURL = await resourceToDataURL(poster, contentType, options);\n return createImage(dataURL);\n}\nasync function cloneIFrameElement(iframe, options) {\n var _a;\n try {\n if ((_a = iframe === null || iframe === void 0 ? void 0 : iframe.contentDocument) === null || _a === void 0 ? void 0 : _a.body) {\n return (await cloneNode(iframe.contentDocument.body, options, true));\n }\n }\n catch (_b) {\n // Failed to clone iframe\n }\n return iframe.cloneNode(false);\n}\nasync function cloneSingleNode(node, options) {\n if (isInstanceOfElement(node, HTMLCanvasElement)) {\n return cloneCanvasElement(node);\n }\n if (isInstanceOfElement(node, HTMLVideoElement)) {\n return cloneVideoElement(node, options);\n }\n if (isInstanceOfElement(node, HTMLIFrameElement)) {\n return cloneIFrameElement(node, options);\n }\n return node.cloneNode(isSVGElement(node));\n}\nconst isSlotElement = (node) => node.tagName != null && node.tagName.toUpperCase() === 'SLOT';\nconst isSVGElement = (node) => node.tagName != null && node.tagName.toUpperCase() === 'SVG';\nasync function cloneChildren(nativeNode, clonedNode, options) {\n var _a, _b;\n if (isSVGElement(clonedNode)) {\n return clonedNode;\n }\n let children = [];\n if (isSlotElement(nativeNode) && nativeNode.assignedNodes) {\n children = toArray(nativeNode.assignedNodes());\n }\n else if (isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n ((_a = nativeNode.contentDocument) === null || _a === void 0 ? void 0 : _a.body)) {\n children = toArray(nativeNode.contentDocument.body.childNodes);\n }\n else {\n children = toArray(((_b = nativeNode.shadowRoot) !== null && _b !== void 0 ? _b : nativeNode).childNodes);\n }\n if (children.length === 0 ||\n isInstanceOfElement(nativeNode, HTMLVideoElement)) {\n return clonedNode;\n }\n await children.reduce((deferred, child) => deferred\n .then(() => cloneNode(child, options))\n .then((clonedChild) => {\n if (clonedChild) {\n clonedNode.appendChild(clonedChild);\n }\n }), Promise.resolve());\n return clonedNode;\n}\nfunction cloneCSSStyle(nativeNode, clonedNode, options) {\n const targetStyle = clonedNode.style;\n if (!targetStyle) {\n return;\n }\n const sourceStyle = window.getComputedStyle(nativeNode);\n if (sourceStyle.cssText) {\n targetStyle.cssText = sourceStyle.cssText;\n targetStyle.transformOrigin = sourceStyle.transformOrigin;\n }\n else {\n getStyleProperties(options).forEach((name) => {\n let value = sourceStyle.getPropertyValue(name);\n if (name === 'font-size' && value.endsWith('px')) {\n const reducedFont = Math.floor(parseFloat(value.substring(0, value.length - 2))) - 0.1;\n value = `${reducedFont}px`;\n }\n if (isInstanceOfElement(nativeNode, HTMLIFrameElement) &&\n name === 'display' &&\n value === 'inline') {\n value = 'block';\n }\n if (name === 'd' && clonedNode.getAttribute('d')) {\n value = `path(${clonedNode.getAttribute('d')})`;\n }\n targetStyle.setProperty(name, value, sourceStyle.getPropertyPriority(name));\n });\n }\n}\nfunction cloneInputValue(nativeNode, clonedNode) {\n if (isInstanceOfElement(nativeNode, HTMLTextAreaElement)) {\n clonedNode.innerHTML = nativeNode.value;\n }\n if (isInstanceOfElement(nativeNode, HTMLInputElement)) {\n clonedNode.setAttribute('value', nativeNode.value);\n }\n}\nfunction cloneSelectValue(nativeNode, clonedNode) {\n if (isInstanceOfElement(nativeNode, HTMLSelectElement)) {\n const clonedSelect = clonedNode;\n const selectedOption = Array.from(clonedSelect.children).find((child) => nativeNode.value === child.getAttribute('value'));\n if (selectedOption) {\n selectedOption.setAttribute('selected', '');\n }\n }\n}\nfunction decorate(nativeNode, clonedNode, options) {\n if (isInstanceOfElement(clonedNode, Element)) {\n cloneCSSStyle(nativeNode, clonedNode, options);\n clonePseudoElements(nativeNode, clonedNode, options);\n cloneInputValue(nativeNode, clonedNode);\n cloneSelectValue(nativeNode, clonedNode);\n }\n return clonedNode;\n}\nasync function ensureSVGSymbols(clone, options) {\n const uses = clone.querySelectorAll ? clone.querySelectorAll('use') : [];\n if (uses.length === 0) {\n return clone;\n }\n const processedDefs = {};\n for (let i = 0; i < uses.length; i++) {\n const use = uses[i];\n const id = use.getAttribute('xlink:href');\n if (id) {\n const exist = clone.querySelector(id);\n const definition = document.querySelector(id);\n if (!exist && definition && !processedDefs[id]) {\n // eslint-disable-next-line no-await-in-loop\n processedDefs[id] = (await cloneNode(definition, options, true));\n }\n }\n }\n const nodes = Object.values(processedDefs);\n if (nodes.length) {\n const ns = 'http://www.w3.org/1999/xhtml';\n const svg = document.createElementNS(ns, 'svg');\n svg.setAttribute('xmlns', ns);\n svg.style.position = 'absolute';\n svg.style.width = '0';\n svg.style.height = '0';\n svg.style.overflow = 'hidden';\n svg.style.display = 'none';\n const defs = document.createElementNS(ns, 'defs');\n svg.appendChild(defs);\n for (let i = 0; i < nodes.length; i++) {\n defs.appendChild(nodes[i]);\n }\n clone.appendChild(svg);\n }\n return clone;\n}\nexport async function cloneNode(node, options, isRoot) {\n if (!isRoot && options.filter && !options.filter(node)) {\n return null;\n }\n return Promise.resolve(node)\n .then((clonedNode) => cloneSingleNode(clonedNode, options))\n .then((clonedNode) => cloneChildren(node, clonedNode, options))\n .then((clonedNode) => decorate(node, clonedNode, options))\n .then((clonedNode) => ensureSVGSymbols(clonedNode, options));\n}\n//# sourceMappingURL=clone-node.js.map","import { resolveUrl } from './util';\nimport { getMimeType } from './mimes';\nimport { isDataUrl, makeDataUrl, resourceToDataURL } from './dataurl';\nconst URL_REGEX = /url\\((['\"]?)([^'\"]+?)\\1\\)/g;\nconst URL_WITH_FORMAT_REGEX = /url\\([^)]+\\)\\s*format\\(([\"']?)([^\"']+)\\1\\)/g;\nconst FONT_SRC_REGEX = /src:\\s*(?:url\\([^)]+\\)\\s*format\\([^)]+\\)[,;]\\s*)+/g;\nfunction toRegex(url) {\n // eslint-disable-next-line no-useless-escape\n const escaped = url.replace(/([.*+?^${}()|\\[\\]\\/\\\\])/g, '\\\\$1');\n return new RegExp(`(url\\\\(['\"]?)(${escaped})(['\"]?\\\\))`, 'g');\n}\nexport function parseURLs(cssText) {\n const urls = [];\n cssText.replace(URL_REGEX, (raw, quotation, url) => {\n urls.push(url);\n return raw;\n });\n return urls.filter((url) => !isDataUrl(url));\n}\nexport async function embed(cssText, resourceURL, baseURL, options, getContentFromUrl) {\n try {\n const resolvedURL = baseURL ? resolveUrl(resourceURL, baseURL) : resourceURL;\n const contentType = getMimeType(resourceURL);\n let dataURL;\n if (getContentFromUrl) {\n const content = await getContentFromUrl(resolvedURL);\n dataURL = makeDataUrl(content, contentType);\n }\n else {\n dataURL = await resourceToDataURL(resolvedURL, contentType, options);\n }\n return cssText.replace(toRegex(resourceURL), `$1${dataURL}$3`);\n }\n catch (error) {\n // pass\n }\n return cssText;\n}\nfunction filterPreferredFontFormat(str, { preferredFontFormat }) {\n return !preferredFontFormat\n ? str\n : str.replace(FONT_SRC_REGEX, (match) => {\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const [src, , format] = URL_WITH_FORMAT_REGEX.exec(match) || [];\n if (!format) {\n return '';\n }\n if (format === preferredFontFormat) {\n return `src: ${src};`;\n }\n }\n });\n}\nexport function shouldEmbed(url) {\n return url.search(URL_REGEX) !== -1;\n}\nexport async function embedResources(cssText, baseUrl, options) {\n if (!shouldEmbed(cssText)) {\n return cssText;\n }\n const filteredCSSText = filterPreferredFontFormat(cssText, options);\n const urls = parseURLs(filteredCSSText);\n return urls.reduce((deferred, url) => deferred.then((css) => embed(css, url, baseUrl, options)), Promise.resolve(filteredCSSText));\n}\n//# sourceMappingURL=embed-resources.js.map","import { embedResources } from './embed-resources';\nimport { toArray, isInstanceOfElement } from './util';\nimport { isDataUrl, resourceToDataURL } from './dataurl';\nimport { getMimeType } from './mimes';\nasync function embedProp(propName, node, options) {\n var _a;\n const propValue = (_a = node.style) === null || _a === void 0 ? void 0 : _a.getPropertyValue(propName);\n if (propValue) {\n const cssString = await embedResources(propValue, null, options);\n node.style.setProperty(propName, cssString, node.style.getPropertyPriority(propName));\n return true;\n }\n return false;\n}\nasync function embedBackground(clonedNode, options) {\n ;\n (await embedProp('background', clonedNode, options)) ||\n (await embedProp('background-image', clonedNode, options));\n (await embedProp('mask', clonedNode, options)) ||\n (await embedProp('-webkit-mask', clonedNode, options)) ||\n (await embedProp('mask-image', clonedNode, options)) ||\n (await embedProp('-webkit-mask-image', clonedNode, options));\n}\nasync function embedImageNode(clonedNode, options) {\n const isImageElement = isInstanceOfElement(clonedNode, HTMLImageElement);\n if (!(isImageElement && !isDataUrl(clonedNode.src)) &&\n !(isInstanceOfElement(clonedNode, SVGImageElement) &&\n !isDataUrl(clonedNode.href.baseVal))) {\n return;\n }\n const url = isImageElement ? clonedNode.src : clonedNode.href.baseVal;\n const dataURL = await resourceToDataURL(url, getMimeType(url), options);\n await new Promise((resolve, reject) => {\n clonedNode.onload = resolve;\n clonedNode.onerror = options.onImageErrorHandler\n ? (...attributes) => {\n try {\n resolve(options.onImageErrorHandler(...attributes));\n }\n catch (error) {\n reject(error);\n }\n }\n : reject;\n const image = clonedNode;\n if (image.decode) {\n image.decode = resolve;\n }\n if (image.loading === 'lazy') {\n image.loading = 'eager';\n }\n if (isImageElement) {\n clonedNode.srcset = '';\n clonedNode.src = dataURL;\n }\n else {\n clonedNode.href.baseVal = dataURL;\n }\n });\n}\nasync function embedChildren(clonedNode, options) {\n const children = toArray(clonedNode.childNodes);\n const deferreds = children.map((child) => embedImages(child, options));\n await Promise.all(deferreds).then(() => clonedNode);\n}\nexport async function embedImages(clonedNode, options) {\n if (isInstanceOfElement(clonedNode, Element)) {\n await embedBackground(clonedNode, options);\n await embedImageNode(clonedNode, options);\n await embedChildren(clonedNode, options);\n }\n}\n//# sourceMappingURL=embed-images.js.map","export function applyStyle(node, options) {\n const { style } = node;\n if (options.backgroundColor) {\n style.backgroundColor = options.backgroundColor;\n }\n if (options.width) {\n style.width = `${options.width}px`;\n }\n if (options.height) {\n style.height = `${options.height}px`;\n }\n const manual = options.style;\n if (manual != null) {\n Object.keys(manual).forEach((key) => {\n style[key] = manual[key];\n });\n }\n return node;\n}\n//# sourceMappingURL=apply-style.js.map","import { toArray } from './util';\nimport { fetchAsDataURL } from './dataurl';\nimport { shouldEmbed, embedResources } from './embed-resources';\nconst cssFetchCache = {};\nasync function fetchCSS(url) {\n let cache = cssFetchCache[url];\n if (cache != null) {\n return cache;\n }\n const res = await fetch(url);\n const cssText = await res.text();\n cache = { url, cssText };\n cssFetchCache[url] = cache;\n return cache;\n}\nasync function embedFonts(data, options) {\n let cssText = data.cssText;\n const regexUrl = /url\\([\"']?([^\"')]+)[\"']?\\)/g;\n const fontLocs = cssText.match(/url\\([^)]+\\)/g) || [];\n const loadFonts = fontLocs.map(async (loc) => {\n let url = loc.replace(regexUrl, '$1');\n if (!url.startsWith('https://')) {\n url = new URL(url, data.url).href;\n }\n return fetchAsDataURL(url, options.fetchRequestInit, ({ result }) => {\n cssText = cssText.replace(loc, `url(${result})`);\n return [loc, result];\n });\n });\n return Promise.all(loadFonts).then(() => cssText);\n}\nfunction parseCSS(source) {\n if (source == null) {\n return [];\n }\n const result = [];\n const commentsRegex = /(\\/\\*[\\s\\S]*?\\*\\/)/gi;\n // strip out comments\n let cssText = source.replace(commentsRegex, '');\n // eslint-disable-next-line prefer-regex-literals\n const keyframesRegex = new RegExp('((@.*?keyframes [\\\\s\\\\S]*?){([\\\\s\\\\S]*?}\\\\s*?)})', 'gi');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const matches = keyframesRegex.exec(cssText);\n if (matches === null) {\n break;\n }\n result.push(matches[0]);\n }\n cssText = cssText.replace(keyframesRegex, '');\n const importRegex = /@import[\\s\\S]*?url\\([^)]*\\)[\\s\\S]*?;/gi;\n // to match css & media queries together\n const combinedCSSRegex = '((\\\\s*?(?:\\\\/\\\\*[\\\\s\\\\S]*?\\\\*\\\\/)?\\\\s*?@media[\\\\s\\\\S]' +\n '*?){([\\\\s\\\\S]*?)}\\\\s*?})|(([\\\\s\\\\S]*?){([\\\\s\\\\S]*?)})';\n // unified regex\n const unifiedRegex = new RegExp(combinedCSSRegex, 'gi');\n // eslint-disable-next-line no-constant-condition\n while (true) {\n let matches = importRegex.exec(cssText);\n if (matches === null) {\n matches = unifiedRegex.exec(cssText);\n if (matches === null) {\n break;\n }\n else {\n importRegex.lastIndex = unifiedRegex.lastIndex;\n }\n }\n else {\n unifiedRegex.lastIndex = importRegex.lastIndex;\n }\n result.push(matches[0]);\n }\n return result;\n}\nasync function getCSSRules(styleSheets, options) {\n const ret = [];\n const deferreds = [];\n // First loop inlines imports\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray(sheet.cssRules || []).forEach((item, index) => {\n if (item.type === CSSRule.IMPORT_RULE) {\n let importIndex = index + 1;\n const url = item.href;\n const deferred = fetchCSS(url)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) => parseCSS(cssText).forEach((rule) => {\n try {\n sheet.insertRule(rule, rule.startsWith('@import')\n ? (importIndex += 1)\n : sheet.cssRules.length);\n }\n catch (error) {\n console.error('Error inserting rule from remote css', {\n rule,\n error,\n });\n }\n }))\n .catch((e) => {\n console.error('Error loading remote css', e.toString());\n });\n deferreds.push(deferred);\n }\n });\n }\n catch (e) {\n const inline = styleSheets.find((a) => a.href == null) || document.styleSheets[0];\n if (sheet.href != null) {\n deferreds.push(fetchCSS(sheet.href)\n .then((metadata) => embedFonts(metadata, options))\n .then((cssText) => parseCSS(cssText).forEach((rule) => {\n inline.insertRule(rule, inline.cssRules.length);\n }))\n .catch((err) => {\n console.error('Error loading remote stylesheet', err);\n }));\n }\n console.error('Error inlining remote css file', e);\n }\n }\n });\n return Promise.all(deferreds).then(() => {\n // Second loop parses rules\n styleSheets.forEach((sheet) => {\n if ('cssRules' in sheet) {\n try {\n toArray(sheet.cssRules || []).forEach((item) => {\n ret.push(item);\n });\n }\n catch (e) {\n console.error(`Error while reading CSS rules from ${sheet.href}`, e);\n }\n }\n });\n return ret;\n });\n}\nfunction getWebFontRules(cssRules) {\n return cssRules\n .filter((rule) => rule.type === CSSRule.FONT_FACE_RULE)\n .filter((rule) => shouldEmbed(rule.style.getPropertyValue('src')));\n}\nasync function parseWebFontRules(node, options) {\n if (node.ownerDocument == null) {\n throw new Error('Provided element is not within a Document');\n }\n const styleSheets = toArray(node.ownerDocument.styleSheets);\n const cssRules = await getCSSRules(styleSheets, options);\n return getWebFontRules(cssRules);\n}\nfunction normalizeFontFamily(font) {\n return font.trim().replace(/[\"']/g, '');\n}\nfunction getUsedFonts(node) {\n const fonts = new Set();\n function traverse(node) {\n const fontFamily = node.style.fontFamily || getComputedStyle(node).fontFamily;\n fontFamily.split(',').forEach((font) => {\n fonts.add(normalizeFontFamily(font));\n });\n Array.from(node.children).forEach((child) => {\n if (child instanceof HTMLElement) {\n traverse(child);\n }\n });\n }\n traverse(node);\n return fonts;\n}\nexport async function getWebFontCSS(node, options) {\n const rules = await parseWebFontRules(node, options);\n const usedFonts = getUsedFonts(node);\n const cssTexts = await Promise.all(rules\n .filter((rule) => usedFonts.has(normalizeFontFamily(rule.style.fontFamily)))\n .map((rule) => {\n const baseUrl = rule.parentStyleSheet\n ? rule.parentStyleSheet.href\n : null;\n return embedResources(rule.cssText, baseUrl, options);\n }));\n return cssTexts.join('\\n');\n}\nexport async function embedWebFonts(clonedNode, options) {\n const cssText = options.fontEmbedCSS != null\n ? options.fontEmbedCSS\n : options.skipFonts\n ? null\n : await getWebFontCSS(clonedNode, options);\n if (cssText) {\n const styleNode = document.createElement('style');\n const sytleContent = document.createTextNode(cssText);\n styleNode.appendChild(sytleContent);\n if (clonedNode.firstChild) {\n clonedNode.insertBefore(styleNode, clonedNode.firstChild);\n }\n else {\n clonedNode.appendChild(styleNode);\n }\n }\n}\n//# sourceMappingURL=embed-webfonts.js.map","import { cloneNode } from './clone-node';\nimport { embedImages } from './embed-images';\nimport { applyStyle } from './apply-style';\nimport { embedWebFonts, getWebFontCSS } from './embed-webfonts';\nimport { getImageSize, getPixelRatio, createImage, canvasToBlob, nodeToDataURL, checkCanvasDimensions, } from './util';\nexport async function toSvg(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const clonedNode = (await cloneNode(node, options, true));\n await embedWebFonts(clonedNode, options);\n await embedImages(clonedNode, options);\n applyStyle(clonedNode, options);\n const datauri = await nodeToDataURL(clonedNode, width, height);\n return datauri;\n}\nexport async function toCanvas(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const svg = await toSvg(node, options);\n const img = await createImage(svg);\n const canvas = document.createElement('canvas');\n const context = canvas.getContext('2d');\n const ratio = options.pixelRatio || getPixelRatio();\n const canvasWidth = options.canvasWidth || width;\n const canvasHeight = options.canvasHeight || height;\n canvas.width = canvasWidth * ratio;\n canvas.height = canvasHeight * ratio;\n if (!options.skipAutoScale) {\n checkCanvasDimensions(canvas);\n }\n canvas.style.width = `${canvasWidth}`;\n canvas.style.height = `${canvasHeight}`;\n if (options.backgroundColor) {\n context.fillStyle = options.backgroundColor;\n context.fillRect(0, 0, canvas.width, canvas.height);\n }\n context.drawImage(img, 0, 0, canvas.width, canvas.height);\n return canvas;\n}\nexport async function toPixelData(node, options = {}) {\n const { width, height } = getImageSize(node, options);\n const canvas = await toCanvas(node, options);\n const ctx = canvas.getContext('2d');\n return ctx.getImageData(0, 0, width, height).data;\n}\nexport async function toPng(node, options = {}) {\n const canvas = await toCanvas(node, options);\n return canvas.toDataURL();\n}\nexport async function toJpeg(node, options = {}) {\n const canvas = await toCanvas(node, options);\n return canvas.toDataURL('image/jpeg', options.quality || 1);\n}\nexport async function toBlob(node, options = {}) {\n const canvas = await toCanvas(node, options);\n const blob = await canvasToBlob(canvas);\n return blob;\n}\nexport async function getFontEmbedCSS(node, options = {}) {\n return getWebFontCSS(node, options);\n}\n//# sourceMappingURL=index.js.map"],"names":["beaconStyles","GLOBAL_STYLE_ID","ensureBeaconBodyStyles","tag","SVG_NS","iconMegaphone","s","p1","p2","BEACON_TAG","HTMLElementBase","LaunchKitBeacon","style","text","_a","assigned","el","label","span","visible","defineBeaconElement","createCtx","pluginName","host","name","mode","opts","ev","handler","DuplicatePluginNameError","createRegistry","plugins","seen","p","entries","plugin","makeCtx","onError","e","teardown","err","error","_getCaptured","out","result","entry","wrapResult","wrapFailure","version","v","postFeedback","endpoint","payload","headers","signal","credentials","resolvedHeaders","resolveHeaders","response","body","renderFields","slot","fields","field","wrap","desc","control","renderControl","current","root","input","initial","ta","sel","opt","o","group","_b","iconClose","DialogView","labels","severities","callbacks","header","title","closeBtn","descField","descLabel","sevField","sevLabel","sev","actions","released","on","reason","value","kind","submitting","sources","formValuesHost","src","panel","titleEl","cleanup","fn","defaultLabels","createOverlayHost","shadow","layer","attachOverlay","render","getUaData","nav","b","metadata","uaData","MAX_EVENTS","MESSAGE_LIMIT","STACK_LIMIT","SOURCE_LIMIT","DEDUPE_WINDOW_MS","BEACON_STACK_PATTERN","trunc","limit","signature","message","stack","stackHead","fromBeacon","safeStringify","createEventBuffer","buffer","recentSignatures","listeners","installed","onRejection","push","event","sig","last","errMessage","errStack","errors","ctx","uninstall","wrapper","summary","dot","list","update","events","count","li","msg","unsub","MAX_DEPTH","isUniqueId","id","tagWithClasses","classes","c","nthOfTypeIndex","parent","buildSelector","target","parts","depth","base","part","currentClasses","detectReact","keys","k","fiber","i","f","type","detectVue","anyEl","vueParent","detectAngular","ng","cmp","ctor","detectSvelte","detectFramework","OUTER_HTML_LIMIT","PARENT_OUTER_HTML_LIMIT","SELECTOR_LIMIT","ID_LIMIT","CLASSLIST_MAX_ENTRIES","CLASS_NAME_LIMIT","STYLE_VALUE_LIMIT","USEFUL_STYLE_PROPS","truncate","max","pickStyles","computed","prop","capClassList","captureElement","rect","rawSelector","rawId","framework","MARKER_RADIUS","MARKER_STROKE","MARKER_TEXT","OUTLINE_WIDTH","DEFAULT_ACCENT","drawMarkers","screenshotDataUrl","pins","viewport","accent","img","loadImage","canvas","scaleX","scaleY","pin","getFreshRect","x","y","w","h","cx","cy","r","found","resolve","reject","NO_CAPTURE_CLASS","DEFAULT_HINT","withAlpha","color","alphaHex","createPickModeOverlay","ACCENT","ACCENT_BORDER","ACCENT_GLOW","styleTag","frame","hint","SPINNER_HTML","escapeHtml","tracked","makeMarker","num","m","makeOutline","placeAt","isStale","opacity","hide","reposition","liveTarget","fr","raf","schedule","anchor","marker","outline","ICON_CLOSE","ICON_CHECK","showPinPopover","popover","POPOVER_W","POPOVER_H","left","top","textarea","close","handleGlobalKey","action","note","startPicker","shadowRoot","onHover","accentFill","tooltip","previousCursor","resolved","resolvePromise","promise","res","isWidgetElement","node","findTarget","candidates","positionOutline","cls","above","handleMove","handlePointerDown","swallow","handleKey","finish","htmlToImage","load","index","TRANSPARENT_PIXEL","isUrlSafeForCanvas","rawUrl","crossOriginAttr","neutralizeCrossOriginImages","stashedImg","stashedSvg","svgImg","href","xlink","url","captureScreenshot","quality","pixelRatio","excludeShadowRoot","excludeHosts","lib","filter","cur","restore","cached","setAnnotationCache","getAnnotationCache","clearAnnotationCache","iconTrash","paths","d","domEle","maxPins","pinElements","cachedAnnotatedDataUrl","headerEl","listEl","previewEl","btnEl","reset","renderList","renderPreview","findShadowRoot","resolveAccent","enterAnnotateMode","release","overlay","keepPicking","captured","beaconHosts","raw","markers","annotated","deletePin","n","idx","row","meta","noteInput","del","isPluginFailure","domSS","dataUrl","domEleEntry","readPinsFromEntry","readAccent","pinsRaw","POS_STORAGE_KEY","createMonitorOverlay","startedAt","chip","recDot","recLabel","sep","timer","stopBtn","urlEl","readSavedPos","defaultPos","applyPos","clamp","parsed","pos","maxX","maxY","dragging","activePointerId","grabOffset","onPointerDown","onPointerMove","endDrag","onResize","tick","elapsed","formatElapsed","timerId","seconds","pad","TEXT_LIMIT","INTERACTIVE_SELECTOR","HTML_LIMIT","MAX_OVERLAYS","truncText","trimmed","describeTarget","ariaLabel","testid","ancestor","overlaysAtPoint","all","cs","z","a","installClickCapture","cb","handle","me","hit","hitMatches","openDialogs","bodyPe","overlays","onClick","onMouseDown","installRouteCapture","originalPush","originalReplace","lastUrl","emit","via","to","from","args","ret","onPop","onHash","installDialogCapture","selector","obs","mutations","dialogs","_c","_d","installSubmitCapture","form","hasValue","installDomCapture","undoClick","undoRoute","undoDialog","undoSubmit","URL_LIMIT","BODY_LIMIT","REDACTED","MUTATING_METHODS","SECRET_PATTERNS","SENSITIVE_KEYS","redactString","re","redactJsonInPlace","redactBody","contentType","captureBody","original","cap","readRequestBody","init","detectAuth","getRequestContentType","buildRequestCapture","method","hasAuth","bodyText","capture","wrapFetch","wrapped","start","request","durationMs","failed","ct","readXhrSendBody","wrapXhr","proto","originalOpen","originalSend","originalSetRequestHeader","state","rest","lower","onLoadEnd","rt","installNetworkCapture","undoFetch","undoXhr","FLUSH_INTERVAL_MS","FLUSH_AT_COUNT","MAX_BUFFER","MonitorTransport","batch","blob","SESSION_URL_KEY","SESSION_ID_KEY","SESSION_VERBOSE_KEY","SESSION_DEADLINE_KEY","DEFAULT_MAX_SESSION_MS","PROBE_DATA_LIMIT","active","randomSessionId","safeSerialize","walk","notify","stamp","partial","enqueue","persistSession","clearPersistedSession","readPersistedSession","verbose","deadlineRaw","deadlineMs","emitErrorEvent","config","stop","maxMs","sessionId","transport","errorsBuffer","uninstallErrors","existing","drainedThrough","errorsUnsub","net","dom","deadlineTimer","tearDownActive","suspend","probe","data","isActive","currentUrl","subscribe","resumeIfPersisted","persisted","liveMonitor","panelRoot","unsubscribeActive","lastUrlInput","mountOverlay","session.stop","session.currentUrl","destroyOverlay","renderInactive","urlInput","startBtn","verboseLabel","verboseInput","help","session.start","renderActive","rec","session.isActive","session.resumeIfPersisted","unsubscribeOverlay","session.subscribe","onAbort","session.suspend","systemHandlers","destroy","initAbort","resolvePluginList","position","theme","ensureHost","hostElement","overlayHost","dialog","runSubmit","dispatchLifecycle","resetFormState","registry","instance","debugFromUrl","show","makeCtxForPlugin","handlePluginError","dispatchSystem","inst","ns","status","off","defaultPreset","presetMetadata","presetErrors","presetDomEle","presetDomSS","set","description","assemblePayload","cancelReason","pluginEntries","buildMetadata","ref","resolveUrl","baseUrl","doc","uuid","counter","random","toArray","arrayLike","arr","l","styleProps","getStyleProperties","options","px","styleProperty","val","getNodeWidth","leftBorder","rightBorder","getNodeHeight","topBorder","bottomBorder","getImageSize","targetNode","width","height","getPixelRatio","ratio","FINAL_PROCESS","canvasDimensionLimit","checkCanvasDimensions","canvasToBlob","binaryString","len","binaryArray","createImage","svgToDataURL","svg","html","nodeToDataURL","xmlns","foreignObject","isInstanceOfElement","nodePrototype","formatCSSText","content","formatCSSProperties","priority","getPseudoElementStyle","className","pseudo","cssText","clonePseudoElement","nativeNode","clonedNode","styleElement","clonePseudoElements","WOFF","JPEG","mimes","getExtension","match","getMimeType","extension","getContentFromDataUrl","dataURL","isDataUrl","makeDataUrl","mimeType","fetchAsDataURL","process","reader","cache","getCacheKey","includeQueryParams","key","resourceToDataURL","resourceUrl","cacheKey","cloneCanvasElement","cloneVideoElement","video","poster","cloneIFrameElement","iframe","cloneNode","cloneSingleNode","isSVGElement","isSlotElement","cloneChildren","children","deferred","child","clonedChild","cloneCSSStyle","targetStyle","sourceStyle","cloneInputValue","cloneSelectValue","clonedSelect","selectedOption","decorate","ensureSVGSymbols","clone","uses","processedDefs","exist","definition","nodes","defs","isRoot","URL_REGEX","URL_WITH_FORMAT_REGEX","FONT_SRC_REGEX","toRegex","escaped","parseURLs","urls","quotation","embed","resourceURL","baseURL","getContentFromUrl","resolvedURL","filterPreferredFontFormat","str","preferredFontFormat","format","shouldEmbed","embedResources","filteredCSSText","css","embedProp","propName","propValue","cssString","embedBackground","embedImageNode","isImageElement","attributes","image","embedChildren","deferreds","embedImages","applyStyle","manual","cssFetchCache","fetchCSS","embedFonts","regexUrl","loadFonts","loc","parseCSS","source","commentsRegex","keyframesRegex","matches","importRegex","combinedCSSRegex","unifiedRegex","getCSSRules","styleSheets","sheet","item","importIndex","rule","inline","getWebFontRules","cssRules","parseWebFontRules","normalizeFontFamily","font","getUsedFonts","fonts","traverse","getWebFontCSS","rules","usedFonts","embedWebFonts","styleNode","sytleContent","toSvg","toCanvas","context","canvasWidth","canvasHeight","toPixelData","toPng","toJpeg","toBlob","getFontEmbedCSS"],"mappings":"uOAKO,MAAMA,EAAe,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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","x_google_ignoreList":[31,32,33,34,35,36,37,38,39,40]}