@applemusic-like-lyrics/core 0.2.0-alpha.4 → 0.2.0-alpha.5

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.
@@ -0,0 +1,6 @@
1
+ import { ControlPointPreset } from './cp-presets.ts';
2
+ export declare function generateControlPoints(width: number, height: number, variationFraction?: number, // = 0.2,
3
+ normalOffset?: number, // = 0.3,
4
+ blendFactor?: number, smoothIters?: number, // = 3,
5
+ smoothFactor?: number, // = 0.3,
6
+ smoothModifier?: number): ControlPointPreset;
@@ -1,17 +1 @@
1
- interface ControlPointConf {
2
- cx: number;
3
- cy: number;
4
- x: number;
5
- y: number;
6
- ur: number;
7
- vr: number;
8
- up: number;
9
- vp: number;
10
- }
11
- interface ControlPointPreset {
12
- width: number;
13
- height: number;
14
- conf: ControlPointConf[];
15
- }
16
- export declare const CONTROL_POINT_PRESETS: readonly [ControlPointPreset, ControlPointPreset, ControlPointPreset, ControlPointPreset, ControlPointPreset, ControlPointPreset];
17
- export {};
1
+ export declare const CONTROL_POINT_PRESETS: readonly [ControlPointPreset, ControlPointPreset, ControlPointPreset, ControlPointPreset];
@@ -25,6 +25,7 @@ export declare class MeshGradientRenderer extends BaseRenderer {
25
25
  private gl;
26
26
  private lastFrameTime;
27
27
  private frameTime;
28
+ private currentImageData?;
28
29
  private lastTickTime;
29
30
  private volume;
30
31
  private tickHandle;
@@ -36,6 +37,7 @@ export declare class MeshGradientRenderer extends BaseRenderer {
36
37
  private reduceImageSizeCanvas;
37
38
  private targetSize;
38
39
  private currentSize;
40
+ private isNoCover;
39
41
  private meshStates;
40
42
  private _disposed;
41
43
  setManualControl(enable: boolean): void;
@@ -55,7 +57,7 @@ export declare class MeshGradientRenderer extends BaseRenderer {
55
57
  setFPS(fps: number): void;
56
58
  pause(): void;
57
59
  resume(): void;
58
- setAlbum(albumSource: string | HTMLImageElement | HTMLVideoElement, isVideo?: boolean): Promise<void>;
60
+ setAlbum(albumSource?: string | HTMLImageElement | HTMLVideoElement, isVideo?: boolean): Promise<void>;
59
61
  setLowFreqVolume(volume: number): void;
60
62
  setHasLyric(_hasLyric: boolean): void;
61
63
  dispose(): void;
@@ -16,7 +16,7 @@ export declare class PixiRenderer extends BaseRenderer {
16
16
  resume(): void;
17
17
  setLowFreqVolume(_volume: number): void;
18
18
  setHasLyric(_hasLyric: boolean): void;
19
- setAlbum(albumSource: string | HTMLImageElement | HTMLVideoElement, isVideo?: boolean): Promise<void>;
19
+ setAlbum(albumSource?: string | HTMLImageElement | HTMLVideoElement, isVideo?: boolean): Promise<void>;
20
20
  dispose(): void;
21
21
  getElement(): HTMLElement;
22
22
  }
@@ -8,7 +8,6 @@ import { InterludeDots } from './dom/interlude-dots.ts';
8
8
  export declare abstract class LyricPlayerBase extends EventTarget implements HasElement, Disposable {
9
9
  protected element: HTMLElement;
10
10
  protected currentTime: number;
11
- protected lyricLinesSize: WeakMap<LyricLineBase, [number, number]>;
12
11
  protected currentLyricLines: LyricLine[];
13
12
  protected processedLines: LyricLine[];
14
13
  protected lyricLinesIndexes: WeakMap<LyricLineBase, number>;
@@ -43,7 +42,6 @@ export declare abstract class LyricPlayerBase extends EventTarget implements Has
43
42
  private onPageHide;
44
43
  private scrolledHandler;
45
44
  protected isScrolled: boolean;
46
- resizeObserver: ResizeObserver;
47
45
  protected wordFadeWidth: number;
48
46
  protected targetAlignIndex: number;
49
47
  constructor();
@@ -159,7 +157,7 @@ export declare abstract class LyricPlayerBase extends EventTarget implements Has
159
157
  * @param force 是否不经过动画直接修改布局定位
160
158
  * @param reflow 是否进行重新布局(重新计算每行歌词大小)
161
159
  */
162
- calcLayout(force?: boolean, reflow?: boolean): Promise<void>;
160
+ calcLayout(sync?: boolean): Promise<void>;
163
161
  /**
164
162
  * 设置所有歌词行在横坐标上的弹簧属性,包括重量、弹力和阻力。
165
163
  *
@@ -179,8 +177,9 @@ export declare abstract class LyricPlayerBase extends EventTarget implements Has
179
177
  * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样
180
178
  */
181
179
  setLineScaleSpringParams(params?: Partial<SpringParams>): void;
180
+ protected isPlaying: boolean;
182
181
  /**
183
- * 暂停部分效果演出,目前会暂停播放间奏点的动画
182
+ * 暂停部分效果演出,目前会暂停播放间奏点的动画,且将背景歌词显示出来
184
183
  */
185
184
  pause(): void;
186
185
  /**
@@ -7,7 +7,7 @@ export declare class BottomLineEl implements HasElement, Disposable {
7
7
  private left;
8
8
  private top;
9
9
  private delay;
10
- lineSize: number[];
10
+ lineSize: [number, number];
11
11
  readonly lineTransforms: {
12
12
  posX: Spring;
13
13
  posY: Spring;
@@ -1,5 +1,5 @@
1
1
  import { LyricLine } from '../../interfaces.ts';
2
- import { LyricPlayerBase } from '../base.ts';
2
+ import { LyricLineBase, LyricPlayerBase } from '../base.ts';
3
3
  import { LyricLineEl } from './lyric-line.ts';
4
4
  /**
5
5
  * 歌词行鼠标相关事件,可以获取到歌词行的索引和歌词行元素
@@ -12,7 +12,7 @@ export declare class LyricLineMouseEvent extends MouseEvent {
12
12
  /**
13
13
  * 歌词行元素
14
14
  */
15
- readonly line: LyricLineEl;
15
+ readonly line: LyricLineBase;
16
16
  constructor(
17
17
  /**
18
18
  * 歌词行索引
@@ -21,7 +21,7 @@ export declare class LyricLineMouseEvent extends MouseEvent {
21
21
  /**
22
22
  * 歌词行元素
23
23
  */
24
- line: LyricLineEl, event: MouseEvent);
24
+ line: LyricLineBase, event: MouseEvent);
25
25
  }
26
26
  export type LyricLineMouseEventListener = (evt: LyricLineMouseEvent) => void;
27
27
  /**
@@ -31,7 +31,6 @@ export type LyricLineMouseEventListener = (evt: LyricLineMouseEvent) => void;
31
31
  */
32
32
  export declare class DomLyricPlayer extends LyricPlayerBase {
33
33
  currentLyricLineObjects: LyricLineEl[];
34
- private debounceCalcLayout;
35
34
  onResize(): void;
36
35
  readonly supportPlusLighter: boolean;
37
36
  readonly supportMaskImage: boolean;
@@ -12,8 +12,8 @@ interface RealWord extends LyricWord {
12
12
  shouldEmphasize: boolean;
13
13
  }
14
14
  export declare class RawLyricLineMouseEvent extends MouseEvent {
15
- readonly line: LyricLineEl;
16
- constructor(line: LyricLineEl, event: MouseEvent);
15
+ readonly line: LyricLineBase;
16
+ constructor(line: LyricLineBase, event: MouseEvent);
17
17
  }
18
18
  type MouseEventMap = {
19
19
  [evt in keyof HTMLElementEventMap]: HTMLElementEventMap[evt] extends MouseEvent ? evt : never;
@@ -39,9 +39,6 @@ export declare class LyricLineEl extends LyricLineBase {
39
39
  resume(): Promise<void>;
40
40
  pause(): Promise<void>;
41
41
  setMaskAnimationState(maskAnimationTime?: number): void;
42
- private measureLockMark;
43
- private measureLock;
44
- measureSize(): Promise<[number, number]>;
45
42
  getLine(): LyricLine;
46
43
  private _hide;
47
44
  private _prevParentEl;
@@ -53,12 +50,8 @@ export declare class LyricLineEl extends LyricLineBase {
53
50
  private initFloatAnimation;
54
51
  private initEmphasizeAnimation;
55
52
  private get totalDuration();
56
- private maskImageDirty;
57
- private markImageDirtyPromiseResolve;
58
- private markImageDirtyPromise;
59
- markMaskImageDirty(_debugReason?: string): Promise<void>;
60
- waitMaskImageUpdated(): Promise<void>;
61
- updateMaskImage(): Promise<void>;
53
+ onLineSizeChange(size: [number, number]): void;
54
+ updateMaskImageSync(): void;
62
55
  private generateCalcBasedMaskImage;
63
56
  private generateWebAnimationBasedMaskImage;
64
57
  getElement(): HTMLElement;
@@ -41,7 +41,6 @@ export declare class LyricLineEl extends LyricLineBase {
41
41
  setMaskAnimationState(maskAnimationTime?: number): void;
42
42
  private measureLockMark;
43
43
  private measureLock;
44
- measureSize(): Promise<[number, number]>;
45
44
  getLine(): LyricLine;
46
45
  private _prevParentEl;
47
46
  private lastStyle;
@@ -3,7 +3,8 @@ export { LyricPlayerBase } from './base.ts';
3
3
  export * from './canvas/index.ts';
4
4
  export * from './dom-slim/index.ts';
5
5
  export * from './dom/index.ts';
6
+ export {
6
7
  /**
7
8
  * 默认导出的歌词播放组件
8
9
  */
9
- export declare const LyricPlayer: typeof DomLyricPlayer;
10
+ DomLyricPlayer as LyricPlayer, };
@@ -0,0 +1,17 @@
1
+ export declare class FlagSets {
2
+ private flags;
3
+ private _size;
4
+ get size(): number;
5
+ [Symbol.iterator](): {
6
+ next: () => {
7
+ value: number;
8
+ done: boolean;
9
+ } | {
10
+ value: undefined;
11
+ done: boolean;
12
+ };
13
+ };
14
+ add(flag: number): void;
15
+ delete(flag: number): void;
16
+ has(flag: number): boolean;
17
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applemusic-like-lyrics/core",
3
- "version": "0.2.0-alpha.4",
3
+ "version": "0.2.0-alpha.5",
4
4
  "description": "AMLL 的纯 JS 核心组件框架,包括歌词显示组件和背景组件等其它可以复用的组件",
5
5
  "repository": {
6
6
  "url": "https://github.com/Steve-xmh/applemusic-like-lyrics.git",
@@ -26,8 +26,8 @@
26
26
  "require": "./dist/amll-core.cjs"
27
27
  },
28
28
  "./style.css": {
29
- "import": "./dist/style.css",
30
- "require": "./dist/style.css"
29
+ "import": "./dist/amll-core.css",
30
+ "require": "./dist/amll-core.css"
31
31
  }
32
32
  },
33
33
  "devDependencies": {
@@ -36,16 +36,16 @@
36
36
  "@types/deep-freeze": "^0.1.5",
37
37
  "@types/stats.js": "^0.17.3",
38
38
  "@types/ungap__structured-clone": "^1.2.0",
39
- "lil-gui": "^0.19.2",
39
+ "lil-gui": "^0.20.0",
40
40
  "stats.js": "^0.17.0",
41
- "typedoc": "^0.26.10",
42
- "typedoc-plugin-markdown": "^4.2.9",
43
- "typescript": "^5.6.3",
44
- "vite": "^5.4.10",
45
- "vite-plugin-dts": "^4.3.0",
46
- "vite-plugin-glsl": "^1.3.0",
47
- "vite-plugin-top-level-await": "^1.4.4",
48
- "vite-plugin-wasm": "^3.3.0",
41
+ "typedoc": "^0.28.1",
42
+ "typedoc-plugin-markdown": "^4.6.0",
43
+ "typescript": "^5.8.2",
44
+ "vite": "^6.2.3",
45
+ "vite-plugin-dts": "^4.5.3",
46
+ "vite-plugin-glsl": "^1.3.3",
47
+ "vite-plugin-top-level-await": "^1.5.0",
48
+ "vite-plugin-wasm": "^3.4.1",
49
49
  "@applemusic-like-lyrics/ttml": "^0.1.1"
50
50
  },
51
51
  "peerDependencies": {
@@ -58,7 +58,7 @@
58
58
  "@pixi/sprite": "*"
59
59
  },
60
60
  "dependencies": {
61
- "@ungap/structured-clone": "^1.2.0",
61
+ "@ungap/structured-clone": "^1.3.0",
62
62
  "bezier-easing": "^2.1.0",
63
63
  "deep-freeze": "^0.0.1",
64
64
  "gl-matrix": "4.0.0-beta.2"
package/dist/style.css DELETED
@@ -1 +0,0 @@
1
- .amll-lyric-player{color:var(--amll-lp-color,white);contain:strict;mix-blend-mode:plus-lighter;font-size:var(--amll-lp-font-size,max(max(4.7vh,3.2vw),12px));width:100%;max-width:100%;height:100%;overflow:hidden}.amll-lyric-player.dom{--amll-lp-line-width-aspect:.8;--amll-lp-line-padding-x:1em;--amll-lp-bg-line-scale:.7;-webkit-user-select:none;user-select:none;box-sizing:content-box;z-index:1;line-height:1.2em}.amll-lyric-player.dom-slim{--amll-lp-line-width-aspect:.8;--amll-lp-line-padding-x:1em;--amll-lp-bg-line-scale:.7;-webkit-user-select:none;user-select:none;box-sizing:content-box;z-index:1;min-width:0;min-height:0;line-height:1.2em;overflow:hidden auto}.amll-lyric-player.dom-slim::-webkit-scrollbar{display:none}.amll-lyric-player.dom-slim:hover::-webkit-scrollbar{display:block}@media screen and (max-width:768px){.amll-lyric-player{--amll-lp-line-width-aspect:1;--amll-lp-line-padding-x:0}}._lyricLine_lennj_6{-webkit-backface-visibility:hidden;backface-visibility:hidden;transform-origin:0;width:var(--amll-lp-width,100%);min-width:var(--amll-lp-width,100%);max-width:var(--amll-lp-width,100%);contain:content;will-change:transform;box-sizing:border-box;border-radius:.25em;width:100%;height:-moz-fit-content;height:fit-content;padding:2vh 1em;transition:opacity .25s,filter .2s,background-color .25s,box-shadow .25s;position:absolute}._lyricLine_lennj_6._dirty_lennj_26{opacity:0;visibility:hidden}._lyricLine_lennj_6:has(>*):hover{background-color:var(--amll-lp-hover-bg-color,#fff1)}._lyricLine_lennj_6:has(>*):active{background-color:var(--amll-lp-hover-bg-color,#ffffff05)}._lyricBgLine_lennj_42{opacity:0;font-size:max(calc(1em*var(--amll-lp-bg-line-scale,.7)),10px);padding:1vh calc(var(--amll-lp-line-padding-x,1em)/var(--amll-lp-bg-line-scale,.7));transition:opacity .25s,scale .5s,filter .2s,background-color .25s,box-shadow .25s}._lyricBgLine_lennj_42._active_lennj_51{opacity:.4;transition:opacity .5s .25s,scale 1.5s cubic-bezier(0,1,0,1) .25s,filter .2s,background-color .25s,box-shadow .25s}.amll-lyric-player:hover ._lyricLine_lennj_6{filter:unset!important}.amll-lyric-player._hasDuetLine_lennj_63 ._lyricLine_lennj_6:not(._lyricDuetLine_lennj_64){padding-right:15%}.amll-lyric-player._hasDuetLine_lennj_63 ._lyricDuetLine_lennj_64{padding-left:15%}._lyricDuetLine_lennj_64{text-align:right;transform-origin:100%}._lyricMainLine_lennj_78{margin:-1em;padding:1em;transition:opacity .3s .1s}._lyricMainLine_lennj_78 span{display:inline-block}._lyricMainLine_lennj_78>span{white-space:pre-wrap;will-change:transform;margin:-1em;padding:1em;display:inline-block}._lyricMainLine_lennj_78>span._emphasize_lennj_88{-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_lennj_78>span._emphasize_lennj_88>span{will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_lennj_78>span span._emphasize_lennj_88{-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_lennj_78>span span._emphasize_lennj_88>span{will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_lennj_78 span._emphasizeWrapper_lennj_88{white-space:pre-wrap;will-change:transform;margin:-1em;padding:1em;display:inline-block}._lyricMainLine_lennj_78 span._emphasizeWrapper_lennj_88._emphasize_lennj_88{-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_lennj_78 span._emphasizeWrapper_lennj_88._emphasize_lennj_88>span{will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_lennj_78 span._emphasizeWrapper_lennj_88 span._emphasize_lennj_88{-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_lennj_78 span._emphasizeWrapper_lennj_88 span._emphasize_lennj_88>span{will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricSubLine_lennj_111{opacity:.3;font-size:max(.5em,10px);line-height:1.5em;transition:opacity .2s .25s}._disableSpring_lennj_118>*{transition:filter .25s,transform .5s,background-color .25s,box-shadow .25s}._interludeDots_lennj_123{transform-origin:50%;opacity:0;gap:.25em;width:-moz-fit-content;width:fit-content;height:max(.5em,min(1vh,3em));padding:2.5% .75em;transition:opacity .25s;display:flex;position:absolute;left:0}._interludeDots_lennj_123._enabled_lennj_135{opacity:1}._interludeDots_lennj_123>*{aspect-ratio:1;background-color:var(--amll-lp-color,white);border-radius:50%;width:max(.5em,min(1vh,3em));height:max(.5em,min(1vh,3em));margin-right:4px;display:inline-block}._interludeDots_lennj_123._duet_lennj_149{transform-origin:50%;right:0}@supports (mix-blend-mode:plus-lighter){._lyricSubLine_lennj_111{opacity:.3}}._tmpDisableTransition_lennj_161{transition:none!important}._lyricLine_1ygrf_6{width:var(--amll-lp-width,100%);min-width:var(--amll-lp-width,100%);max-width:var(--amll-lp-width,100%);contain:content;box-sizing:border-box;border-radius:.25em;width:100%;height:-moz-fit-content;height:fit-content;padding:2vh 1em;transition:opacity .25s,filter .2s,background-color .25s,box-shadow .25s}._lyricLine_1ygrf_6:has(>*):hover{background-color:var(--amll-lp-hover-bg-color,#fff1)}._lyricLine_1ygrf_6:has(>*):active{background-color:var(--amll-lp-hover-bg-color,#ffffff05)}._lyricBgLine_1ygrf_33{opacity:0;font-size:max(calc(1em*var(--amll-lp-bg-line-scale,.7)),10px);padding:1vh calc(var(--amll-lp-line-padding-x,1em)/var(--amll-lp-bg-line-scale,.7));transition:opacity .25s,scale .5s,filter .2s,background-color .25s,box-shadow .25s}._lyricBgLine_1ygrf_33._active_1ygrf_42{opacity:.4;transition:opacity .5s .25s,scale 1.5s cubic-bezier(0,1,0,1) .25s,filter .2s,background-color .25s,box-shadow .25s}.amll-lyric-player:hover ._lyricLine_1ygrf_6{filter:unset!important}.amll-lyric-player._hasDuetLine_1ygrf_54 ._lyricLine_1ygrf_6:not(._lyricDuetLine_1ygrf_55){padding-right:15%}.amll-lyric-player._hasDuetLine_1ygrf_54 ._lyricDuetLine_1ygrf_55{padding-left:15%}._lyricDuetLine_1ygrf_55{text-align:right;transform-origin:100%}._lyricMainLine_1ygrf_69{contain:content paint;transition:opacity .3s .1s}._lyricMainLine_1ygrf_69 span{white-space:pre;display:inline-block}._lyricSubLine_1ygrf_79{opacity:.3;font-size:max(.5em,10px);line-height:1.5em;transition:opacity .2s .25s}._interludeDots_1ygrf_86{transform-origin:50%;opacity:0;gap:.25em;width:-moz-fit-content;width:fit-content;height:max(.5em,min(1vh,3em));padding:2.5% .75em;transition:opacity .25s;display:flex;left:0}._interludeDots_1ygrf_86._enabled_1ygrf_97{opacity:1}._interludeDots_1ygrf_86>*{aspect-ratio:1;background-color:var(--amll-lp-color,white);border-radius:50%;width:max(.5em,min(1vh,3em));height:max(.5em,min(1vh,3em));margin-right:4px;display:inline-block}._interludeDots_1ygrf_86._duet_1ygrf_111{transform-origin:50%;right:0}@supports (mix-blend-mode:plus-lighter){._lyricSubLine_1ygrf_79{opacity:.3}}._tmpDisableTransition_1ygrf_123{transition:none!important}