makethisbetter 1.11.2 → 1.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -0
- package/dist/annotate/draw-note-bar.d.ts +1 -0
- package/dist/annotate/draw-note-bar.d.ts.map +1 -1
- package/dist/annotate/overlay.d.ts +21 -10
- package/dist/annotate/overlay.d.ts.map +1 -1
- package/dist/annotate/session.d.ts +3 -3
- package/dist/annotate/session.d.ts.map +1 -1
- package/dist/annotate/toolbar.d.ts +5 -4
- package/dist/annotate/toolbar.d.ts.map +1 -1
- package/dist/index.d.cts +9 -0
- package/dist/index.d.mts +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/makethisbetter.cjs +12 -12
- package/dist/makethisbetter.cjs.map +1 -1
- package/dist/makethisbetter.esm.js +528 -389
- package/dist/makethisbetter.esm.js.map +1 -1
- package/dist/makethisbetter.js +13 -13
- package/dist/makethisbetter.js.map +1 -1
- package/dist/popup/clarify.d.ts +1 -0
- package/dist/popup/clarify.d.ts.map +1 -1
- package/dist/popup/comment.d.ts +1 -0
- package/dist/popup/comment.d.ts.map +1 -1
- package/dist/popup/keyboard-inset.d.ts +26 -0
- package/dist/popup/keyboard-inset.d.ts.map +1 -0
- package/dist/popup/keyboard-inset.test.d.ts +2 -0
- package/dist/popup/keyboard-inset.test.d.ts.map +1 -0
- package/dist/popup/sheet.d.ts +32 -0
- package/dist/popup/sheet.d.ts.map +1 -0
- package/dist/popup/sheet.test.d.ts +2 -0
- package/dist/popup/sheet.test.d.ts.map +1 -0
- package/dist/types.d.ts +7 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/widget/controller.d.ts +7 -0
- package/dist/widget/controller.d.ts.map +1 -1
- package/dist/widget/public-api.test.d.ts +2 -0
- package/dist/widget/public-api.test.d.ts.map +1 -0
- package/dist/widget/scroll-lock.d.ts +27 -0
- package/dist/widget/scroll-lock.d.ts.map +1 -0
- package/dist/widget/scroll-lock.test.d.ts +2 -0
- package/dist/widget/scroll-lock.test.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/annotate/draw-note-bar.ts +7 -0
- package/src/annotate/overlay.ts +80 -26
- package/src/annotate/session.ts +11 -8
- package/src/annotate/toolbar.ts +47 -25
- package/src/index.ts +21 -0
- package/src/popup/clarify.ts +14 -0
- package/src/popup/comment.ts +10 -0
- package/src/popup/keyboard-inset.ts +47 -0
- package/src/popup/sheet.ts +53 -0
- package/src/styles/widget.css +190 -18
- package/src/types.ts +7 -1
- package/src/widget/controller.ts +73 -0
- package/src/widget/scroll-lock.ts +48 -0
package/README.md
CHANGED
|
@@ -251,6 +251,7 @@ MakeThisBetter.init({
|
|
|
251
251
|
// Optional
|
|
252
252
|
locale: 'en', // UI language
|
|
253
253
|
position: 'right', // Tab position: 'left' | 'right'
|
|
254
|
+
entryMode: 'button', // 'button' docks a tab | 'api' renders none
|
|
254
255
|
theme: 'auto', // 'light' | 'dark' | 'auto'
|
|
255
256
|
frustrationDetection: true, // Proactive frustration prompts
|
|
256
257
|
apiUrl: 'https://...', // Self-hosted API endpoint
|
|
@@ -357,8 +358,36 @@ MakeThisBetter.init(config: MakeThisBetterConfig): void
|
|
|
357
358
|
|
|
358
359
|
// Remove the widget and clean up all listeners
|
|
359
360
|
MakeThisBetter.destroy(): void
|
|
361
|
+
|
|
362
|
+
// Open annotation mode from your own UI. Idempotent while already open.
|
|
363
|
+
MakeThisBetter.open(): void
|
|
364
|
+
|
|
365
|
+
// Close annotation mode and restore the page
|
|
366
|
+
MakeThisBetter.close(): void
|
|
367
|
+
|
|
368
|
+
// Show or remove the docked tab without tearing the widget down
|
|
369
|
+
MakeThisBetter.showLauncher(): void
|
|
370
|
+
MakeThisBetter.hideLauncher(): void
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Your own entry point
|
|
374
|
+
|
|
375
|
+
A tab docked to the edge of the screen is the right default, but it is not
|
|
376
|
+
always right — a full-screen editor, a map, or a phone where every pixel is
|
|
377
|
+
spoken for. Set `entryMode: 'api'` to render no tab at all and open the widget
|
|
378
|
+
from wherever the entry point belongs in your product:
|
|
379
|
+
|
|
380
|
+
```js
|
|
381
|
+
MakeThisBetter.init({ projectKey: 'mtb_proj_xxx', entryMode: 'api' })
|
|
382
|
+
|
|
383
|
+
document.querySelector('#menu-feedback')
|
|
384
|
+
.addEventListener('click', () => MakeThisBetter.open())
|
|
360
385
|
```
|
|
361
386
|
|
|
387
|
+
In `api` mode nothing is reachable until you wire up that call, so the widget
|
|
388
|
+
logs a warning on init as a reminder. `showLauncher()` brings the tab back at
|
|
389
|
+
runtime if you want both.
|
|
390
|
+
|
|
362
391
|
## Architecture
|
|
363
392
|
|
|
364
393
|
The widget runs inside a Shadow DOM container, isolating its styles from your page. No CSS conflicts, no z-index wars.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"draw-note-bar.d.ts","sourceRoot":"","sources":["../../src/annotate/draw-note-bar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"draw-note-bar.d.ts","sourceRoot":"","sources":["../../src/annotate/draw-note-bar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAI3C,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,YAAY,CAAA;IACtB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,OAAO,CAAQ;gBAEX,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,kBAAkB;IAiC7D,OAAO,CAAC,SAAS;IAgBjB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAKrD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAiBlC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK/B,OAAO,CAAC,MAAM;IAKd,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
import type { ShadowContainer } from '../widget/shadow';
|
|
2
|
+
export interface OverlayHandlers {
|
|
3
|
+
onPointerDown: (e: PointerEvent) => void;
|
|
4
|
+
onPointerMove: (e: PointerEvent) => void;
|
|
5
|
+
onPointerUp: (e: PointerEvent) => void;
|
|
6
|
+
onPointerCancel: (e: PointerEvent) => void;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* The annotation surface. Runs on pointer events only — never mouse events.
|
|
10
|
+
*
|
|
11
|
+
* Mouse listeners are deliberately absent. Touch browsers replay a tap as
|
|
12
|
+
* pointerdown/up followed by compatibility mousedown/up/click, so listening to
|
|
13
|
+
* both would run the annotation logic twice for one tap and drop two pins.
|
|
14
|
+
* Pointer events already cover mouse and stylus, so the desktop loses nothing.
|
|
15
|
+
*/
|
|
2
16
|
export declare class AnnotationOverlay {
|
|
3
17
|
private overlayEl;
|
|
4
18
|
private dimEl;
|
|
5
|
-
private
|
|
6
|
-
private
|
|
7
|
-
private
|
|
8
|
-
private
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
onMouseUp: (e: MouseEvent) => void;
|
|
13
|
-
onMouseLeave: (e: MouseEvent) => void;
|
|
14
|
-
});
|
|
19
|
+
private handlers;
|
|
20
|
+
private onPointerDown;
|
|
21
|
+
private onPointerMove;
|
|
22
|
+
private onPointerUp;
|
|
23
|
+
private onPointerCancel;
|
|
24
|
+
constructor(shadow: ShadowContainer, handlers: OverlayHandlers);
|
|
25
|
+
private releaseCapture;
|
|
15
26
|
destroy(): void;
|
|
16
27
|
}
|
|
17
28
|
//# sourceMappingURL=overlay.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/annotate/overlay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEvD,
|
|
1
|
+
{"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../../src/annotate/overlay.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAEvD,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAA;IACxC,aAAa,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAA;IACxC,WAAW,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAA;IACtC,eAAe,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAA;CAC3C;AAED;;;;;;;GAOG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAAgB;IACjC,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,aAAa,CAAoB;IACzC,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,eAAe,CAAoB;gBAE/B,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,eAAe;IAuD9D,OAAO,CAAC,cAAc;IAQtB,OAAO,IAAI,IAAI;CAQhB"}
|
|
@@ -17,11 +17,11 @@ export declare class AnnotationSession {
|
|
|
17
17
|
private lastMoveX;
|
|
18
18
|
private lastMoveY;
|
|
19
19
|
constructor(shadow: ShadowContainer, messages: I18nMessages, handlers: SessionHandlers);
|
|
20
|
-
private
|
|
21
|
-
private
|
|
20
|
+
private handlePointerDown;
|
|
21
|
+
private handlePointerMove;
|
|
22
22
|
private updateHighlight;
|
|
23
23
|
private cancelPendingHighlight;
|
|
24
|
-
private
|
|
24
|
+
private handlePointerUp;
|
|
25
25
|
private finishStroke;
|
|
26
26
|
undoDraw(): void;
|
|
27
27
|
redoDraw(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/annotate/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAQ1C,UAAU,eAAe;IACvB,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3D,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED,qBAAa,iBAAiB;IAY1B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IAZlB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,iBAAiB,CAAO;IAChC,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,SAAS,CAAI;gBAGnB,MAAM,EAAE,eAAe,EACf,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,eAAe;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/annotate/session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAQ1C,UAAU,eAAe;IACvB,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3D,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAED,qBAAa,iBAAiB;IAY1B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;IAZlB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,SAAS,CAAW;IAC5B,OAAO,CAAC,iBAAiB,CAAO;IAChC,OAAO,CAAC,qBAAqB,CAAsB;IACnD,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,SAAS,CAAI;gBAGnB,MAAM,EAAE,eAAe,EACf,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,eAAe;IAoBnC,OAAO,CAAC,iBAAiB;IAKzB,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,sBAAsB;IAM9B,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,YAAY;IA4BpB,QAAQ,IAAI,IAAI;IAIhB,QAAQ,IAAI,IAAI;IAIhB,WAAW,IAAI,OAAO;IAItB,WAAW,IAAI,OAAO;IAItB,cAAc,IAAI,OAAO;IAIzB,OAAO,CAAC,iBAAiB;IAIzB,iBAAiB,IAAI,UAAU,GAAG,IAAI;IAItC,SAAS,IAAI,IAAI;IAIjB,kBAAkB,IAAI,IAAI;IAO1B,aAAa,IAAI,IAAI;IAIrB,OAAO,IAAI,IAAI;CAMhB"}
|
|
@@ -8,12 +8,13 @@ export declare class AnnotationToolbar {
|
|
|
8
8
|
private recordBtn;
|
|
9
9
|
private messages;
|
|
10
10
|
private currentMode;
|
|
11
|
-
private
|
|
11
|
+
private idleTimer;
|
|
12
12
|
private faded;
|
|
13
|
-
private
|
|
13
|
+
private handlePointerMove;
|
|
14
14
|
constructor(shadow: ShadowContainer, messages: I18nMessages, onExit: () => void, onModeChange?: (mode: ToolbarMode) => void);
|
|
15
|
-
private
|
|
16
|
-
private
|
|
15
|
+
private restartIdleTimer;
|
|
16
|
+
private clearIdleTimer;
|
|
17
|
+
private fadeToolbar;
|
|
17
18
|
private restoreToolbar;
|
|
18
19
|
private buildHTML;
|
|
19
20
|
setMode(mode: ToolbarMode): void;
|
|
@@ -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;
|
|
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;AAK7C,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;IAWrB,OAAO,CAAC,iBAAiB,CAexB;gBAGC,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,MAAM,IAAI,EAClB,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI;IA6B5C,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI;IAahC,OAAO,IAAI,WAAW;IAItB,OAAO,IAAI,IAAI;CAKhB"}
|
package/dist/index.d.cts
CHANGED
|
@@ -3,6 +3,15 @@ declare const MakeThisBetter: {
|
|
|
3
3
|
init(config: MakeThisBetterConfig): void;
|
|
4
4
|
destroy(): void;
|
|
5
5
|
setLocale(locale: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* Opens annotation mode from the host's own UI. Pair with
|
|
8
|
+
* `entryMode: 'api'` to replace the docked tab entirely, which is the only
|
|
9
|
+
* good answer on a phone where a permanent floating control is in the way.
|
|
10
|
+
*/
|
|
11
|
+
open(): void;
|
|
12
|
+
close(): void;
|
|
13
|
+
showLauncher(): void;
|
|
14
|
+
hideLauncher(): void;
|
|
6
15
|
};
|
|
7
16
|
export { MakeThisBetter };
|
|
8
17
|
export type { MakeThisBetterConfig };
|
package/dist/index.d.mts
CHANGED
|
@@ -3,6 +3,15 @@ declare const MakeThisBetter: {
|
|
|
3
3
|
init(config: MakeThisBetterConfig): void;
|
|
4
4
|
destroy(): void;
|
|
5
5
|
setLocale(locale: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* Opens annotation mode from the host's own UI. Pair with
|
|
8
|
+
* `entryMode: 'api'` to replace the docked tab entirely, which is the only
|
|
9
|
+
* good answer on a phone where a permanent floating control is in the way.
|
|
10
|
+
*/
|
|
11
|
+
open(): void;
|
|
12
|
+
close(): void;
|
|
13
|
+
showLauncher(): void;
|
|
14
|
+
hideLauncher(): void;
|
|
6
15
|
};
|
|
7
16
|
export { MakeThisBetter };
|
|
8
17
|
export type { MakeThisBetterConfig };
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,15 @@ declare const MakeThisBetter: {
|
|
|
3
3
|
init(config: MakeThisBetterConfig): void;
|
|
4
4
|
destroy(): void;
|
|
5
5
|
setLocale(locale: string): void;
|
|
6
|
+
/**
|
|
7
|
+
* Opens annotation mode from the host's own UI. Pair with
|
|
8
|
+
* `entryMode: 'api'` to replace the docked tab entirely, which is the only
|
|
9
|
+
* good answer on a phone where a permanent floating control is in the way.
|
|
10
|
+
*/
|
|
11
|
+
open(): void;
|
|
12
|
+
close(): void;
|
|
13
|
+
showLauncher(): void;
|
|
14
|
+
hideLauncher(): void;
|
|
6
15
|
};
|
|
7
16
|
export { MakeThisBetter };
|
|
8
17
|
export type { MakeThisBetterConfig };
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;sBAMG,MAAM,GAAG,IAAI;
|
|
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;IAK/B;;;;OAIG;YACK,IAAI;aAIH,IAAI;oBAIG,IAAI;oBAIJ,IAAI;CAGrB,CAAA;AAED,OAAO,EAAE,cAAc,EAAE,CAAA;AACzB,YAAY,EAAE,oBAAoB,EAAE,CAAA"}
|