flatblox-tui 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -8,7 +8,7 @@ var nu=Object.create;var{getPrototypeOf:iu,defineProperty:ho,getOwnPropertyNames
8
8
  ${qo.join(`
9
9
  `)}`);var kd=us,Rd=["jump","frontFlip","horseWalk","swim"],Td=Object.keys(kd.clips).filter((e)=>!Rd.includes(e));var ra=["top","side","bottom"],na=["left","right","bottom","top","back","front"],ia=["humanoid","female","pig","robot","dog","cat","horse","bird","octopus"],Qn=["leftLeg","rightLeg","leftArm","rightArm","leftLegFoot","rightLegFoot","leftArmFoot","rightArmFoot","leftSleeve","rightSleeve"],sa=["leftWing","rightWing","carried","muzzle"];var Jm=new Set(ia),Zm=new Set([...Qn,...sa]),$m=new Set(ra),Xm=new Set(na),Vm=["cree","per"].join(""),zr=["H","oof"].join(""),zm=new Map([[`leftLeg${zr}`,"leftLegFoot"],[`rightLeg${zr}`,"rightLegFoot"],[`leftArm${zr}`,"leftArmFoot"],[`rightArm${zr}`,"rightArmFoot"]]),qm=["horse",zr].join("");var Nd=Math.PI*2;var np=new Set(Qn);var oa={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],transparent:[0,0,0,0],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]};function aa(e){let t=new Set;for(let r of e)for(let n of r)if(n.active&&n.color)t.add(n.color);return t}function ds(e,t){let r=aa(t);return e.filter((n)=>r.has(n))}var Dd=/^[+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?$/i,Ld=/^([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(deg|grad|rad|turn)?$/i,Zn=(e,t,r)=>Math.max(t,Math.min(r,e));function $n(e){let t=e.trim(),r=t.endsWith("%"),n=r?t.slice(0,-1):t;if(!Dd.test(n))return null;let s=Number(n);return Number.isFinite(s)?{value:s,percentage:r}:null}function ca(e){if(e===null)return 1;let t=$n(e);if(!t)return null;return Zn(t.percentage?t.value/100:t.value,0,1)}function ua(e,t){let r=/^([a-z]+)\(\s*(.*?)\s*\)$/i.exec(e.trim());if(!r||!t.includes(r[1].toLowerCase()))return null;let n=r[2];if(n.includes(",")){let a=n.split("/");if(a.length>2)return null;let l=a[0].split(",").map((c)=>c.trim());if(l.some((c)=>!c))return null;if(a.length===2){let c=a[1].trim();return l.length===3&&c?{channels:l,alpha:c}:null}return l.length===3||l.length===4?{channels:l.slice(0,3),alpha:l[3]??null}:null}let s=n.split("/");if(s.length>2)return null;let i=s[0].trim().split(/\s+/),o=s.length===2?s[1].trim():null;return i.length===3&&(s.length===1||o)?{channels:i,alpha:o}:null}function Md(e){let t=Ld.exec(e.trim());if(!t)return null;let r=Number(t[1]);if(!Number.isFinite(r))return null;switch(t[2]?.toLowerCase()){case"grad":return r*0.9;case"rad":return r*180/Math.PI;case"turn":return r*360;default:return r}}function qr(e){let t=ua(e,["hsl","hsla"]);if(!t)return null;let r=Md(t.channels[0]),n=$n(t.channels[1]),s=$n(t.channels[2]),i=ca(t.alpha);if(r===null||!n||!s||i===null)return null;return[r,Zn(n.value,0,100),Zn(s.value,0,100),i]}function da(e,t,r){let n=t/100,s=r/100,i=(1-Math.abs(2*s-1))*n,o=(e%360+360)%360/60,a=i*(1-Math.abs(o%2-1)),l=0,c=0,u=0;if(o<1)[l,c,u]=[i,a,0];else if(o<2)[l,c,u]=[a,i,0];else if(o<3)[l,c,u]=[0,i,a];else if(o<4)[l,c,u]=[0,a,i];else if(o<5)[l,c,u]=[a,0,i];else[l,c,u]=[i,0,a];let d=s-i/2;return{r:Math.round((l+d)*255),g:Math.round((c+d)*255),b:Math.round((u+d)*255)}}function ha({r:e,g:t,b:r}){let n=e/255,s=t/255,i=r/255,o=Math.max(n,s,i),a=Math.min(n,s,i),l=o-a,c=(o+a)/2;if(l===0)return{h:0,s:0,l:c*100};let u;if(o===n)u=((s-i)/l+(s<i?6:0))*60;else if(o===s)u=((i-n)/l+2)*60;else u=((n-s)/l+4)*60;return{h:u,s:l/(1-Math.abs(2*c-1))*100,l:c*100}}function $t({r:e,g:t,b:r}){let n=(s)=>Math.round(Math.max(0,Math.min(255,s))).toString(16).padStart(2,"0");return`#${n(e)}${n(t)}${n(r)}`}var la=(e,t)=>{let r=Math.max(-100,Math.min(100,t))/100;return r>=0?e+(100-e)*r:e*(1+r)};var Jn=(e)=>{let t=Math.round(e*1000)/1000;return String(Object.is(t,-0)?0:t)};function hs(e,t,r){if(t===0&&r===0)return e;let n=qr(e),s=n?null:Pt(e);if(!n&&!s)return e;let i=n?{h:n[0],s:n[1],l:n[2]}:ha(s),o=i.s===0?0:la(i.s,t),a=la(i.l,r),l=n?.[3]??s?.a??1;return`hsla(${Jn(i.h)}, ${Jn(o)}%, ${Jn(a)}%, ${Jn(l)})`}function ot(e){return typeof e==="number"&&Number.isInteger(e)&&e>=-100&&e<=100?e:0}function en(e,t,r){let n=ot(t),s=ot(r);if(n===0&&s===0)return e;return e.map((i)=>hs(i,n,s))}function Xt(e,t,r){if(t===0&&r===0)return e;let n=new Map,s=(i)=>{let o=n.get(i);if(o===void 0)o=hs(i,t,r),n.set(i,o);return o};return e.map((i)=>i.map((o)=>({...o,color:o.color===null?null:s(o.color)})))}function Fd(e){let t=/^#([\da-f]{3,4}|[\da-f]{6}|[\da-f]{8})$/i.exec(e.trim());if(!t)return null;let r=t[1],n=r.length<=4?[...r].map((s)=>s+s).join(""):r;return{r:Number.parseInt(n.slice(0,2),16),g:Number.parseInt(n.slice(2,4),16),b:Number.parseInt(n.slice(4,6),16),a:n.length===8?Number.parseInt(n.slice(6,8),16)/255:1}}function Gd(e){let t=ua(e,["rgb","rgba"]);if(!t)return null;let r=t.channels.map($n),n=ca(t.alpha);if(r.some((l)=>l===null)||n===null)return null;let[s,i,o]=r,a=(l)=>Zn(l.percentage?l.value/100*255:l.value,0,255);return{r:a(s),g:a(i),b:a(o),a:n}}function Pt(e){let t=e.trim(),r=Fd(t);if(r)return r;let n=qr(t);if(n)return{...da(n[0],n[1],n[2]),a:n[3]};let s=Gd(t);if(s)return s;let i=oa[t.toLowerCase()];if(!i)return null;return{r:i[0],g:i[1],b:i[2],a:i[3]??1}}function tn(e){let t=Pt(e);return t?{r:t.r,g:t.g,b:t.b}:null}var Xn=1;var As=30;function rn(e){return e.trim().slice(0,30)}var Vn=0.16,fs=0.1;var nn=0.15,gs=0.12;var sn=0.25;function pr(...e){let t=Math.max(0,Math.min(...e));return Math.max(0.22,t*0.5)}var Qe=64,ms=Qe*Qe;var ps=64,fa=512,Rp=fa*fa,Wd=128,pa=65535,Yd=20,Qd=/^#(?:[\da-f]{3,4}|[\da-f]{6}|[\da-f]{8})$/i,Jd=/^[a-z]+$/i,Zd=/^(?:rgb|rgba|hsl|hsla)\([\d\s.,%+\-/e]*(?:(?:deg|grad|rad|turn)[\d\s.,%+\-/e]*)?\)$/i;function ba(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function br(e,t,r){return Number.isInteger(e)&&Number(e)>=t&&Number(e)<=r}function ft(e){if(typeof e!=="string"||e.length===0||e.length>Wd)return!1;return Qd.test(e)||Jd.test(e)||Zd.test(e)}function $d(e){return ba(e)&&e.v===2}function ga(e,t){return e===void 0||Array.isArray(e)&&e.length<=t&&e.every((r)=>br(r,0,t-1))}function ma(e,t,r){return e===void 0||Array.isArray(e)&&e.length===t&&e.every((n)=>br(n,0,r))}function Xd(e,t,r){let{w:n,h:s,palette:i,cells:o,activeNoColor:a,tiles:l,depths:c,mirrorZ:u}=e;if(!br(n,0,t)||!br(s,0,t))return!1;let d=n*s;return d<=r&&Array.isArray(i)&&i.length<=d&&i.every(ft)&&Array.isArray(o)&&o.length===d&&o.every((A)=>br(A,0,i.length))&&ga(a,d)&&ma(l,d,pa+1)&&ma(c,d,Yd)&&ga(u,d)}function Vd(e){if(!ba(e)||typeof e.active!=="boolean")return!1;if(e.color!==null&&!ft(e.color))return!1;if(e.tileIndex!==void 0&&e.tileIndex!==null&&!br(e.tileIndex,0,pa))return!1;if(e.depth!==void 0&&e.depth!==null&&!Number.isFinite(e.depth))return!1;return e.mirrorZ===void 0||e.mirrorZ===null||typeof e.mirrorZ==="boolean"}function zd(e){if(e.length>Qe)return null;let t=0,r=[];for(let n of e){if(!Array.isArray(n)||n.length>Qe)return null;if(t+=n.length,t>ms||!n.every(Vd))return null;r.push(n.map((s)=>({active:s.active,color:s.color,...s.tileIndex!=null?{tileIndex:s.tileIndex}:{},...ct(s.depth)>gr?{depth:ct(s.depth)}:{},...s.mirrorZ?{mirrorZ:!0}:{}})))}return r}function yr(e){let t=e.length,r=t>0?e[0].length:0,n=[],s=new Map,i=Array(r*t).fill(0),o=[],a=null,l=null,c=[];for(let d=0;d<t;d++){let A=e[d];for(let g=0;g<r;g++){let f=A?.[g],y=d*r+g;if(!f)continue;if(f.color){let C=s.get(f.color);if(C===void 0)n.push(f.color),C=n.length,s.set(f.color,C);i[y]=C}else if(f.active)o.push(y);if(f.tileIndex!=null)a??=Array(r*t).fill(0),a[y]=f.tileIndex+1;let b=ct(f.depth);if(b>gr)l??=Array(r*t).fill(0),l[y]=b;if(f.mirrorZ)c.push(y)}}let u={v:2,w:r,h:t,palette:n,cells:i};if(o.length>0)u.activeNoColor=o;if(a)u.tiles=a;if(l)u.depths=l;if(c.length>0)u.mirrorZ=c;return u}function on(e){if($d(e))return Xd(e,Qe,ms)?qd(e):[];return Array.isArray(e)?zd(e)??[]:[]}function qd(e){let{w:t,h:r,palette:n,cells:s,activeNoColor:i,tiles:o,depths:a}=e,l=i?new Set(i):null,c=e.mirrorZ?new Set(e.mirrorZ):null,u=Array(r);for(let d=0;d<r;d++){let A=Array(t);for(let g=0;g<t;g++){let f=d*t+g,y=s[f];if(y>0)A[g]={active:!0,color:n[y-1]??null};else if(l?.has(f))A[g]={active:!0,color:null};else A[g]={active:!1,color:null};let b=o?.[f];if(b)A[g].tileIndex=b-1;let C=ct(a?.[f]);if(C>gr)A[g].depth=C;if(c?.has(f))A[g].mirrorZ=!0}u[d]=A}return u}var eh={top:0,side:1,bottom:2};var th=/^data:image\/(?:png|gif|webp);base64,[a-z\d+/=]+$/i;var rh=/^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\/[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\/[\da-f]{64}\.png$/i;function bs(e,t){return Number.isInteger(e)&&Number(e)>0&&Number(e)<=t}function nh(e){if(typeof e!=="string"||e.length===0||e.length>256)return!1;return![...e].some((t)=>{let r=t.charCodeAt(0);return r<32||r===127})}function ih(e,t){return e===void 0||Array.isArray(e)&&e.length<=t&&e.every((r)=>r===null||typeof r==="string"&&r.length<=128&&/^[a-z0-9_-]+$/i.test(r))}function ys(e){if(!e||e.v!==2&&e.v!==3)return!1;if(!nh(e.name)||!bs(e.tileSize,64)||!bs(e.cols,256)||!bs(e.rows,256))return!1;if(e.faceLayout!==void 0&&e.faceLayout!=="top-side-bottom")return!1;if(!ih(e.tileIds,e.cols*e.rows))return!1;let t=e.cols*e.tileSize*(e.faceLayout?3:1),r=e.rows*e.tileSize;return e.cols*e.tileSize<=4096&&r<=4096&&t*r<=16777216}function sh(e,t){if(typeof e!=="string"||e.length===0||e.length>4096)return null;for(let r of e){let n=r.charCodeAt(0);if(n<=32||n===127||`<>"'\\`.includes(r))return null}if(typeof t!=="string"||!rh.test(t))return null;try{let r=new URL(e);return r.protocol==="https:"&&r.hostname==="ldxdyymfagplpxxsqmgs.supabase.co"&&r.port===""&&r.username===""&&r.password===""&&r.search===""&&r.hash===""&&r.pathname===`/storage/v1/object/public/tilesets/${t}`?e:null}catch{return null}}function ws(e){if(!ys(e))return null;if(e.v===2)return e.imageDataUrl.length<=16777216&&th.test(e.imageDataUrl)?e.imageDataUrl:null;if(e.v===3)return sh(e.url,e.path);return null}function an(e,t,r="top"){if(!ys(e))return null;if(!Number.isInteger(t)||t<0||t>=e.cols*e.rows)return null;let n=e.faceLayout?3:1,s=e.faceLayout?eh[r]:0,i=e.cols*e.tileSize;return{sx:s*i+t%e.cols*e.tileSize,sy:Math.floor(t/e.cols)*e.tileSize,tileSize:e.tileSize,sheetW:i*n,sheetH:e.rows*e.tileSize}}function _s(e){if(!ys(e))return null;return{width:e.cols*e.tileSize*(e.faceLayout?3:1),height:e.rows*e.tileSize}}function oh(e){let t=e.length;for(let r=0;r<e.length;r+=101)t=(t<<5)-t+e.charCodeAt(r)|0;return`iso-sheet-${(t>>>0).toString(36)}`}var Vt={corners:[[0,0,1],[1,0,1],[1,1,1],[0,1,1]],shade:1},ln={corners:[[0,1,1],[0,1,0],[1,1,0],[1,1,1]],shade:0.97},wr={corners:[[1,0,1],[1,0,0],[1,1,0],[1,1,1]],shade:0.94},zt=0.5,ah=0.75,lh="rgba(0, 0, 0, 0.16)",ch=0.92,uh="#92929a";function dh(e){if(!Number.isFinite(e))return zt;return Math.max(0,Math.min(1,e))}function ya(e,t){if(t<zt){let n=t/zt,s=e*ah;return s+(e-s)*n}let r=(t-zt)/(1-zt);return e+(1-e)*r}function ce(e){return e.toFixed(2)}function St(e){return e.replaceAll("&","&amp;").replaceAll('"',"&quot;").replaceAll("'","&apos;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function wa(e){return`${ce(e[0])},${ce(e[1])}`}function hh([e,t]){let r=wa(e),n=wa(t);return r<n?`${r} ${n}`:`${n} ${r}`}function _a(e,t){return`<polygon points="${e.map(([n,s])=>`${ce(n)},${ce(s)}`).join(" ")}" fill="${St(t)}"/>`}function va(e,t,r){let n=t[0]-e[0],s=t[1]-e[1],i=Math.hypot(n,s)||1,o=Math.min(r,i/2)/i;return[e[0]+n*o,e[1]+s*o]}function Ah(e,t){let r=e.length,n="";for(let s=0;s<r;s++){let i=e[s],o=e[(s-1+r)%r],a=e[(s+1)%r],l=va(i,o,t),c=va(i,a,t);n+=`${s===0?"M":"L"}${ce(l[0])},${ce(l[1])}`,n+=`Q${ce(i[0])},${ce(i[1])} ${ce(c[0])},${ce(c[1])}`}return`${n}Z`}function Ca(e,t,r,n){return`<path d="${e}" fill="${St(t)}" stroke="${St(r)}" stroke-width="${ce(n)}" stroke-linejoin="round"/>`}function fh(e,t){if(e.length===0)return"";return`<path d="${e.map(([n,s])=>`M${ce(n[0])},${ce(n[1])}L${ce(s[0])},${ce(s[1])}`).join("")}" fill="none" stroke="${St(t)}" stroke-width="1" stroke-linejoin="round" vector-effect="non-scaling-stroke"/>`}function vs(e){let{grid:t,numCols:r,numRows:n,scale:s=16,showGridLines:i=!1,sideLighting:o=zt,cellGroups:a=!1,tileset:l=null,tilesetImageId:c,embedTilesetImage:u=!0,blockStyle:d="normal"}=e,A=Number.isFinite(s)&&s>0?Math.min(s,1024):16,g=i&&d!=="jelly"?lh:void 0,f=dh(o),y=ws(l),b=l&&y?l:null,C=_s(b),_=C?.width??0,x=C?.height??0,v=y&&c&&/^[a-z_][\w:.-]{0,127}$/i.test(c)?c:null,w=y?v??oh(y):"",m=u||!v,N=t.slice(0,Qe),O=Math.min(Number.isInteger(n)&&n>0?n:0,N.length,Qe),U=N.reduce((p,R)=>Math.max(p,Array.isArray(R)?R.length:0),0),k=Math.min(Number.isInteger(r)&&r>0?r:0,U,Qe),T=A,ee=A/Math.sqrt(3),te=A*2/Math.sqrt(3),X=d==="jelly"?T*Vn:0,ae=(p)=>p?.tileIndex!=null?an(b,p.tileIndex):null,ie=(p)=>{if(ft(p?.color))return p.color;return ae(p)?uh:null},se=(p,R,ne)=>[(p-R)*T,(p+R)*ee-ne*te],He=(p,R)=>{let ne=t[R]?.[p];return ne?.active&&ie(ne)?ct(ne.depth):0},J=[];for(let p=0;p<O;p++)for(let R=0;R<k;R++){let ne=t[p]?.[R],Ae=ie(ne);if(ne?.active&&Ae)J.push({x:R,y:p,color:Ae,tileIndex:ne.tileIndex??null,depth:ct(ne.depth),mirrorZ:!!ne.mirrorZ})}if(J.length===0)return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 0 0"/>';J.sort((p,R)=>p.x+p.y-(R.x+R.y)||p.depth-R.depth);let L=[],De=1/0,Te=-1/0,ze=1/0,D=-1/0,M=!1,ue=ya(wr.shade,f),pe=ya(ln.shade,f),Be=(p)=>p===Vt?p.shade:p===wr?ue:pe,me=(p,R)=>{if(p<De)De=p;if(p>Te)Te=p;if(R<ze)ze=R;if(R>D)D=R};for(let{x:p,y:R,color:ne,tileIndex:Ae,depth:ve,mirrorZ:q}of J){let be=qr(ne),fe=[],Oe=[],{primary:Y,mirrored:Ft}=ls(ve,q),Ie=(de)=>be?`hsla(${be[0]}, ${be[1]}%, ${Math.max(0,Math.min(100,be[2]*de))}%, ${be[3]})`:ne,K=(de,Ce=0,Me=Y)=>de.corners.map(([Ee,he,re])=>se(p+Ee,R+he,re===0?Ce:Me)),Ke=(de,Ce=0,Me=Y)=>{let Ee=K(de,Ce,Me);if(X>0){let he=Be(de),re=Ie(he),oe=Ah(Ee,X),Pe=de===Vt?Ie(Math.min(1.18,he+0.13)):Ie(he*ch);fe.push(Ca(oe,re,re,X),Ca(oe,"none",Pe,X*0.3))}else fe.push(_a(Ee,Ie(Be(de))));for(let[he,re]of Ee)me(he,re)},Ne=q?-Ft:He(p+1,R),B=q?-Ft:He(p,R+1),lt=a&&!q?0:Ne,mt=a&&!q?0:B,Gt=a||q||lt<Y,Ut=a||q||mt<Y;if(Gt)Ke(wr,lt,Y);if(Ut)Ke(ln,mt,Y);if(Ke(Vt,Y,Y),g){let de=new Set,Ce=(re,oe)=>{let Pe=hh([re,oe]);if(de.has(Pe))return;de.add(Pe),Oe.push([re,oe])},Me=(re)=>{for(let oe=0;oe<re.length;oe++)Ce(re[oe],re[(oe+1)%re.length])},Ee=(re,oe)=>{let[Pe,Fe]=re.corners.filter(([,,xe])=>xe===0);for(let xe=Math.floor(oe)+1;xe<Y;xe++)Ce(se(p+Pe[0],R+Pe[1],xe),se(p+Fe[0],R+Fe[1],xe))},he=K(Vt,Y,Y);if(Ce(he[0],he[1]),He(p+1,R)!==Y)Ce(he[1],he[2]);if(He(p,R+1)!==Y)Ce(he[2],he[3]);if(Ce(he[3],he[0]),q||Ne<Y)Me(K(wr,Ne,Y)),Ee(wr,Ne);if(q||B<Y)Me(K(ln,B,Y)),Ee(ln,B)}let jt=Ae==null?null:an(b,Ae);if(jt){M=!0;let de=(Ee,he,re,oe,Pe,Fe,xe,Ze)=>{let $e=an(b,Ae,Ee);if(!$e)return;let dt=1-Ze;fe.push(`<g transform="matrix(${he} ${re} ${oe} ${Pe} ${ce(Fe)} ${ce(xe)})"><svg x="0" y="0" width="1" height="1" viewBox="${$e.sx} ${$e.sy} ${$e.tileSize} ${$e.tileSize}" preserveAspectRatio="none"><use href="#${w}" xlink:href="#${w}"/></svg>`+(dt>0?`<rect x="0" y="0" width="1" height="1" fill="#000" opacity="${dt.toFixed(2)}"/>`:"")+"</g>")};if(Gt){let[Ee,he]=se(p+1,R,Y);de("side",-T,ee,0,te*(Y-lt),Ee,he,Be(wr))}if(Ut){let[Ee,he]=se(p,R+1,Y);de("side",T,ee,0,te*(Y-mt),Ee,he,Be(ln))}let[Ce,Me]=se(p,R,Y);de("top",T,ee,-T,ee,Ce,Me,Vt.shade)}if(g)fe.push(fh(Oe,g));if(d!=="normal"&&!jt){if(d==="lego"){let de=Math.SQRT2*nn*T,Ce=Math.SQRT2*nn*ee,Me=Ie(ue),Ee=Ie(Vt.shade),he=[[-1,-1],[-1,1],[1,-1],[1,1]];for(let[re,oe]of he){let Pe=p+0.5+re*sn,Fe=R+0.5+oe*sn,[xe,Ze]=se(Pe,Fe,Y),[,$e]=se(Pe,Fe,Y+gs);me(xe-de,Ze+Ce),me(xe+de,$e-Ce);let dt='shape-rendering="geometricPrecision"';fe.push(`<ellipse cx="${ce(xe)}" cy="${ce(Ze)}" rx="${ce(de)}" ry="${ce(Ce)}" fill="${St(Me)}" ${dt}/>`,`<rect x="${ce(xe-de)}" y="${ce($e)}" width="${ce(de*2)}" height="${ce(Ze-$e)}" fill="${St(Me)}" ${dt}/>`,`<ellipse cx="${ce(xe)}" cy="${ce($e)}" rx="${ce(de)}" ry="${ce(Ce)}" fill="${St(Ee)}" ${dt}/>`)}}else if(d==="voxel"){let de=(re,oe,Pe,Fe,xe,Ze)=>{let $e=(dt,Dn)=>{for(let[Ln,Mn]of dt)me(Ln,Mn);fe.push(_a(dt,Ie(Dn)))};$e([se(oe,Pe,Ze),se(oe,Pe,xe),se(oe,Fe,xe),se(oe,Fe,Ze)],ue),$e([se(re,Fe,Ze),se(re,Fe,xe),se(oe,Fe,xe),se(oe,Fe,Ze)],pe),$e([se(re,Pe,Ze),se(oe,Pe,Ze),se(oe,Fe,Ze),se(re,Fe,Ze)],Vt.shade)},Ce=fs,Me=pr(1,1),Ee=q||Ne<Y?Ne:null,he=q||B<Y?B:null;if(de(p+0.5-Me/2,p+0.5+Me/2,R+0.5-Me/2,R+0.5+Me/2,Y,Y+Ce),Ee!==null){let re=pr(1,Y-Ee),oe=(Y+Ee)/2;de(p+1,p+1+Ce,R+0.5-re/2,R+0.5+re/2,oe-re/2,oe+re/2)}if(he!==null){let re=pr(1,Y-he),oe=(Y+he)/2;de(p+0.5-re/2,p+0.5+re/2,R+1,R+1+Ce,oe-re/2,oe+re/2)}}}if(a)L.push(`<g data-color="${St(ne)}">${fe.join("")}</g>`);else L.push(...fe)}let Le=2+X/2,_t=De-Le,nt=ze-Le,Z=Te-De+Le*2,vt=D-ze+Le*2,G=M&&b&&y&&m?`<defs><image id="${w}" href="${St(y)}" xlink:href="${St(y)}" x="0" y="0" width="${_}" height="${x}" style="image-rendering:pixelated"/></defs>`:"";return[`<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="${ce(_t)} ${ce(nt)} ${ce(Z)} ${ce(vt)}" shape-rendering="crispEdges">`,G,...L,"</svg>"].join("")}var gh="hsla(278, 100%, 70%, 1)",mh=/hsla\(278, 100%, ([\d.]+)%, 1\)/g,cn=(e)=>vs({grid:[[{active:!0,color:gh}]],numCols:1,numRows:1,blockStyle:e,sideLighting:0.15}).replaceAll(mh,"hsl(var(--block-style-icon-hs, 278 100%) $1% / 1)"),ph=[{style:"normal",label:"Normal",icon:cn("normal")},{style:"voxel",label:"Voxel",icon:cn("voxel")},{style:"lego",label:"Lego",icon:cn("lego")},{style:"jelly",label:"Jelly",icon:cn("jelly")}];var Ve=[{name:"Classic",colors:["hsla(278, 100%, 50%, 1)","hsla(278, 100%, 16%, 1)","hsla(278, 100%, 80%, 1)","hsla(306, 100%, 50%, 1)","hsla(28, 100%, 60%, 1)","hsla(0, 80%, 60%, 1)","hsla(278, 60%, 35%, 1)","hsla(306, 100%, 80%, 1)","hsla(306, 80%, 30%, 1)","hsla(28, 100%, 80%, 1)"]},{name:"Super Mario",colors:["hsla(218, 100%, 68%, 1)","hsla(0, 85%, 55%, 1)","hsla(225, 85%, 45%, 1)","hsla(28, 100%, 80%, 1)","hsla(22, 60%, 32%, 1)","hsla(120, 70%, 40%, 1)","hsla(45, 100%, 55%, 1)","hsla(0, 0%, 100%, 1)","hsla(0, 0%, 8%, 1)","hsla(22, 45%, 22%, 1)"]},{name:"Pac-Man",colors:["hsla(60, 100%, 50%, 1)","hsla(240, 100%, 56%, 1)","hsla(0, 100%, 50%, 1)","hsla(300, 100%, 86%, 1)","hsla(180, 100%, 50%, 1)","hsla(32, 100%, 66%, 1)","hsla(0, 0%, 100%, 1)","hsla(0, 0%, 5%, 1)","hsla(240, 100%, 25%, 1)","hsla(60, 100%, 80%, 1)"]},{name:"Grayscale",colors:["hsla(0, 0%, 98%, 1)","hsla(0, 0%, 92%, 1)","hsla(0, 0%, 86%, 1)","hsla(0, 0%, 80%, 1)","hsla(0, 0%, 74%, 1)","hsla(0, 0%, 68%, 1)","hsla(0, 0%, 62%, 1)","hsla(0, 0%, 56%, 1)","hsla(0, 0%, 50%, 1)","hsla(0, 0%, 44%, 1)"]},{name:"Sunset",colors:["hsla(45, 100%, 70%, 1)","hsla(28, 100%, 60%, 1)","hsla(12, 90%, 55%, 1)","hsla(350, 80%, 55%, 1)","hsla(320, 60%, 45%, 1)","hsla(280, 45%, 25%, 1)","hsla(50, 100%, 88%, 1)","hsla(38, 100%, 78%, 1)","hsla(20, 100%, 68%, 1)","hsla(5, 85%, 45%, 1)"]},{name:"Ocean",colors:["hsla(180, 70%, 80%, 1)","hsla(190, 75%, 60%, 1)","hsla(205, 75%, 50%, 1)","hsla(215, 70%, 40%, 1)","hsla(225, 65%, 28%, 1)","hsla(235, 55%, 15%, 1)","hsla(175, 60%, 92%, 1)","hsla(185, 70%, 70%, 1)","hsla(195, 75%, 55%, 1)","hsla(200, 70%, 45%, 1)"]},{name:"Pastel",colors:["hsla(350, 100%, 88%, 1)","hsla(30, 100%, 85%, 1)","hsla(55, 85%, 82%, 1)","hsla(135, 60%, 82%, 1)","hsla(200, 75%, 85%, 1)","hsla(275, 70%, 85%, 1)","hsla(15, 100%, 86%, 1)","hsla(45, 100%, 85%, 1)","hsla(90, 55%, 82%, 1)","hsla(160, 55%, 82%, 1)"]},{name:"Gameboy",colors:["hsla(85, 60%, 85%, 1)","hsla(88, 58%, 78%, 1)","hsla(90, 56%, 72%, 1)","hsla(93, 55%, 66%, 1)","hsla(95, 55%, 60%, 1)","hsla(98, 53%, 54%, 1)","hsla(102, 52%, 48%, 1)","hsla(105, 51%, 42%, 1)","hsla(110, 50%, 35%, 1)","hsla(113, 52%, 30%, 1)"]},{name:"Neon",colors:["hsla(320, 100%, 60%, 1)","hsla(180, 100%, 55%, 1)","hsla(60, 100%, 60%, 1)","hsla(270, 100%, 65%, 1)","hsla(130, 100%, 55%, 1)","hsla(25, 100%, 55%, 1)","hsla(300, 100%, 50%, 1)","hsla(200, 100%, 60%, 1)","hsla(90, 100%, 55%, 1)","hsla(45, 100%, 55%, 1)"]},{name:"Forest",colors:["hsla(80, 35%, 75%, 1)","hsla(100, 40%, 50%, 1)","hsla(120, 45%, 30%, 1)","hsla(140, 35%, 18%, 1)","hsla(30, 40%, 35%, 1)","hsla(25, 50%, 22%, 1)","hsla(70, 40%, 88%, 1)","hsla(90, 45%, 62%, 1)","hsla(110, 45%, 40%, 1)","hsla(130, 40%, 24%, 1)"]},{name:"Candy",colors:["hsla(340, 100%, 80%, 1)","hsla(320, 90%, 65%, 1)","hsla(280, 85%, 65%, 1)","hsla(200, 90%, 70%, 1)","hsla(165, 75%, 65%, 1)","hsla(50, 100%, 70%, 1)","hsla(350, 100%, 90%, 1)","hsla(0, 90%, 70%, 1)","hsla(30, 100%, 72%, 1)","hsla(60, 90%, 75%, 1)"]},{name:"Cobalt",colors:["hsla(215, 85%, 94%, 1)","hsla(215, 85%, 86%, 1)","hsla(215, 85%, 78%, 1)","hsla(215, 85%, 70%, 1)","hsla(215, 85%, 62%, 1)","hsla(215, 85%, 54%, 1)","hsla(215, 85%, 46%, 1)","hsla(215, 85%, 40%, 1)","hsla(215, 85%, 34%, 1)","hsla(215, 85%, 28%, 1)"]},{name:"Terracotta",colors:["hsla(25, 55%, 78%, 1)","hsla(20, 65%, 55%, 1)","hsla(15, 60%, 40%, 1)","hsla(15, 50%, 25%, 1)","hsla(35, 40%, 60%, 1)","hsla(0, 25%, 12%, 1)","hsla(30, 60%, 88%, 1)","hsla(25, 60%, 68%, 1)","hsla(18, 65%, 48%, 1)","hsla(12, 55%, 32%, 1)"]},{name:"Vaporwave",colors:["hsla(330, 100%, 78%, 1)","hsla(290, 80%, 60%, 1)","hsla(200, 90%, 72%, 1)","hsla(170, 70%, 60%, 1)","hsla(40, 90%, 78%, 1)","hsla(260, 45%, 18%, 1)","hsla(320, 100%, 88%, 1)","hsla(310, 90%, 70%, 1)","hsla(280, 70%, 45%, 1)","hsla(250, 60%, 55%, 1)"]},{name:"Mint",colors:["hsla(160, 65%, 88%, 1)","hsla(165, 60%, 65%, 1)","hsla(170, 55%, 45%, 1)","hsla(175, 50%, 28%, 1)","hsla(180, 30%, 15%, 1)","hsla(55, 60%, 90%, 1)","hsla(155, 70%, 95%, 1)","hsla(160, 60%, 78%, 1)","hsla(165, 55%, 55%, 1)","hsla(170, 50%, 36%, 1)"]},{name:"Sakura",colors:["hsla(340, 100%, 93%, 1)","hsla(345, 85%, 80%, 1)","hsla(350, 70%, 65%, 1)","hsla(355, 60%, 48%, 1)","hsla(30, 40%, 32%, 1)","hsla(120, 30%, 42%, 1)","hsla(340, 100%, 97%, 1)","hsla(342, 90%, 87%, 1)","hsla(348, 80%, 72%, 1)","hsla(352, 65%, 56%, 1)"]},{name:"Desert",colors:["hsla(40, 55%, 82%, 1)","hsla(30, 50%, 65%, 1)","hsla(15, 45%, 48%, 1)","hsla(90, 30%, 45%, 1)","hsla(95, 25%, 22%, 1)","hsla(200, 40%, 72%, 1)","hsla(42, 60%, 92%, 1)","hsla(35, 55%, 74%, 1)","hsla(25, 50%, 56%, 1)","hsla(18, 45%, 38%, 1)"]},{name:"Galaxy",colors:["hsla(265, 70%, 82%, 1)","hsla(275, 75%, 55%, 1)","hsla(290, 85%, 35%, 1)","hsla(220, 70%, 40%, 1)","hsla(230, 60%, 12%, 1)","hsla(50, 90%, 82%, 1)","hsla(260, 80%, 92%, 1)","hsla(270, 75%, 68%, 1)","hsla(285, 80%, 45%, 1)","hsla(300, 85%, 28%, 1)"]},{name:"Ember",colors:["hsla(25, 100%, 95%, 1)","hsla(25, 100%, 88%, 1)","hsla(25, 100%, 80%, 1)","hsla(25, 100%, 72%, 1)","hsla(25, 100%, 65%, 1)","hsla(25, 100%, 58%, 1)","hsla(25, 100%, 50%, 1)","hsla(25, 100%, 44%, 1)","hsla(25, 100%, 38%, 1)","hsla(25, 100%, 32%, 1)"]},{name:"Watermelon",colors:["hsla(350, 85%, 80%, 1)","hsla(350, 75%, 62%, 1)","hsla(355, 65%, 45%, 1)","hsla(90, 45%, 62%, 1)","hsla(110, 50%, 30%, 1)","hsla(0, 0%, 8%, 1)","hsla(350, 90%, 90%, 1)","hsla(350, 80%, 70%, 1)","hsla(352, 70%, 55%, 1)","hsla(358, 60%, 38%, 1)"]}];var yh=16777216,wh=16;function _r(e){return typeof e==="object"&&e!==null&&!Array.isArray(e)}function _h(e){if(!Array.isArray(e))return[...Ve[0].colors];let t=e.slice(0,wh).flatMap((r)=>{if(typeof r==="string"&&ft(r))return[r];if(_r(r)&&ft(r.color)&&typeof r.opacity==="number"&&Number.isFinite(r.opacity)&&r.opacity>=0&&r.opacity<=1)return[r.color];return[]});return t.length>0?t:[...Ve[0].colors]}function vh(e){if(!Array.isArray(e.artboards))return 0;return Number.isInteger(e.activeArtboard)&&Number(e.activeArtboard)>=0&&Number(e.activeArtboard)<e.artboards.length?Number(e.activeArtboard):0}function Ch(e){let t=_r(e)?e:{};return{saturation:ot(t.saturation),lightness:ot(t.lightness)}}function un(e){if(e.length>yh)throw Error("Draft is too large");let t=JSON.parse(e);if(!_r(t)||t.version!==1)throw Error("Not a Flatblox version-1 draft");let r=on(t.grid),n=t.gridSize===void 0?r.length:t.gridSize;if(!Number.isInteger(n)||Number(n)<1||Number(n)>Qe||r.length!==n||!r.every((o)=>o.length===n))throw Error("Draft contains an invalid grid");let s=_h(t.palette),i=ft(t.activeColor)?t.activeColor:s[0];return{filename:typeof t.filename==="string"?rn(t.filename):"untitled",grid:r,palette:s,activeColor:i,paletteColorAdjustment:Ch(t.paletteColorAdjustment),draft:{data:t,activeArtboard:vh(t)}}}function Eh(e,t){let r=Array.isArray(t)?t:[];return e.map((n,s)=>{let i=r[s];if(!_r(i))return{color:n,opacity:1};let o=typeof i.opacity==="number"&&Number.isFinite(i.opacity)&&i.opacity>=0&&i.opacity<=1?i.opacity:1;return{...i,color:n,opacity:o}})}function Sh(e,t){let r=e.draft?.data.artboards,n=Array.isArray(r)?[...r]:[],s=n.length>0?Math.min(e.draft?.activeArtboard??0,n.length-1):0;if(n.length===0)n.push(t);else{let i=n[s];n[s]=_r(i)&&"grid"in i?{...i,grid:t}:t}return{artboards:n,activeArtboard:s}}function dn(e){let t=e.draft?.data,r=yr(e.grid),n=Eh(e.palette,t?.palette),{artboards:s,activeArtboard:i}=Sh(e,r),o=e.paletteColorAdjustment??{saturation:0,lightness:0},a=_r(t?.paletteColorAdjustment)?t.paletteColorAdjustment:{};return JSON.stringify({...t,version:1,grid:r,gridSize:e.grid.length,palette:n,paletteColorAdjustment:{...a,saturation:ot(o.saturation),lightness:ot(o.lightness)},activeColor:e.activeColor,artboards:s,activeArtboard:i,filename:e.filename,savedAt:new Date().toISOString()},null,2)}var Sa=16,Ih=100;function Ea(e,t,r){return Math.max(t,Math.min(r,e))}function hn(e){return e.map((t)=>t.map((r)=>({...r})))}function xh(e){return Array.from({length:e},()=>Array.from({length:e},()=>({active:!1,color:null})))}function Ia(e){if(!Number.isInteger(e)||e<1||e>Qe)throw Error(`Grid size must be between 1 and ${Qe}`);return e}function qt(e=Sa){let t=[...Ve[0].colors];return{filename:"untitled",grid:xh(Ia(e)),palette:t,activeColor:t[0],paletteColorAdjustment:{saturation:0,lightness:0}}}function kh(e,t,r,n){let s=[t];if(r)s.push({x:e-1-t.x,y:t.y});if(n)s.push({x:t.x,y:e-1-t.y});if(r&&n)s.push({x:e-1-t.x,y:e-1-t.y});return[...new Map(s.map((i)=>[`${i.x}:${i.y}`,i])).values()]}class Dt{palette;paletteColorAdjustment;cursor={x:0,y:0};tool="draw";mirrorX=!1;mirrorY=!1;activeColorIndex;currentId=0;nextId=1;savedId=0;currentFilename;savedFilename;undoStack=[];redoStack=[];currentGrid;draft;constructor(e){let t=Ia(e.grid.length);if(!e.grid.every((n)=>n.length===t))throw Error("Grid must be square");if(e.palette.length===0)throw Error("Palette is empty");this.currentFilename=e.filename||"untitled",this.savedFilename=this.currentFilename,this.palette=[...e.palette],this.paletteColorAdjustment={saturation:ot(e.paletteColorAdjustment?.saturation),lightness:ot(e.paletteColorAdjustment?.lightness)},this.draft=e.draft,this.currentGrid=hn(e.grid);let r=this.palette.indexOf(e.activeColor);this.activeColorIndex=r>=0?r:0}get grid(){return this.currentGrid}get filename(){return this.currentFilename}get size(){return this.currentGrid.length}get activeColor(){return this.palette[this.activeColorIndex]}get selectedColorIndex(){return this.activeColorIndex}get canUndo(){return this.undoStack.length>0}get canRedo(){return this.redoStack.length>0}get dirty(){return this.currentId!==this.savedId||this.currentFilename!==this.savedFilename}get revision(){return{id:this.currentId,filename:this.currentFilename}}rename(e){let t=e.trim();if(!t||t===this.currentFilename)return!1;return this.currentFilename=t,!0}moveCursor(e,t){this.setCursor(this.cursor.x+e,this.cursor.y+t)}setCursor(e,t){this.cursor={x:Ea(Math.round(e),0,this.size-1),y:Ea(Math.round(t),0,this.size-1)}}setTool(e){this.tool=e}selectColor(e){let t=this.palette.length;this.activeColorIndex=(Math.round(e)%t+t)%t}selectNextColor(e){this.selectColor(this.activeColorIndex+e)}toggleMirrorX(){this.mirrorX=!this.mirrorX}toggleMirrorY(){this.mirrorY=!this.mirrorY}applyAtCursor(e=this.tool){return this.applyAt(this.cursor.x,this.cursor.y,e)}applyAt(e,t,r=this.tool){if(e<0||e>=this.size||t<0||t>=this.size)return!1;let n=hn(this.currentGrid);if(!(r==="fill"?this.fill(e,t):this.paintMirrored(e,t,r==="draw"?this.activeColor:null)))return!1;if(this.undoStack.push({grid:n,id:this.currentId}),this.undoStack.length>Ih)this.undoStack.shift();return this.redoStack=[],this.currentId=this.nextId++,!0}undo(){let e=this.undoStack.pop();if(!e)return!1;return this.redoStack.push({grid:hn(this.currentGrid),id:this.currentId}),this.currentGrid=e.grid,this.currentId=e.id,!0}redo(){let e=this.redoStack.pop();if(!e)return!1;return this.undoStack.push({grid:hn(this.currentGrid),id:this.currentId}),this.currentGrid=e.grid,this.currentId=e.id,!0}markSaved(e=this.revision){if(e.id!==this.currentId||e.filename!==this.currentFilename)return!1;return this.savedId=e.id,this.savedFilename=e.filename,!0}toDocument(){return{filename:this.currentFilename,grid:hn(this.currentGrid),palette:[...this.palette],activeColor:this.activeColor,paletteColorAdjustment:{...this.paletteColorAdjustment},...this.draft?{draft:{data:this.draft.data,activeArtboard:this.draft.activeArtboard}}:{}}}paintMirrored(e,t,r){let n=!1;for(let s of kh(this.size,{x:e,y:t},this.mirrorX,this.mirrorY)){let i=this.currentGrid[s.y][s.x],o=r!==null;if(i.active===o&&i.color===r&&i.tileIndex==null)continue;this.currentGrid[s.y][s.x]=o?{...i,active:o,color:r,tileIndex:null}:{active:o,color:r},n=!0}return n}fill(e,t){let r=this.currentGrid[t][e];if(r.active&&r.color===this.activeColor&&r.tileIndex==null)return!1;let{active:n,color:s}=r,i=r.tileIndex??null,o=[{x:e,y:t}],a=new Set,l=!1;while(o.length>0){let c=o.pop();if(c.x<0||c.x>=this.size||c.y<0||c.y>=this.size)continue;let u=c.y*this.size+c.x;if(a.has(u))continue;a.add(u);let d=this.currentGrid[c.y][c.x];if(d.active!==n||n&&(d.color!==s||(d.tileIndex??null)!==i))continue;this.currentGrid[c.y][c.x]={...d,active:!0,color:this.activeColor,tileIndex:null},l=!0,o.push({x:c.x+1,y:c.y},{x:c.x-1,y:c.y},{x:c.x,y:c.y+1},{x:c.x,y:c.y-1})}return l}}import{createConnection as Rh}from"net";var Th="127.0.0.1",Bh=47642,Oh=3000,Nh=32,Ph=1048576,Dh=16384,xa=[0.57,0.57,0.6,1];function Lh(e){if(!e)return[...xa];let t=Pt(e);return t?[t.r/255,t.g/255,t.b/255,t.a]:[...xa]}function Mh(e){if(!e?.active)return{active:!1,color:null,depth:1,mirrorZ:!1};return{active:!0,color:Lh(e.color),depth:ct(e.depth),mirrorZ:!!e.mirrorZ}}function Ra(e,t,r){return{x:t%r,y:Math.floor(t/r),...e}}function Fh(e,t){let r=e.color===t.color||!!e.color&&!!t.color&&e.color.every((n,s)=>n===t.color?.[s]);return e.active===t.active&&r&&e.depth===t.depth&&e.mirrorZ===t.mirrorZ}function Ta(e){let{saturation:t,lightness:r}=e.paletteColorAdjustment??{saturation:0,lightness:0},n=Xt(e.grid,t,r),s=n.length,i=n[0]?.length??0;return Array.from({length:i*s},(o,a)=>Mh(n[Math.floor(a/i)]?.[a%i]))}function Gh(e){let t=e.grid.length,r=e.grid[0]?.length??0,n=Ta(e);return{message:{protocol:Xn,type:"snapshot",columns:r,rows:t,cells:n.flatMap((s,i)=>s.active?[Ra(s,i,r)]:[])},state:n}}function Uh(e,t,r){return t.flatMap((n,s)=>e[s]&&Fh(e[s],n)?[]:[Ra(n,s,r)])}function ka(e){return(typeof e==="object"&&e!==null&&"code"in e&&typeof e.code==="string"?e.code:"")==="ECONNREFUSED"?"Blender add-on not found. Enable Flatblox Live in Blender.":"Could not connect to the Blender add-on."}class Cs{document;connector;socket=null;status={state:"disconnected"};listeners=new Set;connectPromise=null;resolveConnect=null;connectTimer=null;patchTimer=null;handshakeBuffer="";previousGrid=null;previousColumns=0;previousRows=0;pendingCells=new Map;constructor(e,t=Rh){this.document=e,this.connector=t}getStatus(){return{...this.status}}onStatus(e){return this.listeners.add(e),()=>this.listeners.delete(e)}connect(){if(this.status.state==="connected")return Promise.resolve(this.getStatus());if(this.connectPromise)return this.connectPromise;this.disconnectSocket(),this.resetStream(),this.handshakeBuffer="",this.setStatus({state:"connecting"}),this.connectPromise=new Promise((t)=>{this.resolveConnect=t});let e;try{e=this.connector({host:Th,port:Bh})}catch(t){let r={state:"error",message:ka(t)};return this.setStatus(r),this.finishConnect(r),Promise.resolve(r)}return this.socket=e,e.setNoDelay(!0),e.on("data",(t)=>this.handleHandshake(e,t)),e.on("error",(t)=>this.fail(e,ka(t))),e.on("close",()=>this.handleClose(e)),this.connectTimer=setTimeout(()=>{this.fail(e,"Timed out waiting for the Blender add-on.")},Oh),this.connectPromise}disconnect(){this.disconnectSocket(),this.resetStream();let e={state:"disconnected"};return this.setStatus(e),this.finishConnect(e),e}sync(){if(this.status.state!=="connected"||!this.socket)return;let e=this.document(),t=e.grid.length,r=e.grid[0]?.length??0;if(!this.previousGrid||r!==this.previousColumns||t!==this.previousRows){this.sendSnapshot(e);return}let n=Ta(e);for(let s of Uh(this.previousGrid,n,r))this.pendingCells.set(s.y*r+s.x,s);if(this.previousGrid=n,this.pendingCells.size>0&&!this.patchTimer)this.patchTimer=setTimeout(()=>this.flushPatch(),Nh)}dispose(){this.disconnect(),this.listeners.clear()}handleHandshake(e,t){if(this.socket!==e||this.status.state!=="connecting")return;if(this.handshakeBuffer+=t.toString("utf8"),Buffer.byteLength(this.handshakeBuffer)>Dh){this.fail(e,"Blender sent an invalid handshake.");return}let r=this.handshakeBuffer.indexOf(`
10
10
  `);if(r<0)return;let n;try{n=JSON.parse(this.handshakeBuffer.slice(0,r))}catch{this.fail(e,"Blender sent an invalid handshake.");return}if(typeof n!=="object"||n===null||!("type"in n)||n.type!=="hello"||!("protocol"in n)||n.protocol!==Xn){this.fail(e,"The Blender add-on uses an incompatible protocol.");return}this.clearConnectTimer(),this.handshakeBuffer="";let s={state:"connected",message:"Live in Blender"};this.setStatus(s),this.finishConnect(s),this.sendSnapshot(this.document())}handleClose(e){if(this.socket!==e)return;this.socket=null,this.clearConnectTimer(),this.resetStream();let t=this.status.state==="connecting"?{state:"error",message:"Blender closed the connection during setup."}:{state:"disconnected",message:"Blender disconnected."};this.setStatus(t),this.finishConnect(t)}sendSnapshot(e){if(this.patchTimer)clearTimeout(this.patchTimer);this.patchTimer=null,this.pendingCells.clear();let{message:t,state:r}=Gh(e);if(this.previousGrid=r,this.previousColumns=t.columns,this.previousRows=t.rows,!this.send(t))this.previousGrid=null}flushPatch(){if(this.patchTimer=null,this.status.state!=="connected"||this.pendingCells.size===0){this.pendingCells.clear();return}let e={protocol:Xn,type:"patch",columns:this.previousColumns,rows:this.previousRows,cells:[...this.pendingCells.values()]};if(this.pendingCells.clear(),!this.send(e))this.previousGrid=null}send(e){if(!this.socket?.writable||this.status.state!=="connected")return!1;let t=Buffer.from(`${JSON.stringify(e)}
11
- `);if(t.length>Ph)return!1;try{return this.socket.write(t),!0}catch{return!1}}fail(e,t){if(this.socket!==e)return;this.socket=null,this.clearConnectTimer(),this.resetStream(),e.destroy();let r={state:"error",message:t};this.setStatus(r),this.finishConnect(r)}disconnectSocket(){let e=this.socket;this.socket=null,this.clearConnectTimer(),e?.destroy()}resetStream(){if(this.patchTimer)clearTimeout(this.patchTimer);this.patchTimer=null,this.previousGrid=null,this.previousColumns=0,this.previousRows=0,this.pendingCells.clear()}clearConnectTimer(){if(this.connectTimer)clearTimeout(this.connectTimer);this.connectTimer=null}finishConnect(e){this.resolveConnect?.({...e}),this.resolveConnect=null,this.connectPromise=null}setStatus(e){this.status=e;for(let t of this.listeners)t({...e})}}import{MouseButton as Ss,NativeImage as Ba,Renderable as jh,RGBA as Cr,TextAttributes as Oa}from"@opentui/core";var Es=new WeakMap;function vr(e){let t=e.terminalWidth??e.width,r=e.terminalHeight??e.height,n=e.resolution;if(!n||t<=0||r<=0||n.width<=0||n.height<=0)return Es.get(e)??null;let s=n.width/t,i=n.height/r,o=Number.isFinite(s)&&Number.isFinite(i)&&s>0&&i>0?{width:s,height:i}:null;if(o)Es.set(e,o);return o??Es.get(e)??null}function zn(e){let t=vr(e);if(!t)return 2;let r=t.height/t.width;return Number.isFinite(r)&&r>=0.5&&r<=4?r:2}function qn(e){if(!vr(e))return!1;let t=e.capabilities;if(!t||t.image_protocol==="blocks")return!1;if(t.image_protocol==="kitty"||t.image_protocol==="sixel")return!0;if(t.multiplexer==="tmux")return!1;return t.kitty_graphics||t.sixel}var ei=Cr.fromInts(22,8,33),Na=Cr.fromInts(31,11,45),Is=4,Hh={r:30,g:33,b:48,a:1},Kh={r:42,g:46,b:64,a:1},Wh=Cr.fromInts(255,255,255),Yh=Cr.fromInts(8,10,16),Qh=0.25,ti=512,Pa=16384,Jh=25000000;function Zh(e,t){return(e+t)%2===0?Hh:Kh}function $h(e,t){let r=Math.max(0,Math.min(1,e.a));return{r:Math.round(e.r*r+t.r*(1-r)),g:Math.round(e.g*r+t.g*(1-r)),b:Math.round(e.b*r+t.b*(1-r)),a:1}}function xs(e,t,r){let n=Zh(t,r),s=e?.active&&e.color?Pt(e.color):null,i=s?$h(s,n):n;return Cr.fromInts(i.r,i.g,i.b)}function ks(e){let[t,r,n]=e.toInts(),s=(0.2126*t+0.7152*r+0.0722*n)/255,[i,o,a]=s>0.55?Yh.toInts():Wh.toInts(),l=(c,u)=>Math.round(c+(u-c)*Qh);return Cr.fromInts(l(t,i),l(r,o),l(n,a))}function Da(e,t,r){return Math.max(0,Math.min(r-t,e-Math.floor(t/2)))}function Xh(e,t){let r=Math.ceil(e/ti)*ti,n=Math.ceil(t/ti)*ti;if(r>Pa||n>Pa||r*n>Jh)return null;return{width:r,height:n}}function Vh(e,t,r,n,s){let o=Math.max(1,Math.floor(n)),a=Math.max(1,Math.round(o*2/s)),l=Math.min(r,Math.floor(e/o)),c=Math.min(r,Math.floor(t*2/a)),u=l*o,d=c*a;return{columns:l,pixelRows:c,columnZoom:o,subrowZoom:a,renderedColumns:u,renderedSubrows:d,terminalRows:Math.ceil(d/2)}}function zh(e,t,r,n,s,i){let o=Math.max(1,Math.floor(n)),a=Math.max(1,Math.round(o*s)),l=Math.min(r,Math.floor(e/o)),c=Math.min(r,Math.floor(t*i/a)),u=l*a,d=c*a,A=d*2/i;return{columns:l,pixelRows:c,columnZoom:o,subrowZoom:a*2/i,renderedColumns:l*o,renderedSubrows:A,terminalRows:Math.ceil(d/i),pixelWidth:u,pixelHeight:d}}class Rs extends jh{artworkImage=null;artworkImageKey="";worldImage=null;worldImageSide=0;worldImageWidth=0;worldImageHeight=0;currentModel={grid:[],cursor:{x:0,y:0},zoom:1};cellHandler;viewport={originX:0,originY:0,startX:0,startY:0,columns:0,pixelRows:0,columnZoom:1,subrowZoom:1,renderedSubrows:0};constructor(e,t){super(e,{...t,buffered:!0});if(t.model)this.currentModel=t.model;this.cellHandler=t.onCell,this.onMouseDown=(r)=>this.handleMouse(r)}set model(e){if(!e)return;this.currentModel=e,this.requestRender()}set onCell(e){this.cellHandler=e}renderSelf(e){e.clear(ei);let t=this.currentModel.grid.length;if(t===0||this.width<=0||this.height<=0){this.viewport.columns=0,this.viewport.pixelRows=0;return}let r=zn(this._ctx),n=vr(this._ctx),s=n&&qn(this._ctx)?zh(this.width,this.height,t,this.currentModel.zoom,n.width,n.height):null,i=s??Vh(this.width,this.height,t,this.currentModel.zoom,r),{columns:o,pixelRows:a}=i;if(o===0||a===0){this.viewport.columns=0,this.viewport.pixelRows=0,this.viewport.columnZoom=i.columnZoom,this.viewport.subrowZoom=i.subrowZoom,this.viewport.renderedSubrows=0;return}let{renderedColumns:l,renderedSubrows:c,terminalRows:u}=i,d=Da(this.currentModel.cursor.x,o,t),A=Da(this.currentModel.cursor.y,a,t),g=Math.floor((this.width-l)/2),f=Math.floor((this.height-u)/2);if(s&&n){if(!this.drawWorldGridImage(e,g,f,n.width,n.height))this.drawWorldGrid(e,g,f,r)}else this.releaseWorldImage(),this.drawWorldGrid(e,g,f,r);if(this.viewport={originX:g,originY:f,startX:d,startY:A,columns:o,pixelRows:a,columnZoom:i.columnZoom,subrowZoom:i.subrowZoom,renderedSubrows:c},s){this.drawArtworkImage(e,s,g,f,d,A);return}this.releaseArtworkImage();for(let y=0;y<u;y++){let b=y*2,C=b+1,_=A+Math.floor(b/i.subrowZoom),x=A+Math.floor(C/i.subrowZoom);for(let v=0;v<l;v++){let w=d+Math.floor(v/i.columnZoom),m=xs(this.currentModel.grid[_]?.[w],w,_),N=C<c&&x<t?xs(this.currentModel.grid[x]?.[w],w,x):ei,O=this.currentModel.cursor,U=O.x===w&&O.y===_,k=O.x===w&&O.y===x;e.setCell(g+v,f+y,"\u2580",U?ks(m):m,k?ks(N):N)}}}drawArtworkImage(e,t,r,n,s,i){let o=this.currentModel.cursor,a=[];for(let c=i;c<i+t.pixelRows;c++)for(let u=s;u<s+t.columns;u++){let d=this.currentModel.grid[c]?.[u];a.push(d?.active?d.color??"active":"")}let l=[t.columns,t.pixelRows,t.pixelWidth,t.pixelHeight,s,i,o.x,o.y,...a].join("|");if(!this.artworkImage||l!==this.artworkImageKey){let c=new Uint8Array(t.columns*t.pixelRows*4);for(let A=0;A<t.pixelRows;A++){let g=i+A;for(let f=0;f<t.columns;f++){let y=s+f,b=xs(this.currentModel.grid[g]?.[y],y,g);if(o.x===y&&o.y===g)b=ks(b);let[C,_,x]=b.toInts(),v=(A*t.columns+f)*4;c[v]=C,c[v+1]=_,c[v+2]=x,c[v+3]=255}}let u=Ba.fromRgba(c,t.columns,t.pixelRows),d=u.resize({width:t.pixelWidth,height:t.pixelHeight,kernel:"nearest"});u.dispose(),this.releaseArtworkImage(),this.artworkImage=d,this.artworkImageKey=l}if(!this.artworkImage)return;e.drawImage(this.artworkImage,r,n,t.renderedColumns,t.terminalRows,t.pixelWidth,t.pixelHeight,0,0,t.pixelWidth,t.pixelHeight,"auto")}releaseArtworkImage(){this.artworkImage?.dispose(),this.artworkImage=null,this.artworkImageKey=""}drawWorldGridImage(e,t,r,n,s){let i=Math.max(1,Math.round(this.width*n)),o=Math.max(1,Math.round(this.height*s)),a=Math.max(1,Math.round(Is*n)),l=Math.round(t*n),c=Math.round(r*s),u=i+a,d=o+a,A=Xh(u,d);if(!A)return this.releaseWorldImage(),!1;if(!this.worldImage||a!==this.worldImageSide||u>this.worldImageWidth||d>this.worldImageHeight){let{width:y,height:b}=A,C=new Uint8Array(y*b*4),[_,x,v]=ei.toInts(),[w,m,N]=Na.toInts();for(let O=0;O<b;O++){let U=O%a===0;for(let k=0;k<y;k++){let T=k%a===0,ee=(O*y+k)*4;C[ee]=U||T?w:_,C[ee+1]=U||T?m:x,C[ee+2]=U||T?N:v,C[ee+3]=255}}this.releaseWorldImage(),this.worldImage=Ba.fromRgba(C,y,b),this.worldImageSide=a,this.worldImageWidth=y,this.worldImageHeight=b}if(!this.worldImage)return!1;let g=(-l%a+a)%a,f=(-c%a+a)%a;return e.drawImage(this.worldImage,0,0,this.width,this.height,i,o,g,f,i,o,"auto"),!0}releaseWorldImage(){this.worldImage?.dispose(),this.worldImage=null,this.worldImageSide=0,this.worldImageWidth=0,this.worldImageHeight=0}drawWorldGrid(e,t,r,n){let s=Math.max(1,Math.round(Is/n));for(let i=0;i<this.height;i++){let o=i+1-r,a=Math.floor(o/s)!==Math.floor((o-1)/s);for(let l=0;l<this.width;l++){let c=l>0&&(l-t)%Is===0;if(!a&&!c)continue;e.setCell(l,i,c?"\u258F":" ",Na,ei,a?Oa.UNDERLINE:Oa.NONE)}}}destroySelf(){this.releaseArtworkImage(),this.releaseWorldImage(),super.destroySelf()}handleMouse(e){if(e.button!==Ss.LEFT&&e.button!==Ss.RIGHT)return;let t=e.x-this.screenX-this.viewport.originX,r=e.y-this.screenY-this.viewport.originY;if(t<0||t>=this.viewport.columns*this.viewport.columnZoom||r<0||r>=Math.ceil(this.viewport.renderedSubrows/2))return;let n=this.viewport.startX+Math.floor(t/this.viewport.columnZoom),s=e.modifiers.shift?1:0,i=r*2+s;if(i>=this.viewport.renderedSubrows)return;let o=this.viewport.startY+Math.floor(i/this.viewport.subrowZoom);if(o>=this.currentModel.grid.length)return;this.cellHandler?.({x:n,y:o,...e.button===Ss.RIGHT?{tool:"erase"}:{}})}}import{NativeImage as La,parseColor as qh}from"@opentui/core";var eA=new URL("./flatblox-logo.png",import.meta.url);function Ma(e){let t=e.capabilities;if(!t||t.image_protocol==="blocks")return!1;if(t.image_protocol==="kitty"||t.image_protocol==="sixel")return!0;if(t.multiplexer==="tmux")return!1;return t.kitty_graphics||t.sixel}async function tA(e){let t=await La.load(eA),[r,n,s]=qh(e).toInts(),i=new Uint8Array(t.width*t.height*4);for(let a=0;a<i.length;a+=4)i[a]=r,i[a+1]=n,i[a+2]=s,i[a+3]=255;let o=La.fromRgba(i,t.width,t.height);try{return o.composite(t)}finally{o.dispose(),t.dispose()}}function rA(e){let[t,r]=Q(),n=!1;return Kt(()=>{tA(e.backgroundColor).then((s)=>{if(n)s.dispose();else r(s)})}),st(()=>{n=!0,t()?.dispose()}),(()=>{var s=I("image");return h(s,"fit","fit"),_e((i)=>{var o=e.id,a=t(),l=e.width,c=e.height;return o!==i.e&&(i.e=h(s,"id",o,i.e)),a!==i.t&&(i.t=h(s,"source",a,i.t)),l!==i.a&&(i.a=h(s,"width",l,i.a)),c!==i.o&&(i.o=h(s,"height",c,i.o)),i},{e:void 0,t:void 0,a:void 0,o:void 0}),s})()}function Er(e){let t=pt(),[r,n]=Q(Ma(t)),s=()=>n(Ma(t));return Kt(()=>{t.on("capabilities",s),s()}),st(()=>t.off("capabilities",s)),V(it,{get when(){return r()},get fallback(){return(()=>{var i=I("box");return h(i,"alignItems","center"),h(i,"justifyContent","center"),H(i,V(it,{get when(){return e.height>=2},get fallback(){return(()=>{var o=I("text"),a=I("b");return S(o,a),S(a,ge("FLATBLOX")),_e((l)=>h(o,"fg",e.foregroundColor,l)),o})()},get children(){var o=I("ascii_font");return h(o,"text","FLATBLOX"),h(o,"font","tiny"),_e((a)=>{var l=`${e.id}-ascii`,c=e.foregroundColor,u=e.backgroundColor;return l!==a.e&&(a.e=h(o,"id",l,a.e)),c!==a.t&&(a.t=h(o,"color",c,a.t)),u!==a.a&&(a.a=h(o,"backgroundColor",u,a.a)),a},{e:void 0,t:void 0,a:void 0}),o}})),_e((o)=>{var{id:a,width:l,height:c,backgroundColor:u}=e;return a!==o.e&&(o.e=h(i,"id",a,o.e)),l!==o.t&&(o.t=h(i,"width",l,o.t)),c!==o.a&&(o.a=h(i,"height",c,o.a)),u!==o.o&&(o.o=h(i,"backgroundColor",u,o.o)),o},{e:void 0,t:void 0,a:void 0,o:void 0}),i})()},get children(){return V(rA,e)}})}Vr({pixel_grid:Rs});var E={background:tt("hsl(275 60% 9%)"),panel:tt("hsl(275 60% 11%)"),panelActive:tt("hsl(275 60% 14%)"),card:tt("hsl(275 60% 16%)"),border:tt("hsl(275 60% 28%)"),text:tt("hsl(278 100% 80%)"),muted:tt("hsl(278 41% 65%)"),accent:tt("hsl(315 68% 71%)"),accentText:tt("hsl(278 70% 80%)"),warning:tt("hsl(37 100% 71%)"),textPink:tt("hsl(308, 50%, 75%)"),orangeActive:tt("hsl(28, 80%, 38%)")};function tt(e){let t=tn(e);return t?$t(t):"#ffffff"}function Sr(e){return e[0].toUpperCase()+e.slice(1)}function nA(e){return(()=>{var t=I("box");return h(t,"flexDirection","column"),h(t,"gap",0),H(t,V(Et,{get each(){return e.colors.slice(0,10)},children:(r,n)=>{let s=()=>(e.refresh(),e.session.selectedColorIndex===n()),i=n()===9?"0":String(n()+1);return(()=>{var o=I("box"),a=I("text"),l=I("text"),c=ge(" ");return S(o,a),S(o,l),h(o,"height",1),h(o,"flexDirection","row"),h(o,"paddingX",1),S(a,ge("\u2588\u2588")),S(l,c),H(l,()=>s()?" \u203A ":" ",c),H(l,i,c),H(l,()=>tt(r),null),_e((u)=>{var d=s()?E.panelActive:E.panel,A=tt(r),g=s()?E.text:E.muted;return d!==u.e&&(u.e=h(o,"backgroundColor",d,u.e)),A!==u.t&&(u.t=h(a,"fg",A,u.t)),g!==u.a&&(u.a=h(l,"fg",g,u.a)),u},{e:void 0,t:void 0,a:void 0}),o})()}})),t})()}function iA(e){let t=()=>(e.refresh(),{tool:Sr(e.session.tool),color:tt(e.colors[e.session.selectedColorIndex]??e.session.activeColor),mirrorX:e.session.mirrorX?"on":"off",mirrorY:e.session.mirrorY?"on":"off",cursor:`${e.session.cursor.x+1}, ${e.session.cursor.y+1}`});return(()=>{var r=I("box"),n=I("box"),s=I("box"),i=I("text"),o=ge("Tool: "),a=I("text"),l=ge("Cursor: "),c=I("box"),u=I("box"),d=I("box"),A=I("text"),g=ge("Mirror X: "),f=I("text"),y=ge("Mirror Y: ");return S(r,n),h(r,"id","sidebar"),h(r,"alignSelf","flex-start"),h(r,"border",!0),h(r,"flexDirection","column"),S(n,s),S(n,c),S(n,u),S(n,d),h(n,"width","100%"),h(n,"flexDirection","column"),h(n,"paddingX",1),S(s,i),S(s,a),h(s,"flexDirection","column"),S(i,o),H(i,()=>t().tool,null),S(a,l),H(a,()=>t().cursor,null),h(c,"height",1),H(n,V(nA,{get session(){return e.session},get colors(){return e.colors},get refresh(){return e.refresh}}),u),h(u,"height",1),S(d,A),S(d,f),h(d,"flexDirection","column"),S(A,g),H(A,()=>t().mirrorX,null),S(f,y),H(f,()=>t().mirrorY,null),_e((b)=>{var C=e.visible?28:0,_=e.visible,x=E.border,v=E.panel,w=E.panel,m=E.textPink,N=E.textPink,O=E.muted,U=E.muted;return C!==b.e&&(b.e=h(r,"width",C,b.e)),_!==b.t&&(b.t=h(r,"visible",_,b.t)),x!==b.a&&(b.a=h(r,"borderColor",x,b.a)),v!==b.o&&(b.o=h(r,"backgroundColor",v,b.o)),w!==b.i&&(b.i=h(n,"backgroundColor",w,b.i)),m!==b.n&&(b.n=h(i,"fg",m,b.n)),N!==b.s&&(b.s=h(a,"fg",N,b.s)),O!==b.h&&(b.h=h(A,"fg",O,b.h)),U!==b.r&&(b.r=h(f,"fg",U,b.r)),b},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0}),r})()}function sA(e){let t=()=>{e.refresh();let r=`${e.session.mirrorX?"X":"-"}${e.session.mirrorY?"Y":"-"}`;return{tool:Sr(e.session.tool),color:tt(e.colors[e.session.selectedColorIndex]??e.session.activeColor),mirror:r}};return(()=>{var r=I("box"),n=I("text"),s=ge("Tool "),i=ge(" Color "),o=I("text"),a=I("text"),l=ge(" "),c=ge(" Mirror ");return S(r,n),S(r,o),S(r,a),h(r,"border",!0),h(r,"borderStyle","rounded"),h(r,"paddingX",1),h(r,"flexDirection","row"),S(n,s),S(n,i),H(n,()=>t().tool,i),S(o,ge("\u2588\u2588")),S(a,l),S(a,c),H(a,()=>t().color,c),H(a,()=>t().mirror,null),_e((u)=>{var d=e.visible?3:0,A=e.visible,g=E.border,f=E.panel,y=E.textPink,b=t().color,C=E.textPink;return d!==u.e&&(u.e=h(r,"height",d,u.e)),A!==u.t&&(u.t=h(r,"visible",A,u.t)),g!==u.a&&(u.a=h(r,"borderColor",g,u.a)),f!==u.o&&(u.o=h(r,"backgroundColor",f,u.o)),y!==u.i&&(u.i=h(n,"fg",y,u.i)),b!==u.n&&(u.n=h(o,"fg",b,u.n)),C!==u.s&&(u.s=h(a,"fg",C,u.s)),u},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),r})()}function oA(e){let t=z(()=>Math.max(1,Math.min(64,e.width-2))),r=z(()=>Math.max(1,Math.min(21,e.height-2)));return(()=>{var n=I("box"),s=I("text");return S(n,s),h(n,"id","help-overlay"),h(n,"position","absolute"),h(n,"zIndex",20),h(n,"border",!0),h(n,"title"," Keyboard & mouse "),h(n,"padding",1),H(s,()=>`Move Arrow keys or H J K L
11
+ `);if(t.length>Ph)return!1;try{return this.socket.write(t),!0}catch{return!1}}fail(e,t){if(this.socket!==e)return;this.socket=null,this.clearConnectTimer(),this.resetStream(),e.destroy();let r={state:"error",message:t};this.setStatus(r),this.finishConnect(r)}disconnectSocket(){let e=this.socket;this.socket=null,this.clearConnectTimer(),e?.destroy()}resetStream(){if(this.patchTimer)clearTimeout(this.patchTimer);this.patchTimer=null,this.previousGrid=null,this.previousColumns=0,this.previousRows=0,this.pendingCells.clear()}clearConnectTimer(){if(this.connectTimer)clearTimeout(this.connectTimer);this.connectTimer=null}finishConnect(e){this.resolveConnect?.({...e}),this.resolveConnect=null,this.connectPromise=null}setStatus(e){this.status=e;for(let t of this.listeners)t({...e})}}import{MouseButton as Ss,NativeImage as Ba,Renderable as jh,RGBA as Cr,TextAttributes as Oa}from"@opentui/core";var Es=new WeakMap;function vr(e){let t=e.terminalWidth??e.width,r=e.terminalHeight??e.height,n=e.resolution;if(!n||t<=0||r<=0||n.width<=0||n.height<=0)return Es.get(e)??null;let s=n.width/t,i=n.height/r,o=Number.isFinite(s)&&Number.isFinite(i)&&s>0&&i>0?{width:s,height:i}:null;if(o)Es.set(e,o);return o??Es.get(e)??null}function zn(e){let t=vr(e);if(!t)return 2;let r=t.height/t.width;return Number.isFinite(r)&&r>=0.5&&r<=4?r:2}function qn(e){if(!vr(e))return!1;let t=e.capabilities;if(!t||t.image_protocol==="blocks")return!1;if(t.image_protocol==="kitty"||t.image_protocol==="sixel")return!0;if(t.multiplexer==="tmux")return!1;return t.kitty_graphics||t.sixel}var ei=Cr.fromInts(22,8,33),Na=Cr.fromInts(42,15,61),Is=4,Hh={r:30,g:33,b:48,a:1},Kh={r:42,g:46,b:64,a:1},Wh=Cr.fromInts(255,255,255),Yh=Cr.fromInts(8,10,16),Qh=0.25,ti=512,Pa=16384,Jh=25000000;function Zh(e,t){return(e+t)%2===0?Hh:Kh}function $h(e,t){let r=Math.max(0,Math.min(1,e.a));return{r:Math.round(e.r*r+t.r*(1-r)),g:Math.round(e.g*r+t.g*(1-r)),b:Math.round(e.b*r+t.b*(1-r)),a:1}}function xs(e,t,r){let n=Zh(t,r),s=e?.active&&e.color?Pt(e.color):null,i=s?$h(s,n):n;return Cr.fromInts(i.r,i.g,i.b)}function ks(e){let[t,r,n]=e.toInts(),s=(0.2126*t+0.7152*r+0.0722*n)/255,[i,o,a]=s>0.55?Yh.toInts():Wh.toInts(),l=(c,u)=>Math.round(c+(u-c)*Qh);return Cr.fromInts(l(t,i),l(r,o),l(n,a))}function Da(e,t,r){return Math.max(0,Math.min(r-t,e-Math.floor(t/2)))}function Xh(e,t){let r=Math.ceil(e/ti)*ti,n=Math.ceil(t/ti)*ti;if(r>Pa||n>Pa||r*n>Jh)return null;return{width:r,height:n}}function Vh(e,t,r,n,s){let o=Math.max(1,Math.floor(n)),a=Math.max(1,Math.round(o*2/s)),l=Math.min(r,Math.floor(e/o)),c=Math.min(r,Math.floor(t*2/a)),u=l*o,d=c*a;return{columns:l,pixelRows:c,columnZoom:o,subrowZoom:a,renderedColumns:u,renderedSubrows:d,terminalRows:Math.ceil(d/2)}}function zh(e,t,r,n,s,i){let o=Math.max(1,Math.floor(n)),a=Math.max(1,Math.round(o*s)),l=Math.min(r,Math.floor(e/o)),c=Math.min(r,Math.floor(t*i/a)),u=l*a,d=c*a,A=d*2/i;return{columns:l,pixelRows:c,columnZoom:o,subrowZoom:a*2/i,renderedColumns:l*o,renderedSubrows:A,terminalRows:Math.ceil(d/i),pixelWidth:u,pixelHeight:d}}class Rs extends jh{artworkImage=null;artworkImageKey="";worldImage=null;worldImageSide=0;worldImageWidth=0;worldImageHeight=0;currentModel={grid:[],cursor:{x:0,y:0},zoom:1};cellHandler;viewport={originX:0,originY:0,startX:0,startY:0,columns:0,pixelRows:0,columnZoom:1,subrowZoom:1,renderedSubrows:0};constructor(e,t){super(e,{...t,buffered:!0});if(t.model)this.currentModel=t.model;this.cellHandler=t.onCell,this.onMouseDown=(r)=>this.handleMouse(r)}set model(e){if(!e)return;this.currentModel=e,this.requestRender()}set onCell(e){this.cellHandler=e}renderSelf(e){e.clear(ei);let t=this.currentModel.grid.length;if(t===0||this.width<=0||this.height<=0){this.viewport.columns=0,this.viewport.pixelRows=0;return}let r=zn(this._ctx),n=vr(this._ctx),s=n&&qn(this._ctx)?zh(this.width,this.height,t,this.currentModel.zoom,n.width,n.height):null,i=s??Vh(this.width,this.height,t,this.currentModel.zoom,r),{columns:o,pixelRows:a}=i;if(o===0||a===0){this.viewport.columns=0,this.viewport.pixelRows=0,this.viewport.columnZoom=i.columnZoom,this.viewport.subrowZoom=i.subrowZoom,this.viewport.renderedSubrows=0;return}let{renderedColumns:l,renderedSubrows:c,terminalRows:u}=i,d=Da(this.currentModel.cursor.x,o,t),A=Da(this.currentModel.cursor.y,a,t),g=Math.floor((this.width-l)/2),f=Math.floor((this.height-u)/2);if(s&&n){if(!this.drawWorldGridImage(e,g,f,n.width,n.height))this.drawWorldGrid(e,g,f,r)}else this.releaseWorldImage(),this.drawWorldGrid(e,g,f,r);if(this.viewport={originX:g,originY:f,startX:d,startY:A,columns:o,pixelRows:a,columnZoom:i.columnZoom,subrowZoom:i.subrowZoom,renderedSubrows:c},s){this.drawArtworkImage(e,s,g,f,d,A);return}this.releaseArtworkImage();for(let y=0;y<u;y++){let b=y*2,C=b+1,_=A+Math.floor(b/i.subrowZoom),x=A+Math.floor(C/i.subrowZoom);for(let v=0;v<l;v++){let w=d+Math.floor(v/i.columnZoom),m=xs(this.currentModel.grid[_]?.[w],w,_),N=C<c&&x<t?xs(this.currentModel.grid[x]?.[w],w,x):ei,O=this.currentModel.cursor,U=O.x===w&&O.y===_,k=O.x===w&&O.y===x;e.setCell(g+v,f+y,"\u2580",U?ks(m):m,k?ks(N):N)}}}drawArtworkImage(e,t,r,n,s,i){let o=this.currentModel.cursor,a=[];for(let c=i;c<i+t.pixelRows;c++)for(let u=s;u<s+t.columns;u++){let d=this.currentModel.grid[c]?.[u];a.push(d?.active?d.color??"active":"")}let l=[t.columns,t.pixelRows,t.pixelWidth,t.pixelHeight,s,i,o.x,o.y,...a].join("|");if(!this.artworkImage||l!==this.artworkImageKey){let c=new Uint8Array(t.columns*t.pixelRows*4);for(let A=0;A<t.pixelRows;A++){let g=i+A;for(let f=0;f<t.columns;f++){let y=s+f,b=xs(this.currentModel.grid[g]?.[y],y,g);if(o.x===y&&o.y===g)b=ks(b);let[C,_,x]=b.toInts(),v=(A*t.columns+f)*4;c[v]=C,c[v+1]=_,c[v+2]=x,c[v+3]=255}}let u=Ba.fromRgba(c,t.columns,t.pixelRows),d=u.resize({width:t.pixelWidth,height:t.pixelHeight,kernel:"nearest"});u.dispose(),this.releaseArtworkImage(),this.artworkImage=d,this.artworkImageKey=l}if(!this.artworkImage)return;e.drawImage(this.artworkImage,r,n,t.renderedColumns,t.terminalRows,t.pixelWidth,t.pixelHeight,0,0,t.pixelWidth,t.pixelHeight,"auto")}releaseArtworkImage(){this.artworkImage?.dispose(),this.artworkImage=null,this.artworkImageKey=""}drawWorldGridImage(e,t,r,n,s){let i=Math.max(1,Math.round(this.width*n)),o=Math.max(1,Math.round(this.height*s)),a=Math.max(1,Math.round(Is*n)),l=Math.round(t*n),c=Math.round(r*s),u=i+a,d=o+a,A=Xh(u,d);if(!A)return this.releaseWorldImage(),!1;if(!this.worldImage||a!==this.worldImageSide||u>this.worldImageWidth||d>this.worldImageHeight){let{width:y,height:b}=A,C=new Uint8Array(y*b*4),[_,x,v]=ei.toInts(),[w,m,N]=Na.toInts();for(let O=0;O<b;O++){let U=O%a===0;for(let k=0;k<y;k++){let T=k%a===0,ee=(O*y+k)*4;C[ee]=U||T?w:_,C[ee+1]=U||T?m:x,C[ee+2]=U||T?N:v,C[ee+3]=255}}this.releaseWorldImage(),this.worldImage=Ba.fromRgba(C,y,b),this.worldImageSide=a,this.worldImageWidth=y,this.worldImageHeight=b}if(!this.worldImage)return!1;let g=(-l%a+a)%a,f=(-c%a+a)%a;return e.drawImage(this.worldImage,0,0,this.width,this.height,i,o,g,f,i,o,"auto"),!0}releaseWorldImage(){this.worldImage?.dispose(),this.worldImage=null,this.worldImageSide=0,this.worldImageWidth=0,this.worldImageHeight=0}drawWorldGrid(e,t,r,n){let s=Math.max(1,Math.round(Is/n));for(let i=0;i<this.height;i++){let o=i+1-r,a=Math.floor(o/s)!==Math.floor((o-1)/s);for(let l=0;l<this.width;l++){let c=l>0&&(l-t)%Is===0;if(!a&&!c)continue;e.setCell(l,i,c?"\u258F":" ",Na,ei,a?Oa.UNDERLINE:Oa.NONE)}}}destroySelf(){this.releaseArtworkImage(),this.releaseWorldImage(),super.destroySelf()}handleMouse(e){if(e.button!==Ss.LEFT&&e.button!==Ss.RIGHT)return;let t=e.x-this.screenX-this.viewport.originX,r=e.y-this.screenY-this.viewport.originY;if(t<0||t>=this.viewport.columns*this.viewport.columnZoom||r<0||r>=Math.ceil(this.viewport.renderedSubrows/2))return;let n=this.viewport.startX+Math.floor(t/this.viewport.columnZoom),s=e.modifiers.shift?1:0,i=r*2+s;if(i>=this.viewport.renderedSubrows)return;let o=this.viewport.startY+Math.floor(i/this.viewport.subrowZoom);if(o>=this.currentModel.grid.length)return;this.cellHandler?.({x:n,y:o,...e.button===Ss.RIGHT?{tool:"erase"}:{}})}}import{NativeImage as La,parseColor as qh}from"@opentui/core";var eA=new URL("./flatblox-logo.png",import.meta.url);function Ma(e){let t=e.capabilities;if(!t||t.image_protocol==="blocks")return!1;if(t.image_protocol==="kitty"||t.image_protocol==="sixel")return!0;if(t.multiplexer==="tmux")return!1;return t.kitty_graphics||t.sixel}async function tA(e){let t=await La.load(eA),[r,n,s]=qh(e).toInts(),i=new Uint8Array(t.width*t.height*4);for(let a=0;a<i.length;a+=4)i[a]=r,i[a+1]=n,i[a+2]=s,i[a+3]=255;let o=La.fromRgba(i,t.width,t.height);try{return o.composite(t)}finally{o.dispose(),t.dispose()}}function rA(e){let[t,r]=Q(),n=!1;return Kt(()=>{tA(e.backgroundColor).then((s)=>{if(n)s.dispose();else r(s)})}),st(()=>{n=!0,t()?.dispose()}),(()=>{var s=I("image");return h(s,"fit","fit"),_e((i)=>{var o=e.id,a=t(),l=e.width,c=e.height;return o!==i.e&&(i.e=h(s,"id",o,i.e)),a!==i.t&&(i.t=h(s,"source",a,i.t)),l!==i.a&&(i.a=h(s,"width",l,i.a)),c!==i.o&&(i.o=h(s,"height",c,i.o)),i},{e:void 0,t:void 0,a:void 0,o:void 0}),s})()}function Er(e){let t=pt(),[r,n]=Q(Ma(t)),s=()=>n(Ma(t));return Kt(()=>{t.on("capabilities",s),s()}),st(()=>t.off("capabilities",s)),V(it,{get when(){return r()},get fallback(){return(()=>{var i=I("box");return h(i,"alignItems","center"),h(i,"justifyContent","center"),H(i,V(it,{get when(){return e.height>=2},get fallback(){return(()=>{var o=I("text"),a=I("b");return S(o,a),S(a,ge("FLATBLOX")),_e((l)=>h(o,"fg",e.foregroundColor,l)),o})()},get children(){var o=I("ascii_font");return h(o,"text","FLATBLOX"),h(o,"font","tiny"),_e((a)=>{var l=`${e.id}-ascii`,c=e.foregroundColor,u=e.backgroundColor;return l!==a.e&&(a.e=h(o,"id",l,a.e)),c!==a.t&&(a.t=h(o,"color",c,a.t)),u!==a.a&&(a.a=h(o,"backgroundColor",u,a.a)),a},{e:void 0,t:void 0,a:void 0}),o}})),_e((o)=>{var{id:a,width:l,height:c,backgroundColor:u}=e;return a!==o.e&&(o.e=h(i,"id",a,o.e)),l!==o.t&&(o.t=h(i,"width",l,o.t)),c!==o.a&&(o.a=h(i,"height",c,o.a)),u!==o.o&&(o.o=h(i,"backgroundColor",u,o.o)),o},{e:void 0,t:void 0,a:void 0,o:void 0}),i})()},get children(){return V(rA,e)}})}Vr({pixel_grid:Rs});var E={background:tt("hsl(275 60% 9%)"),panel:tt("hsl(275 60% 11%)"),panelActive:tt("hsl(275 60% 14%)"),card:tt("hsl(275 60% 16%)"),border:tt("hsl(275 60% 28%)"),text:tt("hsl(278 100% 80%)"),muted:tt("hsl(278 41% 65%)"),accent:tt("hsl(315 68% 71%)"),accentText:tt("hsl(278 70% 80%)"),warning:tt("hsl(37 100% 71%)"),textPink:tt("hsl(308, 50%, 75%)"),orangeActive:tt("hsl(28, 80%, 38%)")};function tt(e){let t=tn(e);return t?$t(t):"#ffffff"}function Sr(e){return e[0].toUpperCase()+e.slice(1)}function nA(e){return(()=>{var t=I("box");return h(t,"flexDirection","column"),h(t,"gap",0),H(t,V(Et,{get each(){return e.colors.slice(0,10)},children:(r,n)=>{let s=()=>(e.refresh(),e.session.selectedColorIndex===n()),i=n()===9?"0":String(n()+1);return(()=>{var o=I("box"),a=I("text"),l=I("text"),c=ge(" ");return S(o,a),S(o,l),h(o,"height",1),h(o,"flexDirection","row"),h(o,"paddingX",1),S(a,ge("\u2588\u2588")),S(l,c),H(l,()=>s()?" \u203A ":" ",c),H(l,i,c),H(l,()=>tt(r),null),_e((u)=>{var d=s()?E.panelActive:E.panel,A=tt(r),g=s()?E.text:E.muted;return d!==u.e&&(u.e=h(o,"backgroundColor",d,u.e)),A!==u.t&&(u.t=h(a,"fg",A,u.t)),g!==u.a&&(u.a=h(l,"fg",g,u.a)),u},{e:void 0,t:void 0,a:void 0}),o})()}})),t})()}function iA(e){let t=()=>(e.refresh(),{tool:Sr(e.session.tool),color:tt(e.colors[e.session.selectedColorIndex]??e.session.activeColor),mirrorX:e.session.mirrorX?"on":"off",mirrorY:e.session.mirrorY?"on":"off",cursor:`${e.session.cursor.x+1}, ${e.session.cursor.y+1}`});return(()=>{var r=I("box"),n=I("box"),s=I("box"),i=I("text"),o=ge("Tool: "),a=I("text"),l=ge("Cursor: "),c=I("box"),u=I("box"),d=I("box"),A=I("text"),g=ge("Mirror X: "),f=I("text"),y=ge("Mirror Y: ");return S(r,n),h(r,"id","sidebar"),h(r,"alignSelf","flex-start"),h(r,"border",!0),h(r,"flexDirection","column"),S(n,s),S(n,c),S(n,u),S(n,d),h(n,"width","100%"),h(n,"flexDirection","column"),h(n,"paddingX",1),S(s,i),S(s,a),h(s,"flexDirection","column"),S(i,o),H(i,()=>t().tool,null),S(a,l),H(a,()=>t().cursor,null),h(c,"height",1),H(n,V(nA,{get session(){return e.session},get colors(){return e.colors},get refresh(){return e.refresh}}),u),h(u,"height",1),S(d,A),S(d,f),h(d,"flexDirection","column"),S(A,g),H(A,()=>t().mirrorX,null),S(f,y),H(f,()=>t().mirrorY,null),_e((b)=>{var C=e.visible?28:0,_=e.visible,x=E.border,v=E.panel,w=E.panel,m=E.textPink,N=E.textPink,O=E.muted,U=E.muted;return C!==b.e&&(b.e=h(r,"width",C,b.e)),_!==b.t&&(b.t=h(r,"visible",_,b.t)),x!==b.a&&(b.a=h(r,"borderColor",x,b.a)),v!==b.o&&(b.o=h(r,"backgroundColor",v,b.o)),w!==b.i&&(b.i=h(n,"backgroundColor",w,b.i)),m!==b.n&&(b.n=h(i,"fg",m,b.n)),N!==b.s&&(b.s=h(a,"fg",N,b.s)),O!==b.h&&(b.h=h(A,"fg",O,b.h)),U!==b.r&&(b.r=h(f,"fg",U,b.r)),b},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0,h:void 0,r:void 0}),r})()}function sA(e){let t=()=>{e.refresh();let r=`${e.session.mirrorX?"X":"-"}${e.session.mirrorY?"Y":"-"}`;return{tool:Sr(e.session.tool),color:tt(e.colors[e.session.selectedColorIndex]??e.session.activeColor),mirror:r}};return(()=>{var r=I("box"),n=I("text"),s=ge("Tool "),i=ge(" Color "),o=I("text"),a=I("text"),l=ge(" "),c=ge(" Mirror ");return S(r,n),S(r,o),S(r,a),h(r,"border",!0),h(r,"borderStyle","rounded"),h(r,"paddingX",1),h(r,"flexDirection","row"),S(n,s),S(n,i),H(n,()=>t().tool,i),S(o,ge("\u2588\u2588")),S(a,l),S(a,c),H(a,()=>t().color,c),H(a,()=>t().mirror,null),_e((u)=>{var d=e.visible?3:0,A=e.visible,g=E.border,f=E.panel,y=E.textPink,b=t().color,C=E.textPink;return d!==u.e&&(u.e=h(r,"height",d,u.e)),A!==u.t&&(u.t=h(r,"visible",A,u.t)),g!==u.a&&(u.a=h(r,"borderColor",g,u.a)),f!==u.o&&(u.o=h(r,"backgroundColor",f,u.o)),y!==u.i&&(u.i=h(n,"fg",y,u.i)),b!==u.n&&(u.n=h(o,"fg",b,u.n)),C!==u.s&&(u.s=h(a,"fg",C,u.s)),u},{e:void 0,t:void 0,a:void 0,o:void 0,i:void 0,n:void 0,s:void 0}),r})()}function oA(e){let t=z(()=>Math.max(1,Math.min(64,e.width-2))),r=z(()=>Math.max(1,Math.min(21,e.height-2)));return(()=>{var n=I("box"),s=I("text");return S(n,s),h(n,"id","help-overlay"),h(n,"position","absolute"),h(n,"zIndex",20),h(n,"border",!0),h(n,"title"," Keyboard & mouse "),h(n,"padding",1),H(s,()=>`Move Arrow keys or H J K L
12
12
  Paint Space or Enter
13
13
  Tools D draw | E erase | F fill
14
14
  Palette 1\u20130 direct | [ and ] cycle
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "flatblox-tui",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Flatblox pixel art editor for the terminal",
5
5
  "homepage": "https://flatblox.com",
6
6
  "license": "MIT",