@applemusic-like-lyrics/core 0.0.8 → 0.0.10

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.
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # AMLL Core
2
2
 
3
+ > 警告:此为个人项目,且尚未完成开发,可能仍有大量问题,所以请勿直接用于生产环境!
4
+
3
5
  AMLL 的纯 JS 核心组件框架,包括歌词显示组件和背景组件等其它可以复用的组件。
4
6
 
5
7
  此处的东西都是 UI 框架无关的,所以可以间接在各种动态页面框架下引用。
package/dist/amll-core.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("@pixi/display"),M=require("@pixi/app"),y=require("@pixi/filter-blur"),S=require("@pixi/filter-color-matrix"),C=require("@pixi/core"),L=require("@pixi/sprite"),z=require("jss"),A=require("jss-preset-default"),B=/^(((?<hour>[0-9]+):)?(?<min>[0-9]+):)?(?<sec>[0-9]+([\.:]([0-9]+))?)/;function T(d){const e=B.exec(d);if(e){const t=Number(e.groups?.hour||"0"),i=Number(e.groups?.min||"0"),n=Number(e.groups?.sec.replace(/:/,".")||"0");return Math.floor((t*3600+i*60+n)*1e3)}else throw new TypeError("时间戳字符串解析失败")}function D(d){const t=new DOMParser().parseFromString(d,"application/xml");let i="v1";for(const a of t.querySelectorAll("ttm\\:agent"))if(a.getAttribute("type")==="person"){const s=a.getAttribute("xml:id");s&&(i=s)}const n=[];for(const a of t.querySelectorAll("body p[begin][end]")){const s={words:[],startTime:T(a.getAttribute("begin")??"0:0"),endTime:T(a.getAttribute("end")??"0:0"),translatedLyric:"",romanLyric:"",isBG:!1,isDuet:a.getAttribute("ttm:agent")!==i};let r=null;for(const l of a.childNodes)if(l.nodeType===Node.TEXT_NODE){const h=l.textContent??"";/^(\s+)$/.test(h)?s.words.push({word:" ",startTime:0,endTime:0}):s.words.push({word:h,startTime:0,endTime:0})}else if(l.nodeType===Node.ELEMENT_NODE){const h=l,o=h.getAttribute("ttm:role");if(h.nodeName==="span"&&o)if(o==="x-bg"){const c={words:[],startTime:s.startTime,endTime:s.endTime,translatedLyric:"",romanLyric:"",isBG:!0,isDuet:s.isDuet};for(const u of h.childNodes)if(u.nodeType===Node.TEXT_NODE){const f=u.textContent??"";/^(\s+)$/.test(f)?c.words.push({word:" ",startTime:0,endTime:0}):c.words.push({word:f,startTime:0,endTime:0})}else if(u.nodeType===Node.ELEMENT_NODE){const f=u,b=f.getAttribute("ttm:role");if(f.nodeName==="span"&&b)b==="x-translation"?c.translatedLyric=f.innerHTML.trim():b==="x-roman"&&(c.romanLyric=f.innerHTML.trim());else if(f.hasAttribute("begin")&&f.hasAttribute("end")){const x={word:u.textContent,startTime:T(f.getAttribute("begin")),endTime:T(f.getAttribute("end"))};c.words.push(x)}}const m=c.words[0];c.startTime=m.startTime,m?.word.startsWith("(")&&(m.word=m.word.substring(1));const p=c.words[c.words.length-1];c.endTime=p.endTime,p?.word.endsWith(")")&&(p.word=p.word.substring(0,p.word.length-1)),r=c}else o==="x-translation"?s.translatedLyric=h.innerHTML:o==="x-roman"&&(s.romanLyric=h.innerHTML);else if(h.hasAttribute("begin")&&h.hasAttribute("end")){const c={word:l.textContent??"",startTime:T(h.getAttribute("begin")),endTime:T(h.getAttribute("end"))};s.words.push(c)}}n.push(s),r&&n.push(r)}return console.log(n),n}const I=Object.freeze(Object.defineProperty({__proto__:null,parseTTML:D},Symbol.toStringTag,{value:"Module"}));class k extends v.Container{time=0}class F{constructor(e){this.canvas=e;const t=e.getBoundingClientRect();this.canvas.width=t.width*this.currerntRenderScale,this.canvas.height=t.height*this.currerntRenderScale,this.observer=new ResizeObserver(()=>{const i=e.getBoundingClientRect();this.canvas.width=Math.max(1,i.width),this.canvas.height=Math.max(1,i.height),this.app.renderer.resize(this.canvas.width*this.currerntRenderScale,this.canvas.height*this.currerntRenderScale),this.rebuildFilters()}),this.observer.observe(e),this.app=new M.Application({view:e,resizeTo:this.canvas,powerPreference:"low-power",backgroundAlpha:0}),this.rebuildFilters(),this.app.ticker.add(this.onTick),this.app.ticker.start()}observer;app;curContainer;lastContainer=new Set;onTick=e=>{for(const t of this.lastContainer)t.alpha=Math.max(0,t.alpha-e/60),t.alpha<=0&&(this.app.stage.removeChild(t),this.lastContainer.delete(t));if(this.curContainer){this.curContainer.alpha=Math.min(1,this.curContainer.alpha+e/60);const[t,i,n,a]=this.curContainer.children,s=Math.max(this.app.screen.width,this.app.screen.height);t.position.set(this.app.screen.width/2,this.app.screen.height/2),i.position.set(this.app.screen.width/2.5,this.app.screen.height/2.5),n.position.set(this.app.screen.width/2,this.app.screen.height/2),a.position.set(this.app.screen.width/2,this.app.screen.height/2),t.width=s*Math.sqrt(2),t.height=t.width,i.width=s*.8,i.height=i.width,n.width=s*.5,n.height=n.width,a.width=s*.25,a.height=a.width,this.curContainer.time+=e*this.flowSpeed,t.rotation+=e/1e3*this.flowSpeed,i.rotation-=e/500*this.flowSpeed,n.rotation+=e/1e3*this.flowSpeed,a.rotation-=e/750*this.flowSpeed,n.x=this.app.screen.width/2+this.app.screen.width/4*Math.cos(this.curContainer.time/1e3*.75),n.y=this.app.screen.height/2+this.app.screen.width/4*Math.cos(this.curContainer.time/1e3*.75),a.x=this.app.screen.width/2+this.app.screen.width/4*.1+Math.cos(this.curContainer.time*.006*.75),a.y=this.app.screen.height/2+this.app.screen.width/4*.1+Math.cos(this.curContainer.time*.006*.75)}};flowSpeed=2;currerntRenderScale=.75;setFlowSpeed(e){this.flowSpeed=e}setRenderScale(e){this.currerntRenderScale=e;const t=this.canvas.getBoundingClientRect();this.canvas.width=Math.max(1,t.width),this.canvas.height=Math.max(1,t.height),this.app.renderer.resize(this.canvas.width*this.currerntRenderScale,this.canvas.height*this.currerntRenderScale),this.rebuildFilters()}rebuildFilters(){const e=Math.min(this.canvas.width,this.canvas.height),t=new S.ColorMatrixFilter;t.saturate(1.2,!1);const i=new S.ColorMatrixFilter;i.brightness(.6,!1);const n=new S.ColorMatrixFilter;n.contrast(.3,!0),this.app.stage.filters=[],this.app.stage.filters.push(new y.BlurFilter(5,1)),this.app.stage.filters.push(new y.BlurFilter(10,1)),this.app.stage.filters.push(new y.BlurFilter(20,2)),this.app.stage.filters.push(new y.BlurFilter(40,2)),e>512&&this.app.stage.filters.push(new y.BlurFilter(80,2)),e>768&&this.app.stage.filters.push(new y.BlurFilter(160,4)),e>768*2&&this.app.stage.filters.push(new y.BlurFilter(320,4)),this.app.stage.filters.push(t,i,n),this.app.stage.filters.push(new y.BlurFilter(5,1))}setFPS(e){this.app.ticker.maxFPS=e}pause(){this.app.ticker.stop(),this.app.render()}resume(){this.app.ticker.start()}async setAlbumImage(e){const t=await C.Texture.fromURL(e),i=new k,n=new L.Sprite(t),a=new L.Sprite(t),s=new L.Sprite(t),r=new L.Sprite(t);n.anchor.set(.5,.5),a.anchor.set(.5,.5),s.anchor.set(.5,.5),r.anchor.set(.5,.5),n.rotation=Math.random()*Math.PI*2,a.rotation=Math.random()*Math.PI*2,s.rotation=Math.random()*Math.PI*2,r.rotation=Math.random()*Math.PI*2,i.addChild(n,a,s,r),this.curContainer&&this.lastContainer.add(this.curContainer),this.curContainer=i,this.app.stage.addChild(this.curContainer),this.curContainer.alpha=0}dispose(){this.observer.disconnect(),this.app.ticker.remove(this.onTick)}}class q extends F{element;constructor(){const e=document.createElement("canvas");super(e),this.element=e,e.style.pointerEvents="none",e.style.zIndex="-1"}getElement(){return this.element}dispose(){super.dispose(),this.element.remove()}}const O=(d,e)=>d.size===e.size&&[...d].every(t=>e.has(t));function N(d){const t=2.5949095;return d<.5?Math.pow(2*d,2)*((t+1)*2*d-t)/2:(Math.pow(2*d-2,2)*((t+1)*(d*2-2)+t)+2)/2}const g=(d,e,t)=>Math.max(d,Math.min(e,t));class ${constructor(e){this.lyricPlayer=e,this.element.className=this.lyricPlayer.style.classes.interludeDots,this.element.appendChild(this.dot0),this.element.appendChild(this.dot1),this.element.appendChild(this.dot2)}element=document.createElement("div");dot0=document.createElement("span");dot1=document.createElement("span");dot2=document.createElement("span");left=0;top=0;scale=1;lastStyle="";currentInterlude;currentTime=0;targetBreatheDuration=1500;getElement(){return this.element}setTransform(e=this.left,t=this.top){this.left=e,this.top=t,this.update()}setInterlude(e){this.currentInterlude=e,this.currentTime=e?.[0]??0}update(e=0){this.currentTime+=e;let t="";if(t+=`transform:translate(${this.left}px, ${this.top}px)`,this.currentInterlude){const i=this.currentInterlude[1]-this.currentInterlude[0],n=this.currentTime-this.currentInterlude[0];if(n<=i){const a=i/Math.ceil(i/this.targetBreatheDuration);let s=1,r=1;s*=Math.sin(1.5*Math.PI-n/a*2)/10+1,n<1e3&&(s*=1-Math.pow((1e3-n)/1e3,2)),n<500?r=0:n<1e3&&(r*=(n-500)/500),i-n<750&&(s*=1-N((750-(i-n))/750/2)),i-n<375&&(r*=g(0,(i-n)/375,1)),s=Math.max(0,s),t+=` scale(${s})`;const l=g(.25,n*3/i*.75,1),h=g(.25,(n-i/3)*3/i*.75,1),o=g(.25,(n-i/3*2)*3/i*.75,1);this.dot0.style.opacity=`${g(0,Math.max(0,r*l),1)}`,this.dot1.style.opacity=`${g(0,Math.max(0,r*h),1)}`,this.dot2.style.opacity=`${g(0,Math.max(0,r*o),1)}`}else t+=" scale(0)",this.dot0.style.opacity="0",this.dot1.style.opacity="0",this.dot2.style.opacity="0"}else t+=" scale(0)",this.dot0.style.opacity="0",this.dot1.style.opacity="0",this.dot2.style.opacity="0";t+=";",this.lastStyle!==t&&(this.element.setAttribute("style",t),this.lastStyle=t)}dispose(){this.element.remove()}}class E{currentPosition=0;targetPosition=0;currentTime=0;params={};currentSolver;getV;queueParams;queuePosition;constructor(e=0){this.targetPosition=e,this.currentPosition=this.targetPosition,this.currentSolver=()=>this.targetPosition,this.getV=()=>0}resetSolver(){const e=this.getV(this.currentTime);this.currentTime=0,this.currentSolver=R(this.currentPosition,e,this.targetPosition,0,this.params),this.getV=_(this.currentSolver)}arrived(){return Math.abs(this.targetPosition-this.currentPosition)<.01&&this.getV(this.currentTime)<.01&&this.queueParams===void 0&&this.queuePosition===void 0}setPosition(e){this.targetPosition=e,this.currentPosition=e,this.currentSolver=()=>this.targetPosition,this.getV=()=>0}update(e=0){this.currentTime+=e,this.currentPosition=this.currentSolver(this.currentTime),this.queueParams&&(this.queueParams.time-=e,this.queueParams.time<=0&&this.updateParams({...this.queueParams})),this.queuePosition&&(this.queuePosition.time-=e,this.queuePosition.time<=0&&this.setTargetPosition(this.queuePosition.position)),this.arrived()&&this.setPosition(this.targetPosition)}updateParams(e,t=0){t>0?this.queueParams={...e,time:t}:(this.params={...this.params,...e},this.resetSolver())}setTargetPosition(e,t=0){t>0?this.queuePosition={position:e,time:t}:(this.queuePosition=void 0,this.targetPosition=e,this.resetSolver())}getCurrentPosition(){return this.currentPosition}}function R(d,e,t,i=0,n){const a=n?.soft??!1,s=n?.stiffness??100,r=n?.damping??10,l=n?.mass??1,h=t-d;if(a||1<=r/(2*Math.sqrt(s*l))){const o=-Math.sqrt(s/l),c=-o*h-e;return m=>(m-=i,m<0?d:t-(h+m*c)*Math.E**(m*o))}else{const o=Math.sqrt(4*l*s-r**2),c=(r*h-2*l*e)/o,m=.5*o/l,p=-(.5*r)/l;return u=>(u-=i,u<0?d:t-(Math.cos(u*m)*h+Math.sin(u*m)*c)*Math.E**(u*p))}}function W(d){return t=>(d(t+.001)-d(t-.001))/(2*.001)}function _(d){return W(d)}const w=/^[\p{Unified_Ideograph}\u0800-\u9FFC]+$/u;function G(d,e="rgba(0,0,0,1)",t="rgba(0,0,0,0.5)"){const i=2+d,n=d/i,a=(1-n)/2;return[`linear-gradient(to right,${e} ${a*100}%,${t} ${(a+n)*100}%)`,n,i]}function P(d){return d.endTime-d.startTime>=1e3&&d.word.length<=7}class X{constructor(e,t={words:[],translatedLyric:"",romanLyric:"",startTime:0,endTime:0,isBG:!1,isDuet:!1}){this.lyricPlayer=e,this.lyricLine=t,this.element.setAttribute("class",this.lyricPlayer.style.classes.lyricLine),this.lyricLine.isBG&&this.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine),this.lyricLine.isDuet&&this.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine),this.element.appendChild(document.createElement("div")),this.element.appendChild(document.createElement("div")),this.element.appendChild(document.createElement("div"));const i=this.element.children[0],n=this.element.children[1],a=this.element.children[2];i.setAttribute("class",this.lyricPlayer.style.classes.lyricMainLine),n.setAttribute("class",this.lyricPlayer.style.classes.lyricSubLine),a.setAttribute("class",this.lyricPlayer.style.classes.lyricSubLine),this.rebuildElement(),this.rebuildStyle()}element=document.createElement("div");left=0;top=0;scale=1;blur=0;delay=0;splittedWords=[];lineSize=[0,0];lineTransforms={posX:new E(0),posY:new E(0),scale:new E(1)};isEnabled=!1;enable(){this.isEnabled=!0,this.element.classList.add("active");const e=this.element.children[0];this.splittedWords.forEach(t=>{t.elementAnimations.forEach(i=>{i.currentTime=0,i.playbackRate=1,i.play()})}),e.classList.add("active")}measureSize(){this._hide&&(this.element.style.display="",this.element.style.visibility="hidden");const e=[this.element.clientWidth,this.element.clientHeight];return this._hide&&(this.element.style.display="none",this.element.style.visibility=""),e}disable(){this.isEnabled=!1,this.element.classList.remove("active");const e=this.element.children[0];this.splittedWords.forEach(t=>{t.elementAnimations.forEach(i=>{i.id==="float-word"&&(i.playbackRate=-1,i.play())})}),e.classList.remove("active")}setLine(e){this.lyricLine=e,this.lyricLine.isBG?this.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine):this.element.classList.remove(this.lyricPlayer.style.classes.lyricBgLine),this.lyricLine.isDuet?this.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine):this.element.classList.remove(this.lyricPlayer.style.classes.lyricDuetLine),this.rebuildElement(),this.rebuildStyle()}getLine(){return this.lyricLine}_hide=!0;lastStyle="";show(){this._hide=!1,this.rebuildStyle()}hide(){this._hide=!0,this.rebuildStyle()}rebuildStyle(){if(this._hide){this.lastStyle!=="display:none;transform:translate(0,-10000px);"&&(this.lastStyle="display:none;transform:translate(0,-10000px);",this.element.setAttribute("style","display:none;transform:translate(0,-10000px);"));return}let e=`transform:translate(${this.lineTransforms.posX.getCurrentPosition()}px,${this.lineTransforms.posY.getCurrentPosition()}px) scale(${this.lineTransforms.scale.getCurrentPosition()});`;!this.lyricPlayer.getEnableSpring()&&this.isInSight&&(e+=`transition-delay:${this.delay}ms;`),e+=`filter:blur(${Math.min(32,this.blur)}px);`,e!==this.lastStyle&&(this.lastStyle=e,this.element.setAttribute("style",e))}rebuildElement(){const e=this.element.children[0],t=this.element.children[1],i=this.element.children[2];this.splittedWords=[],this.lyricLine.words.forEach(l=>{const h=l.word.split(/\s+/),o=h.reduce((m,p)=>m+p.length,0);let c=0;h.forEach((m,p)=>{p>0&&this.splittedWords.push({word:" ",startTime:0,endTime:0,width:0,height:0,elements:[],elementAnimations:[],shouldEmphasize:!1}),this.splittedWords.push({word:m,startTime:l.startTime+(l.endTime-l.startTime)/o*c,endTime:l.startTime+(l.endTime-l.startTime)/o*(c+m.length),width:0,height:0,elements:[],elementAnimations:[],shouldEmphasize:P(l)}),c+=m.length})});const n=[],a=[];function s(l){for(;l.firstChild;)l.firstChild.nodeType===Node.ELEMENT_NODE?n.push(e.firstChild):l.firstChild.nodeType===Node.TEXT_NODE&&a.push(e.firstChild),l.removeChild(l.firstChild),s(l.firstChild)}s(e);let r=null;this.splittedWords.forEach(l=>{if(l.word.trim().length>0)if(l.shouldEmphasize){const h=n.pop()??document.createElement("span");h.className="emphasize",l.elements=[h];for(const o of l.word){const c=n.pop()??document.createElement("span");c.className="",c.innerText=o,h.appendChild(c),l.elements.push(c)}if(l.elementAnimations=this.initEmphasizeAnimation(l),console.log(l.word,w.test(l.word)),r&&!w.test(l.word))if(r.childElementCount>0)r.appendChild(h);else{const o=n.pop()??document.createElement("span");o.className="",r.remove(),o.appendChild(r),o.appendChild(h),e.appendChild(o),r=o}else r=w.test(l.word)?null:h,e.appendChild(h)}else{const h=n.pop()??document.createElement("span");if(h.className="",h.innerText=l.word,l.elements=[h],l.elementAnimations.push(this.initFloatAnimation(l,h)),r)if(r.childElementCount>0)r.appendChild(h);else{const o=n.pop()??document.createElement("span");o.className="",r.remove(),o.appendChild(r),o.appendChild(h),e.appendChild(o),r=o}else r=h,e.appendChild(h)}else if(l.word.length>0){const h=a.pop()??document.createTextNode(" ");e.appendChild(h),r=null}else r=null}),t.innerText=this.lyricLine.translatedLyric,i.innerText=this.lyricLine.romanLyric}initFloatAnimation(e,t){const i=e.startTime-this.lyricLine.startTime,n=Math.max(1e3,e.endTime-e.startTime),a=t.animate([{transform:"translateY(0px)"},{transform:"translateY(-3%)"}],{duration:isFinite(n)?n:0,delay:isFinite(i)?i:0,id:"float-word",composite:"add",fill:"both"});return a.pause(),a}initEmphasizeAnimation(e){const t=e.startTime-this.lyricLine.startTime,i=e.endTime-e.startTime;return e.elements.map((n,a,s)=>{if(a===0)return this.initFloatAnimation(e,n);{const r=n.animate([{offset:0,transform:"translate3d(0, 0px, 0px)",filter:"drop-shadow(0 0 0 var(--amll-lyric-line-color))"},{offset:.5,transform:"translate3d(0, -2%, 20px)",filter:"drop-shadow(0 0 0.2rem var(--amll-lyric-line-color))"},{offset:1,transform:"translate3d(0, 0px, 0)",filter:"drop-shadow(0 0 0 var(--amll-lyric-line-color))"}],{duration:Math.max(1e3,e.endTime-e.startTime),delay:t+i/(s.length-1)*(a-1),id:"glow-word",iterations:1,composite:"replace",fill:"both"});return r.pause(),r}})}updateMaskImage(){this._hide&&(this.element.style.display="",this.element.style.visibility="hidden"),this.splittedWords.forEach(e=>{const t=e.elements[0];if(t){e.width=t.clientWidth,e.height=t.clientHeight;const[i,n,a]=G(16/e.width,"rgba(0,0,0,0.75)","rgba(0,0,0,0.25)"),s=`${a*100}% 100%`;this.lyricPlayer.supportMaskImage?(t.style.maskImage=i,t.style.maskOrigin="left",t.style.maskSize=s):(t.style.webkitMaskImage=i,t.style.webkitMaskOrigin="left",t.style.webkitMaskSize=s);const r=e.width+16,l=`clamp(${-r}px,calc(${-r}px + (var(--amll-player-time) - ${e.startTime})*${r/Math.abs(e.endTime-e.startTime)}px),0px) 0px, left top`;t.style.maskPosition=l,t.style.webkitMaskPosition=l}}),this._hide&&(this.element.style.display="none",this.element.style.visibility="")}getElement(){return this.element}setTransform(e=this.left,t=this.top,i=this.scale,n=1,a=0,s=!1,r=0){this.left=e,this.top=t,this.scale=i,this.delay=r*1e3|0;const l=this.element.children[0];l.style.opacity=`${n}`,s||!this.lyricPlayer.getEnableSpring()?(this.blur=Math.min(32,a),s&&this.element.classList.add(this.lyricPlayer.style.classes.tmpDisableTransition),this.lineTransforms.posX.setPosition(e),this.lineTransforms.posY.setPosition(t),this.lineTransforms.scale.setPosition(i),this.lyricPlayer.getEnableSpring()?this.rebuildStyle():this.show(),s&&requestAnimationFrame(()=>{this.element.classList.remove(this.lyricPlayer.style.classes.tmpDisableTransition)})):(this.lineTransforms.posX.setTargetPosition(e,r),this.lineTransforms.posY.setTargetPosition(t,r),this.lineTransforms.scale.setTargetPosition(i),this.blur!==Math.min(32,a)&&(this.blur=Math.min(32,a),this.element.style.filter=`blur(${Math.min(32,a)}px)`))}update(e=0){this.lyricPlayer.getEnableSpring()&&(this.lineTransforms.posX.update(e),this.lineTransforms.posY.update(e),this.lineTransforms.scale.update(e),this.isInSight?this.show():this.hide())}get isInSight(){const e=this.lineTransforms.posX.getCurrentPosition(),t=this.lineTransforms.posY.getCurrentPosition(),i=e+this.lineSize[0],n=t+this.lineSize[1],a=this.lyricPlayer.pos[0],s=this.lyricPlayer.pos[1],r=this.lyricPlayer.pos[0]+this.lyricPlayer.size[0],l=this.lyricPlayer.pos[1]+this.lyricPlayer.size[1];return!(e>r||t>l||i<a||n<s)}dispose(){this.element.remove()}}const Y=z.create(A());class V extends EventTarget{element=document.createElement("div");currentTime=0;lyricLines=[];processedLines=[];lyricLinesEl=[];lyricLinesSize=new Map;hotLines=new Set;bufferedLines=new Set;scrollToIndex=0;resizeObserver=new ResizeObserver(e=>{const t=e[0].contentRect;this.size[0]=t.width,this.size[1]=t.height,this.pos[0]=t.left,this.pos[1]=t.top,this.rebuildStyle(),this.calcLayout(!0),this.lyricLinesEl.forEach(i=>i.updateMaskImage())});posXSpringParams={mass:1,damping:10,stiffness:100};posYSpringParams={mass:1,damping:15,stiffness:100};scaleSpringParams={mass:1,damping:20,stiffness:100};enableBlur=!0;interludeDots;interludeDotsSize=[0,0];supportPlusLighter=CSS.supports("mix-blend-mode","plus-lighter");supportMaskImage=CSS.supports("mask-image","none");disableSpring=!1;alignAnchor=.5;size=[0,0];pos=[0,0];setEnableSpring(e=!0){this.disableSpring=!e,e?this.element.classList.remove(this.style.classes.disableSpring):this.element.classList.add(this.style.classes.disableSpring),this.calcLayout(!0)}getEnableSpring(){return!this.disableSpring}style=Y.createStyleSheet({lyricPlayer:{userSelect:"none",padding:"1rem",boxSizing:"border-box",fontSize:"max(5vh, 12px)",fontWeight:"bold",width:"100%",height:"100%",overflow:"hidden",maxWidth:"100%",maxHeight:"100%",zIndex:1,color:"var(--amll-lyric-line-color)",mixBlendMode:"plus-lighter",contain:"strict"},lyricLine:{position:"absolute",transformOrigin:"left",maxWidth:"65%",padding:"max(2vh, 1rem) 1rem",contain:"content",transition:"filter 0.25s",margin:"max(2vh, 1rem) -1rem"},"@media (max-width: 1024px)":{lyricLine:{maxWidth:"75%",padding:"max(1vh, 1rem) 1rem",margin:"0 -1rem"}},lyricDuetLine:{textAlign:"right",transformOrigin:"right"},lyricBgLine:{opacity:0,fontSize:"max(50%, 10px)",transition:"opacity 0.25s","&.active":{transition:"opacity 0.25s 0.25s",opacity:1}},lyricMainLine:{transition:"opacity 0.3s 0.25s",margin:"-1rem",padding:"1rem","& span":{display:"inline-block",margin:"-1rem",padding:"1rem"},"& > span":{whiteSpace:"pre-wrap",wordBreak:"keep-all",maxLines:"1","&.emphasize":{margin:"-1rem",padding:"1rem",transformStyle:"preserve-3d",perspective:"50vw"}}},lyricSubLine:{fontSize:"max(50%, 10px)",opacity:.5},disableSpring:{"& > *":{transition:"filter 0.25s, transform 0.5s"}},interludeDots:{height:"min(1rem,2.5vh)",transformOrigin:"center",width:"fit-content",padding:"2.5% 0",position:"absolute",display:"flex",gap:"0.5rem","& > *":{width:"100%",display:"inline-block",borderRadius:"50%",aspectRatio:"1 / 1",backgroundColor:"var(--amll-lyric-line-color)",marginRight:"4px"},"&.duet":{right:"1rem",transformOrigin:"center"}},"@supports (mix-blend-mode: plus-lighter)":{lyricSubLine:{opacity:.3}},tmpDisableTransition:{transition:"none !important"}});onPageShow=()=>{this.calcLayout(!0)};constructor(){super(),this.interludeDots=new $(this),this.element.setAttribute("class",this.style.classes.lyricPlayer),this.disableSpring&&this.element.classList.add(this.style.classes.disableSpring),this.rebuildStyle(),this.resizeObserver.observe(this.element),this.element.appendChild(this.interludeDots.getElement()),this.style.attach(),this.interludeDots.setTransform(0,200),window.addEventListener("pageshow",this.onPageShow)}getCurrentInterlude(){if(this.bufferedLines.size>0)return;const e=this.currentTime+20,t=this.scrollToIndex;if(t===0){if(this.processedLines[0]?.startTime&&this.processedLines[0].startTime>e)return[0,this.processedLines[0].startTime,-2]}else if(this.processedLines[t]?.endTime&&this.processedLines[t+1]?.startTime&&this.processedLines[t+1].startTime>e&&this.processedLines[t].endTime<e)return[this.processedLines[t].endTime,this.processedLines[t+1].startTime,t]}rebuildStyle(){let e="";e+="--amll-lyric-player-width:",e+=this.element.clientWidth,e+="px;",e+="--amll-lyric-player-height:",e+=this.element.clientHeight,e+="px;",e+="--amll-lyric-line-color:",e+="#FFFFFF;",e+="--amll-player-time:",e+=this.currentTime,e+=";",this.element.setAttribute("style",e)}setEnableBlur(e){this.enableBlur!==e&&(this.enableBlur=e,this.calcLayout())}setLyricLines(e){this.lyricLines=e;const t=750;this.processedLines=e.filter(i=>i.words.reduce((n,a)=>n+a.word.trim().length,0)>0).map((i,n,a)=>{if(i.isBG)return{...i};{const s=a[n-1],r=a[n-2];if(s?.isBG&&r){if(r.endTime<i.startTime)return{...i,startTime:Math.max(r.endTime,i.startTime-t)||i.startTime}}else if(s?.endTime&&s.endTime<i.startTime)return{...i,startTime:Math.max(s?.endTime,i.startTime-t)||i.startTime};return{...i}}}),this.processedLines.forEach((i,n,a)=>{const s=a[n+1],r=i.words[i.words.length-1];r&&P(r)&&(s?s.startTime>i.endTime&&(i.endTime=Math.min(i.endTime+1500,s.startTime)):i.endTime=i.endTime+1500)}),this.processedLines.forEach((i,n,a)=>{if(i.isBG)return;const s=a[n+1];s?.isBG&&(s.startTime=Math.min(s.startTime,i.startTime))}),this.lyricLinesEl.forEach(i=>i.dispose()),this.lyricLinesEl=this.processedLines.map(i=>new X(this,i)),this.lyricLinesEl.forEach(i=>{this.element.appendChild(i.getElement()),i.updateMaskImage()}),this.setLinePosXSpringParams({}),this.setLinePosYSpringParams({}),this.setLineScaleSpringParams({}),this.setCurrentTime(0,!0),this.calcLayout(!0)}calcLayout(e=!1){e&&(this.lyricLinesEl.forEach(o=>{const c=o.measureSize();this.lyricLinesSize.set(o,c),o.lineSize=c}),this.interludeDotsSize[0]=this.interludeDots.getElement().clientWidth,this.interludeDotsSize[1]=this.interludeDots.getElement().clientHeight);const t=.95;let n=-this.lyricLinesEl.slice(0,this.scrollToIndex).reduce((o,c)=>o+(c.getLine().isBG?0:this.lyricLinesSize.get(c)?.[1]??0),0);if(this.alignAnchor==="bottom"){n+=this.element.clientHeight/2;const o=this.lyricLinesEl[this.scrollToIndex];if(o){const c=this.lyricLinesSize.get(o)?.[1]??0;n-=c/2}}else if(typeof this.alignAnchor=="number"){n+=this.element.clientHeight*this.alignAnchor;const o=this.lyricLinesEl[this.scrollToIndex];if(o){const c=this.lyricLinesSize.get(o)?.[1]??0;n-=c/2}}const a=this.getCurrentInterlude();let s=0;if(a&&(s=a[1]-a[0],s>=5e3)){const o=this.lyricLinesEl[a[2]+1];o&&(n-=this.lyricLinesSize.get(o)?.[1]??0)}const r=Math.max(...this.bufferedLines);let l=0,h=!1;this.lyricLinesEl.forEach((o,c)=>{const m=this.bufferedLines.has(c),p=m||c>=this.scrollToIndex&&c<r,u=o.getLine();let f=0;u.isDuet&&(f=this.size[0]-(this.lyricLinesSize.get(o)?.[0]??0)),!h&&s>=5e3&&(c===this.scrollToIndex&&a?.[2]===-2||c===this.scrollToIndex+1)&&(h=!0,this.interludeDots.setTransform(0,n),a&&this.interludeDots.setInterlude([a[0],a[1]]),n+=this.interludeDotsSize[1]),o.setTransform(f,n,p?1:t,m?1:1/3,this.enableBlur?3*(p?0:1+(c<this.scrollToIndex?Math.abs(this.scrollToIndex-c):Math.abs(c-Math.max(this.scrollToIndex,r)))):0,e,l),u.isBG&&p?n+=this.lyricLinesSize.get(o)?.[1]??0:u.isBG||(n+=this.lyricLinesSize.get(o)?.[1]??0),n>=0&&(l+=.05)})}getCurrentTime(){return this.currentTime}getLyricLines(){return this.lyricLines}getElement(){return this.element}setAlignAnchor(e){this.alignAnchor=e}setCurrentTime(e,t=!1){this.currentTime=e,this.element.style.setProperty("--amll-player-time",`${e}`);const i=new Set,n=new Set,a=new Set;this.hotLines.forEach(s=>{const r=this.processedLines[s];if(!r.isBG)if(r){const l=this.processedLines[s+1];if(l?.isBG){const h=Math.min(r.startTime,l?.startTime),o=Math.max(r.endTime,l?.endTime);(h>e||o<=e)&&(this.hotLines.delete(s),i.add(s),this.hotLines.delete(s+1),i.add(s+1),t&&(this.lyricLinesEl[s].disable(),this.lyricLinesEl[s+1].disable()))}else(r.startTime>e||r.endTime<=e)&&(this.hotLines.delete(s),i.add(s),t&&this.lyricLinesEl[s].disable())}else this.hotLines.delete(s),i.add(s),t&&this.lyricLinesEl[s].disable()}),this.processedLines.forEach((s,r,l)=>{!s.isBG&&s.startTime<=e&&s.endTime>e&&(this.hotLines.has(r)||(this.hotLines.add(r),a.add(r),t&&this.lyricLinesEl[r].enable(),l[r+1]?.isBG&&(this.hotLines.add(r+1),a.add(r+1),t&&this.lyricLinesEl[r+1].enable())))}),this.bufferedLines.forEach(s=>{this.hotLines.has(s)||(n.add(s),t&&this.lyricLinesEl[s].disable())}),t?(this.bufferedLines.size>0?this.scrollToIndex=Math.min(...this.bufferedLines):this.scrollToIndex=this.processedLines.findIndex(s=>s.startTime>=e),this.bufferedLines.clear(),this.hotLines.forEach(s=>this.bufferedLines.add(s)),this.calcLayout(!0)):(n.size>0||a.size>0)&&(n.size===0&&a.size>0?(a.forEach(s=>{this.bufferedLines.add(s),this.lyricLinesEl[s].enable()}),this.scrollToIndex=Math.min(...this.bufferedLines)):a.size===0&&n.size>0?O(n,this.bufferedLines)&&this.bufferedLines.forEach(s=>{this.hotLines.has(s)||(this.bufferedLines.delete(s),this.lyricLinesEl[s].disable())}):(a.forEach(s=>{this.bufferedLines.add(s),this.lyricLinesEl[s].enable()}),n.forEach(s=>{this.bufferedLines.delete(s),this.lyricLinesEl[s].disable()}),this.bufferedLines.size>0&&(this.scrollToIndex=Math.min(...this.bufferedLines))),this.calcLayout())}update(e=0){const t=e/1e3;this.interludeDots.update(e),this.lyricLinesEl.forEach(i=>i.update(t))}setLinePosXSpringParams(e){this.posXSpringParams={...this.posXSpringParams,...e},this.lyricLinesEl.forEach(t=>t.lineTransforms.posX.updateParams(this.posXSpringParams))}setLinePosYSpringParams(e){this.posYSpringParams={...this.posYSpringParams,...e},this.lyricLinesEl.forEach(t=>t.lineTransforms.posY.updateParams(this.posYSpringParams))}setLineScaleSpringParams(e){this.scaleSpringParams={...this.scaleSpringParams,...e},this.lyricLinesEl.forEach(t=>t.lineTransforms.scale.updateParams(this.scaleSpringParams))}dispose(){this.element.remove(),this.resizeObserver.disconnect(),this.style.detach(),this.lyricLinesEl.forEach(e=>e.dispose()),window.removeEventListener("pageshow",this.onPageShow)}}exports.BackgroundRender=q;exports.LyricPlayer=V;exports.ttml=I;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("@pixi/display"),M=require("@pixi/app"),y=require("@pixi/filter-blur"),S=require("@pixi/filter-color-matrix"),C=require("@pixi/core"),L=require("@pixi/sprite"),z=require("jss"),A=require("jss-preset-default"),B=/^(((?<hour>[0-9]+):)?(?<min>[0-9]+):)?(?<sec>[0-9]+([\.:]([0-9]+))?)/;function T(d){const e=B.exec(d);if(e){const t=Number(e.groups?.hour||"0"),i=Number(e.groups?.min||"0"),n=Number(e.groups?.sec.replace(/:/,".")||"0");return Math.floor((t*3600+i*60+n)*1e3)}else throw new TypeError("时间戳字符串解析失败")}function D(d){const t=new DOMParser().parseFromString(d,"application/xml");let i="v1";for(const a of t.querySelectorAll("ttm\\:agent"))if(a.getAttribute("type")==="person"){const s=a.getAttribute("xml:id");s&&(i=s)}const n=[];for(const a of t.querySelectorAll("body p[begin][end]")){const s={words:[],startTime:T(a.getAttribute("begin")??"0:0"),endTime:T(a.getAttribute("end")??"0:0"),translatedLyric:"",romanLyric:"",isBG:!1,isDuet:a.getAttribute("ttm:agent")!==i};let r=null;for(const l of a.childNodes)if(l.nodeType===Node.TEXT_NODE){const h=l.textContent??"";/^(\s+)$/.test(h)?s.words.push({word:" ",startTime:0,endTime:0}):s.words.push({word:h,startTime:0,endTime:0})}else if(l.nodeType===Node.ELEMENT_NODE){const h=l,o=h.getAttribute("ttm:role");if(h.nodeName==="span"&&o)if(o==="x-bg"){const c={words:[],startTime:s.startTime,endTime:s.endTime,translatedLyric:"",romanLyric:"",isBG:!0,isDuet:s.isDuet};for(const u of h.childNodes)if(u.nodeType===Node.TEXT_NODE){const f=u.textContent??"";/^(\s+)$/.test(f)?c.words.push({word:" ",startTime:0,endTime:0}):c.words.push({word:f,startTime:0,endTime:0})}else if(u.nodeType===Node.ELEMENT_NODE){const f=u,b=f.getAttribute("ttm:role");if(f.nodeName==="span"&&b)b==="x-translation"?c.translatedLyric=f.innerHTML.trim():b==="x-roman"&&(c.romanLyric=f.innerHTML.trim());else if(f.hasAttribute("begin")&&f.hasAttribute("end")){const x={word:u.textContent,startTime:T(f.getAttribute("begin")),endTime:T(f.getAttribute("end"))};c.words.push(x)}}const m=c.words[0];c.startTime=m.startTime,m?.word.startsWith("(")&&(m.word=m.word.substring(1));const p=c.words[c.words.length-1];c.endTime=p.endTime,p?.word.endsWith(")")&&(p.word=p.word.substring(0,p.word.length-1)),r=c}else o==="x-translation"?s.translatedLyric=h.innerHTML:o==="x-roman"&&(s.romanLyric=h.innerHTML);else if(h.hasAttribute("begin")&&h.hasAttribute("end")){const c={word:l.textContent??"",startTime:T(h.getAttribute("begin")),endTime:T(h.getAttribute("end"))};s.words.push(c)}}n.push(s),r&&n.push(r)}return console.log(n),n}const I=Object.freeze(Object.defineProperty({__proto__:null,parseTTML:D},Symbol.toStringTag,{value:"Module"}));class k extends v.Container{time=0}class F{constructor(e){this.canvas=e;const t=e.getBoundingClientRect();this.canvas.width=t.width*this.currerntRenderScale,this.canvas.height=t.height*this.currerntRenderScale,this.observer=new ResizeObserver(()=>{const i=e.getBoundingClientRect();this.canvas.width=Math.max(1,i.width),this.canvas.height=Math.max(1,i.height),this.app.renderer.resize(this.canvas.width*this.currerntRenderScale,this.canvas.height*this.currerntRenderScale),this.rebuildFilters()}),this.observer.observe(e),this.app=new M.Application({view:e,resizeTo:this.canvas,powerPreference:"low-power",backgroundAlpha:0}),this.rebuildFilters(),this.app.ticker.add(this.onTick),this.app.ticker.start()}observer;app;curContainer;lastContainer=new Set;onTick=e=>{for(const t of this.lastContainer)t.alpha=Math.max(0,t.alpha-e/60),t.alpha<=0&&(this.app.stage.removeChild(t),this.lastContainer.delete(t));if(this.curContainer){this.curContainer.alpha=Math.min(1,this.curContainer.alpha+e/60);const[t,i,n,a]=this.curContainer.children,s=Math.max(this.app.screen.width,this.app.screen.height);t.position.set(this.app.screen.width/2,this.app.screen.height/2),i.position.set(this.app.screen.width/2.5,this.app.screen.height/2.5),n.position.set(this.app.screen.width/2,this.app.screen.height/2),a.position.set(this.app.screen.width/2,this.app.screen.height/2),t.width=s*Math.sqrt(2),t.height=t.width,i.width=s*.8,i.height=i.width,n.width=s*.5,n.height=n.width,a.width=s*.25,a.height=a.width,this.curContainer.time+=e*this.flowSpeed,t.rotation+=e/1e3*this.flowSpeed,i.rotation-=e/500*this.flowSpeed,n.rotation+=e/1e3*this.flowSpeed,a.rotation-=e/750*this.flowSpeed,n.x=this.app.screen.width/2+this.app.screen.width/4*Math.cos(this.curContainer.time/1e3*.75),n.y=this.app.screen.height/2+this.app.screen.width/4*Math.cos(this.curContainer.time/1e3*.75),a.x=this.app.screen.width/2+this.app.screen.width/4*.1+Math.cos(this.curContainer.time*.006*.75),a.y=this.app.screen.height/2+this.app.screen.width/4*.1+Math.cos(this.curContainer.time*.006*.75)}};flowSpeed=2;currerntRenderScale=.75;setFlowSpeed(e){this.flowSpeed=e}setRenderScale(e){this.currerntRenderScale=e;const t=this.canvas.getBoundingClientRect();this.canvas.width=Math.max(1,t.width),this.canvas.height=Math.max(1,t.height),this.app.renderer.resize(this.canvas.width*this.currerntRenderScale,this.canvas.height*this.currerntRenderScale),this.rebuildFilters()}rebuildFilters(){const e=Math.min(this.canvas.width,this.canvas.height),t=new S.ColorMatrixFilter;t.saturate(1.2,!1);const i=new S.ColorMatrixFilter;i.brightness(.6,!1);const n=new S.ColorMatrixFilter;n.contrast(.3,!0),this.app.stage.filters=[],this.app.stage.filters.push(new y.BlurFilter(5,1)),this.app.stage.filters.push(new y.BlurFilter(10,1)),this.app.stage.filters.push(new y.BlurFilter(20,2)),this.app.stage.filters.push(new y.BlurFilter(40,2)),e>512&&this.app.stage.filters.push(new y.BlurFilter(80,2)),e>768&&this.app.stage.filters.push(new y.BlurFilter(160,4)),e>768*2&&this.app.stage.filters.push(new y.BlurFilter(320,4)),this.app.stage.filters.push(t,i,n),this.app.stage.filters.push(new y.BlurFilter(5,1))}setFPS(e){this.app.ticker.maxFPS=e}pause(){this.app.ticker.stop(),this.app.render()}resume(){this.app.ticker.start()}async setAlbumImage(e){const t=await C.Texture.fromURL(e),i=new k,n=new L.Sprite(t),a=new L.Sprite(t),s=new L.Sprite(t),r=new L.Sprite(t);n.anchor.set(.5,.5),a.anchor.set(.5,.5),s.anchor.set(.5,.5),r.anchor.set(.5,.5),n.rotation=Math.random()*Math.PI*2,a.rotation=Math.random()*Math.PI*2,s.rotation=Math.random()*Math.PI*2,r.rotation=Math.random()*Math.PI*2,i.addChild(n,a,s,r),this.curContainer&&this.lastContainer.add(this.curContainer),this.curContainer=i,this.app.stage.addChild(this.curContainer),this.curContainer.alpha=0}dispose(){this.observer.disconnect(),this.app.ticker.remove(this.onTick)}}class q extends F{element;constructor(){const e=document.createElement("canvas");super(e),this.element=e,e.style.pointerEvents="none",e.style.zIndex="-1"}getElement(){return this.element}dispose(){super.dispose(),this.element.remove()}}const O=(d,e)=>d.size===e.size&&[...d].every(t=>e.has(t));function N(d){const t=2.5949095;return d<.5?Math.pow(2*d,2)*((t+1)*2*d-t)/2:(Math.pow(2*d-2,2)*((t+1)*(d*2-2)+t)+2)/2}const g=(d,e,t)=>Math.max(d,Math.min(e,t));class ${constructor(e){this.lyricPlayer=e,this.element.className=this.lyricPlayer.style.classes.interludeDots,this.element.appendChild(this.dot0),this.element.appendChild(this.dot1),this.element.appendChild(this.dot2)}element=document.createElement("div");dot0=document.createElement("span");dot1=document.createElement("span");dot2=document.createElement("span");left=0;top=0;scale=1;lastStyle="";currentInterlude;currentTime=0;targetBreatheDuration=1500;getElement(){return this.element}setTransform(e=this.left,t=this.top){this.left=e,this.top=t,this.update()}setInterlude(e){this.currentInterlude=e,this.currentTime=e?.[0]??0}update(e=0){this.currentTime+=e;let t="";if(t+=`transform:translate(${this.left}px, ${this.top}px)`,this.currentInterlude){const i=this.currentInterlude[1]-this.currentInterlude[0],n=this.currentTime-this.currentInterlude[0];if(n<=i){const a=i/Math.ceil(i/this.targetBreatheDuration);let s=1,r=1;s*=Math.sin(1.5*Math.PI-n/a*2)/10+1,n<1e3&&(s*=1-Math.pow((1e3-n)/1e3,2)),n<500?r=0:n<1e3&&(r*=(n-500)/500),i-n<750&&(s*=1-N((750-(i-n))/750/2)),i-n<375&&(r*=g(0,(i-n)/375,1)),s=Math.max(0,s),t+=` scale(${s})`;const l=g(.25,n*3/i*.75,1),h=g(.25,(n-i/3)*3/i*.75,1),o=g(.25,(n-i/3*2)*3/i*.75,1);this.dot0.style.opacity=`${g(0,Math.max(0,r*l),1)}`,this.dot1.style.opacity=`${g(0,Math.max(0,r*h),1)}`,this.dot2.style.opacity=`${g(0,Math.max(0,r*o),1)}`}else t+=" scale(0)",this.dot0.style.opacity="0",this.dot1.style.opacity="0",this.dot2.style.opacity="0"}else t+=" scale(0)",this.dot0.style.opacity="0",this.dot1.style.opacity="0",this.dot2.style.opacity="0";t+=";",this.lastStyle!==t&&(this.element.setAttribute("style",t),this.lastStyle=t)}dispose(){this.element.remove()}}class E{currentPosition=0;targetPosition=0;currentTime=0;params={};currentSolver;getV;queueParams;queuePosition;constructor(e=0){this.targetPosition=e,this.currentPosition=this.targetPosition,this.currentSolver=()=>this.targetPosition,this.getV=()=>0}resetSolver(){const e=this.getV(this.currentTime);this.currentTime=0,this.currentSolver=R(this.currentPosition,e,this.targetPosition,0,this.params),this.getV=_(this.currentSolver)}arrived(){return Math.abs(this.targetPosition-this.currentPosition)<.01&&this.getV(this.currentTime)<.01&&this.queueParams===void 0&&this.queuePosition===void 0}setPosition(e){this.targetPosition=e,this.currentPosition=e,this.currentSolver=()=>this.targetPosition,this.getV=()=>0}update(e=0){this.currentTime+=e,this.currentPosition=this.currentSolver(this.currentTime),this.queueParams&&(this.queueParams.time-=e,this.queueParams.time<=0&&this.updateParams({...this.queueParams})),this.queuePosition&&(this.queuePosition.time-=e,this.queuePosition.time<=0&&this.setTargetPosition(this.queuePosition.position)),this.arrived()&&this.setPosition(this.targetPosition)}updateParams(e,t=0){t>0?this.queueParams={...e,time:t}:(this.params={...this.params,...e},this.resetSolver())}setTargetPosition(e,t=0){t>0?this.queuePosition={position:e,time:t}:(this.queuePosition=void 0,this.targetPosition=e,this.resetSolver())}getCurrentPosition(){return this.currentPosition}}function R(d,e,t,i=0,n){const a=n?.soft??!1,s=n?.stiffness??100,r=n?.damping??10,l=n?.mass??1,h=t-d;if(a||1<=r/(2*Math.sqrt(s*l))){const o=-Math.sqrt(s/l),c=-o*h-e;return m=>(m-=i,m<0?d:t-(h+m*c)*Math.E**(m*o))}else{const o=Math.sqrt(4*l*s-r**2),c=(r*h-2*l*e)/o,m=.5*o/l,p=-(.5*r)/l;return u=>(u-=i,u<0?d:t-(Math.cos(u*m)*h+Math.sin(u*m)*c)*Math.E**(u*p))}}function W(d){return t=>(d(t+.001)-d(t-.001))/(2*.001)}function _(d){return W(d)}const w=/^[\p{Unified_Ideograph}\u0800-\u9FFC]+$/u;function G(d,e="rgba(0,0,0,1)",t="rgba(0,0,0,0.5)"){const i=2+d,n=d/i,a=(1-n)/2;return[`linear-gradient(to right,${e} ${a*100}%,${t} ${(a+n)*100}%)`,n,i]}function P(d){return d.endTime-d.startTime>=1e3&&d.word.length<=7}class X{constructor(e,t={words:[],translatedLyric:"",romanLyric:"",startTime:0,endTime:0,isBG:!1,isDuet:!1}){this.lyricPlayer=e,this.lyricLine=t,this.element.setAttribute("class",this.lyricPlayer.style.classes.lyricLine),this.lyricLine.isBG&&this.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine),this.lyricLine.isDuet&&this.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine),this.element.appendChild(document.createElement("div")),this.element.appendChild(document.createElement("div")),this.element.appendChild(document.createElement("div"));const i=this.element.children[0],n=this.element.children[1],a=this.element.children[2];i.setAttribute("class",this.lyricPlayer.style.classes.lyricMainLine),n.setAttribute("class",this.lyricPlayer.style.classes.lyricSubLine),a.setAttribute("class",this.lyricPlayer.style.classes.lyricSubLine),this.rebuildElement(),this.rebuildStyle()}element=document.createElement("div");left=0;top=0;scale=1;blur=0;delay=0;splittedWords=[];lineSize=[0,0];lineTransforms={posX:new E(0),posY:new E(0),scale:new E(1)};isEnabled=!1;enable(){this.isEnabled=!0,this.element.classList.add("active");const e=this.element.children[0];this.splittedWords.forEach(t=>{t.elementAnimations.forEach(i=>{i.currentTime=0,i.playbackRate=1,i.play()})}),e.classList.add("active")}measureSize(){this._hide&&(this.element.style.display="",this.element.style.visibility="hidden");const e=[this.element.clientWidth,this.element.clientHeight];return this._hide&&(this.element.style.display="none",this.element.style.visibility=""),e}disable(){this.isEnabled=!1,this.element.classList.remove("active");const e=this.element.children[0];this.splittedWords.forEach(t=>{t.elementAnimations.forEach(i=>{i.id==="float-word"&&(i.playbackRate=-1,i.play())})}),e.classList.remove("active")}setLine(e){this.lyricLine=e,this.lyricLine.isBG?this.element.classList.add(this.lyricPlayer.style.classes.lyricBgLine):this.element.classList.remove(this.lyricPlayer.style.classes.lyricBgLine),this.lyricLine.isDuet?this.element.classList.add(this.lyricPlayer.style.classes.lyricDuetLine):this.element.classList.remove(this.lyricPlayer.style.classes.lyricDuetLine),this.rebuildElement(),this.rebuildStyle()}getLine(){return this.lyricLine}_hide=!0;lastStyle="";show(){this._hide=!1,this.rebuildStyle()}hide(){this._hide=!0,this.rebuildStyle()}rebuildStyle(){if(this._hide){this.lastStyle!=="display:none;transform:translate(0,-10000px);"&&(this.lastStyle="display:none;transform:translate(0,-10000px);",this.element.setAttribute("style","display:none;transform:translate(0,-10000px);"));return}let e=`transform:translate(${this.lineTransforms.posX.getCurrentPosition()}px,${this.lineTransforms.posY.getCurrentPosition()}px) scale(${this.lineTransforms.scale.getCurrentPosition()});`;!this.lyricPlayer.getEnableSpring()&&this.isInSight&&(e+=`transition-delay:${this.delay}ms;`),e+=`filter:blur(${Math.min(32,this.blur)}px);`,e!==this.lastStyle&&(this.lastStyle=e,this.element.setAttribute("style",e))}rebuildElement(){const e=this.element.children[0],t=this.element.children[1],i=this.element.children[2];this.splittedWords=[],this.lyricLine.words.forEach(l=>{const h=l.word.split(/\s+/),o=h.reduce((m,p)=>m+p.length,0);let c=0;h.forEach((m,p)=>{p>0&&this.splittedWords.push({word:" ",startTime:0,endTime:0,width:0,height:0,elements:[],elementAnimations:[],shouldEmphasize:!1}),this.splittedWords.push({word:m,startTime:l.startTime+(l.endTime-l.startTime)/o*c,endTime:l.startTime+(l.endTime-l.startTime)/o*(c+m.length),width:0,height:0,elements:[],elementAnimations:[],shouldEmphasize:P(l)}),c+=m.length})});const n=[],a=[];function s(l){for(;l.firstChild;)l.firstChild.nodeType===Node.ELEMENT_NODE?n.push(e.firstChild):l.firstChild.nodeType===Node.TEXT_NODE&&a.push(e.firstChild),l.removeChild(l.firstChild),s(l.firstChild)}s(e);let r=null;this.splittedWords.forEach(l=>{if(l.word.trim().length>0)if(l.shouldEmphasize){const h=n.pop()??document.createElement("span");h.className="emphasize",l.elements=[h];for(const o of l.word){const c=n.pop()??document.createElement("span");c.className="",c.innerText=o,h.appendChild(c),l.elements.push(c)}if(l.elementAnimations=this.initEmphasizeAnimation(l),console.log(l.word,w.test(l.word)),r&&!w.test(l.word))if(r.childElementCount>0)r.appendChild(h);else{const o=n.pop()??document.createElement("span");o.className="",r.remove(),o.appendChild(r),o.appendChild(h),e.appendChild(o),r=o}else r=w.test(l.word)?null:h,e.appendChild(h)}else{const h=n.pop()??document.createElement("span");if(h.className="",h.innerText=l.word,l.elements=[h],l.elementAnimations.push(this.initFloatAnimation(l,h)),r)if(r.childElementCount>0)r.appendChild(h);else{const o=n.pop()??document.createElement("span");o.className="",r.remove(),o.appendChild(r),o.appendChild(h),e.appendChild(o),r=o}else r=h,e.appendChild(h)}else if(l.word.length>0){const h=a.pop()??document.createTextNode(" ");e.appendChild(h),r=null}else r=null}),t.innerText=this.lyricLine.translatedLyric,i.innerText=this.lyricLine.romanLyric}initFloatAnimation(e,t){const i=e.startTime-this.lyricLine.startTime,n=Math.max(1e3,e.endTime-e.startTime),a=t.animate([{transform:"translateY(0px)"},{transform:"translateY(-3%)"}],{duration:isFinite(n)?n:0,delay:isFinite(i)?i:0,id:"float-word",composite:"add",fill:"both"});return a.pause(),a}initEmphasizeAnimation(e){const t=e.startTime-this.lyricLine.startTime,i=e.endTime-e.startTime;return e.elements.map((n,a,s)=>{if(a===0)return this.initFloatAnimation(e,n);{const r=n.animate([{offset:0,transform:"translate3d(0, 0px, 0px)",filter:"drop-shadow(0 0 0 var(--amll-lyric-line-color))"},{offset:.5,transform:"translate3d(0, -2%, 20px)",filter:"drop-shadow(0 0 0.2rem var(--amll-lyric-line-color))"},{offset:1,transform:"translate3d(0, 0px, 0)",filter:"drop-shadow(0 0 0 var(--amll-lyric-line-color))"}],{duration:Math.max(1e3,e.endTime-e.startTime),delay:t+i/(s.length-1)*(a-1),id:"glow-word",iterations:1,composite:"replace",fill:"both"});return r.pause(),r}})}updateMaskImage(){this._hide&&(this.element.style.display="",this.element.style.visibility="hidden"),this.splittedWords.forEach(e=>{const t=e.elements[0];if(t){e.width=t.clientWidth,e.height=t.clientHeight;const[i,n,a]=G(16/e.width,"rgba(0,0,0,0.75)","rgba(0,0,0,0.25)"),s=`${a*100}% 100%`;this.lyricPlayer.supportMaskImage?(t.style.maskImage=i,t.style.maskOrigin="left",t.style.maskSize=s):(t.style.webkitMaskImage=i,t.style.webkitMaskOrigin="left",t.style.webkitMaskSize=s);const r=e.width+16,l=`clamp(${-r}px,calc(${-r}px + (var(--amll-player-time) - ${e.startTime})*${r/Math.abs(e.endTime-e.startTime)}px),0px) 0px, left top`;t.style.maskPosition=l,t.style.webkitMaskPosition=l}}),this._hide&&(this.element.style.display="none",this.element.style.visibility="")}getElement(){return this.element}setTransform(e=this.left,t=this.top,i=this.scale,n=1,a=0,s=!1,r=0){this.left=e,this.top=t,this.scale=i,this.delay=r*1e3|0;const l=this.element.children[0];l.style.opacity=`${n}`,s||!this.lyricPlayer.getEnableSpring()?(this.blur=Math.min(32,a),s&&this.element.classList.add(this.lyricPlayer.style.classes.tmpDisableTransition),this.lineTransforms.posX.setPosition(e),this.lineTransforms.posY.setPosition(t),this.lineTransforms.scale.setPosition(i),this.lyricPlayer.getEnableSpring()?this.rebuildStyle():this.show(),s&&requestAnimationFrame(()=>{this.element.classList.remove(this.lyricPlayer.style.classes.tmpDisableTransition)})):(this.lineTransforms.posX.setTargetPosition(e,r),this.lineTransforms.posY.setTargetPosition(t,r),this.lineTransforms.scale.setTargetPosition(i),this.blur!==Math.min(32,a)&&(this.blur=Math.min(32,a),this.element.style.filter=`blur(${Math.min(32,a)}px)`))}update(e=0){this.lyricPlayer.getEnableSpring()&&(this.lineTransforms.posX.update(e),this.lineTransforms.posY.update(e),this.lineTransforms.scale.update(e),this.isInSight?this.show():this.hide())}get isInSight(){const e=this.lineTransforms.posX.getCurrentPosition(),t=this.lineTransforms.posY.getCurrentPosition(),i=e+this.lineSize[0],n=t+this.lineSize[1],a=this.lyricPlayer.pos[0],s=this.lyricPlayer.pos[1],r=this.lyricPlayer.pos[0]+this.lyricPlayer.size[0],l=this.lyricPlayer.pos[1]+this.lyricPlayer.size[1];return!(e>r||t>l||i<a||n<s)}dispose(){this.element.remove()}}const Y=z.create(A());class V extends EventTarget{element=document.createElement("div");currentTime=0;lyricLines=[];processedLines=[];lyricLinesEl=[];lyricLinesSize=new Map;hotLines=new Set;bufferedLines=new Set;scrollToIndex=0;resizeObserver=new ResizeObserver(e=>{const t=e[0].contentRect;this.size[0]=t.width,this.size[1]=t.height,this.pos[0]=t.left,this.pos[1]=t.top,this.rebuildStyle(),this.calcLayout(!0),this.lyricLinesEl.forEach(i=>i.updateMaskImage())});posXSpringParams={mass:1,damping:10,stiffness:100};posYSpringParams={mass:1,damping:15,stiffness:100};scaleSpringParams={mass:1,damping:20,stiffness:100};enableBlur=!0;interludeDots;interludeDotsSize=[0,0];supportPlusLighter=CSS.supports("mix-blend-mode","plus-lighter");supportMaskImage=CSS.supports("mask-image","none");disableSpring=!1;alignAnchor=.5;size=[0,0];pos=[0,0];setEnableSpring(e=!0){this.disableSpring=!e,e?this.element.classList.remove(this.style.classes.disableSpring):this.element.classList.add(this.style.classes.disableSpring),this.calcLayout(!0)}getEnableSpring(){return!this.disableSpring}style=Y.createStyleSheet({lyricPlayer:{userSelect:"none",padding:"1rem",boxSizing:"border-box",fontSize:"max(5vh, 12px)",fontWeight:"bold",width:"100%",height:"100%",overflow:"hidden",maxWidth:"100%",maxHeight:"100%",zIndex:1,color:"var(--amll-lyric-line-color)",mixBlendMode:"plus-lighter",contain:"strict"},lyricLine:{position:"absolute",transformOrigin:"left",maxWidth:"65%",padding:"max(2vh, 1rem) 1rem",contain:"content",transition:"filter 0.25s",margin:"max(2vh, 1rem) -1rem"},"@media (max-width: 1024px)":{lyricLine:{maxWidth:"75%",padding:"max(1vh, 1rem) 1rem",margin:"0 -1rem"}},lyricDuetLine:{textAlign:"right",transformOrigin:"right"},lyricBgLine:{opacity:0,fontSize:"max(50%, 10px)",transition:"opacity 0.25s","&.active":{transition:"opacity 0.25s 0.25s",opacity:1}},lyricMainLine:{transition:"opacity 0.3s 0.25s",margin:"-1rem",padding:"1rem","& span":{display:"inline-block",margin:"-1rem",padding:"1rem"},"& > span":{whiteSpace:"pre-wrap",wordBreak:"keep-all",maxLines:"1","&.emphasize":{margin:"-1rem",padding:"1rem",transformStyle:"preserve-3d",perspective:"50vw"}}},lyricSubLine:{fontSize:"max(50%, 10px)",opacity:.5},disableSpring:{"& > *":{transition:"filter 0.25s, transform 0.5s"}},interludeDots:{height:"min(1rem,2.5vh)",transformOrigin:"center",width:"fit-content",padding:"2.5% 0",position:"absolute",display:"flex",gap:"0.5rem","& > *":{width:"100%",display:"inline-block",borderRadius:"50%",aspectRatio:"1 / 1",backgroundColor:"var(--amll-lyric-line-color)",marginRight:"4px"},"&.duet":{right:"1rem",transformOrigin:"center"}},"@supports (mix-blend-mode: plus-lighter)":{lyricSubLine:{opacity:.3}},tmpDisableTransition:{transition:"none !important"}});onPageShow=()=>{this.calcLayout(!0)};constructor(){super(),this.interludeDots=new $(this),this.element.setAttribute("class",this.style.classes.lyricPlayer),this.disableSpring&&this.element.classList.add(this.style.classes.disableSpring),this.rebuildStyle(),this.resizeObserver.observe(this.element),this.element.appendChild(this.interludeDots.getElement()),this.style.attach(),this.interludeDots.setTransform(0,200),window.addEventListener("pageshow",this.onPageShow)}getCurrentInterlude(){if(this.bufferedLines.size>0)return;const e=this.currentTime+20,t=this.scrollToIndex;if(t===0){if(this.processedLines[0]?.startTime&&this.processedLines[0].startTime>e)return[0,this.processedLines[0].startTime,-2]}else if(this.processedLines[t]?.endTime&&this.processedLines[t+1]?.startTime&&this.processedLines[t+1].startTime>e&&this.processedLines[t].endTime<e)return[this.processedLines[t].endTime,this.processedLines[t+1].startTime,t]}rebuildStyle(){let e="";e+="--amll-lyric-player-width:",e+=this.element.clientWidth,e+="px;",e+="--amll-lyric-player-height:",e+=this.element.clientHeight,e+="px;",e+="--amll-lyric-line-color:",e+="#FFFFFF;",e+="--amll-player-time:",e+=this.currentTime,e+=";",this.element.setAttribute("style",e)}setEnableBlur(e){this.enableBlur!==e&&(this.enableBlur=e,this.calcLayout())}setLyricLines(e){this.lyricLines=e;const t=750;this.processedLines=e.filter(i=>i.words.reduce((n,a)=>n+a.word.trim().length,0)>0).map((i,n,a)=>{if(i.isBG)return{...i};{const s=a[n-1],r=a[n-2];if(s?.isBG&&r){if(r.endTime<i.startTime)return{...i,startTime:Math.max(r.endTime,i.startTime-t)||i.startTime}}else if(s?.endTime&&s.endTime<i.startTime)return{...i,startTime:Math.max(s?.endTime,i.startTime-t)||i.startTime};return{...i}}}),this.processedLines.forEach((i,n,a)=>{const s=a[n+1],r=i.words[i.words.length-1];r&&P(r)&&(s?s.startTime>i.endTime&&(i.endTime=Math.min(i.endTime+1500,s.startTime)):i.endTime=i.endTime+1500)}),this.processedLines.forEach((i,n,a)=>{if(i.isBG)return;const s=a[n+1];s?.isBG&&(s.startTime=Math.min(s.startTime,i.startTime))}),this.lyricLinesEl.forEach(i=>i.dispose()),this.lyricLinesEl=this.processedLines.map(i=>new X(this,i)),this.lyricLinesEl.forEach(i=>{this.element.appendChild(i.getElement()),i.updateMaskImage()}),this.hotLines.clear(),this.bufferedLines.clear(),this.setLinePosXSpringParams({}),this.setLinePosYSpringParams({}),this.setLineScaleSpringParams({}),this.setCurrentTime(0,!0),this.calcLayout(!0)}calcLayout(e=!1){e&&(this.lyricLinesEl.forEach(o=>{const c=o.measureSize();this.lyricLinesSize.set(o,c),o.lineSize=c}),this.interludeDotsSize[0]=this.interludeDots.getElement().clientWidth,this.interludeDotsSize[1]=this.interludeDots.getElement().clientHeight);const t=.95;let n=-this.lyricLinesEl.slice(0,this.scrollToIndex).reduce((o,c)=>o+(c.getLine().isBG?0:this.lyricLinesSize.get(c)?.[1]??0),0);if(this.alignAnchor==="bottom"){n+=this.element.clientHeight/2;const o=this.lyricLinesEl[this.scrollToIndex];if(o){const c=this.lyricLinesSize.get(o)?.[1]??0;n-=c/2}}else if(typeof this.alignAnchor=="number"){n+=this.element.clientHeight*this.alignAnchor;const o=this.lyricLinesEl[this.scrollToIndex];if(o){const c=this.lyricLinesSize.get(o)?.[1]??0;n-=c/2}}const a=this.getCurrentInterlude();let s=0;if(a&&(s=a[1]-a[0],s>=5e3)){const o=this.lyricLinesEl[a[2]+1];o&&(n-=this.lyricLinesSize.get(o)?.[1]??0)}const r=Math.max(...this.bufferedLines);let l=0,h=!1;this.lyricLinesEl.forEach((o,c)=>{const m=this.bufferedLines.has(c),p=m||c>=this.scrollToIndex&&c<r,u=o.getLine();let f=0;u.isDuet&&(f=this.size[0]-(this.lyricLinesSize.get(o)?.[0]??0)),!h&&s>=5e3&&(c===this.scrollToIndex&&a?.[2]===-2||c===this.scrollToIndex+1)&&(h=!0,this.interludeDots.setTransform(0,n),a&&this.interludeDots.setInterlude([a[0],a[1]]),n+=this.interludeDotsSize[1]),o.setTransform(f,n,p?1:t,m?1:1/3,this.enableBlur?3*(p?0:1+(c<this.scrollToIndex?Math.abs(this.scrollToIndex-c):Math.abs(c-Math.max(this.scrollToIndex,r)))):0,e,l),u.isBG&&p?n+=this.lyricLinesSize.get(o)?.[1]??0:u.isBG||(n+=this.lyricLinesSize.get(o)?.[1]??0),n>=0&&(l+=.05)})}getCurrentTime(){return this.currentTime}getLyricLines(){return this.lyricLines}getElement(){return this.element}setAlignAnchor(e){this.alignAnchor=e}setCurrentTime(e,t=!1){this.currentTime=e,this.element.style.setProperty("--amll-player-time",`${e}`);const i=new Set,n=new Set,a=new Set;this.hotLines.forEach(s=>{const r=this.processedLines[s];if(r){if(r.isBG)return;const l=this.processedLines[s+1];if(l?.isBG){const h=Math.min(r.startTime,l?.startTime),o=Math.max(r.endTime,l?.endTime);(h>e||o<=e)&&(this.hotLines.delete(s),i.add(s),this.hotLines.delete(s+1),i.add(s+1),t&&(this.lyricLinesEl[s].disable(),this.lyricLinesEl[s+1].disable()))}else(r.startTime>e||r.endTime<=e)&&(this.hotLines.delete(s),i.add(s),t&&this.lyricLinesEl[s].disable())}else this.hotLines.delete(s),i.add(s),t&&this.lyricLinesEl[s].disable()}),this.processedLines.forEach((s,r,l)=>{!s.isBG&&s.startTime<=e&&s.endTime>e&&(this.hotLines.has(r)||(this.hotLines.add(r),a.add(r),t&&this.lyricLinesEl[r].enable(),l[r+1]?.isBG&&(this.hotLines.add(r+1),a.add(r+1),t&&this.lyricLinesEl[r+1].enable())))}),this.bufferedLines.forEach(s=>{this.hotLines.has(s)||(n.add(s),t&&this.lyricLinesEl[s].disable())}),t?(this.bufferedLines.size>0?this.scrollToIndex=Math.min(...this.bufferedLines):this.scrollToIndex=this.processedLines.findIndex(s=>s.startTime>=e),this.bufferedLines.clear(),this.hotLines.forEach(s=>this.bufferedLines.add(s)),this.calcLayout(!0)):(n.size>0||a.size>0)&&(n.size===0&&a.size>0?(a.forEach(s=>{this.bufferedLines.add(s),this.lyricLinesEl[s].enable()}),this.scrollToIndex=Math.min(...this.bufferedLines)):a.size===0&&n.size>0?O(n,this.bufferedLines)&&this.bufferedLines.forEach(s=>{this.hotLines.has(s)||(this.bufferedLines.delete(s),this.lyricLinesEl[s].disable())}):(a.forEach(s=>{this.bufferedLines.add(s),this.lyricLinesEl[s].enable()}),n.forEach(s=>{this.bufferedLines.delete(s),this.lyricLinesEl[s].disable()}),this.bufferedLines.size>0&&(this.scrollToIndex=Math.min(...this.bufferedLines))),this.calcLayout())}update(e=0){const t=e/1e3;this.interludeDots.update(e),this.lyricLinesEl.forEach(i=>i.update(t))}setLinePosXSpringParams(e){this.posXSpringParams={...this.posXSpringParams,...e},this.lyricLinesEl.forEach(t=>t.lineTransforms.posX.updateParams(this.posXSpringParams))}setLinePosYSpringParams(e){this.posYSpringParams={...this.posYSpringParams,...e},this.lyricLinesEl.forEach(t=>t.lineTransforms.posY.updateParams(this.posYSpringParams))}setLineScaleSpringParams(e){this.scaleSpringParams={...this.scaleSpringParams,...e},this.lyricLinesEl.forEach(t=>t.lineTransforms.scale.updateParams(this.scaleSpringParams))}dispose(){this.element.remove(),this.resizeObserver.disconnect(),this.style.detach(),this.lyricLinesEl.forEach(e=>e.dispose()),window.removeEventListener("pageshow",this.onPageShow)}}exports.BackgroundRender=q;exports.LyricPlayer=V;exports.ttml=I;
2
2
  //# sourceMappingURL=amll-core.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"amll-core.js","sources":["../src/lyric/ttml.ts","../src/bg-render/pixi-renderer.ts","../src/bg-render/index.ts","../src/utils/eq-set.ts","../src/lyric-player/interlude-dots.ts","../src/utils/spring.ts","../src/lyric-player/lyric-line.ts","../src/lyric-player/index.ts"],"sourcesContent":["import { LyricLine, LyricWord } from \"../interfaces\";\n\nconst timeRegexp =\n\t/^(((?<hour>[0-9]+):)?(?<min>[0-9]+):)?(?<sec>[0-9]+([\\.:]([0-9]+))?)/;\nfunction parseTimespan(timeSpan: string): number {\n\tconst matches = timeRegexp.exec(timeSpan);\n\tif (matches) {\n\t\tconst hour = Number(matches.groups?.hour || \"0\");\n\t\tconst min = Number(matches.groups?.min || \"0\");\n\t\tconst sec = Number(matches.groups?.sec.replace(/:/, \".\") || \"0\");\n\t\treturn Math.floor((hour * 3600 + min * 60 + sec) * 1000);\n\t} else {\n\t\tthrow new TypeError(\"时间戳字符串解析失败\");\n\t}\n}\n\nexport function parseTTML(ttmlText: string): LyricLine[] {\n\tconst domParser = new DOMParser();\n\tconst ttmlDoc: XMLDocument = domParser.parseFromString(\n\t\tttmlText,\n\t\t\"application/xml\",\n\t);\n\n\tlet mainAgentId = \"v1\";\n\n\tfor (const agent of ttmlDoc.querySelectorAll(\"ttm\\\\:agent\")) {\n\t\tif (agent.getAttribute(\"type\") === \"person\") {\n\t\t\tconst id = agent.getAttribute(\"xml:id\");\n\t\t\tif (id) {\n\t\t\t\tmainAgentId = id;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst result: LyricLine[] = [];\n\n\tfor (const lineEl of ttmlDoc.querySelectorAll(\"body p[begin][end]\")) {\n\t\tconst line: LyricLine = {\n\t\t\twords: [],\n\t\t\tstartTime: parseTimespan(lineEl.getAttribute(\"begin\") ?? \"0:0\"),\n\t\t\tendTime: parseTimespan(lineEl.getAttribute(\"end\") ?? \"0:0\"),\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tisBG: false,\n\t\t\tisDuet: lineEl.getAttribute(\"ttm:agent\") !== mainAgentId,\n\t\t};\n\t\tlet curBGLine: LyricLine | null = null;\n\n\t\tfor (const wordNode of lineEl.childNodes) {\n\t\t\tif (wordNode.nodeType === Node.TEXT_NODE) {\n\t\t\t\tconst word = wordNode.textContent ?? \"\";\n\t\t\t\tif (/^(\\s+)$/.test(word)) {\n\t\t\t\t\tline.words.push({\n\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tline.words.push({\n\t\t\t\t\t\tword: word,\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (wordNode.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tconst wordEl = wordNode as Element;\n\t\t\t\tconst role = wordEl.getAttribute(\"ttm:role\");\n\n\t\t\t\tif (wordEl.nodeName === \"span\" && role) {\n\t\t\t\t\tif (role === \"x-bg\") {\n\t\t\t\t\t\tconst bgLine: LyricLine = {\n\t\t\t\t\t\t\twords: [],\n\t\t\t\t\t\t\tstartTime: line.startTime,\n\t\t\t\t\t\t\tendTime: line.endTime,\n\t\t\t\t\t\t\ttranslatedLyric: \"\",\n\t\t\t\t\t\t\tromanLyric: \"\",\n\t\t\t\t\t\t\tisBG: true,\n\t\t\t\t\t\t\tisDuet: line.isDuet,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tfor (const wordNode of wordEl.childNodes) {\n\t\t\t\t\t\t\tif (wordNode.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\t\t\tconst word = wordNode.textContent ?? \"\";\n\t\t\t\t\t\t\t\tif (/^(\\s+)$/.test(word)) {\n\t\t\t\t\t\t\t\t\tbgLine.words.push({\n\t\t\t\t\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tbgLine.words.push({\n\t\t\t\t\t\t\t\t\t\tword: word,\n\t\t\t\t\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (wordNode.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\t\t\t\tconst wordEl = wordNode as Element;\n\t\t\t\t\t\t\t\tconst role = wordEl.getAttribute(\"ttm:role\");\n\t\t\t\t\t\t\t\tif (wordEl.nodeName === \"span\" && role) {\n\t\t\t\t\t\t\t\t\tif (role === \"x-translation\") {\n\t\t\t\t\t\t\t\t\t\tbgLine.translatedLyric = wordEl.innerHTML.trim();\n\t\t\t\t\t\t\t\t\t} else if (role === \"x-roman\") {\n\t\t\t\t\t\t\t\t\t\tbgLine.romanLyric = wordEl.innerHTML.trim();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\twordEl.hasAttribute(\"begin\") &&\n\t\t\t\t\t\t\t\t\twordEl.hasAttribute(\"end\")\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst word = {\n\t\t\t\t\t\t\t\t\t\tword: wordNode.textContent,\n\t\t\t\t\t\t\t\t\t\tstartTime: parseTimespan(wordEl.getAttribute(\"begin\")!!),\n\t\t\t\t\t\t\t\t\t\tendTime: parseTimespan(wordEl.getAttribute(\"end\")!!),\n\t\t\t\t\t\t\t\t\t} as LyricWord;\n\t\t\t\t\t\t\t\t\tbgLine.words.push(word);\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\n\t\t\t\t\t\tconst firstWord = bgLine.words[0];\n\t\t\t\t\t\tbgLine.startTime = firstWord.startTime;\n\t\t\t\t\t\tif (firstWord?.word.startsWith(\"(\")) {\n\t\t\t\t\t\t\tfirstWord.word = firstWord.word.substring(1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst lastWord = bgLine.words[bgLine.words.length - 1];\n\t\t\t\t\t\tbgLine.endTime = lastWord.endTime;\n\t\t\t\t\t\tif (lastWord?.word.endsWith(\")\")) {\n\t\t\t\t\t\t\tlastWord.word = lastWord.word.substring(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tlastWord.word.length - 1,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurBGLine = bgLine;\n\t\t\t\t\t} else if (role === \"x-translation\") {\n\t\t\t\t\t\tline.translatedLyric = wordEl.innerHTML;\n\t\t\t\t\t} else if (role === \"x-roman\") {\n\t\t\t\t\t\tline.romanLyric = wordEl.innerHTML;\n\t\t\t\t\t}\n\t\t\t\t} else if (wordEl.hasAttribute(\"begin\") && wordEl.hasAttribute(\"end\")) {\n\t\t\t\t\tconst word: LyricWord = {\n\t\t\t\t\t\tword: wordNode.textContent ?? \"\",\n\t\t\t\t\t\tstartTime: parseTimespan(wordEl.getAttribute(\"begin\")!!),\n\t\t\t\t\t\tendTime: parseTimespan(wordEl.getAttribute(\"end\")!!),\n\t\t\t\t\t};\n\t\t\t\t\tline.words.push(word);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tresult.push(line);\n\t\tif (curBGLine) {\n\t\t\t// line.startTime = Math.min(line.startTime, curBGLine.startTime);\n\t\t\t// line.endTime = Math.max(line.endTime, curBGLine.endTime);\n\t\t\t// curBGLine.startTime = line.startTime;\n\t\t\t// curBGLine.endTime = line.endTime;\n\t\t\tresult.push(curBGLine);\n\t\t}\n\t}\n\n\tconsole.log(result);\n\n\treturn result;\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 { 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 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}\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\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.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.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 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 = [];\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\tif (minBorder > 512) this.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}\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 tex = await Texture.fromURL(albumUrl);\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}\n\n\tdispose() {\n\t\tthis.observer.disconnect();\n\t\tthis.app.ticker.remove(this.onTick);\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}\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","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}px, ${this.top}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","/** 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 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}\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}\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.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}\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...params,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\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\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, LyricLine, LyricWord } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nconst CJKEXP = /^[\\p{Unified_Ideograph}\\u0800-\\u9FFC]+$/u;\n\ninterface RealWord extends LyricWord {\n\telements: 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,1)\",\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// 果子在对辉光效果的解释是一种强调(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 LyricLineEl 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\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\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 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\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\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 lastStyle = \"\";\n\tshow() {\n\t\tthis._hide = false;\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis._hide = true;\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.getCurrentPosition()}px,${this.lineTransforms.posY.getCurrentPosition()}px) scale(${this.lineTransforms.scale.getCurrentPosition()});`;\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\tthis.splittedWords = [];\n\t\tthis.lyricLine.words.forEach((word) => {\n\t\t\tconst splited = word.word.split(/\\s+/);\n\t\t\tconst trimmedLength = splited.reduce((pv, cv) => pv + cv.length, 0);\n\t\t\tlet pos = 0;\n\t\t\tsplited.forEach((sub, i) => {\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\telements: [],\n\t\t\t\t\t\telementAnimations: [],\n\t\t\t\t\t\tshouldEmphasize: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\tword: sub,\n\t\t\t\t\tstartTime:\n\t\t\t\t\t\tword.startTime +\n\t\t\t\t\t\t((word.endTime - word.startTime) / trimmedLength) * pos,\n\t\t\t\t\tendTime:\n\t\t\t\t\t\tword.startTime +\n\t\t\t\t\t\t((word.endTime - word.startTime) / trimmedLength) *\n\t\t\t\t\t\t\t(pos + sub.length),\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\telements: [],\n\t\t\t\t\telementAnimations: [],\n\t\t\t\t\tshouldEmphasize: shouldEmphasize(word),\n\t\t\t\t});\n\t\t\t\tpos += sub.length;\n\t\t\t});\n\t\t});\n\t\t// 回收元素以复用\n\t\tconst reusableElements: HTMLElement[] = [];\n\t\tconst reusableTextNodes: Text[] = [];\n\t\tfunction collectNodes(curNode: Node) {\n\t\t\twhile (curNode.firstChild) {\n\t\t\t\tif (curNode.firstChild.nodeType === Node.ELEMENT_NODE)\n\t\t\t\t\treusableElements.push(main.firstChild as HTMLElement);\n\t\t\t\telse if (curNode.firstChild.nodeType === Node.TEXT_NODE)\n\t\t\t\t\treusableTextNodes.push(main.firstChild as Text);\n\t\t\t\tcurNode.removeChild(curNode.firstChild);\n\t\t\t\tcollectNodes(curNode.firstChild);\n\t\t\t}\n\t\t}\n\t\tcollectNodes(main);\n\t\tlet lastWordEl: HTMLSpanElement | null = null;\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tif (word.word.trim().length > 0) {\n\t\t\t\tif (word.shouldEmphasize) {\n\t\t\t\t\tconst wordEl =\n\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\twordEl.className = \"emphasize\";\n\t\t\t\t\tword.elements = [wordEl];\n\t\t\t\t\tfor (const c of word.word) {\n\t\t\t\t\t\tconst charEl =\n\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\tcharEl.className = \"\";\n\t\t\t\t\t\tcharEl.innerText = c;\n\t\t\t\t\t\twordEl.appendChild(charEl);\n\t\t\t\t\t\tword.elements.push(charEl);\n\t\t\t\t\t}\n\t\t\t\t\tword.elementAnimations = this.initEmphasizeAnimation(word);\n\t\t\t\t\tconsole.log(word.word, CJKEXP.test(word.word));\n\t\t\t\t\tif (lastWordEl && !CJKEXP.test(word.word)) {\n\t\t\t\t\t\tif (lastWordEl.childElementCount > 0) {\n\t\t\t\t\t\t\tlastWordEl.appendChild(wordEl);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst wholeWordEl =\n\t\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\t\twholeWordEl.className = \"\";\n\t\t\t\t\t\t\tlastWordEl.remove();\n\t\t\t\t\t\t\twholeWordEl.appendChild(lastWordEl);\n\t\t\t\t\t\t\twholeWordEl.appendChild(wordEl);\n\t\t\t\t\t\t\tmain.appendChild(wholeWordEl);\n\t\t\t\t\t\t\tlastWordEl = wholeWordEl;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastWordEl = CJKEXP.test(word.word) ? null : wordEl;\n\t\t\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst wordEl =\n\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\twordEl.className = \"\";\n\t\t\t\t\twordEl.innerText = word.word;\n\t\t\t\t\tword.elements = [wordEl];\n\t\t\t\t\tword.elementAnimations.push(this.initFloatAnimation(word, wordEl));\n\t\t\t\t\tif (lastWordEl) {\n\t\t\t\t\t\tif (lastWordEl.childElementCount > 0) {\n\t\t\t\t\t\t\tlastWordEl.appendChild(wordEl);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst wholeWordEl =\n\t\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\t\twholeWordEl.className = \"\";\n\t\t\t\t\t\t\tlastWordEl.remove();\n\t\t\t\t\t\t\twholeWordEl.appendChild(lastWordEl);\n\t\t\t\t\t\t\twholeWordEl.appendChild(wordEl);\n\t\t\t\t\t\t\tmain.appendChild(wholeWordEl);\n\t\t\t\t\t\t\tlastWordEl = wholeWordEl;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastWordEl = wordEl;\n\t\t\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (word.word.length > 0) {\n\t\t\t\tconst wordEl = reusableTextNodes.pop() ?? document.createTextNode(\" \");\n\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\tlastWordEl = null;\n\t\t\t} else {\n\t\t\t\tlastWordEl = null;\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.elements.map((el, i, arr) => {\n\t\t\tif (i === 0) {\n\t\t\t\treturn this.initFloatAnimation(word, el);\n\t\t\t} else {\n\t\t\t\tconst a = el.animate(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, 0px, 0px)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-line-color))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 0.5,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, -2%, 20px)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0.2rem var(--amll-lyric-line-color))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 1,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, 0px, 0)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-line-color))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t{\n\t\t\t\t\t\tduration: Math.max(1000, word.endTime - word.startTime),\n\t\t\t\t\t\tdelay: delay + (duration / (arr.length - 1)) * (i - 1),\n\t\t\t\t\t\tid: \"glow-word\",\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\ta.pause();\n\t\t\t\treturn a;\n\t\t\t}\n\t\t});\n\t}\n\tupdateMaskImage() {\n\t\tif (this._hide) {\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.elements[0];\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 [maskImage, _widthInTotal, totalAspect] = generateFadeGradient(\n\t\t\t\t\t16 / word.width,\n\t\t\t\t\t\"rgba(0,0,0,0.75)\",\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.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.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\tconst w = word.width + 16;\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\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\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\tmain.style.opacity = `${opacity}`;\n\t\tif (force || !this.lyricPlayer.getEnableSpring()) {\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 (!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\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\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 pl = this.lyricPlayer.pos[0];\n\t\tconst pt = this.lyricPlayer.pos[1];\n\t\tconst pr = this.lyricPlayer.pos[0] + this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.pos[1] + this.lyricPlayer.size[1];\n\t\treturn !(l > pr || t > pb || r < pl || b < pt);\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 { InterludeDots } from \"./interlude-dots\";\nimport { LyricLineEl, shouldEmphasize } from \"./lyric-line\";\nimport { create } from \"jss\";\nimport preset from \"jss-preset-default\";\n\nconst jss = create(preset());\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: Map<LyricLineEl, [number, number]> = new Map();\n\tprivate hotLines: Set<number> = new Set();\n\tprivate bufferedLines: Set<number> = new Set();\n\tprivate scrollToIndex = 0;\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\tthis.pos[0] = rect.left;\n\t\tthis.pos[1] = rect.top;\n\t\tthis.rebuildStyle();\n\t\tthis.calcLayout(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 enableBlur = true;\n\tprivate interludeDots: InterludeDots;\n\tprivate interludeDotsSize: [number, number] = [0, 0];\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\" | number = 0.5;\n\treadonly size: [number, number] = [0, 0];\n\treadonly pos: [number, number] = [0, 0];\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\tpublic readonly style = jss.createStyleSheet({\n\t\tlyricPlayer: {\n\t\t\tuserSelect: \"none\",\n\t\t\tpadding: \"1rem\",\n\t\t\tboxSizing: \"border-box\",\n\t\t\tfontSize: \"max(5vh, 12px)\",\n\t\t\tfontWeight: \"bold\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\toverflow: \"hidden\",\n\t\t\tmaxWidth: \"100%\",\n\t\t\tmaxHeight: \"100%\",\n\t\t\tzIndex: 1,\n\t\t\tcolor: \"var(--amll-lyric-line-color)\",\n\t\t\tmixBlendMode: \"plus-lighter\",\n\t\t\tcontain: \"strict\",\n\t\t},\n\t\tlyricLine: {\n\t\t\tposition: \"absolute\",\n\t\t\ttransformOrigin: \"left\",\n\t\t\tmaxWidth: \"65%\",\n\t\t\tpadding: \"max(2vh, 1rem) 1rem\",\n\t\t\tcontain: \"content\",\n\t\t\ttransition: \"filter 0.25s\",\n\t\t\tmargin: \"max(2vh, 1rem) -1rem\",\n\t\t},\n\t\t\"@media (max-width: 1024px)\": {\n\t\t\tlyricLine: {\n\t\t\t\tmaxWidth: \"75%\",\n\t\t\t\tpadding: \"max(1vh, 1rem) 1rem\",\n\t\t\t\tmargin: \"0 -1rem\",\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: 1,\n\t\t\t},\n\t\t},\n\t\tlyricMainLine: {\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\tmargin: \"-1rem\",\n\t\t\tpadding: \"1rem\",\n\t\t\t\"& span\": {\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\tmargin: \"-1rem\",\n\t\t\t\tpadding: \"1rem\",\n\t\t\t},\n\t\t\t\"& > span\": {\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\twordBreak: \"keep-all\",\n\t\t\t\tmaxLines: \"1\",\n\t\t\t\t\"&.emphasize\": {\n\t\t\t\t\tmargin: \"-1rem\",\n\t\t\t\t\tpadding: \"1rem\",\n\t\t\t\t\ttransformStyle: \"preserve-3d\",\n\t\t\t\t\tperspective: \"50vw\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricSubLine: {\n\t\t\tfontSize: \"max(50%, 10px)\",\n\t\t\topacity: 0.5,\n\t\t},\n\t\tdisableSpring: {\n\t\t\t\"& > *\": {\n\t\t\t\ttransition: \"filter 0.25s, transform 0.5s\",\n\t\t\t},\n\t\t},\n\t\tinterludeDots: {\n\t\t\theight: \"min(1rem,2.5vh)\",\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.5rem\",\n\t\t\t\"& > *\": {\n\t\t\t\twidth: \"100%\",\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-line-color)\",\n\t\t\t\tmarginRight: \"4px\",\n\t\t\t},\n\t\t\t\"&.duet\": {\n\t\t\t\tright: \"1rem\",\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);\n\t};\n\tconstructor() {\n\t\tsuper();\n\t\tthis.interludeDots = new InterludeDots(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.style.attach();\n\t\tthis.interludeDots.setTransform(0, 200);\n\t\twindow.addEventListener(\"pageshow\", this.onPageShow);\n\t}\n\t/**\n\t * 获取当前播放时间里是否处于间奏区间\n\t * 如果是则会返回单位为毫秒的始末时间\n\t * 否则返回 undefined\n\t *\n\t * 这个只允许内部调用\n\t * @returns [开始时间,结束时间] 或 undefined 如果不处于间奏区间\n\t */\n\tgetCurrentInterlude(): [number, number, number] | 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 [0, this.processedLines[0].startTime, -2];\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\tthis.processedLines[i].endTime,\n\t\t\t\t\tthis.processedLines[i + 1].startTime,\n\t\t\t\t\ti,\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.element.clientWidth;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-player-height:\";\n\t\tstyle += this.element.clientHeight;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-line-color:\";\n\t\tstyle += \"#FFFFFF;\";\n\t\tstyle += \"--amll-player-time:\";\n\t\tstyle += this.currentTime;\n\t\tstyle += \";\";\n\t\tthis.element.setAttribute(\"style\", style);\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\tconst lastLine = lines[i - 1];\n\t\t\t\t\tconst pastLine = lines[i - 2];\n\t\t\t\t\tif (lastLine?.isBG && pastLine) {\n\t\t\t\t\t\tif (pastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\tMath.max(pastLine.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (lastLine?.endTime) {\n\t\t\t\t\t\tif (lastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\tMath.max(lastLine?.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\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((el) => el.dispose());\n\t\tthis.lyricLinesEl = this.processedLines.map(\n\t\t\t(line) => new LyricLineEl(this, line),\n\t\t);\n\t\tthis.lyricLinesEl.forEach((el) => {\n\t\t\tthis.element.appendChild(el.getElement());\n\t\t\tel.updateMaskImage();\n\t\t});\n\t\tthis.setLinePosXSpringParams({});\n\t\tthis.setLinePosYSpringParams({});\n\t\tthis.setLineScaleSpringParams({});\n\t\tthis.setCurrentTime(0, true);\n\t\tthis.calcLayout(true);\n\t}\n\t/**\n\t * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`\n\t * 函数即可让歌词通过动画移动到目标位置。\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 reflow 是否进行重新布局(重新计算每行歌词大小)\n\t */\n\tcalcLayout(reflow = false) {\n\t\tif (reflow) {\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\t\t}\n\t\tconst SCALE_ASPECT = 0.95;\n\t\tconst scrollOffset = this.lyricLinesEl\n\t\t\t.slice(0, this.scrollToIndex)\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\tlet curPos = -scrollOffset;\n\t\tif (this.alignAnchor === \"bottom\") {\n\t\t\tcurPos += this.element.clientHeight / 2;\n\t\t\tconst curLine = this.lyricLinesEl[this.scrollToIndex];\n\t\t\tif (curLine) {\n\t\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t}\n\t\t} else if (typeof this.alignAnchor === \"number\") {\n\t\t\tcurPos += this.element.clientHeight * this.alignAnchor;\n\t\t\tconst curLine = this.lyricLinesEl[this.scrollToIndex];\n\t\t\tif (curLine) {\n\t\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t}\n\t\t}\n\t\tconst interlude = this.getCurrentInterlude();\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\tcurPos -= this.lyricLinesSize.get(nextLine)?.[1] ?? 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst latestIndex = Math.max(...this.bufferedLines);\n\t\tlet delay = 0;\n\t\tlet setDots = false;\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(0, 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\tel.setTransform(\n\t\t\t\tleft,\n\t\t\t\tcurPos,\n\t\t\t\tisActive ? 1 : SCALE_ASPECT,\n\t\t\t\thasBuffered ? 1 : 1 / 3,\n\t\t\t\tthis.enableBlur\n\t\t\t\t\t? 3 *\n\t\t\t\t\t (isActive\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: 1 +\n\t\t\t\t\t\t\t (i < this.scrollToIndex\n\t\t\t\t\t\t\t\t\t? Math.abs(this.scrollToIndex - i)\n\t\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\treflow,\n\t\t\t\tdelay,\n\t\t\t);\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 += 0.05;\n\t\t\t}\n\t\t});\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 * 设置歌词行的对齐方式,默认为 `top`\n\t *\n\t * - 设置成 `top` 的话歌词将会向组件顶部对齐\n\t * - 设置成 `bottom` 的话歌词将会向组件底部对齐\n\t * - 设置成 [0.0-1.0] 之间任意数字的话则会根据当前组件高度从顶部向下位移为对齐位置垂直居中对齐\n\t * @param alignAnchor 歌词行对齐方式,详情见函数说明\n\t */\n\tsetAlignAnchor(alignAnchor: \"top\" | \"bottom\" | number) {\n\t\tthis.alignAnchor = alignAnchor;\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\tthis.element.style.setProperty(\"--amll-player-time\", `${time}`);\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.isBG) return;\n\t\t\tif (line) {\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\tif (removedIds.size === 0 && addedIds.size > 0) {\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} else if (addedIds.size === 0 && removedIds.size > 0) {\n\t\t\t\tif (eqSet(removedIds, this.bufferedLines)) {\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}\n\t\t\t} else {\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}\n\t\t\tthis.calcLayout();\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.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.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.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}\n}\n"],"names":["timeRegexp","parseTimespan","timeSpan","matches","hour","min","sec","parseTTML","ttmlText","ttmlDoc","mainAgentId","agent","id","result","lineEl","line","curBGLine","wordNode","word","wordEl","role","bgLine","firstWord","lastWord","TimedContainer","Container","PixiRenderer","canvas","bounds","Application","delta","lastContainer","s1","s2","s3","s4","maxSize","speed","scale","minBorder","c0","ColorMatrixFilter","c1","c2","BlurFilter","fps","albumUrl","tex","Texture","container","Sprite","BackgroundRender","eqSet","xs","ys","x","easeInOutBack","clamp","cur","max","InterludeDots","lyricPlayer","left","top","interlude","curStyle","interludeDuration","currentDuration","breatheDuration","globalOpacity","dot0Opacity","dot1Opacity","dot2Opacity","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","CJKEXP","generateFadeGradient","width","bright","dark","totalAspect","widthInTotal","leftPos","shouldEmphasize","LyricLineEl","lyricLine","main","trans","roman","a","size","style","splited","trimmedLength","pv","cv","pos","sub","i","reusableElements","reusableTextNodes","collectNodes","curNode","lastWordEl","c","charEl","wholeWordEl","duration","el","arr","maskImage","_widthInTotal","totalAspectStr","w","maskPos","opacity","blur","force","l","r","b","pl","pt","pr","pb","jss","create","preset","LyricPlayer","rect","enable","currentTime","lines","timeOffset","lastLine","pastLine","nextLine","reflow","SCALE_ASPECT","curPos","acc","curLine","lineHeight","latestIndex","setDots","hasBuffered","isActive","alignAnchor","time","isSeek","removedHotIds","removedIds","addedIds","lastHotId","startTime","endTime","v","deltaS"],"mappings":"iTAEMA,EACL,uEACD,SAASC,EAAcC,EAA0B,CAC1C,MAAAC,EAAUH,EAAW,KAAKE,CAAQ,EACxC,GAAIC,EAAS,CACZ,MAAMC,EAAO,OAAOD,EAAQ,QAAQ,MAAQ,GAAG,EACzCE,EAAM,OAAOF,EAAQ,QAAQ,KAAO,GAAG,EACvCG,EAAM,OAAOH,EAAQ,QAAQ,IAAI,QAAQ,IAAK,GAAG,GAAK,GAAG,EAC/D,OAAO,KAAK,OAAOC,EAAO,KAAOC,EAAM,GAAKC,GAAO,GAAI,CAAA,KAEjD,OAAA,IAAI,UAAU,YAAY,CAElC,CAEO,SAASC,EAAUC,EAA+B,CAExD,MAAMC,EADY,IAAI,YACiB,gBACtCD,EACA,iBAAA,EAGD,IAAIE,EAAc,KAElB,UAAWC,KAASF,EAAQ,iBAAiB,aAAa,EACzD,GAAIE,EAAM,aAAa,MAAM,IAAM,SAAU,CACtC,MAAAC,EAAKD,EAAM,aAAa,QAAQ,EAClCC,IACWF,EAAAE,EAEhB,CAGD,MAAMC,EAAsB,CAAA,EAE5B,UAAWC,KAAUL,EAAQ,iBAAiB,oBAAoB,EAAG,CACpE,MAAMM,EAAkB,CACvB,MAAO,CAAC,EACR,UAAWd,EAAca,EAAO,aAAa,OAAO,GAAK,KAAK,EAC9D,QAASb,EAAca,EAAO,aAAa,KAAK,GAAK,KAAK,EAC1D,gBAAiB,GACjB,WAAY,GACZ,KAAM,GACN,OAAQA,EAAO,aAAa,WAAW,IAAMJ,CAAA,EAE9C,IAAIM,EAA8B,KAEvB,UAAAC,KAAYH,EAAO,WACzB,GAAAG,EAAS,WAAa,KAAK,UAAW,CACnC,MAAAC,EAAOD,EAAS,aAAe,GACjC,UAAU,KAAKC,CAAI,EACtBH,EAAK,MAAM,KAAK,CACf,KAAM,IACN,UAAW,EACX,QAAS,CAAA,CACT,EAEDA,EAAK,MAAM,KAAK,CACf,KAAAG,EACA,UAAW,EACX,QAAS,CAAA,CACT,CAEQ,SAAAD,EAAS,WAAa,KAAK,aAAc,CACnD,MAAME,EAASF,EACTG,EAAOD,EAAO,aAAa,UAAU,EAEvC,GAAAA,EAAO,WAAa,QAAUC,EACjC,GAAIA,IAAS,OAAQ,CACpB,MAAMC,EAAoB,CACzB,MAAO,CAAC,EACR,UAAWN,EAAK,UAChB,QAASA,EAAK,QACd,gBAAiB,GACjB,WAAY,GACZ,KAAM,GACN,OAAQA,EAAK,MAAA,EAGHE,UAAAA,KAAYE,EAAO,WACzBF,GAAAA,EAAS,WAAa,KAAK,UAAW,CACnC,MAAAC,EAAOD,EAAS,aAAe,GACjC,UAAU,KAAKC,CAAI,EACtBG,EAAO,MAAM,KAAK,CACjB,KAAM,IACN,UAAW,EACX,QAAS,CAAA,CACT,EAEDA,EAAO,MAAM,KAAK,CACjB,KAAAH,EACA,UAAW,EACX,QAAS,CAAA,CACT,CAEQD,SAAAA,EAAS,WAAa,KAAK,aAAc,CACnD,MAAME,EAASF,EACTG,EAAOD,EAAO,aAAa,UAAU,EACvCA,GAAAA,EAAO,WAAa,QAAUC,EAC7BA,IAAS,gBACLC,EAAA,gBAAkBF,EAAO,UAAU,KAAK,EACrCC,IAAS,YACZC,EAAA,WAAaF,EAAO,UAAU,KAAK,WAG3CA,EAAO,aAAa,OAAO,GAC3BA,EAAO,aAAa,KAAK,EACxB,CACD,MAAMD,EAAO,CACZ,KAAMD,EAAS,YACf,UAAWhB,EAAckB,EAAO,aAAa,OAAO,CAAG,EACvD,QAASlB,EAAckB,EAAO,aAAa,KAAK,CAAG,CAAA,EAE7CE,EAAA,MAAM,KAAKH,CAAI,CACvB,CACD,CAGK,MAAAI,EAAYD,EAAO,MAAM,CAAC,EAChCA,EAAO,UAAYC,EAAU,UACzBA,GAAW,KAAK,WAAW,GAAG,IACjCA,EAAU,KAAOA,EAAU,KAAK,UAAU,CAAC,GAG5C,MAAMC,EAAWF,EAAO,MAAMA,EAAO,MAAM,OAAS,CAAC,EACrDA,EAAO,QAAUE,EAAS,QACtBA,GAAU,KAAK,SAAS,GAAG,IACrBA,EAAA,KAAOA,EAAS,KAAK,UAC7B,EACAA,EAAS,KAAK,OAAS,CAAA,GAIbP,EAAAK,CAAA,MACFD,IAAS,gBACnBL,EAAK,gBAAkBI,EAAO,UACpBC,IAAS,YACnBL,EAAK,WAAaI,EAAO,mBAEhBA,EAAO,aAAa,OAAO,GAAKA,EAAO,aAAa,KAAK,EAAG,CACtE,MAAMD,EAAkB,CACvB,KAAMD,EAAS,aAAe,GAC9B,UAAWhB,EAAckB,EAAO,aAAa,OAAO,CAAG,EACvD,QAASlB,EAAckB,EAAO,aAAa,KAAK,CAAG,CAAA,EAE/CJ,EAAA,MAAM,KAAKG,CAAI,CACrB,CACD,CAGDL,EAAO,KAAKE,CAAI,EACZC,GAKHH,EAAO,KAAKG,CAAS,CAEvB,CAEA,eAAQ,IAAIH,CAAM,EAEXA,CACR,gHC5JA,MAAMW,UAAuBC,EAAAA,SAAU,CAC/B,KAAO,CACf,CAEO,MAAMC,CAAmC,CAiE/C,YAAoBC,EAA2B,CAA3B,KAAA,OAAAA,EACb,MAAAC,EAASD,EAAO,wBACtB,KAAK,OAAO,MAAQC,EAAO,MAAQ,KAAK,oBACxC,KAAK,OAAO,OAASA,EAAO,OAAS,KAAK,oBACrC,KAAA,SAAW,IAAI,eAAe,IAAM,CAClCA,MAAAA,EAASD,EAAO,wBACtB,KAAK,OAAO,MAAQ,KAAK,IAAI,EAAGC,EAAO,KAAK,EAC5C,KAAK,OAAO,OAAS,KAAK,IAAI,EAAGA,EAAO,MAAM,EAC9C,KAAK,IAAI,SAAS,OACjB,KAAK,OAAO,MAAQ,KAAK,oBACzB,KAAK,OAAO,OAAS,KAAK,mBAAA,EAE3B,KAAK,eAAe,CAAA,CACpB,EACI,KAAA,SAAS,QAAQD,CAAM,EACvB,KAAA,IAAM,IAAIE,cAAY,CAC1B,KAAMF,EACN,SAAU,KAAK,OACf,gBAAiB,YACjB,gBAAiB,CAAA,CACjB,EACD,KAAK,eAAe,EACpB,KAAK,IAAI,OAAO,IAAI,KAAK,MAAM,EAC1B,KAAA,IAAI,OAAO,OACjB,CAxFQ,SACA,IACA,aACA,kBAAyC,IACzC,OAAUG,GAAwB,CAC9B,UAAAC,KAAiB,KAAK,cAChCA,EAAc,MAAQ,KAAK,IAAI,EAAGA,EAAc,MAAQD,EAAQ,EAAE,EAC9DC,EAAc,OAAS,IACrB,KAAA,IAAI,MAAM,YAAYA,CAAa,EACnC,KAAA,cAAc,OAAOA,CAAa,GAIzC,GAAI,KAAK,aAAc,CACjB,KAAA,aAAa,MAAQ,KAAK,IAC9B,EACA,KAAK,aAAa,MAAQD,EAAQ,EAAA,EAEnC,KAAM,CAACE,EAAIC,EAAIC,EAAIC,CAAE,EAAI,KAAK,aAAa,SACrCC,EAAU,KAAK,IAAI,KAAK,IAAI,OAAO,MAAO,KAAK,IAAI,OAAO,MAAM,EACnEJ,EAAA,SAAS,IAAI,KAAK,IAAI,OAAO,MAAQ,EAAG,KAAK,IAAI,OAAO,OAAS,CAAC,EACrEC,EAAG,SAAS,IACX,KAAK,IAAI,OAAO,MAAQ,IACxB,KAAK,IAAI,OAAO,OAAS,GAAA,EAEvBC,EAAA,SAAS,IAAI,KAAK,IAAI,OAAO,MAAQ,EAAG,KAAK,IAAI,OAAO,OAAS,CAAC,EAClEC,EAAA,SAAS,IAAI,KAAK,IAAI,OAAO,MAAQ,EAAG,KAAK,IAAI,OAAO,OAAS,CAAC,EACrEH,EAAG,MAAQI,EAAU,KAAK,KAAK,CAAC,EAChCJ,EAAG,OAASA,EAAG,MACfC,EAAG,MAAQG,EAAU,GACrBH,EAAG,OAASA,EAAG,MACfC,EAAG,MAAQE,EAAU,GACrBF,EAAG,OAASA,EAAG,MACfC,EAAG,MAAQC,EAAU,IACrBD,EAAG,OAASA,EAAG,MAEV,KAAA,aAAa,MAAQL,EAAQ,KAAK,UAEpCE,EAAA,UAAaF,EAAQ,IAAQ,KAAK,UAClCG,EAAA,UAAaH,EAAQ,IAAO,KAAK,UACjCI,EAAA,UAAaJ,EAAQ,IAAQ,KAAK,UAClCK,EAAA,UAAaL,EAAQ,IAAO,KAAK,UAEpCI,EAAG,EACF,KAAK,IAAI,OAAO,MAAQ,EACvB,KAAK,IAAI,OAAO,MAAQ,EACxB,KAAK,IAAK,KAAK,aAAa,KAAO,IAAQ,GAAI,EACjDA,EAAG,EACF,KAAK,IAAI,OAAO,OAAS,EACxB,KAAK,IAAI,OAAO,MAAQ,EACxB,KAAK,IAAK,KAAK,aAAa,KAAO,IAAQ,GAAI,EAEjDC,EAAG,EACF,KAAK,IAAI,OAAO,MAAQ,EACvB,KAAK,IAAI,OAAO,MAAQ,EAAK,GAC9B,KAAK,IAAI,KAAK,aAAa,KAAO,KAAQ,GAAI,EAC/CA,EAAG,EACF,KAAK,IAAI,OAAO,OAAS,EACxB,KAAK,IAAI,OAAO,MAAQ,EAAK,GAC9B,KAAK,IAAI,KAAK,aAAa,KAAO,KAAQ,GAAI,CAChD,CAAA,EAEO,UAAY,EACZ,oBAAsB,IA8B9B,aAAaE,EAAe,CAC3B,KAAK,UAAYA,CAClB,CAOA,eAAeC,EAAe,CAC7B,KAAK,oBAAsBA,EACrB,MAAAV,EAAS,KAAK,OAAO,sBAAsB,EACjD,KAAK,OAAO,MAAQ,KAAK,IAAI,EAAGA,EAAO,KAAK,EAC5C,KAAK,OAAO,OAAS,KAAK,IAAI,EAAGA,EAAO,MAAM,EAC9C,KAAK,IAAI,SAAS,OACjB,KAAK,OAAO,MAAQ,KAAK,oBACzB,KAAK,OAAO,OAAS,KAAK,mBAAA,EAE3B,KAAK,eAAe,CACrB,CACQ,gBAAiB,CAClB,MAAAW,EAAY,KAAK,IAAI,KAAK,OAAO,MAAO,KAAK,OAAO,MAAM,EAC1DC,EAAK,IAAIC,EAAAA,kBACZD,EAAA,SAAS,IAAK,EAAK,EAChB,MAAAE,EAAK,IAAID,EAAAA,kBACZC,EAAA,WAAW,GAAK,EAAK,EAClB,MAAAC,EAAK,IAAIF,EAAAA,kBACZE,EAAA,SAAS,GAAK,EAAI,EAChB,KAAA,IAAI,MAAM,QAAU,CAAA,EACpB,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIC,aAAW,EAAG,CAAC,CAAC,EAC3C,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIA,aAAW,GAAI,CAAC,CAAC,EAC5C,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIA,aAAW,GAAI,CAAC,CAAC,EAC5C,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIA,aAAW,GAAI,CAAC,CAAC,EAC7CL,EAAY,KAAU,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIK,aAAW,GAAI,CAAC,CAAC,EAClEL,EAAY,KAAU,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIK,aAAW,IAAK,CAAC,CAAC,EACnEL,EAAY,IAAM,GAChB,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIK,aAAW,IAAK,CAAC,CAAC,EAEnD,KAAK,IAAI,MAAM,QAAQ,KAAKJ,EAAIE,EAAIC,CAAE,EACjC,KAAA,IAAI,MAAM,QAAQ,KAAK,IAAIC,aAAW,EAAG,CAAC,CAAC,CACjD,CAOA,OAAOC,EAAa,CACd,KAAA,IAAI,OAAO,OAASA,CAC1B,CAIA,OAAQ,CACF,KAAA,IAAI,OAAO,OAChB,KAAK,IAAI,QACV,CAIA,QAAS,CACH,KAAA,IAAI,OAAO,OACjB,CAKA,MAAM,cAAcC,EAAkB,CACrC,MAAMC,EAAM,MAAMC,EAAAA,QAAQ,QAAQF,CAAQ,EACpCG,EAAY,IAAIzB,EAChBQ,EAAK,IAAIkB,SAAOH,CAAG,EACnBd,EAAK,IAAIiB,SAAOH,CAAG,EACnBb,EAAK,IAAIgB,SAAOH,CAAG,EACnBZ,EAAK,IAAIe,SAAOH,CAAG,EACtBf,EAAA,OAAO,IAAI,GAAK,EAAG,EACnBC,EAAA,OAAO,IAAI,GAAK,EAAG,EACnBC,EAAA,OAAO,IAAI,GAAK,EAAG,EACnBC,EAAA,OAAO,IAAI,GAAK,EAAG,EACtBH,EAAG,SAAW,KAAK,OAAO,EAAI,KAAK,GAAK,EACxCC,EAAG,SAAW,KAAK,OAAO,EAAI,KAAK,GAAK,EACxCC,EAAG,SAAW,KAAK,OAAO,EAAI,KAAK,GAAK,EACxCC,EAAG,SAAW,KAAK,OAAO,EAAI,KAAK,GAAK,EACxCc,EAAU,SAASjB,EAAIC,EAAIC,EAAIC,CAAE,EAC7B,KAAK,cAAmB,KAAA,cAAc,IAAI,KAAK,YAAY,EAC/D,KAAK,aAAec,EACpB,KAAK,IAAI,MAAM,SAAS,KAAK,YAAY,EACzC,KAAK,aAAa,MAAQ,CAC3B,CAEA,SAAU,CACT,KAAK,SAAS,aACd,KAAK,IAAI,OAAO,OAAO,KAAK,MAAM,CACnC,CACD,CC9LO,MAAME,UACJzB,CAET,CACS,QACR,aAAc,CACP,MAAAC,EAAS,SAAS,cAAc,QAAQ,EAC9C,MAAMA,CAAM,EACZ,KAAK,QAAUA,EACfA,EAAO,MAAM,cAAgB,OAC7BA,EAAO,MAAM,OAAS,IACvB,CACA,YAAa,CACZ,OAAO,KAAK,OACb,CACA,SAAU,CACT,MAAM,QAAQ,EACd,KAAK,QAAQ,QACd,CACD,CC5BO,MAAMyB,EAAgD,CAC5DC,EACAC,IACaD,EAAG,OAASC,EAAG,MAAQ,CAAC,GAAGD,CAAE,EAAE,MAAOE,GAAMD,EAAG,IAAIC,CAAC,CAAC,ECAnE,SAASC,EAAcD,EAAmB,CAEzC,MAAMZ,EAAK,UAEJ,OAAAY,EAAI,GACP,KAAK,IAAI,EAAIA,EAAG,CAAC,IAAMZ,EAAK,GAAK,EAAIY,EAAIZ,GAAO,GAChD,KAAK,IAAI,EAAIY,EAAI,EAAG,CAAC,IAAMZ,EAAK,IAAMY,EAAI,EAAI,GAAKZ,GAAM,GAAK,CACnE,CAEA,MAAMc,EAAQ,CAACpD,EAAaqD,EAAaC,IACxC,KAAK,IAAItD,EAAK,KAAK,IAAIqD,EAAKC,CAAG,CAAC,EAE1B,MAAMC,CAAgD,CAY5D,YAA6BC,EAA0B,CAA1B,KAAA,YAAAA,EAC5B,KAAK,QAAQ,UAAY,KAAK,YAAY,MAAM,QAAQ,cACnD,KAAA,QAAQ,YAAY,KAAK,IAAI,EAC7B,KAAA,QAAQ,YAAY,KAAK,IAAI,EAC7B,KAAA,QAAQ,YAAY,KAAK,IAAI,CACnC,CAhBQ,QAAuB,SAAS,cAAc,KAAK,EACnD,KAAoB,SAAS,cAAc,MAAM,EACjD,KAAoB,SAAS,cAAc,MAAM,EACjD,KAAoB,SAAS,cAAc,MAAM,EACjD,KAAO,EACP,IAAM,EACN,MAAQ,EACR,UAAY,GACZ,iBACA,YAAc,EACd,sBAAwB,KAOhC,YAAa,CACZ,OAAO,KAAK,OACb,CACA,aAAaC,EAAe,KAAK,KAAMC,EAAc,KAAK,IAAK,CAC9D,KAAK,KAAOD,EACZ,KAAK,IAAMC,EACX,KAAK,OAAO,CACb,CACA,aAAaC,EAA8B,CAC1C,KAAK,iBAAmBA,EACnB,KAAA,YAAcA,IAAY,CAAC,GAAK,CACtC,CACA,OAAOlC,EAAQ,EAAG,CACjB,KAAK,aAAeA,EACpB,IAAImC,EAAW,GAMf,GAJAA,GAAY,uBAAuB,KAAK,IAAI,OAAO,KAAK,GAAG,MAIvD,KAAK,iBAAkB,CAC1B,MAAMC,EACL,KAAK,iBAAiB,CAAC,EAAI,KAAK,iBAAiB,CAAC,EAC7CC,EAAkB,KAAK,YAAc,KAAK,iBAAiB,CAAC,EAClE,GAAIA,GAAmBD,EAAmB,CACzC,MAAME,EACLF,EACA,KAAK,KAAKA,EAAoB,KAAK,qBAAqB,EACzD,IAAI5B,EAAQ,EACR+B,EAAgB,EAGnB/B,GAAA,KAAK,IAAI,IAAM,KAAK,GAAM6B,EAAkBC,EAAmB,CAAC,EAC/D,GACD,EAEGD,EAAkB,MACrB7B,GAAS,EAAI,KAAK,KAAK,IAAO6B,GAAmB,IAAM,CAAC,GAGrDA,EAAkB,IACLE,EAAA,EACNF,EAAkB,MAC5BE,IAAkBF,EAAkB,KAAO,KAGxCD,EAAoBC,EAAkB,MACzC7B,GACC,EACAkB,GACE,KAAOU,EAAoBC,IAAoB,IAAM,CAAA,GAGrDD,EAAoBC,EAAkB,MACxBE,GAAAZ,EAChB,GACCS,EAAoBC,GAAmB,IACxC,CAAA,GAIM7B,EAAA,KAAK,IAAI,EAAGA,CAAK,EAEzB2B,GAAY,UAAU3B,CAAK,IAE3B,MAAMgC,EAAcb,EACnB,IACEU,EAAkB,EAAKD,EAAqB,IAC9C,CAAA,EAEKK,EAAcd,EACnB,KACGU,EAAkBD,EAAoB,GAAK,EAC7CA,EACA,IACD,CAAA,EAEKM,EAAcf,EACnB,KACGU,EAAmBD,EAAoB,EAAK,GAAK,EACnDA,EACA,IACD,CAAA,EAGI,KAAA,KAAK,MAAM,QAAU,GAAGT,EAC5B,EACA,KAAK,IAAI,EAAGY,EAAgBC,CAAW,EACvC,CACA,CAAA,GACI,KAAA,KAAK,MAAM,QAAU,GAAGb,EAC5B,EACA,KAAK,IAAI,EAAGY,EAAgBE,CAAW,EACvC,CACA,CAAA,GACI,KAAA,KAAK,MAAM,QAAU,GAAGd,EAC5B,EACA,KAAK,IAAI,EAAGY,EAAgBG,CAAW,EACvC,CACA,CAAA,EAAA,MAEWP,GAAA,YACP,KAAA,KAAK,MAAM,QAAU,IACrB,KAAA,KAAK,MAAM,QAAU,IACrB,KAAA,KAAK,MAAM,QAAU,GAC3B,MAEYA,GAAA,YACP,KAAA,KAAK,MAAM,QAAU,IACrB,KAAA,KAAK,MAAM,QAAU,IACrB,KAAA,KAAK,MAAM,QAAU,IAGfA,GAAA,IAER,KAAK,YAAcA,IACjB,KAAA,QAAQ,aAAa,QAASA,CAAQ,EAC3C,KAAK,UAAYA,EAEnB,CACA,SAAU,CACT,KAAK,QAAQ,QACd,CACD,CClJO,MAAMQ,CAAO,CACX,gBAAkB,EAClB,eAAiB,EACjB,YAAc,EACd,OAAgC,CAAA,EAChC,cACA,KACA,YAKA,cAMR,YAAYC,EAAkB,EAAG,CAChC,KAAK,eAAiBA,EACtB,KAAK,gBAAkB,KAAK,eACvB,KAAA,cAAgB,IAAM,KAAK,eAChC,KAAK,KAAO,IAAM,CACnB,CACQ,aAAc,CACrB,MAAMC,EAAO,KAAK,KAAK,KAAK,WAAW,EACvC,KAAK,YAAc,EACnB,KAAK,cAAgBC,EACpB,KAAK,gBACLD,EACA,KAAK,eACL,EACA,KAAK,MAAA,EAED,KAAA,KAAOE,EAAY,KAAK,aAAa,CAC3C,CACA,SAAU,CACT,OACC,KAAK,IAAI,KAAK,eAAiB,KAAK,eAAe,EAAI,KACvD,KAAK,KAAK,KAAK,WAAW,EAAI,KAC9B,KAAK,cAAgB,QACrB,KAAK,gBAAkB,MAEzB,CACA,YAAYC,EAAwB,CACnC,KAAK,eAAiBA,EACtB,KAAK,gBAAkBA,EAClB,KAAA,cAAgB,IAAM,KAAK,eAChC,KAAK,KAAO,IAAM,CACnB,CACA,OAAOhD,EAAQ,EAAG,CACjB,KAAK,aAAeA,EACpB,KAAK,gBAAkB,KAAK,cAAc,KAAK,WAAW,EACtD,KAAK,cACR,KAAK,YAAY,MAAQA,EACrB,KAAK,YAAY,MAAQ,GAC5B,KAAK,aAAa,CACjB,GAAG,KAAK,WAAA,CACR,GAGC,KAAK,gBACR,KAAK,cAAc,MAAQA,EACvB,KAAK,cAAc,MAAQ,GACzB,KAAA,kBAAkB,KAAK,cAAc,QAAQ,GAGhD,KAAK,WACH,KAAA,YAAY,KAAK,cAAc,CAEtC,CACA,aAAaiD,EAA+BC,EAAQ,EAAG,CAClDA,EAAQ,EACX,KAAK,YAAc,CAClB,GAAGD,EACH,KAAMC,CAAA,GAGP,KAAK,OAAS,CACb,GAAG,KAAK,OACR,GAAGD,CAAA,EAEJ,KAAK,YAAY,EAEnB,CACA,kBAAkBD,EAAwBE,EAAQ,EAAG,CAChDA,EAAQ,EACX,KAAK,cAAgB,CACpB,SAAUF,EACV,KAAME,CAAA,GAGP,KAAK,cAAgB,OACrB,KAAK,eAAiBF,EACtB,KAAK,YAAY,EAEnB,CACA,oBAAqB,CACpB,OAAO,KAAK,eACb,CACD,CAEA,SAASF,EACRK,EACAC,EACAC,EACAH,EAAiB,EACjBD,EACyB,CACnB,MAAAK,EAAOL,GAAQ,MAAQ,GACvBM,EAAYN,GAAQ,WAAa,IACjCO,EAAUP,GAAQ,SAAW,GAC7BQ,EAAOR,GAAQ,MAAQ,EACvBjD,EAAQqD,EAAKF,EACf,GAAAG,GAAQ,GAAOE,GAAW,EAAM,KAAK,KAAKD,EAAYE,CAAI,GAAI,CACjE,MAAMC,EAAoB,CAAC,KAAK,KAAKH,EAAYE,CAAI,EAC/CE,EAAW,CAACD,EAAoB1D,EAAQoD,EAC9C,OAAQQ,IACFA,GAAAV,EACDU,EAAI,EAAUT,EACXE,GAAMrD,EAAQ4D,EAAID,GAAY,KAAK,IAAMC,EAAIF,GACrD,KACM,CACN,MAAMG,EAAoB,KAAK,KAC9B,EAAMJ,EAAOF,EAAYC,GAAW,CAAA,EAE/BG,GACJH,EAAUxD,EAAQ,EAAMyD,EAAOL,GAAYS,EACvCC,EAAO,GAAMD,EAAqBJ,EAClCM,EAAK,EAAE,GAAMP,GAAWC,EAC9B,OAAQG,IACFA,GAAAV,EACDU,EAAI,EAAUT,EAEjBE,GACC,KAAK,IAAIO,EAAIE,CAAG,EAAI9D,EAAQ,KAAK,IAAI4D,EAAIE,CAAG,EAAIH,GAChD,KAAK,IAAMC,EAAIG,GAGnB,CACD,CAEA,SAASC,EAAWC,EAA0B,CAEtC,OAACxC,IAAewC,EAAExC,EAAI,IAAC,EAAIwC,EAAExC,EAAI,IAAC,IAAM,EAAI,KACpD,CAEA,SAASsB,EAAYkB,EAAmD,CACvE,OAAOD,EAAWC,CAAC,CACpB,CC3JA,MAAMC,EAAS,2CAUf,SAASC,EACRC,EACAC,EAAS,gBACTC,EAAO,kBACoB,CAC3B,MAAMC,EAAc,EAAIH,EAClBI,EAAeJ,EAAQG,EACvBE,GAAW,EAAID,GAAgB,EAC9B,MAAA,CACN,4BAA4BH,CAAM,IAAII,EAAU,GAAG,KAAKH,CAAI,KAC1DG,EAAUD,GAAgB,GAC5B,KACAA,EACAD,CAAA,CAEF,CAIO,SAASG,EAAgBtF,EAA0B,CACzD,OAAOA,EAAK,QAAUA,EAAK,WAAa,KAAQA,EAAK,KAAK,QAAU,CACrE,CAEO,MAAMuF,CAA8C,CAe1D,YACS5C,EACA6C,EAAuB,CAC9B,MAAO,CAAC,EACR,gBAAiB,GACjB,WAAY,GACZ,UAAW,EACX,QAAS,EACT,KAAM,GACN,OAAQ,EAAA,EAER,CAVO,KAAA,YAAA7C,EACA,KAAA,UAAA6C,EAUR,KAAK,QAAQ,aACZ,QACA,KAAK,YAAY,MAAM,QAAQ,SAAA,EAE5B,KAAK,UAAU,MAClB,KAAK,QAAQ,UAAU,IAAI,KAAK,YAAY,MAAM,QAAQ,WAAW,EAElE,KAAK,UAAU,QAClB,KAAK,QAAQ,UAAU,IAAI,KAAK,YAAY,MAAM,QAAQ,aAAa,EAExE,KAAK,QAAQ,YAAY,SAAS,cAAc,KAAK,CAAC,EACtD,KAAK,QAAQ,YAAY,SAAS,cAAc,KAAK,CAAC,EACtD,KAAK,QAAQ,YAAY,SAAS,cAAc,KAAK,CAAC,EACtD,MAAMC,EAAO,KAAK,QAAQ,SAAS,CAAC,EAC9BC,EAAQ,KAAK,QAAQ,SAAS,CAAC,EAC/BC,EAAQ,KAAK,QAAQ,SAAS,CAAC,EACrCF,EAAK,aAAa,QAAS,KAAK,YAAY,MAAM,QAAQ,aAAa,EACvEC,EAAM,aAAa,QAAS,KAAK,YAAY,MAAM,QAAQ,YAAY,EACvEC,EAAM,aAAa,QAAS,KAAK,YAAY,MAAM,QAAQ,YAAY,EACvE,KAAK,eAAe,EACpB,KAAK,aAAa,CACnB,CA/CQ,QAAuB,SAAS,cAAc,KAAK,EACnD,KAAO,EACP,IAAM,EACN,MAAQ,EACR,KAAO,EACP,MAAQ,EACR,cAA4B,CAAA,EAEpC,SAAqB,CAAC,EAAG,CAAC,EACjB,eAAiB,CACzB,KAAM,IAAIpC,EAAO,CAAC,EAClB,KAAM,IAAIA,EAAO,CAAC,EAClB,MAAO,IAAIA,EAAO,CAAC,CAAA,EAoCZ,UAAY,GACpB,QAAS,CACR,KAAK,UAAY,GACZ,KAAA,QAAQ,UAAU,IAAI,QAAQ,EACnC,MAAMkC,EAAO,KAAK,QAAQ,SAAS,CAAC,EAC/B,KAAA,cAAc,QAASzF,GAAS,CAC/BA,EAAA,kBAAkB,QAAS4F,GAAM,CACrCA,EAAE,YAAc,EAChBA,EAAE,aAAe,EACjBA,EAAE,KAAK,CAAA,CACP,CAAA,CACD,EACIH,EAAA,UAAU,IAAI,QAAQ,CAC5B,CACA,aAAgC,CAC3B,KAAK,QACH,KAAA,QAAQ,MAAM,QAAU,GACxB,KAAA,QAAQ,MAAM,WAAa,UAEjC,MAAMI,EAAyB,CAC9B,KAAK,QAAQ,YACb,KAAK,QAAQ,YAAA,EAEd,OAAI,KAAK,QACH,KAAA,QAAQ,MAAM,QAAU,OACxB,KAAA,QAAQ,MAAM,WAAa,IAE1BA,CACR,CACA,SAAU,CACT,KAAK,UAAY,GACZ,KAAA,QAAQ,UAAU,OAAO,QAAQ,EACtC,MAAMJ,EAAO,KAAK,QAAQ,SAAS,CAAC,EAC/B,KAAA,cAAc,QAASzF,GAAS,CAC/BA,EAAA,kBAAkB,QAAS4F,GAAM,CACjCA,EAAE,KAAO,eACZA,EAAE,aAAe,GACjBA,EAAE,KAAK,EACR,CACA,CAAA,CACD,EACIH,EAAA,UAAU,OAAO,QAAQ,CAC/B,CACA,QAAQ5F,EAAiB,CACxB,KAAK,UAAYA,EACb,KAAK,UAAU,KAClB,KAAK,QAAQ,UAAU,IAAI,KAAK,YAAY,MAAM,QAAQ,WAAW,EAErE,KAAK,QAAQ,UAAU,OAAO,KAAK,YAAY,MAAM,QAAQ,WAAW,EAErE,KAAK,UAAU,OAClB,KAAK,QAAQ,UAAU,IAAI,KAAK,YAAY,MAAM,QAAQ,aAAa,EAEvE,KAAK,QAAQ,UAAU,OACtB,KAAK,YAAY,MAAM,QAAQ,aAAA,EAGjC,KAAK,eAAe,EACpB,KAAK,aAAa,CACnB,CACA,SAAU,CACT,OAAO,KAAK,SACb,CACQ,MAAQ,GACR,UAAY,GACpB,MAAO,CACN,KAAK,MAAQ,GACb,KAAK,aAAa,CACnB,CACA,MAAO,CACN,KAAK,MAAQ,GACb,KAAK,aAAa,CACnB,CACA,cAAe,CACd,GAAI,KAAK,MAAO,CACX,KAAK,YAAc,kDACtB,KAAK,UAAY,gDACjB,KAAK,QAAQ,aACZ,QACA,+CAAA,GAGF,MACD,CACA,IAAIiG,EAAQ,uBAAuB,KAAK,eAAe,KAAK,oBAAoB,MAAM,KAAK,eAAe,KAAK,oBAAoB,aAAa,KAAK,eAAe,MAAM,oBAAoB,KAC1L,CAAC,KAAK,YAAY,gBAAgB,GAAK,KAAK,YACtCA,GAAA,oBAAoB,KAAK,KAAK,OAExCA,GAAS,eAAe,KAAK,IAAI,GAAI,KAAK,IAAI,CAAC,OAC3CA,IAAU,KAAK,YAClB,KAAK,UAAYA,EACZ,KAAA,QAAQ,aAAa,QAASA,CAAK,EAE1C,CACA,gBAAiB,CAChB,MAAML,EAAO,KAAK,QAAQ,SAAS,CAAC,EAC9BC,EAAQ,KAAK,QAAQ,SAAS,CAAC,EAC/BC,EAAQ,KAAK,QAAQ,SAAS,CAAC,EACrC,KAAK,cAAgB,GACrB,KAAK,UAAU,MAAM,QAAS3F,GAAS,CACtC,MAAM+F,EAAU/F,EAAK,KAAK,MAAM,KAAK,EAC/BgG,EAAgBD,EAAQ,OAAO,CAACE,EAAIC,IAAOD,EAAKC,EAAG,OAAQ,CAAC,EAClE,IAAIC,EAAM,EACFJ,EAAA,QAAQ,CAACK,EAAKC,IAAM,CACvBA,EAAI,GACP,KAAK,cAAc,KAAK,CACvB,KAAM,IACN,UAAW,EACX,QAAS,EACT,MAAO,EACP,OAAQ,EACR,SAAU,CAAC,EACX,kBAAmB,CAAC,EACpB,gBAAiB,EAAA,CACjB,EAEF,KAAK,cAAc,KAAK,CACvB,KAAMD,EACN,UACCpG,EAAK,WACHA,EAAK,QAAUA,EAAK,WAAagG,EAAiBG,EACrD,QACCnG,EAAK,WACHA,EAAK,QAAUA,EAAK,WAAagG,GACjCG,EAAMC,EAAI,QACb,MAAO,EACP,OAAQ,EACR,SAAU,CAAC,EACX,kBAAmB,CAAC,EACpB,gBAAiBd,EAAgBtF,CAAI,CAAA,CACrC,EACDmG,GAAOC,EAAI,MAAA,CACX,CAAA,CACD,EAED,MAAME,EAAkC,CAAA,EAClCC,EAA4B,CAAA,EAClC,SAASC,EAAaC,EAAe,CACpC,KAAOA,EAAQ,YACVA,EAAQ,WAAW,WAAa,KAAK,aACvBH,EAAA,KAAKb,EAAK,UAAyB,EAC5CgB,EAAQ,WAAW,WAAa,KAAK,WAC3BF,EAAA,KAAKd,EAAK,UAAkB,EACvCgB,EAAA,YAAYA,EAAQ,UAAU,EACtCD,EAAaC,EAAQ,UAAU,CAEjC,CACAD,EAAaf,CAAI,EACjB,IAAIiB,EAAqC,KACpC,KAAA,cAAc,QAAS1G,GAAS,CACpC,GAAIA,EAAK,KAAK,KAAK,EAAE,OAAS,EAC7B,GAAIA,EAAK,gBAAiB,CACzB,MAAMC,EACLqG,EAAiB,IAAA,GAAS,SAAS,cAAc,MAAM,EACxDrG,EAAO,UAAY,YACdD,EAAA,SAAW,CAACC,CAAM,EACZ,UAAA0G,KAAK3G,EAAK,KAAM,CAC1B,MAAM4G,EACLN,EAAiB,IAAA,GAAS,SAAS,cAAc,MAAM,EACxDM,EAAO,UAAY,GACnBA,EAAO,UAAYD,EACnB1G,EAAO,YAAY2G,CAAM,EACpB5G,EAAA,SAAS,KAAK4G,CAAM,CAC1B,CAGA,GAFK5G,EAAA,kBAAoB,KAAK,uBAAuBA,CAAI,EACzD,QAAQ,IAAIA,EAAK,KAAM8E,EAAO,KAAK9E,EAAK,IAAI,CAAC,EACzC0G,GAAc,CAAC5B,EAAO,KAAK9E,EAAK,IAAI,EACnC,GAAA0G,EAAW,kBAAoB,EAClCA,EAAW,YAAYzG,CAAM,MACvB,CACN,MAAM4G,EACLP,EAAiB,IAAA,GAAS,SAAS,cAAc,MAAM,EACxDO,EAAY,UAAY,GACxBH,EAAW,OAAO,EAClBG,EAAY,YAAYH,CAAU,EAClCG,EAAY,YAAY5G,CAAM,EAC9BwF,EAAK,YAAYoB,CAAW,EACfH,EAAAG,CACd,MAEAH,EAAa5B,EAAO,KAAK9E,EAAK,IAAI,EAAI,KAAOC,EAC7CwF,EAAK,YAAYxF,CAAM,CACxB,KACM,CACN,MAAMA,EACLqG,EAAiB,IAAA,GAAS,SAAS,cAAc,MAAM,EAKxD,GAJArG,EAAO,UAAY,GACnBA,EAAO,UAAYD,EAAK,KACnBA,EAAA,SAAW,CAACC,CAAM,EACvBD,EAAK,kBAAkB,KAAK,KAAK,mBAAmBA,EAAMC,CAAM,CAAC,EAC7DyG,EACC,GAAAA,EAAW,kBAAoB,EAClCA,EAAW,YAAYzG,CAAM,MACvB,CACN,MAAM4G,EACLP,EAAiB,IAAA,GAAS,SAAS,cAAc,MAAM,EACxDO,EAAY,UAAY,GACxBH,EAAW,OAAO,EAClBG,EAAY,YAAYH,CAAU,EAClCG,EAAY,YAAY5G,CAAM,EAC9BwF,EAAK,YAAYoB,CAAW,EACfH,EAAAG,CACd,MAEaH,EAAAzG,EACbwF,EAAK,YAAYxF,CAAM,CAEzB,SACUD,EAAK,KAAK,OAAS,EAAG,CAChC,MAAMC,EAASsG,EAAkB,IAAA,GAAS,SAAS,eAAe,GAAG,EACrEd,EAAK,YAAYxF,CAAM,EACVyG,EAAA,IAAA,MAEAA,EAAA,IACd,CACA,EACKhB,EAAA,UAAY,KAAK,UAAU,gBAC3BC,EAAA,UAAY,KAAK,UAAU,UAClC,CACQ,mBAAmB3F,EAAiBC,EAAyB,CACpE,MAAM6D,EAAQ9D,EAAK,UAAY,KAAK,UAAU,UACxC8G,EAAW,KAAK,IAAI,IAAM9G,EAAK,QAAUA,EAAK,SAAS,EACvD,EAAIC,EAAO,QAChB,CACC,CACC,UAAW,iBACZ,EACA,CACC,UAAW,iBACZ,CACD,EACA,CACC,SAAU,SAAS6G,CAAQ,EAAIA,EAAW,EAC1C,MAAO,SAAShD,CAAK,EAAIA,EAAQ,EACjC,GAAI,aACJ,UAAW,MACX,KAAM,MACP,CAAA,EAED,SAAE,MAAM,EACD,CACR,CACQ,uBAAuB9D,EAA6B,CAC3D,MAAM8D,EAAQ9D,EAAK,UAAY,KAAK,UAAU,UACxC8G,EAAW9G,EAAK,QAAUA,EAAK,UACrC,OAAOA,EAAK,SAAS,IAAI,CAAC+G,EAAIV,EAAGW,IAAQ,CACxC,GAAIX,IAAM,EACF,OAAA,KAAK,mBAAmBrG,EAAM+G,CAAE,EACjC,CACN,MAAMnB,EAAImB,EAAG,QACZ,CACC,CACC,OAAQ,EACR,UAAW,2BACX,OAAQ,iDACT,EACA,CACC,OAAQ,GACR,UAAW,4BACX,OAAQ,sDACT,EACA,CACC,OAAQ,EACR,UAAW,yBACX,OAAQ,iDACT,CACD,EACA,CACC,SAAU,KAAK,IAAI,IAAM/G,EAAK,QAAUA,EAAK,SAAS,EACtD,MAAO8D,EAASgD,GAAYE,EAAI,OAAS,IAAOX,EAAI,GACpD,GAAI,YACJ,WAAY,EACZ,UAAW,UACX,KAAM,MACP,CAAA,EAED,OAAAT,EAAE,MAAM,EACDA,CACR,CAAA,CACA,CACF,CACA,iBAAkB,CACb,KAAK,QACH,KAAA,QAAQ,MAAM,QAAU,GACxB,KAAA,QAAQ,MAAM,WAAa,UAE5B,KAAA,cAAc,QAAS5F,GAAS,CAC9B,MAAAC,EAASD,EAAK,SAAS,CAAC,EAC9B,GAAIC,EAAQ,CACXD,EAAK,MAAQC,EAAO,YACpBD,EAAK,OAASC,EAAO,aACrB,KAAM,CAACgH,EAAWC,EAAe/B,CAAW,EAAIJ,EAC/C,GAAK/E,EAAK,MACV,mBACA,kBAAA,EAEKmH,EAAiB,GAAGhC,EAAc,GAAG,SACvC,KAAK,YAAY,kBACpBlF,EAAO,MAAM,UAAYgH,EACzBhH,EAAO,MAAM,WAAa,OAC1BA,EAAO,MAAM,SAAWkH,IAExBlH,EAAO,MAAM,gBAAkBgH,EAC/BhH,EAAO,MAAM,iBAAmB,OAChCA,EAAO,MAAM,eAAiBkH,GAEzB,MAAAC,EAAIpH,EAAK,MAAQ,GACjBqH,EAAU,SAAS,CAACD,CAAC,WAAW,CAACA,CAAC,mCACvCpH,EAAK,SACN,KACCoH,EAAI,KAAK,IAAIpH,EAAK,QAAUA,EAAK,SAAS,CAC3C,yBAEAC,EAAO,MAAM,aAAeoH,EAC5BpH,EAAO,MAAM,mBAAqBoH,CACnC,CAAA,CACA,EACG,KAAK,QACH,KAAA,QAAQ,MAAM,QAAU,OACxB,KAAA,QAAQ,MAAM,WAAa,GAElC,CACA,YAAa,CACZ,OAAO,KAAK,OACb,CACA,aACCzE,EAAe,KAAK,KACpBC,EAAc,KAAK,IACnBzB,EAAgB,KAAK,MACrBkG,EAAU,EACVC,EAAO,EACPC,EAAQ,GACR1D,EAAQ,EACP,CACD,KAAK,KAAOlB,EACZ,KAAK,IAAMC,EACX,KAAK,MAAQzB,EACR,KAAA,MAAS0C,EAAQ,IAAQ,EAC9B,MAAM2B,EAAO,KAAK,QAAQ,SAAS,CAAC,EAC/BA,EAAA,MAAM,QAAU,GAAG6B,CAAO,GAC3BE,GAAS,CAAC,KAAK,YAAY,mBAC9B,KAAK,KAAO,KAAK,IAAI,GAAID,CAAI,EACzBC,GACH,KAAK,QAAQ,UAAU,IACtB,KAAK,YAAY,MAAM,QAAQ,oBAAA,EAE5B,KAAA,eAAe,KAAK,YAAY5E,CAAI,EACpC,KAAA,eAAe,KAAK,YAAYC,CAAG,EACnC,KAAA,eAAe,MAAM,YAAYzB,CAAK,EACtC,KAAK,YAAY,gBAAgB,EACjC,KAAK,aAAa,EADkB,KAAK,KAAK,EAE/CoG,GACH,sBAAsB,IAAM,CAC3B,KAAK,QAAQ,UAAU,OACtB,KAAK,YAAY,MAAM,QAAQ,oBAAA,CAChC,CACA,IAEF,KAAK,eAAe,KAAK,kBAAkB5E,EAAMkB,CAAK,EACtD,KAAK,eAAe,KAAK,kBAAkBjB,EAAKiB,CAAK,EAChD,KAAA,eAAe,MAAM,kBAAkB1C,CAAK,EAC7C,KAAK,OAAS,KAAK,IAAI,GAAImG,CAAI,IAClC,KAAK,KAAO,KAAK,IAAI,GAAIA,CAAI,EACxB,KAAA,QAAQ,MAAM,OAAS,QAAQ,KAAK,IAAI,GAAIA,CAAI,CAAC,OAGzD,CACA,OAAO3G,EAAQ,EAAG,CACZ,KAAK,YAAY,gBAAgB,IACjC,KAAA,eAAe,KAAK,OAAOA,CAAK,EAChC,KAAA,eAAe,KAAK,OAAOA,CAAK,EAChC,KAAA,eAAe,MAAM,OAAOA,CAAK,EAClC,KAAK,UACR,KAAK,KAAK,EAEV,KAAK,KAAK,EAEZ,CACA,IAAI,WAAY,CACf,MAAM6G,EAAI,KAAK,eAAe,KAAK,mBAAmB,EAChD,EAAI,KAAK,eAAe,KAAK,mBAAmB,EAChDC,EAAID,EAAI,KAAK,SAAS,CAAC,EACvBE,EAAI,EAAI,KAAK,SAAS,CAAC,EACvBC,EAAK,KAAK,YAAY,IAAI,CAAC,EAC3BC,EAAK,KAAK,YAAY,IAAI,CAAC,EAC3BC,EAAK,KAAK,YAAY,IAAI,CAAC,EAAI,KAAK,YAAY,KAAK,CAAC,EACtDC,EAAK,KAAK,YAAY,IAAI,CAAC,EAAI,KAAK,YAAY,KAAK,CAAC,EAC5D,MAAO,EAAEN,EAAIK,GAAM,EAAIC,GAAML,EAAIE,GAAMD,EAAIE,EAC5C,CACA,SAAgB,CACf,KAAK,QAAQ,QACd,CACD,CChdA,MAAMG,EAAMC,EAAAA,OAAOC,EAAA,CAAQ,EAOpB,MAAMC,UAAoB,WAA8C,CACtE,QAAuB,SAAS,cAAc,KAAK,EACnD,YAAc,EACd,WAA0B,CAAA,EAC1B,eAA8B,CAAA,EAC9B,aAA8B,CAAA,EAC9B,mBAAyD,IACzD,aAA4B,IAC5B,kBAAiC,IACjC,cAAgB,EAChB,eAAiC,IAAI,eAAgB,GAAM,CAC5D,MAAAC,EAAO,EAAE,CAAC,EAAE,YACb,KAAA,KAAK,CAAC,EAAIA,EAAK,MACf,KAAA,KAAK,CAAC,EAAIA,EAAK,OACf,KAAA,IAAI,CAAC,EAAIA,EAAK,KACd,KAAA,IAAI,CAAC,EAAIA,EAAK,IACnB,KAAK,aAAa,EAClB,KAAK,WAAW,EAAI,EACpB,KAAK,aAAa,QAASrB,GAAOA,EAAG,iBAAiB,CAAA,CACtD,EACO,iBAA0C,CACjD,KAAM,EACN,QAAS,GACT,UAAW,GAAA,EAEJ,iBAA0C,CACjD,KAAM,EACN,QAAS,GACT,UAAW,GAAA,EAEJ,kBAA2C,CAClD,KAAM,EACN,QAAS,GACT,UAAW,GAAA,EAEJ,WAAa,GACb,cACA,kBAAsC,CAAC,EAAG,CAAC,EAC1C,mBAAqB,IAAI,SAAS,iBAAkB,cAAc,EAClE,iBAAmB,IAAI,SAAS,aAAc,MAAM,EACrD,cAAgB,GAChB,YAAyC,GACxC,KAAyB,CAAC,EAAG,CAAC,EAC9B,IAAwB,CAAC,EAAG,CAAC,EAQtC,gBAAgBsB,EAAS,GAAM,CAC9B,KAAK,cAAgB,CAACA,EAClBA,EACH,KAAK,QAAQ,UAAU,OAAO,KAAK,MAAM,QAAQ,aAAa,EAE9D,KAAK,QAAQ,UAAU,IAAI,KAAK,MAAM,QAAQ,aAAa,EAE5D,KAAK,WAAW,EAAI,CACrB,CAKA,iBAAkB,CACjB,MAAO,CAAC,KAAK,aACd,CACgB,MAAQL,EAAI,iBAAiB,CAC5C,YAAa,CACZ,WAAY,OACZ,QAAS,OACT,UAAW,aACX,SAAU,iBACV,WAAY,OACZ,MAAO,OACP,OAAQ,OACR,SAAU,SACV,SAAU,OACV,UAAW,OACX,OAAQ,EACR,MAAO,+BACP,aAAc,eACd,QAAS,QACV,EACA,UAAW,CACV,SAAU,WACV,gBAAiB,OACjB,SAAU,MACV,QAAS,sBACT,QAAS,UACT,WAAY,eACZ,OAAQ,sBACT,EACA,6BAA8B,CAC7B,UAAW,CACV,SAAU,MACV,QAAS,sBACT,OAAQ,SACT,CACD,EACA,cAAe,CACd,UAAW,QACX,gBAAiB,OAClB,EACA,YAAa,CACZ,QAAS,EACT,SAAU,iBACV,WAAY,gBACZ,WAAY,CACX,WAAY,sBACZ,QAAS,CACV,CACD,EACA,cAAe,CACd,WAAY,qBACZ,OAAQ,QACR,QAAS,OACT,SAAU,CACT,QAAS,eACT,OAAQ,QACR,QAAS,MACV,EACA,WAAY,CACX,WAAY,WACZ,UAAW,WACX,SAAU,IACV,cAAe,CACd,OAAQ,QACR,QAAS,OACT,eAAgB,cAChB,YAAa,MACd,CACD,CACD,EACA,aAAc,CACb,SAAU,iBACV,QAAS,EACV,EACA,cAAe,CACd,QAAS,CACR,WAAY,8BACb,CACD,EACA,cAAe,CACd,OAAQ,kBACR,gBAAiB,SACjB,MAAO,cACP,QAAS,SACT,SAAU,WACV,QAAS,OACT,IAAK,SACL,QAAS,CACR,MAAO,OACP,QAAS,eACT,aAAc,MACd,YAAa,QACb,gBAAiB,+BACjB,YAAa,KACd,EACA,SAAU,CACT,MAAO,OACP,gBAAiB,QAClB,CACD,EACA,2CAA4C,CAC3C,aAAc,CACb,QAAS,EACV,CACD,EACA,qBAAsB,CACrB,WAAY,iBACb,CAAA,CACA,EACO,WAAa,IAAM,CAC1B,KAAK,WAAW,EAAI,CAAA,EAErB,aAAc,CACP,QACD,KAAA,cAAgB,IAAItF,EAAc,IAAI,EAC3C,KAAK,QAAQ,aAAa,QAAS,KAAK,MAAM,QAAQ,WAAW,EAC7D,KAAK,eACR,KAAK,QAAQ,UAAU,IAAI,KAAK,MAAM,QAAQ,aAAa,EAE5D,KAAK,aAAa,EACb,KAAA,eAAe,QAAQ,KAAK,OAAO,EACxC,KAAK,QAAQ,YAAY,KAAK,cAAc,YAAY,EACxD,KAAK,MAAM,SACN,KAAA,cAAc,aAAa,EAAG,GAAG,EAC/B,OAAA,iBAAiB,WAAY,KAAK,UAAU,CACpD,CASA,qBAA4D,CACvD,GAAA,KAAK,cAAc,KAAO,EAAU,OAClC,MAAA4F,EAAc,KAAK,YAAc,GACjCjC,EAAI,KAAK,cACf,GAAIA,IAAM,GACT,GAAI,KAAK,eAAe,CAAC,GAAG,WACvB,KAAK,eAAe,CAAC,EAAE,UAAYiC,EACtC,MAAO,CAAC,EAAG,KAAK,eAAe,CAAC,EAAE,UAAW,EAAE,UAIjD,KAAK,eAAejC,CAAC,GAAG,SACxB,KAAK,eAAeA,EAAI,CAAC,GAAG,WAG3B,KAAK,eAAeA,EAAI,CAAC,EAAE,UAAYiC,GACvC,KAAK,eAAejC,CAAC,EAAE,QAAUiC,EAE1B,MAAA,CACN,KAAK,eAAejC,CAAC,EAAE,QACvB,KAAK,eAAeA,EAAI,CAAC,EAAE,UAC3BA,CAAA,CAKJ,CAMA,cAAe,CACd,IAAIP,EAAQ,GACHA,GAAA,6BACTA,GAAS,KAAK,QAAQ,YACbA,GAAA,MACAA,GAAA,8BACTA,GAAS,KAAK,QAAQ,aACbA,GAAA,MACAA,GAAA,2BACAA,GAAA,WACAA,GAAA,sBACTA,GAAS,KAAK,YACLA,GAAA,IACJ,KAAA,QAAQ,aAAa,QAASA,CAAK,CACzC,CAKA,cAAcuC,EAAiB,CAC1B,KAAK,aAAeA,IACxB,KAAK,WAAaA,EAClB,KAAK,WAAW,EACjB,CAKA,cAAcE,EAAoB,CACjC,KAAK,WAAaA,EAClB,MAAMC,EAAa,IACnB,KAAK,eAAiBD,EACpB,OACC1I,GACAA,EAAK,MAAM,OAAO,CAACoG,EAAIC,IAAOD,EAAKC,EAAG,KAAK,KAAA,EAAO,OAAQ,CAAC,EAAI,CAEhE,EAAA,IAAI,CAACrG,EAAMwG,EAAGkC,IAAU,CACxB,GAAI1I,EAAK,KACD,MAAA,CACN,GAAGA,CAAA,EAEA,CACE,MAAA4I,EAAWF,EAAMlC,EAAI,CAAC,EACtBqC,EAAWH,EAAMlC,EAAI,CAAC,EACxB,GAAAoC,GAAU,MAAQC,GACjB,GAAAA,EAAS,QAAU7I,EAAK,UACpB,MAAA,CACN,GAAGA,EACH,UACC,KAAK,IAAI6I,EAAS,QAAS7I,EAAK,UAAY2I,CAAU,GACtD3I,EAAK,SAAA,UAGE4I,GAAU,SAChBA,EAAS,QAAU5I,EAAK,UACpB,MAAA,CACN,GAAGA,EACH,UACC,KAAK,IAAI4I,GAAU,QAAS5I,EAAK,UAAY2I,CAAU,GACvD3I,EAAK,SAAA,EAIF,MAAA,CACN,GAAGA,CAAA,CAEL,CAAA,CACA,EACF,KAAK,eAAe,QAAQ,CAACA,EAAMwG,EAAGkC,IAAU,CACzC,MAAAI,EAAWJ,EAAMlC,EAAI,CAAC,EACtBhG,EAAWR,EAAK,MAAMA,EAAK,MAAM,OAAS,CAAC,EAC7CQ,GAAYiF,EAAgBjF,CAAQ,IACnCsI,EACCA,EAAS,UAAY9I,EAAK,UAC7BA,EAAK,QAAU,KAAK,IAAIA,EAAK,QAAU,KAAM8I,EAAS,SAAS,GAG3D9I,EAAA,QAAUA,EAAK,QAAU,KAEhC,CACA,EACD,KAAK,eAAe,QAAQ,CAACA,EAAMwG,EAAGkC,IAAU,CAC/C,GAAI1I,EAAK,KAAM,OACT,MAAA8I,EAAWJ,EAAMlC,EAAI,CAAC,EACxBsC,GAAU,OACbA,EAAS,UAAY,KAAK,IAAIA,EAAS,UAAW9I,EAAK,SAAS,EACjE,CACA,EACD,KAAK,aAAa,QAASkH,GAAOA,EAAG,SAAS,EACzC,KAAA,aAAe,KAAK,eAAe,IACtClH,GAAS,IAAI0F,EAAY,KAAM1F,CAAI,CAAA,EAEhC,KAAA,aAAa,QAASkH,GAAO,CACjC,KAAK,QAAQ,YAAYA,EAAG,WAAY,CAAA,EACxCA,EAAG,gBAAgB,CAAA,CACnB,EACI,KAAA,wBAAwB,CAAA,CAAE,EAC1B,KAAA,wBAAwB,CAAA,CAAE,EAC1B,KAAA,yBAAyB,CAAA,CAAE,EAC3B,KAAA,eAAe,EAAG,EAAI,EAC3B,KAAK,WAAW,EAAI,CACrB,CAeA,WAAW6B,EAAS,GAAO,CACtBA,IACE,KAAA,aAAa,QAAS7B,GAAO,CAC3B,MAAAlB,EAAyBkB,EAAG,cAC7B,KAAA,eAAe,IAAIA,EAAIlB,CAAI,EAChCkB,EAAG,SAAWlB,CAAA,CACd,EACD,KAAK,kBAAkB,CAAC,EAAI,KAAK,cAAc,WAAa,EAAA,YAC5D,KAAK,kBAAkB,CAAC,EAAI,KAAK,cAAc,WAAa,EAAA,cAE7D,MAAMgD,EAAe,IAQrB,IAAIC,EAAS,CAPQ,KAAK,aACxB,MAAM,EAAG,KAAK,aAAa,EAC3B,OACA,CAACC,EAAKhC,IACLgC,GAAOhC,EAAG,QAAQ,EAAE,KAAO,EAAI,KAAK,eAAe,IAAIA,CAAE,IAAI,CAAC,GAAK,GACpE,CAAA,EAGE,GAAA,KAAK,cAAgB,SAAU,CACxB+B,GAAA,KAAK,QAAQ,aAAe,EACtC,MAAME,EAAU,KAAK,aAAa,KAAK,aAAa,EACpD,GAAIA,EAAS,CACZ,MAAMC,EAAa,KAAK,eAAe,IAAID,CAAO,IAAI,CAAC,GAAK,EAC5DF,GAAUG,EAAa,CACxB,CACU,SAAA,OAAO,KAAK,aAAgB,SAAU,CACtCH,GAAA,KAAK,QAAQ,aAAe,KAAK,YAC3C,MAAME,EAAU,KAAK,aAAa,KAAK,aAAa,EACpD,GAAIA,EAAS,CACZ,MAAMC,EAAa,KAAK,eAAe,IAAID,CAAO,IAAI,CAAC,GAAK,EAC5DF,GAAUG,EAAa,CACxB,CACD,CACM,MAAAnG,EAAY,KAAK,sBACvB,IAAIE,EAAoB,EACxB,GAAIF,IACHE,EAAoBF,EAAU,CAAC,EAAIA,EAAU,CAAC,EAC1CE,GAAqB,KAAM,CAC9B,MAAM2F,EAAW,KAAK,aAAa7F,EAAU,CAAC,EAAI,CAAC,EAC/C6F,IACHG,GAAU,KAAK,eAAe,IAAIH,CAAQ,IAAI,CAAC,GAAK,EAEtD,CAED,MAAMO,EAAc,KAAK,IAAI,GAAG,KAAK,aAAa,EAClD,IAAIpF,EAAQ,EACRqF,EAAU,GACd,KAAK,aAAa,QAAQ,CAACpC,EAAIV,IAAM,CACpC,MAAM+C,EAAc,KAAK,cAAc,IAAI/C,CAAC,EACtCgD,EACLD,GAAgB/C,GAAK,KAAK,eAAiBA,EAAI6C,EAC1CrJ,EAAOkH,EAAG,UAChB,IAAInE,EAAO,EACP/C,EAAK,SACD+C,EAAA,KAAK,KAAK,CAAC,GAAK,KAAK,eAAe,IAAImE,CAAE,IAAI,CAAC,GAAK,IAG3D,CAACoC,GACDnG,GAAqB,MACnBqD,IAAM,KAAK,eAAiBvD,IAAY,CAAC,IAAM,IAChDuD,IAAM,KAAK,cAAgB,KAElB8C,EAAA,GACL,KAAA,cAAc,aAAa,EAAGL,CAAM,EACrChG,GACE,KAAA,cAAc,aAAa,CAACA,EAAU,CAAC,EAAGA,EAAU,CAAC,CAAC,CAAC,EAEnDgG,GAAA,KAAK,kBAAkB,CAAC,GAEhC/B,EAAA,aACFnE,EACAkG,EACAO,EAAW,EAAIR,EACfO,EAAc,EAAI,EAAI,EACtB,KAAK,WACF,GACCC,EACC,EACA,GACChD,EAAI,KAAK,cACR,KAAK,IAAI,KAAK,cAAgBA,CAAC,EAC/B,KAAK,IAAIA,EAAI,KAAK,IAAI,KAAK,cAAe6C,CAAW,CAAC,IAC1D,EACHN,EACA9E,CAAA,EAEGjE,EAAK,MAAQwJ,EAChBP,GAAU,KAAK,eAAe,IAAI/B,CAAE,IAAI,CAAC,GAAK,EACnClH,EAAK,OAChBiJ,GAAU,KAAK,eAAe,IAAI/B,CAAE,IAAI,CAAC,GAAK,GAE3C+B,GAAU,IACJhF,GAAA,IACV,CACA,CACF,CAOA,gBAAiB,CAChB,OAAO,KAAK,WACb,CAOA,eAAgB,CACf,OAAO,KAAK,UACb,CACA,YAA0B,CACzB,OAAO,KAAK,OACb,CASA,eAAewF,EAAwC,CACtD,KAAK,YAAcA,CACpB,CAQA,eAAeC,EAAcC,EAAS,GAAO,CAU5C,KAAK,YAAcD,EACnB,KAAK,QAAQ,MAAM,YAAY,qBAAsB,GAAGA,CAAI,EAAE,EACxD,MAAAE,MAAoB,IACpBC,MAAiB,IACjBC,MAAe,IAGhB,KAAA,SAAS,QAASC,GAAc,CAC9B,MAAA/J,EAAO,KAAK,eAAe+J,CAAS,EAC1C,GAAI,CAAA/J,EAAK,KACT,GAAIA,EAAM,CACT,MAAM8I,EAAW,KAAK,eAAeiB,EAAY,CAAC,EAClD,GAAIjB,GAAU,KAAM,CACnB,MAAMkB,EAAY,KAAK,IAAIhK,EAAK,UAAW8I,GAAU,SAAS,EACxDmB,EAAU,KAAK,IAAIjK,EAAK,QAAS8I,GAAU,OAAO,GACpDkB,EAAYN,GAAQO,GAAWP,KAC7B,KAAA,SAAS,OAAOK,CAAS,EAC9BH,EAAc,IAAIG,CAAS,EACtB,KAAA,SAAS,OAAOA,EAAY,CAAC,EACpBH,EAAA,IAAIG,EAAY,CAAC,EAC3BJ,IACE,KAAA,aAAaI,CAAS,EAAE,QAAQ,EACrC,KAAK,aAAaA,EAAY,CAAC,EAAE,QAAQ,GAE3C,MACU/J,EAAK,UAAY0J,GAAQ1J,EAAK,SAAW0J,KAC9C,KAAA,SAAS,OAAOK,CAAS,EAC9BH,EAAc,IAAIG,CAAS,EACvBJ,GAAa,KAAA,aAAaI,CAAS,EAAE,QAAQ,EAClD,MAEK,KAAA,SAAS,OAAOA,CAAS,EAC9BH,EAAc,IAAIG,CAAS,EACvBJ,GAAa,KAAA,aAAaI,CAAS,EAAE,QAAQ,CAClD,CACA,EACD,KAAK,eAAe,QAAQ,CAAC/J,EAAMH,EAAIsH,IAAQ,CAC1C,CAACnH,EAAK,MAAQA,EAAK,WAAa0J,GAAQ1J,EAAK,QAAU0J,IACrD,KAAK,SAAS,IAAI7J,CAAE,IACnB,KAAA,SAAS,IAAIA,CAAE,EACpBiK,EAAS,IAAIjK,CAAE,EACX8J,GAAa,KAAA,aAAa9J,CAAE,EAAE,OAAO,EACrCsH,EAAItH,EAAK,CAAC,GAAG,OACX,KAAA,SAAS,IAAIA,EAAK,CAAC,EACfiK,EAAA,IAAIjK,EAAK,CAAC,EACf8J,GAAQ,KAAK,aAAa9J,EAAK,CAAC,EAAE,OAAO,IAGhD,CACA,EACI,KAAA,cAAc,QAASqK,GAAM,CAC5B,KAAK,SAAS,IAAIA,CAAC,IACvBL,EAAW,IAAIK,CAAC,EACZP,GAAa,KAAA,aAAaO,CAAC,EAAE,QAAQ,EAC1C,CACA,EACGP,GACC,KAAK,cAAc,KAAO,EAC7B,KAAK,cAAgB,KAAK,IAAI,GAAG,KAAK,aAAa,EAE9C,KAAA,cAAgB,KAAK,eAAe,UACvC3J,GAASA,EAAK,WAAa0J,CAAA,EAG9B,KAAK,cAAc,QACd,KAAA,SAAS,QAASQ,GAAM,KAAK,cAAc,IAAIA,CAAC,CAAC,EACtD,KAAK,WAAW,EAAI,IACVL,EAAW,KAAO,GAAKC,EAAS,KAAO,KAC7CD,EAAW,OAAS,GAAKC,EAAS,KAAO,GACnCA,EAAA,QAASI,GAAM,CAClB,KAAA,cAAc,IAAIA,CAAC,EACnB,KAAA,aAAaA,CAAC,EAAE,OAAO,CAAA,CAC5B,EACD,KAAK,cAAgB,KAAK,IAAI,GAAG,KAAK,aAAa,GACzCJ,EAAS,OAAS,GAAKD,EAAW,KAAO,EAC/CxH,EAAMwH,EAAY,KAAK,aAAa,GAClC,KAAA,cAAc,QAASK,GAAM,CAC5B,KAAK,SAAS,IAAIA,CAAC,IAClB,KAAA,cAAc,OAAOA,CAAC,EACtB,KAAA,aAAaA,CAAC,EAAE,QAAQ,EAC9B,CACA,GAGOJ,EAAA,QAASI,GAAM,CAClB,KAAA,cAAc,IAAIA,CAAC,EACnB,KAAA,aAAaA,CAAC,EAAE,OAAO,CAAA,CAC5B,EACUL,EAAA,QAASK,GAAM,CACpB,KAAA,cAAc,OAAOA,CAAC,EACtB,KAAA,aAAaA,CAAC,EAAE,QAAQ,CAAA,CAC7B,EACG,KAAK,cAAc,KAAO,IAC7B,KAAK,cAAgB,KAAK,IAAI,GAAG,KAAK,aAAa,IAErD,KAAK,WAAW,EAElB,CAOA,OAAOnJ,EAAQ,EAAG,CACjB,MAAMoJ,EAASpJ,EAAQ,IAClB,KAAA,cAAc,OAAOA,CAAK,EAC/B,KAAK,aAAa,QAASf,GAASA,EAAK,OAAOmK,CAAM,CAAC,CACxD,CAMA,wBAAwBnG,EAA+B,CACtD,KAAK,iBAAmB,CACvB,GAAG,KAAK,iBACR,GAAGA,CAAA,EAEJ,KAAK,aAAa,QAAShE,GAC1BA,EAAK,eAAe,KAAK,aAAa,KAAK,gBAAgB,CAAA,CAE7D,CAMA,wBAAwBgE,EAA+B,CACtD,KAAK,iBAAmB,CACvB,GAAG,KAAK,iBACR,GAAGA,CAAA,EAEJ,KAAK,aAAa,QAAShE,GAC1BA,EAAK,eAAe,KAAK,aAAa,KAAK,gBAAgB,CAAA,CAE7D,CAMA,yBAAyBgE,EAA+B,CACvD,KAAK,kBAAoB,CACxB,GAAG,KAAK,kBACR,GAAGA,CAAA,EAEJ,KAAK,aAAa,QAAShE,GAC1BA,EAAK,eAAe,MAAM,aAAa,KAAK,iBAAiB,CAAA,CAE/D,CACA,SAAgB,CACf,KAAK,QAAQ,SACb,KAAK,eAAe,aACpB,KAAK,MAAM,SACX,KAAK,aAAa,QAASkH,GAAOA,EAAG,SAAS,EACvC,OAAA,oBAAoB,WAAY,KAAK,UAAU,CACvD,CACD"}
1
+ {"version":3,"file":"amll-core.js","sources":["../src/lyric/ttml.ts","../src/bg-render/pixi-renderer.ts","../src/bg-render/index.ts","../src/utils/eq-set.ts","../src/lyric-player/interlude-dots.ts","../src/utils/spring.ts","../src/lyric-player/lyric-line.ts","../src/lyric-player/index.ts"],"sourcesContent":["import { LyricLine, LyricWord } from \"../interfaces\";\n\nconst timeRegexp =\n\t/^(((?<hour>[0-9]+):)?(?<min>[0-9]+):)?(?<sec>[0-9]+([\\.:]([0-9]+))?)/;\nfunction parseTimespan(timeSpan: string): number {\n\tconst matches = timeRegexp.exec(timeSpan);\n\tif (matches) {\n\t\tconst hour = Number(matches.groups?.hour || \"0\");\n\t\tconst min = Number(matches.groups?.min || \"0\");\n\t\tconst sec = Number(matches.groups?.sec.replace(/:/, \".\") || \"0\");\n\t\treturn Math.floor((hour * 3600 + min * 60 + sec) * 1000);\n\t} else {\n\t\tthrow new TypeError(\"时间戳字符串解析失败\");\n\t}\n}\n\nexport function parseTTML(ttmlText: string): LyricLine[] {\n\tconst domParser = new DOMParser();\n\tconst ttmlDoc: XMLDocument = domParser.parseFromString(\n\t\tttmlText,\n\t\t\"application/xml\",\n\t);\n\n\tlet mainAgentId = \"v1\";\n\n\tfor (const agent of ttmlDoc.querySelectorAll(\"ttm\\\\:agent\")) {\n\t\tif (agent.getAttribute(\"type\") === \"person\") {\n\t\t\tconst id = agent.getAttribute(\"xml:id\");\n\t\t\tif (id) {\n\t\t\t\tmainAgentId = id;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst result: LyricLine[] = [];\n\n\tfor (const lineEl of ttmlDoc.querySelectorAll(\"body p[begin][end]\")) {\n\t\tconst line: LyricLine = {\n\t\t\twords: [],\n\t\t\tstartTime: parseTimespan(lineEl.getAttribute(\"begin\") ?? \"0:0\"),\n\t\t\tendTime: parseTimespan(lineEl.getAttribute(\"end\") ?? \"0:0\"),\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tisBG: false,\n\t\t\tisDuet: lineEl.getAttribute(\"ttm:agent\") !== mainAgentId,\n\t\t};\n\t\tlet curBGLine: LyricLine | null = null;\n\n\t\tfor (const wordNode of lineEl.childNodes) {\n\t\t\tif (wordNode.nodeType === Node.TEXT_NODE) {\n\t\t\t\tconst word = wordNode.textContent ?? \"\";\n\t\t\t\tif (/^(\\s+)$/.test(word)) {\n\t\t\t\t\tline.words.push({\n\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tline.words.push({\n\t\t\t\t\t\tword: word,\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (wordNode.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tconst wordEl = wordNode as Element;\n\t\t\t\tconst role = wordEl.getAttribute(\"ttm:role\");\n\n\t\t\t\tif (wordEl.nodeName === \"span\" && role) {\n\t\t\t\t\tif (role === \"x-bg\") {\n\t\t\t\t\t\tconst bgLine: LyricLine = {\n\t\t\t\t\t\t\twords: [],\n\t\t\t\t\t\t\tstartTime: line.startTime,\n\t\t\t\t\t\t\tendTime: line.endTime,\n\t\t\t\t\t\t\ttranslatedLyric: \"\",\n\t\t\t\t\t\t\tromanLyric: \"\",\n\t\t\t\t\t\t\tisBG: true,\n\t\t\t\t\t\t\tisDuet: line.isDuet,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tfor (const wordNode of wordEl.childNodes) {\n\t\t\t\t\t\t\tif (wordNode.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\t\t\tconst word = wordNode.textContent ?? \"\";\n\t\t\t\t\t\t\t\tif (/^(\\s+)$/.test(word)) {\n\t\t\t\t\t\t\t\t\tbgLine.words.push({\n\t\t\t\t\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tbgLine.words.push({\n\t\t\t\t\t\t\t\t\t\tword: word,\n\t\t\t\t\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (wordNode.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\t\t\t\tconst wordEl = wordNode as Element;\n\t\t\t\t\t\t\t\tconst role = wordEl.getAttribute(\"ttm:role\");\n\t\t\t\t\t\t\t\tif (wordEl.nodeName === \"span\" && role) {\n\t\t\t\t\t\t\t\t\tif (role === \"x-translation\") {\n\t\t\t\t\t\t\t\t\t\tbgLine.translatedLyric = wordEl.innerHTML.trim();\n\t\t\t\t\t\t\t\t\t} else if (role === \"x-roman\") {\n\t\t\t\t\t\t\t\t\t\tbgLine.romanLyric = wordEl.innerHTML.trim();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\twordEl.hasAttribute(\"begin\") &&\n\t\t\t\t\t\t\t\t\twordEl.hasAttribute(\"end\")\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst word = {\n\t\t\t\t\t\t\t\t\t\tword: wordNode.textContent,\n\t\t\t\t\t\t\t\t\t\tstartTime: parseTimespan(wordEl.getAttribute(\"begin\")!!),\n\t\t\t\t\t\t\t\t\t\tendTime: parseTimespan(wordEl.getAttribute(\"end\")!!),\n\t\t\t\t\t\t\t\t\t} as LyricWord;\n\t\t\t\t\t\t\t\t\tbgLine.words.push(word);\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\n\t\t\t\t\t\tconst firstWord = bgLine.words[0];\n\t\t\t\t\t\tbgLine.startTime = firstWord.startTime;\n\t\t\t\t\t\tif (firstWord?.word.startsWith(\"(\")) {\n\t\t\t\t\t\t\tfirstWord.word = firstWord.word.substring(1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst lastWord = bgLine.words[bgLine.words.length - 1];\n\t\t\t\t\t\tbgLine.endTime = lastWord.endTime;\n\t\t\t\t\t\tif (lastWord?.word.endsWith(\")\")) {\n\t\t\t\t\t\t\tlastWord.word = lastWord.word.substring(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tlastWord.word.length - 1,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurBGLine = bgLine;\n\t\t\t\t\t} else if (role === \"x-translation\") {\n\t\t\t\t\t\tline.translatedLyric = wordEl.innerHTML;\n\t\t\t\t\t} else if (role === \"x-roman\") {\n\t\t\t\t\t\tline.romanLyric = wordEl.innerHTML;\n\t\t\t\t\t}\n\t\t\t\t} else if (wordEl.hasAttribute(\"begin\") && wordEl.hasAttribute(\"end\")) {\n\t\t\t\t\tconst word: LyricWord = {\n\t\t\t\t\t\tword: wordNode.textContent ?? \"\",\n\t\t\t\t\t\tstartTime: parseTimespan(wordEl.getAttribute(\"begin\")!!),\n\t\t\t\t\t\tendTime: parseTimespan(wordEl.getAttribute(\"end\")!!),\n\t\t\t\t\t};\n\t\t\t\t\tline.words.push(word);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tresult.push(line);\n\t\tif (curBGLine) {\n\t\t\t// line.startTime = Math.min(line.startTime, curBGLine.startTime);\n\t\t\t// line.endTime = Math.max(line.endTime, curBGLine.endTime);\n\t\t\t// curBGLine.startTime = line.startTime;\n\t\t\t// curBGLine.endTime = line.endTime;\n\t\t\tresult.push(curBGLine);\n\t\t}\n\t}\n\n\tconsole.log(result);\n\n\treturn result;\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 { 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 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}\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\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.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.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 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 = [];\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\tif (minBorder > 512) this.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}\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 tex = await Texture.fromURL(albumUrl);\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}\n\n\tdispose() {\n\t\tthis.observer.disconnect();\n\t\tthis.app.ticker.remove(this.onTick);\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}\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","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}px, ${this.top}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","/** 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 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}\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}\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.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}\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...params,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\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\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, LyricLine, LyricWord } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nconst CJKEXP = /^[\\p{Unified_Ideograph}\\u0800-\\u9FFC]+$/u;\n\ninterface RealWord extends LyricWord {\n\telements: 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,1)\",\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// 果子在对辉光效果的解释是一种强调(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 LyricLineEl 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\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\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 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\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\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 lastStyle = \"\";\n\tshow() {\n\t\tthis._hide = false;\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis._hide = true;\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.getCurrentPosition()}px,${this.lineTransforms.posY.getCurrentPosition()}px) scale(${this.lineTransforms.scale.getCurrentPosition()});`;\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\tthis.splittedWords = [];\n\t\tthis.lyricLine.words.forEach((word) => {\n\t\t\tconst splited = word.word.split(/\\s+/);\n\t\t\tconst trimmedLength = splited.reduce((pv, cv) => pv + cv.length, 0);\n\t\t\tlet pos = 0;\n\t\t\tsplited.forEach((sub, i) => {\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\telements: [],\n\t\t\t\t\t\telementAnimations: [],\n\t\t\t\t\t\tshouldEmphasize: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\tword: sub,\n\t\t\t\t\tstartTime:\n\t\t\t\t\t\tword.startTime +\n\t\t\t\t\t\t((word.endTime - word.startTime) / trimmedLength) * pos,\n\t\t\t\t\tendTime:\n\t\t\t\t\t\tword.startTime +\n\t\t\t\t\t\t((word.endTime - word.startTime) / trimmedLength) *\n\t\t\t\t\t\t\t(pos + sub.length),\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\telements: [],\n\t\t\t\t\telementAnimations: [],\n\t\t\t\t\tshouldEmphasize: shouldEmphasize(word),\n\t\t\t\t});\n\t\t\t\tpos += sub.length;\n\t\t\t});\n\t\t});\n\t\t// 回收元素以复用\n\t\tconst reusableElements: HTMLElement[] = [];\n\t\tconst reusableTextNodes: Text[] = [];\n\t\tfunction collectNodes(curNode: Node) {\n\t\t\twhile (curNode.firstChild) {\n\t\t\t\tif (curNode.firstChild.nodeType === Node.ELEMENT_NODE)\n\t\t\t\t\treusableElements.push(main.firstChild as HTMLElement);\n\t\t\t\telse if (curNode.firstChild.nodeType === Node.TEXT_NODE)\n\t\t\t\t\treusableTextNodes.push(main.firstChild as Text);\n\t\t\t\tcurNode.removeChild(curNode.firstChild);\n\t\t\t\tcollectNodes(curNode.firstChild);\n\t\t\t}\n\t\t}\n\t\tcollectNodes(main);\n\t\tlet lastWordEl: HTMLSpanElement | null = null;\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tif (word.word.trim().length > 0) {\n\t\t\t\tif (word.shouldEmphasize) {\n\t\t\t\t\tconst wordEl =\n\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\twordEl.className = \"emphasize\";\n\t\t\t\t\tword.elements = [wordEl];\n\t\t\t\t\tfor (const c of word.word) {\n\t\t\t\t\t\tconst charEl =\n\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\tcharEl.className = \"\";\n\t\t\t\t\t\tcharEl.innerText = c;\n\t\t\t\t\t\twordEl.appendChild(charEl);\n\t\t\t\t\t\tword.elements.push(charEl);\n\t\t\t\t\t}\n\t\t\t\t\tword.elementAnimations = this.initEmphasizeAnimation(word);\n\t\t\t\t\tconsole.log(word.word, CJKEXP.test(word.word));\n\t\t\t\t\tif (lastWordEl && !CJKEXP.test(word.word)) {\n\t\t\t\t\t\tif (lastWordEl.childElementCount > 0) {\n\t\t\t\t\t\t\tlastWordEl.appendChild(wordEl);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst wholeWordEl =\n\t\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\t\twholeWordEl.className = \"\";\n\t\t\t\t\t\t\tlastWordEl.remove();\n\t\t\t\t\t\t\twholeWordEl.appendChild(lastWordEl);\n\t\t\t\t\t\t\twholeWordEl.appendChild(wordEl);\n\t\t\t\t\t\t\tmain.appendChild(wholeWordEl);\n\t\t\t\t\t\t\tlastWordEl = wholeWordEl;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastWordEl = CJKEXP.test(word.word) ? null : wordEl;\n\t\t\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst wordEl =\n\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\twordEl.className = \"\";\n\t\t\t\t\twordEl.innerText = word.word;\n\t\t\t\t\tword.elements = [wordEl];\n\t\t\t\t\tword.elementAnimations.push(this.initFloatAnimation(word, wordEl));\n\t\t\t\t\tif (lastWordEl) {\n\t\t\t\t\t\tif (lastWordEl.childElementCount > 0) {\n\t\t\t\t\t\t\tlastWordEl.appendChild(wordEl);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst wholeWordEl =\n\t\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\t\twholeWordEl.className = \"\";\n\t\t\t\t\t\t\tlastWordEl.remove();\n\t\t\t\t\t\t\twholeWordEl.appendChild(lastWordEl);\n\t\t\t\t\t\t\twholeWordEl.appendChild(wordEl);\n\t\t\t\t\t\t\tmain.appendChild(wholeWordEl);\n\t\t\t\t\t\t\tlastWordEl = wholeWordEl;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastWordEl = wordEl;\n\t\t\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (word.word.length > 0) {\n\t\t\t\tconst wordEl = reusableTextNodes.pop() ?? document.createTextNode(\" \");\n\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\tlastWordEl = null;\n\t\t\t} else {\n\t\t\t\tlastWordEl = null;\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.elements.map((el, i, arr) => {\n\t\t\tif (i === 0) {\n\t\t\t\treturn this.initFloatAnimation(word, el);\n\t\t\t} else {\n\t\t\t\tconst a = el.animate(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, 0px, 0px)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-line-color))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 0.5,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, -2%, 20px)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0.2rem var(--amll-lyric-line-color))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 1,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, 0px, 0)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-line-color))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t{\n\t\t\t\t\t\tduration: Math.max(1000, word.endTime - word.startTime),\n\t\t\t\t\t\tdelay: delay + (duration / (arr.length - 1)) * (i - 1),\n\t\t\t\t\t\tid: \"glow-word\",\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\ta.pause();\n\t\t\t\treturn a;\n\t\t\t}\n\t\t});\n\t}\n\tupdateMaskImage() {\n\t\tif (this._hide) {\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.elements[0];\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 [maskImage, _widthInTotal, totalAspect] = generateFadeGradient(\n\t\t\t\t\t16 / word.width,\n\t\t\t\t\t\"rgba(0,0,0,0.75)\",\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.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.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\tconst w = word.width + 16;\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\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\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\tmain.style.opacity = `${opacity}`;\n\t\tif (force || !this.lyricPlayer.getEnableSpring()) {\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 (!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\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\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 pl = this.lyricPlayer.pos[0];\n\t\tconst pt = this.lyricPlayer.pos[1];\n\t\tconst pr = this.lyricPlayer.pos[0] + this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.pos[1] + this.lyricPlayer.size[1];\n\t\treturn !(l > pr || t > pb || r < pl || b < pt);\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 { InterludeDots } from \"./interlude-dots\";\nimport { LyricLineEl, shouldEmphasize } from \"./lyric-line\";\nimport { create } from \"jss\";\nimport preset from \"jss-preset-default\";\n\nconst jss = create(preset());\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: Map<LyricLineEl, [number, number]> = new Map();\n\tprivate hotLines: Set<number> = new Set();\n\tprivate bufferedLines: Set<number> = new Set();\n\tprivate scrollToIndex = 0;\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\tthis.pos[0] = rect.left;\n\t\tthis.pos[1] = rect.top;\n\t\tthis.rebuildStyle();\n\t\tthis.calcLayout(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 enableBlur = true;\n\tprivate interludeDots: InterludeDots;\n\tprivate interludeDotsSize: [number, number] = [0, 0];\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\" | number = 0.5;\n\treadonly size: [number, number] = [0, 0];\n\treadonly pos: [number, number] = [0, 0];\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\tpublic readonly style = jss.createStyleSheet({\n\t\tlyricPlayer: {\n\t\t\tuserSelect: \"none\",\n\t\t\tpadding: \"1rem\",\n\t\t\tboxSizing: \"border-box\",\n\t\t\tfontSize: \"max(5vh, 12px)\",\n\t\t\tfontWeight: \"bold\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\toverflow: \"hidden\",\n\t\t\tmaxWidth: \"100%\",\n\t\t\tmaxHeight: \"100%\",\n\t\t\tzIndex: 1,\n\t\t\tcolor: \"var(--amll-lyric-line-color)\",\n\t\t\tmixBlendMode: \"plus-lighter\",\n\t\t\tcontain: \"strict\",\n\t\t},\n\t\tlyricLine: {\n\t\t\tposition: \"absolute\",\n\t\t\ttransformOrigin: \"left\",\n\t\t\tmaxWidth: \"65%\",\n\t\t\tpadding: \"max(2vh, 1rem) 1rem\",\n\t\t\tcontain: \"content\",\n\t\t\ttransition: \"filter 0.25s\",\n\t\t\tmargin: \"max(2vh, 1rem) -1rem\",\n\t\t},\n\t\t\"@media (max-width: 1024px)\": {\n\t\t\tlyricLine: {\n\t\t\t\tmaxWidth: \"75%\",\n\t\t\t\tpadding: \"max(1vh, 1rem) 1rem\",\n\t\t\t\tmargin: \"0 -1rem\",\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: 1,\n\t\t\t},\n\t\t},\n\t\tlyricMainLine: {\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\tmargin: \"-1rem\",\n\t\t\tpadding: \"1rem\",\n\t\t\t\"& span\": {\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\tmargin: \"-1rem\",\n\t\t\t\tpadding: \"1rem\",\n\t\t\t},\n\t\t\t\"& > span\": {\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\twordBreak: \"keep-all\",\n\t\t\t\tmaxLines: \"1\",\n\t\t\t\t\"&.emphasize\": {\n\t\t\t\t\tmargin: \"-1rem\",\n\t\t\t\t\tpadding: \"1rem\",\n\t\t\t\t\ttransformStyle: \"preserve-3d\",\n\t\t\t\t\tperspective: \"50vw\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricSubLine: {\n\t\t\tfontSize: \"max(50%, 10px)\",\n\t\t\topacity: 0.5,\n\t\t},\n\t\tdisableSpring: {\n\t\t\t\"& > *\": {\n\t\t\t\ttransition: \"filter 0.25s, transform 0.5s\",\n\t\t\t},\n\t\t},\n\t\tinterludeDots: {\n\t\t\theight: \"min(1rem,2.5vh)\",\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.5rem\",\n\t\t\t\"& > *\": {\n\t\t\t\twidth: \"100%\",\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-line-color)\",\n\t\t\t\tmarginRight: \"4px\",\n\t\t\t},\n\t\t\t\"&.duet\": {\n\t\t\t\tright: \"1rem\",\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);\n\t};\n\tconstructor() {\n\t\tsuper();\n\t\tthis.interludeDots = new InterludeDots(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.style.attach();\n\t\tthis.interludeDots.setTransform(0, 200);\n\t\twindow.addEventListener(\"pageshow\", this.onPageShow);\n\t}\n\t/**\n\t * 获取当前播放时间里是否处于间奏区间\n\t * 如果是则会返回单位为毫秒的始末时间\n\t * 否则返回 undefined\n\t *\n\t * 这个只允许内部调用\n\t * @returns [开始时间,结束时间] 或 undefined 如果不处于间奏区间\n\t */\n\tgetCurrentInterlude(): [number, number, number] | 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 [0, this.processedLines[0].startTime, -2];\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\tthis.processedLines[i].endTime,\n\t\t\t\t\tthis.processedLines[i + 1].startTime,\n\t\t\t\t\ti,\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.element.clientWidth;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-player-height:\";\n\t\tstyle += this.element.clientHeight;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-line-color:\";\n\t\tstyle += \"#FFFFFF;\";\n\t\tstyle += \"--amll-player-time:\";\n\t\tstyle += this.currentTime;\n\t\tstyle += \";\";\n\t\tthis.element.setAttribute(\"style\", style);\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\tconst lastLine = lines[i - 1];\n\t\t\t\t\tconst pastLine = lines[i - 2];\n\t\t\t\t\tif (lastLine?.isBG && pastLine) {\n\t\t\t\t\t\tif (pastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\tMath.max(pastLine.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (lastLine?.endTime) {\n\t\t\t\t\t\tif (lastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\tMath.max(lastLine?.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\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((el) => el.dispose());\n\t\tthis.lyricLinesEl = this.processedLines.map(\n\t\t\t(line) => new LyricLineEl(this, line),\n\t\t);\n\t\tthis.lyricLinesEl.forEach((el) => {\n\t\t\tthis.element.appendChild(el.getElement());\n\t\t\tel.updateMaskImage();\n\t\t});\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);\n\t}\n\t/**\n\t * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`\n\t * 函数即可让歌词通过动画移动到目标位置。\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 reflow 是否进行重新布局(重新计算每行歌词大小)\n\t */\n\tcalcLayout(reflow = false) {\n\t\tif (reflow) {\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\t\t}\n\t\tconst SCALE_ASPECT = 0.95;\n\t\tconst scrollOffset = this.lyricLinesEl\n\t\t\t.slice(0, this.scrollToIndex)\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\tlet curPos = -scrollOffset;\n\t\tif (this.alignAnchor === \"bottom\") {\n\t\t\tcurPos += this.element.clientHeight / 2;\n\t\t\tconst curLine = this.lyricLinesEl[this.scrollToIndex];\n\t\t\tif (curLine) {\n\t\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t}\n\t\t} else if (typeof this.alignAnchor === \"number\") {\n\t\t\tcurPos += this.element.clientHeight * this.alignAnchor;\n\t\t\tconst curLine = this.lyricLinesEl[this.scrollToIndex];\n\t\t\tif (curLine) {\n\t\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t}\n\t\t}\n\t\tconst interlude = this.getCurrentInterlude();\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\tcurPos -= this.lyricLinesSize.get(nextLine)?.[1] ?? 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst latestIndex = Math.max(...this.bufferedLines);\n\t\tlet delay = 0;\n\t\tlet setDots = false;\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(0, 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\tel.setTransform(\n\t\t\t\tleft,\n\t\t\t\tcurPos,\n\t\t\t\tisActive ? 1 : SCALE_ASPECT,\n\t\t\t\thasBuffered ? 1 : 1 / 3,\n\t\t\t\tthis.enableBlur\n\t\t\t\t\t? 3 *\n\t\t\t\t\t (isActive\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: 1 +\n\t\t\t\t\t\t\t (i < this.scrollToIndex\n\t\t\t\t\t\t\t\t\t? Math.abs(this.scrollToIndex - i)\n\t\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\treflow,\n\t\t\t\tdelay,\n\t\t\t);\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 += 0.05;\n\t\t\t}\n\t\t});\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 * 设置歌词行的对齐方式,默认为 `top`\n\t *\n\t * - 设置成 `top` 的话歌词将会向组件顶部对齐\n\t * - 设置成 `bottom` 的话歌词将会向组件底部对齐\n\t * - 设置成 [0.0-1.0] 之间任意数字的话则会根据当前组件高度从顶部向下位移为对齐位置垂直居中对齐\n\t * @param alignAnchor 歌词行对齐方式,详情见函数说明\n\t */\n\tsetAlignAnchor(alignAnchor: \"top\" | \"bottom\" | number) {\n\t\tthis.alignAnchor = alignAnchor;\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\tthis.element.style.setProperty(\"--amll-player-time\", `${time}`);\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\tif (removedIds.size === 0 && addedIds.size > 0) {\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} else if (addedIds.size === 0 && removedIds.size > 0) {\n\t\t\t\tif (eqSet(removedIds, this.bufferedLines)) {\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}\n\t\t\t} else {\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}\n\t\t\tthis.calcLayout();\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.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.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.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}\n}\n"],"names":["timeRegexp","parseTimespan","timeSpan","matches","hour","min","sec","parseTTML","ttmlText","ttmlDoc","mainAgentId","agent","id","result","lineEl","line","curBGLine","wordNode","word","wordEl","role","bgLine","firstWord","lastWord","TimedContainer","Container","PixiRenderer","canvas","bounds","Application","delta","lastContainer","s1","s2","s3","s4","maxSize","speed","scale","minBorder","c0","ColorMatrixFilter","c1","c2","BlurFilter","fps","albumUrl","tex","Texture","container","Sprite","BackgroundRender","eqSet","xs","ys","x","easeInOutBack","clamp","cur","max","InterludeDots","lyricPlayer","left","top","interlude","curStyle","interludeDuration","currentDuration","breatheDuration","globalOpacity","dot0Opacity","dot1Opacity","dot2Opacity","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","CJKEXP","generateFadeGradient","width","bright","dark","totalAspect","widthInTotal","leftPos","shouldEmphasize","LyricLineEl","lyricLine","main","trans","roman","a","size","style","splited","trimmedLength","pv","cv","pos","sub","i","reusableElements","reusableTextNodes","collectNodes","curNode","lastWordEl","c","charEl","wholeWordEl","duration","el","arr","maskImage","_widthInTotal","totalAspectStr","w","maskPos","opacity","blur","force","l","r","b","pl","pt","pr","pb","jss","create","preset","LyricPlayer","rect","enable","currentTime","lines","timeOffset","lastLine","pastLine","nextLine","reflow","SCALE_ASPECT","curPos","acc","curLine","lineHeight","latestIndex","setDots","hasBuffered","isActive","alignAnchor","time","isSeek","removedHotIds","removedIds","addedIds","lastHotId","startTime","endTime","v","deltaS"],"mappings":"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"}
@@ -896,7 +896,7 @@ class ee extends EventTarget {
896
896
  (i) => new _(this, i)
897
897
  ), this.lyricLinesEl.forEach((i) => {
898
898
  this.element.appendChild(i.getElement()), i.updateMaskImage();
899
- }), this.setLinePosXSpringParams({}), this.setLinePosYSpringParams({}), this.setLineScaleSpringParams({}), this.setCurrentTime(0, !0), this.calcLayout(!0);
899
+ }), this.hotLines.clear(), this.bufferedLines.clear(), this.setLinePosXSpringParams({}), this.setLinePosYSpringParams({}), this.setLineScaleSpringParams({}), this.setCurrentTime(0, !0), this.calcLayout(!0);
900
900
  }
901
901
  /**
902
902
  * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`
@@ -1003,16 +1003,17 @@ class ee extends EventTarget {
1003
1003
  const i = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Set(), a = /* @__PURE__ */ new Set();
1004
1004
  this.hotLines.forEach((s) => {
1005
1005
  const r = this.processedLines[s];
1006
- if (!r.isBG)
1007
- if (r) {
1008
- const l = this.processedLines[s + 1];
1009
- if (l?.isBG) {
1010
- const h = Math.min(r.startTime, l?.startTime), o = Math.max(r.endTime, l?.endTime);
1011
- (h > e || o <= e) && (this.hotLines.delete(s), i.add(s), this.hotLines.delete(s + 1), i.add(s + 1), t && (this.lyricLinesEl[s].disable(), this.lyricLinesEl[s + 1].disable()));
1012
- } else
1013
- (r.startTime > e || r.endTime <= e) && (this.hotLines.delete(s), i.add(s), t && this.lyricLinesEl[s].disable());
1006
+ if (r) {
1007
+ if (r.isBG)
1008
+ return;
1009
+ const l = this.processedLines[s + 1];
1010
+ if (l?.isBG) {
1011
+ const h = Math.min(r.startTime, l?.startTime), o = Math.max(r.endTime, l?.endTime);
1012
+ (h > e || o <= e) && (this.hotLines.delete(s), i.add(s), this.hotLines.delete(s + 1), i.add(s + 1), t && (this.lyricLinesEl[s].disable(), this.lyricLinesEl[s + 1].disable()));
1014
1013
  } else
1015
- this.hotLines.delete(s), i.add(s), t && this.lyricLinesEl[s].disable();
1014
+ (r.startTime > e || r.endTime <= e) && (this.hotLines.delete(s), i.add(s), t && this.lyricLinesEl[s].disable());
1015
+ } else
1016
+ this.hotLines.delete(s), i.add(s), t && this.lyricLinesEl[s].disable();
1016
1017
  }), this.processedLines.forEach((s, r, l) => {
1017
1018
  !s.isBG && s.startTime <= e && s.endTime > e && (this.hotLines.has(r) || (this.hotLines.add(r), a.add(r), t && this.lyricLinesEl[r].enable(), l[r + 1]?.isBG && (this.hotLines.add(r + 1), a.add(r + 1), t && this.lyricLinesEl[r + 1].enable())));
1018
1019
  }), this.bufferedLines.forEach((s) => {
@@ -1 +1 @@
1
- {"version":3,"file":"amll-core.mjs","sources":["../src/lyric/ttml.ts","../src/bg-render/pixi-renderer.ts","../src/bg-render/index.ts","../src/utils/eq-set.ts","../src/lyric-player/interlude-dots.ts","../src/utils/spring.ts","../src/lyric-player/lyric-line.ts","../src/lyric-player/index.ts"],"sourcesContent":["import { LyricLine, LyricWord } from \"../interfaces\";\n\nconst timeRegexp =\n\t/^(((?<hour>[0-9]+):)?(?<min>[0-9]+):)?(?<sec>[0-9]+([\\.:]([0-9]+))?)/;\nfunction parseTimespan(timeSpan: string): number {\n\tconst matches = timeRegexp.exec(timeSpan);\n\tif (matches) {\n\t\tconst hour = Number(matches.groups?.hour || \"0\");\n\t\tconst min = Number(matches.groups?.min || \"0\");\n\t\tconst sec = Number(matches.groups?.sec.replace(/:/, \".\") || \"0\");\n\t\treturn Math.floor((hour * 3600 + min * 60 + sec) * 1000);\n\t} else {\n\t\tthrow new TypeError(\"时间戳字符串解析失败\");\n\t}\n}\n\nexport function parseTTML(ttmlText: string): LyricLine[] {\n\tconst domParser = new DOMParser();\n\tconst ttmlDoc: XMLDocument = domParser.parseFromString(\n\t\tttmlText,\n\t\t\"application/xml\",\n\t);\n\n\tlet mainAgentId = \"v1\";\n\n\tfor (const agent of ttmlDoc.querySelectorAll(\"ttm\\\\:agent\")) {\n\t\tif (agent.getAttribute(\"type\") === \"person\") {\n\t\t\tconst id = agent.getAttribute(\"xml:id\");\n\t\t\tif (id) {\n\t\t\t\tmainAgentId = id;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst result: LyricLine[] = [];\n\n\tfor (const lineEl of ttmlDoc.querySelectorAll(\"body p[begin][end]\")) {\n\t\tconst line: LyricLine = {\n\t\t\twords: [],\n\t\t\tstartTime: parseTimespan(lineEl.getAttribute(\"begin\") ?? \"0:0\"),\n\t\t\tendTime: parseTimespan(lineEl.getAttribute(\"end\") ?? \"0:0\"),\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tisBG: false,\n\t\t\tisDuet: lineEl.getAttribute(\"ttm:agent\") !== mainAgentId,\n\t\t};\n\t\tlet curBGLine: LyricLine | null = null;\n\n\t\tfor (const wordNode of lineEl.childNodes) {\n\t\t\tif (wordNode.nodeType === Node.TEXT_NODE) {\n\t\t\t\tconst word = wordNode.textContent ?? \"\";\n\t\t\t\tif (/^(\\s+)$/.test(word)) {\n\t\t\t\t\tline.words.push({\n\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tline.words.push({\n\t\t\t\t\t\tword: word,\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (wordNode.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tconst wordEl = wordNode as Element;\n\t\t\t\tconst role = wordEl.getAttribute(\"ttm:role\");\n\n\t\t\t\tif (wordEl.nodeName === \"span\" && role) {\n\t\t\t\t\tif (role === \"x-bg\") {\n\t\t\t\t\t\tconst bgLine: LyricLine = {\n\t\t\t\t\t\t\twords: [],\n\t\t\t\t\t\t\tstartTime: line.startTime,\n\t\t\t\t\t\t\tendTime: line.endTime,\n\t\t\t\t\t\t\ttranslatedLyric: \"\",\n\t\t\t\t\t\t\tromanLyric: \"\",\n\t\t\t\t\t\t\tisBG: true,\n\t\t\t\t\t\t\tisDuet: line.isDuet,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tfor (const wordNode of wordEl.childNodes) {\n\t\t\t\t\t\t\tif (wordNode.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\t\t\tconst word = wordNode.textContent ?? \"\";\n\t\t\t\t\t\t\t\tif (/^(\\s+)$/.test(word)) {\n\t\t\t\t\t\t\t\t\tbgLine.words.push({\n\t\t\t\t\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tbgLine.words.push({\n\t\t\t\t\t\t\t\t\t\tword: word,\n\t\t\t\t\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (wordNode.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\t\t\t\tconst wordEl = wordNode as Element;\n\t\t\t\t\t\t\t\tconst role = wordEl.getAttribute(\"ttm:role\");\n\t\t\t\t\t\t\t\tif (wordEl.nodeName === \"span\" && role) {\n\t\t\t\t\t\t\t\t\tif (role === \"x-translation\") {\n\t\t\t\t\t\t\t\t\t\tbgLine.translatedLyric = wordEl.innerHTML.trim();\n\t\t\t\t\t\t\t\t\t} else if (role === \"x-roman\") {\n\t\t\t\t\t\t\t\t\t\tbgLine.romanLyric = wordEl.innerHTML.trim();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\twordEl.hasAttribute(\"begin\") &&\n\t\t\t\t\t\t\t\t\twordEl.hasAttribute(\"end\")\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst word = {\n\t\t\t\t\t\t\t\t\t\tword: wordNode.textContent,\n\t\t\t\t\t\t\t\t\t\tstartTime: parseTimespan(wordEl.getAttribute(\"begin\")!!),\n\t\t\t\t\t\t\t\t\t\tendTime: parseTimespan(wordEl.getAttribute(\"end\")!!),\n\t\t\t\t\t\t\t\t\t} as LyricWord;\n\t\t\t\t\t\t\t\t\tbgLine.words.push(word);\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\n\t\t\t\t\t\tconst firstWord = bgLine.words[0];\n\t\t\t\t\t\tbgLine.startTime = firstWord.startTime;\n\t\t\t\t\t\tif (firstWord?.word.startsWith(\"(\")) {\n\t\t\t\t\t\t\tfirstWord.word = firstWord.word.substring(1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst lastWord = bgLine.words[bgLine.words.length - 1];\n\t\t\t\t\t\tbgLine.endTime = lastWord.endTime;\n\t\t\t\t\t\tif (lastWord?.word.endsWith(\")\")) {\n\t\t\t\t\t\t\tlastWord.word = lastWord.word.substring(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tlastWord.word.length - 1,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurBGLine = bgLine;\n\t\t\t\t\t} else if (role === \"x-translation\") {\n\t\t\t\t\t\tline.translatedLyric = wordEl.innerHTML;\n\t\t\t\t\t} else if (role === \"x-roman\") {\n\t\t\t\t\t\tline.romanLyric = wordEl.innerHTML;\n\t\t\t\t\t}\n\t\t\t\t} else if (wordEl.hasAttribute(\"begin\") && wordEl.hasAttribute(\"end\")) {\n\t\t\t\t\tconst word: LyricWord = {\n\t\t\t\t\t\tword: wordNode.textContent ?? \"\",\n\t\t\t\t\t\tstartTime: parseTimespan(wordEl.getAttribute(\"begin\")!!),\n\t\t\t\t\t\tendTime: parseTimespan(wordEl.getAttribute(\"end\")!!),\n\t\t\t\t\t};\n\t\t\t\t\tline.words.push(word);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tresult.push(line);\n\t\tif (curBGLine) {\n\t\t\t// line.startTime = Math.min(line.startTime, curBGLine.startTime);\n\t\t\t// line.endTime = Math.max(line.endTime, curBGLine.endTime);\n\t\t\t// curBGLine.startTime = line.startTime;\n\t\t\t// curBGLine.endTime = line.endTime;\n\t\t\tresult.push(curBGLine);\n\t\t}\n\t}\n\n\tconsole.log(result);\n\n\treturn result;\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 { 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 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}\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\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.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.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 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 = [];\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\tif (minBorder > 512) this.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}\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 tex = await Texture.fromURL(albumUrl);\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}\n\n\tdispose() {\n\t\tthis.observer.disconnect();\n\t\tthis.app.ticker.remove(this.onTick);\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}\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","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}px, ${this.top}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","/** 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 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}\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}\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.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}\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...params,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\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\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, LyricLine, LyricWord } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nconst CJKEXP = /^[\\p{Unified_Ideograph}\\u0800-\\u9FFC]+$/u;\n\ninterface RealWord extends LyricWord {\n\telements: 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,1)\",\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// 果子在对辉光效果的解释是一种强调(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 LyricLineEl 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\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\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 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\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\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 lastStyle = \"\";\n\tshow() {\n\t\tthis._hide = false;\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis._hide = true;\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.getCurrentPosition()}px,${this.lineTransforms.posY.getCurrentPosition()}px) scale(${this.lineTransforms.scale.getCurrentPosition()});`;\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\tthis.splittedWords = [];\n\t\tthis.lyricLine.words.forEach((word) => {\n\t\t\tconst splited = word.word.split(/\\s+/);\n\t\t\tconst trimmedLength = splited.reduce((pv, cv) => pv + cv.length, 0);\n\t\t\tlet pos = 0;\n\t\t\tsplited.forEach((sub, i) => {\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\telements: [],\n\t\t\t\t\t\telementAnimations: [],\n\t\t\t\t\t\tshouldEmphasize: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\tword: sub,\n\t\t\t\t\tstartTime:\n\t\t\t\t\t\tword.startTime +\n\t\t\t\t\t\t((word.endTime - word.startTime) / trimmedLength) * pos,\n\t\t\t\t\tendTime:\n\t\t\t\t\t\tword.startTime +\n\t\t\t\t\t\t((word.endTime - word.startTime) / trimmedLength) *\n\t\t\t\t\t\t\t(pos + sub.length),\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\telements: [],\n\t\t\t\t\telementAnimations: [],\n\t\t\t\t\tshouldEmphasize: shouldEmphasize(word),\n\t\t\t\t});\n\t\t\t\tpos += sub.length;\n\t\t\t});\n\t\t});\n\t\t// 回收元素以复用\n\t\tconst reusableElements: HTMLElement[] = [];\n\t\tconst reusableTextNodes: Text[] = [];\n\t\tfunction collectNodes(curNode: Node) {\n\t\t\twhile (curNode.firstChild) {\n\t\t\t\tif (curNode.firstChild.nodeType === Node.ELEMENT_NODE)\n\t\t\t\t\treusableElements.push(main.firstChild as HTMLElement);\n\t\t\t\telse if (curNode.firstChild.nodeType === Node.TEXT_NODE)\n\t\t\t\t\treusableTextNodes.push(main.firstChild as Text);\n\t\t\t\tcurNode.removeChild(curNode.firstChild);\n\t\t\t\tcollectNodes(curNode.firstChild);\n\t\t\t}\n\t\t}\n\t\tcollectNodes(main);\n\t\tlet lastWordEl: HTMLSpanElement | null = null;\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tif (word.word.trim().length > 0) {\n\t\t\t\tif (word.shouldEmphasize) {\n\t\t\t\t\tconst wordEl =\n\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\twordEl.className = \"emphasize\";\n\t\t\t\t\tword.elements = [wordEl];\n\t\t\t\t\tfor (const c of word.word) {\n\t\t\t\t\t\tconst charEl =\n\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\tcharEl.className = \"\";\n\t\t\t\t\t\tcharEl.innerText = c;\n\t\t\t\t\t\twordEl.appendChild(charEl);\n\t\t\t\t\t\tword.elements.push(charEl);\n\t\t\t\t\t}\n\t\t\t\t\tword.elementAnimations = this.initEmphasizeAnimation(word);\n\t\t\t\t\tconsole.log(word.word, CJKEXP.test(word.word));\n\t\t\t\t\tif (lastWordEl && !CJKEXP.test(word.word)) {\n\t\t\t\t\t\tif (lastWordEl.childElementCount > 0) {\n\t\t\t\t\t\t\tlastWordEl.appendChild(wordEl);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst wholeWordEl =\n\t\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\t\twholeWordEl.className = \"\";\n\t\t\t\t\t\t\tlastWordEl.remove();\n\t\t\t\t\t\t\twholeWordEl.appendChild(lastWordEl);\n\t\t\t\t\t\t\twholeWordEl.appendChild(wordEl);\n\t\t\t\t\t\t\tmain.appendChild(wholeWordEl);\n\t\t\t\t\t\t\tlastWordEl = wholeWordEl;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastWordEl = CJKEXP.test(word.word) ? null : wordEl;\n\t\t\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst wordEl =\n\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\twordEl.className = \"\";\n\t\t\t\t\twordEl.innerText = word.word;\n\t\t\t\t\tword.elements = [wordEl];\n\t\t\t\t\tword.elementAnimations.push(this.initFloatAnimation(word, wordEl));\n\t\t\t\t\tif (lastWordEl) {\n\t\t\t\t\t\tif (lastWordEl.childElementCount > 0) {\n\t\t\t\t\t\t\tlastWordEl.appendChild(wordEl);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst wholeWordEl =\n\t\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\t\twholeWordEl.className = \"\";\n\t\t\t\t\t\t\tlastWordEl.remove();\n\t\t\t\t\t\t\twholeWordEl.appendChild(lastWordEl);\n\t\t\t\t\t\t\twholeWordEl.appendChild(wordEl);\n\t\t\t\t\t\t\tmain.appendChild(wholeWordEl);\n\t\t\t\t\t\t\tlastWordEl = wholeWordEl;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastWordEl = wordEl;\n\t\t\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (word.word.length > 0) {\n\t\t\t\tconst wordEl = reusableTextNodes.pop() ?? document.createTextNode(\" \");\n\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\tlastWordEl = null;\n\t\t\t} else {\n\t\t\t\tlastWordEl = null;\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.elements.map((el, i, arr) => {\n\t\t\tif (i === 0) {\n\t\t\t\treturn this.initFloatAnimation(word, el);\n\t\t\t} else {\n\t\t\t\tconst a = el.animate(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, 0px, 0px)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-line-color))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 0.5,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, -2%, 20px)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0.2rem var(--amll-lyric-line-color))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 1,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, 0px, 0)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-line-color))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t{\n\t\t\t\t\t\tduration: Math.max(1000, word.endTime - word.startTime),\n\t\t\t\t\t\tdelay: delay + (duration / (arr.length - 1)) * (i - 1),\n\t\t\t\t\t\tid: \"glow-word\",\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\ta.pause();\n\t\t\t\treturn a;\n\t\t\t}\n\t\t});\n\t}\n\tupdateMaskImage() {\n\t\tif (this._hide) {\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.elements[0];\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 [maskImage, _widthInTotal, totalAspect] = generateFadeGradient(\n\t\t\t\t\t16 / word.width,\n\t\t\t\t\t\"rgba(0,0,0,0.75)\",\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.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.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\tconst w = word.width + 16;\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\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\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\tmain.style.opacity = `${opacity}`;\n\t\tif (force || !this.lyricPlayer.getEnableSpring()) {\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 (!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\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\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 pl = this.lyricPlayer.pos[0];\n\t\tconst pt = this.lyricPlayer.pos[1];\n\t\tconst pr = this.lyricPlayer.pos[0] + this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.pos[1] + this.lyricPlayer.size[1];\n\t\treturn !(l > pr || t > pb || r < pl || b < pt);\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 { InterludeDots } from \"./interlude-dots\";\nimport { LyricLineEl, shouldEmphasize } from \"./lyric-line\";\nimport { create } from \"jss\";\nimport preset from \"jss-preset-default\";\n\nconst jss = create(preset());\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: Map<LyricLineEl, [number, number]> = new Map();\n\tprivate hotLines: Set<number> = new Set();\n\tprivate bufferedLines: Set<number> = new Set();\n\tprivate scrollToIndex = 0;\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\tthis.pos[0] = rect.left;\n\t\tthis.pos[1] = rect.top;\n\t\tthis.rebuildStyle();\n\t\tthis.calcLayout(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 enableBlur = true;\n\tprivate interludeDots: InterludeDots;\n\tprivate interludeDotsSize: [number, number] = [0, 0];\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\" | number = 0.5;\n\treadonly size: [number, number] = [0, 0];\n\treadonly pos: [number, number] = [0, 0];\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\tpublic readonly style = jss.createStyleSheet({\n\t\tlyricPlayer: {\n\t\t\tuserSelect: \"none\",\n\t\t\tpadding: \"1rem\",\n\t\t\tboxSizing: \"border-box\",\n\t\t\tfontSize: \"max(5vh, 12px)\",\n\t\t\tfontWeight: \"bold\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\toverflow: \"hidden\",\n\t\t\tmaxWidth: \"100%\",\n\t\t\tmaxHeight: \"100%\",\n\t\t\tzIndex: 1,\n\t\t\tcolor: \"var(--amll-lyric-line-color)\",\n\t\t\tmixBlendMode: \"plus-lighter\",\n\t\t\tcontain: \"strict\",\n\t\t},\n\t\tlyricLine: {\n\t\t\tposition: \"absolute\",\n\t\t\ttransformOrigin: \"left\",\n\t\t\tmaxWidth: \"65%\",\n\t\t\tpadding: \"max(2vh, 1rem) 1rem\",\n\t\t\tcontain: \"content\",\n\t\t\ttransition: \"filter 0.25s\",\n\t\t\tmargin: \"max(2vh, 1rem) -1rem\",\n\t\t},\n\t\t\"@media (max-width: 1024px)\": {\n\t\t\tlyricLine: {\n\t\t\t\tmaxWidth: \"75%\",\n\t\t\t\tpadding: \"max(1vh, 1rem) 1rem\",\n\t\t\t\tmargin: \"0 -1rem\",\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: 1,\n\t\t\t},\n\t\t},\n\t\tlyricMainLine: {\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\tmargin: \"-1rem\",\n\t\t\tpadding: \"1rem\",\n\t\t\t\"& span\": {\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\tmargin: \"-1rem\",\n\t\t\t\tpadding: \"1rem\",\n\t\t\t},\n\t\t\t\"& > span\": {\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\twordBreak: \"keep-all\",\n\t\t\t\tmaxLines: \"1\",\n\t\t\t\t\"&.emphasize\": {\n\t\t\t\t\tmargin: \"-1rem\",\n\t\t\t\t\tpadding: \"1rem\",\n\t\t\t\t\ttransformStyle: \"preserve-3d\",\n\t\t\t\t\tperspective: \"50vw\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricSubLine: {\n\t\t\tfontSize: \"max(50%, 10px)\",\n\t\t\topacity: 0.5,\n\t\t},\n\t\tdisableSpring: {\n\t\t\t\"& > *\": {\n\t\t\t\ttransition: \"filter 0.25s, transform 0.5s\",\n\t\t\t},\n\t\t},\n\t\tinterludeDots: {\n\t\t\theight: \"min(1rem,2.5vh)\",\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.5rem\",\n\t\t\t\"& > *\": {\n\t\t\t\twidth: \"100%\",\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-line-color)\",\n\t\t\t\tmarginRight: \"4px\",\n\t\t\t},\n\t\t\t\"&.duet\": {\n\t\t\t\tright: \"1rem\",\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);\n\t};\n\tconstructor() {\n\t\tsuper();\n\t\tthis.interludeDots = new InterludeDots(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.style.attach();\n\t\tthis.interludeDots.setTransform(0, 200);\n\t\twindow.addEventListener(\"pageshow\", this.onPageShow);\n\t}\n\t/**\n\t * 获取当前播放时间里是否处于间奏区间\n\t * 如果是则会返回单位为毫秒的始末时间\n\t * 否则返回 undefined\n\t *\n\t * 这个只允许内部调用\n\t * @returns [开始时间,结束时间] 或 undefined 如果不处于间奏区间\n\t */\n\tgetCurrentInterlude(): [number, number, number] | 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 [0, this.processedLines[0].startTime, -2];\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\tthis.processedLines[i].endTime,\n\t\t\t\t\tthis.processedLines[i + 1].startTime,\n\t\t\t\t\ti,\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.element.clientWidth;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-player-height:\";\n\t\tstyle += this.element.clientHeight;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-line-color:\";\n\t\tstyle += \"#FFFFFF;\";\n\t\tstyle += \"--amll-player-time:\";\n\t\tstyle += this.currentTime;\n\t\tstyle += \";\";\n\t\tthis.element.setAttribute(\"style\", style);\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\tconst lastLine = lines[i - 1];\n\t\t\t\t\tconst pastLine = lines[i - 2];\n\t\t\t\t\tif (lastLine?.isBG && pastLine) {\n\t\t\t\t\t\tif (pastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\tMath.max(pastLine.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (lastLine?.endTime) {\n\t\t\t\t\t\tif (lastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\tMath.max(lastLine?.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\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((el) => el.dispose());\n\t\tthis.lyricLinesEl = this.processedLines.map(\n\t\t\t(line) => new LyricLineEl(this, line),\n\t\t);\n\t\tthis.lyricLinesEl.forEach((el) => {\n\t\t\tthis.element.appendChild(el.getElement());\n\t\t\tel.updateMaskImage();\n\t\t});\n\t\tthis.setLinePosXSpringParams({});\n\t\tthis.setLinePosYSpringParams({});\n\t\tthis.setLineScaleSpringParams({});\n\t\tthis.setCurrentTime(0, true);\n\t\tthis.calcLayout(true);\n\t}\n\t/**\n\t * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`\n\t * 函数即可让歌词通过动画移动到目标位置。\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 reflow 是否进行重新布局(重新计算每行歌词大小)\n\t */\n\tcalcLayout(reflow = false) {\n\t\tif (reflow) {\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\t\t}\n\t\tconst SCALE_ASPECT = 0.95;\n\t\tconst scrollOffset = this.lyricLinesEl\n\t\t\t.slice(0, this.scrollToIndex)\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\tlet curPos = -scrollOffset;\n\t\tif (this.alignAnchor === \"bottom\") {\n\t\t\tcurPos += this.element.clientHeight / 2;\n\t\t\tconst curLine = this.lyricLinesEl[this.scrollToIndex];\n\t\t\tif (curLine) {\n\t\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t}\n\t\t} else if (typeof this.alignAnchor === \"number\") {\n\t\t\tcurPos += this.element.clientHeight * this.alignAnchor;\n\t\t\tconst curLine = this.lyricLinesEl[this.scrollToIndex];\n\t\t\tif (curLine) {\n\t\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t}\n\t\t}\n\t\tconst interlude = this.getCurrentInterlude();\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\tcurPos -= this.lyricLinesSize.get(nextLine)?.[1] ?? 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst latestIndex = Math.max(...this.bufferedLines);\n\t\tlet delay = 0;\n\t\tlet setDots = false;\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(0, 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\tel.setTransform(\n\t\t\t\tleft,\n\t\t\t\tcurPos,\n\t\t\t\tisActive ? 1 : SCALE_ASPECT,\n\t\t\t\thasBuffered ? 1 : 1 / 3,\n\t\t\t\tthis.enableBlur\n\t\t\t\t\t? 3 *\n\t\t\t\t\t (isActive\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: 1 +\n\t\t\t\t\t\t\t (i < this.scrollToIndex\n\t\t\t\t\t\t\t\t\t? Math.abs(this.scrollToIndex - i)\n\t\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\treflow,\n\t\t\t\tdelay,\n\t\t\t);\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 += 0.05;\n\t\t\t}\n\t\t});\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 * 设置歌词行的对齐方式,默认为 `top`\n\t *\n\t * - 设置成 `top` 的话歌词将会向组件顶部对齐\n\t * - 设置成 `bottom` 的话歌词将会向组件底部对齐\n\t * - 设置成 [0.0-1.0] 之间任意数字的话则会根据当前组件高度从顶部向下位移为对齐位置垂直居中对齐\n\t * @param alignAnchor 歌词行对齐方式,详情见函数说明\n\t */\n\tsetAlignAnchor(alignAnchor: \"top\" | \"bottom\" | number) {\n\t\tthis.alignAnchor = alignAnchor;\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\tthis.element.style.setProperty(\"--amll-player-time\", `${time}`);\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.isBG) return;\n\t\t\tif (line) {\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\tif (removedIds.size === 0 && addedIds.size > 0) {\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} else if (addedIds.size === 0 && removedIds.size > 0) {\n\t\t\t\tif (eqSet(removedIds, this.bufferedLines)) {\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}\n\t\t\t} else {\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}\n\t\t\tthis.calcLayout();\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.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.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.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}\n}\n"],"names":["timeRegexp","parseTimespan","timeSpan","matches","hour","min","sec","parseTTML","ttmlText","ttmlDoc","mainAgentId","agent","id","result","lineEl","line","curBGLine","wordNode","word","wordEl","role","bgLine","firstWord","lastWord","TimedContainer","Container","PixiRenderer","canvas","bounds","Application","delta","lastContainer","s1","s2","s3","s4","maxSize","speed","scale","minBorder","c0","ColorMatrixFilter","c1","c2","BlurFilter","fps","albumUrl","tex","Texture","container","Sprite","BackgroundRender","eqSet","xs","ys","x","easeInOutBack","clamp","cur","max","InterludeDots","lyricPlayer","left","top","interlude","curStyle","interludeDuration","currentDuration","breatheDuration","globalOpacity","dot0Opacity","dot1Opacity","dot2Opacity","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","CJKEXP","generateFadeGradient","width","bright","dark","totalAspect","widthInTotal","leftPos","shouldEmphasize","LyricLineEl","lyricLine","main","trans","roman","a","size","style","splited","trimmedLength","pv","cv","pos","sub","i","reusableElements","reusableTextNodes","collectNodes","curNode","lastWordEl","c","charEl","wholeWordEl","duration","el","arr","maskImage","_widthInTotal","totalAspectStr","w","maskPos","opacity","blur","force","l","r","b","pl","pt","pr","pb","jss","create","preset","LyricPlayer","rect","enable","currentTime","lines","timeOffset","lastLine","pastLine","nextLine","reflow","SCALE_ASPECT","curPos","acc","curLine","lineHeight","latestIndex","setDots","hasBuffered","isActive","alignAnchor","time","isSeek","removedHotIds","removedIds","addedIds","lastHotId","startTime","endTime","v","deltaS"],"mappings":"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"}
1
+ {"version":3,"file":"amll-core.mjs","sources":["../src/lyric/ttml.ts","../src/bg-render/pixi-renderer.ts","../src/bg-render/index.ts","../src/utils/eq-set.ts","../src/lyric-player/interlude-dots.ts","../src/utils/spring.ts","../src/lyric-player/lyric-line.ts","../src/lyric-player/index.ts"],"sourcesContent":["import { LyricLine, LyricWord } from \"../interfaces\";\n\nconst timeRegexp =\n\t/^(((?<hour>[0-9]+):)?(?<min>[0-9]+):)?(?<sec>[0-9]+([\\.:]([0-9]+))?)/;\nfunction parseTimespan(timeSpan: string): number {\n\tconst matches = timeRegexp.exec(timeSpan);\n\tif (matches) {\n\t\tconst hour = Number(matches.groups?.hour || \"0\");\n\t\tconst min = Number(matches.groups?.min || \"0\");\n\t\tconst sec = Number(matches.groups?.sec.replace(/:/, \".\") || \"0\");\n\t\treturn Math.floor((hour * 3600 + min * 60 + sec) * 1000);\n\t} else {\n\t\tthrow new TypeError(\"时间戳字符串解析失败\");\n\t}\n}\n\nexport function parseTTML(ttmlText: string): LyricLine[] {\n\tconst domParser = new DOMParser();\n\tconst ttmlDoc: XMLDocument = domParser.parseFromString(\n\t\tttmlText,\n\t\t\"application/xml\",\n\t);\n\n\tlet mainAgentId = \"v1\";\n\n\tfor (const agent of ttmlDoc.querySelectorAll(\"ttm\\\\:agent\")) {\n\t\tif (agent.getAttribute(\"type\") === \"person\") {\n\t\t\tconst id = agent.getAttribute(\"xml:id\");\n\t\t\tif (id) {\n\t\t\t\tmainAgentId = id;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst result: LyricLine[] = [];\n\n\tfor (const lineEl of ttmlDoc.querySelectorAll(\"body p[begin][end]\")) {\n\t\tconst line: LyricLine = {\n\t\t\twords: [],\n\t\t\tstartTime: parseTimespan(lineEl.getAttribute(\"begin\") ?? \"0:0\"),\n\t\t\tendTime: parseTimespan(lineEl.getAttribute(\"end\") ?? \"0:0\"),\n\t\t\ttranslatedLyric: \"\",\n\t\t\tromanLyric: \"\",\n\t\t\tisBG: false,\n\t\t\tisDuet: lineEl.getAttribute(\"ttm:agent\") !== mainAgentId,\n\t\t};\n\t\tlet curBGLine: LyricLine | null = null;\n\n\t\tfor (const wordNode of lineEl.childNodes) {\n\t\t\tif (wordNode.nodeType === Node.TEXT_NODE) {\n\t\t\t\tconst word = wordNode.textContent ?? \"\";\n\t\t\t\tif (/^(\\s+)$/.test(word)) {\n\t\t\t\t\tline.words.push({\n\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tline.words.push({\n\t\t\t\t\t\tword: word,\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (wordNode.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\tconst wordEl = wordNode as Element;\n\t\t\t\tconst role = wordEl.getAttribute(\"ttm:role\");\n\n\t\t\t\tif (wordEl.nodeName === \"span\" && role) {\n\t\t\t\t\tif (role === \"x-bg\") {\n\t\t\t\t\t\tconst bgLine: LyricLine = {\n\t\t\t\t\t\t\twords: [],\n\t\t\t\t\t\t\tstartTime: line.startTime,\n\t\t\t\t\t\t\tendTime: line.endTime,\n\t\t\t\t\t\t\ttranslatedLyric: \"\",\n\t\t\t\t\t\t\tromanLyric: \"\",\n\t\t\t\t\t\t\tisBG: true,\n\t\t\t\t\t\t\tisDuet: line.isDuet,\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tfor (const wordNode of wordEl.childNodes) {\n\t\t\t\t\t\t\tif (wordNode.nodeType === Node.TEXT_NODE) {\n\t\t\t\t\t\t\t\tconst word = wordNode.textContent ?? \"\";\n\t\t\t\t\t\t\t\tif (/^(\\s+)$/.test(word)) {\n\t\t\t\t\t\t\t\t\tbgLine.words.push({\n\t\t\t\t\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tbgLine.words.push({\n\t\t\t\t\t\t\t\t\t\tword: word,\n\t\t\t\t\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (wordNode.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\t\t\t\tconst wordEl = wordNode as Element;\n\t\t\t\t\t\t\t\tconst role = wordEl.getAttribute(\"ttm:role\");\n\t\t\t\t\t\t\t\tif (wordEl.nodeName === \"span\" && role) {\n\t\t\t\t\t\t\t\t\tif (role === \"x-translation\") {\n\t\t\t\t\t\t\t\t\t\tbgLine.translatedLyric = wordEl.innerHTML.trim();\n\t\t\t\t\t\t\t\t\t} else if (role === \"x-roman\") {\n\t\t\t\t\t\t\t\t\t\tbgLine.romanLyric = wordEl.innerHTML.trim();\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\twordEl.hasAttribute(\"begin\") &&\n\t\t\t\t\t\t\t\t\twordEl.hasAttribute(\"end\")\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tconst word = {\n\t\t\t\t\t\t\t\t\t\tword: wordNode.textContent,\n\t\t\t\t\t\t\t\t\t\tstartTime: parseTimespan(wordEl.getAttribute(\"begin\")!!),\n\t\t\t\t\t\t\t\t\t\tendTime: parseTimespan(wordEl.getAttribute(\"end\")!!),\n\t\t\t\t\t\t\t\t\t} as LyricWord;\n\t\t\t\t\t\t\t\t\tbgLine.words.push(word);\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\n\t\t\t\t\t\tconst firstWord = bgLine.words[0];\n\t\t\t\t\t\tbgLine.startTime = firstWord.startTime;\n\t\t\t\t\t\tif (firstWord?.word.startsWith(\"(\")) {\n\t\t\t\t\t\t\tfirstWord.word = firstWord.word.substring(1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst lastWord = bgLine.words[bgLine.words.length - 1];\n\t\t\t\t\t\tbgLine.endTime = lastWord.endTime;\n\t\t\t\t\t\tif (lastWord?.word.endsWith(\")\")) {\n\t\t\t\t\t\t\tlastWord.word = lastWord.word.substring(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tlastWord.word.length - 1,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurBGLine = bgLine;\n\t\t\t\t\t} else if (role === \"x-translation\") {\n\t\t\t\t\t\tline.translatedLyric = wordEl.innerHTML;\n\t\t\t\t\t} else if (role === \"x-roman\") {\n\t\t\t\t\t\tline.romanLyric = wordEl.innerHTML;\n\t\t\t\t\t}\n\t\t\t\t} else if (wordEl.hasAttribute(\"begin\") && wordEl.hasAttribute(\"end\")) {\n\t\t\t\t\tconst word: LyricWord = {\n\t\t\t\t\t\tword: wordNode.textContent ?? \"\",\n\t\t\t\t\t\tstartTime: parseTimespan(wordEl.getAttribute(\"begin\")!!),\n\t\t\t\t\t\tendTime: parseTimespan(wordEl.getAttribute(\"end\")!!),\n\t\t\t\t\t};\n\t\t\t\t\tline.words.push(word);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tresult.push(line);\n\t\tif (curBGLine) {\n\t\t\t// line.startTime = Math.min(line.startTime, curBGLine.startTime);\n\t\t\t// line.endTime = Math.max(line.endTime, curBGLine.endTime);\n\t\t\t// curBGLine.startTime = line.startTime;\n\t\t\t// curBGLine.endTime = line.endTime;\n\t\t\tresult.push(curBGLine);\n\t\t}\n\t}\n\n\tconsole.log(result);\n\n\treturn result;\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 { 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 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}\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\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.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.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 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 = [];\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\tif (minBorder > 512) this.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}\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 tex = await Texture.fromURL(albumUrl);\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}\n\n\tdispose() {\n\t\tthis.observer.disconnect();\n\t\tthis.app.ticker.remove(this.onTick);\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}\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","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}px, ${this.top}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","/** 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 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}\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}\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.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}\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...params,\n\t\t\t\ttime: delay,\n\t\t\t};\n\t\t} else {\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\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, LyricLine, LyricWord } from \"../interfaces\";\nimport { Spring } from \"../utils/spring\";\n\nconst CJKEXP = /^[\\p{Unified_Ideograph}\\u0800-\\u9FFC]+$/u;\n\ninterface RealWord extends LyricWord {\n\telements: 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,1)\",\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// 果子在对辉光效果的解释是一种强调(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 LyricLineEl 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\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\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 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\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\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 lastStyle = \"\";\n\tshow() {\n\t\tthis._hide = false;\n\t\tthis.rebuildStyle();\n\t}\n\thide() {\n\t\tthis._hide = true;\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.getCurrentPosition()}px,${this.lineTransforms.posY.getCurrentPosition()}px) scale(${this.lineTransforms.scale.getCurrentPosition()});`;\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\tthis.splittedWords = [];\n\t\tthis.lyricLine.words.forEach((word) => {\n\t\t\tconst splited = word.word.split(/\\s+/);\n\t\t\tconst trimmedLength = splited.reduce((pv, cv) => pv + cv.length, 0);\n\t\t\tlet pos = 0;\n\t\t\tsplited.forEach((sub, i) => {\n\t\t\t\tif (i > 0) {\n\t\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\t\tword: \" \",\n\t\t\t\t\t\tstartTime: 0,\n\t\t\t\t\t\tendTime: 0,\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\telements: [],\n\t\t\t\t\t\telementAnimations: [],\n\t\t\t\t\t\tshouldEmphasize: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthis.splittedWords.push({\n\t\t\t\t\tword: sub,\n\t\t\t\t\tstartTime:\n\t\t\t\t\t\tword.startTime +\n\t\t\t\t\t\t((word.endTime - word.startTime) / trimmedLength) * pos,\n\t\t\t\t\tendTime:\n\t\t\t\t\t\tword.startTime +\n\t\t\t\t\t\t((word.endTime - word.startTime) / trimmedLength) *\n\t\t\t\t\t\t\t(pos + sub.length),\n\t\t\t\t\twidth: 0,\n\t\t\t\t\theight: 0,\n\t\t\t\t\telements: [],\n\t\t\t\t\telementAnimations: [],\n\t\t\t\t\tshouldEmphasize: shouldEmphasize(word),\n\t\t\t\t});\n\t\t\t\tpos += sub.length;\n\t\t\t});\n\t\t});\n\t\t// 回收元素以复用\n\t\tconst reusableElements: HTMLElement[] = [];\n\t\tconst reusableTextNodes: Text[] = [];\n\t\tfunction collectNodes(curNode: Node) {\n\t\t\twhile (curNode.firstChild) {\n\t\t\t\tif (curNode.firstChild.nodeType === Node.ELEMENT_NODE)\n\t\t\t\t\treusableElements.push(main.firstChild as HTMLElement);\n\t\t\t\telse if (curNode.firstChild.nodeType === Node.TEXT_NODE)\n\t\t\t\t\treusableTextNodes.push(main.firstChild as Text);\n\t\t\t\tcurNode.removeChild(curNode.firstChild);\n\t\t\t\tcollectNodes(curNode.firstChild);\n\t\t\t}\n\t\t}\n\t\tcollectNodes(main);\n\t\tlet lastWordEl: HTMLSpanElement | null = null;\n\t\tthis.splittedWords.forEach((word) => {\n\t\t\tif (word.word.trim().length > 0) {\n\t\t\t\tif (word.shouldEmphasize) {\n\t\t\t\t\tconst wordEl =\n\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\twordEl.className = \"emphasize\";\n\t\t\t\t\tword.elements = [wordEl];\n\t\t\t\t\tfor (const c of word.word) {\n\t\t\t\t\t\tconst charEl =\n\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\tcharEl.className = \"\";\n\t\t\t\t\t\tcharEl.innerText = c;\n\t\t\t\t\t\twordEl.appendChild(charEl);\n\t\t\t\t\t\tword.elements.push(charEl);\n\t\t\t\t\t}\n\t\t\t\t\tword.elementAnimations = this.initEmphasizeAnimation(word);\n\t\t\t\t\tconsole.log(word.word, CJKEXP.test(word.word));\n\t\t\t\t\tif (lastWordEl && !CJKEXP.test(word.word)) {\n\t\t\t\t\t\tif (lastWordEl.childElementCount > 0) {\n\t\t\t\t\t\t\tlastWordEl.appendChild(wordEl);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst wholeWordEl =\n\t\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\t\twholeWordEl.className = \"\";\n\t\t\t\t\t\t\tlastWordEl.remove();\n\t\t\t\t\t\t\twholeWordEl.appendChild(lastWordEl);\n\t\t\t\t\t\t\twholeWordEl.appendChild(wordEl);\n\t\t\t\t\t\t\tmain.appendChild(wholeWordEl);\n\t\t\t\t\t\t\tlastWordEl = wholeWordEl;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastWordEl = CJKEXP.test(word.word) ? null : wordEl;\n\t\t\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tconst wordEl =\n\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\twordEl.className = \"\";\n\t\t\t\t\twordEl.innerText = word.word;\n\t\t\t\t\tword.elements = [wordEl];\n\t\t\t\t\tword.elementAnimations.push(this.initFloatAnimation(word, wordEl));\n\t\t\t\t\tif (lastWordEl) {\n\t\t\t\t\t\tif (lastWordEl.childElementCount > 0) {\n\t\t\t\t\t\t\tlastWordEl.appendChild(wordEl);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst wholeWordEl =\n\t\t\t\t\t\t\t\treusableElements.pop() ?? document.createElement(\"span\");\n\t\t\t\t\t\t\twholeWordEl.className = \"\";\n\t\t\t\t\t\t\tlastWordEl.remove();\n\t\t\t\t\t\t\twholeWordEl.appendChild(lastWordEl);\n\t\t\t\t\t\t\twholeWordEl.appendChild(wordEl);\n\t\t\t\t\t\t\tmain.appendChild(wholeWordEl);\n\t\t\t\t\t\t\tlastWordEl = wholeWordEl;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlastWordEl = wordEl;\n\t\t\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (word.word.length > 0) {\n\t\t\t\tconst wordEl = reusableTextNodes.pop() ?? document.createTextNode(\" \");\n\t\t\t\tmain.appendChild(wordEl);\n\t\t\t\tlastWordEl = null;\n\t\t\t} else {\n\t\t\t\tlastWordEl = null;\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.elements.map((el, i, arr) => {\n\t\t\tif (i === 0) {\n\t\t\t\treturn this.initFloatAnimation(word, el);\n\t\t\t} else {\n\t\t\t\tconst a = el.animate(\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 0,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, 0px, 0px)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-line-color))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 0.5,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, -2%, 20px)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0.2rem var(--amll-lyric-line-color))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\toffset: 1,\n\t\t\t\t\t\t\ttransform: \"translate3d(0, 0px, 0)\",\n\t\t\t\t\t\t\tfilter: \"drop-shadow(0 0 0 var(--amll-lyric-line-color))\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\t{\n\t\t\t\t\t\tduration: Math.max(1000, word.endTime - word.startTime),\n\t\t\t\t\t\tdelay: delay + (duration / (arr.length - 1)) * (i - 1),\n\t\t\t\t\t\tid: \"glow-word\",\n\t\t\t\t\t\titerations: 1,\n\t\t\t\t\t\tcomposite: \"replace\",\n\t\t\t\t\t\tfill: \"both\",\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t\ta.pause();\n\t\t\t\treturn a;\n\t\t\t}\n\t\t});\n\t}\n\tupdateMaskImage() {\n\t\tif (this._hide) {\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.elements[0];\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 [maskImage, _widthInTotal, totalAspect] = generateFadeGradient(\n\t\t\t\t\t16 / word.width,\n\t\t\t\t\t\"rgba(0,0,0,0.75)\",\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.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.webkitMaskOrigin = \"left\";\n\t\t\t\t\twordEl.style.webkitMaskSize = totalAspectStr;\n\t\t\t\t}\n\t\t\t\tconst w = word.width + 16;\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\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\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\tmain.style.opacity = `${opacity}`;\n\t\tif (force || !this.lyricPlayer.getEnableSpring()) {\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 (!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\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\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 pl = this.lyricPlayer.pos[0];\n\t\tconst pt = this.lyricPlayer.pos[1];\n\t\tconst pr = this.lyricPlayer.pos[0] + this.lyricPlayer.size[0];\n\t\tconst pb = this.lyricPlayer.pos[1] + this.lyricPlayer.size[1];\n\t\treturn !(l > pr || t > pb || r < pl || b < pt);\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 { InterludeDots } from \"./interlude-dots\";\nimport { LyricLineEl, shouldEmphasize } from \"./lyric-line\";\nimport { create } from \"jss\";\nimport preset from \"jss-preset-default\";\n\nconst jss = create(preset());\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: Map<LyricLineEl, [number, number]> = new Map();\n\tprivate hotLines: Set<number> = new Set();\n\tprivate bufferedLines: Set<number> = new Set();\n\tprivate scrollToIndex = 0;\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\tthis.pos[0] = rect.left;\n\t\tthis.pos[1] = rect.top;\n\t\tthis.rebuildStyle();\n\t\tthis.calcLayout(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 enableBlur = true;\n\tprivate interludeDots: InterludeDots;\n\tprivate interludeDotsSize: [number, number] = [0, 0];\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\" | number = 0.5;\n\treadonly size: [number, number] = [0, 0];\n\treadonly pos: [number, number] = [0, 0];\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\tpublic readonly style = jss.createStyleSheet({\n\t\tlyricPlayer: {\n\t\t\tuserSelect: \"none\",\n\t\t\tpadding: \"1rem\",\n\t\t\tboxSizing: \"border-box\",\n\t\t\tfontSize: \"max(5vh, 12px)\",\n\t\t\tfontWeight: \"bold\",\n\t\t\twidth: \"100%\",\n\t\t\theight: \"100%\",\n\t\t\toverflow: \"hidden\",\n\t\t\tmaxWidth: \"100%\",\n\t\t\tmaxHeight: \"100%\",\n\t\t\tzIndex: 1,\n\t\t\tcolor: \"var(--amll-lyric-line-color)\",\n\t\t\tmixBlendMode: \"plus-lighter\",\n\t\t\tcontain: \"strict\",\n\t\t},\n\t\tlyricLine: {\n\t\t\tposition: \"absolute\",\n\t\t\ttransformOrigin: \"left\",\n\t\t\tmaxWidth: \"65%\",\n\t\t\tpadding: \"max(2vh, 1rem) 1rem\",\n\t\t\tcontain: \"content\",\n\t\t\ttransition: \"filter 0.25s\",\n\t\t\tmargin: \"max(2vh, 1rem) -1rem\",\n\t\t},\n\t\t\"@media (max-width: 1024px)\": {\n\t\t\tlyricLine: {\n\t\t\t\tmaxWidth: \"75%\",\n\t\t\t\tpadding: \"max(1vh, 1rem) 1rem\",\n\t\t\t\tmargin: \"0 -1rem\",\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: 1,\n\t\t\t},\n\t\t},\n\t\tlyricMainLine: {\n\t\t\ttransition: \"opacity 0.3s 0.25s\",\n\t\t\tmargin: \"-1rem\",\n\t\t\tpadding: \"1rem\",\n\t\t\t\"& span\": {\n\t\t\t\tdisplay: \"inline-block\",\n\t\t\t\tmargin: \"-1rem\",\n\t\t\t\tpadding: \"1rem\",\n\t\t\t},\n\t\t\t\"& > span\": {\n\t\t\t\twhiteSpace: \"pre-wrap\",\n\t\t\t\twordBreak: \"keep-all\",\n\t\t\t\tmaxLines: \"1\",\n\t\t\t\t\"&.emphasize\": {\n\t\t\t\t\tmargin: \"-1rem\",\n\t\t\t\t\tpadding: \"1rem\",\n\t\t\t\t\ttransformStyle: \"preserve-3d\",\n\t\t\t\t\tperspective: \"50vw\",\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tlyricSubLine: {\n\t\t\tfontSize: \"max(50%, 10px)\",\n\t\t\topacity: 0.5,\n\t\t},\n\t\tdisableSpring: {\n\t\t\t\"& > *\": {\n\t\t\t\ttransition: \"filter 0.25s, transform 0.5s\",\n\t\t\t},\n\t\t},\n\t\tinterludeDots: {\n\t\t\theight: \"min(1rem,2.5vh)\",\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.5rem\",\n\t\t\t\"& > *\": {\n\t\t\t\twidth: \"100%\",\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-line-color)\",\n\t\t\t\tmarginRight: \"4px\",\n\t\t\t},\n\t\t\t\"&.duet\": {\n\t\t\t\tright: \"1rem\",\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);\n\t};\n\tconstructor() {\n\t\tsuper();\n\t\tthis.interludeDots = new InterludeDots(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.style.attach();\n\t\tthis.interludeDots.setTransform(0, 200);\n\t\twindow.addEventListener(\"pageshow\", this.onPageShow);\n\t}\n\t/**\n\t * 获取当前播放时间里是否处于间奏区间\n\t * 如果是则会返回单位为毫秒的始末时间\n\t * 否则返回 undefined\n\t *\n\t * 这个只允许内部调用\n\t * @returns [开始时间,结束时间] 或 undefined 如果不处于间奏区间\n\t */\n\tgetCurrentInterlude(): [number, number, number] | 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 [0, this.processedLines[0].startTime, -2];\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\tthis.processedLines[i].endTime,\n\t\t\t\t\tthis.processedLines[i + 1].startTime,\n\t\t\t\t\ti,\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.element.clientWidth;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-player-height:\";\n\t\tstyle += this.element.clientHeight;\n\t\tstyle += \"px;\";\n\t\tstyle += \"--amll-lyric-line-color:\";\n\t\tstyle += \"#FFFFFF;\";\n\t\tstyle += \"--amll-player-time:\";\n\t\tstyle += this.currentTime;\n\t\tstyle += \";\";\n\t\tthis.element.setAttribute(\"style\", style);\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\tconst lastLine = lines[i - 1];\n\t\t\t\t\tconst pastLine = lines[i - 2];\n\t\t\t\t\tif (lastLine?.isBG && pastLine) {\n\t\t\t\t\t\tif (pastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\tMath.max(pastLine.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (lastLine?.endTime) {\n\t\t\t\t\t\tif (lastLine.endTime < line.startTime) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t...line,\n\t\t\t\t\t\t\t\tstartTime:\n\t\t\t\t\t\t\t\t\tMath.max(lastLine?.endTime, line.startTime - timeOffset) ||\n\t\t\t\t\t\t\t\t\tline.startTime,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...line,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\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((el) => el.dispose());\n\t\tthis.lyricLinesEl = this.processedLines.map(\n\t\t\t(line) => new LyricLineEl(this, line),\n\t\t);\n\t\tthis.lyricLinesEl.forEach((el) => {\n\t\t\tthis.element.appendChild(el.getElement());\n\t\t\tel.updateMaskImage();\n\t\t});\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);\n\t}\n\t/**\n\t * 重新布局定位歌词行的位置,调用完成后再逐帧调用 `update`\n\t * 函数即可让歌词通过动画移动到目标位置。\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 reflow 是否进行重新布局(重新计算每行歌词大小)\n\t */\n\tcalcLayout(reflow = false) {\n\t\tif (reflow) {\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\t\t}\n\t\tconst SCALE_ASPECT = 0.95;\n\t\tconst scrollOffset = this.lyricLinesEl\n\t\t\t.slice(0, this.scrollToIndex)\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\tlet curPos = -scrollOffset;\n\t\tif (this.alignAnchor === \"bottom\") {\n\t\t\tcurPos += this.element.clientHeight / 2;\n\t\t\tconst curLine = this.lyricLinesEl[this.scrollToIndex];\n\t\t\tif (curLine) {\n\t\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t}\n\t\t} else if (typeof this.alignAnchor === \"number\") {\n\t\t\tcurPos += this.element.clientHeight * this.alignAnchor;\n\t\t\tconst curLine = this.lyricLinesEl[this.scrollToIndex];\n\t\t\tif (curLine) {\n\t\t\t\tconst lineHeight = this.lyricLinesSize.get(curLine)?.[1] ?? 0;\n\t\t\t\tcurPos -= lineHeight / 2;\n\t\t\t}\n\t\t}\n\t\tconst interlude = this.getCurrentInterlude();\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\tcurPos -= this.lyricLinesSize.get(nextLine)?.[1] ?? 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst latestIndex = Math.max(...this.bufferedLines);\n\t\tlet delay = 0;\n\t\tlet setDots = false;\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(0, 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\tel.setTransform(\n\t\t\t\tleft,\n\t\t\t\tcurPos,\n\t\t\t\tisActive ? 1 : SCALE_ASPECT,\n\t\t\t\thasBuffered ? 1 : 1 / 3,\n\t\t\t\tthis.enableBlur\n\t\t\t\t\t? 3 *\n\t\t\t\t\t (isActive\n\t\t\t\t\t\t\t? 0\n\t\t\t\t\t\t\t: 1 +\n\t\t\t\t\t\t\t (i < this.scrollToIndex\n\t\t\t\t\t\t\t\t\t? Math.abs(this.scrollToIndex - i)\n\t\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\treflow,\n\t\t\t\tdelay,\n\t\t\t);\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 += 0.05;\n\t\t\t}\n\t\t});\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 * 设置歌词行的对齐方式,默认为 `top`\n\t *\n\t * - 设置成 `top` 的话歌词将会向组件顶部对齐\n\t * - 设置成 `bottom` 的话歌词将会向组件底部对齐\n\t * - 设置成 [0.0-1.0] 之间任意数字的话则会根据当前组件高度从顶部向下位移为对齐位置垂直居中对齐\n\t * @param alignAnchor 歌词行对齐方式,详情见函数说明\n\t */\n\tsetAlignAnchor(alignAnchor: \"top\" | \"bottom\" | number) {\n\t\tthis.alignAnchor = alignAnchor;\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\tthis.element.style.setProperty(\"--amll-player-time\", `${time}`);\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\tif (removedIds.size === 0 && addedIds.size > 0) {\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} else if (addedIds.size === 0 && removedIds.size > 0) {\n\t\t\t\tif (eqSet(removedIds, this.bufferedLines)) {\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}\n\t\t\t} else {\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}\n\t\t\tthis.calcLayout();\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.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.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.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}\n}\n"],"names":["timeRegexp","parseTimespan","timeSpan","matches","hour","min","sec","parseTTML","ttmlText","ttmlDoc","mainAgentId","agent","id","result","lineEl","line","curBGLine","wordNode","word","wordEl","role","bgLine","firstWord","lastWord","TimedContainer","Container","PixiRenderer","canvas","bounds","Application","delta","lastContainer","s1","s2","s3","s4","maxSize","speed","scale","minBorder","c0","ColorMatrixFilter","c1","c2","BlurFilter","fps","albumUrl","tex","Texture","container","Sprite","BackgroundRender","eqSet","xs","ys","x","easeInOutBack","clamp","cur","max","InterludeDots","lyricPlayer","left","top","interlude","curStyle","interludeDuration","currentDuration","breatheDuration","globalOpacity","dot0Opacity","dot1Opacity","dot2Opacity","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","CJKEXP","generateFadeGradient","width","bright","dark","totalAspect","widthInTotal","leftPos","shouldEmphasize","LyricLineEl","lyricLine","main","trans","roman","a","size","style","splited","trimmedLength","pv","cv","pos","sub","i","reusableElements","reusableTextNodes","collectNodes","curNode","lastWordEl","c","charEl","wholeWordEl","duration","el","arr","maskImage","_widthInTotal","totalAspectStr","w","maskPos","opacity","blur","force","l","r","b","pl","pt","pr","pb","jss","create","preset","LyricPlayer","rect","enable","currentTime","lines","timeOffset","lastLine","pastLine","nextLine","reflow","SCALE_ASPECT","curPos","acc","curLine","lineHeight","latestIndex","setDots","hasBuffered","isActive","alignAnchor","time","isSeek","removedHotIds","removedIds","addedIds","lastHotId","startTime","endTime","v","deltaS"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@applemusic-like-lyrics/core",
3
3
  "packageManager": "yarn@3.6.1",
4
- "version": "0.0.8",
4
+ "version": "0.0.10",
5
5
  "description": "AMLL 的纯 JS 核心组件框架,包括歌词显示组件和背景组件等其它可以复用的组件",
6
6
  "repository": {
7
7
  "url": "https://github.com/Steve-xmh/applemusic-like-lyrics.git",