@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 +1 @@
1
- {"version":3,"file":"amll-core.js","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
+ {"version":3,"file":"amll-core.js","sources":["../src/bg-render/base.ts","../src/utils/resource.ts","../src/bg-render/pixi-renderer.ts","../src/bg-render/shaders/base.vert.glsl?raw","../src/bg-render/shaders/base.frag.glsl?raw","../src/bg-render/shaders/blend.frag.glsl?raw","../src/bg-render/shaders/eplor.frag.glsl?raw","../src/bg-render/shaders/noise.frag.glsl?raw","../src/assets/noise 5.png?inline","../src/bg-render/eplor-renderer.ts","../src/bg-render/index.ts","../src/utils/eq-set.ts","../src/utils/derivative.ts","../src/utils/spring.ts","../src/lyric-player/bottom-line.ts","../src/lyric-player/interlude-dots.ts","../src/utils/matrix.ts","../../../node_modules/bezier-easing/src/index.js","../src/lyric-player/lyric-line.ts","../src/lyric-player/index.ts"],"sourcesContent":["import { Disposable, HasElement } from \"../interfaces\";\n\nexport abstract class AbstractBaseRenderer implements Disposable, HasElement {\n\t/**\n\t * 修改背景的流动速度,数字越大越快,默认为 2\n\t * @param speed 背景的流动速度,默认为 2\n\t */\n\tabstract setFlowSpeed(speed: number): void;\n\t/**\n\t * 修改背景的渲染比例,默认是 0.5\n\t *\n\t * 一般情况下这个程度既没有明显瑕疵也不会特别吃性能\n\t * @param scale 背景的渲染比例\n\t */\n\tabstract setRenderScale(scale: number): void;\n\t/**\n\t * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tabstract setStaticMode(enable: boolean): void;\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tabstract setFPS(fps: number): void;\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tabstract pause(): void;\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tabstract resume(): void;\n\t/**\n\t * 设置背景专辑资源,纹理加载并设置完成后会返回\n\t * @param albumSource 专辑的资源链接,可以是图片或视频链接,抑或是任意 img/video 元素,如果提供字符串链接且为视频则需要指定第二个参数\n\t */\n\tabstract setAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo?: boolean,\n\t): Promise<void>;\n\t/**\n\t * 设置低频的音量大小,范围在 80hz-120hz 之间为宜,取值范围在 [0.0-1.0] 之间\n\t *\n\t * 部分渲染器会根据音量大小调整背景效果(例如根据鼓点跳动)\n\t *\n\t * 如果无法获取到类似的数据,请传入 1.0 作为默认值,或不做任何处理(默认值即 1.0)\n\t * @param volume 低频的音量大小,范围在 50hz-120hz 之间为宜,取值范围在 [0.0-1.0] 之间\n\t */\n\tabstract setLowFreqVolume(volume: number): void;\n\t/**\n\t * 设置背景是否根据“是否有歌词”这个特征调整自身效果,例如有歌词时会变得更加活跃\n\t *\n\t * 部分渲染器会根据这个特征调整自身效果\n\t *\n\t * 如果不确定是否需要赋值或无法知晓是否包含歌词,请传入 true 或不做任何处理(默认值为 true)\n\t *\n\t * @param hasLyric 是否有歌词,如不确定是否需要赋值,请传入 true 或不做任何处理(默认值为 true)\n\t */\n\tabstract setHasLyric(hasLyric: boolean): void;\n\tabstract dispose(): void;\n\tabstract getElement(): HTMLElement;\n}\n\nexport abstract class BaseRenderer extends AbstractBaseRenderer {\n\tprivate observer: ResizeObserver;\n\tprotected flowSpeed = 2;\n\tprotected currerntRenderScale = 0.75;\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper();\n\t\tthis.observer = new ResizeObserver(() => {\n\t\t\tconst width = Math.max(\n\t\t\t\t1,\n\t\t\t\tcanvas.clientWidth * window.devicePixelRatio * this.currerntRenderScale,\n\t\t\t);\n\t\t\tconst height = Math.max(\n\t\t\t\t1,\n\t\t\t\tcanvas.clientHeight *\n\t\t\t\t\twindow.devicePixelRatio *\n\t\t\t\t\tthis.currerntRenderScale,\n\t\t\t);\n\t\t\tthis.onResize(width, height);\n\t\t});\n\t\tthis.observer.observe(canvas);\n\t}\n\tsetRenderScale(scale: number) {\n\t\tthis.currerntRenderScale = scale;\n\t\tthis.onResize(\n\t\t\tthis.canvas.clientWidth *\n\t\t\t\twindow.devicePixelRatio *\n\t\t\t\tthis.currerntRenderScale,\n\t\t\tthis.canvas.clientHeight *\n\t\t\t\twindow.devicePixelRatio *\n\t\t\t\tthis.currerntRenderScale,\n\t\t);\n\t}\n\t/**\n\t * 当画板元素大小发生变化时此函数会被调用\n\t * 可以在此处重设和渲染器相关的尺寸设置\n\t * 考虑到初始化的时候元素不一定在文档中或出于某些特殊样式状态,尺寸长宽有可能会为 0,请注意进行特判处理\n\t * @param width 画板元素实际的物理像素宽度,有可能为 0\n\t * @param height 画板元素实际的物理像素高度,有可能为 0\n\t */\n\tprotected onResize(width: number, height: number): void {\n\t\tthis.canvas.width = width;\n\t\tthis.canvas.height = height;\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 * 是否启用静态模式,即图片在更换后就会保持静止状态并禁用更新,以节省性能\n\t * @param enable 是否启用静态模式\n\t */\n\tabstract setStaticMode(enable: boolean): void;\n\t/**\n\t * 修改背景动画帧率,默认是 30 FPS\n\t *\n\t * 如果设置成 0 则会停止动画\n\t * @param fps 目标帧率,默认 30 FPS\n\t */\n\tabstract setFPS(fps: number): void;\n\t/**\n\t * 暂停背景动画,画面即便是更新了图片也不会发生变化\n\t */\n\tabstract pause(): void;\n\t/**\n\t * 恢复播放背景动画\n\t */\n\tabstract resume(): void;\n\t/**\n\t * 设置背景专辑资源,纹理加载并设置完成后会返回\n\t * @param albumSource 专辑的资源链接,可以是图片或视频链接,抑或是任意 img/video 元素,如果提供字符串链接且为视频则需要指定第二个参数\n\t */\n\tabstract setAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo?: boolean,\n\t): Promise<void>;\n\tdispose(): void {\n\t\tthis.observer.disconnect();\n\t\tthis.canvas.remove();\n\t}\n}\n","export function loadImage(imageUrl: string): Promise<HTMLImageElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst img = document.createElement(\"img\");\n\t\timg.onload = () => resolve(img);\n\t\timg.onerror = reject;\n\t\timg.src = imageUrl;\n\t\timg.crossOrigin = \"anonymous\";\n\t\timg\n\t\t\t.decode()\n\t\t\t.then(() => resolve(img))\n\t\t\t.catch(reject);\n\t});\n}\n\nexport function loadVideo(videoUrl: string): Promise<HTMLVideoElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tconst video = document.createElement(\"video\");\n\t\tlet playing = false;\n\t\tlet timeupdate = false;\n\t\tlet rejected = false;\n\t\tvideo.addEventListener(\n\t\t\t\"playing\",\n\t\t\t() => {\n\t\t\t\tplaying = true;\n\t\t\t\tcheckReady();\n\t\t\t},\n\t\t\ttrue,\n\t\t);\n\t\tvideo.addEventListener(\n\t\t\t\"timeupdate\",\n\t\t\t() => {\n\t\t\t\ttimeupdate = true;\n\t\t\t\tcheckReady();\n\t\t\t},\n\t\t\ttrue,\n\t\t);\n\t\tvideo.addEventListener(\n\t\t\t\"error\",\n\t\t\t(err) => {\n\t\t\t\trejected = true;\n\t\t\t\treject(err);\n\t\t\t},\n\t\t\ttrue,\n\t\t);\n\t\tfunction checkReady() {\n\t\t\tif (playing && timeupdate && !rejected) {\n\t\t\t\tresolve(video);\n\t\t\t}\n\t\t}\n\t\tvideo.src = videoUrl;\n\t\tvideo.playsInline = true;\n\t\tvideo.crossOrigin = \"anonymous\";\n\t\tvideo.autoplay = true;\n\t\tvideo.loop = true;\n\t\tvideo.muted = true;\n\t\tvideo.play();\n\t});\n}\n\nexport function loadResourceFromUrl(\n\turl: string,\n\tisVideo = false,\n): Promise<HTMLImageElement | HTMLVideoElement> {\n\treturn isVideo ? loadVideo(url) : loadImage(url);\n}\n\nexport function loadResourceFromElement(\n\telement: HTMLImageElement | HTMLVideoElement,\n): Promise<HTMLImageElement | HTMLVideoElement> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (\n\t\t\telement instanceof HTMLImageElement\n\t\t\t\t? element.complete\n\t\t\t\t: element.readyState >= 3\n\t\t) {\n\t\t\tresolve(element);\n\t\t} else {\n\t\t\telement.onload = () => resolve(element);\n\t\t\telement.onerror = reject;\n\t\t}\n\t});\n}\n","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 { BaseRenderer } from \"./base\";\nimport {\n\tloadResourceFromElement,\n\tloadResourceFromUrl,\n} from \"../utils/resource\";\n\nclass TimedContainer extends Container {\n\tpublic time = 0;\n}\n\nexport class PixiRenderer extends BaseRenderer {\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\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper(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: 1,\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\n\tprotected override onResize(width: number, height: number): void {\n\t\tsuper.onResize(width, height);\n\t\tthis.app.resize();\n\t\tthis.rebuildFilters();\n\t}\n\n\toverride setRenderScale(scale: number) {\n\t\tsuper.setRenderScale(scale);\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\n\toverride setStaticMode(enable = false) {\n\t\tthis.staticMode = enable;\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride setFPS(fps: number) {\n\t\tthis.app.ticker.maxFPS = fps;\n\t}\n\n\toverride pause() {\n\t\tthis.app.ticker.stop();\n\t\tthis.app.render();\n\t}\n\n\toverride resume() {\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride setLowFreqVolume(_volume: number): void {\n\t\t// NOOP\n\t}\n\n\toverride setHasLyric(_hasLyric: boolean): void {\n\t\t// NOOP\n\t}\n\n\toverride async setAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo?: boolean,\n\t): Promise<void> {\n\t\tif (typeof albumSource === \"string\" && albumSource.trim().length === 0)\n\t\t\treturn;\n\t\tlet res: HTMLImageElement | HTMLVideoElement | null = null;\n\t\tlet remainRetryTimes = 5;\n\t\tlet tex: Texture | null = null;\n\t\twhile (!tex?.baseTexture?.resource?.valid && remainRetryTimes > 0) {\n\t\t\ttry {\n\t\t\t\tif (typeof albumSource === \"string\") {\n\t\t\t\t\tres = await loadResourceFromUrl(albumSource, isVideo);\n\t\t\t\t} else {\n\t\t\t\t\tres = await loadResourceFromElement(albumSource);\n\t\t\t\t}\n\t\t\t\ttex = Texture.from(res, {\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\talbumSource,\n\t\t\t\t\terror,\n\t\t\t\t);\n\t\t\t\ttex = null;\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(container);\n\t\tthis.curContainer.alpha = 0;\n\t\tthis.app.ticker.start();\n\t}\n\n\toverride dispose() {\n\t\tsuper.dispose();\n\t\tthis.app.ticker.remove(this.onTick);\n\t\tthis.app.destroy(true);\n\t}\n\n\toverride getElement(): HTMLElement {\n\t\treturn this.canvas;\n\t}\n}\n","export default \"#version 300 es\\nprecision highp float;\\n\\nin vec2 v_coord;\\nout vec2 f_v_coord;\\n\\nvoid main() {\\n gl_Position = vec4(v_coord, 0.0f, 1.0f);\\n f_v_coord = (vec2(v_coord.x, v_coord.y) + vec2(1.0f, 1.0f)) / 2.0f;\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\nvoid main() {\\n vec2 coord = f_v_coord;\\n fragColor = texture(src, coord);\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nuniform float lerp;\\nuniform float scale;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\nvoid main() {\\n vec2 tex_coord = f_v_coord;\\n if(scale < 1.0f) {\\n tex_coord /= scale;\\n }\\n vec4 srcColor = texture(src, tex_coord);\\n fragColor = mix(vec4(srcColor.xyz, 0.0f), srcColor, lerp);\\n}\\n\"","export default \"#version 300 es\\nprecision highp float;uniform float IIIlllllllIIIllIl,lIIIlllllIllIl,IIIlllIlIIllll;uniform sampler2D IlllIIlIlllIll;uniform vec2 IIlIlIIlIlIllI,IllIlllIlIIlllI;out vec4 lIIlIIIIIlIlIlllIIIIlIIl;float lIlIIllllIllIll(float IIIlIIlIIIlllIII){IIIlIIlIIIlllIII-=0.;return sin(IIIlIIlIIIlllIII);}float lIlIlllllIllIll(float IIIlIIlIIIlllIII){IIIlIIlIIIlllIII+=acos(0.);return sin(IIIlIIlIIIlllIII);}mat2 lIIllIIlIIIllIl(float IIIlIIlIIIlllIII){return mat2(lIlIlllllIllIll(IIIlIIlIIIlllIII),-lIlIIllllIllIll(IIIlIIlIIIlllIII),lIlIIllllIllIll(IIIlIIlIIIlllIII),lIlIlllllIllIll(IIIlIIlIIIlllIII));}mat2 lIIllIIlIIIlllI(float IIIlIIlIIIlllIII){return mat2(lIlIIllllIllIll(IIIlIIlIIIlllIII),-lIlIlllllIllIll(IIIlIIlIIIlllIII),lIlIlllllIllIll(IIIlIIlIIIlllIII),lIlIIllllIllIll(IIIlIIlIIIlllIII));}float IllllIIlIllII(float llIIllIllIIIllI){return fract(lIlIIllllIllIll(llIIllIllIIIllI)*43758.5453);}float llIlIIllllIII(vec2 IIIlIIlIIIlllIII){vec2 IIllIlIIlllI=floor(IIIlIIlIIIlllIII),lIlIllIIIIIlIl=fract(IIIlIIlIIIlllIII);lIlIllIIIIIlIl=lIlIllIIIIIlIl*lIlIllIIIIIlIl*(3.-2.*lIlIllIIIIIlIl);float lIlIlIlIlIlIIl=IIllIlIIlllI.x+IIllIlIIlllI.y*57.;return mix(mix(IllllIIlIllII(lIlIlIlIlIlIIl),IllllIIlIllII(lIlIlIlIlIlIIl+1.),lIlIllIIIIIlIl.x),mix(IllllIIlIllII(lIlIlIlIlIlIIl+57.),IllllIIlIllII(lIlIlIlIlIlIIl+58.),lIlIllIIIIIlIl.x),lIlIllIIIIIlIl.y);}vec2 lllIIIIIIllIlIIIlI(vec2 IlllIIlIIIIlIIII,float lIIIIlllIIIIllIlIlI,vec2 IlIlIIIIlIlllIlIII){float lIIlIllIIIlIl=llIlIIllllIII(IlllIIlIIIIlIIII*vec2(1)*3.5+.1)*4.2831*mix(.2,1.,IIIlllllllIIIllIl);IlllIIlIIIIlIIII+=vec2(-1,.5);lIIlIllIIIlIl-=lIIIIlllIIIIllIlIlI;return vec2(lIlIlllllIllIll(lIIlIllIIIlIl),lIlIIllllIllIll(lIIlIllIIIlIl));}const mat3 lIIllIIIlllIl=mat3(1.,.02,.002,.02,1.,.008,.002,.02,1.),lIIIlllIIIIll=mat3(1.022,-.02,-.002,-.02,1.028,-.008,-.002,-.02,1.022);void main(){vec2 lIIIlIIllIlIIlI=lIlIIllllIllIll(lIIIlllllIllIl*.2)*.01+.5+gl_FragCoord.xy/IIlIlIIlIlIllI.xy,lIIllIIlIIIllI=lIIIlIIllIlIIlI*.77f+IllIlllIlIIlllI;lIIllIIlIIIllI.x*=IIlIlIIlIlIllI.x/IIlIlIIlIlIllI.y;float lIIlIIlIIlIIIlII=gl_FragCoord.x/max(IIlIlIIlIlIllI.x,IIlIlIIlIlIllI.y),lIIIlIllIllIlIIl=0.f;vec3 lIIIlIlIIIlIlIIl=vec3(0);vec2 lIlIIlIlIIIllIll=lIIllIIlIIIllI;for(int IllIlIIlIIlllllIIIl=0;IllIlIIlIIlllllIIIl<8;IllIlIIlIIlllllIIIl++){bool lIlIlIIllIllIIll=IllIlIIlIIlllllIIIl%2==0;vec2 lIlllIlllIlllII=lllIIIIIIllIlIIIlI(lIIllIIlIIIllI,lIIlIIlIIlIIIlII,lIIIlIIllIlIIlI),lIllIIlIIlIIIll=lIlllIlllIlllII;float lIIlIlIIlIIlIllI=float(IllIlIIlIIlllllIIIl)/8.f;vec3 llIIlIIIIlIIlIII=texture(IlllIIlIlllIll,-lIIIlllllIllIl*.01+.8*lIIllIIlIIIllI*lIIllIIlIIIllIl(-lIIIlllllIllIl*.2)+vec2(IIIlllIlIIllll*.3*(float(lIlIlIIllIllIIll)*2.-1.)*lIIllIIlIIIlllI(lIIIlllllIllIl*.2+1.5))).xyz;lIIIlIlIIIlIlIIl+=llIIlIIIIlIIlIII;lIIIlIllIllIlIIl+=4.f*lIIlIlIIlIIlIllI*(1.f-lIIlIlIIlIIlIllI);lIIllIIlIIIllI+=.01f*lIllIIlIIlIIIll*(lIlIIllllIllIll(lIIIlllllIllIl)*4.8+.8);lIlIIlIlIIIllIll+=.05f*lIllIIlIIlIIIll;}lIIIlIlIIIlIlIIl/=lIIIlIllIllIlIIl;lIIIlIlIIIlIlIIl*=1.6f;lIIIlIlIIIlIlIIl=1.f-exp(-lIIIlIlIIIlIlIIl);lIIIlIlIIIlIlIIl=pow(lIIIlIlIIIlIlIIl,vec3(2.2));lIIIlIlIIIlIlIIl*=.8f;lIIlIIIIIlIlIlllIIIIlIIl=vec4(lIIIlIlIIIlIlIIl,1);}\"","export default \"#version 300 es\\nprecision highp float;\\n\\nuniform sampler2D src;\\nin vec2 f_v_coord;\\nout vec4 fragColor;\\n\\n/* Gradient noise from Jorge Jimenez's presentation: */\\n/* http://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare */\\nfloat gradientNoise(in vec2 uv) {\\n return fract(52.9829189f * fract(dot(uv, vec2(0.06711056f, 0.00583715f))));\\n}\\n\\nvoid main() {\\n vec2 tex_coord = f_v_coord;\\n float dither = (1.0f / 255.0f) * gradientNoise(gl_FragCoord.xy) - (0.5f / 255.0f);\\n vec4 color = texture(src, tex_coord);\\n color += dither;\\n fragColor = color;\\n}\\n\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAYUklEQVR4nH3bV89VVRcF4IX7qNgVe8WKvaIiNsCuYCKCSEg0JCYm/gTjzf4R3njhlRdeWKKi2AvYEBV7b1ixY2+ofPuZcbwxXzie5OQ9Z5+11pxzjDHnKnu/k0477bSN+++/fzvyyCPbdttt17766qu2YcOG9ttvv7U33nijffHFF23atGntgAMOaN98803bc88926RJk9pnn31W10855ZT2888/1/vrr79ur732Wjv00EPbgQce2NavX99eeOGF+nvmmWfWuD4fc8wx1ffDDz9sTz31VPv000/bRx99VL/vsssu7eCDDy57hxxySPv222/L1saNG9vatWsbX19++eXyhb9//PFH23HHHdsHH3zQLrrooorjxRdfrPbG+/jjj9u6devaX3/91aZMmdImT57cdt1114lYu5133rnfeuut28yZM9t+++3XVq9e3T7//PMa9Ljjjqu/m222WTn73HPPtR122KF99913bcsttyyQnnzyybbbbrvVm4MMAe37778vUATIkaOPPrqCe+KJJ9qPP/7Ydt9993bvvfe2lStXtvfee69ttdVW7bzzzmvbbLNN++STT9rUqVPL7jvvvNP+/PPP8o1NNn7//fcakx3XL7300moPyC222KL8ev/99ws8Y2s3xFmAIpD9H374of36669txBEIvf3224UmR1w74YQTyhlgHHTQQeU845Bfs2ZN23fffcsQRn/55Zf6jQJOP/30GvjLL78sMPbee+8y6rM2gvPea6+9yg7Htt1223bSSSe1nXbaqWwC+K677iq2qMU1yqKK0WhUAWGREruuq3GBw8dVq1ZV4Pvss08744wzSgns/fTTT+UzoigIAL53gyM95P7+++9Cj1OQz+ACwb7PHAGA3133phKyY/TVV1+t3zHEAUa8t99++1IDJwAsKFIWkFQQOFaeffbZ9u6775aTgBXskKIVhDEBSxFJCaznOoCpNdJHGlvGNRa5s8N3PiLg5JNPbt1goNfIYKeeemo74ogjKmC5yxlIY/D5559v999/f8nxrLPOqsCBwknIkxcmpISXYFesWFGqIlNKck3bGTNmFNDyltPaUBXnsMWGfKZCeQto/QQqmOnTpxegvvNVH4G7Jg4AG4P8qVM6jCN5JDc5QYZyHHrynFGd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\"","import { Disposable } from \"../interfaces\";\nimport { BaseRenderer } from \"./base\";\nimport vertShader from \"./shaders/base.vert.glsl?raw\";\nimport fragShader from \"./shaders/base.frag.glsl?raw\";\nimport blendShader from \"./shaders/blend.frag.glsl?raw\";\nimport eplorShader from \"./shaders/eplor.frag.glsl?raw\";\nimport noiseShader from \"./shaders/noise.frag.glsl?raw\";\nimport noiseImage from \"../assets/noise 5.png?inline\";\nimport {\n\tloadResourceFromElement,\n\tloadResourceFromUrl,\n} from \"../utils/resource\";\n\nconst NOISE_IMAGE_DATA = (() => {\n\tconst img = document.createElement(\"img\");\n\timg.src = noiseImage;\n\treturn img;\n})();\n\nfunction blurImage(imageData: ImageData, radius: number, quality: number) {\n\tconst pixels = imageData.data;\n\tconst width = imageData.width;\n\tconst height = imageData.height;\n\n\tlet rsum: number;\n\tlet gsum: number;\n\tlet bsum: number;\n\tlet asum: number;\n\tlet x: number;\n\tlet y: number;\n\tlet i: number;\n\tlet p: number;\n\tlet p1: number;\n\tlet p2: number;\n\tlet yp: number;\n\tlet yi: number;\n\tlet yw: number;\n\tconst wm = width - 1;\n\tconst hm = height - 1;\n\tconst rad1x = radius + 1;\n\tconst divx = radius + rad1x;\n\tconst rad1y = radius + 1;\n\tconst divy = radius + rad1y;\n\tconst div2 = 1 / (divx * divy);\n\n\tconst r: number[] = [];\n\tconst g: number[] = [];\n\tconst b: number[] = [];\n\tconst a: number[] = [];\n\n\tconst vmin: number[] = [];\n\tconst vmax: number[] = [];\n\n\twhile (quality-- > 0) {\n\t\tyw = yi = 0;\n\n\t\tfor (y = 0; y < height; y++) {\n\t\t\trsum = pixels[yw] * rad1x;\n\t\t\tgsum = pixels[yw + 1] * rad1x;\n\t\t\tbsum = pixels[yw + 2] * rad1x;\n\t\t\tasum = pixels[yw + 3] * rad1x;\n\n\t\t\tfor (i = 1; i <= radius; i++) {\n\t\t\t\tp = yw + ((i > wm ? wm : i) << 2);\n\t\t\t\trsum += pixels[p++];\n\t\t\t\tgsum += pixels[p++];\n\t\t\t\tbsum += pixels[p++];\n\t\t\t\tasum += pixels[p];\n\t\t\t}\n\n\t\t\tfor (x = 0; x < width; x++) {\n\t\t\t\tr[yi] = rsum;\n\t\t\t\tg[yi] = gsum;\n\t\t\t\tb[yi] = bsum;\n\t\t\t\ta[yi] = asum;\n\n\t\t\t\tif (y === 0) {\n\t\t\t\t\tvmin[x] = Math.min(x + rad1x, wm) << 2;\n\t\t\t\t\tvmax[x] = Math.max(x - radius, 0) << 2;\n\t\t\t\t}\n\n\t\t\t\tp1 = yw + vmin[x];\n\t\t\t\tp2 = yw + vmax[x];\n\n\t\t\t\trsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tgsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tbsum += pixels[p1++] - pixels[p2++];\n\t\t\t\tasum += pixels[p1] - pixels[p2];\n\n\t\t\t\tyi++;\n\t\t\t}\n\t\t\tyw += width << 2;\n\t\t}\n\n\t\tfor (x = 0; x < width; x++) {\n\t\t\typ = x;\n\t\t\trsum = r[yp] * rad1y;\n\t\t\tgsum = g[yp] * rad1y;\n\t\t\tbsum = b[yp] * rad1y;\n\t\t\tasum = a[yp] * rad1y;\n\n\t\t\tfor (i = 1; i <= radius; i++) {\n\t\t\t\typ += i > hm ? 0 : width;\n\t\t\t\trsum += r[yp];\n\t\t\t\tgsum += g[yp];\n\t\t\t\tbsum += b[yp];\n\t\t\t\tasum += a[yp];\n\t\t\t}\n\n\t\t\tyi = x << 2;\n\t\t\tfor (y = 0; y < height; y++) {\n\t\t\t\tpixels[yi] = (rsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 1] = (gsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 2] = (bsum * div2 + 0.5) | 0;\n\t\t\t\tpixels[yi + 3] = (asum * div2 + 0.5) | 0;\n\n\t\t\t\tif (x === 0) {\n\t\t\t\t\tvmin[y] = Math.min(y + rad1y, hm) * width;\n\t\t\t\t\tvmax[y] = Math.max(y - radius, 0) * width;\n\t\t\t\t}\n\n\t\t\t\tp1 = x + vmin[y];\n\t\t\t\tp2 = x + vmax[y];\n\n\t\t\t\trsum += r[p1] - r[p2];\n\t\t\t\tgsum += g[p1] - g[p2];\n\t\t\t\tbsum += b[p1] - b[p2];\n\t\t\t\tasum += a[p1] - a[p2];\n\n\t\t\t\tyi += width << 2;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction saturateImage(imageData: ImageData, saturation: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tconst gray = r * 0.3 + g * 0.59 + b * 0.11;\n\t\tpixels[i] = gray * (1 - saturation) + r * saturation;\n\t\tpixels[i + 1] = gray * (1 - saturation) + g * saturation;\n\t\tpixels[i + 2] = gray * (1 - saturation) + b * saturation;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nfunction brightnessImage(imageData: ImageData, brightness: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tpixels[i] = r * brightness;\n\t\tpixels[i + 1] = g * brightness;\n\t\tpixels[i + 2] = b * brightness;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nfunction contrastImage(imageData: ImageData, contrast: number) {\n\tconst pixels = imageData.data;\n\n\tfor (let i = 0; i < pixels.length; i += 4) {\n\t\tconst r = pixels[i];\n\t\tconst g = pixels[i + 1];\n\t\tconst b = pixels[i + 2];\n\t\tconst a = pixels[i + 3];\n\t\tpixels[i] = (r - 128) * contrast + 128;\n\t\tpixels[i + 1] = (g - 128) * contrast + 128;\n\t\tpixels[i + 2] = (b - 128) * contrast + 128;\n\t\tpixels[i + 3] = a;\n\t}\n}\n\nclass GLProgram implements Disposable {\n\tprivate gl: WebGL2RenderingContext;\n\tprogram: WebGLProgram;\n\tprivate vertexShader: WebGLShader;\n\tprivate fragmentShader: WebGLShader;\n\tprivate coordPos: number;\n\tconstructor(\n\t\tgl: WebGL2RenderingContext,\n\t\tvertexShaderSource: string,\n\t\tfragmentShaderSource: string,\n\t\tprivate readonly label = \"unknown\",\n\t) {\n\t\tthis.gl = gl;\n\t\tthis.vertexShader = this.createShader(gl.VERTEX_SHADER, vertexShaderSource);\n\t\tthis.fragmentShader = this.createShader(\n\t\t\tgl.FRAGMENT_SHADER,\n\t\t\tfragmentShaderSource,\n\t\t);\n\t\tthis.program = this.createProgram();\n\n\t\tconst coordPos = gl.getAttribLocation(this.program, \"v_coord\");\n\t\tif (coordPos === -1)\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to get attribute location v_coord for \"${this.label}\"`,\n\t\t\t);\n\t\tthis.coordPos = coordPos;\n\t}\n\tprivate createShader(type: number, source: string) {\n\t\tconst gl = this.gl;\n\t\tconst shader = gl.createShader(type);\n\t\tif (!shader) throw new Error(\"Failed to create shader\");\n\t\tgl.shaderSource(shader, source);\n\t\tgl.compileShader(shader);\n\t\tif (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to compile shader for type ${type} \"${\n\t\t\t\t\tthis.label\n\t\t\t\t}\": ${gl.getShaderInfoLog(shader)}`,\n\t\t\t);\n\t\t}\n\t\treturn shader;\n\t}\n\tprivate createProgram() {\n\t\tconst gl = this.gl;\n\t\tconst program = gl.createProgram();\n\t\tif (!program) throw new Error(\"Failed to create program\");\n\t\tgl.attachShader(program, this.vertexShader);\n\t\tgl.attachShader(program, this.fragmentShader);\n\t\tgl.linkProgram(program);\n\t\tgl.validateProgram(program);\n\t\tif (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n\t\t\tconst errLog = gl.getProgramInfoLog(program);\n\t\t\tgl.deleteProgram(program);\n\t\t\tthrow new Error(`Failed to link program \"${this.label}\": ${errLog}`);\n\t\t}\n\t\treturn program;\n\t}\n\tuse() {\n\t\tconst gl = this.gl;\n\t\tgl.useProgram(this.program);\n\t\tgl.vertexAttribPointer(this.coordPos, 2, gl.FLOAT, false, 0, 0);\n\t\tgl.enableVertexAttribArray(this.coordPos);\n\t}\n\tprivate notFoundUniforms: Set<string> = new Set();\n\tprivate warnUniformNotFound(name: string) {\n\t\tif (this.notFoundUniforms.has(name)) return;\n\t\tthis.notFoundUniforms.add(name);\n\t\tconsole.warn(\n\t\t\t`Failed to get uniform location for program \"${this.label}\": ${name}`,\n\t\t);\n\t}\n\tsetUniform1f(name: string, value: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform1f(location, value);\n\t}\n\tsetUniform2f(name: string, value1: number, value2: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform2f(location, value1, value2);\n\t}\n\tsetUniform1i(name: string, value: number) {\n\t\tconst gl = this.gl;\n\t\tconst location = gl.getUniformLocation(this.program, name);\n\t\tif (!location) this.warnUniformNotFound(name);\n\t\telse gl.uniform1i(location, value);\n\t}\n\tdispose() {\n\t\tconst gl = this.gl;\n\t\tgl.deleteShader(this.vertexShader);\n\t\tgl.deleteShader(this.fragmentShader);\n\t\tgl.deleteProgram(this.program);\n\t}\n}\n\nclass Framebuffer implements Disposable {\n\tprivate fb: WebGLFramebuffer;\n\tprivate tex: WebGLTexture;\n\tprivate _size: [number, number];\n\tget size() {\n\t\treturn this._size;\n\t}\n\tconstructor(\n\t\tprivate gl: WebGL2RenderingContext,\n\t\twidth: number,\n\t\theight: number,\n\t) {\n\t\tthis._size = [width, height];\n\t\tconst fb = gl.createFramebuffer();\n\t\tif (!fb) throw new Error(\"Can't create framebuffer\");\n\t\tconst tex = gl.createTexture();\n\t\tif (!tex) throw new Error(\"Failed to create texture\");\n\t\tthis.fb = fb;\n\t\tthis.tex = tex;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, fb);\n\t\tgl.bindTexture(gl.TEXTURE_2D, tex);\n\t\tgl.framebufferTexture2D(\n\t\t\tgl.FRAMEBUFFER,\n\t\t\tgl.COLOR_ATTACHMENT0,\n\t\t\tgl.TEXTURE_2D,\n\t\t\ttex,\n\t\t\t0,\n\t\t);\n\t\tthis.resize(width, height);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\tresize(width: number, height: number) {\n\t\tconst gl = this.gl;\n\t\tthis.bind();\n\t\tgl.bindTexture(gl.TEXTURE_2D, this.tex);\n\t\tif (gl.getExtension(\"EXT_color_buffer_float\")) {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA32F,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.FLOAT,\n\t\t\t\tnull,\n\t\t\t);\n\t\t} else {\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tnull,\n\t\t\t);\n\t\t}\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\tbind() {\n\t\tconst gl = this.gl;\n\t\tgl.bindFramebuffer(gl.FRAMEBUFFER, this.fb);\n\t}\n\tactive(texture: number = this.gl.TEXTURE0) {\n\t\tthis.gl.activeTexture(texture);\n\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D, this.tex);\n\t}\n\tdispose(): void {\n\t\tthis.gl.deleteFramebuffer(this.fb);\n\t\tthis.gl.deleteTexture(this.tex);\n\t}\n}\n\nclass GLBuffer implements Disposable {\n\tprivate gl: WebGL2RenderingContext;\n\tprivate buffer: WebGLBuffer;\n\tprivate type: number;\n\tprivate data: ArrayBufferView;\n\tprivate usage: number;\n\tprivate length: number;\n\tconstructor(\n\t\tgl: WebGL2RenderingContext,\n\t\ttype: number,\n\t\tdata: ArrayBufferView,\n\t\tusage: number,\n\t) {\n\t\tthis.gl = gl;\n\t\tthis.type = type;\n\t\tthis.data = data;\n\t\tthis.usage = usage;\n\t\tconst buffer = gl.createBuffer();\n\t\tif (!buffer) throw new Error(\"Failed to create buffer\");\n\t\tthis.buffer = buffer;\n\t\tthis.length = data.byteLength;\n\t\tgl.bindBuffer(type, this.buffer);\n\t\tgl.bufferData(type, data, usage);\n\t}\n\tbind() {\n\t\tconst gl = this.gl;\n\t\tgl.bindBuffer(this.type, this.buffer);\n\t}\n\t// update(data: ArrayBufferView) {\n\t// const gl = this.gl;\n\t// gl.bindBuffer(this.type, this.buffer);\n\t// gl.bufferSubData(this.type, 0, data);\n\t// this.data = data;\n\t// }\n\tdispose() {\n\t\tconst gl = this.gl;\n\t\tgl.deleteBuffer(this.buffer);\n\t}\n}\n\nclass AlbumTexture implements Disposable {\n\tprivate albumTexture: WebGLTexture;\n\talpha = 0;\n\n\tconstructor(\n\t\tprivate gl: WebGL2RenderingContext,\n\t\tprivate mainProgram: GLProgram,\n\t\tprivate vertexBuffer: GLBuffer,\n\t\tprivate indexBuffer: GLBuffer,\n\t\talbumImageData: ImageData,\n\t) {\n\t\tconst albumTexture = gl.createTexture();\n\t\tif (!albumTexture) throw new Error(\"Failed to create texture\");\n\t\tthis.albumTexture = albumTexture;\n\t\tgl.bindTexture(gl.TEXTURE_2D, albumTexture);\n\t\tgl.texImage2D(\n\t\t\tgl.TEXTURE_2D,\n\t\t\t0,\n\t\t\tgl.RGBA,\n\t\t\tgl.RGBA,\n\t\t\tgl.UNSIGNED_BYTE,\n\t\t\talbumImageData,\n\t\t);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.MIRRORED_REPEAT);\n\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.MIRRORED_REPEAT);\n\t}\n\n\tdraw(sampler: string) {\n\t\tconst gl = this.gl;\n\t\tthis.mainProgram.use();\n\t\tgl.activeTexture(gl.TEXTURE0);\n\t\tgl.bindTexture(gl.TEXTURE_2D, this.albumTexture);\n\t\tthis.mainProgram.setUniform1i(sampler, 0);\n\t\tgl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n\t}\n\n\tdispose(): void {\n\t\tthis.gl.deleteTexture(this.albumTexture);\n\t}\n}\n\nclass NoiseTexture implements Disposable {\n\tprivate tex: WebGLTexture;\n\talpha = 0;\n\n\tconstructor(private gl: WebGL2RenderingContext) {\n\t\tconst tex = gl.createTexture();\n\t\tif (!tex) throw new Error(\"Failed to create texture\");\n\t\tthis.tex = tex;\n\t\tNOISE_IMAGE_DATA.decode().then(() => {\n\t\t\tgl.bindTexture(gl.TEXTURE_2D, tex);\n\t\t\tgl.texImage2D(\n\t\t\t\tgl.TEXTURE_2D,\n\t\t\t\t0,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.RGBA,\n\t\t\t\tgl.UNSIGNED_BYTE,\n\t\t\t\tNOISE_IMAGE_DATA,\n\t\t\t);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT);\n\t\t\tgl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT);\n\t\t});\n\t}\n\n\tactive(texture: number = this.gl.TEXTURE1) {\n\t\tthis.gl.activeTexture(texture);\n\t\tthis.gl.bindTexture(this.gl.TEXTURE_2D, this.tex);\n\t}\n\n\tdispose(): void {\n\t\tthis.gl.deleteTexture(this.tex);\n\t}\n}\n\nexport class EplorRenderer extends BaseRenderer {\n\tprivate hasLyric = true;\n\tprivate hasLyricValue = 1;\n\tprivate maxFPS = 30;\n\tprivate lastTickTime = 0;\n\tprivate lastFrameTime = 0;\n\tprivate _lowFreqVolume = 1;\n\tprivate paused = false;\n\tprivate staticMode = false;\n\tprivate gl: WebGL2RenderingContext = this.setupGL();\n\tprivate reduceImageSizeCanvas = new OffscreenCanvas(128, 128);\n\tprivate tickHandle = 0;\n\tprivate sprites: AlbumTexture[] = [];\n\tprivate ampTransition = 0;\n\tprivate playTime = 0;\n\tprivate frameTime = 0;\n\tprivate IllIlllIlIIlllI: number[] = [-0.1, 0.0];\n\tprivate onTick(tickTime: number) {\n\t\tthis.tickHandle = 0;\n\t\tif (this.paused) return;\n\n\t\tconst delta = tickTime - this.lastTickTime;\n\t\tconst frameDelta = tickTime - this.lastFrameTime;\n\t\tthis.lastFrameTime = tickTime;\n\t\tif (delta < 1000 / this.maxFPS) {\n\t\t\tthis.requestTick();\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.hasLyric) this.playTime += frameDelta * this.flowSpeed * 0.2;\n\t\tthis.frameTime += frameDelta;\n\n\t\tif (!(this.onRedraw(this.playTime, frameDelta) && this.staticMode)) {\n\t\t\tthis.requestTick();\n\t\t}\n\n\t\tthis.lastTickTime = tickTime;\n\n\t\tthis.ampTransition;\n\t}\n\n\tprivate mainProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\teplorShader,\n\t\t\"main\",\n\t);\n\tprivate blendProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tblendShader,\n\t\t\"blend\",\n\t);\n\tprivate copyProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tfragShader,\n\t\t\"copy\",\n\t);\n\tprivate noiseProgram: GLProgram = new GLProgram(\n\t\tthis.gl,\n\t\tvertShader,\n\t\tnoiseShader,\n\t\t\"noise\",\n\t);\n\n\tprivate static readonly rawVertexBuffer = new Float32Array([\n\t\t-1, -1, 1, -1, -1, 1, 1, 1,\n\t]);\n\n\tprivate static readonly rawIndexBuffer = new Uint16Array([0, 1, 2, 1, 2, 3]);\n\n\tprivate vertexBuffer = new GLBuffer(\n\t\tthis.gl,\n\t\tthis.gl.ARRAY_BUFFER,\n\t\tEplorRenderer.rawVertexBuffer,\n\t\tthis.gl.STATIC_DRAW,\n\t);\n\n\tprivate indexBuffer = new GLBuffer(\n\t\tthis.gl,\n\t\tthis.gl.ELEMENT_ARRAY_BUFFER,\n\t\tEplorRenderer.rawIndexBuffer,\n\t\tthis.gl.STATIC_DRAW,\n\t);\n\n\tprivate noiseTexture = new NoiseTexture(this.gl);\n\n\tprivate fb: [Framebuffer, Framebuffer];\n\tprivate historyFrameBuffer: Framebuffer[] = [];\n\n\tconstructor(protected canvas: HTMLCanvasElement) {\n\t\tsuper(canvas);\n\t\tconst gl = this.gl;\n\t\tgl.enable(this.gl.BLEND);\n\t\tgl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n\t\tthis.requestTick();\n\t\tconst bounds = canvas.getBoundingClientRect();\n\t\tconst width =\n\t\t\tbounds.width * window.devicePixelRatio * this.currerntRenderScale;\n\t\tconst height =\n\t\t\tbounds.height * window.devicePixelRatio * this.currerntRenderScale;\n\t\tthis.fb = [\n\t\t\tnew Framebuffer(this.gl, width, height),\n\t\t\tnew Framebuffer(this.gl, width, height),\n\t\t];\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.bind();\n\t\t\tgl.blendFunc(this.gl.SRC_ALPHA, this.gl.ONE_MINUS_SRC_ALPHA);\n\t\t}\n\t\tthis.historyFrameBuffer = new Array(2)\n\t\t\t.fill(0)\n\t\t\t.map(() => new Framebuffer(this.gl, width, height));\n\t\tthis.onResize(width, height);\n\t}\n\tprivate _currentSize = [0, 0];\n\tprivate _targetSize = [0, 0];\n\tprivate renderSize = [0, 0];\n\tprivate pixelSize = [0, 0];\n\n\tprotected override onResize(width: number, height: number): void {\n\t\t// super.onResize(width, height);\n\t\tthis._targetSize = [\n\t\t\tMath.max(1, Math.round(width)),\n\t\t\tMath.max(1, Math.round(height)),\n\t\t];\n\t\tif (this.staticMode) this.requestTick();\n\t}\n\n\tprivate checkResize() {\n\t\tif (\n\t\t\tthis._currentSize[0] === this._targetSize[0] &&\n\t\t\tthis._currentSize[1] === this._targetSize[1]\n\t\t)\n\t\t\treturn;\n\t\tthis._currentSize = [...this._targetSize];\n\t\tconst [width, height] = this._targetSize;\n\t\tconst realWidth = Math.round(\n\t\t\tMath.max(width / this.currerntRenderScale, width),\n\t\t);\n\t\tconst realHeight = Math.round(\n\t\t\tMath.max(height / this.currerntRenderScale, height),\n\t\t);\n\t\tthis.renderSize = [width, height];\n\t\tthis.canvas.width = realWidth;\n\t\tthis.canvas.height = realHeight;\n\t\tthis.pixelSize = [realWidth, realHeight];\n\t\tthis.gl.viewport(0, 0, realWidth, realHeight);\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.resize(width, height);\n\t\t}\n\t\tfor (const fb of this.historyFrameBuffer) {\n\t\t\tfb.resize(realWidth, realHeight);\n\t\t}\n\t}\n\n\tprivate requestTick() {\n\t\tif (!this.tickHandle)\n\t\t\tthis.tickHandle = requestAnimationFrame((t) => this.onTick(t));\n\t}\n\n\tprivate drawScreen() {\n\t\tthis.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);\n\t}\n\n\tprivate bindDefaultFrameBuffer() {\n\t\tthis.gl.bindFramebuffer(this.gl.FRAMEBUFFER, null);\n\t}\n\n\tprivate onRedraw(tickTime: number, delta: number) {\n\t\tthis.checkResize();\n\t\tthis.hasLyricValue =\n\t\t\t(this.hasLyricValue * 19 + (this.hasLyric ? 1 : 0)) / 20;\n\t\tconst gl = this.gl;\n\t\tthis.vertexBuffer.bind();\n\t\tthis.indexBuffer.bind();\n\n\t\tthis.mainProgram.use();\n\t\tthis.noiseTexture.active();\n\t\tthis.mainProgram.setUniform1i(\"noisetex\", 1);\n\t\tthis.mainProgram.setUniform2f(\n\t\t\t\"IIlIlIIlIlIllI\",\n\t\t\tthis.renderSize[0],\n\t\t\tthis.renderSize[1],\n\t\t);\n\t\tthis.mainProgram.setUniform1f(\n\t\t\t\"lIIIlllllIllIl\",\n\t\t\tthis.hasLyric ? tickTime / 1000 : 0,\n\t\t);\n\t\tthis.mainProgram.setUniform1f(\"IIIlllllllIIIllIl\", this.hasLyricValue);\n\t\tthis.mainProgram.setUniform1f(\n\t\t\t\"IIIlllIlIIllll\",\n\t\t\tthis.hasLyric ? this._lowFreqVolume : 0.0,\n\t\t);\n\t\tthis.mainProgram.setUniform2f(\n\t\t\t\"IllIlllIlIIlllI\",\n\t\t\tthis.IllIlllIlIIlllI[0],\n\t\t\tthis.IllIlllIlIIlllI[1],\n\t\t);\n\t\tconst [fba, fbb] = this.fb;\n\t\tfbb.bind();\n\t\tgl.clearColor(0, 0, 0, 0);\n\t\tgl.clear(this.gl.COLOR_BUFFER_BIT);\n\n\t\tfor (const sprite of this.sprites) {\n\t\t\tfba.bind();\n\t\t\tgl.clearColor(0, 0, 0, 0);\n\t\t\tgl.clear(this.gl.COLOR_BUFFER_BIT);\n\n\t\t\tthis.mainProgram.use();\n\t\t\tsprite.draw(\"IlllIIlIlllIll\");\n\n\t\t\tfbb.bind();\n\n\t\t\tthis.blendProgram.use();\n\t\t\tfba.active();\n\t\t\tthis.blendProgram.setUniform1i(\"src\", 0);\n\t\t\tthis.blendProgram.setUniform1f(\"lerp\", sprite.alpha);\n\t\t\tthis.blendProgram.setUniform1f(\"scale\", this.currerntRenderScale);\n\t\t\tthis.drawScreen();\n\n\t\t\tsprite.alpha = Math.min(1, sprite.alpha + delta / 200);\n\t\t}\n\n\t\t// 增加噪点以缓解色带现象\n\t\tthis.noiseProgram.use();\n\t\tthis.noiseProgram.setUniform1i(\"src\", 0);\n\t\t// this.noiseProgram.setUniform2f(\n\t\t// \t\"renderSize\",\n\t\t// \tthis.renderSize[0],\n\t\t// \tthis.renderSize[1],\n\t\t// );\n\t\t// this.noiseProgram.setUniform1f(\"frameTime\", this.frameTime);\n\t\tfba.bind();\n\t\tfbb.active();\n\t\tthis.bindDefaultFrameBuffer();\n\t\tthis.drawScreen();\n\n\t\tif (this.sprites.length > 1) {\n\t\t\tconst coveredIndex = this.sprites[this.sprites.length - 1];\n\t\t\tif (coveredIndex.alpha >= 1) {\n\t\t\t\tfor (const deleted of this.sprites.splice(0, this.sprites.length - 1)) {\n\t\t\t\t\tdeleted.dispose();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst isOnlyOneSprite =\n\t\t\tthis.sprites.length === 1 && this.sprites[0].alpha >= 1;\n\t\tconst isTweeningValues = this.hasLyric\n\t\t\t? this.hasLyricValue > 0.00001\n\t\t\t: this.hasLyricValue < 0.99999;\n\t\treturn isOnlyOneSprite || !isTweeningValues;\n\t}\n\n\tprivate copyFrameBuffer(src: Framebuffer, dst: Framebuffer | null = null) {\n\t\tif (src === dst) return;\n\t\tsrc.active(this.gl.TEXTURE0);\n\t\tthis.copyProgram.use();\n\t\tif (dst) {\n\t\t\tdst.bind();\n\t\t} else {\n\t\t\tthis.bindDefaultFrameBuffer();\n\t\t}\n\t\tthis.copyProgram.setUniform1i(\"src\", 0);\n\t\t// this.copyProgram.setUniform1f(\"scale\", scale);\n\t\tthis.drawScreen();\n\t}\n\n\tprivate setupGL() {\n\t\tconst gl = this.canvas.getContext(\"webgl2\", {\n\t\t\talpha: true,\n\t\t\tdepth: false,\n\t\t\tpowerPreference: \"low-power\",\n\t\t});\n\t\tif (!gl) throw new Error(\"WebGL2 not supported\");\n\t\tthis.gl = gl;\n\t\tgl.enable(gl.BLEND);\n\t\tgl.disable(gl.DEPTH_TEST);\n\t\tgl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\t\tif (!gl.getExtension(\"EXT_color_buffer_float\"))\n\t\t\tconsole.warn(\"EXT_color_buffer_float not supported\");\n\t\tif (!gl.getExtension(\"EXT_float_blend\"))\n\t\t\tconsole.warn(\"EXT_float_blend not supported\");\n\t\tif (!gl.getExtension(\"OES_texture_float_linear\"))\n\t\t\tconsole.warn(\"OES_texture_float_linear not supported\");\n\n\t\treturn gl;\n\t}\n\n\toverride setLowFreqVolume(volume: number): void {\n\t\tthis._lowFreqVolume = volume;\n\t}\n\n\toverride setStaticMode(enable: boolean): void {\n\t\tthis.staticMode = enable;\n\t\tthis.lastFrameTime = performance.now();\n\t\tthis.requestTick();\n\t}\n\toverride setFPS(fps: number): void {\n\t\tthis.maxFPS = fps;\n\t}\n\toverride pause(): void {\n\t\tif (this.tickHandle) {\n\t\t\tcancelAnimationFrame(this.tickHandle);\n\t\t\tthis.tickHandle = 0;\n\t\t}\n\t\tthis.paused = true;\n\t}\n\toverride resume(): void {\n\t\tthis.paused = false;\n\t\tthis.requestTick();\n\t}\n\toverride async setAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo = false,\n\t): Promise<void> {\n\t\tif (typeof albumSource === \"string\" && albumSource.trim().length === 0)\n\t\t\tthrow new Error(\"Empty album url\");\n\t\tlet res: HTMLImageElement | HTMLVideoElement | null = null;\n\t\tlet remainRetryTimes = 5;\n\t\tconsole.log(\"setAlbum\", albumSource);\n\t\twhile (!res && remainRetryTimes > 0) {\n\t\t\ttry {\n\t\t\t\tif (typeof albumSource === \"string\") {\n\t\t\t\t\tres = await loadResourceFromUrl(albumSource, isVideo);\n\t\t\t\t} else {\n\t\t\t\t\tres = await loadResourceFromElement(albumSource);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`failed on loading album resource, retrying (${remainRetryTimes})`,\n\t\t\t\t\t{\n\t\t\t\t\t\talbumSource,\n\t\t\t\t\t\terror,\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\tremainRetryTimes--;\n\t\t\t}\n\t\t}\n\t\tconsole.log(\"loaded album resource\", res);\n\t\tif (!res) return;\n\t\t// resize image\n\t\tconst c = this.reduceImageSizeCanvas;\n\t\tconst ctx = c.getContext(\"2d\");\n\t\tif (!ctx) throw new Error(\"Failed to create canvas context\");\n\t\tctx.clearRect(0, 0, c.width, c.height);\n\t\t// const baseFilter = \"saturate(3) contrast(0.8) saturate(8) brightness(0.4)\";\n\t\tconst blurRadius = 10;\n\t\t// Safari 不支持 filter\n\t\t// ctx.filter = baseFilter;\n\t\tconst imgw =\n\t\t\tres instanceof HTMLVideoElement ? res.videoWidth : res.naturalWidth;\n\t\tconst imgh =\n\t\t\tres instanceof HTMLVideoElement ? res.videoHeight : res.naturalHeight;\n\t\tif (imgw * imgh === 0) throw new Error(\"Invalid image size\");\n\t\tctx.drawImage(res, 0, 0, imgw, imgh, 0, 0, c.width, c.height);\n\t\t// ctx.fillStyle = \"white\";\n\t\t// ctx.fillRect(0, 0, c.width, c.height);\n\t\tconst imageData = ctx.getImageData(0, 0, c.width, c.height);\n\t\tcontrastImage(imageData, 0.8);\n\t\tsaturateImage(imageData, 1.5);\n\t\t//\t\tcontrastImage(imageData, 0.8);\n\t\t//\t\tbrightnessImage(imageData, 0.9);\n\t\tblurImage(imageData, blurRadius, 4);\n\t\tconst sprite = new AlbumTexture(\n\t\t\tthis.gl,\n\t\t\tthis.mainProgram,\n\t\t\tthis.vertexBuffer,\n\t\t\tthis.indexBuffer,\n\t\t\timageData,\n\t\t);\n\t\tthis.sprites.push(sprite);\n\t\tthis.playTime = Math.random() * 100000;\n\t\tthis.lastFrameTime = performance.now();\n\t\tconsole.info(Math.random() * 10000);\n\t\tconst r = Number.parseInt((Math.random() * 10000).toFixed(0)) % 3;\n\t\tif (r === 0) {\n\t\t\tthis.IllIlllIlIIlllI = [-1.3, -0.9];\n\t\t\t// this.IllIlllIlIIlllI = [-1.1, -.9];\n\t\t} else if (r === 1) {\n\t\t\t// this.IllIlllIlIIlllI = [-0.3, -0.2];\n\t\t\tthis.IllIlllIlIIlllI = [-1.1, -0.9];\n\t\t} else {\n\t\t\tthis.IllIlllIlIIlllI = [-1.3, -0.9];\n\t\t}\n\t\tthis.requestTick();\n\t}\n\n\toverride setHasLyric(hasLyric: boolean): void {\n\t\tthis.hasLyric = hasLyric;\n\t\tthis.requestTick();\n\t}\n\n\toverride getElement(): HTMLElement {\n\t\treturn this.canvas;\n\t}\n\toverride dispose(): void {\n\t\tsuper.dispose();\n\t\tthis.vertexBuffer.dispose();\n\t\tthis.indexBuffer.dispose();\n\t\tthis.noiseTexture.dispose();\n\t\tfor (const s of this.sprites) {\n\t\t\ts.dispose();\n\t\t}\n\t\tthis.copyProgram.dispose();\n\t\tthis.blendProgram.dispose();\n\t\tthis.mainProgram.dispose();\n\t\tfor (const fb of this.fb) {\n\t\t\tfb.dispose();\n\t\t}\n\t\tfor (const fb of this.historyFrameBuffer) {\n\t\t\tfb.dispose();\n\t\t}\n\t\tif (this.tickHandle) {\n\t\t\tcancelAnimationFrame(this.tickHandle);\n\t\t\tthis.tickHandle = 0;\n\t\t}\n\t}\n}\n","/**\n * @fileoverview\n * 一个播放歌词的组件\n * @author SteveXMH\n */\n\nexport { AbstractBaseRenderer, BaseRenderer } from \"./base\";\nimport { AbstractBaseRenderer, BaseRenderer } from \"./base\";\nexport { PixiRenderer } from \"./pixi-renderer\";\nexport { EplorRenderer } from \"./eplor-renderer\";\n\nexport class BackgroundRender<Renderer extends BaseRenderer>\n\timplements AbstractBaseRenderer\n{\n\tprivate element: HTMLCanvasElement;\n\tprivate renderer: Renderer;\n\tconstructor(renderer: Renderer, canvas: HTMLCanvasElement) {\n\t\tthis.renderer = renderer;\n\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\n\tstatic new<Renderer extends BaseRenderer>(type: {\n\t\tnew (canvas: HTMLCanvasElement): Renderer;\n\t}): BackgroundRender<Renderer> {\n\t\tconst canvas = document.createElement(\"canvas\");\n\t\treturn new BackgroundRender(new type(canvas), canvas);\n\t}\n\n\tsetRenderScale(scale: number): void {\n\t\tthis.renderer.setRenderScale(scale);\n\t}\n\n\tsetFlowSpeed(speed: number): void {\n\t\tthis.renderer.setFlowSpeed(speed);\n\t}\n\tsetStaticMode(enable: boolean): void {\n\t\tthis.renderer.setStaticMode(enable);\n\t}\n\tsetFPS(fps: number): void {\n\t\tthis.renderer.setFPS(fps);\n\t}\n\tpause(): void {\n\t\tthis.renderer.pause();\n\t}\n\tresume(): void {\n\t\tthis.renderer.resume();\n\t}\n\tsetLowFreqVolume(volume: number): void {\n\t\tthis.renderer.setLowFreqVolume(volume);\n\t}\n\tsetHasLyric(hasLyric: boolean): void {\n\t\tthis.renderer.setHasLyric(hasLyric);\n\t}\n\tsetAlbum(\n\t\talbumSource: string | HTMLImageElement | HTMLVideoElement,\n\t\tisVideo?: boolean,\n\t): Promise<void> {\n\t\treturn this.renderer.setAlbum(albumSource, isVideo);\n\t}\n\tgetElement() {\n\t\treturn this.element;\n\t}\n\tdispose() {\n\t\tthis.renderer.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","export function derivative(f: (x: number) => number) {\n\tconst h = 0.001;\n\treturn (x: number) => (f(x + h) - f(x - h)) / (2 * h);\n}\n\nexport function getVelocity(f: (t: number) => number): (t: number) => number {\n\treturn derivative(f);\n}\n","import { getVelocity } from \"./derivative\";\n\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}\n\tconst damping_frequency = Math.sqrt(4.0 * mass * stiffness - damping ** 2.0);\n\tconst leftover =\n\t\t(damping * delta - 2.0 * mass * velocity) / damping_frequency;\n\tconst dfm = (0.5 * damping_frequency) / mass;\n\tconst dm = -(0.5 * damping) / mass;\n\treturn (t: seconds) => {\n\t\tt -= delay;\n\t\tif (t < 0) return from;\n\t\treturn (\n\t\t\tto -\n\t\t\t(Math.cos(t * dfm) * delta + Math.sin(t * dfm) * leftover) *\n\t\t\t\tMath.E ** (t * dm)\n\t\t);\n\t};\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 playing = true;\n\tprivate lastStyle = \"\";\n\tprivate currentInterlude?: [number, number];\n\tprivate currentTime = 0;\n\tprivate interludeTime = 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\tpause() {\n\t\tthis.playing = false;\n\t}\n\tresume() {\n\t\tthis.playing = true;\n\t}\n\tupdate(delta = 0) {\n\t\tif (!this.playing) return;\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\t20 +\n\t\t\t\t\t1;\n\n\t\t\t\tif (currentDuration < 1000) {\n\t\t\t\t\tscale *= 1 - ((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\tconst dotsDuration = Math.max(0, interludeDuration - 750);\n\n\t\t\t\tscale = Math.max(0, scale) * 0.7;\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) / dotsDuration) * 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 - dotsDuration / 3) * 3) / dotsDuration) * 0.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 - (dotsDuration / 3) * 2) * 3) / dotsDuration) *\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","// biome-ignore format: matrix\nexport type Matrix4 = [\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n\tnumber, number, number, number,\n];\n\nexport function createMatrix4(): Matrix4 {\n\t// biome-ignore format: matrix\n\treturn [\n 1, 0, 0, 0,\n 0, 1, 0, 0,\n 0, 0, 1, 0,\n 0, 0, 0, 1\n ];\n}\n\nexport function scaleMatrix4(\n\tm: Matrix4,\n\tscale = 1,\n\torigin = { x: 0, y: 0 },\n): Matrix4 {\n\tconst [ox, oy] = [origin.x, origin.y];\n\t// biome-ignore format: matrix\n\treturn [\n m[0] * scale , m[1] * scale , m[2] * scale , m[3],\n m[4] * scale , m[5] * scale , m[6] * scale , m[7],\n m[8] * scale , m[9] * scale , m[10] * scale, m[11],\n m[12] - ox * scale + ox, m[13] - oy * scale + oy, m[14] , m[15]\n ];\n}\n\nexport function translateMatrix4(m: Matrix4, x = 0, y = 0, z = 0): Matrix4 {\n\t// biome-ignore format: matrix\n\treturn [\n m[0] , m[1] , m[2] , m[3] ,\n m[4] , m[5] , m[6] , m[7] ,\n m[8] , m[9] , m[10] , m[11],\n m[12] + x, m[13] + y, m[14] + z, m[15]\n ];\n}\n\nexport function matrix4ToCSS(m: Matrix4, fractionDigits = 4): string {\n\tconst format = (n: number, i: number) => n.toFixed(fractionDigits);\n\treturn `matrix3d(${m.map(format).join(\", \")})`;\n}\n","/**\n * https://github.com/gre/bezier-easing\n * BezierEasing - use bezier curve for transition easing function\n * by Gaëtan Renaudeau 2014 - 2015 – MIT License\n */\n\n// These values are established by empiricism with tests (tradeoff: performance VS precision)\nvar NEWTON_ITERATIONS = 4;\nvar NEWTON_MIN_SLOPE = 0.001;\nvar SUBDIVISION_PRECISION = 0.0000001;\nvar SUBDIVISION_MAX_ITERATIONS = 10;\n\nvar kSplineTableSize = 11;\nvar kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);\n\nvar float32ArraySupported = typeof Float32Array === 'function';\n\nfunction A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }\nfunction B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }\nfunction C (aA1) { return 3.0 * aA1; }\n\n// Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.\nfunction calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }\n\n// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.\nfunction getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }\n\nfunction binarySubdivide (aX, aA, aB, mX1, mX2) {\n var currentX, currentT, i = 0;\n do {\n currentT = aA + (aB - aA) / 2.0;\n currentX = calcBezier(currentT, mX1, mX2) - aX;\n if (currentX > 0.0) {\n aB = currentT;\n } else {\n aA = currentT;\n }\n } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);\n return currentT;\n}\n\nfunction newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {\n for (var i = 0; i < NEWTON_ITERATIONS; ++i) {\n var currentSlope = getSlope(aGuessT, mX1, mX2);\n if (currentSlope === 0.0) {\n return aGuessT;\n }\n var currentX = calcBezier(aGuessT, mX1, mX2) - aX;\n aGuessT -= currentX / currentSlope;\n }\n return aGuessT;\n}\n\nfunction LinearEasing (x) {\n return x;\n}\n\nmodule.exports = function bezier (mX1, mY1, mX2, mY2) {\n if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {\n throw new Error('bezier x values must be in [0, 1] range');\n }\n\n if (mX1 === mY1 && mX2 === mY2) {\n return LinearEasing;\n }\n\n // Precompute samples table\n var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);\n for (var i = 0; i < kSplineTableSize; ++i) {\n sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);\n }\n\n function getTForX (aX) {\n var intervalStart = 0.0;\n var currentSample = 1;\n var lastSample = kSplineTableSize - 1;\n\n for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {\n intervalStart += kSampleStepSize;\n }\n --currentSample;\n\n // Interpolate to provide an initial guess for t\n var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);\n var guessForT = intervalStart + dist * kSampleStepSize;\n\n var initialSlope = getSlope(guessForT, mX1, mX2);\n if (initialSlope >= NEWTON_MIN_SLOPE) {\n return newtonRaphsonIterate(aX, guessForT, mX1, mX2);\n } else if (initialSlope === 0.0) {\n return guessForT;\n } else {\n return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);\n }\n }\n\n return function BezierEasing (x) {\n // Because JavaScript number are imprecise, we should guarantee the extremes are right.\n if (x === 0) {\n return 0;\n }\n if (x === 1) {\n return 1;\n }\n return calcBezier(getTForX(x), mY1, mY2);\n };\n};\n","import { LyricPlayer } from \".\";\nimport { Disposable, HasElement, LyricLine, LyricWord } from \"../interfaces\";\nimport { createMatrix4, matrix4ToCSS, scaleMatrix4 } from \"../utils/matrix\";\nimport { Spring } from \"../utils/spring\";\nimport bezier from \"bezier-easing\";\nimport { WebAnimationSpring } from \"../utils/wa-spring\";\n\nconst CJKEXP = /^[\\p{Unified_Ideograph}\\u0800-\\u9FFC]+$/u;\n\nenum EmphasizeAnimationMethod {\n\tFloatAndGlow = \"float-and-glow\",\n\tFloatOnly = \"float-only\",\n}\n\ninterface RealWord extends LyricWord {\n\tmainElement: HTMLSpanElement;\n\tsubElements: HTMLSpanElement[];\n\telementAnimations: Animation[];\n\tmaskAnimations: Animation[];\n\twidth: number;\n\theight: number;\n\tpadding: number;\n\tshouldEmphasize: boolean;\n}\n\nconst ANIMATION_FRAME_QUANTITY = 32;\n\nconst norNum = (min: number, max: number) => (x: number) =>\n\tMath.min(1, Math.max(0, (x - min) / (max - min)));\nconst EMP_EASING_MID = 0.4;\nconst beginNum = norNum(0, EMP_EASING_MID);\nconst endNum = norNum(EMP_EASING_MID, 1);\n\nconst makeEmpEasing = (mid: number) => {\n\tconst bezIn = bezier(0.3, 0, 0.25, 1);\n\tconst bezOut = bezier(0.5, 0, 0.3, 1);\n\treturn (x: number) => (x < mid ? bezIn(beginNum(x)) : 1 - bezOut(endNum(x)));\n};\nconst defaultEmpEasing = makeEmpEasing(EMP_EASING_MID);\n\n// function generateFadeGradient(\n// \twidth: number,\n// \tpadding = 0,\n// \tbright = \"rgba(0,0,0,0.85)\",\n// \tdark = \"rgba(0,0,0,0.25)\",\n// ): [string, number] {\n// \tconst totalAspect = 2 + width + padding;\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\tleftPos * 100\n// \t\t}%,${bright} ${(leftPos + widthInTotal) * 100}%,${dark} ${\n// \t\t\t(leftPos + widthInTotal) * 100\n// \t\t}%)`,\n// \t\ttotalAspect,\n// \t];\n// }\n\nfunction generateFadeGradient(\n\twidth: number,\n\tpadding = 0,\n\tbright = \"rgba(0,0,0,0.85)\",\n\tdark = \"rgba(0,0,0,0.25)\",\n): [string, number] {\n\tconst totalAspect = 2 + width + padding;\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\ttotalAspect,\n\t];\n}\n\n// 将输入的单词重新分组,之间没有空格的单词将会组合成一个单词数组\n// 例如输入:[\"Life\", \" \", \"is\", \" a\", \" su\", \"gar so\", \"sweet\"]\n// 应该返回:[\"Life\", \" \", \"is\", \" a\", [\" su\", \"gar\"], \"so\", \"sweet\"]\nfunction chunkAndSplitLyricWords(\n\twords: LyricWord[],\n): (LyricWord | LyricWord[])[] {\n\tconst resplitedWords: LyricWord[] = [];\n\n\tfor (const w of words) {\n\t\tconst realLength = w.word.replace(/\\s/g, \"\").length;\n\t\tconst splited = w.word.split(\" \").filter((v) => v.trim().length > 0);\n\t\tif (splited.length > 1) {\n\t\t\tif (w.word.startsWith(\" \")) {\n\t\t\t\tresplitedWords.push({\n\t\t\t\t\tword: \" \",\n\t\t\t\t\tstartTime: 0,\n\t\t\t\t\tendTime: 0,\n\t\t\t\t});\n\t\t\t}\n\t\t\tlet charPos = 0;\n\t\t\tfor (const s of splited) {\n\t\t\t\tconst word: LyricWord = {\n\t\t\t\t\tword: s,\n\t\t\t\t\tstartTime:\n\t\t\t\t\t\tw.startTime + (charPos / realLength) * (w.endTime - w.startTime),\n\t\t\t\t\tendTime:\n\t\t\t\t\t\tw.startTime +\n\t\t\t\t\t\t((charPos + s.length) / realLength) * (w.endTime - w.startTime),\n\t\t\t\t};\n\t\t\t\tresplitedWords.push(word);\n\t\t\t\tresplitedWords.push({\n\t\t\t\t\tword: \" \",\n\t\t\t\t\tstartTime: 0,\n\t\t\t\t\tendTime: 0,\n\t\t\t\t});\n\t\t\t\tcharPos += s.length;\n\t\t\t}\n\t\t\tif (!w.word.endsWith(\" \")) {\n\t\t\t\tresplitedWords.pop();\n\t\t\t}\n\t\t} else {\n\t\t\tresplitedWords.push(w);\n\t\t}\n\t}\n\n\tlet wordChunk: string[] = [];\n\tlet wChunk: LyricWord[] = [];\n\tconst result: (LyricWord | LyricWord[])[] = [];\n\n\tfor (const w of resplitedWords) {\n\t\tconst word = w.word;\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 (\n\t\tword.endTime - word.startTime >= 1000 &&\n\t\tword.word.trim().length <= 7 &&\n\t\tword.word.trim().length >= 1\n\t);\n}\n\nexport class RawLyricLineMouseEvent extends MouseEvent {\n\tconstructor(\n\t\tpublic readonly line: LyricLineEl,\n\t\tevent: MouseEvent,\n\t) {\n\t\tsuper(event.type, event);\n\t}\n}\n\ntype MouseEventMap = {\n\t[evt in keyof 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// readonly lineWebAnimationTransforms = {\n\t// \tposX: new WebAnimationSpring(this.element, \"transform\", (v) => `translateX(${v.toFixed(1)}px)`),\n\t// \tposY: new WebAnimationSpring(this.element, \"transform\", (v) => `translateY(${v.toFixed(1)}px)`),\n\t// \tscale: new WebAnimationSpring(this.element, \"transform\", (v) => `scale(${v.toFixed(4)})`, 1),\n\t// };\n\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, options);\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, options);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isEnabled = false;\n\tenable(maskAnimationTime = this.lyricLine.startTime) {\n\t\tthis.isEnabled = true;\n\t\tthis.element.classList.add(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.elementAnimations) {\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\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(\n\t\t\t\t\tthis.totalDuration,\n\t\t\t\t\tMath.max(0, maskAnimationTime - this.lyricLine.startTime),\n\t\t\t\t);\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\tdisable(maskAnimationTime = 0) {\n\t\tthis.isEnabled = false;\n\t\tthis.element.classList.remove(\"active\");\n\t\tconst main = this.element.children[0] as HTMLDivElement;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.elementAnimations) {\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\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(\n\t\t\t\t\tthis.totalDuration,\n\t\t\t\t\tMath.max(0, maskAnimationTime - this.lyricLine.startTime),\n\t\t\t\t);\n\t\t\t\ta.pause();\n\t\t\t}\n\t\t}\n\t\tmain.classList.remove(\"active\");\n\t}\n\tresume() {\n\t\tif (!this.isEnabled) return;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.play();\n\t\t\t}\n\t\t}\n\t}\n\tpause() {\n\t\tif (!this.isEnabled) return;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.pause();\n\t\t\t}\n\t\t}\n\t}\n\tsetMaskAnimationState(maskAnimationTime = 0) {\n\t\tconst t = maskAnimationTime - this.lyricLine.startTime;\n\t\tfor (const word of this.splittedWords) {\n\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\ta.currentTime = Math.min(this.totalDuration, Math.max(0, t));\n\t\t\t\ta.playbackRate = 1;\n\t\t\t\tif (t >= 0 && t < this.totalDuration) a.play();\n\t\t\t\telse a.pause();\n\t\t\t}\n\t\t}\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\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 = \"\";\n\t\t// if (this.lyricPlayer.getEnableSpring()) {\n\t\tstyle += `transform:translate(${this.lineTransforms.posX\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(1)}px,${this.lineTransforms.posY\n\t\t\t.getCurrentPosition()\n\t\t\t.toFixed(1)}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 = chunkAndSplitLyricWords(this.lyricLine.words);\n\t\tmain.innerHTML = \"\";\n\t\tthis.splittedWords = [];\n\t\tfor (const chunk of chunkedWords) {\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\t// 多个没有空格的单词组合成的一个单词数组\n\t\t\t\tif (chunk.length === 0) continue;\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 emp = chunk\n\t\t\t\t\t.map((word) => shouldEmphasize(word))\n\t\t\t\t\t.reduce((a, b) => a || b, shouldEmphasize(merged));\n\t\t\t\tconst wrapperWordEl = document.createElement(\"span\");\n\t\t\t\twrapperWordEl.classList.add(\"emphasize-wrapper\");\n\t\t\t\tconst characterElements: HTMLElement[] = [];\n\t\t\t\tfor (const word of chunk) {\n\t\t\t\t\tconst mainWordEl = document.createElement(\"span\");\n\t\t\t\t\t// const 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\tcharacterElements.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: [this.initFloatAnimation(merged, mainWordEl)],\n\t\t\t\t\t\t\tmaskAnimations: [],\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\tpadding: 0,\n\t\t\t\t\t\t\tshouldEmphasize: emp,\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: [this.initFloatAnimation(word, mainWordEl)],\n\t\t\t\t\t\t\tmaskAnimations: [],\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\tpadding: 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 (emp) {\n\t\t\t\t\tthis.splittedWords[\n\t\t\t\t\t\tthis.splittedWords.length - 1\n\t\t\t\t\t].elementAnimations.push(\n\t\t\t\t\t\t...this.initEmphasizeAnimation(\n\t\t\t\t\t\t\tcharacterElements,\n\t\t\t\t\t\t\tmerged.endTime - merged.startTime,\n\t\t\t\t\t\t\tmerged.startTime - this.lyricLine.startTime,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\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\t// 纯空格\n\t\t\t\tmain.appendChild(document.createTextNode(\" \"));\n\t\t\t} else {\n\t\t\t\t// 单个单词\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\tmaskAnimations: [],\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\tpadding: 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\tconst duration = Math.abs(realWord.endTime - realWord.startTime);\n\t\t\t\t\trealWord.elementAnimations.push(\n\t\t\t\t\t\t...this.initEmphasizeAnimation(\n\t\t\t\t\t\t\tcharEls,\n\t\t\t\t\t\t\tduration,\n\t\t\t\t\t\t\trealWord.startTime - this.lyricLine.startTime,\n\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\t// realWord.elementAnimations = this.initEmphasizeAnimation(realWord);\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\tlet up = 0.05;\n\t\tif (this.lyricLine.isBG) {\n\t\t\tup *= 2;\n\t\t}\n\t\tif (shouldEmphasize(word) && duration < 1200) {\n\t\t\tup = 0;\n\t\t}\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(${-up}em)`,\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\teasing: \"ease-out\",\n\t\t\t},\n\t\t);\n\t\ta.pause();\n\t\treturn a;\n\t}\n\t// 按照原 Apple Music 参考,强调效果只应用缩放、轻微左右位移和辉光效果,原主要的悬浮位移效果不变\n\t// 为了避免产生锯齿抖动感,使用 matrix3d 来实现缩放和位移\n\tprivate initEmphasizeAnimation(\n\t\tcharacterElements: HTMLElement[],\n\t\tduration: number,\n\t\tdelay: number,\n\t): Animation[] {\n\t\tconst de = Math.max(0, delay);\n\t\tconst du = Math.max(1000, duration);\n\n\t\tlet method = EmphasizeAnimationMethod.FloatAndGlow;\n\n\t\tif (du < 1200) {\n\t\t\tmethod = EmphasizeAnimationMethod.FloatOnly;\n\t\t}\n\n\t\tlet result: Animation[] = [];\n\n\t\tswitch (method) {\n\t\t\tcase EmphasizeAnimationMethod.FloatAndGlow: {\n\t\t\t\tlet amount = 0;\n\t\t\t\tlet blur = 0;\n\t\t\t\tif (du >= 1200 && du < 2000) {\n\t\t\t\t\tamount = 0.7;\n\t\t\t\t\tblur = 0.5;\n\t\t\t\t} else if (du >= 2000 && du < 3000) {\n\t\t\t\t\tamount = 0.8;\n\t\t\t\t\tblur = 0.6;\n\t\t\t\t} else if (du >= 3000 && du < 4000) {\n\t\t\t\t\tamount = 1.0;\n\t\t\t\t\tblur = 0.8;\n\t\t\t\t} else if (du >= 4000) {\n\t\t\t\t\tamount = 1.0;\n\t\t\t\t\tblur = 0.8;\n\t\t\t\t}\n\t\t\t\tconst animateDu = Number.isFinite(du) ? Math.max(du * 1.2, 2000) : 0;\n\t\t\t\tconst empEasing = makeEmpEasing(EMP_EASING_MID);\n\t\t\t\tresult = characterElements.flatMap((el, i, arr) => {\n\t\t\t\t\tconst wordDe = de + (du / 3 / arr.length) * i;\n\t\t\t\t\tconst result: Animation[] = [];\n\n\t\t\t\t\tconst frames: Keyframe[] = new Array(ANIMATION_FRAME_QUANTITY)\n\t\t\t\t\t\t.fill(0)\n\t\t\t\t\t\t.map((_, i) => {\n\t\t\t\t\t\t\tconst x = (i + 1) / ANIMATION_FRAME_QUANTITY;\n\t\t\t\t\t\t\tconst y = empEasing(x);\n\t\t\t\t\t\t\tconst transX = Math.sin(x * Math.PI * 2);\n\t\t\t\t\t\t\tconst glowLevel =\n\t\t\t\t\t\t\t\tMath.max(0, x < EMP_EASING_MID ? y / 2 : y - 0.5) * blur;\n\t\t\t\t\t\t\t// const floatLevel =\n\t\t\t\t\t\t\t// \tMath.max(0, x < EMP_EASING_MID ? y : y - 0.5);\n\n\t\t\t\t\t\t\tconst mat = scaleMatrix4(createMatrix4(), 1 + y * 0.1 * amount);\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\toffset: x,\n\t\t\t\t\t\t\t\ttransform: `${matrix4ToCSS(mat, 4)} translate(${\n\t\t\t\t\t\t\t\t\ttransX * 0.005 * amount\n\t\t\t\t\t\t\t\t}em,${-y * 0.05}em)`,\n\t\t\t\t\t\t\t\ttextShadow: `rgba(255, 255, 255, ${glowLevel}) 0 0 10px`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\tconst ani = el.animate(frames, {\n\t\t\t\t\t\tduration: animateDu,\n\t\t\t\t\t\tdelay: Number.isFinite(wordDe) ? wordDe : 0,\n\t\t\t\t\t\tid: `emphasize-word-float-and-glow-${el.innerText}-${i}`,\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.onfinish = () => {\n\t\t\t\t\t\tani.pause();\n\t\t\t\t\t};\n\t\t\t\t\tani.pause();\n\t\t\t\t\tresult.push(ani);\n\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase EmphasizeAnimationMethod.FloatOnly: {\n\t\t\t\tresult = characterElements.flatMap((el, i, arr) => {\n\t\t\t\t\tconst wordDe = de + (du / 1.5 / arr.length) * i;\n\t\t\t\t\tconst result: Animation[] = [];\n\n\t\t\t\t\tconst frames: Keyframe[] = new Array(ANIMATION_FRAME_QUANTITY)\n\t\t\t\t\t\t.fill(0)\n\t\t\t\t\t\t.map((_, i) => {\n\t\t\t\t\t\t\tconst x = (i + 1) / ANIMATION_FRAME_QUANTITY;\n\t\t\t\t\t\t\tconst y = x < EMP_EASING_MID ? defaultEmpEasing(x) : 1;\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\toffset: x,\n\t\t\t\t\t\t\t\ttransform: `translateY(${-y * 0.05}em)`,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\tconst ani = el.animate(frames, {\n\t\t\t\t\t\tduration: Number.isFinite(du) ? du * 2 : 0,\n\t\t\t\t\t\tdelay: Number.isFinite(wordDe) ? wordDe : 0,\n\t\t\t\t\t\tid: `emphasize-word-float-only-${el.innerText}-${i}`,\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.onfinish = () => {\n\t\t\t\t\t\tani.pause();\n\t\t\t\t\t};\n\t\t\t\t\tani.pause();\n\t\t\t\t\tresult.push(ani);\n\n\t\t\t\t\treturn result;\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\tprivate get totalDuration() {\n\t\treturn this.lyricLine.endTime - this.lyricLine.startTime;\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\tfor (const word of this.splittedWords) {\n\t\t\tconst el = word.mainElement;\n\t\t\tif (el) {\n\t\t\t\tword.padding = parseFloat(getComputedStyle(el).paddingLeft);\n\t\t\t\tword.width = el.clientWidth - word.padding * 2;\n\t\t\t\tword.height = el.clientHeight - word.padding * 2;\n\t\t\t} else {\n\t\t\t\tword.width = 0;\n\t\t\t\tword.height = 0;\n\t\t\t\tword.padding = 0;\n\t\t\t}\n\t\t}\n\t\tif (this.lyricPlayer.supportMaskImage) {\n\t\t\tthis.generateWebAnimationBasedMaskImage();\n\t\t} else {\n\t\t\tthis.generateCalcBasedMaskImage();\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\tprivate generateCalcBasedMaskImage() {\n\t\tfor (const word of this.splittedWords) {\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, totalAspect] = generateFadeGradient(\n\t\t\t\t\tfadeWidth / word.width,\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}\n\tprivate generateWebAnimationBasedMaskImage() {\n\t\tconst totalDuration = this.totalDuration;\n\t\tthis.splittedWords.forEach((word, i) => {\n\t\t\tconst wordEl = word.mainElement;\n\t\t\tif (wordEl) {\n\t\t\t\t// TODO: 可选配置渐变宽度\n\t\t\t\t// Apple Music for iPad 上是 `word.height / 2`\n\t\t\t\t// Apple Music for Android 上是 `word.height`\n\t\t\t\tconst fadeWidth = word.height / 2;\n\t\t\t\tconst [maskImage, totalAspect] = generateFadeGradient(\n\t\t\t\t\tfadeWidth / (word.width + word.padding * 2),\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\t// 为了尽可能将渐变动画在相连的每个单词间近似衔接起来\n\t\t\t\t// 要综合每个单词的效果时间和间隙生成动画帧数组\n\t\t\t\tconst widthBeforeSelf =\n\t\t\t\t\tthis.splittedWords.slice(0, i).reduce((a, b) => a + b.width, 0) +\n\t\t\t\t\t(this.splittedWords[0] ? fadeWidth : 0);\n\t\t\t\tconst minOffset = -(word.width + word.padding * 2 + fadeWidth);\n\t\t\t\tconst clampOffset = (x: number) => Math.max(minOffset, Math.min(0, x));\n\t\t\t\tlet curPos = -widthBeforeSelf - word.width - word.padding - fadeWidth;\n\t\t\t\tlet timeOffset = 0;\n\t\t\t\tconst frames: Keyframe[] = [];\n\t\t\t\tlet lastPos = curPos;\n\t\t\t\tlet lastTime = 0;\n\t\t\t\tconst pushFrame = () => {\n\t\t\t\t\tconst moveOffset = curPos - lastPos;\n\t\t\t\t\tconst time = Math.max(0, Math.min(1, timeOffset));\n\t\t\t\t\tconst duration = time - lastTime;\n\t\t\t\t\tconst d = Math.abs(duration / moveOffset);\n\t\t\t\t\t// 因为有可能会和之前的动画有边界\n\t\t\t\t\tif (curPos > minOffset && lastPos < minOffset) {\n\t\t\t\t\t\tconst staticTime = Math.abs(lastPos - minOffset) * d;\n\t\t\t\t\t\tconst value = `${clampOffset(lastPos)}px 0`;\n\t\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\t\toffset: lastTime + staticTime,\n\t\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tframes.push(frame);\n\t\t\t\t\t}\n\t\t\t\t\tif (curPos > 0 && lastPos < 0) {\n\t\t\t\t\t\tconst staticTime = Math.abs(lastPos) * d;\n\t\t\t\t\t\tconst value = `${clampOffset(curPos)}px 0`;\n\t\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\t\toffset: lastTime + staticTime,\n\t\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t\t};\n\t\t\t\t\t\tframes.push(frame);\n\t\t\t\t\t}\n\t\t\t\t\tconst value = `${clampOffset(curPos)}px 0`;\n\t\t\t\t\tconst frame: Keyframe = {\n\t\t\t\t\t\toffset: time,\n\t\t\t\t\t\tmaskPosition: value,\n\t\t\t\t\t};\n\t\t\t\t\tframes.push(frame);\n\t\t\t\t\tlastPos = curPos;\n\t\t\t\t\tlastTime = time;\n\t\t\t\t};\n\t\t\t\tpushFrame();\n\t\t\t\tlet lastTimeStamp = 0;\n\t\t\t\tthis.splittedWords.forEach((otherWord, j) => {\n\t\t\t\t\t// 停顿\n\t\t\t\t\t{\n\t\t\t\t\t\tconst curTimeStamp = otherWord.startTime - this.lyricLine.startTime;\n\t\t\t\t\t\tconst staticDuration = curTimeStamp - lastTimeStamp;\n\t\t\t\t\t\ttimeOffset += staticDuration / totalDuration;\n\t\t\t\t\t\tif (staticDuration > 0) pushFrame();\n\t\t\t\t\t\tlastTimeStamp = curTimeStamp;\n\t\t\t\t\t}\n\t\t\t\t\t// 移动\n\t\t\t\t\t{\n\t\t\t\t\t\tconst fadeDuration = otherWord.endTime - otherWord.startTime;\n\t\t\t\t\t\ttimeOffset += fadeDuration / totalDuration;\n\t\t\t\t\t\tcurPos += otherWord.width;\n\t\t\t\t\t\tif (j === 0) {\n\t\t\t\t\t\t\tcurPos += fadeWidth * 1.5;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (j === this.splittedWords.length - 1) {\n\t\t\t\t\t\t\tcurPos += fadeWidth * 0.5;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (fadeDuration > 0) pushFrame();\n\t\t\t\t\t\tlastTimeStamp += fadeDuration;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tfor (const a of word.maskAnimations) {\n\t\t\t\t\ta.cancel();\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tconst ani = wordEl.animate(frames, {\n\t\t\t\t\t\tduration: totalDuration || 1,\n\t\t\t\t\t\tid: `fade-word-${word.word}-${i}`,\n\t\t\t\t\t\teasing: \"linear\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t});\n\t\t\t\t\tani.pause();\n\t\t\t\t\tword.maskAnimations = [ani];\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.warn(\"应用渐变动画发生错误\", frames, totalDuration, err);\n\t\t\t\t}\n\t\t\t}\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 roundedBlur = Math.round(blur);\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, roundedBlur);\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\t// this.lineWebAnimationTransforms.posX.setTargetPosition(left);\n\t\t\t// this.lineWebAnimationTransforms.posY.setTargetPosition(top);\n\t\t\t// this.lineWebAnimationTransforms.scale.setTargetPosition(scale);\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\t// this.lineWebAnimationTransforms.posX.stop();\n\t\t\t// this.lineWebAnimationTransforms.posY.stop();\n\t\t\t// this.lineWebAnimationTransforms.scale.stop();\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, roundedBlur)) {\n\t\t\t\tthis.blur = Math.min(32, roundedBlur);\n\t\t\t\tthis.element.style.filter = `blur(${Math.min(32, roundedBlur)}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\nexport interface LyricLineMouseEventListener {\n\t(evt: LyricLineMouseEvent): void;\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: 16.5,\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(6vh, 8vw), 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\tbackfaceVisibility: \"hidden\",\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\"&:has(>*):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\"&:has(>*):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.4,\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, span.emphasize-wrapper\": {\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\twillChange: \"transform,display,mask-image\",\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\t\"&.emphasize, span.emphasize\": {\n\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t\t\"& > span\": {\n\t\t\t\t\t\tpadding: \"1em\",\n\t\t\t\t\t\tmargin: \"-1em\",\n\t\t\t\t\t},\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.3,\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 _baseFontSize = parseFloat(getComputedStyle(this.element).fontSize);\n\tpublic get baseFontSize() {\n\t\treturn this._baseFontSize;\n\t}\n\tprivate isPageVisible = true;\n\tprivate onPageShow = () => {\n\t\tthis.isPageVisible = true;\n\t\tthis.setCurrentTime(this.currentTime, true);\n\t};\n\tprivate onPageHide = () => {\n\t\tthis.isPageVisible = false;\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\twindow.addEventListener(\"pagehide\", this.onPageHide);\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\tMath.max(currentTime, this.processedLines[0].startTime - 250),\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\tthis._baseFontSize = parseFloat(getComputedStyle(this.element).fontSize);\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\tfor (const line of lines) {\n\t\t\tfor (const word of line.words) {\n\t\t\t\tword.word = word.word.replace(/\\s+/g, \" \");\n\t\t\t}\n\t\t}\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\n\t\t\t\tif (i === 0) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t\tstartTime: Math.max(line.startTime - timeOffset, 0),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tconst lastLine = lines[i - 1];\n\t\t\t\tconst pastLine = lines[i - 2];\n\t\t\t\tif (lastLine?.isBG && pastLine) {\n\t\t\t\t\tif (pastLine.endTime < line.startTime) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\tMath.max(pastLine.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else if (lastLine?.endTime) {\n\t\t\t\t\tif (lastLine.endTime < line.startTime) {\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\tMath.max(lastLine?.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\t...line,\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 - 20, curPos + 10);\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] + 40;\n\t\t\t}\n\t\t\tlet targetOpacity = 1;\n\t\t\tif (!isActive && i <= (interlude ? interlude[2] : this.scrollToIndex)) {\n\t\t\t\tif (this.hidePassedLines) {\n\t\t\t\t\ttargetOpacity = 0;\n\t\t\t\t} else if (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.25;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 0.15;\n\t\t\t\t}\n\t\t\t} else if (hasBuffered) {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.85;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 1;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.25;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 0.5;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.invokedByScrollEvent) {\n\t\t\t\tif (this.isNonDynamic) {\n\t\t\t\t\ttargetOpacity = 0.85;\n\t\t\t\t} else {\n\t\t\t\t\ttargetOpacity = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet blurLevel = 0;\n\t\t\tif (this.enableBlur) {\n\t\t\t\tif (isActive) {\n\t\t\t\t\tblurLevel = 0;\n\t\t\t\t} else {\n\t\t\t\t\tblurLevel = 1;\n\t\t\t\t\tif (i < this.scrollToIndex) {\n\t\t\t\t\t\tblurLevel += Math.abs(this.scrollToIndex - i) / 2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tblurLevel += Math.abs(\n\t\t\t\t\t\t\ti - Math.max(this.scrollToIndex, latestIndex),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.invokedByScrollEvent) {\n\t\t\t\tblurLevel = 0;\n\t\t\t}\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\tblurLevel * 1.5,\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.isPageVisible) return;\n\t\tif (!this._getIsNonDynamic() && !this.supportMaskImage)\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\tif (isSeek) {\n\t\t\tfor (const line of this.lyricLinesEl) {\n\t\t\t\tline.setMaskAnimationState(time);\n\t\t\t}\n\t\t}\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 nextMainLine = this.processedLines[lastHotId + 2];\n\t\t\t\t\tconst startTime = Math.min(line.startTime, nextLine?.startTime);\n\t\t\t\t\tconst endTime = Math.min(\n\t\t\t\t\t\tMath.max(line.endTime, nextMainLine?.startTime ?? Number.MAX_VALUE),\n\t\t\t\t\t\tMath.max(line.endTime, nextLine?.endTime),\n\t\t\t\t\t);\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(time);\n\t\t\t\t\t\t\tthis.lyricLinesEl[lastHotId + 1].disable(time);\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(time);\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(time);\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(time);\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(time);\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(time);\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(time);\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(time);\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(time);\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(time);\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\tpause() {\n\t\tthis.interludeDots.pause();\n\t\tfor (const line of this.lyricLinesEl) {\n\t\t\tline.pause();\n\t\t}\n\t}\n\t/**\n\t * 恢复部分效果演出,目前会恢复播放间奏点的动画\n\t */\n\tresume() {\n\t\tthis.interludeDots.resume();\n\t\tfor (const line of this.lyricLinesEl) {\n\t\t\tline.resume();\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\tif (!this.isPageVisible) return;\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":["AbstractBaseRenderer","BaseRenderer","canvas","__publicField","width","height","scale","speed","loadImage","imageUrl","resolve","reject","img","loadVideo","videoUrl","video","playing","timeupdate","rejected","checkReady","err","loadResourceFromUrl","url","isVideo","loadResourceFromElement","element","TimedContainer","Container","PixiRenderer","delta","lastContainer","s1","s2","s3","s4","maxSize","Application","minBorder","maxBorder","c0","ColorMatrixFilter","c1","c2","_a","filter","BlurFilter","BulgePinchFilter","enable","fps","_volume","_hasLyric","albumSource","res","remainRetryTimes","tex","_b","Texture","error","container","Sprite","vertShader","fragShader","blendShader","eplorShader","noiseShader","noiseImage","NOISE_IMAGE_DATA","blurImage","imageData","radius","quality","pixels","rsum","gsum","bsum","asum","x","y","i","p","p1","p2","yp","yi","yw","wm","hm","rad1x","divx","rad1y","divy","div2","r","g","b","a","vmin","vmax","saturateImage","saturation","gray","contrastImage","contrast","GLProgram","gl","vertexShaderSource","fragmentShaderSource","label","coordPos","type","source","shader","program","errLog","name","value","location","value1","value2","Framebuffer","fb","texture","GLBuffer","data","usage","buffer","AlbumTexture","mainProgram","vertexBuffer","indexBuffer","albumImageData","albumTexture","sampler","NoiseTexture","_EplorRenderer","bounds","tickTime","frameDelta","realWidth","realHeight","t","fba","fbb","sprite","deleted","isOnlyOneSprite","isTweeningValues","src","dst","volume","c","ctx","blurRadius","imgw","imgh","hasLyric","s","EplorRenderer","BackgroundRender","renderer","eqSet","xs","ys","derivative","f","getVelocity","Spring","currentPosition","curV","solveSpring","targetPosition","params","delay","from","velocity","to","soft","stiffness","damping","mass","angular_frequency","leftover","damping_frequency","dfm","dm","BottomLineEl","lyricPlayer","style","left","top","force","l","pr","pb","easeInOutBack","clamp","min","cur","max","InterludeDots","interlude","curStyle","interludeDuration","currentDuration","breatheDuration","globalOpacity","dotsDuration","dot0Opacity","dot1Opacity","dot2Opacity","createMatrix4","scaleMatrix4","m","origin","ox","oy","matrix4ToCSS","fractionDigits","format","n","NEWTON_ITERATIONS","NEWTON_MIN_SLOPE","SUBDIVISION_PRECISION","SUBDIVISION_MAX_ITERATIONS","kSplineTableSize","kSampleStepSize","float32ArraySupported","A","aA1","aA2","B","C","calcBezier","aT","getSlope","binarySubdivide","aX","aA","aB","mX1","mX2","currentX","currentT","newtonRaphsonIterate","aGuessT","currentSlope","LinearEasing","mY1","mY2","sampleValues","getTForX","intervalStart","currentSample","lastSample","dist","guessForT","initialSlope","CJKEXP","ANIMATION_FRAME_QUANTITY","norNum","EMP_EASING_MID","beginNum","endNum","makeEmpEasing","mid","bezIn","bezier","bezOut","defaultEmpEasing","generateFadeGradient","padding","bright","dark","totalAspect","widthInTotal","leftPos","chunkAndSplitLyricWords","words","resplitedWords","w","realLength","splited","v","charPos","word","wordChunk","wChunk","result","shouldEmphasize","RawLyricLineMouseEvent","line","event","LyricLineEl","lyricLine","wrapped","listener","main","trans","roman","callback","options","listeners","maskAnimationTime","size","chunkedWords","chunk","merged","emp","wrapperWordEl","characterElements","mainWordEl","charEls","char","charEl","realWord","duration","wordEl","up","de","du","method","amount","blur","animateDu","empEasing","el","arr","wordDe","frames","_","transX","glowLevel","mat","ani","fadeWidth","maskImage","totalAspectStr","maskPos","totalDuration","widthBeforeSelf","minOffset","clampOffset","curPos","timeOffset","lastPos","lastTime","pushFrame","moveOffset","time","d","staticTime","frame","lastTimeStamp","otherWord","j","curTimeStamp","staticDuration","fadeDuration","opacity","roundedBlur","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","_c","hide","lines","pv","cv","lastLine","pastLine","nextLine","lastWord","lineEl","reflow","targetAlignIndex","SCALE_ASPECT","scrollOffset","acc","curLine","lineHeight","latestIndex","baseDelay","setDots","hasBuffered","isActive","targetOpacity","blurLevel","alignAnchor","alignPosition","isSeek","removedHotIds","removedIds","addedIds","lastHotId","nextMainLine","startTime","endTime","id","deltaS"],"mappings":"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","x_google_ignoreList":[17]}