makethisbetter 1.9.2 → 1.11.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 (123) hide show
  1. package/README.md +49 -4
  2. package/dist/annotate/toolbar.d.ts +7 -0
  3. package/dist/annotate/toolbar.d.ts.map +1 -1
  4. package/dist/api/client.d.ts +9 -1
  5. package/dist/api/client.d.ts.map +1 -1
  6. package/dist/context/breadcrumbs.d.ts +1 -7
  7. package/dist/context/breadcrumbs.d.ts.map +1 -1
  8. package/dist/context/frustration-state.d.ts +12 -0
  9. package/dist/context/frustration-state.d.ts.map +1 -0
  10. package/dist/context/frustration-state.test.d.ts +2 -0
  11. package/dist/context/frustration-state.test.d.ts.map +1 -0
  12. package/dist/context/frustration.d.ts +5 -5
  13. package/dist/context/frustration.d.ts.map +1 -1
  14. package/dist/context/history-patch.d.ts +4 -0
  15. package/dist/context/history-patch.d.ts.map +1 -0
  16. package/dist/context/history-patch.test.d.ts +2 -0
  17. package/dist/context/history-patch.test.d.ts.map +1 -0
  18. package/dist/i18n/de.d.ts +2 -0
  19. package/dist/i18n/de.d.ts.map +1 -1
  20. package/dist/i18n/en.d.ts +2 -0
  21. package/dist/i18n/en.d.ts.map +1 -1
  22. package/dist/i18n/es.d.ts +2 -0
  23. package/dist/i18n/es.d.ts.map +1 -1
  24. package/dist/i18n/fr.d.ts +2 -0
  25. package/dist/i18n/fr.d.ts.map +1 -1
  26. package/dist/i18n/ja.d.ts +2 -0
  27. package/dist/i18n/ja.d.ts.map +1 -1
  28. package/dist/i18n/ko.d.ts +2 -0
  29. package/dist/i18n/ko.d.ts.map +1 -1
  30. package/dist/i18n/zh-CN.d.ts +2 -0
  31. package/dist/i18n/zh-CN.d.ts.map +1 -1
  32. package/dist/index.d.cts +1 -0
  33. package/dist/index.d.mts +1 -0
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/makethisbetter.cjs +52 -43
  37. package/dist/makethisbetter.cjs.map +1 -1
  38. package/dist/makethisbetter.esm.js +929 -635
  39. package/dist/makethisbetter.esm.js.map +1 -1
  40. package/dist/makethisbetter.js +52 -43
  41. package/dist/makethisbetter.js.map +1 -1
  42. package/dist/popup/clarify.d.ts +12 -1
  43. package/dist/popup/clarify.d.ts.map +1 -1
  44. package/dist/popup/comment.d.ts +1 -0
  45. package/dist/popup/comment.d.ts.map +1 -1
  46. package/dist/record/session.d.ts +6 -1
  47. package/dist/record/session.d.ts.map +1 -1
  48. package/dist/record/session.destroy-during-load.test.d.ts +2 -0
  49. package/dist/record/session.destroy-during-load.test.d.ts.map +1 -0
  50. package/dist/screenshot/capture.d.ts.map +1 -1
  51. package/dist/screenshot/crop.d.ts +19 -0
  52. package/dist/screenshot/crop.d.ts.map +1 -0
  53. package/dist/screenshot/crop.test.d.ts +2 -0
  54. package/dist/screenshot/crop.test.d.ts.map +1 -0
  55. package/dist/styles.d.ts +2 -1
  56. package/dist/styles.d.ts.map +1 -1
  57. package/dist/types.d.ts +6 -1
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/widget/controller.d.ts +1 -1
  60. package/dist/widget/controller.d.ts.map +1 -1
  61. package/dist/widget/frustration-prompt.d.ts +7 -4
  62. package/dist/widget/frustration-prompt.d.ts.map +1 -1
  63. package/dist/widget/recording-manager.d.ts +2 -1
  64. package/dist/widget/recording-manager.d.ts.map +1 -1
  65. package/dist/widget/tab.d.ts +3 -0
  66. package/dist/widget/tab.d.ts.map +1 -1
  67. package/package.json +5 -3
  68. package/src/annotate/toolbar.ts +48 -0
  69. package/src/api/client.ts +43 -3
  70. package/src/context/breadcrumbs.ts +5 -48
  71. package/src/context/frustration-state.ts +83 -0
  72. package/src/context/frustration.ts +49 -44
  73. package/src/context/history-patch.ts +86 -0
  74. package/src/i18n/de.ts +2 -0
  75. package/src/i18n/en.ts +2 -0
  76. package/src/i18n/es.ts +2 -0
  77. package/src/i18n/fr.ts +2 -0
  78. package/src/i18n/ja.ts +2 -0
  79. package/src/i18n/ko.ts +2 -0
  80. package/src/i18n/zh-CN.ts +2 -0
  81. package/src/index.ts +8 -1
  82. package/src/popup/clarify.ts +170 -52
  83. package/src/popup/comment.ts +15 -11
  84. package/src/record/session.ts +32 -2
  85. package/src/screenshot/capture.ts +73 -12
  86. package/src/screenshot/crop.ts +131 -0
  87. package/src/styles/widget.css +29 -9
  88. package/src/styles.ts +8 -1
  89. package/src/types.ts +20 -1
  90. package/src/widget/controller.ts +38 -7
  91. package/src/widget/frustration-prompt.ts +19 -2
  92. package/src/widget/recording-manager.ts +3 -1
  93. package/src/widget/tab.ts +10 -0
  94. package/src/annotate/draw-note-bar.test.ts +0 -90
  95. package/src/annotate/draw.test.ts +0 -158
  96. package/src/annotate/highlighter.test.ts +0 -70
  97. package/src/annotate/overlay.test.ts +0 -91
  98. package/src/annotate/pin.test.ts +0 -83
  99. package/src/annotate/session.test.ts +0 -344
  100. package/src/annotate/toolbar.test.ts +0 -132
  101. package/src/api/client.test.ts +0 -285
  102. package/src/context/breadcrumbs.test.ts +0 -154
  103. package/src/context/collector.test.ts +0 -14
  104. package/src/context/console.test.ts +0 -44
  105. package/src/context/error-source.test.ts +0 -128
  106. package/src/context/frustration.test.ts +0 -485
  107. package/src/i18n/index.test.ts +0 -36
  108. package/src/popup/clarify.test.ts +0 -725
  109. package/src/popup/comment.test.ts +0 -168
  110. package/src/popup/success.test.ts +0 -190
  111. package/src/record/control-bar.test.ts +0 -110
  112. package/src/record/session.cdn.test.ts +0 -89
  113. package/src/record/session.test.ts +0 -160
  114. package/src/screenshot/capture.test.ts +0 -98
  115. package/src/widget/anon-id.test.ts +0 -42
  116. package/src/widget/controller.test.ts +0 -1054
  117. package/src/widget/dim-overlay.test.ts +0 -27
  118. package/src/widget/frustration-prompt.test.ts +0 -86
  119. package/src/widget/payload.test.ts +0 -222
  120. package/src/widget/pet.test.ts +0 -65
  121. package/src/widget/recording-manager.test.ts +0 -136
  122. package/src/widget/shadow.test.ts +0 -44
  123. package/src/widget/tab.test.ts +0 -107
package/README.md CHANGED
@@ -31,7 +31,7 @@ No more "can you describe what happened?" No more lost screenshots in Slack. The
31
31
  ### CDN (2 lines)
32
32
 
33
33
  ```html
34
- <script src="https://unpkg.com/makethisbetter@2"></script>
34
+ <script src="https://unpkg.com/makethisbetter@1"></script>
35
35
  <script>
36
36
  MakeThisBetter.init({ projectKey: 'mtb_proj_YOUR_KEY' })
37
37
  </script>
@@ -136,7 +136,7 @@ export default defineNuxtPlugin(() => {
136
136
  ```erb
137
137
  <%# app/views/layouts/application.html.erb %>
138
138
  <% if current_user&.admin? %>
139
- <script src="https://unpkg.com/makethisbetter@2"></script>
139
+ <script src="https://unpkg.com/makethisbetter@1"></script>
140
140
  <script>
141
141
  MakeThisBetter.init({
142
142
  projectKey: '<%= Rails.application.credentials.mtb_project_key %>',
@@ -152,7 +152,7 @@ export default defineNuxtPlugin(() => {
152
152
  <summary><strong>Plain HTML / Static Sites</strong></summary>
153
153
 
154
154
  ```html
155
- <script src="https://unpkg.com/makethisbetter@2"></script>
155
+ <script src="https://unpkg.com/makethisbetter@1"></script>
156
156
  <script>
157
157
  MakeThisBetter.init({ projectKey: 'mtb_proj_YOUR_KEY' })
158
158
  </script>
@@ -168,7 +168,35 @@ Click any element to pin it, or drag to draw a freeform highlight. The SDK captu
168
168
 
169
169
  ### Interaction Replay
170
170
 
171
- Switch to **Replay** mode in the toolbar to capture an Interaction Replay (up to 60 seconds). It records rrweb DOM and interaction events with input values masked by default; it does not capture screen video or audio and does not request browser media permissions. The recorder loads lazily, so there is zero cost until the reporter starts a replay.
171
+ Switch to **Replay** mode in the toolbar to capture an Interaction Replay (up to 60 seconds). It records rrweb DOM mutations and interaction events. It does not capture screen video or audio and does not request browser media permissions. The recorder loads lazily, so there is zero cost until the reporter starts a replay.
172
+
173
+ **What a replay contains**
174
+
175
+ | Captured | Not captured |
176
+ |----------|--------------|
177
+ | The page's DOM structure and every mutation to it | Values typed into any `input`, `textarea` or `select` — masked by default, including values already filled in when the replay starts |
178
+ | Visible text content | Anything inside an element you mark `rr-block` or `rr-mask` |
179
+ | Mouse positions, clicks, scrolls, viewport size | Screen video, audio, camera, microphone |
180
+ | Stylesheets needed to render the replay | Cookies, `localStorage`, HTTP request or response bodies |
181
+
182
+ **Excluding an element.** Add rrweb's own escape-hatch classes to anything a replay must not see:
183
+
184
+ - `class="rr-block"` — the element is recorded as an empty placeholder of the same size; nothing inside it is serialized.
185
+ - `class="rr-mask"` — the element's text is replaced with asterisks.
186
+
187
+ ```html
188
+ <div class="rr-block"><!-- never appears in a replay --></div>
189
+ <span class="rr-mask">Account balance: $12,400</span>
190
+ ```
191
+
192
+ **Opting out of input masking.** Input masking is on by default, so a replay taken on a checkout or sign-in page carries no card numbers, passwords, 2FA codes or email addresses. If you need real typed values — for example on an internal tool where no input is sensitive — turn it off explicitly:
193
+
194
+ ```js
195
+ MakeThisBetter.init({
196
+ projectKey: 'mtb_proj_xxx',
197
+ recording: { maskAllInputs: false }, // records typed values verbatim
198
+ })
199
+ ```
172
200
 
173
201
  ### Frustration Detection
174
202
 
@@ -227,6 +255,11 @@ MakeThisBetter.init({
227
255
  frustrationDetection: true, // Proactive frustration prompts
228
256
  apiUrl: 'https://...', // Self-hosted API endpoint
229
257
 
258
+ // Interaction Replay
259
+ recording: {
260
+ maskAllInputs: true, // Default. false records typed input values verbatim
261
+ },
262
+
230
263
  // User identification (recommended)
231
264
  user: {
232
265
  id: 'usr_123',
@@ -236,6 +269,18 @@ MakeThisBetter.init({
236
269
  })
237
270
  ```
238
271
 
272
+ ### Changing the language at runtime
273
+
274
+ `MakeThisBetter.setLocale('zh-CN')` switches the language for the tab and for
275
+ anything opened afterwards. A popup that is already on screen keeps the language it
276
+ was opened in, so a reporter is never re-rendered mid-sentence. Call it before the
277
+ reporter opens the widget — for example, in the same place your app applies a
278
+ language change.
279
+
280
+ ```js
281
+ MakeThisBetter.setLocale('zh-CN')
282
+ ```
283
+
239
284
  ### Identity Verification
240
285
 
241
286
  Identity verification links feedback to authenticated users and lets them view their own submissions on the feedback board.
@@ -8,7 +8,14 @@ export declare class AnnotationToolbar {
8
8
  private recordBtn;
9
9
  private messages;
10
10
  private currentMode;
11
+ private fadeTimer;
12
+ private faded;
13
+ private pointerInside;
14
+ private handleDocMouseMove;
11
15
  constructor(shadow: ShadowContainer, messages: I18nMessages, onExit: () => void, onModeChange?: (mode: ToolbarMode) => void);
16
+ private startFadeTimer;
17
+ private clearFadeTimer;
18
+ private restoreToolbar;
12
19
  private buildHTML;
13
20
  setMode(mode: ToolbarMode): void;
14
21
  getMode(): ToolbarMode;
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../../src/annotate/toolbar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE7C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,WAAW,CAAwB;gBAGzC,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,MAAM,IAAI,EAClB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI;IAuB5C,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAahC,OAAO,IAAI,WAAW;IAItB,OAAO,IAAI,IAAI;CAGhB"}
1
+ {"version":3,"file":"toolbar.d.ts","sourceRoot":"","sources":["../../src/annotate/toolbar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAE3C,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAI7C,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,WAAW,CAAwB;IAE3C,OAAO,CAAC,SAAS,CAA6C;IAC9D,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,kBAAkB,CAezB;gBAGC,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,MAAM,IAAI,EAClB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI;IA0B5C,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAahC,OAAO,IAAI,WAAW;IAItB,OAAO,IAAI,IAAI;CAKhB"}
@@ -2,7 +2,13 @@ import type { FeedbackPayload, FeedbackResponse, SubmissionSessionResponse, Clar
2
2
  export interface ClarifyStreamResult {
3
3
  messages: ClarifyMessage[];
4
4
  done: boolean;
5
+ failed?: boolean;
5
6
  }
7
+ export declare class ApiError extends Error {
8
+ readonly status: number;
9
+ constructor(status: number);
10
+ }
11
+ export declare function isTerminalConflict(error: unknown): boolean;
6
12
  export declare class ApiClient {
7
13
  private apiUrl;
8
14
  private projectKey;
@@ -20,8 +26,10 @@ export declare class ApiClient {
20
26
  } | null>;
21
27
  updateReporter(feedbackId: string, email: string, identityToken: string): Promise<boolean>;
22
28
  startClarification(submissionSessionId: string, token: string, message?: string): Promise<ClarifyResponse>;
29
+ retryClarification(submissionSessionId: string, token: string): Promise<ClarifyResponse>;
30
+ private requestClarification;
23
31
  getClarification(submissionSessionId: string, token: string): Promise<ClarifyResponse>;
24
- streamClarification(submissionSessionId: string, token: string, onDelta: (text: string) => void): Promise<ClarifyStreamResult>;
32
+ streamClarification(submissionSessionId: string, token: string, onDelta: (text: string) => void, signal?: AbortSignal): Promise<ClarifyStreamResult>;
25
33
  finalizeSubmissionSession(submissionSessionId: string, token: string): Promise<FeedbackResponse>;
26
34
  abandonSubmissionSession(submissionSessionId: string, token: string): Promise<void>;
27
35
  private fetchWithRetry;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,eAAe,EACf,cAAc,EACf,MAAM,UAAU,CAAA;AAEjB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,IAAI,EAAE,OAAO,CAAA;CACd;AAID,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;YAQX,iBAAiB;IAMzB,uBAAuB,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAuD9G,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,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAa1G,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAatF,mBAAmB,CACvB,mBAAmB,EAAE,MAAM,EAC3B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAC9B,OAAO,CAAC,mBAAmB,CAAC;IAkBzB,yBAAyB,CAAC,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUhG,wBAAwB,CAAC,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAQ3E,cAAc;CAmB7B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,eAAe,EACf,cAAc,EACf,MAAM,UAAU,CAAA;AAEjB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAKD,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;gBAEX,MAAM,EAAE,MAAM;CAK3B;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE1D;AAID,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;YAQX,iBAAiB;IAMzB,uBAAuB,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,OAAO,CAAC,yBAAyB,CAAC;IAuD9G,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,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAM1G,kBAAkB,CAAC,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;YAIhF,oBAAoB;IAe5B,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAatF,mBAAmB,CACvB,mBAAmB,EAAE,MAAM,EAC3B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC/B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,mBAAmB,CAAC;IAmBzB,yBAAyB,CAAC,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAUhG,wBAAwB,CAAC,mBAAmB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAQ3E,cAAc;CAmB7B"}
@@ -5,11 +5,7 @@ export declare class BreadcrumbCollector {
5
5
  private unsubscribeErrors;
6
6
  private boundClickHandler;
7
7
  private boundChangeHandler;
8
- private boundPopstateHandler;
9
- private originalPushState;
10
- private originalReplaceState;
11
- private installedPushState;
12
- private installedReplaceState;
8
+ private unsubscribeNavigation;
13
9
  private lastUrl;
14
10
  constructor();
15
11
  start(): void;
@@ -19,8 +15,6 @@ export declare class BreadcrumbCollector {
19
15
  private handleClick;
20
16
  private handleChange;
21
17
  private recordError;
22
- private startNavigationTracking;
23
- private stopNavigationTracking;
24
18
  private handleNavigation;
25
19
  }
26
20
  //# sourceMappingURL=breadcrumbs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"breadcrumbs.d.ts","sourceRoot":"","sources":["../../src/context/breadcrumbs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAI1C,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,iBAAiB,CAA4B;IACrD,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,oBAAoB,CAA4B;IACxD,OAAO,CAAC,iBAAiB,CAAoC;IAC7D,OAAO,CAAC,oBAAoB,CAAuC;IACnE,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,qBAAqB,CAAuC;IACpE,OAAO,CAAC,OAAO,CAAK;;IAOpB,KAAK,IAAI,IAAI;IAUb,IAAI,IAAI,IAAI;IAUZ,cAAc,IAAI,UAAU,EAAE;IAI9B,OAAO,CAAC,GAAG;IAOX,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,uBAAuB;IAsB/B,OAAO,CAAC,sBAAsB;IAmB9B,OAAO,CAAC,gBAAgB;CAezB"}
1
+ {"version":3,"file":"breadcrumbs.d.ts","sourceRoot":"","sources":["../../src/context/breadcrumbs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAI1C,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,iBAAiB,CAA4B;IACrD,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,qBAAqB,CAA4B;IACzD,OAAO,CAAC,OAAO,CAAK;;IAOpB,KAAK,IAAI,IAAI;IAUb,IAAI,IAAI,IAAI;IAWZ,cAAc,IAAI,UAAU,EAAE;IAI9B,OAAO,CAAC,GAAG;IAOX,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,YAAY;IAkBpB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,gBAAgB;CAezB"}
@@ -0,0 +1,12 @@
1
+ export interface FrustrationState {
2
+ navTimestamps: number[];
3
+ cooldownUntil: number;
4
+ errorPageUrls: string[];
5
+ dismissedByUser: boolean;
6
+ }
7
+ export declare function loadFrustrationState(): FrustrationState;
8
+ export declare function saveFrustrationState(state: FrustrationState): void;
9
+ export declare function isFrustrationDismissed(): boolean;
10
+ export declare function markFrustrationDismissed(): void;
11
+ export declare function clearFrustrationState(): void;
12
+ //# sourceMappingURL=frustration-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frustration-state.d.ts","sourceRoot":"","sources":["../../src/context/frustration-state.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,eAAe,EAAE,OAAO,CAAA;CACzB;AAOD,wBAAgB,oBAAoB,IAAI,gBAAgB,CAQvD;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAQlE;AAED,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAKD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAO5C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=frustration-state.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frustration-state.test.d.ts","sourceRoot":"","sources":["../../src/context/frustration-state.test.ts"],"names":[],"mappings":""}
@@ -16,11 +16,7 @@ export declare class FrustrationDetector {
16
16
  private cooldownUntil;
17
17
  private static readonly COOLDOWN_MS;
18
18
  private navTimestamps;
19
- private boundPopstateHandler;
20
- private originalPushState;
21
- private originalReplaceState;
22
- private installedPushState;
23
- private installedReplaceState;
19
+ private unsubscribeNavigation;
24
20
  private boundSubmitHandler;
25
21
  private boundInvalidHandler;
26
22
  private recentSubmitForms;
@@ -33,11 +29,15 @@ export declare class FrustrationDetector {
33
29
  stop(): void;
34
30
  private startNavigationTracking;
35
31
  private stopNavigationTracking;
32
+ private restoreState;
33
+ private persistState;
36
34
  private startFormTracking;
37
35
  private stopFormTracking;
38
36
  private handleClick;
39
37
  private handleNavigation;
40
38
  private handleFormSubmit;
39
+ private trackFormSubmitIntent;
40
+ private rememberSubmitAttempt;
41
41
  private handleFormInvalid;
42
42
  private checkErrorPage;
43
43
  private checkDeadClickDom;
@@ -1 +1 @@
1
- {"version":3,"file":"frustration.d.ts","sourceRoot":"","sources":["../../src/context/frustration.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,YAAY,GACZ,kBAAkB,GAClB,cAAc,GACd,YAAY,GACZ,gBAAgB,CAAA;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,iBAAiB,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AA6BD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,iBAAiB,CAA4B;IACrD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAS;IAE5C,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,oBAAoB,CAA4B;IACxD,OAAO,CAAC,iBAAiB,CAAoC;IAC7D,OAAO,CAAC,oBAAoB,CAAuC;IACnE,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,qBAAqB,CAAuC;IACpE,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,cAAc,CAAK;gBAEf,aAAa,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI;IAK5D,KAAK,IAAI,IAAI;IAab,IAAI,IAAI,IAAI;IAeZ,OAAO,CAAC,uBAAuB;IAsB/B,OAAO,CAAC,sBAAsB;IAoB9B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,WAAW;IAuCnB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,gBAAgB;CAIzB"}
1
+ {"version":3,"file":"frustration.d.ts","sourceRoot":"","sources":["../../src/context/frustration.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,YAAY,GACZ,kBAAkB,GAClB,cAAc,GACd,YAAY,GACZ,gBAAgB,CAAA;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,iBAAiB,CAAA;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB;AA6BD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,iBAAiB,CAAyB;IAClD,OAAO,CAAC,iBAAiB,CAA4B;IACrD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,aAAa,CAAI;IACzB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAS;IAE5C,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,qBAAqB,CAA4B;IACzD,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,iBAAiB,CAAiC;IAC1D,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,gBAAgB,CAAI;IAC5B,OAAO,CAAC,cAAc,CAAK;gBAEf,aAAa,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI;IAK5D,KAAK,IAAI,IAAI;IAcb,IAAI,IAAI,IAAI;IAeZ,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,YAAY;IAOpB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,gBAAgB;IAWxB,OAAO,CAAC,WAAW;IAwCnB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,gBAAgB;IAmBxB,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,qBAAqB;IAO7B,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,cAAc;IAmCtB,OAAO,CAAC,iBAAiB;IAqBzB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,gBAAgB;CAKzB"}
@@ -0,0 +1,4 @@
1
+ type NavListener = () => void;
2
+ export declare function onHistoryNavigation(listener: NavListener): () => void;
3
+ export {};
4
+ //# sourceMappingURL=history-patch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-patch.d.ts","sourceRoot":"","sources":["../../src/context/history-patch.ts"],"names":[],"mappings":"AAUA,KAAK,WAAW,GAAG,MAAM,IAAI,CAAA;AAY7B,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,IAAI,CAWrE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=history-patch.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-patch.test.d.ts","sourceRoot":"","sources":["../../src/context/history-patch.test.ts"],"names":[],"mappings":""}
package/dist/i18n/de.d.ts CHANGED
@@ -71,6 +71,8 @@ declare const _default: {
71
71
  send_feedback: string;
72
72
  skip: string;
73
73
  retry: string;
74
+ error: string;
75
+ expired: string;
74
76
  };
75
77
  };
76
78
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"de.d.ts","sourceRoot":"","sources":["../../src/i18n/de.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA2EC"}
1
+ {"version":3,"file":"de.d.ts","sourceRoot":"","sources":["../../src/i18n/de.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6EC"}
package/dist/i18n/en.d.ts CHANGED
@@ -71,6 +71,8 @@ declare const _default: {
71
71
  send_feedback: string;
72
72
  skip: string;
73
73
  retry: string;
74
+ error: string;
75
+ expired: string;
74
76
  };
75
77
  };
76
78
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA2EC"}
1
+ {"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../src/i18n/en.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6EC"}
package/dist/i18n/es.d.ts CHANGED
@@ -71,6 +71,8 @@ declare const _default: {
71
71
  send_feedback: string;
72
72
  skip: string;
73
73
  retry: string;
74
+ error: string;
75
+ expired: string;
74
76
  };
75
77
  };
76
78
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"es.d.ts","sourceRoot":"","sources":["../../src/i18n/es.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA2EC"}
1
+ {"version":3,"file":"es.d.ts","sourceRoot":"","sources":["../../src/i18n/es.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6EC"}
package/dist/i18n/fr.d.ts CHANGED
@@ -71,6 +71,8 @@ declare const _default: {
71
71
  send_feedback: string;
72
72
  skip: string;
73
73
  retry: string;
74
+ error: string;
75
+ expired: string;
74
76
  };
75
77
  };
76
78
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"fr.d.ts","sourceRoot":"","sources":["../../src/i18n/fr.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA2EC"}
1
+ {"version":3,"file":"fr.d.ts","sourceRoot":"","sources":["../../src/i18n/fr.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6EC"}
package/dist/i18n/ja.d.ts CHANGED
@@ -71,6 +71,8 @@ declare const _default: {
71
71
  send_feedback: string;
72
72
  skip: string;
73
73
  retry: string;
74
+ error: string;
75
+ expired: string;
74
76
  };
75
77
  };
76
78
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"ja.d.ts","sourceRoot":"","sources":["../../src/i18n/ja.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA2EC"}
1
+ {"version":3,"file":"ja.d.ts","sourceRoot":"","sources":["../../src/i18n/ja.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6EC"}
package/dist/i18n/ko.d.ts CHANGED
@@ -71,6 +71,8 @@ declare const _default: {
71
71
  send_feedback: string;
72
72
  skip: string;
73
73
  retry: string;
74
+ error: string;
75
+ expired: string;
74
76
  };
75
77
  };
76
78
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"ko.d.ts","sourceRoot":"","sources":["../../src/i18n/ko.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA2EC"}
1
+ {"version":3,"file":"ko.d.ts","sourceRoot":"","sources":["../../src/i18n/ko.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6EC"}
@@ -71,6 +71,8 @@ declare const _default: {
71
71
  send_feedback: string;
72
72
  skip: string;
73
73
  retry: string;
74
+ error: string;
75
+ expired: string;
74
76
  };
75
77
  };
76
78
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"zh-CN.d.ts","sourceRoot":"","sources":["../../src/i18n/zh-CN.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA2EC"}
1
+ {"version":3,"file":"zh-CN.d.ts","sourceRoot":"","sources":["../../src/i18n/zh-CN.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wBA6EC"}
package/dist/index.d.cts CHANGED
@@ -2,6 +2,7 @@ import type { MakeThisBetterConfig } from './types';
2
2
  declare const MakeThisBetter: {
3
3
  init(config: MakeThisBetterConfig): void;
4
4
  destroy(): void;
5
+ setLocale(locale: string): void;
5
6
  };
6
7
  export { MakeThisBetter };
7
8
  export type { MakeThisBetterConfig };
package/dist/index.d.mts CHANGED
@@ -2,6 +2,7 @@ import type { MakeThisBetterConfig } from './types';
2
2
  declare const MakeThisBetter: {
3
3
  init(config: MakeThisBetterConfig): void;
4
4
  destroy(): void;
5
+ setLocale(locale: string): void;
5
6
  };
6
7
  export { MakeThisBetter };
7
8
  export type { MakeThisBetterConfig };
package/dist/index.d.ts CHANGED
@@ -2,6 +2,7 @@ import type { MakeThisBetterConfig } from './types';
2
2
  declare const MakeThisBetter: {
3
3
  init(config: MakeThisBetterConfig): void;
4
4
  destroy(): void;
5
+ setLocale(locale: string): void;
5
6
  };
6
7
  export { MakeThisBetter };
7
8
  export type { MakeThisBetterConfig };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAKnD,QAAA,MAAM,cAAc;iBACL,oBAAoB,GAAG,IAAI;eAe7B,IAAI;CAKhB,CAAA;AAED,OAAO,EAAE,cAAc,EAAE,CAAA;AACzB,YAAY,EAAE,oBAAoB,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAKnD,QAAA,MAAM,cAAc;iBACL,oBAAoB,GAAG,IAAI;eAe7B,IAAI;sBAMG,MAAM,GAAG,IAAI;CAIhC,CAAA;AAED,OAAO,EAAE,cAAc,EAAE,CAAA;AACzB,YAAY,EAAE,oBAAoB,EAAE,CAAA"}