16 lines
64 KiB
JavaScript
16 lines
64 KiB
JavaScript
import{_ as me,c as O,i as Ie,a as Pe,d as W,b as G,e as I,s as L,t as w,f as b,g as Ne,h as u,S as D,F as ee,j as N,m as oe,M as T,k as pe,G as Ae,l as xe,n as Fe,W as Re,r as Me}from"./vendor.bf047f02.js";const Te=function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))a(n);new MutationObserver(n=>{for(const r of n)if(r.type==="childList")for(const i of r.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&a(i)}).observe(document,{childList:!0,subtree:!0});function t(n){const r={};return n.integrity&&(r.integrity=n.integrity),n.referrerpolicy&&(r.referrerPolicy=n.referrerpolicy),n.crossorigin==="use-credentials"?r.credentials="include":n.crossorigin==="anonymous"?r.credentials="omit":r.credentials="same-origin",r}function a(n){if(n.ep)return;n.ep=!0;const r=t(n);fetch(n.href,r)}};Te();const ze={horizontal:[0,0,1,0],vertical:[0,0,0,1],"diagonal-top":[0,0,1,1],"diagonal-bottom":[0,1,1,0]},We=(o,e,t,a,n,r)=>{let i;if(e.dir==="radial"){const d=Math.sqrt((t/2)**2+(a/2)**2);i=o.createRadialGradient(n+t/2,r+a/2,d,n+t/2,r+a/2,0)}else{const[d,h,g,c]=ze[e.dir];i=o.createLinearGradient(n+d*t,r+h*a,n+g*t,r+c*a)}const s=e.colors.length-1;return e.colors.forEach((d,h)=>{i.addColorStop(h/s,d)}),i},ye=o=>new Promise(e=>{const t=new Image;t.addEventListener("load",()=>e(t),{once:!0}),t.src=o}),j=async(o,e,t,a,n,r,i=8)=>{if(r.type==="image"){const d=await ye(r.data.src);i<8?o.drawImage(d,0,0,d.width*(i/8),d.height*(i/8),a,n,e,t):o.drawImage(d,a,n,e,t);return}const s=await(r.type==="solid"?r.data.color:We(o,r.data,e,t,a,n));if(s===null)throw new Error("Cannot create canvas fill style");o.fillStyle=s,o.fillRect(a,n,e,t)},Oe=22,Ge="Fira Mono",ae=(o,e,t,a,n=!1,r,i,s,d)=>{const h=i/1024;if(h<=.32)return;const g=Oe*h,c=6*h,f=4*h,m="1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26".split(",").slice(0,a),_=n?m:m.reverse();o.font=`${g}px ${Ge}`,o.textBaseline=s?"middle":"top",_.forEach((C,B)=>{o.fillStyle=r>0?e.onBorder:B%2===0?e.onLight:e.onDark;const y=s?r/2:c,k=(s?t*B+r+t/2:t*B+c)+d;o.textAlign=s?"center":"left",o.fillText(C,y,k)});const p="ABCDEFGHIJKLMNOPQRSTUWVXYZ".split("").slice(0,a),S=n?p.reverse():p;o.textBaseline=s?"middle":"bottom",S.forEach((C,B)=>{o.fillStyle=r>0?e.onBorder:B%2===0?e.onDark:e.onLight;const y=s?t*B+r+t/2:t*B+c,k=(s?i-r/2:i-f)+d;o.textAlign=s?"center":"left",o.fillText(C,y,k)})},je=(o,e,t)=>{o=o/255,e=e/255,t=t/255;let a=Math.max(o,e,t),n=a-Math.min(o,e,t),r=1-Math.abs(a+a-n-1),i=n&&(a==o?(e-t)/n:a==e?2+(t-o)/n:4+(o-e)/n);return[60*(i<0?i+6:i),r?n/r:0,(a+a-n)/2]};let He=(o,e,t)=>{const a=e*Math.min(t,1-t),n=(r,i=(r+o/30)%12)=>t-a*Math.max(Math.min(i-3,9-i,1),-1);return"#"+[Math.round(n(0)*255),Math.round(n(8)*255),Math.round(n(4)*255)].map(r=>r.toString(16)).join("")};const ne=(o,e,t=0,a=0)=>{const[n,r,i]=me(o.length===4?1:2,o.slice(1).split("")).map(c=>parseInt(c.join(""),16));let[s,d,h]=je(n,r,i);const g=Math.abs(e);return s>=60&&s<240?(s+=e,s<60&&s>60-g?s=60:s>240&&s<240+g&&(s=240)):(s-=e,s>60&&s<60+g?s=60:s<240&&s>240-g&&(s=240)),s=s>360?s-360:s>0?s+360:s,d=Math.min(1,Math.max(0,d+t)),h=Math.min(1,Math.max(0,h+a)),He(s,d,h)},Xe="abcdefghijklmnopqrstuwvxyz",re=(o,e,t)=>{const a=Xe.indexOf(o[0]),n=Number(o[1])-1;return[e?t-a-1:a,e?n:t-n-1]},Ue=async(o,e,t,{dark:a,light:n,moveIndicator:r},i,s,d,h)=>{const[g,c]=re(e.from,d,s),[f,m]=re(e.to,d,s),[_,p,S,C]=[g,c,f,m].map(k=>k*t+i);let B,y;if(r.type==="hueShift"){const k={type:"solid",data:{color:n.data.color?ne(n.data.color,r.data):"#00ff0055"}},$={type:"solid",data:{color:a.data.color?ne(a.data.color,r.data):"#00ff0055"}};B=(g+c)%2===0?k:$,y=(f+m)%2===0?k:$}else B={type:"solid",data:{color:r.data}},y=B;j(o,t,t,_,p+h,B),j(o,t,t,S,C+h,y)},te={Event:"E",Site:"S",Round:"N",White:"W",Black:"B",Date:"D",Result:"R",FEN:"F",WhiteElo:"WE",BlackElo:"BE"},be=Object.keys(te),Ye=Object.fromEntries(Object.entries(te).map(([o,e])=>[e,o])),Ke=o=>{const e=new O.Chess;if(e.load_pgn(o),e.delete_comments(),!e.header().Result){const i=(o.trim().match(/(1-0)|(0-1)|(1\/2-1\/2)$/)||[])[0];i&&e.header("Result",i)}const t=Object.entries(e.header()),[a,n]=t.length>0?e.pgn().split(`
|
|
|
|
`):[void 0,e.pgn()];return[t.filter(([i,s])=>be.includes(i)&&s!=="?").map(([i,s])=>`[${i} "${s}"]`).sort().join(`
|
|
`),n].join(`
|
|
|
|
`)},se=o=>{const e=new O.Chess;e.load_pgn(o);const t=e.history().join(" "),a=Object.entries(e.header()).filter(([n])=>be.includes(n)).map(([n,r])=>`${te[n]} ${r}`).sort().join(`
|
|
`);return btoa([a,t].join(`
|
|
|
|
`))},qe=o=>{const[e,t]=atob(o).split(`
|
|
|
|
`);let a;const n=e.split(`
|
|
`).map(i=>{const[s,...d]=i.split(" "),h=d.join(" ");return s==="R"&&(a=h),`[${Ye[s]} "${h}"]`}).join(`
|
|
`),r=t.split(" ").map((i,s)=>s%2===0?`${s/2+1}. ${i}`:i).join(" ")+` ${a}`;return[n,r].join(`
|
|
|
|
`)},Je=["January","February","March","April","May","June","July","August","September","October","November","December"],Ve=o=>{const[e,t,a]=o.split(".").map(Number),n=Number.isNaN(t)?null:Je[t-1],r=Number.isNaN(a)||n===null?null:a,i=Number.isNaN(e)?null:e;return n&&r&&i?`${n} ${r}, ${i}`:n&&i?`${n} ${i}`:i?String(i):""},ie=o=>o.split(",").map(e=>e.trim()).reverse().join(" "),K=o=>{if(o===null)return!1;try{return new URL(o),!0}catch{return!1}},Qe=new Map([["q",9],["r",5],["b",3],["n",3],["p",1]]),F=(o,e=null)=>!o||o==="?"?e:o;class H{positions=[];game=new O.Chess;constructor(){}loadPGN(e){const t=new O.Chess,a=new O.Chess;t.load_pgn(Ke(e)),t.delete_comments();const n=t.history({verbose:!0}),r=t.header().FEN;return r&&a.load(r),this.positions=[{ply:0,move:null,end:n.length,fen:a.fen(),check:a.in_check(),mate:a.in_checkmate(),turn:a.turn(),material:this.materialInfo(a.board()),placement:this.getPlacement(a.fen()),last:n.length===0}],n.forEach((i,s)=>{a.move(i);const d=a.fen();this.positions.push({ply:s+1,move:i,end:n.length-1-s,fen:d,check:a.in_check(),mate:a.in_checkmate(),turn:a.turn(),material:this.materialInfo(a.board()),placement:this.getPlacement(d),last:s===n.length-1})}),this.game=t,this}loadFEN(e){return this.game=new O.Chess(e),this.positions=[{ply:0,move:null,end:0,fen:e,check:this.game.in_check(),mate:this.game.in_checkmate(),turn:this.game.turn(),material:this.materialInfo(this.game.board()),placement:this.getPlacement(this.game.fen()),last:!0}],this}getPlacement(e){const t=new O.Chess(e).board(),a=[];for(let n=0;n<8;n++)for(let r=0;r<8;r++)if(t[n][r]!==null){const{type:i,color:s}=t[n][r];a.push({x:r,y:n,type:i,color:s})}return a}materialInfo(e){const t=e.flat().filter(Boolean),a={w:0,b:0},n={w:{p:0,n:0,b:0,r:0,q:0},b:{p:0,n:0,b:0,r:0,q:0}},r={w:{p:0,n:0,b:0,r:0,q:0},b:{p:0,n:0,b:0,r:0,q:0}};for(const i of t)if(i!==null&&i.type!=="k"){a[i.color]+=Qe.get(i.type)??0,r[i.color][i.type]+=1;const s=i.color==="b"?"w":"b";n[s][i.type]===0?n[i.color][i.type]+=1:n[s][i.type]-=1}return{sum:a,imbalance:n,count:r,diff:a.w-a.b}}get length(){return this.positions.length}get header(){const e=this.game.header(),t=F(e.White,"Anonymous"),a=F(e.Black,"Anonymous"),n=F(e.Date);return{White:t,Black:a,WhitePretty:ie(t),BlackPretty:ie(a),WhiteElo:F(e.WhiteElo),BlackElo:F(e.BlackElo),Date:n,DatePretty:n===null?null:Ve(n),Event:F(e.Event),Round:F(e.Round),Site:F(e.Site),Result:F(e.Result)}}getTitle({anonymous:e}){const t=this.header,a=e?"Anonymous":t.WhitePretty,n=e?"Anonymous":t.BlackPretty;return`${a} vs ${n}`+(t.Event?` | ${t.Event}`:"")+(t.Round?`, Round ${t.Round}`:"")+(t.DatePretty?` | ${t.DatePretty}`:"")}getFileName(e){const t=this.header,a=e?"Anonymous":t.WhitePretty,n=e?"Anonymous":t.BlackPretty;return((t.Date?`${t.Date.replace(/\?/g,"X").replace(/\./g,"-")}_`:"")+`${a}_${n}`+(t.Event?`_${t.Event}`:"")+(t.Round?`_R${t.Round}`:"")).replace(/\s+/g,"-")}get pgn(){return this.game.pgn()}get anonymousPGN(){const e=this.game.pgn().replace(/\[White .+\]/,'[White "Anonymous"]').replace(/\[Black .+\]/,'[Black "Anonymous"]');return K(this.header.Site)?e.replace(/\[Site .+\]/,'[Site "?"]'):e}getPosition(e){return this.positions[e]??null}getMoves(){return this.positions.slice(1).map(({move:e})=>e?.san)}}const Ze=()=>{const o=localStorage.getItem("boardConfig"),e=localStorage.getItem("gameConfig");return{boardConfig:o===null?{}:JSON.parse(o),gameConfig:e===null?{}:JSON.parse(e)}},ve=Ie(),le=Ze(),et={size:1024,tiles:8,boardStyle:"standard",piecesStyle:"tatiana",showBorder:!ve,showExtraInfo:!0,showMaterial:!0,showMoveIndicator:!0,showChecks:!0,showCoords:!0,showShadows:!1,flipped:!1},tt={titleScreen:!0,format:"GIF",picSize:"M",animationSize:"M"},_e={boardConfig:{...et,...le.boardConfig},gameConfig:{...tt,...le.gameConfig},game:new H,pgn:"",fen:"",moves:[],ply:0,mobile:ve,layout:window.innerWidth<window.innerHeight?"single":window.innerWidth<1366?"double":"triple",activeTab:"load",playing:!1,anonymous:!1,refreshHash:!0};console.log(_e);const[l,v]=Pe(_e),ot=["adventurer","alfonso_x","alpha","berlin","california","cardinal","cases","cburnett","chess7","chessnut","companion","condal","dubrovny","fantasy","fresca","gioco","governor","harlequin","horsey","icpieces","kingdom","kosal","leipzig","letter","line","lucena","maestro","magnetic","mark","marroquin","maya","mediaeval","merida","millennia","motif","pirat","pirouetti","pixel","regular","reillycraig","riohacha","shapes","smart","spatial","staunty","tatiana","tfb","traveller","utrecht","wisdom"],at=["bb","bw","kb","kw","nb","nw","pb","pw","qb","qw","rb","rw"];let de=null,ce=new Map;const nt={async load(o){await Promise.all(at.map(e=>{const t=`/pieces/${o}/${e}.svg`;return ye(t).then(a=>{ce.set(e,a)})}))},async get(o,e,t){de!==o&&(await this.load(o),de=o);const a=`${e}${t}`;return ce.get(a)}},rt=async(o,e,t,a,n,r,i,s=!0)=>{const{placement:d,check:h,mate:g,turn:c}=e;o.shadowColor="rgba(0, 0, 0, 0)",o.shadowBlur=0,o.shadowOffsetX=0,o.shadowOffsetY=0;for(const{x:f,y:m,type:_,color:p}of d){const S=await nt.get(i,_,p),C=n?8-1-m:m,B=n?8-1-f:f;if((h||g)&&_==="k"&&p===c){const y=g?"#ff002f":"#ffa600";o.shadowColor=y,o.shadowBlur=t*(l.mobile,.15),o.shadowOffsetX=0,o.shadowOffsetY=0,o.drawImage(S,a+B*t,a+C*t+r,t,t)}else s&&(o.shadowColor="rgba(0, 0, 0, 0.5)",o.shadowOffsetX=t*.07,o.shadowOffsetY=t*.07,o.shadowBlur=t*.1);o.drawImage(S,a+B*t,a+C*t+r,t,t),o.shadowColor="rgba(0, 0, 0, 0)",o.shadowBlur=0,o.shadowOffsetX=0,o.shadowOffsetY=0}},P=(o,e,t,a,n,r,i,s,d)=>(o.font=`${n} ${a}px ${t}`,o.textAlign=s,o.textBaseline="middle",o.fillText(e,r,i,d),Math.ceil(o.measureText(e).width)),st=async(o,e,t,a,n,r)=>{o.clearRect(0,0,e,e),await j(o,e,e+a*2,0,0,n.border);const i="Ubuntu",s=[{key:"WhitePretty",line:60*t,fontSize:42*t,n:0},{key:"BlackPretty",line:60*t,fontSize:42*t,n:2},{key:"Event",line:30*t,fontSize:20*t,n:4},{key:"Round",line:30*t,fontSize:20*t,n:5},{key:"DatePretty",line:30*t,fontSize:20*t,n:7},{key:"Site",line:30*t,fontSize:20*t,n:8}],d=new Set(Object.keys(r)),h=s.filter(({key:f})=>d.has(f));if(r.WhitePretty&&r.BlackPretty&&h.push({key:"vs",line:50*t,fontSize:20*t,n:1}),(r.Event||r.Round)&&h.push({key:"margin",line:100*t,fontSize:0,n:3}),r.Date||r.Site){const f=r.Event||r.Round?20*t:100*t;h.push({key:"margin",line:f,fontSize:0,n:6})}const g=h.reduce((f,m)=>f+m.line,0);let c=(e+a*2-g)/2;o.fillStyle=n.coords.onBorder,h.sort((f,m)=>f.n-m.n).forEach(({key:f,line:m,fontSize:_})=>{if(f==="vs"){const S=c+m/2;P(o,"vs",i,_,700,e/2,S,"center"),c+=m;return}if(f==="margin"){c+=m;return}const p=r[f];if(p){const S=f==="Round"?`Round ${p}`:p,C=c+m/2;P(o,S,i,_,700,e/2,C,"center",e*.9)}c+=m})},he={k:"l",q:"w",r:"t",b:"n",n:"j",p:"o"},it=async(o,e,t,a,n,r,i,s,d)=>{const h=Math.round(20*a);let g=(n-h)/2,c=n/2;const f=g;o.fillStyle=r.coords.onBorder;{const y=P(o,i.White==="Anonymous"?"White":i.White,"Ubuntu",h,700,f,s?c:t-c,"left"),k=i.WhiteElo?` ${i.WhiteElo}`:"";P(o,k,"Fira Mono",h,500,f+y,s?c:t-c,"left")}{const y=P(o,i.Black==="Anonymous"?"Black":i.Black,"Ubuntu",h,700,f,s?t-c:c,"left"),k=i.BlackElo?` ${i.BlackElo}`:"";P(o,k,"Fira Mono",h,500,f+y,s?t-c:c,"left")}let m=0,_=0;if(d.last&&i.Result){const[y,k]=i.Result.split("-"),$=y==="0"?"Lost":y==="1"?"Won":"Draw",E=k==="0"?"Lost":k==="1"?"Won":"Draw",A=P(o,$,"Ubuntu",h,700,e-g,s?c:t-c,"right"),x=P(o,E,"Ubuntu",h,700,e-g,s?t-c:c,"right"),R=Math.max(A,x);m=R+20*a,_=R+20*a}const{diff:p,imbalance:S}=d.material,C=p>0?`+${Math.abs(p)}`:"";m+=P(o,C,"Fira Mono",h,500,e-g-m,s?c:t-c,"right");const B=p<0?`+${Math.abs(p)}`:"";_+=P(o,B,"Fira Mono",h,500,e-g-_,s?t-c:c,"right");for(const[y,k]of Object.entries(S.w))for(let $=0;$<k;$++){const E=P(o,he[y],"Chess",h,500,e-g-m,(s?c:t-c)-2*a,"right");m+=$===k-1?E*.85:y==="p"?E*.4:E*.6}for(const[y,k]of Object.entries(S.b))for(let $=0;$<k;$++){const E=P(o,he[y],"Chess",h,500,e-g-_,(s?t-c:c)-2*a,"right");_+=$===k-1?E*.85:y==="p"?E*.4:E*.6}},lt={name:"Standard",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#00ad88"}},light:{type:"solid",data:{color:"#9EE0BC"}},moveIndicator:{type:"color",data:"#ffff0055"},border:{type:"solid",data:{color:"#00735a"}},coords:{onLight:"#00735a",onDark:"#d4fff5",onBorder:"#bbfaec"}},dt={name:"Spring",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#6BB53E"}},light:{type:"solid",data:{color:"#C1D997"}},moveIndicator:{type:"color",data:"#ffff0055"},border:{type:"solid",data:{color:"#40761E"}},coords:{onLight:"#40761E",onDark:"#DBF5AD",onBorder:"#DBF5AD"}},ct={name:"Azure",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#277ECE"}},light:{type:"solid",data:{color:"#7DD3E2"}},moveIndicator:{type:"color",data:"#ffff0055"},border:{type:"solid",data:{color:"#0F508C"}},coords:{onLight:"#0F508C",onDark:"#ACE3EC",onBorder:"#ACE3EC"}},ht={name:"Clay",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#BF5344"}},light:{type:"solid",data:{color:"#D9B08F"}},moveIndicator:{type:"color",data:"#ffff0055"},border:{type:"solid",data:{color:"#793329"}},coords:{onLight:"#793329",onDark:"#F4C8A3",onBorder:"#F4C8A3"}},ft={name:"Rock",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#949494"}},light:{type:"solid",data:{color:"#D4D4D4"}},moveIndicator:{type:"color",data:"#ffff0055"},border:{type:"solid",data:{color:"#595959"}},coords:{onLight:"#595959",onDark:"#EAEAEA",onBorder:"#EAEAEA"}},gt={name:"Danny",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#769656"}},light:{type:"solid",data:{color:"#eeeed2"}},moveIndicator:{type:"color",data:"#ffff007f"},border:{type:"solid",data:{color:"#312e2b"}},coords:{onLight:"#40522f",onDark:"#fcfce1",onBorder:"#eeeed2"}},ut={name:"Danny Green",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#569666"}},light:{type:"solid",data:{color:"#eeeed2"}},moveIndicator:{type:"color",data:"#40ff007f"},border:{type:"solid",data:{color:"#2B312B"}},coords:{onLight:"#2F5238",onDark:"#fcfce1",onBorder:"#eeeed2"}},mt={name:"Danny Cyan",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#569696"}},light:{type:"solid",data:{color:"#eeeed2"}},moveIndicator:{type:"color",data:"#00ff807f"},border:{type:"solid",data:{color:"#2B3130"}},coords:{onLight:"#2F5152",onDark:"#fcfce1",onBorder:"#eeeed2"}},pt={name:"Danny Blue",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#566696"}},light:{type:"solid",data:{color:"#eeeed2"}},moveIndicator:{type:"color",data:"#00bfff7f"},border:{type:"solid",data:{color:"#2B2E31"}},coords:{onLight:"#2F3752",onDark:"#fcfce1",onBorder:"#eeeed2"}},yt={name:"Danny Purple",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#765696"}},light:{type:"solid",data:{color:"#eeeed2"}},moveIndicator:{type:"color",data:"#ff38af7f"},border:{type:"solid",data:{color:"#2D2B31"}},coords:{onLight:"#412F52b",onDark:"#fcfce1",onBorder:"#eeeed2"}},bt={name:"Danny Pink",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#965686"}},light:{type:"solid",data:{color:"#eeeed2"}},moveIndicator:{type:"color",data:"#ff38637f"},border:{type:"solid",data:{color:"#312B31"}},coords:{onLight:"#522F49",onDark:"#fcfce1",onBorder:"#eeeed2"}},vt={name:"Danny Red",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#965656"}},light:{type:"solid",data:{color:"#eeeed2"}},moveIndicator:{type:"color",data:"#ffaf387f"},border:{type:"solid",data:{color:"#312B2D"}},coords:{onLight:"#522F2F",onDark:"#fcfce1",onBorder:"#eeeed2"}},_t={name:"Danny Yellow",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#968656"}},light:{type:"solid",data:{color:"#eeeed2"}},moveIndicator:{type:"color",data:"#ffff007f"},border:{type:"solid",data:{color:"#312E2B"}},coords:{onLight:"#524A2F",onDark:"#fcfce1",onBorder:"#eeeed2"}},$t={name:"Lichess",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#b58863"}},light:{type:"solid",data:{color:"#f0d9b5"}},moveIndicator:{type:"hueShift",data:-40},border:{type:"solid",data:{color:"#80634d"}},coords:{onLight:"#9c6f49",onDark:"#f9f0e1",onBorder:"#f9f0e1"}},wt={name:"Leko",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#919caf"}},light:{type:"solid",data:{color:"#c0c2d0"}},moveIndicator:{type:"hueShift",data:-90},border:{type:"solid",data:{color:"#58606e"}},coords:{onLight:"#58606e",onDark:"#dbe8ff",onBorder:"#dbe8ff"}},kt={name:"Beige",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#93b092"}},light:{type:"solid",data:{color:"#becfc2"}},moveIndicator:{type:"hueShift",data:90},border:{type:"solid",data:{color:"#596e59"}},coords:{onLight:"#596e59",onDark:"#e4f5e4",onBorder:"#e4f5e4"}},St={name:"Lila",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#c0acb5"}},light:{type:"solid",data:{color:"#e5d0cb"}},moveIndicator:{type:"hueShift",data:-120},border:{type:"solid",data:{color:"#735c66"}},coords:{onLight:"#876b77",onDark:"#fff5f2",onBorder:"#e5d0cb"}},Ct={name:"Peach",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#E54B4B"}},light:{type:"solid",data:{color:"#EFB293"}},moveIndicator:{type:"hueShift",data:30},border:{type:"solid",data:{color:"#9E3131"}},coords:{onLight:"#e54b4b",onDark:"#EFB293",onBorder:"#EFB293"}},Bt={name:"Violet",category:"solid",background:{type:"solid",data:{color:"#361b52"}},dark:{type:"solid",data:{color:"#7b4fa8"}},light:{type:"solid",data:{color:"#CB95CB"}},moveIndicator:{type:"hueShift",data:-60},border:{type:"solid",data:{color:"#50346e"}},coords:{onLight:"#50346e",onDark:"#eedeff",onBorder:"#e2c7ff"}},Et={name:"Danya",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#4c7399"}},light:{type:"solid",data:{color:"#eae9d2"}},moveIndicator:{type:"color",data:"#00a5ff7f"},border:{type:"solid",data:{color:"#2a4057"}},coords:{onLight:"#2a4057",onDark:"#fffff0",onBorder:"#eae9d2"}},Dt={name:"Botez",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#8877b6"}},light:{type:"solid",data:{color:"#efefef"}},moveIndicator:{type:"color",data:"#7dacc97f"},border:{type:"solid",data:{color:"#554973"}},coords:{onLight:"#554973",onDark:"#f2f2f2",onBorder:"#efefef"}},Lt={name:"Beige",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#b0a392"}},light:{type:"solid",data:{color:"#cfc8be"}},moveIndicator:{type:"hueShift",data:60},border:{type:"solid",data:{color:"#6e6559"}},coords:{onLight:"#6e6559",onDark:"#f5eee5",onBorder:"#f5eee5"}},It={name:"Rose",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#F04A73"}},light:{type:"solid",data:{color:"#F7A8A1"}},moveIndicator:{type:"hueShift",data:-30},border:{type:"solid",data:{color:"#A62444"}},coords:{onLight:"#f04a73",onDark:"#ffb8c9",onBorder:"#ffb8c9"}},Pt={name:"Avocado",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#72a843"}},light:{type:"solid",data:{color:"#ececa4"}},moveIndicator:{type:"hueShift",data:70},border:{type:"solid",data:{color:"#2d3923"}},coords:{onLight:"#4d7a26",onDark:"#ffffc4",onBorder:"#ececa4"}},Nt={name:"Mono Teal",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#106C73"}},light:{type:"solid",data:{color:"#4C989D"}},moveIndicator:{type:"hueShift",data:-30},border:{type:"solid",data:{color:"#106C73"}},coords:{onLight:"#00000088",onDark:"#ffffffcc",onBorder:"#ffffffcc"}},At={name:"Mono Chico",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#885953"}},light:{type:"solid",data:{color:"#AB8A86"}},moveIndicator:{type:"hueShift",data:-30},border:{type:"solid",data:{color:"#885953"}},coords:{onLight:"#00000088",onDark:"#ffffffcc",onBorder:"#ffffffcc"}},xt={name:"Mono Goblin",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#468557"}},light:{type:"solid",data:{color:"#7DA989"}},moveIndicator:{type:"hueShift",data:40},border:{type:"solid",data:{color:"#468557"}},coords:{onLight:"#00000088",onDark:"#ffffffcc",onBorder:"#ffffffcc"}},Ft={name:"Mono Mahogany",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#CA3838"}},light:{type:"solid",data:{color:"#DA7373"}},moveIndicator:{type:"hueShift",data:30},border:{type:"solid",data:{color:"#CA3838"}},coords:{onLight:"#00000088",onDark:"#ffffffcc",onBorder:"#ffffffcc"}},Rt={name:"Mono Blue",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#C95D3B"}},light:{type:"solid",data:{color:"#D98D75"}},moveIndicator:{type:"hueShift",data:30},border:{type:"solid",data:{color:"#C95D3B"}},coords:{onLight:"#00000088",onDark:"#ffffffcc",onBorder:"#ffffffcc"}},Mt={name:"Mono Mulberry",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#C24B84"}},light:{type:"solid",data:{color:"#D481A9"}},moveIndicator:{type:"hueShift",data:-30},border:{type:"solid",data:{color:"#C24B84"}},coords:{onLight:"#00000088",onDark:"#ffffffcc",onBorder:"#ffffffcc"}},Tt={name:"Mono Sycamore",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#809D41"}},light:{type:"solid",data:{color:"#A6BA7A"}},moveIndicator:{type:"hueShift",data:60},border:{type:"solid",data:{color:"#809D41"}},coords:{onLight:"#00000088",onDark:"#ffffffcc",onBorder:"#ffffffcc"}},zt={name:"Mono Blue",category:"solid",background:{type:"solid",data:{color:"transparent"}},dark:{type:"solid",data:{color:"#514FAE"}},light:{type:"solid",data:{color:"#8583C6"}},moveIndicator:{type:"hueShift",data:-30},border:{type:"solid",data:{color:"#514FAE"}},coords:{onLight:"#00000088",onDark:"#ffffffcc",onBorder:"#ffffffcc"}},Wt={name:"Smooth Sunset",category:"gradient",background:{type:"gradient",data:{dir:"diagonal-top",colors:["#F5B061","#EC366D"]}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"#ffffff7f"}},moveIndicator:{type:"color",data:"#00ffee55"},border:{type:"gradient",data:{dir:"diagonal-top",colors:["#DC7D47","#C32C73"]}},coords:{onLight:"#CF545D",onDark:"#fff",onBorder:"#fff"}},Ot={name:"Smooth Summer",category:"gradient",background:{type:"gradient",data:{dir:"diagonal-top",colors:["#F5CB61","#F58D61"]}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"#ffffff7f"}},moveIndicator:{type:"color",data:"#00ffee55"},border:{type:"gradient",data:{dir:"diagonal-top",colors:["#D1AC4F","#D07852"]}},coords:{onLight:"#B2793C",onDark:"#fff",onBorder:"#fff"}},Gt={name:"Smooth Spring",category:"gradient",background:{type:"gradient",data:{dir:"diagonal-top",colors:["#D9DC5C","#60C945"]}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"#ffffff7f"}},moveIndicator:{type:"color",data:"#00ffee55"},border:{type:"gradient",data:{dir:"diagonal-top",colors:["#B9BC4E","#50A839"]}},coords:{onLight:"#81A33A",onDark:"#fff",onBorder:"#fff"}},jt={name:"Smooth Forest",category:"gradient",background:{type:"gradient",data:{dir:"diagonal-top",colors:["#96C93D","#00B09B"]}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"#ffffff7f"}},moveIndicator:{type:"color",data:"#00ffee55"},border:{type:"gradient",data:{dir:"diagonal-top",colors:["#65A32E","#007A80"]}},coords:{onLight:"#328E57",onDark:"#fff",onBorder:"#fff"}},Ht={name:"Smooth Laguna",category:"gradient",background:{type:"gradient",data:{dir:"diagonal-top",colors:["#00c4a0","#096fe0"]}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"#ffffff7f"}},moveIndicator:{type:"color",data:"#3cff0055"},border:{type:"gradient",data:{dir:"diagonal-top",colors:["#009c7f","#0052ad"]}},coords:{onLight:"#007795",onDark:"#fff",onBorder:"#fff"}},Xt={name:"Smooth Sea",category:"gradient",background:{type:"gradient",data:{dir:"diagonal-top",colors:["#2881E4","#9E52FF"]}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"#ffffff7f"}},moveIndicator:{type:"color",data:"#3cff0055"},border:{type:"gradient",data:{dir:"diagonal-top",colors:["#1863B7","#773DC1"]}},coords:{onLight:"#4750BC",onDark:"#fff",onBorder:"#fff"}},Ut={name:"Smooth Violet",category:"gradient",background:{type:"gradient",data:{dir:"diagonal-top",colors:["#DC3BCC","#9E52FF"]}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"#ffffff7f"}},moveIndicator:{type:"color",data:"#3cff0055"},border:{type:"gradient",data:{dir:"diagonal-top",colors:["#AF2EA2","#8243D3"]}},coords:{onLight:"#9838BA",onDark:"#fff",onBorder:"#fff"}},Yt={name:"Smooth Mono",category:"gradient",background:{type:"gradient",data:{dir:"diagonal-top",colors:["#BFBFBF","#7D7D7D"]}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"#ffffff7f"}},moveIndicator:{type:"color",data:"#3cff0055"},border:{type:"gradient",data:{dir:"diagonal-top",colors:["#A1A1A1","#606060"]}},coords:{onLight:"#818181",onDark:"#fff",onBorder:"#fff"}},Kt={name:"Contrast A",category:"gradient",background:{type:"gradient",data:{dir:"vertical",colors:["#ff9b38","#389bff"]}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"#ffffff66"}},moveIndicator:{type:"color",data:"#3cff0055"},border:{type:"gradient",data:{dir:"vertical",colors:["#f27f0d","#0d7ff2"]}},coords:{onLight:"#00000077",onDark:"#fff",onBorder:"#fff"}},qt={name:"Contrast B",category:"gradient",background:{type:"gradient",data:{dir:"vertical",colors:["#FF4DA6","#4D74FF"]}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"#ffffff66"}},moveIndicator:{type:"color",data:"#3cff0055"},border:{type:"gradient",data:{dir:"vertical",colors:["#BB3D7C","#3653BB"]}},coords:{onLight:"#00000077",onDark:"#fff",onBorder:"#fff"}},Jt={name:"Contrast C",category:"gradient",background:{type:"gradient",data:{dir:"vertical",colors:["#FF8D4D","#914DFF"]}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"#ffffff66"}},moveIndicator:{type:"color",data:"#3cff0055"},border:{type:"gradient",data:{dir:"vertical",colors:["#E8702C","#6334B0"]}},coords:{onLight:"#00000077",onDark:"#fff",onBorder:"#fff"}},Vt={name:"Contrast D",category:"gradient",background:{type:"gradient",data:{dir:"vertical",colors:["#61c43f","#864DFF"]}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"#ffffff66"}},moveIndicator:{type:"color",data:"#3cff0055"},border:{type:"gradient",data:{dir:"vertical",colors:["#559a3c","#6333cc"]}},coords:{onLight:"#00000077",onDark:"#fff",onBorder:"#fff"}},Qt={name:"Wood 1",category:"pic",background:{type:"image",data:{src:"/textures/wood01.jpg"}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"transparent"}},moveIndicator:{type:"color",data:"#55ff0022"},border:{type:"image",data:{src:"/textures/wood01_bg.jpg"}},coords:{onLight:"#604939",onDark:"#e1d0b7",onBorder:"#dac4a4"},ico:"/textures/wood01_ico.png"},Zt={name:"Wood 2",category:"pic",background:{type:"image",data:{src:"/textures/wood02.jpg"}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"transparent"}},moveIndicator:{type:"color",data:"#55ff0022"},border:{type:"image",data:{src:"/textures/wood02_bg.jpg"}},coords:{onLight:"#704642",onDark:"#e1c1b7",onBorder:"#d9b1a5"},ico:"/textures/wood02_ico.png"},eo={name:"Wood 3",category:"pic",background:{type:"image",data:{src:"/textures/wood03.jpg"}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"transparent"}},moveIndicator:{type:"color",data:"#ff007733"},border:{type:"image",data:{src:"/textures/wood03_bg.jpg"}},coords:{onLight:"#986738",onDark:"#e2d3b6",onBorder:"#dac7a0"},ico:"/textures/wood03_ico.png"},to={name:"Wood 4",category:"pic",background:{type:"image",data:{src:"/textures/wood04.jpg"}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"transparent"}},moveIndicator:{type:"color",data:"#ff007733"},border:{type:"image",data:{src:"/textures/wood04_bg.jpg"}},coords:{onLight:"#9e543b",onDark:"#e3c7b5",onBorder:"#ddbba4"},ico:"/textures/wood04_ico.png"},oo={name:"Wood 5",category:"pic",background:{type:"image",data:{src:"/textures/wood05.jpg"}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"transparent"}},moveIndicator:{type:"color",data:"#55ff0022"},border:{type:"image",data:{src:"/textures/wood05_bg.jpg"}},coords:{onLight:"#8f653d",onDark:"#e3ceb5",onBorder:"#dcc2a3"},ico:"/textures/wood05_ico.png"},ao={name:"Wood 6",category:"pic",background:{type:"image",data:{src:"/textures/wood06.jpg"}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"transparent"}},moveIndicator:{type:"color",data:"#55ff0022"},border:{type:"image",data:{src:"/textures/wood06_bg.jpg"}},coords:{onLight:"#865946",onDark:"#dfc8b9",onBorder:"#d7bba8"},ico:"/textures/wood06_ico.png"},no={name:"Wood 7",category:"pic",background:{type:"image",data:{src:"/textures/wood07.jpg"}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"transparent"}},moveIndicator:{type:"color",data:"#55ff0022"},border:{type:"image",data:{src:"/textures/wood07_bg.jpg"}},coords:{onLight:"#734926",onDark:"#cab99b",onBorder:"#cab99b"},ico:"/textures/wood07_ico.png"},ro={name:"Wood 8",category:"pic",background:{type:"image",data:{src:"/textures/wood08.jpg"}},dark:{type:"solid",data:{color:"transparent"}},light:{type:"solid",data:{color:"transparent"}},moveIndicator:{type:"color",data:"#55ff0022"},border:{type:"image",data:{src:"/textures/wood08_bg.jpg"}},coords:{onLight:"#723627",onDark:"#cbad9a",onBorder:"#cbad9a"},ico:"/textures/wood08_ico.png"},Q={standard:lt,spring:dt,azure:ct,violet:Bt,rose:It,peach:Ct,clay:ht,rock:ft,lila:St,leko:wt,patina:kt,mud:Lt,danny:gt,dannyGreen:ut,dannyCyan:mt,dannyBlue:pt,dannyPurple:yt,dannyPink:bt,dannyRed:vt,dannyYellow:_t,lichess:$t,danya:Et,botez:Dt,avocado:Pt,monoChico:At,monoMojo:Rt,monoMahogany:Ft,monoMulberry:Mt,monoBlue:zt,monoTeal:Nt,monoGoblin:xt,monoSycamore:Tt,smoothSunset:Wt,smoothSummer:Ot,smoothSpring:Gt,smoothForest:jt,smoothLaguna:Ht,smoothSea:Xt,smoothViolet:Ut,smoothMono:Yt,contrastA:Kt,contrastB:qt,contrastC:Jt,contrastD:Vt,wood1:Qt,wood2:Zt,wood3:eo,wood4:to,wood5:oo,wood6:ao,wood7:no,wood8:ro},so={size:720,tiles:8,boardStyle:"standard",piecesStyle:"tatiana",showBorder:!0,showExtraInfo:!0,showMaterial:!0,showMoveIndicator:!0,showChecks:!0,showCoords:!0,showShadows:!1,flipped:!1},io={White:"White",Black:"Black",WhitePretty:"White",BlackPretty:"Black",WhiteElo:null,BlackElo:null,Date:null,DatePretty:null,Event:null,Round:null,Site:null,Result:null};class q{cfg=so;_anonymous=!1;scale=1;size=0;squareSize=0;innerSize=0;borderWidth=0;margin=0;style=Q.standard;header=io;lastPosition=null;background=null;currentScreen="move";ctx;tempCtx;tempCanvas=document.createElement("canvas");canvas=document.createElement("canvas");constructor(e={},t){t&&(this.canvas=t);const a=this.canvas.getContext("2d"),n=this.tempCanvas.getContext("2d");if(this.canvas.classList.add("board"),a===null||n===null)throw new Error("Cannot create canvas 2D context");this.ctx=a,this.tempCtx=n,this.updateConfig(e,!1)}async updateConfig(e,t=!0){const a={...this.cfg,...e};this.cfg=a,this.setSize(a.size),this.setStyle(a.boardStyle),t&&await this.refresh()}set anonymous(e){this._anonymous=e,this.refresh()}async refresh(){await this.renderBackground(),this.currentScreen==="title"?await this.titleFrame(this.header):this.lastPosition!==null&&await this.frame(this.lastPosition,this.header),this.render()}setSize(e){this.size=e,this.scale=e/720,this.margin=this.cfg.showExtraInfo?Math.round(50*this.scale):0;const t=e+this.margin*2;(this.canvas.width!==e||this.canvas.height!==t)&&(this.canvas.width=e,this.canvas.height=t,this.tempCanvas.width=e,this.tempCanvas.height=t);const a=this.cfg.showBorder?this.size/32:0,n=this.size-a*2;return this.squareSize=Math.floor(n/this.cfg.tiles),this.innerSize=this.squareSize*this.cfg.tiles,this.borderWidth=(this.size-this.innerSize)/2,this}getSize(){return this.size}setStyle(e){return this.style=Q[e],this.cfg.boardStyle=e,this.refresh(),this}setPiecesStyle(e){return this.cfg.piecesStyle=e,this.refresh(),this}flip(){return this.cfg.flipped=!this.cfg.flipped,this.refresh(),this}flipWhite(){if(!!this.cfg.flipped)return this.cfg.flipped=!1,this.refresh(),this}flipBlack(){if(!this.cfg.flipped)return this.cfg.flipped=!0,this.refresh(),this}hideBorder(){return this.cfg.showBorder=!1,this.setSize(this.size),this.refresh(),this}showBorder(){return this.cfg.showBorder=!0,this.setSize(this.size),this.refresh(),this}toggleBorder(){return this.cfg.showBorder=!this.cfg.showBorder,this.setSize(this.size),this.refresh(),this}toggleExtraInfo(){return this.cfg.showExtraInfo=!this.cfg.showExtraInfo,this.setSize(this.size),this.refresh(),this}toggleShadows(){return this.cfg.showShadows=!this.cfg.showShadows,this.refresh(),this}getFinalHeader(){return this._anonymous?{...this.header,White:"Anonymous",Black:"Anonymous",WhitePretty:"Anonymous",BlackPretty:"Anonymous",Site:K(this.header.Site)?null:this.header.Site}:{...this.header,Site:K(this.header.Site)?this.header.Site.replace(/^http[s]*:\/\//,""):this.header.Site}}async titleFrame(e){this.currentScreen="title",this.header=e,await st(this.tempCtx,this.size,this.scale,this.margin,this.style,this.getFinalHeader())}async renderBackground(){const e=document.createElement("canvas"),t=e.getContext("2d");e.width=this.size,e.height=this.size+this.margin*2;const{background:a,dark:n,light:r,border:i,coords:s}=this.style;await j(t,this.width,this.height,0,0,i),await j(t,this.innerSize,this.innerSize,this.cfg.showBorder?this.borderWidth:0,(this.cfg.showBorder?this.borderWidth:0)+this.margin,a,this.cfg.tiles);for(let d=0;d<this.cfg.tiles;d++)for(let h=0;h<this.cfg.tiles;h++){const g=h%2===0&&d%2===0||h%2!==0&&d%2!==0?r:n,c=h*this.squareSize+this.borderWidth,f=d*this.squareSize+this.borderWidth+this.margin;await j(t,this.squareSize,this.squareSize,c,f,g)}this.cfg.showBorder&&this.cfg.showCoords&&ae(t,s,this.squareSize,this.cfg.tiles,this.cfg.flipped,this.borderWidth,this.size,this.cfg.showBorder,this.margin),this.background=e}async frame(e,t){this.currentScreen="move",this.lastPosition=e,this.header=t??this.header,this.tempCtx.clearRect(0,0,this.size,this.size),this.background===null&&await this.renderBackground(),this.tempCtx.drawImage(await this.background,0,0),this.lastPosition?.move&&this.cfg.showMoveIndicator&&await Ue(this.tempCtx,this.lastPosition.move,this.squareSize,this.style,this.borderWidth,this.cfg.tiles,this.cfg.flipped,this.margin),!this.cfg.showBorder&&this.cfg.showCoords&&ae(this.tempCtx,this.style.coords,this.squareSize,this.cfg.tiles,this.cfg.flipped,this.borderWidth,this.size,this.cfg.showBorder,this.margin),this.lastPosition&&(await rt(this.tempCtx,this.lastPosition,this.squareSize,this.borderWidth,this.cfg.flipped,this.margin,this.cfg.piecesStyle,this.cfg.showShadows),this.cfg.showExtraInfo&&t&&await it(this.tempCtx,this.width,this.height,this.scale,this.margin,this.style,this.getFinalHeader(),this.cfg.flipped,this.lastPosition))}render(){this.ctx.clearRect(0,0,this.size,this.size),this.ctx.drawImage(this.tempCanvas,0,0)}toImgUrl(){return this.canvas.toDataURL()}toImageData(){return this.ctx.getImageData(0,0,this.width,this.height)}toClampedArray(){return this.ctx.getImageData(0,0,this.width,this.height).data}toImgElement(){const e=this.toImgUrl(),t=new Image;return t.classList.add("board"),t.src=e,t}get width(){return this.size}get height(){return this.size+this.margin*2}toGIF(){}}const lo=o=>new Promise(e=>setTimeout(e,o));class co{constructor(e,t){this.board=e,this.config=t,this.firstRender=this.board.frame(this.game.getPosition(0),this.game.header).then(a=>this.board.render())}interval=1e3;game=new H;ply=0;callback=()=>{};playing=!1;firstRender;watch(e){this.callback=e}updateConfig(e){this.config={...this.config,...e}}getPosition(){const e=this.game.getPosition(this.ply);return v({ply:e.ply}),v({fen:e.fen}),e}async load(e){this.pause(),await this.firstRender,this.game=e,this.ply=0,await this.board.frame(this.getPosition(),this.game.header),this.board.render()}async play(){for(this.playing=!0,this.callback(this.playing,this.ply),this.ply===this.game.getMoves().length&&this.first();await lo(this.interval),!!this.playing;)this.next()}pause(){this.playing=!1,this.callback(this.playing,this.ply)}async prev(){const e=this.ply-1;if(!(e<-1||e<0&&this.config.titleScreen===!1)){if(this.ply=e,e===-1){await this.board.titleFrame(this.game.header),this.board.render();return}await this.board.frame(this.getPosition(),this.game.header),this.board.render()}}async next(){const e=this.ply+1;if(e>=this.game.length){this.pause();return}this.ply=e,await this.board.frame(this.getPosition(),this.game.header),this.board.render()}async first(){this.ply=0,await this.board.frame(this.getPosition(),this.game.header),this.board.render()}async last(){this.ply=this.game.length-1,await this.board.frame(this.getPosition(),this.game.header),this.board.render()}async goto(e){this.ply=e,await this.board.frame(this.getPosition(),this.game.header),this.board.render()}}const ho=w('<header class="header-box"><div class="header__logo"><div class="header__logo-pic"></div></div><div class="header__options"><div class="header__options-ico"><i class="las"></i></div></div></header>'),fo=()=>{const[o,e]=G(!0);return(()=>{const t=ho.cloneNode(!0),a=t.firstChild,n=a.nextSibling,r=n.firstChild,i=r.firstChild;return r.$$click=()=>{e(!o()),document.body.classList.toggle("light")},I(s=>{const d=o()?"LIGHT MODE":"DARK MODE",h=o(),g=!o();return d!==s._v$&&L(r,"title",s._v$=d),h!==s._v$2&&i.classList.toggle("la-sun",s._v$2=h),g!==s._v$3&&i.classList.toggle("la-moon",s._v$3=g),s},{_v$:void 0,_v$2:void 0,_v$3:void 0}),t})()};W(["click"]);const go=w('<div><div class="scrollable__content"></div></div>'),J=o=>(()=>{const e=go.cloneNode(!0),t=e.firstChild;return b(t,()=>o.children),I(()=>e.className=`scrollable ${o.class}`),e})();const uo=w('<p class="moves__turn"> to move.</p>'),mo=w('<div class="move"><span class="move__id">.</span><span class="move__ply"></span><span class="move__ply"></span></div>'),po=o=>(Ne(()=>{l.mobile||document.querySelector(`[data-ply="${l.ply}"]`)?.scrollIntoView()}),u(J,{get class(){return"moves"+(o.class?` ${o.class}`:"")},get children(){return[u(D,{get when(){return o.moves.length===0},get children(){const e=uo.cloneNode(!0),t=e.firstChild;return b(e,()=>l.game.getPosition(0).turn==="w"?"White":"Black",t),e}}),u(ee,{get each(){return me(2,o.moves)},children:(e,t)=>{const[a,n]=e;return(()=>{const r=mo.cloneNode(!0),i=r.firstChild,s=i.firstChild,d=i.nextSibling,h=d.nextSibling;return b(i,()=>t()+1,s),d.$$click=()=>o.handlers.goto(t()*2+1),b(d,a),h.$$click=()=>o.handlers.goto(t()*2+2),b(h,n),I(g=>{const c=l.ply===t()*2+1,f=t()*2+1,m=l.ply===t()*2+2,_=t()*2+2;return c!==g._v$&&d.classList.toggle("move__ply--current",g._v$=c),f!==g._v$2&&L(d,"data-ply",g._v$2=f),m!==g._v$3&&h.classList.toggle("move__ply--current",g._v$3=m),_!==g._v$4&&L(h,"data-ply",g._v$4=_),g},{_v$:void 0,_v$2:void 0,_v$3:void 0,_v$4:void 0}),r})()}})]}}));W(["click"]);const yo=w('<i class="las la-play"></i>'),bo=w('<div class="controls"><button class="controls__button controls__button--first" title="FIRST"><i class="las la-angle-double-left"></i></button><button class="controls__button" title="PREV"><i class="las la-angle-left"></i></button><button class="controls__button"></button><button class="controls__button controls__button--next" title="NEXT"><i class="las la-angle-right"></i></button><button class="controls__button controls__button--last" title="LAST"><i class="las la-angle-double-right"></i></button><button title="FLIP" class="flip__button"><i class="las la-sync rotatable" class="rotatable"></i></button></div>'),vo=w('<i class="las la-pause"></i>'),$e=o=>(()=>{const e=bo.cloneNode(!0),t=e.firstChild,a=t.nextSibling,n=a.nextSibling,r=n.nextSibling,i=r.nextSibling,s=i.nextSibling,d=s.firstChild;return N(t,"click",o.handlers.first,!0),N(a,"click",o.handlers.prev,!0),N(n,"click",o.handlers.togglePlay,!0),b(n,u(D,{get when(){return!l.playing},get fallback(){return vo.cloneNode(!0)},get children(){return yo.cloneNode(!0)}})),N(r,"click",o.handlers.next,!0),N(i,"click",o.handlers.last,!0),N(s,"click",o.handlers.flip,!0),I(h=>{const g=l.playing?"PAUSE":"PLAY",c=l.boardConfig.flipped;return g!==h._v$&&L(n,"title",h._v$=g),c!==h._v$2&&d.classList.toggle("rotated",h._v$2=c),h},{_v$:void 0,_v$2:void 0}),e})();W(["click"]);const we=o=>{if(o===null)return!1;try{return new URL(o).protocol==="https:"}catch{return!1}},fe=w('<span class="info__rating"> (<!>)</span>'),V=w("<p></p>"),_o=w("<p>Round </p>"),$o=w("<a></a>"),wo=w('<div class="info"><div class="info__players"><div class="info__player"><div class="info__left"><button class="info__color info__color--white"></button></div><div class="info__right"><span class="info__score"></span></div></div><div class="info__player"><div class="info__left"><button class="info__color info__color--black"></button></div><div class="info__right"><span class="info__score"></span></div></div></div><div class="info__event"></div><div class="info__site"></div></div>'),ko=()=>(()=>{const o=wo.cloneNode(!0),e=o.firstChild,t=e.firstChild,a=t.firstChild;a.firstChild;const n=a.nextSibling,r=n.firstChild,i=t.nextSibling,s=i.firstChild;s.firstChild;const d=s.nextSibling,h=d.firstChild,g=e.nextSibling,c=g.nextSibling;return b(a,u(D,{get when(){return!l.anonymous},fallback:"Anonymous",get children(){return[oe(()=>l.game.header.WhitePretty)," "]}}),null),b(a,u(D,{get when(){return l.game.header.WhiteElo},get children(){const f=fe.cloneNode(!0),m=f.firstChild,_=m.nextSibling;return _.nextSibling,b(f,()=>l.game.header.WhiteElo,_),f}}),null),b(r,()=>l.game.header.Result==="1-0"?"1":l.game.header.Result==="0-1"?"0":"1/2"),b(s,u(D,{get when(){return!l.anonymous},fallback:"Anonymous",get children(){return[oe(()=>l.game.header.BlackPretty)," "]}}),null),b(s,u(D,{get when(){return l.game.header.BlackElo},get children(){const f=fe.cloneNode(!0),m=f.firstChild,_=m.nextSibling;return _.nextSibling,b(f,()=>l.game.header.BlackElo,_),f}}),null),b(h,()=>l.game.header.Result==="1-0"?"0":l.game.header.Result==="0-1"?"1":"1/2"),b(g,u(D,{get when(){return l.game.header.Event},get children(){const f=V.cloneNode(!0);return b(f,()=>l.game.header.Event),f}}),null),b(g,u(D,{get when(){return l.game.header.Round},get children(){const f=_o.cloneNode(!0);return f.firstChild,b(f,()=>l.game.header.Round,null),f}}),null),b(c,u(D,{get when(){return l.game.header.Site},get children(){const f=V.cloneNode(!0);return b(f,u(D,{get when(){return!l.anonymous||!K(l.game.header.Site)},get children(){return u(D,{get when(){return we(l.game.header.Site)},get fallback(){return l.game.header.Site},get children(){const m=$o.cloneNode(!0);return b(m,()=>l.game.header.Site?.replace(/^https:\/\//,"")),I(()=>L(m,"href",l.game.header.Site??"")),m}})}})),f}}),null),b(c,u(D,{get when(){return l.game.header.DatePretty},get children(){const f=V.cloneNode(!0);return b(f,()=>l.game.header.DatePretty),f}}),null),o})(),ke=o=>new Promise((e,t)=>{const a=new FileReader;a.onload=()=>{e(a.result)},a.onerror=t,a.readAsText(o)});const So=w('<div class="load__pgn-file-info"><p>or</p><p>drop the PGN file anywhere on the page</p></div>'),Co=w('<div><textarea class="load__game-input" name="load-game" placeholder="Paste PGN, FEN or Lichess link..."></textarea><button class="load__game-btn">LOAD</button><hr><input type="file" accept="application/vnd.chess-pgn,application/x-chess-pgn,.pgn"><button class="load__pgn-btn load__pgn-file">UPLOAD PGN FILE</button></div>'),Bo=o=>{const[e,t]=G("");let a;return(()=>{const n=Co.cloneNode(!0),r=n.firstChild,i=r.nextSibling,s=i.nextSibling,d=s.nextSibling,h=d.nextSibling;r.$$input=c=>t(c.currentTarget.value),L(r,"spellcheck",!1),i.$$click=()=>{e()&&(o.handlers.load(e()),t(""))},d.addEventListener("change",async c=>{const f=c.target;if(f?.files&&f.files.length>0){const m=await ke(f.files[0]);o.handlers.loadPGN(m)}});const g=a;return typeof g=="function"?g(d):a=d,d.style.setProperty("display","none"),h.$$click=()=>{a&&a.click()},b(n,u(D,{get when(){return!l.mobile},get children(){return So.cloneNode(!0)}}),null),I(c=>{const f="load"+(o.class?` ${o.class}`:""),m=e();return f!==c._v$&&(n.className=c._v$=f),m!==c._v$2&&(r.value=c._v$2=m),c},{_v$:void 0,_v$2:void 0}),n})()};W(["input","click"]);const Z=(o,e,t)=>{const a=typeof o=="string"?o:URL.createObjectURL(o),n=document.createElement("a");n.href=a,n.download=`${e}.${t}`,n.target="_blank",n.click(),URL.revokeObjectURL(a)},Eo=w('<div class="share__view"><h2 class="header--first">Board options</h2><button class="options__button"><i class="las la-expand"></i></button><button class="options__button"><i class="las la-info-circle"></i></button><button class="options__button"><i class="las la-heading"></i></button><button class="options__button" title="TOGGLE ANONYMOUS"><i class="las la-user-secret"></i></button><button class="options__button options__button--last"><i class="las la-cloud"></i></button></div>'),ge=w("<hr>"),Do=w('<div class="share__fen"><h2>Current position</h2><input type="text" name="current_fen" readonly placeholder="Current FEN..."><div class="double"><button class="share__btn share__btn--left"></button><button class="share__btn share__btn--right"></button></div><hr class="invisible"><button class="share__size share__size--first">XS</button><button class="share__size">S</button><button class="share__size">M</button><button class="share__size">L</button><button class="share__size share__size--last">XL</button><button class="share__btn"></button></div>'),Lo=w('<div class="share__pgn"><h2>Game</h2><div class="double"><button class="share__btn"></button><button class="share__btn"></button></div><div class="double"><button class="share__btn">Export PGN</button><button class="share__btn"></button></div></div>'),Io=w('<div class="share__animation"><hr class="invisible"><button class="share__size share__size--first">XS</button><button class="share__size">S</button><button class="share__size">M</button><button class="share__size">L</button><button class="share__size share__size--last">XL</button><button class="share__format share__format--first">GIF</button><button class="share__format">MP4</button><button class="share__format share__format--last">WebM</button><button class="share__create-animation"></button></div>'),Se=o=>{const[e,t]=G(""),[a,n]=G(!1),[r,i]=G(!1),s=d=>{t(d),setTimeout(()=>t(""),1e3)};return u(J,{get class(){return"share"+(o.class?` ${o.class}`:"")},get children(){return[(()=>{const d=Eo.cloneNode(!0),h=d.firstChild,g=h.nextSibling,c=g.nextSibling,f=c.nextSibling,m=f.nextSibling,_=m.nextSibling;return N(g,"click",o.handlers.toggleBorder,!0),N(c,"click",o.handlers.toggleExtraInfo,!0),N(f,"click",o.handlers.toggleTitleScreen,!0),N(m,"click",o.handlers.toggleAnonymous,!0),N(_,"click",o.handlers.toggleShadows,!0),I(p=>{const S=l.boardConfig.showBorder,C=l.boardConfig.showBorder?"HIDE BORDER":"SHOW BORDER",B=l.boardConfig.showExtraInfo,y=l.boardConfig.showExtraInfo?"HIDE EXTRA INFO":"SHOW EXTRA INFO",k=l.gameConfig.titleScreen,$=l.gameConfig.titleScreen?"EXCLUDE TITLE SCREEN":"INCLUDE TITLE SCREEN",E=l.anonymous,A=l.boardConfig.showShadows,x=l.boardConfig.showShadows?"HIDE SHADOWS":"SHOW SHADOWS";return S!==p._v$&&g.classList.toggle("options__button--active",p._v$=S),C!==p._v$2&&L(g,"title",p._v$2=C),B!==p._v$3&&c.classList.toggle("options__button--active",p._v$3=B),y!==p._v$4&&L(c,"title",p._v$4=y),k!==p._v$5&&f.classList.toggle("options__button--active",p._v$5=k),$!==p._v$6&&L(f,"title",p._v$6=$),E!==p._v$7&&m.classList.toggle("options__button--active",p._v$7=E),A!==p._v$8&&_.classList.toggle("options__button--active",p._v$8=A),x!==p._v$9&&L(_,"title",p._v$9=x),p},{_v$:void 0,_v$2:void 0,_v$3:void 0,_v$4:void 0,_v$5:void 0,_v$6:void 0,_v$7:void 0,_v$8:void 0,_v$9:void 0}),d})(),ge.cloneNode(!0),(()=>{const d=Do.cloneNode(!0),h=d.firstChild,g=h.nextSibling,c=g.nextSibling,f=c.firstChild,m=f.nextSibling,_=c.nextSibling,p=_.nextSibling,S=p.nextSibling,C=S.nextSibling,B=C.nextSibling,y=B.nextSibling,k=y.nextSibling;return g.$$click=$=>{$.target.select()},f.$$click=()=>{navigator.clipboard.writeText(l.fen),s("fen")},b(f,()=>e()==="fen"?"Copied!":"Copy FEN"),m.$$click=()=>{const $=`${location.origin}/#fen/${encodeURI(l.fen)}`;navigator.clipboard.writeText($),s("fen-link")},b(m,()=>e()==="fen-link"?"Copied!":"Copy link"),p.$$click=()=>v("gameConfig","picSize","XS"),S.$$click=()=>v("gameConfig","picSize","S"),C.$$click=()=>v("gameConfig","picSize","M"),B.$$click=()=>v("gameConfig","picSize","L"),y.$$click=()=>v("gameConfig","picSize","XL"),k.$$click=async()=>{n(!0),await o.handlers.downloadImage(),n(!1)},b(k,()=>a()?"Please wait...":"Save as image"),I($=>{const E=l.fen,A=l.gameConfig.picSize==="XS",x=l.gameConfig.picSize==="S",R=l.gameConfig.picSize==="M",X=l.gameConfig.picSize==="L",U=l.gameConfig.picSize==="XL";return E!==$._v$10&&(g.value=$._v$10=E),A!==$._v$11&&p.classList.toggle("share__size--active",$._v$11=A),x!==$._v$12&&S.classList.toggle("share__size--active",$._v$12=x),R!==$._v$13&&C.classList.toggle("share__size--active",$._v$13=R),X!==$._v$14&&B.classList.toggle("share__size--active",$._v$14=X),U!==$._v$15&&y.classList.toggle("share__size--active",$._v$15=U),$},{_v$10:void 0,_v$11:void 0,_v$12:void 0,_v$13:void 0,_v$14:void 0,_v$15:void 0}),d})(),u(D,{get when(){return l.pgn},get children(){return[ge.cloneNode(!0),(()=>{const d=Lo.cloneNode(!0),h=d.firstChild,g=h.nextSibling,c=g.firstChild,f=c.nextSibling,m=g.nextSibling,_=m.firstChild,p=_.nextSibling;return c.$$click=()=>{navigator.clipboard.writeText(l.anonymous?l.game.anonymousPGN:l.pgn),s("pgn")},b(c,()=>e()==="pgn"?"Copied!":"Copy PGN"),f.$$click=()=>{navigator.clipboard.writeText(window.location.href),s("pgn-link")},b(f,()=>e()==="pgn-link"?"Copied!":"Copy link"),_.$$click=()=>{const S=new Blob([l.pgn],{type:"application/vnd.chess-pgn;charset=utf-8"}),C=l.game.getFileName(l.anonymous);Z(S,C,"pgn")},p.$$click=()=>{const C=`[${l.game.getTitle({anonymous:l.anonymous})}](${window.location.href})`;navigator.clipboard.writeText(C),s("markdown")},b(p,()=>e()==="markdown"?"Copied!":"Copy markdown"),d})(),(()=>{const d=Io.cloneNode(!0),h=d.firstChild,g=h.nextSibling,c=g.nextSibling,f=c.nextSibling,m=f.nextSibling,_=m.nextSibling,p=_.nextSibling,S=p.nextSibling,C=S.nextSibling,B=C.nextSibling;return g.$$click=()=>v("gameConfig","animationSize","XS"),c.$$click=()=>v("gameConfig","animationSize","S"),f.$$click=()=>v("gameConfig","animationSize","M"),m.$$click=()=>v("gameConfig","animationSize","L"),_.$$click=()=>v("gameConfig","animationSize","XL"),p.$$click=()=>v("gameConfig","format","GIF"),S.$$click=()=>v("gameConfig","format","MP4"),C.$$click=()=>v("gameConfig","format","WebM"),B.$$click=async()=>{i(!0),await o.handlers.downloadAnimation(),i(!1)},b(B,()=>r()?"Please wait...":"Save animation"),I(y=>{const k=l.gameConfig.animationSize==="XS",$=l.gameConfig.animationSize==="S",E=l.gameConfig.animationSize==="M",A=l.gameConfig.animationSize==="L",x=l.gameConfig.animationSize==="XL",R=l.gameConfig.format==="GIF",X=l.gameConfig.format==="MP4",U=l.gameConfig.format==="WebM";return k!==y._v$16&&g.classList.toggle("share__size--active",y._v$16=k),$!==y._v$17&&c.classList.toggle("share__size--active",y._v$17=$),E!==y._v$18&&f.classList.toggle("share__size--active",y._v$18=E),A!==y._v$19&&m.classList.toggle("share__size--active",y._v$19=A),x!==y._v$20&&_.classList.toggle("share__size--active",y._v$20=x),R!==y._v$21&&p.classList.toggle("share__format--active",y._v$21=R),X!==y._v$22&&S.classList.toggle("share__format--active",y._v$22=X),U!==y._v$23&&C.classList.toggle("share__format--active",y._v$23=U),y},{_v$16:void 0,_v$17:void 0,_v$18:void 0,_v$19:void 0,_v$20:void 0,_v$21:void 0,_v$22:void 0,_v$23:void 0}),d})()]}})]}})};W(["click"]);const Po=w("<div></div>"),No=async()=>{const o=[],e=new q({size:144,tiles:2,showBorder:!0,showExtraInfo:!1});for(const[t,a]of Object.entries(Q)){let n;a.ico?n=a.ico:(await e.updateConfig({boardStyle:t}),await e.frame(null),e.render(),n=e.toImgUrl()),o.push({key:t,name:a.name,category:a.category,img:n})}return o},Ce=o=>{const[e,t]=G([]);return No().then(a=>t(a)),u(J,{get class(){return"boards"+(o.class?` ${o.class}`:"")},get children(){return u(ee,{get each(){return e()},children:a=>(()=>{const n=Po.cloneNode(!0);return n.$$click=()=>{v("boardConfig","boardStyle",a.key),o.handlers.changeBoardStyle(a.key)},L(n,"draggable",!1),I(r=>{const i="boards__ico"+(l.boardConfig.boardStyle===a.key?" boards__ico--active":""),s=`url(${a.img})`,d=a.name;return i!==r._v$&&(n.className=r._v$=i),s!==r._v$2&&n.style.setProperty("background-image",r._v$2=s),d!==r._v$3&&L(n,"title",r._v$3=d),r},{_v$:void 0,_v$2:void 0,_v$3:void 0}),n})()})}})};W(["click"]);const Ao=w("<img>"),xo=ot.map(o=>({key:o,img:`/pieces/${o}/nw.svg`})),Be=o=>u(J,{get class(){return"pieces"+(o.class?` ${o.class}`:"")},get children(){return u(ee,{each:xo,children:e=>(()=>{const t=Ao.cloneNode(!0);return t.$$click=()=>{v("boardConfig","piecesStyle",e.key),o.handlers.changePiecesStyle(e.key)},L(t,"draggable",!1),I(a=>{const n="pieces__ico"+(l.boardConfig.piecesStyle===e.key?" pieces__ico--active":""),r=e.img,i=e.key;return n!==a._v$&&(t.className=a._v$=n),r!==a._v$2&&L(t,"src",a._v$2=r),i!==a._v$3&&L(t,"title",a._v$3=i),a},{_v$:void 0,_v$2:void 0,_v$3:void 0}),t})()})}});W(["click"]);const Fo=w("<button></button>"),z=o=>(()=>{const e=Fo.cloneNode(!0);return e.$$click=()=>o.setTab(o.name),b(e,()=>o.children),I(()=>e.className="tab"+(o.isActive?" tab--active":"")),e})();W(["click"]);const Ro=w('<i class="las la-chess-board"></i>'),Mo=w('<i class="las la-chess"></i>'),To=w('<div class="game"><div class="game-tabs"></div></div>'),Y=o=>{v("activeTab",o)},zo=o=>(()=>{const e=To.cloneNode(!0),t=e.firstChild;return b(t,u(z,{name:"game",setTab:Y,get isActive(){return l.activeTab==="game"},children:"GAME"}),null),b(t,u(z,{name:"load",setTab:Y,get isActive(){return l.activeTab==="load"},children:"LOAD"}),null),b(t,u(D,{get when(){return l.layout!=="triple"},get children(){return[u(z,{name:"share",setTab:Y,get isActive(){return l.activeTab==="share"},children:"SHARE"}),u(z,{name:"boards",setTab:Y,get isActive(){return l.activeTab==="boards"},get children(){return Ro.cloneNode(!0)}}),u(z,{name:"pieces",setTab:Y,get isActive(){return l.activeTab==="pieces"},get children(){return Mo.cloneNode(!0)}})]}}),null),b(e,u(pe,{get children(){return[u(T,{get when(){return l.activeTab==="game"},get children(){return[u(ko,{get handlers(){return o.handlers}}),u(po,{get moves(){return o.moves},get handlers(){return o.handlers},get class(){return l.layout==="single"?"span2":void 0}}),u(D,{get when(){return l.layout!=="single"},get children(){return u($e,{get handlers(){return o.handlers}})}})]}}),u(T,{get when(){return l.activeTab==="load"},get children(){return u(Bo,{get handlers(){return o.handlers},class:"span3"})}}),u(D,{get when(){return l.layout!=="triple"},get children(){return[u(T,{get when(){return l.activeTab==="share"},get children(){return u(Se,{get handlers(){return o.handlers},class:"span3"})}}),u(T,{get when(){return l.activeTab==="boards"},get children(){return u(Ce,{get handlers(){return o.handlers},class:"span3"})}}),u(T,{get when(){return l.activeTab==="pieces"},get children(){return u(Be,{get handlers(){return o.handlers},class:"span3"})}})]}})]}}),null),I(()=>t.classList.toggle("game-tabs--condensed",l.layout!=="triple")),e})();const Wo=w('<i class="las la-share"></i>'),Oo=w('<i class="las la-chess-board"></i>'),Go=w('<i class="las la-chess"></i>'),jo=w('<div class="setup"><div class="setup-tabs"></div></div>'),Ho=o=>{const[e,t]=G("share");return(()=>{const a=jo.cloneNode(!0),n=a.firstChild;return b(n,u(z,{name:"share",setTab:t,get isActive(){return e()==="share"},get children(){return[Wo.cloneNode(!0)," SHARE"]}}),null),b(n,u(z,{name:"boards",setTab:t,get isActive(){return e()==="boards"},get children(){return[Oo.cloneNode(!0)," BOARDS"]}}),null),b(n,u(z,{name:"pieces",setTab:t,get isActive(){return e()==="pieces"},get children(){return[Go.cloneNode(!0)," PIECES"]}}),null),b(a,u(pe,{get children(){return[u(T,{get when(){return e()==="share"},get children(){return u(Se,{get handlers(){return o.handlers}})}}),u(T,{get when(){return e()==="boards"},get children(){return u(Ce,{get handlers(){return o.handlers}})}}),u(T,{get when(){return e()==="pieces"},get children(){return u(Be,{get handlers(){return o.handlers}})}})]}}),null),a})()};const Xo=w('<div id="setup" class="setup-box"></div>'),Uo=w('<div class="layout"><div id="board" class="board-box"></div><div id="moves" class="game-box"></div></div>'),Yo=o=>[u(fo,{get handlers(){return o.handlers}}),(()=>{const e=Uo.cloneNode(!0),t=e.firstChild,a=t.nextSibling;return b(e,u(D,{get when(){return l.layout==="triple"},get children(){const n=Xo.cloneNode(!0);return b(n,u(Ho,{get handlers(){return o.handlers}})),n}}),t),b(t,u(D,{get when(){return l.layout==="single"},get children(){return u($e,{get handlers(){return o.handlers}})}})),b(a,u(zo,{get moves(){return o.state.moves},get handlers(){return o.handlers}})),e})()],M=o=>o==="board"?localStorage.setItem("boardConfig",JSON.stringify(l.boardConfig)):localStorage.setItem("gameConfig",JSON.stringify(l.gameConfig)),Ee={XS:360,S:512,M:720,L:1024,XL:1440},Ko=async(o,e,t=0,a,n)=>{const r=new H;e?r.loadPGN(e):r.loadFEN(o);const i=new q({...a,size:Ee[n]}),s=r.getPosition(t);return await i.frame(s,r.header),i.render(),i.toImgUrl()};class De{gif;frameTime;constructor(e,t,a,n=1e3){this.gif=new Ae({workers:2,quality:30,width:e,height:t,repeat:a?0:-1}),this.frameTime=n}add(e,t){for(;t--;)this.gif.addFrame(e,{delay:this.frameTime})}render(){return new Promise(e=>{const t=Date.now();this.gif.on("finished",function(a){const n=new File([a],`board_${t}.gif`,{type:"image/gif",lastModified:t});e(n)}),this.gif.render()})}}class qo{constructor(e=1e3){this.frameTime=e,this.video=new xe({quality:.8,fileWriter:null,fd:null,frameDuration:1e3,transparent:!1})}video;add(e,t){this.video.addFrame(e,t*this.frameTime)}async render(){const e=await this.video.complete(),t=Date.now();return new File([e],`board_${t}.webm`,{type:"video/webm",lastModified:t})}}class Le{constructor(e,t,a=1e3){this.width=e,this.height=t,this.hme=Fe.createH264MP4Encoder(),this.frameTime=a}hme;encoder=null;frameTime;async setup(e,t){this.encoder=await this.hme,this.encoder.width=e,this.encoder.height=t,this.encoder.frameRate=1e3/this.frameTime,this.encoder.quantizationParameter=10,this.encoder.initialize()}async add(e,t){for(this.encoder===null&&await this.setup(this.width,this.height);t--;)this.encoder?.addFrameRgba(e)}async render(){this.encoder?.finalize();const e=this.encoder?.FS.readFile(this.encoder.outputFilename),t=Date.now(),a=new File([e],`board_${t}.mp4`,{type:"video/mp4",lastModified:t});return this.encoder?.delete(),a}}const ue=(o,e)=>e instanceof De?o.toImageData():e instanceof Le?o.toClampedArray():o.canvas,Jo=async(o,e,t,a,n)=>{const r=new H().loadPGN(o),i=new q({...e,size:Ee[a]}),s=t==="GIF"?new De(i.width,i.height,!0):t==="MP4"?new Le(i.width,i.height):new qo,d=r.header;n&&(await i.titleFrame(d),i.render(),await s.add(ue(i,s),4));for(let h=0;h<r.length;h++){const g=r.getPosition(h);await i.frame(g,d),i.render();const c=g.end===0?5:g.ply===0&&!n?2:1;await s.add(ue(i,s),c)}return await s.render()},Vo=/^#(pgn|fen)\//,Qo=()=>{const o=window.location.hash;if(!Vo.test(o))return{pgn:"",fen:""};const[e,...t]=o.slice(1).split("/"),a=t.join("/");return{pgn:e==="pgn"?qe(a):"",fen:e==="fen"?decodeURI(a):""}},Zo=async o=>{const[e,t]=o.pathname.replace(/^\//,"").split("/").map(a=>a.trim());if(/^(([a-z0-9]{8})|([a-z0-9]{12}))$/i.test(e)){const a=e.slice(0,8),n=await fetch(`https://lichess.org/game/export/${a}?evals=0&clocks=0`);if(!String(n.status).startsWith("2"))return{error:!0,errorType:"SERVER_ERROR"};const r=await n.text();return{error:!1,pgn:r,side:String(t).startsWith("black")||o.hash.startsWith("black")?"b":"w"}}return{error:!0,errorType:"INCORRECT_LINK"}},ea=async o=>{let e;try{e=new URL(o)}catch{return{error:!0,errorType:"INCORRECT_LINK"}}return/^(www\.)*lichess\.org/.test(e.hostname)?Zo(e):{error:!0,errorType:"INCORRECT_LINK"}},ta=/^([1-8kqrbnp]+\/)+[1-8kqrbnp]+ [wb] ([kq]+|-) ([a-h1-8]{2}|-) [01] \d+$/i,oa=o=>ta.test(o.trim()),aa=/((\[[a-z0-9]+ +"[^"\n\r]+"](\r\n|\r|\n))*(\r\n|\r|\n)+){0,1}\d+\. +[a-h1-8x+#=]+/i,na=o=>aa.test(o),ra=async()=>{const o=new q(l.boardConfig),e=new co(o,l.gameConfig);e.watch(r=>v("playing",r));const t={prev(){e.pause(),e.prev()},next(){e.pause(),e.next()},first(){e.pause(),e.first()},last(){e.pause(),e.last()},togglePlay(){e.playing?e.pause():e.play()},goto(r){e.pause(),e.goto(r)},toggleBorder(){o.toggleBorder(),v("boardConfig","showBorder",!l.boardConfig.showBorder),M("board")},showBorder(){o.showBorder(),v("boardConfig","showBorder",!0),M("board")},hideBorder(){o.hideBorder(),v("boardConfig","showBorder",!1),M("board")},toggleExtraInfo(){o.toggleExtraInfo(),v("boardConfig","showExtraInfo",!l.boardConfig.showExtraInfo),M("board")},toggleAnonymous(){if(v("anonymous",!l.anonymous),o.anonymous=l.anonymous,l.pgn!==""){const r=l.anonymous?l.game.anonymousPGN:l.game.pgn;window.location.hash=`pgn/${se(r)}`,v("refreshHash",!1)}},toggleTitleScreen(){v("gameConfig","titleScreen",!l.gameConfig.titleScreen),M("game")},toggleShadows(){o.toggleShadows(),v("boardConfig","showShadows",!l.boardConfig.showShadows),M("board")},flip(){console.log("FLIP"),o.flip(),v("boardConfig","flipped",!l.boardConfig.flipped)},changeBoardStyle(r){o.setStyle(r),v("boardConfig","boardStyle",r),M("board")},changePiecesStyle(r){o.setPiecesStyle(r),v("boardConfig","piecesStyle",r),M("board")},async loadPGN(r,i="w"){const s=new H().loadPGN(r);v({pgn:s.pgn,fen:"",moves:s.getMoves(),ply:0,game:s}),window.location.hash=`pgn/${se(s.pgn)}`,v("refreshHash",!1),await e.load(s),v("activeTab","game"),i==="w"?o.flipWhite():o.flipBlack(),v("boardConfig","flipped",i==="b"),document.title=`SHARECHESS - ${s.getTitle({anonymous:!1})}`},async loadFEN(r,i=!0){const s=new H().loadFEN(r);v({pgn:"",fen:r,moves:s.getMoves(),ply:0,game:s}),await e.load(s),i&&(window.location.hash=`fen/${l.fen}`,v("refreshHash",!1),v("activeTab","game"));const d=s.getPosition(0).turn;d==="w"?o.flipWhite():o.flipBlack(),v("boardConfig","flipped",d==="b"),document.title=`SHARECHESS - FEN ${r}`},async load(r){return oa(r)?(await this.loadFEN(r),!0):na(r)?(await this.loadPGN(r),!0):we(r)?(await this.importPGN(r),!0):!1},async importPGN(r){const i=await ea(r);i.error||await this.loadPGN(i.pgn,i.side)},async downloadImage(){await new Promise(i=>setTimeout(i,0));const r=await Ko(l.fen,l.pgn,l.ply,l.boardConfig,l.gameConfig.picSize);Z(r,`fen_${Date.now()}`,"png")},async downloadAnimation(){await new Promise(s=>setTimeout(s,0));const r=await Jo(l.pgn,l.boardConfig,l.gameConfig.format,l.gameConfig.animationSize,l.gameConfig.titleScreen),i=l.game.getFileName(l.anonymous);Z(r,i,l.gameConfig.format.toLowerCase())}};Me(()=>u(Yo,{handlers:t,state:l}),document.getElementById("root")),document.querySelector("#board")?.prepend(o.canvas);const n=async()=>{const{pgn:r,fen:i}=Qo();await(r?t.loadPGN(r):i?t.loadFEN(i):t.loadFEN("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",!1))};if(await n(),document.addEventListener("dblclick",function(r){r.preventDefault()}),window.addEventListener("resize",()=>{v("layout",window.innerWidth<window.innerHeight?"single":window.innerWidth<1366?"double":"triple")}),window.addEventListener("hashchange",()=>{if(!l.refreshHash){v("refreshHash",!0),console.log("No refresh");return}console.log("Refresh!"),n()}),!l.mobile){const r={ArrowLeft:t.prev,ArrowRight:t.next,ArrowUp:t.first,ArrowDown:t.last," ":t.togglePlay,b:t.toggleBorder,f:t.flip,e:t.toggleExtraInfo};document.addEventListener("keydown",s=>{const d=s.target;r[s.key]&&d?.nodeName!=="INPUT"&&d?.nodeName!=="TEXTAREA"&&(s.preventDefault(),r[s.key]())});const i=s=>{s.preventDefault(),s.stopPropagation()};["dragenter","dragover","dragleave","drop"].forEach(s=>{document.addEventListener(s,i,!1)}),document.addEventListener("drop",async s=>{if(s.dataTransfer?.files&&s.dataTransfer.files.length>0){const d=await ke(s.dataTransfer.files[0]);t.loadPGN(d)}})}};Re.load({google:{families:["Ubuntu:500,700","Fira Mono:500"]},custom:{families:["Chess"],urls:["/fonts.css"]},active:ra});
|