@applemusic-like-lyrics/core 0.0.15 → 0.1.1

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 +0,0 @@
1
- {"version":3,"file":"amll-core.mjs","sources":["../src/bg-render/pixi-renderer.ts","../src/bg-render/index.ts","../src/utils/eq-set.ts","../src/utils/spring.ts","../src/lyric-player/bottom-line.ts","../src/lyric-player/interlude-dots.ts","../src/lyric-player/lyric-line.ts","../src/lyric-player/index.ts"],"sourcesContent":["import { Container } from \"@pixi/display\";\nimport { Application } from \"@pixi/app\";\nimport { BlurFilter } from \"@pixi/filter-blur\";\nimport { ColorMatrixFilter } from \"@pixi/filter-color-matrix\";\nimport { Texture } from \"@pixi/core\";\nimport { Sprite } from \"@pixi/sprite\";\nimport { BulgePinchFilter } from \"@pixi/filter-bulge-pinch\";\nimport { Disposable } from \"../interfaces\";\n\nclass TimedContainer extends Container {\n\tpublic time = 0;\n}\n\nexport class PixiRenderer implements Disposable {\n\tprivate observer: ResizeObserver;\n\tprivate app: Application;\n\tprivate curContainer?: TimedContainer;\n\tprivate staticMode = false;\n\tprivate lastContainer: Set<TimedContainer> = new Set();\n\tprivate onTick = (delta: number): void => {\n\t\tfor (const lastContainer of this.lastContainer) {\n\t\t\tlastContainer.alpha = Math.max(0, lastContainer.alpha - delta / 60);\n\t\t\tif (lastContainer.alpha <= 0) {\n\t\t\t\tthis.app.stage.removeChild(lastContainer);\n\t\t\t\tthis.lastContainer.delete(lastContainer);\n\t\t\t\tlastContainer.destroy(true);\n\t\t\t}\n\t\t}\n\n\t\tif (this.curContainer) {\n\t\t\tthis.curContainer.alpha = Math.min(\n\t\t\t\t1,\n\t\t\t\tthis.curContainer.alpha + delta / 60,\n\t\t\t);\n\t\t\tconst [s1, s2, s3, s4] = this.curContainer.children as Sprite[];\n\t\t\tconst maxSize = Math.max(this.app.screen.width, this.app.screen.height);\n\t\t\ts1.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts2.position.set(\n\t\t\t\tthis.app.screen.width / 2.5,\n\t\t\t\tthis.app.screen.height / 2.5,\n\t\t\t);\n\t\t\ts3.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts4.position.set(this.app.screen.width / 2, this.app.screen.height / 2);\n\t\t\ts1.width = maxSize * Math.sqrt(2);\n\t\t\ts1.height = s1.width;\n\t\t\ts2.width = maxSize * 0.8;\n\t\t\ts2.height = s2.width;\n\t\t\ts3.width = maxSize * 0.5;\n\t\t\ts3.height = s3.width;\n\t\t\ts4.width = maxSize * 0.25;\n\t\t\ts4.height = s4.width;\n\n\t\t\tthis.curContainer.time += delta * this.flowSpeed;\n\n\t\t\ts1.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts2.rotation -= (delta / 500) * this.flowSpeed;\n\t\t\ts3.rotation += (delta / 1000) * this.flowSpeed;\n\t\t\ts4.rotation -= (delta / 750) * this.flowSpeed;\n\n\t\t\ts3.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\t\t\ts3.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) *\n\t\t\t\t\tMath.cos((this.curContainer.time / 1000) * 0.75);\n\n\t\t\ts4.x =\n\t\t\t\tthis.app.screen.width / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\t\t\ts4.y =\n\t\t\t\tthis.app.screen.height / 2 +\n\t\t\t\t(this.app.screen.width / 4) * 0.1 +\n\t\t\t\tMath.cos(this.curContainer.time * 0.006 * 0.75);\n\n\t\t\tif (\n\t\t\t\tthis.curContainer.alpha >= 1 &&\n\t\t\t\tthis.lastContainer.size === 0 &&\n\t\t\t\tthis.staticMode\n\t\t\t) {\n\t\t\t\tthis.app.ticker.stop();\n\t\t\t}\n\t\t}\n\t};\n\tprivate flowSpeed = 2;\n\tprivate currerntRenderScale = 0.75;\n\tconstructor(private canvas: HTMLCanvasElement) {\n\t\tconst bounds = canvas.getBoundingClientRect();\n\t\tthis.canvas.width = bounds.width * this.currerntRenderScale;\n\t\tthis.canvas.height = bounds.height * this.currerntRenderScale;\n\t\tthis.observer = new ResizeObserver(() => {\n\t\t\tconst bounds = canvas.getBoundingClientRect();\n\t\t\tthis.canvas.width = Math.max(1, bounds.width);\n\t\t\tthis.canvas.height = Math.max(1, bounds.height);\n\t\t\tthis.app.renderer.resize(\n\t\t\t\tthis.canvas.width * this.currerntRenderScale,\n\t\t\t\tthis.canvas.height * this.currerntRenderScale,\n\t\t\t);\n\t\t\tthis.app.ticker.start();\n\t\t\tthis.rebuildFilters();\n\t\t});\n\t\tthis.observer.observe(canvas);\n\t\tthis.app = new Application({\n\t\t\tview: canvas,\n\t\t\tresizeTo: this.canvas,\n\t\t\tpowerPreference: \"low-power\",\n\t\t\tbackgroundAlpha: 0,\n\t\t});\n\t\tthis.rebuildFilters();\n\t\tthis.app.ticker.maxFPS = 30;\n\t\tthis.app.ticker.add(this.onTick);\n\t\tthis.app.ticker.start();\n\t}\n\t/**\n\t * 修改背景的流动速度,数字越大越快,默认为 2\n\t * @param speed 背景的流动速度,默认为 2\n\t */\n\tsetFlowSpeed(speed: number) {\n\t\tthis.flowSpeed = speed;\n\t}\n\t/**\n\t * 修改背景的渲染比例,默认是 0.5\n\t *\n\t * 一般情况下这个程度既没有明显瑕疵也不会特别吃性能\n\t * @param scale 背景的渲染比例\n\t */\n\tsetRenderScale(scale: number) {\n\t\tthis.currerntRenderScale = scale;\n\t\tconst bounds = this.canvas.getBoundingClientRect();\n\t\tthis.canvas.width = Math.max(1, bounds.width);\n\t\tthis.canvas.height = Math.max(1, bounds.height);\n\t\tthis.app.renderer.resize(\n\t\t\tthis.canvas.width * this.currerntRenderScale,\n\t\t\tthis.canvas.height * this.currerntRenderScale,\n\t\t);\n\t\tthis.rebuildFilters();\n\t}\n\tprivate rebuildFilters() {\n\t\tconst minBorder = Math.min(this.canvas.width, this.canvas.height);\n\t\tconst maxBorder = Math.max(this.canvas.width, this.canvas.height);\n\t\tconst c0 = new ColorMatrixFilter();\n\t\tc0.saturate(1.2, false);\n\t\tconst c1 = new ColorMatrixFilter();\n\t\tc1.brightness(0.6, false);\n\t\tconst c2 = new ColorMatrixFilter();\n\t\tc2.contrast(0.3, true);\n\t\tthis.app.stage.filters?.forEach((filter) => {\n\t\t\tfilter.destroy();\n\t\t});\n\t\tthis.app.stage.filters = [];\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(10, 1));\n\t\tthis.app.stage.filters.push(new BlurFilter(20, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(40, 2));\n\t\tthis.app.stage.filters.push(new BlurFilter(80, 2));\n\t\tif (minBorder > 768) this.app.stage.filters.push(new BlurFilter(160, 4));\n\t\tif (minBorder > 768 * 2)\n\t\t\tthis.app.stage.filters.push(new BlurFilter(320, 4));\n\n\t\tthis.app.stage.filters.push(c0, c1, c2);\n\t\tthis.app.stage.filters.push(new BlurFilter(5, 1));\n\t\tif (Math.random() > 0.5) {\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.25, 1],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.75, 0],\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.75, 1],\n\t\t\t\t}),\n\t\t\t);\n\t\t\tthis.app.stage.filters.push(\n\t\t\t\tnew BulgePinchFilter({\n\t\t\t\t\tradius: (maxBorder + minBorder) / 2,\n\t\t\t\t\tstrength: 1,\n\t\t\t\t\tcenter: [0.25, 0],\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t}\n\t/**\n\t * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tsetStaticMode(enable = false) {\n\t\tthis.staticMode = enable;\n\t\tthis.app.ticker.start();\n\t}\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tsetFPS(fps: number) {\n\t\tthis.app.ticker.maxFPS = fps;\n\t}\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tpause() {\n\t\tthis.app.ticker.stop();\n\t\tthis.app.render();\n\t}\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tresume() {\n\t\tthis.app.ticker.start();\n\t}\n\t/**\n\t * 设置背景专辑图片,图片材质加载并设置完成后会返回\n\t * @param albumUrl 图片的目标链接\n\t */\n\tasync setAlbumImage(albumUrl: string) {\n\t\tconst img = new Image();\n\t\timg.src = albumUrl;\n\t\timg.crossOrigin = \"anonymous\";\n\t\tlet remainRetryTimes = 5;\n\t\tlet tex;\n\t\twhile (!tex?.baseTexture?.resource?.valid && remainRetryTimes > 0) {\n\t\t\ttry {\n\t\t\t\tawait img.decode();\n\t\t\t\ttex = Texture.from(img, {\n\t\t\t\t\tresourceOptions: {\n\t\t\t\t\t\tautoLoad: false,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t\tawait tex.baseTexture.resource.load();\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`failed on loading album image, retrying (${remainRetryTimes})`,\n\t\t\t\t\talbumUrl,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\ttex = undefined;\n\t\t\t\tremainRetryTimes--;\n\t\t\t}\n\t\t}\n\t\tif (!tex) return;\n\t\tconst container = new TimedContainer();\n\t\tconst s1 = new Sprite(tex);\n\t\tconst s2 = new Sprite(tex);\n\t\tconst s3 = new Sprite(tex);\n\t\tconst s4 = new Sprite(tex);\n\t\ts1.anchor.set(0.5, 0.5);\n\t\ts2.anchor.set(0.5, 0.5);\n\t\ts3.anchor.set(0.5, 0.5);\n\t\ts4.anchor.set(0.5, 0.5);\n\t\ts1.rotation = Math.random() * Math.PI * 2;\n\t\ts2.rotation = Math.random() * Math.PI * 2;\n\t\ts3.rotation = Math.random() * Math.PI * 2;\n\t\ts4.rotation = Math.random() * Math.PI * 2;\n\t\tcontainer.addChild(s1, s2, s3, s4);\n\t\tif (this.curContainer) this.lastContainer.add(this.curContainer);\n\t\tthis.curContainer = container;\n\t\tthis.app.stage.addChild(this.curContainer);\n\t\tthis.curContainer.alpha = 0;\n\t\tthis.app.ticker.start();\n\t}\n\n\tdispose() {\n\t\tthis.observer.disconnect();\n\t\tthis.app.ticker.remove(this.onTick);\n\t\tthis.app.destroy(true);\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nimport type { HasElement, Disposable } from \"../interfaces\";\nimport { PixiRenderer } from \"./pixi-renderer\";\n\nexport class BackgroundRender\n\textends PixiRenderer\n\timplements HasElement, Disposable\n{\n\tprivate element: HTMLCanvasElement;\n\tconstructor() {\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\tsuper(canvas);\n\t\tthis.element = canvas;\n\t\tcanvas.style.pointerEvents = \"none\";\n\t\tcanvas.style.zIndex = \"-1\";\n\t\tcanvas.style.contain = \"strict\";\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tdispose() {\n\t\tsuper.dispose();\n\t\tthis.element.remove();\n\t}\n}\n","export const eqSet: <T>(xs: Set<T>, ys: Set<T>) => boolean = (\n\txs,\n\tys,\n): boolean => xs.size === ys.size && [...xs].every((x) => ys.has(x));\n","/** MIT License github.com/pushkine/ */\nexport interface SpringParams {\n\tmass: number; // = 1.0\n\tdamping: number; // = 10.0\n\tstiffness: number; // = 100.0\n\tsoft: boolean; // = false\n}\n\ntype seconds = number;\n\nexport class Spring {\n\tprivate currentPosition = 0;\n\tprivate targetPosition = 0;\n\tprivate currentTime = 0;\n\tprivate params: Partial<SpringParams> = {};\n\tprivate currentSolver: (t: seconds) => number;\n\tprivate getV: (t: seconds) => number;\n\tprivate getV2: (t: seconds) => number;\n\tprivate queueParams:\n\t\t| (Partial<SpringParams> & {\n\t\t\t\ttime: number;\n\t\t })\n\t\t| undefined;\n\tprivate queuePosition:\n\t\t| {\n\t\t\t\ttime: number;\n\t\t\t\tposition: number;\n\t\t }\n\t\t| undefined;\n\tconstructor(currentPosition = 0) {\n\t\tthis.targetPosition = currentPosition;\n\t\tthis.currentPosition = this.targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t\tthis.getV2 = () => 0;\n\t}\n\tprivate resetSolver() {\n\t\tconst curV = this.getV(this.currentTime);\n\t\tthis.currentTime = 0;\n\t\tthis.currentSolver = solveSpring(\n\t\t\tthis.currentPosition,\n\t\t\tcurV,\n\t\t\tthis.targetPosition,\n\t\t\t0,\n\t\t\tthis.params,\n\t\t);\n\t\tthis.getV = getVelocity(this.currentSolver);\n\t\tthis.getV2 = getVelocity(this.getV);\n\t}\n\tarrived() {\n\t\treturn (\n\t\t\tMath.abs(this.targetPosition - this.currentPosition) < 0.01 &&\n\t\t\tthis.getV(this.currentTime) < 0.01 &&\n\t\t\tthis.getV2(this.currentTime) < 0.01 &&\n\t\t\tthis.queueParams === undefined &&\n\t\t\tthis.queuePosition === undefined\n\t\t);\n\t}\n\tsetPosition(targetPosition: number) {\n\t\tthis.targetPosition = targetPosition;\n\t\tthis.currentPosition = targetPosition;\n\t\tthis.currentSolver = () => this.targetPosition;\n\t\tthis.getV = () => 0;\n\t\tthis.getV2 = () => 0;\n\t}\n\tupdate(delta = 0) {\n\t\tthis.currentTime += delta;\n\t\tthis.currentPosition = this.currentSolver(this.currentTime);\n\t\tif (this.queueParams) {\n\t\t\tthis.queueParams.time -= delta;\n\t\t\tif (this.queueParams.time <= 0) {\n\t\t\t\tthis.updateParams({\n\t\t\t\t\t...this.queueParams,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tif (this.queuePosition) {\n\t\t\tthis.queuePosition.time -= delta;\n\t\t\tif (this.queuePosition.time <= 0) {\n\t\t\t\tthis.setTargetPosition(this.queuePosition.position);\n\t\t\t}\n\t\t}\n\t\tif (this.arrived()) {\n\t\t\tthis.setPosition(this.targetPosition);\n\t\t}\n\t}\n\tupdateParams(params: Partial<SpringParams>, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queueParams = {\n\t\t\t\t...(this.queuePosition ?? {}),\n\t\t\t\t...params,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.params = {\n\t\t\t\t...this.params,\n\t\t\t\t...params,\n\t\t\t};\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tsetTargetPosition(targetPosition: number, delay = 0) {\n\t\tif (delay > 0) {\n\t\t\tthis.queuePosition = {\n\t\t\t\t...(this.queuePosition ?? {}),\n\t\t\t\tposition: targetPosition,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.queuePosition = undefined;\n\t\t\tthis.targetPosition = targetPosition;\n\t\t\tthis.resetSolver();\n\t\t}\n\t}\n\tgetCurrentPosition() {\n\t\treturn this.currentPosition;\n\t}\n}\n\nfunction solveSpring(\n\tfrom: number,\n\tvelocity: number,\n\tto: number,\n\tdelay: seconds = 0,\n\tparams?: Partial<SpringParams>,\n): (t: seconds) => number {\n\tconst soft = params?.soft ?? false;\n\tconst stiffness = params?.stiffness ?? 100;\n\tconst damping = params?.damping ?? 10;\n\tconst mass = params?.mass ?? 1;\n\tconst delta = to - from;\n\tif (soft || 1.0 <= damping / (2.0 * Math.sqrt(stiffness * mass))) {\n\t\tconst angular_frequency = -Math.sqrt(stiffness / mass);\n\t\tconst leftover = -angular_frequency * delta - velocity;\n\t\treturn (t: seconds) => {\n\t\t\tt -= delay;\n\t\t\tif (t < 0) return from;\n\t\t\treturn to - (delta + t * leftover) * Math.E ** (t * angular_frequency);\n\t\t};\n\t} else {\n\t\tconst damping_frequency = Math.sqrt(\n\t\t\t4.0 * mass * stiffness - damping ** 2.0,\n\t\t);\n\t\tconst leftover =\n\t\t\t(damping * delta - 2.0 * mass * velocity) / damping_frequency;\n\t\tconst dfm = (0.5 * damping_frequency) / mass;\n\t\tconst dm = -(0.5 * damping) / mass;\n\t\treturn (t: seconds) => {\n\t\t\tt -= delay;\n\t\t\tif (t < 0) return from;\n\t\t\treturn (\n\t\t\t\tto -\n\t\t\t\t(Math.cos(t * dfm) * delta + Math.sin(t * dfm) * leftover) *\n\t\t\t\t\tMath.E ** (t * dm)\n\t\t\t);\n\t\t};\n\t}\n}\n\nfunction derivative(f: (x: number) => number) {\n\tconst h = 0.001;\n\treturn (x: number) => (f(x + h) - f(x - h)) / (2 * h);\n}\n\nfunction getVelocity(f: (t: seconds) => number): (t: seconds) => number {\n\treturn derivative(f);\n}\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nexport class BottomLineEl implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate delay = 0;\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t};\n\tconstructor(private lyricPlayer: LyricPlayer) {\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tthis.rebuildStyle();\n\t}\n\tmeasureSize(): [number, number] {\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\treturn size;\n\t}\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tlet style = `transform:translate(${this.lineTransforms.posX\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(2)}px,${this.lineTransforms.posY\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(2)}px);`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tif (force || !this.lyricPlayer.getEnableSpring()) {\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tif (!this.lyricPlayer.getEnableSpring()) this.show();\n\t\t\telse this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pr = this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.size[1];\n\t\treturn !(l > pr || t > pb || r < 0 || b < 0);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","import { LyricPlayer } from \".\";\nimport type { Disposable, HasElement } from \"../interfaces\";\n\nfunction easeInOutBack(x: number): number {\n\tconst c1 = 1.70158;\n\tconst c2 = c1 * 1.525;\n\n\treturn x < 0.5\n\t\t? (Math.pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2\n\t\t: (Math.pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2;\n}\n\nconst clamp = (min: number, cur: number, max: number) =>\n\tMath.max(min, Math.min(cur, max));\n\nexport class InterludeDots implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate dot0: HTMLElement = document.createElement(\"span\");\n\tprivate dot1: HTMLElement = document.createElement(\"span\");\n\tprivate dot2: HTMLElement = document.createElement(\"span\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate lastStyle = \"\";\n\tprivate currentInterlude?: [number, number];\n\tprivate currentTime = 0;\n\tprivate targetBreatheDuration = 1500;\n\tconstructor(private readonly lyricPlayer: LyricPlayer) {\n\t\tthis.element.className = this.lyricPlayer.style.classes.interludeDots;\n\t\tthis.element.appendChild(this.dot0);\n\t\tthis.element.appendChild(this.dot1);\n\t\tthis.element.appendChild(this.dot2);\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(left: number = this.left, top: number = this.top) {\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.update();\n\t}\n\tsetInterlude(interlude?: [number, number]) {\n\t\tthis.currentInterlude = interlude;\n\t\tthis.currentTime = interlude?.[0] ?? 0;\n\t}\n\tupdate(delta = 0) {\n\t\tthis.currentTime += delta;\n\t\tlet curStyle = \"\";\n\n\t\tcurStyle += `transform:translate(${this.left.toFixed(\n\t\t\t2,\n\t\t)}px, ${this.top.toFixed(2)}px)`;\n\n\t\t// 计算缩放大小\n\n\t\tif (this.currentInterlude) {\n\t\t\tconst interludeDuration =\n\t\t\t\tthis.currentInterlude[1] - this.currentInterlude[0];\n\t\t\tconst currentDuration = this.currentTime - this.currentInterlude[0];\n\t\t\tif (currentDuration <= interludeDuration) {\n\t\t\t\tconst breatheDuration =\n\t\t\t\t\tinterludeDuration /\n\t\t\t\t\tMath.ceil(interludeDuration / this.targetBreatheDuration);\n\t\t\t\tlet scale = 1;\n\t\t\t\tlet globalOpacity = 1;\n\n\t\t\t\tscale *=\n\t\t\t\t\tMath.sin(1.5 * Math.PI - (currentDuration / breatheDuration) * 2) /\n\t\t\t\t\t\t10 +\n\t\t\t\t\t1;\n\n\t\t\t\tif (currentDuration < 1000) {\n\t\t\t\t\tscale *= 1 - Math.pow((1000 - currentDuration) / 1000, 2);\n\t\t\t\t}\n\n\t\t\t\tif (currentDuration < 500) {\n\t\t\t\t\tglobalOpacity = 0;\n\t\t\t\t} else if (currentDuration < 1000) {\n\t\t\t\t\tglobalOpacity *= (currentDuration - 500) / 500;\n\t\t\t\t}\n\n\t\t\t\tif (interludeDuration - currentDuration < 750) {\n\t\t\t\t\tscale *=\n\t\t\t\t\t\t1 -\n\t\t\t\t\t\teaseInOutBack(\n\t\t\t\t\t\t\t(750 - (interludeDuration - currentDuration)) / 750 / 2,\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (interludeDuration - currentDuration < 375) {\n\t\t\t\t\tglobalOpacity *= clamp(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t(interludeDuration - currentDuration) / 375,\n\t\t\t\t\t\t1,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tscale = Math.max(0, scale);\n\n\t\t\t\tcurStyle += ` scale(${scale})`;\n\n\t\t\t\tconst dot0Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t((currentDuration * 3) / interludeDuration) * 0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot1Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - interludeDuration / 3) * 3) /\n\t\t\t\t\t\tinterludeDuration) *\n\t\t\t\t\t\t0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\t\t\t\tconst dot2Opacity = clamp(\n\t\t\t\t\t0.25,\n\t\t\t\t\t(((currentDuration - (interludeDuration / 3) * 2) * 3) /\n\t\t\t\t\t\tinterludeDuration) *\n\t\t\t\t\t\t0.75,\n\t\t\t\t\t1,\n\t\t\t\t);\n\n\t\t\t\tthis.dot0.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot0Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot1.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot1Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t\tthis.dot2.style.opacity = `${clamp(\n\t\t\t\t\t0,\n\t\t\t\t\tMath.max(0, globalOpacity * dot2Opacity),\n\t\t\t\t\t1,\n\t\t\t\t)}`;\n\t\t\t} else {\n\t\t\t\tcurStyle += \" scale(0)\";\n\t\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t\t}\n\t\t} else {\n\t\t\tcurStyle += \" scale(0)\";\n\t\t\tthis.dot0.style.opacity = \"0\";\n\t\t\tthis.dot1.style.opacity = \"0\";\n\t\t\tthis.dot2.style.opacity = \"0\";\n\t\t}\n\n\t\tcurStyle += \";\";\n\n\t\tif (this.lastStyle !== curStyle) {\n\t\t\tthis.element.setAttribute(\"style\", curStyle);\n\t\t\tthis.lastStyle = curStyle;\n\t\t}\n\t}\n\tdispose() {\n\t\tthis.element.remove();\n\t}\n}\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement, LyricLine, LyricWord } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nconst CJKEXP = /^[\\p{Unified_Ideograph}\\u0800-\\u9FFC]+$/u;\n\ninterface RealWord extends LyricWord {\n\tmainElement: HTMLSpanElement;\n\tsubElements: HTMLSpanElement[];\n\telementAnimations: Animation[];\n\twidth: number;\n\theight: number;\n\tshouldEmphasize: boolean;\n}\n\nfunction generateFadeGradient(\n\twidth: number,\n\tbright = \"rgba(0,0,0,0.85)\",\n\tdark = \"rgba(0,0,0,0.5)\",\n): [string, number, number] {\n\tconst totalAspect = 2 + width;\n\tconst widthInTotal = width / totalAspect;\n\tconst leftPos = (1 - widthInTotal) / 2;\n\treturn [\n\t\t`linear-gradient(to right,${bright} ${leftPos * 100}%,${dark} ${\n\t\t\t(leftPos + widthInTotal) * 100\n\t\t}%)`,\n\t\twidthInTotal,\n\t\ttotalAspect,\n\t];\n}\n\n// 将输入的单词重新分组,之间没有空格的单词将会组合成一个单词数组\n// 例如输入:[\"Life\", \" \", \"is\", \" a\", \" su\", \"gar\"]\n// 应该返回:[\"Life\", \" \", \"is\", \" a\", [\" su\", \"gar\"]]\nfunction chunkLyricWords<T>(\n\twords: T[],\n\twordGetter: (word: T) => string,\n): (T | T[])[] {\n\tlet wordChunk: string[] = [];\n\tlet wChunk: T[] = [];\n\tconst result: (T | T[])[] = [];\n\n\tfor (const w of words) {\n\t\tconst word = wordGetter(w);\n\t\twordChunk.push(word);\n\t\twChunk.push(w);\n\t\tif (word.length > 0 && word.trim().length === 0) {\n\t\t\twordChunk.pop();\n\t\t\twChunk.pop();\n\t\t\tif (wChunk.length === 1) {\n\t\t\t\tresult.push(wChunk[0]);\n\t\t\t} else if (wChunk.length > 1) {\n\t\t\t\tresult.push(wChunk);\n\t\t\t}\n\t\t\tresult.push(w);\n\t\t\twordChunk = [];\n\t\t\twChunk = [];\n\t\t} else if (\n\t\t\t!/^\\s*[^\\s]*\\s*$/.test(wordChunk.join(\"\")) ||\n\t\t\tCJKEXP.test(word)\n\t\t) {\n\t\t\twordChunk.pop();\n\t\t\twChunk.pop();\n\t\t\tif (wChunk.length === 1) {\n\t\t\t\tresult.push(wChunk[0]);\n\t\t\t} else if (wChunk.length > 1) {\n\t\t\t\tresult.push(wChunk);\n\t\t\t}\n\t\t\twordChunk = [word];\n\t\t\twChunk = [w];\n\t\t}\n\t}\n\n\tif (wChunk.length === 1) {\n\t\tresult.push(wChunk[0]);\n\t} else {\n\t\tresult.push(wChunk);\n\t}\n\n\treturn result;\n}\n\n// 果子在对辉光效果的解释是一种强调(emphasized)效果\n// 条件是一个单词时长大于等于 1s 且长度小于等于 7\nexport function shouldEmphasize(word: LyricWord): boolean {\n\treturn word.endTime - word.startTime >= 1000 && word.word.length <= 7;\n}\n\nexport class RawLyricLineMouseEvent extends MouseEvent {\n\tconstructor(public readonly line: LyricLineEl, event: MouseEvent) {\n\t\tsuper(event.type, event);\n\t}\n}\n\ntype MouseEventMap = {\n\t[evt in\n\t\tkeyof HTMLElementEventMap]: HTMLElementEventMap[evt] extends MouseEvent\n\t\t? evt\n\t\t: never;\n};\ntype MouseEventTypes = MouseEventMap[keyof MouseEventMap];\ntype MouseEventListener = (\n\tthis: LyricLineEl,\n\tev: RawLyricLineMouseEvent,\n) => void;\n\nexport class LyricLineEl extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate left = 0;\n\tprivate top = 0;\n\tprivate scale = 1;\n\tprivate blur = 0;\n\tprivate delay = 0;\n\tprivate splittedWords: RealWord[] = [];\n\t// 由 LyricPlayer 来设置\n\tlineSize: number[] = [0, 0];\n\treadonly lineTransforms = {\n\t\tposX: new Spring(0),\n\t\tposY: new Spring(0),\n\t\tscale: new Spring(1),\n\t};\n\t// rome-ignore lint/correctness/noUnreachableSuper: <explanation>\n\tconstructor(\n\t\tprivate lyricPlayer: LyricPlayer,\n\t\tprivate lyricLine: LyricLine = {\n\t\t\twords: [],\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tstartTime: 0,\n\t\t\tendTime: 0,\n\t\t\tisBG: false,\n\t\t\tisDuet: false,\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis._prevParentEl = lyricPlayer.getElement();\n\t\tthis.element.setAttribute(\n\t\t\t\"class\",\n\t\t\tthis.lyricPlayer.style.classes.lyricLine,\n\t\t);\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t}\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 歌词行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 翻译行\n\t\tthis.element.appendChild(document.createElement(\"div\")); // 音译行\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricMainLine);\n\t\ttrans.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\troman.setAttribute(\"class\", this.lyricPlayer.style.classes.lyricSubLine);\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tprivate listenersMap = new Map<string, Set<MouseEventListener>>();\n\tprivate readonly onMouseEvent = (e: MouseEvent) => {\n\t\tconst wrapped = new RawLyricLineMouseEvent(this, e);\n\t\tfor (const listener of this.listenersMap.get(e.type) ?? []) {\n\t\t\tlistener.call(this, wrapped);\n\t\t}\n\t\tif (!this.dispatchEvent(wrapped) || wrapped.defaultPrevented) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t\treturn false;\n\t\t}\n\t};\n\n\taddMouseEventListener(\n\t\ttype: MouseEventTypes,\n\t\tcallback: MouseEventListener | null,\n\t\toptions?: boolean | AddEventListenerOptions | undefined,\n\t): void {\n\t\tif (callback) {\n\t\t\tconst listeners = this.listenersMap.get(type) ?? new Set();\n\t\t\tif (listeners.size === 0)\n\t\t\t\tthis.element.addEventListener(type, this.onMouseEvent);\n\t\t\tlisteners.add(callback);\n\t\t\tthis.listenersMap.set(type, listeners);\n\t\t}\n\t}\n\n\tremoveMouseEventListener(\n\t\ttype: MouseEventTypes,\n\t\tcallback: MouseEventListener | null,\n\t\toptions?: boolean | EventListenerOptions | undefined,\n\t): void {\n\t\tif (callback) {\n\t\t\tconst listeners = this.listenersMap.get(type);\n\t\t\tif (listeners) {\n\t\t\t\tlisteners.delete(callback);\n\t\t\t\tif (listeners.size === 0)\n\t\t\t\t\tthis.element.removeEventListener(type, this.onMouseEvent);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isEnabled = false;\n\tenable() {\n\t\tthis.isEnabled = true;\n\t\tthis.element.classList.add(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tword.elementAnimations.forEach((a) => {\n\t\t\t\ta.currentTime = 0;\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\ta.play();\n\t\t\t});\n\t\t});\n\t\tmain.classList.add(\"active\");\n\t}\n\tmeasureSize(): [number, number] {\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\t}\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tconst size: [number, number] = [\n\t\t\tthis.element.clientWidth,\n\t\t\tthis.element.clientHeight,\n\t\t];\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis.element.remove();\n\t\t\t}\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t\treturn size;\n\t}\n\tdisable() {\n\t\tthis.isEnabled = false;\n\t\tthis.element.classList.remove(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tword.elementAnimations.forEach((a) => {\n\t\t\t\tif (a.id === \"float-word\") {\n\t\t\t\t\ta.playbackRate = -1;\n\t\t\t\t\ta.play();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\tmain.classList.remove(\"active\");\n\t}\n\tsetLine(line: LyricLine) {\n\t\tthis.lyricLine = line;\n\t\tif (this.lyricLine.isBG) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(this.lyricPlayer.style.classes.lyricBgLine);\n\t\t}\n\t\tif (this.lyricLine.isDuet) {\n\t\t\tthis.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine);\n\t\t} else {\n\t\t\tthis.element.classList.remove(\n\t\t\t\tthis.lyricPlayer.style.classes.lyricDuetLine,\n\t\t\t);\n\t\t}\n\t\tthis.rebuildElement();\n\t\tthis.rebuildStyle();\n\t}\n\tgetLine() {\n\t\treturn this.lyricLine;\n\t}\n\tprivate _hide = true;\n\tprivate _prevParentEl: HTMLElement | null = null;\n\tprivate lastStyle = \"\";\n\tshow() {\n\t\tthis._hide = false;\n\t\tif (this._prevParentEl) {\n\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\tthis._prevParentEl = null;\n\t\t}\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis._hide = true;\n\t\tif (this.element.parentElement) {\n\t\t\tthis._prevParentEl = this.element.parentElement;\n\t\t\tthis.element.remove();\n\t\t}\n\t\tthis.rebuildStyle();\n\t}\n\trebuildStyle() {\n\t\tif (this._hide) {\n\t\t\tif (this.lastStyle !== \"display:none;transform:translate(0,-10000px);\") {\n\t\t\t\tthis.lastStyle = \"display:none;transform:translate(0,-10000px);\";\n\t\t\t\tthis.element.setAttribute(\n\t\t\t\t\t\"style\",\n\t\t\t\t\t\"display:none;transform:translate(0,-10000px);\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tlet style = `transform:translate(${this.lineTransforms.posX\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(2)}px,${this.lineTransforms.posY\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(2)}px) scale(${this.lineTransforms.scale\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(4)});`;\n\t\tif (!this.lyricPlayer.getEnableSpring() && this.isInSight) {\n\t\t\tstyle += `transition-delay:${this.delay}ms;`;\n\t\t}\n\t\tstyle += `filter:blur(${Math.min(32, this.blur)}px);`;\n\t\tif (style !== this.lastStyle) {\n\t\t\tthis.lastStyle = style;\n\t\t\tthis.element.setAttribute(\"style\", style);\n\t\t}\n\t}\n\trebuildElement() {\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\t// 如果是非动态歌词,那么就不需要分词了\n\t\tif (this.lyricPlayer._getIsNonDynamic()) {\n\t\t\tmain.innerText = this.lyricLine.words.map((w) => w.word).join(\"\");\n\t\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\t\troman.innerText = this.lyricLine.romanLyric;\n\t\t\treturn;\n\t\t}\n\t\tconst chunkedWords = chunkLyricWords(this.lyricLine.words, (w) => w.word);\n\t\tmain.innerHTML = \"\";\n\t\tthis.splittedWords = [];\n\t\tfor (const chunk of chunkedWords) {\n\t\t\tif (chunk instanceof Array) {\n\t\t\t\tconst emp = chunk\n\t\t\t\t\t.map((word) => shouldEmphasize(word))\n\t\t\t\t\t.reduce((a, b) => a || b, false);\n\t\t\t\tconst merged = chunk.reduce(\n\t\t\t\t\t(a, b) => {\n\t\t\t\t\t\ta.endTime = Math.max(a.endTime, b.endTime);\n\t\t\t\t\t\ta.startTime = Math.min(a.startTime, b.startTime);\n\t\t\t\t\t\ta.word += b.word;\n\t\t\t\t\t\treturn a;\n\t\t\t\t\t},\n\t\t\t\t\t{ word: \"\", startTime: Infinity, endTime: -Infinity },\n\t\t\t\t);\n\t\t\t\tconst wrapperWordEl = document.createElement(\"span\");\n\t\t\t\tfor (const word of chunk) {\n\t\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\t\tconst mainWordFloatAnimation = this.initFloatAnimation(\n\t\t\t\t\t\tmerged,\n\t\t\t\t\t\tmainWordEl,\n\t\t\t\t\t);\n\t\t\t\t\tif (emp) {\n\t\t\t\t\t\tmainWordEl.classList.add(\"emphasize\");\n\t\t\t\t\t\tconst charEls: HTMLSpanElement[] = [];\n\t\t\t\t\t\tfor (const char of word.word.trim().split(\"\")) {\n\t\t\t\t\t\t\tconst charEl = document.createElement(\"span\");\n\t\t\t\t\t\t\tcharEl.innerText = char;\n\t\t\t\t\t\t\tcharEls.push(charEl);\n\t\t\t\t\t\t\tmainWordEl.appendChild(charEl);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst realWord: RealWord = {\n\t\t\t\t\t\t\t...word,\n\t\t\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\t\t\tsubElements: charEls,\n\t\t\t\t\t\t\telementAnimations: [mainWordFloatAnimation],\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t\t\t};\n\t\t\t\t\t\trealWord.elementAnimations.push(\n\t\t\t\t\t\t\t...this.initEmphasizeAnimation(realWord),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.splittedWords.push(realWord);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmainWordEl.innerText = word.word;\n\t\t\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\t\t\t...word,\n\t\t\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\t\t\tsubElements: [],\n\t\t\t\t\t\t\telementAnimations: [mainWordFloatAnimation],\n\t\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\twrapperWordEl.appendChild(mainWordEl);\n\t\t\t\t}\n\t\t\t\tif (merged.word.trimStart() !== merged.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tmain.appendChild(wrapperWordEl);\n\t\t\t\tif (merged.word.trimEnd() !== merged.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t} else if (chunk.word.trim().length === 0) {\n\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t} else {\n\t\t\t\tconst emp = shouldEmphasize(chunk);\n\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\tconst realWord: RealWord = {\n\t\t\t\t\t...chunk,\n\t\t\t\t\tmainElement: mainWordEl,\n\t\t\t\t\tsubElements: [],\n\t\t\t\t\telementAnimations: [this.initFloatAnimation(chunk, mainWordEl)],\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\tshouldEmphasize: emp,\n\t\t\t\t};\n\t\t\t\tif (emp) {\n\t\t\t\t\tmainWordEl.classList.add(\"emphasize\");\n\t\t\t\t\tconst charEls: HTMLSpanElement[] = [];\n\t\t\t\t\tfor (const char of chunk.word.trim().split(\"\")) {\n\t\t\t\t\t\tconst charEl = document.createElement(\"span\");\n\t\t\t\t\t\tcharEl.innerText = char;\n\t\t\t\t\t\tcharEls.push(charEl);\n\t\t\t\t\t\tmainWordEl.appendChild(charEl);\n\t\t\t\t\t}\n\t\t\t\t\trealWord.subElements = charEls;\n\t\t\t\t\trealWord.elementAnimations.push(\n\t\t\t\t\t\t...this.initEmphasizeAnimation(realWord),\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tmainWordEl.innerText = chunk.word.trim();\n\t\t\t\t}\n\t\t\t\tif (chunk.word.trimStart() !== chunk.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tmain.appendChild(mainWordEl);\n\t\t\t\tif (chunk.word.trimEnd() !== chunk.word) {\n\t\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t\t}\n\t\t\t\tthis.splittedWords.push(realWord);\n\t\t\t}\n\t\t}\n\t\ttrans.innerText = this.lyricLine.translatedLyric;\n\t\troman.innerText = this.lyricLine.romanLyric;\n\t}\n\tprivate initFloatAnimation(word: LyricWord, wordEl: HTMLSpanElement) {\n\t\tconst delay = word.startTime - this.lyricLine.startTime;\n\t\tconst duration = Math.max(1000, word.endTime - word.startTime);\n\t\tconst a = wordEl.animate(\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\ttransform: \"translateY(0px)\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\ttransform: \"translateY(-3%)\",\n\t\t\t\t},\n\t\t\t],\n\t\t\t{\n\t\t\t\tduration: isFinite(duration) ? duration : 0,\n\t\t\t\tdelay: isFinite(delay) ? delay : 0,\n\t\t\t\tid: \"float-word\",\n\t\t\t\tcomposite: \"add\",\n\t\t\t\tfill: \"both\",\n\t\t\t},\n\t\t);\n\t\ta.pause();\n\t\treturn a;\n\t}\n\tprivate initEmphasizeAnimation(word: RealWord): Animation[] {\n\t\tconst delay = word.startTime - this.lyricLine.startTime;\n\t\tconst duration = word.endTime - word.startTime;\n\t\treturn word.subElements.map((el, i, arr) => {\n\t\t\tconst du = Math.max(1000, word.endTime - word.startTime);\n\t\t\tconst de = delay + (duration / arr.length) * i;\n\t\t\tconst a = el.animate(\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\ttransform: \"translate3d(0, 0, 0px)\",\n\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-view-color,white))\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\toffset: 0.5,\n\t\t\t\t\t\ttransform: \"translate3d(0, -0.02em, 20px)\",\n\t\t\t\t\t\tfilter:\n\t\t\t\t\t\t\t\"drop-shadow(0 0 0.05em var(--amll-lyric-view-color,white))\",\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\toffset: 1,\n\t\t\t\t\t\ttransform: \"translate3d(0, 0, 0)\",\n\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-view-color,white))\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t{\n\t\t\t\t\tduration: isFinite(du) ? du : 0,\n\t\t\t\t\tdelay: isFinite(de) ? de : 0,\n\t\t\t\t\tid: \"glow-word\",\n\t\t\t\t\titerations: 1,\n\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\teasing: \"ease-in-out\",\n\t\t\t\t\tfill: \"both\",\n\t\t\t\t},\n\t\t\t);\n\t\t\ta.pause();\n\t\t\treturn a;\n\t\t});\n\t}\n\tupdateMaskImage() {\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis._prevParentEl.appendChild(this.element);\n\t\t\t}\n\t\t\tthis.element.style.display = \"\";\n\t\t\tthis.element.style.visibility = \"hidden\";\n\t\t}\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tconst wordEl = word.mainElement;\n\t\t\tif (wordEl) {\n\t\t\t\tword.width = wordEl.clientWidth;\n\t\t\t\tword.height = wordEl.clientHeight;\n\t\t\t\tconst fadeWidth = word.height / 2;\n\t\t\t\tconst [maskImage, _widthInTotal, totalAspect] = generateFadeGradient(\n\t\t\t\t\tfadeWidth / word.width,\n\t\t\t\t\t\"rgba(0,0,0,0.85)\",\n\t\t\t\t\t\"rgba(0,0,0,0.25)\",\n\t\t\t\t);\n\t\t\t\tconst totalAspectStr = `${totalAspect * 100}% 100%`;\n\t\t\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\t\t\twordEl.style.maskImage = maskImage;\n\t\t\t\t\twordEl.style.maskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.maskOrigin = \"left\";\n\t\t\t\t\twordEl.style.maskSize = totalAspectStr;\n\t\t\t\t} else {\n\t\t\t\t\twordEl.style.webkitMaskImage = maskImage;\n\t\t\t\t\twordEl.style.webkitMaskRepeat = \"no-repeat\";\n\t\t\t\t\twordEl.style.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\tconst w = word.width + fadeWidth;\n\t\t\t\tconst maskPos = `clamp(${-w}px,calc(${-w}px + (var(--amll-player-time) - ${\n\t\t\t\t\tword.startTime\n\t\t\t\t})*${\n\t\t\t\t\tw / Math.abs(word.endTime - word.startTime)\n\t\t\t\t}px),0px) 0px, left top`;\n\t\t\t\t// const maskPos = `clamp(0px,${w}px,${w}px) 0px, left top`;\n\t\t\t\twordEl.style.maskPosition = maskPos;\n\t\t\t\twordEl.style.webkitMaskPosition = maskPos;\n\t\t\t}\n\t\t});\n\t\tif (this._hide) {\n\t\t\tif (this._prevParentEl) {\n\t\t\t\tthis.element.remove();\n\t\t\t}\n\t\t\tthis.element.style.display = \"none\";\n\t\t\tthis.element.style.visibility = \"\";\n\t\t}\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tsetTransform(\n\t\tleft: number = this.left,\n\t\ttop: number = this.top,\n\t\tscale: number = this.scale,\n\t\topacity = 1,\n\t\tblur = 0,\n\t\tforce = false,\n\t\tdelay = 0,\n\t) {\n\t\tconst beforeInSight = this.isInSight;\n\t\tconst enableSpring = this.lyricPlayer.getEnableSpring();\n\t\tthis.left = left;\n\t\tthis.top = top;\n\t\tthis.scale = scale;\n\t\tthis.delay = (delay * 1000) | 0;\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tconst trans = this.element.children[1] as HTMLDivElement;\n\t\tconst roman = this.element.children[2] as HTMLDivElement;\n\t\tmain.style.opacity = `${opacity}`;\n\t\ttrans.style.opacity = `${opacity / 2}`;\n\t\troman.style.opacity = `${opacity / 2}`;\n\t\tif (force || !enableSpring) {\n\t\t\tthis.blur = Math.min(32, blur);\n\t\t\tif (force)\n\t\t\t\tthis.element.classList.add(\n\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t);\n\t\t\tthis.lineTransforms.posX.setPosition(left);\n\t\t\tthis.lineTransforms.posY.setPosition(top);\n\t\t\tthis.lineTransforms.scale.setPosition(scale);\n\t\t\tif (!enableSpring) {\n\t\t\t\tconst afterInSight = this.isInSight;\n\t\t\t\tif (beforeInSight || afterInSight) {\n\t\t\t\t\tthis.show();\n\t\t\t\t} else {\n\t\t\t\t\tthis.hide();\n\t\t\t\t}\n\t\t\t} else this.rebuildStyle();\n\t\t\tif (force)\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tthis.element.classList.remove(\n\t\t\t\t\t\tthis.lyricPlayer.style.classes.tmpDisableTransition,\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t} else {\n\t\t\tthis.lineTransforms.posX.setTargetPosition(left, delay);\n\t\t\tthis.lineTransforms.posY.setTargetPosition(top, delay);\n\t\t\tthis.lineTransforms.scale.setTargetPosition(scale);\n\t\t\tif (this.blur !== Math.min(32, blur)) {\n\t\t\t\tthis.blur = Math.min(32, blur);\n\t\t\t\tthis.element.style.filter = `blur(${Math.min(32, blur)}px)`;\n\t\t\t}\n\t\t}\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.lyricPlayer.getEnableSpring()) return;\n\t\tthis.lineTransforms.posX.update(delta);\n\t\tthis.lineTransforms.posY.update(delta);\n\t\tthis.lineTransforms.scale.update(delta);\n\t\tif (this.isInSight) {\n\t\t\tthis.show();\n\t\t} else {\n\t\t\tthis.hide();\n\t\t}\n\t}\n\n\t_getDebugTargetPos(): string {\n\t\treturn `[位移: ${this.left}, ${this.top}; 缩放: ${this.scale}; 延时: ${this.delay}]`;\n\t}\n\n\tget isInSight() {\n\t\tconst l = this.lineTransforms.posX.getCurrentPosition();\n\t\tconst t = this.lineTransforms.posY.getCurrentPosition();\n\t\tconst r = l + this.lineSize[0];\n\t\tconst b = t + this.lineSize[1];\n\t\tconst pr = this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.size[1];\n\t\treturn !(l > pr || r < 0 || t > pb || b < 0);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nimport type { Disposable, HasElement, LyricLine } from \"../interfaces\";\nimport { eqSet } from \"../utils/eq-set\";\nimport { SpringParams } from \"../utils/spring\";\nimport { BottomLineEl } from \"./bottom-line\";\nimport { InterludeDots } from \"./interlude-dots\";\nimport {\n\tLyricLineEl,\n\tRawLyricLineMouseEvent,\n\tshouldEmphasize,\n} from \"./lyric-line\";\nimport { create } from \"jss\";\nimport preset from \"jss-preset-default\";\n\nconst jss = create(preset());\n\n/**\n * 歌词行鼠标相关事件,可以获取到歌词行的索引和歌词行元素\n */\nexport class LyricLineMouseEvent extends MouseEvent {\n\tconstructor(\n\t\t/**\n\t\t * 歌词行索引\n\t\t */\n\t\tpublic readonly lineIndex: number,\n\t\t/**\n\t\t * 歌词行元素\n\t\t */\n\t\tpublic readonly line: LyricLineEl,\n\t\tevent: MouseEvent,\n\t) {\n\t\tsuper(`line-${event.type}`, event);\n\t}\n}\n\n/**\n * 歌词播放组件,本框架的核心组件\n *\n * 尽可能贴切 Apple Music for iPad 的歌词效果设计,且做了力所能及的优化措施\n */\nexport class LyricPlayer extends EventTarget implements HasElement, Disposable {\n\tprivate element: HTMLElement = document.createElement(\"div\");\n\tprivate currentTime = 0;\n\tprivate lyricLines: LyricLine[] = [];\n\tprivate processedLines: LyricLine[] = [];\n\tprivate lyricLinesEl: LyricLineEl[] = [];\n\tprivate lyricLinesSize: WeakMap<LyricLineEl, [number, number]> =\n\t\tnew WeakMap();\n\tprivate lyricLinesIndexes: WeakMap<LyricLineEl, number> = new WeakMap();\n\tprivate hotLines: Set<number> = new Set();\n\tprivate bufferedLines: Set<number> = new Set();\n\tprivate scrollToIndex = 0;\n\tprivate allowScroll = true;\n\tprivate scrolledHandler = 0;\n\tprivate isScrolled = false;\n\tprivate invokedByScrollEvent = false;\n\tprivate scrollOffset = 0;\n\tprivate hidePassedLines = false;\n\tprivate resizeObserver: ResizeObserver = new ResizeObserver((e) => {\n\t\tconst rect = e[0].contentRect;\n\t\tthis.size[0] = rect.width;\n\t\tthis.size[1] = rect.height;\n\t\tconst styles = getComputedStyle(e[0].target);\n\t\tconst innerWidth =\n\t\t\tthis.element.clientWidth -\n\t\t\tparseFloat(styles.paddingLeft) -\n\t\t\tparseFloat(styles.paddingRight);\n\t\tconst innerHeight =\n\t\t\tthis.element.clientHeight -\n\t\t\tparseFloat(styles.paddingTop) -\n\t\t\tparseFloat(styles.paddingBottom);\n\t\tthis.innerSize[0] = innerWidth;\n\t\tthis.innerSize[1] = innerHeight;\n\t\tthis.rebuildStyle();\n\t\tthis.calcLayout(true, true);\n\t\tthis.lyricLinesEl.forEach((el) => el.updateMaskImage());\n\t});\n\tprivate posXSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 10,\n\t\tstiffness: 100,\n\t};\n\tprivate posYSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 15,\n\t\tstiffness: 100,\n\t};\n\tprivate scaleSpringParams: Partial<SpringParams> = {\n\t\tmass: 1,\n\t\tdamping: 20,\n\t\tstiffness: 100,\n\t};\n\tprivate emUnit = Math.max(Math.min(innerHeight * 0.05, innerWidth * 0.1), 12);\n\tprivate padding = this.emUnit;\n\tprivate enableBlur = true;\n\tprivate enableScale = true;\n\tprivate interludeDots: InterludeDots;\n\tprivate interludeDotsSize: [number, number] = [0, 0];\n\tprivate bottomLine: BottomLineEl;\n\treadonly supportPlusLighter = CSS.supports(\"mix-blend-mode\", \"plus-lighter\");\n\treadonly supportMaskImage = CSS.supports(\"mask-image\", \"none\");\n\tprivate disableSpring = false;\n\tprivate alignAnchor: \"top\" | \"bottom\" | \"center\" = \"center\";\n\tprivate alignPosition = 0.5;\n\tprivate isNonDynamic = false;\n\tprivate scrollBoundary = [0, 0];\n\treadonly size: [number, number] = [0, 0];\n\treadonly innerSize: [number, number] = [0, 0];\n\tprivate readonly onLineClickedHandler = (e: RawLyricLineMouseEvent) => {\n\t\tconst evt = new LyricLineMouseEvent(\n\t\t\tthis.lyricLinesIndexes.get(e.line) ?? -1,\n\t\t\te.line,\n\t\t\te,\n\t\t);\n\t\tif (!this.dispatchEvent(evt)) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\t};\n\t_getIsNonDynamic() {\n\t\treturn this.isNonDynamic;\n\t}\n\t/**\n\t * 设置是否使用物理弹簧算法实现歌词动画效果,默认启用\n\t *\n\t * 如果启用,则会通过弹簧算法实时处理歌词位置,但是需要性能足够强劲的电脑方可流畅运行\n\t *\n\t * 如果不启用,则会回退到基于 `transition` 的过渡效果,对低性能的机器比较友好,但是效果会比较单一\n\t */\n\tsetEnableSpring(enable = true) {\n\t\tthis.disableSpring = !enable;\n\t\tif (enable) {\n\t\t\tthis.element.classList.remove(this.style.classes.disableSpring);\n\t\t} else {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.calcLayout(true);\n\t}\n\t/**\n\t * 获取当前是否启用了物理弹簧\n\t * @returns 是否启用物理弹簧\n\t */\n\tgetEnableSpring() {\n\t\treturn !this.disableSpring;\n\t}\n\t/**\n\t * 是否启用歌词行缩放效果,默认启用\n\t *\n\t * 如果启用,非选中的歌词行会轻微缩小以凸显当前播放歌词行效果\n\t *\n\t * 此效果对性能影响微乎其微,推荐启用\n\t * @param enable 是否启用歌词行缩放效果\n\t */\n\tsetEnableScale(enable = true) {\n\t\tthis.enableScale = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 获取当前是否启用了歌词行缩放效果\n\t * @returns 是否启用歌词行缩放效果\n\t */\n\tgetEnableScale() {\n\t\treturn this.enableScale;\n\t}\n\tpublic readonly style = jss.createStyleSheet({\n\t\tlyricPlayer: {\n\t\t\tuserSelect: \"none\",\n\t\t\tfontSize: \"var(--amll-lyric-player-font-size,max(min(5vh, 10vw), 12px))\",\n\t\t\tpadding: \"1em\",\n\t\t\tmargin: \"-1em\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\toverflow: \"hidden\",\n\t\t\tboxSizing: \"content-box\",\n\t\t\tmaxWidth: \"100%\",\n\t\t\tmaxHeight: \"100%\",\n\t\t\tzIndex: 1,\n\t\t\tcolor: \"var(--amll-lyric-view-color,white)\",\n\t\t\tmixBlendMode: \"plus-lighter\",\n\t\t\tcontain: \"strict\",\n\t\t\t\"&:hover\": {\n\t\t\t\t\"& $lyricLine\": {\n\t\t\t\t\tfilter: \"unset !important\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricLine: {\n\t\t\tposition: \"absolute\",\n\t\t\ttransformOrigin: \"left\",\n\t\t\twidth: \"var(--amll-lyric-player-width,100%)\",\n\t\t\theight: \"fit-content\",\n\t\t\tpadding: \"2vh 1.05em\",\n\t\t\tmargin: \"0 -1em\",\n\t\t\tcontain: \"content\",\n\t\t\twillChange: \"filter,transform,opacity\",\n\t\t\ttransition: \"filter 0.25s, background-color 0.25s, box-shadow 0.25s\",\n\t\t\tboxSizing: \"content-box\",\n\t\t\tborderRadius: \"8px\",\n\t\t\t\"&:hover\": {\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t\tboxShadow: \"0 0 0 8px var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t},\n\t\t\t\"&:active\": {\n\t\t\t\tboxShadow: \"0 0 0 4px var(--amll-lyric-view-hover-bg-color,#fff1)\",\n\t\t\t},\n\t\t},\n\t\t\"@media (max-width: 1024px)\": {\n\t\t\tlyricLine: {\n\t\t\t\tpadding: \"1vh 1em\",\n\t\t\t},\n\t\t},\n\t\tlyricDuetLine: {\n\t\t\ttextAlign: \"right\",\n\t\t\ttransformOrigin: \"right\",\n\t\t},\n\t\tlyricBgLine: {\n\t\t\topacity: 0,\n\t\t\tfontSize: \"max(50%, 10px)\",\n\t\t\ttransition: \"opacity 0.25s\",\n\t\t\t\"&.active\": {\n\t\t\t\ttransition: \"opacity 0.25s 0.25s\",\n\t\t\t\topacity: 0.75,\n\t\t\t},\n\t\t},\n\t\tlyricMainLine: {\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\twillChange: \"opacity\",\n\t\t\tmargin: \"-1em\",\n\t\t\tpadding: \"1em\",\n\t\t\t\"& span\": {\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t},\n\t\t\t\"& > span\": {\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\tmaxLines: \"1\",\n\t\t\t\t// willChange: \"transform,display,mask-image\",\n\t\t\t\t\"&.emphasize\": {\n\t\t\t\t\ttransformStyle: \"preserve-3d\",\n\t\t\t\t\tperspective: \"50vw\",\n\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricSubLine: {\n\t\t\tfontSize: \"max(0.5em, 10px)\",\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\topacity: 0.5,\n\t\t},\n\t\tdisableSpring: {\n\t\t\t\"& > *\": {\n\t\t\t\ttransition:\n\t\t\t\t\t\"filter 0.25s, transform 0.5s, background-color 0.25s, box-shadow 0.25s\",\n\t\t\t},\n\t\t},\n\t\tinterludeDots: {\n\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\ttransformOrigin: \"center\",\n\t\t\twidth: \"fit-content\",\n\t\t\tpadding: \"2.5% 0\",\n\t\t\tposition: \"absolute\",\n\t\t\tdisplay: \"flex\",\n\t\t\tgap: \"0.25em\",\n\t\t\tleft: \"1em\",\n\t\t\t\"& > *\": {\n\t\t\t\theight: \"clamp(0.5em,1vh,3em)\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\tborderRadius: \"50%\",\n\t\t\t\taspectRatio: \"1 / 1\",\n\t\t\t\tbackgroundColor: \"var(--amll-lyric-view-color,white)\",\n\t\t\t\tmarginRight: \"4px\",\n\t\t\t},\n\t\t\t\"&.duet\": {\n\t\t\t\tright: \"1em\",\n\t\t\t\ttransformOrigin: \"center\",\n\t\t\t},\n\t\t},\n\t\t\"@supports (mix-blend-mode: plus-lighter)\": {\n\t\t\tlyricSubLine: {\n\t\t\t\topacity: 0.3,\n\t\t\t},\n\t\t},\n\t\ttmpDisableTransition: {\n\t\t\ttransition: \"none !important\",\n\t\t},\n\t});\n\tprivate onPageShow = () => {\n\t\tthis.calcLayout(true, true);\n\t};\n\tconstructor() {\n\t\tsuper();\n\t\tthis.interludeDots = new InterludeDots(this);\n\t\tthis.bottomLine = new BottomLineEl(this);\n\t\tthis.element.setAttribute(\"class\", this.style.classes.lyricPlayer);\n\t\tif (this.disableSpring) {\n\t\t\tthis.element.classList.add(this.style.classes.disableSpring);\n\t\t}\n\t\tthis.rebuildStyle();\n\t\tthis.resizeObserver.observe(this.element);\n\t\tthis.element.appendChild(this.interludeDots.getElement());\n\t\tthis.element.appendChild(this.bottomLine.getElement());\n\t\tthis.style.attach();\n\t\tthis.interludeDots.setTransform(0, 200);\n\t\twindow.addEventListener(\"pageshow\", this.onPageShow);\n\t\tlet startScrollY = 0;\n\t\tlet direction: \"up\" | \"down\" | \"none\" = \"none\";\n\t\tlet startTouchPosY = 0;\n\t\tlet startScrollTime = 0;\n\t\tlet scrollSpeed = 0;\n\t\tlet scrollId = Symbol(\"amll-scroll\");\n\t\tlet lastMoveY = 0;\n\t\tlet lastDragTime = 0;\n\t\tthis.element.addEventListener(\"touchstart\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tstartScrollY = this.scrollOffset;\n\t\t\t\tstartTouchPosY = evt.touches[0].screenY;\n\t\t\t\tlastMoveY = startTouchPosY;\n\t\t\t\tstartScrollTime = Date.now();\n\t\t\t\tscrollSpeed = 0;\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"touchmove\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tconst touchScreenY = evt.touches[0].screenY;\n\t\t\t\tconst delta = touchScreenY - startTouchPosY;\n\t\t\t\tconst lastDelta = touchScreenY - lastMoveY;\n\t\t\t\tconst targetDirection =\n\t\t\t\t\tlastDelta > 0 ? \"down\" : lastDelta < 0 ? \"up\" : \"none\";\n\t\t\t\tif (direction !== targetDirection) {\n\t\t\t\t\tdirection = targetDirection;\n\t\t\t\t\tstartScrollY = this.scrollOffset;\n\t\t\t\t\tstartTouchPosY = touchScreenY;\n\t\t\t\t\tstartScrollTime = Date.now();\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollOffset = startScrollY - delta;\n\t\t\t\t}\n\t\t\t\tlastMoveY = touchScreenY;\n\t\t\t\tlastDragTime = Date.now();\n\t\t\t\tthis.limitScrollOffset();\n\t\t\t\tthis.calcLayout(true);\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"touchend\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tstartTouchPosY = 0;\n\t\t\t\tconst curTime = Date.now();\n\t\t\t\tif (curTime - lastDragTime > 100) return this.endScrollHandler();\n\t\t\t\tconst scrollDuration = curTime - startScrollTime;\n\t\t\t\tscrollSpeed =\n\t\t\t\t\t((this.scrollOffset - startScrollY) / scrollDuration) * 1000;\n\t\t\t\tlet lt = 0;\n\t\t\t\tconst curScrollId = Symbol(\"amll-scroll\");\n\t\t\t\tscrollId = curScrollId;\n\t\t\t\tconst onScrollFrame = (dt: number) => {\n\t\t\t\t\tlt ||= dt;\n\t\t\t\t\tif (scrollId === curScrollId && this.beginScrollHandler()) {\n\t\t\t\t\t\tthis.scrollOffset += (scrollSpeed * (dt - lt)) / 1000;\n\t\t\t\t\t\tscrollSpeed *= 0.99;\n\t\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\t\tthis.calcLayout(true);\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tMath.abs(scrollSpeed) > 1 &&\n\t\t\t\t\t\t\t!this.scrollBoundary.includes(this.scrollOffset)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\trequestAnimationFrame(onScrollFrame);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthis.endScrollHandler();\n\t\t\t\t\t\tlt = dt;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\trequestAnimationFrame(onScrollFrame);\n\t\t\t\tthis.endScrollHandler();\n\t\t\t}\n\t\t});\n\t\tthis.element.addEventListener(\"wheel\", (evt) => {\n\t\t\tif (this.beginScrollHandler()) {\n\t\t\t\tif (evt.deltaMode === evt.DOM_DELTA_PIXEL) {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY;\n\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\tthis.calcLayout(true);\n\t\t\t\t} else {\n\t\t\t\t\tthis.scrollOffset += evt.deltaY * 50;\n\t\t\t\t\tthis.limitScrollOffset();\n\t\t\t\t\tthis.calcLayout(false);\n\t\t\t\t}\n\t\t\t\tthis.endScrollHandler();\n\t\t\t}\n\t\t});\n\t}\n\tprivate beginScrollHandler() {\n\t\tconst allowed = this.allowScroll;\n\t\tif (allowed) {\n\t\t\tthis.isScrolled = true;\n\t\t\tthis.invokedByScrollEvent = true;\n\t\t\tclearTimeout(this.scrolledHandler);\n\t\t\tthis.scrolledHandler = setTimeout(() => {\n\t\t\t\tthis.isScrolled = false;\n\t\t\t\tthis.scrollOffset = 0;\n\t\t\t}, 5000);\n\t\t}\n\t\treturn allowed;\n\t}\n\tprivate endScrollHandler() {\n\t\tthis.invokedByScrollEvent = false;\n\t}\n\tprivate limitScrollOffset() {\n\t\tthis.scrollOffset = Math.max(\n\t\t\tMath.min(this.scrollBoundary[1], this.scrollOffset),\n\t\t\tthis.scrollBoundary[0],\n\t\t);\n\t}\n\t/**\n\t * 获取当前播放时间里是否处于间奏区间\n\t * 如果是则会返回单位为毫秒的始末时间\n\t * 否则返回 undefined\n\t *\n\t * 这个只允许内部调用\n\t * @returns [开始时间,结束时间,大概处于的歌词行ID,下一句是否为对唱歌词] 或 undefined 如果不处于间奏区间\n\t */\n\tgetCurrentInterlude(): [number, number, number, boolean] | undefined {\n\t\tif (this.bufferedLines.size > 0) return undefined;\n\t\tconst currentTime = this.currentTime + 20;\n\t\tconst i = this.scrollToIndex;\n\t\tif (i === 0) {\n\t\t\tif (this.processedLines[0]?.startTime) {\n\t\t\t\tif (this.processedLines[0].startTime > currentTime) {\n\t\t\t\t\treturn [\n\t\t\t\t\t\tcurrentTime,\n\t\t\t\t\t\tthis.processedLines[0].startTime,\n\t\t\t\t\t\t-2,\n\t\t\t\t\t\tthis.processedLines[0].isDuet,\n\t\t\t\t\t];\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (\n\t\t\tthis.processedLines[i]?.endTime &&\n\t\t\tthis.processedLines[i + 1]?.startTime\n\t\t) {\n\t\t\tif (\n\t\t\t\tthis.processedLines[i + 1].startTime > currentTime &&\n\t\t\t\tthis.processedLines[i].endTime < currentTime\n\t\t\t) {\n\t\t\t\treturn [\n\t\t\t\t\tMath.max(this.processedLines[i].endTime, currentTime),\n\t\t\t\t\tthis.processedLines[i + 1].startTime,\n\t\t\t\t\ti,\n\t\t\t\t\tthis.processedLines[i + 1].isDuet,\n\t\t\t\t];\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\t/**\n\t * 重建样式\n\t *\n\t * 这个只允许内部调用\n\t */\n\trebuildStyle() {\n\t\tlet style = \"\";\n\t\tstyle += \"--amll-lyric-player-width:\";\n\t\tstyle += this.innerSize[0] - this.padding * 2;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-player-height:\";\n\t\tstyle += this.innerSize[1] - this.padding * 2;\n\t\tstyle += \"px;\";\n\t\t// style += \"--amll-player-time:\";\n\t\t// style += this.currentTime;\n\t\t// style += \";\";\n\t\tthis.element.setAttribute(\"style\", style);\n\t}\n\t/**\n\t * 设置是否隐藏已经播放过的歌词行,默认不隐藏\n\t * @param hide 是否隐藏已经播放过的歌词行,默认不隐藏\n\t */\n\tsetHidePassedLines(hide: boolean) {\n\t\tthis.hidePassedLines = hide;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置是否启用歌词行的模糊效果\n\t * @param enable 是否启用\n\t */\n\tsetEnableBlur(enable: boolean) {\n\t\tif (this.enableBlur === enable) return;\n\t\tthis.enableBlur = enable;\n\t\tthis.calcLayout();\n\t}\n\t/**\n\t * 设置当前播放歌词,要注意传入后这个数组内的信息不得修改,否则会发生错误\n\t * @param lines 歌词数组\n\t */\n\tsetLyricLines(lines: LyricLine[]) {\n\t\tthis.lyricLines = lines;\n\t\tconst timeOffset = 750;\n\t\tthis.processedLines = lines\n\t\t\t.filter(\n\t\t\t\t(line) =>\n\t\t\t\t\tline.words.reduce((pv, cv) => pv + cv.word.trim().length, 0) > 0,\n\t\t\t)\n\t\t\t.map((line, i, lines) => {\n\t\t\t\tif (line.isBG)\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t};\n\t\t\t\telse {\n\t\t\t\t\tif (i === 0) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\tstartTime: Math.max(line.startTime - timeOffset, 0),\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst lastLine = lines[i - 1];\n\t\t\t\t\t\tconst pastLine = lines[i - 2];\n\t\t\t\t\t\tif (lastLine?.isBG && pastLine) {\n\t\t\t\t\t\t\tif (pastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\t\tMath.max(pastLine.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (lastLine?.endTime) {\n\t\t\t\t\t\t\tif (lastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\t\tMath.max(lastLine?.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\tthis.isNonDynamic = true;\n\t\tfor (const line of this.processedLines) {\n\t\t\tif (line.words.length > 1) {\n\t\t\t\tthis.isNonDynamic = false;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tconst lastWord = line.words[line.words.length - 1];\n\t\t\tif (lastWord && shouldEmphasize(lastWord)) {\n\t\t\t\tif (nextLine) {\n\t\t\t\t\tif (nextLine.startTime > line.endTime) {\n\t\t\t\t\t\tline.endTime = Math.min(line.endTime + 1500, nextLine.startTime);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tline.endTime = line.endTime + 1500;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, i, lines) => {\n\t\t\tif (line.isBG) return;\n\t\t\tconst nextLine = lines[i + 1];\n\t\t\tif (nextLine?.isBG) {\n\t\t\t\tnextLine.startTime = Math.min(nextLine.startTime, line.startTime);\n\t\t\t}\n\t\t});\n\t\tthis.lyricLinesEl.forEach((line) => {\n\t\t\tline.removeMouseEventListener(\"click\", this.onLineClickedHandler);\n\t\t\tline.removeMouseEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t\tline.dispose();\n\t\t});\n\t\t// const prevLinesEl = this.lyricLinesEl;\n\t\tthis.lyricLinesEl = this.processedLines.map((line) => {\n\t\t\t// if (this.lyricLinesEl[i]) {\n\t\t\t// \tthis.lyricLinesEl[i].setLine(line);\n\t\t\t// \treturn this.lyricLinesEl[i];\n\t\t\t// } else {\n\t\t\tconst lineEl = new LyricLineEl(this, line);\n\t\t\tlineEl.addMouseEventListener(\"click\", this.onLineClickedHandler);\n\t\t\tlineEl.addMouseEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t\treturn lineEl;\n\t\t\t// }\n\t\t});\n\t\t// while (prevLinesEl.length > this.processedLines.length) {\n\t\t// \tconst rest = prevLinesEl.pop();\n\t\t// \trest?.removeEventListener(\"click\", this.onLineClickedHandler);\n\t\t// \trest?.removeEventListener(\"contextmenu\", this.onLineClickedHandler);\n\t\t// \trest?.dispose();\n\t\t// }\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tthis.element.appendChild(el.getElement());\n\t\t\tthis.lyricLinesIndexes.set(el, i);\n\t\t\tel.updateMaskImage();\n\t\t});\n\t\tthis.interludeDots.setInterlude(undefined);\n\t\tthis.hotLines.clear();\n\t\tthis.bufferedLines.clear();\n\t\tthis.setLinePosXSpringParams({});\n\t\tthis.setLinePosYSpringParams({});\n\t\tthis.setLineScaleSpringParams({});\n\t\tthis.setCurrentTime(0, true);\n\t\tthis.calcLayout(true, true);\n\t}\n\t/**\n\t * 重置用户滚动状态\n\t *\n\t * 请在用户完成滚动点击跳转歌词时调用本事件再调用 `calcLayout` 以正确滚动到目标位置\n\t */\n\tresetScroll() {\n\t\tthis.isScrolled = false;\n\t\tthis.scrollOffset = 0;\n\t\tthis.invokedByScrollEvent = false;\n\t\tclearTimeout(this.scrolledHandler);\n\t\tthis.scrolledHandler = 0;\n\t}\n\t/**\n\t * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`\n\t * 函数即可让歌词通过动画移动到目标位置。\n\t *\n\t * 函数有一个 `force` 参数,用于指定是否强制修改布局,也就是不经过动画直接调整元素位置和大小。\n\t *\n\t * 此函数还有一个 `reflow` 参数,用于指定是否需要重新计算布局\n\t *\n\t * 因为计算布局必定会导致浏览器重排布局,所以会大幅度影响流畅度和性能,故请只在以下情况下将其​设置为 true:\n\t *\n\t * 1. 歌词页面大小发生改变时(这个组件会自行处理)\n\t * 2. 加载了新的歌词时(不论前后歌词是否完全一样)\n\t * 3. 用户自行跳转了歌曲播放位置(不论距离远近)\n\t *\n\t * @param force 是否不经过动画直接修改布局定位\n\t * @param reflow 是否进行重新布局(重新计算每行歌词大小)\n\t */\n\tcalcLayout(force = false, reflow = false) {\n\t\tif (reflow) {\n\t\t\tthis.emUnit = parseFloat(getComputedStyle(this.element).fontSize);\n\t\t\tthis.lyricLinesEl.forEach((el) => {\n\t\t\t\tconst size: [number, number] = el.measureSize();\n\t\t\t\tthis.lyricLinesSize.set(el, size);\n\t\t\t\tel.lineSize = size;\n\t\t\t});\n\t\t\tthis.interludeDotsSize[0] = this.interludeDots.getElement().clientWidth;\n\t\t\tthis.interludeDotsSize[1] = this.interludeDots.getElement().clientHeight;\n\n\t\t\tthis.bottomLine.lineSize = this.bottomLine.measureSize();\n\t\t}\n\t\tconst interlude = this.getCurrentInterlude();\n\t\tlet curPos = -this.scrollOffset;\n\t\tlet targetAlignIndex = this.scrollToIndex;\n\t\tlet interludeDuration = 0;\n\t\tif (interlude) {\n\t\t\tinterludeDuration = interlude[1] - interlude[0];\n\t\t\tif (interludeDuration >= 5000) {\n\t\t\t\tconst nextLine = this.lyricLinesEl[interlude[2] + 1];\n\t\t\t\tif (nextLine) {\n\t\t\t\t\ttargetAlignIndex = interlude[2] + 1;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.interludeDots.setInterlude(undefined);\n\t\t}\n\t\tconst SCALE_ASPECT = this.enableScale ? 0.95 : 1;\n\t\tconst scrollOffset = this.lyricLinesEl\n\t\t\t.slice(0, targetAlignIndex)\n\t\t\t.reduce(\n\t\t\t\t(acc, el) =>\n\t\t\t\t\tacc + (el.getLine().isBG ? 0 : this.lyricLinesSize.get(el)?.[1] ?? 0),\n\t\t\t\t0,\n\t\t\t);\n\t\tthis.scrollBoundary[0] = -scrollOffset;\n\t\tcurPos -= scrollOffset;\n\t\tcurPos += this.size[1] * this.alignPosition;\n\t\tconst curLine = this.lyricLinesEl[targetAlignIndex];\n\t\tif (curLine) {\n\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\tswitch (this.alignAnchor) {\n\t\t\t\tcase \"bottom\":\n\t\t\t\t\tcurPos -= lineHeight;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"center\":\n\t\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"top\":\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tconst latestIndex = Math.max(...this.bufferedLines);\n\t\tlet delay = 0;\n\t\tlet baseDelay = 0.05;\n\t\tlet setDots = false;\n\t\t// console.groupCollapsed(\"calcLayout\");\n\t\tthis.lyricLinesEl.forEach((el, i) => {\n\t\t\tconst hasBuffered = this.bufferedLines.has(i);\n\t\t\tconst isActive =\n\t\t\t\thasBuffered || (i >= this.scrollToIndex && i < latestIndex);\n\t\t\tconst line = el.getLine();\n\t\t\tlet left = 0;\n\t\t\tif (line.isDuet) {\n\t\t\t\tleft = this.size[0] - (this.lyricLinesSize.get(el)?.[0] ?? 0);\n\t\t\t}\n\t\t\tif (\n\t\t\t\t!setDots &&\n\t\t\t\tinterludeDuration >= 5000 &&\n\t\t\t\t((i === this.scrollToIndex && interlude?.[2] === -2) ||\n\t\t\t\t\ti === this.scrollToIndex + 1)\n\t\t\t) {\n\t\t\t\tsetDots = true;\n\t\t\t\tthis.interludeDots.setTransform(this.padding, curPos);\n\t\t\t\tif (interlude) {\n\t\t\t\t\tthis.interludeDots.setInterlude([interlude[0], interlude[1]]);\n\t\t\t\t}\n\t\t\t\tcurPos += this.interludeDotsSize[1];\n\t\t\t}\n\t\t\tconst targetOpacity = this.hidePassedLines\n\t\t\t\t? i < (interlude ? interlude[2] + 1 : this.scrollToIndex)\n\t\t\t\t\t? 0\n\t\t\t\t\t: hasBuffered\n\t\t\t\t\t? 1\n\t\t\t\t\t: 1 / 3\n\t\t\t\t: hasBuffered\n\t\t\t\t? 1\n\t\t\t\t: 1 / 3;\n\t\t\tel.setTransform(\n\t\t\t\tthis.padding,\n\t\t\t\tcurPos,\n\t\t\t\tisActive ? 1 : SCALE_ASPECT,\n\t\t\t\ttargetOpacity,\n\t\t\t\t!this.invokedByScrollEvent && this.enableBlur\n\t\t\t\t\t? isActive\n\t\t\t\t\t\t? 0\n\t\t\t\t\t\t: 1 +\n\t\t\t\t\t\t (i < this.scrollToIndex\n\t\t\t\t\t\t\t\t? Math.abs(this.scrollToIndex - i)\n\t\t\t\t\t\t\t\t: Math.abs(i - Math.max(this.scrollToIndex, latestIndex)))\n\t\t\t\t\t: 0,\n\t\t\t\tforce,\n\t\t\t\tdelay,\n\t\t\t);\n\t\t\t// console.log(i, el._getDebugTargetPos());\n\t\t\tif (line.isBG && isActive) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t} else if (!line.isBG) {\n\t\t\t\tcurPos += this.lyricLinesSize.get(el)?.[1] ?? 0;\n\t\t\t}\n\t\t\tif (curPos >= 0) {\n\t\t\t\tdelay += baseDelay;\n\t\t\t\tbaseDelay /= 1.2;\n\t\t\t}\n\t\t});\n\t\tthis.scrollBoundary[1] = curPos + this.scrollOffset - this.size[1] / 2;\n\t\t// console.groupEnd();\n\t\tthis.bottomLine.setTransform(this.padding, curPos, force, delay);\n\t}\n\t/**\n\t * 获取当前歌词的播放位置\n\t *\n\t * 一般和最后调用 `setCurrentTime` 给予的参数一样\n\t * @returns 当前播放位置\n\t */\n\tgetCurrentTime() {\n\t\treturn this.currentTime;\n\t}\n\t/**\n\t * 获取当前歌词数组\n\t *\n\t * 一般和最后调用 `setLyricLines` 给予的参数一样\n\t * @returns 当前歌词数组\n\t */\n\tgetLyricLines() {\n\t\treturn this.lyricLines;\n\t}\n\tgetElement(): HTMLElement {\n\t\treturn this.element;\n\t}\n\t/**\n\t * 获取一个特殊的底栏元素,默认是空白的,可以往内部添加任意元素\n\t *\n\t * 这个元素始终在歌词的底部,可以用于显示歌曲创作者等信息\n\t *\n\t * 但是请勿删除该元素,只能在内部存放元素\n\t *\n\t * @returns 一个元素,可以往内部添加任意元素\n\t */\n\tgetBottomLineElement(): HTMLElement {\n\t\treturn this.bottomLine.getElement();\n\t}\n\t/**\n\t * 设置目标歌词行的对齐方式,默认为 `center`\n\t *\n\t * - 设置成 `top` 的话将会向目标歌词行的顶部对齐\n\t * - 设置成 `bottom` 的话将会向目标歌词行的底部对齐\n\t * - 设置成 `center` 的话将会向目标歌词行的垂直中心对齐\n\t * @param alignAnchor 歌词行对齐方式,详情见函数说明\n\t */\n\tsetAlignAnchor(alignAnchor: \"top\" | \"bottom\" | \"center\") {\n\t\tthis.alignAnchor = alignAnchor;\n\t}\n\t/**\n\t * 设置默认的歌词行对齐位置,相对于整个歌词播放组件的大小位置,默认为 `0.5`\n\t * @param alignPosition 一个 `[0.0-1.0]` 之间的任意数字,代表组件高度由上到下的比例位置\n\t */\n\tsetAlignPosition(alignPosition: number) {\n\t\tthis.alignPosition = alignPosition;\n\t}\n\t/**\n\t * 设置当前播放进度,单位为毫秒且**必须是整数**,此时将会更新内部的歌词进度信息\n\t * 内部会根据调用间隔和播放进度自动决定如何滚动和显示歌词,所以这个的调用频率越快越准确越好\n\t *\n\t * 调用完成后,可以每帧调用 `update` 函数来执行歌词动画效果\n\t * @param time 当前播放进度,单位为毫秒\n\t */\n\tsetCurrentTime(time: number, isSeek = false) {\n\t\t// 我在这里定义了歌词的选择状态:\n\t\t// 普通行:当前不处于时间范围内的歌词行\n\t\t// 热行:当前绝对处于播放时间内的歌词行,且一般会被立刻加入到缓冲行中\n\t\t// 缓冲行:一般处于播放时间后的歌词行,会因为当前播放状态的缘故推迟解除状态\n\n\t\t// 然后我们需要让歌词行为如下:\n\t\t// 如果当前仍有缓冲行的情况下加入新热行,则不会解除当前缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且没有新热行加入,则删除所有缓冲行,且也不会修改当前滚动位置\n\t\t// 如果当前所有缓冲行都将被删除且有新热行加入,则删除所有缓冲行并加入新热行作为缓冲行,然后修改当前滚动位置\n\t\tthis.currentTime = time;\n\t\tif (!this._getIsNonDynamic())\n\t\t\tthis.element.style.setProperty(\"--amll-player-time\", `${time}`);\n\t\tif (this.isScrolled) return;\n\t\tconst removedHotIds = new Set<number>();\n\t\tconst removedIds = new Set<number>();\n\t\tconst addedIds = new Set<number>();\n\n\t\t// 先检索当前已经超出时间范围的缓冲行,列入待删除集内\n\t\tthis.hotLines.forEach((lastHotId) => {\n\t\t\tconst line = this.processedLines[lastHotId];\n\t\t\tif (line) {\n\t\t\t\tif (line.isBG) return;\n\t\t\t\tconst nextLine = this.processedLines[lastHotId + 1];\n\t\t\t\tif (nextLine?.isBG) {\n\t\t\t\t\tconst startTime = Math.min(line.startTime, nextLine?.startTime);\n\t\t\t\t\tconst endTime = Math.max(line.endTime, nextLine?.endTime);\n\t\t\t\t\tif (startTime > time || endTime <= time) {\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\t\tthis.hotLines.delete(lastHotId + 1);\n\t\t\t\t\t\tremovedHotIds.add(lastHotId + 1);\n\t\t\t\t\t\tif (isSeek) {\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId].disable();\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId + 1].disable();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (line.startTime > time || line.endTime <= time) {\n\t\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.hotLines.delete(lastHotId);\n\t\t\t\tremovedHotIds.add(lastHotId);\n\t\t\t\tif (isSeek) this.lyricLinesEl[lastHotId].disable();\n\t\t\t}\n\t\t});\n\t\tthis.processedLines.forEach((line, id, arr) => {\n\t\t\tif (!line.isBG && line.startTime <= time && line.endTime > time) {\n\t\t\t\tif (!this.hotLines.has(id)) {\n\t\t\t\t\tthis.hotLines.add(id);\n\t\t\t\t\taddedIds.add(id);\n\t\t\t\t\tif (isSeek) this.lyricLinesEl[id].enable();\n\t\t\t\t\tif (arr[id + 1]?.isBG) {\n\t\t\t\t\t\tthis.hotLines.add(id + 1);\n\t\t\t\t\t\taddedIds.add(id + 1);\n\t\t\t\t\t\tif (isSeek) this.lyricLinesEl[id + 1].enable();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tthis.bufferedLines.forEach((v) => {\n\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\tremovedIds.add(v);\n\t\t\t\tif (isSeek) this.lyricLinesEl[v].disable();\n\t\t\t}\n\t\t});\n\t\tif (isSeek) {\n\t\t\tif (this.bufferedLines.size > 0) {\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t} else {\n\t\t\t\tthis.scrollToIndex = this.processedLines.findIndex(\n\t\t\t\t\t(line) => line.startTime >= time,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthis.bufferedLines.clear();\n\t\t\tthis.hotLines.forEach((v) => this.bufferedLines.add(v));\n\t\t\tthis.calcLayout(true);\n\t\t} else if (removedIds.size > 0 || addedIds.size > 0) {\n\t\t\t// function debugLog() {\n\t\t\t// \tconsole.groupCollapsed(\"setCurrentTime\", time);\n\t\t\t// \tconsole.log(\"removedIds\", removedIds);\n\t\t\t// \tconsole.log(\"addedIds\", addedIds);\n\t\t\t// \tconsole.groupEnd();\n\t\t\t// }\n\t\t\tif (removedIds.size === 0 && addedIds.size > 0) {\n\t\t\t\t// debugLog();\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable();\n\t\t\t\t});\n\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t\tthis.calcLayout();\n\t\t\t} else if (addedIds.size === 0 && removedIds.size > 0) {\n\t\t\t\tif (eqSet(removedIds, this.bufferedLines)) {\n\t\t\t\t\t// debugLog();\n\t\t\t\t\tthis.bufferedLines.forEach((v) => {\n\t\t\t\t\t\tif (!this.hotLines.has(v)) {\n\t\t\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\t\t\tthis.lyricLinesEl[v].disable();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tthis.calcLayout();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// debugLog();\n\t\t\t\taddedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.add(v);\n\t\t\t\t\tthis.lyricLinesEl[v].enable();\n\t\t\t\t});\n\t\t\t\tremovedIds.forEach((v) => {\n\t\t\t\t\tthis.bufferedLines.delete(v);\n\t\t\t\t\tthis.lyricLinesEl[v].disable();\n\t\t\t\t});\n\t\t\t\tif (this.bufferedLines.size > 0)\n\t\t\t\t\tthis.scrollToIndex = Math.min(...this.bufferedLines);\n\t\t\t\tthis.calcLayout();\n\t\t\t}\n\t\t}\n\t}\n\t/**\n\t * 更新动画,这个函数应该被逐帧调用或者在以下情况下调用一次:\n\t *\n\t * 1. 刚刚调用完设置歌词函数的时候\n\t * @param delta 距离上一次被调用到现在的时长,单位为毫秒(可为浮点数)\n\t */\n\tupdate(delta = 0) {\n\t\tconst deltaS = delta / 1000;\n\t\tthis.interludeDots.update(delta);\n\t\tthis.bottomLine.update(deltaS);\n\t\tthis.lyricLinesEl.forEach((line) => line.update(deltaS));\n\t}\n\t/**\n\t * 设置所有歌词行在横坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosXSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posXSpringParams = {\n\t\t\t...this.posXSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posX.updateParams(this.posXSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posX.updateParams(this.posXSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在​纵坐标上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLinePosYSpringParams(params: Partial<SpringParams>) {\n\t\tthis.posYSpringParams = {\n\t\t\t...this.posYSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.bottomLine.lineTransforms.posY.updateParams(this.posYSpringParams);\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.posY.updateParams(this.posYSpringParams),\n\t\t);\n\t}\n\t/**\n\t * 设置所有歌词行在​缩放大小上的弹簧属性,包括重量、弹力和阻力。\n\t *\n\t * @param params 需要设置的弹簧属性,提供的属性将会覆盖原来的属性,未提供的属性将会保持原样\n\t */\n\tsetLineScaleSpringParams(params: Partial<SpringParams>) {\n\t\tthis.scaleSpringParams = {\n\t\t\t...this.scaleSpringParams,\n\t\t\t...params,\n\t\t};\n\t\tthis.lyricLinesEl.forEach((line) =>\n\t\t\tline.lineTransforms.scale.updateParams(this.scaleSpringParams),\n\t\t);\n\t}\n\tdispose(): void {\n\t\tthis.element.remove();\n\t\tthis.resizeObserver.disconnect();\n\t\tthis.style.detach();\n\t\tthis.lyricLinesEl.forEach((el) => el.dispose());\n\t\twindow.removeEventListener(\"pageshow\", this.onPageShow);\n\t\tthis.bottomLine.dispose();\n\t\tthis.interludeDots.dispose();\n\t}\n}\n"],"names":["TimedContainer","Container","PixiRenderer","canvas","bounds","Application","delta","lastContainer","s1","s2","s3","s4","maxSize","speed","scale","minBorder","maxBorder","c0","ColorMatrixFilter","c1","c2","filter","BlurFilter","BulgePinchFilter","enable","fps","albumUrl","img","remainRetryTimes","tex","Texture","error","container","Sprite","BackgroundRender","eqSet","xs","ys","x","Spring","currentPosition","curV","solveSpring","getVelocity","targetPosition","params","delay","from","velocity","to","soft","stiffness","damping","mass","angular_frequency","leftover","t","damping_frequency","dfm","dm","derivative","f","BottomLineEl","lyricPlayer","style","left","top","force","l","r","b","pr","pb","easeInOutBack","clamp","min","cur","max","InterludeDots","interlude","curStyle","interludeDuration","currentDuration","breatheDuration","globalOpacity","dot0Opacity","dot1Opacity","dot2Opacity","CJKEXP","generateFadeGradient","width","bright","dark","totalAspect","widthInTotal","leftPos","chunkLyricWords","words","wordGetter","wordChunk","wChunk","result","w","word","shouldEmphasize","RawLyricLineMouseEvent","line","event","LyricLineEl","lyricLine","main","trans","roman","wrapped","listener","type","callback","options","listeners","a","size","chunkedWords","chunk","emp","merged","wrapperWordEl","mainWordEl","mainWordFloatAnimation","charEls","char","charEl","realWord","wordEl","duration","el","i","arr","du","de","fadeWidth","maskImage","_widthInTotal","totalAspectStr","maskPos","opacity","blur","beforeInSight","enableSpring","afterInSight","jss","create","preset","LyricLineMouseEvent","lineIndex","LyricPlayer","rect","styles","innerWidth","innerHeight","evt","startScrollY","direction","startTouchPosY","startScrollTime","scrollSpeed","scrollId","lastMoveY","lastDragTime","touchScreenY","lastDelta","targetDirection","curTime","scrollDuration","lt","curScrollId","onScrollFrame","dt","allowed","currentTime","hide","lines","timeOffset","pv","cv","lastLine","pastLine","nextLine","lastWord","lineEl","reflow","curPos","targetAlignIndex","SCALE_ASPECT","scrollOffset","acc","curLine","lineHeight","latestIndex","baseDelay","setDots","hasBuffered","isActive","targetOpacity","alignAnchor","alignPosition","time","isSeek","removedHotIds","removedIds","addedIds","lastHotId","startTime","endTime","id","v","deltaS"],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- /**
2
- * @fileoverview
3
- * 一个播放歌词的组件
4
- * @author SteveXMH
5
- */
6
- import type { HasElement, Disposable } from "../interfaces";
7
- import { PixiRenderer } from "./pixi-renderer";
8
- export declare class BackgroundRender extends PixiRenderer implements HasElement, Disposable {
9
- private element;
10
- constructor();
11
- getElement(): HTMLCanvasElement;
12
- dispose(): void;
13
- }
@@ -1,52 +0,0 @@
1
- import { Disposable } from "../interfaces";
2
- export declare class PixiRenderer implements Disposable {
3
- private canvas;
4
- private observer;
5
- private app;
6
- private curContainer?;
7
- private staticMode;
8
- private lastContainer;
9
- private onTick;
10
- private flowSpeed;
11
- private currerntRenderScale;
12
- constructor(canvas: HTMLCanvasElement);
13
- /**
14
- * 修改背景的流动速度,数字越大越快,默认为 2
15
- * @param speed 背景的流动速度,默认为 2
16
- */
17
- setFlowSpeed(speed: number): void;
18
- /**
19
- * 修改背景的渲染比例,默认是 0.5
20
- *
21
- * 一般情况下这个程度既没有明显瑕疵也不会特别吃性能
22
- * @param scale 背景的渲染比例
23
- */
24
- setRenderScale(scale: number): void;
25
- private rebuildFilters;
26
- /**
27
- * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能
28
- * @param enable 是否启用静态模式
29
- */
30
- setStaticMode(enable?: boolean): void;
31
- /**
32
- * 修改背景动画帧率,默认是 30 FPS
33
- *
34
- * 如果设置成 0 则会停止动画
35
- * @param fps 目标帧率,默认 30 FPS
36
- */
37
- setFPS(fps: number): void;
38
- /**
39
- * 暂停背景动画,画面即便是更新了图片也不会发生变化
40
- */
41
- pause(): void;
42
- /**
43
- * 恢复播放背景动画
44
- */
45
- resume(): void;
46
- /**
47
- * 设置背景专辑图片,图片材质加载并设置完成后会返回
48
- * @param albumUrl 图片的目标链接
49
- */
50
- setAlbumImage(albumUrl: string): Promise<void>;
51
- dispose(): void;
52
- }
package/dist/index.d.ts DELETED
@@ -1,4 +0,0 @@
1
- export type * from "./interfaces";
2
- export type * as spring from "./utils/spring";
3
- export { BackgroundRender } from "./bg-render";
4
- export { LyricPlayer, type LyricLineMouseEvent } from "./lyric-player";
@@ -1,53 +0,0 @@
1
- /**
2
- * 拥有一个 HTML 元素的接口
3
- *
4
- * 可以通过 `getElement` 获取这个类所对应的 HTML 元素实例
5
- */
6
- export interface HasElement {
7
- /** 获取这个类所对应的 HTML 元素实例 */
8
- getElement(): HTMLElement;
9
- }
10
- /**
11
- * 实现了这个接口的东西需要在使用完毕后
12
- *
13
- * 手动调用 `dispose` 函数来销毁清除占用资源
14
- *
15
- * 以免产生泄露
16
- */
17
- export interface Disposable {
18
- /**
19
- * 销毁实现了该接口的对象实例,释放占用的资源
20
- *
21
- * 一般情况下,调用本函数后就不可以再调用对象的任何函数了
22
- */
23
- dispose(): void;
24
- }
25
- /** 一个歌词单词 */
26
- export interface LyricWord {
27
- /** 单词的起始时间,单位为毫秒 */
28
- startTime: number;
29
- /** 单词的结束时间,单位为毫秒 */
30
- endTime: number;
31
- /** 单词内容 */
32
- word: string;
33
- }
34
- /** 一行歌词,存储多个单词 */
35
- export interface LyricLine {
36
- /**
37
- * 该行的所有单词
38
- * 如果是 LyRiC 等只能表达一行歌词的格式,这里就只会有一个单词且通常其始末时间和本结构的 `startTime` 和 `endTime` 相同
39
- */
40
- words: LyricWord[];
41
- /** 该行的翻译歌词,将会显示在主歌词行的下方 */
42
- translatedLyric: string;
43
- /** 该行的音译歌词,将会显示在翻译歌词行的下方 */
44
- romanLyric: string;
45
- /** 句子的起始时间,单位为毫秒 */
46
- startTime: number;
47
- /** 句子的结束时间,单位为毫秒 */
48
- endTime: number;
49
- /** 该行是否为背景歌词行,当该行歌词的上一句非背景歌词被激活时,这行歌词将会显示出来,注意每个非背景歌词下方只能拥有一个背景歌词 */
50
- isBG: boolean;
51
- /** 该行是否为对唱歌词行(即歌词行靠右对齐) */
52
- isDuet: boolean;
53
- }
@@ -1,2 +0,0 @@
1
- import { LyricLine } from "../interfaces";
2
- export declare function parseTTML(ttmlText: string): LyricLine[];
@@ -1,26 +0,0 @@
1
- import { LyricPlayer } from ".";
2
- import { Disposable, HasElement } from "../interfaces";
3
- import { Spring } from "../utils/spring";
4
- export declare class BottomLineEl implements HasElement, Disposable {
5
- private lyricPlayer;
6
- private element;
7
- private left;
8
- private top;
9
- private delay;
10
- lineSize: number[];
11
- readonly lineTransforms: {
12
- posX: Spring;
13
- posY: Spring;
14
- };
15
- constructor(lyricPlayer: LyricPlayer);
16
- measureSize(): [number, number];
17
- private lastStyle;
18
- show(): void;
19
- hide(): void;
20
- rebuildStyle(): void;
21
- getElement(): HTMLElement;
22
- setTransform(left?: number, top?: number, force?: boolean, delay?: number): void;
23
- update(delta?: number): void;
24
- get isInSight(): boolean;
25
- dispose(): void;
26
- }