@applemusic-like-lyrics/core 0.5.0 → 0.5.2

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.
@@ -368,6 +368,58 @@ declare class Spring {
368
368
  getCurrentPosition(): number;
369
369
  }
370
370
  //#endregion
371
+ //#region src/lyric-player/dom/interlude-dots.d.ts
372
+ declare class InterludeDots implements HasElement, Disposable {
373
+ private element;
374
+ private dot0;
375
+ private dot1;
376
+ private dot2;
377
+ private left;
378
+ private top;
379
+ private playing;
380
+ private lastStyle;
381
+ private currentInterlude?;
382
+ private currentTime;
383
+ private targetBreatheDuration;
384
+ constructor();
385
+ getElement(): HTMLElement;
386
+ setTransform(left?: number, top?: number): void;
387
+ setInterlude(interlude?: [number, number]): void;
388
+ pause(): void;
389
+ resume(): void;
390
+ update(delta?: number): void;
391
+ dispose(): void;
392
+ }
393
+ //#endregion
394
+ //#region src/lyric-player/base/bottom-line.d.ts
395
+ interface LineTransforms$1 {
396
+ posX: Spring;
397
+ posY: Spring;
398
+ }
399
+ declare class BottomLineEl implements HasElement, Disposable {
400
+ private lyricPlayer;
401
+ private element;
402
+ private left;
403
+ private top;
404
+ private delay;
405
+ lineSize: [number, number];
406
+ readonly lineTransforms: LineTransforms$1;
407
+ private isFocused;
408
+ private blur;
409
+ constructor(lyricPlayer: LyricPlayerBase);
410
+ measureSize(): Promise<[number, number]>;
411
+ private lastStyle;
412
+ show(): void;
413
+ hide(): void;
414
+ setFocused(focused: boolean): void;
415
+ private rebuildStyle;
416
+ getElement(): HTMLElement;
417
+ setTransform(left?: number, top?: number, blur?: number, force?: boolean, delay?: number): void;
418
+ update(delta?: number): void;
419
+ get isInSight(): boolean;
420
+ dispose(): void;
421
+ }
422
+ //#endregion
371
423
  //#region src/lyric-player/base/consts.d.ts
372
424
  type ValueOf<T extends Record<PropertyKey, unknown>> = T[keyof T];
373
425
  /** 歌词中不雅用语的掩码模式 */
@@ -401,8 +453,7 @@ declare const LayoutAlignAnchor: {
401
453
  type LayoutAlignAnchor = ValueOf<typeof LayoutAlignAnchor>;
402
454
  //#endregion
403
455
  //#region src/lyric-player/base/line.d.ts
404
- interface LineTransforms$1 {
405
- posY: Spring;
456
+ interface LineTransforms {
406
457
  scale: Spring;
407
458
  }
408
459
  /**
@@ -415,7 +466,7 @@ declare abstract class LyricLineBase extends EventTarget implements Disposable {
415
466
  protected blur: number;
416
467
  protected opacity: number;
417
468
  protected delay: number;
418
- readonly lineTransforms: LineTransforms$1;
469
+ readonly lineTransforms: LineTransforms;
419
470
  /**
420
471
  * 用于 CJK 词语边界检测的分词器
421
472
  */
@@ -430,8 +481,8 @@ declare abstract class LyricLineBase extends EventTarget implements Disposable {
430
481
  abstract disable(): void;
431
482
  abstract resume(): void;
432
483
  abstract pause(): void;
433
- onLineSizeChange(_size: [number, number]): void;
434
- setTransform(top?: number, scale?: number, opacity?: number, blur?: number, _force?: boolean, delay?: number, _mode?: LyricLineRenderMode): void;
484
+ abstract onLineSizeChange(size: [number, number]): void;
485
+ setTransform(scale?: number, opacity?: number, blur?: number, _force?: boolean, delay?: number, _mode?: LyricLineRenderMode): void;
435
486
  rebuildElement(): void;
436
487
  /**
437
488
  * 判定歌词是否可以应用强调辉光效果
@@ -448,55 +499,37 @@ declare abstract class LyricLineBase extends EventTarget implements Disposable {
448
499
  dispose(): void;
449
500
  }
450
501
  //#endregion
451
- //#region src/lyric-player/dom/interlude-dots.d.ts
452
- declare class InterludeDots implements HasElement, Disposable {
453
- private element;
454
- private dot0;
455
- private dot1;
456
- private dot2;
457
- private left;
458
- private top;
459
- private playing;
460
- private lastStyle;
461
- private currentInterlude?;
462
- private currentTime;
463
- private targetBreatheDuration;
464
- constructor();
465
- getElement(): HTMLElement;
466
- setTransform(left?: number, top?: number): void;
467
- setInterlude(interlude?: [number, number]): void;
468
- pause(): void;
469
- resume(): void;
470
- update(delta?: number): void;
471
- dispose(): void;
502
+ //#region src/lyric-player/base/group.d.ts
503
+ interface LyricPlayerFlags {
504
+ getEnableSpring(): boolean;
505
+ getEnableScale(): boolean;
506
+ getIsPlaying(): boolean;
507
+ getAlwaysPostpositionBackground(): boolean;
472
508
  }
473
- //#endregion
474
- //#region src/lyric-player/base/bottom-line.d.ts
475
- interface LineTransforms {
476
- posX: Spring;
509
+ declare abstract class LyricLineGroupBase<T extends LyricLineBase = LyricLineBase> implements Disposable {
510
+ mainLine: T;
511
+ bgLine?: T | undefined;
512
+ protected abstract readonly lyricPlayer: LyricPlayerFlags;
477
513
  posY: Spring;
478
- }
479
- declare class BottomLineEl implements HasElement, Disposable {
480
- private lyricPlayer;
481
- private element;
482
- private left;
483
- private top;
484
- private delay;
485
- lineSize: [number, number];
486
- readonly lineTransforms: LineTransforms;
487
- private isFocused;
488
- private blur;
489
- constructor(lyricPlayer: LyricPlayerBase);
490
- measureSize(): Promise<[number, number]>;
491
- private lastStyle;
492
- show(): void;
493
- hide(): void;
494
- setFocused(focused: boolean): void;
495
- private rebuildStyle;
496
- getElement(): HTMLElement;
497
- setTransform(left?: number, top?: number, blur?: number, force?: boolean, delay?: number): void;
498
- update(delta?: number): void;
499
- get isInSight(): boolean;
514
+ bgSlideY: Spring;
515
+ top: number;
516
+ delay: number;
517
+ isActive: boolean;
518
+ opacity: number;
519
+ blur: number;
520
+ isBgFirst: boolean;
521
+ constructor(mainLine: T, bgLine?: T | undefined);
522
+ get startTime(): number;
523
+ get endTime(): number;
524
+ onLineSizeChange(size: [number, number]): void;
525
+ setTransform(top: number, force: boolean, delay: number, isActive: boolean, opacity: number, blur: number): void;
526
+ private setLineTransformations;
527
+ protected abstract renderStyles(): void;
528
+ abstract get isInSight(): boolean;
529
+ update(delta: number): void;
530
+ rebuildAllLines(): void;
531
+ enable(time?: number, shouldPlay?: boolean): void;
532
+ disable(): void;
500
533
  dispose(): void;
501
534
  }
502
535
  //#endregion
@@ -551,18 +584,18 @@ interface PlayerScrollState {
551
584
  /**
552
585
  * 播放时间线状态。
553
586
  *
554
- * 描述播放器在时间轴上的当前位置,当前处于激活状态的歌词行信息
587
+ * 描述播放器在时间轴上的当前位置,当前处于激活状态的歌词组信息
555
588
  */
556
589
  interface PlayerTimelineState {
557
590
  /** 当前播放时间,单位为毫秒 */
558
591
  currentTime: number;
559
592
  /** 上一次提交到时间线状态的播放时间,单位为毫秒 */
560
593
  lastCurrentTime: number;
561
- /** 热行:当前时间 {@link currentTime} 正在命中的行(含主行+可能的背景行) */
562
- hotLines: Set<number>;
563
- /** 缓冲行:UI 上还保持激活表现的行,通常包含热行,并包含刚结束仍在过渡中的行 */
564
- bufferedLines: Set<number>;
565
- /** 当前应滚动对齐到的歌词行索引 */
594
+ /** 热行:当前时间 {@link currentTime} 正在命中的组(含主行+可能的背景行) */
595
+ hotGroups: Set<number>;
596
+ /** 缓冲组:UI 上还保持激活表现的组索引,通常包含热组,和刚结束仍在过渡中的组 */
597
+ bufferedGroups: Set<number>;
598
+ /** 当前应滚动对齐到的歌词组索引 */
566
599
  scrollToIndex: number;
567
600
  /** 是否正在拖拽进度条。若是,更新时丢弃缓冲行,并根据当前时间直接计算热行 */
568
601
  isSeeking: boolean;
@@ -583,9 +616,7 @@ declare abstract class LyricPlayerBase extends EventTarget implements HasElement
583
616
  /** 播放时间线状态 */
584
617
  protected timelineState: PlayerTimelineState;
585
618
  /** @internal */
586
- lyricLinesSize: WeakMap<LyricLineBase, [number, number]>;
587
- /** @internal */
588
- lyricLineElementMap: WeakMap<Element, LyricLineBase>;
619
+ lyricGroupElementMap: WeakMap<Element, LyricLineGroupBase>;
589
620
  protected currentLyricLines: LyricLine[];
590
621
  protected processedLines: LyricLine[];
591
622
  protected lyricLinesIndexes: WeakMap<LyricLineBase, number>;
@@ -601,10 +632,13 @@ declare abstract class LyricPlayerBase extends EventTarget implements HasElement
601
632
  protected maskObsceneWordChar: string;
602
633
  protected hidePassedLines: boolean;
603
634
  protected scrollState: PlayerScrollState;
604
- protected currentLyricLineObjects: LyricLineBase[];
635
+ currentLyricGroups: LyricLineGroupBase[];
636
+ lyricGroupSize: WeakMap<LyricLineGroupBase, [number, number]>;
605
637
  readonly size: [number, number];
606
638
  protected isPageVisible: boolean;
607
639
  protected optimizeOptions: OptimizeLyricOptions;
640
+ /** 是否强制让背景人声行始终后置(即始终在主歌词下方显示,不前置背景人声) */
641
+ protected alwaysPostpositionBackground: boolean;
608
642
  protected posXSpringParams: Partial<SpringParams>;
609
643
  protected posYSpringParams: Partial<SpringParams>;
610
644
  protected scaleSpringParams: Partial<SpringParams>;
@@ -823,6 +857,16 @@ declare abstract class LyricPlayerBase extends EventTarget implements HasElement
823
857
  * @returns 当前播放位置
824
858
  */
825
859
  getCurrentTime(): number;
860
+ /**
861
+ * 设置是否让背景人声行始终后置显示
862
+ *
863
+ * 默认情况下,如果背景歌词开始时间早于主歌词,会在主歌词上方展示;
864
+ * 如果设置为 `true`,则无论时间顺序如何,背景歌词都会始终在主歌词下方展示
865
+ * @param enable 是否启用始终后置
866
+ */
867
+ setAlwaysPostpositionBackground(enable: boolean): void;
868
+ /** 获取当前是否设置了让背景人声行始终后置显示 */
869
+ getAlwaysPostpositionBackground(): boolean;
826
870
  getElement(): HTMLElement;
827
871
  dispose(): void;
828
872
  }
@@ -838,13 +882,6 @@ interface RealWord extends LyricWord {
838
882
  padding: number;
839
883
  shouldEmphasize: boolean;
840
884
  }
841
- declare class RawLyricLineMouseEvent extends MouseEvent {
842
- readonly line: LyricLineBase;
843
- constructor(line: LyricLineBase, event: MouseEvent);
844
- }
845
- type MouseEventMap = { [evt in keyof HTMLElementEventMap]: HTMLElementEventMap[evt] extends MouseEvent ? evt : never };
846
- type MouseEventTypes = MouseEventMap[keyof MouseEventMap];
847
- type MouseEventListener = (this: LyricLineEl, ev: RawLyricLineMouseEvent) => void;
848
885
  declare class LyricLineEl extends LyricLineBase {
849
886
  private lyricPlayer;
850
887
  private lyricLine;
@@ -862,10 +899,6 @@ declare class LyricLineEl extends LyricLineBase {
862
899
  */
863
900
  private balancer?;
864
901
  constructor(lyricPlayer: DomLyricPlayer, lyricLine?: LyricLine);
865
- private listenersMap;
866
- private readonly onMouseEvent;
867
- addMouseEventListener(type: MouseEventTypes, callback: MouseEventListener | null, options?: boolean | AddEventListenerOptions | undefined): void;
868
- removeMouseEventListener(type: MouseEventTypes, callback: MouseEventListener | null, options?: boolean | EventListenerOptions | undefined): void;
869
902
  areWordsOnSameLine(word1: RealWord, word2: RealWord): boolean;
870
903
  private isEnabled;
871
904
  enable(maskAnimationTime?: number, shouldPlay?: boolean): Promise<void>;
@@ -875,10 +908,8 @@ declare class LyricLineEl extends LyricLineBase {
875
908
  pause(): Promise<void>;
876
909
  setMaskAnimationState(maskAnimationTime?: number): void;
877
910
  getLine(): LyricLine;
878
- private _prevParentEl;
879
911
  private lastStyle;
880
912
  show(): void;
881
- hide(): void;
882
913
  private rebuildStyle;
883
914
  override rebuildElement(): void;
884
915
  /** 设置翻译与音译行文本 */
@@ -897,17 +928,34 @@ declare class LyricLineEl extends LyricLineBase {
897
928
  getElement(): HTMLElement;
898
929
  private updateMaskAlphaTargets;
899
930
  private applyAlphaToDom;
900
- override setTransform(top?: number, scale?: number, opacity?: number, blur?: number, force?: boolean, delay?: number, mode?: LyricLineRenderMode): void;
931
+ override setTransform(scale?: number, opacity?: number, blur?: number, force?: boolean, delay?: number, mode?: LyricLineRenderMode): void;
901
932
  update(delta?: number): void;
933
+ /** @internal */
902
934
  _getDebugTargetPos(): string;
903
- get isInSight(): boolean;
935
+ teardownContent(): void;
904
936
  private disposeElements;
905
937
  override dispose(): void;
906
938
  }
907
939
  //#endregion
940
+ //#region src/lyric-player/dom/lyric-group.d.ts
941
+ declare class LyricLineGroup extends LyricLineGroupBase<LyricLineEl> {
942
+ lyricPlayer: DomLyricPlayer;
943
+ element: HTMLElement;
944
+ bgWrapper?: HTMLElement;
945
+ private lastIsActive?;
946
+ constructor(lyricPlayer: DomLyricPlayer, mainLine: LyricLineEl);
947
+ get isInSight(): boolean;
948
+ show(): void;
949
+ hide(): void;
950
+ override update(delta: number): void;
951
+ addBgLine(bgLine: LyricLineEl): void;
952
+ protected renderStyles(): void;
953
+ override dispose(): void;
954
+ }
955
+ //#endregion
908
956
  //#region src/lyric-player/dom/index.d.ts
909
957
  /**
910
- * 歌词行鼠标相关事件,可以获取到歌词行的索引和歌词行元素
958
+ * 歌词行鼠标相关事件,可以获取到歌词行的索引、主歌词行以及背景歌词行(如果有)元素
911
959
  */
912
960
  declare class LyricLineMouseEvent extends MouseEvent {
913
961
  /**
@@ -918,7 +966,17 @@ declare class LyricLineMouseEvent extends MouseEvent {
918
966
  * 歌词行元素
919
967
  */
920
968
  readonly line: LyricLineBase;
921
- constructor(lineIndex: number, line: LyricLineBase, event: MouseEvent);
969
+ /**
970
+ * 背景人声歌词行元素 (如果存在)
971
+ */
972
+ readonly bgLine: LyricLineBase | undefined;
973
+ /**
974
+ * 自定义标志位,用于记录外部是否调用了 `stopPropagation`
975
+ */
976
+ isPropagationStopped: boolean;
977
+ constructor(lineIndex: number, line: LyricLineBase, bgLine: LyricLineBase | undefined, event: MouseEvent);
978
+ override stopPropagation(): void;
979
+ override stopImmediatePropagation(): void;
922
980
  }
923
981
  type LyricLineMouseEventListener = (evt: LyricLineMouseEvent) => void;
924
982
  /**
@@ -927,12 +985,13 @@ type LyricLineMouseEventListener = (evt: LyricLineMouseEvent) => void;
927
985
  * 尽可能贴切 Apple Music for iPad 的歌词效果设计,且做了力所能及的优化措施
928
986
  */
929
987
  declare class DomLyricPlayer extends LyricPlayerBase {
930
- override currentLyricLineObjects: LyricLineEl[];
988
+ private abortController;
989
+ override currentLyricGroups: LyricLineGroup[];
931
990
  override onResize(): void;
932
991
  readonly supportPlusLighter: boolean;
933
992
  readonly supportMaskImage: boolean;
934
993
  readonly innerSize: [number, number];
935
- private readonly onLineClickedHandler;
994
+ private readonly onMouseEventHandler;
936
995
  /**
937
996
  * 是否为非逐词歌词
938
997
  * @internal