favicon-animate 0.1.0 → 0.3.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/dist/animation-loop.d.ts +83 -0
- package/dist/animation-loop.d.ts.map +1 -0
- package/dist/animation-loop.test.d.ts +2 -0
- package/dist/animation-loop.test.d.ts.map +1 -0
- package/dist/animator.d.ts +16 -0
- package/dist/animator.d.ts.map +1 -1
- package/dist/badge.d.ts.map +1 -1
- package/dist/cors-handler.d.ts +24 -0
- package/dist/cors-handler.d.ts.map +1 -0
- package/dist/frame-decoder.d.ts +26 -0
- package/dist/frame-decoder.d.ts.map +1 -0
- package/dist/frame-decoder.test.d.ts +2 -0
- package/dist/frame-decoder.test.d.ts.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +547 -16
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +8 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +7 -2
- package/dist/utils.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Animation loop manager for favicon frame playback
|
|
3
|
+
*/
|
|
4
|
+
import { DecodedFrame } from './frame-decoder';
|
|
5
|
+
import { BadgeConfig } from './types';
|
|
6
|
+
export interface AnimationLoopOptions {
|
|
7
|
+
frames: DecodedFrame[];
|
|
8
|
+
faviconSize: number;
|
|
9
|
+
badge?: BadgeConfig | null;
|
|
10
|
+
loopCount?: number;
|
|
11
|
+
onFrameChange?: (frameIndex: number) => void;
|
|
12
|
+
onAnimationEnd?: () => void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Manages animation loop for favicon frames
|
|
16
|
+
*/
|
|
17
|
+
export declare class AnimationLoop {
|
|
18
|
+
private frames;
|
|
19
|
+
private faviconSize;
|
|
20
|
+
private badge;
|
|
21
|
+
private loopCount;
|
|
22
|
+
private currentFrameIndex;
|
|
23
|
+
private currentLoop;
|
|
24
|
+
private isPlaying;
|
|
25
|
+
private isPaused;
|
|
26
|
+
private nextFrameTimeout;
|
|
27
|
+
private onFrameChange;
|
|
28
|
+
private onAnimationEnd;
|
|
29
|
+
constructor(options: AnimationLoopOptions);
|
|
30
|
+
/**
|
|
31
|
+
* Start animation loop
|
|
32
|
+
*/
|
|
33
|
+
play(): void;
|
|
34
|
+
/**
|
|
35
|
+
* Pause animation
|
|
36
|
+
*/
|
|
37
|
+
pause(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Resume animation
|
|
40
|
+
*/
|
|
41
|
+
resume(): void;
|
|
42
|
+
/**
|
|
43
|
+
* Stop animation and cleanup
|
|
44
|
+
*/
|
|
45
|
+
stop(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Get current frame data URL
|
|
48
|
+
*/
|
|
49
|
+
getCurrentFrameDataUrl(): string;
|
|
50
|
+
/**
|
|
51
|
+
* Schedule next frame
|
|
52
|
+
*/
|
|
53
|
+
private scheduleNextFrame;
|
|
54
|
+
/**
|
|
55
|
+
* Clear scheduled frame timeout
|
|
56
|
+
*/
|
|
57
|
+
private clearScheduledFrame;
|
|
58
|
+
/**
|
|
59
|
+
* Check if animation is playing
|
|
60
|
+
*/
|
|
61
|
+
getIsPlaying(): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Get current frame index
|
|
64
|
+
*/
|
|
65
|
+
getCurrentFrameIndex(): number;
|
|
66
|
+
/**
|
|
67
|
+
* Update badge during animation
|
|
68
|
+
*/
|
|
69
|
+
setBadge(badge: BadgeConfig | null): void;
|
|
70
|
+
/**
|
|
71
|
+
* Get current badge
|
|
72
|
+
*/
|
|
73
|
+
getBadge(): BadgeConfig | null;
|
|
74
|
+
/**
|
|
75
|
+
* Get total frames
|
|
76
|
+
*/
|
|
77
|
+
getFrameCount(): number;
|
|
78
|
+
/**
|
|
79
|
+
* Cleanup resources
|
|
80
|
+
*/
|
|
81
|
+
destroy(): void;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=animation-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation-loop.d.ts","sourceRoot":"","sources":["../src/animation-loop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAItC,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,aAAa,CAAwC;IAC7D,OAAO,CAAC,cAAc,CAAsB;gBAEhC,OAAO,EAAE,oBAAoB;IASzC;;OAEG;IACH,IAAI,IAAI,IAAI;IAWZ;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,MAAM,IAAI,IAAI;IAOd;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,sBAAsB,IAAI,MAAM;IAwBhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4CzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,YAAY,IAAI,OAAO;IAIvB;;OAEG;IACH,oBAAoB,IAAI,MAAM;IAI9B;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI;IAIzC;;OAEG;IACH,QAAQ,IAAI,WAAW,GAAG,IAAI;IAI9B;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,OAAO,IAAI,IAAI;CAGhB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animation-loop.test.d.ts","sourceRoot":"","sources":["../src/animation-loop.test.ts"],"names":[],"mappings":""}
|
package/dist/animator.d.ts
CHANGED
|
@@ -12,6 +12,10 @@ export declare class FaviconAnimator {
|
|
|
12
12
|
private unsubscribeVisibility;
|
|
13
13
|
private faviconSize;
|
|
14
14
|
private updateInterval;
|
|
15
|
+
private enableAnimation;
|
|
16
|
+
private animationLoop;
|
|
17
|
+
private decodedFrames;
|
|
18
|
+
private animationFrameId;
|
|
15
19
|
constructor(options?: AnimatorOptions);
|
|
16
20
|
/**
|
|
17
21
|
* Set favicon
|
|
@@ -29,6 +33,18 @@ export declare class FaviconAnimator {
|
|
|
29
33
|
* Remove badge
|
|
30
34
|
*/
|
|
31
35
|
removeBadge(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Start animation for GIF/WebP
|
|
38
|
+
*/
|
|
39
|
+
private startAnimation;
|
|
40
|
+
/**
|
|
41
|
+
* Stop animation and cleanup
|
|
42
|
+
*/
|
|
43
|
+
private stopAnimation;
|
|
44
|
+
/**
|
|
45
|
+
* Update animation frame on favicon
|
|
46
|
+
*/
|
|
47
|
+
private updateAnimationFrame;
|
|
32
48
|
/**
|
|
33
49
|
* Update favicon display (with badge if configured)
|
|
34
50
|
*/
|
package/dist/animator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animator.d.ts","sourceRoot":"","sources":["../src/animator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"animator.d.ts","sourceRoot":"","sources":["../src/animator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAenF;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,qBAAqB,CAA6B;IAC1D,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,gBAAgB,CAAuB;gBAEnC,OAAO,GAAE,eAAoB;IAwCzC;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA0C/D;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IASnC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAc1C;;OAEG;IACH,WAAW,IAAI,IAAI;IASnB;;OAEG;YACW,cAAc;IAyC5B;;OAEG;IACH,OAAO,CAAC,aAAa;IAmBrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;YACW,oBAAoB;IAiClC;;OAEG;IACH,KAAK,IAAI,IAAI;IAOb;;OAEG;IACH,MAAM,IAAI,IAAI;IAOd;;OAEG;IACH,UAAU,IAAI,WAAW,GAAG,IAAI;IAIhC;;OAEG;IACH,QAAQ,IAAI,WAAW,GAAG,IAAI;IAI9B;;OAEG;IACH,cAAc,IAAI,OAAO;IAIzB;;OAEG;IACH,OAAO,IAAI,IAAI;CAOhB"}
|
package/dist/badge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../src/badge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErD;;GAEG;AAEH,qBAAa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,QAAQ,EAAE,aAAa,EACvB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAU,GACjB;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAmB3B;;OAEG;IACH,MAAM,CAAC,SAAS,CACd,GAAG,EAAE,wBAAwB,EAC7B,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,GAClB,IAAI;
|
|
1
|
+
{"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../src/badge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAErD;;GAEG;AAEH,qBAAa,aAAa;IACxB;;OAEG;IACH,MAAM,CAAC,iBAAiB,CACtB,QAAQ,EAAE,aAAa,EACvB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAU,GACjB;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAmB3B;;OAEG;IACH,MAAM,CAAC,SAAS,CACd,GAAG,EAAE,wBAAwB,EAC7B,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,GAClB,IAAI;IAgCP;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,WAAW;CA0CjE"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CORS and canvas taint handling for animated favicons
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check if canvas is tainted (can't export to data URL)
|
|
6
|
+
*/
|
|
7
|
+
export declare function isCanvasTainted(canvas: HTMLCanvasElement): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Test if an image can be loaded with CORS
|
|
10
|
+
*/
|
|
11
|
+
export declare function testCorsImage(url: string, corsMode?: 'cors' | 'no-cors' | 'same-origin'): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* Get appropriate CORS mode for URL
|
|
14
|
+
*/
|
|
15
|
+
export declare function getCorsMode(url: string): Promise<'cors' | 'no-cors' | 'same-origin'>;
|
|
16
|
+
/**
|
|
17
|
+
* Check if URL is same origin
|
|
18
|
+
*/
|
|
19
|
+
export declare function isSameOrigin(url: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Log CORS warning
|
|
22
|
+
*/
|
|
23
|
+
export declare function logCorsWarning(url: string, error: Error): void;
|
|
24
|
+
//# sourceMappingURL=cors-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors-handler.d.ts","sourceRoot":"","sources":["../src/cors-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAOlE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,GAAG,SAAS,GAAG,aAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,CA+BxH;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC,CAa1F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAejD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAS9D"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame decoder for animated GIF/WebP using ImageDecoder (WebCodecs)
|
|
3
|
+
* with fallback to img+drawImage for unsupported browsers
|
|
4
|
+
*/
|
|
5
|
+
export interface DecodedFrame {
|
|
6
|
+
bitmap: ImageBitmap;
|
|
7
|
+
durationMs: number;
|
|
8
|
+
}
|
|
9
|
+
export interface FrameDecoderOptions {
|
|
10
|
+
corsMode?: 'cors' | 'no-cors' | 'same-origin';
|
|
11
|
+
onProgress?: (current: number, total: number) => void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Check if ImageDecoder is available
|
|
15
|
+
*/
|
|
16
|
+
export declare function hasImageDecoder(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Decode animated image using ImageDecoder (WebCodecs)
|
|
19
|
+
* Returns array of frames with their durations
|
|
20
|
+
*/
|
|
21
|
+
export declare function decodeImageFrames(url: string, options?: FrameDecoderOptions): Promise<DecodedFrame[]>;
|
|
22
|
+
/**
|
|
23
|
+
* Release resources from decoded frames
|
|
24
|
+
*/
|
|
25
|
+
export declare function releaseFrames(frames: DecodedFrame[]): void;
|
|
26
|
+
//# sourceMappingURL=frame-decoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-decoder.d.ts","sourceRoot":"","sources":["../src/frame-decoder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;IAC9C,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACvD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,YAAY,EAAE,CAAC,CA6BzB;AA0HD;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAM1D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frame-decoder.test.d.ts","sourceRoot":"","sources":["../src/frame-decoder.test.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,11 @@
|
|
|
6
6
|
export { FaviconAnimator } from './animator';
|
|
7
7
|
export { BadgeRenderer } from './badge';
|
|
8
8
|
export { getVisibilityManager, VisibilityManager } from './visibility';
|
|
9
|
+
export { decodeImageFrames, releaseFrames, hasImageDecoder } from './frame-decoder';
|
|
10
|
+
export { AnimationLoop } from './animation-loop';
|
|
11
|
+
export { isCanvasTainted, testCorsImage, getCorsMode, isSameOrigin, logCorsWarning } from './cors-handler';
|
|
9
12
|
export type { BadgePosition, BadgeConfig, FaviconConfig, AnimatorOptions, VisibilityState, FaviconData } from './types';
|
|
10
|
-
export {
|
|
13
|
+
export type { DecodedFrame, FrameDecoderOptions } from './frame-decoder';
|
|
14
|
+
export type { AnimationLoopOptions } from './animation-loop';
|
|
15
|
+
export { getFaviconLink, createCanvas, loadImage, detectImageFormat, supportsPageVisibility, debounce, throttle, canvasToDataUrl, isBrowser, normalizeLinks } from './utils';
|
|
11
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAG3G,YAAY,EACV,aAAa,EACb,WAAW,EACX,aAAa,EACb,eAAe,EACf,eAAe,EACf,WAAW,EACZ,MAAM,SAAS,CAAC;AACjB,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACzE,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAG7D,OAAO,EACL,cAAc,EACd,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,sBAAsB,EACtB,QAAQ,EACR,QAAQ,EACR,eAAe,EACf,SAAS,EACT,cAAc,EACf,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -26,7 +26,7 @@ class BadgeRenderer {
|
|
|
26
26
|
* Draw badge on canvas
|
|
27
27
|
*/
|
|
28
28
|
static drawBadge(ctx, config, faviconSize) {
|
|
29
|
-
const { number, position, backgroundColor = '#FF0000', textColor = '#FFFFFF', size = 16, fontSize = 12,
|
|
29
|
+
const { number, position, backgroundColor = '#FF0000', textColor = '#FFFFFF', size = 16, fontSize = 12, offset = 2, fontWeight = 'bold', fontFamily = 'Arial, sans-serif' } = config;
|
|
30
30
|
const { x, y } = this.calculatePosition(position, faviconSize, size, offset);
|
|
31
31
|
// Draw badge background circle
|
|
32
32
|
ctx.fillStyle = backgroundColor;
|
|
@@ -46,7 +46,7 @@ class BadgeRenderer {
|
|
|
46
46
|
* Validate badge configuration
|
|
47
47
|
*/
|
|
48
48
|
static validateConfig(config) {
|
|
49
|
-
const { number = 1, position = 'top-right', backgroundColor = '#FF0000', textColor = '#FFFFFF', size = 16, fontSize = 12,
|
|
49
|
+
const { number = 1, position = 'top-right', backgroundColor = '#FF0000', textColor = '#FFFFFF', size = 16, fontSize = 12, offset = 2, fontWeight = 'bold', fontFamily = 'Arial, sans-serif' } = config;
|
|
50
50
|
// Validate position
|
|
51
51
|
const validPositions = [
|
|
52
52
|
'top-left',
|
|
@@ -69,7 +69,6 @@ class BadgeRenderer {
|
|
|
69
69
|
textColor,
|
|
70
70
|
size: Math.max(8, size),
|
|
71
71
|
fontSize: Math.max(6, fontSize),
|
|
72
|
-
borderRadius,
|
|
73
72
|
offset: Math.max(0, offset),
|
|
74
73
|
fontWeight,
|
|
75
74
|
fontFamily
|
|
@@ -145,6 +144,243 @@ function getVisibilityManager() {
|
|
|
145
144
|
return visibilityManager;
|
|
146
145
|
}
|
|
147
146
|
|
|
147
|
+
/**
|
|
148
|
+
* CORS and canvas taint handling for animated favicons
|
|
149
|
+
*/
|
|
150
|
+
/**
|
|
151
|
+
* Check if canvas is tainted (can't export to data URL)
|
|
152
|
+
*/
|
|
153
|
+
function isCanvasTainted(canvas) {
|
|
154
|
+
try {
|
|
155
|
+
canvas.toDataURL();
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
return true;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Test if an image can be loaded with CORS
|
|
164
|
+
*/
|
|
165
|
+
async function testCorsImage(url, corsMode = 'cors') {
|
|
166
|
+
return new Promise((resolve) => {
|
|
167
|
+
const img = new Image();
|
|
168
|
+
img.crossOrigin = corsMode === 'cors' ? 'anonymous' : 'use-credentials';
|
|
169
|
+
img.onload = () => {
|
|
170
|
+
// Try to draw on canvas to verify CORS
|
|
171
|
+
try {
|
|
172
|
+
const canvas = document.createElement('canvas');
|
|
173
|
+
canvas.width = 1;
|
|
174
|
+
canvas.height = 1;
|
|
175
|
+
const ctx = canvas.getContext('2d');
|
|
176
|
+
if (!ctx) {
|
|
177
|
+
resolve(false);
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
ctx.drawImage(img, 0, 0);
|
|
181
|
+
canvas.toDataURL();
|
|
182
|
+
resolve(true);
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
resolve(false);
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
img.onerror = () => {
|
|
189
|
+
resolve(false);
|
|
190
|
+
};
|
|
191
|
+
img.src = url;
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Get appropriate CORS mode for URL
|
|
196
|
+
*/
|
|
197
|
+
async function getCorsMode(url) {
|
|
198
|
+
// Same origin URLs don't need CORS
|
|
199
|
+
if (isSameOrigin(url)) {
|
|
200
|
+
return 'same-origin';
|
|
201
|
+
}
|
|
202
|
+
// Test CORS
|
|
203
|
+
if (await testCorsImage(url, 'cors')) {
|
|
204
|
+
return 'cors';
|
|
205
|
+
}
|
|
206
|
+
// Fallback to no-cors (will work but canvas will be tainted)
|
|
207
|
+
return 'no-cors';
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Check if URL is same origin
|
|
211
|
+
*/
|
|
212
|
+
function isSameOrigin(url) {
|
|
213
|
+
if (url.startsWith('data:')) {
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
if (url.startsWith('/')) {
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
const urlObj = new URL(url, window.location.href);
|
|
221
|
+
return urlObj.origin === window.location.origin;
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Log CORS warning
|
|
229
|
+
*/
|
|
230
|
+
function logCorsWarning(url, error) {
|
|
231
|
+
console.warn(`[favicon-animate] CORS issue with favicon: ${url}\n` +
|
|
232
|
+
`Error: ${error.message}\n` +
|
|
233
|
+
`Falling back to static image. To fix:\n` +
|
|
234
|
+
`1. Ensure the image server sends Access-Control-Allow-Origin header\n` +
|
|
235
|
+
`2. Or use a same-origin image\n` +
|
|
236
|
+
`3. Or set corsMode: 'no-cors' (but canvas will be tainted)`);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Frame decoder for animated GIF/WebP using ImageDecoder (WebCodecs)
|
|
241
|
+
* with fallback to img+drawImage for unsupported browsers
|
|
242
|
+
*/
|
|
243
|
+
/**
|
|
244
|
+
* Check if ImageDecoder is available
|
|
245
|
+
*/
|
|
246
|
+
function hasImageDecoder() {
|
|
247
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
248
|
+
return typeof globalThis.ImageDecoder !== 'undefined';
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Decode animated image using ImageDecoder (WebCodecs)
|
|
252
|
+
* Returns array of frames with their durations
|
|
253
|
+
*/
|
|
254
|
+
async function decodeImageFrames(url, options = {}) {
|
|
255
|
+
const { corsMode = 'cors', onProgress } = options;
|
|
256
|
+
try {
|
|
257
|
+
// Fetch the image as ArrayBuffer
|
|
258
|
+
const response = await fetch(url, {
|
|
259
|
+
mode: corsMode,
|
|
260
|
+
credentials: corsMode === 'cors' ? 'omit' : 'same-origin'
|
|
261
|
+
});
|
|
262
|
+
if (!response.ok) {
|
|
263
|
+
throw new Error(`Failed to fetch image: ${response.statusText}`);
|
|
264
|
+
}
|
|
265
|
+
const contentType = response.headers.get('content-type') || 'image/webp';
|
|
266
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
267
|
+
// Use ImageDecoder if available
|
|
268
|
+
if (hasImageDecoder()) {
|
|
269
|
+
return await decodeWithImageDecoder(arrayBuffer, contentType, onProgress);
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
// Fallback to img+drawImage for unsupported browsers
|
|
273
|
+
return await decodeWithImageElement(url, onProgress);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
278
|
+
logCorsWarning(url, err);
|
|
279
|
+
throw error;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Decode using ImageDecoder (WebCodecs API)
|
|
284
|
+
*/
|
|
285
|
+
async function decodeWithImageDecoder(arrayBuffer, contentType, onProgress) {
|
|
286
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
287
|
+
const ImageDecoderClass = globalThis.ImageDecoder;
|
|
288
|
+
if (!ImageDecoderClass) {
|
|
289
|
+
throw new Error('ImageDecoder not available');
|
|
290
|
+
}
|
|
291
|
+
const decoder = new ImageDecoderClass({
|
|
292
|
+
data: arrayBuffer,
|
|
293
|
+
type: contentType
|
|
294
|
+
});
|
|
295
|
+
await decoder.tracks.ready;
|
|
296
|
+
const track = decoder.tracks.selectedTrack;
|
|
297
|
+
if (!track) {
|
|
298
|
+
throw new Error('No video track found in image');
|
|
299
|
+
}
|
|
300
|
+
const frameCount = track.frameCount;
|
|
301
|
+
const frames = [];
|
|
302
|
+
for (let i = 0; i < frameCount; i++) {
|
|
303
|
+
try {
|
|
304
|
+
const { image } = await decoder.decode({ frameIndex: i });
|
|
305
|
+
// Get frame duration (in microseconds, convert to milliseconds)
|
|
306
|
+
const durationMs = image.duration ? image.duration / 1000 : 90;
|
|
307
|
+
// Create ImageBitmap from VideoFrame
|
|
308
|
+
const bitmap = await createImageBitmap(image);
|
|
309
|
+
frames.push({
|
|
310
|
+
bitmap,
|
|
311
|
+
durationMs: Math.max(durationMs, 10) // Minimum 10ms per frame
|
|
312
|
+
});
|
|
313
|
+
image.close();
|
|
314
|
+
if (onProgress) {
|
|
315
|
+
onProgress(i + 1, frameCount);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
catch (error) {
|
|
319
|
+
console.warn(`Failed to decode frame ${i}:`, error);
|
|
320
|
+
// Continue with other frames
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
if (frames.length === 0) {
|
|
324
|
+
throw new Error('No frames could be decoded');
|
|
325
|
+
}
|
|
326
|
+
return frames;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Fallback: Decode using HTMLImageElement + drawImage
|
|
330
|
+
* This captures the current frame of an animated image
|
|
331
|
+
* Note: Less precise, doesn't give exact frame durations
|
|
332
|
+
*/
|
|
333
|
+
async function decodeWithImageElement(url, onProgress) {
|
|
334
|
+
return new Promise((resolve, reject) => {
|
|
335
|
+
const img = new Image();
|
|
336
|
+
img.crossOrigin = 'anonymous';
|
|
337
|
+
img.onload = async () => {
|
|
338
|
+
try {
|
|
339
|
+
// Create a canvas and draw the image
|
|
340
|
+
const canvas = document.createElement('canvas');
|
|
341
|
+
canvas.width = img.width;
|
|
342
|
+
canvas.height = img.height;
|
|
343
|
+
const ctx = canvas.getContext('2d');
|
|
344
|
+
if (!ctx) {
|
|
345
|
+
throw new Error('Failed to get canvas context');
|
|
346
|
+
}
|
|
347
|
+
ctx.drawImage(img, 0, 0);
|
|
348
|
+
// Convert to ImageBitmap
|
|
349
|
+
const bitmap = await createImageBitmap(canvas);
|
|
350
|
+
// Return single frame with default duration
|
|
351
|
+
// This is a fallback - we can't get exact frame info without ImageDecoder
|
|
352
|
+
const frames = [
|
|
353
|
+
{
|
|
354
|
+
bitmap,
|
|
355
|
+
durationMs: 100 // Default 100ms per frame
|
|
356
|
+
}
|
|
357
|
+
];
|
|
358
|
+
if (onProgress) {
|
|
359
|
+
onProgress(1, 1);
|
|
360
|
+
}
|
|
361
|
+
resolve(frames);
|
|
362
|
+
}
|
|
363
|
+
catch (error) {
|
|
364
|
+
reject(error);
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
img.onerror = () => {
|
|
368
|
+
reject(new Error(`Failed to load image: ${url}`));
|
|
369
|
+
};
|
|
370
|
+
img.src = url;
|
|
371
|
+
});
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Release resources from decoded frames
|
|
375
|
+
*/
|
|
376
|
+
function releaseFrames(frames) {
|
|
377
|
+
frames.forEach(frame => {
|
|
378
|
+
if (frame.bitmap && typeof frame.bitmap.close === 'function') {
|
|
379
|
+
frame.bitmap.close();
|
|
380
|
+
}
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
|
|
148
384
|
/**
|
|
149
385
|
* Utility functions
|
|
150
386
|
*/
|
|
@@ -258,6 +494,194 @@ function canvasToDataUrl(canvas) {
|
|
|
258
494
|
function isBrowser() {
|
|
259
495
|
return typeof window !== 'undefined' && typeof document !== 'undefined';
|
|
260
496
|
}
|
|
497
|
+
/**
|
|
498
|
+
* Normalize favicon links by removing duplicates
|
|
499
|
+
* Keeps only one canonical favicon link
|
|
500
|
+
*/
|
|
501
|
+
function normalizeLinks() {
|
|
502
|
+
const links = document.querySelectorAll('link[rel~="icon"]');
|
|
503
|
+
if (links.length <= 1)
|
|
504
|
+
return;
|
|
505
|
+
// Keep the first link, remove others
|
|
506
|
+
let kept = false;
|
|
507
|
+
links.forEach((link) => {
|
|
508
|
+
const linkEl = link;
|
|
509
|
+
if (!kept && !linkEl.href.startsWith('data:')) {
|
|
510
|
+
kept = true;
|
|
511
|
+
}
|
|
512
|
+
else if (kept || linkEl.href.startsWith('data:')) {
|
|
513
|
+
link.remove();
|
|
514
|
+
}
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* Animation loop manager for favicon frame playback
|
|
520
|
+
*/
|
|
521
|
+
/**
|
|
522
|
+
* Manages animation loop for favicon frames
|
|
523
|
+
*/
|
|
524
|
+
class AnimationLoop {
|
|
525
|
+
constructor(options) {
|
|
526
|
+
this.currentFrameIndex = 0;
|
|
527
|
+
this.currentLoop = 0;
|
|
528
|
+
this.isPlaying = false;
|
|
529
|
+
this.isPaused = false;
|
|
530
|
+
this.nextFrameTimeout = null;
|
|
531
|
+
this.frames = options.frames;
|
|
532
|
+
this.faviconSize = options.faviconSize;
|
|
533
|
+
this.badge = options.badge || null;
|
|
534
|
+
this.loopCount = options.loopCount || 0;
|
|
535
|
+
this.onFrameChange = options.onFrameChange || null;
|
|
536
|
+
this.onAnimationEnd = options.onAnimationEnd || null;
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Start animation loop
|
|
540
|
+
*/
|
|
541
|
+
play() {
|
|
542
|
+
if (this.isPlaying)
|
|
543
|
+
return;
|
|
544
|
+
this.isPlaying = true;
|
|
545
|
+
this.isPaused = false;
|
|
546
|
+
this.currentFrameIndex = 0;
|
|
547
|
+
this.currentLoop = 0;
|
|
548
|
+
this.scheduleNextFrame();
|
|
549
|
+
}
|
|
550
|
+
/**
|
|
551
|
+
* Pause animation
|
|
552
|
+
*/
|
|
553
|
+
pause() {
|
|
554
|
+
if (!this.isPlaying)
|
|
555
|
+
return;
|
|
556
|
+
this.isPaused = true;
|
|
557
|
+
this.clearScheduledFrame();
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* Resume animation
|
|
561
|
+
*/
|
|
562
|
+
resume() {
|
|
563
|
+
if (!this.isPaused)
|
|
564
|
+
return;
|
|
565
|
+
this.isPaused = false;
|
|
566
|
+
this.scheduleNextFrame();
|
|
567
|
+
}
|
|
568
|
+
/**
|
|
569
|
+
* Stop animation and cleanup
|
|
570
|
+
*/
|
|
571
|
+
stop() {
|
|
572
|
+
this.isPlaying = false;
|
|
573
|
+
this.isPaused = false;
|
|
574
|
+
this.clearScheduledFrame();
|
|
575
|
+
this.currentFrameIndex = 0;
|
|
576
|
+
this.currentLoop = 0;
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* Get current frame data URL
|
|
580
|
+
*/
|
|
581
|
+
getCurrentFrameDataUrl() {
|
|
582
|
+
if (this.currentFrameIndex >= this.frames.length) {
|
|
583
|
+
this.currentFrameIndex = 0;
|
|
584
|
+
}
|
|
585
|
+
const frame = this.frames[this.currentFrameIndex];
|
|
586
|
+
const canvas = createCanvas(this.faviconSize);
|
|
587
|
+
const ctx = canvas.getContext('2d');
|
|
588
|
+
if (!ctx) {
|
|
589
|
+
throw new Error('Failed to get canvas context');
|
|
590
|
+
}
|
|
591
|
+
// Draw the frame bitmap
|
|
592
|
+
ctx.drawImage(frame.bitmap, 0, 0, this.faviconSize, this.faviconSize);
|
|
593
|
+
// Draw badge if configured
|
|
594
|
+
if (this.badge) {
|
|
595
|
+
BadgeRenderer.drawBadge(ctx, this.badge, this.faviconSize);
|
|
596
|
+
}
|
|
597
|
+
return canvasToDataUrl(canvas);
|
|
598
|
+
}
|
|
599
|
+
/**
|
|
600
|
+
* Schedule next frame
|
|
601
|
+
*/
|
|
602
|
+
scheduleNextFrame() {
|
|
603
|
+
if (!this.isPlaying || this.isPaused)
|
|
604
|
+
return;
|
|
605
|
+
// Check if animation should end
|
|
606
|
+
if (this.loopCount > 0 && this.currentLoop >= this.loopCount) {
|
|
607
|
+
this.stop();
|
|
608
|
+
if (this.onAnimationEnd) {
|
|
609
|
+
this.onAnimationEnd();
|
|
610
|
+
}
|
|
611
|
+
return;
|
|
612
|
+
}
|
|
613
|
+
const frame = this.frames[this.currentFrameIndex];
|
|
614
|
+
const duration = frame.durationMs;
|
|
615
|
+
// Notify frame change
|
|
616
|
+
if (this.onFrameChange) {
|
|
617
|
+
this.onFrameChange(this.currentFrameIndex);
|
|
618
|
+
}
|
|
619
|
+
// Schedule next frame
|
|
620
|
+
this.nextFrameTimeout = window.setTimeout(() => {
|
|
621
|
+
this.currentFrameIndex++;
|
|
622
|
+
// Check if we've reached the end of frames
|
|
623
|
+
if (this.currentFrameIndex >= this.frames.length) {
|
|
624
|
+
this.currentFrameIndex = 0;
|
|
625
|
+
this.currentLoop++;
|
|
626
|
+
// Check loop count
|
|
627
|
+
if (this.loopCount > 0 && this.currentLoop >= this.loopCount) {
|
|
628
|
+
this.stop();
|
|
629
|
+
if (this.onAnimationEnd) {
|
|
630
|
+
this.onAnimationEnd();
|
|
631
|
+
}
|
|
632
|
+
return;
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
// Schedule next frame
|
|
636
|
+
this.scheduleNextFrame();
|
|
637
|
+
}, duration);
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* Clear scheduled frame timeout
|
|
641
|
+
*/
|
|
642
|
+
clearScheduledFrame() {
|
|
643
|
+
if (this.nextFrameTimeout !== null) {
|
|
644
|
+
clearTimeout(this.nextFrameTimeout);
|
|
645
|
+
this.nextFrameTimeout = null;
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* Check if animation is playing
|
|
650
|
+
*/
|
|
651
|
+
getIsPlaying() {
|
|
652
|
+
return this.isPlaying && !this.isPaused;
|
|
653
|
+
}
|
|
654
|
+
/**
|
|
655
|
+
* Get current frame index
|
|
656
|
+
*/
|
|
657
|
+
getCurrentFrameIndex() {
|
|
658
|
+
return this.currentFrameIndex;
|
|
659
|
+
}
|
|
660
|
+
/**
|
|
661
|
+
* Update badge during animation
|
|
662
|
+
*/
|
|
663
|
+
setBadge(badge) {
|
|
664
|
+
this.badge = badge || null;
|
|
665
|
+
}
|
|
666
|
+
/**
|
|
667
|
+
* Get current badge
|
|
668
|
+
*/
|
|
669
|
+
getBadge() {
|
|
670
|
+
return this.badge;
|
|
671
|
+
}
|
|
672
|
+
/**
|
|
673
|
+
* Get total frames
|
|
674
|
+
*/
|
|
675
|
+
getFrameCount() {
|
|
676
|
+
return this.frames.length;
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* Cleanup resources
|
|
680
|
+
*/
|
|
681
|
+
destroy() {
|
|
682
|
+
this.stop();
|
|
683
|
+
}
|
|
684
|
+
}
|
|
261
685
|
|
|
262
686
|
/**
|
|
263
687
|
* Main FaviconAnimator class
|
|
@@ -272,12 +696,19 @@ class FaviconAnimator {
|
|
|
272
696
|
this.unsubscribeVisibility = null;
|
|
273
697
|
this.faviconSize = 32;
|
|
274
698
|
this.updateInterval = 100;
|
|
699
|
+
this.enableAnimation = true;
|
|
700
|
+
this.animationLoop = null;
|
|
701
|
+
this.decodedFrames = [];
|
|
702
|
+
this.animationFrameId = null;
|
|
275
703
|
if (!isBrowser()) {
|
|
276
704
|
throw new Error('FaviconAnimator can only be used in browser environment');
|
|
277
705
|
}
|
|
278
706
|
this.faviconLink = getFaviconLink();
|
|
279
707
|
this.pauseOnHidden = options.pauseOnHidden !== false;
|
|
280
708
|
this.updateInterval = options.updateInterval || 100;
|
|
709
|
+
this.enableAnimation = options.enableAnimation !== false;
|
|
710
|
+
// Normalize favicon links (remove duplicates)
|
|
711
|
+
normalizeLinks();
|
|
281
712
|
// Setup visibility manager
|
|
282
713
|
if (this.pauseOnHidden) {
|
|
283
714
|
const visibilityManager = getVisibilityManager();
|
|
@@ -310,20 +741,36 @@ class FaviconAnimator {
|
|
|
310
741
|
const faviconConfig = typeof config === 'string'
|
|
311
742
|
? { url: config }
|
|
312
743
|
: config;
|
|
313
|
-
const { url, size = 32 } = faviconConfig;
|
|
744
|
+
const { url, size = 32, animate = true, corsMode = 'cors', loopCount = 0 } = faviconConfig;
|
|
314
745
|
this.faviconSize = size;
|
|
315
746
|
try {
|
|
747
|
+
// Stop any existing animation
|
|
748
|
+
this.stopAnimation();
|
|
316
749
|
// Detect format
|
|
317
750
|
const format = detectImageFormat(url);
|
|
751
|
+
const isAnimated = format === 'gif' || format === 'webp';
|
|
318
752
|
// Create favicon data
|
|
319
753
|
this.currentFavicon = {
|
|
320
754
|
url,
|
|
321
755
|
size,
|
|
322
|
-
isAnimated
|
|
756
|
+
isAnimated,
|
|
323
757
|
format
|
|
324
758
|
};
|
|
325
|
-
//
|
|
326
|
-
|
|
759
|
+
// Try to decode and animate if enabled
|
|
760
|
+
if (isAnimated && animate && this.enableAnimation) {
|
|
761
|
+
try {
|
|
762
|
+
await this.startAnimation(url, corsMode, loopCount);
|
|
763
|
+
}
|
|
764
|
+
catch (error) {
|
|
765
|
+
console.warn('Animation failed, falling back to static image:', error);
|
|
766
|
+
// Fallback to static image
|
|
767
|
+
await this.updateFaviconDisplay();
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
else {
|
|
771
|
+
// Static favicon
|
|
772
|
+
await this.updateFaviconDisplay();
|
|
773
|
+
}
|
|
327
774
|
}
|
|
328
775
|
catch (error) {
|
|
329
776
|
console.error('Error setting favicon:', error);
|
|
@@ -333,12 +780,12 @@ class FaviconAnimator {
|
|
|
333
780
|
* Set badge
|
|
334
781
|
*/
|
|
335
782
|
setBadge(config) {
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
this.
|
|
783
|
+
this.currentBadge = BadgeRenderer.validateConfig(config);
|
|
784
|
+
if (this.animationLoop) {
|
|
785
|
+
this.animationLoop.setBadge(this.currentBadge);
|
|
339
786
|
}
|
|
340
|
-
|
|
341
|
-
|
|
787
|
+
else {
|
|
788
|
+
this.updateFaviconDisplay();
|
|
342
789
|
}
|
|
343
790
|
}
|
|
344
791
|
/**
|
|
@@ -350,14 +797,93 @@ class FaviconAnimator {
|
|
|
350
797
|
return;
|
|
351
798
|
}
|
|
352
799
|
this.currentBadge.number = number;
|
|
353
|
-
this.
|
|
800
|
+
if (this.animationLoop) {
|
|
801
|
+
this.animationLoop.setBadge(this.currentBadge);
|
|
802
|
+
}
|
|
803
|
+
else {
|
|
804
|
+
this.updateFaviconDisplay();
|
|
805
|
+
}
|
|
354
806
|
}
|
|
355
807
|
/**
|
|
356
808
|
* Remove badge
|
|
357
809
|
*/
|
|
358
810
|
removeBadge() {
|
|
359
811
|
this.currentBadge = null;
|
|
360
|
-
this.
|
|
812
|
+
if (this.animationLoop) {
|
|
813
|
+
this.animationLoop.setBadge(null);
|
|
814
|
+
}
|
|
815
|
+
else {
|
|
816
|
+
this.updateFaviconDisplay();
|
|
817
|
+
}
|
|
818
|
+
}
|
|
819
|
+
/**
|
|
820
|
+
* Start animation for GIF/WebP
|
|
821
|
+
*/
|
|
822
|
+
async startAnimation(url, corsMode, loopCount) {
|
|
823
|
+
try {
|
|
824
|
+
// Decode frames
|
|
825
|
+
this.decodedFrames = await decodeImageFrames(url, { corsMode });
|
|
826
|
+
if (this.decodedFrames.length <= 1) {
|
|
827
|
+
// Not animated or single frame
|
|
828
|
+
await this.updateFaviconDisplay();
|
|
829
|
+
return;
|
|
830
|
+
}
|
|
831
|
+
// Create animation loop
|
|
832
|
+
this.animationLoop = new AnimationLoop({
|
|
833
|
+
frames: this.decodedFrames,
|
|
834
|
+
faviconSize: this.faviconSize,
|
|
835
|
+
badge: this.currentBadge,
|
|
836
|
+
loopCount,
|
|
837
|
+
onFrameChange: (_frameIndex) => {
|
|
838
|
+
this.updateAnimationFrame();
|
|
839
|
+
},
|
|
840
|
+
onAnimationEnd: () => {
|
|
841
|
+
this.isAnimating = false;
|
|
842
|
+
}
|
|
843
|
+
});
|
|
844
|
+
// Start animation if visible
|
|
845
|
+
if (this.isVisible) {
|
|
846
|
+
this.animationLoop.play();
|
|
847
|
+
this.isAnimating = true;
|
|
848
|
+
this.updateAnimationFrame();
|
|
849
|
+
}
|
|
850
|
+
}
|
|
851
|
+
catch (error) {
|
|
852
|
+
console.error('Failed to start animation:', error);
|
|
853
|
+
throw error;
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
/**
|
|
857
|
+
* Stop animation and cleanup
|
|
858
|
+
*/
|
|
859
|
+
stopAnimation() {
|
|
860
|
+
if (this.animationFrameId !== null) {
|
|
861
|
+
cancelAnimationFrame(this.animationFrameId);
|
|
862
|
+
this.animationFrameId = null;
|
|
863
|
+
}
|
|
864
|
+
if (this.animationLoop) {
|
|
865
|
+
this.animationLoop.destroy();
|
|
866
|
+
this.animationLoop = null;
|
|
867
|
+
}
|
|
868
|
+
if (this.decodedFrames.length > 0) {
|
|
869
|
+
releaseFrames(this.decodedFrames);
|
|
870
|
+
this.decodedFrames = [];
|
|
871
|
+
}
|
|
872
|
+
this.isAnimating = false;
|
|
873
|
+
}
|
|
874
|
+
/**
|
|
875
|
+
* Update animation frame on favicon
|
|
876
|
+
*/
|
|
877
|
+
updateAnimationFrame() {
|
|
878
|
+
if (!this.animationLoop)
|
|
879
|
+
return;
|
|
880
|
+
try {
|
|
881
|
+
const dataUrl = this.animationLoop.getCurrentFrameDataUrl();
|
|
882
|
+
this.faviconLink.href = dataUrl;
|
|
883
|
+
}
|
|
884
|
+
catch (error) {
|
|
885
|
+
console.error('Error updating animation frame:', error);
|
|
886
|
+
}
|
|
361
887
|
}
|
|
362
888
|
/**
|
|
363
889
|
* Update favicon display (with badge if configured)
|
|
@@ -393,13 +919,17 @@ class FaviconAnimator {
|
|
|
393
919
|
* Pause animation
|
|
394
920
|
*/
|
|
395
921
|
pause() {
|
|
922
|
+
if (this.animationLoop) {
|
|
923
|
+
this.animationLoop.pause();
|
|
924
|
+
}
|
|
396
925
|
this.isAnimating = false;
|
|
397
926
|
}
|
|
398
927
|
/**
|
|
399
928
|
* Resume animation
|
|
400
929
|
*/
|
|
401
930
|
resume() {
|
|
402
|
-
if (this.isVisible) {
|
|
931
|
+
if (this.isVisible && this.animationLoop) {
|
|
932
|
+
this.animationLoop.resume();
|
|
403
933
|
this.isAnimating = true;
|
|
404
934
|
}
|
|
405
935
|
}
|
|
@@ -425,6 +955,7 @@ class FaviconAnimator {
|
|
|
425
955
|
* Cleanup
|
|
426
956
|
*/
|
|
427
957
|
destroy() {
|
|
958
|
+
this.stopAnimation();
|
|
428
959
|
this.pause();
|
|
429
960
|
if (this.unsubscribeVisibility) {
|
|
430
961
|
this.unsubscribeVisibility();
|
|
@@ -432,5 +963,5 @@ class FaviconAnimator {
|
|
|
432
963
|
}
|
|
433
964
|
}
|
|
434
965
|
|
|
435
|
-
export { BadgeRenderer, FaviconAnimator, VisibilityManager, canvasToDataUrl, createCanvas, debounce, detectImageFormat, getFaviconLink, getVisibilityManager, isBrowser, loadImage, supportsPageVisibility, throttle };
|
|
966
|
+
export { AnimationLoop, BadgeRenderer, FaviconAnimator, VisibilityManager, canvasToDataUrl, createCanvas, debounce, decodeImageFrames, detectImageFormat, getCorsMode, getFaviconLink, getVisibilityManager, hasImageDecoder, isBrowser, isCanvasTainted, isSameOrigin, loadImage, logCorsWarning, normalizeLinks, releaseFrames, supportsPageVisibility, testCorsImage, throttle };
|
|
436
967
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/badge.ts","../src/visibility.ts","../src/utils.ts","../src/animator.ts"],"sourcesContent":[null,null,null,null],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/badge.ts","../src/visibility.ts","../src/cors-handler.ts","../src/frame-decoder.ts","../src/utils.ts","../src/animation-loop.ts","../src/animator.ts"],"sourcesContent":[null,null,null,null,null,null,null],"names":[],"mappings":"AAEA;;AAEG;MAEU,aAAa,CAAA;AACxB;;AAEG;IACH,OAAO,iBAAiB,CACtB,QAAuB,EACvB,WAAmB,EACnB,SAAiB,EACjB,MAAA,GAAiB,CAAC,EAAA;AAElB,QAAA,MAAM,WAAW,GAAG,SAAS,GAAG,CAAC;QAEjC,QAAQ,QAAQ;AACd,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE;AAC7D,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,EAAE,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE;AAC3E,YAAA,KAAK,aAAa;AAChB,gBAAA,OAAO,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,EAAE;AAC3E,YAAA,KAAK,cAAc;AACjB,gBAAA,OAAO,EAAE,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,EAAE;AACzF,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,EAAE,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE;AACnD,YAAA;AACE,gBAAA,OAAO,EAAE,CAAC,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE;;IAE/E;AAEA;;AAEG;AACH,IAAA,OAAO,SAAS,CACd,GAA6B,EAC7B,MAAmB,EACnB,WAAmB,EAAA;AAEnB,QAAA,MAAM,EACJ,MAAM,EACN,QAAQ,EACR,eAAe,GAAG,SAAS,EAC3B,SAAS,GAAG,SAAS,EACrB,IAAI,GAAG,EAAE,EACT,QAAQ,GAAG,EAAE,EACb,MAAM,GAAG,CAAC,EACV,UAAU,GAAG,MAAM,EACnB,UAAU,GAAG,mBAAmB,EACjC,GAAG,MAAM;AAEV,QAAA,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC;;AAG5E,QAAA,GAAG,CAAC,SAAS,GAAG,eAAe;QAC/B,GAAG,CAAC,SAAS,EAAE;AACf,QAAA,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QACvC,GAAG,CAAC,IAAI,EAAE;;AAGV,QAAA,GAAG,CAAC,SAAS,GAAG,SAAS;QACzB,GAAG,CAAC,IAAI,GAAG,CAAA,EAAG,UAAU,IAAI,QAAQ,CAAA,GAAA,EAAM,UAAU,CAAA,CAAE;AACtD,QAAA,GAAG,CAAC,SAAS,GAAG,QAAQ;AACxB,QAAA,GAAG,CAAC,YAAY,GAAG,QAAQ;;AAG3B,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;QAChD,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IAC/B;AAEA;;AAEG;IACH,OAAO,cAAc,CAAC,MAA4B,EAAA;AAChD,QAAA,MAAM,EACJ,MAAM,GAAG,CAAC,EACV,QAAQ,GAAG,WAAW,EACtB,eAAe,GAAG,SAAS,EAC3B,SAAS,GAAG,SAAS,EACrB,IAAI,GAAG,EAAE,EACT,QAAQ,GAAG,EAAE,EACb,MAAM,GAAG,CAAC,EACV,UAAU,GAAG,MAAM,EACnB,UAAU,GAAG,mBAAmB,EACjC,GAAG,MAAM;;AAGV,QAAA,MAAM,cAAc,GAAoB;YACtC,UAAU;YACV,WAAW;YACX,aAAa;YACb,cAAc;YACd;SACD;QACD,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAyB,CAAC,EAAE;AACvD,YAAA,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,CAAA,CAAE,CAAC;QACxD;;QAGA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC5D,YAAA,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC;QAC5D;QAEA,OAAO;YACL,MAAM;AACN,YAAA,QAAQ,EAAE,QAAyB;YACnC,eAAe;YACf,SAAS;YACT,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC;YACvB,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC;YAC/B,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC;YAC3B,UAAU;YACV;SACD;IACH;AACD;;ACtHD;;;AAGG;MAIU,iBAAiB,CAAA;AAK5B,IAAA,WAAA,GAAA;QAJQ,IAAA,CAAA,SAAS,GAAY,IAAI;AACzB,QAAA,IAAA,CAAA,SAAS,GAAkC,IAAI,GAAG,EAAE;QAI1D,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;QACzE,IAAI,CAAC,IAAI,EAAE;IACb;IAEQ,IAAI,GAAA;;AAEV,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC,QAAQ,CAAC,MAAM;;QAGjC,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,CAAC,2BAA2B,CAAC;IACjF;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS;AACjC,QAAA,IAAI,CAAC,SAAS,GAAG,CAAC,QAAQ,CAAC,MAAM;;AAGjC,QAAA,IAAI,UAAU,KAAK,IAAI,CAAC,SAAS,EAAE;YACjC,IAAI,CAAC,eAAe,EAAE;QACxB;IACF;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,IAAG;AAChC,YAAA,IAAI;AACF,gBAAA,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;YAC1B;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC;YACvD;AACF,QAAA,CAAC,CAAC;IACJ;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,QAAkC,EAAA;AACzC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;;AAG5B,QAAA,OAAO,MAAK;AACV,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AACjC,QAAA,CAAC;IACH;AAEA;;AAEG;IACH,YAAY,GAAA;QACV,OAAO,IAAI,CAAC,SAAS;IACvB;AAEA;;AAEG;IACH,OAAO,GAAA;QACL,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,CAAC,2BAA2B,CAAC;AAClF,QAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;IACxB;AACD;AAED;AACA,IAAI,iBAAiB,GAA6B,IAAI;SAEtC,oBAAoB,GAAA;IAClC,IAAI,CAAC,iBAAiB,EAAE;AACtB,QAAA,iBAAiB,GAAG,IAAI,iBAAiB,EAAE;IAC7C;AACA,IAAA,OAAO,iBAAiB;AAC1B;;ACjFA;;AAEG;AAEH;;AAEG;AACG,SAAU,eAAe,CAAC,MAAyB,EAAA;AACvD,IAAA,IAAI;QACF,MAAM,CAAC,SAAS,EAAE;AAClB,QAAA,OAAO,KAAK;IACd;IAAE,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,IAAI;IACb;AACF;AAEA;;AAEG;AACI,eAAe,aAAa,CAAC,GAAW,EAAE,WAA+C,MAAM,EAAA;AACpG,IAAA,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,KAAI;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,QAAA,GAAG,CAAC,WAAW,GAAG,QAAQ,KAAK,MAAM,GAAG,WAAW,GAAG,iBAAiB;AAEvE,QAAA,GAAG,CAAC,MAAM,GAAG,MAAK;;AAEhB,YAAA,IAAI;gBACF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,gBAAA,MAAM,CAAC,KAAK,GAAG,CAAC;AAChB,gBAAA,MAAM,CAAC,MAAM,GAAG,CAAC;gBACjB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;gBACnC,IAAI,CAAC,GAAG,EAAE;oBACR,OAAO,CAAC,KAAK,CAAC;oBACd;gBACF;gBAEA,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;gBACxB,MAAM,CAAC,SAAS,EAAE;gBAClB,OAAO,CAAC,IAAI,CAAC;YACf;YAAE,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC;YAChB;AACF,QAAA,CAAC;AAED,QAAA,GAAG,CAAC,OAAO,GAAG,MAAK;YACjB,OAAO,CAAC,KAAK,CAAC;AAChB,QAAA,CAAC;AAED,QAAA,GAAG,CAAC,GAAG,GAAG,GAAG;AACf,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACI,eAAe,WAAW,CAAC,GAAW,EAAA;;AAE3C,IAAA,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE;AACrB,QAAA,OAAO,aAAa;IACtB;;IAGA,IAAI,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE;AACpC,QAAA,OAAO,MAAM;IACf;;AAGA,IAAA,OAAO,SAAS;AAClB;AAEA;;AAEG;AACG,SAAU,YAAY,CAAC,GAAW,EAAA;AACtC,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAC3B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACvB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI;AACF,QAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjD,OAAO,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,MAAM;IACjD;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,KAAK;IACd;AACF;AAEA;;AAEG;AACG,SAAU,cAAc,CAAC,GAAW,EAAE,KAAY,EAAA;AACtD,IAAA,OAAO,CAAC,IAAI,CACV,CAAA,2CAAA,EAA8C,GAAG,CAAA,EAAA,CAAI;QACrD,CAAA,OAAA,EAAU,KAAK,CAAC,OAAO,CAAA,EAAA,CAAI;QAC3B,CAAA,uCAAA,CAAyC;QACzC,CAAA,qEAAA,CAAuE;QACvE,CAAA,+BAAA,CAAiC;AACjC,QAAA,CAAA,0DAAA,CAA4D,CAC7D;AACH;;ACtGA;;;AAGG;AAcH;;AAEG;SACa,eAAe,GAAA;;AAE7B,IAAA,OAAO,OAAQ,UAAkB,CAAC,YAAY,KAAK,WAAW;AAChE;AAEA;;;AAGG;AACI,eAAe,iBAAiB,CACrC,GAAW,EACX,UAA+B,EAAE,EAAA;IAEjC,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO;AAEjD,IAAA,IAAI;;AAEF,QAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;AAChC,YAAA,IAAI,EAAE,QAAuB;YAC7B,WAAW,EAAE,QAAQ,KAAK,MAAM,GAAG,MAAM,GAAG;AAC7C,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,CAAA,uBAAA,EAA0B,QAAQ,CAAC,UAAU,CAAA,CAAE,CAAC;QAClE;AAEA,QAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,YAAY;AACxE,QAAA,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE;;QAGhD,IAAI,eAAe,EAAE,EAAE;YACrB,OAAO,MAAM,sBAAsB,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC;QAC3E;aAAO;;AAEL,YAAA,OAAO,MAAM,sBAAsB,CAAC,GAAG,EAAE,UAAU,CAAC;QACtD;IACF;IAAE,OAAO,KAAK,EAAE;QACd,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,QAAA,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC;AACxB,QAAA,MAAM,KAAK;IACb;AACF;AAEA;;AAEG;AACH,eAAe,sBAAsB,CACnC,WAAwB,EACxB,WAAmB,EACnB,UAAqD,EAAA;;AAGrD,IAAA,MAAM,iBAAiB,GAAI,UAAkB,CAAC,YAAY;IAE1D,IAAI,CAAC,iBAAiB,EAAE;AACtB,QAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;IAC/C;AAEA,IAAA,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC;AACpC,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,IAAI,EAAE;AACP,KAAA,CAAC;AAEF,IAAA,MAAM,OAAO,CAAC,MAAM,CAAC,KAAK;AAE1B,IAAA,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa;IAC1C,IAAI,CAAC,KAAK,EAAE;AACV,QAAA,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC;IAClD;AAEA,IAAA,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU;IACnC,MAAM,MAAM,GAAmB,EAAE;AAEjC,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;AACnC,QAAA,IAAI;AACF,YAAA,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;;AAGzD,YAAA,MAAM,UAAU,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE;;AAG9D,YAAA,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC;YAE7C,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM;gBACN,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;AACrC,aAAA,CAAC;YAEF,KAAK,CAAC,KAAK,EAAE;YAEb,IAAI,UAAU,EAAE;AACd,gBAAA,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;YAC/B;QACF;QAAE,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,IAAI,CAAC,CAAA,uBAAA,EAA0B,CAAC,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;;QAErD;IACF;AAEA,IAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;AACvB,QAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC;IAC/C;AAEA,IAAA,OAAO,MAAM;AACf;AAEA;;;;AAIG;AACH,eAAe,sBAAsB,CACnC,GAAW,EACX,UAAqD,EAAA;IAErD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,QAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;AACvB,QAAA,GAAG,CAAC,WAAW,GAAG,WAAW;AAE7B,QAAA,GAAG,CAAC,MAAM,GAAG,YAAW;AACtB,YAAA,IAAI;;gBAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,gBAAA,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK;AACxB,gBAAA,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM;gBAE1B,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;gBACnC,IAAI,CAAC,GAAG,EAAE;AACR,oBAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;gBACjD;gBAEA,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;;AAGxB,gBAAA,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC;;;AAI9C,gBAAA,MAAM,MAAM,GAAmB;AAC7B,oBAAA;wBACE,MAAM;wBACN,UAAU,EAAE,GAAG;AAChB;iBACF;gBAED,IAAI,UAAU,EAAE;AACd,oBAAA,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClB;gBAEA,OAAO,CAAC,MAAM,CAAC;YACjB;YAAE,OAAO,KAAK,EAAE;gBACd,MAAM,CAAC,KAAK,CAAC;YACf;AACF,QAAA,CAAC;AAED,QAAA,GAAG,CAAC,OAAO,GAAG,MAAK;YACjB,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAA,CAAE,CAAC,CAAC;AACnD,QAAA,CAAC;AAED,QAAA,GAAG,CAAC,GAAG,GAAG,GAAG;AACf,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACG,SAAU,aAAa,CAAC,MAAsB,EAAA;AAClD,IAAA,MAAM,CAAC,OAAO,CAAC,KAAK,IAAG;AACrB,QAAA,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE;AAC5D,YAAA,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE;QACtB;AACF,IAAA,CAAC,CAAC;AACJ;;AChMA;;AAEG;AAEH;;AAEG;SACa,cAAc,GAAA;IAC5B,IAAI,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAoB;IAExE,IAAI,CAAC,IAAI,EAAE;AACT,QAAA,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC;AACrC,QAAA,IAAI,CAAC,GAAG,GAAG,MAAM;AACjB,QAAA,IAAI,CAAC,IAAI,GAAG,WAAW;AACvB,QAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACjC;AAEA,IAAA,OAAO,IAAI;AACb;AAEA;;AAEG;AACG,SAAU,YAAY,CAAC,IAAY,EAAA;IACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;AAC/C,IAAA,MAAM,CAAC,KAAK,GAAG,IAAI;AACnB,IAAA,MAAM,CAAC,MAAM,GAAG,IAAI;AACpB,IAAA,OAAO,MAAM;AACf;AAEA;;AAEG;AACG,SAAU,SAAS,CAAC,GAAW,EAAA;IACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACrC,QAAA,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE;QACvB,GAAG,CAAC,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AAC/B,QAAA,GAAG,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,KAAK,CAAC,CAAA,sBAAA,EAAyB,GAAG,CAAA,CAAE,CAAC,CAAC;AACrE,QAAA,GAAG,CAAC,GAAG,GAAG,GAAG;AACf,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACG,SAAU,iBAAiB,CAAC,GAAW,EAAA;AAC3C,IAAA,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAC3B,QAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAChD,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAC1C,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,MAAM;AAC5C,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAC1C,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AAC1C,QAAA,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,KAAK;IAC7C;SAAO;AACL,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE;QAC/C,IAAI,GAAG,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;QAC/B,IAAI,GAAG,KAAK,MAAM;AAAE,YAAA,OAAO,MAAM;QACjC,IAAI,GAAG,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;QAC/B,IAAI,GAAG,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;QAC/B,IAAI,GAAG,KAAK,KAAK;AAAE,YAAA,OAAO,KAAK;IACjC;AACA,IAAA,OAAO,SAAS;AAClB;AAEA;;AAEG;SACa,sBAAsB,GAAA;AACpC,IAAA,OAAO,OAAO,QAAQ,CAAC,MAAM,KAAK,WAAW;AAC/C;AAEA;;AAEG;AACG,SAAU,QAAQ,CACtB,IAAO,EACP,IAAY,EAAA;AAEZ,IAAA,IAAI,OAAuB;AAE3B,IAAA,OAAO,SAAS,gBAAgB,CAAC,GAAG,IAAmB,EAAA;QACrD,MAAM,KAAK,GAAG,MAAK;YACjB,YAAY,CAAC,OAAO,CAAC;AACrB,YAAA,IAAI,CAAC,GAAG,IAAI,CAAC;AACf,QAAA,CAAC;QAED,YAAY,CAAC,OAAO,CAAC;AACrB,QAAA,OAAO,GAAG,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC;AACnC,IAAA,CAAC;AACH;AAEA;;AAEG;AACG,SAAU,QAAQ,CACtB,IAAO,EACP,KAAa,EAAA;AAEb,IAAA,IAAI,UAAmB;AAEvB,IAAA,OAAO,SAAS,gBAAgB,CAAC,GAAG,IAAmB,EAAA;QACrD,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,IAAI,CAAC,GAAG,IAAI,CAAC;YACb,UAAU,GAAG,IAAI;AACjB,YAAA,UAAU,CAAC,OAAO,UAAU,GAAG,KAAK,CAAC,EAAE,KAAK,CAAC;QAC/C;AACF,IAAA,CAAC;AACH;AAEA;;AAEG;AACG,SAAU,eAAe,CAAC,MAAyB,EAAA;AACvD,IAAA,OAAO,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;AACtC;AAEA;;AAEG;SACa,SAAS,GAAA;IACvB,OAAO,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,QAAQ,KAAK,WAAW;AACzE;AAEA;;;AAGG;SACa,cAAc,GAAA;IAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC,mBAAmB,CAAC;AAC5D,IAAA,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC;QAAE;;IAGvB,IAAI,IAAI,GAAG,KAAK;AAChB,IAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAa,KAAI;QAC9B,MAAM,MAAM,GAAG,IAAuB;AACtC,QAAA,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;YAC7C,IAAI,GAAG,IAAI;QACb;aAAO,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;YAClD,IAAI,CAAC,MAAM,EAAE;QACf;AACF,IAAA,CAAC,CAAC;AACJ;;AC7IA;;AAEG;AAgBH;;AAEG;MACU,aAAa,CAAA;AAaxB,IAAA,WAAA,CAAY,OAA6B,EAAA;QARjC,IAAA,CAAA,iBAAiB,GAAW,CAAC;QAC7B,IAAA,CAAA,WAAW,GAAW,CAAC;QACvB,IAAA,CAAA,SAAS,GAAY,KAAK;QAC1B,IAAA,CAAA,QAAQ,GAAY,KAAK;QACzB,IAAA,CAAA,gBAAgB,GAAkB,IAAI;AAK5C,QAAA,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;AAC5B,QAAA,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW;QACtC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI;QAClC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,IAAI;QAClD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI;IACtD;AAEA;;AAEG;IACH,IAAI,GAAA;QACF,IAAI,IAAI,CAAC,SAAS;YAAE;AAEpB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;QAEpB,IAAI,CAAC,iBAAiB,EAAE;IAC1B;AAEA;;AAEG;IACH,KAAK,GAAA;QACH,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;AAErB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,IAAI,CAAC,mBAAmB,EAAE;IAC5B;AAEA;;AAEG;IACH,MAAM,GAAA;QACJ,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AAEpB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QACrB,IAAI,CAAC,iBAAiB,EAAE;IAC1B;AAEA;;AAEG;IACH,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;QACrB,IAAI,CAAC,mBAAmB,EAAE;AAC1B,QAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC;AAC1B,QAAA,IAAI,CAAC,WAAW,GAAG,CAAC;IACtB;AAEA;;AAEG;IACH,sBAAsB,GAAA;QACpB,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAChD,YAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC;QAC5B;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACjD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;QAEnC,IAAI,CAAC,GAAG,EAAE;AACR,YAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;QACjD;;AAGA,QAAA,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;;AAGrE,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE;AACd,YAAA,aAAa,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC;QAC5D;AAEA,QAAA,OAAO,eAAe,CAAC,MAAM,CAAC;IAChC;AAEA;;AAEG;IACK,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ;YAAE;;AAGtC,QAAA,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE;YAC5D,IAAI,CAAC,IAAI,EAAE;AACX,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE;gBACvB,IAAI,CAAC,cAAc,EAAE;YACvB;YACA;QACF;QAEA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;AACjD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU;;AAGjC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAC5C;;QAGA,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;YAC7C,IAAI,CAAC,iBAAiB,EAAE;;YAGxB,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAChD,gBAAA,IAAI,CAAC,iBAAiB,GAAG,CAAC;gBAC1B,IAAI,CAAC,WAAW,EAAE;;AAGlB,gBAAA,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE;oBAC5D,IAAI,CAAC,IAAI,EAAE;AACX,oBAAA,IAAI,IAAI,CAAC,cAAc,EAAE;wBACvB,IAAI,CAAC,cAAc,EAAE;oBACvB;oBACA;gBACF;YACF;;YAGA,IAAI,CAAC,iBAAiB,EAAE;QAC1B,CAAC,EAAE,QAAQ,CAAC;IACd;AAEA;;AAEG;IACK,mBAAmB,GAAA;AACzB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE;AAClC,YAAA,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC;AACnC,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;IACF;AAEA;;AAEG;IACH,YAAY,GAAA;QACV,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ;IACzC;AAEA;;AAEG;IACH,oBAAoB,GAAA;QAClB,OAAO,IAAI,CAAC,iBAAiB;IAC/B;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,KAAyB,EAAA;AAChC,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI;IAC5B;AAEA;;AAEG;IACH,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,KAAK;IACnB;AAEA;;AAEG;IACH,aAAa,GAAA;AACX,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM;IAC3B;AAEA;;AAEG;IACH,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,EAAE;IACb;AACD;;ACtMD;;AAEG;MACU,eAAe,CAAA;AAe1B,IAAA,WAAA,CAAY,UAA2B,EAAE,EAAA;QAbjC,IAAA,CAAA,cAAc,GAAuB,IAAI;QACzC,IAAA,CAAA,YAAY,GAAuB,IAAI;QACvC,IAAA,CAAA,WAAW,GAAY,KAAK;QAC5B,IAAA,CAAA,aAAa,GAAY,IAAI;QAC7B,IAAA,CAAA,SAAS,GAAY,IAAI;QACzB,IAAA,CAAA,qBAAqB,GAAwB,IAAI;QACjD,IAAA,CAAA,WAAW,GAAW,EAAE;QACxB,IAAA,CAAA,cAAc,GAAW,GAAG;QAC5B,IAAA,CAAA,eAAe,GAAY,IAAI;QAC/B,IAAA,CAAA,aAAa,GAAyB,IAAI;QAC1C,IAAA,CAAA,aAAa,GAAmB,EAAE;QAClC,IAAA,CAAA,gBAAgB,GAAkB,IAAI;AAG5C,QAAA,IAAI,CAAC,SAAS,EAAE,EAAE;AAChB,YAAA,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC;QAC5E;AAEA,QAAA,IAAI,CAAC,WAAW,GAAG,cAAc,EAAE;QACnC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,KAAK,KAAK;QACpD,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,GAAG;QACnD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,KAAK,KAAK;;AAGxD,QAAA,cAAc,EAAE;;AAGhB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,MAAM,iBAAiB,GAAG,oBAAoB,EAAE;YAChD,IAAI,CAAC,qBAAqB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,SAAS,IAAG;AAClE,gBAAA,IAAI,CAAC,SAAS,GAAG,SAAS;gBAC1B,IAAI,SAAS,EAAE;oBACb,IAAI,CAAC,MAAM,EAAE;gBACf;qBAAO;oBACL,IAAI,CAAC,KAAK,EAAE;gBACd;AACF,YAAA,CAAC,CAAC;QACJ;;AAGA,QAAA,IAAI,OAAO,CAAC,OAAO,EAAE;AACnB,YAAA,MAAM,aAAa,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK;AAC/C,kBAAE,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO;AACxB,kBAAE,OAAO,CAAC,OAAO;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAChC;;AAGA,QAAA,IAAI,OAAO,CAAC,KAAK,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;QAC9B;IACF;AAEA;;AAEG;IACH,MAAM,UAAU,CAAC,MAA8B,EAAA;AAC7C,QAAA,MAAM,aAAa,GAAkB,OAAO,MAAM,KAAK;AACrD,cAAE,EAAE,GAAG,EAAE,MAAM;cACb,MAAM;QAEV,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE,QAAQ,GAAG,MAAM,EAAE,SAAS,GAAG,CAAC,EAAE,GAAG,aAAa;AAC1F,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AAEvB,QAAA,IAAI;;YAEF,IAAI,CAAC,aAAa,EAAE;;AAGpB,YAAA,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC;YACrC,MAAM,UAAU,GAAG,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM;;YAGxD,IAAI,CAAC,cAAc,GAAG;gBACpB,GAAG;gBACH,IAAI;gBACJ,UAAU;gBACV;aACD;;YAGD,IAAI,UAAU,IAAI,OAAO,IAAI,IAAI,CAAC,eAAe,EAAE;AACjD,gBAAA,IAAI;oBACF,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC;gBACrD;gBAAE,OAAO,KAAK,EAAE;AACd,oBAAA,OAAO,CAAC,IAAI,CAAC,iDAAiD,EAAE,KAAK,CAAC;;AAEtE,oBAAA,MAAM,IAAI,CAAC,oBAAoB,EAAE;gBACnC;YACF;iBAAO;;AAEL,gBAAA,MAAM,IAAI,CAAC,oBAAoB,EAAE;YACnC;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC;QAChD;IACF;AAEA;;AAEG;AACH,IAAA,QAAQ,CAAC,MAAmB,EAAA;QAC1B,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC;AACxD,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;QAChD;aAAO;YACL,IAAI,CAAC,oBAAoB,EAAE;QAC7B;IACF;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,MAAuB,EAAA;AACjC,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;AACtB,YAAA,OAAO,CAAC,IAAI,CAAC,2CAA2C,CAAC;YACzD;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM;AACjC,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;QAChD;aAAO;YACL,IAAI,CAAC,oBAAoB,EAAE;QAC7B;IACF;AAEA;;AAEG;IACH,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI;AACxB,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnC;aAAO;YACL,IAAI,CAAC,oBAAoB,EAAE;QAC7B;IACF;AAEA;;AAEG;AACK,IAAA,MAAM,cAAc,CAC1B,GAAW,EACX,QAA4C,EAC5C,SAAiB,EAAA;AAEjB,QAAA,IAAI;;AAEF,YAAA,IAAI,CAAC,aAAa,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC;YAE/D,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE;;AAElC,gBAAA,MAAM,IAAI,CAAC,oBAAoB,EAAE;gBACjC;YACF;;AAGA,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC;gBACrC,MAAM,EAAE,IAAI,CAAC,aAAa;gBAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,KAAK,EAAE,IAAI,CAAC,YAAY;gBACxB,SAAS;AACT,gBAAA,aAAa,EAAE,CAAC,WAAW,KAAI;oBAC7B,IAAI,CAAC,oBAAoB,EAAE;gBAC7B,CAAC;gBACD,cAAc,EAAE,MAAK;AACnB,oBAAA,IAAI,CAAC,WAAW,GAAG,KAAK;gBAC1B;AACD,aAAA,CAAC;;AAGF,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,gBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;AACzB,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI;gBACvB,IAAI,CAAC,oBAAoB,EAAE;YAC7B;QACF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC;AAClD,YAAA,MAAM,KAAK;QACb;IACF;AAEA;;AAEG;IACK,aAAa,GAAA;AACnB,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE;AAClC,YAAA,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC3C,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;QAC9B;AAEA,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;AAC5B,YAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAC3B;QAEA,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AACjC,YAAA,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;AACjC,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE;QACzB;AAEA,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;IAC1B;AAEA;;AAEG;IACK,oBAAoB,GAAA;QAC1B,IAAI,CAAC,IAAI,CAAC,aAAa;YAAE;AAEzB,QAAA,IAAI;YACF,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,sBAAsB,EAAE;AAC3D,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,OAAO;QACjC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC;QACzD;IACF;AAEA;;AAEG;AACK,IAAA,MAAM,oBAAoB,GAAA;QAChC,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE;AAE1B,QAAA,IAAI;AACF,YAAA,IAAI,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG;;AAGxC,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;gBACrB,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;gBAEnC,IAAI,CAAC,GAAG,EAAE;AACR,oBAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;gBACjD;;gBAGA,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACpD,gBAAA,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;;AAG5D,gBAAA,aAAa,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC;;AAGjE,gBAAA,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC;YACtC;;AAGA,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,UAAU;QACpC;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC;QACzD;IACF;AAEA;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE;QAC5B;AACA,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;IAC1B;AAEA;;AAEG;IACH,MAAM,GAAA;QACJ,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,EAAE;AACxC,YAAA,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE;AAC3B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;QACzB;IACF;AAEA;;AAEG;IACH,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,cAAc;IAC5B;AAEA;;AAEG;IACH,QAAQ,GAAA;QACN,OAAO,IAAI,CAAC,YAAY;IAC1B;AAEA;;AAEG;IACH,cAAc,GAAA;QACZ,OAAO,IAAI,CAAC,WAAW;IACzB;AAEA;;AAEG;IACH,OAAO,GAAA;QACL,IAAI,CAAC,aAAa,EAAE;QACpB,IAAI,CAAC,KAAK,EAAE;AACZ,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;YAC9B,IAAI,CAAC,qBAAqB,EAAE;QAC9B;IACF;AACD;;;;"}
|
package/dist/types.d.ts
CHANGED
|
@@ -18,8 +18,6 @@ export interface BadgeConfig {
|
|
|
18
18
|
size?: number;
|
|
19
19
|
/** Font size of the badge number */
|
|
20
20
|
fontSize?: number;
|
|
21
|
-
/** Border radius (usually '50%' for circle) */
|
|
22
|
-
borderRadius?: string;
|
|
23
21
|
/** Offset from the edge in pixels */
|
|
24
22
|
offset?: number;
|
|
25
23
|
/** Font weight */
|
|
@@ -37,6 +35,12 @@ export interface FaviconConfig {
|
|
|
37
35
|
size?: number;
|
|
38
36
|
/** Whether to use the favicon as-is or process it */
|
|
39
37
|
raw?: boolean;
|
|
38
|
+
/** Enable animation for GIF/WebP (default: true for animated images) */
|
|
39
|
+
animate?: boolean;
|
|
40
|
+
/** CORS mode for fetching animated images (default: 'cors') */
|
|
41
|
+
corsMode?: 'cors' | 'no-cors' | 'same-origin';
|
|
42
|
+
/** Loop count for animation (0 = infinite, >0 = finite) */
|
|
43
|
+
loopCount?: number;
|
|
40
44
|
}
|
|
41
45
|
/**
|
|
42
46
|
* Animator options
|
|
@@ -52,6 +56,8 @@ export interface AnimatorOptions {
|
|
|
52
56
|
updateInterval?: number;
|
|
53
57
|
/** Custom favicon link element selector */
|
|
54
58
|
linkSelector?: string;
|
|
59
|
+
/** Enable animation for GIF/WebP by default */
|
|
60
|
+
enableAnimation?: boolean;
|
|
55
61
|
}
|
|
56
62
|
/**
|
|
57
63
|
* Page visibility state
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,GAAG,QAAQ,CAAC;AAEjG;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,4BAA4B;IAC5B,QAAQ,EAAE,aAAa,CAAC;IACxB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,GAAG,QAAQ,CAAC;AAEjG;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,4BAA4B;IAC5B,QAAQ,EAAE,aAAa,CAAC;IACxB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,kBAAkB;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,wEAAwE;IACxE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,CAAC;IAC9C,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IACjC,kCAAkC;IAClC,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,yDAAyD;IACzD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAAC;CAC5D"}
|
package/dist/utils.d.ts
CHANGED
|
@@ -24,11 +24,11 @@ export declare function supportsPageVisibility(): boolean;
|
|
|
24
24
|
/**
|
|
25
25
|
* Debounce function
|
|
26
26
|
*/
|
|
27
|
-
export declare function debounce<T extends (...args:
|
|
27
|
+
export declare function debounce<T extends (...args: Parameters<T>) => ReturnType<T>>(func: T, wait: number): (...args: Parameters<T>) => void;
|
|
28
28
|
/**
|
|
29
29
|
* Throttle function
|
|
30
30
|
*/
|
|
31
|
-
export declare function throttle<T extends (...args:
|
|
31
|
+
export declare function throttle<T extends (...args: Parameters<T>) => ReturnType<T>>(func: T, limit: number): (...args: Parameters<T>) => void;
|
|
32
32
|
/**
|
|
33
33
|
* Convert canvas to data URL
|
|
34
34
|
*/
|
|
@@ -37,4 +37,9 @@ export declare function canvasToDataUrl(canvas: HTMLCanvasElement): string;
|
|
|
37
37
|
* Check if running in browser environment
|
|
38
38
|
*/
|
|
39
39
|
export declare function isBrowser(): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Normalize favicon links by removing duplicates
|
|
42
|
+
* Keeps only one canonical favicon link
|
|
43
|
+
*/
|
|
44
|
+
export declare function normalizeLinks(): void;
|
|
40
45
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,cAAc,IAAI,eAAe,CAWhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAK5D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAOhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAiBjG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,cAAc,IAAI,eAAe,CAWhD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAK5D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAOhE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,CAiBjG;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAC1E,IAAI,EAAE,CAAC,EACP,IAAI,EAAE,MAAM,GACX,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAYlC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAC1E,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,MAAM,GACZ,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,CAUlC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAcrC"}
|