@applemusic-like-lyrics/core 0.1.3 → 0.2.0-alpha.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.
@@ -1,8 +1,8 @@
1
- import { Disposable, HasElement } from "../interfaces";
1
+ import { Disposable, HasElement } from '../interfaces';
2
2
  export declare abstract class AbstractBaseRenderer implements Disposable, HasElement {
3
3
  /**
4
- * 修改背景的流动速度,数字越大越快,默认为 2
5
- * @param speed 背景的流动速度,默认为 2
4
+ * 修改背景的流动速度,数字越大越快,默认为 8
5
+ * @param speed 背景的流动速度,默认为 8
6
6
  */
7
7
  abstract setFlowSpeed(speed: number): void;
8
8
  /**
@@ -75,8 +75,8 @@ export declare abstract class BaseRenderer extends AbstractBaseRenderer {
75
75
  */
76
76
  protected onResize(width: number, height: number): void;
77
77
  /**
78
- * 修改背景的流动速度,数字越大越快,默认为 2
79
- * @param speed 背景的流动速度,默认为 2
78
+ * 修改背景的流动速度,数字越大越快,默认为 4
79
+ * @param speed 背景的流动速度,默认为 4
80
80
  */
81
81
  setFlowSpeed(speed: number): void;
82
82
  /**
@@ -105,4 +105,5 @@ export declare abstract class BaseRenderer extends AbstractBaseRenderer {
105
105
  */
106
106
  abstract setAlbum(albumSource: string | HTMLImageElement | HTMLVideoElement, isVideo?: boolean): Promise<void>;
107
107
  dispose(): void;
108
+ getElement(): HTMLElement;
108
109
  }
@@ -0,0 +1,4 @@
1
+ export declare function blurImage(imageData: ImageData, radius: number, quality: number): void;
2
+ export declare function saturateImage(imageData: ImageData, saturation: number): void;
3
+ export declare function brightnessImage(imageData: ImageData, brightness: number): void;
4
+ export declare function contrastImage(imageData: ImageData, contrast: number): void;
@@ -1,12 +1,12 @@
1
+ import { AbstractBaseRenderer, BaseRenderer } from './base';
1
2
  /**
2
3
  * @fileoverview
3
4
  * 一个播放歌词的组件
4
5
  * @author SteveXMH
5
6
  */
6
- export { AbstractBaseRenderer, BaseRenderer } from "./base";
7
- import { AbstractBaseRenderer, BaseRenderer } from "./base";
8
- export { PixiRenderer } from "./pixi-renderer";
9
- export { EplorRenderer } from "./eplor-renderer";
7
+ export { AbstractBaseRenderer, BaseRenderer } from './base';
8
+ export { PixiRenderer } from './pixi-renderer';
9
+ export { MeshGradientRenderer } from './mesh-renderer';
10
10
  export declare class BackgroundRender<Renderer extends BaseRenderer> implements AbstractBaseRenderer {
11
11
  private element;
12
12
  private renderer;
@@ -0,0 +1,17 @@
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 {};
@@ -0,0 +1,67 @@
1
+ import { Vec2, Vec3 } from 'gl-matrix';
2
+ import { BaseRenderer } from '../base';
3
+ declare class ControlPoint {
4
+ color: Vec3;
5
+ location: Vec2;
6
+ uTangent: Vec2;
7
+ vTangent: Vec2;
8
+ private _uRot;
9
+ private _vRot;
10
+ private _uScale;
11
+ private _vScale;
12
+ constructor();
13
+ get uRot(): number;
14
+ get vRot(): number;
15
+ set uRot(value: number);
16
+ set vRot(value: number);
17
+ get uScale(): number;
18
+ get vScale(): number;
19
+ set uScale(value: number);
20
+ set vScale(value: number);
21
+ private updateUTangent;
22
+ private updateVTangent;
23
+ }
24
+ export declare class MeshGradientRenderer extends BaseRenderer {
25
+ private gl;
26
+ private lastFrameTime;
27
+ private frameTime;
28
+ private lastTickTime;
29
+ private volume;
30
+ private tickHandle;
31
+ private maxFPS;
32
+ private paused;
33
+ private staticMode;
34
+ private mainProgram;
35
+ private blendProgram;
36
+ private manualControl;
37
+ private reduceImageSizeCanvas;
38
+ private targetSize;
39
+ private currentSize;
40
+ private fullScreenMesh;
41
+ private drawFrameBuffer;
42
+ private drawFrameBufferTexture;
43
+ private meshStates;
44
+ private _disposed;
45
+ setManualControl(enable: boolean): void;
46
+ setWireFrame(enable: boolean): void;
47
+ getControlPoint(x: number, y: number): ControlPoint | undefined;
48
+ resizeControlPoints(width: number, height: number): void;
49
+ resetSubdivition(subDivisions: number): void;
50
+ private onTick;
51
+ private checkIfResize;
52
+ private onRedraw;
53
+ private onTickBinded;
54
+ private requestTick;
55
+ private supportTextureFloat;
56
+ constructor(canvas: HTMLCanvasElement);
57
+ protected onResize(width: number, height: number): void;
58
+ setStaticMode(enable: boolean): void;
59
+ setFPS(fps: number): void;
60
+ pause(): void;
61
+ resume(): void;
62
+ setAlbum(albumSource: string | HTMLImageElement | HTMLVideoElement, isVideo?: boolean): Promise<void>;
63
+ setLowFreqVolume(volume: number): void;
64
+ setHasLyric(_hasLyric: boolean): void;
65
+ dispose(): void;
66
+ }
67
+ export {};
@@ -1,4 +1,4 @@
1
- import { BaseRenderer } from "./base";
1
+ import { BaseRenderer } from './base';
2
2
  export declare class PixiRenderer extends BaseRenderer {
3
3
  protected canvas: HTMLCanvasElement;
4
4
  private app;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type * from "./interfaces";
2
- export type * as spring from "./utils/spring";
3
- export * from "./bg-render";
4
- export { LyricPlayer, type LyricLineMouseEvent } from "./lyric-player";
1
+ export type * from './interfaces';
2
+ export type * as spring from './utils/spring';
3
+ export * from './bg-render';
4
+ export { LyricPlayer, type LyricLineMouseEvent } from './lyric-player';
@@ -1,6 +1,6 @@
1
- import { LyricPlayer } from ".";
2
- import { Disposable, HasElement } from "../interfaces";
3
- import { Spring } from "../utils/spring";
1
+ import { LyricPlayer } from '.';
2
+ import { Disposable, HasElement } from '../interfaces';
3
+ import { Spring } from '../utils/spring';
4
4
  export declare class BottomLineEl implements HasElement, Disposable {
5
5
  private lyricPlayer;
6
6
  private element;
@@ -1,11 +1,6 @@
1
- /**
2
- * @fileoverview
3
- * 一个播放歌词的组件
4
- * @author SteveXMH
5
- */
6
- import type { Disposable, HasElement, LyricLine } from "../interfaces";
7
- import { SpringParams } from "../utils/spring";
8
- import { LyricLineEl } from "./lyric-line";
1
+ import { Disposable, HasElement, LyricLine } from '../interfaces';
2
+ import { SpringParams } from '../utils/spring';
3
+ import { LyricLineEl } from './lyric-line';
9
4
  /**
10
5
  * 歌词行鼠标相关事件,可以获取到歌词行的索引和歌词行元素
11
6
  */
@@ -28,9 +23,7 @@ export declare class LyricLineMouseEvent extends MouseEvent {
28
23
  */
29
24
  line: LyricLineEl, event: MouseEvent);
30
25
  }
31
- export interface LyricLineMouseEventListener {
32
- (evt: LyricLineMouseEvent): void;
33
- }
26
+ export type LyricLineMouseEventListener = (evt: LyricLineMouseEvent) => void;
34
27
  /**
35
28
  * 歌词播放组件,本框架的核心组件
36
29
  *
@@ -39,6 +32,7 @@ export interface LyricLineMouseEventListener {
39
32
  export declare class LyricPlayer extends EventTarget implements HasElement, Disposable {
40
33
  private element;
41
34
  private currentTime;
35
+ private lastCurrentTime;
42
36
  private lyricLines;
43
37
  private processedLines;
44
38
  private lyricLinesEl;
@@ -47,18 +41,21 @@ export declare class LyricPlayer extends EventTarget implements HasElement, Disp
47
41
  private hotLines;
48
42
  private bufferedLines;
49
43
  private scrollToIndex;
44
+ private _wordFadeWidth;
50
45
  private allowScroll;
51
46
  private scrolledHandler;
52
47
  private isScrolled;
48
+ private isSeeking;
49
+ private initializeSeeking;
53
50
  private invokedByScrollEvent;
54
51
  private scrollOffset;
55
52
  private hidePassedLines;
53
+ private debounceCalcLayout;
56
54
  private resizeObserver;
57
55
  private posXSpringParams;
58
56
  private posYSpringParams;
59
57
  private scaleSpringParams;
60
- private emUnit;
61
- private padding;
58
+ private scaleForBGSpringParams;
62
59
  private enableBlur;
63
60
  private enableScale;
64
61
  private interludeDots;
@@ -70,11 +67,12 @@ export declare class LyricPlayer extends EventTarget implements HasElement, Disp
70
67
  private alignAnchor;
71
68
  private alignPosition;
72
69
  private isNonDynamic;
70
+ private isNonDuet;
73
71
  private scrollBoundary;
74
72
  readonly size: [number, number];
75
73
  readonly innerSize: [number, number];
76
74
  private readonly onLineClickedHandler;
77
- _getIsNonDynamic(): boolean;
75
+ setIsSeeking(isSeeking: boolean): void;
78
76
  /**
79
77
  * 设置是否使用物理弹簧算法实现歌词动画效果,默认启用
80
78
  *
@@ -102,7 +100,6 @@ export declare class LyricPlayer extends EventTarget implements HasElement, Disp
102
100
  * @returns 是否启用歌词行缩放效果
103
101
  */
104
102
  getEnableScale(): boolean;
105
- readonly style: import("jss").StyleSheet<"lyricPlayer" | "lyricLine" | "@media (max-width: 1024px)" | "lyricDuetLine" | "lyricBgLine" | "lyricMainLine" | "lyricSubLine" | "disableSpring" | "interludeDots" | "@supports (mix-blend-mode: plus-lighter)" | "tmpDisableTransition">;
106
103
  private _baseFontSize;
107
104
  get baseFontSize(): number;
108
105
  private isPageVisible;
@@ -125,6 +122,8 @@ export declare class LyricPlayer extends EventTarget implements HasElement, Disp
125
122
  * 重建样式
126
123
  *
127
124
  * 这个只允许内部调用
125
+ *
126
+ * @private
128
127
  */
129
128
  rebuildStyle(): void;
130
129
  /**
@@ -137,11 +136,25 @@ export declare class LyricPlayer extends EventTarget implements HasElement, Disp
137
136
  * @param enable 是否启用
138
137
  */
139
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
+ */
151
+ setWordFadeWidth(value?: number): void;
140
152
  /**
141
153
  * 设置当前播放歌词,要注意传入后这个数组内的信息不得修改,否则会发生错误
142
154
  * @param lines 歌词数组
155
+ * @param initialTime 初始时间,默认为 0
143
156
  */
144
- setLyricLines(lines: LyricLine[]): void;
157
+ setLyricLines(lines: LyricLine[], initialTime?: number): void;
145
158
  /**
146
159
  * 重置用户滚动状态
147
160
  *
@@ -1,5 +1,5 @@
1
- import { LyricPlayer } from ".";
2
- import type { Disposable, HasElement } from "../interfaces";
1
+ import { LyricPlayer } from '.';
2
+ import { Disposable, HasElement } from '../interfaces';
3
3
  export declare class InterludeDots implements HasElement, Disposable {
4
4
  private readonly lyricPlayer;
5
5
  private element;
@@ -1,6 +1,16 @@
1
- import { LyricPlayer } from ".";
2
- import { Disposable, HasElement, LyricLine, LyricWord } from "../interfaces";
3
- import { Spring } from "../utils/spring";
1
+ import { LyricPlayer } from '.';
2
+ import { Disposable, HasElement, LyricLine, LyricWord } from '../interfaces';
3
+ import { Spring } from '../utils/spring';
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
+ }
4
14
  export declare function shouldEmphasize(word: LyricWord): boolean;
5
15
  export declare class RawLyricLineMouseEvent extends MouseEvent {
6
16
  readonly line: LyricLineEl;
@@ -32,11 +42,14 @@ export declare class LyricLineEl extends EventTarget implements HasElement, Disp
32
42
  private readonly onMouseEvent;
33
43
  addMouseEventListener(type: MouseEventTypes, callback: MouseEventListener | null, options?: boolean | AddEventListenerOptions | undefined): void;
34
44
  removeMouseEventListener(type: MouseEventTypes, callback: MouseEventListener | null, options?: boolean | EventListenerOptions | undefined): void;
45
+ areWordsOnSameLine(word1: RealWord, word2: RealWord): boolean;
35
46
  private isEnabled;
36
- enable(maskAnimationTime?: number): void;
47
+ private hasFaded;
48
+ enable(maskAnimationTime?: number): Promise<void>;
37
49
  disable(maskAnimationTime?: number): void;
38
- resume(): void;
39
- pause(): void;
50
+ private lastWord?;
51
+ resume(currentTime?: number): void;
52
+ pause(currentTime?: number): void;
40
53
  setMaskAnimationState(maskAnimationTime?: number): void;
41
54
  measureSize(): [number, number];
42
55
  setLine(line: LyricLine): void;
@@ -51,14 +64,19 @@ export declare class LyricLineEl extends EventTarget implements HasElement, Disp
51
64
  private initFloatAnimation;
52
65
  private initEmphasizeAnimation;
53
66
  private get totalDuration();
54
- updateMaskImage(): void;
67
+ private maskImageDirty;
68
+ private markImageDirtyPromises;
69
+ markMaskImageDirty(): Promise<void>;
70
+ waitMaskImageUpdated(): Promise<void>;
71
+ updateMaskImage(): Promise<void>;
55
72
  private generateCalcBasedMaskImage;
56
73
  private generateWebAnimationBasedMaskImage;
57
74
  getElement(): HTMLElement;
58
- setTransform(left?: number, top?: number, scale?: number, opacity?: number, blur?: number, force?: boolean, delay?: number): void;
75
+ setTransform(left?: number, top?: number, scale?: number, opacity?: number, subopacity?: number, blur?: number, force?: boolean, delay?: number): void;
59
76
  update(delta?: number): void;
60
77
  _getDebugTargetPos(): string;
61
78
  get isInSight(): boolean;
79
+ private disposeElements;
62
80
  dispose(): void;
63
81
  }
64
82
  export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ export declare function debounce<T extends Function>(cb: T, wait?: number): (...args: any) => void;
2
+ export declare function debounceFrame<T extends Function>(cb: T, frameTime?: number): (...args: any) => void;
@@ -0,0 +1,21 @@
1
+ export interface LinearParams {
2
+ duration: number;
3
+ }
4
+ export declare class Linear {
5
+ private currentPosition;
6
+ private targetPosition;
7
+ private currentTime;
8
+ private params;
9
+ private currentSolver;
10
+ private startTime;
11
+ private queueParams;
12
+ private queuePosition;
13
+ constructor(currentPosition?: number);
14
+ private resetSolver;
15
+ arrived(): boolean;
16
+ setPosition(targetPosition: number): void;
17
+ update(delta?: number): void;
18
+ updateParams(params: Partial<LinearParams>, delay?: number): void;
19
+ setTargetPosition(targetPosition: number, delay?: number): void;
20
+ getCurrentPosition(): number;
21
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview
3
+ * @see https://github.com/wilsonpage/fastdom/blob/master/fastdom.js
4
+ */
5
+ export declare function measure<T>(callback: () => T): Promise<T>;
6
+ export declare function mutate(callback: () => void): Promise<unknown>;
@@ -1,4 +1,4 @@
1
- import { Disposable } from "..";
1
+ import { Disposable } from '..';
2
2
  export interface SpringParams {
3
3
  mass: number;
4
4
  damping: number;
package/package.json CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "name": "@applemusic-like-lyrics/core",
3
- "packageManager": "yarn@3.6.1",
4
- "version": "0.1.3",
3
+ "version": "0.2.0-alpha.0",
5
4
  "description": "AMLL 的纯 JS 核心组件框架,包括歌词显示组件和背景组件等其它可以复用的组件",
6
5
  "repository": {
7
6
  "url": "https://github.com/Steve-xmh/applemusic-like-lyrics.git",
@@ -15,13 +14,6 @@
15
14
  "dist/**/*.cjs",
16
15
  "dist/**/*.map"
17
16
  ],
18
- "scripts": {
19
- "build:docs": "typedoc --plugin typedoc-plugin-markdown --out docs src/index.ts",
20
- "build": "vite build",
21
- "build:dev": "vite build",
22
- "fmt": "biome format --write ./src",
23
- "dev": "vite dev"
24
- },
25
17
  "type": "module",
26
18
  "main": "./dist/amll-core.cjs",
27
19
  "module": "./dist/amll-core.js",
@@ -31,23 +23,28 @@
31
23
  "types": "./dist/index.d.ts",
32
24
  "import": "./dist/amll-core.js",
33
25
  "require": "./dist/amll-core.cjs"
26
+ },
27
+ "./style.css": {
28
+ "import": "./dist/style.css",
29
+ "require": "./dist/style.css"
34
30
  }
35
31
  },
36
32
  "devDependencies": {
37
33
  "@applemusic-like-lyrics/lyric": "^0.0.2",
38
- "@applemusic-like-lyrics/ttml": "^0.1.1",
39
- "@biomejs/biome": "1.5.3",
40
- "@types/stats.js": "^0.17.0",
34
+ "@biomejs/biome": "^1.8.3",
35
+ "@types/deep-freeze": "^0.1.5",
36
+ "@types/stats.js": "^0.17.3",
41
37
  "lil-gui": "^0.18.2",
42
38
  "stats.js": "^0.17.0",
43
- "typedoc": "^0.25.2",
44
- "typedoc-plugin-markdown": "^3.16.0",
45
- "typescript": "^5.2.2",
46
- "vite": "^4.4.11",
47
- "vite-plugin-dts": "^3.6.0",
48
- "vite-plugin-glsl": "^1.2.1",
49
- "vite-plugin-top-level-await": "^1.3.1",
50
- "vite-plugin-wasm": "^3.2.2"
39
+ "typedoc": "^0.26.5",
40
+ "typedoc-plugin-markdown": "^4.2.3",
41
+ "typescript": "^5.5.4",
42
+ "vite": "^5.4.0",
43
+ "vite-plugin-dts": "^4.0.3",
44
+ "vite-plugin-glsl": "^1.3.0",
45
+ "vite-plugin-top-level-await": "^1.4.4",
46
+ "vite-plugin-wasm": "^3.3.0",
47
+ "@applemusic-like-lyrics/ttml": "^0.1.1"
51
48
  },
52
49
  "peerDependencies": {
53
50
  "@pixi/app": "*",
@@ -56,12 +53,19 @@
56
53
  "@pixi/filter-blur": "*",
57
54
  "@pixi/filter-bulge-pinch": "*",
58
55
  "@pixi/filter-color-matrix": "*",
59
- "@pixi/sprite": "*",
60
- "jss": "*",
61
- "jss-preset-default": "*"
56
+ "@pixi/sprite": "*"
62
57
  },
63
58
  "dependencies": {
64
- "bezier-easing": "^2.1.0"
59
+ "bezier-easing": "^2.1.0",
60
+ "deep-freeze": "^0.0.1",
61
+ "gl-matrix": "^4.0.0-beta.2"
65
62
  },
66
- "gitHead": "6d9cb894c6510995d6a30ace7a1814dc333d57d1"
67
- }
63
+ "scripts": {
64
+ "build:docs": "typedoc --plugin typedoc-plugin-markdown --out docs src/index.ts",
65
+ "build": "vite build",
66
+ "build:dev": "vite build",
67
+ "fmt": "biome format --write ./src",
68
+ "dev": "vite dev",
69
+ "preinstall": "npx only-allow pnpm"
70
+ }
71
+ }