favicon-animate 0.1.0 → 0.3.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.
- package/dist/animation-loop.d.ts +75 -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 +518 -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,75 @@
|
|
|
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
|
+
* Get total frames
|
|
68
|
+
*/
|
|
69
|
+
getFrameCount(): number;
|
|
70
|
+
/**
|
|
71
|
+
* Cleanup resources
|
|
72
|
+
*/
|
|
73
|
+
destroy(): void;
|
|
74
|
+
}
|
|
75
|
+
//# 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,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;IAKnC;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAU1C;;OAEG;IACH,WAAW,IAAI,IAAI;IAKnB;;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,CAEzC;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,YAAY,EAAE,CAAC,CA6BzB;AAyHD;;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,241 @@ 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
|
+
return typeof globalThis.ImageDecoder !== 'undefined';
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Decode animated image using ImageDecoder (WebCodecs)
|
|
251
|
+
* Returns array of frames with their durations
|
|
252
|
+
*/
|
|
253
|
+
async function decodeImageFrames(url, options = {}) {
|
|
254
|
+
const { corsMode = 'cors', onProgress } = options;
|
|
255
|
+
try {
|
|
256
|
+
// Fetch the image as ArrayBuffer
|
|
257
|
+
const response = await fetch(url, {
|
|
258
|
+
mode: corsMode,
|
|
259
|
+
credentials: corsMode === 'cors' ? 'omit' : 'same-origin'
|
|
260
|
+
});
|
|
261
|
+
if (!response.ok) {
|
|
262
|
+
throw new Error(`Failed to fetch image: ${response.statusText}`);
|
|
263
|
+
}
|
|
264
|
+
const contentType = response.headers.get('content-type') || 'image/webp';
|
|
265
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
266
|
+
// Use ImageDecoder if available
|
|
267
|
+
if (hasImageDecoder()) {
|
|
268
|
+
return await decodeWithImageDecoder(arrayBuffer, contentType, onProgress);
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
// Fallback to img+drawImage for unsupported browsers
|
|
272
|
+
return await decodeWithImageElement(url, onProgress);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
277
|
+
logCorsWarning(url, err);
|
|
278
|
+
throw error;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Decode using ImageDecoder (WebCodecs API)
|
|
283
|
+
*/
|
|
284
|
+
async function decodeWithImageDecoder(arrayBuffer, contentType, onProgress) {
|
|
285
|
+
const ImageDecoderClass = globalThis.ImageDecoder;
|
|
286
|
+
if (!ImageDecoderClass) {
|
|
287
|
+
throw new Error('ImageDecoder not available');
|
|
288
|
+
}
|
|
289
|
+
const decoder = new ImageDecoderClass({
|
|
290
|
+
data: arrayBuffer,
|
|
291
|
+
type: contentType
|
|
292
|
+
});
|
|
293
|
+
await decoder.tracks.ready;
|
|
294
|
+
const track = decoder.tracks.selectedTrack;
|
|
295
|
+
if (!track) {
|
|
296
|
+
throw new Error('No video track found in image');
|
|
297
|
+
}
|
|
298
|
+
const frameCount = track.frameCount;
|
|
299
|
+
const frames = [];
|
|
300
|
+
for (let i = 0; i < frameCount; i++) {
|
|
301
|
+
try {
|
|
302
|
+
const { image } = await decoder.decode({ frameIndex: i });
|
|
303
|
+
// Get frame duration (in microseconds, convert to milliseconds)
|
|
304
|
+
const durationMs = image.duration ? image.duration / 1000 : 90;
|
|
305
|
+
// Create ImageBitmap from VideoFrame
|
|
306
|
+
const bitmap = await createImageBitmap(image);
|
|
307
|
+
frames.push({
|
|
308
|
+
bitmap,
|
|
309
|
+
durationMs: Math.max(durationMs, 10) // Minimum 10ms per frame
|
|
310
|
+
});
|
|
311
|
+
image.close();
|
|
312
|
+
if (onProgress) {
|
|
313
|
+
onProgress(i + 1, frameCount);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
console.warn(`Failed to decode frame ${i}:`, error);
|
|
318
|
+
// Continue with other frames
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
if (frames.length === 0) {
|
|
322
|
+
throw new Error('No frames could be decoded');
|
|
323
|
+
}
|
|
324
|
+
return frames;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Fallback: Decode using HTMLImageElement + drawImage
|
|
328
|
+
* This captures the current frame of an animated image
|
|
329
|
+
* Note: Less precise, doesn't give exact frame durations
|
|
330
|
+
*/
|
|
331
|
+
async function decodeWithImageElement(url, onProgress) {
|
|
332
|
+
return new Promise((resolve, reject) => {
|
|
333
|
+
const img = new Image();
|
|
334
|
+
img.crossOrigin = 'anonymous';
|
|
335
|
+
img.onload = async () => {
|
|
336
|
+
try {
|
|
337
|
+
// Create a canvas and draw the image
|
|
338
|
+
const canvas = document.createElement('canvas');
|
|
339
|
+
canvas.width = img.width;
|
|
340
|
+
canvas.height = img.height;
|
|
341
|
+
const ctx = canvas.getContext('2d');
|
|
342
|
+
if (!ctx) {
|
|
343
|
+
throw new Error('Failed to get canvas context');
|
|
344
|
+
}
|
|
345
|
+
ctx.drawImage(img, 0, 0);
|
|
346
|
+
// Convert to ImageBitmap
|
|
347
|
+
const bitmap = await createImageBitmap(canvas);
|
|
348
|
+
// Return single frame with default duration
|
|
349
|
+
// This is a fallback - we can't get exact frame info without ImageDecoder
|
|
350
|
+
const frames = [
|
|
351
|
+
{
|
|
352
|
+
bitmap,
|
|
353
|
+
durationMs: 100 // Default 100ms per frame
|
|
354
|
+
}
|
|
355
|
+
];
|
|
356
|
+
if (onProgress) {
|
|
357
|
+
onProgress(1, 1);
|
|
358
|
+
}
|
|
359
|
+
resolve(frames);
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
reject(error);
|
|
363
|
+
}
|
|
364
|
+
};
|
|
365
|
+
img.onerror = () => {
|
|
366
|
+
reject(new Error(`Failed to load image: ${url}`));
|
|
367
|
+
};
|
|
368
|
+
img.src = url;
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Release resources from decoded frames
|
|
373
|
+
*/
|
|
374
|
+
function releaseFrames(frames) {
|
|
375
|
+
frames.forEach(frame => {
|
|
376
|
+
if (frame.bitmap && typeof frame.bitmap.close === 'function') {
|
|
377
|
+
frame.bitmap.close();
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
|
|
148
382
|
/**
|
|
149
383
|
* Utility functions
|
|
150
384
|
*/
|
|
@@ -258,6 +492,182 @@ function canvasToDataUrl(canvas) {
|
|
|
258
492
|
function isBrowser() {
|
|
259
493
|
return typeof window !== 'undefined' && typeof document !== 'undefined';
|
|
260
494
|
}
|
|
495
|
+
/**
|
|
496
|
+
* Normalize favicon links by removing duplicates
|
|
497
|
+
* Keeps only one canonical favicon link
|
|
498
|
+
*/
|
|
499
|
+
function normalizeLinks() {
|
|
500
|
+
const links = document.querySelectorAll('link[rel~="icon"]');
|
|
501
|
+
if (links.length <= 1)
|
|
502
|
+
return;
|
|
503
|
+
// Keep the first link, remove others
|
|
504
|
+
let kept = false;
|
|
505
|
+
links.forEach((link) => {
|
|
506
|
+
const linkEl = link;
|
|
507
|
+
if (!kept && !linkEl.href.startsWith('data:')) {
|
|
508
|
+
kept = true;
|
|
509
|
+
}
|
|
510
|
+
else if (kept || linkEl.href.startsWith('data:')) {
|
|
511
|
+
link.remove();
|
|
512
|
+
}
|
|
513
|
+
});
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* Animation loop manager for favicon frame playback
|
|
518
|
+
*/
|
|
519
|
+
/**
|
|
520
|
+
* Manages animation loop for favicon frames
|
|
521
|
+
*/
|
|
522
|
+
class AnimationLoop {
|
|
523
|
+
constructor(options) {
|
|
524
|
+
this.currentFrameIndex = 0;
|
|
525
|
+
this.currentLoop = 0;
|
|
526
|
+
this.isPlaying = false;
|
|
527
|
+
this.isPaused = false;
|
|
528
|
+
this.nextFrameTimeout = null;
|
|
529
|
+
this.frames = options.frames;
|
|
530
|
+
this.faviconSize = options.faviconSize;
|
|
531
|
+
this.badge = options.badge || null;
|
|
532
|
+
this.loopCount = options.loopCount || 0;
|
|
533
|
+
this.onFrameChange = options.onFrameChange || null;
|
|
534
|
+
this.onAnimationEnd = options.onAnimationEnd || null;
|
|
535
|
+
}
|
|
536
|
+
/**
|
|
537
|
+
* Start animation loop
|
|
538
|
+
*/
|
|
539
|
+
play() {
|
|
540
|
+
if (this.isPlaying)
|
|
541
|
+
return;
|
|
542
|
+
this.isPlaying = true;
|
|
543
|
+
this.isPaused = false;
|
|
544
|
+
this.currentFrameIndex = 0;
|
|
545
|
+
this.currentLoop = 0;
|
|
546
|
+
this.scheduleNextFrame();
|
|
547
|
+
}
|
|
548
|
+
/**
|
|
549
|
+
* Pause animation
|
|
550
|
+
*/
|
|
551
|
+
pause() {
|
|
552
|
+
if (!this.isPlaying)
|
|
553
|
+
return;
|
|
554
|
+
this.isPaused = true;
|
|
555
|
+
this.clearScheduledFrame();
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Resume animation
|
|
559
|
+
*/
|
|
560
|
+
resume() {
|
|
561
|
+
if (!this.isPaused)
|
|
562
|
+
return;
|
|
563
|
+
this.isPaused = false;
|
|
564
|
+
this.scheduleNextFrame();
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Stop animation and cleanup
|
|
568
|
+
*/
|
|
569
|
+
stop() {
|
|
570
|
+
this.isPlaying = false;
|
|
571
|
+
this.isPaused = false;
|
|
572
|
+
this.clearScheduledFrame();
|
|
573
|
+
this.currentFrameIndex = 0;
|
|
574
|
+
this.currentLoop = 0;
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Get current frame data URL
|
|
578
|
+
*/
|
|
579
|
+
getCurrentFrameDataUrl() {
|
|
580
|
+
if (this.currentFrameIndex >= this.frames.length) {
|
|
581
|
+
this.currentFrameIndex = 0;
|
|
582
|
+
}
|
|
583
|
+
const frame = this.frames[this.currentFrameIndex];
|
|
584
|
+
const canvas = createCanvas(this.faviconSize);
|
|
585
|
+
const ctx = canvas.getContext('2d');
|
|
586
|
+
if (!ctx) {
|
|
587
|
+
throw new Error('Failed to get canvas context');
|
|
588
|
+
}
|
|
589
|
+
// Draw the frame bitmap
|
|
590
|
+
ctx.drawImage(frame.bitmap, 0, 0, this.faviconSize, this.faviconSize);
|
|
591
|
+
// Draw badge if configured
|
|
592
|
+
if (this.badge) {
|
|
593
|
+
BadgeRenderer.drawBadge(ctx, this.badge, this.faviconSize);
|
|
594
|
+
}
|
|
595
|
+
return canvasToDataUrl(canvas);
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Schedule next frame
|
|
599
|
+
*/
|
|
600
|
+
scheduleNextFrame() {
|
|
601
|
+
if (!this.isPlaying || this.isPaused)
|
|
602
|
+
return;
|
|
603
|
+
// Check if animation should end
|
|
604
|
+
if (this.loopCount > 0 && this.currentLoop >= this.loopCount) {
|
|
605
|
+
this.stop();
|
|
606
|
+
if (this.onAnimationEnd) {
|
|
607
|
+
this.onAnimationEnd();
|
|
608
|
+
}
|
|
609
|
+
return;
|
|
610
|
+
}
|
|
611
|
+
const frame = this.frames[this.currentFrameIndex];
|
|
612
|
+
const duration = frame.durationMs;
|
|
613
|
+
// Notify frame change
|
|
614
|
+
if (this.onFrameChange) {
|
|
615
|
+
this.onFrameChange(this.currentFrameIndex);
|
|
616
|
+
}
|
|
617
|
+
// Schedule next frame
|
|
618
|
+
this.nextFrameTimeout = window.setTimeout(() => {
|
|
619
|
+
this.currentFrameIndex++;
|
|
620
|
+
// Check if we've reached the end of frames
|
|
621
|
+
if (this.currentFrameIndex >= this.frames.length) {
|
|
622
|
+
this.currentFrameIndex = 0;
|
|
623
|
+
this.currentLoop++;
|
|
624
|
+
// Check loop count
|
|
625
|
+
if (this.loopCount > 0 && this.currentLoop >= this.loopCount) {
|
|
626
|
+
this.stop();
|
|
627
|
+
if (this.onAnimationEnd) {
|
|
628
|
+
this.onAnimationEnd();
|
|
629
|
+
}
|
|
630
|
+
return;
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
// Schedule next frame
|
|
634
|
+
this.scheduleNextFrame();
|
|
635
|
+
}, duration);
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Clear scheduled frame timeout
|
|
639
|
+
*/
|
|
640
|
+
clearScheduledFrame() {
|
|
641
|
+
if (this.nextFrameTimeout !== null) {
|
|
642
|
+
clearTimeout(this.nextFrameTimeout);
|
|
643
|
+
this.nextFrameTimeout = null;
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
/**
|
|
647
|
+
* Check if animation is playing
|
|
648
|
+
*/
|
|
649
|
+
getIsPlaying() {
|
|
650
|
+
return this.isPlaying && !this.isPaused;
|
|
651
|
+
}
|
|
652
|
+
/**
|
|
653
|
+
* Get current frame index
|
|
654
|
+
*/
|
|
655
|
+
getCurrentFrameIndex() {
|
|
656
|
+
return this.currentFrameIndex;
|
|
657
|
+
}
|
|
658
|
+
/**
|
|
659
|
+
* Get total frames
|
|
660
|
+
*/
|
|
661
|
+
getFrameCount() {
|
|
662
|
+
return this.frames.length;
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* Cleanup resources
|
|
666
|
+
*/
|
|
667
|
+
destroy() {
|
|
668
|
+
this.stop();
|
|
669
|
+
}
|
|
670
|
+
}
|
|
261
671
|
|
|
262
672
|
/**
|
|
263
673
|
* Main FaviconAnimator class
|
|
@@ -272,12 +682,19 @@ class FaviconAnimator {
|
|
|
272
682
|
this.unsubscribeVisibility = null;
|
|
273
683
|
this.faviconSize = 32;
|
|
274
684
|
this.updateInterval = 100;
|
|
685
|
+
this.enableAnimation = true;
|
|
686
|
+
this.animationLoop = null;
|
|
687
|
+
this.decodedFrames = [];
|
|
688
|
+
this.animationFrameId = null;
|
|
275
689
|
if (!isBrowser()) {
|
|
276
690
|
throw new Error('FaviconAnimator can only be used in browser environment');
|
|
277
691
|
}
|
|
278
692
|
this.faviconLink = getFaviconLink();
|
|
279
693
|
this.pauseOnHidden = options.pauseOnHidden !== false;
|
|
280
694
|
this.updateInterval = options.updateInterval || 100;
|
|
695
|
+
this.enableAnimation = options.enableAnimation !== false;
|
|
696
|
+
// Normalize favicon links (remove duplicates)
|
|
697
|
+
normalizeLinks();
|
|
281
698
|
// Setup visibility manager
|
|
282
699
|
if (this.pauseOnHidden) {
|
|
283
700
|
const visibilityManager = getVisibilityManager();
|
|
@@ -310,20 +727,36 @@ class FaviconAnimator {
|
|
|
310
727
|
const faviconConfig = typeof config === 'string'
|
|
311
728
|
? { url: config }
|
|
312
729
|
: config;
|
|
313
|
-
const { url, size = 32 } = faviconConfig;
|
|
730
|
+
const { url, size = 32, animate = true, corsMode = 'cors', loopCount = 0 } = faviconConfig;
|
|
314
731
|
this.faviconSize = size;
|
|
315
732
|
try {
|
|
733
|
+
// Stop any existing animation
|
|
734
|
+
this.stopAnimation();
|
|
316
735
|
// Detect format
|
|
317
736
|
const format = detectImageFormat(url);
|
|
737
|
+
const isAnimated = format === 'gif' || format === 'webp';
|
|
318
738
|
// Create favicon data
|
|
319
739
|
this.currentFavicon = {
|
|
320
740
|
url,
|
|
321
741
|
size,
|
|
322
|
-
isAnimated
|
|
742
|
+
isAnimated,
|
|
323
743
|
format
|
|
324
744
|
};
|
|
325
|
-
//
|
|
326
|
-
|
|
745
|
+
// Try to decode and animate if enabled
|
|
746
|
+
if (isAnimated && animate && this.enableAnimation) {
|
|
747
|
+
try {
|
|
748
|
+
await this.startAnimation(url, corsMode, loopCount);
|
|
749
|
+
}
|
|
750
|
+
catch (error) {
|
|
751
|
+
console.warn('Animation failed, falling back to static image:', error);
|
|
752
|
+
// Fallback to static image
|
|
753
|
+
await this.updateFaviconDisplay();
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
else {
|
|
757
|
+
// Static favicon
|
|
758
|
+
await this.updateFaviconDisplay();
|
|
759
|
+
}
|
|
327
760
|
}
|
|
328
761
|
catch (error) {
|
|
329
762
|
console.error('Error setting favicon:', error);
|
|
@@ -333,13 +766,8 @@ class FaviconAnimator {
|
|
|
333
766
|
* Set badge
|
|
334
767
|
*/
|
|
335
768
|
setBadge(config) {
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
this.updateFaviconDisplay();
|
|
339
|
-
}
|
|
340
|
-
catch (error) {
|
|
341
|
-
console.error('Error setting badge:', error);
|
|
342
|
-
}
|
|
769
|
+
this.currentBadge = BadgeRenderer.validateConfig(config);
|
|
770
|
+
this.updateFaviconDisplay();
|
|
343
771
|
}
|
|
344
772
|
/**
|
|
345
773
|
* Update badge
|
|
@@ -359,6 +787,75 @@ class FaviconAnimator {
|
|
|
359
787
|
this.currentBadge = null;
|
|
360
788
|
this.updateFaviconDisplay();
|
|
361
789
|
}
|
|
790
|
+
/**
|
|
791
|
+
* Start animation for GIF/WebP
|
|
792
|
+
*/
|
|
793
|
+
async startAnimation(url, corsMode, loopCount) {
|
|
794
|
+
try {
|
|
795
|
+
// Decode frames
|
|
796
|
+
this.decodedFrames = await decodeImageFrames(url, { corsMode });
|
|
797
|
+
if (this.decodedFrames.length <= 1) {
|
|
798
|
+
// Not animated or single frame
|
|
799
|
+
await this.updateFaviconDisplay();
|
|
800
|
+
return;
|
|
801
|
+
}
|
|
802
|
+
// Create animation loop
|
|
803
|
+
this.animationLoop = new AnimationLoop({
|
|
804
|
+
frames: this.decodedFrames,
|
|
805
|
+
faviconSize: this.faviconSize,
|
|
806
|
+
badge: this.currentBadge,
|
|
807
|
+
loopCount,
|
|
808
|
+
onFrameChange: (frameIndex) => {
|
|
809
|
+
this.updateAnimationFrame();
|
|
810
|
+
},
|
|
811
|
+
onAnimationEnd: () => {
|
|
812
|
+
this.isAnimating = false;
|
|
813
|
+
}
|
|
814
|
+
});
|
|
815
|
+
// Start animation if visible
|
|
816
|
+
if (this.isVisible) {
|
|
817
|
+
this.animationLoop.play();
|
|
818
|
+
this.isAnimating = true;
|
|
819
|
+
this.updateAnimationFrame();
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
catch (error) {
|
|
823
|
+
console.error('Failed to start animation:', error);
|
|
824
|
+
throw error;
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Stop animation and cleanup
|
|
829
|
+
*/
|
|
830
|
+
stopAnimation() {
|
|
831
|
+
if (this.animationFrameId !== null) {
|
|
832
|
+
cancelAnimationFrame(this.animationFrameId);
|
|
833
|
+
this.animationFrameId = null;
|
|
834
|
+
}
|
|
835
|
+
if (this.animationLoop) {
|
|
836
|
+
this.animationLoop.destroy();
|
|
837
|
+
this.animationLoop = null;
|
|
838
|
+
}
|
|
839
|
+
if (this.decodedFrames.length > 0) {
|
|
840
|
+
releaseFrames(this.decodedFrames);
|
|
841
|
+
this.decodedFrames = [];
|
|
842
|
+
}
|
|
843
|
+
this.isAnimating = false;
|
|
844
|
+
}
|
|
845
|
+
/**
|
|
846
|
+
* Update animation frame on favicon
|
|
847
|
+
*/
|
|
848
|
+
updateAnimationFrame() {
|
|
849
|
+
if (!this.animationLoop)
|
|
850
|
+
return;
|
|
851
|
+
try {
|
|
852
|
+
const dataUrl = this.animationLoop.getCurrentFrameDataUrl();
|
|
853
|
+
this.faviconLink.href = dataUrl;
|
|
854
|
+
}
|
|
855
|
+
catch (error) {
|
|
856
|
+
console.error('Error updating animation frame:', error);
|
|
857
|
+
}
|
|
858
|
+
}
|
|
362
859
|
/**
|
|
363
860
|
* Update favicon display (with badge if configured)
|
|
364
861
|
*/
|
|
@@ -393,13 +890,17 @@ class FaviconAnimator {
|
|
|
393
890
|
* Pause animation
|
|
394
891
|
*/
|
|
395
892
|
pause() {
|
|
893
|
+
if (this.animationLoop) {
|
|
894
|
+
this.animationLoop.pause();
|
|
895
|
+
}
|
|
396
896
|
this.isAnimating = false;
|
|
397
897
|
}
|
|
398
898
|
/**
|
|
399
899
|
* Resume animation
|
|
400
900
|
*/
|
|
401
901
|
resume() {
|
|
402
|
-
if (this.isVisible) {
|
|
902
|
+
if (this.isVisible && this.animationLoop) {
|
|
903
|
+
this.animationLoop.resume();
|
|
403
904
|
this.isAnimating = true;
|
|
404
905
|
}
|
|
405
906
|
}
|
|
@@ -425,6 +926,7 @@ class FaviconAnimator {
|
|
|
425
926
|
* Cleanup
|
|
426
927
|
*/
|
|
427
928
|
destroy() {
|
|
929
|
+
this.stopAnimation();
|
|
428
930
|
this.pause();
|
|
429
931
|
if (this.unsubscribeVisibility) {
|
|
430
932
|
this.unsubscribeVisibility();
|
|
@@ -432,5 +934,5 @@ class FaviconAnimator {
|
|
|
432
934
|
}
|
|
433
935
|
}
|
|
434
936
|
|
|
435
|
-
export { BadgeRenderer, FaviconAnimator, VisibilityManager, canvasToDataUrl, createCanvas, debounce, detectImageFormat, getFaviconLink, getVisibilityManager, isBrowser, loadImage, supportsPageVisibility, throttle };
|
|
937
|
+
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
938
|
//# 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":"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"}
|
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"}
|