@applemusic-like-lyrics/core 0.2.0-alpha.3 → 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.
Files changed (34) hide show
  1. package/LICENSE +661 -661
  2. package/README.md +46 -46
  3. package/dist/amll-core.css +1 -0
  4. package/dist/amll-core.js +2866 -1982
  5. package/dist/amll-core.js.map +1 -1
  6. package/dist/bg-render/base.d.ts +1 -1
  7. package/dist/bg-render/index.d.ts +4 -4
  8. package/dist/bg-render/mesh-renderer/cp-generate.d.ts +6 -0
  9. package/dist/bg-render/mesh-renderer/cp-presets.d.ts +1 -17
  10. package/dist/bg-render/mesh-renderer/index.d.ts +4 -6
  11. package/dist/bg-render/pixi-renderer.d.ts +1 -1
  12. package/dist/canvas-test.d.ts +1 -0
  13. package/dist/index.d.ts +4 -4
  14. package/dist/interfaces.d.ts +2 -0
  15. package/dist/lyric-player/base.d.ts +229 -0
  16. package/dist/lyric-player/{dom/bottom-line.d.ts → bottom-line.d.ts} +7 -7
  17. package/dist/lyric-player/canvas/index.d.ts +11 -0
  18. package/dist/lyric-player/canvas/lyric-line.d.ts +23 -0
  19. package/dist/lyric-player/canvas/text-layout.d.ts +39 -0
  20. package/dist/lyric-player/dom/index.d.ts +9 -218
  21. package/dist/lyric-player/dom/interlude-dots.d.ts +1 -1
  22. package/dist/lyric-player/dom/lyric-line.d.ts +14 -31
  23. package/dist/lyric-player/dom-slim/index.d.ts +33 -0
  24. package/dist/lyric-player/dom-slim/interlude-dots.d.ts +22 -0
  25. package/dist/lyric-player/dom-slim/lyric-line.d.ts +70 -0
  26. package/dist/lyric-player/index.d.ts +10 -9
  27. package/dist/utils/flagsets.d.ts +17 -0
  28. package/dist/utils/is-cjk.d.ts +1 -0
  29. package/dist/utils/lyric-split-words.d.ts +11 -0
  30. package/dist/utils/mutex.d.ts +2 -0
  31. package/dist/utils/wa-spring.d.ts +1 -1
  32. package/package.json +16 -16
  33. package/dist/lyric-player/layouter.d.ts +0 -2
  34. package/dist/style.css +0 -1
@@ -1,6 +1,6 @@
1
- import { Disposable, HasElement, LyricLine } from '../../interfaces';
2
- import { SpringParams } from '../../utils/spring';
3
- import { LyricLineEl } from './lyric-line';
1
+ import { LyricLine } from '../../interfaces.ts';
2
+ import { LyricLineBase, LyricPlayerBase } from '../base.ts';
3
+ import { LyricLineEl } from './lyric-line.ts';
4
4
  /**
5
5
  * 歌词行鼠标相关事件,可以获取到歌词行的索引和歌词行元素
6
6
  */
@@ -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
  /**
@@ -29,125 +29,17 @@ export type LyricLineMouseEventListener = (evt: LyricLineMouseEvent) => void;
29
29
  *
30
30
  * 尽可能贴切 Apple Music for iPad 的歌词效果设计,且做了力所能及的优化措施
31
31
  */
32
- export declare class LyricPlayer extends EventTarget implements HasElement, Disposable {
33
- private element;
34
- private currentTime;
35
- private lastCurrentTime;
36
- private lyricLines;
37
- private processedLines;
38
- private lyricLinesEl;
39
- private lyricLinesSize;
40
- private lyricLinesIndexes;
41
- private hotLines;
42
- private bufferedLines;
43
- private scrollToIndex;
44
- private _wordFadeWidth;
45
- private allowScroll;
46
- private scrolledHandler;
47
- private isScrolled;
48
- private isSeeking;
49
- private initializeSeeking;
50
- private invokedByScrollEvent;
51
- private scrollOffset;
52
- private hidePassedLines;
53
- private debounceCalcLayout;
54
- private resizeObserver;
55
- private posXSpringParams;
56
- private posYSpringParams;
57
- private scaleSpringParams;
58
- private scaleForBGSpringParams;
59
- private enableBlur;
60
- private enableScale;
61
- private interludeDots;
62
- private interludeDotsSize;
63
- private bottomLine;
32
+ export declare class DomLyricPlayer extends LyricPlayerBase {
33
+ currentLyricLineObjects: LyricLineEl[];
34
+ onResize(): void;
64
35
  readonly supportPlusLighter: boolean;
65
36
  readonly supportMaskImage: boolean;
66
- private disableSpring;
67
- private alignAnchor;
68
- private alignPosition;
69
- private isNonDynamic;
70
- private isNonDuet;
71
- private scrollBoundary;
72
- readonly size: [number, number];
73
37
  readonly innerSize: [number, number];
74
38
  private readonly onLineClickedHandler;
75
- setIsSeeking(isSeeking: boolean): void;
76
- /**
77
- * 设置是否使用物理弹簧算法实现歌词动画效果,默认启用
78
- *
79
- * 如果启用,则会通过弹簧算法实时处理歌词位置,但是需要性能足够强劲的电脑方可流畅运行
80
- *
81
- * 如果不启用,则会回退到基于 `transition` 的过渡效果,对低性能的机器比较友好,但是效果会比较单一
82
- */
83
- setEnableSpring(enable?: boolean): void;
84
- /**
85
- * 获取当前是否启用了物理弹簧
86
- * @returns 是否启用物理弹簧
87
- */
88
- getEnableSpring(): boolean;
89
- /**
90
- * 是否启用歌词行缩放效果,默认启用
91
- *
92
- * 如果启用,非选中的歌词行会轻微缩小以凸显当前播放歌词行效果
93
- *
94
- * 此效果对性能影响微乎其微,推荐启用
95
- * @param enable 是否启用歌词行缩放效果
96
- */
97
- setEnableScale(enable?: boolean): void;
98
- /**
99
- * 获取当前是否启用了歌词行缩放效果
100
- * @returns 是否启用歌词行缩放效果
101
- */
102
- getEnableScale(): boolean;
103
39
  private _baseFontSize;
104
40
  get baseFontSize(): number;
105
- private isPageVisible;
106
- private onPageShow;
107
- private onPageHide;
108
41
  constructor();
109
- private beginScrollHandler;
110
- private endScrollHandler;
111
- private limitScrollOffset;
112
- /**
113
- * 获取当前播放时间里是否处于间奏区间
114
- * 如果是则会返回单位为毫秒的始末时间
115
- * 否则返回 undefined
116
- *
117
- * 这个只允许内部调用
118
- * @returns [开始时间,结束时间,大概处于的歌词行ID,下一句是否为对唱歌词] 或 undefined 如果不处于间奏区间
119
- */
120
- getCurrentInterlude(): [number, number, number, boolean] | undefined;
121
- /**
122
- * 重建样式
123
- *
124
- * 这个只允许内部调用
125
- *
126
- * @private
127
- */
128
- rebuildStyle(): void;
129
- /**
130
- * 设置是否隐藏已经播放过的歌词行,默认不隐藏
131
- * @param hide 是否隐藏已经播放过的歌词行,默认不隐藏
132
- */
133
- setHidePassedLines(hide: boolean): void;
134
- /**
135
- * 设置是否启用歌词行的模糊效果
136
- * @param enable 是否启用
137
- */
138
- setEnableBlur(enable: boolean): void;
139
- get wordFadeWidth(): number;
140
- /**
141
- * 设置文字动画的渐变宽度,单位以歌词行的主文字字体大小的倍数为单位,默认为 0.5,即一个全角字符的一半宽度
142
- *
143
- * 如果要模拟 Apple Music for Android 的效果,可以设置为 1
144
- *
145
- * 如果要模拟 Apple Music for iPad 的效果,可以设置为 0.5
146
- *
147
- * 如果想要近乎禁用渐变效果,可以设置成非常接近 0 的小数(例如 `0.0001` ),但是**不可以为 0**
148
- *
149
- * @param value 需要设置的渐变宽度,单位以歌词行的主文字字体大小的倍数为单位,默认为 0.5
150
- */
42
+ private rebuildStyle;
151
43
  setWordFadeWidth(value?: number): void;
152
44
  /**
153
45
  * 设置当前播放歌词,要注意传入后这个数组内的信息不得修改,否则会发生错误
@@ -155,109 +47,8 @@ export declare class LyricPlayer extends EventTarget implements HasElement, Disp
155
47
  * @param initialTime 初始时间,默认为 0
156
48
  */
157
49
  setLyricLines(lines: LyricLine[], initialTime?: number): void;
158
- /**
159
- * 重置用户滚动状态
160
- *
161
- * 请在用户完成滚动点击跳转歌词时调用本事件再调用 `calcLayout` 以正确滚动到目标位置
162
- */
163
- resetScroll(): void;
164
- /**
165
- * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`
166
- * 函数即可让歌词通过动画移动到目标位置。
167
- *
168
- * 函数有一个 `force` 参数,用于指定是否强制修改布局,也就是不经过动画直接调整元素位置和大小。
169
- *
170
- * 此函数还有一个 `reflow` 参数,用于指定是否需要重新计算布局
171
- *
172
- * 因为计算布局必定会导致浏览器重排布局,所以会大幅度影响流畅度和性能,故请只在以下情况下将其​设置为 true:
173
- *
174
- * 1. 歌词页面大小发生改变时(这个组件会自行处理)
175
- * 2. 加载了新的歌词时(不论前后歌词是否完全一样)
176
- * 3. 用户自行跳转了歌曲播放位置(不论距离远近)
177
- *
178
- * @param force 是否不经过动画直接修改布局定位
179
- * @param reflow 是否进行重新布局(重新计算每行歌词大小)
180
- */
181
- calcLayout(force?: boolean, reflow?: boolean): void;
182
- /**
183
- * 获取当前歌词的播放位置
184
- *
185
- * 一般和最后调用 `setCurrentTime` 给予的参数一样
186
- * @returns 当前播放位置
187
- */
188
- getCurrentTime(): number;
189
- /**
190
- * 获取当前歌词数组
191
- *
192
- * 一般和最后调用 `setLyricLines` 给予的参数一样
193
- * @returns 当前歌词数组
194
- */
195
- getLyricLines(): LyricLine[];
196
- getElement(): HTMLElement;
197
- /**
198
- * 获取一个特殊的底栏元素,默认是空白的,可以往内部添加任意元素
199
- *
200
- * 这个元素始终在歌词的底部,可以用于显示歌曲创作者等信息
201
- *
202
- * 但是请勿删除该元素,只能在内部存放元素
203
- *
204
- * @returns 一个元素,可以往内部添加任意元素
205
- */
206
- getBottomLineElement(): HTMLElement;
207
- /**
208
- * 设置目标歌词行的对齐方式,默认为 `center`
209
- *
210
- * - 设置成 `top` 的话将会向目标歌词行的顶部对齐
211
- * - 设置成 `bottom` 的话将会向目标歌词行的底部对齐
212
- * - 设置成 `center` 的话将会向目标歌词行的垂直中心对齐
213
- * @param alignAnchor 歌词行对齐方式,详情见函数说明
214
- */
215
- setAlignAnchor(alignAnchor: "top" | "bottom" | "center"): void;
216
- /**
217
- * 设置默认的歌词行对齐位置,相对于整个歌词播放组件的大小位置,默认为 `0.5`
218
- * @param alignPosition 一个 `[0.0-1.0]` 之间的任意数字,代表组件高度由上到下的比例位置
219
- */
220
- setAlignPosition(alignPosition: number): void;
221
- /**
222
- * 设置当前播放进度,单位为毫秒且**必须是整数**,此时将会更新内部的歌词进度信息
223
- * 内部会根据调用间隔和播放进度自动决定如何滚动和显示歌词,所以这个的调用频率越快越准确越好
224
- *
225
- * 调用完成后,可以每帧调用 `update` 函数来执行歌词动画效果
226
- * @param time 当前播放进度,单位为毫秒
227
- */
228
- setCurrentTime(time: number, isSeek?: boolean): void;
229
- /**
230
- * 暂停部分效果演出,目前会暂停播放间奏点的动画
231
- */
232
50
  pause(): void;
233
- /**
234
- * 恢复部分效果演出,目前会恢复播放间奏点的动画
235
- */
236
51
  resume(): void;
237
- /**
238
- * 更新动画,这个函数应该被逐帧调用或者在以下情况下调用一次:
239
- *
240
- * 1. 刚刚调用完设置歌词函数的时候
241
- * @param delta 距离上一次被调用到现在的时长,单位为毫秒(可为浮点数)
242
- */
243
52
  update(delta?: number): void;
244
- /**
245
- * 设置所有歌词行在横坐标上的弹簧属性,包括重量、弹力和阻力。
246
- *
247
- * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样
248
- */
249
- setLinePosXSpringParams(params: Partial<SpringParams>): void;
250
- /**
251
- * 设置所有歌词行在​纵坐标上的弹簧属性,包括重量、弹力和阻力。
252
- *
253
- * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样
254
- */
255
- setLinePosYSpringParams(params: Partial<SpringParams>): void;
256
- /**
257
- * 设置所有歌词行在​缩放大小上的弹簧属性,包括重量、弹力和阻力。
258
- *
259
- * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样
260
- */
261
- setLineScaleSpringParams(params: Partial<SpringParams>): void;
262
53
  dispose(): void;
263
54
  }
@@ -1,4 +1,4 @@
1
- import { Disposable, HasElement } from '../../interfaces';
1
+ import { Disposable, HasElement } from '../../interfaces.ts';
2
2
  export declare class InterludeDots implements HasElement, Disposable {
3
3
  private element;
4
4
  private dot0;
@@ -1,6 +1,6 @@
1
- import { LyricPlayer } from '.';
2
- import { Disposable, HasElement, LyricLine, LyricWord } from '../../interfaces';
3
- import { Spring } from '../../utils/spring';
1
+ import { DomLyricPlayer } from '.';
2
+ import { LyricLine, LyricWord } from '../../interfaces.ts';
3
+ import { LyricLineBase } from '../base.ts';
4
4
  interface RealWord extends LyricWord {
5
5
  mainElement: HTMLSpanElement;
6
6
  subElements: HTMLSpanElement[];
@@ -11,68 +11,51 @@ interface RealWord extends LyricWord {
11
11
  padding: number;
12
12
  shouldEmphasize: boolean;
13
13
  }
14
- export declare function shouldEmphasize(word: LyricWord): boolean;
15
14
  export declare class RawLyricLineMouseEvent extends MouseEvent {
16
- readonly line: LyricLineEl;
17
- constructor(line: LyricLineEl, event: MouseEvent);
15
+ readonly line: LyricLineBase;
16
+ constructor(line: LyricLineBase, event: MouseEvent);
18
17
  }
19
18
  type MouseEventMap = {
20
19
  [evt in keyof HTMLElementEventMap]: HTMLElementEventMap[evt] extends MouseEvent ? evt : never;
21
20
  };
22
21
  type MouseEventTypes = MouseEventMap[keyof MouseEventMap];
23
22
  type MouseEventListener = (this: LyricLineEl, ev: RawLyricLineMouseEvent) => void;
24
- export declare class LyricLineEl extends EventTarget implements HasElement, Disposable {
23
+ export declare class LyricLineEl extends LyricLineBase {
25
24
  private lyricPlayer;
26
25
  private lyricLine;
27
26
  private element;
28
- private left;
29
- private top;
30
- private scale;
31
- private blur;
32
- private delay;
33
27
  private splittedWords;
34
28
  lineSize: number[];
35
- readonly lineTransforms: {
36
- posX: Spring;
37
- posY: Spring;
38
- scale: Spring;
39
- };
40
- constructor(lyricPlayer: LyricPlayer, lyricLine?: LyricLine);
29
+ constructor(lyricPlayer: DomLyricPlayer, lyricLine?: LyricLine);
41
30
  private listenersMap;
42
31
  private readonly onMouseEvent;
43
32
  addMouseEventListener(type: MouseEventTypes, callback: MouseEventListener | null, options?: boolean | AddEventListenerOptions | undefined): void;
44
33
  removeMouseEventListener(type: MouseEventTypes, callback: MouseEventListener | null, options?: boolean | EventListenerOptions | undefined): void;
45
34
  areWordsOnSameLine(word1: RealWord, word2: RealWord): boolean;
46
35
  private isEnabled;
47
- private hasFaded;
48
36
  enable(maskAnimationTime?: number): Promise<void>;
49
- disable(maskAnimationTime?: number): void;
37
+ disable(): void;
50
38
  private lastWord?;
51
- resume(currentTime?: number): void;
52
- pause(currentTime?: number): void;
39
+ resume(): Promise<void>;
40
+ pause(): Promise<void>;
53
41
  setMaskAnimationState(maskAnimationTime?: number): void;
54
- measureSize(): [number, number];
55
- setLine(line: LyricLine): void;
56
42
  getLine(): LyricLine;
57
43
  private _hide;
58
44
  private _prevParentEl;
59
45
  private lastStyle;
60
46
  show(): void;
61
47
  hide(): void;
62
- rebuildStyle(): void;
48
+ private rebuildStyle;
63
49
  rebuildElement(): void;
64
50
  private initFloatAnimation;
65
51
  private initEmphasizeAnimation;
66
52
  private get totalDuration();
67
- private maskImageDirty;
68
- private markImageDirtyPromises;
69
- markMaskImageDirty(): Promise<void>;
70
- waitMaskImageUpdated(): Promise<void>;
71
- updateMaskImage(): Promise<void>;
53
+ onLineSizeChange(size: [number, number]): void;
54
+ updateMaskImageSync(): void;
72
55
  private generateCalcBasedMaskImage;
73
56
  private generateWebAnimationBasedMaskImage;
74
57
  getElement(): HTMLElement;
75
- setTransform(left?: number, top?: number, scale?: number, opacity?: number, subopacity?: number, blur?: number, force?: boolean, delay?: number): void;
58
+ setTransform(top?: number, scale?: number, opacity?: number, blur?: number, force?: boolean, delay?: number): void;
76
59
  update(delta?: number): void;
77
60
  _getDebugTargetPos(): string;
78
61
  get isInSight(): boolean;
@@ -0,0 +1,33 @@
1
+ import { LyricLine } from '../../interfaces.ts';
2
+ import { LyricPlayerBase } from '../base.ts';
3
+ import { LyricLineEl } from './lyric-line.ts';
4
+ /**
5
+ * 歌词播放组件,本框架的核心组件
6
+ *
7
+ * 尽可能贴切 Apple Music for iPad 的歌词效果设计,且做了力所能及的优化措施
8
+ */
9
+ export declare class DomSlimLyricPlayer extends LyricPlayerBase {
10
+ currentLyricLineObjects: LyricLineEl[];
11
+ private debounceCalcLayout;
12
+ onResize(): void;
13
+ readonly supportPlusLighter: boolean;
14
+ readonly supportMaskImage: boolean;
15
+ readonly innerSize: [number, number];
16
+ private readonly onLineClickedHandler;
17
+ private _baseFontSize;
18
+ get baseFontSize(): number;
19
+ constructor();
20
+ private rebuildStyle;
21
+ setWordFadeWidth(value?: number): void;
22
+ /**
23
+ * 设置当前播放歌词,要注意传入后这个数组内的信息不得修改,否则会发生错误
24
+ * @param lines 歌词数组
25
+ * @param initialTime 初始时间,默认为 0
26
+ */
27
+ setLyricLines(lines: LyricLine[], initialTime?: number): void;
28
+ pause(): void;
29
+ resume(): void;
30
+ update(delta?: number): void;
31
+ calcLayout(force?: boolean, reflow?: boolean): Promise<void>;
32
+ dispose(): void;
33
+ }
@@ -0,0 +1,22 @@
1
+ import { Disposable, HasElement } from '../../interfaces.ts';
2
+ export declare class InterludeDots implements HasElement, Disposable {
3
+ private element;
4
+ private dot0;
5
+ private dot1;
6
+ private dot2;
7
+ private left;
8
+ private top;
9
+ private playing;
10
+ private lastStyle;
11
+ private currentInterlude?;
12
+ private currentTime;
13
+ private targetBreatheDuration;
14
+ constructor();
15
+ getElement(): HTMLElement;
16
+ setTransform(left?: number, top?: number): void;
17
+ setInterlude(interlude?: [number, number]): void;
18
+ pause(): void;
19
+ resume(): void;
20
+ update(delta?: number): void;
21
+ dispose(): void;
22
+ }
@@ -0,0 +1,70 @@
1
+ import { LyricLine, LyricWord } from '../../interfaces.ts';
2
+ import { LyricLineBase } from '../base.ts';
3
+ import { DomSlimLyricPlayer } from './index.ts';
4
+ interface RealWord extends LyricWord {
5
+ mainElement: HTMLSpanElement;
6
+ subElements: HTMLSpanElement[];
7
+ elementAnimations: Animation[];
8
+ maskAnimations: Animation[];
9
+ width: number;
10
+ height: number;
11
+ padding: number;
12
+ shouldEmphasize: boolean;
13
+ }
14
+ export declare class RawLyricLineMouseEvent extends MouseEvent {
15
+ readonly line: LyricLineEl;
16
+ constructor(line: LyricLineEl, event: MouseEvent);
17
+ }
18
+ type MouseEventMap = {
19
+ [evt in keyof HTMLElementEventMap]: HTMLElementEventMap[evt] extends MouseEvent ? evt : never;
20
+ };
21
+ type MouseEventTypes = MouseEventMap[keyof MouseEventMap];
22
+ type MouseEventListener = (this: LyricLineEl, ev: RawLyricLineMouseEvent) => void;
23
+ export declare class LyricLineEl extends LyricLineBase {
24
+ private lyricPlayer;
25
+ private lyricLine;
26
+ private element;
27
+ private splittedWords;
28
+ lineSize: number[];
29
+ constructor(lyricPlayer: DomSlimLyricPlayer, lyricLine?: LyricLine);
30
+ private listenersMap;
31
+ private readonly onMouseEvent;
32
+ addMouseEventListener(type: MouseEventTypes, callback: MouseEventListener | null, options?: boolean | AddEventListenerOptions | undefined): void;
33
+ removeMouseEventListener(type: MouseEventTypes, callback: MouseEventListener | null, options?: boolean | EventListenerOptions | undefined): void;
34
+ areWordsOnSameLine(word1: RealWord, word2: RealWord): boolean;
35
+ private isEnabled;
36
+ enable(maskAnimationTime?: number): Promise<void>;
37
+ disable(): void;
38
+ private lastWord?;
39
+ resume(): Promise<void>;
40
+ pause(): Promise<void>;
41
+ setMaskAnimationState(maskAnimationTime?: number): void;
42
+ private measureLockMark;
43
+ private measureLock;
44
+ getLine(): LyricLine;
45
+ private _prevParentEl;
46
+ private lastStyle;
47
+ show(): void;
48
+ hide(): void;
49
+ private rebuildStyle;
50
+ rebuildElement(): void;
51
+ private initFloatAnimation;
52
+ private initEmphasizeAnimation;
53
+ private get totalDuration();
54
+ private maskImageDirty;
55
+ private markImageDirtyPromiseResolve;
56
+ private markImageDirtyPromise;
57
+ markMaskImageDirty(_debugReason?: string): Promise<void>;
58
+ waitMaskImageUpdated(): Promise<void>;
59
+ updateMaskImage(): Promise<void>;
60
+ private generateCalcBasedMaskImage;
61
+ private generateWebAnimationBasedMaskImage;
62
+ getElement(): HTMLElement;
63
+ setTransform(top?: number, scale?: number, opacity?: number, blur?: number, force?: boolean, delay?: number): void;
64
+ update(delta?: number): void;
65
+ _getDebugTargetPos(): string;
66
+ get isInSight(): boolean;
67
+ private disposeElements;
68
+ dispose(): void;
69
+ }
70
+ export {};
@@ -1,9 +1,10 @@
1
- import { Disposable, HasElement } from '../interfaces';
2
- export * from './dom';
3
- export declare abstract class LyricPlayerBase extends EventTarget implements HasElement, Disposable {
4
- protected element: HTMLElement;
5
- constructor();
6
- protected onResize(): void;
7
- getElement(): HTMLElement;
8
- dispose(): void;
9
- }
1
+ import { DomLyricPlayer } from './dom/index.ts';
2
+ export { LyricPlayerBase } from './base.ts';
3
+ export * from './canvas/index.ts';
4
+ export * from './dom-slim/index.ts';
5
+ export * from './dom/index.ts';
6
+ export {
7
+ /**
8
+ * 默认导出的歌词播放组件
9
+ */
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
+ }
@@ -0,0 +1 @@
1
+ export declare const isCJK: (char: string) => boolean;
@@ -0,0 +1,11 @@
1
+ import { LyricWord } from '../interfaces.ts';
2
+ /**
3
+ * 将输入的单词重新分组,之间没有空格的单词将会组合成一个单词数组
4
+ *
5
+ * 例如输入:`["Life", " ", "is", " a", " su", "gar so", "sweet"]`
6
+ *
7
+ * 应该返回:`["Life", " ", "is", " a", [" su", "gar"], "so", "sweet"]`
8
+ * @param words 输入的单词数组
9
+ * @returns 重新分组后的单词数组
10
+ */
11
+ export declare function chunkAndSplitLyricWords(words: LyricWord[]): (LyricWord | LyricWord[])[];
@@ -0,0 +1,2 @@
1
+ export declare function mutexifyFunction<F extends (...args: Args) => Promise<Result>, Args extends any[], Result>(func: F): F;
2
+ export default mutexifyFunction;
@@ -1,4 +1,4 @@
1
- import { Disposable } from '..';
1
+ import { Disposable } from '../interfaces.ts';
2
2
  export interface SpringParams {
3
3
  mass: number;
4
4
  damping: number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applemusic-like-lyrics/core",
3
- "version": "0.2.0-alpha.3",
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,26 +26,26 @@
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": {
34
- "@applemusic-like-lyrics/lyric": "^0.0.2",
35
- "@biomejs/biome": "^1.8.3",
34
+ "@applemusic-like-lyrics/lyric": "^0.2.4",
35
+ "@biomejs/biome": "^1.9.4",
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.18.2",
39
+ "lil-gui": "^0.20.0",
40
40
  "stats.js": "^0.17.0",
41
- "typedoc": "^0.26.5",
42
- "typedoc-plugin-markdown": "^4.2.3",
43
- "typescript": "^5.5.4",
44
- "vite": "^5.4.0",
45
- "vite-plugin-dts": "^4.0.3",
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,10 +58,10 @@
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
- "gl-matrix": "^4.0.0-beta.2"
64
+ "gl-matrix": "4.0.0-beta.2"
65
65
  },
66
66
  "scripts": {
67
67
  "build:docs": "typedoc --plugin typedoc-plugin-markdown --out docs src/index.ts",
@@ -1,2 +0,0 @@
1
- export declare class LyricLayouter {
2
- }
package/dist/style.css DELETED
@@ -1 +0,0 @@
1
- ._lyricLine_kocao_6{-webkit-backface-visibility:hidden;backface-visibility:hidden;transform-origin:0;width:var(--amll-lp-line-width,100%);min-width:var(--amll-lp-line-width,100%);max-width:var(--amll-lp-line-width,100%);padding:2vh var(--amll-lp-line-padding-x,1em);contain:content;box-sizing:content-box;border-radius:16px;height:-moz-fit-content;height:fit-content;transition:filter .2s,background-color .25s,box-shadow .25s;position:absolute}._lyricLine_kocao_6:has(>*):hover{background-color:var(--amll-lp-hover-bg-color,#fff1);box-shadow:0 0 0 4px var(--amll-lp-hover-bg-color,#fff1)}._lyricLine_kocao_6:has(>*):active{box-shadow:0 0 0 var(--amll-lp-hover-bg-color,#fff1)}._lyricBgLine_kocao_31{opacity:0;font-size:max(calc(100%*var(--amll-lp-bg-line-scale,70%)),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_kocao_31._active_kocao_40{opacity:.4;transition:opacity .5s .25s,scale 1.5s cubic-bezier(0,1,0,1) .25s,filter .2s,background-color .25s,box-shadow .25s}._lyricDuetLine_kocao_47{text-align:right;transform-origin:100%}._lyricMainLine_kocao_52{margin:-1em;padding:1em;transition:opacity .3s .1s}._lyricMainLine_kocao_52 span{display:inline-block}._lyricMainLine_kocao_52>span{white-space:pre-wrap;margin:-1em;padding:1em;display:inline-block}._lyricMainLine_kocao_52>span._emphasize_kocao_62{-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_kocao_52>span._emphasize_kocao_62>span{will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_kocao_52>span span._emphasize_kocao_62{-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_kocao_52>span span._emphasize_kocao_62>span{will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_kocao_52 span._emphasizeWrapper_kocao_62{white-space:pre-wrap;margin:-1em;padding:1em;display:inline-block}._lyricMainLine_kocao_52 span._emphasizeWrapper_kocao_62._emphasize_kocao_62{-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_kocao_52 span._emphasizeWrapper_kocao_62._emphasize_kocao_62>span{will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_kocao_52 span._emphasizeWrapper_kocao_62 span._emphasize_kocao_62{-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricMainLine_kocao_52 span._emphasizeWrapper_kocao_62 span._emphasize_kocao_62>span{will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;margin:-1em;padding:1em}._lyricSubLine_kocao_84{opacity:.3;font-size:max(.5em,10px);line-height:1.5em;transition:opacity .2s .25s}._disableSpring_kocao_91>*{transition:filter .25s,transform .5s,background-color .25s,box-shadow .25s}._interludeDots_kocao_96{transform-origin:50%;padding:2.5% calc(var(--amll-lp-line-padding-x,1em)*.6);gap:.25em;width:-moz-fit-content;width:fit-content;height:max(.5em,min(1vh,3em));display:flex;position:absolute;left:1em}._interludeDots_kocao_96>*{aspect-ratio:1;background-color:var(--amll-lp-color,white);border-radius:50%;height:max(.5em,min(1vh,3em));margin-right:4px;display:inline-block}._interludeDots_kocao_96._duet_kocao_115{transform-origin:50%;right:1em}@supports (mix-blend-mode:plus-lighter){._lyricSubLine_kocao_84{opacity:.3}}._tmpDisableTransition_kocao_127{transition:none!important}.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;font-size:var(--amll-lp-font-size,max(max(4.7vh,3.2vw),12px));box-sizing:content-box;z-index:1;color:var(--amll-lp-color,white);mix-blend-mode:plus-lighter;contain:strict;width:100%;max-width:100%;height:100%;margin:-1em;padding:1em;line-height:1.2em;overflow:hidden}.amll-lyric-player.dom:hover .lyric-line{filter:unset!important}@media screen and (max-width:768px){.amll-lyric-player{--amll-lp-line-width-aspect:1;--amll-lp-line-padding-x:0}}