Files
sharechess/docs/assets/index.baa59519.js
Maciej Caderek fa68ef29b8 WIP
2022-03-14 21:58:41 +01:00

16 lines
64 KiB
JavaScript

import{_ as ue,c as O,i as Le,a as Ie,d as W,b as G,e as P,s as L,t as w,f as v,g as Pe,h as g,S as D,F as ee,j as N,m as oe,M as T,k as pe,G as Ne,l as Ae,n as Fe,W as xe,r as Me}from"./vendor.bf047f02.js";const Re=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)}};Re();const Te={horizontal:[0,0,1,0],vertical:[0,0,0,1],"diagonal-top":[0,0,1,1],"diagonal-bottom":[0,1,1,0]},ze=(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,f,h,c]=Te[e.dir];i=o.createLinearGradient(n+d*t,r+f*a,n+h*t,r+c*a)}const s=e.colors.length-1;return e.colors.forEach((d,f)=>{i.addColorStop(f/s,d)}),i},me=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 me(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:ze(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)},We=22,Oe="Fira Mono",ae=(o,e,t,a,n=!1,r,i,s,d)=>{const f=i/1024;if(f<=.32)return;const h=We*f,c=6*f,u=4*f,y="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?y:y.reverse();o.font=`${h}px ${Oe}`,o.textBaseline=s?"middle":"top",$.forEach((C,B)=>{o.fillStyle=r>0?e.onBorder:B%2===0?e.onLight:e.onDark;const m=s?r/2:c,k=(s?t*B+r+t/2:t*B+c)+d;o.textAlign=s?"center":"left",o.fillText(C,m,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 m=s?t*B+r+t/2:t*B+c,k=(s?i-r/2:i-u)+d;o.textAlign=s?"center":"left",o.fillText(C,m,k)})},Ge=(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 je=(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]=ue(o.length===4?1:2,o.slice(1).split("")).map(c=>parseInt(c.join(""),16));let[s,d,f]=Ge(n,r,i);const h=Math.abs(e);return s>=60&&s<240?(s+=e,s<60&&s>60-h?s=60:s>240&&s<240+h&&(s=240)):(s-=e,s>60&&s<60+h?s=60:s<240&&s>240-h&&(s=240)),s=s>360?s-360:s>0?s+360:s,d=Math.min(1,Math.max(0,d+t)),f=Math.min(1,Math.max(0,f+a)),je(s,d,f)},He="abcdefghijklmnopqrstuwvxyz",re=(o,e,t)=>{const a=He.indexOf(o[0]),n=Number(o[1])-1;return[e?t-a-1:a,e?n:t-n-1]},Xe=async(o,e,t,{dark:a,light:n,moveIndicator:r},i,s,d,f)=>{const[h,c]=re(e.from,d,s),[u,y]=re(e.to,d,s),[$,p,S,C]=[h,c,u,y].map(k=>k*t+i);let B,m;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=(h+c)%2===0?k:_,m=(u+y)%2===0?k:_}else B={type:"solid",data:{color:r.data}},m=B;j(o,t,t,$,p+f,B),j(o,t,t,S,C+f,m)},te={Event:"E",Site:"S",Round:"N",White:"W",Black:"B",Date:"D",Result:"R",FEN:"F",WhiteElo:"WE",BlackElo:"BE"},ye=Object.keys(te),Ue=Object.fromEntries(Object.entries(te).map(([o,e])=>[e,o])),Ye=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])=>ye.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])=>ye.includes(n)).map(([n,r])=>`${te[n]} ${r}`).sort().join(`
`);return btoa([a,t].join(`
`))},Ke=o=>{const[e,t]=atob(o).split(`
`);let a;const n=e.split(`
`).map(i=>{const[s,...d]=i.split(" "),f=d.join(" ");return s==="R"&&(a=f),`[${Ue[s]} "${f}"]`}).join(`
`),r=t.split(" ").map((i,s)=>s%2===0?`${s/2+1}. ${i}`:i).join(" ")+` ${a}`;return[n,r].join(`
`)},qe=["January","February","March","April","May","June","July","August","September","October","November","December"],Je=o=>{const[e,t,a]=o.split(".").map(Number),n=Number.isNaN(t)?null:qe[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}},Ve=new Map([["q",9],["r",5],["b",3],["n",3],["p",1]]),x=(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(Ye(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]+=Ve.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=x(e.White,"Anonymous"),a=x(e.Black,"Anonymous"),n=x(e.Date);return{White:t,Black:a,WhitePretty:ie(t),BlackPretty:ie(a),WhiteElo:x(e.WhiteElo),BlackElo:x(e.BlackElo),Date:n,DatePretty:n===null?null:Je(n),Event:x(e.Event),Round:x(e.Round),Site:x(e.Site),Result:x(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 Qe=()=>{const o=localStorage.getItem("boardConfig"),e=localStorage.getItem("gameConfig");return{boardConfig:o===null?{}:JSON.parse(o),gameConfig:e===null?{}:JSON.parse(e)}},be=Le(),le=Qe(),Ze={size:1024,tiles:8,boardStyle:"standard",piecesStyle:"tatiana",showBorder:!be,showExtraInfo:!0,showMaterial:!0,showMoveIndicator:!0,showChecks:!0,showCoords:!0,showShadows:!1,flipped:!1},et={titleScreen:!0,format:"GIF",picSize:"M",animationSize:"M"},ve={boardConfig:{...Ze,...le.boardConfig},gameConfig:{...et,...le.gameConfig},game:new H,pgn:"",fen:"",moves:[],ply:0,mobile:be,layout:window.innerWidth<window.innerHeight?"single":window.innerWidth<1366?"double":"triple",activeTab:"load",playing:!1,anonymous:!1,refreshHash:!0};console.log(ve);const[l,b]=Ie(ve),tt=["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"],ot=["bb","bw","kb","kw","nb","nw","pb","pw","qb","qw","rb","rw"];let de=null,ce=new Map;const at={async load(o){await Promise.all(ot.map(e=>{const t=`/pieces/${o}/${e}.svg`;return me(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)}},nt=async(o,e,t,a,n,r,i,s=!0)=>{const{placement:d,check:f,mate:h,turn:c}=e;o.shadowColor="rgba(0, 0, 0, 0)",o.shadowBlur=0,o.shadowOffsetX=0,o.shadowOffsetY=0;for(const{x:u,y,type:$,color:p}of d){const S=await at.get(i,$,p),C=n?8-1-y:y,B=n?8-1-u:u;if((f||h)&&$==="k"&&p===c){const m=h?"#ff002f":"#ffa600";o.shadowColor=m,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}},I=(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)),rt=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)),f=s.filter(({key:u})=>d.has(u));if(r.WhitePretty&&r.BlackPretty&&f.push({key:"vs",line:50*t,fontSize:20*t,n:1}),(r.Event||r.Round)&&f.push({key:"margin",line:100*t,fontSize:0,n:3}),r.Date||r.Site){const u=r.Event||r.Round?20*t:100*t;f.push({key:"margin",line:u,fontSize:0,n:6})}const h=f.reduce((u,y)=>u+y.line,0);let c=(e+a*2-h)/2;o.fillStyle=n.coords.onBorder,f.sort((u,y)=>u.n-y.n).forEach(({key:u,line:y,fontSize:$})=>{if(u==="vs"){const S=c+y/2;I(o,"vs",i,$,700,e/2,S,"center"),c+=y;return}if(u==="margin"){c+=y;return}const p=r[u];if(p){const S=u==="Round"?`Round ${p}`:p,C=c+y/2;I(o,S,i,$,700,e/2,C,"center",e*.9)}c+=y})},he={k:"l",q:"w",r:"t",b:"n",n:"j",p:"o"},st=async(o,e,t,a,n,r,i,s,d)=>{const f=Math.round(20*a);let h=(n-f)/2,c=n/2;const u=h;o.fillStyle=r.coords.onBorder;{const m=I(o,i.White==="Anonymous"?"White":i.White,"Ubuntu",f,700,u,s?c:t-c,"left"),k=i.WhiteElo?` ${i.WhiteElo}`:"";I(o,k,"Fira Mono",f,500,u+m,s?c:t-c,"left")}{const m=I(o,i.Black==="Anonymous"?"Black":i.Black,"Ubuntu",f,700,u,s?t-c:c,"left"),k=i.BlackElo?` ${i.BlackElo}`:"";I(o,k,"Fira Mono",f,500,u+m,s?t-c:c,"left")}let y=0,$=0;if(d.last&&i.Result){const[m,k]=i.Result.split("-"),_=m==="0"?"Lost":m==="1"?"Won":"Draw",E=k==="0"?"Lost":k==="1"?"Won":"Draw",A=I(o,_,"Ubuntu",f,700,e-h,s?c:t-c,"right"),F=I(o,E,"Ubuntu",f,700,e-h,s?t-c:c,"right"),M=Math.max(A,F);y=M+20*a,$=M+20*a}const{diff:p,imbalance:S}=d.material,C=p>0?`+${Math.abs(p)}`:"";y+=I(o,C,"Fira Mono",f,500,e-h-y,s?c:t-c,"right");const B=p<0?`+${Math.abs(p)}`:"";$+=I(o,B,"Fira Mono",f,500,e-h-$,s?t-c:c,"right");for(const[m,k]of Object.entries(S.w))for(let _=0;_<k;_++){const E=I(o,he[m],"Chess",f,500,e-h-y,(s?c:t-c)-2*a,"right");y+=_===k-1?E*.85:m==="p"?E*.4:E*.6}for(const[m,k]of Object.entries(S.b))for(let _=0;_<k;_++){const E=I(o,he[m],"Chess",f,500,e-h-$,(s?t-c:c)-2*a,"right");$+=_===k-1?E*.85:m==="p"?E*.4:E*.6}},it={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"}},lt={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"}},dt={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"}},ct={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"}},ht={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"}},ft={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"}},gt={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"}},ut={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"}},mt={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"}},yt={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"}},bt={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"}},vt={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"}},$t={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"}},wt={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"}},kt={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"}},St={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"}},Ct={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"}},Bt={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"}},Et={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"}},Dt={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"}},Lt={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"}},It={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"}},Pt={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"}},Nt={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"}},At={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"}},xt={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"}},Rt={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"}},Tt={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"}},zt={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"}},Wt={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"}},Ot={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"}},Gt={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"}},jt={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"}},Ht={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"}},Xt={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"}},Ut={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"}},Yt={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"}},Kt={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"}},qt={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"}},Jt={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"}},Vt={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"},Qt={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"},Zt={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"},eo={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"},to={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"},oo={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"},ao={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"},no={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:it,spring:lt,azure:dt,violet:Ct,rose:Lt,peach:St,clay:ct,rock:ht,lila:kt,leko:$t,patina:wt,mud:Dt,danny:ft,dannyGreen:gt,dannyCyan:ut,dannyBlue:pt,dannyPurple:mt,dannyPink:yt,dannyRed:bt,dannyYellow:vt,lichess:_t,danya:Bt,botez:Et,avocado:It,monoChico:Nt,monoMojo:xt,monoMahogany:Ft,monoMulberry:Mt,monoBlue:Tt,monoTeal:Pt,monoGoblin:At,monoSycamore:Rt,smoothSunset:zt,smoothSummer:Wt,smoothSpring:Ot,smoothForest:Gt,smoothLaguna:jt,smoothSea:Ht,smoothViolet:Xt,smoothMono:Ut,contrastA:Yt,contrastB:Kt,contrastC:qt,contrastD:Jt,wood1:Vt,wood2:Qt,wood3:Zt,wood4:eo,wood5:to,wood6:oo,wood7:ao,wood8:no},ro={size:720,tiles:8,boardStyle:"standard",piecesStyle:"tatiana",showBorder:!0,showExtraInfo:!0,showMaterial:!0,showMoveIndicator:!0,showChecks:!0,showCoords:!0,showShadows:!1,flipped:!1},so={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=ro;_anonymous=!1;scale=1;size=0;squareSize=0;innerSize=0;borderWidth=0;margin=0;style=Q.standard;header=so;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 rt(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 f=0;f<this.cfg.tiles;f++){const h=f%2===0&&d%2===0||f%2!==0&&d%2!==0?r:n,c=f*this.squareSize+this.borderWidth,u=d*this.squareSize+this.borderWidth+this.margin;await j(t,this.squareSize,this.squareSize,c,u,h)}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 Xe(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 nt(this.tempCtx,this.lastPosition,this.squareSize,this.borderWidth,this.cfg.flipped,this.margin,this.cfg.piecesStyle,this.cfg.showShadows),this.cfg.showExtraInfo&&t&&await st(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 io=o=>new Promise(e=>setTimeout(e,o));class lo{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 b({ply:e.ply}),b({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 io(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 co=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>'),ho=()=>{const[o,e]=G(!0);return(()=>{const t=co.cloneNode(!0),a=t.firstChild,n=a.nextSibling,r=n.firstChild,i=r.firstChild;return r.$$click=()=>{e(!o()),document.body.classList.toggle("light")},P(s=>{const d=o()?"LIGHT MODE":"DARK MODE",f=o(),h=!o();return d!==s._v$&&L(r,"title",s._v$=d),f!==s._v$2&&i.classList.toggle("la-sun",s._v$2=f),h!==s._v$3&&i.classList.toggle("la-moon",s._v$3=h),s},{_v$:void 0,_v$2:void 0,_v$3:void 0}),t})()};W(["click"]);const fo=w('<div><div class="scrollable__content"></div></div>'),J=o=>(()=>{const e=fo.cloneNode(!0),t=e.firstChild;return v(t,()=>o.children),P(()=>e.className=`scrollable ${o.class}`),e})();const go=w('<p class="moves__turn"> to move.</p>'),uo=w('<div class="move"><span class="move__id">.</span><span class="move__ply"></span><span class="move__ply"></span></div>'),po=o=>(Pe(()=>{l.mobile||document.querySelector(`[data-ply="${l.ply}"]`)?.scrollIntoView()}),g(J,{get class(){return"moves"+(o.class?` ${o.class}`:"")},get children(){return[g(D,{get when(){return o.moves.length===0},get children(){const e=go.cloneNode(!0),t=e.firstChild;return v(e,()=>l.game.getPosition(0).turn==="w"?"White":"Black",t),e}}),g(ee,{get each(){return ue(2,o.moves)},children:(e,t)=>{const[a,n]=e;return(()=>{const r=uo.cloneNode(!0),i=r.firstChild,s=i.firstChild,d=i.nextSibling,f=d.nextSibling;return v(i,()=>t()+1,s),d.$$click=()=>o.handlers.goto(t()*2+1),v(d,a),f.$$click=()=>o.handlers.goto(t()*2+2),v(f,n),P(h=>{const c=l.ply===t()*2+1,u=t()*2+1,y=l.ply===t()*2+2,$=t()*2+2;return c!==h._v$&&d.classList.toggle("move__ply--current",h._v$=c),u!==h._v$2&&L(d,"data-ply",h._v$2=u),y!==h._v$3&&f.classList.toggle("move__ply--current",h._v$3=y),$!==h._v$4&&L(f,"data-ply",h._v$4=$),h},{_v$:void 0,_v$2:void 0,_v$3:void 0,_v$4:void 0}),r})()}})]}}));W(["click"]);const mo=w('<i class="las la-play"></i>'),yo=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" 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>'),bo=w('<i class="las la-pause"></i>'),_e=o=>(()=>{const e=yo.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),v(n,g(D,{get when(){return!l.playing},get fallback(){return bo.cloneNode(!0)},get children(){return mo.cloneNode(!0)}})),N(r,"click",o.handlers.next,!0),N(i,"click",o.handlers.last,!0),N(s,"click",o.handlers.flip,!0),P(f=>{const h=l.playing?"PAUSE":"PLAY",c=l.boardConfig.flipped;return h!==f._v$&&L(n,"title",f._v$=h),c!==f._v$2&&d.classList.toggle("rotated",f._v$2=c),f},{_v$:void 0,_v$2:void 0}),e})();W(["click"]);const $e=o=>{if(o===null)return!1;try{return new URL(o).protocol==="https:"}catch{return!1}},V=w("<p></p>"),vo=w("<p>Round </p>"),_o=w("<a></a>"),$o=w('<div class="info"><div class="info__players"><p><button class="info__color info__color--white"></button><span class="info__rating"></span></p><p><button class="info__color info__color--black"></button><span class="info__rating"></span></p></div><div class="info__event"></div><div class="info__site"></div></div>'),wo=()=>(()=>{const o=$o.cloneNode(!0),e=o.firstChild,t=e.firstChild,a=t.firstChild,n=a.nextSibling,r=t.nextSibling,i=r.firstChild,s=i.nextSibling,d=e.nextSibling,f=d.nextSibling;return v(t,g(D,{get when(){return!l.anonymous},fallback:"Anonymous",get children(){return[oe(()=>l.game.header.WhitePretty)," "]}}),n),v(n,()=>l.game.header.WhiteElo),v(r,g(D,{get when(){return!l.anonymous},fallback:"Anonymous",get children(){return[oe(()=>l.game.header.BlackPretty)," "]}}),s),v(s,()=>l.game.header.BlackElo),v(d,g(D,{get when(){return l.game.header.Event},get children(){const h=V.cloneNode(!0);return v(h,()=>l.game.header.Event),h}}),null),v(d,g(D,{get when(){return l.game.header.Round},get children(){const h=vo.cloneNode(!0);return h.firstChild,v(h,()=>l.game.header.Round,null),h}}),null),v(f,g(D,{get when(){return l.game.header.Site},get children(){const h=V.cloneNode(!0);return v(h,g(D,{get when(){return!l.anonymous||!K(l.game.header.Site)},get children(){return g(D,{get when(){return $e(l.game.header.Site)},get fallback(){return l.game.header.Site},get children(){const c=_o.cloneNode(!0);return v(c,()=>l.game.header.Site?.replace(/^https:\/\//,"")),P(()=>L(c,"href",l.game.header.Site??"")),c}})}})),h}}),null),v(f,g(D,{get when(){return l.game.header.DatePretty},get children(){const h=V.cloneNode(!0);return v(h,()=>l.game.header.DatePretty),h}}),null),o})(),we=o=>new Promise((e,t)=>{const a=new FileReader;a.onload=()=>{e(a.result)},a.onerror=t,a.readAsText(o)});const ko=w('<div class="load__pgn-file-info"><p>or</p><p>drop the PGN file anywhere on the page</p></div>'),So=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>'),Co=o=>{const[e,t]=G("");let a;return(()=>{const n=So.cloneNode(!0),r=n.firstChild,i=r.nextSibling,s=i.nextSibling,d=s.nextSibling,f=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 u=c.target;if(u?.files&&u.files.length>0){const y=await we(u.files[0]);o.handlers.loadPGN(y)}});const h=a;return typeof h=="function"?h(d):a=d,d.style.setProperty("display","none"),f.$$click=()=>{a&&a.click()},v(n,g(D,{get when(){return!l.mobile},get children(){return ko.cloneNode(!0)}}),null),P(c=>{const u="load"+(o.class?` ${o.class}`:""),y=e();return u!==c._v$&&(n.className=c._v$=u),y!==c._v$2&&(r.value=c._v$2=y),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)},Bo=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>'),fe=w("<hr>"),Eo=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>'),Do=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>'),Lo=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>'),ke=o=>{const[e,t]=G(""),[a,n]=G(!1),[r,i]=G(!1),s=d=>{t(d),setTimeout(()=>t(""),1e3)};return g(J,{get class(){return"share"+(o.class?` ${o.class}`:"")},get children(){return[(()=>{const d=Bo.cloneNode(!0),f=d.firstChild,h=f.nextSibling,c=h.nextSibling,u=c.nextSibling,y=u.nextSibling,$=y.nextSibling;return N(h,"click",o.handlers.toggleBorder,!0),N(c,"click",o.handlers.toggleExtraInfo,!0),N(u,"click",o.handlers.toggleTitleScreen,!0),N(y,"click",o.handlers.toggleAnonymous,!0),N($,"click",o.handlers.toggleShadows,!0),P(p=>{const S=l.boardConfig.showBorder,C=l.boardConfig.showBorder?"HIDE BORDER":"SHOW BORDER",B=l.boardConfig.showExtraInfo,m=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,F=l.boardConfig.showShadows?"HIDE SHADOWS":"SHOW SHADOWS";return S!==p._v$&&h.classList.toggle("options__button--active",p._v$=S),C!==p._v$2&&L(h,"title",p._v$2=C),B!==p._v$3&&c.classList.toggle("options__button--active",p._v$3=B),m!==p._v$4&&L(c,"title",p._v$4=m),k!==p._v$5&&u.classList.toggle("options__button--active",p._v$5=k),_!==p._v$6&&L(u,"title",p._v$6=_),E!==p._v$7&&y.classList.toggle("options__button--active",p._v$7=E),A!==p._v$8&&$.classList.toggle("options__button--active",p._v$8=A),F!==p._v$9&&L($,"title",p._v$9=F),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})(),fe.cloneNode(!0),(()=>{const d=Eo.cloneNode(!0),f=d.firstChild,h=f.nextSibling,c=h.nextSibling,u=c.firstChild,y=u.nextSibling,$=c.nextSibling,p=$.nextSibling,S=p.nextSibling,C=S.nextSibling,B=C.nextSibling,m=B.nextSibling,k=m.nextSibling;return h.$$click=_=>{_.target.select()},u.$$click=()=>{navigator.clipboard.writeText(l.fen),s("fen")},v(u,()=>e()==="fen"?"Copied!":"Copy FEN"),y.$$click=()=>{const _=`${location.origin}/#fen/${encodeURI(l.fen)}`;navigator.clipboard.writeText(_),s("fen-link")},v(y,()=>e()==="fen-link"?"Copied!":"Copy link"),p.$$click=()=>b("gameConfig","picSize","XS"),S.$$click=()=>b("gameConfig","picSize","S"),C.$$click=()=>b("gameConfig","picSize","M"),B.$$click=()=>b("gameConfig","picSize","L"),m.$$click=()=>b("gameConfig","picSize","XL"),k.$$click=async()=>{n(!0),await o.handlers.downloadImage(),n(!1)},v(k,()=>a()?"Please wait...":"Save as image"),P(_=>{const E=l.fen,A=l.gameConfig.picSize==="XS",F=l.gameConfig.picSize==="S",M=l.gameConfig.picSize==="M",X=l.gameConfig.picSize==="L",U=l.gameConfig.picSize==="XL";return E!==_._v$10&&(h.value=_._v$10=E),A!==_._v$11&&p.classList.toggle("share__size--active",_._v$11=A),F!==_._v$12&&S.classList.toggle("share__size--active",_._v$12=F),M!==_._v$13&&C.classList.toggle("share__size--active",_._v$13=M),X!==_._v$14&&B.classList.toggle("share__size--active",_._v$14=X),U!==_._v$15&&m.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})(),g(D,{get when(){return l.pgn},get children(){return[fe.cloneNode(!0),(()=>{const d=Do.cloneNode(!0),f=d.firstChild,h=f.nextSibling,c=h.firstChild,u=c.nextSibling,y=h.nextSibling,$=y.firstChild,p=$.nextSibling;return c.$$click=()=>{navigator.clipboard.writeText(l.anonymous?l.game.anonymousPGN:l.pgn),s("pgn")},v(c,()=>e()==="pgn"?"Copied!":"Copy PGN"),u.$$click=()=>{navigator.clipboard.writeText(window.location.href),s("pgn-link")},v(u,()=>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")},v(p,()=>e()==="markdown"?"Copied!":"Copy markdown"),d})(),(()=>{const d=Lo.cloneNode(!0),f=d.firstChild,h=f.nextSibling,c=h.nextSibling,u=c.nextSibling,y=u.nextSibling,$=y.nextSibling,p=$.nextSibling,S=p.nextSibling,C=S.nextSibling,B=C.nextSibling;return h.$$click=()=>b("gameConfig","animationSize","XS"),c.$$click=()=>b("gameConfig","animationSize","S"),u.$$click=()=>b("gameConfig","animationSize","M"),y.$$click=()=>b("gameConfig","animationSize","L"),$.$$click=()=>b("gameConfig","animationSize","XL"),p.$$click=()=>b("gameConfig","format","GIF"),S.$$click=()=>b("gameConfig","format","MP4"),C.$$click=()=>b("gameConfig","format","WebM"),B.$$click=async()=>{i(!0),await o.handlers.downloadAnimation(),i(!1)},v(B,()=>r()?"Please wait...":"Save animation"),P(m=>{const k=l.gameConfig.animationSize==="XS",_=l.gameConfig.animationSize==="S",E=l.gameConfig.animationSize==="M",A=l.gameConfig.animationSize==="L",F=l.gameConfig.animationSize==="XL",M=l.gameConfig.format==="GIF",X=l.gameConfig.format==="MP4",U=l.gameConfig.format==="WebM";return k!==m._v$16&&h.classList.toggle("share__size--active",m._v$16=k),_!==m._v$17&&c.classList.toggle("share__size--active",m._v$17=_),E!==m._v$18&&u.classList.toggle("share__size--active",m._v$18=E),A!==m._v$19&&y.classList.toggle("share__size--active",m._v$19=A),F!==m._v$20&&$.classList.toggle("share__size--active",m._v$20=F),M!==m._v$21&&p.classList.toggle("share__format--active",m._v$21=M),X!==m._v$22&&S.classList.toggle("share__format--active",m._v$22=X),U!==m._v$23&&C.classList.toggle("share__format--active",m._v$23=U),m},{_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 Io=w("<div></div>"),Po=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},Se=o=>{const[e,t]=G([]);return Po().then(a=>t(a)),g(J,{get class(){return"boards"+(o.class?` ${o.class}`:"")},get children(){return g(ee,{get each(){return e()},children:a=>(()=>{const n=Io.cloneNode(!0);return n.$$click=()=>{b("boardConfig","boardStyle",a.key),o.handlers.changeBoardStyle(a.key)},L(n,"draggable",!1),P(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 No=w("<img>"),Ao=tt.map(o=>({key:o,img:`/pieces/${o}/nw.svg`})),Ce=o=>g(J,{get class(){return"pieces"+(o.class?` ${o.class}`:"")},get children(){return g(ee,{each:Ao,children:e=>(()=>{const t=No.cloneNode(!0);return t.$$click=()=>{b("boardConfig","piecesStyle",e.key),o.handlers.changePiecesStyle(e.key)},L(t,"draggable",!1),P(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),v(e,()=>o.children),P(()=>e.className="tab"+(o.isActive?" tab--active":"")),e})();W(["click"]);const xo=w('<i class="las la-share"></i>'),Mo=w('<i class="las la-chess-board"></i>'),Ro=w('<i class="las la-chess"></i>'),To=w('<div class="game"><div class="game-tabs"></div></div>'),Y=o=>{b("activeTab",o)},zo=o=>(()=>{const e=To.cloneNode(!0),t=e.firstChild;return v(t,g(z,{name:"game",setTab:Y,get isActive(){return l.activeTab==="game"},children:"GAME"}),null),v(t,g(z,{name:"load",setTab:Y,get isActive(){return l.activeTab==="load"},children:"LOAD"}),null),v(t,g(D,{get when(){return l.layout!=="triple"},get children(){return[g(z,{name:"share",setTab:Y,get isActive(){return l.activeTab==="share"},get children(){return xo.cloneNode(!0)}}),g(z,{name:"boards",setTab:Y,get isActive(){return l.activeTab==="boards"},get children(){return Mo.cloneNode(!0)}}),g(z,{name:"pieces",setTab:Y,get isActive(){return l.activeTab==="pieces"},get children(){return Ro.cloneNode(!0)}})]}}),null),v(e,g(pe,{get children(){return[g(T,{get when(){return l.activeTab==="game"},get children(){return[g(wo,{get handlers(){return o.handlers}}),g(po,{get moves(){return o.moves},get handlers(){return o.handlers},get class(){return l.layout==="single"?"span2":void 0}}),g(D,{get when(){return l.layout!=="single"},get children(){return g(_e,{get handlers(){return o.handlers}})}})]}}),g(T,{get when(){return l.activeTab==="load"},get children(){return g(Co,{get handlers(){return o.handlers},class:"span3"})}}),g(D,{get when(){return l.layout!=="triple"},get children(){return[g(T,{get when(){return l.activeTab==="share"},get children(){return g(ke,{get handlers(){return o.handlers},class:"span3"})}}),g(T,{get when(){return l.activeTab==="boards"},get children(){return g(Se,{get handlers(){return o.handlers},class:"span3"})}}),g(T,{get when(){return l.activeTab==="pieces"},get children(){return g(Ce,{get handlers(){return o.handlers},class:"span3"})}})]}})]}}),null),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 v(n,g(z,{name:"share",setTab:t,get isActive(){return e()==="share"},get children(){return[Wo.cloneNode(!0)," SHARE"]}}),null),v(n,g(z,{name:"boards",setTab:t,get isActive(){return e()==="boards"},get children(){return[Oo.cloneNode(!0)," BOARDS"]}}),null),v(n,g(z,{name:"pieces",setTab:t,get isActive(){return e()==="pieces"},get children(){return[Go.cloneNode(!0)," PIECES"]}}),null),v(a,g(pe,{get children(){return[g(T,{get when(){return e()==="share"},get children(){return g(ke,{get handlers(){return o.handlers}})}}),g(T,{get when(){return e()==="boards"},get children(){return g(Se,{get handlers(){return o.handlers}})}}),g(T,{get when(){return e()==="pieces"},get children(){return g(Ce,{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=>[g(ho,{get handlers(){return o.handlers}}),(()=>{const e=Uo.cloneNode(!0),t=e.firstChild,a=t.nextSibling;return v(e,g(D,{get when(){return l.layout==="triple"},get children(){const n=Xo.cloneNode(!0);return v(n,g(Ho,{get handlers(){return o.handlers}})),n}}),t),v(t,g(D,{get when(){return l.layout==="single"},get children(){return g(_e,{get handlers(){return o.handlers}})}})),v(a,g(zo,{get moves(){return o.state.moves},get handlers(){return o.handlers}})),e})()],R=o=>o==="board"?localStorage.setItem("boardConfig",JSON.stringify(l.boardConfig)):localStorage.setItem("gameConfig",JSON.stringify(l.gameConfig)),Be={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:Be[n]}),s=r.getPosition(t);return await i.frame(s,r.header),i.render(),i.toImgUrl()};class Ee{gif;frameTime;constructor(e,t,a,n=1e3){this.gif=new Ne({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 Ae({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 De{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 ge=(o,e)=>e instanceof Ee?o.toImageData():e instanceof De?o.toClampedArray():o.canvas,Jo=async(o,e,t,a,n)=>{const r=new H().loadPGN(o),i=new q({...e,size:Be[a]}),s=t==="GIF"?new Ee(i.width,i.height,!0):t==="MP4"?new De(i.width,i.height):new qo,d=r.header;n&&(await i.titleFrame(d),i.render(),await s.add(ge(i,s),4));for(let f=0;f<r.length;f++){const h=r.getPosition(f);await i.frame(h,d),i.render();const c=h.end===0?5:h.ply===0&&!n?2:1;await s.add(ge(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"?Ke(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 lo(o,l.gameConfig);e.watch(r=>b("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(),b("boardConfig","showBorder",!l.boardConfig.showBorder),R("board")},showBorder(){o.showBorder(),b("boardConfig","showBorder",!0),R("board")},hideBorder(){o.hideBorder(),b("boardConfig","showBorder",!1),R("board")},toggleExtraInfo(){o.toggleExtraInfo(),b("boardConfig","showExtraInfo",!l.boardConfig.showExtraInfo),R("board")},toggleAnonymous(){if(b("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)}`,b("refreshHash",!1)}},toggleTitleScreen(){b("gameConfig","titleScreen",!l.gameConfig.titleScreen),R("game")},toggleShadows(){o.toggleShadows(),b("boardConfig","showShadows",!l.boardConfig.showShadows),R("board")},flip(){console.log("FLIP"),o.flip(),b("boardConfig","flipped",!l.boardConfig.flipped)},changeBoardStyle(r){o.setStyle(r),b("boardConfig","boardStyle",r),R("board")},changePiecesStyle(r){o.setPiecesStyle(r),b("boardConfig","piecesStyle",r),R("board")},async loadPGN(r,i="w"){const s=new H().loadPGN(r);b({pgn:s.pgn,fen:"",moves:s.getMoves(),ply:0,game:s}),window.location.hash=`pgn/${se(s.pgn)}`,b("refreshHash",!1),await e.load(s),b("activeTab","game"),i==="w"?o.flipWhite():o.flipBlack(),b("boardConfig","flipped",i==="b"),document.title=`SHARECHESS - ${s.getTitle({anonymous:!1})}`},async loadFEN(r,i=!0){const s=new H().loadFEN(r);b({pgn:"",fen:r,moves:s.getMoves(),ply:0,game:s}),await e.load(s),i&&(window.location.hash=`fen/${l.fen}`,b("refreshHash",!1),b("activeTab","game"));const d=s.getPosition(0).turn;d==="w"?o.flipWhite():o.flipBlack(),b("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):$e(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(()=>g(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",()=>{b("layout",window.innerWidth<window.innerHeight?"single":window.innerWidth<1366?"double":"triple")}),window.addEventListener("hashchange",()=>{if(!l.refreshHash){b("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 we(s.dataTransfer.files[0]);t.loadPGN(d)}})}};xe.load({google:{families:["Ubuntu:500,700","Fira Mono:500"]},custom:{families:["Chess"],urls:["/fonts.css"]},active:ra});