makethisbetter 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/api/client.d.ts +5 -0
  2. package/dist/api/client.d.ts.map +1 -1
  3. package/dist/i18n/de.d.ts +6 -0
  4. package/dist/i18n/de.d.ts.map +1 -1
  5. package/dist/i18n/en.d.ts +6 -0
  6. package/dist/i18n/en.d.ts.map +1 -1
  7. package/dist/i18n/es.d.ts +6 -0
  8. package/dist/i18n/es.d.ts.map +1 -1
  9. package/dist/i18n/fr.d.ts +6 -0
  10. package/dist/i18n/fr.d.ts.map +1 -1
  11. package/dist/i18n/ja.d.ts +6 -0
  12. package/dist/i18n/ja.d.ts.map +1 -1
  13. package/dist/i18n/ko.d.ts +6 -0
  14. package/dist/i18n/ko.d.ts.map +1 -1
  15. package/dist/i18n/zh-CN.d.ts +6 -0
  16. package/dist/i18n/zh-CN.d.ts.map +1 -1
  17. package/dist/index.d.cts +8 -0
  18. package/dist/makethisbetter.cjs +95 -0
  19. package/dist/makethisbetter.cjs.map +1 -0
  20. package/dist/makethisbetter.esm.js +649 -485
  21. package/dist/makethisbetter.esm.js.map +1 -1
  22. package/dist/makethisbetter.js +31 -21
  23. package/dist/makethisbetter.js.map +1 -1
  24. package/dist/popup/comment.d.ts +1 -0
  25. package/dist/popup/comment.d.ts.map +1 -1
  26. package/dist/popup/success.d.ts +5 -0
  27. package/dist/popup/success.d.ts.map +1 -1
  28. package/dist/types.d.ts +4 -0
  29. package/dist/types.d.ts.map +1 -1
  30. package/dist/widget/anon-id.d.ts +6 -0
  31. package/dist/widget/anon-id.d.ts.map +1 -0
  32. package/dist/widget/anon-id.test.d.ts +2 -0
  33. package/dist/widget/anon-id.test.d.ts.map +1 -0
  34. package/dist/widget/controller.d.ts +4 -0
  35. package/dist/widget/controller.d.ts.map +1 -1
  36. package/dist/widget/payload.d.ts +1 -1
  37. package/dist/widget/payload.d.ts.map +1 -1
  38. package/package.json +5 -5
  39. package/src/api/client.ts +31 -0
  40. package/src/i18n/de.ts +6 -0
  41. package/src/i18n/en.ts +6 -0
  42. package/src/i18n/es.ts +6 -0
  43. package/src/i18n/fr.ts +6 -0
  44. package/src/i18n/ja.ts +6 -0
  45. package/src/i18n/ko.ts +6 -0
  46. package/src/i18n/zh-CN.ts +6 -0
  47. package/src/popup/comment.ts +5 -0
  48. package/src/popup/success.test.ts +102 -0
  49. package/src/popup/success.ts +55 -1
  50. package/src/styles/widget.css +84 -0
  51. package/src/types.ts +4 -0
  52. package/src/widget/anon-id.test.ts +42 -0
  53. package/src/widget/anon-id.ts +62 -0
  54. package/src/widget/controller.test.ts +440 -0
  55. package/src/widget/controller.ts +59 -14
  56. package/src/widget/payload.test.ts +30 -0
  57. package/src/widget/payload.ts +4 -0
  58. package/dist/makethisbetter.cjs.js +0 -85
  59. package/dist/makethisbetter.cjs.js.map +0 -1
@@ -9,6 +9,11 @@ export declare class ApiClient {
9
9
  resolveUserToken(): Promise<string | undefined>;
10
10
  private authHeaders;
11
11
  submitFeedback(payload: FeedbackPayload, screenshot: Blob | null): Promise<FeedbackResponse>;
12
+ createIdentityToken(reporterExternalId: string): Promise<{
13
+ identity_token: string;
14
+ board_url: string;
15
+ } | null>;
16
+ updateReporter(feedbackId: string, email: string, identityToken: string): Promise<boolean>;
12
17
  startClarification(feedbackId: string, message?: string): Promise<ClarifyResponse>;
13
18
  getClarification(feedbackId: string): Promise<ClarifyResponse>;
14
19
  private fetchWithRetry;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAIlF,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAQ;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAuB;gBAE/B,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC;IAQvH,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAKvC,WAAW;IAQnB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2C5F,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAYlF,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;YAStD,cAAc;CAmB7B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAIlF,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,YAAY,CAAQ;IAC5B,OAAO,CAAC,SAAS,CAAC,CAAQ;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAuB;gBAE/B,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,SAAO,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC;IAQvH,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;YAKvC,WAAW;IAQnB,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6C5F,mBAAmB,CAAC,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAc9G,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe1F,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAYlF,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;YAStD,cAAc;CAmB7B"}
package/dist/i18n/de.d.ts CHANGED
@@ -12,6 +12,7 @@ declare const _default: {
12
12
  placeholder: string;
13
13
  submit: string;
14
14
  cancel: string;
15
+ my_feedback: string;
15
16
  quickOptions: {
16
17
  emoji: string;
17
18
  label: string;
@@ -24,6 +25,11 @@ declare const _default: {
24
25
  message_no_ai: string;
25
26
  view_feedback: string;
26
27
  close: string;
28
+ email_prompt: string;
29
+ email_placeholder: string;
30
+ email_submit: string;
31
+ email_saved: string;
32
+ email_error: string;
27
33
  };
28
34
  error: {
29
35
  submit: string;
@@ -1 +1 @@
1
- {"version":3,"file":"de.d.ts","sourceRoot":"","sources":["../../src/i18n/de.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBAuDC"}
1
+ {"version":3,"file":"de.d.ts","sourceRoot":"","sources":["../../src/i18n/de.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6DC"}
package/dist/i18n/en.d.ts CHANGED
@@ -12,6 +12,7 @@ declare const _default: {
12
12
  placeholder: string;
13
13
  submit: string;
14
14
  cancel: string;
15
+ my_feedback: string;
15
16
  quickOptions: {
16
17
  emoji: string;
17
18
  label: string;
@@ -24,6 +25,11 @@ declare const _default: {
24
25
  message_no_ai: string;
25
26
  view_feedback: string;
26
27
  close: string;
28
+ email_prompt: string;
29
+ email_placeholder: string;
30
+ email_submit: string;
31
+ email_saved: string;
32
+ email_error: string;
27
33
  };
28
34
  error: {
29
35
  submit: string;
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBAuDC"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6DC"}
package/dist/i18n/es.d.ts CHANGED
@@ -12,6 +12,7 @@ declare const _default: {
12
12
  placeholder: string;
13
13
  submit: string;
14
14
  cancel: string;
15
+ my_feedback: string;
15
16
  quickOptions: {
16
17
  emoji: string;
17
18
  label: string;
@@ -24,6 +25,11 @@ declare const _default: {
24
25
  message_no_ai: string;
25
26
  view_feedback: string;
26
27
  close: string;
28
+ email_prompt: string;
29
+ email_placeholder: string;
30
+ email_submit: string;
31
+ email_saved: string;
32
+ email_error: string;
27
33
  };
28
34
  error: {
29
35
  submit: string;
@@ -1 +1 @@
1
- {"version":3,"file":"es.d.ts","sourceRoot":"","sources":["../../src/i18n/es.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBAuDC"}
1
+ {"version":3,"file":"es.d.ts","sourceRoot":"","sources":["../../src/i18n/es.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6DC"}
package/dist/i18n/fr.d.ts CHANGED
@@ -12,6 +12,7 @@ declare const _default: {
12
12
  placeholder: string;
13
13
  submit: string;
14
14
  cancel: string;
15
+ my_feedback: string;
15
16
  quickOptions: {
16
17
  emoji: string;
17
18
  label: string;
@@ -24,6 +25,11 @@ declare const _default: {
24
25
  message_no_ai: string;
25
26
  view_feedback: string;
26
27
  close: string;
28
+ email_prompt: string;
29
+ email_placeholder: string;
30
+ email_submit: string;
31
+ email_saved: string;
32
+ email_error: string;
27
33
  };
28
34
  error: {
29
35
  submit: string;
@@ -1 +1 @@
1
- {"version":3,"file":"fr.d.ts","sourceRoot":"","sources":["../../src/i18n/fr.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBAuDC"}
1
+ {"version":3,"file":"fr.d.ts","sourceRoot":"","sources":["../../src/i18n/fr.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6DC"}
package/dist/i18n/ja.d.ts CHANGED
@@ -12,6 +12,7 @@ declare const _default: {
12
12
  placeholder: string;
13
13
  submit: string;
14
14
  cancel: string;
15
+ my_feedback: string;
15
16
  quickOptions: {
16
17
  emoji: string;
17
18
  label: string;
@@ -24,6 +25,11 @@ declare const _default: {
24
25
  message_no_ai: string;
25
26
  view_feedback: string;
26
27
  close: string;
28
+ email_prompt: string;
29
+ email_placeholder: string;
30
+ email_submit: string;
31
+ email_saved: string;
32
+ email_error: string;
27
33
  };
28
34
  error: {
29
35
  submit: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ja.d.ts","sourceRoot":"","sources":["../../src/i18n/ja.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBAuDC"}
1
+ {"version":3,"file":"ja.d.ts","sourceRoot":"","sources":["../../src/i18n/ja.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6DC"}
package/dist/i18n/ko.d.ts CHANGED
@@ -12,6 +12,7 @@ declare const _default: {
12
12
  placeholder: string;
13
13
  submit: string;
14
14
  cancel: string;
15
+ my_feedback: string;
15
16
  quickOptions: {
16
17
  emoji: string;
17
18
  label: string;
@@ -24,6 +25,11 @@ declare const _default: {
24
25
  message_no_ai: string;
25
26
  view_feedback: string;
26
27
  close: string;
28
+ email_prompt: string;
29
+ email_placeholder: string;
30
+ email_submit: string;
31
+ email_saved: string;
32
+ email_error: string;
27
33
  };
28
34
  error: {
29
35
  submit: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ko.d.ts","sourceRoot":"","sources":["../../src/i18n/ko.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBAuDC"}
1
+ {"version":3,"file":"ko.d.ts","sourceRoot":"","sources":["../../src/i18n/ko.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6DC"}
@@ -12,6 +12,7 @@ declare const _default: {
12
12
  placeholder: string;
13
13
  submit: string;
14
14
  cancel: string;
15
+ my_feedback: string;
15
16
  quickOptions: {
16
17
  emoji: string;
17
18
  label: string;
@@ -24,6 +25,11 @@ declare const _default: {
24
25
  message_no_ai: string;
25
26
  view_feedback: string;
26
27
  close: string;
28
+ email_prompt: string;
29
+ email_placeholder: string;
30
+ email_submit: string;
31
+ email_saved: string;
32
+ email_error: string;
27
33
  };
28
34
  error: {
29
35
  submit: string;
@@ -1 +1 @@
1
- {"version":3,"file":"zh-CN.d.ts","sourceRoot":"","sources":["../../src/i18n/zh-CN.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBAuDC"}
1
+ {"version":3,"file":"zh-CN.d.ts","sourceRoot":"","sources":["../../src/i18n/zh-CN.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6DC"}
@@ -0,0 +1,8 @@
1
+ import type { MakeThisBetterConfig } from './types';
2
+ declare const MakeThisBetter: {
3
+ init(config: MakeThisBetterConfig): void;
4
+ destroy(): void;
5
+ };
6
+ export { MakeThisBetter };
7
+ export type { MakeThisBetterConfig };
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,95 @@
1
+ "use strict";var bt=Object.create;var H=Object.defineProperty;var gt=Object.getOwnPropertyDescriptor;var yt=Object.getOwnPropertyNames;var wt=Object.getPrototypeOf,xt=Object.prototype.hasOwnProperty;var kt=(i,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of yt(t))!xt.call(i,s)&&s!==e&&H(i,s,{get:()=>t[s],enumerable:!(r=gt(t,s))||r.enumerable});return i};var vt=(i,t,e)=>(e=i!=null?bt(wt(i)):{},kt(t||!i||!i.__esModule?H(e,"default",{value:i,enumerable:!0}):e,i));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const St='*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:host{all:initial;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px;line-height:1.5;color:#191a1c;-webkit-font-smoothing:antialiased}:host([data-mtb-theme="dark"]) .mtb-popup,:host([data-mtb-theme="dark"]) .mtb-success{background:#151719;border-color:#ffffff1f;color:#f9fafb}:host([data-mtb-theme="dark"]) .mtb-popup-header{border-bottom-color:#ffffff1a}:host([data-mtb-theme="dark"]) .mtb-popup-title,:host([data-mtb-theme="dark"]) .mtb-success-title{color:#f9fafb}:host([data-mtb-theme="dark"]) .mtb-quick-option,:host([data-mtb-theme="dark"]) .mtb-textarea{background:#1f2327;border-color:#ffffff1f;color:#f9fafb}:host([data-mtb-theme="dark"]) .mtb-popup-close,:host([data-mtb-theme="dark"]) .mtb-success-msg,:host([data-mtb-theme="dark"]) .mtb-close-link{color:#ffffffad}@media (prefers-color-scheme: dark){:host([data-mtb-theme="auto"]) .mtb-popup,:host([data-mtb-theme="auto"]) .mtb-success{background:#151719;border-color:#ffffff1f;color:#f9fafb}:host([data-mtb-theme="auto"]) .mtb-popup-header{border-bottom-color:#ffffff1a}:host([data-mtb-theme="auto"]) .mtb-popup-title,:host([data-mtb-theme="auto"]) .mtb-success-title{color:#f9fafb}:host([data-mtb-theme="auto"]) .mtb-quick-option,:host([data-mtb-theme="auto"]) .mtb-textarea{background:#1f2327;border-color:#ffffff1f;color:#f9fafb}:host([data-mtb-theme="auto"]) .mtb-popup-close,:host([data-mtb-theme="auto"]) .mtb-success-msg,:host([data-mtb-theme="auto"]) .mtb-close-link{color:#ffffffad}}.mtb-tab{position:fixed;top:50%;right:0;transform:translateY(-50%);z-index:2147483646;display:flex;align-items:center;justify-content:center;width:32px;padding:14px 0;background:#059669;color:#fff;border-radius:8px 0 0 8px;cursor:pointer;box-shadow:-2px 0 14px #05966959;transition:background .15s,box-shadow .15s,width .15s;writing-mode:vertical-lr;text-orientation:mixed;font-size:12px;font-weight:600;letter-spacing:.04em;user-select:none;border:none;outline:none}.mtb-tab.left{right:auto;left:0;border-radius:0 8px 8px 0;box-shadow:2px 0 14px #05966959}.mtb-tab:hover{background:#047857;box-shadow:-3px 0 20px #05966980}.mtb-tab.active{background:#065f46}.mtb-toolbar{position:fixed;top:18px;left:50%;transform:translate(-50%);z-index:2147483647;display:flex;align-items:center;gap:11px;height:46px;padding:0 7px;border-radius:13px;background:linear-gradient(120deg,#10b981,#059669);box-shadow:0 10px 26px #0f172a38;animation:mtbBarIn .2s ease;white-space:nowrap}@keyframes mtbBarIn{0%{transform:translate(-50%,12px);opacity:0}to{transform:translate(-50%);opacity:1}}.mtb-toolbar-modes{display:flex;align-items:center;gap:3px;background:#ffffff29;border-radius:9px;padding:3px}.mtb-toolbar-mode-btn{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 12px;border-radius:7px;border:none;cursor:pointer;font-family:inherit;font-size:12px;font-weight:550;white-space:nowrap;background:transparent;color:#fffffff2;transition:all .12s}.mtb-toolbar-mode-btn.active{background:#fff;color:#047857}.mtb-toolbar-hint{font-size:12px;color:#fffffff2;white-space:nowrap}.mtb-toolbar-sep{width:1px;height:20px;background:#ffffff38}.mtb-exit-btn{display:inline-flex;align-items:center;gap:5px;height:30px;padding:0 12px;border-radius:8px;font-size:11.5px;font-weight:500;color:#fff;cursor:pointer;background:#ffffff29;border:none;font-family:inherit;transition:background .12s}.mtb-exit-btn:hover{background:#ffffff47}.mtb-overlay{position:fixed;inset:0;z-index:2147483640;cursor:crosshair}.mtb-dim{position:fixed;inset:0;z-index:2147483639;background:#00000014}.mtb-highlight{position:fixed;z-index:2147483641;pointer-events:none;border:2px solid #10b981;border-radius:6px;background:#10b9810f;transition:all .08s ease}.mtb-highlight-tooltip{position:fixed;z-index:2147483642;pointer-events:none;transform:translate(-50%);background:#064e3b;color:#fff;padding:4px 10px;border-radius:6px;font-size:11px;font-weight:500;white-space:nowrap;box-shadow:0 4px 12px #0000002e}.mtb-highlight-tooltip:after{content:"";position:absolute;top:100%;left:50%;transform:translate(-50%);border:4px solid transparent;border-top-color:#064e3b}.mtb-draw-svg{position:fixed;inset:0;z-index:2147483643;pointer-events:none;width:100%;height:100%;overflow:visible}.mtb-pin{position:fixed;z-index:2147483644;pointer-events:none;width:22px;height:22px;border-radius:50% 50% 50% 2px;background:#059669;border:2px solid #fff;display:flex;align-items:center;justify-content:center;font-size:10px;color:#fff;font-weight:700;box-shadow:0 2px 8px #05966973;animation:mtbPinPop .25s cubic-bezier(.34,1.56,.64,1);transform:translate(-50%,-50%)}@keyframes mtbPinPop{0%{transform:translate(-50%,-50%) scale(.4)}to{transform:translate(-50%,-50%) scale(1)}}.mtb-popup{position:fixed;z-index:2147483645;width:320px;background:#fff;border:1px solid rgba(0,0,0,.1);border-radius:14px;box-shadow:0 12px 40px #00000029;overflow:hidden;animation:mtbSlideUp .28s cubic-bezier(.34,1.56,.64,1);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}@keyframes mtbSlideUp{0%{transform:translateY(14px) scale(.97);opacity:0}to{transform:translateY(0) scale(1);opacity:1}}.mtb-popup-header{padding:11px 13px 11px 14px;border-bottom:1px solid rgba(0,0,0,.06);display:flex;align-items:center;gap:8px}.mtb-popup-icon{width:20px;height:20px;border-radius:5px;background:#10b9811a;display:flex;align-items:center;justify-content:center;flex-shrink:0}.mtb-popup-title{flex:1;font-size:12.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#191a1c}.mtb-popup-close{background:none;border:none;cursor:pointer;padding:3px;color:#00000061;display:flex;align-items:center;border-radius:4px;transition:color .12s}.mtb-popup-close:hover{color:#000000b3}.mtb-popup-body{padding:13px}.mtb-quick-options{display:flex;flex-direction:column;gap:6px;margin-bottom:12px}.mtb-quick-option{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;border:1px solid rgba(0,0,0,.09);border-radius:10px;background:#fafafa;cursor:pointer;font-family:inherit;font-size:13px;color:#191a1c;text-align:left;transition:all .12s}.mtb-quick-option:hover{background:#10b9810f;border-color:#10b9814d}.mtb-quick-option-emoji{font-size:15px;flex-shrink:0;line-height:1}.mtb-textarea-wrap{position:relative}.mtb-textarea{width:100%;height:64px;padding:9px 11px;border:1px solid rgba(0,0,0,.12);border-radius:9px;font-family:inherit;font-size:12.5px;line-height:1.5;color:#191a1c;outline:none;background:#fff;resize:none;transition:border-color .12s,box-shadow .12s}.mtb-textarea:focus{border-color:#10b981;box-shadow:0 0 0 3px #10b9811f}.mtb-textarea::placeholder{color:#00000057}.mtb-popup-error{margin-top:8px;color:#b91c1c;font-size:11.5px}.mtb-popup-error:empty,.mtb-popup-error[hidden]{display:none}.mtb-popup-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}.mtb-cancel-btn,.mtb-submit-btn{min-width:72px;height:30px;border:none;border-radius:7px;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0 12px;font-family:inherit;font-size:12px;font-weight:600;transition:background .12s}.mtb-cancel-btn{background:#f3f4f6;color:#000000ad}.mtb-cancel-btn:hover{background:#e5e7eb}.mtb-submit-btn{background:#d1d5db;color:#fff}.mtb-submit-btn.ready{background:#059669}.mtb-submit-btn.ready:hover{background:#047857}.mtb-submit-btn.loading{background:#059669;opacity:.7;cursor:wait}.mtb-submit-btn:disabled{cursor:not-allowed}.mtb-success{position:fixed;z-index:2147483645;width:300px;background:#fff;border:1px solid rgba(0,0,0,.1);border-radius:16px;box-shadow:0 20px 60px #0000001f;padding:26px 22px;text-align:center;animation:mtbSlideUp .35s cubic-bezier(.34,1.56,.64,1);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.mtb-success-icon{width:44px;height:44px;border-radius:50%;background:#05966914;display:flex;align-items:center;justify-content:center;margin:0 auto 12px}.mtb-success-title{font-size:16px;font-weight:700;margin-bottom:6px;color:#191a1c}.mtb-success-msg{font-size:13px;color:#0000008c;margin-bottom:16px;line-height:1.6}.mtb-close-link{background:none;border:none;cursor:pointer;font-size:12px;color:#00000073;font-family:inherit;transition:color .12s}.mtb-close-link:hover{color:#000000b3}.mtb-email-capture{margin-bottom:14px;text-align:left}.mtb-email-prompt{font-size:12px;color:#0000008c;line-height:1.5;margin-bottom:8px}.mtb-email-row{display:flex;gap:6px}.mtb-email-input{flex:1;min-width:0;font-size:12.5px;font-family:inherit;padding:7px 10px;border:1px solid rgba(0,0,0,.14);border-radius:8px;outline:none}.mtb-email-input:focus{border-color:#059669}.mtb-email-input.mtb-email-invalid{border-color:#dc2626}.mtb-email-submit{font-size:12px;font-weight:600;font-family:inherit;color:#fff;background:#059669;border:none;border-radius:8px;padding:7px 12px;cursor:pointer;white-space:nowrap}.mtb-email-submit:disabled{opacity:.6;cursor:default}.mtb-email-error{font-size:11.5px;color:#dc2626;margin-top:6px}.mtb-email-saved{font-size:12px;color:#059669;line-height:1.5}.mtb-my-feedback{display:block;margin:8px auto 0;background:none;border:none;cursor:pointer;font-size:11.5px;font-family:inherit;color:#0006;text-decoration:underline;text-underline-offset:2px;transition:color .12s}.mtb-my-feedback:hover{color:#059669}.mtb-pet{position:fixed;bottom:20px;right:20px;z-index:2147483646;cursor:pointer;width:52px;height:52px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:transparent;animation:mtbPetBounce 3s ease-in-out infinite;transition:transform .2s;user-select:none;outline:none;filter:drop-shadow(0 4px 12px rgba(5,150,105,.35))}.mtb-pet:hover{transform:scale(1.12);animation-play-state:paused}.mtb-pet:hover .mtb-pet-bubble{opacity:1;transform:translate(-50%) translateY(0);pointer-events:auto}.mtb-pet.active{animation:none;opacity:.6}.mtb-pet-svg{display:block}@keyframes mtbPetBounce{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}.mtb-pet-bubble{position:absolute;bottom:100%;left:50%;transform:translate(-50%) translateY(4px);margin-bottom:8px;background:#064e3b;color:#fff;padding:6px 12px;border-radius:8px;font-size:12px;font-weight:500;white-space:nowrap;box-shadow:0 4px 14px #0000002e;opacity:0;pointer-events:none;transition:opacity .2s,transform .2s}.mtb-pet-bubble.visible{opacity:1;transform:translate(-50%) translateY(0);pointer-events:auto}.mtb-pet-bubble.hidden{opacity:0;pointer-events:none}.mtb-pet-bubble:after{content:"";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#064e3b}.mtb-frustration-prompt{position:fixed;bottom:20px;right:20px;z-index:2147483645;display:flex;align-items:center;gap:10px;padding:12px 16px;background:#fff;border:1px solid rgba(0,0,0,.1);border-radius:12px;box-shadow:0 8px 30px #0000001f;animation:mtbSlideUp .35s cubic-bezier(.34,1.56,.64,1);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}:host([data-mtb-theme="dark"]) .mtb-frustration-prompt{background:#151719;border-color:#ffffff1f;color:#f9fafb}@media (prefers-color-scheme: dark){:host([data-mtb-theme="auto"]) .mtb-frustration-prompt{background:#151719;border-color:#ffffff1f;color:#f9fafb}}.mtb-frustration-icon{width:32px;height:32px;border-radius:50%;background:#eab3081a;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:16px;line-height:1}.mtb-frustration-text{font-size:13px;font-weight:500;color:inherit;line-height:1.4}.mtb-frustration-actions{display:flex;gap:6px;flex-shrink:0}.mtb-frustration-tell{height:28px;padding:0 12px;border:none;border-radius:7px;background:#059669;color:#fff;cursor:pointer;font-family:inherit;font-size:12px;font-weight:600;transition:background .12s}.mtb-frustration-tell:hover{background:#047857}.mtb-frustration-dismiss{height:28px;padding:0 8px;border:none;border-radius:7px;background:transparent;color:#0006;cursor:pointer;font-family:inherit;font-size:12px;transition:color .12s}.mtb-frustration-dismiss:hover{color:#000000b3}:host([data-mtb-theme="dark"]) .mtb-frustration-dismiss{color:#fff6}:host([data-mtb-theme="dark"]) .mtb-frustration-dismiss:hover{color:#ffffffb3}@media (prefers-color-scheme: dark){:host([data-mtb-theme="auto"]) .mtb-frustration-dismiss{color:#fff6}:host([data-mtb-theme="auto"]) .mtb-frustration-dismiss:hover{color:#ffffffb3}}.mtb-record-bar{position:fixed;bottom:24px;left:50%;transform:translate(-50%);z-index:2147483647;display:flex;align-items:center;gap:12px;height:42px;padding:0 8px 0 14px;border-radius:12px;background:#0f172aeb;box-shadow:0 8px 24px #00000040;animation:mtbBarIn .2s ease}.mtb-record-dot{width:8px;height:8px;border-radius:50%;background:#ef4444;animation:mtbRecordPulse 1.2s ease-in-out infinite;flex-shrink:0}@keyframes mtbRecordPulse{0%,to{opacity:1}50%{opacity:.3}}.mtb-record-timer{font-family:JetBrains Mono,SF Mono,Fira Code,Cascadia Code,monospace;font-size:13px;font-weight:500;color:#fff;font-variant-numeric:tabular-nums;letter-spacing:.02em;min-width:38px}.mtb-record-stop{height:28px;padding:0 14px;border:none;border-radius:7px;background:#059669;color:#fff;cursor:pointer;font-family:inherit;font-size:12px;font-weight:600;transition:background .12s}.mtb-record-stop:hover{background:#047857}.mtb-click-ripple{position:fixed;z-index:2147483644;width:24px;height:24px;border-radius:50%;border:2px solid #10b981;background:#10b98133;pointer-events:none;transform:translate(-50%,-50%) scale(.5);animation:mtbClickRipple .3s ease-out forwards}@keyframes mtbClickRipple{0%{transform:translate(-50%,-50%) scale(.5);opacity:1}to{transform:translate(-50%,-50%) scale(2);opacity:0}}.mtb-dot{display:inline-block;width:4px;height:4px;border-radius:50%;background:#fff;animation:mtbDot 1.2s infinite}.mtb-dot:nth-child(2){animation-delay:.2s}.mtb-dot:nth-child(3){animation-delay:.4s}@keyframes mtbDot{0%,80%,to{opacity:.3;transform:translateY(0)}40%{opacity:1;transform:translateY(-3px)}}.mtb-clarify{position:fixed;z-index:2147483645;width:320px;background:#fff;border:1px solid rgba(0,0,0,.1);border-radius:16px;box-shadow:0 20px 60px #0000001f;display:flex;flex-direction:column;animation:mtbSlideUp .35s cubic-bezier(.34,1.56,.64,1);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;overflow:hidden}.mtb-clarify-header{padding:10px 13px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid rgba(0,0,0,.06)}.mtb-clarify-icon{width:26px;height:26px;border-radius:50%;background:#05966914;display:flex;align-items:center;justify-content:center;flex-shrink:0}.mtb-clarify-skip{background:none;border:none;cursor:pointer;font-size:12px;color:#00000073;font-family:inherit;transition:color .12s}.mtb-clarify-skip:hover{color:#000000b3}.mtb-clarify-messages{flex:1;max-height:240px;overflow-y:auto;padding:12px 13px;display:flex;flex-direction:column;gap:8px}.mtb-clarify-bubble{max-width:85%;padding:8px 12px;border-radius:12px;font-size:13px;line-height:1.5;word-wrap:break-word}.mtb-clarify-ai{align-self:flex-start;background:#f3f4f6;color:#191a1c;border-bottom-left-radius:4px}.mtb-clarify-user{align-self:flex-end;background:#059669;color:#fff;border-bottom-right-radius:4px}.mtb-clarify-thinking{display:flex;align-items:center;gap:3px;padding:10px 16px}.mtb-clarify-thinking .mtb-dot{background:#9ca3af}.mtb-clarify-footer{padding:10px 13px;border-top:1px solid rgba(0,0,0,.06);display:flex;gap:8px}.mtb-clarify-input{flex:1;height:32px;padding:0 10px;border:1px solid rgba(0,0,0,.12);border-radius:8px;font-family:inherit;font-size:12.5px;color:#191a1c;outline:none;background:#fff;transition:border-color .12s,box-shadow .12s}.mtb-clarify-input:focus{border-color:#10b981;box-shadow:0 0 0 3px #10b9811f}.mtb-clarify-input::placeholder{color:#00000057}.mtb-clarify-send{height:32px;padding:0 14px;border:none;border-radius:8px;background:#d1d5db;color:#fff;cursor:pointer;font-family:inherit;font-size:12px;font-weight:600;transition:background .12s;flex-shrink:0}.mtb-clarify-send:not(:disabled){background:#059669}.mtb-clarify-send:not(:disabled):hover{background:#047857}.mtb-clarify-send:disabled{cursor:not-allowed}:host([data-mtb-theme="dark"]) .mtb-clarify{background:#151719;border-color:#ffffff1f;color:#f9fafb}:host([data-mtb-theme="dark"]) .mtb-clarify-header{border-bottom-color:#ffffff1a}:host([data-mtb-theme="dark"]) .mtb-clarify-footer{border-top-color:#ffffff1a}:host([data-mtb-theme="dark"]) .mtb-clarify-skip{color:#ffffff73}:host([data-mtb-theme="dark"]) .mtb-clarify-skip:hover{color:#ffffffb3}:host([data-mtb-theme="dark"]) .mtb-clarify-ai{background:#1f2327;color:#f9fafb}:host([data-mtb-theme="dark"]) .mtb-clarify-input{background:#1f2327;border-color:#ffffff1f;color:#f9fafb}@media (prefers-color-scheme: dark){:host([data-mtb-theme="auto"]) .mtb-clarify{background:#151719;border-color:#ffffff1f;color:#f9fafb}:host([data-mtb-theme="auto"]) .mtb-clarify-header{border-bottom-color:#ffffff1a}:host([data-mtb-theme="auto"]) .mtb-clarify-footer{border-top-color:#ffffff1a}:host([data-mtb-theme="auto"]) .mtb-clarify-skip{color:#ffffff73}:host([data-mtb-theme="auto"]) .mtb-clarify-skip:hover{color:#ffffffb3}:host([data-mtb-theme="auto"]) .mtb-clarify-ai{background:#1f2327;color:#f9fafb}:host([data-mtb-theme="auto"]) .mtb-clarify-input{background:#1f2327;border-color:#ffffff1f;color:#f9fafb}}';class Et{constructor(t="auto"){this.host=document.createElement("div"),this.host.id="mtb-widget-host",this.host.style.cssText="position:fixed;top:0;left:0;width:0;height:0;overflow:visible;z-index:2147483646;",this.host.setAttribute("data-mtb-theme",t),document.body.appendChild(this.host),this.root=this.host.attachShadow({mode:"open"});const e=document.createElement("style");e.textContent=St,this.root.appendChild(e)}el(t,e){const r=document.createElement(t);return e&&(r.className=e),r}append(...t){for(const e of t)this.root.appendChild(e)}remove(...t){for(const e of t)e.parentNode===this.root&&this.root.removeChild(e)}destroy(){document.body.removeChild(this.host)}}class Ct{constructor(t,e,r,s,n){this.onClick=s,this.el=t.el("button","mtb-tab"),r==="left"&&this.el.classList.add("left");const o=n??e.tab;this.el.textContent=o,this.el.setAttribute("aria-label",o),this.el.addEventListener("click",s),t.append(this.el)}setActive(t){this.el.classList.toggle("active",t)}destroy(){this.el.removeEventListener("click",this.onClick),this.el.remove()}}const _t=8e3;class Mt{constructor(t,e,r){this.el=t.el("div","mtb-frustration-prompt"),this.el.innerHTML=`
2
+ <div class="mtb-frustration-icon">&#9888;&#65039;</div>
3
+ <span class="mtb-frustration-text">${e.frustration.prompt}</span>
4
+ <div class="mtb-frustration-actions">
5
+ <button class="mtb-frustration-tell">${e.frustration.action}</button>
6
+ <button class="mtb-frustration-dismiss">${e.frustration.dismiss}</button>
7
+ </div>
8
+ `,this.el.querySelector(".mtb-frustration-tell").addEventListener("click",r.onTell),this.el.querySelector(".mtb-frustration-dismiss").addEventListener("click",r.onDismiss),t.append(this.el),setTimeout(r.onDismiss,_t)}destroy(){this.el.remove()}}class Tt{constructor(t,e,r,s){this.currentMode="markup",this.messages=e,this.el=t.el("div","mtb-toolbar"),this.el.innerHTML=this.buildHTML(e),t.append(this.el),this.hintEl=this.el.querySelector(".mtb-toolbar-hint"),this.markupBtn=this.el.querySelector(".mtb-toolbar-mode-markup"),this.recordBtn=this.el.querySelector(".mtb-toolbar-mode-record"),this.markupBtn.addEventListener("click",()=>{this.setMode("markup"),s?.("markup")}),this.recordBtn.addEventListener("click",()=>{this.setMode("record"),s?.("record")}),this.el.querySelector(".mtb-exit-btn").addEventListener("click",r)}buildHTML(t){return`
9
+ <div class="mtb-toolbar-modes">
10
+ <button class="mtb-toolbar-mode-btn mtb-toolbar-mode-markup active">
11
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="9"/><line x1="12" y1="3" x2="12" y2="7"/><line x1="12" y1="17" x2="12" y2="21"/><line x1="3" y1="12" x2="7" y2="12"/><line x1="17" y1="12" x2="21" y2="12"/></svg>${t.toolbar.markup}
12
+ </button>
13
+ <button class="mtb-toolbar-mode-btn mtb-toolbar-mode-record">
14
+ <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="4" fill="currentColor" stroke="none"/></svg>${t.toolbar.record}
15
+ </button>
16
+ </div>
17
+ <span class="mtb-toolbar-hint">${t.toolbar.hint}</span>
18
+ <span class="mtb-toolbar-sep"></span>
19
+ <button class="mtb-exit-btn">
20
+ <svg width="11" height="11" viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
21
+ <path d="M18 6L6 18M6 6l12 12"/>
22
+ </svg>${t.toolbar.exit}
23
+ </button>
24
+ `}setMode(t){this.currentMode=t,t==="markup"?(this.markupBtn.classList.add("active"),this.recordBtn.classList.remove("active"),this.hintEl.textContent=this.messages.toolbar.hint):(this.markupBtn.classList.remove("active"),this.recordBtn.classList.add("active"),this.hintEl.textContent=this.messages.toolbar.hintRecord)}getMode(){return this.currentMode}destroy(){this.el.remove()}}class Lt{constructor(t,e){this.onMouseDown=e.onMouseDown,this.onMouseMove=e.onMouseMove,this.onMouseUp=e.onMouseUp,this.onMouseLeave=e.onMouseLeave,this.overlayEl=t.el("div","mtb-overlay"),this.overlayEl.addEventListener("mousedown",this.onMouseDown),this.overlayEl.addEventListener("mousemove",this.onMouseMove),this.overlayEl.addEventListener("mouseup",this.onMouseUp),this.overlayEl.addEventListener("mouseleave",this.onMouseLeave),t.append(this.overlayEl),this.dimEl=t.el("div","mtb-dim"),t.append(this.dimEl)}destroy(){this.overlayEl.removeEventListener("mousedown",this.onMouseDown),this.overlayEl.removeEventListener("mousemove",this.onMouseMove),this.overlayEl.removeEventListener("mouseup",this.onMouseUp),this.overlayEl.removeEventListener("mouseleave",this.onMouseLeave),this.overlayEl.remove(),this.dimEl.remove()}}class Rt{constructor(t){this.highlightEl=t.el("div","mtb-highlight"),this.hide(),t.append(this.highlightEl)}highlight(t){const e=t.getBoundingClientRect();this.highlightEl.style.top=`${e.top-2}px`,this.highlightEl.style.left=`${e.left-2}px`,this.highlightEl.style.width=`${e.width+4}px`,this.highlightEl.style.height=`${e.height+4}px`,this.highlightEl.style.display="block"}hide(){this.highlightEl.style.display="none"}destroy(){this.highlightEl.remove()}}function At(i){if(i instanceof HTMLElement){const t=i.getAttribute("aria-label");if(t)return t;const e=i.getAttribute("title");if(e)return e;const r=i.textContent?.trim().slice(0,40);if(r)return r;const s=i.placeholder;if(s)return s;const n=i.alt;if(n)return n;const o=i.getAttribute("data-mark");if(o)return o}return i.tagName.toLowerCase()}function Dt(i){const t=[];let e=i;for(;e&&e!==document.body&&t.length<5;){let r=e.tagName.toLowerCase();if(e.id){r=`#${e.id}`,t.unshift(r);break}const s=Array.from(e.classList).filter(o=>!o.startsWith("mtb-")).slice(0,2).join(".");s&&(r+=`.${s}`);const n=e.parentElement;if(n){const o=Array.from(n.children).filter(a=>a.tagName===e.tagName);if(o.length>1){const a=o.indexOf(e)+1;r+=`:nth-child(${a})`}}t.unshift(r),e=e.parentElement}return t.join(" > ")}class Pt{constructor(t){this.pins=[],this.shadow=t}addPin(t,e,r){const s=this.shadow.el("div","mtb-pin");s.textContent=String(r),s.style.top=`${e}px`,s.style.left=`${t}px`,this.shadow.append(s),this.pins.push(s)}clearAll(){for(const t of this.pins)t.remove();this.pins=[]}destroy(){this.clearAll()}}const A="#059669",w={color:A,width:"3.5",linecap:"round",linejoin:"round",filter:"drop-shadow(0 1px 2px rgba(5,150,105,0.35))"};class Ht{constructor(t,e){this.path=null,this.points=[],this.isDrawing=!1,this.onDrawComplete=e,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.setAttribute("class","mtb-draw-svg"),t.append(this.svg)}startDraw(t,e){this.isDrawing=!0,this.points=[[t,e]],this.path=document.createElementNS("http://www.w3.org/2000/svg","path"),this.path.setAttribute("fill","none"),this.path.setAttribute("stroke",w.color),this.path.setAttribute("stroke-width",w.width),this.path.setAttribute("stroke-linecap",w.linecap),this.path.setAttribute("stroke-linejoin",w.linejoin),this.path.setAttribute("style",`filter:${w.filter}`),this.svg.appendChild(this.path)}continueDraw(t,e){!this.isDrawing||!this.path||(this.points.push([t,e]),this.path.setAttribute("d",this.buildPathD()))}endDraw(){if(!this.isDrawing||this.points.length<2){this.isDrawing=!1,this.path&&(this.path.remove(),this.path=null);return}this.isDrawing=!1;const t=this.getCenter(),e=this.buildPathD(),r={type:"draw",x:t[0],y:t[1],drawPath:e};this.onDrawComplete(r)}buildPathD(){if(this.points.length===0)return"";const[t,e]=this.points[0];let r=`M ${t} ${e}`;for(let s=1;s<this.points.length;s++){const[n,o]=this.points[s];r+=` L ${n} ${o}`}return r}getCenter(){const t=this.points.map(n=>n[0]),e=this.points.map(n=>n[1]),r=(Math.min(...t)+Math.max(...t))/2,s=(Math.min(...e)+Math.max(...e))/2;return[r,s]}clearAll(){for(;this.svg.firstChild;)this.svg.removeChild(this.svg.firstChild);this.path=null,this.isDrawing=!1,this.points=[]}cancelCurrentDraw(){this.path?.remove(),this.path=null,this.isDrawing=!1,this.points=[]}isCurrentlyDrawing(){return this.isDrawing}getPointCount(){return this.points.length}destroy(){this.svg.remove()}}const $t=5;class ${constructor(t,e,r){this.messages=e,this.onReady=r,this.pinCount=0,this.interactionActive=!0,this.pendingHighlightFrame=null,this.lastMoveX=0,this.lastMoveY=0,this.highlighter=new Rt(t),this.pinMarker=new Pt(t),this.drawLayer=new Ht(t,s=>{this.onReady(s,this.messages.annotation.drawing)}),this.overlay=new Lt(t,{onMouseDown:s=>this.handleMouseDown(s),onMouseMove:s=>this.handleMouseMove(s),onMouseUp:s=>this.handleMouseUp(s),onMouseLeave:()=>{this.drawLayer.isCurrentlyDrawing()&&this.drawLayer.endDraw(),this.cancelPendingHighlight(),this.highlighter.hide()}})}handleMouseDown(t){t.preventDefault(),this.drawLayer.startDraw(t.clientX,t.clientY)}handleMouseMove(t){if(this.drawLayer.isCurrentlyDrawing()){this.cancelPendingHighlight(),this.drawLayer.continueDraw(t.clientX,t.clientY),this.highlighter.hide();return}this.lastMoveX=t.clientX,this.lastMoveY=t.clientY,this.pendingHighlightFrame===null&&(this.pendingHighlightFrame=requestAnimationFrame(()=>{this.pendingHighlightFrame=null,this.updateHighlight()}))}updateHighlight(){if(!this.interactionActive||this.drawLayer.isCurrentlyDrawing())return;const t=I(this.lastMoveX,this.lastMoveY);t?this.highlighter.highlight(t):this.highlighter.hide()}cancelPendingHighlight(){this.pendingHighlightFrame!==null&&(cancelAnimationFrame(this.pendingHighlightFrame),this.pendingHighlightFrame=null)}handleMouseUp(t){if(!this.drawLayer.isCurrentlyDrawing())return;if(this.drawLayer.getPointCount()>=$t){this.drawLayer.endDraw();return}this.drawLayer.cancelCurrentDraw();const e=I(t.clientX,t.clientY),r=e?At(e):this.messages.annotation.element,s={type:"pin",x:t.clientX,y:t.clientY,targetSelector:e?Dt(e):void 0,targetText:e?.textContent?.trim().slice(0,200)??"",targetName:r};this.pinMarker.addPin(t.clientX,t.clientY,++this.pinCount),this.drawLayer.clearAll(),this.highlighter.hide(),this.onReady(s,r)}dismissInteraction(){this.interactionActive&&(this.interactionActive=!1,this.cancelPendingHighlight(),this.overlay.destroy(),this.highlighter.destroy())}destroy(){this.dismissInteraction(),this.pinMarker.destroy(),this.drawLayer.destroy()}}function I(i,t){return document.elementsFromPoint(i,t).find(e=>e.id!=="mtb-widget-host")??null}class It{constructor(t,e){this.loading=!1,this.onSubmit=e.onSubmit,this.onClose=e.onClose,this.submitLabel=e.messages.popup.submit,this.el=t.el("div","mtb-popup"),this.el.innerHTML=this.buildHTML(e),t.append(this.el),this.textarea=this.el.querySelector(".mtb-textarea"),this.submitBtn=this.el.querySelector(".mtb-submit-btn"),this.positionPopup(e.x,e.y),this.bindEvents(e.messages),e.onMyFeedback&&this.el.querySelector(".mtb-my-feedback").addEventListener("click",e.onMyFeedback),this.textarea.focus()}buildHTML(t){const e=t.messages,r=e.popup.quickOptions.map(s=>`
25
+ <button class="mtb-quick-option" data-quick="${p(s.label)}">
26
+ <span class="mtb-quick-option-emoji">${s.emoji}</span>
27
+ <span>${p(s.label)}</span>
28
+ </button>`).join("");return`
29
+ <div class="mtb-popup-header">
30
+ <div class="mtb-popup-icon">
31
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="#059669" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
32
+ <path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"/><circle cx="12" cy="10" r="3"/>
33
+ </svg>
34
+ </div>
35
+ <span class="mtb-popup-title">${e.popup.about} "${p(t.targetName)}"</span>
36
+ <button class="mtb-popup-close" aria-label="Close">
37
+ <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round">
38
+ <path d="M18 6L6 18M6 6l12 12"/>
39
+ </svg>
40
+ </button>
41
+ </div>
42
+ <div class="mtb-popup-body">
43
+ <div class="mtb-quick-options">
44
+ ${r}
45
+ </div>
46
+ <div class="mtb-textarea-wrap">
47
+ <textarea class="mtb-textarea" placeholder="${p(e.popup.placeholder)}"></textarea>
48
+ </div>
49
+ <div class="mtb-popup-error" role="alert"></div>
50
+ <div class="mtb-popup-actions">
51
+ <button class="mtb-cancel-btn" type="button">${p(e.popup.cancel)}</button>
52
+ <button class="mtb-submit-btn" type="button" disabled>${p(e.popup.submit)}</button>
53
+ </div>
54
+ ${t.onMyFeedback?`<button class="mtb-my-feedback" type="button">${p(e.popup.my_feedback)}</button>`:""}
55
+ </div>
56
+ `}positionPopup(t,e){const n=window.innerWidth,o=window.innerHeight,a=12;let l=t+12,c=e+12;l+320>n-a&&(l=t-320-12),l<a&&(l=a),c+260>o-a&&(c=o-260-a),c<a&&(c=a),this.el.style.left=`${l}px`,this.el.style.top=`${c}px`}bindEvents(t){this.el.querySelector(".mtb-popup-close").addEventListener("click",()=>this.onClose()),this.el.querySelector(".mtb-cancel-btn").addEventListener("click",()=>this.onClose()),this.errorEl=this.el.querySelector(".mtb-popup-error"),this.el.querySelectorAll(".mtb-quick-option").forEach(e=>{e.addEventListener("click",()=>{const r=e.dataset.quick??"";this.textarea.value=r,this.updateSubmitState(),this.textarea.focus()})}),this.textarea.addEventListener("input",()=>this.updateSubmitState()),this.textarea.addEventListener("keydown",e=>{e.key==="Enter"&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),this.submit())}),this.submitBtn.addEventListener("click",()=>this.submit())}updateSubmitState(){const t=this.textarea.value.trim().length>0;this.submitBtn.classList.toggle("ready",t&&!this.loading),this.submitBtn.disabled=!t||this.loading,this.errorEl.hidden=!0,this.errorEl.textContent=""}submit(){const t=this.textarea.value.trim();!t||this.loading||this.onSubmit(t)}setLoading(t){this.loading=t,t?(this.submitBtn.classList.add("loading"),this.submitBtn.innerHTML='<span class="mtb-dot"></span><span class="mtb-dot"></span><span class="mtb-dot"></span>',this.textarea.disabled=!0):(this.submitBtn.classList.remove("loading"),this.submitBtn.textContent=this.submitLabel,this.textarea.disabled=!1),this.updateSubmitState()}setError(t){this.errorEl.textContent=t,this.errorEl.hidden=!1}destroy(){this.el.remove()}}function p(i){return i.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}const Ft=2e3,Ot=2e3;class Ut{constructor(t,e){this.pollTimer=null,this.doneTimer=null,this.sending=!1,this.destroyed=!1,this.feedbackId=e.feedbackId,this.apiClient=e.apiClient,this.onDone=e.onDone,this.el=t.el("div","mtb-clarify"),this.el.style.right="20px",this.el.style.bottom="20px",this.el.innerHTML=this.buildHTML(e.messages),t.append(this.el),this.messagesEl=this.el.querySelector(".mtb-clarify-messages"),this.inputEl=this.el.querySelector(".mtb-clarify-input"),this.sendBtn=this.el.querySelector(".mtb-clarify-send"),this.bindEvents(e.messages),this.startConversation()}buildHTML(t){return`
57
+ <div class="mtb-clarify-header">
58
+ <div class="mtb-clarify-icon">
59
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="${A}" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
60
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/>
61
+ </svg>
62
+ </div>
63
+ <button class="mtb-clarify-skip">${M(t.clarify.skip)}</button>
64
+ </div>
65
+ <div class="mtb-clarify-messages"></div>
66
+ <div class="mtb-clarify-footer">
67
+ <input class="mtb-clarify-input" type="text" placeholder="${M(t.clarify.placeholder)}" />
68
+ <button class="mtb-clarify-send" disabled>${M(t.clarify.send)}</button>
69
+ </div>
70
+ `}bindEvents(t){this.el.querySelector(".mtb-clarify-skip").addEventListener("click",()=>{this.stopPolling(),this.onDone()}),this.inputEl.addEventListener("input",()=>{const e=this.inputEl.value.trim().length>0;this.sendBtn.disabled=!e||this.sending}),this.inputEl.addEventListener("keydown",e=>{e.isComposing||e.keyCode===229||e.key==="Enter"&&(e.preventDefault(),this.sendMessage(t))}),this.sendBtn.addEventListener("click",()=>this.sendMessage(t))}async startConversation(){this.showThinking();try{const t=await this.apiClient.startClarification(this.feedbackId);if(this.destroyed)return;this.renderConversation(t.messages,t.done),t.done?this.handleDone():this.startPolling()}catch{if(this.destroyed)return;this.onDone()}}async sendMessage(t){const e=this.inputEl.value.trim();if(!(!e||this.sending)){this.sending=!0,this.inputEl.disabled=!0,this.sendBtn.disabled=!0,this.stopPolling(),this.appendMessage({role:"user",content:e}),this.inputEl.value="",this.showThinking();try{const r=await this.apiClient.startClarification(this.feedbackId,e);if(this.destroyed)return;this.renderConversation(r.messages,r.done),r.done?this.handleDone():this.startPolling()}catch{if(this.destroyed)return;this.onDone()}finally{this.sending=!1,this.inputEl.disabled=!1,this.sendBtn.disabled=this.inputEl.value.trim().length===0,this.inputEl.focus()}}}startPolling(){this.stopPolling(),this.pollTimer=setInterval(()=>this.poll(),Ft)}stopPolling(){this.pollTimer!==null&&(clearInterval(this.pollTimer),this.pollTimer=null)}async poll(){try{const t=await this.apiClient.getClarification(this.feedbackId);if(this.destroyed)return;this.renderConversation(t.messages,t.done),t.done&&(this.stopPolling(),this.handleDone())}catch{if(this.destroyed)return;this.stopPolling()}}handleDone(){this.inputEl.disabled=!0,this.sendBtn.disabled=!0,this.doneTimer=setTimeout(()=>{this.destroyed||this.onDone()},Ot)}renderConversation(t,e){this.renderMessages(t);const r=t[t.length-1];!e&&(!r||r.role==="user")&&this.showThinking()}renderMessages(t){this.messagesEl.innerHTML="";for(const e of t)this.appendMessage(e);this.messagesEl.scrollTop=this.messagesEl.scrollHeight}appendMessage(t){const e=document.createElement("div");e.className=t.role==="user"?"mtb-clarify-bubble mtb-clarify-user":"mtb-clarify-bubble mtb-clarify-ai",e.textContent=t.content,this.messagesEl.appendChild(e),this.messagesEl.scrollTop=this.messagesEl.scrollHeight}showThinking(){const t=document.createElement("div");t.className="mtb-clarify-bubble mtb-clarify-ai mtb-clarify-thinking",t.innerHTML='<span class="mtb-dot"></span><span class="mtb-dot"></span><span class="mtb-dot"></span>',this.messagesEl.appendChild(t),this.messagesEl.scrollTop=this.messagesEl.scrollHeight}destroy(){this.destroyed=!0,this.stopPolling(),this.doneTimer!==null&&(clearTimeout(this.doneTimer),this.doneTimer=null),this.el.remove()}}function M(i){return i.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}const jt=5e3,zt=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;class Bt{constructor(t,e,r,s,n){this.messages=e,this.el=t.el("div","mtb-success"),this.el.style.right="20px",this.el.style.bottom="20px";const o=n?.skipFollowup?e.success.title_no_ai:e.success.title,a=n?.skipFollowup?e.success.message_no_ai:e.success.message,l=s?`<button class="mtb-view-feedback-link">${e.success.view_feedback}</button>`:"",c=n?.emailCapture?`
71
+ <div class="mtb-email-capture">
72
+ <div class="mtb-email-prompt">${e.success.email_prompt}</div>
73
+ <div class="mtb-email-row">
74
+ <input class="mtb-email-input" type="email" placeholder="${e.success.email_placeholder}">
75
+ <button class="mtb-email-submit">${e.success.email_submit}</button>
76
+ </div>
77
+ <div class="mtb-email-error" hidden>${e.success.email_error}</div>
78
+ </div>`:"";this.el.innerHTML=`
79
+ <div class="mtb-success-icon">
80
+ <svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="${A}" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round">
81
+ <polyline points="20 6 9 17 4 12"/>
82
+ </svg>
83
+ </div>
84
+ <div class="mtb-success-title">${o}</div>
85
+ <div class="mtb-success-msg">${a}</div>
86
+ ${c}
87
+ ${l}
88
+ <button class="mtb-close-link">${e.success.close}</button>
89
+ `,t.append(this.el),this.el.querySelector(".mtb-close-link").addEventListener("click",r),s&&this.el.querySelector(".mtb-view-feedback-link").addEventListener("click",s),n?.emailCapture?this.bindEmailCapture(n.emailCapture.onSubmit):setTimeout(()=>r(),jt)}bindEmailCapture(t){const e=this.el.querySelector(".mtb-email-input"),r=this.el.querySelector(".mtb-email-submit"),s=this.el.querySelector(".mtb-email-error"),n=async()=>{const o=e.value.trim();if(!zt.test(o)){e.classList.add("mtb-email-invalid");return}e.classList.remove("mtb-email-invalid"),s.hidden=!0,r.disabled=!0,await t(o)?this.el.querySelector(".mtb-email-capture").innerHTML=`<div class="mtb-email-saved">${this.messages.success.email_saved}</div>`:(s.hidden=!1,r.disabled=!1)};r.addEventListener("click",n),e.addEventListener("keydown",o=>{o.key==="Enter"&&n()})}destroy(){this.el.remove()}}function qt(i,t){if(i.match(/^[a-z]+:\/\//i))return i;if(i.match(/^\/\//))return window.location.protocol+i;if(i.match(/^[a-z]+:/i))return i;const e=document.implementation.createHTMLDocument(),r=e.createElement("base"),s=e.createElement("a");return e.head.appendChild(r),e.body.appendChild(s),t&&(r.href=t),s.href=i,s.href}const Wt=(()=>{let i=0;const t=()=>`0000${(Math.random()*36**4<<0).toString(36)}`.slice(-4);return()=>(i+=1,`u${t()}${i}`)})();function m(i){const t=[];for(let e=0,r=i.length;e<r;e++)t.push(i[e]);return t}let b=null;function tt(i={}){return b||(i.includeStyleProperties?(b=i.includeStyleProperties,b):(b=m(window.getComputedStyle(document.documentElement)),b))}function S(i,t){const r=(i.ownerDocument.defaultView||window).getComputedStyle(i).getPropertyValue(t);return r?parseFloat(r.replace("px","")):0}function Nt(i){const t=S(i,"border-left-width"),e=S(i,"border-right-width");return i.clientWidth+t+e}function Vt(i){const t=S(i,"border-top-width"),e=S(i,"border-bottom-width");return i.clientHeight+t+e}function et(i,t={}){const e=t.width||Nt(i),r=t.height||Vt(i);return{width:e,height:r}}function Yt(){let i,t;try{t=process}catch{}const e=t&&t.env?t.env.devicePixelRatio:null;return e&&(i=parseInt(e,10),Number.isNaN(i)&&(i=1)),i||window.devicePixelRatio||1}const h=16384;function Xt(i){(i.width>h||i.height>h)&&(i.width>h&&i.height>h?i.width>i.height?(i.height*=h/i.width,i.width=h):(i.width*=h/i.height,i.height=h):i.width>h?(i.height*=h/i.width,i.width=h):(i.width*=h/i.height,i.height=h))}function E(i){return new Promise((t,e)=>{const r=new Image;r.onload=()=>{r.decode().then(()=>{requestAnimationFrame(()=>t(r))})},r.onerror=e,r.crossOrigin="anonymous",r.decoding="async",r.src=i})}async function Kt(i){return Promise.resolve().then(()=>new XMLSerializer().serializeToString(i)).then(encodeURIComponent).then(t=>`data:image/svg+xml;charset=utf-8,${t}`)}async function Gt(i,t,e){const r="http://www.w3.org/2000/svg",s=document.createElementNS(r,"svg"),n=document.createElementNS(r,"foreignObject");return s.setAttribute("width",`${t}`),s.setAttribute("height",`${e}`),s.setAttribute("viewBox",`0 0 ${t} ${e}`),n.setAttribute("width","100%"),n.setAttribute("height","100%"),n.setAttribute("x","0"),n.setAttribute("y","0"),n.setAttribute("externalResourcesRequired","true"),s.appendChild(n),n.appendChild(i),Kt(s)}const d=(i,t)=>{if(i instanceof t)return!0;const e=Object.getPrototypeOf(i);return e===null?!1:e.constructor.name===t.name||d(e,t)};function Jt(i){const t=i.getPropertyValue("content");return`${i.cssText} content: '${t.replace(/'|"/g,"")}';`}function Qt(i,t){return tt(t).map(e=>{const r=i.getPropertyValue(e),s=i.getPropertyPriority(e);return`${e}: ${r}${s?" !important":""};`}).join(" ")}function Zt(i,t,e,r){const s=`.${i}:${t}`,n=e.cssText?Jt(e):Qt(e,r);return document.createTextNode(`${s}{${n}}`)}function F(i,t,e,r){const s=window.getComputedStyle(i,e),n=s.getPropertyValue("content");if(n===""||n==="none")return;const o=Wt();try{t.className=`${t.className} ${o}`}catch{return}const a=document.createElement("style");a.appendChild(Zt(o,e,s,r)),t.appendChild(a)}function te(i,t,e){F(i,t,":before",e),F(i,t,":after",e)}const O="application/font-woff",U="image/jpeg",ee={woff:O,woff2:O,ttf:"application/font-truetype",eot:"application/vnd.ms-fontobject",png:"image/png",jpg:U,jpeg:U,gif:"image/gif",tiff:"image/tiff",svg:"image/svg+xml",webp:"image/webp"};function ie(i){const t=/\.([^./]*?)$/g.exec(i);return t?t[1]:""}function D(i){const t=ie(i).toLowerCase();return ee[t]||""}function re(i){return i.split(/,/)[1]}function L(i){return i.search(/^(data:)/)!==-1}function se(i,t){return`data:${t};base64,${i}`}async function it(i,t,e){const r=await fetch(i,t);if(r.status===404)throw new Error(`Resource "${r.url}" not found`);const s=await r.blob();return new Promise((n,o)=>{const a=new FileReader;a.onerror=o,a.onloadend=()=>{try{n(e({res:r,result:a.result}))}catch(l){o(l)}},a.readAsDataURL(s)})}const T={};function ne(i,t,e){let r=i.replace(/\?.*/,"");return e&&(r=i),/ttf|otf|eot|woff2?/i.test(r)&&(r=r.replace(/.*\//,"")),t?`[${t}]${r}`:r}async function P(i,t,e){const r=ne(i,t,e.includeQueryParams);if(T[r]!=null)return T[r];e.cacheBust&&(i+=(/\?/.test(i)?"&":"?")+new Date().getTime());let s;try{const n=await it(i,e.fetchRequestInit,({res:o,result:a})=>(t||(t=o.headers.get("Content-Type")||""),re(a)));s=se(n,t)}catch(n){s=e.imagePlaceholder||"";let o=`Failed to fetch resource: ${i}`;n&&(o=typeof n=="string"?n:n.message),o&&console.warn(o)}return T[r]=s,s}async function oe(i){const t=i.toDataURL();return t==="data:,"?i.cloneNode(!1):E(t)}async function ae(i,t){if(i.currentSrc){const n=document.createElement("canvas"),o=n.getContext("2d");n.width=i.clientWidth,n.height=i.clientHeight,o?.drawImage(i,0,0,n.width,n.height);const a=n.toDataURL();return E(a)}const e=i.poster,r=D(e),s=await P(e,r,t);return E(s)}async function le(i,t){var e;try{if(!((e=i?.contentDocument)===null||e===void 0)&&e.body)return await C(i.contentDocument.body,t,!0)}catch{}return i.cloneNode(!1)}async function ce(i,t){return d(i,HTMLCanvasElement)?oe(i):d(i,HTMLVideoElement)?ae(i,t):d(i,HTMLIFrameElement)?le(i,t):i.cloneNode(rt(i))}const de=i=>i.tagName!=null&&i.tagName.toUpperCase()==="SLOT",rt=i=>i.tagName!=null&&i.tagName.toUpperCase()==="SVG";async function he(i,t,e){var r,s;if(rt(t))return t;let n=[];return de(i)&&i.assignedNodes?n=m(i.assignedNodes()):d(i,HTMLIFrameElement)&&(!((r=i.contentDocument)===null||r===void 0)&&r.body)?n=m(i.contentDocument.body.childNodes):n=m(((s=i.shadowRoot)!==null&&s!==void 0?s:i).childNodes),n.length===0||d(i,HTMLVideoElement)||await n.reduce((o,a)=>o.then(()=>C(a,e)).then(l=>{l&&t.appendChild(l)}),Promise.resolve()),t}function ue(i,t,e){const r=t.style;if(!r)return;const s=window.getComputedStyle(i);s.cssText?(r.cssText=s.cssText,r.transformOrigin=s.transformOrigin):tt(e).forEach(n=>{let o=s.getPropertyValue(n);n==="font-size"&&o.endsWith("px")&&(o=`${Math.floor(parseFloat(o.substring(0,o.length-2)))-.1}px`),d(i,HTMLIFrameElement)&&n==="display"&&o==="inline"&&(o="block"),n==="d"&&t.getAttribute("d")&&(o=`path(${t.getAttribute("d")})`),r.setProperty(n,o,s.getPropertyPriority(n))})}function me(i,t){d(i,HTMLTextAreaElement)&&(t.innerHTML=i.value),d(i,HTMLInputElement)&&t.setAttribute("value",i.value)}function pe(i,t){if(d(i,HTMLSelectElement)){const e=t,r=Array.from(e.children).find(s=>i.value===s.getAttribute("value"));r&&r.setAttribute("selected","")}}function fe(i,t,e){return d(t,Element)&&(ue(i,t,e),te(i,t,e),me(i,t),pe(i,t)),t}async function be(i,t){const e=i.querySelectorAll?i.querySelectorAll("use"):[];if(e.length===0)return i;const r={};for(let n=0;n<e.length;n++){const a=e[n].getAttribute("xlink:href");if(a){const l=i.querySelector(a),c=document.querySelector(a);!l&&c&&!r[a]&&(r[a]=await C(c,t,!0))}}const s=Object.values(r);if(s.length){const n="http://www.w3.org/1999/xhtml",o=document.createElementNS(n,"svg");o.setAttribute("xmlns",n),o.style.position="absolute",o.style.width="0",o.style.height="0",o.style.overflow="hidden",o.style.display="none";const a=document.createElementNS(n,"defs");o.appendChild(a);for(let l=0;l<s.length;l++)a.appendChild(s[l]);i.appendChild(o)}return i}async function C(i,t,e){return!e&&t.filter&&!t.filter(i)?null:Promise.resolve(i).then(r=>ce(r,t)).then(r=>he(i,r,t)).then(r=>fe(i,r,t)).then(r=>be(r,t))}const st=/url\((['"]?)([^'"]+?)\1\)/g,ge=/url\([^)]+\)\s*format\((["']?)([^"']+)\1\)/g,ye=/src:\s*(?:url\([^)]+\)\s*format\([^)]+\)[,;]\s*)+/g;function we(i){const t=i.replace(/([.*+?^${}()|\[\]\/\\])/g,"\\$1");return new RegExp(`(url\\(['"]?)(${t})(['"]?\\))`,"g")}function xe(i){const t=[];return i.replace(st,(e,r,s)=>(t.push(s),e)),t.filter(e=>!L(e))}async function ke(i,t,e,r,s){try{const n=e?qt(t,e):t,o=D(t);let a;return s||(a=await P(n,o,r)),i.replace(we(t),`$1${a}$3`)}catch{}return i}function ve(i,{preferredFontFormat:t}){return t?i.replace(ye,e=>{for(;;){const[r,,s]=ge.exec(e)||[];if(!s)return"";if(s===t)return`src: ${r};`}}):i}function nt(i){return i.search(st)!==-1}async function ot(i,t,e){if(!nt(i))return i;const r=ve(i,e);return xe(r).reduce((n,o)=>n.then(a=>ke(a,o,t,e)),Promise.resolve(r))}async function g(i,t,e){var r;const s=(r=t.style)===null||r===void 0?void 0:r.getPropertyValue(i);if(s){const n=await ot(s,null,e);return t.style.setProperty(i,n,t.style.getPropertyPriority(i)),!0}return!1}async function Se(i,t){await g("background",i,t)||await g("background-image",i,t),await g("mask",i,t)||await g("-webkit-mask",i,t)||await g("mask-image",i,t)||await g("-webkit-mask-image",i,t)}async function Ee(i,t){const e=d(i,HTMLImageElement);if(!(e&&!L(i.src))&&!(d(i,SVGImageElement)&&!L(i.href.baseVal)))return;const r=e?i.src:i.href.baseVal,s=await P(r,D(r),t);await new Promise((n,o)=>{i.onload=n,i.onerror=t.onImageErrorHandler?(...l)=>{try{n(t.onImageErrorHandler(...l))}catch(c){o(c)}}:o;const a=i;a.decode&&(a.decode=n),a.loading==="lazy"&&(a.loading="eager"),e?(i.srcset="",i.src=s):i.href.baseVal=s})}async function Ce(i,t){const r=m(i.childNodes).map(s=>at(s,t));await Promise.all(r).then(()=>i)}async function at(i,t){d(i,Element)&&(await Se(i,t),await Ee(i,t),await Ce(i,t))}function _e(i,t){const{style:e}=i;t.backgroundColor&&(e.backgroundColor=t.backgroundColor),t.width&&(e.width=`${t.width}px`),t.height&&(e.height=`${t.height}px`);const r=t.style;return r!=null&&Object.keys(r).forEach(s=>{e[s]=r[s]}),i}const j={};async function z(i){let t=j[i];if(t!=null)return t;const r=await(await fetch(i)).text();return t={url:i,cssText:r},j[i]=t,t}async function B(i,t){let e=i.cssText;const r=/url\(["']?([^"')]+)["']?\)/g,n=(e.match(/url\([^)]+\)/g)||[]).map(async o=>{let a=o.replace(r,"$1");return a.startsWith("https://")||(a=new URL(a,i.url).href),it(a,t.fetchRequestInit,({result:l})=>(e=e.replace(o,`url(${l})`),[o,l]))});return Promise.all(n).then(()=>e)}function q(i){if(i==null)return[];const t=[],e=/(\/\*[\s\S]*?\*\/)/gi;let r=i.replace(e,"");const s=new RegExp("((@.*?keyframes [\\s\\S]*?){([\\s\\S]*?}\\s*?)})","gi");for(;;){const l=s.exec(r);if(l===null)break;t.push(l[0])}r=r.replace(s,"");const n=/@import[\s\S]*?url\([^)]*\)[\s\S]*?;/gi,o="((\\s*?(?:\\/\\*[\\s\\S]*?\\*\\/)?\\s*?@media[\\s\\S]*?){([\\s\\S]*?)}\\s*?})|(([\\s\\S]*?){([\\s\\S]*?)})",a=new RegExp(o,"gi");for(;;){let l=n.exec(r);if(l===null){if(l=a.exec(r),l===null)break;n.lastIndex=a.lastIndex}else a.lastIndex=n.lastIndex;t.push(l[0])}return t}async function Me(i,t){const e=[],r=[];return i.forEach(s=>{if("cssRules"in s)try{m(s.cssRules||[]).forEach((n,o)=>{if(n.type===CSSRule.IMPORT_RULE){let a=o+1;const l=n.href,c=z(l).then(u=>B(u,t)).then(u=>q(u).forEach(_=>{try{s.insertRule(_,_.startsWith("@import")?a+=1:s.cssRules.length)}catch(ft){console.error("Error inserting rule from remote css",{rule:_,error:ft})}})).catch(u=>{console.error("Error loading remote css",u.toString())});r.push(c)}})}catch(n){const o=i.find(a=>a.href==null)||document.styleSheets[0];s.href!=null&&r.push(z(s.href).then(a=>B(a,t)).then(a=>q(a).forEach(l=>{o.insertRule(l,o.cssRules.length)})).catch(a=>{console.error("Error loading remote stylesheet",a)})),console.error("Error inlining remote css file",n)}}),Promise.all(r).then(()=>(i.forEach(s=>{if("cssRules"in s)try{m(s.cssRules||[]).forEach(n=>{e.push(n)})}catch(n){console.error(`Error while reading CSS rules from ${s.href}`,n)}}),e))}function Te(i){return i.filter(t=>t.type===CSSRule.FONT_FACE_RULE).filter(t=>nt(t.style.getPropertyValue("src")))}async function Le(i,t){if(i.ownerDocument==null)throw new Error("Provided element is not within a Document");const e=m(i.ownerDocument.styleSheets),r=await Me(e,t);return Te(r)}function lt(i){return i.trim().replace(/["']/g,"")}function Re(i){const t=new Set;function e(r){(r.style.fontFamily||getComputedStyle(r).fontFamily).split(",").forEach(n=>{t.add(lt(n))}),Array.from(r.children).forEach(n=>{n instanceof HTMLElement&&e(n)})}return e(i),t}async function Ae(i,t){const e=await Le(i,t),r=Re(i);return(await Promise.all(e.filter(n=>r.has(lt(n.style.fontFamily))).map(n=>{const o=n.parentStyleSheet?n.parentStyleSheet.href:null;return ot(n.cssText,o,t)}))).join(`
90
+ `)}async function De(i,t){const e=t.fontEmbedCSS!=null?t.fontEmbedCSS:t.skipFonts?null:await Ae(i,t);if(e){const r=document.createElement("style"),s=document.createTextNode(e);r.appendChild(s),i.firstChild?i.insertBefore(r,i.firstChild):i.appendChild(r)}}async function Pe(i,t={}){const{width:e,height:r}=et(i,t),s=await C(i,t,!0);return await De(s,t),await at(s,t),_e(s,t),await Gt(s,e,r)}async function He(i,t={}){const{width:e,height:r}=et(i,t),s=await Pe(i,t),n=await E(s),o=document.createElement("canvas"),a=o.getContext("2d"),l=t.pixelRatio||Yt(),c=t.canvasWidth||e,u=t.canvasHeight||r;return o.width=c*l,o.height=u*l,t.skipAutoScale||Xt(o),o.style.width=`${c}`,o.style.height=`${u}`,t.backgroundColor&&(a.fillStyle=t.backgroundColor,a.fillRect(0,0,o.width,o.height)),a.drawImage(n,0,0,o.width,o.height),o}async function $e(i,t={}){return(await He(i,t)).toDataURL()}async function Ie(i=[]){const t=Fe(i);try{const e=await $e(document.body,{cacheBust:!0,skipAutoScale:!1,filter:r=>!(r instanceof HTMLElement&&r.id==="mtb-widget-host")});return je(e)}catch{return null}finally{t?.remove()}}function Fe(i){if(i.length===0)return null;const t=document.createElement("div");t.setAttribute("data-mtb-capture-annotations","true"),t.setAttribute("aria-hidden","true"),t.style.cssText="position:fixed;inset:0;pointer-events:none;z-index:2147483645;";for(const[e,r]of i.entries())r.type==="pin"?t.appendChild(Oe(r,e+1)):r.type==="draw"&&r.drawPath&&t.appendChild(Ue(r.drawPath));return document.body.appendChild(t),t}function Oe(i,t){const e=document.createElement("div");return e.textContent=String(t),e.style.cssText=["position:fixed",`left:${i.x}px`,`top:${i.y}px`,"width:22px","height:22px","border-radius:50% 50% 50% 2px","background:#059669","border:2px solid #fff","display:flex","align-items:center","justify-content:center",'font:700 10px -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif',"color:#fff","box-shadow:0 2px 8px rgba(5,150,105,0.45)","transform:translate(-50%,-50%)"].join(";"),e}function Ue(i){const t=document.createElementNS("http://www.w3.org/2000/svg","svg");t.setAttribute("width","100%"),t.setAttribute("height","100%"),t.setAttribute("viewBox",`0 0 ${window.innerWidth} ${window.innerHeight}`),t.style.cssText="position:fixed;inset:0;width:100%;height:100%;overflow:visible;";const e=document.createElementNS("http://www.w3.org/2000/svg","path");return e.setAttribute("d",i),e.setAttribute("fill","none"),e.setAttribute("stroke","#059669"),e.setAttribute("stroke-width","3.5"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-linejoin","round"),e.setAttribute("filter","drop-shadow(0 1px 2px rgba(5,150,105,0.35))"),t.appendChild(e),t}function je(i){const[t,e]=i.split(","),r=t.match(/:(.*?);/)?.[1]??"image/png",s=atob(e),n=new Uint8Array(s.length);for(let o=0;o<s.length;o++)n[o]=s.charCodeAt(o);return new Blob([n],{type:r})}class ze{constructor(){this.listeners=new Set,this.originalOnError=null,this.installedOnError=null,this.rejectionHandler=null,this.hooked=!1}subscribe(t){return this.listeners.add(t),this.hook(),()=>{this.listeners.delete(t),this.listeners.size===0&&this.unhook()}}hook(){this.hooked||(this.hooked=!0,this.originalOnError=window.onerror,this.installedOnError=(t,e,r,s,n)=>(this.emit({message:String(t),source:e,line:r,col:s,error:n}),this.originalOnError?this.originalOnError.call(window,t,e,r,s,n):!1),window.onerror=this.installedOnError,this.rejectionHandler=t=>{const e=t.reason instanceof Error?t.reason.message:String(t.reason);this.emit({message:`Unhandled rejection: ${e}`})},window.addEventListener("unhandledrejection",this.rejectionHandler))}unhook(){this.hooked&&(this.hooked=!1,window.onerror===this.installedOnError&&(window.onerror=this.originalOnError),this.installedOnError=null,this.originalOnError=null,this.rejectionHandler&&(window.removeEventListener("unhandledrejection",this.rejectionHandler),this.rejectionHandler=null))}emit(t){for(const e of this.listeners)e(t)}}const ct=new ze,Be=20;class qe{constructor(){this.errors=[],this.unsubscribe=null}start(){this.unsubscribe||(this.unsubscribe=ct.subscribe(t=>this.record(t)))}record(t){const e=t.line!=null?` (${t.line}:${t.col??0})`:"";this.addError(`${t.message}${e}`)}addError(t){this.errors.length>=Be||this.errors.includes(t)||this.errors.push(t)}getErrors(){return[...this.errors]}stop(){this.unsubscribe?.(),this.unsubscribe=null}}const We=3,Ne=1e3,Ve=3,Ye=5e3,Xe=500,Ke=500,Ge=300,Je=new Set(["A","BUTTON","INPUT","SELECT","TEXTAREA","LABEL","SUMMARY","DETAILS"]),Qe=new Set(["button","link","checkbox","radio","tab","menuitem","option","switch","textbox","combobox","listbox","slider","spinbutton"]),W=["404","500","not found","page not found","server error","internal server error"],k=class k{constructor(t){this.clickHistory=[],this.unsubscribeErrors=null,this.active=!1,this.errorCount=0,this.deadClickCount=0,this.cooldownUntil=0,this.navTimestamps=[],this.boundPopstateHandler=null,this.originalPushState=null,this.originalReplaceState=null,this.installedPushState=null,this.installedReplaceState=null,this.boundSubmitHandler=null,this.boundInvalidHandler=null,this.errorPageUrls=new Set,this.domObserver=null,this.pendingDomChecks=0,this.lastMutationAt=-1,this.onFrustration=t,this.boundClickHandler=e=>this.handleClick(e)}start(){this.active||(this.active=!0,document.addEventListener("click",this.boundClickHandler,!0),this.unsubscribeErrors=ct.subscribe(t=>{this.errorCount++}),this.startNavigationTracking(),this.startFormTracking(),this.checkErrorPage())}stop(){this.active&&(this.active=!1,document.removeEventListener("click",this.boundClickHandler,!0),this.unsubscribeErrors?.(),this.unsubscribeErrors=null,this.clickHistory=[],this.stopNavigationTracking(),this.stopFormTracking(),this.errorPageUrls.clear(),this.disconnectDomObserver())}startNavigationTracking(){this.boundPopstateHandler=()=>this.handleNavigation(),window.addEventListener("popstate",this.boundPopstateHandler),this.originalPushState=history.pushState.bind(history),this.originalReplaceState=history.replaceState.bind(history);const t=this.originalPushState,e=this.originalReplaceState,r=()=>this.handleNavigation();this.installedPushState=function(s,n,o){t(s,n,o),r()},this.installedReplaceState=function(s,n,o){e(s,n,o),r()},history.pushState=this.installedPushState,history.replaceState=this.installedReplaceState}stopNavigationTracking(){this.boundPopstateHandler&&(window.removeEventListener("popstate",this.boundPopstateHandler),this.boundPopstateHandler=null),this.originalPushState&&history.pushState===this.installedPushState&&(history.pushState=this.originalPushState),this.originalReplaceState&&history.replaceState===this.installedReplaceState&&(history.replaceState=this.originalReplaceState),this.originalPushState=null,this.originalReplaceState=null,this.installedPushState=null,this.installedReplaceState=null,this.navTimestamps=[]}startFormTracking(){this.boundSubmitHandler=t=>this.handleFormSubmit(t),this.boundInvalidHandler=t=>this.handleFormInvalid(t),document.addEventListener("submit",this.boundSubmitHandler,!0),document.addEventListener("invalid",this.boundInvalidHandler,!0)}stopFormTracking(){this.boundSubmitHandler&&(document.removeEventListener("submit",this.boundSubmitHandler,!0),this.boundSubmitHandler=null),this.boundInvalidHandler&&(document.removeEventListener("invalid",this.boundInvalidHandler,!0),this.boundInvalidHandler=null)}handleClick(t){const e=t.target;if(!e||this.isWidgetElement(e))return;const r=Date.now();this.clickHistory.push({target:e,time:r});const s=r-Ne;if(this.clickHistory=this.clickHistory.filter(o=>o.time>s),this.clickHistory.filter(o=>o.target===e).length>=We){this.clickHistory=[],this.emitHighPriority({signal:"rage_click",target:y(e),timestamp:r});return}this.isInteractive(e)||(this.deadClickCount++,this.deadClickCount>=3&&this.errorCount>0&&(this.deadClickCount=0,this.errorCount=0,this.emitIfReady({signal:"dead_click",target:y(e),timestamp:r}))),this.checkDeadClickDom(e,r)}handleNavigation(){const t=Date.now();this.navTimestamps.push(t);const e=t-Ye;this.navTimestamps=this.navTimestamps.filter(r=>r>e),this.navTimestamps.length>=Ve&&(this.navTimestamps=[],this.emitIfReady({signal:"rapid_navigation",timestamp:t})),setTimeout(()=>{this.active&&this.checkErrorPage()},Ge)}handleFormSubmit(t){const e=t.target;e instanceof HTMLFormElement&&(this.isWidgetElement(e)||setTimeout(()=>{this.active&&e.querySelector('[aria-invalid="true"], .is-invalid')&&this.emitIfReady({signal:"form_failure",target:y(e),timestamp:Date.now()})},Xe))}handleFormInvalid(t){const e=t.target;if(!e||this.isWidgetElement(e))return;const r=e.closest("form");this.emitIfReady({signal:"form_failure",target:y(r||e),timestamp:Date.now()})}checkErrorPage(){const t=location.href;if(this.errorPageUrls.has(t))return;const e=document.title.toLowerCase();if(W.some(s=>e.includes(s))){this.errorPageUrls.add(t),this.emitHighPriority({signal:"error_page",detail:document.title,timestamp:Date.now()});return}const r=document.querySelectorAll('h1, h2, [class*="error"], [class*="not-found"], [id*="error"], [id*="not-found"]');for(const s of r){const n=s.textContent??"";if(n.length<200&&W.some(o=>n.toLowerCase().includes(o))){this.errorPageUrls.add(t),this.emitHighPriority({signal:"error_page",detail:n.trim().slice(0,60),timestamp:Date.now()});return}}}checkDeadClickDom(t,e){this.looksInteractive(t)&&(this.pendingDomChecks++,this.ensureDomObserver(),setTimeout(()=>{this.pendingDomChecks--;const r=this.lastMutationAt>=e;this.pendingDomChecks===0&&this.disconnectDomObserver(),!r&&this.active&&this.emitIfReady({signal:"dead_click_dom",target:y(t),timestamp:e})},Ke))}ensureDomObserver(){this.domObserver||(this.domObserver=new MutationObserver(()=>{this.lastMutationAt=Date.now()}),this.domObserver.observe(document.body,{childList:!0,subtree:!0,attributes:!0,characterData:!0}))}disconnectDomObserver(){this.domObserver?.disconnect(),this.domObserver=null}looksInteractive(t){if(window.getComputedStyle(t).cursor==="pointer")return!0;if(t.classList)for(const r of t.classList){const s=r.toLowerCase();if(s.includes("btn")||s.includes("button"))return!0}return!1}isInteractive(t){if(Je.has(t.tagName))return!0;const e=t.getAttribute("role");return!!(e&&Qe.has(e)||t.hasAttribute("onclick")||t.hasAttribute("tabindex")||t.contentEditable==="true"||window.getComputedStyle(t).cursor==="pointer"||t.closest('a, button, [role="button"], [role="link"], label'))}isWidgetElement(t){const e=document.getElementById("mtb-widget-host");return e?e===t||e.contains(t):!1}emitIfReady(t){const e=Date.now();e<this.cooldownUntil||(this.cooldownUntil=e+k.COOLDOWN_MS,this.onFrustration(t))}emitHighPriority(t){this.cooldownUntil=Date.now()+k.COOLDOWN_MS,this.onFrustration(t)}};k.COOLDOWN_MS=6e4;let R=k;function y(i){const t=i.tagName.toLowerCase(),e=i.id?`#${i.id}`:"",r=i.className&&typeof i.className=="string"?"."+i.className.trim().split(/\s+/).slice(0,2).join("."):"",s=i.textContent?.trim().slice(0,30)??"";return`<${t}${e}${r}>${s?` "${s}"`:""}`}function Ze(){return{page_url:window.location.href,user_agent:navigator.userAgent,browser:ti(),os:ei(),screen_width:window.screen.width,screen_height:window.screen.height}}function ti(){const i=navigator.userAgent;return/Edg\//.test(i)?`Edge ${i.match(/Edg\/(\S+)/)?.[1]??""}`:/OPR\//.test(i)?`Opera ${i.match(/OPR\/(\S+)/)?.[1]??""}`:/Chrome\//.test(i)?`Chrome ${i.match(/Chrome\/(\S+)/)?.[1]??""}`:/Safari\//.test(i)&&/Version\//.test(i)?`Safari ${i.match(/Version\/(\S+)/)?.[1]??""}`:/Firefox\//.test(i)?`Firefox ${i.match(/Firefox\/(\S+)/)?.[1]??""}`:"Unknown"}function ei(){const i=navigator.userAgent;return/Windows NT 10/.test(i)?"Windows 10/11":/Windows NT/.test(i)?"Windows":/Mac OS X 10_15|macOS 1[56789]/.test(i)||/Mac OS X/.test(i)?"macOS":/Android/.test(i)?`Android ${i.match(/Android (\d+)/)?.[1]??""}`:/iPhone|iPad|iPod/.test(i)?"iOS":/Linux/.test(i)?"Linux":"Unknown"}const ii="https://makethisbetter.dev/api/v1";class ri{constructor(t,e,r=1e3,s,n){this.projectKey=t,this.apiUrl=(e??ii).replace(/\/$/,""),this.retryDelayMs=r,this.userToken=s,this.userTokenFn=n}async resolveUserToken(){return this.userTokenFn?this.userTokenFn():this.userToken}async authHeaders(t){const e={"X-Project-Key":this.projectKey},r=await this.resolveUserToken();return r&&(e["X-User-Token"]=r),t&&(e["Content-Type"]=t),e}async submitFeedback(t,e){const r=new FormData;if(r.append("feedback[description]",t.description),r.append("feedback[page_url]",t.page_url),r.append("feedback[user_agent]",t.user_agent),r.append("feedback[browser]",t.browser),r.append("feedback[os]",t.os),r.append("feedback[screen_width]",String(t.screen_width)),r.append("feedback[screen_height]",String(t.screen_height)),r.append("feedback[console_errors]",JSON.stringify(t.console_errors)),r.append("feedback[annotations]",JSON.stringify(t.annotations)),t.target_element&&r.append("feedback[target_element]",JSON.stringify(t.target_element)),t.user_id&&r.append("feedback[user_id]",t.user_id),t.reporter_external_id&&r.append("feedback[reporter_external_id]",t.reporter_external_id),t.reporter_email&&r.append("feedback[reporter_email]",t.reporter_email),t.user_email&&r.append("feedback[user_email]",t.user_email),t.user_name&&r.append("feedback[user_name]",t.user_name),t.recording_events&&t.recording_events.length>0){const o=JSON.stringify(t.recording_events),a=new Blob([o],{type:"application/json"});r.append("feedback[recording]",a,"recording.json"),r.append("feedback[recording_duration]",String(t.recording_duration??0))}e&&r.append("feedback[screenshot]",e,"screenshot.png");const s=await this.authHeaders();return s["X-Idempotency-Key"]=si(),(await this.fetchWithRetry(`${this.apiUrl}/widget/feedbacks`,{method:"POST",headers:s,body:r})).json()}async createIdentityToken(t){const e=await this.authHeaders("application/json");try{return await(await this.fetchWithRetry(`${this.apiUrl}/widget/identity_tokens`,{method:"POST",headers:e,body:JSON.stringify({reporter_external_id:t})})).json()}catch{return null}}async updateReporter(t,e,r){const s=await this.authHeaders("application/json");s["X-Identity-Token"]=r;try{return await this.fetchWithRetry(`${this.apiUrl}/widget/feedbacks/${t}/reporter`,{method:"PATCH",headers:s,body:JSON.stringify({reporter:{email:e}})}),!0}catch{return!1}}async startClarification(t,e){const r={};e&&(r.message=e);const s=await this.authHeaders("application/json");return(await this.fetchWithRetry(`${this.apiUrl}/widget/feedbacks/${t}/clarify`,{method:"POST",headers:s,body:JSON.stringify(r)})).json()}async getClarification(t){const e=await this.authHeaders();return(await this.fetchWithRetry(`${this.apiUrl}/widget/feedbacks/${t}/clarify`,{method:"GET",headers:e})).json()}async fetchWithRetry(t,e,r=1){let s;try{s=await fetch(t,e)}catch(n){if(r>0)return await N(this.retryDelayMs),this.fetchWithRetry(t,e,r-1);throw n}if(s.ok)return s;if(s.status>=500&&r>0)return await N(this.retryDelayMs),this.fetchWithRetry(t,e,r-1);throw new Error(`HTTP ${s.status}`)}}function N(i){return i<=0?Promise.resolve():new Promise(t=>setTimeout(t,i))}function si(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,12)}`}function ni(i,t,e,r,s,n,o,a){return{description:i,...t,console_errors:e,annotations:r?[r]:[],target_element:r?.targetSelector?{selector:r.targetSelector,text:r.targetText??"",name:r.targetName??""}:void 0,user_id:s?.id,user_email:s?.email,user_name:s?.name,reporter_external_id:s?void 0:o,reporter_email:s?void 0:a,recording_events:n?.events,recording_duration:n?.duration}}const V="mtb_anon_id",dt="mtb_reporter_email",ht="mtb_board_url";let Y=null,ut=null,mt=null;function X(){try{const i=window.localStorage.getItem(V);if(i?.startsWith("anon_"))return i;const t=J();return window.localStorage.setItem(V,t),t}catch{return Y??(Y=J()),Y}}function K(){try{return window.localStorage.getItem(dt)??void 0}catch{return ut??void 0}}function oi(i){ut=i;try{window.localStorage.setItem(dt,i)}catch{}}function ai(){try{return window.localStorage.getItem(ht)??void 0}catch{return mt??void 0}}function G(i){mt=i;try{window.localStorage.setItem(ht,i)}catch{}}function J(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?`anon_${crypto.randomUUID()}`:`anon_${`${Date.now().toString(16)}-${Math.random().toString(16).slice(2,10)}`}`}const li={tab:"Feedback",toolbar:{markup:"Mark up",record:"Record",hint:"Click any element to annotate · drag to draw",hintRecord:"Recording your screen",exit:"Exit"},popup:{about:"About",placeholder:"Describe the issue or suggestion...",submit:"Submit",cancel:"Cancel",my_feedback:"My feedback",quickOptions:[{emoji:"🐛",label:"Something is broken"},{emoji:"💡",label:"I wish this worked differently"},{emoji:"🤔",label:"I don't understand this"},{emoji:"✨",label:"I have an idea"}]},success:{title:"Thanks!",message:"Your feedback has been received.",title_no_ai:"Sent — thanks!",message_no_ai:"We'll take it from here. You'll hear back when it's resolved.",view_feedback:"View my feedback",close:"Close",email_prompt:"Want updates? Leave your email and we'll let you know when it's resolved.",email_placeholder:"you@example.com",email_submit:"Notify me",email_saved:"You'll get an email when it's resolved.",email_error:"Couldn't save your email. Please try again."},error:{submit:"Failed to submit. Please try again."},pet:{bubble:"Need help?"},frustration:{prompt:"Something not working? Tell us.",action:"Annotate",dismiss:"Dismiss"},annotation:{drawing:"Drawing",element:"element"},record:{stop:"Stop",timer_label:"Recording",max_reached:"Maximum recording time reached"},clarify:{thinking:"Thinking...",placeholder:"Type your response...",send:"Send",skip:"Skip"}},ci={tab:"反馈",toolbar:{markup:"标注",record:"录屏",hint:"点击任意元素进行标注 · 拖拽可自由绘制",hintRecord:"正在录制屏幕",exit:"退出"},popup:{about:"关于",placeholder:"描述问题或建议...",submit:"提交",cancel:"取消",my_feedback:"我的反馈",quickOptions:[{emoji:"🐛",label:"这里有问题"},{emoji:"💡",label:"我希望它能更好用"},{emoji:"🤔",label:"我看不懂这里"},{emoji:"✨",label:"我有个想法"}]},success:{title:"感谢!",message:"您的反馈已收到。",title_no_ai:"已发送,感谢!",message_no_ai:"我们会跟进处理,解决后会通知您。",view_feedback:"查看我的反馈",close:"关闭",email_prompt:"想了解进展?留下邮箱,问题解决后我们会通知您。",email_placeholder:"you@example.com",email_submit:"通知我",email_saved:"问题解决后您会收到邮件通知。",email_error:"邮箱保存失败,请重试。"},error:{submit:"提交失败,请重试。"},pet:{bubble:"需要帮助吗?"},frustration:{prompt:"遇到问题了?告诉我们。",action:"标注",dismiss:"关闭"},annotation:{drawing:"绘制",element:"元素"},record:{stop:"停止",timer_label:"录制中",max_reached:"已达到最大录制时长"},clarify:{thinking:"思考中...",placeholder:"输入你的回复...",send:"发送",skip:"跳过"}},di={tab:"フィードバック",toolbar:{markup:"マークアップ",record:"録画",hint:"要素をクリックして注釈 · ドラッグで描画",hintRecord:"画面を録画中",exit:"終了"},popup:{about:"概要",placeholder:"問題や提案を入力してください...",submit:"送信",cancel:"キャンセル",my_feedback:"自分のフィードバック",quickOptions:[{emoji:"🐛",label:"不具合があります"},{emoji:"💡",label:"もっと使いやすくしてほしい"},{emoji:"🤔",label:"ここがわかりにくい"},{emoji:"✨",label:"アイデアがあります"}]},success:{title:"ありがとうございます!",message:"フィードバックを受け付けました。",title_no_ai:"送信しました!",message_no_ai:"チームが対応します。解決次第お知らせします。",view_feedback:"フィードバックを確認",close:"閉じる",email_prompt:"進捗を知りたい場合は、メールアドレスをご記入ください。解決次第お知らせします。",email_placeholder:"you@example.com",email_submit:"通知を受け取る",email_saved:"解決次第メールでお知らせします。",email_error:"メールアドレスを保存できませんでした。もう一度お試しください。"},error:{submit:"送信に失敗しました。もう一度お試しください。"},pet:{bubble:"お困りですか?"},frustration:{prompt:"うまくいかないことがありますか?お知らせください。",action:"注釈",dismiss:"閉じる"},annotation:{drawing:"描画",element:"要素"},record:{stop:"停止",timer_label:"録画中",max_reached:"最大録画時間に達しました"},clarify:{thinking:"考え中...",placeholder:"回答を入力...",send:"送信",skip:"スキップ"}},hi={tab:"피드백",toolbar:{markup:"마크업",record:"녹화",hint:"요소를 클릭하여 주석 · 드래그하여 그리기",hintRecord:"화면을 녹화 중입니다",exit:"나가기"},popup:{about:"정보",placeholder:"문제 또는 제안 사항을 설명해 주세요...",submit:"제출",cancel:"취소",my_feedback:"내 피드백",quickOptions:[{emoji:"🐛",label:"오류가 있어요"},{emoji:"💡",label:"이 기능을 개선해 주세요"},{emoji:"🤔",label:"이 부분을 모르겠어요"},{emoji:"✨",label:"아이디어가 있어요"}]},success:{title:"감사합니다!",message:"피드백이 접수되었습니다.",title_no_ai:"전송 완료!",message_no_ai:"팀에서 처리 후 알려드리겠습니다.",view_feedback:"내 피드백 보기",close:"닫기",email_prompt:"진행 상황이 궁금하신가요? 이메일을 남겨주시면 해결 시 알려드립니다.",email_placeholder:"you@example.com",email_submit:"알림 받기",email_saved:"해결되면 이메일로 알려드립니다.",email_error:"이메일을 저장하지 못했습니다. 다시 시도해 주세요."},error:{submit:"제출에 실패했습니다. 다시 시도해 주세요."},pet:{bubble:"도움이 필요하신가요?"},frustration:{prompt:"문제가 있으신가요? 알려 주세요.",action:"주석",dismiss:"닫기"},annotation:{drawing:"그리기",element:"요소"},record:{stop:"중지",timer_label:"녹화 중",max_reached:"최대 녹화 시간에 도달했습니다"},clarify:{thinking:"생각 중...",placeholder:"답변을 입력하세요...",send:"보내기",skip:"건너뛰기"}},ui={tab:"Comentarios",toolbar:{markup:"Anotar",record:"Grabar",hint:"Haz clic en cualquier elemento para anotar · arrastra para dibujar",hintRecord:"Grabando tu pantalla",exit:"Salir"},popup:{about:"Acerca de",placeholder:"Describe el problema o sugerencia...",submit:"Enviar",cancel:"Cancelar",my_feedback:"Mis comentarios",quickOptions:[{emoji:"🐛",label:"Algo no funciona"},{emoji:"💡",label:"Me gustaría que funcionara diferente"},{emoji:"🤔",label:"No entiendo esto"},{emoji:"✨",label:"Tengo una idea"}]},success:{title:"¡Gracias!",message:"Tu comentario ha sido recibido.",title_no_ai:"¡Enviado!",message_no_ai:"Nos encargamos. Te avisaremos cuando se resuelva.",view_feedback:"Ver mis comentarios",close:"Cerrar",email_prompt:"¿Quieres novedades? Deja tu correo y te avisaremos cuando se resuelva.",email_placeholder:"tu@ejemplo.com",email_submit:"Avisarme",email_saved:"Recibirás un correo cuando se resuelva.",email_error:"No se pudo guardar tu correo. Inténtalo de nuevo."},error:{submit:"Error al enviar. Por favor, inténtalo de nuevo."},pet:{bubble:"¿Necesitas ayuda?"},frustration:{prompt:"¿Algo no funciona? Cuéntanos.",action:"Anotar",dismiss:"Cerrar"},annotation:{drawing:"Dibujo",element:"elemento"},record:{stop:"Detener",timer_label:"Grabando",max_reached:"Se alcanzó el tiempo máximo de grabación"},clarify:{thinking:"Pensando...",placeholder:"Escribe tu respuesta...",send:"Enviar",skip:"Omitir"}},mi={tab:"Avis",toolbar:{markup:"Annoter",record:"Enregistrer",hint:"Cliquez sur un élément pour l'annoter · glissez pour dessiner",hintRecord:"Enregistrement de l'écran en cours",exit:"Quitter"},popup:{about:"À propos",placeholder:"Décrivez le problème ou votre suggestion...",submit:"Envoyer",cancel:"Annuler",my_feedback:"Mes avis",quickOptions:[{emoji:"🐛",label:"Quelque chose ne fonctionne pas"},{emoji:"💡",label:"J'aimerais que cela fonctionne autrement"},{emoji:"🤔",label:"Je ne comprends pas ceci"},{emoji:"✨",label:"J'ai une idée"}]},success:{title:"Merci !",message:"Votre avis a bien été reçu.",title_no_ai:"Envoyé !",message_no_ai:"On s'en occupe. Vous serez informé(e) dès que ce sera résolu.",view_feedback:"Voir mes avis",close:"Fermer",email_prompt:"Envie de suivre l'avancement ? Laissez votre e-mail et nous vous préviendrons une fois résolu.",email_placeholder:"vous@exemple.com",email_submit:"Me prévenir",email_saved:"Vous recevrez un e-mail une fois résolu.",email_error:"Impossible d'enregistrer votre e-mail. Veuillez réessayer."},error:{submit:"Échec de l'envoi. Veuillez réessayer."},pet:{bubble:"Besoin d'aide ?"},frustration:{prompt:"Un problème ? Dites-le-nous.",action:"Annoter",dismiss:"Fermer"},annotation:{drawing:"Dessin",element:"élément"},record:{stop:"Arrêter",timer_label:"Enregistrement",max_reached:"Durée maximale d'enregistrement atteinte"},clarify:{thinking:"Réflexion...",placeholder:"Tapez votre réponse...",send:"Envoyer",skip:"Passer"}},pi={tab:"Feedback",toolbar:{markup:"Markieren",record:"Aufnehmen",hint:"Klicken Sie auf ein Element zum Kommentieren · ziehen Sie zum Zeichnen",hintRecord:"Bildschirmaufnahme läuft",exit:"Beenden"},popup:{about:"Info",placeholder:"Beschreiben Sie das Problem oder Ihren Vorschlag...",submit:"Absenden",cancel:"Abbrechen",my_feedback:"Mein Feedback",quickOptions:[{emoji:"🐛",label:"Etwas funktioniert nicht"},{emoji:"💡",label:"Ich wünsche mir das anders"},{emoji:"🤔",label:"Das verstehe ich nicht"},{emoji:"✨",label:"Ich habe eine Idee"}]},success:{title:"Vielen Dank!",message:"Ihr Feedback wurde empfangen.",title_no_ai:"Gesendet!",message_no_ai:"Wir kümmern uns darum. Sie werden benachrichtigt, sobald es gelöst ist.",view_feedback:"Mein Feedback ansehen",close:"Schließen",email_prompt:"Updates gewünscht? Hinterlassen Sie Ihre E-Mail und wir melden uns, sobald es gelöst ist.",email_placeholder:"sie@beispiel.de",email_submit:"Benachrichtigen",email_saved:"Sie erhalten eine E-Mail, sobald es gelöst ist.",email_error:"E-Mail konnte nicht gespeichert werden. Bitte versuchen Sie es erneut."},error:{submit:"Senden fehlgeschlagen. Bitte versuchen Sie es erneut."},pet:{bubble:"Brauchen Sie Hilfe?"},frustration:{prompt:"Etwas funktioniert nicht? Sagen Sie es uns.",action:"Kommentieren",dismiss:"Schließen"},annotation:{drawing:"Zeichnung",element:"Element"},record:{stop:"Stopp",timer_label:"Aufnahme",max_reached:"Maximale Aufnahmezeit erreicht"},clarify:{thinking:"Einen Moment...",placeholder:"Antwort eingeben...",send:"Senden",skip:"Überspringen"}},x={en:li,"zh-CN":ci,ja:di,ko:hi,es:ui,fr:mi,de:pi};function fi(i){if(x[i])return x[i];const t=i.split("-")[0];return x[t]?x[t]:x.en}const bi=60,gi="https://cdn.jsdelivr.net/npm/@rrweb/record@2.1.0/umd/record.min.js",yi="sha384-MrD66HBNSykaP2N95+6hQCFlF5oH2tvL3TD/zyvHNkP/sAFWZx98DX9MEDy8MdVT";let v=null;function wi(){return v||(v=xi().catch(()=>ki()),v)}async function xi(){return(await import("@rrweb/record")).record}function Q(){const i=globalThis;return i.rrwebRecord?.record??i.rrweb?.record}function ki(){return new Promise((i,t)=>{const e=Q();if(e){i(e);return}const r=document.createElement("script");r.src=gi,r.integrity=yi,r.crossOrigin="anonymous",r.onload=()=>{const s=Q();s?i(s):t(new Error("rrweb record global not found after script load"))},r.onerror=()=>t(new Error("Failed to load rrweb from CDN")),document.head.appendChild(r)})}class vi{constructor(t,e){this.events=[],this.stopFn=null,this.startedAt=0,this.timer=null,this.clickHandler=null,this.stopped=!1,this.shadow=t,this.onMaxReached=e}async start(){const t=await wi();this.startedAt=Date.now(),this.stopped=!1,this.stopFn=t({emit:e=>{this.stopped||this.events.push(e)}}),this.clickHandler=e=>{this.showClickRipple(e.clientX,e.clientY),t.addCustomEvent?.("mtb-click",{x:e.clientX,y:e.clientY,target:e.target instanceof HTMLElement?e.target.tagName:""})},document.addEventListener("click",this.clickHandler,!0),this.timer=setTimeout(()=>{this.onMaxReached?.()},bi*1e3)}stop(){return this.stopped=!0,this.stopFn?.(),this.stopFn=null,this.cleanupTimer(),this.cleanupClickHandler(),{events:this.events,duration:this.getDuration()}}getDuration(){return this.startedAt===0?0:Math.round((Date.now()-this.startedAt)/1e3)}destroy(){this.stopped=!0,this.stopFn?.(),this.stopFn=null,this.cleanupTimer(),this.cleanupClickHandler(),this.events=[],this.startedAt=0}cleanupTimer(){this.timer&&(clearTimeout(this.timer),this.timer=null)}cleanupClickHandler(){this.clickHandler&&(document.removeEventListener("click",this.clickHandler,!0),this.clickHandler=null)}showClickRipple(t,e){const r=this.shadow.el("div","mtb-click-ripple");r.style.left=`${t}px`,r.style.top=`${e}px`,this.shadow.append(r),r.addEventListener("animationend",()=>r.remove())}}class Si{constructor(t,e,r,s){this.intervalId=null,this.getDuration=r,this.el=t.el("div","mtb-record-bar"),this.el.innerHTML=`
91
+ <span class="mtb-record-dot"></span>
92
+ <span class="mtb-record-timer">00:00</span>
93
+ <button class="mtb-record-stop" type="button">${e.record.stop}</button>
94
+ `,t.append(this.el),this.timerEl=this.el.querySelector(".mtb-record-timer"),this.el.querySelector(".mtb-record-stop").addEventListener("click",s),this.intervalId=setInterval(()=>this.updateTimer(),1e3)}updateTimer(){const t=this.getDuration(),e=String(Math.floor(t/60)).padStart(2,"0"),r=String(t%60).padStart(2,"0");this.timerEl.textContent=`${e}:${r}`}destroy(){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null),this.el.remove()}}class Ei{constructor(){this.session=null,this.bar=null,this.result=null}async start(t,e,r){this.session=new vi(t,r),this.bar=new Si(t,e,()=>this.session?.getDuration()??0,r),await this.session.start()}stop(){return this.session?(this.result=this.session.stop(),this.teardownUI(),this.result):null}getRecording(){return this.result}destroy(){this.teardownUI(),this.result=null}teardownUI(){this.session?.destroy(),this.session=null,this.bar?.destroy(),this.bar=null}}class Z{constructor(t){this.tab=null,this.toolbar=null,this.session=null,this.popup=null,this.clarify=null,this.success=null,this.frustrationPrompt=null,this.frustrationDetector=null,this.mode="idle",this.currentAnnotation=null,this.recordingManager=null,this.lastHandoff={},this.config=t,this.messages=fi(t.locale??"en"),this.apiClient=new ri(t.projectKey,t.apiUrl,void 0,t.userToken,t.userTokenFn),this.consoleCollector=new qe,this.consoleCollector.start(),this.buildUI(),t.frustrationDetection!==!1&&(this.frustrationDetector=new R(()=>this.handleFrustration()),this.frustrationDetector.start())}buildUI(){this.shadow=new Et(this.config.theme??"auto"),this.tab=new Ct(this.shadow,this.messages,this.config.position??"right",()=>this.handleTabClick(),this.config.tabText)}handleTabClick(){this.mode==="idle"?(this.dismissFrustrationPrompt(),this.enterAnnotationMode()):this.exitAll()}handleFrustration(){this.mode!=="idle"||this.frustrationPrompt||(this.frustrationPrompt=new Mt(this.shadow,this.messages,{onTell:()=>{this.dismissFrustrationPrompt(),this.enterAnnotationMode()},onDismiss:()=>this.dismissFrustrationPrompt()}))}dismissFrustrationPrompt(){this.frustrationPrompt?.destroy(),this.frustrationPrompt=null}enterAnnotationMode(){this.mode="annotating",this.tab?.setActive(!0),this.toolbar=new Tt(this.shadow,this.messages,()=>this.exitAll(),t=>this.handleToolbarModeChange(t)),this.session=new $(this.shadow,this.messages,(t,e)=>{this.currentAnnotation=t,this.showPopup(t.x,t.y,e)})}handleToolbarModeChange(t){t==="record"?(this.mode="recording",this.session?.destroy(),this.session=null,this.recordingManager=new Ei,this.recordingManager.start(this.shadow,this.messages,()=>{this.recordingManager&&(this.recordingManager.stop(),this.showPopup(window.innerWidth/2,window.innerHeight/2,this.messages.record.timer_label))}).catch(e=>{console.warn("[MakeThisBetter] Screen recording unavailable, falling back to markup:",e),this.mode==="recording"&&(this.toolbar?.setMode("markup"),this.handleToolbarModeChange("markup"))})):(this.recordingManager?.destroy(),this.recordingManager=null,this.session||(this.session=new $(this.shadow,this.messages,(e,r)=>{this.currentAnnotation=e,this.showPopup(e.x,e.y,r)})),this.mode="annotating")}showPopup(t,e,r){this.mode="popup",this.session?.dismissInteraction(),this.popup=new It(this.shadow,{targetName:r,x:t,y:e,messages:this.messages,onSubmit:s=>this.handleSubmit(s),onClose:()=>this.exitAll(),onMyFeedback:this.buildMyFeedbackHandler()})}buildMyFeedbackHandler(){if(!this.config.user&&ai())return async()=>{const t=await this.apiClient.createIdentityToken(X());!t?.identity_token||!t.board_url||(G(t.board_url),window.open(`${t.board_url}?identity=${encodeURIComponent(t.identity_token)}`,"_blank"))}}async handleSubmit(t){if(!this.popup)return;this.popup.setLoading(!0);const e=this.currentAnnotation,r=this.recordingManager?.getRecording()??void 0,[s,n]=await Promise.all([Ie(e?[e]:[]),Promise.resolve(Ze())]),o=ni(t,n,this.consoleCollector.getErrors(),e,this.config.user,r,this.config.user?void 0:X(),this.config.user?void 0:K());try{const a=await this.apiClient.submitFeedback(o,s);this.lastHandoff={feedbackId:a.id,boardUrl:a.board_url,identityToken:a.identity_token},a.board_url&&G(a.board_url),this.popup?.destroy(),this.popup=null,this.session?.destroy(),this.session=null,this.toolbar?.destroy(),this.toolbar=null,this.recordingManager?.destroy(),this.recordingManager=null,a.skip_followup===!0||a.ai_clarify_available===!1?this.showSuccess({skipFollowup:!0}):this.showClarify(a.id)}catch{this.popup?.setLoading(!1),this.popup?.setError(this.messages.error.submit)}}showClarify(t){this.mode="idle",this.tab?.setActive(!1),this.clarify=new Ut(this.shadow,{feedbackId:t,apiClient:this.apiClient,messages:this.messages,onDone:()=>{this.clarify?.destroy(),this.clarify=null,this.showSuccess()}})}showSuccess(t){this.mode="idle",this.tab?.setActive(!1),this.success=new Bt(this.shadow,this.messages,()=>{this.success?.destroy(),this.success=null},this.buildViewFeedbackHandler(),{...t,emailCapture:this.buildEmailCapture()})}buildEmailCapture(){const{feedbackId:t,identityToken:e}=this.lastHandoff;if(!(!t||!e)&&!K())return{onSubmit:async r=>{const s=await this.apiClient.updateReporter(t,r,e);return s&&oi(r),s}}}buildViewFeedbackHandler(){const{boardUrl:t,identityToken:e}=this.lastHandoff;if(t){if(e)return()=>{window.open(`${t}?identity=${encodeURIComponent(e)}`,"_blank")};if(this.config.userToken||this.config.userTokenFn)return async()=>{const r=await this.apiClient.resolveUserToken();r&&window.open(`${t}?identity=${encodeURIComponent(r)}`,"_blank")}}}exitAll(){this.mode="idle",this.tab?.setActive(!1),this.toolbar?.destroy(),this.toolbar=null,this.session?.destroy(),this.session=null,this.popup?.destroy(),this.popup=null,this.clarify?.destroy(),this.clarify=null,this.currentAnnotation=null,this.recordingManager?.destroy(),this.recordingManager=null}destroy(){this.exitAll(),this.consoleCollector.stop(),this.frustrationDetector?.stop(),this.dismissFrustrationPrompt(),this.clarify?.destroy(),this.success?.destroy(),this.tab?.destroy(),this.recordingManager?.destroy(),this.shadow.destroy()}}let f=null;const pt={init(i){f&&(f.destroy(),f=null),document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{f=new Z(i)}):f=new Z(i)},destroy(){f?.destroy(),f=null}};typeof window<"u"&&(window.MakeThisBetter=pt);exports.MakeThisBetter=pt;
95
+ //# sourceMappingURL=makethisbetter.cjs.map