image-to-pixel 3.0.1 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +72 -69
- package/dist/editor.css +1 -1
- package/dist/editor.css.map +2 -2
- package/dist/editor.esm.js +54 -54
- package/dist/editor.esm.js.map +4 -4
- package/dist/image-to-pixel.bundle.esm.js +16 -16
- package/dist/image-to-pixel.bundle.esm.js.map +3 -3
- package/dist/image-to-pixel.cjs +13 -9
- package/dist/image-to-pixel.cjs.map +2 -2
- package/dist/image-to-pixel.esm.js +13 -9
- package/dist/image-to-pixel.esm.js.map +2 -2
- package/dist/image-to-pixel.js +13 -9
- package/dist/image-to-pixel.js.map +2 -2
- package/dist/image-to-pixel.min.js +11 -11
- package/dist/image-to-pixel.min.js.map +3 -3
- package/dist/video.esm.js +2 -2
- package/dist/video.esm.js.map +4 -4
- package/lib/core/video/audio.js +159 -0
- package/lib/core/video/frames.js +52 -7
- package/lib/core/video/mux-mp4.js +320 -131
- package/lib/core/video/mux-webm.js +168 -127
- package/lib/editor/exporter.js +103 -21
- package/lib/editor/icons.js +65 -61
- package/lib/editor/index.js +288 -30
- package/lib/editor/inspector.js +66 -15
- package/lib/editor/library.js +188 -182
- package/lib/editor/storyboard.js +566 -0
- package/lib/editor/styles/editor.css +71 -1
- package/lib/editor/timeline-preview.js +142 -0
- package/lib/editor/workspace.js +62 -0
- package/lib/index.js +31 -31
- package/lib/video.js +122 -92
- package/package.json +92 -92
- package/types/index.d.ts +2 -0
- package/types/video.d.ts +99 -43
package/dist/editor.esm.js
CHANGED
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
/*! image-to-pixel v3.0
|
|
2
|
-
var
|
|
1
|
+
/*! image-to-pixel v3.2.0 | MIT | https://github.com/Tezumie/Image-to-Pixel */
|
|
2
|
+
var sa=Object.defineProperty;var Ut=(e,t)=>()=>(e&&(t=e(e=0)),t);var ca=(e,t)=>{for(var n in t)sa(e,n,{get:t[n],enumerable:!0})};function Ft(e){if(Array.isArray(e))return[e[0]|0,e[1]|0,e[2]|0];let t=String(e).trim().replace(/^#|^0x/i,"");if((t.length===3||t.length===4)&&(t=t.slice(0,3).split("").map(n=>n+n).join("")),!/^[0-9a-f]{6}([0-9a-f]{2})?$/i.test(t))throw new Error(`Invalid colour "${e}"`);return[parseInt(t.slice(0,2),16),parseInt(t.slice(2,4),16),parseInt(t.slice(4,6),16)]}function An(e){try{return Ft(e),!0}catch{return!1}}function qt(e){return"#"+e.slice(0,3).map(t=>Math.max(0,Math.min(255,Math.round(t))).toString(16).padStart(2,"0")).join("")}function so(e,t,n){e=ao(e),t=ao(t),n=ao(n);let o=Math.cbrt(.4122214708*e+.5363325363*t+.0514459929*n),i=Math.cbrt(.2119034982*e+.6806995451*t+.1073969566*n),r=Math.cbrt(.0883024619*e+.2817188376*t+.6299787005*n);return[.2104542553*o+.793617785*i-.0040720468*r,1.9779984951*o-2.428592205*i+.4505937099*r,.0259040371*o+.7827717662*i-.808675766*r]}function Qo(e){if(e.length<2)return 1;let t=0;for(let n=0;n<e.length;n++){let o=1/0;for(let i=0;i<e.length;i++){if(n===i)continue;let r=e[n][0]-e[i][0],a=e[n][1]-e[i][1],c=e[n][2]-e[i][2],l=Math.sqrt(r*r+a*a+c*c);l<o&&(o=l)}t+=o}return Math.max(.04,Math.min(1,t/e.length/255))}var wt,ao,_n,Ot=Ut(()=>{wt=e=>qt(Ft(e)),ao=e=>e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4);_n=[.2126,.7152,.0722]});function jt(e,t=1,n={}){t=Math.max(1,Math.round(t));let o=e.width*t,i=e.height*t,r=new Uint8ClampedArray(o*i*4),a=e.data,c=e.width;for(let l=0;l<i;l++){let s=l/t|0;for(let d=0;d<o;d++){let h=(s*c+(d/t|0))*4,f=(l*o+d)*4;r[f]=a[h],r[f+1]=a[h+1],r[f+2]=a[h+2],r[f+3]=a[h+3]}}if(n.grid&&t>=3){let[l,s,d]=Ft(n.gridColor||"#000000"),h=n.gridAlpha??.35;for(let f=0;f<i;f++)for(let p=0;p<o;p++){if(p%t&&f%t)continue;let b=(f*o+p)*4,M=r[b+3]/255,v=h+M*(1-h);r[b]=(l*h+r[b]*M*(1-h))/v,r[b+1]=(s*h+r[b+1]*M*(1-h))/v,r[b+2]=(d*h+r[b+2]*M*(1-h))/v,r[b+3]=v*255}}return{width:o,height:i,data:r}}function ii(e,t,n){t=Math.max(1,Math.round(t)),n=Math.max(1,Math.round(n));let o=new Uint8ClampedArray(t*n*4),i=new Int32Array(t);for(let r=0;r<t;r++)i[r]=Math.min(e.width-1,Math.floor((r+.5)*e.width/t));for(let r=0;r<n;r++){let a=Math.min(e.height-1,Math.floor((r+.5)*e.height/n));for(let c=0;c<t;c++){let l=(a*e.width+i[c])*4,s=(r*t+c)*4;o[s]=e.data[l],o[s+1]=e.data[l+1],o[s+2]=e.data[l+2],o[s+3]=e.data[l+3]}}return{width:t,height:n,data:o}}function ai(e,t=1/0){let n=new Set,o=e.data;for(let i=0;i<o.length&&!(o[i+3]!==0&&(n.add(o[i]<<16|o[i+1]<<8|o[i+2]),n.size>t));i+=4);return[...n].map(i=>qt([i>>16,i>>8&255,i&255]))}function si(e,t=8){let{width:n,height:o,data:i}=e,r=(d,h)=>Math.abs(i[d]-i[h])<=t&&Math.abs(i[d+1]-i[h+1])<=t&&Math.abs(i[d+2]-i[h+2])<=t&&Math.abs(i[d+3]-i[h+3])<=t,a=(d,h)=>h?a(h,d%h):d,c=0,l=Math.max(1,Math.floor(o/64)),s=Math.max(1,Math.floor(n/64));for(let d=0;d<o;d+=l){let h=1;for(let f=1;f<n;f++)if(r((d*n+f)*4,(d*n+f-1)*4))h++;else if(c=a(c,h),h=1,c===1)return 1}for(let d=0;d<n;d+=s){let h=1;for(let f=1;f<o;f++)if(r((f*n+d)*4,((f-1)*n+d)*4))h++;else if(c=a(c,h),h=1,c===1)return 1}return c||1}var Jt=Ut(()=>{Ot()});function Ws(e){let t=e.split(/\r?\n/);if(!/^GIMP Palette/i.test(t[0]||""))throw new Error('Not a GIMP palette (missing "GIMP Palette" header)');let n="",o=[];for(let i of t.slice(1)){let r=i.trim();if(!r||r.startsWith("#"))continue;let a=/^Name:\s*(.*)$/i.exec(r);if(a){n=a[1].trim();continue}if(/^Columns:/i.test(r))continue;let c=/^(\d{1,3})\s+(\d{1,3})\s+(\d{1,3})/.exec(r);c&&o.push(wt([+c[1],+c[2],+c[3]]))}return{name:n,colors:o}}function ui(e){let t=[];for(let n of e.split(/\r?\n/)){let o=n.trim();if(!o||o.startsWith(";")||o.startsWith("//"))continue;let i=/^#?([0-9a-f]{6}|[0-9a-f]{8}|[0-9a-f]{3})\b/i.exec(o);if(!i)continue;let r=i[1].length===8?i[1].slice(2):i[1];t.push(wt(r))}return{name:"",colors:t}}function qs(e){let t=e.split(/\r?\n/).map(i=>i.trim());if(t[0]!=="JASC-PAL")throw new Error("Not a JASC palette");let n=parseInt(t[2],10)||0,o=[];for(let i=3;i<3+n&&i<t.length;i++){let r=/^(\d+)\s+(\d+)\s+(\d+)/.exec(t[i]);r&&o.push(wt([+r[1],+r[2],+r[3]]))}return{name:"",colors:o}}function So(e){let t=typeof e=="string"?JSON.parse(e):e,o=(Array.isArray(t)?t:t.colors||t.palette||[]).map(i=>typeof i=="object"&&i?i.hex||i.color:i).filter(Boolean).map(wt);return{name:!Array.isArray(t)&&t.name||"",colors:o}}function Ys(e){let t=[],n=/#?\b([0-9a-f]{6})\b/gi,o;for(;o=n.exec(e);)t.push(wt(o[1]));return{name:"",colors:t}}function Co(e,t=""){let n=(/\.([a-z0-9]+)$/i.exec(t)||[])[1]?.toLowerCase()||"",i=String(e).replace(/^/,"").trim(),r;if(n==="gpl"||/^GIMP Palette/i.test(i)?r=Ws(i):n==="pal"||i.startsWith("JASC-PAL")?r=qs(i):n==="json"||i.startsWith("{")||i.startsWith("[")?r=So(i):n==="hex"||n==="txt"?r=ui(i):(r=ui(i),r.colors.length||(r=Ys(i))),r.colors=Xs(r.colors).slice(0,256),!r.name&&t&&(r.name=t.replace(/\.[^.]+$/,"").replace(/[-_]+/g," ")),!r.colors.length)throw new Error("No colours found in that palette");return r}function di(e,t){let n=t.map(o=>{let i=wt(o),r=parseInt(i.slice(1,3),16),a=parseInt(i.slice(3,5),16),c=parseInt(i.slice(5,7),16);return`${String(r).padStart(3)} ${String(a).padStart(3)} ${String(c).padStart(3)} ${i.slice(1)}`});return`GIMP Palette
|
|
3
3
|
Name: ${e||"Palette"}
|
|
4
4
|
Columns: 8
|
|
5
5
|
#
|
|
6
6
|
${n.join(`
|
|
7
7
|
`)}
|
|
8
|
-
`}var
|
|
8
|
+
`}var Xs,fi,pi,To=Ut(()=>{Ot();Xs=e=>[...new Set(e)];fi=e=>e.map(t=>wt(t).slice(1)).join(`
|
|
9
9
|
`)+`
|
|
10
|
-
`,Or=(e,t)=>JSON.stringify({name:e||"Palette",colors:t.map(n=>Ne(n).slice(1))},null,2)});function is(e){let t=String(e||"").trim(),n=/palette-list\/([a-z0-9-]+)/i.exec(t);return(n?n[1]:t).toLowerCase().replace(/\.(json|hex|gpl)$/,"")}async function $r(e,{fetch:t=globalThis.fetch}={}){let n=is(e);if(!/^[a-z0-9-]+$/.test(n))throw new Error("That does not look like a Lospec palette slug");let o=await t(`https://lospec.com/palette-list/${n}.json`);if(!o.ok)throw new Error(`Lospec returned ${o.status} for "${n}"`);let i=await o.json(),r=io(i);return{name:i.name||n,author:i.author||"",colors:r.colors,slug:n}}var zr=St(()=>{so()});function Br(e){let t=e.error?e.error.code:0,n=new Error(ss[t]||"the video could not be loaded");return n.code=t,e.error&&e.error.message&&(n.detail=e.error.message),n}async function en(e,{timeout:t=6e4}={}){if(e.error)throw Br(e);return e.readyState<1&&await Nr(e,"loadedmetadata",t),e.readyState<2&&await Nr(e,"loadeddata",t).catch(n=>{if(n.code)throw n}),e}async function Gr(e){let t=new Uint8Array(await e.arrayBuffer()),n={avc1:"H.264",avc3:"H.264",hvc1:"H.265 (HEVC)",hev1:"H.265 (HEVC)",av01:"AV1",vp09:"VP9",vp08:"VP8",mp4v:"MPEG-4 Part 2",apcn:"ProRes",apch:"ProRes",apcs:"ProRes",apco:"ProRes",ap4h:"ProRes 4444",dvh1:"Dolby Vision",dvhe:"Dolby Vision"};for(let r=0;r+24<t.length;r++)if(t[r]===115&&t[r+1]===116&&t[r+2]===115&&t[r+3]===100){let a=String.fromCharCode(t[r+16],t[r+17],t[r+18],t[r+19]);if(n[a])return n[a]}let o=new TextDecoder("latin1").decode(t.subarray(0,Math.min(t.length,1<<20))),i=/V_(VP8|VP9|AV1|MPEG4\/ISO\/AVC|MPEGH\/ISO\/HEVC)/.exec(o);return i?{VP8:"VP8",VP9:"VP9",AV1:"AV1","MPEG4/ISO/AVC":"H.264","MPEGH/ISO/HEVC":"H.265 (HEVC)"}[i[1]]:""}async function Gt(e,t){if(t=Math.max(0,Math.min(t,(e.duration||0)-1e-4)),Math.abs(e.currentTime-t)<1e-6&&e.readyState>=2)return;let n="requestVideoFrameCallback"in e?new Promise(i=>{e.requestVideoFrameCallback(()=>i()),setTimeout(i,500)}):null,o=as(e,"seeked");e.currentTime=t,await o,n&&await n}async function Pn(e,t=30){if(!("requestVideoFrameCallback"in e))return t;await en(e);let n={t:e.currentTime,muted:e.muted,paused:e.paused},o=[];try{e.muted=!0,await new Promise(a=>{let c=setTimeout(a,1200),l=(s,d)=>{o.push(d.mediaTime),o.length>=12?(clearTimeout(c),a()):e.requestVideoFrameCallback(l)};e.requestVideoFrameCallback(l),e.play().catch(()=>{clearTimeout(c),a()})})}finally{e.pause(),e.muted=n.muted,await Gt(e,n.t).catch(()=>{})}let i=[];for(let a=1;a<o.length;a++){let c=o[a]-o[a-1];c>.001&&i.push(c)}if(i.length<3)return t;i.sort((a,c)=>a-c);let r=1/i[Math.floor(i.length/2)];for(let a of[12,15,23.976,24,25,29.97,30,48,50,59.94,60])if(Math.abs(r-a)<.6)return a;return Math.round(r)}function co({duration:e,fps:t,start:n=0,end:o=e,maxFrames:i=1/0}){let r=[],a=Math.min(i,Math.max(1,Math.floor((o-n)*t+1e-6)));for(let c=0;c<a;c++)r.push(n+(c+.5)/t);return r}async function Ln(e,t){await en(e);let n=e.paused;e.pause();let o=co({duration:e.duration,...t});for(let i=0;i<o.length;i++){if(t.signal&&t.signal.aborted)throw new DOMException("Aborted","AbortError");await Gt(e,o[i]),await t.onFrame({index:i,time:o[i],total:o.length})}return n||e.play().catch(()=>{}),o.length}var as,ss,Nr,Rn=St(()=>{as=(e,t,n=4e3)=>new Promise((o,i)=>{let r=setTimeout(()=>{e.removeEventListener(t,a),i(new Error(`Timed out waiting for "${t}"`))},n),a=()=>{clearTimeout(r),o()};e.addEventListener(t,a,{once:!0})}),ss={1:"loading was aborted",2:"a network error stopped the download",3:"the browser could not decode it",4:"this browser can't play this video's format"};Nr=(e,t,n)=>new Promise((o,i)=>{let r=()=>{clearTimeout(l),e.removeEventListener(t,a),e.removeEventListener("error",c)},a=()=>{r(),o()},c=()=>{r(),i(Br(e))},l=setTimeout(()=>{r(),i(new Error(`no response from the video decoder after ${n/1e3} s`))},n);e.addEventListener(t,a,{once:!0}),e.addEventListener("error",c,{once:!0})})});function ut(e,t){let n=new In;t(n);let o=n.out(),i=new In().u32(o.length+8).str(e).out(),r=new Uint8Array(o.length+8);return r.set(i),r.set(o,8),r}function mo({width:e,height:t,timescale:n=9e4}){let o=[],i=null;return{addChunk(r,a){if(a&&a.decoderConfig&&a.decoderConfig.description&&!i){let l=a.decoderConfig.description;i=new Uint8Array(l instanceof ArrayBuffer?l:l.buffer.slice(l.byteOffset,l.byteOffset+l.byteLength))}let c=new Uint8Array(r.byteLength);r.copyTo(c),o.push({data:c,key:r.type==="key",ts:r.timestamp,dur:r.duration||0})},addSample(r,{key:a,timestamp:c,duration:l}){o.push({data:r,key:!!a,ts:c,dur:l||0})},setDescription(r){i=r},finish(){if(!o.length)throw new Error("No video frames were encoded");if(!i)throw new Error("The encoder gave no H.264 decoder configuration (avcC)");let r=v=>Math.round(v*n/1e6),a=o.map(v=>r(v.ts)),c=a.slice().sort((v,I)=>v-I),l=r(o[o.length-1].dur)||(c.length>1?c[c.length-1]-c[c.length-2]:r(33333)),s=c.map((v,I)=>I+1<c.length?c[I+1]-v:l),d=a.map((v,I)=>v-c[I]),f=d.some(v=>v!==0),u=s.reduce((v,I)=>v+I,0),h=Math.round(u*1e3/n),x=[];for(let v of s){let I=x[x.length-1];I&&I[1]===v?I[0]++:x.push([1,v])}let E=[];for(let v of d){let I=E[E.length-1];I&&I[1]===v?I[0]++:E.push([1,v])}let y=o.map((v,I)=>v.key?I+1:0).filter(Boolean),k=o.reduce((v,I)=>v+I.data.length,0),b=ut("ftyp",v=>v.str("isom").u32(512).str("isom").str("iso2").str("avc1").str("mp41")),S=v=>ut("moov",I=>{I.bytes(Ue("mvhd",0,0,D=>{D.u32(0).u32(0).u32(1e3).u32(h).u32(65536).u16(256).zeros(10),ei.forEach(U=>D.u32(U)),D.zeros(24).u32(2)})),I.bytes(ut("trak",D=>{D.bytes(Ue("tkhd",0,3,U=>{U.u32(0).u32(0).u32(1).u32(0).u32(h).zeros(8).u16(0).u16(0).u16(0).u16(0),ei.forEach(B=>U.u32(B)),U.u32(e<<16).u32(t<<16)})),D.bytes(ut("mdia",U=>{U.bytes(Ue("mdhd",0,0,B=>B.u32(0).u32(0).u32(n).u32(u).u16(21956).u16(0))),U.bytes(Ue("hdlr",0,0,B=>B.u32(0).str("vide").zeros(12).str("VideoHandler").u8(0))),U.bytes(ut("minf",B=>{B.bytes(Ue("vmhd",0,1,H=>H.u16(0).u16(0).u16(0).u16(0))),B.bytes(ut("dinf",H=>H.bytes(Ue("dref",0,0,V=>{V.u32(1),V.bytes(Ue("url ",0,1,()=>{}))})))),B.bytes(ut("stbl",H=>{H.bytes(Ue("stsd",0,0,V=>{V.u32(1),V.bytes(ut("avc1",G=>{G.zeros(6).u16(1).zeros(16).u16(e).u16(t).u32(4718592).u32(4718592).u32(0).u16(1);let ce=ho.encode("image-to-pixel").slice(0,31);G.u8(ce.length).bytes(ce).zeros(31-ce.length).u16(24).u16(65535),G.bytes(ut("avcC",be=>be.bytes(i)))}))})),H.bytes(Ue("stts",0,0,V=>{V.u32(x.length);for(let[G,ce]of x)V.u32(G).u32(ce)})),f&&H.bytes(Ue("ctts",1,0,V=>{V.u32(E.length);for(let[G,ce]of E)V.u32(G).u32(ce>>>0)})),y.length<o.length&&H.bytes(Ue("stss",0,0,V=>{V.u32(y.length);for(let G of y)V.u32(G)})),H.bytes(Ue("stsc",0,0,V=>V.u32(1).u32(1).u32(o.length).u32(1))),H.bytes(Ue("stsz",0,0,V=>{V.u32(0).u32(o.length);for(let G of o)V.u32(G.data.length)})),H.bytes(Ue("stco",0,0,V=>V.u32(1).u32(v)))}))}))}))}))}),w=S(0).length,A=b.length+w+8;if(A+k>4294967295)throw new Error("Video is larger than 4 GB");let L=S(A),T=new Uint8Array(A+k);T.set(b,0),T.set(L,b.length),new DataView(T.buffer).setUint32(b.length+L.length,k+8),T.set(ho.encode("mdat"),b.length+L.length+4);let z=A;for(let v of o)T.set(v.data,z),z+=v.data.length;return T}}}var ho,In,Ue,ei,ti=St(()=>{ho=new TextEncoder,In=class{constructor(){this.parts=[],this.size=0}u8(t){return this.bytes([t&255])}u16(t){return this.bytes([t>>>8&255,t&255])}u32(t){return this.bytes([t>>>24&255,t>>>16&255,t>>>8&255,t&255])}str(t){return this.bytes(ho.encode(t))}bytes(t){let n=t instanceof Uint8Array?t:Uint8Array.from(t);return this.parts.push(n),this.size+=n.length,this}zeros(t){return this.bytes(new Uint8Array(t))}out(){let t=new Uint8Array(this.size),n=0;for(let o of this.parts)t.set(o,n),n+=o.length;return t}};Ue=(e,t,n,o)=>ut(e,i=>{i.u8(t).u8(n>>16).u8(n>>8).u8(n),o(i)}),ei=[65536,0,0,0,65536,0,0,0,1073741824]});function gs(e){let t=new Uint8Array(8);t[0]=1;let n=e;for(let o=7;o>=1;o--)t[o]=n%256,n=Math.floor(n/256);return t}function ni(e){let t=[];for(let n=e;n>0;n=Math.floor(n/256))t.unshift(n%256);return t}function Dn(e){let t=0;for(let i of e)t+=i.length;let n=new Uint8Array(t),o=0;for(let i of e)n.set(i,o),o+=i.length;return n}function go({width:e,height:t,codec:n="vp9",fps:o=0}){let i=[],r=null;return{addChunk(a,c){if(c&&c.decoderConfig&&c.decoderConfig.description&&!r){let s=c.decoderConfig.description;r=new Uint8Array(s instanceof ArrayBuffer?s:s.buffer.slice(s.byteOffset,s.byteOffset+s.byteLength))}let l=new Uint8Array(a.byteLength);a.copyTo(l),i.push({data:l,key:a.type==="key",ms:a.timestamp/1e3})},addFrame(a,{key:c,timestamp:l}){i.push({data:a,key:!!c,ms:l/1e3})},finish(){if(!i.length)throw new Error("No video frames were encoded");let a=o?1e3/o:i.length>1?(i[i.length-1].ms-i[0].ms)/(i.length-1):33.333,c=i[i.length-1].ms+a,l=Ie(K.Info,[pe(K.TimestampScale,1e6),bs(K.Duration,c),Fn(K.MuxingApp,"image-to-pixel"),Fn(K.WritingApp,"image-to-pixel")]),s=Ie(K.Tracks,[Ie(K.TrackEntry,[pe(K.TrackNumber,1),pe(K.TrackUID,1),pe(K.TrackType,1),pe(K.FlagLacing,0),Fn(K.CodecID,xs[n]||n),...r?[qt(K.CodecPrivate,r)]:[],pe(K.DefaultDuration,Math.round(a*1e6)),Ie(K.Video,[pe(K.PixelWidth,e),pe(K.PixelHeight,t)])])]),d=[],f=null;for(let T of i){let P=Math.round(T.ms);(!f||T.key||P-f.start>3e4)&&(f={start:P,key:T.key,blocks:[]},d.push(f));let z=new Uint8Array(4);z[0]=129,new DataView(z.buffer).setInt16(1,P-f.start),z[3]=T.key?128:0,f.blocks.push(qt(K.SimpleBlock,Dn([z,T.data])))}let u=d.map(T=>Ie(K.Cluster,[pe(K.Timestamp,T.start),...T.blocks])),h=(T,P,z)=>Ie(K.SeekHead,[[K.Info,T],[K.Tracks,P],[K.Cues,z]].map(([v,I])=>Ie(K.Seek,[qt(K.SeekID,Uint8Array.from(ni(v))),pe(K.SeekPosition,I,8)]))),E=h(0,0,0).length,y=E+l.length,k=y+s.length,b=[];d.forEach((T,P)=>{T.key&&b.push(Ie(K.CuePoint,[pe(K.CueTime,T.start),Ie(K.CueTrackPositions,[pe(K.CueTrack,1),pe(K.CueClusterPosition,k)])])),k+=u[P].length});let S=Ie(K.Cues,b.length?b:[Ie(K.CuePoint,[pe(K.CueTime,0),Ie(K.CueTrackPositions,[pe(K.CueTrack,1),pe(K.CueClusterPosition,y+s.length)])])]),w=k,A=Ie(K.EBML,[pe(K.EBMLVersion,1),pe(K.EBMLReadVersion,1),pe(K.EBMLMaxIDLength,4),pe(K.EBMLMaxSizeLength,8),Fn(K.DocType,"webm"),pe(K.DocTypeVersion,4),pe(K.DocTypeReadVersion,2)]),L=Ie(K.Segment,[h(E,y,w),l,s,...u,S]);return Dn([A,L])}}}var ms,qt,pe,Fn,bs,Ie,K,xs,oi=St(()=>{ms=new TextEncoder;qt=(e,t)=>Dn([Uint8Array.from(ni(e)),gs(t.length),t]),pe=(e,t,n=0)=>{let o=[];for(let i=t;i>0||o.length===0;i=Math.floor(i/256))o.unshift(i%256);for(;o.length<n;)o.unshift(0);return qt(e,Uint8Array.from(o))},Fn=(e,t)=>qt(e,ms.encode(t)),bs=(e,t)=>{let n=new Uint8Array(8);return new DataView(n.buffer).setFloat64(0,t),qt(e,n)},Ie=(e,t)=>qt(e,Dn(t)),K={EBML:440786851,EBMLVersion:17030,EBMLReadVersion:17143,EBMLMaxIDLength:17138,EBMLMaxSizeLength:17139,DocType:17026,DocTypeVersion:17031,DocTypeReadVersion:17029,Segment:408125543,SeekHead:290298740,Seek:19899,SeekID:21419,SeekPosition:21420,Info:357149030,TimestampScale:2807729,Duration:17545,MuxingApp:19840,WritingApp:22337,Tracks:374648427,TrackEntry:174,TrackNumber:215,TrackUID:29637,TrackType:131,FlagLacing:156,CodecID:134,CodecPrivate:25506,DefaultDuration:2352003,Video:224,PixelWidth:176,PixelHeight:186,Cluster:524531317,Timestamp:231,SimpleBlock:163,Cues:475249515,CuePoint:187,CueTime:179,CueTrackPositions:183,CueTrack:247,CueClusterPosition:241},xs={vp8:"V_VP8",vp9:"V_VP9",av1:"V_AV1"}});var bo={};bi(bo,{createMp4Muxer:()=>mo,createVideoEncoder:()=>si,createWebmMuxer:()=>go,encodeVideo:()=>ws,estimateFps:()=>Pn,forEachFrame:()=>Ln,frameTimes:()=>co,seekTo:()=>Gt,videoReady:()=>en,videoSupport:()=>ys});async function ys(e=640,t=480){let n={mp4:!1,webm:!1,webcodecs:typeof VideoEncoder<"u"};if(n.webcodecs){for(let o of ii)if((await VideoEncoder.isConfigSupported({codec:o,width:e,height:t}).catch(()=>({}))).supported){n.mp4=!0;break}for(let[o]of ai)if((await VideoEncoder.isConfigSupported({codec:o,width:e,height:t}).catch(()=>({}))).supported){n.webm=!0;break}}return n}async function si(e){let t=Math.max(1,Math.round(e.scale||1)),n=ri(e.width*t),o=ri(e.height*t),i=e.fps||30,r=e.bitrate||Math.min(2e7,Math.max(2e6,n*o*i*.15));if(typeof VideoEncoder>"u")throw new Error("This browser has no WebCodecs VideoEncoder. Export a GIF or PNG sequence instead.");let a=null,c=null,l=e.format==="mp4"?ii.map(y=>[y,"avc"]):ai;for(let[y,k]of l)if((await VideoEncoder.isConfigSupported({codec:y,width:n,height:o,bitrate:r,framerate:i}).catch(()=>({}))).supported){a=y,c=k;break}if(!a)throw new Error(`No ${e.format.toUpperCase()} encoder available in this browser at ${n}\xD7${o}.`);let s=e.format==="mp4"?mo({width:n,height:o}):go({width:n,height:o,codec:c,fps:i}),d=null,f=new VideoEncoder({output:(y,k)=>s.addChunk(y,k),error:y=>{d=y}});f.configure({codec:a,width:n,height:o,bitrate:r,framerate:i,latencyMode:"quality",...e.format==="mp4"?{avc:{format:"avc"}}:{}});let u=new OffscreenCanvas(n,o),h=u.getContext("2d"),x=0,E=1e6/i;return{width:n,height:o,codec:a,async add(y){if(d)throw d;let k=t>1?_t(y,t):y;h.fillStyle="#000",h.fillRect(0,0,n,o),h.putImageData(new ImageData(new Uint8ClampedArray(k.data),k.width,k.height),0,0);let b=new VideoFrame(u,{timestamp:Math.round(x*E),duration:Math.round(E)});f.encode(b,{keyFrame:x%Math.max(1,Math.round(i*2))===0}),b.close(),x++,f.encodeQueueSize>8&&await new Promise(S=>setTimeout(S,0))},async finish(){if(await f.flush(),d)throw d;return f.close(),new Blob([s.finish()],{type:e.format==="mp4"?"video/mp4":"video/webm"})}}}async function ws(e,t){let n=await si({...t,width:e[0].width,height:e[0].height});for(let o of e)await n.add(o);return n.finish()}var ii,ai,ri,xo=St(()=>{ti();oi();Bt();Rn();ii=["avc1.640033","avc1.4d0033","avc1.42003e","avc1.640028","avc1.42001f"],ai=[["vp09.00.10.08","vp9"],["vp8","vp8"]];ri=e=>e+(e&1)});var nn=[{id:"1-bit-monitor",name:"1-Bit Monitor",author:"",colors:["222323","f0f6f0"]},{id:"apollo",name:"Apollo",author:"AdamCYounis",colors:["172038","253a5e","3c5e8b","4f8fba","73bed3","a4dddb","19332d","25562e","468232","75a743","a8ca58","d0da91","4d2b32","7a4841","ad7757","c09473","d7b594","e7d5b3","341c27","602c2c","884b2b","be772b","de9e41","e8c170","241527","411d31","752438","a53030","cf573c","da863e","1e1d39","402751","7a367b","a23e8c","c65197","df84a5","090a14","10141f","151d28","202e37","394a50","577277","819796","a8b5b2","c7cfcc","ebede9"]},{id:"batpalette",name:"Batpalette",author:"el Rojaz",colors:["000000","7f7f7f","ffffff","681e99","3f48cc","88ff82","bfa621","cc3d18"]},{id:"beached-boogaloo",name:"Beached Boogaloo",author:".tomais",colors:["ff0b20","8f0434","500037","a0ff00","57e71e","0ea717","057833","2cdeef","2483e7","153ab7","0d0a87","ff0b88","a60fff","6409cf","eaef30","ff880b","b75308","802202","000000","231940","514378","ffffff","73a3a7","366770","f7b771","c77650","974c38","873939","601e2c","300c1f"]},{id:"cc-29",name:"CC-29",author:"Alpha6",colors:["f2f0e5","b8b5b9","868188","646365","45444f","3a3858","212123","352b42","43436a","4b80ca","68c2d3","a2dcc7","ede19e","d3a068","b45252","6a536e","4b4158","80493a","a77b5b","e5ceb4","c2d368","8ab060","567b79","4e584a","7b7243","b2b47e","edc8c4","cf8acb","5f556a"]},{id:"cga-16",name:"CGA 16",author:"",colors:["000000","0000aa","00aa00","00aaaa","aa0000","aa00aa","aa5500","aaaaaa","555555","5555ff","55ff55","55ffff","ff5555","ff55ff","ffff55","ffffff"]},{id:"chaotic-neutral",name:"Chaotic neutral",author:"Dodecahedron \u2DFD",colors:["e1d4cb","c19f90","a56457","6d504d","484044","392b29","31312f","d8eef0","97999f","81a4c0","6a7f92","415973","43425a","45334b","4b1f40","671087","955ab9"]},{id:"endesga-32",name:"Endesga 32",author:"ENDESGA",colors:["be4a2f","d77643","ead4aa","e4a672","b86f50","733e39","3e2731","a22633","e43b44","f77622","feae34","fee761","63c74d","3e8948","265c42","193c3e","124e89","0099db","2ce8f5","ffffff","c0cbdc","8b9bb4","5a6988","3a4466","262b44","181425","ff0044","68386c","b55088","f6757a","e8b796","c28569"]},{id:"fantasy-24",name:"Fantasy 24",author:"",colors:["1f240a","39571c","a58c27","efac28","efd8a1","ab5c1c","183f39","ef692f","efb775","a56243","773421","724113","2a1d0d","392a1c","684c3c","927e6a","276468","ef3a0c","45230d","3c9f9c","9b1a0a","36170c","550f0a","300f0a"]},{id:"game-boy-dmg",name:"Game Boy (DMG)",author:"",colors:["0f380f","306230","8bac0f","9bbc0f"]},{id:"grayscale-4",name:"Grayscale 4",author:"",colors:["000000","555555","aaaaaa","ffffff"]},{id:"hidden-library",name:"Hidden Library",author:"Pixel Hoo",colors:["100b2a","2a213a","314743","65856d","adca9a","ecfeca","582d27","974133","d67654","5d3441","a3685b","ffb379","ffe6a9","ffffff"]},{id:"intacto14",name:"Intacto14",author:"Anubi",colors:["221529","4b5561","879ba3","cbf5ef","62b4de","5660d6","5b29a6","d64562","f2735c","edbb8e","ab6375","522152","37ada2","8cde8c"]},{id:"journey",name:"Journey",author:"\u{1F34D}PineappleOnPizza\u{1F34D}",colors:["050914","110524","3b063a","691749","9c3247","d46453","f5a15d","ffcf8e","ff7a7d","ff417d","d61a88","94007a","42004e","220029","100726","25082c","3d1132","73263d","bd4035","ed7b39","ffb84a","fff540","c6d831","77b02a","429058","2c645e","153c4a","052137","0e0421","0c0b42","032769","144491","488bd4","78d7ff","b0fff1","faffff","c7d4e1","928fb8","5b537d","392946","24142c","0e0f2c","132243","1a466b","10908e","28c074","3dff6e","f8ffb8","f0c297","cf968c","8f5765","52294b","0f022e","35003b","64004c","9b0e3e","d41e3c","ed4c40","ff9757","d4662f","9c341a","691b22","450c28","2d002e"]},{id:"lospec500",name:"Lospec500",author:"",colors:["10121c","2c1e31","6b2643","ac2847","ec273f","94493a","de5d3a","e98537","f3a833","4d3533","6e4c30","a26d3f","ce9248","dab163","e8d282","f7f3b7","1e4044","006554","26854c","5ab552","9de64e","008b8b","62a477","a6cb96","d3eed3","3e3b65","3859b3","3388de","36c5f4","6dead6","5e5b8c","8c78a5","b0a7b8","deceed","9a4d76","c878af","cc99ff","fa6e79","ffa2ac","ffd1d5","f6e8e0","ffffff"]},{id:"nyx8",name:"Nyx8",author:"Javier Guerrero",colors:["08141e","0f2a3f","20394f","4e495f","816271","997577","c3a38a","f6d6bd"]},{id:"oil-6",name:"Oil 6",author:"",colors:["fbf5ef","f2d3ab","c69fa5","8b6d9c","494d7e","272744"]},{id:"pico-8",name:"PICO-8",author:"",colors:["000000","1d2b53","7e2553","008751","ab5236","5f574f","c2c3c7","fff1e8","ff004d","ffa300","ffec27","00e436","29adff","83769c","ff77a8","ffccaa"]},{id:"resurrect-64",name:"Resurrect 64",author:"Kerrie Lake",colors:["2e222f","3e3546","625565","966c6c","ab947a","694f62","7f708a","9babb2","c7dcd0","ffffff","6e2727","b33831","ea4f36","f57d4a","ae2334","e83b3b","fb6b1d","f79617","f9c22b","7a3045","9e4539","cd683d","e6904e","fbb954","4c3e24","676633","a2a947","d5e04b","fbff86","165a4c","239063","1ebc73","91db69","cddf6c","313638","374e4a","547e64","92a984","b2ba90","0b5e65","0b8a8f","0eaf9b","30e1b9","8ff8e2","323353","484a77","4d65b4","4d9be6","8fd3ff","45293f","6b3e75","905ea9","a884f3","eaaded","753c54","a24b6f","cf657f","ed8099","831c5d","c32454","f04f78","f68181","fca790","fdcbb0"]},{id:"slso8",name:"SLSO8",author:"Luis Miguel Maldonado",colors:["0d2b45","203c56","544e68","8d697a","d08159","ffaa5e","ffd4a3","ffecd6"]},{id:"sweet-canyon-extended-64",name:"Sweet Canyon Extended 64",author:"Mr Slime",colors:["0f0e11","2d2c33","40404a","51545c","6b7179","7c8389","a8b2b6","d5d5d5","eeebe0","f1dbb1","eec99f","e1a17e","cc9562","ab7b49","9a643a","86482f","783a29","6a3328","541d29","42192c","512240","782349","8b2e5d","a93e89","d062c8","ec94ea","f2bdfc","eaebff","a2fafa","64e7e7","54cfd8","2fb6c3","2c89af","25739d","2a5684","214574","1f2966","101445","3c0d3b","66164c","901f3d","bb3030","dc473c","ec6a45","fb9b41","f0c04c","f4d66e","fffb76","ccf17a","97d948","6fba3b","229443","1d7e45","116548","0c4f3f","0a3639","251746","48246d","69189c","9f20c0","e527d2","ff51cf","ff7ada","ff9edb"]},{id:"sweetie-16",name:"Sweetie 16",author:"",colors:["1a1c2c","5d275d","b13e53","ef7d57","ffcd75","a7f070","38b764","257179","29366f","3b5dc9","41a6f6","73eff7","f4f4f4","94b0c2","566c86","333c57"]},{id:"toxic-haze",name:"Toxic Haze",author:"sillyTheJester",colors:["e5ff00","b8d14a","9ab06e","708763","4c5c52","393e40","242424"]},{id:"vinik24",name:"Vinik24",author:"Vinik",colors:["000000","6f6776","9a9a97","c5ccb8","8b5580","c38890","a593a5","666092","9a4f50","c28d75","7ca1c0","416aa3","8d6268","be955c","68aca9","387080","6e6962","93a167","6eaa78","557064","9d9f7f","7e9e99","5d6872","433455"]}];function Nn(e){let t=String(e||"").toLowerCase();return nn.find(n=>n.id===t||n.name.toLowerCase()===t)||null}bt();var xn=1,bn=2048,rn=[{id:"none",label:"None",kind:"none"},{id:"bayer2",label:"Bayer 2\xD72",kind:"ordered"},{id:"bayer4",label:"Bayer 4\xD74",kind:"ordered"},{id:"bayer8",label:"Bayer 8\xD78",kind:"ordered"},{id:"bayer16",label:"Bayer 16\xD716",kind:"ordered"},{id:"cluster4",label:"Clustered dot 4\xD74",kind:"ordered"},{id:"cluster8",label:"Clustered dot 8\xD78",kind:"ordered"},{id:"lines",label:"Horizontal lines",kind:"ordered"},{id:"bluenoise",label:"Blue noise",kind:"ordered"},{id:"custom",label:"Custom matrix",kind:"ordered"},{id:"floyd-steinberg",label:"Floyd\u2013Steinberg",kind:"diffusion"},{id:"atkinson",label:"Atkinson",kind:"diffusion"},{id:"sierra-lite",label:"Sierra Lite",kind:"diffusion"},{id:"sierra",label:"Sierra",kind:"diffusion"},{id:"burkes",label:"Burkes",kind:"diffusion"},{id:"jarvis",label:"Jarvis\u2013Judice\u2013Ninke",kind:"diffusion"},{id:"stucki",label:"Stucki",kind:"diffusion"}],yn=e=>(rn.find(t=>t.id===e)||{kind:"none"}).kind;var xi=Object.freeze({version:xn,size:{mode:"width",width:96,height:0,block:8,resample:"box"},adjust:{brightness:0,contrast:0,saturation:0,hue:0,gamma:1},frame:{aspect:"original",zoom:1,x:.5,y:.5},palette:{source:"builtin",id:"endesga-32",name:"Endesga 32",colors:[],count:16,distance:"oklab"},dither:{method:"bayer4",strength:.6,matrix:null},alpha:{threshold:.5},cleanup:{orphans:!1,smooth:!1},outline:{mode:"none",color:"#000000",corners:!1},export:{size:"scale",scale:4,indexed:!0,grid:!1,gridColor:"#000000"}}),Me=(e,t,n,o)=>{let i=Number(e);return Number.isFinite(i)?Math.min(n,Math.max(t,i)):o},$t=(e,t,n)=>t.includes(e)?e:n,on=(e,t)=>typeof e=="boolean"?e:t;function xt(){return et({})}function et(e={}){let t=xi,n=e||{},o={},i=n.size||{},r=n.adjust||{},a=n.palette||{},c=n.dither||{},l=n.alpha||{},s=n.cleanup||{},d=n.outline||{},f=n.export||{};o.version=xn,o.size={mode:$t(i.mode,["width","block"],t.size.mode),width:Math.round(Me(i.width,1,bn,t.size.width)),height:Math.round(Me(i.height,0,bn,t.size.height)),block:Me(i.block,1,256,t.size.block),resample:$t(i.resample,["box","nearest"],t.size.resample)},o.adjust={brightness:Me(r.brightness,-1,1,0),contrast:Me(r.contrast,-1,1,0),saturation:Me(r.saturation,-1,1,0),hue:Me(r.hue,-180,180,0),gamma:Me(r.gamma,.2,5,1)};let u=n.frame||{};o.frame={aspect:$t(u.aspect,Kt.map(E=>E.id),"original"),zoom:Me(u.zoom,1,8,1),x:Me(u.x,0,1,.5),y:Me(u.y,0,1,.5)};let h=$t(a.source,["builtin","custom","extract","none"],t.palette.source);if(o.palette={source:h,id:typeof a.id=="string"?a.id:h==="builtin"?t.palette.id:"",name:typeof a.name=="string"?a.name:"",colors:[],count:Math.round(Me(a.count,2,256,t.palette.count)),distance:$t(a.distance,["oklab","rgb"],t.palette.distance)},h==="builtin"){let E=Nn(o.palette.id)||Nn(t.palette.id);o.palette.id=E.id,o.palette.name=E.name,o.palette.colors=E.colors.map(y=>"#"+y)}else h==="custom"?(o.palette.colors=(Array.isArray(a.colors)?a.colors:[]).filter(mn).map(Ne).slice(0,256),o.palette.colors.length||(o.palette.colors=["#000000","#ffffff"]),o.palette.name=o.palette.name||"Custom"):h==="extract"?o.palette.name=`Extracted (${o.palette.count})`:o.palette.name="None";let x=rn.some(E=>E.id===c.method)?c.method:t.dither.method;return o.dither={method:x,strength:Me(c.strength,0,1,t.dither.strength),matrix:yi(c.matrix)},o.alpha={threshold:Me(l.threshold,0,1,t.alpha.threshold)},o.cleanup={orphans:on(s.orphans,!1),smooth:on(s.smooth,!1)},o.outline={mode:$t(d.mode,["none","outer","inner"],"none"),color:mn(d.color)?Ne(d.color):t.outline.color,corners:on(d.corners,!1)},o.export={size:$t(f.size,["scale","source"],"scale"),scale:Math.round(Me(f.scale,1,64,t.export.scale)),indexed:on(f.indexed,t.export.indexed),grid:on(f.grid,!1),gridColor:mn(f.gridColor)?Ne(f.gridColor):t.export.gridColor},o}function yi(e){if(!Array.isArray(e)||!e.length||!Array.isArray(e[0]))return null;let t=Math.min(16,e.length),n=Math.min(16,e[0].length),o=[];for(let i=0;i<t;i++){let r=[];for(let a=0;a<n;a++){let c=Number((e[i]||[])[a]);r.push(Number.isFinite(c)?c:0)}o.push(r)}return o}var Kt=[{id:"original",label:"Original",ratio:null},{id:"1:1",label:"1:1",ratio:1},{id:"4:3",label:"4:3",ratio:4/3},{id:"3:4",label:"3:4",ratio:3/4},{id:"3:2",label:"3:2",ratio:3/2},{id:"2:3",label:"2:3",ratio:2/3},{id:"16:9",label:"16:9",ratio:16/9},{id:"9:16",label:"9:16",ratio:9/16}];function wn(e,t,n={}){let o=(Kt.find(s=>s.id===n.aspect)||Kt[0]).ratio||e/t,i=e,r=e/o;r>t&&(r=t,i=t*o);let a=Math.max(1,n.zoom||1);i=Math.max(1,Math.min(e,Math.round(i/a))),r=Math.max(1,Math.min(t,Math.round(r/a)));let c=n.x??.5,l=n.y??.5;return{x:Math.round((e-i)*c),y:Math.round((t-r)*l),w:i,h:r}}function Mo(e,t,n){let o,i;return n.mode==="block"?(o=Math.max(1,Math.round(e/n.block)),i=Math.max(1,Math.round(t/n.block))):(o=n.width,i=n.height||Math.max(1,Math.round(o*t/e))),{width:Math.min(bn,o),height:Math.min(bn,i)}}function wi(e,t){let n={};for(let o of Object.keys(e)){if(o==="version")continue;let i=e[o],r=t[o];if(i&&typeof i=="object"&&!Array.isArray(i)){let a={};for(let c of Object.keys(i))JSON.stringify(i[c])!==JSON.stringify(r&&r[c])&&(a[c]=i[c]);Object.keys(a).length&&(n[o]=a)}else JSON.stringify(i)!==JSON.stringify(r)&&(n[o]=i)}return n}var Co={enc(e){let t=new TextEncoder().encode(e),n="";for(let o of t)n+=String.fromCharCode(o);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},dec(e){let t=atob(e.replace(/-/g,"+").replace(/_/g,"/"));return new TextDecoder().decode(Uint8Array.from(t,n=>n.charCodeAt(0)))}};function So(e){let t=et(e),n=wi(t,xt());return n.palette&&(t.palette.source!=="custom"&&(delete n.palette.colors,delete n.palette.name),t.palette.source!=="builtin"&&delete n.palette.id,t.palette.source!=="extract"&&delete n.palette.count),n.palette&&!Object.keys(n.palette).length&&delete n.palette,n}function jn(e){return Co.enc(JSON.stringify({v:xn,...So(e)}))}function Hn(e){let t=String(e),n=/[#&?]s=([A-Za-z0-9_-]+)/.exec(t);n&&(t=n[1]);let o=JSON.parse(Co.dec(t));return delete o.v,et(o)}function Zt(e){return JSON.stringify({$schema:"image-to-pixel/settings",version:xn,...So(e)},null,2)}function Xn(e){let t=typeof e=="string"?JSON.parse(e):e;return delete t.$schema,et(t)}function Tt(e,t){let n=JSON.parse(JSON.stringify(e));for(let o of Object.keys(t||{}))t[o]&&typeof t[o]=="object"&&!Array.isArray(t[o])&&n[o]&&typeof n[o]=="object"?Object.assign(n[o],t[o]):n[o]=t[o];return et(n)}bt();var To="DHos2hHvghjhcwXqwKFF/I5L2ny43U2CNthWL2uZuIRL+h7EVxA0YALtMcH8NbbVUPllGoW/JOwz00rvXqMkVz7EYJ7BTqNbvi6qPIwRXa4kwO9YHI8KwRmt7YvNQV/mNKB2OofloLpEyqZhCYxtF4KtQ8mZ4Ud9uQiHHTy+cdiT8wWJO2/UDP6DUtBm3jLocQ+aLq/9atWZRXgD4R/EEGjRAe6qJdB1khZ7SeCqRPAwzwl3Ll6tGP9rqt+W6hSza0+s3xryLJNAsxbxI7d9zEGHZ9NGeiRZ8WYnsVKkdvOyj1a5RmcKU+gq9ZjOIny/XY7nuPcM1p1VOs4rZkyKMhzoKHpfsMR4Ycudb5BLAZ8e96gF6pW0Ow2904T3NpJOHzLhFoH1ltc9tVoTOWXmAqIjO2ZOinMm3I8PfsMA/Muevj/SmkoB6SHcCzqv+8Vg3k29OGEXyeSHnUARacEG2ofHbZvON70gaYnbdsKujVL+c9qlHLLHRGrvtkLlpVt5CVKID/swjak9VIDoXRUzdJMmfdCKpUttLftb3Jko7mOuR/8rXg12qPwDoUbrDy7HQrYPk+Y09QisHFeZciQ93WT0r2rFVtls9pS7IMqGpu4S2FQO8yvXAK14H7R/T6M3GIAHpuuNQsxVMsghXpp73xqGW8xJfl+chMkv9hXQspEb1TYgoXsTKcEGZKFE31K/PrGabbtdgetUzjnoFcdv0Oq9adNOteITmXLwh7j5PWOg8S5xAbon1Uvha76JSukvwJl+7UPitYZK0Tb6cyoJa4P4Lt5BHZu/GouiYkT6C49XI4k4GmcqgdhBrgxQJtMIv0fXp/uP6RJ2OwOpWwx/a0ECUcsMYjSc63erFI3Mm+kiXwSMqf83cEj1B8KHny61QNig+MeX9KxeHeRqxH+pbpEjgRY6aVCftP2WKu3Iofqx422nkL31FV0f203uXLhD1KzFTnnMCtmzLNt0IOFge+0BcFEQdz0Ewn0unj7eG/RR47NX078uzR9HfthwOR5YLIUU/ylMcspAuIKeADN7D5N2NeEUZJVRfJxbO7RPyxmVwjKr3LpV6qBH/s0AkF0yxgVw8JQMc4nmZL8RT7aL3JzGPV7WiAOi6GcpyG6y2PtXGvCZKb3oIfEOyv2RBaT4R2XlhB6SLG3ZEYhUcum7n3w9oipIrvZWBa0w9J/SCGgY7Kt3G7PgM5EO/ULiUSSlOc9ptFWBOq1pQ4Ibbuc1ciKxDUph+8YZj123Hq0qShD6zWLhgCDWO5zbhV4ic/dJgDNRzvFEYHzDU62KF5h/Yb2LAkP6ywePxeCnvSpbx4PbkfG/oj56sDfJ4Tz2hNlsjSCvDsRSkLpxFkLKlT6nv9yYBYotmxD3Itx4Nbz1COch2nijG2ziXC4XVj3al7MKVDptK9UG50/1CXeiYhXBOORaQZT/agkt8ljmtADoK1tw+bdmxHKrvUZpBdVNa55BrE/pNLqHRaT5cZ3xfhRI75vPGH6WXSWoZpsoStGUVaQDt9F1M6rdyIqkIXtjiNUOJkoV5yHcUzCGpfKRH80uw3IPlF/wJ9YTu4sAzCRt4DBlt/1R4r2L2xeD7LwG8SVw+IAj5RVLe18RSdMx/ky4ocyuhlpAkgbqyxRXt37oWof+KbLQCpdUezncSmKmw4yrH4MCpzcScjLKValrOXqwyjVOnGKz7504+a9smMEVOntkNNSg/cd9YJk82yhFCqcXzFWBPHCryO5oIrD/NlII81rERXXL60yz+z8Q4I7WRw+L1wnChicCvIAe4QlX5ZL0A+MfdA43tiX3dqpn+pbWbkC55Rv0SC4HlsWAD5bedzzSl+cmjmOgBJF5wy1aHZvkW6rrOVPUauhUyj+Lq3AjUJx+wEewbOFNGL4CjMNPLvKOAaBckNuCtFnhMnDKHrWJKQ9erxf2LM9fIO6euP5pvyx5HW/2kkKmK5pn9S/E2bM88liP7xWXg9dZ7jgafKteI9J1K7wOZ/k+GqXuSWX3UKnuftpPunxE5K5OcgE8ghLvQ5q1C8YWdNcFuhd/Rg5ozycK1S1cyTqkKpV10OYKv+pQrvtA0SSdzI5UuymeAthvQ8A1bhLYlwuHNNSVx1KxjsXgTH81rvtLhexV25n6iLueabN6qOsHarjfSaFkP5iBOhaJbqhRdgPnfA7Ugze6HZ0KkPKmOGbF+hVg5yH0MF4EKGTR51iLHaw7b6gsWxtI4DX8RSBRf/ocYAwosv0bbN/HWeYS87cwZEP8rG7sjV3+ySlYgOkkUrR2pUaMbaXZdv2kGJUnwmXgJr4Jyul1AX2TEL+M3LFCyI3yzodP0jCeBrMnmDqD3sKWLFkYSsYuek3asAXNcps82Ci8B98ZP7SEO75xRe4Qlc+BTo81pfVTzmDmbg2cMHWoUzdzBLmM9mY92nHPWR6kEs3kkrEH3aQTa5dDtxvvC4j2VoDEmFLKElvxANOeeD9c/yDdYsUsshqkKT3PXOwB2R7BmuJgH0rAhaZOCI/0bk6CYzH3aIU/u+Qh+lZ/qErGbBzmM2b2JZveibBVL7njBZpysBKKceJBgvi4kyG1SYVm7BNArOp4DO4d48ItsDzfvwyfR88l81d9N47UK+FiMa+bQ7YLftFtNEsdfvlhI6lIyDjtTA6X02kUUHrfbP+jKrNaftY0n81eNXmeYdEAjSbwuHkTqZABza4SarwDk9AQ8nTUlEmqBsCj5cYPkNd28RZfob79XDK8jO0KOJgYPdCN+CWSaBlIspH2EkZ1/6ZXbzneUMIz62VL9JxGd/5TgilZFfAv4F38dStlrDpRvTCT5HsniLAF5UKhyF7Wu1V3EEjICLr8f9okVbvmhhlCy5geifxfdqEhgsYw6BqxNtzApYdoxSCNPxSYSczrCYdm0AJB2BpNzGMlca8qhQbmqdpwm1fdPqUDbNM5qSjAae0I2LIrC9NE4rEJW4jKZ58HSes4sU+feNK28oEcdKH5HqpUumvzpHeX+hbbS/dqkCE2ufQqeR1g8LSADWKY3zKqekhjooO5GI42cdelKE3wkHUf0AP4E+RYNQKn3lQqxUd+8JotP9cQN7ZZgJwZykfwYwJCrIvMlyxDlPrHTROLUyPJ8jvcT/dgw+1EEOWBFNW3YZmDbb0mlHDOXzi5jGHfNhTTi7xb7IfPAO09tS+hfc2U5GcO7FDC3R90NexvzPu1kgVtIZh1A6Milbhqwz5YLvNF3jSjS/C7IYj8F9UIkbNuVwl/JW5Koi3EdFzqDFW0GFHXtzpyCKdTugSvnTwNXjGC6bHKL+VQe/tULaD4iqQKwh5cyYQIQN+fTXOiP/YmxeSm/MevG9pglRXahqwm/HYwfx2i/odo6I7WXSCA2KPhwlUXRYvRqzYMjd0CbyDQaH6r/xbXYrB5DsQv5GSrT3scRjUFk+k2fP5NwDpn00Cd6MaQXivRFD4leEXzwExyGT+qff9hEmy61mLAPOa0R+ooTo9rNpn0KVzqgRHNhgPtmmaL0k1ougmrKJoE748Ru1wEReO8TK32yJzgC44r+ZVk7A2hwSrwlEUhfJtahA2UvtsA7bYcSM2okUa9JFrUMLreWKkVhe9C03HlV3nJTXAn+Kp0DJV7WBhqL7JlqQPRL8l1O95ZhBbjpvMSyC36XjpzpUR93YptAzLycJ7/j0pzEfh34CueXIwTti+nGPSvz4U00iLuMcGoitJU7n1GtIQcUZAAtDfHVm80Tdt0nrYZyyVgyA5W+bHVUxe1OQ3FnSc4yUe9Gss0+WXVRoMtkw1kn1C3YtYAROQRPcYX41naova/ZZz4egbUuoitHUDehfOR4zSevD0jfZfJZH/dXey1ZgSUbfR8qU6SB+vEWuM72RrpiDuSc/xagaMllXI2CGo/J+MZS6+WJf4LZO9WC2tMB655HemRZeYRQNYoqkMahk7psTNTCN0hvHWcHmymT4CycQr0pRu1LcvxYr39rYzrsobQdS/rZj99oji9kc2nNsFb/URvBsZMr++IAPltltOnfBbShr5qPu9WNrj/AsbxJkPNVyrZZpkHd0AQUCnSHk4OWpLGE9e1UM4g5Xgq+IHbJI7LrNwpn3QyX5u8NOMOMf5EmuocoovODd6JRXgZjV/kq3nASYfhUajniMmgYH7Dn/w8p1aKGuJvjEkRtlEXoGkOUzWFXfsKw9xKG4JXwXNdtidiS/sueaxmI5zaOL6gETORBuwWOMEc0TFyDPUz2XAl5AZ5+DKaAfWtZNh06UK38pfiErtGjyOneM/uoiCTyQLid8MHtU8X88xYrWr4SHPI/WSdt3b6aJRZst1DkANIuWXCQqxpv1ktyTycB4kw0ngmqGvQfOZU9jkGY0Db9EyDqTSQ12fjoEB/CessGYXfUyI91lsmoUQB8iKaY77rqIQclNQh6j/do4Ed/VjCo18DTu0/HTOzFGuSsciGDWU32RP3Rx+CM8WQKLlMj9WoAbmOr38N5YS81nc6yhZ4K1reN/VSgQ+TdBPuaLsr3hT5lMqDuJPcXJ3UJ/FSLK7CIp9YbK+X8FkA/GPccsRBYzHoaRnxUsc3E1Wr44lP/50Qy3UJpGHPsilU0kGVf0twPrIxYwz+cQLASYIPb+iWedOK58ErzhO0d0erG5oN9nzOm0S+M4ylZfOVJmcGtdJBhrNN5bwk/UXGia4G5xmozojjH9RTqkOK8zLfo74+FvhQBUAYe19C4p7RMO1aOasiVgv6eNcE4iJ6w0j3nzFfHe9oLYk+mHoLZ+oxdrhf8i0QaZ955SzHHKd4YSKI214yp3S59aLXiSNoEI16vtmK6sCGKFCdbEa1O90Vgs1z6JXCAKXSE+xW2qYbm0zZO47EVfdBuxWZatlUC839Swi2zhvfjVIzB/LAOPfJTARoF0huo+G3FcX+hAqZWbM+D6wpSn37WHHDL4E9813EIKIAd6/RB45P9TqD6rk4lqxsgJNGYSTHbrZJfZtYsCam/pov1xI+Yo4lWqjRb/Ak4FKAz2PbF7hEnQSwz4wIfP9s50UfgzXpYsMEoCVJehTHJ/EBrv+cFu2WYBnYCXPnPH/OuV31esvuOdkaTjCmjWm3+QujNpEohtb4YSNJ360xVbuY2WumzCh7sVfQkPJh5D9Z5nE31Hs+3Syp7UaL0GEeUAuPrikNqm2XffbBAdQYM5RF7HbI8VscO3fGnWcUjc8RLFr7SBSY4B78agquIoigwS2JuwxSrQKFw24xuQ+WsPB0QeVWhEfgBrJBZYRR68ZvH7xUBa1upOKTDfQ5ue9DfuywC4q6aEw5hLdB3VPVEWvLHFzpks5j90wbpPlN4DKF1h/Flvm+IFzLJOOhO3qnWOCKL+dCGb9LJ7FR1HUipGPFPHTRMfWqzBHnJ5d5NbRIl/epQnMmtjmW0lyAI27IBGSmNwdnMaDzcJIPvP0SKtUKsGeY1Xz+jNhshRiZVuIEkSOj5lMBcZJZoW/DBPuD4g==";function vi(e){return typeof atob=="function"?Uint8Array.from(atob(e),t=>t.charCodeAt(0)):new Uint8Array(Buffer.from(e,"base64"))}function Jt(e){let t=[[0]];for(let n=1;n<e;n*=2){let o=[];for(let i=0;i<n*2;i++)o.push(new Array(n*2));for(let i=0;i<n;i++)for(let r=0;r<n;r++){let a=4*t[i][r];o[i][r]=a,o[i][r+n]=a+2,o[i+n][r]=a+3,o[i+n][r+n]=a+1}t=o}return t}function Ao(e){let t=e.length,n=e[0].length,o=[];for(let r=0;r<t;r++)for(let a=0;a<n;a++)o.push({i:r*n+a,v:e[r][a]});o.sort((r,a)=>r.v-a.v||r.i-a.i);let i=new Uint8Array(n*t);return o.forEach((r,a)=>{i[r.i]=a}),i}function Ei(e){let t=[];for(let n=0;n<e;n++){let o=[];for(let i=0;i<e;i++){let r=(i+.5)/e*2*Math.PI,a=(n+.5)/e*2*Math.PI;o.push(-(Math.cos(r)+Math.cos(a))+(i*e+n)*1e-9)}t.push(o)}return t}var ki=[[7,13,11,4],[12,16,14,8],[10,15,6,2],[5,9,3,1]],Vn=new Map;function Po(e,t=null){if(e==="custom"){let i=t&&t.length?t:Jt(4);return{w:i[0].length,h:i.length,levels:i.length*i[0].length,values:Ao(i)}}if(Vn.has(e))return Vn.get(e);let n,o=i=>({w:i[0].length,h:i.length,levels:i.length*i[0].length,values:Ao(i)});switch(e){case"bayer2":n=o(Jt(2));break;case"bayer4":n=o(Jt(4));break;case"bayer8":n=o(Jt(8));break;case"bayer16":n=o(Jt(16));break;case"cluster4":n=o(ki);break;case"cluster8":n=o(Ei(8));break;case"lines":n=o([[0],[2],[1],[3]]);break;case"bluenoise":n={w:64,h:64,levels:256,values:vi(To)};break;default:n=o(Jt(4))}return Vn.set(e,n),n}function Lo(e){let t=String(e).split(/\r?\n|;/).map(o=>o.trim()).filter(o=>o&&!/^\//.test(o)).map(o=>o.replace(/[[\]]/g,"").split(/[\s,]+/).filter(Boolean).map(Number));if(!t.length)throw new Error("Matrix is empty");let n=t[0].length;if(t.some(o=>o.length!==n||o.some(i=>!Number.isFinite(i))))throw new Error("Every row needs the same number of values");if(n>16||t.length>16)throw new Error("Matrices are limited to 16\xD716");return t}var zt=(e,t)=>t.map(([n,o,i])=>[n,o,i/e]),Ro={"floyd-steinberg":zt(16,[[1,0,7],[-1,1,3],[0,1,5],[1,1,1]]),atkinson:zt(8,[[1,0,1],[2,0,1],[-1,1,1],[0,1,1],[1,1,1],[0,2,1]]),"sierra-lite":zt(4,[[1,0,2],[-1,1,1],[0,1,1]]),sierra:zt(32,[[1,0,5],[2,0,3],[-2,1,2],[-1,1,4],[0,1,5],[1,1,4],[2,1,2],[-1,2,2],[0,2,3],[1,2,2]]),burkes:zt(32,[[1,0,8],[2,0,4],[-2,1,2],[-1,1,4],[0,1,8],[1,1,4],[2,1,2]]),jarvis:zt(48,[[1,0,7],[2,0,5],[-2,1,3],[-1,1,5],[0,1,7],[1,1,5],[2,1,3],[-2,2,1],[-1,2,3],[0,2,5],[1,2,3],[2,2,1]]),stucki:zt(42,[[1,0,8],[2,0,4],[-2,1,2],[-1,1,4],[0,1,8],[1,1,4],[2,1,2],[-2,2,1],[-1,2,2],[0,2,4],[1,2,2],[2,2,1]])},Wn=12;function Uo(e){let t=1;for(let[n,o]of e)o>0&&(t=Math.max(t,Math.floor(-n/o)+1));return t}var Io=(e,t,n)=>e-1+n*(t-1)+1;bt();function vn(e,t=16,n={}){let{maxSamples:o=4e4,alphaThreshold:i=.5}=n,r=e.width*e.height,a=Math.max(1,Math.floor(r/o)),c=[];for(let u=0;u<r;u+=a){let h=u*4;e.data[h+3]<i*255||c.push([e.data[h],e.data[h+1],e.data[h+2]])}if(!c.length)return["#000000","#ffffff"].slice(0,Math.max(1,t));let l=[c];for(;l.length<t;){let u=-1,h=-1,x=0;if(l.forEach((k,b)=>{if(!(k.length<2))for(let S=0;S<3;S++){let w=255,A=0;for(let T of k)T[S]<w&&(w=T[S]),T[S]>A&&(A=T[S]);let L=(A-w)*Math.sqrt(k.length);L>h&&(h=L,u=b,x=S)}}),u<0||h<=0)break;let E=l[u].slice().sort((k,b)=>k[x]-b[x]),y=E.length>>1;l.splice(u,1,E.slice(0,y),E.slice(y))}let s=l.map(u=>Mi(u));for(let u=0;u<6;u++){let h=s.map(()=>[0,0,0,0]);for(let x of c){let E=0,y=1/0;for(let b=0;b<s.length;b++){let S=x[0]-s[b][0],w=x[1]-s[b][1],A=x[2]-s[b][2],L=S*S+w*w+A*A;L<y&&(y=L,E=b)}let k=h[E];k[0]+=x[0],k[1]+=x[1],k[2]+=x[2],k[3]++}s=s.map((x,E)=>h[E][3]?[h[E][0]/h[E][3],h[E][1]/h[E][3],h[E][2]/h[E][3]]:x)}let d=[...new Set(s.map(u=>Ot(u)))],f=u=>{let h=parseInt(u.slice(1),16);return .2126*(h>>16)+.7152*(h>>8&255)+.0722*(h&255)};return d.sort((u,h)=>f(u)-f(h))}function Mi(e){let t=0,n=0,o=0;for(let i of e)t+=i[0],n+=i[1],o+=i[2];return[t/e.length,n/e.length,o/e.length]}bt();function kn(e,t,n,o="box",i=null){let r=i?i.x:0,a=i?i.y:0,c=i?i.w:e.width,l=i?i.h:e.height,s=e.data,d=e.width,f=new Float32Array(t*n*4),u=o==="nearest"?1:Math.min(16,Math.max(1,Math.ceil(c/t))),h=o==="nearest"?1:Math.min(16,Math.max(1,Math.ceil(l/n))),x=new Int32Array(t*u),E=new Int32Array(n*h);for(let y=0;y<t;y++)for(let k=0;k<u;k++)x[y*u+k]=r+Math.min(c-1,Math.floor((2*(y*u+k)+1)*c/(2*t*u)));for(let y=0;y<n;y++)for(let k=0;k<h;k++)E[y*h+k]=a+Math.min(l-1,Math.floor((2*(y*h+k)+1)*l/(2*n*h)));for(let y=0;y<n;y++)for(let k=0;k<t;k++){let b=0,S=0,w=0,A=0;for(let T=0;T<h;T++){let P=E[y*h+T]*d;for(let z=0;z<u;z++){let v=(P+x[k*u+z])*4,I=s[v+3]/255;b+=s[v]/255*I,S+=s[v+1]/255*I,w+=s[v+2]/255*I,A+=I}}let L=(y*t+k)*4;A>0&&(f[L]=b/A,f[L+1]=S/A,f[L+2]=w/A),f[L+3]=A/(u*h)}return f}function Mn(e,{brightness:t=0,contrast:n=0,saturation:o=0,hue:i=0,gamma:r=1}){if(!t&&!n&&!o&&!i&&r===1)return e;let a=n>=0?1/(1-.99*n):1+n,c=1/r,l=Math.cos(i*Math.PI/180),s=Math.sin(i*Math.PI/180),d=[.213+.787*l-.213*s,.715-.715*l-.715*s,.072-.072*l+.928*s,.213-.213*l+.143*s,.715+.285*l+.14*s,.072-.072*l-.283*s,.213-.213*l-.787*s,.715-.715*l+.715*s,.072+.928*l+.072*s];for(let f=0;f<e.length;f+=4){let u=e[f]+t,h=e[f+1]+t,x=e[f+2]+t;u=(u-.5)*a+.5,h=(h-.5)*a+.5,x=(x-.5)*a+.5;let E=u*gn[0]+h*gn[1]+x*gn[2],y=1+o;if(u=E+(u-E)*y,h=E+(h-E)*y,x=E+(x-E)*y,i){let k=d[0]*u+d[1]*h+d[2]*x,b=d[3]*u+d[4]*h+d[5]*x,S=d[6]*u+d[7]*h+d[8]*x;u=k,h=b,x=S}e[f]=Math.pow(yt(u),c),e[f+1]=Math.pow(yt(h),c),e[f+2]=Math.pow(yt(x),c)}return e}function Fo(e,t){for(let n=3;n<e.length;n+=4)e[n]=e[n]>=t&&e[n]>0?1:0;return e}var yt=e=>e<0?0:e>1?1:e;function Do(e,t){let n=e.length,o=new Float64Array(n*3),i=new Float64Array(n*3);return e.forEach((r,a)=>{i.set([r[0]/255,r[1]/255,r[2]/255],a*3),o.set(t===1?[r[0]/255,r[1]/255,r[2]/255]:Gn(r[0]/255,r[1]/255,r[2]/255),a*3)}),{n,coords:o,rgb:i,distance:t}}var qn=[.299,.587,.114];function Oo(e,t,n,o){let i,r,a,c=1,l=1,s=1;e.distance===1?(i=t,r=n,a=o,c=qn[0],l=qn[1],s=qn[2]):[i,r,a]=Gn(t,n,o);let d=0,f=1/0,u=e.coords;for(let h=0;h<e.n;h++){let x=i-u[h*3],E=r-u[h*3+1],y=a-u[h*3+2],k=c*x*x+l*E*E+s*y*y;k<f&&(f=k,d=h)}return d}function $o(e,t,n,o){let i=new Uint8ClampedArray(t*n*4),r=o.quantize?Do(o.palette,o.distance):null,a=o.kind==="ordered"?o.map:null,c=a?o.spread*o.settings.dither.strength:0;for(let l=0;l<n;l++)for(let s=0;s<t;s++){let d=(l*t+s)*4;if(e[d+3]<.5)continue;let f=e[d],u=e[d+1],h=e[d+2];if(r){if(a){let E=(a.values[l%a.h*a.w+s%a.w]+.5)/a.levels-.5;f=yt(f+E*c),u=yt(u+E*c),h=yt(h+E*c)}let x=Oo(r,f,u,h);i[d]=o.palette[x][0],i[d+1]=o.palette[x][1],i[d+2]=o.palette[x][2]}else i[d]=Math.round(f*255),i[d+1]=Math.round(u*255),i[d+2]=Math.round(h*255);i[d+3]=255}return i}function zo(e,t,n,o){let i=new Uint8ClampedArray(t*n*4),r=Do(o.palette,o.distance),a=new Float32Array(t*n*3),c=o.settings.dither.strength,l=o.kernel;for(let s=0;s<n;s++)for(let d=0;d<t;d++){let f=s*t+d,u=f*4;if(e[u+3]<.5)continue;let h=yt(e[u]+a[f*3]*c),x=yt(e[u+1]+a[f*3+1]*c),E=yt(e[u+2]+a[f*3+2]*c),y=Oo(r,h,x,E),k=h-r.rgb[y*3],b=x-r.rgb[y*3+1],S=E-r.rgb[y*3+2];for(let[w,A,L]of l){let T=d+w,P=s+A;if(T<0||T>=t||P>=n)continue;let z=(P*t+T)*3;a[z]+=k*L,a[z+1]+=b*L,a[z+2]+=S*L}i[u]=o.palette[y][0],i[u+1]=o.palette[y][1],i[u+2]=o.palette[y][2],i[u+3]=255}return i}var En=(e,t)=>e[t+3]===0?-1:e[t]<<16|e[t+1]<<8|e[t+2],No=[[0,-1],[1,0],[0,1],[-1,0]];function Bo(e,t,n){let o=e.slice();for(let i=0;i<n;i++)for(let r=0;r<t;r++){let a=(i*t+r)*4,c=En(o,a),l=[],s=[];for(let[u,h]of No){let x=r+u,E=i+h;if(x<0||E<0||x>=t||E>=n)continue;let y=(E*t+x)*4;l.push(En(o,y)),s.push(y)}if(l.length<2||l.includes(c))continue;let d=0,f=0;for(let u=0;u<l.length;u++){let h=0;for(let x=0;x<l.length;x++)l[x]===l[u]&&h++;h>f&&(f=h,d=u)}e.set(o.subarray(s[d],s[d]+4),a)}return e}function Go(e,t,n){let o=e.slice();for(let i=0;i<n;i++)for(let r=0;r<t;r++){let a=(i*t+r)*4,c=En(o,a),l=[],s=[];for(let d=-1;d<=1;d++)for(let f=-1;f<=1;f++){let u=Math.min(t-1,Math.max(0,r+f)),x=(Math.min(n-1,Math.max(0,i+d))*t+u)*4;l.push(En(o,x)),s.push(x)}for(let d=0;d<9;d++){if(l[d]===c)continue;let f=0;for(let u=0;u<9;u++)l[u]===l[d]&&f++;if(f>=5){e.set(o.subarray(s[d],s[d]+4),a);break}}}return e}function jo(e,t,n,{mode:o,color:i,corners:r}){if(o==="none")return e;let a=e.slice(),c=(d,f)=>d>=0&&f>=0&&d<t&&f<n&&a[(f*t+d)*4+3]>0,l=(d,f)=>d>=0&&f>=0&&d<t&&f<n,s=r?[[0,-1],[1,0],[0,1],[-1,0],[-1,-1],[1,-1],[1,1],[-1,1]]:No;for(let d=0;d<n;d++)for(let f=0;f<t;f++){let u=c(f,d),h=!1;for(let[x,E]of s){let y=f+x,k=d+E;if(l(y,k)&&(o==="outer"?!u&&c(y,k):u&&!c(y,k))){h=!0;break}}if(h){let x=(d*t+f)*4;e[x]=i[0],e[x+1]=i[1],e[x+2]=i[2],e[x+3]=255}}return e}function Ho(e,t){let n=et(e),o=wn(t.width,t.height,n.frame),{width:i,height:r}=Mo(o.w,o.h,n.size),a=n.palette.colors;n.palette.source==="extract"&&(a=Ci(t,n,i,r,o));let c=n.palette.source!=="none"&&a.length>0,l=c?a.map(gt):[],s=c?yn(n.dither.method):"none";n.dither.strength<=0&&(s="none");let d=s==="ordered"?Po(n.dither.method,n.dither.matrix):null,f=s==="diffusion"?Ro[n.dither.method]:null,u=f?Uo(f):1;return{settings:n,srcWidth:t.width,srcHeight:t.height,crop:o,width:i,height:r,quantize:c,kind:s,palette:l,paletteHex:c?a.slice():null,distance:n.palette.distance==="rgb"?1:0,spread:c?ko(l):0,map:d,kernel:f,skew:u,waves:f?Io(i,r,u):0,outline:{mode:n.outline.mode,color:gt(n.outline.color),corners:n.outline.corners}}}function Ci(e,t,n,o,i){let r=Math.min(1,160/Math.max(n,o)),a=Math.max(1,Math.round(n*r)),c=Math.max(1,Math.round(o*r)),l=kn(e,a,c,"box",i);Mn(l,t.adjust);let s=new Uint8ClampedArray(l.length);for(let d=0;d<l.length;d++)s[d]=Math.round(l[d]*255);return vn({data:s,width:a,height:c},t.palette.count,{alphaThreshold:Math.max(.01,t.alpha.threshold)})}function Xo(e,t){let{width:n,height:o,settings:i}=e,r=kn(t,n,o,i.size.resample,e.crop);Mn(r,i.adjust),Fo(r,i.alpha.threshold);let a=e.kind==="diffusion"?zo(r,n,o,e):$o(r,n,o,e);return i.cleanup.orphans&&Bo(a,n,o),i.cleanup.smooth&&Go(a,n,o),jo(a,n,o,e.outline),a}var Si="2.0.0",an=4,Vo="glcanvas",ye=class extends Error{constructor(e,t){super(e),this.name="ShaderMateError",t&&Object.assign(this,t)}},Wo=new Set;function Nt(e,...t){Wo.has(e)||(Wo.add(e),console.warn("[ShaderMate]",...t))}var Qn=typeof window<"u"&&typeof document<"u",Ti=e=>Array.isArray(e)||ArrayBuffer.isView(e)&&!(e instanceof DataView),qo=e=>e==null?[]:Array.isArray(e)?e:[e],Yo=e=>e>0&&(e&e-1)===0;function _i(e){var t,n,o,i;if(e==null)return null;if(Array.isArray(e))return[(t=e[0])!=null?t:0,(n=e[1])!=null?n:0,(o=e[2])!=null?o:0,(i=e[3])!=null?i:1];if(typeof e=="string"&&Qn){let r=document.createElement("canvas");r.width=r.height=1;let a=r.getContext("2d");a.fillStyle=e,a.fillRect(0,0,1,1);let c=a.getImageData(0,0,1,1).data;return[c[0]/255,c[1]/255,c[2]/255,c[3]/255]}return null}function Ai(){if(!Qn)return!1;let e=location.hostname;return location.protocol==="file:"||e==="localhost"||e==="127.0.0.1"||e===""||e.endsWith(".local")}var Pi=class{constructor(e){this.gl=e,this._items=new Map,this._nextId=1}add(e,t){let n=this._nextId++;return this._items.set(n,{obj:e,count:1,type:t}),n}ref(e){let t=this._items.get(e);return t&&t.count++,e}get(e){let t=this._items.get(e);return t?t.obj:null}unref(e){let t=this._items.get(e);t&&(t.count--,t.count<=0&&this._destroy(e,t))}_destroy(e,t){let{obj:n,type:o}=t,i=this.gl;switch(o){case"texture2D":case"textureCube":i.deleteTexture(n);break;case"fbo":i.deleteFramebuffer(n);break;case"buffer":i.deleteBuffer(n);break;case"program":i.deleteProgram(n);break}this._items.delete(e)}dispose(){for(let[e,t]of[...this._items])this._destroy(e,t)}};function Li(e){let t=new Map;function n(c,l){return t.has(c)||t.set(c,new Set),t.get(c).add(l),()=>o(c,l)}function o(c,l){let s=t.get(c);s&&s.delete(l)}function i(c,l){let s=d=>{o(c,s),l(d)};return n(c,s)}function r(c,l){let s=t.get(c);if(s)for(let d of[...s])try{d(l)}catch(f){console.error(`[ShaderMate] error in "${c}" listener`,f)}e&&e(c,l)}function a(){t.clear()}return{on:n,off:o,once:i,emit:r,clear:a}}var Ko={linear:e=>e,inQuad:e=>e*e,outQuad:e=>e*(2-e),inOutQuad:e=>e<.5?2*e*e:-1+(4-2*e)*e,inCubic:e=>e*e*e,outCubic:e=>1-Math.pow(1-e,3),inOutCubic:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,outExpo:e=>e===1?1:1-Math.pow(2,-10*e),outBack:e=>1+2.70158*Math.pow(e-1,3)+1.70158*Math.pow(e-1,2),outElastic:e=>e===0||e===1?e:Math.pow(2,-10*e)*Math.sin((e*10-.75)*(2*Math.PI)/3)+1};function Ri(){let e=new Map;function t(i,r,a,c,l={}){let{duration:s=500,delay:d=0}=l,f=typeof l.ease=="function"?l.ease:Ko[l.ease]||Ko.outCubic,u=e.get(i);u&&u.resolve(!1);let h=r(),x=Array.isArray(c)||ArrayBuffer.isView(c),E=x?Array.from(h??c):Number(h??0),y=x?Array.from(c):Number(c);return new Promise(k=>{let b={start:performance.now()+d,resolve:S=>{e.delete(i),k(S)},update(S){let w=s>0?Ui((S-this.start)/s):1;if(w<0)return;let A=f(w);a(x?E.map((L,T)=>L+(y[T]-L)*A):E+(y-E)*A),w>=1&&this.resolve(!0)}};e.set(i,b)})}function n(i){for(let r of[...e.values()])r.update(i)}function o(i){if(i===void 0){for(let a of[...e.values()])a.resolve(!1);return}let r=e.get(i);r&&r.resolve(!1)}return{tween:t,update:n,cancel:o,get size(){return e.size}}}var Ui=e=>e<0?e:e>1?1:e;function Ii(e){let t;if(typeof e=="string")t=[{src:e}];else if(Array.isArray(e))t=e.map(i=>typeof i=="string"?{src:i}:{...i});else if(e&&typeof e=="object")t=[{...e}];else throw new ye("ShaderMate: expected a shader (string), a pass object, or an array of passes");if(!t.length)throw new ye("ShaderMate: no passes given");t.forEach((i,r)=>{var a,c,l,s,d;if(i.src==null&&(i.src=(s=(l=(c=(a=i.shader)!=null?a:i.frag)!=null?c:i.fragment)!=null?l:i.glsl)!=null?s:i.url),i.src==null)throw new ye(`Pass ${(d=i.name)!=null?d:r} has no shader source (use "shader")`);i.name==null&&(i.name=t.length===1?"main":"pass"+r),i.uniforms==null&&(i.uniforms={})}),t.some(i=>i.screen)||(t[t.length-1].screen=!0),t.filter(i=>i.screen).length>1&&console.warn("[ShaderMate] Multiple screen:true passes; last drawn wins.");let n=t.map(i=>i.name),o=n.filter((i,r)=>n.indexOf(i)!==r);if(o.length)throw new ye("Duplicate pass names: "+[...new Set(o)].join(", "));for(let i of t){let r=Array.isArray(i.channels)?i.channels:i.channels?[i.channels]:[];for(i.channels=r.slice(0,an).map(a=>lr(a,n,i.name));i.channels.length<an;)i.channels.push(null)}return t}var Fi=e=>typeof HTMLElement<"u"&&e instanceof HTMLElement,Di=e=>typeof ImageBitmap<"u"&&e instanceof ImageBitmap,Oi=e=>typeof WebGLTexture<"u"&&e instanceof WebGLTexture;function lr(e,t=[],n=""){if(e==null||e===!1)return null;if(typeof e=="string")return t.includes(e)?{pass:e}:{url:e};if(Fi(e)||Di(e))return{element:e};if(Oi(e))return{texture:e};let o={...e};return o.pass==null&&o.id!=null&&(o.pass=o.id),o.url==null&&o.image!=null&&(o.url=o.image),o.element==null&&o.canvas!=null&&(o.element=o.canvas),o.pass==null&&o.src!=null&&o.url==null&&o.video==null&&(o.url=o.src),o.pass!=null&&!t.includes(o.pass)&&console.warn(`[ShaderMate] Pass "${n}": channel references unknown pass "${o.pass}"`),o}function Yn(e){return/[\r\n]/.test(e)||/^\s*(void|#|precision|uniform|in |out |\/\/|\/\*)/.test(e)||/[{};]/.test(e)}var $i=e=>typeof WebGL2RenderingContext<"u"&&e instanceof WebGL2RenderingContext;function zi(e,t={}){let n=Object.assign({alpha:t.alpha!==!1,premultipliedAlpha:t.premultipliedAlpha!==!1,preserveDrawingBuffer:!!t.preserveDrawingBuffer,antialias:!!t.antialias,powerPreference:t.powerPreference||"default"},t.contextAttributes),o=t.webgl===void 0?"auto":String(t.webgl),i=null;if((o==="auto"||o==="2")&&(i=e.getContext("webgl2",n)),!i&&(o==="auto"||o==="1")&&(i=e.getContext("webgl",n)||e.getContext("experimental-webgl",n)),!i)throw new ye("WebGL not supported");return i}function Ni(e,t){let n={};return t?(n.EXT_color_buffer_float=e.getExtension("EXT_color_buffer_float"),n.EXT_color_buffer_half_float=e.getExtension("EXT_color_buffer_half_float"),n.OES_texture_float_linear=e.getExtension("OES_texture_float_linear")):(n.OES_texture_float=e.getExtension("OES_texture_float"),n.OES_texture_half_float=e.getExtension("OES_texture_half_float"),n.OES_texture_float_linear=e.getExtension("OES_texture_float_linear"),n.OES_texture_half_float_linear=e.getExtension("OES_texture_half_float_linear"),n.OES_standard_derivatives=e.getExtension("OES_standard_derivatives"),n.WEBGL_color_buffer_float=e.getExtension("WEBGL_color_buffer_float"),n.EXT_color_buffer_half_float=e.getExtension("EXT_color_buffer_half_float"),n.WEBGL_depth_texture=e.getExtension("WEBGL_depth_texture"),n.EXT_shader_texture_lod=e.getExtension("EXT_shader_texture_lod")),n}function Bi(e){let t=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),e.STATIC_DRAW),{bind(n){e.bindBuffer(e.ARRAY_BUFFER,t);let o=e.getAttribLocation(n,"a_position");o!==-1&&(e.enableVertexAttribArray(o),e.vertexAttribPointer(o,2,e.FLOAT,!1,0,0))},draw(){e.drawArrays(e.TRIANGLES,0,6)},dispose(){e.deleteBuffer(t)}}}function Gi(e,t){var n;let o=t.split(`
|
|
10
|
+
`,pi=(e,t)=>JSON.stringify({name:e||"Palette",colors:t.map(n=>wt(n).slice(1))},null,2)});function Ks(e){let t=String(e||"").trim(),n=/palette-list\/([a-z0-9-]+)/i.exec(t);return(n?n[1]:t).toLowerCase().replace(/\.(json|hex|gpl)$/,"")}async function hi(e,{fetch:t=globalThis.fetch}={}){let n=Ks(e);if(!/^[a-z0-9-]+$/.test(n))throw new Error("That does not look like a Lospec palette slug");let o=await t(`https://lospec.com/palette-list/${n}.json`);if(!o.ok)throw new Error(`Lospec returned ${o.status} for "${n}"`);let i=await o.json(),r=So(i);return{name:i.name||n,author:i.author||"",colors:r.colors,slug:n}}var mi=Ut(()=>{To()});function bi(e){let t=e.error?e.error.code:0,n=new Error(Js[t]||"the video could not be loaded");return n.code=t,e.error&&e.error.message&&(n.detail=e.error.message),n}async function Vt(e,{timeout:t=6e4}={}){if(e.error)throw bi(e);return e.readyState<1&&await gi(e,"loadedmetadata",t),e.readyState<2&&await gi(e,"loadeddata",t).catch(n=>{if(n.code)throw n}),e}async function yi(e){let t=new Uint8Array(await e.arrayBuffer()),n={avc1:"H.264",avc3:"H.264",hvc1:"H.265 (HEVC)",hev1:"H.265 (HEVC)",av01:"AV1",vp09:"VP9",vp08:"VP8",mp4v:"MPEG-4 Part 2",apcn:"ProRes",apch:"ProRes",apcs:"ProRes",apco:"ProRes",ap4h:"ProRes 4444",dvh1:"Dolby Vision",dvhe:"Dolby Vision"};for(let r=0;r+24<t.length;r++)if(t[r]===115&&t[r+1]===116&&t[r+2]===115&&t[r+3]===100){let a=String.fromCharCode(t[r+16],t[r+17],t[r+18],t[r+19]);if(n[a])return n[a]}let o=new TextDecoder("latin1").decode(t.subarray(0,Math.min(t.length,1<<20))),i=/V_(VP8|VP9|AV1|MPEG4\/ISO\/AVC|MPEGH\/ISO\/HEVC)/.exec(o);return i?{VP8:"VP8",VP9:"VP9",AV1:"AV1","MPEG4/ISO/AVC":"H.264","MPEGH/ISO/HEVC":"H.265 (HEVC)"}[i[1]]:""}async function xi(e){try{let t=new Uint8Array(await e.slice(0,12).arrayBuffer());if(t[0]===26&&t[1]===69&&t[2]===223&&t[3]===163){let n=new TextDecoder("latin1").decode(await e.slice(0,4194304).arrayBuffer());return/A_(OPUS|VORBIS|AAC|MPEG|AC3|EAC3|FLAC|PCM|DTS|TRUEHD|ALAC)/.test(n)}for(let n=0;n+8<=e.size;){let o=new DataView(await e.slice(n,n+16).arrayBuffer()),i=o.getUint32(0),r=String.fromCharCode(o.getUint8(4),o.getUint8(5),o.getUint8(6),o.getUint8(7));if(i===1?i=Number(o.getBigUint64(8)):i===0&&(i=e.size-n),i<8)return null;if(r==="moov"){let a=new Uint8Array(await e.slice(n,n+i).arrayBuffer());for(let c=4;c+16<=a.length;c++)if(a[c]===104&&a[c+1]===100&&a[c+2]===108&&a[c+3]===114&&a[c+12]===115&&a[c+13]===111&&a[c+14]===117&&a[c+15]===110)return!0;return!1}n+=i}return null}catch{return null}}async function zt(e,t){if(t=Math.max(0,Math.min(t,(e.duration||0)-1e-4)),Math.abs(e.currentTime-t)<1e-6&&e.readyState>=2)return;let n="requestVideoFrameCallback"in e?new Promise(i=>{e.requestVideoFrameCallback(()=>i()),setTimeout(i,500)}):null,o=Zs(e,"seeked");e.currentTime=t,await o,n&&await n}async function Hn(e,t=30){if(!("requestVideoFrameCallback"in e))return t;await Vt(e);let n={t:e.currentTime,muted:e.muted,paused:e.paused},o=[];try{e.muted=!0,await new Promise(a=>{let c=setTimeout(a,1200),l=(s,d)=>{o.push(d.mediaTime),o.length>=12?(clearTimeout(c),a()):e.requestVideoFrameCallback(l)};e.requestVideoFrameCallback(l),e.play().catch(()=>{clearTimeout(c),a()})})}finally{e.pause(),e.muted=n.muted,await zt(e,n.t).catch(()=>{})}let i=[];for(let a=1;a<o.length;a++){let c=o[a]-o[a-1];c>.001&&i.push(c)}if(i.length<3)return t;i.sort((a,c)=>a-c);let r=1/i[Math.floor(i.length/2)];for(let a of[12,15,23.976,24,25,29.97,30,48,50,59.94,60])if(Math.abs(r-a)<.6)return a;return Math.round(r)}function Ao({duration:e,fps:t,start:n=0,end:o=e,maxFrames:i=1/0}){let r=[],a=Math.min(i,Math.max(1,Math.floor((o-n)*t+1e-6)));for(let c=0;c<a;c++)r.push(n+(c+.5)/t);return r}async function ln(e,t){await Vt(e);let n=e.paused;e.pause();let o=Array.isArray(t.times)?t.times.filter(i=>Number.isFinite(i)).slice(0,t.maxFrames??1/0):Ao({duration:e.duration,...t});try{for(let i=0;i<o.length;i++){if(t.signal?.aborted)throw new DOMException("Aborted","AbortError");if(await zt(e,o[i]),t.signal?.aborted)throw new DOMException("Aborted","AbortError");await t.onFrame({index:i,time:o[i],total:o.length})}}finally{n||e.play().catch(()=>{})}return o.length}var Zs,Js,gi,un=Ut(()=>{Zs=(e,t,n=4e3)=>new Promise((o,i)=>{let r=setTimeout(()=>{e.removeEventListener(t,a),i(new Error(`Timed out waiting for "${t}"`))},n),a=()=>{clearTimeout(r),o()};e.addEventListener(t,a,{once:!0})}),Js={1:"loading was aborted",2:"a network error stopped the download",3:"the browser could not decode it",4:"this browser can't play this video's format"};gi=(e,t,n)=>new Promise((o,i)=>{let r=()=>{clearTimeout(l),e.removeEventListener(t,a),e.removeEventListener("error",c)},a=()=>{r(),o()},c=()=>{r(),i(bi(e))},l=setTimeout(()=>{r(),i(new Error(`no response from the video decoder after ${n/1e3} s`))},n);e.addEventListener(t,a,{once:!0}),e.addEventListener("error",c,{once:!0})})});async function ac(e){if(e instanceof ArrayBuffer)return e.slice(0);if(ArrayBuffer.isView(e))return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength);if(typeof Blob<"u"&&e instanceof Blob)return e.arrayBuffer();let t=typeof e=="string"?e:e&&(e.currentSrc||e.src);if(!t)throw new TypeError("decodeAudio() takes a File, Blob, ArrayBuffer, URL or <video>/<audio> element");let n=await fetch(t);if(!n.ok)throw new Error(`Couldn't load the audio: ${n.status} ${n.statusText}`);return n.arrayBuffer()}async function Li(e,t={}){if(typeof OfflineAudioContext>"u")return null;let n=t.sampleRate||Uo,o=await ac(e),i;try{i=await new OfflineAudioContext(1,1,n).decodeAudioData(o)}catch{return null}let r=Math.max(0,t.start||0),a=Math.min(i.duration,t.end>r?t.end:i.duration),c=Math.floor((a-r)*n);if(c<1)return null;let l=Math.min(t.channels||2,i.numberOfChannels),s=new OfflineAudioContext(l,c,n),d=s.createBufferSource();d.buffer=i,d.connect(s.destination),d.start(0,r,c/n);let h=await s.startRendering(),f=[];for(let p=0;p<l;p++)f.push(h.getChannelData(p));return{sampleRate:n,numberOfChannels:l,channels:f,duration:c/n}}async function Vn(e,t=Uo,n=2,o=128e3){if(typeof AudioEncoder>"u"||!Io[e])return null;let i=e==="opus"?[48e3]:[...new Set([t,48e3,44100])],r=[...new Set([o,128e3,192e3,16e4,96e3,0])];for(let a of i)for(let c of r){let l={codec:Io[e],sampleRate:a,numberOfChannels:n,...c?{bitrate:c}:{},...e==="aac"?{aac:{format:"aac"}}:{}};if((await AudioEncoder.isConfigSupported(l).catch(()=>({}))).supported)return l}return null}async function Xn(e,t=Uo,n=2){return!!await Vn(e,t,n)}async function sc(e,t){if(e.sampleRate===t)return e;let{numberOfChannels:n,channels:o}=e,i=Math.max(1,Math.round(o[0].length*t/e.sampleRate)),r=new OfflineAudioContext(n,i,t),a=r.createBuffer(n,o[0].length,e.sampleRate);for(let d=0;d<n;d++)a.copyToChannel(o[d],d);let c=r.createBufferSource();c.buffer=a,c.connect(r.destination),c.start();let l=await r.startRendering(),s=[];for(let d=0;d<n;d++)s.push(l.getChannelData(d));return{sampleRate:t,numberOfChannels:n,channels:s,duration:i/t}}async function Fo(e,t){if(typeof AudioEncoder>"u")throw new Error("This browser has no WebCodecs AudioEncoder");let n=t.config||{codec:Io[t.codec],sampleRate:e.sampleRate,numberOfChannels:e.numberOfChannels,bitrate:t.bitrate||128e3,...t.codec==="aac"?{aac:{format:"aac"}}:{}};n.sampleRate!==e.sampleRate&&(e=await sc(e,n.sampleRate));let{sampleRate:o,numberOfChannels:i,channels:r}=e,a=null,c=new AudioEncoder({output:(h,f)=>t.onChunk(h,f),error:h=>{a=h}});c.configure(n);let l=Number.isFinite(t.maxDuration)?Math.floor(t.maxDuration*o):1/0,s=Math.min(r[0].length,l),d=Math.round(o/10);for(let h=0;h<s&&!a;h+=d){let f=Math.min(d,s-h),p=new Float32Array(f*i);for(let M=0;M<i;M++)p.set(r[M].subarray(h,h+f),M*f);let b=new AudioData({format:"f32-planar",sampleRate:o,numberOfFrames:f,numberOfChannels:i,timestamp:Math.round(h*1e6/o),data:p});c.encode(b),b.close(),c.encodeQueueSize>16&&await new Promise(M=>setTimeout(M,0))}if(a||await c.flush().catch(h=>{a=h}),c.state!=="closed"&&c.close(),a)throw a}function Pi(e,t,n=312){let o=new Uint8Array(19);o.set([79,112,117,115,72,101,97,100]);let i=new DataView(o.buffer);return i.setUint8(8,1),i.setUint8(9,e),i.setUint16(10,n,!0),i.setUint32(12,t,!0),i.setInt16(16,0,!0),i.setUint8(18,0),o}function kn(e){if(!e||e.length<19||String.fromCharCode(...e.subarray(0,8))!=="OpusHead")return null;let t=new DataView(e.buffer,e.byteOffset,e.byteLength);return{channels:t.getUint8(9),preSkip:t.getUint16(10,!0),sampleRate:t.getUint32(12,!0)}}var Io,Uo,Wn=Ut(()=>{Io={aac:"mp4a.40.2",opus:"opus"},Uo=48e3});function tt(e,t){let n=new Yn;t(n);let o=n.out(),i=new Yn().u32(o.length+8).str(e).out(),r=new Uint8Array(o.length+8);return r.set(i),r.set(o,8),r}function cc(e,t){let n=qn(5,[...e]),o=qn(4,[64,21,0,0,0,...Ii(t),...Ii(t),...n]),i=qn(6,[2]);return Xe("esds",0,0,r=>r.bytes(qn(3,[0,2,0,...o,...i])))}function uc(e){if(!e||e.length<7||e[0]!==1)return!1;let t=5,n=e[t++]&31;if(!n)return!1;for(let i=0;i<n;i++){if(t+2>e.length)return!1;let r=e[t]<<8|e[t+1];if(t+=2,r<4||t+r>e.length)return!1;let a=e.subarray(t,t+r);if((a[0]&31)!==7||i===0&&(a[1]!==e[1]||a[2]!==e[2]||a[3]!==e[3]))return!1;t+=r}if(t>=e.length)return!1;let o=e[t++];if(!o)return!1;for(let i=0;i<o;i++){if(t+2>e.length)return!1;let r=e[t]<<8|e[t+1];if(t+=2,r<1||t+r>e.length||(e[t]&31)!==8)return!1;t+=r}return!0}function dc(e){let t=[],n=new DataView(e.buffer,e.byteOffset,e.byteLength);for(let o=0;o+4<=e.length;){let i=n.getUint32(o);if(o+=4,!i||o+i>e.length)break;t.push(e.subarray(o,o+i)),o+=i}return t}function fc(e){let t=[];for(let a=1;a<e.length;a++)a>=3&&e[a]===3&&e[a-1]===0&&e[a-2]===0||t.push(e[a]);let n=24,o=()=>{let a=t[n>>3]>>7-(n&7)&1;return n++,a},i=()=>{let a=0;for(;n<t.length*8&&!o();)a++;let c=0;for(let l=0;l<a;l++)c=c*2+o();return 2**a-1+c};i();let r=i();return r===3&&o(),{chroma:r,lumaBits:i(),chromaBits:i()}}function pc(e){let t=dc(e),n=t.filter(r=>(r[0]&31)===7),o=t.filter(r=>(r[0]&31)===8);if(!n.length||!o.length||n[0].length<4)return null;let i=[1,n[0][1],n[0][2],n[0][3],255,224|n.length];for(let r of n)i.push(r.length>>8,r.length&255,...r);i.push(o.length);for(let r of o)i.push(r.length>>8,r.length&255,...r);if(lc.has(n[0][1])){let r=fc(n[0]);i.push(252|r.chroma&3,248|r.lumaBits&7,248|r.chromaBits&7,0)}return Uint8Array.from(i)}function Do(e){let t=[];for(let n of e){let o=t[t.length-1];o&&o[1]===n?o[0]++:t.push([1,n])}return t}function zo({width:e,height:t,timescale:n=9e4,audio:o=null}){let i=[],r=[],a=null,c=null;function l(){if(!o||!r.length)return null;let s=o.sampleRate,d=o.numberOfChannels,h=r[0].ts,f=r.map(v=>Math.round((v.ts-h)*s/1e6)),p=Math.round(r[r.length-1].dur*s/1e6)||(o.codec==="aac"?1024:960),b=f.map((v,k)=>k+1<f.length?Math.max(1,f[k+1]-v):p),M;if(o.codec==="aac"){if(!c)throw new Error("The audio encoder gave no AAC decoder configuration (AudioSpecificConfig)");M=tt("mp4a",v=>{v.zeros(6).u16(1).zeros(8).u16(d).u16(16).u16(0).u16(0).u32(s<=65535?s*65536:0),v.bytes(cc(c,o.bitrate||128e3))})}else{let v=kn(c),k=v?v.preSkip:312;M=tt("Opus",x=>{x.zeros(6).u16(1).zeros(8).u16(d).u16(16).u16(0).u16(0).u32(48e3*65536),x.bytes(tt("dOps",w=>w.u8(0).u8(d).u16(k).u32(s).u16(0).u8(0)))})}return{rate:s,durs:b,entry:M,mediaDur:b.reduce((v,k)=>v+k,0)}}return{addChunk(s,d){d&&d.decoderConfig&&d.decoderConfig.description&&!a&&(a=Ri(d.decoderConfig.description));let h=new Uint8Array(s.byteLength);s.copyTo(h),i.push({data:h,key:s.type==="key",ts:s.timestamp,dur:s.duration||0})},addSample(s,{key:d,timestamp:h,duration:f}){i.push({data:s,key:!!d,ts:h,dur:f||0})},setDescription(s){a=s},addAudioChunk(s,d){d&&d.decoderConfig&&d.decoderConfig.description&&!c&&(c=Ri(d.decoderConfig.description));let h=new Uint8Array(s.byteLength);s.copyTo(h),r.push({data:h,ts:s.timestamp,dur:s.duration||0})},addAudioSample(s,{timestamp:d,duration:h}){r.push({data:s,ts:d,dur:h||0})},setAudioDescription(s){c=s},finish(){if(!i.length)throw new Error("No video frames were encoded");if(!uc(a)){let W=i.find(V=>V.key)||i[0];a=pc(W.data)||a}if(!a)throw new Error("The encoder gave no H.264 decoder configuration (avcC)");let s=W=>Math.round(W*n/1e6),d=i.map(W=>s(W.ts)),h=d.slice().sort((W,V)=>W-V),f=s(i[i.length-1].dur)||(h.length>1?h[h.length-1]-h[h.length-2]:s(33333)),p=h.map((W,V)=>V+1<h.length?h[V+1]-W:f),b=d.map((W,V)=>W-h[V]),M=b.some(W=>W!==0),v=p.reduce((W,V)=>W+V,0),k=Math.round(v*1e3/n),x=Do(p),w=Do(b),y=i.map((W,V)=>W.key?V+1:0).filter(Boolean),A=i.reduce((W,V)=>W+V.data.length,0),_=l(),P=_?Math.round(_.mediaDur*1e3/_.rate):0,I=_?r.reduce((W,V)=>W+V.data.length,0):0,H=Math.max(k,P),T=A+I,O=tt("ftyp",W=>W.str("isom").u32(512).str("isom").str("iso2").str("avc1").str("mp41")),D=()=>tt("dinf",W=>W.bytes(Xe("dref",0,0,V=>{V.u32(1),V.bytes(Xe("url ",0,1,()=>{}))}))),F=W=>Xe("stsc",0,0,V=>V.u32(1).u32(1).u32(W).u32(1)),G=W=>Xe("stsz",0,0,V=>{V.u32(0).u32(W.length);for(let Ce of W)V.u32(Ce.data.length)}),N=W=>Xe("stco",0,0,V=>V.u32(1).u32(W)),ve=W=>tt("moov",V=>{V.bytes(Xe("mvhd",0,0,Ce=>{Ce.u32(0).u32(0).u32(1e3).u32(H).u32(65536).u16(256).zeros(10),Oo.forEach(xe=>Ce.u32(xe)),Ce.zeros(24).u32(_?3:2)})),V.bytes(tt("trak",Ce=>{Ce.bytes(Xe("tkhd",0,3,xe=>{xe.u32(0).u32(0).u32(1).u32(0).u32(k).zeros(8).u16(0).u16(0).u16(0).u16(0),Oo.forEach(z=>xe.u32(z)),xe.u32(e<<16).u32(t<<16)})),Ce.bytes(tt("mdia",xe=>{xe.bytes(Xe("mdhd",0,0,z=>z.u32(0).u32(0).u32(n).u32(v).u16(21956).u16(0))),xe.bytes(Xe("hdlr",0,0,z=>z.u32(0).str("vide").zeros(12).str("VideoHandler").u8(0))),xe.bytes(tt("minf",z=>{z.bytes(Xe("vmhd",0,1,ge=>ge.u16(0).u16(0).u16(0).u16(0))),z.bytes(D()),z.bytes(tt("stbl",ge=>{ge.bytes(Xe("stsd",0,0,be=>{be.u32(1),be.bytes(tt("avc1",pe=>{pe.zeros(6).u16(1).zeros(16).u16(e).u16(t).u32(4718592).u32(4718592).u32(0).u16(1);let Se=$o.encode("image-to-pixel").slice(0,31);pe.u8(Se.length).bytes(Se).zeros(31-Se.length).u16(24).u16(65535),pe.bytes(tt("avcC",Ie=>Ie.bytes(a)))}))})),ge.bytes(Xe("stts",0,0,be=>{be.u32(x.length);for(let[pe,Se]of x)be.u32(pe).u32(Se)})),M&&ge.bytes(Xe("ctts",1,0,be=>{be.u32(w.length);for(let[pe,Se]of w)be.u32(pe).u32(Se>>>0)})),y.length<i.length&&ge.bytes(Xe("stss",0,0,be=>{be.u32(y.length);for(let pe of y)be.u32(pe)})),ge.bytes(F(i.length)),ge.bytes(G(i)),ge.bytes(N(W))}))}))}))})),_&&V.bytes(tt("trak",Ce=>{Ce.bytes(Xe("tkhd",0,3,xe=>{xe.u32(0).u32(0).u32(2).u32(0).u32(P).zeros(8).u16(0).u16(1).u16(256).u16(0),Oo.forEach(z=>xe.u32(z)),xe.u32(0).u32(0)})),Ce.bytes(tt("mdia",xe=>{xe.bytes(Xe("mdhd",0,0,z=>z.u32(0).u32(0).u32(_.rate).u32(_.mediaDur).u16(21956).u16(0))),xe.bytes(Xe("hdlr",0,0,z=>z.u32(0).str("soun").zeros(12).str("SoundHandler").u8(0))),xe.bytes(tt("minf",z=>{z.bytes(Xe("smhd",0,0,ge=>ge.u16(0).u16(0))),z.bytes(D()),z.bytes(tt("stbl",ge=>{ge.bytes(Xe("stsd",0,0,pe=>{pe.u32(1),pe.bytes(_.entry)}));let be=Do(_.durs);ge.bytes(Xe("stts",0,0,pe=>{pe.u32(be.length);for(let[Se,Ie]of be)pe.u32(Se).u32(Ie)})),ge.bytes(F(r.length)),ge.bytes(G(r)),ge.bytes(N(W+A))}))}))}))}))}),ke=ve(0).length,fe=O.length+ke+8;if(fe+T>4294967295)throw new Error("Video is larger than 4 GB");let se=ve(fe),de=new Uint8Array(fe+T);de.set(O,0),de.set(se,O.length),new DataView(de.buffer).setUint32(O.length+se.length,T+8),de.set($o.encode("mdat"),O.length+se.length+4);let me=fe;for(let W of i)de.set(W.data,me),me+=W.data.length;if(_)for(let W of r)de.set(W.data,me),me+=W.data.length;return de}}}var $o,Yn,Xe,Oo,Ri,qn,Ii,lc,Ui=Ut(()=>{Wn();$o=new TextEncoder,Yn=class{constructor(){this.parts=[],this.size=0}u8(t){return this.bytes([t&255])}u16(t){return this.bytes([t>>>8&255,t&255])}u32(t){return this.bytes([t>>>24&255,t>>>16&255,t>>>8&255,t&255])}str(t){return this.bytes($o.encode(t))}bytes(t){let n=t instanceof Uint8Array?t:Uint8Array.from(t);return this.parts.push(n),this.size+=n.length,this}zeros(t){return this.bytes(new Uint8Array(t))}out(){let t=new Uint8Array(this.size),n=0;for(let o of this.parts)t.set(o,n),n+=o.length;return t}};Xe=(e,t,n,o)=>tt(e,i=>{i.u8(t).u8(n>>16).u8(n>>8).u8(n),o(i)}),Oo=[65536,0,0,0,65536,0,0,0,1073741824],Ri=e=>new Uint8Array(e instanceof ArrayBuffer?e:e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)),qn=(e,t)=>[e,t.length,...t],Ii=e=>[e>>>24&255,e>>>16&255,e>>>8&255,e&255];lc=new Set([100,110,122,244,44,83,86,118,128,138,139,134,135])});function mc(e){let t=new Uint8Array(8);t[0]=1;let n=e;for(let o=7;o>=1;o--)t[o]=n%256,n=Math.floor(n/256);return t}function Di(e){let t=[];for(let n=e;n>0;n=Math.floor(n/256))t.unshift(n%256);return t}function Kn(e){let t=0;for(let i of e)t+=i.length;let n=new Uint8Array(t),o=0;for(let i of e)n.set(i,o),o+=i.length;return n}function No({width:e,height:t,codec:n="vp9",fps:o=0,audio:i=null}){if(i&&i.codec&&i.codec!=="opus")throw new Error(`WebM audio must be Opus, not ${i.codec}`);let r=[],a=[],c=null,l=null;return{addChunk(s,d){d&&d.decoderConfig&&d.decoderConfig.description&&!c&&(c=Oi(d.decoderConfig.description));let h=new Uint8Array(s.byteLength);s.copyTo(h),r.push({data:h,key:s.type==="key",ms:s.timestamp/1e3})},addFrame(s,{key:d,timestamp:h}){r.push({data:s,key:!!d,ms:h/1e3})},addAudioChunk(s,d){d&&d.decoderConfig&&d.decoderConfig.description&&!l&&(l=Oi(d.decoderConfig.description));let h=new Uint8Array(s.byteLength);s.copyTo(h),a.push({data:h,ms:s.timestamp/1e3,dms:(s.duration||0)/1e3})},addAudioFrame(s,{timestamp:d,duration:h}){a.push({data:s,ms:d/1e3,dms:(h||0)/1e3})},finish(){if(!r.length)throw new Error("No video frames were encoded");let s=!!(i&&a.length),d=o?1e3/o:r.length>1?(r[r.length-1].ms-r[0].ms)/(r.length-1):33.333,h=r[r.length-1].ms+d;if(s){let F=a[a.length-1];h=Math.max(h,F.ms+(F.dms||20))}let f=at(ee.Info,[Pe(ee.TimestampScale,1e6),Fi(ee.Duration,h),Mn(ee.MuxingApp,"image-to-pixel"),Mn(ee.WritingApp,"image-to-pixel")]),p=[at(ee.TrackEntry,[Pe(ee.TrackNumber,fn),Pe(ee.TrackUID,fn),Pe(ee.TrackType,1),Pe(ee.FlagLacing,0),Mn(ee.CodecID,gc[n]||n),...c?[Wt(ee.CodecPrivate,c)]:[],Pe(ee.DefaultDuration,Math.round(d*1e6)),at(ee.Video,[Pe(ee.PixelWidth,e),Pe(ee.PixelHeight,t)])])];if(s){let F=kn(l)?l:Pi(i.numberOfChannels,i.sampleRate),G=kn(F).preSkip;p.push(at(ee.TrackEntry,[Pe(ee.TrackNumber,Bo),Pe(ee.TrackUID,Bo),Pe(ee.TrackType,2),Pe(ee.FlagLacing,0),Mn(ee.CodecID,"A_OPUS"),Wt(ee.CodecPrivate,F),Pe(ee.CodecDelay,Math.round(G*1e9/48e3)),Pe(ee.SeekPreRoll,8e7),at(ee.Audio,[Fi(ee.SamplingFrequency,i.sampleRate),Pe(ee.Channels,i.numberOfChannels)])]))}let b=at(ee.Tracks,p),M=r.map((F,G)=>({track:fn,data:F.data,key:F.key,ms:F.ms,order:G}));s&&a.forEach((F,G)=>M.push({track:Bo,data:F.data,key:!0,ms:F.ms,order:r.length+G})),s&&M.sort((F,G)=>F.ms-G.ms||F.track-G.track||F.order-G.order);let v=[],k=null;for(let F of M){let G=Math.round(F.ms),N=F.track===fn&&F.key;(!k||N||G-k.start>3e4)&&(k={start:G,key:N,blocks:[]},v.push(k));let ve=new Uint8Array(4);ve[0]=128|F.track,new DataView(ve.buffer).setInt16(1,G-k.start),ve[3]=F.key?128:0,k.blocks.push(Wt(ee.SimpleBlock,Kn([ve,F.data])))}let x=v.map(F=>at(ee.Cluster,[Pe(ee.Timestamp,F.start),...F.blocks])),w=(F,G,N)=>at(ee.SeekHead,[[ee.Info,F],[ee.Tracks,G],[ee.Cues,N]].map(([ve,ke])=>at(ee.Seek,[Wt(ee.SeekID,Uint8Array.from(Di(ve))),Pe(ee.SeekPosition,ke,8)]))),A=w(0,0,0).length,_=A+f.length,P=_+b.length,I=[];v.forEach((F,G)=>{F.key&&I.push(at(ee.CuePoint,[Pe(ee.CueTime,F.start),at(ee.CueTrackPositions,[Pe(ee.CueTrack,fn),Pe(ee.CueClusterPosition,P)])])),P+=x[G].length});let H=at(ee.Cues,I.length?I:[at(ee.CuePoint,[Pe(ee.CueTime,0),at(ee.CueTrackPositions,[Pe(ee.CueTrack,fn),Pe(ee.CueClusterPosition,_+b.length)])])]),T=P,O=at(ee.EBML,[Pe(ee.EBMLVersion,1),Pe(ee.EBMLReadVersion,1),Pe(ee.EBMLMaxIDLength,4),Pe(ee.EBMLMaxSizeLength,8),Mn(ee.DocType,"webm"),Pe(ee.DocTypeVersion,4),Pe(ee.DocTypeReadVersion,2)]),D=at(ee.Segment,[w(A,_,T),f,b,...x,H]);return Kn([O,D])}}}var hc,Wt,Pe,Mn,Fi,at,ee,gc,fn,Bo,Oi,$i=Ut(()=>{Wn();hc=new TextEncoder;Wt=(e,t)=>Kn([Uint8Array.from(Di(e)),mc(t.length),t]),Pe=(e,t,n=0)=>{let o=[];for(let i=t;i>0||o.length===0;i=Math.floor(i/256))o.unshift(i%256);for(;o.length<n;)o.unshift(0);return Wt(e,Uint8Array.from(o))},Mn=(e,t)=>Wt(e,hc.encode(t)),Fi=(e,t)=>{let n=new Uint8Array(8);return new DataView(n.buffer).setFloat64(0,t),Wt(e,n)},at=(e,t)=>Wt(e,Kn(t)),ee={EBML:440786851,EBMLVersion:17030,EBMLReadVersion:17143,EBMLMaxIDLength:17138,EBMLMaxSizeLength:17139,DocType:17026,DocTypeVersion:17031,DocTypeReadVersion:17029,Segment:408125543,SeekHead:290298740,Seek:19899,SeekID:21419,SeekPosition:21420,Info:357149030,TimestampScale:2807729,Duration:17545,MuxingApp:19840,WritingApp:22337,Tracks:374648427,TrackEntry:174,TrackNumber:215,TrackUID:29637,TrackType:131,FlagLacing:156,CodecID:134,CodecPrivate:25506,DefaultDuration:2352003,Video:224,PixelWidth:176,PixelHeight:186,CodecDelay:22186,SeekPreRoll:22203,Audio:225,SamplingFrequency:181,Channels:159,Cluster:524531317,Timestamp:231,SimpleBlock:163,Cues:475249515,CuePoint:187,CueTime:179,CueTrackPositions:183,CueTrack:247,CueClusterPosition:241},gc={vp8:"V_VP8",vp9:"V_VP9",av1:"V_AV1"},fn=1,Bo=2,Oi=e=>new Uint8Array(e instanceof ArrayBuffer?e:e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength))});var Go={};ca(Go,{audioCodecSupported:()=>Xn,createMp4Muxer:()=>zo,createVideoEncoder:()=>Gi,createWebmMuxer:()=>No,decodeAudio:()=>Li,encodeAudio:()=>Fo,encodeVideo:()=>xc,estimateFps:()=>Hn,findAudioConfig:()=>Vn,forEachFrame:()=>ln,frameTimes:()=>Ao,seekTo:()=>zt,videoReady:()=>Vt,videoSupport:()=>bc});async function bc(e=640,t=480){let n={mp4:!1,webm:!1,webcodecs:typeof VideoEncoder<"u",aac:!1,opus:!1};if(n.webcodecs){for(let o of Bi)if((await VideoEncoder.isConfigSupported({codec:o,width:e,height:t}).catch(()=>({}))).supported){n.mp4=!0;break}for(let[o]of Ni)if((await VideoEncoder.isConfigSupported({codec:o,width:e,height:t}).catch(()=>({}))).supported){n.webm=!0;break}}return n.aac=await Xn("aac"),n.opus=await Xn("opus"),n}async function yc(e,t,n){let o=e==="mp4"?["aac","opus"]:["opus"];for(let i of o){let r=await Vn(i,t.sampleRate,t.numberOfChannels,n);if(r)return{codec:i,config:r}}return null}async function Gi(e){let t=Math.max(1,Math.round(e.scale||1)),n=zi(e.width*t),o=zi(e.height*t),i=e.fps||30,r=e.bitrate||Math.min(2e7,Math.max(2e6,n*o*i*.15));if(typeof VideoEncoder>"u")throw new Error("This browser has no WebCodecs VideoEncoder. Export a GIF or PNG sequence instead.");let a=null,c=null,l=e.format==="mp4"?Bi.map(y=>[y,"avc"]):Ni;for(let[y,A]of l)if((await VideoEncoder.isConfigSupported({codec:y,width:n,height:o,bitrate:r,framerate:i}).catch(()=>({}))).supported){a=y,c=A;break}if(!a)throw new Error(`No ${e.format.toUpperCase()} encoder available in this browser at ${n}\xD7${o}.`);let s=e.audio&&e.audio.channels&&e.audio.channels.length?e.audio:null,d=s?await yc(e.format,s,e.audioBitrate||128e3):null,h=d?d.codec:null,f=d?{codec:h,sampleRate:d.config.sampleRate,numberOfChannels:d.config.numberOfChannels,bitrate:d.config.bitrate||128e3}:null,p=e.format==="mp4"?zo({width:n,height:o,audio:f}):No({width:n,height:o,codec:c,fps:i,audio:f}),b=null,M=new VideoEncoder({output:(y,A)=>p.addChunk(y,A),error:y=>{b=y}});M.configure({codec:a,width:n,height:o,bitrate:r,framerate:i,latencyMode:"quality",...e.format==="mp4"?{avc:{format:"avc"}}:{}});let v=new OffscreenCanvas(n,o),k=v.getContext("2d"),x=0,w=1e6/i;return{width:n,height:o,codec:a,audioCodec:h,async add(y){if(b)throw b;let A=t>1?jt(y,t):y;k.fillStyle="#000",k.fillRect(0,0,n,o),k.putImageData(new ImageData(new Uint8ClampedArray(A.data),A.width,A.height),0,0);let _=new VideoFrame(v,{timestamp:Math.round(x*w),duration:Math.round(w)});M.encode(_,{keyFrame:x%Math.max(1,Math.round(i*2))===0}),_.close(),x++,M.encodeQueueSize>8&&await new Promise(P=>setTimeout(P,0))},async finish(){if(await M.flush(),b)throw b;return M.close(),h&&x>0&&await Fo(s,{config:d.config,maxDuration:x/i,onChunk:(y,A)=>p.addAudioChunk(y,A)}),new Blob([p.finish()],{type:e.format==="mp4"?"video/mp4":"video/webm"})}}}async function xc(e,t){let n=await Gi({...t,width:e[0].width,height:e[0].height});for(let o of e)await n.add(o);return n.finish()}var Bi,Ni,zi,Ho=Ut(()=>{Ui();$i();Wn();Jt();un();Bi=["avc1.640033","avc1.4d0033","avc1.42003e","avc1.640028","avc1.42001f"],Ni=[["vp09.00.10.08","vp9"],["vp8","vp8"]];zi=e=>e+(e&1)});var pn=[{id:"1-bit-monitor",name:"1-Bit Monitor",author:"",colors:["222323","f0f6f0"]},{id:"apollo",name:"Apollo",author:"AdamCYounis",colors:["172038","253a5e","3c5e8b","4f8fba","73bed3","a4dddb","19332d","25562e","468232","75a743","a8ca58","d0da91","4d2b32","7a4841","ad7757","c09473","d7b594","e7d5b3","341c27","602c2c","884b2b","be772b","de9e41","e8c170","241527","411d31","752438","a53030","cf573c","da863e","1e1d39","402751","7a367b","a23e8c","c65197","df84a5","090a14","10141f","151d28","202e37","394a50","577277","819796","a8b5b2","c7cfcc","ebede9"]},{id:"batpalette",name:"Batpalette",author:"el Rojaz",colors:["000000","7f7f7f","ffffff","681e99","3f48cc","88ff82","bfa621","cc3d18"]},{id:"beached-boogaloo",name:"Beached Boogaloo",author:".tomais",colors:["ff0b20","8f0434","500037","a0ff00","57e71e","0ea717","057833","2cdeef","2483e7","153ab7","0d0a87","ff0b88","a60fff","6409cf","eaef30","ff880b","b75308","802202","000000","231940","514378","ffffff","73a3a7","366770","f7b771","c77650","974c38","873939","601e2c","300c1f"]},{id:"cc-29",name:"CC-29",author:"Alpha6",colors:["f2f0e5","b8b5b9","868188","646365","45444f","3a3858","212123","352b42","43436a","4b80ca","68c2d3","a2dcc7","ede19e","d3a068","b45252","6a536e","4b4158","80493a","a77b5b","e5ceb4","c2d368","8ab060","567b79","4e584a","7b7243","b2b47e","edc8c4","cf8acb","5f556a"]},{id:"cga-16",name:"CGA 16",author:"",colors:["000000","0000aa","00aa00","00aaaa","aa0000","aa00aa","aa5500","aaaaaa","555555","5555ff","55ff55","55ffff","ff5555","ff55ff","ffff55","ffffff"]},{id:"chaotic-neutral",name:"Chaotic neutral",author:"Dodecahedron \u2DFD",colors:["e1d4cb","c19f90","a56457","6d504d","484044","392b29","31312f","d8eef0","97999f","81a4c0","6a7f92","415973","43425a","45334b","4b1f40","671087","955ab9"]},{id:"endesga-32",name:"Endesga 32",author:"ENDESGA",colors:["be4a2f","d77643","ead4aa","e4a672","b86f50","733e39","3e2731","a22633","e43b44","f77622","feae34","fee761","63c74d","3e8948","265c42","193c3e","124e89","0099db","2ce8f5","ffffff","c0cbdc","8b9bb4","5a6988","3a4466","262b44","181425","ff0044","68386c","b55088","f6757a","e8b796","c28569"]},{id:"fantasy-24",name:"Fantasy 24",author:"",colors:["1f240a","39571c","a58c27","efac28","efd8a1","ab5c1c","183f39","ef692f","efb775","a56243","773421","724113","2a1d0d","392a1c","684c3c","927e6a","276468","ef3a0c","45230d","3c9f9c","9b1a0a","36170c","550f0a","300f0a"]},{id:"game-boy-dmg",name:"Game Boy (DMG)",author:"",colors:["0f380f","306230","8bac0f","9bbc0f"]},{id:"grayscale-4",name:"Grayscale 4",author:"",colors:["000000","555555","aaaaaa","ffffff"]},{id:"hidden-library",name:"Hidden Library",author:"Pixel Hoo",colors:["100b2a","2a213a","314743","65856d","adca9a","ecfeca","582d27","974133","d67654","5d3441","a3685b","ffb379","ffe6a9","ffffff"]},{id:"intacto14",name:"Intacto14",author:"Anubi",colors:["221529","4b5561","879ba3","cbf5ef","62b4de","5660d6","5b29a6","d64562","f2735c","edbb8e","ab6375","522152","37ada2","8cde8c"]},{id:"journey",name:"Journey",author:"\u{1F34D}PineappleOnPizza\u{1F34D}",colors:["050914","110524","3b063a","691749","9c3247","d46453","f5a15d","ffcf8e","ff7a7d","ff417d","d61a88","94007a","42004e","220029","100726","25082c","3d1132","73263d","bd4035","ed7b39","ffb84a","fff540","c6d831","77b02a","429058","2c645e","153c4a","052137","0e0421","0c0b42","032769","144491","488bd4","78d7ff","b0fff1","faffff","c7d4e1","928fb8","5b537d","392946","24142c","0e0f2c","132243","1a466b","10908e","28c074","3dff6e","f8ffb8","f0c297","cf968c","8f5765","52294b","0f022e","35003b","64004c","9b0e3e","d41e3c","ed4c40","ff9757","d4662f","9c341a","691b22","450c28","2d002e"]},{id:"lospec500",name:"Lospec500",author:"",colors:["10121c","2c1e31","6b2643","ac2847","ec273f","94493a","de5d3a","e98537","f3a833","4d3533","6e4c30","a26d3f","ce9248","dab163","e8d282","f7f3b7","1e4044","006554","26854c","5ab552","9de64e","008b8b","62a477","a6cb96","d3eed3","3e3b65","3859b3","3388de","36c5f4","6dead6","5e5b8c","8c78a5","b0a7b8","deceed","9a4d76","c878af","cc99ff","fa6e79","ffa2ac","ffd1d5","f6e8e0","ffffff"]},{id:"nyx8",name:"Nyx8",author:"Javier Guerrero",colors:["08141e","0f2a3f","20394f","4e495f","816271","997577","c3a38a","f6d6bd"]},{id:"oil-6",name:"Oil 6",author:"",colors:["fbf5ef","f2d3ab","c69fa5","8b6d9c","494d7e","272744"]},{id:"pico-8",name:"PICO-8",author:"",colors:["000000","1d2b53","7e2553","008751","ab5236","5f574f","c2c3c7","fff1e8","ff004d","ffa300","ffec27","00e436","29adff","83769c","ff77a8","ffccaa"]},{id:"resurrect-64",name:"Resurrect 64",author:"Kerrie Lake",colors:["2e222f","3e3546","625565","966c6c","ab947a","694f62","7f708a","9babb2","c7dcd0","ffffff","6e2727","b33831","ea4f36","f57d4a","ae2334","e83b3b","fb6b1d","f79617","f9c22b","7a3045","9e4539","cd683d","e6904e","fbb954","4c3e24","676633","a2a947","d5e04b","fbff86","165a4c","239063","1ebc73","91db69","cddf6c","313638","374e4a","547e64","92a984","b2ba90","0b5e65","0b8a8f","0eaf9b","30e1b9","8ff8e2","323353","484a77","4d65b4","4d9be6","8fd3ff","45293f","6b3e75","905ea9","a884f3","eaaded","753c54","a24b6f","cf657f","ed8099","831c5d","c32454","f04f78","f68181","fca790","fdcbb0"]},{id:"slso8",name:"SLSO8",author:"Luis Miguel Maldonado",colors:["0d2b45","203c56","544e68","8d697a","d08159","ffaa5e","ffd4a3","ffecd6"]},{id:"sweet-canyon-extended-64",name:"Sweet Canyon Extended 64",author:"Mr Slime",colors:["0f0e11","2d2c33","40404a","51545c","6b7179","7c8389","a8b2b6","d5d5d5","eeebe0","f1dbb1","eec99f","e1a17e","cc9562","ab7b49","9a643a","86482f","783a29","6a3328","541d29","42192c","512240","782349","8b2e5d","a93e89","d062c8","ec94ea","f2bdfc","eaebff","a2fafa","64e7e7","54cfd8","2fb6c3","2c89af","25739d","2a5684","214574","1f2966","101445","3c0d3b","66164c","901f3d","bb3030","dc473c","ec6a45","fb9b41","f0c04c","f4d66e","fffb76","ccf17a","97d948","6fba3b","229443","1d7e45","116548","0c4f3f","0a3639","251746","48246d","69189c","9f20c0","e527d2","ff51cf","ff7ada","ff9edb"]},{id:"sweetie-16",name:"Sweetie 16",author:"",colors:["1a1c2c","5d275d","b13e53","ef7d57","ffcd75","a7f070","38b764","257179","29366f","3b5dc9","41a6f6","73eff7","f4f4f4","94b0c2","566c86","333c57"]},{id:"toxic-haze",name:"Toxic Haze",author:"sillyTheJester",colors:["e5ff00","b8d14a","9ab06e","708763","4c5c52","393e40","242424"]},{id:"vinik24",name:"Vinik24",author:"Vinik",colors:["000000","6f6776","9a9a97","c5ccb8","8b5580","c38890","a593a5","666092","9a4f50","c28d75","7ca1c0","416aa3","8d6268","be955c","68aca9","387080","6e6962","93a167","6eaa78","557064","9d9f7f","7e9e99","5d6872","433455"]}];function io(e){let t=String(e||"").toLowerCase();return pn.find(n=>n.id===t||n.name.toLowerCase()===t)||null}Ot();var Pn=1,Ln=2048,mn=[{id:"none",label:"None",kind:"none"},{id:"bayer2",label:"Bayer 2\xD72",kind:"ordered"},{id:"bayer4",label:"Bayer 4\xD74",kind:"ordered"},{id:"bayer8",label:"Bayer 8\xD78",kind:"ordered"},{id:"bayer16",label:"Bayer 16\xD716",kind:"ordered"},{id:"cluster4",label:"Clustered dot 4\xD74",kind:"ordered"},{id:"cluster8",label:"Clustered dot 8\xD78",kind:"ordered"},{id:"lines",label:"Horizontal lines",kind:"ordered"},{id:"bluenoise",label:"Blue noise",kind:"ordered"},{id:"custom",label:"Custom matrix",kind:"ordered"},{id:"floyd-steinberg",label:"Floyd\u2013Steinberg",kind:"diffusion"},{id:"atkinson",label:"Atkinson",kind:"diffusion"},{id:"sierra-lite",label:"Sierra Lite",kind:"diffusion"},{id:"sierra",label:"Sierra",kind:"diffusion"},{id:"burkes",label:"Burkes",kind:"diffusion"},{id:"jarvis",label:"Jarvis\u2013Judice\u2013Ninke",kind:"diffusion"},{id:"stucki",label:"Stucki",kind:"diffusion"}],Rn=e=>(mn.find(t=>t.id===e)||{kind:"none"}).kind;var la=Object.freeze({version:Pn,size:{mode:"width",width:96,height:0,block:8,resample:"box"},adjust:{brightness:0,contrast:0,saturation:0,hue:0,gamma:1},frame:{aspect:"original",zoom:1,x:.5,y:.5},palette:{source:"builtin",id:"endesga-32",name:"Endesga 32",colors:[],count:16,distance:"oklab"},dither:{method:"bayer4",strength:.6,matrix:null},alpha:{threshold:.5},cleanup:{orphans:!1,smooth:!1},outline:{mode:"none",color:"#000000",corners:!1},export:{size:"scale",scale:4,indexed:!0,grid:!1,gridColor:"#000000"}}),ft=(e,t,n,o)=>{let i=Number(e);return Number.isFinite(i)?Math.min(n,Math.max(t,i)):o},Yt=(e,t,n)=>t.includes(e)?e:n,hn=(e,t)=>typeof e=="boolean"?e:t;function Dt(){return Tt({})}function Tt(e={}){let t=la,n=e||{},o={},i=n.size||{},r=n.adjust||{},a=n.palette||{},c=n.dither||{},l=n.alpha||{},s=n.cleanup||{},d=n.outline||{},h=n.export||{};o.version=Pn,o.size={mode:Yt(i.mode,["width","block"],t.size.mode),width:Math.round(ft(i.width,1,Ln,t.size.width)),height:Math.round(ft(i.height,0,Ln,t.size.height)),block:ft(i.block,1,256,t.size.block),resample:Yt(i.resample,["box","nearest"],t.size.resample)},o.adjust={brightness:ft(r.brightness,-1,1,0),contrast:ft(r.contrast,-1,1,0),saturation:ft(r.saturation,-1,1,0),hue:ft(r.hue,-180,180,0),gamma:ft(r.gamma,.2,5,1)};let f=n.frame||{};o.frame={aspect:Yt(f.aspect,rn.map(M=>M.id),"original"),zoom:ft(f.zoom,1,8,1),x:ft(f.x,0,1,.5),y:ft(f.y,0,1,.5)};let p=Yt(a.source,["builtin","custom","extract","none"],t.palette.source);if(o.palette={source:p,id:typeof a.id=="string"?a.id:p==="builtin"?t.palette.id:"",name:typeof a.name=="string"?a.name:"",colors:[],count:Math.round(ft(a.count,2,256,t.palette.count)),distance:Yt(a.distance,["oklab","rgb"],t.palette.distance)},p==="builtin"){let M=io(o.palette.id)||io(t.palette.id);o.palette.id=M.id,o.palette.name=M.name,o.palette.colors=M.colors.map(v=>"#"+v)}else p==="custom"?(o.palette.colors=(Array.isArray(a.colors)?a.colors:[]).filter(An).map(wt).slice(0,256),o.palette.colors.length||(o.palette.colors=["#000000","#ffffff"]),o.palette.name=o.palette.name||"Custom"):p==="extract"?o.palette.name=`Extracted (${o.palette.count})`:o.palette.name="None";let b=mn.some(M=>M.id===c.method)?c.method:t.dither.method;return o.dither={method:b,strength:ft(c.strength,0,1,t.dither.strength),matrix:ua(c.matrix)},o.alpha={threshold:ft(l.threshold,0,1,t.alpha.threshold)},o.cleanup={orphans:hn(s.orphans,!1),smooth:hn(s.smooth,!1)},o.outline={mode:Yt(d.mode,["none","outer","inner"],"none"),color:An(d.color)?wt(d.color):t.outline.color,corners:hn(d.corners,!1)},o.export={size:Yt(h.size,["scale","source"],"scale"),scale:Math.round(ft(h.scale,1,64,t.export.scale)),indexed:hn(h.indexed,t.export.indexed),grid:hn(h.grid,!1),gridColor:An(h.gridColor)?wt(h.gridColor):t.export.gridColor},o}function ua(e){if(!Array.isArray(e)||!e.length||!Array.isArray(e[0]))return null;let t=Math.min(16,e.length),n=Math.min(16,e[0].length),o=[];for(let i=0;i<t;i++){let r=[];for(let a=0;a<n;a++){let c=Number((e[i]||[])[a]);r.push(Number.isFinite(c)?c:0)}o.push(r)}return o}var rn=[{id:"original",label:"Original",ratio:null},{id:"1:1",label:"1:1",ratio:1},{id:"4:3",label:"4:3",ratio:4/3},{id:"3:4",label:"3:4",ratio:3/4},{id:"3:2",label:"3:2",ratio:3/2},{id:"2:3",label:"2:3",ratio:2/3},{id:"16:9",label:"16:9",ratio:16/9},{id:"9:16",label:"9:16",ratio:9/16}];function In(e,t,n={}){let o=(rn.find(s=>s.id===n.aspect)||rn[0]).ratio||e/t,i=e,r=e/o;r>t&&(r=t,i=t*o);let a=Math.max(1,n.zoom||1);i=Math.max(1,Math.min(e,Math.round(i/a))),r=Math.max(1,Math.min(t,Math.round(r/a)));let c=n.x??.5,l=n.y??.5;return{x:Math.round((e-i)*c),y:Math.round((t-r)*l),w:i,h:r}}function er(e,t,n){let o,i;return n.mode==="block"?(o=Math.max(1,Math.round(e/n.block)),i=Math.max(1,Math.round(t/n.block))):(o=n.width,i=n.height||Math.max(1,Math.round(o*t/e))),{width:Math.min(Ln,o),height:Math.min(Ln,i)}}function da(e,t){let n={};for(let o of Object.keys(e)){if(o==="version")continue;let i=e[o],r=t[o];if(i&&typeof i=="object"&&!Array.isArray(i)){let a={};for(let c of Object.keys(i))JSON.stringify(i[c])!==JSON.stringify(r&&r[c])&&(a[c]=i[c]);Object.keys(a).length&&(n[o]=a)}else JSON.stringify(i)!==JSON.stringify(r)&&(n[o]=i)}return n}var tr={enc(e){let t=new TextEncoder().encode(e),n="";for(let o of t)n+=String.fromCharCode(o);return btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},dec(e){let t=atob(e.replace(/-/g,"+").replace(/_/g,"/"));return new TextDecoder().decode(Uint8Array.from(t,n=>n.charCodeAt(0)))}};function nr(e){let t=Tt(e),n=da(t,Dt());return n.palette&&(t.palette.source!=="custom"&&(delete n.palette.colors,delete n.palette.name),t.palette.source!=="builtin"&&delete n.palette.id,t.palette.source!=="extract"&&delete n.palette.count),n.palette&&!Object.keys(n.palette).length&&delete n.palette,n}function co(e){return tr.enc(JSON.stringify({v:Pn,...nr(e)}))}function lo(e){let t=String(e),n=/[#&?]s=([A-Za-z0-9_-]+)/.exec(t);n&&(t=n[1]);let o=JSON.parse(tr.dec(t));return delete o.v,Tt(o)}function an(e){return JSON.stringify({$schema:"image-to-pixel/settings",version:Pn,...nr(e)},null,2)}function uo(e){let t=typeof e=="string"?JSON.parse(e):e;return delete t.$schema,Tt(t)}function Ht(e,t){let n=JSON.parse(JSON.stringify(e));for(let o of Object.keys(t||{}))t[o]&&typeof t[o]=="object"&&!Array.isArray(t[o])&&n[o]&&typeof n[o]=="object"?Object.assign(n[o],t[o]):n[o]=t[o];return Tt(n)}Ot();var or="DHos2hHvghjhcwXqwKFF/I5L2ny43U2CNthWL2uZuIRL+h7EVxA0YALtMcH8NbbVUPllGoW/JOwz00rvXqMkVz7EYJ7BTqNbvi6qPIwRXa4kwO9YHI8KwRmt7YvNQV/mNKB2OofloLpEyqZhCYxtF4KtQ8mZ4Ud9uQiHHTy+cdiT8wWJO2/UDP6DUtBm3jLocQ+aLq/9atWZRXgD4R/EEGjRAe6qJdB1khZ7SeCqRPAwzwl3Ll6tGP9rqt+W6hSza0+s3xryLJNAsxbxI7d9zEGHZ9NGeiRZ8WYnsVKkdvOyj1a5RmcKU+gq9ZjOIny/XY7nuPcM1p1VOs4rZkyKMhzoKHpfsMR4Ycudb5BLAZ8e96gF6pW0Ow2904T3NpJOHzLhFoH1ltc9tVoTOWXmAqIjO2ZOinMm3I8PfsMA/Muevj/SmkoB6SHcCzqv+8Vg3k29OGEXyeSHnUARacEG2ofHbZvON70gaYnbdsKujVL+c9qlHLLHRGrvtkLlpVt5CVKID/swjak9VIDoXRUzdJMmfdCKpUttLftb3Jko7mOuR/8rXg12qPwDoUbrDy7HQrYPk+Y09QisHFeZciQ93WT0r2rFVtls9pS7IMqGpu4S2FQO8yvXAK14H7R/T6M3GIAHpuuNQsxVMsghXpp73xqGW8xJfl+chMkv9hXQspEb1TYgoXsTKcEGZKFE31K/PrGabbtdgetUzjnoFcdv0Oq9adNOteITmXLwh7j5PWOg8S5xAbon1Uvha76JSukvwJl+7UPitYZK0Tb6cyoJa4P4Lt5BHZu/GouiYkT6C49XI4k4GmcqgdhBrgxQJtMIv0fXp/uP6RJ2OwOpWwx/a0ECUcsMYjSc63erFI3Mm+kiXwSMqf83cEj1B8KHny61QNig+MeX9KxeHeRqxH+pbpEjgRY6aVCftP2WKu3Iofqx422nkL31FV0f203uXLhD1KzFTnnMCtmzLNt0IOFge+0BcFEQdz0Ewn0unj7eG/RR47NX078uzR9HfthwOR5YLIUU/ylMcspAuIKeADN7D5N2NeEUZJVRfJxbO7RPyxmVwjKr3LpV6qBH/s0AkF0yxgVw8JQMc4nmZL8RT7aL3JzGPV7WiAOi6GcpyG6y2PtXGvCZKb3oIfEOyv2RBaT4R2XlhB6SLG3ZEYhUcum7n3w9oipIrvZWBa0w9J/SCGgY7Kt3G7PgM5EO/ULiUSSlOc9ptFWBOq1pQ4Ibbuc1ciKxDUph+8YZj123Hq0qShD6zWLhgCDWO5zbhV4ic/dJgDNRzvFEYHzDU62KF5h/Yb2LAkP6ywePxeCnvSpbx4PbkfG/oj56sDfJ4Tz2hNlsjSCvDsRSkLpxFkLKlT6nv9yYBYotmxD3Itx4Nbz1COch2nijG2ziXC4XVj3al7MKVDptK9UG50/1CXeiYhXBOORaQZT/agkt8ljmtADoK1tw+bdmxHKrvUZpBdVNa55BrE/pNLqHRaT5cZ3xfhRI75vPGH6WXSWoZpsoStGUVaQDt9F1M6rdyIqkIXtjiNUOJkoV5yHcUzCGpfKRH80uw3IPlF/wJ9YTu4sAzCRt4DBlt/1R4r2L2xeD7LwG8SVw+IAj5RVLe18RSdMx/ky4ocyuhlpAkgbqyxRXt37oWof+KbLQCpdUezncSmKmw4yrH4MCpzcScjLKValrOXqwyjVOnGKz7504+a9smMEVOntkNNSg/cd9YJk82yhFCqcXzFWBPHCryO5oIrD/NlII81rERXXL60yz+z8Q4I7WRw+L1wnChicCvIAe4QlX5ZL0A+MfdA43tiX3dqpn+pbWbkC55Rv0SC4HlsWAD5bedzzSl+cmjmOgBJF5wy1aHZvkW6rrOVPUauhUyj+Lq3AjUJx+wEewbOFNGL4CjMNPLvKOAaBckNuCtFnhMnDKHrWJKQ9erxf2LM9fIO6euP5pvyx5HW/2kkKmK5pn9S/E2bM88liP7xWXg9dZ7jgafKteI9J1K7wOZ/k+GqXuSWX3UKnuftpPunxE5K5OcgE8ghLvQ5q1C8YWdNcFuhd/Rg5ozycK1S1cyTqkKpV10OYKv+pQrvtA0SSdzI5UuymeAthvQ8A1bhLYlwuHNNSVx1KxjsXgTH81rvtLhexV25n6iLueabN6qOsHarjfSaFkP5iBOhaJbqhRdgPnfA7Ugze6HZ0KkPKmOGbF+hVg5yH0MF4EKGTR51iLHaw7b6gsWxtI4DX8RSBRf/ocYAwosv0bbN/HWeYS87cwZEP8rG7sjV3+ySlYgOkkUrR2pUaMbaXZdv2kGJUnwmXgJr4Jyul1AX2TEL+M3LFCyI3yzodP0jCeBrMnmDqD3sKWLFkYSsYuek3asAXNcps82Ci8B98ZP7SEO75xRe4Qlc+BTo81pfVTzmDmbg2cMHWoUzdzBLmM9mY92nHPWR6kEs3kkrEH3aQTa5dDtxvvC4j2VoDEmFLKElvxANOeeD9c/yDdYsUsshqkKT3PXOwB2R7BmuJgH0rAhaZOCI/0bk6CYzH3aIU/u+Qh+lZ/qErGbBzmM2b2JZveibBVL7njBZpysBKKceJBgvi4kyG1SYVm7BNArOp4DO4d48ItsDzfvwyfR88l81d9N47UK+FiMa+bQ7YLftFtNEsdfvlhI6lIyDjtTA6X02kUUHrfbP+jKrNaftY0n81eNXmeYdEAjSbwuHkTqZABza4SarwDk9AQ8nTUlEmqBsCj5cYPkNd28RZfob79XDK8jO0KOJgYPdCN+CWSaBlIspH2EkZ1/6ZXbzneUMIz62VL9JxGd/5TgilZFfAv4F38dStlrDpRvTCT5HsniLAF5UKhyF7Wu1V3EEjICLr8f9okVbvmhhlCy5geifxfdqEhgsYw6BqxNtzApYdoxSCNPxSYSczrCYdm0AJB2BpNzGMlca8qhQbmqdpwm1fdPqUDbNM5qSjAae0I2LIrC9NE4rEJW4jKZ58HSes4sU+feNK28oEcdKH5HqpUumvzpHeX+hbbS/dqkCE2ufQqeR1g8LSADWKY3zKqekhjooO5GI42cdelKE3wkHUf0AP4E+RYNQKn3lQqxUd+8JotP9cQN7ZZgJwZykfwYwJCrIvMlyxDlPrHTROLUyPJ8jvcT/dgw+1EEOWBFNW3YZmDbb0mlHDOXzi5jGHfNhTTi7xb7IfPAO09tS+hfc2U5GcO7FDC3R90NexvzPu1kgVtIZh1A6Milbhqwz5YLvNF3jSjS/C7IYj8F9UIkbNuVwl/JW5Koi3EdFzqDFW0GFHXtzpyCKdTugSvnTwNXjGC6bHKL+VQe/tULaD4iqQKwh5cyYQIQN+fTXOiP/YmxeSm/MevG9pglRXahqwm/HYwfx2i/odo6I7WXSCA2KPhwlUXRYvRqzYMjd0CbyDQaH6r/xbXYrB5DsQv5GSrT3scRjUFk+k2fP5NwDpn00Cd6MaQXivRFD4leEXzwExyGT+qff9hEmy61mLAPOa0R+ooTo9rNpn0KVzqgRHNhgPtmmaL0k1ougmrKJoE748Ru1wEReO8TK32yJzgC44r+ZVk7A2hwSrwlEUhfJtahA2UvtsA7bYcSM2okUa9JFrUMLreWKkVhe9C03HlV3nJTXAn+Kp0DJV7WBhqL7JlqQPRL8l1O95ZhBbjpvMSyC36XjpzpUR93YptAzLycJ7/j0pzEfh34CueXIwTti+nGPSvz4U00iLuMcGoitJU7n1GtIQcUZAAtDfHVm80Tdt0nrYZyyVgyA5W+bHVUxe1OQ3FnSc4yUe9Gss0+WXVRoMtkw1kn1C3YtYAROQRPcYX41naova/ZZz4egbUuoitHUDehfOR4zSevD0jfZfJZH/dXey1ZgSUbfR8qU6SB+vEWuM72RrpiDuSc/xagaMllXI2CGo/J+MZS6+WJf4LZO9WC2tMB655HemRZeYRQNYoqkMahk7psTNTCN0hvHWcHmymT4CycQr0pRu1LcvxYr39rYzrsobQdS/rZj99oji9kc2nNsFb/URvBsZMr++IAPltltOnfBbShr5qPu9WNrj/AsbxJkPNVyrZZpkHd0AQUCnSHk4OWpLGE9e1UM4g5Xgq+IHbJI7LrNwpn3QyX5u8NOMOMf5EmuocoovODd6JRXgZjV/kq3nASYfhUajniMmgYH7Dn/w8p1aKGuJvjEkRtlEXoGkOUzWFXfsKw9xKG4JXwXNdtidiS/sueaxmI5zaOL6gETORBuwWOMEc0TFyDPUz2XAl5AZ5+DKaAfWtZNh06UK38pfiErtGjyOneM/uoiCTyQLid8MHtU8X88xYrWr4SHPI/WSdt3b6aJRZst1DkANIuWXCQqxpv1ktyTycB4kw0ngmqGvQfOZU9jkGY0Db9EyDqTSQ12fjoEB/CessGYXfUyI91lsmoUQB8iKaY77rqIQclNQh6j/do4Ed/VjCo18DTu0/HTOzFGuSsciGDWU32RP3Rx+CM8WQKLlMj9WoAbmOr38N5YS81nc6yhZ4K1reN/VSgQ+TdBPuaLsr3hT5lMqDuJPcXJ3UJ/FSLK7CIp9YbK+X8FkA/GPccsRBYzHoaRnxUsc3E1Wr44lP/50Qy3UJpGHPsilU0kGVf0twPrIxYwz+cQLASYIPb+iWedOK58ErzhO0d0erG5oN9nzOm0S+M4ylZfOVJmcGtdJBhrNN5bwk/UXGia4G5xmozojjH9RTqkOK8zLfo74+FvhQBUAYe19C4p7RMO1aOasiVgv6eNcE4iJ6w0j3nzFfHe9oLYk+mHoLZ+oxdrhf8i0QaZ955SzHHKd4YSKI214yp3S59aLXiSNoEI16vtmK6sCGKFCdbEa1O90Vgs1z6JXCAKXSE+xW2qYbm0zZO47EVfdBuxWZatlUC839Swi2zhvfjVIzB/LAOPfJTARoF0huo+G3FcX+hAqZWbM+D6wpSn37WHHDL4E9813EIKIAd6/RB45P9TqD6rk4lqxsgJNGYSTHbrZJfZtYsCam/pov1xI+Yo4lWqjRb/Ak4FKAz2PbF7hEnQSwz4wIfP9s50UfgzXpYsMEoCVJehTHJ/EBrv+cFu2WYBnYCXPnPH/OuV31esvuOdkaTjCmjWm3+QujNpEohtb4YSNJ360xVbuY2WumzCh7sVfQkPJh5D9Z5nE31Hs+3Syp7UaL0GEeUAuPrikNqm2XffbBAdQYM5RF7HbI8VscO3fGnWcUjc8RLFr7SBSY4B78agquIoigwS2JuwxSrQKFw24xuQ+WsPB0QeVWhEfgBrJBZYRR68ZvH7xUBa1upOKTDfQ5ue9DfuywC4q6aEw5hLdB3VPVEWvLHFzpks5j90wbpPlN4DKF1h/Flvm+IFzLJOOhO3qnWOCKL+dCGb9LJ7FR1HUipGPFPHTRMfWqzBHnJ5d5NbRIl/epQnMmtjmW0lyAI27IBGSmNwdnMaDzcJIPvP0SKtUKsGeY1Xz+jNhshRiZVuIEkSOj5lMBcZJZoW/DBPuD4g==";function fa(e){return typeof atob=="function"?Uint8Array.from(atob(e),t=>t.charCodeAt(0)):new Uint8Array(Buffer.from(e,"base64"))}function sn(e){let t=[[0]];for(let n=1;n<e;n*=2){let o=[];for(let i=0;i<n*2;i++)o.push(new Array(n*2));for(let i=0;i<n;i++)for(let r=0;r<n;r++){let a=4*t[i][r];o[i][r]=a,o[i][r+n]=a+2,o[i+n][r]=a+3,o[i+n][r+n]=a+1}t=o}return t}function ir(e){let t=e.length,n=e[0].length,o=[];for(let r=0;r<t;r++)for(let a=0;a<n;a++)o.push({i:r*n+a,v:e[r][a]});o.sort((r,a)=>r.v-a.v||r.i-a.i);let i=new Uint8Array(n*t);return o.forEach((r,a)=>{i[r.i]=a}),i}function pa(e){let t=[];for(let n=0;n<e;n++){let o=[];for(let i=0;i<e;i++){let r=(i+.5)/e*2*Math.PI,a=(n+.5)/e*2*Math.PI;o.push(-(Math.cos(r)+Math.cos(a))+(i*e+n)*1e-9)}t.push(o)}return t}var ha=[[7,13,11,4],[12,16,14,8],[10,15,6,2],[5,9,3,1]],fo=new Map;function ar(e,t=null){if(e==="custom"){let i=t&&t.length?t:sn(4);return{w:i[0].length,h:i.length,levels:i.length*i[0].length,values:ir(i)}}if(fo.has(e))return fo.get(e);let n,o=i=>({w:i[0].length,h:i.length,levels:i.length*i[0].length,values:ir(i)});switch(e){case"bayer2":n=o(sn(2));break;case"bayer4":n=o(sn(4));break;case"bayer8":n=o(sn(8));break;case"bayer16":n=o(sn(16));break;case"cluster4":n=o(ha);break;case"cluster8":n=o(pa(8));break;case"lines":n=o([[0],[2],[1],[3]]);break;case"bluenoise":n={w:64,h:64,levels:256,values:fa(or)};break;default:n=o(sn(4))}return fo.set(e,n),n}function sr(e){let t=String(e).split(/\r?\n|;/).map(o=>o.trim()).filter(o=>o&&!/^\//.test(o)).map(o=>o.replace(/[[\]]/g,"").split(/[\s,]+/).filter(Boolean).map(Number));if(!t.length)throw new Error("Matrix is empty");let n=t[0].length;if(t.some(o=>o.length!==n||o.some(i=>!Number.isFinite(i))))throw new Error("Every row needs the same number of values");if(n>16||t.length>16)throw new Error("Matrices are limited to 16\xD716");return t}var Kt=(e,t)=>t.map(([n,o,i])=>[n,o,i/e]),cr={"floyd-steinberg":Kt(16,[[1,0,7],[-1,1,3],[0,1,5],[1,1,1]]),atkinson:Kt(8,[[1,0,1],[2,0,1],[-1,1,1],[0,1,1],[1,1,1],[0,2,1]]),"sierra-lite":Kt(4,[[1,0,2],[-1,1,1],[0,1,1]]),sierra:Kt(32,[[1,0,5],[2,0,3],[-2,1,2],[-1,1,4],[0,1,5],[1,1,4],[2,1,2],[-1,2,2],[0,2,3],[1,2,2]]),burkes:Kt(32,[[1,0,8],[2,0,4],[-2,1,2],[-1,1,4],[0,1,8],[1,1,4],[2,1,2]]),jarvis:Kt(48,[[1,0,7],[2,0,5],[-2,1,3],[-1,1,5],[0,1,7],[1,1,5],[2,1,3],[-2,2,1],[-1,2,3],[0,2,5],[1,2,3],[2,2,1]]),stucki:Kt(42,[[1,0,8],[2,0,4],[-2,1,2],[-1,1,4],[0,1,8],[1,1,4],[2,1,2],[-2,2,1],[-1,2,2],[0,2,4],[1,2,2],[2,2,1]])},po=12;function lr(e){let t=1;for(let[n,o]of e)o>0&&(t=Math.max(t,Math.floor(-n/o)+1));return t}var ur=(e,t,n)=>e-1+n*(t-1)+1;Ot();function Un(e,t=16,n={}){let{maxSamples:o=4e4,alphaThreshold:i=.5}=n,r=e.width*e.height,a=Math.max(1,Math.floor(r/o)),c=[];for(let f=0;f<r;f+=a){let p=f*4;e.data[p+3]<i*255||c.push([e.data[p],e.data[p+1],e.data[p+2]])}if(!c.length)return["#000000","#ffffff"].slice(0,Math.max(1,t));let l=[c];for(;l.length<t;){let f=-1,p=-1,b=0;if(l.forEach((k,x)=>{if(!(k.length<2))for(let w=0;w<3;w++){let y=255,A=0;for(let P of k)P[w]<y&&(y=P[w]),P[w]>A&&(A=P[w]);let _=(A-y)*Math.sqrt(k.length);_>p&&(p=_,f=x,b=w)}}),f<0||p<=0)break;let M=l[f].slice().sort((k,x)=>k[b]-x[b]),v=M.length>>1;l.splice(f,1,M.slice(0,v),M.slice(v))}let s=l.map(f=>ma(f));for(let f=0;f<6;f++){let p=s.map(()=>[0,0,0,0]);for(let b of c){let M=0,v=1/0;for(let x=0;x<s.length;x++){let w=b[0]-s[x][0],y=b[1]-s[x][1],A=b[2]-s[x][2],_=w*w+y*y+A*A;_<v&&(v=_,M=x)}let k=p[M];k[0]+=b[0],k[1]+=b[1],k[2]+=b[2],k[3]++}s=s.map((b,M)=>p[M][3]?[p[M][0]/p[M][3],p[M][1]/p[M][3],p[M][2]/p[M][3]]:b)}let d=[...new Set(s.map(f=>qt(f)))],h=f=>{let p=parseInt(f.slice(1),16);return .2126*(p>>16)+.7152*(p>>8&255)+.0722*(p&255)};return d.sort((f,p)=>h(f)-h(p))}function ma(e){let t=0,n=0,o=0;for(let i of e)t+=i[0],n+=i[1],o+=i[2];return[t/e.length,n/e.length,o/e.length]}Ot();function On(e,t,n,o="box",i=null){let r=i?i.x:0,a=i?i.y:0,c=i?i.w:e.width,l=i?i.h:e.height,s=e.data,d=e.width,h=new Float32Array(t*n*4),f=o==="nearest"?1:Math.min(16,Math.max(1,Math.ceil(c/t))),p=o==="nearest"?1:Math.min(16,Math.max(1,Math.ceil(l/n))),b=new Int32Array(t*f),M=new Int32Array(n*p);for(let v=0;v<t;v++)for(let k=0;k<f;k++)b[v*f+k]=r+Math.min(c-1,Math.floor((2*(v*f+k)+1)*c/(2*t*f)));for(let v=0;v<n;v++)for(let k=0;k<p;k++)M[v*p+k]=a+Math.min(l-1,Math.floor((2*(v*p+k)+1)*l/(2*n*p)));for(let v=0;v<n;v++)for(let k=0;k<t;k++){let x=0,w=0,y=0,A=0;for(let P=0;P<p;P++){let I=M[v*p+P]*d;for(let H=0;H<f;H++){let T=(I+b[k*f+H])*4,O=s[T+3]/255;x+=s[T]/255*O,w+=s[T+1]/255*O,y+=s[T+2]/255*O,A+=O}}let _=(v*t+k)*4;A>0&&(h[_]=x/A,h[_+1]=w/A,h[_+2]=y/A),h[_+3]=A/(f*p)}return h}function Dn(e,{brightness:t=0,contrast:n=0,saturation:o=0,hue:i=0,gamma:r=1}){if(!t&&!n&&!o&&!i&&r===1)return e;let a=n>=0?1/(1-.99*n):1+n,c=1/r,l=Math.cos(i*Math.PI/180),s=Math.sin(i*Math.PI/180),d=[.213+.787*l-.213*s,.715-.715*l-.715*s,.072-.072*l+.928*s,.213-.213*l+.143*s,.715+.285*l+.14*s,.072-.072*l-.283*s,.213-.213*l-.787*s,.715-.715*l+.715*s,.072+.928*l+.072*s];for(let h=0;h<e.length;h+=4){let f=e[h]+t,p=e[h+1]+t,b=e[h+2]+t;f=(f-.5)*a+.5,p=(p-.5)*a+.5,b=(b-.5)*a+.5;let M=f*_n[0]+p*_n[1]+b*_n[2],v=1+o;if(f=M+(f-M)*v,p=M+(p-M)*v,b=M+(b-M)*v,i){let k=d[0]*f+d[1]*p+d[2]*b,x=d[3]*f+d[4]*p+d[5]*b,w=d[6]*f+d[7]*p+d[8]*b;f=k,p=x,b=w}e[h]=Math.pow($t(f),c),e[h+1]=Math.pow($t(p),c),e[h+2]=Math.pow($t(b),c)}return e}function dr(e,t){for(let n=3;n<e.length;n+=4)e[n]=e[n]>=t&&e[n]>0?1:0;return e}var $t=e=>e<0?0:e>1?1:e;function fr(e,t){let n=e.length,o=new Float64Array(n*3),i=new Float64Array(n*3);return e.forEach((r,a)=>{i.set([r[0]/255,r[1]/255,r[2]/255],a*3),o.set(t===1?[r[0]/255,r[1]/255,r[2]/255]:so(r[0]/255,r[1]/255,r[2]/255),a*3)}),{n,coords:o,rgb:i,distance:t}}var ho=[.299,.587,.114];function pr(e,t,n,o){let i,r,a,c=1,l=1,s=1;e.distance===1?(i=t,r=n,a=o,c=ho[0],l=ho[1],s=ho[2]):[i,r,a]=so(t,n,o);let d=0,h=1/0,f=e.coords;for(let p=0;p<e.n;p++){let b=i-f[p*3],M=r-f[p*3+1],v=a-f[p*3+2],k=c*b*b+l*M*M+s*v*v;k<h&&(h=k,d=p)}return d}function hr(e,t,n,o){let i=new Uint8ClampedArray(t*n*4),r=o.quantize?fr(o.palette,o.distance):null,a=o.kind==="ordered"?o.map:null,c=a?o.spread*o.settings.dither.strength:0;for(let l=0;l<n;l++)for(let s=0;s<t;s++){let d=(l*t+s)*4;if(e[d+3]<.5)continue;let h=e[d],f=e[d+1],p=e[d+2];if(r){if(a){let M=(a.values[l%a.h*a.w+s%a.w]+.5)/a.levels-.5;h=$t(h+M*c),f=$t(f+M*c),p=$t(p+M*c)}let b=pr(r,h,f,p);i[d]=o.palette[b][0],i[d+1]=o.palette[b][1],i[d+2]=o.palette[b][2]}else i[d]=Math.round(h*255),i[d+1]=Math.round(f*255),i[d+2]=Math.round(p*255);i[d+3]=255}return i}function mr(e,t,n,o){let i=new Uint8ClampedArray(t*n*4),r=fr(o.palette,o.distance),a=new Float32Array(t*n*3),c=o.settings.dither.strength,l=o.kernel;for(let s=0;s<n;s++)for(let d=0;d<t;d++){let h=s*t+d,f=h*4;if(e[f+3]<.5)continue;let p=$t(e[f]+a[h*3]*c),b=$t(e[f+1]+a[h*3+1]*c),M=$t(e[f+2]+a[h*3+2]*c),v=pr(r,p,b,M),k=p-r.rgb[v*3],x=b-r.rgb[v*3+1],w=M-r.rgb[v*3+2];for(let[y,A,_]of l){let P=d+y,I=s+A;if(P<0||P>=t||I>=n)continue;let H=(I*t+P)*3;a[H]+=k*_,a[H+1]+=x*_,a[H+2]+=w*_}i[f]=o.palette[v][0],i[f+1]=o.palette[v][1],i[f+2]=o.palette[v][2],i[f+3]=255}return i}var Fn=(e,t)=>e[t+3]===0?-1:e[t]<<16|e[t+1]<<8|e[t+2],gr=[[0,-1],[1,0],[0,1],[-1,0]];function br(e,t,n){let o=e.slice();for(let i=0;i<n;i++)for(let r=0;r<t;r++){let a=(i*t+r)*4,c=Fn(o,a),l=[],s=[];for(let[f,p]of gr){let b=r+f,M=i+p;if(b<0||M<0||b>=t||M>=n)continue;let v=(M*t+b)*4;l.push(Fn(o,v)),s.push(v)}if(l.length<2||l.includes(c))continue;let d=0,h=0;for(let f=0;f<l.length;f++){let p=0;for(let b=0;b<l.length;b++)l[b]===l[f]&&p++;p>h&&(h=p,d=f)}e.set(o.subarray(s[d],s[d]+4),a)}return e}function yr(e,t,n){let o=e.slice();for(let i=0;i<n;i++)for(let r=0;r<t;r++){let a=(i*t+r)*4,c=Fn(o,a),l=[],s=[];for(let d=-1;d<=1;d++)for(let h=-1;h<=1;h++){let f=Math.min(t-1,Math.max(0,r+h)),b=(Math.min(n-1,Math.max(0,i+d))*t+f)*4;l.push(Fn(o,b)),s.push(b)}for(let d=0;d<9;d++){if(l[d]===c)continue;let h=0;for(let f=0;f<9;f++)l[f]===l[d]&&h++;if(h>=5){e.set(o.subarray(s[d],s[d]+4),a);break}}}return e}function xr(e,t,n,{mode:o,color:i,corners:r}){if(o==="none")return e;let a=e.slice(),c=(d,h)=>d>=0&&h>=0&&d<t&&h<n&&a[(h*t+d)*4+3]>0,l=(d,h)=>d>=0&&h>=0&&d<t&&h<n,s=r?[[0,-1],[1,0],[0,1],[-1,0],[-1,-1],[1,-1],[1,1],[-1,1]]:gr;for(let d=0;d<n;d++)for(let h=0;h<t;h++){let f=c(h,d),p=!1;for(let[b,M]of s){let v=h+b,k=d+M;if(l(v,k)&&(o==="outer"?!f&&c(v,k):f&&!c(v,k))){p=!0;break}}if(p){let b=(d*t+h)*4;e[b]=i[0],e[b+1]=i[1],e[b+2]=i[2],e[b+3]=255}}return e}function wr(e,t){let n=Tt(e),o=In(t.width,t.height,n.frame),{width:i,height:r}=er(o.w,o.h,n.size),a=n.palette.colors;n.palette.source==="extract"&&(a=ga(t,n,i,r,o));let c=n.palette.source!=="none"&&a.length>0,l=c?a.map(Ft):[],s=c?Rn(n.dither.method):"none";n.dither.strength<=0&&(s="none");let d=s==="ordered"?ar(n.dither.method,n.dither.matrix):null,h=s==="diffusion"?cr[n.dither.method]:null,f=h?lr(h):1;return{settings:n,srcWidth:t.width,srcHeight:t.height,crop:o,width:i,height:r,quantize:c,kind:s,palette:l,paletteHex:c?a.slice():null,distance:n.palette.distance==="rgb"?1:0,spread:c?Qo(l):0,map:d,kernel:h,skew:f,waves:h?ur(i,r,f):0,outline:{mode:n.outline.mode,color:Ft(n.outline.color),corners:n.outline.corners}}}function ga(e,t,n,o,i){let r=Math.min(1,160/Math.max(n,o)),a=Math.max(1,Math.round(n*r)),c=Math.max(1,Math.round(o*r)),l=On(e,a,c,"box",i);Dn(l,t.adjust);let s=new Uint8ClampedArray(l.length);for(let d=0;d<l.length;d++)s[d]=Math.round(l[d]*255);return Un({data:s,width:a,height:c},t.palette.count,{alphaThreshold:Math.max(.01,t.alpha.threshold)})}function vr(e,t){let{width:n,height:o,settings:i}=e,r=On(t,n,o,i.size.resample,e.crop);Dn(r,i.adjust),dr(r,i.alpha.threshold);let a=e.kind==="diffusion"?mr(r,n,o,e):hr(r,n,o,e);return i.cleanup.orphans&&br(a,n,o),i.cleanup.smooth&&yr(a,n,o),xr(a,n,o,e.outline),a}var ba="2.0.0",gn=4,Er="glcanvas",et=class extends Error{constructor(e,t){super(e),this.name="ShaderMateError",t&&Object.assign(this,t)}},kr=new Set;function Zt(e,...t){kr.has(e)||(kr.add(e),console.warn("[ShaderMate]",...t))}var xo=typeof window<"u"&&typeof document<"u",ya=e=>Array.isArray(e)||ArrayBuffer.isView(e)&&!(e instanceof DataView),Mr=e=>e==null?[]:Array.isArray(e)?e:[e],Sr=e=>e>0&&(e&e-1)===0;function xa(e){var t,n,o,i;if(e==null)return null;if(Array.isArray(e))return[(t=e[0])!=null?t:0,(n=e[1])!=null?n:0,(o=e[2])!=null?o:0,(i=e[3])!=null?i:1];if(typeof e=="string"&&xo){let r=document.createElement("canvas");r.width=r.height=1;let a=r.getContext("2d");a.fillStyle=e,a.fillRect(0,0,1,1);let c=a.getImageData(0,0,1,1).data;return[c[0]/255,c[1]/255,c[2]/255,c[3]/255]}return null}function wa(){if(!xo)return!1;let e=location.hostname;return location.protocol==="file:"||e==="localhost"||e==="127.0.0.1"||e===""||e.endsWith(".local")}var va=class{constructor(e){this.gl=e,this._items=new Map,this._nextId=1}add(e,t){let n=this._nextId++;return this._items.set(n,{obj:e,count:1,type:t}),n}ref(e){let t=this._items.get(e);return t&&t.count++,e}get(e){let t=this._items.get(e);return t?t.obj:null}unref(e){let t=this._items.get(e);t&&(t.count--,t.count<=0&&this._destroy(e,t))}_destroy(e,t){let{obj:n,type:o}=t,i=this.gl;switch(o){case"texture2D":case"textureCube":i.deleteTexture(n);break;case"fbo":i.deleteFramebuffer(n);break;case"buffer":i.deleteBuffer(n);break;case"program":i.deleteProgram(n);break}this._items.delete(e)}dispose(){for(let[e,t]of[...this._items])this._destroy(e,t)}};function Ea(e){let t=new Map;function n(c,l){return t.has(c)||t.set(c,new Set),t.get(c).add(l),()=>o(c,l)}function o(c,l){let s=t.get(c);s&&s.delete(l)}function i(c,l){let s=d=>{o(c,s),l(d)};return n(c,s)}function r(c,l){let s=t.get(c);if(s)for(let d of[...s])try{d(l)}catch(h){console.error(`[ShaderMate] error in "${c}" listener`,h)}e&&e(c,l)}function a(){t.clear()}return{on:n,off:o,once:i,emit:r,clear:a}}var Cr={linear:e=>e,inQuad:e=>e*e,outQuad:e=>e*(2-e),inOutQuad:e=>e<.5?2*e*e:-1+(4-2*e)*e,inCubic:e=>e*e*e,outCubic:e=>1-Math.pow(1-e,3),inOutCubic:e=>e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2,outExpo:e=>e===1?1:1-Math.pow(2,-10*e),outBack:e=>1+2.70158*Math.pow(e-1,3)+1.70158*Math.pow(e-1,2),outElastic:e=>e===0||e===1?e:Math.pow(2,-10*e)*Math.sin((e*10-.75)*(2*Math.PI)/3)+1};function ka(){let e=new Map;function t(i,r,a,c,l={}){let{duration:s=500,delay:d=0}=l,h=typeof l.ease=="function"?l.ease:Cr[l.ease]||Cr.outCubic,f=e.get(i);f&&f.resolve(!1);let p=r(),b=Array.isArray(c)||ArrayBuffer.isView(c),M=b?Array.from(p??c):Number(p??0),v=b?Array.from(c):Number(c);return new Promise(k=>{let x={start:performance.now()+d,resolve:w=>{e.delete(i),k(w)},update(w){let y=s>0?Ma((w-this.start)/s):1;if(y<0)return;let A=h(y);a(b?M.map((_,P)=>_+(v[P]-_)*A):M+(v-M)*A),y>=1&&this.resolve(!0)}};e.set(i,x)})}function n(i){for(let r of[...e.values()])r.update(i)}function o(i){if(i===void 0){for(let a of[...e.values()])a.resolve(!1);return}let r=e.get(i);r&&r.resolve(!1)}return{tween:t,update:n,cancel:o,get size(){return e.size}}}var Ma=e=>e<0?e:e>1?1:e;function Sa(e){let t;if(typeof e=="string")t=[{src:e}];else if(Array.isArray(e))t=e.map(i=>typeof i=="string"?{src:i}:{...i});else if(e&&typeof e=="object")t=[{...e}];else throw new et("ShaderMate: expected a shader (string), a pass object, or an array of passes");if(!t.length)throw new et("ShaderMate: no passes given");t.forEach((i,r)=>{var a,c,l,s,d;if(i.src==null&&(i.src=(s=(l=(c=(a=i.shader)!=null?a:i.frag)!=null?c:i.fragment)!=null?l:i.glsl)!=null?s:i.url),i.src==null)throw new et(`Pass ${(d=i.name)!=null?d:r} has no shader source (use "shader")`);i.name==null&&(i.name=t.length===1?"main":"pass"+r),i.uniforms==null&&(i.uniforms={})}),t.some(i=>i.screen)||(t[t.length-1].screen=!0),t.filter(i=>i.screen).length>1&&console.warn("[ShaderMate] Multiple screen:true passes; last drawn wins.");let n=t.map(i=>i.name),o=n.filter((i,r)=>n.indexOf(i)!==r);if(o.length)throw new et("Duplicate pass names: "+[...new Set(o)].join(", "));for(let i of t){let r=Array.isArray(i.channels)?i.channels:i.channels?[i.channels]:[];for(i.channels=r.slice(0,gn).map(a=>zr(a,n,i.name));i.channels.length<gn;)i.channels.push(null)}return t}var Ca=e=>typeof HTMLElement<"u"&&e instanceof HTMLElement,Ta=e=>typeof ImageBitmap<"u"&&e instanceof ImageBitmap,Aa=e=>typeof WebGLTexture<"u"&&e instanceof WebGLTexture;function zr(e,t=[],n=""){if(e==null||e===!1)return null;if(typeof e=="string")return t.includes(e)?{pass:e}:{url:e};if(Ca(e)||Ta(e))return{element:e};if(Aa(e))return{texture:e};let o={...e};return o.pass==null&&o.id!=null&&(o.pass=o.id),o.url==null&&o.image!=null&&(o.url=o.image),o.element==null&&o.canvas!=null&&(o.element=o.canvas),o.pass==null&&o.src!=null&&o.url==null&&o.video==null&&(o.url=o.src),o.pass!=null&&!t.includes(o.pass)&&console.warn(`[ShaderMate] Pass "${n}": channel references unknown pass "${o.pass}"`),o}function mo(e){return/[\r\n]/.test(e)||/^\s*(void|#|precision|uniform|in |out |\/\/|\/\*)/.test(e)||/[{};]/.test(e)}var _a=e=>typeof WebGL2RenderingContext<"u"&&e instanceof WebGL2RenderingContext;function La(e,t={}){let n=Object.assign({alpha:t.alpha!==!1,premultipliedAlpha:t.premultipliedAlpha!==!1,preserveDrawingBuffer:!!t.preserveDrawingBuffer,antialias:!!t.antialias,powerPreference:t.powerPreference||"default"},t.contextAttributes),o=t.webgl===void 0?"auto":String(t.webgl),i=null;if((o==="auto"||o==="2")&&(i=e.getContext("webgl2",n)),!i&&(o==="auto"||o==="1")&&(i=e.getContext("webgl",n)||e.getContext("experimental-webgl",n)),!i)throw new et("WebGL not supported");return i}function Pa(e,t){let n={};return t?(n.EXT_color_buffer_float=e.getExtension("EXT_color_buffer_float"),n.EXT_color_buffer_half_float=e.getExtension("EXT_color_buffer_half_float"),n.OES_texture_float_linear=e.getExtension("OES_texture_float_linear")):(n.OES_texture_float=e.getExtension("OES_texture_float"),n.OES_texture_half_float=e.getExtension("OES_texture_half_float"),n.OES_texture_float_linear=e.getExtension("OES_texture_float_linear"),n.OES_texture_half_float_linear=e.getExtension("OES_texture_half_float_linear"),n.OES_standard_derivatives=e.getExtension("OES_standard_derivatives"),n.WEBGL_color_buffer_float=e.getExtension("WEBGL_color_buffer_float"),n.EXT_color_buffer_half_float=e.getExtension("EXT_color_buffer_half_float"),n.WEBGL_depth_texture=e.getExtension("WEBGL_depth_texture"),n.EXT_shader_texture_lod=e.getExtension("EXT_shader_texture_lod")),n}function Ra(e){let t=e.createBuffer();return e.bindBuffer(e.ARRAY_BUFFER,t),e.bufferData(e.ARRAY_BUFFER,new Float32Array([-1,-1,1,-1,-1,1,-1,1,1,-1,1,1]),e.STATIC_DRAW),{bind(n){e.bindBuffer(e.ARRAY_BUFFER,t);let o=e.getAttribLocation(n,"a_position");o!==-1&&(e.enableVertexAttribArray(o),e.vertexAttribPointer(o,2,e.FLOAT,!1,0,0))},draw(){e.drawArrays(e.TRIANGLES,0,6)},dispose(){e.deleteBuffer(t)}}}function Ia(e,t){var n;let o=t.split(`
|
|
11
11
|
`),i=o.findIndex(a=>/^\s*#line\s+1\b/.test(a))+1,r=[];for(let a of e.split(`
|
|
12
|
-
`)){let c=/ERROR:\s*\d+:(\d+):\s*(.*)/.exec(a);if(!c)continue;let l=parseInt(c[1],10),s=i>0?i+l-1:l-1;r.push({line:l,message:c[2].trim(),source:(n=o[s])!=null?n:"",physical:s})}return r}function
|
|
13
|
-
`):a.trim(),d=new
|
|
14
|
-
${s}`,{pass:o,stage:l,log:a,errors:c,source:n});if(i){let
|
|
15
|
-
`).map((
|
|
12
|
+
`)){let c=/ERROR:\s*\d+:(\d+):\s*(.*)/.exec(a);if(!c)continue;let l=parseInt(c[1],10),s=i>0?i+l-1:l-1;r.push({line:l,message:c[2].trim(),source:(n=o[s])!=null?n:"",physical:s})}return r}function Tr(e,t,n,{label:o="",showExpandedOnError:i=!0}={}){let r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS))return{shader:r};let a=e.getShaderInfoLog(r)||"";e.deleteShader(r);let c=Ia(a,n),l=t===e.VERTEX_SHADER?"Vertex":"Fragment",s=c.length?c.map(h=>`line ${h.line}: ${h.message}`).join(`
|
|
13
|
+
`):a.trim(),d=new et(`${l} shader compile error${o?` in pass "${o}"`:""}:
|
|
14
|
+
${s}`,{pass:o,stage:l,log:a,errors:c,source:n});if(i){let h=new Set(c.map(p=>p.physical)),f=n.split(`
|
|
15
|
+
`).map((p,b)=>`${h.has(b)?">>>":" "} ${String(b+1).padStart(4," ")} | ${p}`).join(`
|
|
16
16
|
`);console.error("[ShaderMate] "+d.message,{COMPILED:`
|
|
17
|
-
`+
|
|
17
|
+
`+f})}else console.error("[ShaderMate] "+d.message);return{error:d}}function Br(e,t,n,o){let i=Tr(e,e.VERTEX_SHADER,t,o);if(i.error)return i;let r=Tr(e,e.FRAGMENT_SHADER,n,o);if(r.error)return e.deleteShader(i.shader),r;let a=e.createProgram();if(e.attachShader(a,i.shader),e.attachShader(a,r.shader),e.linkProgram(a),e.deleteShader(i.shader),e.deleteShader(r.shader),!e.getProgramParameter(a,e.LINK_STATUS)){let c=e.getProgramInfoLog(a)||"";e.deleteProgram(a);let l=new et(`Program link error${o&&o.label?` in pass "${o.label}"`:""}: ${c}`,{pass:o&&o.label,log:c});return console.error("[ShaderMate] "+l.message),{error:l}}return{program:a}}function Ar(e,t){let n=e.getProgramParameter(t,e.ACTIVE_UNIFORMS),o={};for(let i=0;i<n;i++){let r=e.getActiveUniform(t,i);r&&(o[r.name.replace(/\[0\]$/,"")]={loc:e.getUniformLocation(t,r.name),type:r.type,size:r.size})}return o}var Nr=`#version 300 es
|
|
18
18
|
layout(location=0) in vec2 a_position;
|
|
19
|
-
void main(){ gl_Position = vec4(a_position,0.0,1.0); }`,
|
|
20
|
-
void main(){ gl_Position = vec4(a_position,0.0,1.0); }`,
|
|
19
|
+
void main(){ gl_Position = vec4(a_position,0.0,1.0); }`,Gr=`attribute vec2 a_position;
|
|
20
|
+
void main(){ gl_Position = vec4(a_position,0.0,1.0); }`,Ua=`#define texture2D(s,u) texture(s,u)
|
|
21
21
|
#define textureCube(s,u) texture(s,u)
|
|
22
22
|
#define TEX(s,u) texture(s,u)
|
|
23
23
|
#define TEX_LOD(s,u,l) textureLod(s,u,l)
|
|
24
|
-
`,
|
|
24
|
+
`,Fa=`#define texture(s,u) texture2D(s,u)
|
|
25
25
|
#define TEX(s,u) texture2D(s,u)
|
|
26
26
|
#define TEX_LOD(s,u,l) texture2D(s,u)
|
|
27
|
-
`,
|
|
27
|
+
`,Oa=`
|
|
28
28
|
#line 100000
|
|
29
29
|
void main(){
|
|
30
30
|
vec4 c = vec4(0.0);
|
|
31
31
|
mainImage(c, gl_FragCoord.xy);
|
|
32
32
|
outColor = c;
|
|
33
|
-
}`,
|
|
33
|
+
}`,Da=`
|
|
34
34
|
#line 100000
|
|
35
35
|
void main(){
|
|
36
36
|
vec4 c = vec4(0.0);
|
|
37
37
|
mainImage(c, gl_FragCoord.xy);
|
|
38
38
|
gl_FragColor = c;
|
|
39
|
-
}
|
|
39
|
+
}`,$a=`#version 300 es
|
|
40
40
|
precision highp float;
|
|
41
41
|
uniform sampler2D u_tex; uniform vec2 u_size; out vec4 o;
|
|
42
|
-
void main(){ o = texture(u_tex, gl_FragCoord.xy / u_size); }`,
|
|
42
|
+
void main(){ o = texture(u_tex, gl_FragCoord.xy / u_size); }`,za=`precision highp float;
|
|
43
43
|
uniform sampler2D u_tex; uniform vec2 u_size;
|
|
44
|
-
void main(){ gl_FragColor = texture2D(u_tex, gl_FragCoord.xy / u_size); }`;function
|
|
45
|
-
`;function
|
|
44
|
+
void main(){ gl_FragColor = texture2D(u_tex, gl_FragCoord.xy / u_size); }`;function Ba(e,t,n){let o=Br(e,t?Nr:Gr,t?$a:za,{label:"blit"});if(o.error)throw o.error;let i=o.program,r=e.getUniformLocation(i,"u_tex"),a=e.getUniformLocation(i,"u_size");return{draw(c,l,s){e.bindFramebuffer(e.FRAMEBUFFER,null),e.viewport(0,0,l,s),e.useProgram(i),e.activeTexture(e.TEXTURE0),e.bindTexture(e.TEXTURE_2D,c),e.uniform1i(r,0),e.uniform2f(a,l,s),n.bind(i),n.draw()},dispose(){e.deleteProgram(i)}}}function wo(e,t){return t==="repeat"?e.REPEAT:t==="mirror"||t==="mirrored"?e.MIRRORED_REPEAT:e.CLAMP_TO_EDGE}function vo(e,t){return t==="nearest"?e.NEAREST:e.LINEAR}function Na(e,t,n,o){let i=t?e.RGBA8:e.RGBA,r=e.RGBA,a=e.UNSIGNED_BYTE;return o.float==="full"||o.float===32?t?(i=e.RGBA32F,a=e.FLOAT):n.OES_texture_float&&(a=e.FLOAT):o.float&&(t?(i=e.RGBA16F,a=e.HALF_FLOAT):n.OES_texture_half_float?a=n.OES_texture_half_float.HALF_FLOAT_OES:n.OES_texture_float&&(a=e.FLOAT)),{ifmt:i,fmt:r,type:a}}function Ga(e,t,n,o){let i=e.createTexture();e.bindTexture(e.TEXTURE_2D,i),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texImage2D(e.TEXTURE_2D,0,t,4,4,0,n,o,null);let r=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,r),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,i,0);let a=e.checkFramebufferStatus(e.FRAMEBUFFER)===e.FRAMEBUFFER_COMPLETE;return e.bindFramebuffer(e.FRAMEBUFFER,null),e.deleteFramebuffer(r),e.deleteTexture(i),a}function _r(e,t,n,o,i,r,a){let c=Na(e,r,a,i),l=c;Ga(e,c.ifmt,c.fmt,c.type)||(Zt("fmt-fallback","Requested float format not renderable on this device; falling back to 8-bit."),l={ifmt:r?e.RGBA8:e.RGBA,fmt:e.RGBA,type:e.UNSIGNED_BYTE});let s=i.filter;l.type!==e.UNSIGNED_BYTE&&s!=="nearest"&&((r?l.type===e.HALF_FLOAT||a.OES_texture_float_linear:l.type===e.FLOAT?a.OES_texture_float_linear:a.OES_texture_half_float_linear)||(s="nearest"));let d=e.createTexture();e.bindTexture(e.TEXTURE_2D,d);let h=wo(e,i.wrap),f=vo(e,s);e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,h),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,h),e.texImage2D(e.TEXTURE_2D,0,l.ifmt,n,o,0,l.fmt,l.type,null);let p=null;i.depth&&(!r&&!a.WEBGL_depth_texture?Zt("depth-tex","depth: true needs WebGL2 or WEBGL_depth_texture; ignoring."):(p=e.createTexture(),e.bindTexture(e.TEXTURE_2D,p),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texImage2D(e.TEXTURE_2D,0,r?e.DEPTH_COMPONENT16:e.DEPTH_COMPONENT,n,o,0,e.DEPTH_COMPONENT,e.UNSIGNED_SHORT,null)));let b=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,b),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,d,0),p&&e.framebufferTexture2D(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.TEXTURE_2D,p,0);let M=e.checkFramebufferStatus(e.FRAMEBUFFER);return M!==e.FRAMEBUFFER_COMPLETE&&console.warn("[ShaderMate] Framebuffer incomplete:",M),e.bindFramebuffer(e.FRAMEBUFFER,null),e.bindTexture(e.TEXTURE_2D,null),{texId:t.add(d,"texture2D"),depthId:p?t.add(p,"texture2D"):null,fboId:t.add(b,"fbo"),width:n,height:o,fmt:l}}function $n(e,t){t&&(e.unref(t.texId),t.depthId&&e.unref(t.depthId),e.unref(t.fboId))}function Ha(e,t,n){let o=i=>Math.max(1,Math.round(i));return e==null||e==="screen"||e==="canvas"?[t,n]:e==="half"?[o(t/2),o(n/2)]:e==="quarter"?[o(t/4),o(n/4)]:typeof e=="number"?[o(t*e),o(n*e)]:Array.isArray(e)?[o(e[0]),o(e[1])]:typeof e=="object"&&e.width&&e.height?[o(e.width),o(e.height)]:[t,n]}var ja={iResolution:"vec3",iTime:"float",iTimeDelta:"float",iFrame:"int",iFrameRate:"float",iMouse:"vec4",iDate:"vec4",iScroll:"vec2",iSampleRate:"float",iChannelTime:"float[4]",iChannelResolution:"vec3[4]",u_resolution:"vec2",u_time:"float",u_delta:"float",u_frame:"int",u_fps:"float",u_mouse:"vec2",u_mouseUV:"vec2",u_mouseDown:"float",u_date:"vec4",u_scroll:"vec2",u_pixelRatio:"float",u_aspect:"float",u_time_delta:"float",u_refresh_rate:"float",u_drag:"vec2",u_wheel:"float"},Eo=e=>e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/.*$/gm,""),Va=`#define iGlobalTime iTime
|
|
45
|
+
`;function Xa(e,t){let n=Eo(e);return!/\bfragColor\b/.test(n)||!/\bvoid\s+main\s*\(/.test(n)||/\bout\s+vec4\s+fragColor\b/.test(n)||/#define\s+fragColor\b/.test(n)?"":t?`out vec4 fragColor;
|
|
46
46
|
`:`#define fragColor gl_FragColor
|
|
47
|
-
`}var
|
|
47
|
+
`}var Wa={u_camera_pos:"vec3",u_camera_dir:"vec3",u_camera_view:"mat4",u_recursion:"int",u_max_recursion:"int",u_color_gamut:"int"},qa=["u_audio","u_keyboard","u_webcam","u_main"];function Ya(e){let t=Eo(e);return/\bfragColor\b/.test(t)&&/\bvoid\s+main\s*\(/.test(t)&&!/\bmainImage\s*\(/.test(t)}function Ka(e,t=[],n={}){let o=Eo(e),i="",r=l=>new RegExp("uniform\\s+(?:\\w+\\s+)*"+l+"\\b").test(o),a=l=>new RegExp("\\b"+l+"\\b").test(o),c=Object.assign({},ja,n.fragcoord?Wa:null);n.mouseVec4&&(c.u_mouse="vec4"),n.scrollFloat&&(c.u_scroll="float");for(let l in c){if(!a(l)||r(l))continue;let s=c[l],d=/^(\w+)\[(\d+)\]$/.exec(s);i+=d?`uniform ${d[1]} ${l}[${d[2]}];
|
|
48
48
|
`:`uniform ${s} ${l};
|
|
49
49
|
`}for(let l=0;l<4;l++){let s="iChannel"+l;!a(s)||r(s)||(i+=`uniform ${t[l]==="cube"?"samplerCube":"sampler2D"} ${s};
|
|
50
|
-
`)}for(let l of new Set([...
|
|
50
|
+
`)}for(let l of new Set([...qa,...n.samplerNames||[]]))a(l)&&!r(l)&&(i+=`uniform sampler2D ${l};
|
|
51
51
|
`);return n.passCount>0&&/\bu_passes\b/.test(o)&&!r("u_passes")&&(i+=`uniform sampler2D u_passes[${n.passCount}];
|
|
52
|
-
`),i}var
|
|
53
|
-
// skipped include "${
|
|
54
|
-
`;else if(i.has(
|
|
55
|
-
// skipped include "${
|
|
56
|
-
`;else{i.add(
|
|
57
|
-
// begin include "${
|
|
58
|
-
${
|
|
59
|
-
// end include "${
|
|
60
|
-
`}catch(
|
|
61
|
-
// failed include "${
|
|
62
|
-
`}finally{r.pop()}}}return s+c.slice(d)}return a(e)}function
|
|
52
|
+
`),i}var Lr=e=>e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/.*$/gm,"");async function Za(e,{loader:t,throwOnError:n=!1,warn:o=console.warn}={}){let i=new Set,r=[];async function a(c){let l=/^[ \t]*#include\s+["<]([^">]+)[">]/gm,s="",d=0,h;for(;h=l.exec(c);){let f=h[1];if(s+=c.slice(d,h.index),d=l.lastIndex,r.includes(f))o("[ShaderMate] Circular include:",f),s+=`
|
|
53
|
+
// skipped include "${f}" (circular)
|
|
54
|
+
`;else if(i.has(f))s+=`
|
|
55
|
+
// skipped include "${f}" (already included)
|
|
56
|
+
`;else{i.add(f),r.push(f);try{let p=await t(f),b=await a(p);s+=`
|
|
57
|
+
// begin include "${f}"
|
|
58
|
+
${b}
|
|
59
|
+
// end include "${f}"
|
|
60
|
+
`}catch(p){if(o(`[ShaderMate] Failed to load include "${f}"`,p),n)throw p;s+=`
|
|
61
|
+
// failed include "${f}"
|
|
62
|
+
`}finally{r.pop()}}}return s+c.slice(d)}return a(e)}function Ja(e){let t="";for(let n of e)if(typeof n=="string")t+=`#define ${n}
|
|
63
63
|
`;else if(n&&typeof n=="object")for(let o in n){let i=n[o];t+=i===!0||i===void 0?`#define ${o}
|
|
64
64
|
`:`#define ${o} ${i}
|
|
65
|
-
`}return t}var
|
|
65
|
+
`}return t}var Hr={header:!0,builtins:!0,uniforms:!0,defines:!0,mainWrap:!0},Qa={header:!1,builtins:!1,uniforms:!1,defines:!1,mainWrap:!1};function es(e,{isGL2:t,defines:n=[],enableDerivatives:o=!1,inject:i=Hr,channelTypes:r=[],builtinOpts:a={}}={}){if(!i||!Object.values(i).some(Boolean))return e;let c="",l=e,s=/^[ \t]*#version[^\n]*/m.exec(l);s&&(c=s[0].trim()+`
|
|
66
66
|
`,l=l.slice(0,s.index)+l.slice(s.index+s[0].length));let d="";if(c?d+=c:i.header&&t&&(d+=`#version 300 es
|
|
67
67
|
`),i.builtins&&!t&&o&&(d+=`#extension GL_OES_standard_derivatives : enable
|
|
68
68
|
`),i.header&&(d+=`precision highp float;
|
|
69
69
|
precision highp int;
|
|
70
|
-
`),i.builtins){d+=t?
|
|
71
|
-
`)}i.uniforms&&(d+=
|
|
72
|
-
`+l;return
|
|
73
|
-
`:"")+c;return}let l=r.main?"main":String(r.pass).trim(),s=/buffer\s*type\s*:\s*(\w+)/i.exec(r.raw),d=/^(\d+)$/.exec(l);i.passes.push({name:r.main?"main":d?"pass"+d[1]:l.replace(/[^\w]+/g,"_").replace(/^_+|_+$/g,"").toLowerCase(),label:l,main:r.main,src:c,bufferType:s?s[1].toLowerCase():"2d"})}),i.common&&/[{};]/.test(
|
|
74
|
-
`),i=/^\s*uniform\s+(?:(?:lowp|mediump|highp)\s+)?(\w+)\s+(\w+)(?:\s*\[\s*\d+\s*\])?\s*(?:=\s*([^;]+))?;\s*(?:\/\/(.*))?$/;return{source:o.map(a=>{var c,l,s;let d=i.exec(a);if(!d)return a;let[,f,
|
|
75
|
-
`),uniforms:t,samplers:n}}function ka(e,t,n){let o=Ea(t),i=t.replace(/\[[^\]]*\]/g,"").trim(),r=/^ref:\s*(.+)$/i.exec(i);if(r){let a=r[1].trim(),c;return(c=/^pass\s*(\d+)(?::out(\d+))?$/i.exec(a))?{pass:"pass"+c[1],...o}:(c=/^pass:\s*(\S+)/i.exec(a))?{pass:c[1],...o}:/^main$/i.test(a)?{pass:"main",...o}:(c=/^sampler\s+(\w+)/i.exec(a))?{sameAs:c[1],...o}:null}if(e==="u_audio"||/audio/i.test(e)&&/^(mic|\[CAM\]|\[VIDEO\])?$/i.test(i))return/^https?:|^data:/i.test(i)?{audio:i,layout:"spectrogram"}:{mic:!0,layout:"spectrogram"};if(e==="u_webcam")return{camera:!0,...o};if(e==="u_keyboard")return{keyboard:!0};if(/^(https?:|data:)/i.test(i)){let a=i.split(/\s+/)[0];return/\.(mp4|webm|mov|ogv|m4v)(\?|$)/i.test(a)?{video:a,...o}:/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test(a)?{audio:a,layout:"spectrogram"}:n==="samplerCube"?null:{url:a,...o}}return null}function Ma(e){return/\bu_mouse\s*\.\s*[xyzw]*[zw]/.test(hr(e))}var Ca=35678,Sa=35680,Ta=e=>e.filter(t=>!t.cfg.screen);function _a(e,t,n={}){let o=[],i=Ta(t),r=t.find(l=>l.cfg.screen),a=new Map(t.map(l=>[l.name,l])),c=Object.assign({},e.cfg.annotatedSamplers,e.cfg.samplers);for(let l in e.uniformInfo){let s=e.uniformInfo[l];if(s.type!==Ca&&s.type!==Sa||/^iChannel\d$/.test(l))continue;let d=n[l]||c[l]||null,f;if(d&&d.sameAs&&(d=c[d.sameAs]||n[d.sameAs]||null),d||(l==="u_passes"&&s.size>1?d={array:i.slice(0,s.size)}:l==="u_main"?d=r?{pass:r.name}:null:(f=/^u_pass(\d+)$/.exec(l))&&i[+f[1]-1]?d={pass:i[+f[1]-1].name}:l.startsWith("u_")&&a.has(l.slice(2))?d={pass:l.slice(2)}:l==="u_audio"?d={mic:!0,layout:"spectrogram"}:l==="u_keyboard"?d={keyboard:!0}:l==="u_webcam"&&(d={camera:!0})),d&&d.pass!=null&&!a.has(d.pass)){let u=/^pass(\d+)$/.exec(d.pass);u&&i[+u[1]-1]?d={...d,pass:i[+u[1]-1].name}:d.pass==="main"&&r&&(d={...d,pass:r.name})}d&&o.push({name:l,info:s,spec:d})}return o}function Aa(e){let t=e.find(n=>n.cfg.screen);return t?e.some(n=>(n.samplers||[]).some(o=>o.spec.pass===t.name)||n.cfg.channels.some(o=>o&&o.pass===t.name)):!1}function Pa(e,{target:t=window,speed:n=1.5,sensitivity:o=.004}={}){let i=[0,0,0],r=-Math.PI/2,a=0,c=new Set,l=!1,s=0,d=0,f=[0,0,-1],u=new Float32Array(16),h=(L,T)=>{let P=L.key.length===1?L.key.toLowerCase():L.key;T?c.add(P):c.delete(P)},x=L=>h(L,!0),E=L=>h(L,!1),y=L=>{L.button===0&&(l=!0,s=L.clientX,d=L.clientY)},k=L=>{l&&(r+=(L.clientX-s)*o,a-=(L.clientY-d)*o,a=Math.max(-1.55,Math.min(1.55,a)),s=L.clientX,d=L.clientY)},b=()=>{l=!1},S=L=>{let T=f,P=-L.deltaY*.002*n;i[0]+=T[0]*P,i[1]+=T[1]*P,i[2]+=T[2]*P},w=()=>c.clear();t.addEventListener("keydown",x),t.addEventListener("keyup",E),e.addEventListener("pointerdown",y),window.addEventListener("pointermove",k),window.addEventListener("pointerup",b),e.addEventListener("wheel",S,{passive:!0}),window.addEventListener("blur",w);function A(){let L=f,T=[0,1,0],P=[L[1]*T[2]-L[2]*T[1],L[2]*T[0]-L[0]*T[2],L[0]*T[1]-L[1]*T[0]],z=Math.hypot(P[0],P[1],P[2])||1;P=P.map(I=>I/z);let v=[P[1]*L[2]-P[2]*L[1],P[2]*L[0]-P[0]*L[2],P[0]*L[1]-P[1]*L[0]];return u.set([P[0],v[0],-L[0],0,P[1],v[1],-L[1],0,P[2],v[2],-L[2],0,-(P[0]*i[0]+P[1]*i[1]+P[2]*i[2]),-(v[0]*i[0]+v[1]*i[1]+v[2]*i[2]),L[0]*i[0]+L[1]*i[1]+L[2]*i[2],1]),{right:P,up:v}}return{pos:i,dir:f,view:u,update(L){f[0]=Math.cos(a)*Math.cos(r),f[1]=Math.sin(a),f[2]=Math.cos(a)*Math.sin(r);let{right:T}=A(),P=n*L*(c.has("Shift")?3:1),z=(v,I)=>{i[0]+=v[0]*I,i[1]+=v[1]*I,i[2]+=v[2]*I};(c.has("w")||c.has("ArrowUp"))&&z(f,P),(c.has("s")||c.has("ArrowDown"))&&z(f,-P),(c.has("d")||c.has("ArrowRight"))&&z(T,P),(c.has("a")||c.has("ArrowLeft"))&&z(T,-P),(c.has("e")||c.has(" "))&&(i[1]+=P),(c.has("q")||c.has("c"))&&(i[1]-=P),A()},dispose(){t.removeEventListener("keydown",x),t.removeEventListener("keyup",E),e.removeEventListener("pointerdown",y),window.removeEventListener("pointermove",k),window.removeEventListener("pointerup",b),e.removeEventListener("wheel",S),window.removeEventListener("blur",w)}}}var mr=Object.create(null),Ce=(e,...t)=>t.forEach(n=>{mr[n.toLowerCase()]=e});Ce({kind:"f",n:1},"float","number","f","1f","1fv","float[]","uniform1f","uniform1fv");Ce({kind:"f",n:2},"vec2","2f","2fv","vec2[]","uniform2f","uniform2fv");Ce({kind:"f",n:3},"vec3","3f","3fv","vec3[]","uniform3f","uniform3fv");Ce({kind:"f",n:4},"vec4","4f","4fv","vec4[]","uniform4f","uniform4fv");Ce({kind:"i",n:1},"int","bool","boolean","i","1i","1iv","int[]","bool[]","uniform1i","uniform1iv");Ce({kind:"i",n:2},"ivec2","bvec2","2i","2iv","ivec2[]","bvec2[]","uniform2i","uniform2iv");Ce({kind:"i",n:3},"ivec3","bvec3","3i","3iv","ivec3[]","bvec3[]","uniform3i","uniform3iv");Ce({kind:"i",n:4},"ivec4","bvec4","4i","4iv","ivec4[]","bvec4[]","uniform4i","uniform4iv");Ce({kind:"u",n:1},"uint","1ui","1uiv","uint[]");Ce({kind:"u",n:2},"uvec2","2ui","2uiv","uvec2[]");Ce({kind:"u",n:3},"uvec3","3ui","3uiv","uvec3[]");Ce({kind:"u",n:4},"uvec4","4ui","4uiv","uvec4[]");Ce({kind:"m",n:2},"mat2","matrix2fv","mat2fv","uniformmatrix2fv");Ce({kind:"m",n:3},"mat3","matrix3fv","mat3fv","uniformmatrix3fv");Ce({kind:"m",n:4},"mat4","matrix4fv","mat4fv","uniformmatrix4fv");function La(e){return typeof e!="string"?null:mr[e.trim().toLowerCase()]||null}var Ra={5126:{kind:"f",n:1},35664:{kind:"f",n:2},35665:{kind:"f",n:3},35666:{kind:"f",n:4},5124:{kind:"i",n:1},35667:{kind:"i",n:2},35668:{kind:"i",n:3},35669:{kind:"i",n:4},35670:{kind:"i",n:1},35671:{kind:"i",n:2},35672:{kind:"i",n:3},35673:{kind:"i",n:4},5125:{kind:"u",n:1},36294:{kind:"u",n:2},36295:{kind:"u",n:3},36296:{kind:"u",n:4},35674:{kind:"m",n:2},35675:{kind:"m",n:3},35676:{kind:"m",n:4}};function Ua(e){return Ra[e]}var Ia=5126,rr=35666;function oo(e){return e!=null&&typeof e=="object"&&!Ti(e)&&"value"in e}var ir=e=>typeof e=="boolean"?e?1:0:e;function Zn(e,t){return typeof e=="number"||typeof e=="boolean"?new Array(t).fill(ir(e)):ArrayBuffer.isView(e)?e:Array.isArray(e)&&e.some(n=>typeof n=="boolean")?e.map(ir):e}function Fa(e,t,n,o,i){let r=n.n;switch(n.kind){case"f":return r===1&&typeof o=="number"?e.uniform1f(t,o):e["uniform"+r+"fv"](t,Zn(o,r));case"i":return r===1&&(typeof o=="number"||typeof o=="boolean")?e.uniform1i(t,+o):e["uniform"+r+"iv"](t,Zn(o,r));case"u":return r===1&&typeof o=="number"?e.uniform1ui(t,o):e["uniform"+r+"uiv"](t,Zn(o,r));case"m":return e["uniformMatrix"+r+"fv"](t,!!i,o)}}function ar(e,t,n,{strict:o=!1,warnMissing:i=!1,label:r=""}={}){if(n)for(let a in n){let c=n[a],l=oo(c)?c:null,s=l?l.value:c;if(s==null)continue;let d=t[a];if(!d||!d.loc){if(o)throw new ye("Unknown uniform: "+a);i&&Nt("missing-uniform:"+r+":"+a,`Uniform "${a}" not found in ${r?`pass "${r}"`:"shader"} (misspelled, undeclared, or optimized out).`);continue}let f;if(l&&l.type!=null){if(f=La(l.type),!f){if(o)throw new ye("Unknown uniform type: "+l.type+" for "+a);Nt("bad-type:"+a,"Unknown uniform type",l.type,a);continue}}else if(f=Ua(d.type),!f)continue;Fa(e,d.loc,f,s,l&&l.transpose)}}function Da(e,t,n={}){let o=n.target==="canvas"?e:n.target&&typeof n.target=="object"?n.target:window,i=+n.smooth||0,r={x:0,y:0,down:!1,over:!1,dragX:0,dragY:0,wheel:0},a={x:0,y:0,clickX:0,clickY:0,down:!1,over:!1,uvX:0,uvY:0,dragX:0,dragY:0,wheel:0,clicked:!1},c=!1,l=0,s=0,d=!1;function f(){let S=e.getBoundingClientRect(),w=t?t():"fill";if(!S.width||!S.height||w!=="contain"&&w!=="cover")return S;let A=e.width/e.height,L=S.width/S.height,T,P;return L>A==(w==="contain")?(P=S.height,T=P*A):(T=S.width,P=T/A),{left:S.left+(S.width-T)/2,top:S.top+(S.height-P)/2,width:T,height:P,bottom:0,right:0}}function u(S,w){let A=f();return!A.width||!A.height?[0,0]:[(S-A.left)*(e.width/A.width),(A.top+A.height-w)*(e.height/A.height)]}let h=(S,w)=>{let[A,L]=u(S,w);return[A/e.width,L/e.height]},x=S=>{let[w,A]=u(S.clientX,S.clientY);r.down&&(r.dragX+=w-l,r.dragY+=A-s),l=w,s=A,r.x=w,r.y=A,r.over=w>=0&&A>=0&&w<=e.width&&A<=e.height,d||(d=!0,a.x=w,a.y=A)},E=S=>{S.button!==void 0&&S.button!==0||(x(S),!(o===window&&!r.over)&&(r.down=!0,a.down=!0,c=!0,l=r.x,s=r.y,a.clickX=r.x,a.clickY=r.y,i||(a.x=r.x,a.y=r.y)))},y=()=>{r.down=!1,a.down=!1},k=()=>{r.over=!1},b=S=>{r.wheel+=-S.deltaY*.002};return n.touch!==!1&&o===e&&(e.style.touchAction="none"),o.addEventListener("pointermove",x,{passive:!0}),o.addEventListener("pointerdown",E,{passive:!0}),window.addEventListener("pointerup",y,{passive:!0}),window.addEventListener("pointercancel",y,{passive:!0}),o.addEventListener("pointerleave",k,{passive:!0}),o.addEventListener("wheel",b,{passive:!0}),{state:a,toShader:u,toUV:h,update(){if(i>0&&i<1){let S=1-Math.pow(1-i,1);a.x+=(r.x-a.x)*S,a.y+=(r.y-a.y)*S}else a.x=r.x,a.y=r.y;a.over=r.over,a.clicked=c,c=!1,a.dragX=r.dragX,a.dragY=r.dragY,a.wheel=r.wheel,a.uvX=e.width?a.x/e.width:0,a.uvY=e.height?a.y/e.height:0},dispose(){o.removeEventListener("pointermove",x),o.removeEventListener("pointerdown",E),window.removeEventListener("pointerup",y),window.removeEventListener("pointercancel",y),o.removeEventListener("pointerleave",k),o.removeEventListener("wheel",b)}}}function Oa(e){if(!e)return 0;if(typeof e=="number")return e;if(Array.isArray(e))return e[0]/e[1];if(typeof e=="string"){let t=e.split(/[:/x]/).map(Number);return t.length===2&&t[1]?t[0]/t[1]:Number(e)||0}return 0}function $a(e={},t=!0){var n,o,i,r,a,c;let l=(n=e.size)!=null?n:e.sizing,s={mode:t?"canvas":"window",width:0,height:0,aspect:Oa(e.aspect),fit:e.fit||"contain",pixelRatio:(i=(o=e.pixelRatio)!=null?o:e.dpr)!=null?i:"auto",maxPixelRatio:(r=e.maxPixelRatio)!=null?r:2,scale:(c=(a=e.scale)!=null?a:e.renderScale)!=null?c:1};return Array.isArray(l)?(s.mode="fixed",s.width=l[0],s.height=l[1]):typeof l=="string"?s.mode=l==="screen"||l==="fullscreen"?"window":l==="element"?"canvas":l:l&&typeof l=="object"&&(s.mode="fixed",s.width=l.width,s.height=l.height,l.fit&&(s.fit=l.fit)),s.mode==="fixed"&&(s.aspect=s.width/s.height),s}function za(e,t={},n=!0){let o=$a(t,n),i=()=>o.pixelRatio==="auto"?Math.min(window.devicePixelRatio||1,o.maxPixelRatio):Number(o.pixelRatio)||1,r=!1;function a(){return o.mode==="window"?{w:window.innerWidth,h:window.innerHeight}:{w:e.clientWidth||window.innerWidth,h:e.clientHeight||window.innerHeight}}function c(){if(o.mode==="fixed")return{w:o.width,h:o.height};let s=a(),d=i()*o.scale,f=s.w,u=s.h;return o.aspect&&(f/u>o.aspect?f=u*o.aspect:u=f/o.aspect),{w:f*d,h:u*d}}function l(){r||(r=!0,o.mode==="window"&&(e.style.cssText+=";display:block;position:fixed;left:0;top:0;width:100%;height:100%;"),(o.mode==="fixed"||o.aspect)&&(e.style.objectFit=o.fit))}return{cfg:o,fit:()=>o.mode==="fixed"||o.aspect?o.fit:"fill",setFixed(s,d){o.mode="fixed",o.width=s,o.height=d,o.aspect=s/d,r=!1},update(){l();let s=c(),d=Math.max(1,Math.round(s.w)),f=Math.max(1,Math.round(s.h));return e.width===d&&e.height===f?!1:(e.width=d,e.height=f,!0)},observe(s){let d=!1,f=()=>{d||(d=!0,requestAnimationFrame(()=>{d=!1,s()}))};window.addEventListener("resize",f);let u=null;return o.mode==="canvas"&&typeof ResizeObserver<"u"&&(u=new ResizeObserver(f),u.observe(e)),()=>{window.removeEventListener("resize",f),u&&u.disconnect()}}}}function Na(e,{enabled:t=!0,margin:n="100px",onChange:o}={}){let i=typeof document>"u"?!0:!document.hidden,r=!0,a=()=>o&&o(i&&r),c=()=>{i=!document.hidden,a()},l=null;return t&&(document.addEventListener("visibilitychange",c),typeof IntersectionObserver<"u"&&(l=new IntersectionObserver(s=>{for(let d of s)r=d.isIntersecting;a()},{rootMargin:n}),l.observe(e))),{get visible(){return i&&r},dispose(){t&&document.removeEventListener("visibilitychange",c),l&&l.disconnect()}}}var Ba={font:'"Geist", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif',mono:'"Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace',bg:"#1f1f1f",bgAlt:"#181818",raised:"#2a2d2e",hover:"#37373d",border:"#3c3c3c",text:"#cccccc",textStrong:"#ececec",label:"#9d9d9d",accent:"#4daafc",number:"#4daafc",string:"#d1977f",red:"#e46962",redSoft:"#4e3534",redText:"#f9dedc",radius:"8px",shadow:"0 1px 0 rgba(255,255,255,.03) inset, 0 16px 40px -16px rgba(0,0,0,.7), 0 4px 14px rgba(0,0,0,.3)"};function gr(e){return Object.assign({},Ba,e&&typeof e=="object"?e:null)}function sr({visible:e=!1,key:t="F1",position:n="top-left",theme:o}={}){let i=gr(o),r=document.createElement("div"),[a,c]=n.split("-");r.style.cssText=`position:fixed;${a==="bottom"?"bottom":"top"}:12px;${c==="right"?"right":"left"}:12px;z-index:2147483647;min-width:168px;padding:8px 10px;border:1px solid ${i.border};border-radius:${i.radius};background:${i.bg}e6;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:${i.shadow};color:${i.text};font:12px/1.5 ${i.mono};pointer-events:none;display:none`,document.body.appendChild(r);let l=(k,b)=>`<div style="display:flex;justify-content:space-between;gap:14px"><span style="color:${i.label}">${k}</span><span style="color:${i.textStrong}">${b}</span></div>`,s=!1,d=0,f=0,u=0,h=0;function x(k=!0){s=!!k,r.style.display=s?"block":"none",d=f=u=0}let E=()=>x(!s),y=k=>{k.key===t&&(k.preventDefault(),E())};return t&&window.addEventListener("keydown",y),x(e),{show:x,toggle:E,isVisible:()=>s,update(k){if(!s)return;d+=k.rawDt,f+=k.cpuMs,u++;let b=performance.now();if(b-h<250)return;h=b;let S=d/u*1e3;r.innerHTML=`<div style="display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px"><b style="color:${i.accent};font-size:16px;font-weight:600">${(1e3/S).toFixed(0)}<span style="font-size:11px;color:${i.label};font-weight:400"> fps</span></b><span style="color:${i.label}">${S.toFixed(1)} ms</span></div>`+l("cpu",(f/u).toFixed(2)+" ms")+l("frame",k.frame)+l("time",k.time.toFixed(2)+" s")+l("size",`${k.width}\xD7${k.height}`)+l("passes",k.passes),d=f=u=0},dispose(){t&&window.removeEventListener("keydown",y),r.remove()}}}function Ga(e,t){let n=gr(t),o=null;function i(){if(!o)return;let a=e.getBoundingClientRect();Object.assign(o.style,{left:a.left+"px",top:a.top+"px",width:a.width+"px",height:a.height+"px"})}let r=a=>String(a).replace(/&/g,"&").replace(/</g,"<");return{show(a){o||(o=document.createElement("div"),o.style.cssText=`position:fixed;z-index:2147483646;box-sizing:border-box;overflow:auto;padding:16px;background:${n.bgAlt}f2;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:${n.text};font:13px/1.55 ${n.font}`,document.body.appendChild(o),window.addEventListener("resize",i));let c=a.errors||[],l=r(a.message.split(`
|
|
76
|
-
`)[0]),s="";c.length?s=c.map(d=>`<div style="display:grid;grid-template-columns:auto 1fr;gap:4px 12px;padding:10px 12px;border:1px solid ${n.border};border-radius:${n.radius};background:${n.bg};margin-bottom:8px"><span style="color:${n.red};font-family:${n.mono};font-size:12px">line ${d.line}</span><span style="color:${n.textStrong}">${r(d.message)}</span><span></span><code style="color:${n.label};font-family:${n.mono};font-size:12px;white-space:pre-wrap">${r(d.source.trim())}</code></div>`).join(""):a.log&&(s=`<pre style="margin:0;padding:10px 12px;border:1px solid ${n.border};border-radius:${n.radius};background:${n.bg};color:${n.label};font:12px/1.5 ${n.mono};white-space:pre-wrap">${r(a.log)}</pre>`),o.innerHTML=`<div style="display:flex;align-items:center;gap:10px;margin-bottom:12px"><span style="display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:11px;background:${n.redSoft};color:${n.redText};font-size:11.5px;font-weight:500">Shader error</span><b style="color:${n.textStrong};font-weight:600">${l}</b></div>`+s,o.style.display="block",i()},hide(){o&&(o.style.display="none")},dispose(){o&&(o.remove(),window.removeEventListener("resize",i),o=null)}}}function
|
|
70
|
+
`),i.builtins){d+=t?Ua:Fa,d+=Va;let b=Xa(l,t),M=/\bout\s+(?:\w+\s+)*vec4\s+\w+\s*;/.test(Lr(l));b?d+=b:t&&!M&&(d+=`out vec4 outColor;
|
|
71
|
+
`)}i.uniforms&&(d+=Ka(l,r,a)),i.defines&&(d+=Ja(n));let h=Lr(l),f=i.mainWrap&&/\bmainImage\s*\(/.test(h)&&!/\bvoid\s+main\s*\(/.test(h),p=d+`#line 1
|
|
72
|
+
`+l;return f&&(p+=t?Oa:Da),p}function Bn(e,t,n,o,i,r={},a={},{dynamic:c=!1,flipDefault:l=!1}={}){let s=e.createTexture();e.bindTexture(e.TEXTURE_2D,s);let d=r.flipY===void 0?l:!!r.flipY,h=!a.isGL2&&!(Sr(o)&&Sr(i));h&&r.wrap&&r.wrap!=="clamp"&&Zt("npot-wrap","Non-power-of-two texture in WebGL1: forcing wrap to clamp.");let f=h?e.CLAMP_TO_EDGE:wo(e,r.wrap),p=!!r.mipmap&&!c&&!h,b=vo(e,r.filter),M=p?r.filter==="nearest"?e.NEAREST_MIPMAP_NEAREST:e.LINEAR_MIPMAP_LINEAR:b;e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,M),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,b),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,f),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,f);let v=()=>{e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,d),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!!r.premultiplyAlpha),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1)};return v(),p&&e.generateMipmap(e.TEXTURE_2D),e.bindTexture(e.TEXTURE_2D,null),{texId:t.add(s,"texture2D"),width:o,height:i,source:n,update:c?()=>{n.readyState!==void 0&&n.readyState<2||(e.bindTexture(e.TEXTURE_2D,s),v(),e.bindTexture(e.TEXTURE_2D,null))}:()=>{}}}function ts(e,t,n,o={},i={}){return new Promise((r,a)=>{let c=new Image;c.crossOrigin=o.crossOrigin===void 0?"anonymous":o.crossOrigin,c.onload=()=>r(Bn(e,t,c,c.naturalWidth,c.naturalHeight,o,i)),c.onerror=()=>a(new Error(`Failed to load image "${n}"`)),c.src=n})}var ns=["+X","-X","+Y","-Y","+Z","-Z"];function os(e,t,n,o={}){return new Promise((i,r)=>{if(!Array.isArray(n)||n.length!==6)return r(new Error("cubemap needs an array of 6 URLs"));let a=e.createTexture();e.bindTexture(e.TEXTURE_CUBE_MAP,a);let c=wo(e,o.wrap),l=vo(e,o.filter);e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_MIN_FILTER,l),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_MAG_FILTER,l),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_WRAP_S,c),e.texParameteri(e.TEXTURE_CUBE_MAP,e.TEXTURE_WRAP_T,c);let s=[e.TEXTURE_CUBE_MAP_POSITIVE_X,e.TEXTURE_CUBE_MAP_NEGATIVE_X,e.TEXTURE_CUBE_MAP_POSITIVE_Y,e.TEXTURE_CUBE_MAP_NEGATIVE_Y,e.TEXTURE_CUBE_MAP_POSITIVE_Z,e.TEXTURE_CUBE_MAP_NEGATIVE_Z],d=0,h=0,f=0,p=!1;n.forEach((b,M)=>{let v=new Image;v.crossOrigin="anonymous",v.onload=()=>{p||(h||(h=v.width,f=v.height),e.bindTexture(e.TEXTURE_CUBE_MAP,a),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.texImage2D(s[M],0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,v),++d===6&&(o.mipmap&&e.generateMipmap(e.TEXTURE_CUBE_MAP),e.bindTexture(e.TEXTURE_CUBE_MAP,null),i({texId:t.add(a,"textureCube"),width:h,height:f,cubemap:!0,update(){}})))},v.onerror=()=>{p||(p=!0,e.deleteTexture(a),r(new Error(`Failed to load cubemap face ${ns[M]}: "${b}"`)))},v.src=b})})}function rs(e){let t=e.play&&e.play();t&&t.catch&&t.catch(()=>{let n=()=>{e.play().catch(()=>{})};window.addEventListener("pointerdown",n,{once:!0}),window.addEventListener("keydown",n,{once:!0})})}function is(e,t,n,o={},i={}){return new Promise((r,a)=>{let c=document.createElement("video");Object.assign(c,{src:n,crossOrigin:"anonymous",loop:o.loop!==!1,muted:o.muted!==!1,playsInline:!0,autoplay:!0}),c.addEventListener("error",()=>a(new Error(`Failed to load video "${n}"`)),{once:!0}),c.addEventListener("canplay",()=>{rs(c);let l=Bn(e,t,c,c.videoWidth,c.videoHeight,{...o,flipY:o.flipY===void 0?!0:o.flipY},i,{dynamic:!0});l.getTime=()=>c.currentTime,l.media=c,l.dispose=()=>{c.pause(),c.removeAttribute("src"),c.load()},r(l)},{once:!0}),c.load()})}function as(e,t,n={},o={}){let i=typeof n.camera=="object"?n.camera:{facingMode:"user"};return navigator.mediaDevices.getUserMedia({video:i,audio:!1}).then(r=>new Promise(a=>{let c=document.createElement("video");Object.assign(c,{srcObject:r,muted:!0,playsInline:!0,autoplay:!0}),c.addEventListener("loadedmetadata",()=>{c.play().catch(()=>{});let l=Bn(e,t,c,c.videoWidth,c.videoHeight,{...n,flipY:n.flipY===void 0?!0:n.flipY},o,{dynamic:!0});l.media=c,l.dispose=()=>{c.pause(),r.getTracks().forEach(s=>s.stop())},a(l)},{once:!0})}))}function Pr(e,t,n,{mic:o=!1}={}){let i=n.layout==="spectrogram",r=n.fftSize||(i?1024:512),a=window.AudioContext||window.webkitAudioContext;return new Promise((c,l)=>{var s;let d=new a,h=d.createAnalyser();h.fftSize=r,h.smoothingTimeConstant=(s=n.smoothing)!=null?s:.8;let f=h.frequencyBinCount,p=new Uint8Array(r),b=i?f:2,M=i?3:1,v=new Uint8Array(f*b*M),k=i?new Uint8Array(f):null,x=null;i&&(x=d.createAnalyser(),x.fftSize=r,x.smoothingTimeConstant=0);let w=e.createTexture(),y=i?e.RGB:e.LUMINANCE,A=()=>{e.bindTexture(e.TEXTURE_2D,w),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.pixelStorei(e.UNPACK_ALIGNMENT,1),e.texImage2D(e.TEXTURE_2D,0,y,f,b,0,y,e.UNSIGNED_BYTE,v),e.bindTexture(e.TEXTURE_2D,null)};e.bindTexture(e.TEXTURE_2D,w),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),A();let _=()=>d.currentTime,P=()=>{},I=()=>{let F=()=>{d.state==="suspended"&&d.resume()};F(),window.addEventListener("pointerdown",F,{once:!0}),window.addEventListener("keydown",F,{once:!0}),c({texId:t.add(w,"texture2D"),width:f,height:b,analyser:h,context:d,getTime:_,update(){if(i){let G=f*3;v.copyWithin(G,0,v.length-G),h.getByteFrequencyData(k),h.getByteTimeDomainData(p);for(let N=0;N<f;N++)v[N*3]=k[N],v[N*3+1]=p[N*2];x.getByteFrequencyData(k);for(let N=0;N<f;N++)v[N*3+2]=k[N]}else h.getByteFrequencyData(v.subarray(0,f)),h.getByteTimeDomainData(p),v.set(p.subarray(0,f),f);A()},dispose(){P(),d.close&&d.close()}})};if(o){navigator.mediaDevices.getUserMedia({audio:!0,video:!1}).then(F=>{let G=d.createMediaStreamSource(F);G.connect(h),x&&G.connect(x),P=()=>F.getTracks().forEach(N=>N.stop()),I()}).catch(l);return}let H=n.audio||n.audioFFT,T=H instanceof HTMLMediaElement?H:new Audio,O=T!==H;O&&Object.assign(T,{src:H,crossOrigin:"anonymous",loop:n.loop!==!1,autoplay:!0}),_=()=>T.currentTime;let D=()=>{let F=d.createMediaElementSource(T);if(F.connect(h),x&&F.connect(x),h.connect(d.destination),O){let G=()=>{d.state==="suspended"&&d.resume(),T.play().catch(()=>{})};G(),window.addEventListener("pointerdown",G,{once:!0}),window.addEventListener("keydown",G,{once:!0}),P=()=>{T.pause(),T.removeAttribute("src"),T.load()}}I()};T.readyState>=3?D():(T.addEventListener("canplay",D,{once:!0}),T.addEventListener("error",()=>l(new Error(`Failed to load audio "${H}"`)),{once:!0}),O&&T.load())})}var ss=e=>typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement,Rr=e=>typeof HTMLVideoElement<"u"&&e instanceof HTMLVideoElement;function cs(e,t,n,o={},i={}){let r=n.videoWidth||n.naturalWidth||n.width||1,a=n.videoHeight||n.naturalHeight||n.height||1,c=ss(n)||Rr(n),l=o.dynamic===void 0?c:!!o.dynamic,s=Bn(e,t,n,r,a,o,i,{dynamic:l,flipDefault:c});if(Rr(n)&&(s.getTime=()=>n.currentTime),l){let d=s.update;s.update=()=>{s.width=n.videoWidth||n.naturalWidth||n.width||1,s.height=n.videoHeight||n.naturalHeight||n.height||1,d()}}return Promise.resolve(s)}function ls(e,t,n){let o=t.add(n.texture,n.cube?"textureCube":"texture2D");return t.ref(o),Promise.resolve({texId:o,width:n.width||1,height:n.height||1,cubemap:!!n.cube,update(){}})}function us(e,t,n={}){let r=new Uint8Array(768),a=new Uint8Array(256),c=new Uint8Array(256),l=new Uint8Array(256),s=n.keyboard&&typeof n.keyboard=="object"&&n.keyboard.target||window,d=v=>{if(typeof v.keyCode=="number"&&v.keyCode)return v.keyCode&255;let k=v.key||"";return k.length===1?k.toUpperCase().charCodeAt(0)&255:0},h=v=>{let k=d(v);a[k]||(c[k]=255,l[k]=l[k]?0:255),a[k]=255},f=v=>{a[d(v)]=0},p=()=>a.fill(0);s.addEventListener("keydown",h),s.addEventListener("keyup",f),window.addEventListener("blur",p);let b=e.createTexture();e.bindTexture(e.TEXTURE_2D,b),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.NEAREST),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE);let M=()=>{e.bindTexture(e.TEXTURE_2D,b),e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL,!1),e.pixelStorei(e.UNPACK_ALIGNMENT,1),e.texImage2D(e.TEXTURE_2D,0,e.LUMINANCE,256,3,0,e.LUMINANCE,e.UNSIGNED_BYTE,r),e.bindTexture(e.TEXTURE_2D,null)};return M(),Promise.resolve({texId:t.add(b,"texture2D"),width:256,height:3,keyboard:!0,update(){r.set(a,0),r.set(c,256),r.set(l,256*2),M(),c.fill(0)},dispose(){s.removeEventListener("keydown",h),s.removeEventListener("keyup",f),window.removeEventListener("blur",p)}})}function go(e,t,n,o){return n.texture?ls(e,t,n):n.element?cs(e,t,n.element,n,o):n.url?ts(e,t,n.url,n,o):n.video?is(e,t,n.video,n,o):n.camera?as(e,t,n,o):n.mic?Pr(e,t,n,{mic:!0}):n.keyboard?us(e,t,n):n.audio||n.audioFFT?Pr(e,t,n):n.cubemap?os(e,t,n.cubemap,n):Promise.reject(new Error("Unrecognised channel: "+JSON.stringify(n)))}function ds(e){return e?e.cubemap||e.texture&&e.cube?"cube":"2D":null}var jr=e=>e.replace(/\/\*[\s\S]*?\*\//g,"").replace(/\/\/.*$/gm,"");function fs(e){let t=/^[ \t]*\/\/[ \t]*(?:=+[ \t]*)?(?:Pass[ \t]*:?[ \t]*([^\n=—–-]+?)|(Main)|(Common))[ \t]*(?:[—–-]+[^\n]*)?(?:=+)?[ \t]*$/gim,n=[],o;for(;o=t.exec(e);)n.push({index:o.index,end:o.index+o[0].length,raw:o[0],pass:o[1],main:!!o[2],common:!!o[3]});if(!n.length)return null;let i={common:e.slice(0,n[0].index).trim(),passes:[]};return n.forEach((r,a)=>{let c=e.slice(r.end,a+1<n.length?n[a+1].index:e.length).trim();if(r.common){i.common=(i.common?i.common+`
|
|
73
|
+
`:"")+c;return}let l=r.main?"main":String(r.pass).trim(),s=/buffer\s*type\s*:\s*(\w+)/i.exec(r.raw),d=/^(\d+)$/.exec(l);i.passes.push({name:r.main?"main":d?"pass"+d[1]:l.replace(/[^\w]+/g,"_").replace(/^_+|_+$/g,"").toLowerCase(),label:l,main:r.main,src:c,bufferType:s?s[1].toLowerCase():"2d"})}),i.common&&/[{};]/.test(jr(i.common)),i}function ps(e){let t={},n=/\[([^\]]*)\]/.exec(e||"");if(!n)return t;for(let o of n[1].toLowerCase().split(/[\s,]+/))o==="nearest"||o==="linear"?t.filter=o:o==="clamp"||o==="repeat"||o==="mirror"?t.wrap=o:o==="mipmap"?t.mipmap=!0:(o==="flipy"||o==="flip")&&(t.flipY=!0);return t}function Ir(e){let t={},n={},o=e.split(`
|
|
74
|
+
`),i=/^\s*uniform\s+(?:(?:lowp|mediump|highp)\s+)?(\w+)\s+(\w+)(?:\s*\[\s*\d+\s*\])?\s*(?:=\s*([^;]+))?;\s*(?:\/\/(.*))?$/;return{source:o.map(a=>{var c,l,s;let d=i.exec(a);if(!d)return a;let[,h,f,p,b=""]=d,M=b.trim();if(/^sampler/.test(h)){let k=hs(f,M,h);k&&(n[f]=k)}else{let k={},x=I=>(I.match(/-?\d*\.?\d+(?:e-?\d+)?/g)||[]).map(Number),w=/\[([^\]]*)\]/.exec(M),y=x(M.replace(/\[[^\]]*\]/,"")),A=/vec(\d)/.test(h)?+h.match(/vec(\d)/)[1]:1,_=/^bool/.test(h),P;if(p){let I=x(p);P=A===1?_?/true/.test(p):(c=I[0])!=null?c:0:I.slice(0,A)}else y.length&&(P=A===1?y[0]:y.length>=A?y.slice(0,A):new Array(A).fill(y[0]));if(w){let I=x(w[1]);I.length>=2&&(k.min=I[0],k.max=I[1],I.length>=3&&(k.step=I[2]))}(P!==void 0||w)&&(k.value=P!==void 0?P:A===1?(l=k.min)!=null?l:0:new Array(A).fill((s=k.min)!=null?s:0),t[f]=k)}return p?a.replace(/\s*=\s*[^;]+;/,";"):a}).join(`
|
|
75
|
+
`),uniforms:t,samplers:n}}function hs(e,t,n){let o=ps(t),i=t.replace(/\[[^\]]*\]/g,"").trim(),r=/^ref:\s*(.+)$/i.exec(i);if(r){let a=r[1].trim(),c;return(c=/^pass\s*(\d+)(?::out(\d+))?$/i.exec(a))?{pass:"pass"+c[1],...o}:(c=/^pass:\s*(\S+)/i.exec(a))?{pass:c[1],...o}:/^main$/i.test(a)?{pass:"main",...o}:(c=/^sampler\s+(\w+)/i.exec(a))?{sameAs:c[1],...o}:null}if(e==="u_audio"||/audio/i.test(e)&&/^(mic|\[CAM\]|\[VIDEO\])?$/i.test(i))return/^https?:|^data:/i.test(i)?{audio:i,layout:"spectrogram"}:{mic:!0,layout:"spectrogram"};if(e==="u_webcam")return{camera:!0,...o};if(e==="u_keyboard")return{keyboard:!0};if(/^(https?:|data:)/i.test(i)){let a=i.split(/\s+/)[0];return/\.(mp4|webm|mov|ogv|m4v)(\?|$)/i.test(a)?{video:a,...o}:/\.(mp3|wav|ogg|m4a|aac|flac)(\?|$)/i.test(a)?{audio:a,layout:"spectrogram"}:n==="samplerCube"?null:{url:a,...o}}return null}function ms(e){return/\bu_mouse\s*\.\s*[xyzw]*[zw]/.test(jr(e))}var gs=35678,bs=35680,ys=e=>e.filter(t=>!t.cfg.screen);function xs(e,t,n={}){let o=[],i=ys(t),r=t.find(l=>l.cfg.screen),a=new Map(t.map(l=>[l.name,l])),c=Object.assign({},e.cfg.annotatedSamplers,e.cfg.samplers);for(let l in e.uniformInfo){let s=e.uniformInfo[l];if(s.type!==gs&&s.type!==bs||/^iChannel\d$/.test(l))continue;let d=n[l]||c[l]||null,h;if(d&&d.sameAs&&(d=c[d.sameAs]||n[d.sameAs]||null),d||(l==="u_passes"&&s.size>1?d={array:i.slice(0,s.size)}:l==="u_main"?d=r?{pass:r.name}:null:(h=/^u_pass(\d+)$/.exec(l))&&i[+h[1]-1]?d={pass:i[+h[1]-1].name}:l.startsWith("u_")&&a.has(l.slice(2))?d={pass:l.slice(2)}:l==="u_audio"?d={mic:!0,layout:"spectrogram"}:l==="u_keyboard"?d={keyboard:!0}:l==="u_webcam"&&(d={camera:!0})),d&&d.pass!=null&&!a.has(d.pass)){let f=/^pass(\d+)$/.exec(d.pass);f&&i[+f[1]-1]?d={...d,pass:i[+f[1]-1].name}:d.pass==="main"&&r&&(d={...d,pass:r.name})}d&&o.push({name:l,info:s,spec:d})}return o}function ws(e){let t=e.find(n=>n.cfg.screen);return t?e.some(n=>(n.samplers||[]).some(o=>o.spec.pass===t.name)||n.cfg.channels.some(o=>o&&o.pass===t.name)):!1}function vs(e,{target:t=window,speed:n=1.5,sensitivity:o=.004}={}){let i=[0,0,0],r=-Math.PI/2,a=0,c=new Set,l=!1,s=0,d=0,h=[0,0,-1],f=new Float32Array(16),p=(_,P)=>{let I=_.key.length===1?_.key.toLowerCase():_.key;P?c.add(I):c.delete(I)},b=_=>p(_,!0),M=_=>p(_,!1),v=_=>{_.button===0&&(l=!0,s=_.clientX,d=_.clientY)},k=_=>{l&&(r+=(_.clientX-s)*o,a-=(_.clientY-d)*o,a=Math.max(-1.55,Math.min(1.55,a)),s=_.clientX,d=_.clientY)},x=()=>{l=!1},w=_=>{let P=h,I=-_.deltaY*.002*n;i[0]+=P[0]*I,i[1]+=P[1]*I,i[2]+=P[2]*I},y=()=>c.clear();t.addEventListener("keydown",b),t.addEventListener("keyup",M),e.addEventListener("pointerdown",v),window.addEventListener("pointermove",k),window.addEventListener("pointerup",x),e.addEventListener("wheel",w,{passive:!0}),window.addEventListener("blur",y);function A(){let _=h,P=[0,1,0],I=[_[1]*P[2]-_[2]*P[1],_[2]*P[0]-_[0]*P[2],_[0]*P[1]-_[1]*P[0]],H=Math.hypot(I[0],I[1],I[2])||1;I=I.map(O=>O/H);let T=[I[1]*_[2]-I[2]*_[1],I[2]*_[0]-I[0]*_[2],I[0]*_[1]-I[1]*_[0]];return f.set([I[0],T[0],-_[0],0,I[1],T[1],-_[1],0,I[2],T[2],-_[2],0,-(I[0]*i[0]+I[1]*i[1]+I[2]*i[2]),-(T[0]*i[0]+T[1]*i[1]+T[2]*i[2]),_[0]*i[0]+_[1]*i[1]+_[2]*i[2],1]),{right:I,up:T}}return{pos:i,dir:h,view:f,update(_){h[0]=Math.cos(a)*Math.cos(r),h[1]=Math.sin(a),h[2]=Math.cos(a)*Math.sin(r);let{right:P}=A(),I=n*_*(c.has("Shift")?3:1),H=(T,O)=>{i[0]+=T[0]*O,i[1]+=T[1]*O,i[2]+=T[2]*O};(c.has("w")||c.has("ArrowUp"))&&H(h,I),(c.has("s")||c.has("ArrowDown"))&&H(h,-I),(c.has("d")||c.has("ArrowRight"))&&H(P,I),(c.has("a")||c.has("ArrowLeft"))&&H(P,-I),(c.has("e")||c.has(" "))&&(i[1]+=I),(c.has("q")||c.has("c"))&&(i[1]-=I),A()},dispose(){t.removeEventListener("keydown",b),t.removeEventListener("keyup",M),e.removeEventListener("pointerdown",v),window.removeEventListener("pointermove",k),window.removeEventListener("pointerup",x),e.removeEventListener("wheel",w),window.removeEventListener("blur",y)}}}var Vr=Object.create(null),pt=(e,...t)=>t.forEach(n=>{Vr[n.toLowerCase()]=e});pt({kind:"f",n:1},"float","number","f","1f","1fv","float[]","uniform1f","uniform1fv");pt({kind:"f",n:2},"vec2","2f","2fv","vec2[]","uniform2f","uniform2fv");pt({kind:"f",n:3},"vec3","3f","3fv","vec3[]","uniform3f","uniform3fv");pt({kind:"f",n:4},"vec4","4f","4fv","vec4[]","uniform4f","uniform4fv");pt({kind:"i",n:1},"int","bool","boolean","i","1i","1iv","int[]","bool[]","uniform1i","uniform1iv");pt({kind:"i",n:2},"ivec2","bvec2","2i","2iv","ivec2[]","bvec2[]","uniform2i","uniform2iv");pt({kind:"i",n:3},"ivec3","bvec3","3i","3iv","ivec3[]","bvec3[]","uniform3i","uniform3iv");pt({kind:"i",n:4},"ivec4","bvec4","4i","4iv","ivec4[]","bvec4[]","uniform4i","uniform4iv");pt({kind:"u",n:1},"uint","1ui","1uiv","uint[]");pt({kind:"u",n:2},"uvec2","2ui","2uiv","uvec2[]");pt({kind:"u",n:3},"uvec3","3ui","3uiv","uvec3[]");pt({kind:"u",n:4},"uvec4","4ui","4uiv","uvec4[]");pt({kind:"m",n:2},"mat2","matrix2fv","mat2fv","uniformmatrix2fv");pt({kind:"m",n:3},"mat3","matrix3fv","mat3fv","uniformmatrix3fv");pt({kind:"m",n:4},"mat4","matrix4fv","mat4fv","uniformmatrix4fv");function Es(e){return typeof e!="string"?null:Vr[e.trim().toLowerCase()]||null}var ks={5126:{kind:"f",n:1},35664:{kind:"f",n:2},35665:{kind:"f",n:3},35666:{kind:"f",n:4},5124:{kind:"i",n:1},35667:{kind:"i",n:2},35668:{kind:"i",n:3},35669:{kind:"i",n:4},35670:{kind:"i",n:1},35671:{kind:"i",n:2},35672:{kind:"i",n:3},35673:{kind:"i",n:4},5125:{kind:"u",n:1},36294:{kind:"u",n:2},36295:{kind:"u",n:3},36296:{kind:"u",n:4},35674:{kind:"m",n:2},35675:{kind:"m",n:3},35676:{kind:"m",n:4}};function Ms(e){return ks[e]}var Ss=5126,Ur=35666;function ko(e){return e!=null&&typeof e=="object"&&!ya(e)&&"value"in e}var Fr=e=>typeof e=="boolean"?e?1:0:e;function bo(e,t){return typeof e=="number"||typeof e=="boolean"?new Array(t).fill(Fr(e)):ArrayBuffer.isView(e)?e:Array.isArray(e)&&e.some(n=>typeof n=="boolean")?e.map(Fr):e}function Cs(e,t,n,o,i){let r=n.n;switch(n.kind){case"f":return r===1&&typeof o=="number"?e.uniform1f(t,o):e["uniform"+r+"fv"](t,bo(o,r));case"i":return r===1&&(typeof o=="number"||typeof o=="boolean")?e.uniform1i(t,+o):e["uniform"+r+"iv"](t,bo(o,r));case"u":return r===1&&typeof o=="number"?e.uniform1ui(t,o):e["uniform"+r+"uiv"](t,bo(o,r));case"m":return e["uniformMatrix"+r+"fv"](t,!!i,o)}}function Or(e,t,n,{strict:o=!1,warnMissing:i=!1,label:r=""}={}){if(n)for(let a in n){let c=n[a],l=ko(c)?c:null,s=l?l.value:c;if(s==null)continue;let d=t[a];if(!d||!d.loc){if(o)throw new et("Unknown uniform: "+a);i&&Zt("missing-uniform:"+r+":"+a,`Uniform "${a}" not found in ${r?`pass "${r}"`:"shader"} (misspelled, undeclared, or optimized out).`);continue}let h;if(l&&l.type!=null){if(h=Es(l.type),!h){if(o)throw new et("Unknown uniform type: "+l.type+" for "+a);Zt("bad-type:"+a,"Unknown uniform type",l.type,a);continue}}else if(h=Ms(d.type),!h)continue;Cs(e,d.loc,h,s,l&&l.transpose)}}function Ts(e,t,n={}){let o=n.target==="canvas"?e:n.target&&typeof n.target=="object"?n.target:window,i=+n.smooth||0,r={x:0,y:0,down:!1,over:!1,dragX:0,dragY:0,wheel:0},a={x:0,y:0,clickX:0,clickY:0,down:!1,over:!1,uvX:0,uvY:0,dragX:0,dragY:0,wheel:0,clicked:!1},c=!1,l=0,s=0,d=!1;function h(){let w=e.getBoundingClientRect(),y=t?t():"fill";if(!w.width||!w.height||y!=="contain"&&y!=="cover")return w;let A=e.width/e.height,_=w.width/w.height,P,I;return _>A==(y==="contain")?(I=w.height,P=I*A):(P=w.width,I=P/A),{left:w.left+(w.width-P)/2,top:w.top+(w.height-I)/2,width:P,height:I,bottom:0,right:0}}function f(w,y){let A=h();return!A.width||!A.height?[0,0]:[(w-A.left)*(e.width/A.width),(A.top+A.height-y)*(e.height/A.height)]}let p=(w,y)=>{let[A,_]=f(w,y);return[A/e.width,_/e.height]},b=w=>{let[y,A]=f(w.clientX,w.clientY);r.down&&(r.dragX+=y-l,r.dragY+=A-s),l=y,s=A,r.x=y,r.y=A,r.over=y>=0&&A>=0&&y<=e.width&&A<=e.height,d||(d=!0,a.x=y,a.y=A)},M=w=>{w.button!==void 0&&w.button!==0||(b(w),!(o===window&&!r.over)&&(r.down=!0,a.down=!0,c=!0,l=r.x,s=r.y,a.clickX=r.x,a.clickY=r.y,i||(a.x=r.x,a.y=r.y)))},v=()=>{r.down=!1,a.down=!1},k=()=>{r.over=!1},x=w=>{r.wheel+=-w.deltaY*.002};return n.touch!==!1&&o===e&&(e.style.touchAction="none"),o.addEventListener("pointermove",b,{passive:!0}),o.addEventListener("pointerdown",M,{passive:!0}),window.addEventListener("pointerup",v,{passive:!0}),window.addEventListener("pointercancel",v,{passive:!0}),o.addEventListener("pointerleave",k,{passive:!0}),o.addEventListener("wheel",x,{passive:!0}),{state:a,toShader:f,toUV:p,update(){if(i>0&&i<1){let w=1-Math.pow(1-i,1);a.x+=(r.x-a.x)*w,a.y+=(r.y-a.y)*w}else a.x=r.x,a.y=r.y;a.over=r.over,a.clicked=c,c=!1,a.dragX=r.dragX,a.dragY=r.dragY,a.wheel=r.wheel,a.uvX=e.width?a.x/e.width:0,a.uvY=e.height?a.y/e.height:0},dispose(){o.removeEventListener("pointermove",b),o.removeEventListener("pointerdown",M),window.removeEventListener("pointerup",v),window.removeEventListener("pointercancel",v),o.removeEventListener("pointerleave",k),o.removeEventListener("wheel",x)}}}function As(e){if(!e)return 0;if(typeof e=="number")return e;if(Array.isArray(e))return e[0]/e[1];if(typeof e=="string"){let t=e.split(/[:/x]/).map(Number);return t.length===2&&t[1]?t[0]/t[1]:Number(e)||0}return 0}function _s(e={},t=!0){var n,o,i,r,a,c;let l=(n=e.size)!=null?n:e.sizing,s={mode:t?"canvas":"window",width:0,height:0,aspect:As(e.aspect),fit:e.fit||"contain",pixelRatio:(i=(o=e.pixelRatio)!=null?o:e.dpr)!=null?i:"auto",maxPixelRatio:(r=e.maxPixelRatio)!=null?r:2,scale:(c=(a=e.scale)!=null?a:e.renderScale)!=null?c:1};return Array.isArray(l)?(s.mode="fixed",s.width=l[0],s.height=l[1]):typeof l=="string"?s.mode=l==="screen"||l==="fullscreen"?"window":l==="element"?"canvas":l:l&&typeof l=="object"&&(s.mode="fixed",s.width=l.width,s.height=l.height,l.fit&&(s.fit=l.fit)),s.mode==="fixed"&&(s.aspect=s.width/s.height),s}function Ls(e,t={},n=!0){let o=_s(t,n),i=()=>o.pixelRatio==="auto"?Math.min(window.devicePixelRatio||1,o.maxPixelRatio):Number(o.pixelRatio)||1,r=!1;function a(){return o.mode==="window"?{w:window.innerWidth,h:window.innerHeight}:{w:e.clientWidth||window.innerWidth,h:e.clientHeight||window.innerHeight}}function c(){if(o.mode==="fixed")return{w:o.width,h:o.height};let s=a(),d=i()*o.scale,h=s.w,f=s.h;return o.aspect&&(h/f>o.aspect?h=f*o.aspect:f=h/o.aspect),{w:h*d,h:f*d}}function l(){r||(r=!0,o.mode==="window"&&(e.style.cssText+=";display:block;position:fixed;left:0;top:0;width:100%;height:100%;"),(o.mode==="fixed"||o.aspect)&&(e.style.objectFit=o.fit))}return{cfg:o,fit:()=>o.mode==="fixed"||o.aspect?o.fit:"fill",setFixed(s,d){o.mode="fixed",o.width=s,o.height=d,o.aspect=s/d,r=!1},update(){l();let s=c(),d=Math.max(1,Math.round(s.w)),h=Math.max(1,Math.round(s.h));return e.width===d&&e.height===h?!1:(e.width=d,e.height=h,!0)},observe(s){let d=!1,h=()=>{d||(d=!0,requestAnimationFrame(()=>{d=!1,s()}))};window.addEventListener("resize",h);let f=null;return o.mode==="canvas"&&typeof ResizeObserver<"u"&&(f=new ResizeObserver(h),f.observe(e)),()=>{window.removeEventListener("resize",h),f&&f.disconnect()}}}}function Ps(e,{enabled:t=!0,margin:n="100px",onChange:o}={}){let i=typeof document>"u"?!0:!document.hidden,r=!0,a=()=>o&&o(i&&r),c=()=>{i=!document.hidden,a()},l=null;return t&&(document.addEventListener("visibilitychange",c),typeof IntersectionObserver<"u"&&(l=new IntersectionObserver(s=>{for(let d of s)r=d.isIntersecting;a()},{rootMargin:n}),l.observe(e))),{get visible(){return i&&r},dispose(){t&&document.removeEventListener("visibilitychange",c),l&&l.disconnect()}}}var Rs={font:'"Geist", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif',mono:'"Geist Mono", ui-monospace, "SF Mono", Menlo, Consolas, monospace',bg:"#1f1f1f",bgAlt:"#181818",raised:"#2a2d2e",hover:"#37373d",border:"#3c3c3c",text:"#cccccc",textStrong:"#ececec",label:"#9d9d9d",accent:"#4daafc",number:"#4daafc",string:"#d1977f",red:"#e46962",redSoft:"#4e3534",redText:"#f9dedc",radius:"8px",shadow:"0 1px 0 rgba(255,255,255,.03) inset, 0 16px 40px -16px rgba(0,0,0,.7), 0 4px 14px rgba(0,0,0,.3)"};function Xr(e){return Object.assign({},Rs,e&&typeof e=="object"?e:null)}function Dr({visible:e=!1,key:t="F1",position:n="top-left",theme:o}={}){let i=Xr(o),r=document.createElement("div"),[a,c]=n.split("-");r.style.cssText=`position:fixed;${a==="bottom"?"bottom":"top"}:12px;${c==="right"?"right":"left"}:12px;z-index:2147483647;min-width:168px;padding:8px 10px;border:1px solid ${i.border};border-radius:${i.radius};background:${i.bg}e6;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);box-shadow:${i.shadow};color:${i.text};font:12px/1.5 ${i.mono};pointer-events:none;display:none`,document.body.appendChild(r);let l=(k,x)=>`<div style="display:flex;justify-content:space-between;gap:14px"><span style="color:${i.label}">${k}</span><span style="color:${i.textStrong}">${x}</span></div>`,s=!1,d=0,h=0,f=0,p=0;function b(k=!0){s=!!k,r.style.display=s?"block":"none",d=h=f=0}let M=()=>b(!s),v=k=>{k.key===t&&(k.preventDefault(),M())};return t&&window.addEventListener("keydown",v),b(e),{show:b,toggle:M,isVisible:()=>s,update(k){if(!s)return;d+=k.rawDt,h+=k.cpuMs,f++;let x=performance.now();if(x-p<250)return;p=x;let w=d/f*1e3;r.innerHTML=`<div style="display:flex;justify-content:space-between;align-items:baseline;margin-bottom:4px"><b style="color:${i.accent};font-size:16px;font-weight:600">${(1e3/w).toFixed(0)}<span style="font-size:11px;color:${i.label};font-weight:400"> fps</span></b><span style="color:${i.label}">${w.toFixed(1)} ms</span></div>`+l("cpu",(h/f).toFixed(2)+" ms")+l("frame",k.frame)+l("time",k.time.toFixed(2)+" s")+l("size",`${k.width}\xD7${k.height}`)+l("passes",k.passes),d=h=f=0},dispose(){t&&window.removeEventListener("keydown",v),r.remove()}}}function Is(e,t){let n=Xr(t),o=null;function i(){if(!o)return;let a=e.getBoundingClientRect();Object.assign(o.style,{left:a.left+"px",top:a.top+"px",width:a.width+"px",height:a.height+"px"})}let r=a=>String(a).replace(/&/g,"&").replace(/</g,"<");return{show(a){o||(o=document.createElement("div"),o.style.cssText=`position:fixed;z-index:2147483646;box-sizing:border-box;overflow:auto;padding:16px;background:${n.bgAlt}f2;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);color:${n.text};font:13px/1.55 ${n.font}`,document.body.appendChild(o),window.addEventListener("resize",i));let c=a.errors||[],l=r(a.message.split(`
|
|
76
|
+
`)[0]),s="";c.length?s=c.map(d=>`<div style="display:grid;grid-template-columns:auto 1fr;gap:4px 12px;padding:10px 12px;border:1px solid ${n.border};border-radius:${n.radius};background:${n.bg};margin-bottom:8px"><span style="color:${n.red};font-family:${n.mono};font-size:12px">line ${d.line}</span><span style="color:${n.textStrong}">${r(d.message)}</span><span></span><code style="color:${n.label};font-family:${n.mono};font-size:12px;white-space:pre-wrap">${r(d.source.trim())}</code></div>`).join(""):a.log&&(s=`<pre style="margin:0;padding:10px 12px;border:1px solid ${n.border};border-radius:${n.radius};background:${n.bg};color:${n.label};font:12px/1.5 ${n.mono};white-space:pre-wrap">${r(a.log)}</pre>`),o.innerHTML=`<div style="display:flex;align-items:center;gap:10px;margin-bottom:12px"><span style="display:inline-flex;align-items:center;height:22px;padding:0 9px;border-radius:11px;background:${n.redSoft};color:${n.redText};font-size:11.5px;font-weight:500">Shader error</span><b style="color:${n.textStrong};font-weight:600">${l}</b></div>`+s,o.style.display="block",i()},hide(){o&&(o.style.display="none")},dispose(){o&&(o.remove(),window.removeEventListener("resize",i),o=null)}}}function Us(e,t){function n(a="image/png",c){return t(),e.toDataURL(a,c)}function o(a="image/png",c){return t(),new Promise((l,s)=>e.toBlob(d=>d?l(d):s(new Error("toBlob failed")),a,c))}async function i(a="shadermate.png",c,l){c||(c=/\.jpe?g$/i.test(a)?"image/jpeg":/\.webp$/i.test(a)?"image/webp":"image/png");let s=await o(c,l);$r(s,a)}function r({fps:a=60,mimeType:c,bitsPerSecond:l=8e6,duration:s=0,download:d}={}){if(typeof MediaRecorder>"u"||!e.captureStream)throw new Error("MediaRecorder not supported");let h=e.captureStream(a),f=c||["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm","video/mp4"].find(k=>MediaRecorder.isTypeSupported(k))||"",p=new MediaRecorder(h,{mimeType:f||void 0,videoBitsPerSecond:l}),b=[];p.ondataavailable=k=>{k.data.size&&b.push(k.data)};let M=new Promise(k=>{p.onstop=()=>k(new Blob(b,{type:p.mimeType}))});p.start(100);let v={recorder:p,stop(){return p.state!=="inactive"&&p.stop(),h.getTracks().forEach(k=>k.stop()),M},done:M};if(s>0){let k=new Promise(x=>setTimeout(()=>x(v.stop()),s));return d?k.then(x=>($r(x,typeof d=="string"?d:"shadermate.webm"),x)):k}return v}return{screenshot:n,toBlob:o,download:i,record:r}}function $r(e,t){let n=URL.createObjectURL(e),o=document.createElement("a");o.href=n,o.download=t,document.body.appendChild(o),o.click(),o.remove(),setTimeout(()=>URL.revokeObjectURL(n),1e3)}function Fs(e,t){var n;if(typeof e=="string"||Array.isArray(e))return{...t||{},passes:e};if(e&&typeof e=="object"&&(e.shader!=null||e.passes!=null||e.src!=null)){let o={...e};return o.passes==null?o.passes={src:(n=o.shader)!=null?n:o.src,uniforms:o.passUniforms,channels:o.channels,pingpong:o.pingpong,float:o.float}:o.channels!=null&&console.warn("[ShaderMate] `channels` only applies to the single-shader form; put channels on each pass instead."),o}throw new et("createShader: pass a shader string, an array of passes, or { shader | passes, ...options }")}function Os(e){if(e&&typeof e=="object"&&typeof e.getContext=="function")return{canvas:e,given:!0};if(typeof e=="string"){let n=document.getElementById(e);if(!n)try{n=document.querySelector(e)}catch{}if(!n)throw new et(`Canvas not found: "${e}"`);return{canvas:n,given:!0}}let t=document.getElementById(Er);return t?{canvas:t,given:!0}:(t=document.createElement("canvas"),t.id=Er,(document.body||document.documentElement).appendChild(t),{canvas:t,given:!1})}function zn(e,t,n){let o=e[t];ko(o)?o.value=n:e[t]=n}var yo=(e,t)=>ko(e[t])?e[t].value:e[t];function Wr(e,t){var n,o,i;if(!xo)throw new et("ShaderMate needs a browser environment (window/document).");let r=Fs(e,t),a=r.autoSetup!==!1,c=Object.assign({},a?Hr:Qa,r.inject),l=Mr(r.defines),s=typeof r.common=="string"?r.common:"",d=r.dialect||"auto",h=r.samplers||{},f=r.uniforms||{},p=r.includes||{},b=!!r.strictUniforms,M=r.warnMissingUniforms!==!1,v=r.showExpandedOnError!==!1,k=r.errorOverlay===void 0||r.errorOverlay==="auto"?wa():!!r.errorOverlay,x,w,y;r.gl?(y=r.gl,x=y.canvas,w=!0):({canvas:x,given:w}=Os(r.canvas),y=La(x,r));let A=_a(y),_=Pa(y,A),P={isGL2:A,ext:_},I=new va(y),H=!!(A||_.OES_standard_derivatives),T=xa((n=r.background)!=null?n:r.clearColor)||[0,0,0,0];y.clearColor(T[0],T[1],T[2],T[3]);let O=Ea(),{emit:D,on:F,off:G,once:N}=O,ve=Ra(y),ke=Ls(x,r,w),fe=Ts(x,ke.fit,r.pointer===!1?{target:"canvas",smooth:0}:typeof r.pointer=="object"?r.pointer:{}),se=ka(),de=k?Is(x,r.theme):null,ze=null;r.stats&&(ze=Dr({visible:r.stats===!0||r.stats==="visible",key:r.statsKey===void 0?"F1":r.statsKey,position:r.statsPosition,theme:r.theme}));let me=[],W=new Map,V=[],Ce=!1,xe=!1,z=null,ge=()=>{},be=performance.now(),pe=0,Se=0,Ie=r.time||0,Re=r.autoplay!==!1&&!r.startPaused&&!r.paused,Ze=(o=r.timeScale)!=null?o:1,ce=r.fixedDelta||0,Je=r.maxFps||r.fps||0,nt=r.loop||0,Oe=(i=r.maxDelta)!=null?i:.1,Ye=!0,ot=null,St=60,rt=[],Ue=null,We=null,qe=!1,Et=Ps(x,{enabled:r.pauseWhenHidden!==!1,onChange:C=>{Ye=C,C&&(be=performance.now()),D("visibility",C)}});function mt(C){ot=C,de&&de.show(C),D("error",C),r.onError&&r.onError(C)}function Be(){ot=null,de&&de.hide()}let gt=async C=>{let U=await fetch(C);if(!U.ok)throw new et(`Failed to fetch ${C}: ${U.status} ${U.statusText}`);return U.text()},Fe=async C=>p[C]!=null?p[C]:gt(C),Ge=null;async function st(){if(Ge!==null)return Ge;if(!s)return Ge="";let C=mo(s)?s:await gt(s),U=Ir(C);for(let B in U.uniforms)B in f||(f[B]=U.uniforms[B]);return Object.assign(h,U.samplers,h),Ge=U.source}async function bt(C,U,B=V){let K=mo(U)?U:await gt(U),re=await st(),j=Ir(K);K=j.source;for(let X in j.uniforms)!(X in C.uniforms)&&!(X in f)&&(C.uniforms[X]=j.uniforms[X]);C.annotatedSamplers=j.samplers;let te=re?re+`
|
|
77
77
|
#line 1
|
|
78
|
-
`+
|
|
79
|
-
`+R.common:R.common);let O=R.passes.find(q=>q.bufferType!=="2d");if(O)throw new ye(`Pass "${O.label}" uses a ${O.bufferType} buffer; ShaderMate supports 2D buffers only.`);let j=R.passes.map(q=>q.main?{name:"main",shader:q.src,screen:!0}:{name:q.name,shader:q.src,pingpong:!0,float:!0});return j.some(q=>q.screen)||(j[j.length-1].screen=!0),j}async function He(){Fe=Ii(It(r.passes));for(let C of Fe)C.iterations>1&&!C.screen&&(C.pingpong=!0);for(let C=0;C<Fe.length;C++){let R=Fe[C],{program:O,source:j,compiled:q,fragcoord:N}=await Ut(R,R.src);if(Ee){w.deleteProgram(O);return}let g={cfg:R,name:R.name,index:C,programId:P.add(O,"program"),uniformInfo:Jo(w,O),source:j,compiled:q,fragcoord:N,target:null,targetPrev:null,texChannels:new Array(an).fill(null),samplers:[]};ae.push(g),he.set(g.name,g)}await Promise.all(ae.map(pt)),!Ee&&(we=Aa(ae),we&&!je&&(je=Yi(w,A,V)),!ge&&ae.some(C=>C.uniformInfo.u_camera_pos||C.uniformInfo.u_camera_dir||C.uniformInfo.u_camera_view)&&(ge=Pa(b,typeof r.camera=="object"?r.camera:{})),Je())}function it(C,R,O){let j=null;return R.targetPrev?j=O==="prev"||O!=="current"&&R.index>=C.index?R.targetPrev:R.target:R===C?Nt("self:"+C.name,`Pass "${C.name}" reads its own output; add pingpong: true.`):R.cfg.screen?Nt("screen:"+R.name,`Pass "${C.name}" can't read screen pass "${R.name}" (it has no texture).`):j=R.target,j}function $e(C,R,O=0){let j=C.cfg,q=P.get(C.programId),N=C.uniformInfo,g=ce.state,$=(Z,ve)=>{let ue=N[Z];ue&&w.uniform1f(ue.loc,ve)},ee=(Z,ve)=>{let ue=N[Z];ue&&w.uniform1i(ue.loc,ve)};if(C.targetPrev){let Z=C.targetPrev;C.targetPrev=C.target,C.target=Z}let J,oe;j.screen&&!we?(w.bindFramebuffer(w.FRAMEBUFFER,null),J=b.width,oe=b.height):(w.bindFramebuffer(w.FRAMEBUFFER,P.get(C.target.fboId)),J=C.target.width,oe=C.target.height);let re=j.screen?1:J/b.width,Q=j.screen?1:oe/b.height;if(w.viewport(0,0,J,oe),w.useProgram(q),w.clear(w.COLOR_BUFFER_BIT|(C.target&&C.target.depthId?w.DEPTH_BUFFER_BIT:0)),$("iTime",R.time),$("u_time",R.time),$("iTimeDelta",R.dt),$("u_delta",R.dt),$("u_time_delta",R.dt),ee("iFrame",R.frame),ee("u_frame",R.frame),$("iFrameRate",R.fps),$("u_fps",R.fps),$("u_refresh_rate",R.refreshRate),$("iSampleRate",44100),N.iResolution&&w.uniform3f(N.iResolution.loc,J,oe,1),N.u_resolution&&w.uniform2f(N.u_resolution.loc,J,oe),$("u_aspect",J/oe),$("u_pixelRatio",R.dpr),N.iDate&&w.uniform4fv(N.iDate.loc,R.date),N.u_date&&w.uniform4fv(N.u_date.loc,R.date),N.iScroll&&w.uniform2f(N.iScroll.loc,R.scrollX,R.scrollY),N.u_scroll&&(N.u_scroll.type===Ia?w.uniform1f(N.u_scroll.loc,g.wheel):w.uniform2f(N.u_scroll.loc,R.scrollX,R.scrollY)),$("u_wheel",g.wheel),N.u_drag&&w.uniform2f(N.u_drag.loc,g.dragX*re,g.dragY*Q),ee("u_recursion",O),ee("u_max_recursion",j.iterations||1),ee("u_color_gamut",0),ge&&(N.u_camera_pos&&w.uniform3fv(N.u_camera_pos.loc,ge.pos),N.u_camera_dir&&w.uniform3fv(N.u_camera_dir.loc,ge.dir),N.u_camera_view&&w.uniformMatrix4fv(N.u_camera_view.loc,!1,ge.view)),N.iMouse){let Z=g.down?1:-1,ve=g.clicked?1:-1;w.uniform4f(N.iMouse.loc,g.x*re,g.y*Q,g.clickX*re*Z,g.clickY*Q*ve)}if(N.u_mouse)if(N.u_mouse.type===rr){let Z=g.down?1:-1;w.uniform4f(N.u_mouse.loc,g.x*re,g.y*Q,g.clickX*re*Z,g.clickY*Q*Z)}else w.uniform2f(N.u_mouse.loc,g.x*re,g.y*Q);N.u_mouseUV&&w.uniform2f(N.u_mouseUV.loc,g.uvX,g.uvY),$("u_mouseDown",g.down?1:0);let de=[0,0,0,0],ht=new Float32Array(12);for(let Z=0;Z<an;Z++){let ve=j.channels[Z];if(!ve)continue;let ue=null,xe=0,Ct=0,vo=!1,Eo=R.time;if(ve.pass!=null){let lt=he.get(ve.pass),hn=lt?it(C,lt,ve.buffer):null;hn&&(ue=P.get(hn.texId),xe=hn.width,Ct=hn.height)}else{let lt=C.texChannels[Z];lt&&(ue=P.get(lt.texId),xe=lt.width,Ct=lt.height,vo=!!lt.cubemap,lt.getTime&&(Eo=lt.getTime()))}ue&&(w.activeTexture(w.TEXTURE0+Z),w.bindTexture(vo?w.TEXTURE_CUBE_MAP:w.TEXTURE_2D,ue),ee("iChannel"+Z,Z),de[Z]=Eo,ht[Z*3]=xe,ht[Z*3+1]=Ct,ht[Z*3+2]=1)}N.iChannelTime&&(N.iChannelTime.type===rr?w.uniform4fv:w.uniform1fv).call(w,N.iChannelTime.loc,de),N.iChannelResolution&&w.uniform3fv(N.iChannelResolution.loc,ht);let mt=an;for(let Z of C.samplers){let ve=(ue,xe)=>(w.activeTexture(w.TEXTURE0+mt),w.bindTexture(xe?w.TEXTURE_CUBE_MAP:w.TEXTURE_2D,ue),mt++);if(Z.spec.array){let ue=Z.spec.array.map(xe=>{let Ct=it(C,xe,Z.spec.buffer);return Ct?ve(P.get(Ct.texId),!1):0});w.uniform1iv(Z.info.loc,ue)}else if(Z.spec.pass!=null){let ue=he.get(Z.spec.pass),xe=ue?it(C,ue,Z.spec.buffer):null;xe&&w.uniform1i(Z.info.loc,ve(P.get(xe.texId),!1))}else if(Z.wrap){w.uniform1i(Z.info.loc,ve(P.get(Z.wrap.texId),!!Z.wrap.cubemap)),Z.wrap.getTime&&$(Z.name+"_time",Z.wrap.getTime());let ue=N[Z.name+"_resolution"];ue&&w.uniform2f(ue.loc,Z.wrap.width,Z.wrap.height)}}ar(w,N,u,{strict:!1}),ar(w,N,j.uniforms,{strict:x,warnMissing:E,label:C.name}),V.bind(q),V.draw()}function at(C,{advance:R=le,rawDt:O}={}){let j=performance.now();if(O===void 0&&(O=Math.max(0,(C-De)*.001)),De=C,O>.002&&O<.1&&(Pe.push(O),Pe.length>30&&Pe.shift(),Pe.length>=10)){let J=[...Pe].sort((oe,re)=>oe-re);Ye=Math.round(1/J[J.length>>1])}let q=Ae>0?Ae:Math.min(O,Lt);R?(ke+=q*nt,Ge>0&&(ke=(ke%Ge+Ge)%Ge)):q=0,_e++;let N=O>0?1/O:0;be.update(C),ce.update();let g={time:ke,frame:_e,dt:q,fps:N};D("beforeFrame",g),r.onFrame&&r.onFrame(g);let $=new Date,ee={time:ke,frame:_e,dt:q,fps:N,dpr:window.devicePixelRatio||1,date:[$.getFullYear(),$.getMonth()+1,$.getDate(),$.getHours()*3600+$.getMinutes()*60+$.getSeconds()+$.getMilliseconds()/1e3],scrollX:window.scrollX||0,scrollY:window.scrollY||0,refreshRate:Ye};ge&&ge.update(O);for(let J of ae){for(let oe of J.texChannels)oe&&oe.update&&oe.update();for(let oe of J.samplers)oe.wrap&&oe.wrap.update&&oe.wrap.update()}for(let J of ae){let oe=Math.max(1,J.cfg.iterations|0);for(let re=0;re<oe;re++)$e(J,ee,re);J.cfg.screen&&we&&je&&je.draw(P.get(J.target.texId),b.width,b.height)}w.bindFramebuffer(w.FRAMEBUFFER,null),D("afterFrame",g),se&&se.update({rawDt:O,cpuMs:performance.now()-j,frame:_e,time:ke,width:b.width,height:b.height,passes:ae.length})}function Re(C){if(Xe=requestAnimationFrame(Re),!me||!Oe){De=C;return}if(!le&&be.size===0&&r.renderWhilePaused!==!0){De=C;return}qe>0&&C-We<1e3/qe-.5||(We=C,at(C))}function ze(){!me||Ee||at(performance.now(),{advance:!1,rawDt:0})}function Ft(){Ee||Xe!=null||(De=performance.now(),Xe=requestAnimationFrame(Re))}function Yt(){Xe!=null&&cancelAnimationFrame(Xe),Xe=null}function Mt(){Ee||(Ee=!0,Yt(),Ve(),ce.dispose(),Et.dispose(),be.cancel(),se&&se.dispose(),Te&&Te.dispose(),ge&&ge.dispose(),je&&je.dispose(),b.removeEventListener("webglcontextlost",Qe),b.removeEventListener("webglcontextrestored",ct),st(),V.dispose(),D("destroy"),I.clear(),!S&&b.parentNode&&b.parentNode.removeChild(b))}function st(){for(let C of ae)P.unref(C.programId),Cn(P,C.target),Cn(P,C.targetPrev),C.texChannels.forEach(R=>{R&&(R.dispose&&R.dispose(),P.unref(R.texId))}),(C.samplers||[]).forEach(R=>{R.wrap&&(R.wrap.dispose&&R.wrap.dispose(),P.unref(R.wrap.texId))});ae.length=0,he.clear()}function Qe(C){C.preventDefault(),Yt(),me=!1,console.warn("[ShaderMate] WebGL context lost."),D("contextlost")}async function ct(){console.warn("[ShaderMate] WebGL context restored, rebuilding."),P._items.clear(),ae.length=0,he.clear();try{await He(),me=!0,Ft(),D("contextrestored")}catch(C){Le(C)}}b.addEventListener("webglcontextlost",Qe),b.addEventListener("webglcontextrestored",ct);let Dt=ja(b,ze);function p(C,R,O){if(C&&typeof C=="object"){for(let q in C)p(q,C[q],R);return te}be.cancel(C);let j=!1;for(let q of ae)O&&q.name!==O||C in q.cfg.uniforms&&(Sn(q.cfg.uniforms,C,R),j=!0);if(!j)if(O){let q=he.get(O);if(!q)throw new ye(`set: unknown pass "${O}"`);Sn(q.cfg.uniforms,C,R)}else Sn(u,C,R);return!le&&me&&X(),te}function M(C,R){for(let O of ae)if(!(R&&O.name!==R)&&C in O.cfg.uniforms)return Jn(O.cfg.uniforms,C);return Jn(u,C)}function _(C,R,O={}){let j=O.pass,q=()=>{for(let N of ae)if((!j||N.name===j)&&C in N.cfg.uniforms)return N.cfg.uniforms;return u};return be.tween(C,()=>Jn(q(),C),N=>Sn(q(),C,N),R,O)}let F=!1;function X(){F||(F=!0,requestAnimationFrame(()=>{F=!1,le||ze()}))}async function ne(C,R){let O=R?he.get(R):ae.find(j=>j.cfg.screen)||ae[0];if(!O)throw new ye(`setShader: unknown pass "${R}"`);try{let{program:j,source:q,compiled:N}=await Ut(O.cfg,C,Fe);if(Ee){w.deleteProgram(j);return}P.unref(O.programId),O.programId=P.add(j,"program"),O.uniformInfo=Jo(w,j),O.cfg.src=C,O.source=q,O.compiled=N,await pt(O),Rt(),D("shader",{pass:O.name}),le||X()}catch(j){throw Le(j),j}}async function ie(C,R,O){let j=O?he.get(O):ae.find(g=>g.cfg.screen)||ae[0];if(!j)throw new ye(`setChannel: unknown pass "${O}"`);let q=lr(R,[...he.keys()],j.name),N=j.texChannels[C];N&&(N.dispose&&N.dispose(),P.unref(N.texId),j.texChannels[C]=null),j.cfg.channels[C]=q,q&&q.pass==null&&(j.texChannels[C]=await Kn(w,P,q,T)),le||X()}let te={version:Si,canvas:b,gl:w,isWebGL2:A,theme:r.theme,get camera(){return ge},uniforms:u,get passes(){return ae},get ready(){return fe},get loaded(){return me},get error(){return ot},play(){return le||(le=!0,De=performance.now(),D("play")),te},pause(){return le&&(le=!1,D("pause")),te},toggle(){return le?te.pause():te.play()},get playing(){return le},step(C=1){for(let R=0;R<C;R++)at(performance.now(),{advance:!0,rawDt:Ae||1/60});return te},render:ze,destroy:Mt,dispose:Mt,get time(){return ke},set time(C){ke=C,le||X()},get frame(){return _e},get timeScale(){return nt},set timeScale(C){nt=C},get maxFps(){return qe},set maxFps(C){qe=C||0},get loop(){return Ge},set loop(C){Ge=C||0},seek(C){return ke=C,le||X(),te},setFixedDelta(C){return Ae=C||0,te},set:p,get:M,tween:_,setUniform:p,getUniform:M,setShader:ne,setChannel:ie,getPass:C=>he.get(C)||null,getTexture(C){let R=C?he.get(C):ae.find(O=>!O.cfg.screen)||ae[0];return R&&R.target?P.get(R.target.texId):null},readPixels({pass:C,x:R=0,y:O=0,width:j,height:q,float:N}={}){let g=C?he.get(C):null;ze(),g&&g.target?w.bindFramebuffer(w.FRAMEBUFFER,P.get(g.target.fboId)):w.bindFramebuffer(w.FRAMEBUFFER,null);let $=j??(g&&g.target?g.target.width:b.width),ee=q??(g&&g.target?g.target.height:b.height),J=new Uint8Array($*ee*4);if(g&&g.target&&g.target.fmt.type!==w.UNSIGNED_BYTE){let re=new Float32Array($*ee*4);if(w.readPixels(R,O,$,ee,w.RGBA,w.FLOAT,re),N!==!1)J=re;else for(let Q=0;Q<re.length;Q++)J[Q]=Math.max(0,Math.min(255,Math.round(re[Q]*255)))}else w.readPixels(R,O,$,ee,w.RGBA,w.UNSIGNED_BYTE,J);return w.bindFramebuffer(w.FRAMEBUFFER,null),{data:J,width:$,height:ee,float:J instanceof Float32Array}},resize:ft,setSize(C,R){return G.setFixed(C,R),ft(),te},get width(){return b.width},get height(){return b.height},pointer:ce.state,domToShader:ce.toShader,domToUV:ce.toUV,screenshot:Dt.screenshot,toBlob:Dt.toBlob,download:Dt.download,record:Dt.record,on:U,off:B,once:H,stats:{show:(C=!0)=>{se||(se=sr({visible:!1,key:r.statsKey===void 0?"F1":r.statsKey,theme:r.theme})),se.show(C)},toggle:()=>te.stats.show(!(se&&se.isVisible()))}};G.update(),w.viewport(0,0,b.width,b.height),Ve=G.observe(ft);let fe=(async()=>(await He(),Ee||(me=!0,Rt(),D("load",te),r.onReady&&r.onReady(te),Ft(),le||ze()),te))();return fe.catch(C=>{Ee||Le(C)}),te}var xr=`
|
|
78
|
+
`+K:K,le=await Za(te,{loader:Fe}),Ae=d==="fragcoord"||d==="auto"&&Ya(le),ye=[],we=B.filter(X=>!X.screen);B.forEach(X=>ye.push("u_"+X.name)),we.forEach((X,ue)=>{let Me="u_pass"+(ue+1);ye.includes(Me)||ye.push(Me)});let Te=es(le,{isGL2:A,defines:[...l,...Mr(C.defines)],enableDerivatives:H,inject:c,channelTypes:C.channels.map(ds),builtinOpts:{fragcoord:Ae,mouseVec4:Ae||d==="fragcoord"||ms(le),scrollFloat:Ae||d==="fragcoord",samplerNames:ye,passCount:we.length}}),E=Br(y,A?Nr:Gr,Te,{label:C.name,showExpandedOnError:v});if(E.error)throw E.error;return{program:E.program,source:K,compiled:Te,fragcoord:Ae}}function kt(){for(let C of me){let U=C.cfg;if(U.screen&&!qe)continue;let[B,K]=U.screen?[x.width,x.height]:Ha(U.size,x.width,x.height);C.target&&C.target.width===B&&C.target.height===K||($n(I,C.target),$n(I,C.targetPrev),C.target=_r(y,I,B,K,U,A,_),C.targetPrev=U.pingpong||U.screen&&qe?_r(y,I,B,K,U,A,_):null)}}function yt(){Ce||ke.update()&&(y.viewport(0,0,x.width,x.height),kt(),D("resize",{width:x.width,height:x.height}),!Re&&xe&<())}async function He(C){await Promise.all(C.cfg.channels.map(async(U,B)=>{if(!(!U||U.pass!=null))try{C.texChannels[B]=await go(y,I,U,P)}catch(K){console.warn(`[ShaderMate] Pass "${C.name}" channel ${B}: ${K.message}`),D("error",K)}})),C.samplers=xs(C,me,h),await Promise.all(C.samplers.map(async U=>{if(!(U.spec.pass!=null||U.spec.array))try{U.wrap=await go(y,I,U.spec,P)}catch(B){console.warn(`[ShaderMate] Pass "${C.name}" sampler ${U.name}: ${B.message}`),D("error",B)}}))}function It(C){if(typeof C!="string"||!mo(C))return C;let U=fs(C);if(!U)return C;U.common&&(s=s?s+`
|
|
79
|
+
`+U.common:U.common);let B=U.passes.find(re=>re.bufferType!=="2d");if(B)throw new et(`Pass "${B.label}" uses a ${B.bufferType} buffer; ShaderMate supports 2D buffers only.`);let K=U.passes.map(re=>re.main?{name:"main",shader:re.src,screen:!0}:{name:re.name,shader:re.src,pingpong:!0,float:!0});return K.some(re=>re.screen)||(K[K.length-1].screen=!0),K}async function De(){V=Sa(It(r.passes));for(let C of V)C.iterations>1&&!C.screen&&(C.pingpong=!0);for(let C=0;C<V.length;C++){let U=V[C],{program:B,source:K,compiled:re,fragcoord:j}=await bt(U,U.src);if(Ce){y.deleteProgram(B);return}let te={cfg:U,name:U.name,index:C,programId:I.add(B,"program"),uniformInfo:Ar(y,B),source:K,compiled:re,fragcoord:j,target:null,targetPrev:null,texChannels:new Array(gn).fill(null),samplers:[]};me.push(te),W.set(te.name,te)}await Promise.all(me.map(He)),!Ce&&(qe=ws(me),qe&&!We&&(We=Ba(y,A,ve)),!Ue&&me.some(C=>C.uniformInfo.u_camera_pos||C.uniformInfo.u_camera_dir||C.uniformInfo.u_camera_view)&&(Ue=vs(x,typeof r.camera=="object"?r.camera:{})),kt())}function $e(C,U,B){let K=null;return U.targetPrev?K=B==="prev"||B!=="current"&&U.index>=C.index?U.targetPrev:U.target:U===C?Zt("self:"+C.name,`Pass "${C.name}" reads its own output; add pingpong: true.`):U.cfg.screen?Zt("screen:"+U.name,`Pass "${C.name}" can't read screen pass "${U.name}" (it has no texture).`):K=U.target,K}function ct(C,U,B=0){let K=C.cfg,re=I.get(C.programId),j=C.uniformInfo,te=fe.state,le=(J,u)=>{let g=j[J];g&&y.uniform1f(g.loc,u)},Ae=(J,u)=>{let g=j[J];g&&y.uniform1i(g.loc,u)};if(C.targetPrev){let J=C.targetPrev;C.targetPrev=C.target,C.target=J}let ye,we;K.screen&&!qe?(y.bindFramebuffer(y.FRAMEBUFFER,null),ye=x.width,we=x.height):(y.bindFramebuffer(y.FRAMEBUFFER,I.get(C.target.fboId)),ye=C.target.width,we=C.target.height);let Te=K.screen?1:ye/x.width,E=K.screen?1:we/x.height;if(y.viewport(0,0,ye,we),y.useProgram(re),y.clear(y.COLOR_BUFFER_BIT|(C.target&&C.target.depthId?y.DEPTH_BUFFER_BIT:0)),le("iTime",U.time),le("u_time",U.time),le("iTimeDelta",U.dt),le("u_delta",U.dt),le("u_time_delta",U.dt),Ae("iFrame",U.frame),Ae("u_frame",U.frame),le("iFrameRate",U.fps),le("u_fps",U.fps),le("u_refresh_rate",U.refreshRate),le("iSampleRate",44100),j.iResolution&&y.uniform3f(j.iResolution.loc,ye,we,1),j.u_resolution&&y.uniform2f(j.u_resolution.loc,ye,we),le("u_aspect",ye/we),le("u_pixelRatio",U.dpr),j.iDate&&y.uniform4fv(j.iDate.loc,U.date),j.u_date&&y.uniform4fv(j.u_date.loc,U.date),j.iScroll&&y.uniform2f(j.iScroll.loc,U.scrollX,U.scrollY),j.u_scroll&&(j.u_scroll.type===Ss?y.uniform1f(j.u_scroll.loc,te.wheel):y.uniform2f(j.u_scroll.loc,U.scrollX,U.scrollY)),le("u_wheel",te.wheel),j.u_drag&&y.uniform2f(j.u_drag.loc,te.dragX*Te,te.dragY*E),Ae("u_recursion",B),Ae("u_max_recursion",K.iterations||1),Ae("u_color_gamut",0),Ue&&(j.u_camera_pos&&y.uniform3fv(j.u_camera_pos.loc,Ue.pos),j.u_camera_dir&&y.uniform3fv(j.u_camera_dir.loc,Ue.dir),j.u_camera_view&&y.uniformMatrix4fv(j.u_camera_view.loc,!1,Ue.view)),j.iMouse){let J=te.down?1:-1,u=te.clicked?1:-1;y.uniform4f(j.iMouse.loc,te.x*Te,te.y*E,te.clickX*Te*J,te.clickY*E*u)}if(j.u_mouse)if(j.u_mouse.type===Ur){let J=te.down?1:-1;y.uniform4f(j.u_mouse.loc,te.x*Te,te.y*E,te.clickX*Te*J,te.clickY*E*J)}else y.uniform2f(j.u_mouse.loc,te.x*Te,te.y*E);j.u_mouseUV&&y.uniform2f(j.u_mouseUV.loc,te.uvX,te.uvY),le("u_mouseDown",te.down?1:0);let X=[0,0,0,0],ue=new Float32Array(12);for(let J=0;J<gn;J++){let u=K.channels[J];if(!u)continue;let g=null,S=0,R=0,q=!1,Z=U.time;if(u.pass!=null){let ne=W.get(u.pass),Ee=ne?$e(C,ne,u.buffer):null;Ee&&(g=I.get(Ee.texId),S=Ee.width,R=Ee.height)}else{let ne=C.texChannels[J];ne&&(g=I.get(ne.texId),S=ne.width,R=ne.height,q=!!ne.cubemap,ne.getTime&&(Z=ne.getTime()))}g&&(y.activeTexture(y.TEXTURE0+J),y.bindTexture(q?y.TEXTURE_CUBE_MAP:y.TEXTURE_2D,g),Ae("iChannel"+J,J),X[J]=Z,ue[J*3]=S,ue[J*3+1]=R,ue[J*3+2]=1)}j.iChannelTime&&(j.iChannelTime.type===Ur?y.uniform4fv:y.uniform1fv).call(y,j.iChannelTime.loc,X),j.iChannelResolution&&y.uniform3fv(j.iChannelResolution.loc,ue);let Me=gn;for(let J of C.samplers){let u=(g,S)=>(y.activeTexture(y.TEXTURE0+Me),y.bindTexture(S?y.TEXTURE_CUBE_MAP:y.TEXTURE_2D,g),Me++);if(J.spec.array){let g=J.spec.array.map(S=>{let R=$e(C,S,J.spec.buffer);return R?u(I.get(R.texId),!1):0});y.uniform1iv(J.info.loc,g)}else if(J.spec.pass!=null){let g=W.get(J.spec.pass),S=g?$e(C,g,J.spec.buffer):null;S&&y.uniform1i(J.info.loc,u(I.get(S.texId),!1))}else if(J.wrap){y.uniform1i(J.info.loc,u(I.get(J.wrap.texId),!!J.wrap.cubemap)),J.wrap.getTime&&le(J.name+"_time",J.wrap.getTime());let g=j[J.name+"_resolution"];g&&y.uniform2f(g.loc,J.wrap.width,J.wrap.height)}}Or(y,j,f,{strict:!1}),Or(y,j,K.uniforms,{strict:b,warnMissing:M,label:C.name}),ve.bind(re),ve.draw()}function Qe(C,{advance:U=Re,rawDt:B}={}){let K=performance.now();if(B===void 0&&(B=Math.max(0,(C-be)*.001)),be=C,B>.002&&B<.1&&(rt.push(B),rt.length>30&&rt.shift(),rt.length>=10)){let ye=[...rt].sort((we,Te)=>we-Te);St=Math.round(1/ye[ye.length>>1])}let re=ce>0?ce:Math.min(B,Oe);U?(Ie+=re*Ze,nt>0&&(Ie=(Ie%nt+nt)%nt)):re=0,Se++;let j=B>0?1/B:0;se.update(C),fe.update();let te={time:Ie,frame:Se,dt:re,fps:j};D("beforeFrame",te),r.onFrame&&r.onFrame(te);let le=new Date,Ae={time:Ie,frame:Se,dt:re,fps:j,dpr:window.devicePixelRatio||1,date:[le.getFullYear(),le.getMonth()+1,le.getDate(),le.getHours()*3600+le.getMinutes()*60+le.getSeconds()+le.getMilliseconds()/1e3],scrollX:window.scrollX||0,scrollY:window.scrollY||0,refreshRate:St};Ue&&Ue.update(B);for(let ye of me){for(let we of ye.texChannels)we&&we.update&&we.update();for(let we of ye.samplers)we.wrap&&we.wrap.update&&we.wrap.update()}for(let ye of me){let we=Math.max(1,ye.cfg.iterations|0);for(let Te=0;Te<we;Te++)ct(ye,Ae,Te);ye.cfg.screen&&qe&&We&&We.draw(I.get(ye.target.texId),x.width,x.height)}y.bindFramebuffer(y.FRAMEBUFFER,null),D("afterFrame",te),ze&&ze.update({rawDt:B,cpuMs:performance.now()-K,frame:Se,time:Ie,width:x.width,height:x.height,passes:me.length})}function je(C){if(z=requestAnimationFrame(je),!xe||!Ye){be=C;return}if(!Re&&se.size===0&&r.renderWhilePaused!==!0){be=C;return}Je>0&&C-pe<1e3/Je-.5||(pe=C,Qe(C))}function lt(){!xe||Ce||Qe(performance.now(),{advance:!1,rawDt:0})}function Ve(){Ce||z!=null||(be=performance.now(),z=requestAnimationFrame(je))}function Ne(){z!=null&&cancelAnimationFrame(z),z=null}function it(){Ce||(Ce=!0,Ne(),ge(),fe.dispose(),Et.dispose(),se.cancel(),ze&&ze.dispose(),de&&de.dispose(),Ue&&Ue.dispose(),We&&We.dispose(),x.removeEventListener("webglcontextlost",Ct),x.removeEventListener("webglcontextrestored",Lt),xt(),ve.dispose(),D("destroy"),O.clear(),!w&&x.parentNode&&x.parentNode.removeChild(x))}function xt(){for(let C of me)I.unref(C.programId),$n(I,C.target),$n(I,C.targetPrev),C.texChannels.forEach(U=>{U&&(U.dispose&&U.dispose(),I.unref(U.texId))}),(C.samplers||[]).forEach(U=>{U.wrap&&(U.wrap.dispose&&U.wrap.dispose(),I.unref(U.wrap.texId))});me.length=0,W.clear()}function Ct(C){C.preventDefault(),Ne(),xe=!1,console.warn("[ShaderMate] WebGL context lost."),D("contextlost")}async function Lt(){console.warn("[ShaderMate] WebGL context restored, rebuilding."),I._items.clear(),me.length=0,W.clear();try{await De(),xe=!0,Ve(),D("contextrestored")}catch(C){mt(C)}}x.addEventListener("webglcontextlost",Ct),x.addEventListener("webglcontextrestored",Lt);let ut=Us(x,lt);function Ke(C,U,B){if(C&&typeof C=="object"){for(let re in C)Ke(re,C[re],U);return ae}se.cancel(C);let K=!1;for(let re of me)B&&re.name!==B||C in re.cfg.uniforms&&(zn(re.cfg.uniforms,C,U),K=!0);if(!K)if(B){let re=W.get(B);if(!re)throw new et(`set: unknown pass "${B}"`);zn(re.cfg.uniforms,C,U)}else zn(f,C,U);return!Re&&xe&&Y(),ae}function dt(C,U){for(let B of me)if(!(U&&B.name!==U)&&C in B.cfg.uniforms)return yo(B.cfg.uniforms,C);return yo(f,C)}function L(C,U,B={}){let K=B.pass,re=()=>{for(let j of me)if((!K||j.name===K)&&C in j.cfg.uniforms)return j.cfg.uniforms;return f};return se.tween(C,()=>yo(re(),C),j=>zn(re(),C,j),U,B)}let $=!1;function Y(){$||($=!0,requestAnimationFrame(()=>{$=!1,Re||lt()}))}async function oe(C,U){let B=U?W.get(U):me.find(K=>K.cfg.screen)||me[0];if(!B)throw new et(`setShader: unknown pass "${U}"`);try{let{program:K,source:re,compiled:j}=await bt(B.cfg,C,V);if(Ce){y.deleteProgram(K);return}I.unref(B.programId),B.programId=I.add(K,"program"),B.uniformInfo=Ar(y,K),B.cfg.src=C,B.source=re,B.compiled=j,await He(B),Be(),D("shader",{pass:B.name}),Re||Y()}catch(K){throw mt(K),K}}async function he(C,U,B){let K=B?W.get(B):me.find(te=>te.cfg.screen)||me[0];if(!K)throw new et(`setChannel: unknown pass "${B}"`);let re=zr(U,[...W.keys()],K.name),j=K.texChannels[C];j&&(j.dispose&&j.dispose(),I.unref(j.texId),K.texChannels[C]=null),K.cfg.channels[C]=re,re&&re.pass==null&&(K.texChannels[C]=await go(y,I,re,P)),Re||Y()}let ae={version:ba,canvas:x,gl:y,isWebGL2:A,theme:r.theme,get camera(){return Ue},uniforms:f,get passes(){return me},get ready(){return Le},get loaded(){return xe},get error(){return ot},play(){return Re||(Re=!0,be=performance.now(),D("play")),ae},pause(){return Re&&(Re=!1,D("pause")),ae},toggle(){return Re?ae.pause():ae.play()},get playing(){return Re},step(C=1){for(let U=0;U<C;U++)Qe(performance.now(),{advance:!0,rawDt:ce||1/60});return ae},render:lt,destroy:it,dispose:it,get time(){return Ie},set time(C){Ie=C,Re||Y()},get frame(){return Se},get timeScale(){return Ze},set timeScale(C){Ze=C},get maxFps(){return Je},set maxFps(C){Je=C||0},get loop(){return nt},set loop(C){nt=C||0},seek(C){return Ie=C,Re||Y(),ae},setFixedDelta(C){return ce=C||0,ae},set:Ke,get:dt,tween:L,setUniform:Ke,getUniform:dt,setShader:oe,setChannel:he,getPass:C=>W.get(C)||null,getTexture(C){let U=C?W.get(C):me.find(B=>!B.cfg.screen)||me[0];return U&&U.target?I.get(U.target.texId):null},readPixels({pass:C,x:U=0,y:B=0,width:K,height:re,float:j}={}){let te=C?W.get(C):null;lt(),te&&te.target?y.bindFramebuffer(y.FRAMEBUFFER,I.get(te.target.fboId)):y.bindFramebuffer(y.FRAMEBUFFER,null);let le=K??(te&&te.target?te.target.width:x.width),Ae=re??(te&&te.target?te.target.height:x.height),ye=new Uint8Array(le*Ae*4);if(te&&te.target&&te.target.fmt.type!==y.UNSIGNED_BYTE){let Te=new Float32Array(le*Ae*4);if(y.readPixels(U,B,le,Ae,y.RGBA,y.FLOAT,Te),j!==!1)ye=Te;else for(let E=0;E<Te.length;E++)ye[E]=Math.max(0,Math.min(255,Math.round(Te[E]*255)))}else y.readPixels(U,B,le,Ae,y.RGBA,y.UNSIGNED_BYTE,ye);return y.bindFramebuffer(y.FRAMEBUFFER,null),{data:ye,width:le,height:Ae,float:ye instanceof Float32Array}},resize:yt,setSize(C,U){return ke.setFixed(C,U),yt(),ae},get width(){return x.width},get height(){return x.height},pointer:fe.state,domToShader:fe.toShader,domToUV:fe.toUV,screenshot:ut.screenshot,toBlob:ut.toBlob,download:ut.download,record:ut.record,on:F,off:G,once:N,stats:{show:(C=!0)=>{ze||(ze=Dr({visible:!1,key:r.statsKey===void 0?"F1":r.statsKey,theme:r.theme})),ze.show(C)},toggle:()=>ae.stats.show(!(ze&&ze.isVisible()))}};ke.update(),y.viewport(0,0,x.width,x.height),ge=ke.observe(yt);let Le=(async()=>(await De(),Ce||(xe=!0,Be(),D("load",ae),r.onReady&&r.onReady(ae),Ve(),Re||lt()),ae))();return Le.catch(C=>{Ce||mt(C)}),ae}var qr=`
|
|
80
80
|
// 256\xD71, palette colours in x = 0..count-1
|
|
81
81
|
uniform sampler2D u_palette;
|
|
82
82
|
uniform int u_count;
|
|
@@ -116,7 +116,7 @@ int colorKey(vec4 c) {
|
|
|
116
116
|
ivec3 b = ivec3(floor(c.rgb * 255.0 + 0.5));
|
|
117
117
|
return b.r * 65536 + b.g * 256 + b.b;
|
|
118
118
|
}
|
|
119
|
-
`,
|
|
119
|
+
`,Yr=`
|
|
120
120
|
// 0 box, 1 nearest
|
|
121
121
|
uniform int u_resample;
|
|
122
122
|
// brightness, contrast, saturation, gamma
|
|
@@ -166,7 +166,7 @@ void main() {
|
|
|
166
166
|
a = (a >= u_alphaCut && a > 0.0) ? 1.0 : 0.0;
|
|
167
167
|
fragColor = vec4(c * a, a);
|
|
168
168
|
}
|
|
169
|
-
`,
|
|
169
|
+
`,Kr=`
|
|
170
170
|
// threshold bytes in .r
|
|
171
171
|
uniform sampler2D u_matrix;
|
|
172
172
|
// 0 pass-through, 1 nearest, 2 ordered
|
|
@@ -189,7 +189,7 @@ void main() {
|
|
|
189
189
|
}
|
|
190
190
|
fragColor = vec4(palColor(nearestIndex(c)), 1.0);
|
|
191
191
|
}
|
|
192
|
-
`,
|
|
192
|
+
`,Zr=`
|
|
193
193
|
// iteration index, set by ShaderMate for passes with iterations (declared here: a FragCoord.xyz built-in)
|
|
194
194
|
uniform int u_recursion;
|
|
195
195
|
uniform int u_on;
|
|
@@ -220,7 +220,7 @@ void main() {
|
|
|
220
220
|
int idx = nearestIndex(c);
|
|
221
221
|
fragColor = vec4(c - palColor(idx), float(idx));
|
|
222
222
|
}
|
|
223
|
-
`,
|
|
223
|
+
`,Jr=`
|
|
224
224
|
uniform int u_on;
|
|
225
225
|
void main() {
|
|
226
226
|
ivec2 P = topDown();
|
|
@@ -228,7 +228,7 @@ void main() {
|
|
|
228
228
|
vec4 d = at(iChannel1, P);
|
|
229
229
|
fragColor = d.a < 0.0 ? vec4(0.0) : vec4(palColor(int(d.a + 0.5)), 1.0);
|
|
230
230
|
}
|
|
231
|
-
`,
|
|
231
|
+
`,Qr=`
|
|
232
232
|
uniform int u_on;
|
|
233
233
|
void main() {
|
|
234
234
|
ivec2 P = topDown();
|
|
@@ -255,7 +255,7 @@ void main() {
|
|
|
255
255
|
}
|
|
256
256
|
fragColor = cs[best];
|
|
257
257
|
}
|
|
258
|
-
`,
|
|
258
|
+
`,ei=`
|
|
259
259
|
uniform int u_on;
|
|
260
260
|
void main() {
|
|
261
261
|
ivec2 P = topDown();
|
|
@@ -276,7 +276,7 @@ void main() {
|
|
|
276
276
|
if (m >= 5) { fragColor = cs[i]; return; }
|
|
277
277
|
}
|
|
278
278
|
}
|
|
279
|
-
`,
|
|
279
|
+
`,ti=`
|
|
280
280
|
// 0 none, 1 outer, 2 inner
|
|
281
281
|
uniform int u_outline;
|
|
282
282
|
uniform int u_corners;
|
|
@@ -298,11 +298,11 @@ void main() {
|
|
|
298
298
|
if (u_outline == 1 ? (!o && other) : (o && !other)) { fragColor = vec4(u_outlineColor, 1.0); return; }
|
|
299
299
|
}
|
|
300
300
|
}
|
|
301
|
-
`;var sn=(e,t)=>{let n=document.createElement("canvas");return n.width=e,n.height=t,n};async function Sr(){if(typeof document>"u")throw new Error("No DOM");let e=sn(1,1).getContext("webgl2");if(!e)throw new Error("WebGL 2 is not available");if(!e.getExtension("EXT_color_buffer_float"))throw new Error("Float render targets are not available");let t=e.getExtension("WEBGL_debug_renderer_info"),n=String(t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER));e.getExtension("WEBGL_lose_context")?.loseContext();let o=sn(1,1),i=sn(1,1),r=sn(256,1),a=sn(1,1),c=b=>({element:b,filter:"nearest",wrap:"clamp"}),l=br({canvas:o,webgl:2,size:[1,1],pixelRatio:1,autoplay:!1,pauseWhenHidden:!1,pointer:!1,errorOverlay:!1,warnMissingUniforms:!1,preserveDrawingBuffer:!0,premultipliedAlpha:!1,antialias:!1,dialect:"shadermate",common:xr,samplers:{u_palette:c(r),u_matrix:c(a)},uniforms:{u_count:1,u_distance:0,u_resample:0,u_adjust:[0,0,0,1],u_hue:0,u_crop:[0,0,1,1],u_alphaCut:.5,u_mode:0,u_levels:1,u_amount:0,u_skew:1,u_strength:1,u_kn:0,u_kernel:new Float32Array(Wn*3),u_outline:0,u_corners:0,u_outlineColor:[0,0,0]},passes:[{name:"prep",shader:yr,float:"full",filter:"nearest",channels:[{...c(i),dynamic:!1}]},{name:"quant",shader:wr,filter:"nearest",channels:["prep"]},{name:"diffuse",shader:vr,float:"full",filter:"nearest",pingpong:!0,iterations:2,channels:["prep","diffuse"]},{name:"resolve",shader:Er,filter:"nearest",channels:["quant","diffuse"]},{name:"orphan",shader:kr,filter:"nearest",channels:["resolve"]},{name:"smooth",shader:Mr,filter:"nearest",channels:["orphan"]},{name:"out",shader:Cr,screen:!0,channels:["smooth"]}]}),s=null;if(l.on("error",b=>{s=b}),await l.ready,s||l.error)throw l.destroy(),s||l.error;let d=(b,S)=>{for(let w in S)l.set(w,S[w],b)},f=null,u="",h="";async function x(b){if(b.canvas===f&&!b.dirty)return;i.width=b.width,i.height=b.height;let S=i.getContext("2d");S.clearRect(0,0,i.width,i.height),S.drawImage(b.canvas,0,0),await l.setChannel(0,{...c(i),dynamic:!1},"prep"),f=b.canvas}function E(b){let S=b.palette.map(L=>L.join(",")).join(";");if(S===u)return;u=S;let w=r.getContext("2d"),A=w.createImageData(256,1);b.palette.forEach((L,T)=>A.data.set([L[0],L[1],L[2],255],T*4)),w.putImageData(A,0,0)}function y(b){let S=b?`${b.w}x${b.h}:${b.levels}:${b.values.join(",")}`:"none";if(S===h)return;h=S;let w=b||{w:1,h:1,values:[0]};a.width=w.w,a.height=w.h;let A=a.getContext("2d"),L=A.createImageData(w.w,w.h);for(let T=0;T<w.values.length;T++)L.data.set([w.values[T],0,0,255],T*4);A.putImageData(L,0,0)}async function k(b,S){let w=b.settings;await x(S),b.quantize&&E(b),y(b.map),(l.width!==b.width||l.height!==b.height)&&l.setSize(b.width,b.height);let A=b.kind==="diffusion",L=new Array(Wn).fill(null).map((D,U)=>b.kernel&&b.kernel[U]||[0,0,0]);l.set({u_count:b.palette.length||1,u_distance:b.distance,u_resample:w.size.resample==="nearest"?1:0,u_adjust:[w.adjust.brightness,w.adjust.contrast,w.adjust.saturation,w.adjust.gamma],u_hue:w.adjust.hue,u_crop:[b.crop.x,b.crop.y,b.crop.w,b.crop.h],u_alphaCut:w.alpha.threshold,u_mode:b.quantize?b.kind==="ordered"?2:1:0,u_levels:b.map?b.map.levels:1,u_amount:b.map?b.spread*w.dither.strength:0,u_skew:b.skew,u_strength:w.dither.strength,u_kn:b.kernel?b.kernel.length:0,u_kernel:new Float32Array(L.flat()),u_outline:{none:0,outer:1,inner:2}[b.outline.mode],u_corners:b.outline.corners?1:0,u_outlineColor:b.outline.color.map(D=>D/255)}),d("diffuse",{u_on:A?1:0}),d("resolve",{u_on:A?1:0}),d("orphan",{u_on:w.cleanup.orphans?1:0}),d("smooth",{u_on:w.cleanup.smooth?1:0}),l.getPass("diffuse").cfg.iterations=A?b.waves:1;let{data:T}=l.readPixels(),P=b.width,z=b.height,v=new Uint8ClampedArray(P*z*4),I=P*4;for(let D=0;D<z;D++)v.set(T.subarray((z-1-D)*I,(z-D)*I),D*I);return v}return{name:"webgl",renderer:n,software:/swiftshader|llvmpipe|softpipe|software|basic render/i.test(n),run:k,shader:l,destroy(){l.destroy()}}}var ro=typeof document<"u",Tr=e=>e&&typeof e=="object"&&"data"in e&&"width"in e&&"height"in e&&e.data&&e.data.length===e.width*e.height*4;async function Va(e){if(typeof Blob<"u"&&e instanceof Blob){if(typeof createImageBitmap=="function")try{return await createImageBitmap(e)}catch{}e=URL.createObjectURL(e)}if(!ro)throw new Error("Loading images by URL needs a browser; pass { width, height, data } in Node.");let t=new Image;return t.crossOrigin="anonymous",t.decoding="async",t.src=e,await t.decode(),t}function Wa(e){return{width:e.naturalWidth||e.videoWidth||e.displayWidth||e.codedWidth||e.width||0,height:e.naturalHeight||e.videoHeight||e.displayHeight||e.codedHeight||e.height||0}}function qa(e){if(e&&!Tr(e)&&typeof e=="object"){if(e.canvas&&typeof e.canvas=="object"&&"getContext"in e.canvas)return e.canvas;if(e.elt&&typeof e.elt=="object"&&"getContext"in e.elt)return e.elt}return e}async function _r(e,t={}){let n=t.maxSize||4096,o=qa(e);if((typeof o=="string"||typeof Blob<"u"&&o instanceof Blob)&&(o=await Va(o)),o&&typeof o.complete=="boolean"&&!o.complete&&o.decode&&await o.decode(),Tr(o)){let d={width:o.width,height:o.height,data:o.data,canvas:null};return ro&&Object.defineProperty(d,"canvas",{configurable:!0,get(){let f=document.createElement("canvas");f.width=o.width,f.height=o.height;let u=new ImageData(new Uint8ClampedArray(o.data),o.width,o.height);return f.getContext("2d").putImageData(u,0,0),Object.defineProperty(d,"canvas",{value:f}),f}}),d}if(!ro)throw new Error("Unsupported source in a non-browser environment. Pass { width, height, data }.");let{width:i,height:r}=Wa(o);if(!i||!r)throw new Error("Source has no size yet (is the image or video loaded?)");let a=Math.min(1,n/Math.max(i,r));i=Math.max(1,Math.round(i*a)),r=Math.max(1,Math.round(r*a));let c=t.canvas||document.createElement("canvas");c.width=i,c.height=r;let l=c.getContext("2d",{willReadFrequently:!0});l.clearRect(0,0,i,r),l.imageSmoothingEnabled=a<1,l.imageSmoothingQuality="high",l.drawImage(o,0,0,i,r);let s=null;return{width:i,height:r,canvas:c,dirty:!0,get data(){return s||(s=l.getImageData(0,0,i,r).data)}}}Bt();Bt();function Rr(e,t=1,n={}){let o=t>1||n.grid?_t(e,t,n):e,i=n.canvas||document.createElement("canvas");return i.width=o.width,i.height=o.height,i.getContext("2d").putImageData(new ImageData(new Uint8ClampedArray(o.data),o.width,o.height),0,0),i}function Be(e,t,n="application/octet-stream"){let o=e instanceof Blob?e:new Blob([e],{type:n}),i=URL.createObjectURL(o),r=document.createElement("a");r.href=i,r.download=t,r.rel="noopener",document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(i),1e4)}var _n=null;function An(e,t=0){if(!_n){_n=new Uint32Array(256);for(let n=0;n<256;n++){let o=n;for(let i=0;i<8;i++)o=o&1?3988292384^o>>>1:o>>>1;_n[n]=o>>>0}}t=~t>>>0;for(let n=0;n<e.length;n++)t=_n[(t^e[n])&255]^t>>>8;return~t>>>0}Bt();var Ya=[137,80,78,71,13,10,26,10];async function Ka(e){if(typeof CompressionStream=="function"){let n=new CompressionStream("deflate"),o=new Blob([e]).stream().pipeThrough(n);return new Uint8Array(await new Response(o).arrayBuffer())}let{deflateSync:t}=await import("node:zlib");return new Uint8Array(t(e))}function Qt(e,t){let n=new Uint8Array(12+t.length),o=new DataView(n.buffer);o.setUint32(0,t.length);for(let i=0;i<4;i++)n[4+i]=e.charCodeAt(i);return n.set(t,8),o.setUint32(8+t.length,An(n.subarray(4,8+t.length))),n}function Za(e){let t=e.data,n=e.width*e.height,o=new Map,i=[],r=new Uint8Array(n);for(let a=0;a<n;a++){let c=a*4,l=t[c+3]===0?-1:(t[c]<<24|t[c+1]<<16|t[c+2]<<8|t[c+3])>>>0,s=o.get(l);if(s===void 0){if(i.length===256)return null;s=i.length,o.set(l,s),i.push(l===-1?[0,0,0,0]:[t[c],t[c+1],t[c+2],t[c+3]])}r[a]=s}return{colors:i,indices:r}}async function dt(e,t={}){t.width&&t.height?e=Ar(e,t.width,t.height):(t.scale&&t.scale>1||t.grid)&&(e=_t(e,t.scale||1,t));let{width:n,height:o}=e,i=t.indexed===!1?null:Za(e),r=new Uint8Array(13),a=new DataView(r.buffer);a.setUint32(0,n),a.setUint32(4,o);let c=[new Uint8Array(Ya)],l;if(i){let u=i.colors.length<=2?1:i.colors.length<=4?2:i.colors.length<=16?4:8;r.set([u,3,0,0,0],8);let h=Math.ceil(n*u/8);l=new Uint8Array((h+1)*o);for(let x=0;x<o;x++){let E=x*(h+1)+1;for(let y=0;y<n;y++){let k=i.indices[x*n+y],b=y*u;l[E+(b>>3)]|=k<<8-u-(b&7)}}if(c.push(Qt("IHDR",r)),c.push(Qt("PLTE",Uint8Array.from(i.colors.flatMap(x=>x.slice(0,3))))),i.colors.some(x=>x[3]<255)){let x=i.colors.length;for(;x>0&&i.colors[x-1][3]===255;)x--;c.push(Qt("tRNS",Uint8Array.from(i.colors.slice(0,x).map(E=>E[3]))))}}else{r.set([8,6,0,0,0],8),l=new Uint8Array((n*4+1)*o);for(let u=0;u<o;u++)l.set(e.data.subarray?e.data.subarray(u*n*4,(u+1)*n*4):Array.prototype.slice.call(e.data,u*n*4,(u+1)*n*4),u*(n*4+1)+1);c.push(Qt("IHDR",r))}c.push(Qt("IDAT",await Ka(l))),c.push(Qt("IEND",new Uint8Array(0)));let s=c.reduce((u,h)=>u+h.length,0),d=new Uint8Array(s),f=0;for(let u of c)d.set(u,f),f+=u.length;return d}var Ja=e=>typeof HTMLVideoElement<"u"&&e instanceof HTMLVideoElement,Qa=e=>typeof VideoFrame<"u"&&e instanceof VideoFrame;async function Ur(e={}){let t=e.backend||"auto",n=null,o=null;if(t!=="cpu"&&typeof document<"u")try{n=await Sr()}catch(s){if(o=s,t==="webgl")throw s}let i=typeof document<"u"?document.createElement("canvas"):null,r={source:null,frame:null},a=Promise.resolve();async function c(s){if(s===r.source&&r.frame&&!Ja(s)&&!Qa(s))return r.frame.dirty=!1,r.frame;let d=await _r(s,{maxSize:e.maxSourceSize,canvas:i});return r={source:s,frame:d},d}async function l(s,d){let f=typeof performance<"u"?performance.now():Date.now(),u=await c(s),h=Ho(d,u),x,E="cpu",y=h.kind==="diffusion"&&(e.diffusion==="cpu"||e.diffusion!=="gpu"&&n&&n.software);n&&u.canvas&&!y?(x=await n.run(h,u),E="webgl"):x=Xo(h,u);let k=(typeof performance<"u"?performance.now():Date.now())-f;return es(h,x,E,k)}return{get backend(){return n?"webgl":"cpu"},get renderer(){return n?n.renderer:""},get fallbackReason(){return o?String(o.message||o):""},process(s,d={}){let f=a.then(()=>l(s,d));return a=f.catch(()=>{}),f},invalidate(){r={source:null,frame:null}},destroy(){n&&n.destroy(),n=null},get shader(){return n?n.shader:null}}}function es(e,t,n="cpu",o=0){return{width:e.width,height:e.height,data:t,palette:e.paletteHex?e.paletteHex.slice():null,settings:e.settings,kind:e.kind,waves:e.waves,crop:{x:e.crop.x/e.srcWidth,y:e.crop.y/e.srcHeight,w:e.crop.w/e.srcWidth,h:e.crop.h/e.srcHeight},backend:n,ms:o,usedColors(){return Pr(this)},toImageData(){return new ImageData(new Uint8ClampedArray(this.data),this.width,this.height)},toCanvas(r=1,a={}){return Rr(this,r,a)},toPNG(r={}){return dt(this,r)},async toBlob(r={}){return new Blob([await dt(this,r)],{type:"image/png"})}}}so();zr();Bt();bt();Rn();var cn=[{id:"balanced",name:"Balanced",description:"Endesga 32, Bayer 4\xD74. A good first look at most photos.",settings:{size:{width:96},palette:{source:"builtin",id:"endesga-32"},dither:{method:"bayer4",strength:.6}}},{id:"game-boy",name:"Game Boy",description:"Four greens, 160 px wide, ordered dither.",settings:{size:{width:160},palette:{source:"builtin",id:"game-boy-dmg"},dither:{method:"bayer4",strength:1},adjust:{contrast:.15}}},{id:"pico-8",name:"PICO-8",description:"128 px, the PICO-8 palette, blue-noise dither.",settings:{size:{width:128},palette:{source:"builtin",id:"pico-8"},dither:{method:"bluenoise",strength:.7}}},{id:"one-bit",name:"1-bit Atkinson",description:"Classic Mac look: two colours, Atkinson diffusion.",settings:{size:{width:192},palette:{source:"builtin",id:"1-bit-monitor"},dither:{method:"atkinson",strength:1},adjust:{contrast:.2}}},{id:"faithful",name:"Faithful colour",description:"Palette extracted from the image, Floyd\u2013Steinberg.",settings:{size:{width:128},palette:{source:"extract",count:24},dither:{method:"floyd-steinberg",strength:.75}}},{id:"sprite",name:"Clean sprite",description:"No dither, nearest resample, orphan cleanup and a dark outline. For art with transparency.",settings:{size:{width:48,resample:"nearest"},palette:{source:"extract",count:12},dither:{method:"none"},cleanup:{orphans:!0},outline:{mode:"outer",color:"#1a1c2c"}}},{id:"cga",name:"CGA",description:"16 hard colours with an 8\xD78 Bayer pattern.",settings:{size:{width:160},palette:{source:"builtin",id:"cga-16"},dither:{method:"bayer8",strength:1}}},{id:"newsprint",name:"Newsprint",description:"Grey clustered-dot halftone.",settings:{size:{width:220},palette:{source:"builtin",id:"grayscale-4"},dither:{method:"cluster8",strength:1},adjust:{saturation:-1}}},{id:"soft",name:"Soft painterly",description:"Resurrect 64 with Sierra Lite and a light smooth.",settings:{size:{width:112},palette:{source:"builtin",id:"resurrect-64"},dither:{method:"sierra-lite",strength:.6},cleanup:{smooth:!0}}}];function m(e,t={},...n){let[o,...i]=e.split("."),r=document.createElement(o||"div");i.length&&(r.className=i.join(" "));for(let[a,c]of Object.entries(t||{}))c==null||c===!1||(a.startsWith("on")&&typeof c=="function"?r.addEventListener(a.slice(2),c):a==="html"?r.innerHTML=c:a==="text"?r.textContent=c:a==="style"&&typeof c=="object"?Object.assign(r.style,c):a==="dataset"?Object.assign(r.dataset,c):a in r&&typeof c!="string"&&a!=="list"?r[a]=c:r.setAttribute(a,c===!0?"":c));return jr(r,n),r}function jr(e,t){for(let n of t.flat(1/0))n==null||n===!1||e.append(n instanceof Node?n:document.createTextNode(String(n)));return e}function tt(e,...t){return e.replaceChildren(),jr(e,t)}var cs=0,ln=(e="itp")=>`${e}-${++cs}`;function Un({accept:e="",multiple:t=!1}={}){return new Promise(n=>{let o=m("input",{type:"file",accept:e,multiple:t,style:{display:"none"}});o.addEventListener("change",()=>{n([...o.files]),o.remove()}),o.addEventListener("cancel",()=>{n([]),o.remove()}),document.body.append(o),o.click()})}var Hr={upload:'<path d="M12 15V4m0 0-4 4m4-4 4 4"/><path d="M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3"/>',download:'<path d="M12 4v11m0 0-4-4m4 4 4-4"/><path d="M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3"/>',image:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><circle cx="9" cy="10" r="1.6"/><path d="m4 17 5-4.5 4 3.5 3-2.5 4 3.5"/>',film:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M7.5 4.5v15M16.5 4.5v15M3.5 9h4M3.5 15h4M16.5 9h4M16.5 15h4"/>',files:'<path d="M8 7V5.5A1.5 1.5 0 0 1 9.5 4H15l4 4v8.5a1.5 1.5 0 0 1-1.5 1.5H16"/><rect x="4.5" y="7" width="11.5" height="13" rx="1.5"/>',presets:'<rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><path d="M16.5 13.5v6M13.5 16.5h6"/>',palette:'<path d="M12 3.5a8.5 8.5 0 1 0 0 17c1.2 0 1.8-.9 1.4-2l-.3-.8c-.4-1.2.5-2.2 1.7-2.2h1.7a4 4 0 0 0 4-4c0-4.4-3.8-8-8.5-8Z"/><circle cx="8" cy="11" r="1"/><circle cx="11" cy="7.5" r="1"/><circle cx="15.5" cy="8.5" r="1"/>',search:'<circle cx="11" cy="11" r="6"/><path d="m20 20-4.5-4.5"/>',x:'<path d="M6 6l12 12M18 6 6 18"/>',plus:'<path d="M12 5v14M5 12h14"/>',minus:'<path d="M5 12h14"/>',chevron:'<path d="m9.5 6 6 6-6 6"/>',chevronDown:'<path d="m6 9.5 6 6 6-6"/>',undo:'<path d="M9 7 4.5 11.5 9 16"/><path d="M5 11.5h9.5a5 5 0 0 1 0 10H11"/>',redo:'<path d="m15 7 4.5 4.5L15 16"/><path d="M19 11.5H9.5a5 5 0 0 0 0 10H13"/>',compare:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M12 2.5v19"/><path d="M15 9.5l2 2.5-2 2.5"/><path d="M9 9.5 7 12l2 2.5"/>',grid:'<rect x="3.5" y="3.5" width="17" height="17" rx="2"/><path d="M9.2 3.5v17M14.8 3.5v17M3.5 9.2h17M3.5 14.8h17"/>',fit:'<path d="M4 9V5.5A1.5 1.5 0 0 1 5.5 4H9M15 4h3.5A1.5 1.5 0 0 1 20 5.5V9M20 15v3.5a1.5 1.5 0 0 1-1.5 1.5H15M9 20H5.5A1.5 1.5 0 0 1 4 18.5V15"/>',zoomIn:'<circle cx="11" cy="11" r="6"/><path d="m20 20-4.5-4.5M11 8.5v5M8.5 11h5"/>',zoomOut:'<circle cx="11" cy="11" r="6"/><path d="m20 20-4.5-4.5M8.5 11h5"/>',sun:'<circle cx="12" cy="12" r="3.5"/><path d="M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6 7 7M17 17l1.4 1.4M5.6 18.4 7 17M17 7l1.4-1.4"/>',moon:'<path d="M19.5 14.5A7.5 7.5 0 0 1 9.5 4.5a7.5 7.5 0 1 0 10 10Z"/>',sidebarLeft:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M9.5 4.5v15"/>',sidebarRight:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M14.5 4.5v15"/>',play:'<path d="M8 5.5v13l10.5-6.5L8 5.5Z"/>',pause:'<path d="M8.5 5.5v13M15.5 5.5v13"/>',stepBack:'<path d="M7 5.5v13M18 6l-8 6 8 6V6Z"/>',stepForward:'<path d="M17 5.5v13M6 6l8 6-8 6V6Z"/>',trash:'<path d="M4.5 7h15M9.5 7V5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v2M6.5 7l1 12a1.5 1.5 0 0 0 1.5 1.4h6a1.5 1.5 0 0 0 1.5-1.4l1-12"/>',link:'<path d="M10 14a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7L11.5 6.8"/><path d="M14 10a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.3-1.3"/>',braces:'<path d="M8.5 4.5H8A2 2 0 0 0 6 6.5v3A2.5 2.5 0 0 1 3.5 12 2.5 2.5 0 0 1 6 14.5v3a2 2 0 0 0 2 2h.5M15.5 4.5h.5a2 2 0 0 1 2 2v3a2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0-2.5 2.5v3a2 2 0 0 1-2 2h-.5"/>',pipette:'<path d="m14.5 6.5 3 3M12 9l-7.2 7.2a2 2 0 0 0-.5 1V20h2.8a2 2 0 0 0 1-.5L15.2 12"/><path d="M13 7.5 15.8 4.7a2.3 2.3 0 0 1 3.3 3.3L16.3 10.8 13 7.5Z"/>',check:'<path d="m5 12.5 4.5 4.5L19 7.5"/>',keyboard:'<rect x="2.5" y="6" width="19" height="12" rx="2"/><path d="M6 10h.01M9.5 10h.01M13 10h.01M16.5 10h.01M8 14h8"/>',reset:'<path d="M4.5 12a7.5 7.5 0 1 0 2.2-5.3L4.5 9"/><path d="M4.5 4.5V9H9"/>',sheet:'<rect x="3.5" y="3.5" width="17" height="17" rx="2"/><path d="M3.5 12h17M12 3.5v17"/>',tiles:'<rect x="3.5" y="3.5" width="7" height="7" rx="1"/><rect x="13.5" y="3.5" width="7" height="7" rx="1"/><rect x="3.5" y="13.5" width="7" height="7" rx="1"/><path d="M13.5 17h7M17 13.5v7"/>',zip:'<path d="M6 3.5h8l4.5 4.5v11a1.5 1.5 0 0 1-1.5 1.5H6A1.5 1.5 0 0 1 4.5 19V5A1.5 1.5 0 0 1 6 3.5Z"/><path d="M10 3.5v2h2v2h-2v2h2v2h-2v3"/>',gif:'<rect x="3.5" y="5.5" width="17" height="13" rx="2"/><path d="M10 10.5H8.5a1.5 1.5 0 0 0 0 3H10V12M13 10v4M16 14v-4h2M16 12h1.5"/>',more:'<circle cx="6" cy="12" r="1"/><circle cx="12" cy="12" r="1"/><circle cx="18" cy="12" r="1"/>',menu:'<path d="M4 7h16M4 12h16M4 17h16"/>',sliders:'<path d="M4 7h9M17 7h3M4 17h3M11 17h9"/><circle cx="15" cy="7" r="2"/><circle cx="9" cy="17" r="2"/>',info:'<circle cx="12" cy="12" r="8.5"/><path d="M12 11v5M12 8h.01"/>',unlink:'<path d="M10 14a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7L11.5 6.8"/><path d="M14 10a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.3-1.3"/><path d="M4 4l16 16"/>',arrowUp:'<path d="M12 19V5M6 11l6-6 6 6"/>',arrowDown:'<path d="M12 5v14M6 13l6 6 6-6"/>',layers:'<path d="m12 4 8.5 4.5L12 13 3.5 8.5 12 4Z"/><path d="m3.5 12.5 8.5 4.5 8.5-4.5"/><path d="m3.5 16.5 8.5 4.5 8.5-4.5"/>',frame:'<path d="M7 3v14a1 1 0 0 0 1 1h13"/><path d="M3 7h13a1 1 0 0 1 1 1v13"/>',copy:'<rect x="8.5" y="8.5" width="11" height="11" rx="1.5"/><path d="M15.5 8.5V6A1.5 1.5 0 0 0 14 4.5H6A1.5 1.5 0 0 0 4.5 6v8A1.5 1.5 0 0 0 6 15.5h2.5"/>',clipboard:'<rect x="5" y="4.5" width="14" height="16" rx="2"/><path d="M9 4.5V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v.5M9 10h6M9 14h4"/>',github:'<path d="M9 19c-4 1.3-4-2-5.5-2.5M14.5 21v-3.2c0-1 .1-1.4-.5-2 2.6-.3 5.5-1.3 5.5-5.8a4.5 4.5 0 0 0-1.2-3.1 4.2 4.2 0 0 0-.1-3.1s-1-.3-3.3 1.2a11.4 11.4 0 0 0-6 0C6.6 3.5 5.6 3.8 5.6 3.8a4.2 4.2 0 0 0-.1 3.1A4.5 4.5 0 0 0 4.3 10c0 4.5 2.9 5.5 5.5 5.8-.6.6-.6 1.2-.5 2V21"/>'};function Y(e,t=""){return`<svg class="i ${t}" viewBox="0 0 24 24" aria-hidden="true" focusable="false">${Hr[e]||""}</svg>`}var Sc=Object.keys(Hr);function Xr(e){let t=et(e),n="shared",o=[],i=[],r=new Map,a=new Set,c=null,l=0,s=200,d=u=>{for(let h of a)h(t,u)},f=(u,h)=>JSON.stringify(u)===JSON.stringify(h);return{get settings(){return t},get target(){return n},subscribe(u){return a.add(u),()=>a.delete(u)},update(u,h={}){let x=Tt(t,u);if(f(x,t))return;let E=Date.now(),y=h.key&&h.key===c&&E-l<1200;h.history!==!1&&!y&&(o.push(t),o.length>s&&o.shift(),i.length=0),c=h.key||null,l=E,t=x,d("update")},replace(u,h="replace"){u=et(u),!f(u,t)&&(o.push(t),i.length=0,c=null,t=u,d(h))},setTarget(u,h){r.set(n,{past:o,future:i}),n=u;let x=r.get(u)||{past:[],future:[]};o=x.past,i=x.future,c=null,t=et(h),d("target")},dropTarget(u){u!==n&&r.delete(u)},commit(){c=null},undo(){return o.length?(i.push(t),t=o.pop(),c=null,d("undo"),!0):!1},redo(){return i.length?(o.push(t),t=i.pop(),c=null,d("redo"),!0):!1},get canUndo(){return o.length>0},get canRedo(){return i.length>0}}}var Vr=[.25,.5,1,2,3,4,6,8,12,16,24,32,48,64];function Wr({onPick:e,onViewChange:t}={}){let n=m("canvas.screen",{role:"img","aria-label":"Preview"}),o=m("span.lbl.l",{text:"Original"}),i=m("span.lbl.r",{text:"Pixel"}),r=m("button",{type:"button","aria-label":"Drag to compare original and result",html:Y("compare")}),a=m("div.itp-split",{hidden:!0},o,i,r),c=m("div.itp-view",{tabindex:"0","aria-label":"Canvas. Scroll to zoom, drag to pan."},n,a),l=n.getContext("2d"),s={result:null,original:null,crop:null,w:0,h:0,x:0,y:0,z:1,fitted:!0,compare:!1,splitAt:.5,grid:!1,picking:!1},d=1,f=0,u=0,h=null,x="";function E(){let v=getComputedStyle(c),I=v.getPropertyValue("--checker-a").trim()||"#1a1b1f",D=v.getPropertyValue("--checker-b").trim()||"#222",U=I+D;if(U===x)return h;let B=document.createElement("canvas");B.width=B.height=16;let H=B.getContext("2d");return H.fillStyle=I,H.fillRect(0,0,16,16),H.fillStyle=D,H.fillRect(0,0,8,8),H.fillRect(8,8,8,8),x=U,h=l.createPattern(B,"repeat"),h}function y(){let v=c.getBoundingClientRect(),I=Math.min(3,window.devicePixelRatio||1);if(Math.abs(v.width-f)<.5&&Math.abs(v.height-u)<.5&&I===d&&n.width>1){A();return}d=I,f=v.width,u=v.height,n.width=Math.max(1,Math.round(f*d)),n.height=Math.max(1,Math.round(u*d)),s.fitted?b(!1):A()}function k(){if(!s.w)return 1;let v=f<600?16:48;return Math.max(.05,Math.min((f-v)/s.w,(u-v)/s.h))}function b(v=!0){s.z=k(),s.x=(f-s.w*s.z)/2,s.y=(u-s.h*s.z)/2,s.fitted=!0,A(),v&&t&&t(z())}function S(v,I=f/2,D=u/2){v=Math.max(.05,Math.min(128,v));let U=(I-s.x)/s.z,B=(D-s.y)/s.z;s.z=v,s.x=I-U*v,s.y=D-B*v,s.fitted=!1,A(),t&&t(z())}function w(v,I,D){let U=s.z,B;v>0?B=Vr.find(H=>H>U+1e-6)||U*1.5:B=[...Vr].reverse().find(H=>H<U-1e-6)||U/1.5,S(B,I,D)}function A(){if(l.setTransform(1,0,0,1,0,0),l.clearRect(0,0,n.width,n.height),!s.result){a.hidden=!0;return}l.setTransform(d,0,0,d,0,0);let v=Math.round(s.x*d)/d,I=Math.round(s.y*d)/d,D=Math.round(s.w*s.z*d)/d,U=Math.round(s.h*s.z*d)/d;if(l.fillStyle=E(),l.fillRect(v,I,D,U),l.imageSmoothingEnabled=!1,l.drawImage(s.result,v,I,D,U),s.compare&&s.original){let B=v+D*s.splitAt;l.save(),l.beginPath(),l.rect(v,I,Math.max(0,B-v),U),l.clip(),l.fillStyle=E(),l.fillRect(v,I,D,U),l.imageSmoothingEnabled=!0,l.imageSmoothingQuality="high";try{let H=s.original.naturalWidth||s.original.videoWidth||s.original.width,V=s.original.naturalHeight||s.original.videoHeight||s.original.height,G=s.crop||{x:0,y:0,w:1,h:1};l.drawImage(s.original,G.x*H,G.y*V,G.w*H,G.h*V,v,I,D,U)}catch{}l.restore(),a.hidden=!1,a.style.left=`${B}px`,a.style.top=`${Math.max(0,I)}px`,a.style.bottom=`${Math.max(0,u-(I+U))}px`}else a.hidden=!0;if(s.grid&&s.z>=6){l.save(),l.beginPath(),l.rect(v,I,D,U),l.clip(),l.strokeStyle="rgba(127,127,127,0.35)",l.lineWidth=1/d,l.beginPath();let B=Math.max(0,Math.floor(-s.x/s.z)),H=Math.min(s.w,Math.ceil((f-s.x)/s.z)),V=Math.max(0,Math.floor(-s.y/s.z)),G=Math.min(s.h,Math.ceil((u-s.y)/s.z));for(let ce=B;ce<=H;ce++){let be=Math.round((v+ce*s.z)*d)/d+.5/d;l.moveTo(be,Math.max(I,0)),l.lineTo(be,Math.min(I+U,u))}for(let ce=V;ce<=G;ce++){let be=Math.round((I+ce*s.z)*d)/d+.5/d;l.moveTo(Math.max(v,0),be),l.lineTo(Math.min(v+D,f),be)}l.stroke(),l.restore()}}let L=null,T=new Map;c.addEventListener("pointerdown",v=>{if(!(v.target===r||r.contains(v.target))&&!(v.target!==c&&v.target!==n)){if(c.focus({preventScroll:!0}),T.set(v.pointerId,{x:v.clientX,y:v.clientY}),c.setPointerCapture(v.pointerId),s.picking&&v.button===0&&T.size===1){let I=c.getBoundingClientRect(),D=(v.clientX-I.left-s.x)/(s.w*s.z),U=(v.clientY-I.top-s.y)/(s.h*s.z);D>=0&&U>=0&&D<1&&U<1&&e&&e(D,U);return}L={x:v.clientX,y:v.clientY,ox:s.x,oy:s.y},c.classList.add("panning")}}),c.addEventListener("pointermove",v=>{if(!T.has(v.pointerId))return;let I=T.get(v.pointerId);if(T.set(v.pointerId,{x:v.clientX,y:v.clientY}),T.size===2){let[D,U]=[...T.values()],B=[...T.entries()].find(([G])=>G!==v.pointerId)[1],H=Math.hypot(I.x-B.x,I.y-B.y),V=Math.hypot(D.x-U.x,D.y-U.y);if(H>0){let G=c.getBoundingClientRect();S(s.z*V/H,(D.x+U.x)/2-G.left,(D.y+U.y)/2-G.top)}L=null;return}L&&(s.x=L.ox+v.clientX-L.x,s.y=L.oy+v.clientY-L.y,s.fitted=!1,A())});let P=v=>{T.delete(v.pointerId),T.size||(L=null,c.classList.remove("panning"),t&&t(z()))};c.addEventListener("pointerup",P),c.addEventListener("pointercancel",P),c.addEventListener("wheel",v=>{v.preventDefault();let I=c.getBoundingClientRect(),D=v.clientX-I.left,U=v.clientY-I.top;if(!v.ctrlKey&&v.deltaMode===0&&Math.abs(v.deltaX)>0){s.x-=v.deltaX,s.y-=v.deltaY,s.fitted=!1,A();return}v.ctrlKey&&v.deltaMode===0?S(s.z*Math.exp(-v.deltaY*.01),D,U):w(v.deltaY<0?1:-1,D,U)},{passive:!1}),c.addEventListener("dblclick",()=>b()),r.addEventListener("pointerdown",v=>{v.preventDefault(),r.setPointerCapture(v.pointerId);let I=U=>{let B=c.getBoundingClientRect();s.splitAt=Math.min(1,Math.max(0,(U.clientX-B.left-s.x)/(s.w*s.z))),A()},D=()=>{r.removeEventListener("pointermove",I),r.removeEventListener("pointerup",D)};r.addEventListener("pointermove",I),r.addEventListener("pointerup",D)}),r.addEventListener("keydown",v=>{(v.key==="ArrowLeft"||v.key==="ArrowRight")&&(v.preventDefault(),v.stopPropagation(),s.splitAt=Math.min(1,Math.max(0,s.splitAt+(v.key==="ArrowLeft"?-.05:.05))),A())}),new ResizeObserver(y).observe(c);let z=()=>({zoom:s.z,fitted:s.fitted,x:s.x,y:s.y});return{el:c,show(v,I,D){let U=!s.result||v.width!==s.w||v.height!==s.h,B={w:s.w*s.z,cx:s.x+s.w*s.z/2,cy:s.y+s.h*s.z/2};if(s.result=v,s.original=I||s.original,s.crop=D||null,U)if(s.w=v.width,s.h=v.height,s.fitted||!B.w)b();else{let H=B.w/s.w;s.z=H,s.x=B.cx-s.w*H/2,s.y=B.cy-s.h*H/2,A(),t&&t(z())}else A()},clear(){s.result=null,s.original=null,s.w=s.h=0,s.fitted=!0,A()},fit:b,zoomTo:S,zoomStep:w,zoomIn(){w(1)},zoomOut(){w(-1)},get zoom(){return s.z},get fitted(){return s.fitted},get rect(){return{x:s.x,y:s.y,width:s.w*s.z,height:s.h*s.z,zoom:s.z}},setCompare(v){s.compare=v,A()},get compare(){return s.compare},setGrid(v){s.grid=v,A()},get grid(){return s.grid},setPicking(v){s.picking=v,c.classList.toggle("picking",v)},get picking(){return s.picking},redraw:A,resize:y}}function qr(e,t={},...n){let o=ln("sec"),i=m("span.hint",{}),r=m("button.itp-sec-toggle",{type:"button","aria-controls":o},m("span.title",{text:e}),i,m("span.chev",{html:Y("chevron")})),a=t.onReset?m("button.itp-btn.small.icon.itp-sec-reset",{type:"button",hidden:!0,title:t.resetLabel||`Reset ${e.toLowerCase()}`,"aria-label":t.resetLabel||`Reset ${e.toLowerCase()} to defaults`,html:Y("reset"),onclick:()=>t.onReset()}):null,c=m("div.body",{id:o},...n),l=m("section.itp-sec",{},m("div.itp-sec-head",{},r,a),c),s=d=>{l.dataset.open=String(d),r.setAttribute("aria-expanded",String(d)),c.hidden=!d};return r.addEventListener("click",()=>{let d=l.dataset.open!=="true";s(d),t.onToggle?.(d)}),s(t.open!==!1),{el:l,body:c,setHint(d){i.textContent=d},setChanged(d){a&&(a.hidden=!d)},setOpen:s,get open(){return l.dataset.open==="true"}}}function wt(e,t,{help:n="",value:o=null,id:i}={}){let r=m("div.lab",{},m("label",{for:i||t.id||null,text:e}),o);return m("div.itp-field",{},r,t,n?m("div.help",{text:n}):null)}function Se(e){let t=ln("sl"),n=e.scale||1,o=e.step||1,i=m("input",{type:"range",id:t,min:e.min*n,max:e.max*n,step:o*n,"aria-label":e.label}),r=m("input.itp-input",{type:"number",min:e.min*n,max:e.max*n,step:o*n,"aria-label":`${e.label} value`}),a=()=>{let s=(i.value-i.min)/(i.max-i.min)*100;i.style.setProperty("--p",`${s}%`)},c=s=>{let d=ls(s*n,o*n);i.value=d,r.value=d,a()};return i.addEventListener("input",()=>{r.value=i.value,a(),e.onInput(Number(i.value)/n)}),i.addEventListener("change",()=>e.onCommit&&e.onCommit()),r.addEventListener("change",()=>{let s=Math.min(e.max*n,Math.max(e.min*n,Number(r.value)||0));c(s/n),e.onInput(s/n),e.onCommit&&e.onCommit()}),i.addEventListener("dblclick",()=>{e.reset!=null&&(c(e.reset),e.onInput(e.reset),e.onCommit&&e.onCommit())}),c(e.value),{el:wt(e.label,m("div.itp-slider",{},i,r),{help:e.help,id:t}),set:c,input:i}}var ls=(e,t)=>{let n=Math.max(0,-Math.floor(Math.log10(t)+1e-9));return Number((Math.round(e/t)*t).toFixed(n))};function jt(e){let t=ln("se"),n=m("select.itp-select",{id:t,"aria-label":e.label}),o=new Map;for(let r of e.options){let a=m("option",{value:r.value,text:r.label});if(r.group){if(!o.has(r.group)){let c=m("optgroup",{label:r.group});o.set(r.group,c),n.append(c)}o.get(r.group).append(a)}else n.append(a)}return n.addEventListener("change",()=>e.onChange(n.value)),{el:e.bare?n:wt(e.label,n,{help:e.help,id:t}),select:n,set(r){n.value=r}}}function Ht(e){let t=e.options.map(r=>m("button",{type:"button","aria-pressed":"false",title:r.title||null,html:(r.icon?Y(r.icon):"")+(r.label?`<span>${r.label}</span>`:""),onclick:()=>e.onChange(r.value)})),n=m("div.itp-seg",{role:"group","aria-label":e.label},...t),o=r=>t.forEach((a,c)=>a.setAttribute("aria-pressed",String(e.options[c].value===r)));return o(e.value),{el:e.bare?n:wt(e.label,n,{help:e.help}),set:o}}function Xt(e){let t=m("input",{type:"checkbox",role:"switch"});t.addEventListener("change",()=>e.onChange(t.checked));let n=m("label.itp-switch",{},m("span",{text:e.label}),t);return{el:e.help?m("div.itp-field",{},n,m("div.help",{text:e.help})):n,set(i){t.checked=!!i}}}function Yr(e){let t=m("input",{type:"color","aria-label":e.label}),n=m("span.mono",{});t.addEventListener("input",()=>{n.textContent=t.value,e.onChange(t.value)});let o=m("label.itp-color",{},t,n),i=r=>{t.value=r,n.textContent=r};return i(e.value||"#000000"),{el:e.bare?o:wt(e.label,o),set:i}}function Vt(e){let t=ln("nu"),n=m("input.itp-input.num",{type:"number",id:t,min:e.min,max:e.max,step:e.step||1,"aria-label":e.label});return n.addEventListener("change",()=>{let o=Math.min(e.max,Math.max(e.min,Number(n.value)||e.min));(n.value!==""||!n.placeholder)&&(n.value=o),e.onChange(o)}),{el:e.bare?n:wt(e.label,n,{help:e.help,id:t}),input:n,set(o){n.value=o}}}Bt();bt();var uo=class{constructor(){this.buf=new Uint8Array(65536),this.n=0}byte(t){if(this.n===this.buf.length){let n=new Uint8Array(this.buf.length*2);n.set(this.buf),this.buf=n}this.buf[this.n++]=t}bytes(t){for(let n=0;n<t.length;n++)this.byte(t[n])}u16(t){this.byte(t&255),this.byte(t>>8&255)}str(t){for(let n=0;n<t.length;n++)this.byte(t.charCodeAt(n))}result(){return this.buf.slice(0,this.n)}};function ds(e,t,n){let o=1<<t,i=o+1,r=t+1,a=i+1,c=new Map,l=0,s=0,d=[],f=[],u=x=>{for(l|=x<<s,s+=r;s>=8;)f.push(l&255),l>>>=8,s-=8,f.length===255&&(d.push(f),f=[])};u(o);let h=e[0];for(let x=1;x<e.length;x++){let E=e[x],y=h*256+E,k=c.get(y);if(k!==void 0){h=k;continue}u(h),a<4096?(c.set(y,a++),a>1<<r&&r<12&&r++):(u(o),c=new Map,r=t+1,a=i+1),h=E}u(h),u(i),s>0&&f.push(l&255),f.length&&d.push(f),n.byte(t);for(let x of d)n.byte(x.length),n.bytes(x);n.byte(0)}var lo=(e,t)=>e[t+3]<128?-1:e[t]<<16|e[t+1]<<8|e[t+2];function Kr(e,t){let n=[...e].filter(c=>c!==-1),o=n.map(c=>[c>>16,c>>8&255,c&255]),i=t?o.length:-1;t&&o.push([0,0,0]);let r=1;for(;1<<r<o.length;)r++;for(;o.length<1<<r;)o.push([0,0,0]);let a=new Map(n.map((c,l)=>[c,l]));return{colors:o,bits:r,tIndex:i,index:a}}function us(e,t){let n=vn(e,t).map(gt),o=new Uint8ClampedArray(e.data),i=new Map;for(let r=0;r<o.length;r+=4){if(o[r+3]<128)continue;let a=o[r]<<16|o[r+1]<<8|o[r+2],c=i.get(a);if(c===void 0){let l=1/0;c=0;for(let s=0;s<n.length;s++){let d=o[r]-n[s][0],f=o[r+1]-n[s][1],u=o[r+2]-n[s][2],h=d*d*3+f*f*4+u*u*2;h<l&&(l=h,c=s)}i.set(a,c)}o.set(n[c],r)}return{...e,data:o}}function Zr(e,t={}){if(!e.length)throw new Error("No frames");let n=Math.max(1,Math.round(t.scale||1)),o=e.map(h=>({...n>1?_t(h,n):h,delay:h.delay??t.delay??100})),i=o[0].width,r=o[0].height,a=!1,c=new Set,l=o.map(h=>{let x=new Set;for(let E=0;E<h.data.length;E+=4){let y=lo(h.data,E);y===-1&&(a=!0),x.add(y),c.add(y)}return x}),s=h=>h.size-(h.has(-1)?1:0),f=s(c)+(a?1:0)<=256?Kr(c,a):null,u=new uo;if(u.str("GIF89a"),u.u16(i),u.u16(r),u.byte(f?240|f.bits-1:0),u.byte(0),u.byte(0),f)for(let h of f.colors)u.bytes(h);return o.length>1&&t.loop!==-1&&(u.byte(33),u.byte(255),u.byte(11),u.str("NETSCAPE2.0"),u.byte(3),u.byte(1),u.u16(t.loop||0),u.byte(0)),o.forEach((h,x)=>{let E=h,y=f,k=l[x];if(!y){let S=a?255:256;if(s(k)>S){E=us(h,S),k=new Set;for(let w=0;w<E.data.length;w+=4)k.add(lo(E.data,w))}y=Kr(k,k.has(-1))}if(u.byte(33),u.byte(249),u.byte(4),u.byte((a?2:1)<<2|(y.tIndex>=0?1:0)),u.u16(Math.max(2,Math.round(E.delay/10))),u.byte(y.tIndex>=0?y.tIndex:0),u.byte(0),u.byte(44),u.u16(0),u.u16(0),u.u16(i),u.u16(r),u.byte(y===f?0:128|y.bits-1),y!==f)for(let S of y.colors)u.bytes(S);let b=new Uint8Array(i*r);for(let S=0;S<b.length;S++){let w=lo(E.data,S*4);b[S]=w===-1?y.tIndex:y.index.get(w)}ds(b,Math.max(2,y.bits),u)}),u.byte(59),u.result()}var Jr=new TextEncoder;function dn(e){let t=[],n=[],o=0,i=new Set;for(let d of e){let f=d.name.replace(/\\/g,"/").replace(/^\/+/,"");if(i.has(f)){let L=/^(.*?)(\.[^.]*)?$/.exec(f),T=2;for(;i.has(`${L[1]}-${T}${L[2]||""}`);)T++;f=`${L[1]}-${T}${L[2]||""}`}i.add(f);let u=Jr.encode(f),h=typeof d.data=="string"?Jr.encode(d.data):d.data,x=An(h),E=d.date||new Date,y=E.getHours()<<11|E.getMinutes()<<5|E.getSeconds()>>1,k=E.getFullYear()-1980<<9|E.getMonth()+1<<5|E.getDate(),b=new Uint8Array(30+u.length),S=new DataView(b.buffer);S.setUint32(0,67324752,!0),S.setUint16(4,20,!0),S.setUint16(6,2048,!0),S.setUint16(8,0,!0),S.setUint16(10,y,!0),S.setUint16(12,k,!0),S.setUint32(14,x,!0),S.setUint32(18,h.length,!0),S.setUint32(22,h.length,!0),S.setUint16(26,u.length,!0),S.setUint16(28,0,!0),b.set(u,30);let w=new Uint8Array(46+u.length),A=new DataView(w.buffer);A.setUint32(0,33639248,!0),A.setUint16(4,20,!0),A.setUint16(6,20,!0),A.setUint16(8,2048,!0),A.setUint16(10,0,!0),A.setUint16(12,y,!0),A.setUint16(14,k,!0),A.setUint32(16,x,!0),A.setUint32(20,h.length,!0),A.setUint32(24,h.length,!0),A.setUint16(28,u.length,!0),A.setUint32(42,o,!0),w.set(u,46),t.push(b,h),n.push(w),o+=b.length+h.length}let r=n.reduce((d,f)=>d+f.length,0),a=new Uint8Array(22),c=new DataView(a.buffer);c.setUint32(0,101010256,!0),c.setUint16(8,e.length,!0),c.setUint16(10,e.length,!0),c.setUint32(12,r,!0),c.setUint32(16,o,!0);let l=new Uint8Array(o+r+22),s=0;for(let d of[...t,...n,a])l.set(d,s),s+=d.length;return l}var fo=(e,t)=>({width:e,height:t,data:new Uint8ClampedArray(e*t*4)});function fs(e,t,n,o,i=0,r=0,a=t.width,c=t.height){for(let l=0;l<c;l++){let s=((r+l)*t.width+i)*4,d=((o+l)*e.width+n)*4;e.data.set(t.data.subarray?t.data.subarray(s,s+a*4):Array.prototype.slice.call(t.data,s,s+a*4),d)}}function po(e,t={}){if(!e.length)throw new Error("No frames");let n=Math.max(0,t.padding|0),o=Math.max(...e.map(u=>u.width)),i=Math.max(...e.map(u=>u.height)),r=Math.max(1,Math.min(e.length,t.columns||Math.ceil(Math.sqrt(e.length)))),a=Math.ceil(e.length/r),c=r*o+(r-1)*n,l=a*i+(a-1)*n,s=fo(c,l),d={};e.forEach((u,h)=>{let x=h%r*(o+n),E=Math.floor(h/r)*(i+n);fs(s,u,x,E),d[u.name||`frame-${String(h).padStart(3,"0")}`]={frame:{x,y:E,w:u.width,h:u.height},sourceSize:{w:u.width,h:u.height},...u.delay!=null?{duration:Math.round(u.delay)}:{}}});let f={frames:d,meta:{app:"image-to-pixel",image:(t.name||"sheet")+".png",size:{w:c,h:l},scale:"1",columns:r,rows:a,padding:n}};return{image:s,atlas:f}}function Qr(e,t={}){let n=Math.max(1,t.tileWidth||8),o=Math.max(1,t.tileHeight||n),i=Math.ceil(e.width/n),r=Math.ceil(e.height/o),a=[],c=new Map,l=[],s=[],d=(x,E)=>{let y=fo(n,o);for(let k=0;k<o;k++)for(let b=0;b<n;b++){let S=x*n+b,w=E*o+k;if(S>=e.width||w>=e.height)continue;let A=(w*e.width+S)*4;y.data.set([e.data[A],e.data[A+1],e.data[A+2],e.data[A+3]],(k*n+b)*4)}return y},f=x=>{let E="";for(let y=0;y<x.data.length;y+=4)E+=x.data[y+3]===0?".":String.fromCharCode(x.data[y]+1,x.data[y+1]+1,x.data[y+2]+1);return E},u=(x,E,y)=>{let k=fo(n,o);for(let b=0;b<o;b++)for(let S=0;S<n;S++){let w=((y?o-1-b:b)*n+(E?n-1-S:S))*4;k.data.set(x.data.subarray(w,w+4),(b*n+S)*4)}return k};for(let x=0;x<r;x++)for(let E=0;E<i;E++){let y=d(E,x),k=c.get(f(y)),b=0;if(k===void 0&&t.flips)for(let[S,w,A]of[[1,0,1],[0,1,2],[1,1,3]]){let L=c.get(f(u(y,S,w)));if(L!==void 0){k=L,b=A;break}}k===void 0&&(k=a.length,a.push(y),c.set(f(y),k)),l.push(k),s.push(b)}return{image:po(a,{columns:t.columns||Math.min(16,a.length)}).image,map:{width:i,height:r,tileWidth:n,tileHeight:o,tiles:l,...t.flips?{flips:s}:{}},count:a.length}}Rn();var ps=null,hs=()=>ps||(ps=document.body.appendChild(m("div.itp-toasts.itp",{role:"status","aria-live":"polite"})));function W(e,t={}){let n=t.kind||"info",o=m("div.msg",{},m("div",{text:e})),i=t.progress?m("div.itp-progress",{},m("i")):null;i&&o.append(i);let r=m(`div.itp-toast.${n}`,{},t.progress?m("div.itp-spinner"):m("span.itp-dot"),o);t.action&&r.append(m("button.itp-btn.small.outline",{type:"button",text:t.action.label,onclick:()=>{t.action.onClick(),c()}})),t.onCancel?r.append(m("button.itp-btn.small",{type:"button",text:"Cancel",onclick:()=>{t.onCancel(),c()}})):r.append(m("button.itp-btn.small.icon",{type:"button","aria-label":"Dismiss",html:Y("x"),onclick:()=>c()})),hs().append(r);let a=null,c=()=>{clearTimeout(a),r.remove()};return(s=>{clearTimeout(a),s&&(a=setTimeout(c,s))})(t.timeout??(t.progress?0:n==="error"?7e3:3200)),{update(s){o.firstChild.textContent=s},progress(s){i&&(i.firstChild.style.width=`${Math.round(s*100)}%`)},close:c,done(s,d="ok"){c(),W(s,{kind:d})}}}var tn=null;function un(e,t,{align:n="end"}={}){Wt();let o=m("div.itp-menu.itp",{role:"menu"});for(let u of t){if(u==="sep"){o.append(m("hr"));continue}if(u.group){o.append(m("div.mlabel",{text:u.group}));continue}let h=m("button.mi",{type:"button",role:"menuitem",disabled:!!u.disabled},m("span",{html:u.icon?Y(u.icon):""}),m("span",{},u.label,u.sub?m("small",{text:u.sub}):null),u.kbd?m("kbd",{text:u.kbd}):m("span"));h.addEventListener("click",()=>{Wt(),u.onClick()}),o.append(h)}document.body.append(o);let i=e.getBoundingClientRect(),r=o.offsetWidth,a=o.offsetHeight,c=n==="end"?i.right-r:i.left;c=Math.max(8,Math.min(c,innerWidth-r-8));let l=i.bottom+6;l+a>innerHeight-8&&(l=Math.max(8,i.top-a-6)),Object.assign(o.style,{left:`${c}px`,top:`${l}px`}),e.setAttribute("aria-expanded","true");let s=[...o.querySelectorAll("button.mi:not(:disabled)")];s[0]?.focus();let d=u=>{let h=s.indexOf(document.activeElement);u.key==="Escape"?(u.preventDefault(),Wt(),e.focus()):u.key==="ArrowDown"?(u.preventDefault(),s[(h+1)%s.length]?.focus()):u.key==="ArrowUp"?(u.preventDefault(),s[(h-1+s.length)%s.length]?.focus()):u.key==="Tab"&&Wt()},f=u=>{!o.contains(u.target)&&u.target!==e&&!e.contains(u.target)&&Wt()};o.addEventListener("keydown",d),setTimeout(()=>document.addEventListener("pointerdown",f,!0)),tn={el:o,anchor:e,cleanup:()=>document.removeEventListener("pointerdown",f,!0)}}function Wt(){tn&&(tn.cleanup(),tn.el.remove(),tn.anchor.setAttribute("aria-expanded","false"),tn=null)}function fn(e,t,{actions:n=[],onClose:o}={}){let i=m("div.content",{},t),r=m("dialog.itp-dialog.itp",{"aria-label":e},m("header",{},m("h2",{text:e}),m("button.itp-btn.icon",{type:"button","aria-label":"Close",html:Y("x"),onclick:()=>r.close()})),i,n.length?m("footer",{},...n.map(a=>m(`button.itp-btn${a.primary?".primary":".outline"}`,{type:"button",text:a.label,onclick:async()=>{await a.onClick?.()!==!1&&r.close()}}))):null);return r.addEventListener("close",()=>{r.remove(),o?.()}),document.body.append(r),r.showModal(),r.body=i,r.setContent=(...a)=>tt(i,...a),r}var At=e=>(e||"image").replace(/\.[^.]+$/,"").replace(/[^\w.-]+/g,"-").replace(/^-+|-+$/g,"")||"image",On=e=>({scale:e.export.scale,grid:e.export.grid,gridColor:e.export.gridColor,indexed:e.export.indexed});function $n(e,t,n){return e.export.size==="source"&&t&&n&&t.crop?{width:Math.max(1,Math.round(t.crop.w*n.width)),height:Math.max(1,Math.round(t.crop.h*n.height))}:{width:t?t.width*e.export.scale:0,height:t?t.height*e.export.scale:0}}var yo=(e,t,n)=>e.export.size==="source"&&n?{...$n(e,t,n),indexed:e.export.indexed}:On(e);function ci(e){let t=()=>e.store.settings;async function n(){if(!e.result)return W("Open an image first",{kind:"error"});let d=t(),f=await dt(e.result,yo(d,e.result,e.current)),u=$n(d,e.result,e.current),h=d.export.size==="source"?`-${u.width}x${u.height}`:d.export.scale>1?`@${d.export.scale}x`:"";Be(f,`${At(e.current.name)}-${e.result.width}x${e.result.height}${h}.png`,"image/png"),W(`Saved ${u.width} \xD7 ${u.height} PNG`,{kind:"ok"})}async function o(){if(e.result)try{let d=await dt(e.result,{...yo(t(),e.result,e.current),indexed:!1});await navigator.clipboard.write([new ClipboardItem({"image/png":new Blob([d],{type:"image/png"})})]),W("Image copied",{kind:"ok"})}catch(d){W(`Couldn't copy: ${d.message}`,{kind:"error"})}}async function i(d,f){let u=new AbortController,h=W(d,{progress:!0,onCancel:()=>u.abort()});e.exporting=!0;try{let x=await f(u.signal,(E,y)=>{h.progress(E),y&&h.update(y)});h.done(x)}catch(x){h.close(),x.name!=="AbortError"?(W(`Export failed: ${x.message}`,{kind:"error"}),console.error(x)):W("Export cancelled")}finally{e.exporting=!1,e.schedule()}}async function r(){let d=e.items.slice();d.length&&await i(`Processing ${d.length} files`,async(f,u)=>{let h=[],x=[];for(let E=0;E<d.length;E++){if(f.aborted)throw new DOMException("Aborted","AbortError");let y=d[E],k=e.settingsFor(y);y.type==="video"&&e.engine.invalidate();let b=await e.engine.process(y.source,k);h.push({name:`${At(y.name)}.png`,data:await dt(b,yo(k,b,y))}),y.own&&x.push({name:`${At(y.name)}.settings.json`,data:Zt(k)}),u((E+1)/d.length,`Processed ${E+1} of ${d.length}`)}return h.push({name:"settings.json",data:Zt(e.shared)},...x),Be(dn(h),"pixel-art.zip","application/zip"),`Saved ${d.length} images as a ZIP`})}async function a(d,f,u,h){let x=t();if(d.source==="files"){let b=e.items.filter(w=>w.type==="image"),S=null;for(let w=0;w<b.length;w++){if(f.aborted)throw new DOMException("Aborted","AbortError");let A=e.settingsFor(b[w]),L=await e.engine.process(b[w].source,S?Tt(A,{size:S}):A);S||(S={mode:"width",width:L.width,height:L.height}),await h(L,w,b.length,b[w].name),u((w+1)/b.length,`Frame ${w+1} of ${b.length}`)}return b.length}let E=e.current;if(!E||E.type!=="video")throw new Error("Open a video first");let y=E.source,k=d.end>d.start?d.end:y.duration;return Ln(y,{fps:d.fps,start:d.start,end:k,signal:f,onFrame:async({index:b,total:S})=>{e.engine.invalidate();let w=await e.engine.process(y,x);await h(w,b,S,`${At(E.name)}-${String(b).padStart(4,"0")}`),u((b+1)/S,`Frame ${b+1} of ${S}`)}})}async function c(d){let f=d.source==="files"?"animation":At(e.current?.name),u=t(),h=1e3/d.fps;if(d.format==="gif"||d.format==="png-seq"){await i("Rendering frames",async(x,E)=>{let y=[];if(await a(d,x,E,async(k,b,S,w)=>{d.format==="gif"?y.push({width:k.width,height:k.height,data:k.data,delay:h}):y.push({name:`${w}.png`,data:await dt(k,On(u))})}),d.format==="gif"){E(1,"Encoding GIF"),await new Promise(b=>setTimeout(b,0));let k=Zr(y,{scale:u.export.scale,loop:0});return Be(k,`${f}.gif`,"image/gif"),`Saved GIF (${y.length} frames, ${(k.length/1024).toFixed(0)} KB)`}return Be(dn(y),`${f}-frames.zip`,"application/zip"),`Saved ${y.length} PNG frames`});return}await i(`Encoding ${d.format.toUpperCase()}`,async(x,E)=>{let{createVideoEncoder:y}=await Promise.resolve().then(()=>(xo(),bo)),k=null;await a(d,x,E,async S=>{k||(k=await y({format:d.format,fps:d.fps,width:S.width,height:S.height,scale:Math.max(u.export.scale,Math.ceil(240/S.height))})),await k.add(S)});let b=await k.finish();return Be(b,`${f}.${d.format}`),`Saved ${d.format.toUpperCase()} (${(b.size/1024/1024).toFixed(1)} MB)`})}async function l(d){let f=d.source==="files"?"sheet":`${At(e.current?.name)}-sheet`,u=t();await i("Building sprite sheet",async(h,x)=>{let E=[];await a(d,h,x,(S,w,A,L)=>{E.push({width:S.width,height:S.height,data:S.data,name:L?At(L):void 0,delay:1e3/d.fps})});let{image:y,atlas:k}=po(E,{columns:d.columns,padding:d.padding,name:f});if(u.export.scale>1){let S=u.export.scale;for(let w of Object.values(k.frames)){for(let A of["x","y","w","h"])w.frame[A]*=S;w.sourceSize.w*=S,w.sourceSize.h*=S}k.meta.size.w*=S,k.meta.size.h*=S,k.meta.scale=String(S)}let b=await dt(y,On(u));return Be(dn([{name:`${f}.png`,data:b},{name:`${f}.json`,data:JSON.stringify(k,null,2)}]),`${f}.zip`,"application/zip"),`Saved a ${E.length}-frame sprite sheet`})}async function s({tile:d,flips:f}){if(!e.result)return W("Open an image first",{kind:"error"});let u=t(),h=Qr(e.result,{tileWidth:d,tileHeight:d,flips:f}),x=`${At(e.current.name)}-tiles`,E=await dt(h.image,On(u)),y={...h.map,image:`${x}.png`,note:"tiles[] holds one tile index per cell, row by row"+(f?"; flips[] is 0 none, 1 horizontal, 2 vertical, 3 both":"")};Be(dn([{name:`${x}.png`,data:E},{name:`${x}.json`,data:JSON.stringify(y,null,2)}]),`${x}.zip`,"application/zip"),W(`Saved ${h.count} unique tiles (${h.map.width} \xD7 ${h.map.height} map)`,{kind:"ok"})}return{exportPNG:n,copyImage:o,exportZip:r,exportAnimation:c,exportSheet:l,exportTileset:s}}var li="itp:";function Pt(e,t){try{let n=localStorage.getItem(li+e);return n==null?t:JSON.parse(n)}catch{return t}}function vt(e,t){try{return localStorage.setItem(li+e,JSON.stringify(t)),!0}catch{return!1}}function ui(e){let{store:t}=e,n=(g,$)=>t.update(g,{key:$}),o=()=>t.commit(),i=()=>t.settings,r=xt(),a=(g,$)=>JSON.stringify(g)===JSON.stringify($),c=Pt("sections",{}),l=(g,$,ee,J,...oe)=>qr($,{open:c[g]??ee,onToggle:re=>{c[g]=re,vt("sections",c)},onReset:J?()=>{let re={};for(let Q of J)re[Q]=JSON.parse(JSON.stringify(r[Q]));t.update(re)}:null},...oe),s=m("div.v",{text:"\u2013"}),d=m("div.v",{text:"\u2013"}),f=m("div.v",{text:"\u2013"}),u=m("div.itp-stats",{"aria-live":"polite"},m("div.itp-stat",{},m("div.k",{text:"Output"}),s),m("div.itp-stat",{},m("div.k",{text:"Colours"}),d),m("div.itp-stat",{},m("div.k",{text:"Render"}),f)),h=m("button",{type:"button",role:"tab","aria-selected":"true",id:"itp-tab-setup","aria-controls":"itp-pane-setup",html:`${Y("sliders")}<span>Setup</span>`}),x=m("button",{type:"button",role:"tab","aria-selected":"false",id:"itp-tab-export","aria-controls":"itp-pane-export",html:`${Y("download")}<span>Export</span>`}),E=m("div.itp-seg",{role:"tablist","aria-label":"Inspector"},h,x),y=Ht({label:"Settings apply to",bare:!0,options:[{value:"shared",label:"All files",icon:"layers"},{value:"own",label:"This file",icon:"unlink"}],value:"shared",onChange:g=>e.current&&e.setOwn(e.current,g==="own")}),k=m("span.itp-scope-note",{}),b=m("div.itp-scope",{hidden:!0},m("div.lab",{},m("span",{text:"Settings apply to"}),k),y.el),S=Ht({label:"Size by",options:[{value:"width",label:"Width"},{value:"block",label:"Pixel size"}],value:"width",onChange:g=>n({size:{mode:g}})}),w=Se({label:"Pixel width",min:8,max:512,step:1,value:96,reset:96,onInput:g=>n({size:{width:g}},"width"),onCommit:o}),A=Vt({label:"Height",min:0,max:2048,help:"Leave empty to keep the aspect ratio.",onChange:g=>n({size:{height:g}})});A.input.placeholder="Auto";let L=Se({label:"Pixel size",min:1,max:64,step:1,value:8,reset:8,help:"How many source pixels become one output pixel.",onInput:g=>n({size:{block:g}},"block"),onCommit:o}),T=Ht({label:"Resample",options:[{value:"box",label:"Average"},{value:"nearest",label:"Nearest"}],value:"box",help:"Nearest keeps hard edges; use it for art that is already pixelated.",onChange:g=>n({size:{resample:g}})}),P=m("button.itp-btn.small.outline",{type:"button",html:`${Y("grid")}<span>Detect grid</span>`,title:"Find the pixel size of upscaled pixel art",onclick:()=>e.detectGrid()}),z=m("div",{style:{display:"contents"}},w.el,A.el),v=m("div",{style:{display:"contents"}},L.el),I=l("size","Size",!0,["size"],S.el,z,v,T.el,m("div.itp-row",{},P)),D=Kt.map(g=>{let $=g.ratio||1.3333333333333333,ee=m("i",{style:{width:`${Math.round($>=1?16:16*$)}px`,height:`${Math.round($>=1?16/$:16)}px`}});return g.ratio||ee.classList.add("orig"),m("button",{type:"button","aria-pressed":"false",title:g.id==="original"?"The source's own shape":`Crop to ${g.label}`,onclick:()=>n({frame:{aspect:g.id}})},ee,m("span",{text:g.label}))}),U=m("div.itp-aspects",{role:"group","aria-label":"Aspect ratio"},...D),B=Se({label:"Zoom",min:1,max:8,step:.05,value:1,reset:1,help:"Crop into the middle of the frame.",onInput:g=>n({frame:{zoom:g}},"fz"),onCommit:o}),H=Se({label:"Horizontal position",min:0,max:1,step:.01,scale:100,value:.5,reset:.5,onInput:g=>n({frame:{x:g}},"fx"),onCommit:o}),V=Se({label:"Vertical position",min:0,max:1,step:.01,scale:100,value:.5,reset:.5,onInput:g=>n({frame:{y:g}},"fy"),onCommit:o}),G=l("frame","Frame",!1,["frame"],wt("Aspect ratio",U),B.el,H.el,V.el),ce=jt({label:"Source",options:[{value:"builtin",label:"Built-in palette"},{value:"custom",label:"Custom colours"},{value:"extract",label:"From the image"},{value:"none",label:"None (keep colours)"}],onChange:g=>n({palette:{source:g}})}),be=jt({label:"Palette",options:nn.map(g=>({value:g.id,label:`${g.name} (${g.colors.length})`})),onChange:g=>n({palette:{source:"builtin",id:g}})}),Te=Se({label:"Number of colours",min:2,max:64,step:1,value:16,reset:16,onInput:g=>n({palette:{count:g}},"count"),onCommit:o}),se=m("div.itp-swatches",{role:"list","aria-label":"Palette colours"}),ae=m("span.val.num",{}),he=wt("Colours",se,{value:ae}),Fe=Ht({label:"Colour matching",options:[{value:"oklab",label:"Perceptual"},{value:"rgb",label:"RGB"}],value:"oklab",onChange:g=>n({palette:{distance:g}})}),Ee=m("div.itp-row",{style:{flexWrap:"wrap"}},m("button.itp-btn.small.outline",{type:"button",html:`${Y("upload")}<span>Import</span>`,title:".gpl, .hex, .pal, .txt or .json",onclick:()=>e.importPalette()}),m("button.itp-btn.small.outline",{type:"button",html:`${Y("palette")}<span>Lospec</span>`,onclick:()=>e.lospecDialog()}),m("button.itp-btn.small.outline",{type:"button",html:`${Y("pipette")}<span>Pick</span>`,title:"Add colours by clicking the image","aria-pressed":"false",onclick:g=>e.togglePicker(g.currentTarget)}),m("button.itp-btn.small",{type:"button",html:`${Y("download")}<span>Save</span>`,title:"Save to Your palettes",onclick:()=>e.savePalette()})),me=l("palette","Palette",!1,["palette"],ce.el,be.el,Te.el,he,Fe.el,Ee),Xe={none:"None",ordered:"Ordered",diffusion:"Error diffusion"},Ve=jt({label:"Method",options:rn.map(g=>({value:g.id,label:g.label,group:Xe[g.kind]})),onChange:g=>n({dither:{method:g}})}),De=Se({label:"Strength",min:0,max:1,step:.01,scale:100,value:.6,reset:.6,onInput:g=>n({dither:{strength:g}},"strength"),onCommit:o}),We=m("textarea.itp-input",{rows:4,spellcheck:!1,"aria-label":"Custom threshold matrix",placeholder:`0 8 2 10
|
|
301
|
+
`;var bn=(e,t)=>{let n=document.createElement("canvas");return n.width=e,n.height=t,n};async function ni(){if(typeof document>"u")throw new Error("No DOM");let e=bn(1,1).getContext("webgl2");if(!e)throw new Error("WebGL 2 is not available");if(!e.getExtension("EXT_color_buffer_float"))throw new Error("Float render targets are not available");let t=e.getExtension("WEBGL_debug_renderer_info"),n=String(t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER));e.getExtension("WEBGL_lose_context")?.loseContext();let o=bn(1,1),i=bn(1,1),r=bn(256,1),a=bn(1,1),c=x=>({element:x,filter:"nearest",wrap:"clamp"}),l=Wr({canvas:o,webgl:2,size:[1,1],pixelRatio:1,autoplay:!1,pauseWhenHidden:!1,pointer:!1,errorOverlay:!1,warnMissingUniforms:!1,preserveDrawingBuffer:!0,premultipliedAlpha:!1,antialias:!1,dialect:"shadermate",common:qr,samplers:{u_palette:c(r),u_matrix:c(a)},uniforms:{u_count:1,u_distance:0,u_resample:0,u_adjust:[0,0,0,1],u_hue:0,u_crop:[0,0,1,1],u_alphaCut:.5,u_mode:0,u_levels:1,u_amount:0,u_skew:1,u_strength:1,u_kn:0,u_kernel:new Float32Array(po*3),u_outline:0,u_corners:0,u_outlineColor:[0,0,0]},passes:[{name:"prep",shader:Yr,float:"full",filter:"nearest",channels:[{...c(i),dynamic:!1}]},{name:"quant",shader:Kr,filter:"nearest",channels:["prep"]},{name:"diffuse",shader:Zr,float:"full",filter:"nearest",pingpong:!0,iterations:2,channels:["prep","diffuse"]},{name:"resolve",shader:Jr,filter:"nearest",channels:["quant","diffuse"]},{name:"orphan",shader:Qr,filter:"nearest",channels:["resolve"]},{name:"smooth",shader:ei,filter:"nearest",channels:["orphan"]},{name:"out",shader:ti,screen:!0,channels:["smooth"]}]}),s=null;if(l.on("error",x=>{s=x}),await l.ready,s||l.error)throw l.destroy(),s||l.error;let d=(x,w)=>{for(let y in w)l.set(y,w[y],x)},h=null,f="",p="";async function b(x){if(x.canvas===h&&!x.dirty)return;i.width=x.width,i.height=x.height;let w=i.getContext("2d");w.clearRect(0,0,i.width,i.height),w.drawImage(x.canvas,0,0),await l.setChannel(0,{...c(i),dynamic:!1},"prep"),h=x.canvas}function M(x){let w=x.palette.map(_=>_.join(",")).join(";");if(w===f)return;f=w;let y=r.getContext("2d"),A=y.createImageData(256,1);x.palette.forEach((_,P)=>A.data.set([_[0],_[1],_[2],255],P*4)),y.putImageData(A,0,0)}function v(x){let w=x?`${x.w}x${x.h}:${x.levels}:${x.values.join(",")}`:"none";if(w===p)return;p=w;let y=x||{w:1,h:1,values:[0]};a.width=y.w,a.height=y.h;let A=a.getContext("2d"),_=A.createImageData(y.w,y.h);for(let P=0;P<y.values.length;P++)_.data.set([y.values[P],0,0,255],P*4);A.putImageData(_,0,0)}async function k(x,w){let y=x.settings;await b(w),x.quantize&&M(x),v(x.map),(l.width!==x.width||l.height!==x.height)&&l.setSize(x.width,x.height);let A=x.kind==="diffusion",_=new Array(po).fill(null).map((D,F)=>x.kernel&&x.kernel[F]||[0,0,0]);l.set({u_count:x.palette.length||1,u_distance:x.distance,u_resample:y.size.resample==="nearest"?1:0,u_adjust:[y.adjust.brightness,y.adjust.contrast,y.adjust.saturation,y.adjust.gamma],u_hue:y.adjust.hue,u_crop:[x.crop.x,x.crop.y,x.crop.w,x.crop.h],u_alphaCut:y.alpha.threshold,u_mode:x.quantize?x.kind==="ordered"?2:1:0,u_levels:x.map?x.map.levels:1,u_amount:x.map?x.spread*y.dither.strength:0,u_skew:x.skew,u_strength:y.dither.strength,u_kn:x.kernel?x.kernel.length:0,u_kernel:new Float32Array(_.flat()),u_outline:{none:0,outer:1,inner:2}[x.outline.mode],u_corners:x.outline.corners?1:0,u_outlineColor:x.outline.color.map(D=>D/255)}),d("diffuse",{u_on:A?1:0}),d("resolve",{u_on:A?1:0}),d("orphan",{u_on:y.cleanup.orphans?1:0}),d("smooth",{u_on:y.cleanup.smooth?1:0}),l.getPass("diffuse").cfg.iterations=A?x.waves:1;let{data:P}=l.readPixels(),I=x.width,H=x.height,T=new Uint8ClampedArray(I*H*4),O=I*4;for(let D=0;D<H;D++)T.set(P.subarray((H-1-D)*O,(H-D)*O),D*O);return T}return{name:"webgl",renderer:n,software:/swiftshader|llvmpipe|softpipe|software|basic render/i.test(n),run:k,shader:l,destroy(){l.destroy()}}}var Mo=typeof document<"u",oi=e=>e&&typeof e=="object"&&"data"in e&&"width"in e&&"height"in e&&e.data&&e.data.length===e.width*e.height*4;async function Ds(e){if(typeof Blob<"u"&&e instanceof Blob){if(typeof createImageBitmap=="function")try{return await createImageBitmap(e)}catch{}e=URL.createObjectURL(e)}if(!Mo)throw new Error("Loading images by URL needs a browser; pass { width, height, data } in Node.");let t=new Image;return t.crossOrigin="anonymous",t.decoding="async",t.src=e,await t.decode(),t}function $s(e){return{width:e.naturalWidth||e.videoWidth||e.displayWidth||e.codedWidth||e.width||0,height:e.naturalHeight||e.videoHeight||e.displayHeight||e.codedHeight||e.height||0}}function zs(e){if(e&&!oi(e)&&typeof e=="object"){if(e.canvas&&typeof e.canvas=="object"&&"getContext"in e.canvas)return e.canvas;if(e.elt&&typeof e.elt=="object"&&"getContext"in e.elt)return e.elt}return e}async function ri(e,t={}){let n=t.maxSize||4096,o=zs(e);if((typeof o=="string"||typeof Blob<"u"&&o instanceof Blob)&&(o=await Ds(o)),o&&typeof o.complete=="boolean"&&!o.complete&&o.decode&&await o.decode(),oi(o)){let d={width:o.width,height:o.height,data:o.data,canvas:null};return Mo&&Object.defineProperty(d,"canvas",{configurable:!0,get(){let h=document.createElement("canvas");h.width=o.width,h.height=o.height;let f=new ImageData(new Uint8ClampedArray(o.data),o.width,o.height);return h.getContext("2d").putImageData(f,0,0),Object.defineProperty(d,"canvas",{value:h}),h}}),d}if(!Mo)throw new Error("Unsupported source in a non-browser environment. Pass { width, height, data }.");let{width:i,height:r}=$s(o);if(!i||!r)throw new Error("Source has no size yet (is the image or video loaded?)");let a=Math.min(1,n/Math.max(i,r));i=Math.max(1,Math.round(i*a)),r=Math.max(1,Math.round(r*a));let c=t.canvas||document.createElement("canvas");c.width=i,c.height=r;let l=c.getContext("2d",{willReadFrequently:!0});l.clearRect(0,0,i,r),l.imageSmoothingEnabled=a<1,l.imageSmoothingQuality="high",l.drawImage(o,0,0,i,r);let s=null;return{width:i,height:r,canvas:c,dirty:!0,get data(){return s||(s=l.getImageData(0,0,i,r).data)}}}Jt();Jt();function ci(e,t=1,n={}){let o=t>1||n.grid?jt(e,t,n):e,i=n.canvas||document.createElement("canvas");return i.width=o.width,i.height=o.height,i.getContext("2d").putImageData(new ImageData(new Uint8ClampedArray(o.data),o.width,o.height),0,0),i}function vt(e,t,n="application/octet-stream"){let o=e instanceof Blob?e:new Blob([e],{type:n}),i=URL.createObjectURL(o),r=document.createElement("a");r.href=i,r.download=t,r.rel="noopener",document.body.appendChild(r),r.click(),r.remove(),setTimeout(()=>URL.revokeObjectURL(i),1e4)}var Nn=null;function Gn(e,t=0){if(!Nn){Nn=new Uint32Array(256);for(let n=0;n<256;n++){let o=n;for(let i=0;i<8;i++)o=o&1?3988292384^o>>>1:o>>>1;Nn[n]=o>>>0}}t=~t>>>0;for(let n=0;n<e.length;n++)t=Nn[(t^e[n])&255]^t>>>8;return~t>>>0}Jt();var Bs=[137,80,78,71,13,10,26,10];async function Ns(e){if(typeof CompressionStream=="function"){let n=new CompressionStream("deflate"),o=new Blob([e]).stream().pipeThrough(n);return new Uint8Array(await new Response(o).arrayBuffer())}let{deflateSync:t}=await import("node:zlib");return new Uint8Array(t(e))}function cn(e,t){let n=new Uint8Array(12+t.length),o=new DataView(n.buffer);o.setUint32(0,t.length);for(let i=0;i<4;i++)n[4+i]=e.charCodeAt(i);return n.set(t,8),o.setUint32(8+t.length,Gn(n.subarray(4,8+t.length))),n}function Gs(e){let t=e.data,n=e.width*e.height,o=new Map,i=[],r=new Uint8Array(n);for(let a=0;a<n;a++){let c=a*4,l=t[c+3]===0?-1:(t[c]<<24|t[c+1]<<16|t[c+2]<<8|t[c+3])>>>0,s=o.get(l);if(s===void 0){if(i.length===256)return null;s=i.length,o.set(l,s),i.push(l===-1?[0,0,0,0]:[t[c],t[c+1],t[c+2],t[c+3]])}r[a]=s}return{colors:i,indices:r}}async function Pt(e,t={}){t.width&&t.height?e=ii(e,t.width,t.height):(t.scale&&t.scale>1||t.grid)&&(e=jt(e,t.scale||1,t));let{width:n,height:o}=e,i=t.indexed===!1?null:Gs(e),r=new Uint8Array(13),a=new DataView(r.buffer);a.setUint32(0,n),a.setUint32(4,o);let c=[new Uint8Array(Bs)],l;if(i){let f=i.colors.length<=2?1:i.colors.length<=4?2:i.colors.length<=16?4:8;r.set([f,3,0,0,0],8);let p=Math.ceil(n*f/8);l=new Uint8Array((p+1)*o);for(let b=0;b<o;b++){let M=b*(p+1)+1;for(let v=0;v<n;v++){let k=i.indices[b*n+v],x=v*f;l[M+(x>>3)]|=k<<8-f-(x&7)}}if(c.push(cn("IHDR",r)),c.push(cn("PLTE",Uint8Array.from(i.colors.flatMap(b=>b.slice(0,3))))),i.colors.some(b=>b[3]<255)){let b=i.colors.length;for(;b>0&&i.colors[b-1][3]===255;)b--;c.push(cn("tRNS",Uint8Array.from(i.colors.slice(0,b).map(M=>M[3]))))}}else{r.set([8,6,0,0,0],8),l=new Uint8Array((n*4+1)*o);for(let f=0;f<o;f++)l.set(e.data.subarray?e.data.subarray(f*n*4,(f+1)*n*4):Array.prototype.slice.call(e.data,f*n*4,(f+1)*n*4),f*(n*4+1)+1);c.push(cn("IHDR",r))}c.push(cn("IDAT",await Ns(l))),c.push(cn("IEND",new Uint8Array(0)));let s=c.reduce((f,p)=>f+p.length,0),d=new Uint8Array(s),h=0;for(let f of c)d.set(f,h),h+=f.length;return d}var Hs=e=>typeof HTMLVideoElement<"u"&&e instanceof HTMLVideoElement,js=e=>typeof VideoFrame<"u"&&e instanceof VideoFrame;async function li(e={}){let t=e.backend||"auto",n=null,o=null;if(t!=="cpu"&&typeof document<"u")try{n=await ni()}catch(s){if(o=s,t==="webgl")throw s}let i=typeof document<"u"?document.createElement("canvas"):null,r={source:null,frame:null},a=Promise.resolve();async function c(s){if(s===r.source&&r.frame&&!Hs(s)&&!js(s))return r.frame.dirty=!1,r.frame;let d=await ri(s,{maxSize:e.maxSourceSize,canvas:i});return r={source:s,frame:d},d}async function l(s,d){let h=typeof performance<"u"?performance.now():Date.now(),f=await c(s),p=wr(d,f),b,M="cpu",v=p.kind==="diffusion"&&(e.diffusion==="cpu"||e.diffusion!=="gpu"&&n&&n.software);n&&f.canvas&&!v?(b=await n.run(p,f),M="webgl"):b=vr(p,f);let k=(typeof performance<"u"?performance.now():Date.now())-h;return Vs(p,b,M,k)}return{get backend(){return n?"webgl":"cpu"},get renderer(){return n?n.renderer:""},get fallbackReason(){return o?String(o.message||o):""},process(s,d={}){let h=a.then(()=>l(s,d));return a=h.catch(()=>{}),h},invalidate(){r={source:null,frame:null}},destroy(){n&&n.destroy(),n=null},get shader(){return n?n.shader:null}}}function Vs(e,t,n="cpu",o=0){return{width:e.width,height:e.height,data:t,palette:e.paletteHex?e.paletteHex.slice():null,settings:e.settings,kind:e.kind,waves:e.waves,crop:{x:e.crop.x/e.srcWidth,y:e.crop.y/e.srcHeight,w:e.crop.w/e.srcWidth,h:e.crop.h/e.srcHeight},backend:n,ms:o,usedColors(){return ai(this)},toImageData(){return new ImageData(new Uint8ClampedArray(this.data),this.width,this.height)},toCanvas(r=1,a={}){return ci(this,r,a)},toPNG(r={}){return Pt(this,r)},async toBlob(r={}){return new Blob([await Pt(this,r)],{type:"image/png"})}}}To();mi();Jt();Ot();un();var yn=[{id:"balanced",name:"Balanced",description:"Endesga 32, Bayer 4\xD74. A good first look at most photos.",settings:{size:{width:96},palette:{source:"builtin",id:"endesga-32"},dither:{method:"bayer4",strength:.6}}},{id:"game-boy",name:"Game Boy",description:"Four greens, 160 px wide, ordered dither.",settings:{size:{width:160},palette:{source:"builtin",id:"game-boy-dmg"},dither:{method:"bayer4",strength:1},adjust:{contrast:.15}}},{id:"pico-8",name:"PICO-8",description:"128 px, the PICO-8 palette, blue-noise dither.",settings:{size:{width:128},palette:{source:"builtin",id:"pico-8"},dither:{method:"bluenoise",strength:.7}}},{id:"one-bit",name:"1-bit Atkinson",description:"Classic Mac look: two colours, Atkinson diffusion.",settings:{size:{width:192},palette:{source:"builtin",id:"1-bit-monitor"},dither:{method:"atkinson",strength:1},adjust:{contrast:.2}}},{id:"faithful",name:"Faithful colour",description:"Palette extracted from the image, Floyd\u2013Steinberg.",settings:{size:{width:128},palette:{source:"extract",count:24},dither:{method:"floyd-steinberg",strength:.75}}},{id:"sprite",name:"Clean sprite",description:"No dither, nearest resample, orphan cleanup and a dark outline. For art with transparency.",settings:{size:{width:48,resample:"nearest"},palette:{source:"extract",count:12},dither:{method:"none"},cleanup:{orphans:!0},outline:{mode:"outer",color:"#1a1c2c"}}},{id:"cga",name:"CGA",description:"16 hard colours with an 8\xD78 Bayer pattern.",settings:{size:{width:160},palette:{source:"builtin",id:"cga-16"},dither:{method:"bayer8",strength:1}}},{id:"newsprint",name:"Newsprint",description:"Grey clustered-dot halftone.",settings:{size:{width:220},palette:{source:"builtin",id:"grayscale-4"},dither:{method:"cluster8",strength:1},adjust:{saturation:-1}}},{id:"soft",name:"Soft painterly",description:"Resurrect 64 with Sierra Lite and a light smooth.",settings:{size:{width:112},palette:{source:"builtin",id:"resurrect-64"},dither:{method:"sierra-lite",strength:.6},cleanup:{smooth:!0}}}];function m(e,t={},...n){let[o,...i]=e.split("."),r=document.createElement(o||"div");i.length&&(r.className=i.join(" "));for(let[a,c]of Object.entries(t||{}))c==null||c===!1||(a.startsWith("on")&&typeof c=="function"?r.addEventListener(a.slice(2),c):a==="html"?r.innerHTML=c:a==="text"?r.textContent=c:a==="style"&&typeof c=="object"?Object.assign(r.style,c):a==="dataset"?Object.assign(r.dataset,c):a in r&&typeof c!="string"&&a!=="list"?r[a]=c:r.setAttribute(a,c===!0?"":c));return wi(r,n),r}function wi(e,t){for(let n of t.flat(1/0))n==null||n===!1||e.append(n instanceof Node?n:document.createTextNode(String(n)));return e}function At(e,...t){return e.replaceChildren(),wi(e,t)}var Qs=0,Qt=(e="itp")=>`${e}-${++Qs}`;function jn({accept:e="",multiple:t=!1}={}){return new Promise(n=>{let o=m("input",{type:"file",accept:e,multiple:t,style:{display:"none"}});o.addEventListener("change",()=>{n([...o.files]),o.remove()}),o.addEventListener("cancel",()=>{n([]),o.remove()}),document.body.append(o),o.click()})}var vi={upload:'<path d="M12 15V4m0 0-4 4m4-4 4 4"/><path d="M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3"/>',download:'<path d="M12 4v11m0 0-4-4m4 4 4-4"/><path d="M4 15v3a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-3"/>',image:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><circle cx="9" cy="10" r="1.6"/><path d="m4 17 5-4.5 4 3.5 3-2.5 4 3.5"/>',film:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M7.5 4.5v15M16.5 4.5v15M3.5 9h4M3.5 15h4M16.5 9h4M16.5 15h4"/>',files:'<path d="M8 7V5.5A1.5 1.5 0 0 1 9.5 4H15l4 4v8.5a1.5 1.5 0 0 1-1.5 1.5H16"/><rect x="4.5" y="7" width="11.5" height="13" rx="1.5"/>',presets:'<rect x="4" y="4" width="7" height="7" rx="1.5"/><rect x="13" y="4" width="7" height="7" rx="1.5"/><rect x="4" y="13" width="7" height="7" rx="1.5"/><path d="M16.5 13.5v6M13.5 16.5h6"/>',palette:'<path d="M12 3.5a8.5 8.5 0 1 0 0 17c1.2 0 1.8-.9 1.4-2l-.3-.8c-.4-1.2.5-2.2 1.7-2.2h1.7a4 4 0 0 0 4-4c0-4.4-3.8-8-8.5-8Z"/><circle cx="8" cy="11" r="1"/><circle cx="11" cy="7.5" r="1"/><circle cx="15.5" cy="8.5" r="1"/>',search:'<circle cx="11" cy="11" r="6"/><path d="m20 20-4.5-4.5"/>',x:'<path d="M6 6l12 12M18 6 6 18"/>',plus:'<path d="M12 5v14M5 12h14"/>',minus:'<path d="M5 12h14"/>',chevron:'<path d="m9.5 6 6 6-6 6"/>',chevronDown:'<path d="m6 9.5 6 6 6-6"/>',undo:'<path d="M9 7 4.5 11.5 9 16"/><path d="M5 11.5h9.5a5 5 0 0 1 0 10H11"/>',redo:'<path d="m15 7 4.5 4.5L15 16"/><path d="M19 11.5H9.5a5 5 0 0 0 0 10H13"/>',compare:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M12 2.5v19"/><path d="M15 9.5l2 2.5-2 2.5"/><path d="M9 9.5 7 12l2 2.5"/>',grid:'<rect x="3.5" y="3.5" width="17" height="17" rx="2"/><path d="M9.2 3.5v17M14.8 3.5v17M3.5 9.2h17M3.5 14.8h17"/>',fit:'<path d="M4 9V5.5A1.5 1.5 0 0 1 5.5 4H9M15 4h3.5A1.5 1.5 0 0 1 20 5.5V9M20 15v3.5a1.5 1.5 0 0 1-1.5 1.5H15M9 20H5.5A1.5 1.5 0 0 1 4 18.5V15"/>',zoomIn:'<circle cx="11" cy="11" r="6"/><path d="m20 20-4.5-4.5M11 8.5v5M8.5 11h5"/>',zoomOut:'<circle cx="11" cy="11" r="6"/><path d="m20 20-4.5-4.5M8.5 11h5"/>',sun:'<circle cx="12" cy="12" r="3.5"/><path d="M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6 7 7M17 17l1.4 1.4M5.6 18.4 7 17M17 7l1.4-1.4"/>',moon:'<path d="M19.5 14.5A7.5 7.5 0 0 1 9.5 4.5a7.5 7.5 0 1 0 10 10Z"/>',sidebarLeft:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M9.5 4.5v15"/>',sidebarRight:'<rect x="3.5" y="4.5" width="17" height="15" rx="2"/><path d="M14.5 4.5v15"/>',play:'<path d="M8 5.5v13l10.5-6.5L8 5.5Z"/>',pause:'<path d="M8.5 5.5v13M15.5 5.5v13"/>',stepBack:'<path d="M7 5.5v13M18 6l-8 6 8 6V6Z"/>',stepForward:'<path d="M17 5.5v13M6 6l8 6-8 6V6Z"/>',save:'<path d="M5 4.5h11l3.5 3.5v10A1.5 1.5 0 0 1 18 19.5H6A1.5 1.5 0 0 1 4.5 18V6A1.5 1.5 0 0 1 6 4.5Z"/><path d="M8 4.5v4h7v-4M8 19.5v-6h8v6"/>',rename:'<path d="M4 20h4L19 9l-4-4L4 16v4Z"/><path d="m13.5 6.5 4 4"/>',volume:'<path d="M4 9.5h3.5L12 6v12l-4.5-3.5H4z"/><path d="M15.5 9.5a3.5 3.5 0 0 1 0 5M18 7a7 7 0 0 1 0 10"/>',volumeOff:'<path d="M4 9.5h3.5L12 6v12l-4.5-3.5H4z"/><path d="m16 9.5 5 5M21 9.5l-5 5"/>',trash:'<path d="M4.5 7h15M9.5 7V5a1 1 0 0 1 1-1h3a1 1 0 0 1 1 1v2M6.5 7l1 12a1.5 1.5 0 0 0 1.5 1.4h6a1.5 1.5 0 0 0 1.5-1.4l1-12"/>',link:'<path d="M10 14a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7L11.5 6.8"/><path d="M14 10a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.3-1.3"/>',braces:'<path d="M8.5 4.5H8A2 2 0 0 0 6 6.5v3A2.5 2.5 0 0 1 3.5 12 2.5 2.5 0 0 1 6 14.5v3a2 2 0 0 0 2 2h.5M15.5 4.5h.5a2 2 0 0 1 2 2v3a2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0-2.5 2.5v3a2 2 0 0 1-2 2h-.5"/>',pipette:'<path d="m14.5 6.5 3 3M12 9l-7.2 7.2a2 2 0 0 0-.5 1V20h2.8a2 2 0 0 0 1-.5L15.2 12"/><path d="M13 7.5 15.8 4.7a2.3 2.3 0 0 1 3.3 3.3L16.3 10.8 13 7.5Z"/>',check:'<path d="m5 12.5 4.5 4.5L19 7.5"/>',keyboard:'<rect x="2.5" y="6" width="19" height="12" rx="2"/><path d="M6 10h.01M9.5 10h.01M13 10h.01M16.5 10h.01M8 14h8"/>',reset:'<path d="M4.5 12a7.5 7.5 0 1 0 2.2-5.3L4.5 9"/><path d="M4.5 4.5V9H9"/>',sheet:'<rect x="3.5" y="3.5" width="17" height="17" rx="2"/><path d="M3.5 12h17M12 3.5v17"/>',tiles:'<rect x="3.5" y="3.5" width="7" height="7" rx="1"/><rect x="13.5" y="3.5" width="7" height="7" rx="1"/><rect x="3.5" y="13.5" width="7" height="7" rx="1"/><path d="M13.5 17h7M17 13.5v7"/>',zip:'<path d="M6 3.5h8l4.5 4.5v11a1.5 1.5 0 0 1-1.5 1.5H6A1.5 1.5 0 0 1 4.5 19V5A1.5 1.5 0 0 1 6 3.5Z"/><path d="M10 3.5v2h2v2h-2v2h2v2h-2v3"/>',gif:'<rect x="3.5" y="5.5" width="17" height="13" rx="2"/><path d="M10 10.5H8.5a1.5 1.5 0 0 0 0 3H10V12M13 10v4M16 14v-4h2M16 12h1.5"/>',more:'<circle cx="6" cy="12" r="1"/><circle cx="12" cy="12" r="1"/><circle cx="18" cy="12" r="1"/>',menu:'<path d="M4 7h16M4 12h16M4 17h16"/>',sliders:'<path d="M4 7h9M17 7h3M4 17h3M11 17h9"/><circle cx="15" cy="7" r="2"/><circle cx="9" cy="17" r="2"/>',info:'<circle cx="12" cy="12" r="8.5"/><path d="M12 11v5M12 8h.01"/>',unlink:'<path d="M10 14a4 4 0 0 0 5.7 0l2.8-2.8a4 4 0 0 0-5.7-5.7L11.5 6.8"/><path d="M14 10a4 4 0 0 0-5.7 0l-2.8 2.8a4 4 0 0 0 5.7 5.7l1.3-1.3"/><path d="M4 4l16 16"/>',arrowUp:'<path d="M12 19V5M6 11l6-6 6 6"/>',arrowDown:'<path d="M12 5v14M6 13l6 6 6-6"/>',layers:'<path d="m12 4 8.5 4.5L12 13 3.5 8.5 12 4Z"/><path d="m3.5 12.5 8.5 4.5 8.5-4.5"/><path d="m3.5 16.5 8.5 4.5 8.5-4.5"/>',frame:'<path d="M7 3v14a1 1 0 0 0 1 1h13"/><path d="M3 7h13a1 1 0 0 1 1 1v13"/>',copy:'<rect x="8.5" y="8.5" width="11" height="11" rx="1.5"/><path d="M15.5 8.5V6A1.5 1.5 0 0 0 14 4.5H6A1.5 1.5 0 0 0 4.5 6v8A1.5 1.5 0 0 0 6 15.5h2.5"/>',clipboard:'<rect x="5" y="4.5" width="14" height="16" rx="2"/><path d="M9 4.5V4a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v.5M9 10h6M9 14h4"/>',github:'<path d="M9 19c-4 1.3-4-2-5.5-2.5M14.5 21v-3.2c0-1 .1-1.4-.5-2 2.6-.3 5.5-1.3 5.5-5.8a4.5 4.5 0 0 0-1.2-3.1 4.2 4.2 0 0 0-.1-3.1s-1-.3-3.3 1.2a11.4 11.4 0 0 0-6 0C6.6 3.5 5.6 3.8 5.6 3.8a4.2 4.2 0 0 0-.1 3.1A4.5 4.5 0 0 0 4.3 10c0 4.5 2.9 5.5 5.5 5.8-.6.6-.6 1.2-.5 2V21"/>'};function ie(e,t=""){return`<svg class="i ${t}" viewBox="0 0 24 24" aria-hidden="true" focusable="false">${vi[e]||""}</svg>`}var Fl=Object.keys(vi);function Ei(e){let t=Tt(e),n="shared",o=[],i=[],r=new Map,a=new Set,c=null,l=0,s=200,d=f=>{for(let p of a)p(t,f)},h=(f,p)=>JSON.stringify(f)===JSON.stringify(p);return{get settings(){return t},get target(){return n},subscribe(f){return a.add(f),()=>a.delete(f)},update(f,p={}){let b=Ht(t,f);if(h(b,t))return;let M=Date.now(),v=p.key&&p.key===c&&M-l<1200;p.history!==!1&&!v&&(o.push(t),o.length>s&&o.shift(),i.length=0),c=p.key||null,l=M,t=b,d("update")},replace(f,p="replace"){f=Tt(f),!h(f,t)&&(o.push(t),i.length=0,c=null,t=f,d(p))},setTarget(f,p){r.set(n,{past:o,future:i}),n=f;let b=r.get(f)||{past:[],future:[]};o=b.past,i=b.future,c=null,t=Tt(p),d("target")},dropTarget(f){f!==n&&r.delete(f)},commit(){c=null},undo(){return o.length?(i.push(t),t=o.pop(),c=null,d("undo"),!0):!1},redo(){return i.length?(o.push(t),t=i.pop(),c=null,d("redo"),!0):!1},get canUndo(){return o.length>0},get canRedo(){return i.length>0}}}var xn=[.25,.5,1,2,3,4,6,8,12,16,24,32,48,64];function ki({onPick:e,onViewChange:t}={}){let n=m("canvas.screen",{role:"img","aria-label":"Preview"}),o=m("span.lbl.l",{text:"Original"}),i=m("span.lbl.r",{text:"Pixel"}),r=m("button",{type:"button","aria-label":"Drag to compare original and result",html:ie("compare")}),a=m("div.itp-split",{hidden:!0},o,i,r),c=m("div.itp-view",{tabindex:"0","aria-label":"Canvas. Scroll to zoom, drag to pan."},n,a),l=n.getContext("2d"),s={result:null,original:null,crop:null,w:0,h:0,x:0,y:0,z:1,fitted:!0,compare:!1,splitAt:.5,grid:!1,picking:!1},d=1,h=0,f=0,p=null,b="";function M(){let T=getComputedStyle(c),O=T.getPropertyValue("--checker-a").trim()||"#1a1b1f",D=T.getPropertyValue("--checker-b").trim()||"#222",F=O+D;if(F===b)return p;let G=document.createElement("canvas");G.width=G.height=16;let N=G.getContext("2d");return N.fillStyle=O,N.fillRect(0,0,16,16),N.fillStyle=D,N.fillRect(0,0,8,8),N.fillRect(8,8,8,8),b=F,p=l.createPattern(G,"repeat"),p}function v(){let T=c.getBoundingClientRect(),O=Math.min(3,window.devicePixelRatio||1);if(Math.abs(T.width-h)<.5&&Math.abs(T.height-f)<.5&&O===d&&n.width>1){A();return}d=O,h=T.width,f=T.height,n.width=Math.max(1,Math.round(h*d)),n.height=Math.max(1,Math.round(f*d)),s.fitted?x(!1):A()}function k(){if(!s.w)return 1;let T=h<600?16:48;return Math.max(.05,Math.min((h-T)/s.w,(f-T)/s.h))}function x(T=!0){s.z=k(),s.x=(h-s.w*s.z)/2,s.y=(f-s.h*s.z)/2,s.fitted=!0,A(),T&&t&&t(H())}function w(T,O=h/2,D=f/2){T=Math.max(.05,Math.min(128,T));let F=(O-s.x)/s.z,G=(D-s.y)/s.z;s.z=T,s.x=O-F*T,s.y=D-G*T,s.fitted=!1,A(),t&&t(H())}function y(T,O,D){let F=s.z,G;T>0?G=xn.find(N=>N>F+1e-6)||F*1.5:G=[...xn].reverse().find(N=>N<F-1e-6)||F/1.5,w(G,O,D)}function A(){if(l.setTransform(1,0,0,1,0,0),l.clearRect(0,0,n.width,n.height),!s.result){a.hidden=!0;return}l.setTransform(d,0,0,d,0,0);let T=Math.round(s.x*d)/d,O=Math.round(s.y*d)/d,D=Math.round(s.w*s.z*d)/d,F=Math.round(s.h*s.z*d)/d;if(l.fillStyle=M(),l.fillRect(T,O,D,F),l.imageSmoothingEnabled=!1,l.drawImage(s.result,T,O,D,F),s.compare&&s.original){let G=T+D*s.splitAt;l.save(),l.beginPath(),l.rect(T,O,Math.max(0,G-T),F),l.clip(),l.fillStyle=M(),l.fillRect(T,O,D,F),l.imageSmoothingEnabled=!0,l.imageSmoothingQuality="high";try{let N=s.original.naturalWidth||s.original.videoWidth||s.original.width,ve=s.original.naturalHeight||s.original.videoHeight||s.original.height,ke=s.crop||{x:0,y:0,w:1,h:1};l.drawImage(s.original,ke.x*N,ke.y*ve,ke.w*N,ke.h*ve,T,O,D,F)}catch{}l.restore(),a.hidden=!1,a.style.left=`${G}px`,a.style.top=`${Math.max(0,O)}px`,a.style.bottom=`${Math.max(0,f-(O+F))}px`}else a.hidden=!0;if(s.grid&&s.z>=6){l.save(),l.beginPath(),l.rect(T,O,D,F),l.clip(),l.strokeStyle="rgba(127,127,127,0.35)",l.lineWidth=1/d,l.beginPath();let G=Math.max(0,Math.floor(-s.x/s.z)),N=Math.min(s.w,Math.ceil((h-s.x)/s.z)),ve=Math.max(0,Math.floor(-s.y/s.z)),ke=Math.min(s.h,Math.ceil((f-s.y)/s.z));for(let fe=G;fe<=N;fe++){let se=Math.round((T+fe*s.z)*d)/d+.5/d;l.moveTo(se,Math.max(O,0)),l.lineTo(se,Math.min(O+F,f))}for(let fe=ve;fe<=ke;fe++){let se=Math.round((O+fe*s.z)*d)/d+.5/d;l.moveTo(Math.max(T,0),se),l.lineTo(Math.min(T+D,h),se)}l.stroke(),l.restore()}}let _=null,P=new Map;c.addEventListener("pointerdown",T=>{if(!(T.target===r||r.contains(T.target))&&!(T.target!==c&&T.target!==n)){if(c.focus({preventScroll:!0}),P.set(T.pointerId,{x:T.clientX,y:T.clientY}),c.setPointerCapture(T.pointerId),s.picking&&T.button===0&&P.size===1){let O=c.getBoundingClientRect(),D=(T.clientX-O.left-s.x)/(s.w*s.z),F=(T.clientY-O.top-s.y)/(s.h*s.z);D>=0&&F>=0&&D<1&&F<1&&e&&e(D,F);return}_={x:T.clientX,y:T.clientY,ox:s.x,oy:s.y},c.classList.add("panning")}}),c.addEventListener("pointermove",T=>{if(!P.has(T.pointerId))return;let O=P.get(T.pointerId);if(P.set(T.pointerId,{x:T.clientX,y:T.clientY}),P.size===2){let[D,F]=[...P.values()],G=[...P.entries()].find(([ke])=>ke!==T.pointerId)[1],N=Math.hypot(O.x-G.x,O.y-G.y),ve=Math.hypot(D.x-F.x,D.y-F.y);if(N>0){let ke=c.getBoundingClientRect();w(s.z*ve/N,(D.x+F.x)/2-ke.left,(D.y+F.y)/2-ke.top)}_=null;return}_&&(s.x=_.ox+T.clientX-_.x,s.y=_.oy+T.clientY-_.y,s.fitted=!1,A())});let I=T=>{P.delete(T.pointerId),P.size||(_=null,c.classList.remove("panning"),t&&t(H()))};c.addEventListener("pointerup",I),c.addEventListener("pointercancel",I),c.addEventListener("wheel",T=>{T.preventDefault();let O=c.getBoundingClientRect(),D=T.clientX-O.left,F=T.clientY-O.top;if(!T.ctrlKey&&T.deltaMode===0&&Math.abs(T.deltaX)>0){s.x-=T.deltaX,s.y-=T.deltaY,s.fitted=!1,A();return}T.ctrlKey&&T.deltaMode===0?w(s.z*Math.exp(-T.deltaY*.01),D,F):y(T.deltaY<0?1:-1,D,F)},{passive:!1}),c.addEventListener("dblclick",()=>x()),r.addEventListener("pointerdown",T=>{T.preventDefault(),r.setPointerCapture(T.pointerId);let O=F=>{let G=c.getBoundingClientRect();s.splitAt=Math.min(1,Math.max(0,(F.clientX-G.left-s.x)/(s.w*s.z))),A()},D=()=>{r.removeEventListener("pointermove",O),r.removeEventListener("pointerup",D)};r.addEventListener("pointermove",O),r.addEventListener("pointerup",D)}),r.addEventListener("keydown",T=>{(T.key==="ArrowLeft"||T.key==="ArrowRight")&&(T.preventDefault(),T.stopPropagation(),s.splitAt=Math.min(1,Math.max(0,s.splitAt+(T.key==="ArrowLeft"?-.05:.05))),A())}),new ResizeObserver(v).observe(c);let H=()=>({zoom:s.z,fitted:s.fitted,x:s.x,y:s.y});return{el:c,show(T,O,D){let F=!s.result||T.width!==s.w||T.height!==s.h,G={w:s.w*s.z,cx:s.x+s.w*s.z/2,cy:s.y+s.h*s.z/2};if(s.result=T,s.original=O||s.original,s.crop=D||null,F)if(s.w=T.width,s.h=T.height,s.fitted||!G.w)x();else{let N=G.w/s.w;s.z=N,s.x=G.cx-s.w*N/2,s.y=G.cy-s.h*N/2,A(),t&&t(H())}else A()},clear(){s.result=null,s.original=null,s.w=s.h=0,s.fitted=!0,A()},fit:x,zoomTo:w,zoomStep:y,zoomIn(){y(1)},zoomOut(){y(-1)},get zoom(){return s.z},get fitted(){return s.fitted},get rect(){return{x:s.x,y:s.y,width:s.w*s.z,height:s.h*s.z,zoom:s.z}},setCompare(T){s.compare=T,A()},get compare(){return s.compare},setGrid(T){s.grid=T,A()},get grid(){return s.grid},setPicking(T){s.picking=T,c.classList.toggle("picking",T)},get picking(){return s.picking},redraw:A,resize:v}}function Mi(e,t={},...n){let o=Qt("sec"),i=m("span.hint",{}),r=m("button.itp-sec-toggle",{type:"button","aria-controls":o},m("span.title",{text:e}),i,m("span.chev",{html:ie("chevron")})),a=t.onReset?m("button.itp-btn.small.icon.itp-sec-reset",{type:"button",hidden:!0,title:t.resetLabel||`Reset ${e.toLowerCase()}`,"aria-label":t.resetLabel||`Reset ${e.toLowerCase()} to defaults`,html:ie("reset"),onclick:()=>t.onReset()}):null,c=m("div.body",{id:o},...n),l=m("section.itp-sec",{},m("div.itp-sec-head",{},r,a),c),s=d=>{l.dataset.open=String(d),r.setAttribute("aria-expanded",String(d)),c.hidden=!d};return r.addEventListener("click",()=>{let d=l.dataset.open!=="true";s(d),t.onToggle?.(d)}),s(t.open!==!1),{el:l,body:c,setHint(d){i.textContent=d},setChanged(d){a&&(a.hidden=!d)},setOpen:s,get open(){return l.dataset.open==="true"}}}function Bt(e,t,{help:n="",value:o=null,id:i}={}){let r=m("div.lab",{},m("label",{for:i||t.id||null,text:e}),o);return m("div.itp-field",{},r,t,n?m("div.help",{text:n}):null)}function ht(e){let t=Qt("sl"),n=e.scale||1,o=e.step||1,i=m("input",{type:"range",id:t,min:e.min*n,max:e.max*n,step:o*n,"aria-label":e.label}),r=m("input.itp-input",{type:"number",min:e.min*n,max:e.max*n,step:o*n,"aria-label":`${e.label} value`}),a=()=>{let s=(i.value-i.min)/(i.max-i.min)*100;i.style.setProperty("--p",`${s}%`)},c=s=>{let d=ec(s*n,o*n);i.value=d,r.value=d,a()};return i.addEventListener("input",()=>{r.value=i.value,a(),e.onInput(Number(i.value)/n)}),i.addEventListener("change",()=>e.onCommit&&e.onCommit()),r.addEventListener("change",()=>{let s=Math.min(e.max*n,Math.max(e.min*n,Number(r.value)||0));c(s/n),e.onInput(s/n),e.onCommit&&e.onCommit()}),i.addEventListener("dblclick",()=>{e.reset!=null&&(c(e.reset),e.onInput(e.reset),e.onCommit&&e.onCommit())}),c(e.value),{el:Bt(e.label,m("div.itp-slider",{},i,r),{help:e.help,id:t}),set:c,input:i}}var ec=(e,t)=>{let n=Math.max(0,-Math.floor(Math.log10(t)+1e-9));return Number((Math.round(e/t)*t).toFixed(n))};function Xt(e){let t=Qt("se"),n=m("select.itp-select",{id:t,"aria-label":e.label}),o=new Map;for(let r of e.options){let a=m("option",{value:r.value,text:r.label});if(r.group){if(!o.has(r.group)){let c=m("optgroup",{label:r.group});o.set(r.group,c),n.append(c)}o.get(r.group).append(a)}else n.append(a)}return n.addEventListener("change",()=>e.onChange(n.value)),{el:e.bare?n:Bt(e.label,n,{help:e.help,id:t}),select:n,set(r){n.value=r}}}function en(e){let t=e.options.map(r=>m("button",{type:"button","aria-pressed":"false",title:r.title||null,html:(r.icon?ie(r.icon):"")+(r.label?`<span>${r.label}</span>`:""),onclick:()=>e.onChange(r.value)})),n=m("div.itp-seg",{role:"group","aria-label":e.label},...t),o=r=>t.forEach((a,c)=>a.setAttribute("aria-pressed",String(e.options[c].value===r)));return o(e.value),{el:e.bare?n:Bt(e.label,n,{help:e.help}),set:o}}function Nt(e){let t=m("input",{type:"checkbox",role:"switch"});t.addEventListener("change",()=>e.onChange(t.checked));let n=m("label.itp-switch",{},m("span",{text:e.label}),t);return{el:e.help?m("div.itp-field",{},n,m("div.help",{text:e.help})):n,set(i){t.checked=!!i}}}function Si(e){let t=m("input",{type:"color","aria-label":e.label}),n=m("span.mono",{});t.addEventListener("input",()=>{n.textContent=t.value,e.onChange(t.value)});let o=m("label.itp-color",{},t,n),i=r=>{t.value=r,n.textContent=r};return i(e.value||"#000000"),{el:e.bare?o:Bt(e.label,o),set:i}}function tn(e){let t=Qt("nu"),n=m("input.itp-input.num",{type:"number",id:t,min:e.min,max:e.max,step:e.step||1,"aria-label":e.label});return n.addEventListener("change",()=>{let o=Math.min(e.max,Math.max(e.min,Number(n.value)||e.min));(n.value!==""||!n.placeholder)&&(n.value=o),e.onChange(o)}),{el:e.bare?n:Bt(e.label,n,{help:e.help,id:t}),input:n,set(o){n.value=o}}}Jt();Ot();var Lo=class{constructor(){this.buf=new Uint8Array(65536),this.n=0}byte(t){if(this.n===this.buf.length){let n=new Uint8Array(this.buf.length*2);n.set(this.buf),this.buf=n}this.buf[this.n++]=t}bytes(t){for(let n=0;n<t.length;n++)this.byte(t[n])}u16(t){this.byte(t&255),this.byte(t>>8&255)}str(t){for(let n=0;n<t.length;n++)this.byte(t.charCodeAt(n))}result(){return this.buf.slice(0,this.n)}};function tc(e,t,n){let o=1<<t,i=o+1,r=t+1,a=i+1,c=new Map,l=0,s=0,d=[],h=[],f=b=>{for(l|=b<<s,s+=r;s>=8;)h.push(l&255),l>>>=8,s-=8,h.length===255&&(d.push(h),h=[])};f(o);let p=e[0];for(let b=1;b<e.length;b++){let M=e[b],v=p*256+M,k=c.get(v);if(k!==void 0){p=k;continue}f(p),a<4096?(c.set(v,a++),a>1<<r&&r<12&&r++):(f(o),c=new Map,r=t+1,a=i+1),p=M}f(p),f(i),s>0&&h.push(l&255),h.length&&d.push(h),n.byte(t);for(let b of d)n.byte(b.length),n.bytes(b);n.byte(0)}var _o=(e,t)=>e[t+3]<128?-1:e[t]<<16|e[t+1]<<8|e[t+2];function Ci(e,t){let n=[...e].filter(c=>c!==-1),o=n.map(c=>[c>>16,c>>8&255,c&255]),i=t?o.length:-1;t&&o.push([0,0,0]);let r=1;for(;1<<r<o.length;)r++;for(;o.length<1<<r;)o.push([0,0,0]);let a=new Map(n.map((c,l)=>[c,l]));return{colors:o,bits:r,tIndex:i,index:a}}function nc(e,t){let n=Un(e,t).map(Ft),o=new Uint8ClampedArray(e.data),i=new Map;for(let r=0;r<o.length;r+=4){if(o[r+3]<128)continue;let a=o[r]<<16|o[r+1]<<8|o[r+2],c=i.get(a);if(c===void 0){let l=1/0;c=0;for(let s=0;s<n.length;s++){let d=o[r]-n[s][0],h=o[r+1]-n[s][1],f=o[r+2]-n[s][2],p=d*d*3+h*h*4+f*f*2;p<l&&(l=p,c=s)}i.set(a,c)}o.set(n[c],r)}return{...e,data:o}}function Ti(e,t={}){if(!e.length)throw new Error("No frames");let n=Math.max(1,Math.round(t.scale||1)),o=e.map(p=>({...n>1?jt(p,n):p,delay:p.delay??t.delay??100})),i=o[0].width,r=o[0].height,a=!1,c=new Set,l=o.map(p=>{let b=new Set;for(let M=0;M<p.data.length;M+=4){let v=_o(p.data,M);v===-1&&(a=!0),b.add(v),c.add(v)}return b}),s=p=>p.size-(p.has(-1)?1:0),h=s(c)+(a?1:0)<=256?Ci(c,a):null,f=new Lo;if(f.str("GIF89a"),f.u16(i),f.u16(r),f.byte(h?240|h.bits-1:0),f.byte(0),f.byte(0),h)for(let p of h.colors)f.bytes(p);return o.length>1&&t.loop!==-1&&(f.byte(33),f.byte(255),f.byte(11),f.str("NETSCAPE2.0"),f.byte(3),f.byte(1),f.u16(t.loop||0),f.byte(0)),o.forEach((p,b)=>{let M=p,v=h,k=l[b];if(!v){let w=a?255:256;if(s(k)>w){M=nc(p,w),k=new Set;for(let y=0;y<M.data.length;y+=4)k.add(_o(M.data,y))}v=Ci(k,k.has(-1))}if(f.byte(33),f.byte(249),f.byte(4),f.byte((a?2:1)<<2|(v.tIndex>=0?1:0)),f.u16(Math.max(2,Math.round(M.delay/10))),f.byte(v.tIndex>=0?v.tIndex:0),f.byte(0),f.byte(44),f.u16(0),f.u16(0),f.u16(i),f.u16(r),f.byte(v===h?0:128|v.bits-1),v!==h)for(let w of v.colors)f.bytes(w);let x=new Uint8Array(i*r);for(let w=0;w<x.length;w++){let y=_o(M.data,w*4);x[w]=y===-1?v.tIndex:v.index.get(y)}tc(x,Math.max(2,v.bits),f)}),f.byte(59),f.result()}var Ai=new TextEncoder;function wn(e){let t=[],n=[],o=0,i=new Set;for(let d of e){let h=d.name.replace(/\\/g,"/").replace(/^\/+/,"");if(i.has(h)){let _=/^(.*?)(\.[^.]*)?$/.exec(h),P=2;for(;i.has(`${_[1]}-${P}${_[2]||""}`);)P++;h=`${_[1]}-${P}${_[2]||""}`}i.add(h);let f=Ai.encode(h),p=typeof d.data=="string"?Ai.encode(d.data):d.data,b=Gn(p),M=d.date||new Date,v=M.getHours()<<11|M.getMinutes()<<5|M.getSeconds()>>1,k=M.getFullYear()-1980<<9|M.getMonth()+1<<5|M.getDate(),x=new Uint8Array(30+f.length),w=new DataView(x.buffer);w.setUint32(0,67324752,!0),w.setUint16(4,20,!0),w.setUint16(6,2048,!0),w.setUint16(8,0,!0),w.setUint16(10,v,!0),w.setUint16(12,k,!0),w.setUint32(14,b,!0),w.setUint32(18,p.length,!0),w.setUint32(22,p.length,!0),w.setUint16(26,f.length,!0),w.setUint16(28,0,!0),x.set(f,30);let y=new Uint8Array(46+f.length),A=new DataView(y.buffer);A.setUint32(0,33639248,!0),A.setUint16(4,20,!0),A.setUint16(6,20,!0),A.setUint16(8,2048,!0),A.setUint16(10,0,!0),A.setUint16(12,v,!0),A.setUint16(14,k,!0),A.setUint32(16,b,!0),A.setUint32(20,p.length,!0),A.setUint32(24,p.length,!0),A.setUint16(28,f.length,!0),A.setUint32(42,o,!0),y.set(f,46),t.push(x,p),n.push(y),o+=x.length+p.length}let r=n.reduce((d,h)=>d+h.length,0),a=new Uint8Array(22),c=new DataView(a.buffer);c.setUint32(0,101010256,!0),c.setUint16(8,e.length,!0),c.setUint16(10,e.length,!0),c.setUint32(12,r,!0),c.setUint32(16,o,!0);let l=new Uint8Array(o+r+22),s=0;for(let d of[...t,...n,a])l.set(d,s),s+=d.length;return l}var Po=(e,t)=>({width:e,height:t,data:new Uint8ClampedArray(e*t*4)});function oc(e,t,n,o,i=0,r=0,a=t.width,c=t.height){for(let l=0;l<c;l++){let s=((r+l)*t.width+i)*4,d=((o+l)*e.width+n)*4;e.data.set(t.data.subarray?t.data.subarray(s,s+a*4):Array.prototype.slice.call(t.data,s,s+a*4),d)}}function Ro(e,t={}){if(!e.length)throw new Error("No frames");let n=Math.max(0,t.padding|0),o=Math.max(...e.map(f=>f.width)),i=Math.max(...e.map(f=>f.height)),r=Math.max(1,Math.min(e.length,t.columns||Math.ceil(Math.sqrt(e.length)))),a=Math.ceil(e.length/r),c=r*o+(r-1)*n,l=a*i+(a-1)*n,s=Po(c,l),d={};e.forEach((f,p)=>{let b=p%r*(o+n),M=Math.floor(p/r)*(i+n);oc(s,f,b,M),d[f.name||`frame-${String(p).padStart(3,"0")}`]={frame:{x:b,y:M,w:f.width,h:f.height},sourceSize:{w:f.width,h:f.height},...f.delay!=null?{duration:Math.round(f.delay)}:{}}});let h={frames:d,meta:{app:"image-to-pixel",image:(t.name||"sheet")+".png",size:{w:c,h:l},scale:"1",columns:r,rows:a,padding:n}};return{image:s,atlas:h}}function _i(e,t={}){let n=Math.max(1,t.tileWidth||8),o=Math.max(1,t.tileHeight||n),i=Math.ceil(e.width/n),r=Math.ceil(e.height/o),a=[],c=new Map,l=[],s=[],d=(b,M)=>{let v=Po(n,o);for(let k=0;k<o;k++)for(let x=0;x<n;x++){let w=b*n+x,y=M*o+k;if(w>=e.width||y>=e.height)continue;let A=(y*e.width+w)*4;v.data.set([e.data[A],e.data[A+1],e.data[A+2],e.data[A+3]],(k*n+x)*4)}return v},h=b=>{let M="";for(let v=0;v<b.data.length;v+=4)M+=b.data[v+3]===0?".":String.fromCharCode(b.data[v]+1,b.data[v+1]+1,b.data[v+2]+1);return M},f=(b,M,v)=>{let k=Po(n,o);for(let x=0;x<o;x++)for(let w=0;w<n;w++){let y=((v?o-1-x:x)*n+(M?n-1-w:w))*4;k.data.set(b.data.subarray(y,y+4),(x*n+w)*4)}return k};for(let b=0;b<r;b++)for(let M=0;M<i;M++){let v=d(M,b),k=c.get(h(v)),x=0;if(k===void 0&&t.flips)for(let[w,y,A]of[[1,0,1],[0,1,2],[1,1,3]]){let _=c.get(h(f(v,w,y)));if(_!==void 0){k=_,x=A;break}}k===void 0&&(k=a.length,a.push(v),c.set(h(v),k)),l.push(k),s.push(x)}return{image:Ro(a,{columns:t.columns||Math.min(16,a.length)}).image,map:{width:i,height:r,tileWidth:n,tileHeight:o,tiles:l,...t.flips?{flips:s}:{}},count:a.length}}un();var rc=null,ic=()=>rc||(rc=document.body.appendChild(m("div.itp-toasts.itp",{role:"status","aria-live":"polite"})));function Q(e,t={}){let n=t.kind||"info",o=m("div.msg",{},m("div",{text:e})),i=t.progress?m("div.itp-progress",{},m("i")):null;i&&o.append(i);let r=m(`div.itp-toast.${n}`,{},t.progress?m("div.itp-spinner"):m("span.itp-dot"),o);t.action&&r.append(m("button.itp-btn.small.outline",{type:"button",text:t.action.label,onclick:()=>{t.action.onClick(),c()}})),t.onCancel?r.append(m("button.itp-btn.small",{type:"button",text:"Cancel",onclick:()=>{t.onCancel(),c()}})):r.append(m("button.itp-btn.small.icon",{type:"button","aria-label":"Dismiss",html:ie("x"),onclick:()=>c()})),ic().append(r);let a=null,c=()=>{clearTimeout(a),r.remove()};return(s=>{clearTimeout(a),s&&(a=setTimeout(c,s))})(t.timeout??(t.progress?0:n==="error"?7e3:3200)),{update(s){o.firstChild.textContent=s},progress(s){i&&(i.firstChild.style.width=`${Math.round(s*100)}%`)},close:c,done(s,d="ok"){c(),Q(s,{kind:d})}}}var dn=null;function vn(e,t,{align:n="end"}={}){nn();let o=m("div.itp-menu.itp",{role:"menu"});for(let f of t){if(f==="sep"){o.append(m("hr"));continue}if(f.group){o.append(m("div.mlabel",{text:f.group}));continue}let p=m("button.mi",{type:"button",role:"menuitem",disabled:!!f.disabled},m("span",{html:f.icon?ie(f.icon):""}),m("span",{},f.label,f.sub?m("small",{text:f.sub}):null),f.kbd?m("kbd",{text:f.kbd}):m("span"));p.addEventListener("click",()=>{nn(),f.onClick()}),o.append(p)}document.body.append(o);let i=e.getBoundingClientRect(),r=o.offsetWidth,a=o.offsetHeight,c=n==="end"?i.right-r:i.left;c=Math.max(8,Math.min(c,innerWidth-r-8));let l=i.bottom+6;l+a>innerHeight-8&&(l=Math.max(8,i.top-a-6)),Object.assign(o.style,{left:`${c}px`,top:`${l}px`}),e.setAttribute("aria-expanded","true");let s=[...o.querySelectorAll("button.mi:not(:disabled)")];s[0]?.focus();let d=f=>{let p=s.indexOf(document.activeElement);f.key==="Escape"?(f.preventDefault(),nn(),e.focus()):f.key==="ArrowDown"?(f.preventDefault(),s[(p+1)%s.length]?.focus()):f.key==="ArrowUp"?(f.preventDefault(),s[(p-1+s.length)%s.length]?.focus()):f.key==="Tab"&&nn()},h=f=>{!o.contains(f.target)&&f.target!==e&&!e.contains(f.target)&&nn()};o.addEventListener("keydown",d),setTimeout(()=>document.addEventListener("pointerdown",h,!0)),dn={el:o,anchor:e,cleanup:()=>document.removeEventListener("pointerdown",h,!0)}}function nn(){dn&&(dn.cleanup(),dn.el.remove(),dn.anchor.setAttribute("aria-expanded","false"),dn=null)}function En(e,t,{actions:n=[],onClose:o}={}){let i=m("div.content",{},t),r=m("dialog.itp-dialog.itp",{"aria-label":e},m("header",{},m("h2",{text:e}),m("button.itp-btn.icon",{type:"button","aria-label":"Close",html:ie("x"),onclick:()=>r.close()})),i,n.length?m("footer",{},...n.map(a=>m(`button.itp-btn${a.primary?".primary":".outline"}`,{type:"button",text:a.label,onclick:async()=>{await a.onClick?.()!==!1&&r.close()}}))):null);return r.addEventListener("close",()=>{r.remove(),o?.()}),document.body.append(r),r.showModal(),r.body=i,r.setContent=(...a)=>At(i,...a),r}var Gt=e=>(e||"image").replace(/\.[^.]+$/,"").replace(/[^\w.-]+/g,"-").replace(/^-+|-+$/g,"")||"image",Zn=e=>({scale:e.export.scale,grid:e.export.grid,gridColor:e.export.gridColor,indexed:e.export.indexed});function Jn(e,t,n){return e.export.size==="source"&&t&&n&&t.crop?{width:Math.max(1,Math.round(t.crop.w*n.width)),height:Math.max(1,Math.round(t.crop.h*n.height))}:{width:t?t.width*e.export.scale:0,height:t?t.height*e.export.scale:0}}var jo=(e,t,n)=>e.export.size==="source"&&n?{...Jn(e,t,n),indexed:e.export.indexed}:Zn(e);function wc(e,t,n=4){let o=Math.max(1,Math.ceil(240/Math.min(t.width,t.height))),i=c=>{let l=Math.round(c*16/9),s=t.height>t.width,d=s?c:l,h=s?l:c;return Math.max(o,Math.min(Math.floor(d/t.width),Math.floor(h/t.height)))},r=e==="scale"?Math.max(o,n):i(Number(e)||1080);return[r,i(1080),i(720),o].filter((c,l,s)=>c<=r&&s.indexOf(c)===l).sort((c,l)=>l-c)}function vc(e,t){if(!t?.active)return e;if(!t.complete)throw new Error("Wait for the selected interval to finish loading");if(!t.renderedFrames.length)throw new Error("Select frames on the canvas first");return{...e,source:"video",item:t.item,settings:t.settings,fps:t.fps,start:t.start,end:t.end,audio:!1,renderedFrames:t.renderedFrames.map(n=>({...n}))}}function Hi(e){let t=()=>e.store.settings,n=()=>e.frameSelection?.()?.active?(Q("Turn off frame selection to export the current frame",{kind:"error"}),!0):!1,o=p=>{try{return vc(p,e.frameSelection?.())}catch(b){return Q(b.message,{kind:"error"}),null}};async function i(){if(n())return;if(!e.result)return Q("Open an image first",{kind:"error"});let p=t(),b=await Pt(e.result,jo(p,e.result,e.current)),M=Jn(p,e.result,e.current),v=p.export.size==="source"?`-${M.width}x${M.height}`:p.export.scale>1?`@${p.export.scale}x`:"";vt(b,`${Gt(e.current.name)}-${e.result.width}x${e.result.height}${v}.png`,"image/png"),Q(`Saved ${M.width} \xD7 ${M.height} PNG`,{kind:"ok"})}async function r(){if(!n()&&e.result)try{let p=await Pt(e.result,{...jo(t(),e.result,e.current),indexed:!1});await navigator.clipboard.write([new ClipboardItem({"image/png":new Blob([p],{type:"image/png"})})]),Q("Image copied",{kind:"ok"})}catch(p){Q(`Couldn't copy: ${p.message}`,{kind:"error"})}}async function a(p,b){if(e.exporting)return Q("An export is already running");let M=new AbortController,v=Q(p,{progress:!0,onCancel:()=>M.abort()});e.exporting=!0;try{let k=await b(M.signal,(x,w)=>{v.progress(x),w&&v.update(w)});v.done(k)}catch(k){v.close(),k.name!=="AbortError"?(Q(`Export failed: ${k.message}`,{kind:"error"}),console.error(k)):Q("Export cancelled")}finally{e.exporting=!1,e.schedule()}}async function c(){let p=e.items.slice();p.length&&await a(`Processing ${p.length} files`,async(b,M)=>{let v=[],k=[];for(let x=0;x<p.length;x++){if(b.aborted)throw new DOMException("Aborted","AbortError");let w=p[x],y=e.settingsFor(w);w.type==="video"&&e.engine.invalidate();let A=await e.engine.process(w.source,y);v.push({name:`${Gt(w.name)}.png`,data:await Pt(A,jo(y,A,w))}),w.own&&k.push({name:`${Gt(w.name)}.settings.json`,data:an(y)}),M((x+1)/p.length,`Processed ${x+1} of ${p.length}`)}return v.push({name:"settings.json",data:an(e.shared)},...k),vt(wn(v),"pixel-art.zip","application/zip"),`Saved ${p.length} images as a ZIP`})}async function l(p,b,M,v){let k=t(),x=e.current;if(!x||x.type!=="video")throw new Error("Open a video first");let w=x.source,y=p.end>p.start?p.end:w.duration;return ln(w,{fps:p.fps,start:p.start,end:y,signal:b,onFrame:async({index:A,total:_})=>{e.engine.invalidate();let P=await e.engine.process(w,k);await v(P,A,_,`${Gt(x.name)}-${String(A).padStart(4,"0")}`),M((A+1)/_,`Frame ${A+1} of ${_}`)}})}async function s(p,b,M,v){if(p.renderedFrames){for(let k=0;k<p.renderedFrames.length;k++){if(b.aborted)throw new DOMException("Aborted","AbortError");let{result:x,index:w}=p.renderedFrames[k];await v(x,k,p.renderedFrames.length,`${Gt(p.item.name)}-${String(w).padStart(4,"0")}`),M((k+1)/p.renderedFrames.length,`Frame ${k+1} of ${p.renderedFrames.length}`)}return p.renderedFrames.length}if(p.source==="files"){let k=e.items.filter(w=>w.type==="image"),x=null;for(let w=0;w<k.length;w++){if(b.aborted)throw new DOMException("Aborted","AbortError");let y=e.settingsFor(k[w]),A=await e.engine.process(k[w].source,x?Ht(y,{size:x}):y);x||(x={mode:"width",width:A.width,height:A.height}),await v(A,w,k.length,k[w].name),M((w+1)/k.length,`Frame ${w+1} of ${k.length}`)}return k.length}return l(p,b,M,v)}async function d(p){if(p=o(p),!p)return;let b=p.source==="files"?"animation":Gt((p.item||e.current)?.name),M=p.settings||t(),v=1e3/p.fps;if(p.format==="gif"||p.format==="png-seq"){await a("Rendering frames",async(k,x)=>{let w=[];if(await s(p,k,x,async(y,A,_,P)=>{p.format==="gif"?w.push({width:y.width,height:y.height,data:y.data,delay:v}):w.push({name:`${P}.png`,data:await Pt(y,Zn(M))})}),p.format==="gif"){x(1,"Encoding GIF"),await new Promise(A=>setTimeout(A,0));let y=Ti(w,{scale:M.export.scale,loop:0});return vt(y,`${b}.gif`,"image/gif"),`Saved GIF (${w.length} frames, ${(y.length/1024).toFixed(0)} KB)`}return vt(wn(w),`${b}-frames.zip`,"application/zip"),`Saved ${w.length} PNG frames`});return}await a(`Encoding ${p.format.toUpperCase()}`,async(k,x)=>{let{createVideoEncoder:w,decodeAudio:y}=await Promise.resolve().then(()=>(Ho(),Go)),A=e.current,_=null;if(p.audio&&p.source==="video"&&A&&A.type==="video"&&A.file){x(0,"Reading audio");let T=p.end>p.start?p.end:A.source.duration;_=await y(A.file,{start:p.start,end:T}).catch(O=>(console.warn("[export] audio",O),null))}let P=null;await s(p,k,x,async T=>{if(!P){let O=wc(p.videoSize,T,M.export.scale),D=null;for(let F of O)try{P=await w({format:p.format,fps:p.fps,width:T.width,height:T.height,scale:F,audio:_});break}catch(G){if(D=G,!/encoder available/.test(G.message))throw G}if(!P)throw D}await P.add(T)}),_&&P.audioCodec&&x(1,"Encoding audio");let I=await P.finish();vt(I,`${b}.${p.format}`);let H=!p.audio||p.source!=="video"?"":P.audioCodec==="opus"&&p.format==="mp4"?", with Opus audio: VLC and browsers play it, Windows Media Player and QuickTime may not":P.audioCodec?", with audio":_?", without audio (this browser can't encode it)":", no audio track in the source";return`Saved ${p.format.toUpperCase()} (${(I.size/1024/1024).toFixed(1)} MB${H})`})}async function h(p){if(p=o(p),!p)return;let b=p.source==="files"?"sheet":`${Gt((p.item||e.current)?.name)}-sheet`,M=p.settings||t();await a("Building sprite sheet",async(v,k)=>{let x=[];await s(p,v,k,(_,P,I,H)=>{x.push({width:_.width,height:_.height,data:_.data,name:H?Gt(H):void 0,delay:1e3/p.fps})});let{image:w,atlas:y}=Ro(x,{columns:p.columns,padding:p.padding,name:b});if(M.export.scale>1){let _=M.export.scale;for(let P of Object.values(y.frames)){for(let I of["x","y","w","h"])P.frame[I]*=_;P.sourceSize.w*=_,P.sourceSize.h*=_}y.meta.size.w*=_,y.meta.size.h*=_,y.meta.scale=String(_)}let A=await Pt(w,Zn(M));return vt(wn([{name:`${b}.png`,data:A},{name:`${b}.json`,data:JSON.stringify(y,null,2)}]),`${b}.zip`,"application/zip"),`Saved a ${x.length}-frame sprite sheet`})}async function f({tile:p,flips:b}){if(n())return;if(!e.result)return Q("Open an image first",{kind:"error"});let M=t(),v=_i(e.result,{tileWidth:p,tileHeight:p,flips:b}),k=`${Gt(e.current.name)}-tiles`,x=await Pt(v.image,Zn(M)),w={...v.map,image:`${k}.png`,note:"tiles[] holds one tile index per cell, row by row"+(b?"; flips[] is 0 none, 1 horizontal, 2 vertical, 3 both":"")};vt(wn([{name:`${k}.png`,data:x},{name:`${k}.json`,data:JSON.stringify(w,null,2)}]),`${k}.zip`,"application/zip"),Q(`Saved ${v.count} unique tiles (${v.map.width} \xD7 ${v.map.height} map)`,{kind:"ok"})}return{exportPNG:i,copyImage:r,exportZip:c,exportAnimation:d,exportSheet:h,exportTileset:f}}un();var on=(e,t,n)=>Math.max(t,Math.min(n,e)),Sn=e=>`${e.toFixed(3)}s`,eo=140,to=124,no=10,Xo=3,Cn=1e3,Ec=.05,Vi=7,ji=11;function kc(e,t,n=!1){let o=Math.max(1,Math.min(Math.max(1,t),Math.round(e/2))),i=Math.max(1,Math.ceil(t/o)),r=o*eo+(o-1)*no,a=i*to+(i-1)*no,c=n?{x:r+24,y:0,w:eo,h:to+24}:null;return{cols:o,width:c?c.x+c.w:r,height:Math.max(a,c?.h||0),animation:c}}function Xi(e,t,n=0,o=e){let i=Math.max(1,Math.ceil(e*t-1e-6)),r=on(Math.round(n*t),0,i-1),a=on(o>=e?i:Math.round(o*t),r+1,i);return{count:i,first:r,last:a}}function Wo(e,t){let n=Math.round(t*10)/10;return e>=t-Ec||Math.abs(e-n)<1e-6}function Vo({first:e,last:t},n=!1){return t-e<=Cn?{first:e,last:t}:n?{first:t-Cn,last:t}:{first:e,last:e+Cn}}function Qn(e,t,n){let o=Math.min(Vi,t.width/2),i=Math.max(0,t.width-o*2);return t.left+o+e/Math.max(1,n)*i}function Mc(e,t,n){let o=Math.min(Vi,t.width/2),i=Math.max(1,t.width-o*2);return Math.round(on((e-t.left-o)/i,0,1)*n)}function Sc(e,t,{start:n=0,end:o=0,rangeTouched:i=!1}={}){let a=i||n>1e-6||o>n&&!Wo(o,e)?o||e:Math.min(e,n+Xo),c=Xi(e,t,n,a),l=Vo(c);return l.last===c.last?c:{...c,last:l.last,capped:!0}}function Wi(e,{onModeChange:t,onZoomChange:n,onRangeChange:o,onSelectionChange:i,animationOptions:r}){let a=null,c=!1,l=!1,s=!1,d=30,h=12,f=1,p=0,b=1,M=1,v=[],k=new Set,x="",w=0,y=null,A=null,_=!1,P=!1,I=0,H=!1,T=null,O=null,D=0,F=[],G=(L,$,Y="",oe={})=>m(`button.itp-btn.small${Y}`,{type:"button",text:L,onclick:$,...oe}),N=m("span.itp-story-status",{role:"status",text:"Choose a time interval below"}),ve=m("span.num",{text:"0 selected"}),ke=G("Select all",()=>{v.forEach(L=>k.add(L.index)),$e()}),fe=G("Clear",()=>{k.clear(),$e()}),se=m("span.num",{text:"Fit"}),de=G("",()=>dt(-1),".icon",{html:ie("zoomOut"),"aria-label":"Smaller frame tiles"}),ze=G("",()=>dt(1),".icon",{html:ie("zoomIn"),"aria-label":"Larger frame tiles"}),me=G("",je,".icon.outline",{html:ie("play"),"aria-label":"Play selected",title:"Play selected (Space)","aria-pressed":"false"}),W=m("div.itp-story-grid",{role:"group","aria-label":"Video frames. Drag to pan, use the wheel to zoom, and click a frame to select it."}),V=m("canvas.itp-story-canvas",{tabindex:"0","aria-label":"Video frames and selected animation. Drag to pan, scroll to zoom."}),Ce=m("div.itp-story-overlay",{},m("div.itp-float.itp-story-head",{},N,ve),m("div.itp-float.itp-story-actions",{},ke,fe,m("div.itp-story-zoom",{role:"group","aria-label":"Frame tile size"},de,se,ze),me));W.append(V,Ce);let xe=m("section.itp-storyboard",{"aria-label":"Select video frames",hidden:!0},W),z={x:0,y:0,z:1,fitted:!0,vw:0,vh:0,dpr:1},ge=m("input",{type:"range",min:0,max:1,step:1,value:0,"aria-label":"Interval start frame"}),be=m("input",{type:"range",min:0,max:1,step:1,value:1,"aria-label":"Interval end frame"}),pe=m("div.itp-story-range",{},m("div.itp-story-range-track"),ge,be),Se=m("input.itp-input.num",{type:"number",min:0,step:"0.001",value:0,"aria-label":"Interval start seconds"}),Ie=m("input.itp-input.num",{type:"number",min:0,step:"0.001",value:0,"aria-label":"Interval end seconds"}),Re=m("span.muted.num"),Ze=m("div.itp-transport.itp-transport-tiled",{hidden:!0,role:"group","aria-label":"Video time interval"},m("label.itp-story-time",{},"In",Se),pe,m("label.itp-story-time",{},"Out",Ie),Re);ge.addEventListener("input",()=>Ye(Number(ge.value),b,"start")),be.addEventListener("input",()=>Ye(p,Number(be.value),"end")),Se.addEventListener("change",()=>Ye(Math.round(Number(Se.value)*d),b,"start")),Ie.addEventListener("change",()=>Ye(p,Math.round(Number(Ie.value)*d),"end"));let ce=null,Je=null;pe.addEventListener("pointerdown",L=>{if(!l||_||L.button!==0)return;let $=pe.getBoundingClientRect(),Y=Math.abs(L.clientX-Qn(p,$,f)),oe=Math.abs(L.clientX-Qn(b,$,f)),he=Y<=oe;(he?Y:oe)>ji||(ce=he?"start":"end",(he?ge:be).focus({preventScroll:!0}),_=!0,Je=L.pointerId,pe.setPointerCapture(L.pointerId),L.preventDefault(),P&&clearTimeout(A))}),pe.addEventListener("pointermove",L=>{if(_&&L.pointerId!==Je)return;let $=pe.getBoundingClientRect();if(!_){let oe=Math.min(Math.abs(L.clientX-Qn(p,$,f)),Math.abs(L.clientX-Qn(b,$,f)));pe.style.cursor=oe<=ji?"ew-resize":"";return}let Y=Mc(L.clientX,$,f);ce==="start"?Ye(Y,b,"start"):Ye(p,Y,"end")}),pe.addEventListener("pointerleave",()=>{_||(pe.style.cursor="")});let nt=L=>{!_||L.pointerId!==Je||(_=!1,ce=null,Je=null,P&&He())};window.addEventListener("pointerup",nt),window.addEventListener("pointercancel",nt);function Oe(L=!1){ge.max=be.max=String(f),ge.value=String(p),be.value=String(b),ge.setAttribute("aria-valuetext",Sn(p/d)),be.setAttribute("aria-valuetext",Sn(Math.min(a.duration,b/d))),Se.max=Ie.max=String(a.duration),Se.value=(p/d).toFixed(3),Ie.value=Math.min(a.duration,b/d).toFixed(3),pe.style.setProperty("--from",`${p/f*100}%`),pe.style.setProperty("--to",`${b/f*100}%`),ge.style.zIndex=p>f/2?"3":"2",Re.textContent=`${d} fps`,o?.({start:p/d,end:Math.min(a.duration,b/d),user:L})}function Ye(L,$,Y){if(!l||!Number.isFinite(L)||!Number.isFinite($)){a&&Oe();return}let oe=on(L,0,Y==="start"?b-1:f-1),he=on($,Y==="end"?p+1:oe+1,f),ae=Vo({first:oe,last:he},Y==="end");(ae.first!==oe||ae.last!==he)&&bt(),ot(ae.first,ae.last,!0)}function ot(L,$,Y=!1){if(L===p&&$===b){Oe(Y);return}p=L,b=$,k=new Set([...k].filter(oe=>oe>=p&&oe<b)),Oe(Y),He()}function St(L,$){if(!c||!l)return;let Y=Xi(a.duration,d,L,$>L?$:a.duration),oe=Vo(Y);(oe.first!==Y.first||oe.last!==Y.last)&&bt(),ot(oe.first,oe.last)}function rt(){return kc(d,I,!!O)}function Ue(){let L=W.getBoundingClientRect(),$=Math.min(3,window.devicePixelRatio||1);z.vw=L.width,z.vh=L.height,z.dpr=$,V.width=Math.max(1,Math.round(L.width*$)),V.height=Math.max(1,Math.round(L.height*$)),z.fitted?We():Be()}function We(L=!0){let $=rt();if(!v.length){z.x=z.vw/2,z.y=z.vh/2,Be();return}let Y=Et();z.z=Math.max(.05,Math.min(128,(z.vw-24)/$.width,(Y-24)/$.height)),z.x=(z.vw-$.width*z.z)/2,z.y=(Y-$.height*z.z)/2,z.fitted=!0,ut(),Be(),L&&n?.()}function qe(){let L=rt().animation;if(!L)return;let $=Et();z.x=z.vw/2-(L.x+L.w/2)*z.z,z.y=$/2-(L.y+L.h/2)*z.z,z.fitted=!1,ut(),Be(),n?.(),V.focus({preventScroll:!0})}function Et(){return Math.max(1,z.vh-Ce.offsetHeight-24)}function mt(L){let $=rt(),Y=L%$.cols,oe=Math.floor(L/$.cols);return{x:Y*(eo+no),y:oe*(to+no),w:eo,h:to}}function Be(){let L=V.getContext("2d"),{dpr:$,vw:Y,vh:oe,x:he,y:ae,z:Le}=z,C=getComputedStyle(xe),U=C.getPropertyValue("--stage").trim()||"#1b1c20",B=C.getPropertyValue("--panel").trim()||"#25262b",K=C.getPropertyValue("--raised").trim()||"#303137",re=C.getPropertyValue("--muted").trim()||"#a1a3ad",j=C.getPropertyValue("--accent").trim()||"#ffbd4a",te=C.getPropertyValue("--accent-soft").trim()||"#40351e",le=C.getPropertyValue("--line").trim()||"#45464d";L.setTransform(1,0,0,1,0,0),L.clearRect(0,0,V.width,V.height),L.setTransform($,0,0,$,0,0),L.fillStyle=U,L.fillRect(0,0,Y,oe),L.imageSmoothingEnabled=!1;let Ae=C.getPropertyValue("--font-ui").trim()||"sans-serif";function ye(we,Te,E=!1){let X=he+Te.x*Le,ue=ae+Te.y*Le,Me=Te.w*Le,J=Te.h*Le;if(X>Y||ue>oe||X+Me<0||ue+J<0)return;let u=E||k.has(we.index);L.fillStyle=u?te:B,L.fillRect(X,ue,Me,J);let g=6*Le,S=18*Le,R=E?24*Le:0,q=Math.min((Me-g*2)/we.canvas.width,(J-R-S-g*2)/we.canvas.height),Z=we.canvas.width*q,ne=we.canvas.height*q;L.fillStyle=K,L.fillRect(X+g,ue+R+g,Me-g*2,J-R-S-g*2),L.drawImage(we.canvas,X+(Me-Z)/2,ue+R+g+(J-R-S-g*2-ne)/2,Z,ne),L.save(),L.beginPath(),L.rect(X+g,ue,Me-g*2,J),L.clip(),L.font=`${11*Le}px ${Ae}`,L.fillStyle=re,E?(L.fillStyle=j,L.fillText("Selected animation",X+g,ue+17*Le),L.fillStyle=re,L.fillText(`${D+1} of ${F.length} / ${h} fps`,X+g,ue+J-6*Le)):L.fillText(`#${we.index} / ${Sn(we.time)}`,X+g,ue+J-6*Le),L.restore(),L.strokeStyle=u?j:le,L.lineWidth=Math.max(1,Le),L.strokeRect(X+.5,ue+.5,Me-1,J-1)}v.forEach((we,Te)=>ye(we,mt(Te))),O&&ye(O,rt().animation,!0)}function gt(L,$){if(!s)return;let Y=W.getBoundingClientRect(),oe=(L-Y.left-z.x)/z.z,he=($-Y.top-z.y)/z.z,ae=v.find((Le,C)=>{let U=mt(C);return oe>=U.x&&oe<=U.x+U.w&&he>=U.y&&he<=U.y+U.h});ae&&(k.has(ae.index)?k.delete(ae.index):k.add(ae.index),$e())}let Fe=null,Ge=new Map;V.addEventListener("pointerdown",L=>{if(V.focus({preventScroll:!0}),V.setPointerCapture(L.pointerId),Ge.set(L.pointerId,{x:L.clientX,y:L.clientY}),Ge.size===2){Fe=null;return}Fe={pointerId:L.pointerId,x:L.clientX,y:L.clientY,ox:z.x,oy:z.y,moved:!1}}),V.addEventListener("pointermove",L=>{if(!Ge.has(L.pointerId))return;let $=Ge.get(L.pointerId);if(Ge.set(L.pointerId,{x:L.clientX,y:L.clientY}),Ge.size===2){let[he,ae]=[...Ge.values()],Le=[...Ge.entries()].find(([C])=>C!==L.pointerId)?.[1];if(Le){let C=Math.hypot($.x-Le.x,$.y-Le.y),U=Math.hypot(he.x-ae.x,he.y-ae.y),B=W.getBoundingClientRect();C>0&&Ke(z.z*U/C,(he.x+ae.x)/2-B.left,(he.y+ae.y)/2-B.top)}Fe=null;return}if(!Fe||Fe.pointerId!==L.pointerId)return;let Y=L.clientX-Fe.x,oe=L.clientY-Fe.y;Math.abs(Y)+Math.abs(oe)>3&&(Fe.moved=!0),z.x=Fe.ox+Y,z.y=Fe.oy+oe,z.fitted=!1,Be()}),V.addEventListener("pointerup",L=>{if(Ge.delete(L.pointerId),!Fe||Fe.pointerId!==L.pointerId)return;let $=!Fe.moved,{x:Y,y:oe}=L;Fe=null,$&>(Y,oe),ut(),n?.()}),V.addEventListener("pointercancel",L=>{Ge.delete(L.pointerId),Fe=null}),V.addEventListener("wheel",L=>{L.preventDefault();let $=W.getBoundingClientRect(),Y=L.clientX-$.left,oe=L.clientY-$.top;if(!L.ctrlKey&&L.deltaMode===0&&Math.abs(L.deltaX)>Math.abs(L.deltaY)){z.x-=L.deltaX,z.y-=L.deltaY,z.fitted=!1,Be(),ut(),n?.();return}L.ctrlKey&&L.deltaMode===0?Ke(z.z*Math.exp(-L.deltaY*.01),Y,oe):dt(L.deltaY<0?1:-1,Y,oe)},{passive:!1}),V.addEventListener("dblclick",()=>We()),new ResizeObserver(Ue).observe(W),new ResizeObserver(()=>{c&&z.fitted&&We()}).observe(Ce);let st=0;function bt(){let L=performance.now();L-st<2e3||(st=L,e.toast(`This interval is longer than ${Cn} frames, so only ${Cn} are loaded. Narrow the range to reach the rest.`))}function kt(){w++,clearTimeout(A),y?.abort(),y=null,P=!1,W.setAttribute("aria-busy","false")}function yt(){let{export:L,...$}=e.store.settings;return JSON.stringify($)}function He(){if(kt(),Qe(!0),s=!1,De(),!c||!l)return;P=!0,N.textContent=`Waiting to load ${b-p} frames...`,W.setAttribute("aria-busy","true");let L=w;_||(A=setTimeout(()=>It(L),300))}async function It(L){let $=a,Y=p,oe=b,he=d;P=!1,I=oe-Y,v=[],Be(),De(),N.textContent=`Loading ${oe-Y} frames...`;let ae=e.store.settings;x=yt();let Le=new AbortController;y=Le;let C=()=>L===w&&c&&a===$&&!Le.signal.aborted,U=m("video",{muted:!0,playsInline:!0,preload:"auto",crossOrigin:"anonymous"});U.muted=!0,U.src=$.source.currentSrc||$.source.src;try{let B=Array.from({length:oe-Y},(K,re)=>Math.min((Y+re+.5)/he,$.duration-1e-4));if(await ln(U,{fps:he,times:B,signal:Le.signal,onFrame:async({index:K,time:re,total:j})=>{if(!C())return;let te=await e.engine.process(U,ae);if(!C())return;let le=Y+K,Ae=te.toCanvas(1);v.push({index:le,time:re,result:te,canvas:Ae}),z.fitted&&v.length===1?We():Be(),N.textContent=`Loading ${K+1} / ${j} frames`,De()}}),!C())return;s=!0,z.fitted&&We(),N.textContent=`${v.length} frames / ${Sn(Y/he)} - ${Sn(Math.min($.duration,oe/he))}`}catch(B){C()&&B.name!=="AbortError"&&(N.textContent=`Could not load frames: ${B.message}`,e.toast(N.textContent,{kind:"error"}))}finally{U.pause(),U.removeAttribute("src"),U.load(),C()&&(y=null,W.setAttribute("aria-busy","false"),De())}}function De(){let L=v.filter($=>k.has($.index)).length;ve.textContent=`${L} selected`,ke.disabled=!s||!v.length,fe.disabled=!k.size,me.disabled=!s||!L,i?.({active:c,complete:s,count:L,result:v[0]?.result||null})}function $e(){if(De(),O){let L=H;if(Qe(),F=v.filter($=>k.has($.index)),!F.length){Qe(!0);return}if(D=Math.max(0,F.findIndex($=>$.index===O.index)),O=F[D],L){ct(!1);return}}Be()}function ct(L=!0){let $=v.filter(ae=>k.has(ae.index));if(!c||!s||!$.length)return;cancelAnimationFrame(T),F=$,D=Math.max(0,$.findIndex(ae=>ae.index===O?.index)),H=!0,O=$[D],L&&qe(),lt();let Y=h,oe=performance.now()-D*1e3/Y,he=()=>{let ae=Math.floor((performance.now()-oe)*Y/1e3)%$.length;D!==ae&&(O=$[ae],D=ae,Be()),T=requestAnimationFrame(he)};Be(),he()}function Qe(L=!1){let $=!!O;if(cancelAnimationFrame(T),T=null,H=!1,L&&(O=null,F=[],D=0),lt(),L&&$){z.fitted=!0,We();return}Be()}function je(){H?Qe():ct()}function lt(){let L=H?"Pause selected":"Play selected";me.innerHTML=ie(H?"pause":"play"),me.setAttribute("aria-label",L),me.title=`${L} (Space)`,me.setAttribute("aria-pressed",String(H))}function Ve(L){let $=on(Number(L)||12,1,60);$!==h&&(h=$,H?ct(!1):Be())}function Ne(){return c?{active:c,complete:s,item:a,settings:e.store.settings,fps:h,start:p/d,end:Math.min(a.duration,b/d),renderedFrames:v.filter(L=>k.has(L.index)).map(L=>({result:L.result,index:L.index}))}:null}async function it(){let L=a;if(N.textContent="Detecting video frame rate...",ge.disabled=be.disabled=Se.disabled=Ie.disabled=!0,L.fpsReady&&await L.fpsReady,a!==L||!c)return;L.source.pause(),d=L.fps||30;let $=r(),Y=Sc(L.duration,d,$);({count:f,first:p,last:b}=Y),Y.capped&&bt(),Ve($.fps),l=!0,ge.disabled=be.disabled=Se.disabled=Ie.disabled=!1,Oe(),He()}function xt(L){if(!(!a||a.type!=="video"||L===c)){if(c=L,xe.hidden=Ze.hidden=!c,c)if(Ue(),a.fpsReady||a.source.pause(),!l)it();else{let $=r();St($.start,$.end||a.duration),Ve($.fps),(!s||x!==yt())&&He()}else _=!1,ce=null,Je=null,kt(),Qe(!0);De(),t(c)}}function Ct(L){L!==a&&(c&&xt(!1),kt(),Qe(!0),a=L,v=[],I=0,k.clear(),Be(),l=s=!1,x="",De())}function Lt(){c&&l&&x!==yt()&&He()}function ut(){M=z.z,se.textContent=z.fitted?"Fit":M>=1?`${Math.round(M*10)/10}\xD7`:`${Math.round(M*100)}%`,de.disabled=M<=.05,ze.disabled=M>=128}function Ke(L,$,Y){let oe=on(L,.05,128);$??($=z.vw/2),Y??(Y=z.vh/2);let he=($-z.x)/z.z,ae=(Y-z.y)/z.z;z.z=oe,z.x=$-he*oe,z.y=Y-ae*oe,z.fitted=!1,Be(),ut(),n?.()}function dt(L,$,Y){let oe=L>0?xn.find(he=>he>M+1e-6)||M*1.5:[...xn].reverse().find(he=>he<M-1e-6)||M/1.5;Ke(oe,$,Y)}return De(),{el:xe,transport:Ze,range:pe,get active(){return c},get zoom(){return M},get fitted(){return z.fitted},frameCanvas:L=>v.find($=>$.index===L)?.canvas,currentResult:()=>v[0]?.result||null,setItem:Ct,setMode:xt,setRange:St,setPlaybackFps:Ve,exportSelection:Ne,refresh:Lt,toggleAnimation:je,zoomTo:Ke,zoomStep:dt,fit:We}}var qi="itp:";function Rt(e,t){try{let n=localStorage.getItem(qi+e);return n==null?t:JSON.parse(n)}catch{return t}}function _t(e,t){try{return localStorage.setItem(qi+e,JSON.stringify(t)),!0}catch{return!1}}function Ki(e){let{store:t}=e,n=(E,X)=>t.update(E,{key:X}),o=()=>t.commit(),i=()=>t.settings,r=Dt(),a=(E,X)=>JSON.stringify(E)===JSON.stringify(X),c=Rt("sections",{}),l=(E,X,ue,Me,...J)=>Mi(X,{open:c[E]??ue,onToggle:u=>{c[E]=u,_t("sections",c)},onReset:Me?()=>{let u={};for(let g of Me)u[g]=JSON.parse(JSON.stringify(r[g]));t.update(u)}:null},...J),s=m("div.v",{text:"\u2013"}),d=m("div.v",{text:"\u2013"}),h=m("div.v",{text:"\u2013"}),f=m("div.itp-stats",{"aria-live":"polite"},m("div.itp-stat",{},m("div.k",{text:"Output"}),s),m("div.itp-stat",{},m("div.k",{text:"Colours"}),d),m("div.itp-stat",{},m("div.k",{text:"Render"}),h)),p=m("button",{type:"button",role:"tab","aria-selected":"true",id:"itp-tab-setup","aria-controls":"itp-pane-setup",html:`${ie("sliders")}<span>Setup</span>`}),b=m("button",{type:"button",role:"tab","aria-selected":"false",id:"itp-tab-export","aria-controls":"itp-pane-export",html:`${ie("download")}<span>Export</span>`}),M=m("div.itp-seg",{role:"tablist","aria-label":"Inspector"},p,b),v=en({label:"Settings apply to",bare:!0,options:[{value:"shared",label:"All files",icon:"layers"},{value:"own",label:"This file",icon:"unlink"}],value:"shared",onChange:E=>e.current&&e.setOwn(e.current,E==="own")}),k=m("span.itp-scope-note",{}),x=m("div.itp-scope",{hidden:!0},m("div.lab",{},m("span",{text:"Settings apply to"}),k),v.el),w=en({label:"Size by",options:[{value:"width",label:"Width"},{value:"block",label:"Pixel size"}],value:"width",onChange:E=>n({size:{mode:E}})}),y=ht({label:"Pixel width",min:8,max:512,step:1,value:96,reset:96,onInput:E=>n({size:{width:E}},"width"),onCommit:o}),A=tn({label:"Height",min:0,max:2048,help:"Leave empty to keep the aspect ratio.",onChange:E=>n({size:{height:E}})});A.input.placeholder="Auto";let _=ht({label:"Pixel size",min:1,max:64,step:1,value:8,reset:8,help:"How many source pixels become one output pixel.",onInput:E=>n({size:{block:E}},"block"),onCommit:o}),P=en({label:"Resample",options:[{value:"box",label:"Average"},{value:"nearest",label:"Nearest"}],value:"box",help:"Nearest keeps hard edges; use it for art that is already pixelated.",onChange:E=>n({size:{resample:E}})}),I=m("button.itp-btn.small.outline",{type:"button",html:`${ie("grid")}<span>Detect grid</span>`,title:"Find the pixel size of upscaled pixel art",onclick:()=>e.detectGrid()}),H=m("div",{style:{display:"contents"}},y.el,A.el),T=m("div",{style:{display:"contents"}},_.el),O=l("size","Size",!0,["size"],w.el,H,T,P.el,m("div.itp-row",{},I)),D=rn.map(E=>{let X=E.ratio||1.3333333333333333,ue=m("i",{style:{width:`${Math.round(X>=1?16:16*X)}px`,height:`${Math.round(X>=1?16/X:16)}px`}});return E.ratio||ue.classList.add("orig"),m("button",{type:"button","aria-pressed":"false",title:E.id==="original"?"The source's own shape":`Crop to ${E.label}`,onclick:()=>n({frame:{aspect:E.id}})},ue,m("span",{text:E.label}))}),F=m("div.itp-aspects",{role:"group","aria-label":"Aspect ratio"},...D),G=ht({label:"Zoom",min:1,max:8,step:.05,value:1,reset:1,help:"Crop into the middle of the frame.",onInput:E=>n({frame:{zoom:E}},"fz"),onCommit:o}),N=ht({label:"Horizontal position",min:0,max:1,step:.01,scale:100,value:.5,reset:.5,onInput:E=>n({frame:{x:E}},"fx"),onCommit:o}),ve=ht({label:"Vertical position",min:0,max:1,step:.01,scale:100,value:.5,reset:.5,onInput:E=>n({frame:{y:E}},"fy"),onCommit:o}),ke=l("frame","Frame",!1,["frame"],Bt("Aspect ratio",F),G.el,N.el,ve.el),fe=Xt({label:"Source",options:[{value:"builtin",label:"Built-in palette"},{value:"custom",label:"Custom colours"},{value:"extract",label:"From the image"},{value:"none",label:"None (keep colours)"}],onChange:E=>n({palette:{source:E}})}),se=Xt({label:"Palette",options:pn.map(E=>({value:E.id,label:`${E.name} (${E.colors.length})`})),onChange:E=>n({palette:{source:"builtin",id:E}})}),de=ht({label:"Number of colours",min:2,max:64,step:1,value:16,reset:16,onInput:E=>n({palette:{count:E}},"count"),onCommit:o}),ze=m("div.itp-swatches",{role:"list","aria-label":"Palette colours"}),me=m("span.val.num",{}),W=Bt("Colours",ze,{value:me}),V=en({label:"Colour matching",options:[{value:"oklab",label:"Perceptual"},{value:"rgb",label:"RGB"}],value:"oklab",onChange:E=>n({palette:{distance:E}})}),Ce=m("div.itp-row",{style:{flexWrap:"wrap"}},m("button.itp-btn.small.outline",{type:"button",html:`${ie("upload")}<span>Import</span>`,title:".gpl, .hex, .pal, .txt or .json",onclick:()=>e.importPalette()}),m("button.itp-btn.small.outline",{type:"button",html:`${ie("palette")}<span>Lospec</span>`,onclick:()=>e.lospecDialog()}),m("button.itp-btn.small.outline",{type:"button",html:`${ie("pipette")}<span>Pick</span>`,title:"Add colours by clicking the image","aria-pressed":"false",onclick:E=>e.togglePicker(E.currentTarget)}),m("button.itp-btn.small",{type:"button",html:`${ie("download")}<span>Save</span>`,title:"Save to Your palettes",onclick:()=>e.savePalette()})),xe=l("palette","Palette",!1,["palette"],fe.el,se.el,de.el,W,V.el,Ce),z={none:"None",ordered:"Ordered",diffusion:"Error diffusion"},ge=Xt({label:"Method",options:mn.map(E=>({value:E.id,label:E.label,group:z[E.kind]})),onChange:E=>n({dither:{method:E}})}),be=ht({label:"Strength",min:0,max:1,step:.01,scale:100,value:.6,reset:.6,onInput:E=>n({dither:{strength:E}},"strength"),onCommit:o}),pe=m("textarea.itp-input",{rows:4,spellcheck:!1,"aria-label":"Custom threshold matrix",placeholder:`0 8 2 10
|
|
302
302
|
12 4 14 6
|
|
303
303
|
3 11 1 9
|
|
304
|
-
15 7 13 5`}),_e=m("div.help",{text:"Rows of numbers, up to 16\xD716. Only their order matters."});We.addEventListener("change",()=>{try{n({dither:{method:"custom",matrix:Lo(We.value)}}),_e.textContent="Rows of numbers, up to 16\xD716. Only their order matters.",_e.style.color=""}catch(g){_e.textContent=g.message,_e.style.color="var(--danger)"}});let ke=m("div.itp-field",{},m("div.lab",{},m("span",{text:"Matrix"})),We,_e),le=l("dither","Dither",!1,["dither"],Ve.el,De.el,ke),nt={min:-1,max:1,step:.01,scale:100,value:0,reset:0},Ae=Se({label:"Brightness",...nt,onInput:g=>n({adjust:{brightness:g}},"br"),onCommit:o}),qe=Se({label:"Contrast",...nt,onInput:g=>n({adjust:{contrast:g}},"co"),onCommit:o}),Ge=Se({label:"Saturation",...nt,onInput:g=>n({adjust:{saturation:g}},"sa"),onCommit:o}),Lt=Se({label:"Hue",min:-180,max:180,step:1,value:0,reset:0,help:"Rotates every colour around the colour wheel; greys stay grey.",onInput:g=>n({adjust:{hue:g}},"hu"),onCommit:o}),Oe=Se({label:"Gamma",min:.2,max:3,step:.05,value:1,reset:1,onInput:g=>n({adjust:{gamma:g}},"ga"),onCommit:o}),ot=l("adjust","Adjust",!1,["adjust"],Ae.el,qe.el,Ge.el,Lt.el,Oe.el),Ye=Se({label:"Alpha cutoff",min:0,max:1,step:.01,scale:100,value:.5,reset:.5,help:"Pixels less opaque than this become transparent.",onInput:g=>n({alpha:{threshold:g}},"alpha"),onCommit:o}),Pe=Xt({label:"Remove stray pixels",onChange:g=>n({cleanup:{orphans:g}})}),ge=Xt({label:"Smooth small specks",onChange:g=>n({cleanup:{smooth:g}})}),je=Ht({label:"Outline",options:[{value:"none",label:"None"},{value:"outer",label:"Outside"},{value:"inner",label:"Inside"}],value:"none",help:"Follows transparent edges.",onChange:g=>n({outline:{mode:g}})}),we=Yr({label:"Outline colour",onChange:g=>n({outline:{color:g}},"olc")}),Et=Xt({label:"Include diagonals",onChange:g=>n({outline:{corners:g}})}),Le=l("cleanup","Cleanup & outline",!1,["cleanup","outline","alpha"],Pe.el,ge.el,Ye.el,je.el,we.el,Et.el),Rt=m("div",{id:"itp-pane-setup",role:"tabpanel","aria-labelledby":"itp-tab-setup"},I.el,G.el,me.el,le.el,ot.el,Le.el),Ke=Ht({label:"Size",options:[{value:"scale",label:"Scale"},{value:"source",label:"Source size"}],value:"scale",help:"",onChange:g=>n({export:{size:g}})}),rt=Se({label:"Scale",min:1,max:32,step:1,value:4,reset:4,help:"Whole-number upscale keeps every pixel square.",onInput:g=>n({export:{scale:g}},"scale"),onCommit:o}),Ze=m("span.val.num",{}),kt=Xt({label:"Grid lines",onChange:g=>n({export:{grid:g}})}),Ut=Xt({label:"Indexed PNG",help:"Smaller files; up to 256 colours.",onChange:g=>n({export:{indexed:g}})}),Je=m("button.itp-btn.primary.block",{type:"button",html:`${Y("download")}<span>Download PNG</span>`,onclick:()=>e.exportPNG()}),ft=m("button.itp-btn.outline.block",{type:"button",html:`${Y("copy")}<span>Copy image</span>`,onclick:()=>e.copyImage()}),pt=m("button.itp-btn.outline.block",{type:"button",html:`${Y("zip")}<span>Download all as ZIP</span>`,onclick:()=>e.exportZip()}),It=l("image","Image",!0,["export"],wt("Output size",m("div"),{value:Ze}),Ke.el,rt.el,kt.el,Ut.el,m("div.itp-grid2",{},Je,ft),pt),He=jt({label:"Frames from",options:[{value:"video",label:"Current video"},{value:"files",label:"All files, in order"}],onChange:()=>R()}),it=jt({label:"Format",options:[{value:"gif",label:"GIF"},{value:"webm",label:"WebM video"},{value:"mp4",label:"MP4 video"},{value:"png-seq",label:"PNG sequence (ZIP)"}],onChange:()=>R()}),$e=Vt({label:"Frames per second",min:1,max:60,onChange:()=>{}}),at=Vt({label:"Start (s)",min:0,max:36e3,step:.1,onChange:()=>{}}),Re=Vt({label:"End (s)",min:0,max:36e3,step:.1,onChange:()=>{}}),ze=m("div.help",{}),Ft=m("button.itp-btn.primary.block",{type:"button",html:`${Y("film")}<span>Export animation</span>`,onclick:()=>e.exportAnimation(Mt())}),Yt=l("animation","Animation",!1,null,He.el,it.el,$e.el,m("div.itp-grid2",{},at.el,Re.el),ze,Ft);$e.set(12),at.set(0),Re.set(0);let Mt=()=>({source:He.select.value,format:it.select.value,fps:Number($e.input.value)||12,start:Number(at.input.value)||0,end:Number(Re.input.value)||0}),st=Vt({label:"Columns",min:0,max:256,help:"0 = as square as possible.",onChange:()=>{}}),Qe=Vt({label:"Padding",min:0,max:64,onChange:()=>{}});st.set(0),Qe.set(0);let ct=m("button.itp-btn.outline.block",{type:"button",html:`${Y("sheet")}<span>Download sprite sheet</span>`,onclick:()=>e.exportSheet({...Mt(),columns:Number(st.input.value)||0,padding:Number(Qe.input.value)||0})}),Dt=l("sheet","Sprite sheet",!1,null,m("div.help",{text:"Packs the frames chosen under Animation into one PNG with a JSON atlas (TexturePacker hash format)."}),m("div.itp-grid2",{},st.el,Qe.el),ct),p=jt({label:"Tile size",options:[8,12,16,24,32,48,64].map(g=>({value:String(g),label:`${g} \xD7 ${g}`})),onChange:()=>{}});p.set("16");let M=Xt({label:"Count mirrored tiles as duplicates",onChange:()=>{}}),_=m("button.itp-btn.outline.block",{type:"button",html:`${Y("tiles")}<span>Download tileset</span>`,onclick:()=>e.exportTileset({tile:Number(p.select.value),flips:M.el.querySelector("input").checked})}),F=l("tileset","Tileset",!1,null,m("div.help",{text:"Cuts the current result into tiles, keeps one copy of each and writes a tile map."}),p.el,M.el,_),X=l("settings","Settings",!1,null,m("div.itp-grid2",{},m("button.itp-btn.outline",{type:"button",html:`${Y("link")}<span>Copy link</span>`,onclick:()=>e.copyLink()}),m("button.itp-btn.outline",{type:"button",html:`${Y("braces")}<span>Save JSON</span>`,onclick:()=>e.saveSettingsFile()})),m("button.itp-btn.outline.block",{type:"button",html:`${Y("upload")}<span>Load settings file</span>`,onclick:()=>e.loadSettingsFile()})),ne=m("div",{id:"itp-pane-export",role:"tabpanel","aria-labelledby":"itp-tab-export",hidden:!0},It.el,Yt.el,Dt.el,F.el,X.el),ie=m("div.itp-insp-foot",{},m("button.itp-link",{type:"button",text:"Reset to defaults",onclick:()=>e.resetSettings()}),m("span.muted",{style:{fontSize:"var(--fs-xs)"},id:"itp-backend"})),te=m("div.itp-panel-body",{},Rt,ne),fe=m("aside.itp-insp",{"aria-label":"Inspector"},m("div.itp-insp-head",{},u,b,E),m("div",{style:{height:"8px"}}),te,ie);function C(g){let $=g==="setup";h.setAttribute("aria-selected",String($)),x.setAttribute("aria-selected",String(!$)),Rt.hidden=!$,ne.hidden=$,$||R()}h.onclick=()=>C("setup"),x.onclick=()=>C("export"),E.addEventListener("keydown",g=>{if(g.key==="ArrowRight"||g.key==="ArrowLeft"){let $=h.getAttribute("aria-selected")==="true"?x:h;$.click(),$.focus()}});function R(){let g=e.current,$=g&&g.type==="video",ee=e.items.filter(Q=>Q.type==="image").length;!$&&He.select.value==="video"&&ee>1&&He.set("files"),$&&He.select.value==="files"&&ee<2&&He.set("video");let J=He.select.value,oe=J==="video"?$:ee>1;at.el.hidden=Re.el.hidden=J!=="video",Ft.disabled=!oe,ct.disabled=!oe,$&&!Number(Re.input.value)&&Re.set(Math.round((g.duration||0)*10)/10),$&&g.fps&&!$e.input.dataset.touched&&$e.set(Math.min(30,Math.round(g.fps)));let re=it.select.value;ze.textContent=oe?(re==="mp4"||re==="webm")&&!e.videoSupport?.[re]?`${re.toUpperCase()} encoding isn't available in this browser. GIF and PNG sequence always work.`:"":J==="video"?"Open a video to export an animation.":"Add two or more images to animate them."}$e.input.addEventListener("change",()=>{$e.input.dataset.touched="1"});function O(g,$){tt(se,...g.map((ee,J)=>{let oe=m("button.itp-swatch",{type:"button",role:"listitem",title:$?`${ee}. Click to change, Alt+click to remove`:ee,style:{background:ee}});return oe.setAttribute("aria-label",$?`${ee}, edit`:ee),$?oe.addEventListener("click",re=>{if(re.altKey){let de=i().palette.colors.filter((ht,mt)=>mt!==J);de.length&&n({palette:{colors:de}});return}let Q=m("input",{type:"color",value:ee,style:{position:"fixed",opacity:0,pointerEvents:"none"}});document.body.append(Q),Q.addEventListener("input",()=>{let de=i().palette.colors.slice();de[J]=Q.value,n({palette:{colors:de}},"sw"+J)}),Q.addEventListener("change",()=>Q.remove()),Q.click()}):oe.addEventListener("click",()=>{n({palette:{source:"custom",colors:i().palette.colors.slice(),name:`${i().palette.name} (edited)`}}),e.toast("Copied to a custom palette you can edit")}),oe}),$?m("button.itp-swatch.add",{type:"button","aria-label":"Add colour",title:"Add colour",html:Y("plus"),onclick:()=>n({palette:{colors:[...i().palette.colors,"#808080"]}})}):null)}let j="";function q(g,$){S.set(g.size.mode),z.hidden=g.size.mode!=="width",v.hidden=g.size.mode!=="block",w.set(g.size.width),A.set(g.size.height||""),L.set(g.size.block),T.set(g.size.resample),I.setHint($?`${$.width} \xD7 ${$.height}`:""),ce.set(g.palette.source),be.set(g.palette.id),be.el.hidden=g.palette.source!=="builtin",Te.el.hidden=g.palette.source!=="extract",Te.set(g.palette.count),Fe.set(g.palette.distance),Fe.el.hidden=g.palette.source==="none",he.hidden=g.palette.source==="none";let ee=g.palette.source==="extract"?$&&$.palette||[]:g.palette.colors,J=g.palette.source+ee.join();J!==j&&(j=J,O(ee,g.palette.source==="custom")),ae.textContent=String(ee.length),me.setHint(g.palette.source==="none"?"None":g.palette.name),Ve.set(g.dither.method),De.set(g.dither.strength);let oe=yn(g.dither.method);De.el.hidden=oe==="none",ke.hidden=g.dither.method!=="custom",g.dither.method==="custom"&&document.activeElement!==We&&(We.value=(g.dither.matrix||[]).map(xe=>xe.join(" ")).join(`
|
|
305
|
-
`)),le.setHint(g.palette.source==="none"?"Needs a palette":rn.find(xe=>xe.id===g.dither.method).label),le.el.querySelector("select").disabled=g.palette.source==="none",Ae.set(g.adjust.brightness),qe.set(g.adjust.contrast),Ge.set(g.adjust.saturation),Lt.set(g.adjust.hue),Oe.set(g.adjust.gamma);let re=g.adjust.brightness||g.adjust.contrast||g.adjust.saturation||g.adjust.hue||g.adjust.gamma!==1;D.forEach((xe,Ct)=>xe.setAttribute("aria-pressed",String(Kt[Ct].id===g.frame.aspect))),B.set(g.frame.zoom),H.set(g.frame.x),V.set(g.frame.y);let Q=e.current,de=Q?wn(Q.width,Q.height,g.frame):null;H.el.hidden=!de||de.w>=Q.width,V.el.hidden=!de||de.h>=Q.height;let ht=g.frame.aspect!=="original"||g.frame.zoom>1;G.setHint(ht?[g.frame.aspect!=="original"?g.frame.aspect:"",g.frame.zoom>1?`${Math.round(g.frame.zoom*100)/100}\xD7`:""].filter(Boolean).join(", "):""),G.setChanged(!a(g.frame,r.frame));let mt=e.items.length>1;b.hidden=!(Q&&(mt||Q.own)),y.set(Q&&Q.own?"own":"shared");let Z=e.items.filter(xe=>!xe.own).length;k.textContent=Q&&Q.own?"Only this file":`${Z} ${Z===1?"file":"files"}`,fe.dataset.scope=Q&&Q.own?"own":"shared",ot.setHint(re?"Changed":""),Ye.set(g.alpha.threshold),Pe.set(g.cleanup.orphans),ge.set(g.cleanup.smooth),je.set(g.outline.mode),we.set(g.outline.color),Et.set(g.outline.corners),we.el.hidden=Et.el.hidden=g.outline.mode==="none";let ve=[g.cleanup.orphans&&"strays",g.cleanup.smooth&&"smooth",g.outline.mode!=="none"&&"outline"].filter(Boolean);Le.setHint(ve.join(", ")),I.setChanged(!a(g.size,r.size)),me.setChanged(!a(g.palette,r.palette)),le.setChanged(!a(g.dither,r.dither)),ot.setChanged(!a(g.adjust,r.adjust)),Le.setChanged(!a([g.cleanup,g.outline,g.alpha],[r.cleanup,r.outline,r.alpha])),It.setChanged(!a(g.export,r.export)),rt.set(g.export.scale),kt.set(g.export.grid),Ut.set(g.export.indexed),Ke.set(g.export.size),rt.el.hidden=kt.el.hidden=g.export.size==="source";let ue=$n(g,$,e.current);Ze.textContent=$?`${ue.width} \xD7 ${ue.height} px`:"\u2013",Ke.el.querySelector(".help")?.remove(),g.export.size==="source"&&Ke.el.append(m("div.help",{text:"The size of the framed part of the source, like a full-resolution download. Pixels can differ by one in size when the ratio isn't a whole number."})),pt.hidden=e.items.length<2,pt.querySelector("span").textContent=`Download all ${e.items.length} as ZIP`,R()}function N(g){if(!g){s.textContent=d.textContent=f.textContent="\u2013";return}s.innerHTML=`${g.width}<small>\xD7 ${g.height}</small>`;let $=g.usedColors().length;d.innerHTML=g.palette?`${$}<small>/ ${g.palette.length}</small>`:`${$}`,f.innerHTML=`${g.ms<10?g.ms.toFixed(1):Math.round(g.ms)}<small>ms</small>`,f.parentElement.title=g.backend==="webgl"?"Rendered on the GPU (WebGL 2 via ShaderMate)":"Rendered on the CPU"}return{el:fe,sync:q,setStats:N,setTab:C,syncAnim:R}}function fi(e){let t="files",n=(T,P,z)=>m("button",{type:"button",role:"tab","aria-selected":String(T===t),html:`${Y(z)}<span>${P}</span>`,onclick:()=>u(T)}),o=n("files","Files","files"),i=n("presets","Presets","presets"),r=n("palettes","Palettes","palette"),a=m("span.count",{});o.append(a);let c=m("div.itp-seg",{role:"tablist","aria-label":"Library"},o,i,r),l=m("input",{type:"search",placeholder:"Search","aria-label":"Search the library"}),s=m("div.itp-search",{},m("span",{html:Y("search")}),l);l.addEventListener("input",()=>L());let d=m("div.itp-panel-body",{}),f=m("aside.itp-lib",{"aria-label":"Library"},m("div.itp-panel-head",{},c),s,d);function u(T){t=T;for(let[P,z]of[[o,"files"],[i,"presets"],[r,"palettes"]])P.setAttribute("aria-selected",String(z===T));l.value="",L(),T==="presets"&&!y.size&&S()}let h=()=>l.value.trim().toLowerCase();function x(T,P){let z=e.items.indexOf(T),v=e.items.length>1;un(P,[T.own?{label:"Use shared settings",sub:"Drop this file's own settings",icon:"link",onClick:()=>e.setOwn(T,!1)}:{label:"Give it its own settings",sub:"Edits stop affecting other files",icon:"unlink",disabled:!v,onClick:()=>e.setOwn(T,!0)},"sep",{label:"Copy settings",icon:"copy",onClick:()=>e.copySettings(T)},{label:"Paste settings",sub:e.clipboard?"Gives this file its own settings":"Copy settings from a file first",icon:"clipboard",disabled:!e.clipboard,onClick:()=>e.pasteSettings(T)},{label:"Apply these settings to all files",icon:"layers",disabled:!v,onClick:()=>e.applyToAll(T)},"sep",{label:"Duplicate",sub:"A copy with its own settings, to compare looks",icon:"copy",onClick:()=>e.duplicate(T)},{label:"Move up",icon:"arrowUp",kbd:"Alt Shift \u2191",disabled:z<=0,onClick:()=>e.move(T,-1)},{label:"Move down",icon:"arrowDown",kbd:"Alt Shift \u2193",disabled:z>=e.items.length-1,onClick:()=>e.move(T,1)},"sep",{label:"Remove",icon:"trash",kbd:"Del",onClick:()=>e.removeItem(T)}],{align:"start"})}function E(){let T=e.items.filter(U=>!h()||U.name.toLowerCase().includes(h())),P=m("ul.itp-files",{"aria-label":"Files"});for(let U of T){let B=m("button.itp-btn.small.icon",{type:"button","aria-label":`Options for ${U.name}`,"aria-haspopup":"menu",title:"Settings, duplicate, order",html:Y("more"),onclick:G=>{G.stopPropagation(),x(U,B)}}),H=U.type==="video"?`Video, ${pn(U.duration)}`:`${U.width} \xD7 ${U.height}`,V=m("li.itp-file-row",{tabindex:"0","aria-current":String(e.current===U),"data-own":U.own?"true":null},m("img.thumb",{src:U.thumb||"",alt:""}),m("div",{style:{minWidth:0}},m("div.title",{text:U.name}),m("div.sub",{},H,U.own?m("span.itp-own",{title:"This file has its own settings",html:`${Y("unlink")}<span>Own</span>`}):null)),m("div.actions",{},B,m("button.itp-btn.small.icon.danger",{type:"button","aria-label":`Remove ${U.name}`,title:"Remove",html:Y("x"),onclick:G=>{G.stopPropagation(),e.removeItem(U)}})));V.addEventListener("click",()=>e.select(U)),V.addEventListener("contextmenu",G=>{G.preventDefault(),e.select(U),x(U,B)}),V.addEventListener("keydown",G=>{G.target===V&&((G.key==="Enter"||G.key===" ")&&(G.preventDefault(),e.select(U)),(G.key==="Delete"||G.key==="Backspace")&&(G.preventDefault(),e.removeItem(U)),!G.altKey&&(G.key==="ArrowDown"&&(G.preventDefault(),V.nextElementSibling?.focus()),G.key==="ArrowUp"&&(G.preventDefault(),V.previousElementSibling?.focus()),(G.key==="ContextMenu"||G.key==="F10"&&G.shiftKey)&&(G.preventDefault(),x(U,B))))}),P.append(V)}let z=e.items.filter(U=>U.own).length,v=e.items.length?e.items.length===1?"1 file":z?`${e.items.length} files, ${z} with ${z===1?"its":"their"} own settings`:`${e.items.length} files, shared settings`:"No files yet",I=m("div.itp-group",{},m("span",{text:v}),e.items.length>1?m("button.itp-link",{type:"button",text:"Clear",onclick:()=>e.clearItems()}):null),D=m("div",{style:{padding:"4px 12px 12px",display:"flex",gap:"6px"}},m("button.itp-btn.outline.small",{type:"button",html:`${Y("plus")}<span>Add files</span>`,onclick:()=>e.openFiles()}),m("button.itp-btn.small",{type:"button",html:`${Y("clipboard")}<span>Paste</span>`,title:"Paste an image from the clipboard (Ctrl+V)",onclick:()=>e.pasteFromClipboard()}));tt(d,I,P,D,m("div.itp-group",{},m("span",{text:"Drop images or videos anywhere in the window. Files share one set of settings unless you give one its own (\u22EF menu or right-click)."})))}let y=new Map,k=0;function b(){let T=e.store.settings,P=cn.filter(v=>!h()||(v.name+v.description).toLowerCase().includes(h())),z=m("div.itp-presets",{});for(let v of P){let I=e.activePreset===v.id,D=y.get(v.id)||m("div.ph",{}),U=m("button.itp-preset",{type:"button","aria-pressed":String(I),title:v.description,onclick:()=>e.applyPreset(v)},D,m("span.t",{text:v.name}),m("span.d",{text:v.description}));z.append(U)}tt(d,m("div.itp-group",{},m("span",{text:"Presets replace the current settings. Undo with Ctrl+Z."})),z)}async function S(){let T=++k,P=e.current;if(!(!P||!e.engine))for(let z of cn){if(T!==k)return;let v=Tt(xt(),z.settings);v.size={...v.size,mode:"width",width:Math.min(v.size.width,72),height:0};try{let I=await e.engine.process(P.source,v);if(T!==k)return;let D=I.toCanvas(1);y.set(z.id,D),t==="presets"&&b()}catch{}}}function w(T,P,z){let v=m("div.itp-strip",{},...T.colors.slice(0,64).map(U=>m("i",{style:{background:U.startsWith("#")?U:"#"+U}}))),I=m("li.itp-pal",{tabindex:"0",role:"button","aria-pressed":String(P)},m("div.row",{},m("span",{text:T.name}),m("span.n",{text:String(T.colors.length),title:T.author?`by ${T.author}`:null})),v),D=()=>e.usePalette(T);if(I.addEventListener("click",D),I.addEventListener("keydown",U=>{(U.key==="Enter"||U.key===" ")&&(U.preventDefault(),D()),z&&U.key==="Delete"&&e.deletePalette(T)}),z){let U=m("button.itp-btn.small.icon.danger",{type:"button","aria-label":`Delete ${T.name}`,title:"Delete",html:Y("trash"),onclick:B=>{B.stopPropagation(),e.deletePalette(T)}});I.firstChild.append(U)}return I}function A(){let T=e.store.settings.palette,P=U=>!h()||(U.name+" "+(U.author||"")).toLowerCase().includes(h())||String(U.colors.length)===h(),z=e.userPalettes.filter(P),v=nn.filter(P),I=m("div",{style:{padding:"0 12px 4px",display:"flex",gap:"6px",flexWrap:"wrap"}},m("button.itp-btn.outline.small",{type:"button",html:`${Y("upload")}<span>Import file</span>`,onclick:()=>e.importPalette()}),m("button.itp-btn.small",{type:"button",html:`${Y("palette")}<span>From Lospec</span>`,onclick:()=>e.lospecDialog()})),D=z.length?[m("div.itp-group",{},m("span",{text:"Your palettes"}),m("span.itp-badge",{text:String(z.length)})),m("ul.itp-pal-list",{},...z.map(U=>w(U,T.source==="custom"&&T.name===U.name,!0)))]:[];tt(d,I,...D,m("div.itp-group",{},m("span",{text:"Built-in"}),m("span.itp-badge",{text:String(v.length)})),m("ul.itp-pal-list",{},...v.map(U=>w({...U,colors:U.colors.map(B=>"#"+B)},T.source==="builtin"&&T.id===U.id,!1))))}function L(){a.textContent=e.items.length?String(e.items.length):"",t==="files"?E():t==="presets"?b():A()}return{el:f,refresh:L,setTab:u,focusFile(T){t==="files"&&d.querySelectorAll(".itp-file-row")[e.items.indexOf(T)]?.focus()},sourceChanged(){y.clear(),k++,t==="presets"&&(L(),S())},get tab(){return t}}}function pn(e=0){let t=Math.floor(e/60),n=e-t*60;return`${t}:${n.toFixed(1).padStart(4,"0")}`}var vs=`<svg xmlns="http://www.w3.org/2000/svg" width="960" height="640" viewBox="0 0 960 640">
|
|
304
|
+
15 7 13 5`}),Se=m("div.help",{text:"Rows of numbers, up to 16\xD716. Only their order matters."});pe.addEventListener("change",()=>{try{n({dither:{method:"custom",matrix:sr(pe.value)}}),Se.textContent="Rows of numbers, up to 16\xD716. Only their order matters.",Se.style.color=""}catch(E){Se.textContent=E.message,Se.style.color="var(--danger)"}});let Ie=m("div.itp-field",{},m("div.lab",{},m("span",{text:"Matrix"})),pe,Se),Re=l("dither","Dither",!1,["dither"],ge.el,be.el,Ie),Ze={min:-1,max:1,step:.01,scale:100,value:0,reset:0},ce=ht({label:"Brightness",...Ze,onInput:E=>n({adjust:{brightness:E}},"br"),onCommit:o}),Je=ht({label:"Contrast",...Ze,onInput:E=>n({adjust:{contrast:E}},"co"),onCommit:o}),nt=ht({label:"Saturation",...Ze,onInput:E=>n({adjust:{saturation:E}},"sa"),onCommit:o}),Oe=ht({label:"Hue",min:-180,max:180,step:1,value:0,reset:0,help:"Rotates every colour around the colour wheel; greys stay grey.",onInput:E=>n({adjust:{hue:E}},"hu"),onCommit:o}),Ye=ht({label:"Gamma",min:.2,max:3,step:.05,value:1,reset:1,onInput:E=>n({adjust:{gamma:E}},"ga"),onCommit:o}),ot=l("adjust","Adjust",!1,["adjust"],ce.el,Je.el,nt.el,Oe.el,Ye.el),St=ht({label:"Alpha cutoff",min:0,max:1,step:.01,scale:100,value:.5,reset:.5,help:"Pixels less opaque than this become transparent.",onInput:E=>n({alpha:{threshold:E}},"alpha"),onCommit:o}),rt=Nt({label:"Remove stray pixels",onChange:E=>n({cleanup:{orphans:E}})}),Ue=Nt({label:"Smooth small specks",onChange:E=>n({cleanup:{smooth:E}})}),We=en({label:"Outline",options:[{value:"none",label:"None"},{value:"outer",label:"Outside"},{value:"inner",label:"Inside"}],value:"none",help:"Follows transparent edges.",onChange:E=>n({outline:{mode:E}})}),qe=Si({label:"Outline colour",onChange:E=>n({outline:{color:E}},"olc")}),Et=Nt({label:"Include diagonals",onChange:E=>n({outline:{corners:E}})}),mt=l("cleanup","Cleanup & outline",!1,["cleanup","outline","alpha"],rt.el,Ue.el,St.el,We.el,qe.el,Et.el),Be=m("div",{id:"itp-pane-setup",role:"tabpanel","aria-labelledby":"itp-tab-setup"},O.el,ke.el,xe.el,Re.el,ot.el,mt.el),gt=en({label:"Size",options:[{value:"scale",label:"Scale"},{value:"source",label:"Source size"}],value:"scale",help:"",onChange:E=>n({export:{size:E}})}),Fe=ht({label:"Scale",min:1,max:32,step:1,value:4,reset:4,help:"Whole-number upscale keeps every pixel square.",onInput:E=>n({export:{scale:E}},"scale"),onCommit:o}),Ge=m("span.val.num",{}),st=Nt({label:"Grid lines",onChange:E=>n({export:{grid:E}})}),bt=Nt({label:"Indexed PNG",help:"Smaller files; up to 256 colours.",onChange:E=>n({export:{indexed:E}})}),kt=m("button.itp-btn.primary.block",{type:"button",html:`${ie("download")}<span>Download PNG</span>`,onclick:()=>e.exportPNG()}),yt=m("button.itp-btn.outline.block",{type:"button",html:`${ie("copy")}<span>Copy image</span>`,onclick:()=>e.copyImage()}),He=m("button.itp-btn.outline.block",{type:"button",html:`${ie("zip")}<span>Download all as ZIP</span>`,onclick:()=>e.exportZip()}),It=l("image","Image",!0,["export"],Bt("Output size",m("div"),{value:Ge}),gt.el,Fe.el,st.el,bt.el,m("div.itp-grid2",{},kt,yt),He),De={active:!1,complete:!1,count:0},$e=Xt({label:"Frames from",options:[{value:"video",label:"Current video"},{value:"files",label:"All files, in order"}],onChange:()=>le()}),ct=Nt({label:"Frame selection",help:"Choose individual video frames on the canvas for animation and sprite sheet exports.",onChange:E=>{if(E){$e.set("video");let X=e.current?.type==="video"?e.current:null;X&&!Ve.input.dataset.touched&&!Ne.input.dataset.touched&&Wo(Number(Ne.input.value)||0,X.duration)&&(Ve.set(0),Ne.set(Math.min(X.duration,Xo)))}e.setFrameSelection(E)}}),Qe=Xt({label:"Format",options:[{value:"gif",label:"GIF"},{value:"webm",label:"WebM video"},{value:"mp4",label:"MP4 video"},{value:"png-seq",label:"PNG sequence (ZIP)"}],onChange:()=>le()}),je=tn({label:"Frames per second",min:1,max:60,onChange:E=>{je.input.dataset.touched="1",e.setAnimationFps?.(E)}}),lt=()=>{Ve.input.dataset.touched="1",Ne.input.dataset.touched="1",e.setFrameRange?.(Number(Ve.input.value)||0,Number(Ne.input.value)||0)},Ve=tn({label:"Start (s)",min:0,max:36e3,step:.001,onChange:lt}),Ne=tn({label:"End (s)",min:0,max:36e3,step:.001,onChange:lt}),it=Xt({label:"Video size",options:[{value:"1080",label:"Full HD (sharp in any player)"},{value:"720",label:"720p"},{value:"2160",label:"4K"},{value:"scale",label:"Same scale as PNG"}],onChange:()=>{}});it.set("1080");let xt=Nt({label:"Keep audio",help:"The video's soundtrack, cut to the same start and end. MP4 and WebM only.",onChange:()=>le()}),Ct=xt.el.querySelector("input"),Lt=m("div.help",{}),ut=m("button.itp-btn.primary.block",{type:"button",html:`${ie("film")}<span>Export animation</span>`,onclick:()=>e.exportAnimation(dt())}),Ke=l("animation","Animation",!1,null,$e.el,ct.el,Qe.el,je.el,m("div.itp-grid2",{},Ve.el,Ne.el),it.el,xt.el,Lt,ut);je.set(12),Ve.set(0),Ne.set(0),xt.set(!0);let dt=()=>({source:$e.select.value,format:Qe.select.value,fps:Number(je.input.value)||12,start:Number(Ve.input.value)||0,end:Number(Ne.input.value)||0,rangeTouched:!!(Ve.input.dataset.touched||Ne.input.dataset.touched),audio:Ct.checked,videoSize:it.select.value}),L=tn({label:"Columns",min:0,max:256,help:"0 = as square as possible.",onChange:()=>{}}),$=tn({label:"Padding",min:0,max:64,onChange:()=>{}});L.set(0),$.set(0);let Y=m("button.itp-btn.outline.block",{type:"button",html:`${ie("sheet")}<span>Download sprite sheet</span>`,onclick:()=>e.exportSheet({...dt(),columns:Number(L.input.value)||0,padding:Number($.input.value)||0})}),oe=l("sheet","Sprite sheet",!1,null,m("div.help",{text:"Packs the frames chosen under Animation into one PNG with a JSON atlas (TexturePacker hash format)."}),m("div.itp-grid2",{},L.el,$.el),Y),he=Xt({label:"Tile size",options:[8,12,16,24,32,48,64].map(E=>({value:String(E),label:`${E} \xD7 ${E}`})),onChange:()=>{}});he.set("16");let ae=Nt({label:"Count mirrored tiles as duplicates",onChange:()=>{}}),Le=m("button.itp-btn.outline.block",{type:"button",html:`${ie("tiles")}<span>Download tileset</span>`,onclick:()=>e.exportTileset({tile:Number(he.select.value),flips:ae.el.querySelector("input").checked})}),C=l("tileset","Tileset",!1,null,m("div.help",{text:"Cuts the current result into tiles, keeps one copy of each and writes a tile map."}),he.el,ae.el,Le),U=l("settings","Settings",!1,null,m("div.itp-grid2",{},m("button.itp-btn.outline",{type:"button",html:`${ie("link")}<span>Copy link</span>`,onclick:()=>e.copyLink()}),m("button.itp-btn.outline",{type:"button",html:`${ie("braces")}<span>Save JSON</span>`,onclick:()=>e.saveSettingsFile()})),m("button.itp-btn.outline.block",{type:"button",html:`${ie("upload")}<span>Load settings file</span>`,onclick:()=>e.loadSettingsFile()})),B=m("div",{id:"itp-pane-export",role:"tabpanel","aria-labelledby":"itp-tab-export",hidden:!0},It.el,Ke.el,oe.el,C.el,U.el),K=m("div.itp-insp-foot",{},m("button.itp-link",{type:"button",text:"Reset to defaults",onclick:()=>e.resetSettings()}),m("span.muted",{style:{fontSize:"var(--fs-xs)"},id:"itp-backend"})),re=m("div.itp-panel-body",{},Be,B),j=m("aside.itp-insp",{"aria-label":"Inspector"},m("div.itp-insp-head",{},f,x,M),m("div",{style:{height:"8px"}}),re,K);function te(E){let X=E==="setup";p.setAttribute("aria-selected",String(X)),b.setAttribute("aria-selected",String(!X)),Be.hidden=!X,B.hidden=X,X||le()}p.onclick=()=>te("setup"),b.onclick=()=>te("export"),M.addEventListener("keydown",E=>{if(E.key==="ArrowRight"||E.key==="ArrowLeft"){let X=p.getAttribute("aria-selected")==="true"?b:p;X.click(),X.focus()}});function le(){let E=e.current?.type==="video"?e.current:null,X=!!E,ue=e.items.filter(Ee=>Ee.type==="image").length;!X&&$e.select.value==="video"&&ue>1&&$e.set("files"),X&&$e.select.value==="files"&&ue<2&&$e.set("video");let Me=$e.select.value,J=Me==="video"?X:ue>1,u=De.active;ct.el.hidden=!E,ct.set(u),$e.select.disabled=u,Ve.el.hidden=Ne.el.hidden=Me!=="video",ut.disabled=Y.disabled=!J||u&&(!De.complete||!De.count),kt.disabled=yt.disabled=Le.disabled=u,E&&!Number(Ne.input.value)&&Ne.set(Math.round((E.duration||0)*10)/10),E&&E.fps&&!je.input.dataset.touched&&je.set(Math.min(30,Math.round(E.fps))),e.setAnimationFps?.(Number(je.input.value)||12);let g=Qe.select.value,S=g==="mp4"||g==="webm";xt.el.hidden=u||!(Me==="video"&&S),it.el.hidden=!S;let R=e.videoSupport,q=R&&"opus"in R&&Ct.checked&&!xt.el.hidden&&!(g==="mp4"&&R.aac||R.opus),Z=u?De.complete?De.count?`${De.count} selected frames, played at ${Number(je.input.value)||12} fps.${S?" Selected frames export without source audio.":""} Turn off frame selection to use PNG, Copy or Tileset.`:"Select frames on the canvas to enable export.":"Loading video frames...":"",ne=J?S&&!R?.[g]?`${g.toUpperCase()} encoding isn't available in this browser. GIF and PNG sequence always work.`:q?"This browser can't encode audio, so the video will be silent.":g==="mp4"&&R&&"aac"in R&&!R.aac&&R.opus&&Ct.checked&&!xt.el.hidden?"This browser can't encode AAC, so the MP4's sound will be Opus, which Windows Media Player and QuickTime may not play. WebM, or Chrome/Edge on Windows or macOS, avoids that.":"":Me==="video"?"Open a video to export an animation.":"Add two or more images to animate them.";Lt.textContent=[Z,ne].filter(Boolean).join(" ")}je.input.addEventListener("change",le);function Ae(E,X){At(ze,...E.map((ue,Me)=>{let J=m("button.itp-swatch",{type:"button",role:"listitem",title:X?`${ue}. Click to change, Alt+click to remove`:ue,style:{background:ue}});return J.setAttribute("aria-label",X?`${ue}, edit`:ue),X?J.addEventListener("click",u=>{if(u.altKey){let S=i().palette.colors.filter((R,q)=>q!==Me);S.length&&n({palette:{colors:S}});return}let g=m("input",{type:"color",value:ue,style:{position:"fixed",opacity:0,pointerEvents:"none"}});document.body.append(g),g.addEventListener("input",()=>{let S=i().palette.colors.slice();S[Me]=g.value,n({palette:{colors:S}},"sw"+Me)}),g.addEventListener("change",()=>g.remove()),g.click()}):J.addEventListener("click",()=>{n({palette:{source:"custom",colors:i().palette.colors.slice(),name:`${i().palette.name} (edited)`}}),e.toast("Copied to a custom palette you can edit")}),J}),X?m("button.itp-swatch.add",{type:"button","aria-label":"Add colour",title:"Add colour",html:ie("plus"),onclick:()=>n({palette:{colors:[...i().palette.colors,"#808080"]}})}):null)}let ye="";function we(E,X){w.set(E.size.mode),H.hidden=E.size.mode!=="width",T.hidden=E.size.mode!=="block",y.set(E.size.width),A.set(E.size.height||""),_.set(E.size.block),P.set(E.size.resample),O.setHint(X?`${X.width} \xD7 ${X.height}`:""),fe.set(E.palette.source),se.set(E.palette.id),se.el.hidden=E.palette.source!=="builtin",de.el.hidden=E.palette.source!=="extract",de.set(E.palette.count),V.set(E.palette.distance),V.el.hidden=E.palette.source==="none",W.hidden=E.palette.source==="none";let ue=E.palette.source==="extract"?X&&X.palette||[]:E.palette.colors,Me=E.palette.source+ue.join();Me!==ye&&(ye=Me,Ae(ue,E.palette.source==="custom")),me.textContent=String(ue.length),xe.setHint(E.palette.source==="none"?"None":E.palette.name),ge.set(E.dither.method),be.set(E.dither.strength);let J=Rn(E.dither.method);be.el.hidden=J==="none",Ie.hidden=E.dither.method!=="custom",E.dither.method==="custom"&&document.activeElement!==pe&&(pe.value=(E.dither.matrix||[]).map(_e=>_e.join(" ")).join(`
|
|
305
|
+
`)),Re.setHint(E.palette.source==="none"?"Needs a palette":mn.find(_e=>_e.id===E.dither.method).label),Re.el.querySelector("select").disabled=E.palette.source==="none",ce.set(E.adjust.brightness),Je.set(E.adjust.contrast),nt.set(E.adjust.saturation),Oe.set(E.adjust.hue),Ye.set(E.adjust.gamma);let u=E.adjust.brightness||E.adjust.contrast||E.adjust.saturation||E.adjust.hue||E.adjust.gamma!==1;D.forEach((_e,Mt)=>_e.setAttribute("aria-pressed",String(rn[Mt].id===E.frame.aspect))),G.set(E.frame.zoom),N.set(E.frame.x),ve.set(E.frame.y);let g=e.current,S=g?In(g.width,g.height,E.frame):null;N.el.hidden=!S||S.w>=g.width,ve.el.hidden=!S||S.h>=g.height;let R=E.frame.aspect!=="original"||E.frame.zoom>1;ke.setHint(R?[E.frame.aspect!=="original"?E.frame.aspect:"",E.frame.zoom>1?`${Math.round(E.frame.zoom*100)/100}\xD7`:""].filter(Boolean).join(", "):""),ke.setChanged(!a(E.frame,r.frame));let q=e.items.length>1;x.hidden=!(g&&(q||g.own)),v.set(g&&g.own?"own":"shared");let Z=e.items.filter(_e=>!_e.own).length;k.textContent=g&&g.own?"Only this file":`${Z} ${Z===1?"file":"files"}`,j.dataset.scope=g&&g.own?"own":"shared",ot.setHint(u?"Changed":""),St.set(E.alpha.threshold),rt.set(E.cleanup.orphans),Ue.set(E.cleanup.smooth),We.set(E.outline.mode),qe.set(E.outline.color),Et.set(E.outline.corners),qe.el.hidden=Et.el.hidden=E.outline.mode==="none";let ne=[E.cleanup.orphans&&"strays",E.cleanup.smooth&&"smooth",E.outline.mode!=="none"&&"outline"].filter(Boolean);mt.setHint(ne.join(", ")),O.setChanged(!a(E.size,r.size)),xe.setChanged(!a(E.palette,r.palette)),Re.setChanged(!a(E.dither,r.dither)),ot.setChanged(!a(E.adjust,r.adjust)),mt.setChanged(!a([E.cleanup,E.outline,E.alpha],[r.cleanup,r.outline,r.alpha])),It.setChanged(!a(E.export,r.export)),Fe.set(E.export.scale),st.set(E.export.grid),bt.set(E.export.indexed),gt.set(E.export.size),Fe.el.hidden=st.el.hidden=E.export.size==="source";let Ee=Jn(E,X,e.current);Ge.textContent=X?`${Ee.width} \xD7 ${Ee.height} px`:"\u2013",gt.el.querySelector(".help")?.remove(),E.export.size==="source"&>.el.append(m("div.help",{text:"The size of the framed part of the source, like a full-resolution download. Pixels can differ by one in size when the ratio isn't a whole number."})),He.hidden=e.items.length<2,He.querySelector("span").textContent=`Download all ${e.items.length} as ZIP`,le()}function Te(E){if(!E){s.textContent=d.textContent=h.textContent="\u2013";return}s.innerHTML=`${E.width}<small>\xD7 ${E.height}</small>`;let X=E.usedColors().length;d.innerHTML=E.palette?`${X}<small>/ ${E.palette.length}</small>`:`${X}`,h.innerHTML=`${E.ms<10?E.ms.toFixed(1):Math.round(E.ms)}<small>ms</small>`,h.parentElement.title=E.backend==="webgl"?"Rendered on the GPU (WebGL 2 via ShaderMate)":"Rendered on the CPU"}return{el:j,sync:we,setStats:Te,setTab:te,syncAnim:le,animationOptions:dt,setFrameSelectionState(E){De=E,le()},setAnimationRange({start:E,end:X,user:ue=!1}){Ve.set(Number(E.toFixed(3))),Ne.set(Number(X.toFixed(3))),ue&&(Ve.input.dataset.touched="1",Ne.input.dataset.touched="1")}}}function Zi(e){let t="files",n=(P,I,H)=>m("button",{type:"button",role:"tab",title:I,"aria-selected":String(P===t),html:`${ie(H)}<span>${I}</span>`,onclick:()=>f(P)}),o=n("files","Files","files"),i=n("presets","Presets","presets"),r=n("palettes","Palettes","palette"),a=m("span.count",{});o.append(a);let c=m("div.itp-seg",{role:"tablist","aria-label":"Library"},o,i,r),l=m("input",{type:"search",placeholder:"Search","aria-label":"Search the library"}),s=m("div.itp-search",{},m("span",{html:ie("search")}),l);l.addEventListener("input",()=>_());let d=m("div.itp-panel-body",{}),h=m("aside.itp-lib",{"aria-label":"Library"},m("div.itp-panel-head",{},c),s,d);function f(P){t=P;for(let[I,H]of[[o,"files"],[i,"presets"],[r,"palettes"]])I.setAttribute("aria-selected",String(H===P));l.value="",_(),P==="presets"&&!v.size&&w()}let p=()=>l.value.trim().toLowerCase();function b(P,I){let H=e.items.indexOf(P),T=e.items.length>1;vn(I,[P.own?{label:"Use shared settings",sub:"Drop this file's own settings",icon:"link",onClick:()=>e.setOwn(P,!1)}:{label:"Give it its own settings",sub:"Edits stop affecting other files",icon:"unlink",disabled:!T,onClick:()=>e.setOwn(P,!0)},"sep",{label:"Copy settings",icon:"copy",onClick:()=>e.copySettings(P)},{label:"Paste settings",sub:e.clipboard?"Gives this file its own settings":"Copy settings from a file first",icon:"clipboard",disabled:!e.clipboard,onClick:()=>e.pasteSettings(P)},{label:"Apply these settings to all files",icon:"layers",disabled:!T,onClick:()=>e.applyToAll(P)},"sep",{label:"Rename",sub:"Exports are named after it",icon:"rename",kbd:"F2",onClick:()=>e.startRename(P)},{label:"Duplicate",sub:"A copy with its own settings, to compare looks",icon:"copy",onClick:()=>e.duplicate(P)},{label:"Move up",icon:"arrowUp",kbd:"Alt Shift \u2191",disabled:H<=0,onClick:()=>e.move(P,-1)},{label:"Move down",icon:"arrowDown",kbd:"Alt Shift \u2193",disabled:H>=e.items.length-1,onClick:()=>e.move(P,1)},"sep",{label:"Remove",icon:"trash",kbd:"Del",onClick:()=>e.removeItem(P)}],{align:"start"})}function M(){let P=e.items.filter(N=>!p()||N.name.toLowerCase().includes(p())),I=m("ul.itp-files",{"aria-label":"Files"});for(let N of P){let ve=m("button.itp-btn.small.icon",{type:"button","aria-label":`Options for ${N.name}`,"aria-haspopup":"menu",title:"Settings, duplicate, order",html:ie("more"),onclick:se=>{se.stopPropagation(),b(N,ve)}}),ke=N.type==="video"?`Video, ${Tn(N.duration)}`:`${N.width} \xD7 ${N.height}`,fe=m("li.itp-file-row",{tabindex:"0","aria-current":String(e.current===N),"data-own":N.own?"true":null},m("img.thumb",{src:N.thumb||"",alt:""}),m("div",{style:{minWidth:0}},m("div.title",{text:N.name}),m("div.sub",{},ke,N.own?m("span.itp-own",{title:"This file has its own settings",html:`${ie("unlink")}<span>Own</span>`}):null)),m("div.actions",{},ve,m("button.itp-btn.small.icon.danger",{type:"button","aria-label":`Remove ${N.name}`,title:"Remove",html:ie("x"),onclick:se=>{se.stopPropagation(),e.removeItem(N)}})));fe.addEventListener("click",()=>e.select(N)),fe.addEventListener("dblclick",se=>{se.target.closest(".title")&&e.startRename(N)}),fe.addEventListener("contextmenu",se=>{se.preventDefault(),e.select(N),b(N,ve)}),fe.addEventListener("keydown",se=>{se.target===fe&&((se.key==="Enter"||se.key===" ")&&(se.preventDefault(),e.select(N)),(se.key==="Delete"||se.key==="Backspace")&&(se.preventDefault(),e.removeItem(N)),!se.altKey&&(se.key==="ArrowDown"&&(se.preventDefault(),fe.nextElementSibling?.focus()),se.key==="ArrowUp"&&(se.preventDefault(),fe.previousElementSibling?.focus()),(se.key==="ContextMenu"||se.key==="F10"&&se.shiftKey)&&(se.preventDefault(),b(N,ve))))}),I.append(fe)}let H=e.items.filter(N=>N.own).length,T=e.items.length?e.items.length===1?"1 file":H?`${e.items.length} files, ${H} with ${H===1?"its":"their"} own settings`:`${e.items.length} files, shared settings`:"No files yet",O=m("div.itp-group",{},m("span",{text:T}),e.items.length>1?m("button.itp-link",{type:"button",text:"Clear",onclick:()=>e.clearItems()}):null),D=m("div",{style:{padding:"4px 12px 12px",display:"flex",gap:"6px"}},m("button.itp-btn.outline.small",{type:"button",html:`${ie("plus")}<span>Add files</span>`,onclick:()=>e.openFiles()}),m("button.itp-btn.small",{type:"button",html:`${ie("clipboard")}<span>Paste</span>`,title:"Paste an image from the clipboard (Ctrl+V)",onclick:()=>e.pasteFromClipboard()})),F=e.savedWorkspace&&e.savedWorkspace(),G=F?m("div.itp-group.itp-saved",{},m("span",{text:`Saved in this browser: ${F.count} file${F.count===1?"":"s"}`,title:"Kept in this browser's storage, never uploaded. Clearing the site's data also removes it."}),m("button.itp-link",{type:"button",text:"Forget",title:"Remove the saved files from this browser",onclick:()=>e.forgetWorkspace()})):null;At(d,O,I,D,G,m("div.itp-group",{},m("span",{text:"Drop images or videos anywhere in the window. Files share one set of settings unless you give one its own (\u22EF menu or right-click). Save keeps them in this browser for next time."})))}let v=new Map,k=0;function x(){let P=e.store.settings,I=yn.filter(T=>!p()||(T.name+T.description).toLowerCase().includes(p())),H=m("div.itp-presets",{});for(let T of I){let O=e.activePreset===T.id,D=v.get(T.id)||m("div.ph",{}),F=m("button.itp-preset",{type:"button","aria-pressed":String(O),title:T.description,onclick:()=>e.applyPreset(T)},D,m("span.t",{text:T.name}),m("span.d",{text:T.description}));H.append(F)}At(d,m("div.itp-group",{},m("span",{text:"Presets replace the current settings. Undo with Ctrl+Z."})),H)}async function w(){let P=++k,I=e.current;if(!(!I||!e.engine))for(let H of yn){if(P!==k)return;let T=Ht(Dt(),H.settings);T.size={...T.size,mode:"width",width:Math.min(T.size.width,72),height:0};try{let O=await e.engine.process(I.source,T);if(P!==k)return;let D=O.toCanvas(1);v.set(H.id,D),t==="presets"&&x()}catch{}}}function y(P,I,H){let T=m("div.itp-strip",{},...P.colors.slice(0,64).map(F=>m("i",{style:{background:F.startsWith("#")?F:"#"+F}}))),O=m("li.itp-pal",{tabindex:"0",role:"button","aria-pressed":String(I)},m("div.row",{},m("span",{text:P.name}),m("span.n",{text:String(P.colors.length),title:P.author?`by ${P.author}`:null})),T),D=()=>e.usePalette(P);if(O.addEventListener("click",D),O.addEventListener("keydown",F=>{(F.key==="Enter"||F.key===" ")&&(F.preventDefault(),D()),H&&F.key==="Delete"&&e.deletePalette(P)}),H){let F=m("button.itp-btn.small.icon.danger",{type:"button","aria-label":`Delete ${P.name}`,title:"Delete",html:ie("trash"),onclick:G=>{G.stopPropagation(),e.deletePalette(P)}});O.firstChild.append(F)}return O}function A(){let P=e.store.settings.palette,I=F=>!p()||(F.name+" "+(F.author||"")).toLowerCase().includes(p())||String(F.colors.length)===p(),H=e.userPalettes.filter(I),T=pn.filter(I),O=m("div",{style:{padding:"0 12px 4px",display:"flex",gap:"6px",flexWrap:"wrap"}},m("button.itp-btn.outline.small",{type:"button",html:`${ie("upload")}<span>Import file</span>`,onclick:()=>e.importPalette()}),m("button.itp-btn.small",{type:"button",html:`${ie("palette")}<span>From Lospec</span>`,onclick:()=>e.lospecDialog()})),D=H.length?[m("div.itp-group",{},m("span",{text:"Your palettes"}),m("span.itp-badge",{text:String(H.length)})),m("ul.itp-pal-list",{},...H.map(F=>y(F,P.source==="custom"&&P.name===F.name,!0)))]:[];At(d,O,...D,m("div.itp-group",{},m("span",{text:"Built-in"}),m("span.itp-badge",{text:String(T.length)})),m("ul.itp-pal-list",{},...T.map(F=>y({...F,colors:F.colors.map(G=>"#"+G)},P.source==="builtin"&&P.id===F.id,!1))))}function _(){a.textContent=e.items.length?String(e.items.length):"",t==="files"?M():t==="presets"?x():A()}return{el:h,refresh:_,setTab:f,focusFile(P){t==="files"&&d.querySelectorAll(".itp-file-row")[e.items.indexOf(P)]?.focus()},sourceChanged(){v.clear(),k++,t==="presets"&&(_(),w())},get tab(){return t}}}function Tn(e=0){let t=Math.floor(e/60),n=e-t*60;return`${t}:${n.toFixed(1).padStart(4,"0")}`}un();var Ji=(e,t,n)=>Math.max(t,Math.min(n,e));function Cc(e,{left:t,width:n},o,i){let r=Math.min(7,n/2),a=Ji((e-t-r)/Math.max(1,n-r*2),0,1),c=Math.max(1,Math.ceil(o*i-1e-6)),l=Math.min(c-1,Math.floor(a*o*i));return{index:l,time:l/i,seekTime:Math.max(0,Math.min((l+.5)/i,o-1e-4))}}function Tc(e){let t=Math.max(0,Math.round(e*100)),n=Math.floor(t/36e4),o=Math.floor(t/6e3)%60,i=String(Math.floor(t/100)%60).padStart(2,"0");return`${n?`${n}:${String(o).padStart(2,"0")}`:o}:${i}.${String(t%100).padStart(2,"0")}`}function Qi(e){let t=m("canvas",{hidden:!0,"aria-label":"Frame at hovered time"}),n=m("span",{text:"Loading frame..."}),o=m("span.num.itp-timeline-time"),i=m("div.itp-timeline-preview",{id:Qt("itp-timeline"),role:"tooltip",hidden:!0},m("div.itp-timeline-image",{},t,n),o),r=null,a=null,c=null,l=null;function s(w){w.video.pause(),w.video.removeAttribute("src"),w.video.load(),w.cache.clear()}function d(){a&&(a.disposed=!0,a.running||s(a),a=null)}function h(){i.hidden=!0,r=null,clearTimeout(c),clearTimeout(l),l=setTimeout(d,1e4)}function f(){h(),clearTimeout(l),d()}function p(w,y){let A=i.parentElement.getBoundingClientRect(),_=w.getBoundingClientRect(),P=Math.min(180,Math.max(1,A.width-16));i.style.width=`${P}px`,i.style.left=`${Ji(y-A.left-P/2,8,Math.max(8,A.width-P-8))}px`,i.style.bottom=`${A.bottom-_.top+10}px`}function b(w){t.width=w.width,t.height=w.height;let y=t.getContext("2d");y.imageSmoothingEnabled=!1,y.drawImage(w,0,0),t.hidden=!1,n.hidden=!0}function M(w){let y=Math.min(1,168/w.width,104/w.height),A=m("canvas",{width:Math.max(1,Math.round(w.width*y)),height:Math.max(1,Math.round(w.height*y))}),_=A.getContext("2d");return _.imageSmoothingEnabled=!1,_.drawImage(w,0,0,A.width,A.height),A}async function v(w){if(!(w.running||w.failed)){w.running=!0;try{for(await w.ready;!w.disposed&&r?.item===w.item;){let y=r,A=w.cache.get(y.key);if(!A){if(await zt(w.video,y.seekTime),w.disposed)break;if(r?.key!==y.key)continue;let _=await e.engine.process(w.video,y.settings);if(w.disposed)break;A=M(_.toCanvas(1)),w.cache.set(y.key,A),w.cache.size>32&&w.cache.delete(w.cache.keys().next().value)}if(r?.key===y.key&&e.current===w.item){b(A);break}}}catch{w.disposed||(w.failed=!0,r?.item===w.item&&(t.hidden=!0,n.hidden=!1,n.textContent="Preview unavailable"))}finally{w.running=!1,w.disposed&&s(w)}}}function k(){if(!(!r||!e.engine)){if(a?.item!==r.item){d();let w=m("video",{muted:!0,playsInline:!0,preload:"auto",crossOrigin:"anonymous"});w.muted=!0,w.src=r.item.source.currentSrc||r.item.source.src,a={item:r.item,video:w,cache:new Map,running:!1,disposed:!1,failed:!1,ready:Vt(w,{timeout:1e4})}}v(a)}}function x(w,{getFrame:y}={}){w.setAttribute("aria-describedby",i.id),w.addEventListener("pointermove",A=>{let _=e.current;if(A.pointerType==="touch"||_?.type!=="video"||!Number.isFinite(_.duration)||_.duration<=0){h();return}clearTimeout(l);let P=_.fps||30,I=Cc(A.clientX,w.getBoundingClientRect(),_.duration,P),{export:H,...T}=e.store.settings,O=`${P}/${I.index}/${JSON.stringify(T)}`,D=r;r={item:_,key:O,...I,settings:e.store.settings},p(w,A.clientX),i.hidden=!1,o.textContent=Tc(I.time);let F=y?.(I.index)||a?.item===_&&a.cache.get(O);if(F){clearTimeout(c),b(F);return}D?.item===_&&D.key===O||(t.hidden=!0,n.hidden=!1,n.textContent=a?.failed?"Preview unavailable":"Loading frame...",clearTimeout(c),c=setTimeout(k,80))}),w.addEventListener("pointerleave",h),w.addEventListener("pointercancel",h),w.addEventListener("blur",h)}return window.addEventListener("resize",h),{el:i,bind:x,hide:h,reset:f}}var Ac=`<svg xmlns="http://www.w3.org/2000/svg" width="960" height="640" viewBox="0 0 960 640">
|
|
306
306
|
<defs>
|
|
307
307
|
<linearGradient id="sky" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#1d1a3f"/><stop offset=".45" stop-color="#6b3f7c"/><stop offset=".72" stop-color="#e0766a"/><stop offset=".86" stop-color="#f6c27a"/></linearGradient>
|
|
308
308
|
<radialGradient id="sun" cx=".5" cy=".5" r=".5"><stop offset="0" stop-color="#fff4d6"/><stop offset=".35" stop-color="#ffd98a"/><stop offset=".6" stop-color="#ffb46a" stop-opacity=".55"/><stop offset="1" stop-color="#ff9a6a" stop-opacity="0"/></radialGradient>
|
|
@@ -324,7 +324,7 @@ void main() {
|
|
|
324
324
|
<path d="M0 470 L140 430 L260 455 L380 425 L520 462 L660 432 L800 458 L960 436 V480 H0Z" fill="#120d22" opacity=".9"/>
|
|
325
325
|
<path d="M60 640 C120 560 180 560 240 640Z" fill="#0d0a1a"/><path d="M780 640 C840 575 900 560 960 600 V640Z" fill="#0d0a1a"/>
|
|
326
326
|
<g fill="none" stroke="#2a1b38" stroke-width="3" stroke-linecap="round"><path d="M300 170 q10 -10 20 0 q10 -10 20 0"/><path d="M350 200 q7 -7 14 0 q7 -7 14 0"/><path d="M262 210 q6 -6 12 0 q6 -6 12 0"/></g>
|
|
327
|
-
</svg>`,
|
|
327
|
+
</svg>`,_c=`<svg xmlns="http://www.w3.org/2000/svg" width="900" height="680" viewBox="0 0 900 680">
|
|
328
328
|
<defs>
|
|
329
329
|
<linearGradient id="wall" x1="0" y1="0" x2="1" y2="1"><stop offset="0" stop-color="#2f3b45"/><stop offset="1" stop-color="#1a2129"/></linearGradient>
|
|
330
330
|
<linearGradient id="table" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#9a6a45"/><stop offset="1" stop-color="#4c2f1f"/></linearGradient>
|
|
@@ -354,7 +354,7 @@ void main() {
|
|
|
354
354
|
<ellipse cx="690" cy="530" rx="80" ry="56" fill="url(#lemon)"/>
|
|
355
355
|
<circle cx="370" cy="560" r="44" fill="url(#plum)"/>
|
|
356
356
|
<circle cx="780" cy="585" r="34" fill="url(#plum)"/>
|
|
357
|
-
</svg>`,
|
|
357
|
+
</svg>`,Lc=`<svg xmlns="http://www.w3.org/2000/svg" width="560" height="560" viewBox="0 0 560 560">
|
|
358
358
|
<defs>
|
|
359
359
|
<radialGradient id="glass" cx=".38" cy=".35" r=".7"><stop offset="0" stop-color="#e8fbff" stop-opacity=".9"/><stop offset=".5" stop-color="#9fd8f0" stop-opacity=".55"/><stop offset="1" stop-color="#3a6f9e" stop-opacity=".85"/></radialGradient>
|
|
360
360
|
<linearGradient id="liquid" x1="0" y1="0" x2="0" y2="1"><stop offset="0" stop-color="#ff7ad1"/><stop offset=".6" stop-color="#b8248f"/><stop offset="1" stop-color="#5d0e4c"/></linearGradient>
|
|
@@ -368,7 +368,7 @@ void main() {
|
|
|
368
368
|
<path d="M160 300 C180 262 214 240 250 228" stroke="#ffffff" stroke-width="16" stroke-linecap="round" fill="none" opacity=".75"/>
|
|
369
369
|
<path d="M150 340 v12" stroke="#ffffff" stroke-width="16" stroke-linecap="round" opacity=".6"/>
|
|
370
370
|
<path d="M240 156 V210 C150 240 104 310 104 380 C104 470 182 520 280 520 C378 520 456 470 456 380 C456 310 410 240 320 210 V156Z" fill="none" stroke="#1d3150" stroke-width="10"/>
|
|
371
|
-
</svg>`,zn=[{id:"dusk",name:"Dusk",svg:vs},{id:"still-life",name:"Still life",svg:Es},{id:"potion",name:"Potion (transparent)",svg:ks}],wo=e=>"data:image/svg+xml;charset=utf-8,"+encodeURIComponent(e.svg);async function pi(e){let t=new Image;return t.src=wo(e),await t.decode(),t}var hi=/^image\//,mi=/^video\//,Ms=/\.(gpl|hex|pal|txt|json)$/i;async function Bl(e,t={}){let n=t.persist!==!1,o=()=>matchMedia("(max-width: 900px)").matches,i=t.settings||n&&Pt("settings",null)||xt();if(/[#&]s=/.test(location.hash))try{i=Hn(location.hash)}catch{W("That share link could not be read; using your last settings",{kind:"error"})}let r=Xr(i),a={store:r,engine:null,items:[],current:null,result:null,exporting:!1,activePreset:null,userPalettes:n?Pt("palettes",[]):[],shared:r.settings,clipboard:null,videoSupport:{mp4:!1,webm:!1},toast:(p,M)=>W(p,M)},c=Wr({onPick:He,onViewChange:()=>De()}),l=ui(a),s=fi(a),d=ci(a),f=(p,M,_,F={})=>m("button.itp-btn.icon",{type:"button","aria-label":M,title:M,html:Y(p),onclick:_,...F}),u=m("span.name",{text:"No image"}),h=m("span.meta.num",{}),x=f("undo","Undo (Ctrl+Z)",()=>r.undo()),E=f("redo","Redo (Ctrl+Shift+Z)",()=>r.redo()),y=f("compare","Compare with original (C)",()=>Ze(),{"aria-pressed":"false"}),k=f("grid","Pixel grid (G)",()=>kt(),{"aria-pressed":"false"}),b=m("button.itp-btn.itp-zoom.num",{type:"button","aria-label":"Zoom","aria-haspopup":"menu",html:`<span>Fit</span>${Y("chevronDown")}`,onclick:p=>Ut(p.currentTarget)}),S=f("moon","Toggle theme (T)",()=>pt()),w=f("sidebarLeft","Toggle library (\\)",()=>Je("lib")),A=f("sidebarRight","Toggle inspector (/)",()=>Je("insp")),L=f("keyboard","Keyboard shortcuts (?)",()=>Mt()),T=m("button.itp-btn.primary",{type:"button","aria-haspopup":"menu",html:`${Y("download")}<span>Export</span>`,onclick:p=>Ft(p.currentTarget)}),P=m("a.itp-brand",{href:t.homeHref||"#",title:"Image-to-Pixel"},m("span.itp-mark",{"aria-hidden":"true"},...Array.from({length:9},()=>m("i"))),m("span.hide-sm",{text:"Image-to-Pixel"}));t.homeHref||P.addEventListener("click",p=>p.preventDefault());let z=m("header.itp-top",{},w,P,m("span.sep.hide-sm"),m("div.itp-file",{},u,h),m("div.spacer"),m("span.hide-sm.contents",{},x,E,m("span.sep")),y,k,b,m("span.sep.hide-sm"),m("span.hide-sm.contents",{},S,L),A,m("span",{style:{width:"6px"}}),T),v=t.samples===!1?null:m("div.samples",{},...zn.map(p=>m("button",{type:"button",title:`Try "${p.name}"`,"aria-label":`Open sample: ${p.name}`,onclick:()=>Ge(p)},m("img",{src:wo(p),alt:""})))),I=m("div.itp-empty",{},m("div.itp-drop",{},m("h2",{text:"Drop an image or a video"}),m("p",{text:"PNG, JPG, WebP, GIF, SVG, MP4 or WebM. Add several files to process them as a batch. You can also paste with Ctrl+V."}),m("div.actions",{},m("button.itp-btn.primary",{type:"button",html:`${Y("upload")}<span>Choose files</span>`,onclick:()=>qe()}),m("button.itp-btn.outline",{type:"button",html:`${Y("clipboard")}<span>Paste</span>`,onclick:()=>Lt()})),v?m("p",{style:{fontSize:"var(--fs-xs)",color:"var(--faint)"},text:"Or start from a sample"}):null,v)),D=m("div.itp-float.bl",{"aria-live":"polite"}),U=m("div.itp-busy.itp-float",{hidden:!0,style:{padding:"6px 10px",alignItems:"center",gap:"8px",fontSize:"var(--fs-xs)",color:"var(--muted)",display:"flex"}},m("span.itp-spinner"),m("span",{text:"Rendering"})),B=m("div.itp-float.br",{},f("zoomOut","Zoom out (-)",()=>c.zoomOut()),f("fit","Fit to view (F)",()=>c.fit()),f("zoomIn","Zoom in (+)",()=>c.zoomIn()));c.el.append(I,D,U,B);let H=f("play","Play (Space)",()=>Ke()),V=m("span.itp-time",{}),G=m("input.itp-scrub",{type:"range",min:0,max:1e3,value:0,"aria-label":"Video position"}),ce=m("span.muted.num",{style:{fontSize:"var(--fs-xs)",whiteSpace:"nowrap"}}),be=m("div.itp-transport",{role:"group","aria-label":"Video"},f("stepBack","Previous frame (,)",()=>rt(-1)),H,f("stepForward","Next frame (.)",()=>rt(1)),V,G,ce),Te=m("main.itp-stage",{"data-video":"false"},c.el,be);Te.addEventListener("pointerdown",()=>{o()&&se.dataset.lib==="open"&&Je("lib")},!0);let se=m("div.itp.itp-app",{"data-lib":o()?"closed":Pt("lib","open"),"data-insp":Pt("insp","open")},z,s.el,Te,l.el);tt(e,se),ft(Pt("theme",null)),D.textContent="Starting\u2026";try{a.engine=await Ur()}catch(p){throw W(`Could not start: ${p.message}`,{kind:"error"}),p}l.el.querySelector("#itp-backend").textContent=a.engine.backend==="webgl"?"GPU \xB7 ShaderMate":"CPU",l.el.querySelector("#itp-backend").title=a.engine.backend==="webgl"?`WebGL 2: ${a.engine.renderer}`:a.engine.fallbackReason||"CPU renderer",Promise.resolve().then(()=>(xo(),bo)).then(p=>p.videoSupport()).then(p=>{a.videoSupport=p}).catch(()=>{});let ae=!1,he=!1,Fe=null,Ee=document.createElement("canvas");function me(){ae=!0,he||requestAnimationFrame(Xe)}a.schedule=me;async function Xe(){if(he||!ae||a.exporting)return;ae=!1;let p=a.current;if(!p){a.result=null,c.clear(),Ve();return}he=!0;let M=setTimeout(()=>{U.hidden=!1},250);try{p.type==="video"&&a.engine.invalidate();let _=await a.engine.process(p.source,r.settings);if(p!==a.current)return;a.result=_,_.toCanvas(1,{canvas:Ee}),c.show(Ee,p.source,_.crop),l.setStats(_),l.sync(r.settings,_),Fe!==p&&(Fe=p),Ve()}catch(_){console.error(_),W(`Rendering failed: ${_.message}`,{kind:"error"})}finally{clearTimeout(M),U.hidden=!0,he=!1,ae&&requestAnimationFrame(Xe)}}function Ve(){let p=a.result,M=a.current;if(u.textContent=M?M.name:"No image",h.textContent=M?M.type==="video"?`${M.width} \xD7 ${M.height}, ${pn(M.duration)}`:`${M.width} \xD7 ${M.height}`:"",I.hidden=!!M,B.hidden=!M,!M||!p){D.hidden=!0;return}D.hidden=!1,tt(D,m("span",{},m("b",{text:`${p.width} \xD7 ${p.height}`})," px"),m("span",{text:`${Math.round(c.zoom*100)/100}\xD7 zoom`})),x.disabled=!r.canUndo,E.disabled=!r.canRedo}function De(){b.querySelector("span").textContent=!a.current||c.fitted?"Fit":c.zoom>=1?`${Math.round(c.zoom*10)/10}\xD7`:`${Math.round(c.zoom*100)}%`,a.result&&Ve()}r.subscribe((p,M)=>{let _=a.current;_&&_.own&&r.target===_.id?_.own=p:r.target==="shared"&&(a.shared=p),l.sync(p,a.result),x.disabled=!r.canUndo,E.disabled=!r.canRedo,M!=="preset"&&(a.activePreset=null),n&&_e(),s.tab==="palettes"&&s.refresh(),me()});let We=null,_e=()=>{clearTimeout(We),We=setTimeout(()=>vt("settings",a.shared),300)};async function ke(p,M,_){let F=document.createElement("canvas"),X=72/Math.max(M,_);F.width=Math.max(1,Math.round(M*X)),F.height=Math.max(1,Math.round(_*X));try{F.getContext("2d").drawImage(p,0,0,F.width,F.height)}catch{}return F.toDataURL()}async function le(p,M,_=null){let F=M.naturalWidth||M.width,X=M.naturalHeight||M.height,ne={id:crypto.randomUUID?.()||String(Math.random()),name:p,type:"image",source:M,width:F,height:X,file:_};return ne.thumb=await ke(M,F,X),a.items.push(ne),ne}async function nt(p,M){let _=m("video",{muted:!0,playsInline:!0,loop:!0,preload:"auto",crossOrigin:"anonymous"});_.muted=!0,_.src=URL.createObjectURL(M);try{await en(_)}catch(X){if(URL.revokeObjectURL(_.src),X.code===3||X.code===4){let ne=await Gr(M).catch(()=>""),ie=ne==="H.264"?"WebM (VP9)":ne==="VP9"?"H.264 MP4":"H.264 MP4 or WebM (VP9)",te=new Error(ne?`it's ${ne}, which this browser can't play. Re-save it as ${ie}, or open the editor in a browser that plays ${ne}.`:`this browser can't play this video's format. Re-save it as ${ie}.`);throw te.code=X.code,te}throw X}let F={id:crypto.randomUUID?.()||String(Math.random()),name:p,type:"video",source:_,width:_.videoWidth,height:_.videoHeight,duration:_.duration,fps:30,file:M};return await Gt(_,Math.min(.05,_.duration/2)).catch(()=>{}),F.thumb=await ke(_,F.width,F.height),a.items.push(F),Pn(_,30).then(X=>{F.fps=X,a.current===F&&Le(),l.syncAnim()}),_.addEventListener("timeupdate",()=>{a.current===F&&Le()}),_.addEventListener("play",()=>{a.current===F&&(Le(),Rt(F))}),_.addEventListener("pause",()=>{a.current===F&&(Le(),me())}),_.addEventListener("seeked",()=>{a.current===F&&!a.exporting&&me()}),F}async function Ae(p){let M=[],_=[],F=[];for(let ie of p)Ms.test(ie.name)&&!/^image|^video/.test(ie.type)?/\.json$/i.test(ie.name)?F.push(ie):_.push(ie):(hi.test(ie.type)||mi.test(ie.type)||/\.(png|jpe?g|gif|webp|bmp|svg|avif|mp4|webm|mov)$/i.test(ie.name))&&M.push(ie);for(let ie of _)await ze(ie);for(let ie of F){let te=await ie.text();try{let fe=JSON.parse(te);fe.colors||Array.isArray(fe)?await ze(ie,te):(r.replace(Xn(fe)),W(`Loaded settings from ${ie.name}`,{kind:"ok"}))}catch(fe){W(`${ie.name}: ${fe.message}`,{kind:"error"})}}let X=null,ne=M.length>2?W(`Loading ${M.length} files`,{progress:!0}):null;for(let ie=0;ie<M.length;ie++){let te=M[ie];try{let fe;if(mi.test(te.type)||/\.(mp4|webm|mov)$/i.test(te.name))fe=await nt(te.name,te);else{let C;try{C=await createImageBitmap(te)}catch{C=new Image,C.src=URL.createObjectURL(te),await C.decode()}fe=await le(te.name,C,te)}X||(X=fe)}catch(fe){W(`${te.name} could not be opened: ${fe.message}`,{kind:"error"})}ne?.progress((ie+1)/M.length)}ne?.close(),X&&Oe(X),s.refresh(),M.length>1&&W(`Added ${M.length} files. They share one set of settings.`,{kind:"ok"})}a.addFiles=Ae;async function qe(){let p=await Un({accept:"image/*,video/*,.gpl,.hex,.pal,.txt,.json",multiple:!0});p.length&&Ae(p)}a.openFiles=qe;async function Ge(p){let M=await pi(p),_=await le(`${p.name}.svg`,M);Oe(_),s.refresh()}async function Lt(){try{let p=await navigator.clipboard.read(),M=[];for(let _ of p)for(let F of _.types)if(hi.test(F)){let X=await _.getType(F);M.push(new File([X],`pasted-${new Date().toISOString().slice(11,19).replace(/:/g,"")}.${F.split("/")[1]}`,{type:F}))}M.length?Ae(M):W("The clipboard has no image",{kind:"error"})}catch{W("Press Ctrl+V (\u2318V) to paste. The browser blocked direct clipboard access.")}}a.pasteFromClipboard=Lt;function Oe(p){a.current&&a.current.type==="video"&&a.current!==p&&a.current.source.pause(),a.current=p,ge(p),Te.dataset.video=String(p&&p.type==="video"),p&&p.type==="video"&&Le(),c.clear(),a.result=null,c.picking&&$e(),s.refresh(),s.sourceChanged(),me(),Ve()}a.select=Oe;function ot(p){let M=a.items.indexOf(p);M<0||(a.items.splice(M,1),r.dropTarget(p.id),p.type==="video"&&(p.source.pause(),URL.revokeObjectURL(p.source.src)),p.source.close&&!a.items.some(_=>_.source===p.source)&&p.source.close(),a.current===p&&Oe(a.items[Math.min(M,a.items.length-1)]||null),s.refresh(),l.sync(r.settings,a.result))}a.removeItem=ot,a.clearItems=()=>{for(let p of a.items.slice())ot(p)};let Ye=p=>p===a.current?r.settings:p&&p.own||a.shared;a.settingsFor=Ye;let Pe=p=>JSON.parse(JSON.stringify(p));function ge(p,M=!1){let _=p&&p.own?p.id:"shared";r.target===_&&!M||r.setTarget(_,_==="shared"?a.shared:p.own)}function je(p,M,{quiet:_=!1}={}){if(!(!p||!!p.own===M)){if(M)p.own=Pe(Ye(p)),p===a.current&&ge(p),_||W(`${p.name} now has its own settings. Changes no longer affect other files.`);else{let F=p.own;p.own=null,r.dropTarget(p.id),p===a.current&&ge(p),_||W(`${p.name} uses the shared settings again`,{action:{label:"Undo",onClick:()=>{p.own=F,p===a.current&&ge(p),we()}}})}we()}}function we(){s.refresh(),l.sync(r.settings,a.result),a.result&&l.setStats(a.result),me()}a.setOwn=je,a.copySettings=p=>{a.clipboard=Pe(Ye(p)),W(`Copied the settings of ${p.name}`,{timeout:1800}),s.refresh()},a.pasteSettings=p=>{a.clipboard&&(p.own||je(p,!0,{quiet:!0}),p===a.current?r.replace(a.clipboard,"paste"):p.own=Pe(a.clipboard),W(`Pasted settings onto ${p.name}`,{kind:"ok",timeout:1800}),we())},a.applyToAll=p=>{let M={shared:a.shared,own:new Map(a.items.map(_=>[_,_.own]))};a.shared=Pe(Ye(p));for(let _ of a.items)_.own&&r.dropTarget(_.id),_.own=null;r.setTarget("shared",a.shared),n&&_e(),W(`Every file now uses the settings of ${p.name}`,{action:{label:"Undo",onClick:()=>{a.shared=M.shared;for(let[_,F]of M.own)_.own=F;ge(a.current,!0),we()}}}),we()},a.duplicate=async p=>{let M;p.type==="video"?M=await nt(Et(p.name),p.file):M=await le(Et(p.name),p.source,p.file),a.items.splice(a.items.indexOf(M),1),a.items.splice(a.items.indexOf(p)+1,0,M),M.own=Pe(Ye(p)),Oe(M),W(`Duplicated ${p.name}. The copy has its own settings.`,{timeout:2400})};let Et=p=>{let M=/^(.*?)(\.[^.]*)?$/.exec(p);return`${M[1]} copy${M[2]||""}`};a.move=(p,M)=>{let _=a.items.indexOf(p),F=_+M;_<0||F<0||F>=a.items.length||([a.items[_],a.items[F]]=[a.items[F],a.items[_]],s.refresh(),(document.activeElement===document.body||document.activeElement?.closest?.(".itp-files"))&&s.focusFile(p))};function Le(){let p=a.current;if(!p||p.type!=="video")return;let M=p.source;H.innerHTML=Y(M.paused?"play":"pause"),H.setAttribute("aria-label",M.paused?"Play (Space)":"Pause (Space)");let _=Math.floor(M.currentTime*p.fps+1e-6);V.innerHTML=`${pn(M.currentTime)} <span>/ ${pn(M.duration)}</span>`,V.title=`Frame ${_}`,G.value=String(Math.round(M.currentTime/(M.duration||1)*1e3)),G.style.setProperty("--p",`${G.value/10}%`),ce.textContent=`${p.fps} fps`}function Rt(p){let M=p.source,_=()=>{M.paused||a.current!==p||(me(),"requestVideoFrameCallback"in M?M.requestVideoFrameCallback(_):requestAnimationFrame(_))};_()}function Ke(){let p=a.current;!p||p.type!=="video"||(p.source.paused?p.source.play().catch(M=>W(M.message,{kind:"error"})):p.source.pause())}function rt(p){let M=a.current;if(!M||M.type!=="video")return;let _=M.source;_.pause();let F=Math.floor(_.currentTime*M.fps+1e-6)+p;Gt(_,(Math.max(0,F)+.5)/M.fps).then(()=>{Le(),me()})}G.addEventListener("input",()=>{let p=a.current;!p||p.type!=="video"||(p.source.currentTime=G.value/1e3*p.source.duration)});function Ze(p){let M=p??!c.compare;c.setCompare(M),y.setAttribute("aria-pressed",String(M))}function kt(p){let M=p??!c.grid;c.setGrid(M),k.setAttribute("aria-pressed",String(M)),M&&c.zoom<6&&a.result&&W("The grid shows from 6\xD7 zoom")}function Ut(p){un(p,[{label:"Fit to view",kbd:"F",icon:"fit",onClick:()=>c.fit()},"sep",...[1,2,4,8,16,32].map(M=>({label:`${M}\xD7`,sub:M===1?"One screen pixel per pixel":null,onClick:()=>c.zoomTo(M)})),"sep",{label:"Zoom in",kbd:"+",icon:"zoomIn",onClick:()=>c.zoomIn()},{label:"Zoom out",kbd:"-",icon:"zoomOut",onClick:()=>c.zoomOut()}])}function Je(p){let M=p==="lib"?"lib":"insp",_=se.dataset[M]!=="open";se.dataset[M]=_?"open":"closed",(!o()||p==="insp")&&vt(M,se.dataset[M]),requestAnimationFrame(()=>c.resize())}function ft(p){p?document.documentElement.dataset.theme=p:delete document.documentElement.dataset.theme;let M=p?p==="dark":!matchMedia("(prefers-color-scheme: light)").matches;S.innerHTML=Y(M?"sun":"moon"),S.setAttribute("aria-label",M?"Switch to light theme (T)":"Switch to dark theme (T)"),c.redraw()}function pt(){let M=(document.documentElement.dataset.theme||(matchMedia("(prefers-color-scheme: light)").matches?"light":"dark"))==="dark"?"light":"dark";vt("theme",M),ft(M)}function It(p,M=4096){let _=p.width,F=p.height,X=Math.min(1,M/Math.max(_,F)),ne=document.createElement("canvas");ne.width=Math.round(_*X),ne.height=Math.round(F*X);let ie=ne.getContext("2d",{willReadFrequently:!0});return ie.drawImage(p.source,0,0,ne.width,ne.height),ie.getImageData(0,0,ne.width,ne.height)}function He(p,M){let _=a.current;if(!_)return;let F=It(_,1024),X=a.result?a.result.crop:{x:0,y:0,w:1,h:1},ne=Math.min(F.width-1,Math.floor((X.x+p*X.w)*F.width)),te=(Math.min(F.height-1,Math.floor((X.y+M*X.h)*F.height))*F.width+ne)*4,fe=Ot([F.data[te],F.data[te+1],F.data[te+2]]),C=r.settings,R=C.palette.source==="custom"?C.palette.colors:[];if(R.includes(fe))return W(`${fe} is already in the palette`);r.update({palette:{source:"custom",name:C.palette.source==="custom"?C.palette.name:"Picked",colors:[...R,fe]}}),W(`Added ${fe}`,{kind:"ok",timeout:1500})}let it=null;function $e(p){p&&(it=p);let M=!c.picking;c.setPicking(M),it?.setAttribute("aria-pressed",String(M)),M&&(Ze(!0),W("Click the image to add colours. Press Esc when done."))}a.togglePicker=$e;function at(p){p.id&&!p.custom?r.update({palette:{source:"builtin",id:p.id}}):r.update({palette:{source:"custom",name:p.name,colors:p.colors}})}a.usePalette=at;function Re(p,M){let _=a.userPalettes.filter(F=>F.name!==p);_.unshift({name:p,colors:M,custom:!0}),a.userPalettes=_.slice(0,100),n&&vt("palettes",a.userPalettes),s.tab==="palettes"&&s.refresh()}async function ze(p,M){try{let _=ao(M??await p.text(),p.name);Re(_.name||"Imported",_.colors),r.update({palette:{source:"custom",name:_.name||"Imported",colors:_.colors}}),W(`Imported "${_.name}" (${_.colors.length} colours)`,{kind:"ok"})}catch(_){W(`${p.name}: ${_.message}`,{kind:"error"})}}a.importPalette=async()=>{let[p]=await Un({accept:".gpl,.hex,.pal,.txt,.json"});p&&ze(p)},a.savePalette=()=>{let p=r.settings,M=p.palette.source==="extract"?a.result?.palette||[]:p.palette.colors;if(!M.length)return W("There is no palette to save",{kind:"error"});let _=m("input.itp-input",{value:p.palette.source==="custom"?p.palette.name:`${p.palette.name} copy`,"aria-label":"Palette name"}),F=m("select.itp-select",{"aria-label":"Also download as"},m("option",{value:"",text:"Don't download"}),m("option",{value:"gpl",text:".gpl (GIMP, Aseprite)"}),m("option",{value:"hex",text:".hex (Lospec)"}),m("option",{value:"json",text:".json"}));fn("Save palette",[m("div.itp-field",{},m("div.lab",{},m("span",{text:"Name"})),_),m("div.itp-field",{},m("div.lab",{},m("span",{text:"Also download as"})),F),m("div.itp-strip",{style:{height:"18px"}},...M.map(X=>m("i",{style:{background:X}})))],{actions:[{label:"Cancel"},{label:"Save",primary:!0,onClick:()=>{let X=_.value.trim()||"Palette";Re(X,M),r.update({palette:{source:"custom",name:X,colors:M}});let ne=X.replace(/[^\w-]+/g,"-").toLowerCase();F.value==="gpl"&&Be(Fr(X,M),`${ne}.gpl`,"text/plain"),F.value==="hex"&&Be(Dr(M),`${ne}.hex`,"text/plain"),F.value==="json"&&Be(Or(X,M),`${ne}.json`,"application/json"),W(`Saved "${X}" to Your palettes`,{kind:"ok"})}}]}),_.select()},a.deletePalette=p=>{a.userPalettes=a.userPalettes.filter(M=>M!==p),n&&vt("palettes",a.userPalettes),s.refresh(),W(`Deleted "${p.name}"`,{action:{label:"Undo",onClick:()=>Re(p.name,p.colors)}})},a.lospecDialog=()=>{let p=m("input.itp-input",{placeholder:"e.g. rgbg-36 or a lospec.com palette URL","aria-label":"Lospec slug or URL"}),M=m("div.help",{text:"Looks the palette up on lospec.com. Needs an internet connection."}),_=fn("Palette from Lospec",[m("div.itp-field",{},m("div.lab",{},m("span",{text:"Slug or URL"})),p,M)],{actions:[{label:"Cancel"},{label:"Fetch",primary:!0,onClick:async()=>{M.textContent="Fetching\u2026",M.style.color="";try{let F=await $r(p.value);return Re(F.name,F.colors),r.update({palette:{source:"custom",name:F.name,colors:F.colors}}),W(`Loaded "${F.name}" from Lospec`,{kind:"ok"}),!0}catch(F){return M.textContent=F.message,M.style.color="var(--danger)",!1}}}]});p.addEventListener("keydown",F=>{F.key==="Enter"&&_.querySelector("footer .primary").click()}),p.focus()},a.detectGrid=()=>{let p=a.current;if(!p||p.type!=="image")return W("Open an image first",{kind:"error"});let M=Lr(It(p));if(M<=1)return W("No pixel grid found. This image doesn't look upscaled.");r.update({size:{mode:"block",block:M,resample:"nearest"}}),W(`Found ${M} px blocks: switched to pixel size ${M} with nearest sampling`,{kind:"ok"})},a.settingsJSON=()=>Zt(r.settings),a.copyLink=async()=>{let p=`${location.origin}${location.pathname}#s=${jn(r.settings)}`;try{await navigator.clipboard.writeText(p),W("Link copied. It holds the settings, not the image.",{kind:"ok"})}catch{fn("Share link",[m("textarea.itp-input",{rows:3,readOnly:!0,value:p})])}history.replaceState(null,"",`#s=${jn(r.settings)}`)},a.saveSettingsFile=()=>Be(Zt(r.settings),"image-to-pixel-settings.json","application/json"),a.loadSettingsFile=async()=>{let[p]=await Un({accept:".json,application/json"});if(p)try{r.replace(Xn(await p.text())),W(`Loaded ${p.name}`,{kind:"ok"})}catch(M){W(`${p.name}: ${M.message}`,{kind:"error"})}},a.resetSettings=()=>{r.replace(xt()),W("Settings reset",{action:{label:"Undo",onClick:()=>r.undo()}})},a.applyPreset=p=>{r.replace(Tt(xt(),{...p.settings,export:r.settings.export}),"preset"),a.activePreset=p.id,s.refresh()},Object.assign(a,d);function Ft(p){let M=a.current,_=M&&M.type==="video",F=a.items.filter(ne=>ne.type==="image").length,X=r.settings;un(p,[{group:"Image"},{label:"PNG",sub:a.result?`${a.result.width*X.export.scale} \xD7 ${a.result.height*X.export.scale}, ${X.export.scale}\xD7 scale`:"Open an image first",icon:"image",kbd:"Ctrl S",disabled:!a.result,onClick:()=>a.exportPNG()},{label:"Copy to clipboard",icon:"copy",disabled:!a.result,onClick:()=>a.copyImage()},{label:a.items.length>1?`All ${a.items.length} files as ZIP`:"All files as ZIP",sub:a.items.length>1?null:"Add two or more files",icon:"zip",disabled:a.items.length<2,onClick:()=>a.exportZip()},{group:"Animation"},{label:_?"GIF from this video":"GIF from all images",icon:"gif",disabled:!_&&F<2,onClick:()=>a.exportAnimation({...Yt(),format:"gif"})},{label:"More formats\u2026",sub:"WebM, MP4, PNG sequence, sprite sheet",icon:"film",onClick:()=>{l.setTab("export"),se.dataset.insp!=="open"&&Je("insp")}},{group:"Other"},{label:"Tileset",sub:"16 \xD7 16 tiles, duplicates removed",icon:"tiles",disabled:!a.result,onClick:()=>a.exportTileset({tile:16,flips:!1})},{label:"Copy settings link",icon:"link",onClick:()=>a.copyLink()},{label:"Settings as JSON",icon:"braces",onClick:()=>a.saveSettingsFile()}])}let Yt=()=>{let p=a.current,M=p&&p.type==="video";return{source:M?"video":"files",fps:M?Math.min(30,Math.round(p.fps||12)):8,start:0,end:M?p.duration:0}};function Mt(){fn("Keyboard shortcuts",[m("div.itp-keys",{},...[["Open files","Ctrl O"],["Paste image","Ctrl V"],["Export PNG","Ctrl S"],["Undo","Ctrl Z"],["Redo","Ctrl Shift Z"],["Compare","C"],["Pixel grid","G"],["Fit","F"],["Zoom in / out","+ -"],["Pixel width \xB11","[ ]"],["Pixel width \xB18","Shift [ ]"],["Next / previous dither","D Shift D"],["Play / pause video","Space"],["Step one frame",", ."],["Library","\\"],["Inspector","/"],["Theme","T"],["Next / previous file","Alt \u2193 \u2191"],["Move file down / up","Alt Shift \u2193 \u2191"],["This list","?"]].map(([M,_])=>m("div",{},m("span",{text:M}),m("span",{},..._.split(" ").filter(Boolean).map(F=>m("kbd",{text:F}))))))])}let st=p=>p.target.closest('input, select, textarea, [contenteditable="true"]')&&!(p.target.type==="range"||p.target.type==="checkbox"),Qe=["none","bayer4","bayer8","bluenoise","cluster4","floyd-steinberg","atkinson","sierra-lite","jarvis"];window.addEventListener("keydown",p=>{if(!se.isConnected||document.querySelector("dialog[open]"))return;let M=p.ctrlKey||p.metaKey,_=p.key;if(M&&_.toLowerCase()==="z"){if(st(p))return;p.preventDefault(),p.shiftKey?r.redo():r.undo();return}if(M&&_.toLowerCase()==="y"){if(st(p))return;p.preventDefault(),r.redo();return}if(M&&_.toLowerCase()==="s"){p.preventDefault(),a.exportPNG();return}if(M&&_.toLowerCase()==="o"){p.preventDefault(),qe();return}if(M||p.altKey&&!["ArrowUp","ArrowDown"].includes(_))return;if(st(p)){_==="Escape"&&p.target.blur();return}let F=r.settings;switch(_){case"c":case"C":Ze();break;case"g":case"G":kt();break;case"f":case"F":c.fit();break;case"+":case"=":c.zoomIn();break;case"-":case"_":c.zoomOut();break;case"t":case"T":pt();break;case"\\":Je("lib");break;case"/":Je("insp");break;case"?":Mt();break;case"[":case"{":r.update({size:{mode:"width",width:Math.max(8,F.size.width-(p.shiftKey?8:1))}},{key:"kw"});break;case"]":case"}":r.update({size:{mode:"width",width:F.size.width+(p.shiftKey?8:1)}},{key:"kw"});break;case"d":case"D":{let X=Qe.indexOf(F.dither.method),ne=Qe[(X+(p.shiftKey?-1:1)+Qe.length)%Qe.length];r.update({dither:{method:ne}}),W(ne==="none"?"No dither":ne.replace(/-/g," "),{timeout:900});break}case" ":a.current?.type==="video"&&(p.preventDefault(),Ke());break;case",":rt(-1);break;case".":rt(1);break;case"Escape":c.picking?$e():Wt();break;case"ArrowDown":case"ArrowUp":if(p.altKey&&p.shiftKey&&a.current){p.preventDefault(),a.move(a.current,_==="ArrowDown"?1:-1);break}if(p.altKey&&a.items.length>1){p.preventDefault();let X=a.items.indexOf(a.current);Oe(a.items[(X+(_==="ArrowDown"?1:-1)+a.items.length)%a.items.length])}break;default:return}});let ct=0;return se.addEventListener("dragenter",p=>{[...p.dataTransfer.types].includes("Files")&&(ct++,se.classList.add("itp-dragging"))}),se.addEventListener("dragleave",()=>{--ct<=0&&(ct=0,se.classList.remove("itp-dragging"))}),se.addEventListener("dragover",p=>{[...p.dataTransfer.types].includes("Files")&&p.preventDefault()}),se.addEventListener("drop",p=>{p.preventDefault(),ct=0,se.classList.remove("itp-dragging"),p.dataTransfer.files.length&&Ae([...p.dataTransfer.files])}),window.addEventListener("paste",p=>{if(!se.isConnected||st(p))return;let M=[...p.clipboardData?.files||[]];if(M.length){p.preventDefault(),Ae(M);return}let _=p.clipboardData?.getData("text")||"";if(/#?[0-9a-f]{6}/i.test(_)&&/\n|,|\s/.test(_.trim()))try{let F=ao(_);r.update({palette:{source:"custom",name:"Pasted",colors:F.colors}}),W(`Pasted a ${F.colors.length}-colour palette`,{kind:"ok"})}catch{}}),window.addEventListener("hashchange",()=>{if(/[#&]s=/.test(location.hash))try{r.replace(Hn(location.hash))}catch{}}),l.sync(r.settings,null),s.refresh(),Ve(),x.disabled=E.disabled=!0,{app:a,store:r,addFiles:Ae,async addImage(p,M="image"){let _=await le(M,p);return Oe(_),s.refresh(),_},openSample:p=>Ge(zn.find(M=>M.id===p)||zn[0]),applyPreset:p=>{let M=cn.find(_=>_.id===p);M&&a.applyPreset(M)},setTheme:p=>{vt("theme",p),ft(p)},get result(){return a.result},get view(){return c.rect},async idle(){for(let p=0;p<200&&(ae||he);p++)await new Promise(M=>setTimeout(M,25))}}}export{zn as SAMPLES,Bl as mountEditor};
|
|
371
|
+
</svg>`,oo=[{id:"dusk",name:"Dusk",svg:Ac},{id:"still-life",name:"Still life",svg:_c},{id:"potion",name:"Potion (transparent)",svg:Lc}],qo=e=>"data:image/svg+xml;charset=utf-8,"+encodeURIComponent(e.svg);async function ea(e){let t=new Image;return t.src=qo(e),await t.decode(),t}var Pc="image-to-pixel",ro="workspace",Yo="current";function Rc(){return new Promise((e,t)=>{if(typeof indexedDB>"u"){t(new Error("This browser has no IndexedDB"));return}let n=indexedDB.open(Pc,1);n.onupgradeneeded=()=>{n.result.objectStoreNames.contains(ro)||n.result.createObjectStore(ro)},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}async function Ko(e,t){let n=await Rc();try{return await new Promise((o,i)=>{let r=n.transaction(ro,e),a=t(r.objectStore(ro));r.oncomplete=()=>o(a&&a.result),r.onerror=()=>i(r.error||a&&a.error),r.onabort=()=>i(r.error||new Error("Saving was cancelled"))})}finally{n.close()}}async function ta(e){let t={version:1,savedAt:Date.now(),...e};return await Ko("readwrite",n=>n.put(t,Yo)),e.items.reduce((n,o)=>n+(o.file?o.file.size:0),0)}async function na(){try{let e=await Ko("readonly",t=>t.get(Yo));return e&&e.version===1&&Array.isArray(e.items)?e:null}catch{return null}}async function oa(){await Ko("readwrite",e=>e.delete(Yo))}var ra=e=>!!e&&(e.name==="QuotaExceededError"||/quota|space/i.test(e.message||"")),Zo=e=>e>=1e9?`${(e/1e9).toFixed(1)} GB`:e>=1e6?`${(e/1e6).toFixed(1)} MB`:`${Math.max(1,Math.round(e/1e3))} KB`;var ia=/^image\//,aa=/^video\//,Ic=/\.(gpl|hex|pal|txt|json)$/i;async function pd(e,t={}){let n=t.persist!==!1,o=()=>matchMedia("(max-width: 900px)").matches,i=t.settings||n&&Rt("settings",null)||Dt();if(/[#&]s=/.test(location.hash))try{i=lo(location.hash)}catch{Q("That share link could not be read; using your last settings",{kind:"error"})}let r=Ei(i),a={store:r,engine:null,items:[],current:null,result:null,exporting:!1,activePreset:null,userPalettes:n?Rt("palettes",[]):[],shared:r.settings,clipboard:null,videoSupport:{mp4:!1,webm:!1},toast:(u,g)=>Q(u,g)},c=ki({onPick:re,onViewChange:()=>Et()}),l=Ki(a),s=Zi(a),d=Hi(a),h=(u,g,S,R={})=>m("button.itp-btn.icon",{type:"button","aria-label":g,title:g,html:ie(u),onclick:S,...R}),f=m("span.name",{text:"No image"});f.addEventListener("click",()=>{a.current&&Ne(a.current)});let p=m("span.meta.num",{}),b=h("undo","Undo (Ctrl+Z)",()=>r.undo()),M=h("redo","Redo (Ctrl+Shift+Z)",()=>r.redo()),v=h("compare","Compare with original (C)",()=>he(),{"aria-pressed":"false"}),k=h("grid","Pixel grid (G)",()=>ae(),{"aria-pressed":"false"}),x=m("button.itp-btn.itp-zoom.num",{type:"button","aria-label":"Zoom","aria-haspopup":"menu",html:`<span>Fit</span>${ie("chevronDown")}`,onclick:u=>Le(u.currentTarget)}),w=h("moon","Toggle theme (T)",()=>B()),y=h("sidebarLeft","Toggle library (\\)",()=>C("lib")),A=h("sidebarRight","Toggle inspector (/)",()=>C("insp")),_=h("keyboard","Keyboard shortcuts (?)",()=>E()),P=m("button.itp-btn.primary",{type:"button","aria-haspopup":"menu",html:`${ie("download")}<span>Export</span>`,onclick:u=>we(u.currentTarget)}),I=m("button.itp-btn.outline",{type:"button",title:"Save these files and their settings in this browser",html:`${ie("save")}<span class="hide-sm">Save</span>`,onclick:()=>Ct()});I.hidden=!n;let H=m("a.itp-brand",{href:t.homeHref||"#",title:"Image-to-Pixel"},m("span.itp-mark",{"aria-hidden":"true"},...Array.from({length:9},()=>m("i"))),m("span.hide-sm",{text:"Image-to-Pixel"}));t.homeHref||H.addEventListener("click",u=>u.preventDefault());let T=m("header.itp-top",{},y,H,m("span.sep.hide-sm"),m("div.itp-file",{},f,p),m("div.spacer"),m("span.hide-sm.contents",{},b,M,m("span.sep")),v,k,x,m("span.sep.hide-sm"),m("span.hide-sm.contents",{},w,_),A,m("span",{style:{width:"6px"}}),I,P),O=t.samples===!1?null:m("div.samples",{},...oo.map(u=>m("button",{type:"button",title:`Try "${u.name}"`,"aria-label":`Open sample: ${u.name}`,onclick:()=>kt(u)},m("img",{src:qo(u),alt:""})))),D=m("div.itp-empty",{},m("div.itp-drop",{},m("h2",{text:"Drop an image or a video"}),m("p",{text:"PNG, JPG, WebP, GIF, SVG, MP4 or WebM. Add several files to process them as a batch. You can also paste with Ctrl+V."}),m("div.actions",{},m("button.itp-btn.primary",{type:"button",html:`${ie("upload")}<span>Choose files</span>`,onclick:()=>bt()}),m("button.itp-btn.outline",{type:"button",html:`${ie("clipboard")}<span>Paste</span>`,onclick:()=>yt()})),O?m("p",{style:{fontSize:"var(--fs-xs)",color:"var(--faint)"},text:"Or start from a sample"}):null,O)),F=m("div.itp-float.bl",{"aria-live":"polite"}),G=m("div.itp-busy.itp-float",{hidden:!0,style:{padding:"6px 10px",alignItems:"center",gap:"8px",fontSize:"var(--fs-xs)",color:"var(--muted)",display:"flex"}},m("span.itp-spinner"),m("span",{text:"Rendering"})),N=m("div.itp-float.br",{},h("zoomOut","Zoom out (-)",()=>c.zoomOut()),h("fit","Fit to view (F)",()=>c.fit()),h("zoomIn","Zoom in (+)",()=>c.zoomIn()));c.el.append(D,F,G,N);let ve=h("play","Play (Space)",()=>Y()),ke=m("span.itp-time",{}),fe=m("input.itp-scrub",{type:"range",min:0,max:1e3,value:0,"aria-label":"Video position"}),se=m("span.muted.num",{style:{fontSize:"var(--fs-xs)",whiteSpace:"nowrap"}}),de={muted:Rt("muted",!0)!==!1,volume:Number(Rt("volume",1))};de.volume>=0&&de.volume<=1||(de.volume=1);let ze=h("volumeOff","Volume (M mutes)",()=>pe(),{"aria-haspopup":"true","aria-expanded":"false"}),me=m("div.fill"),W=m("div.thumb"),V=m("div.itp-vslider",{role:"slider",tabindex:"0","aria-label":"Volume","aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},m("div.track",{},me,W)),Ce=m("span.num",{}),xe=m("div.itp-volpop",{hidden:!0},Ce,V),z=m("div.itp-sound",{hidden:!0},xe,ze),ge=u=>L(u<=.005?{muted:!0}:{muted:!1,volume:Math.min(1,u)}),be=u=>{let g=V.querySelector(".track").getBoundingClientRect();return Math.max(0,Math.min(1,(g.bottom-u.clientY)/g.height))};V.addEventListener("pointerdown",u=>{u.preventDefault(),V.focus(),V.setPointerCapture(u.pointerId);let g=de.muted?0:de.volume;ge(be(u));let S=q=>ge(be(q)),R=()=>{V.removeEventListener("pointermove",S),V.removeEventListener("pointerup",R),V.removeEventListener("pointercancel",R),de.muted&&g>0&&L({muted:!0,volume:g})};V.addEventListener("pointermove",S),V.addEventListener("pointerup",R),V.addEventListener("pointercancel",R)}),V.addEventListener("keydown",u=>{let g=de.muted?0:de.volume,S={ArrowUp:g+.05,ArrowRight:g+.05,ArrowDown:g-.05,ArrowLeft:g-.05,PageUp:g+.2,PageDown:g-.2,Home:0,End:1}[u.key];if(S===void 0){u.key==="Escape"&&(u.preventDefault(),pe(!1),ze.focus());return}u.preventDefault(),u.stopPropagation(),ge(S)}),V.addEventListener("wheel",u=>{u.preventDefault(),ge((de.muted?0:de.volume)-Math.sign(u.deltaY)*.05)},{passive:!1});function pe(u=xe.hidden){if(xe.hidden=!u,ze.setAttribute("aria-expanded",String(u)),u){let g=S=>{z.contains(S.target)||(pe(!1),document.removeEventListener("pointerdown",g,!0))};document.addEventListener("pointerdown",g,!0)}}let Se=m("div.itp-transport",{role:"group","aria-label":"Video"},h("stepBack","Previous frame (,)",()=>oe(-1)),ve,h("stepForward","Next frame (.)",()=>oe(1)),ke,fe,z,se),Ie=null;function Re(u){return u===Ie?!1:(Ie=u,l.setStats(u),!0)}let Ze=Qi(a),ce=Wi(a,{onModeChange:u=>{Ze.hide(),c.el.hidden=u,Se.hidden=u,v.disabled=k.disabled=u,u||(c.resize(),Ue()),Et()},onZoomChange:Et,onRangeChange:u=>l.setAnimationRange(u),onSelectionChange:u=>{l.setFrameSelectionState(u);let g=u.active?u.result:a.result;Re(g)&&g&&u.active&&l.sync(r.settings,g)},animationOptions:()=>l.animationOptions()});a.setFrameSelection=u=>ce.setMode(u),a.setFrameRange=(u,g)=>ce.setRange(u,g),a.setAnimationFps=u=>ce.setPlaybackFps(u),a.frameSelection=()=>ce.exportSelection();let Je=()=>ce.active?ce.currentResult():a.result,nt=m("main.itp-stage",{"data-video":"false"},c.el,ce.el,Se,ce.transport,Ze.el);Ze.bind(fe),Ze.bind(ce.range,{getFrame:ce.frameCanvas}),nt.addEventListener("pointerdown",()=>{o()&&Oe.dataset.lib==="open"&&C("lib")},!0);let Oe=m("div.itp.itp-app",{"data-lib":o()?"closed":Rt("lib","open"),"data-insp":Rt("insp","open")},T,s.el,nt,l.el);At(e,Oe),U(Rt("theme",null)),F.textContent="Starting\u2026";try{a.engine=await li()}catch(u){throw Q(`Could not start: ${u.message}`,{kind:"error"}),u}l.el.querySelector("#itp-backend").textContent=a.engine.backend==="webgl"?"GPU \xB7 ShaderMate":"CPU",l.el.querySelector("#itp-backend").title=a.engine.backend==="webgl"?`WebGL 2: ${a.engine.renderer}`:a.engine.fallbackReason||"CPU renderer",Promise.resolve().then(()=>(Ho(),Go)).then(u=>u.videoSupport()).then(u=>{a.videoSupport=u}).catch(()=>{});let Ye=!1,ot=!1,St=null,rt=document.createElement("canvas");function Ue(){Ye=!0,ot||requestAnimationFrame(We)}a.schedule=Ue;async function We(){if(ot||!Ye||a.exporting||ce.active)return;Ye=!1;let u=a.current;if(!u){a.result=null,c.clear(),qe();return}ot=!0;let g=setTimeout(()=>{G.hidden=!1},250);try{u.type==="video"&&a.engine.invalidate();let S=await a.engine.process(u.source,r.settings);if(u!==a.current||ce.active)return;a.result=S,S.toCanvas(1,{canvas:rt}),c.show(rt,u.source,S.crop),Re(S),l.sync(r.settings,S),St!==u&&(St=u),qe()}catch(S){console.error(S),Q(`Rendering failed: ${S.message}`,{kind:"error"})}finally{clearTimeout(g),G.hidden=!0,ot=!1,Ye&&requestAnimationFrame(We)}}function qe(){let u=a.result,g=a.current;if(f.textContent=g?g.name:"No image",p.textContent=g?g.type==="video"?`${g.width} \xD7 ${g.height}, ${Tn(g.duration)}`:`${g.width} \xD7 ${g.height}`:"",D.hidden=!!g,N.hidden=!g,!g||!u){F.hidden=!0;return}F.hidden=!1,At(F,m("span",{},m("b",{text:`${u.width} \xD7 ${u.height}`})," px"),m("span",{text:`${Math.round(c.zoom*100)/100}\xD7 zoom`})),b.disabled=!r.canUndo,M.disabled=!r.canRedo}function Et(){let u=ce.active?ce:c;x.querySelector("span").textContent=!a.current||u.fitted?"Fit":u.zoom>=1?`${Math.round(u.zoom*10)/10}\xD7`:`${Math.round(u.zoom*100)}%`,a.result&&qe()}r.subscribe((u,g)=>{let S=a.current;S&&S.own&&r.target===S.id?S.own=u:r.target==="shared"&&(a.shared=u),l.sync(u,Je()),b.disabled=!r.canUndo,M.disabled=!r.canRedo,g!=="preset"&&(a.activePreset=null),n&&Be(),s.tab==="palettes"&&s.refresh(),Ze.reset(),ce.refresh(),Ue()});let mt=null,Be=()=>{clearTimeout(mt),mt=setTimeout(()=>_t("settings",a.shared),300)};async function gt(u,g,S){let R=document.createElement("canvas"),q=72/Math.max(g,S);R.width=Math.max(1,Math.round(g*q)),R.height=Math.max(1,Math.round(S*q));try{R.getContext("2d").drawImage(u,0,0,R.width,R.height)}catch{}return R.toDataURL()}async function Fe(u,g,S=null){let R=g.naturalWidth||g.width,q=g.naturalHeight||g.height,Z={id:crypto.randomUUID?.()||String(Math.random()),name:u,type:"image",source:g,width:R,height:q,file:S};return Z.thumb=await gt(g,R,q),a.items.push(Z),Z}async function Ge(u,g){let S=m("video",{muted:!0,playsInline:!0,preload:"auto",crossOrigin:"anonymous"});S.muted=!0,S.src=URL.createObjectURL(g);try{await Vt(S)}catch(q){if(URL.revokeObjectURL(S.src),q.code===3||q.code===4){let Z=await yi(g).catch(()=>""),ne=Z==="H.264"?"WebM (VP9)":Z==="VP9"?"H.264 MP4":"H.264 MP4 or WebM (VP9)",Ee=new Error(Z?`it's ${Z}, which this browser can't play. Re-save it as ${ne}, or open the editor in a browser that plays ${Z}.`:`this browser can't play this video's format. Re-save it as ${ne}.`);throw Ee.code=q.code,Ee}throw q}let R={id:crypto.randomUUID?.()||String(Math.random()),name:u,type:"video",source:S,width:S.videoWidth,height:S.videoHeight,duration:S.duration,fps:30,file:g};return await zt(S,Math.min(.05,S.duration/2)).catch(()=>{}),R.thumb=await gt(S,R.width,R.height),a.items.push(R),R.fpsReady=Hn(S,30).catch(()=>30).then(q=>{R.fps=q,R.fpsReady=null,a.current===R&&Ke(),l.syncAnim()}),xi(g).then(q=>{R.hasAudio=q,a.current===R&&Ke()}),S.addEventListener("timeupdate",()=>{a.current===R&&Ke()}),S.addEventListener("play",()=>{a.current===R&&(Ke(),$(R))}),S.addEventListener("pause",()=>{a.current===R&&(Ke(),Ue())}),S.addEventListener("seeked",()=>{a.current===R&&!a.exporting&&Ue()}),S.addEventListener("ended",()=>{a.current!==R||a.exporting||R.fpsReady||ce.active||(S.currentTime=0,S.play().catch(()=>{}))}),R}async function st(u){let g=[],S=[],R=[];for(let ne of u)Ic.test(ne.name)&&!/^image|^video/.test(ne.type)?/\.json$/i.test(ne.name)?R.push(ne):S.push(ne):(ia.test(ne.type)||aa.test(ne.type)||/\.(png|jpe?g|gif|webp|bmp|svg|avif|mp4|webm|mov)$/i.test(ne.name))&&g.push(ne);for(let ne of S)await ye(ne);for(let ne of R){let Ee=await ne.text();try{let _e=JSON.parse(Ee);_e.colors||Array.isArray(_e)?await ye(ne,Ee):(r.replace(uo(_e)),Q(`Loaded settings from ${ne.name}`,{kind:"ok"}))}catch(_e){Q(`${ne.name}: ${_e.message}`,{kind:"error"})}}let q=null,Z=g.length>2?Q(`Loading ${g.length} files`,{progress:!0}):null;for(let ne=0;ne<g.length;ne++){let Ee=g[ne];try{let _e;if(aa.test(Ee.type)||/\.(mp4|webm|mov)$/i.test(Ee.name))_e=await Ge(Ee.name,Ee);else{let Mt;try{Mt=await createImageBitmap(Ee)}catch{Mt=new Image,Mt.src=URL.createObjectURL(Ee),await Mt.decode()}_e=await Fe(Ee.name,Mt,Ee)}q||(q=_e)}catch(_e){Q(`${Ee.name} could not be opened: ${_e.message}`,{kind:"error"})}Z?.progress((ne+1)/g.length)}Z?.close(),q&&He(q),s.refresh(),g.length>1&&Q(`Added ${g.length} files. They share one set of settings.`,{kind:"ok"})}a.addFiles=st;async function bt(){let u=await jn({accept:"image/*,video/*,.gpl,.hex,.pal,.txt,.json",multiple:!0});u.length&&st(u)}a.openFiles=bt;async function kt(u){let g=await ea(u),S=await Fe(`${u.name}.svg`,g,new File([u.svg],`${u.name}.svg`,{type:"image/svg+xml"}));He(S),s.refresh()}async function yt(){try{let u=await navigator.clipboard.read(),g=[];for(let S of u)for(let R of S.types)if(ia.test(R)){let q=await S.getType(R);g.push(new File([q],`pasted-${new Date().toISOString().slice(11,19).replace(/:/g,"")}.${R.split("/")[1]}`,{type:R}))}g.length?st(g):Q("The clipboard has no image",{kind:"error"})}catch{Q("Press Ctrl+V (\u2318V) to paste. The browser blocked direct clipboard access.")}}a.pasteFromClipboard=yt;function He(u){a.current&&a.current.type==="video"&&a.current!==u&&a.current.source.pause(),a.current=u,Ze.reset(),ce.setItem(u),ct(u),nt.dataset.video=String(u&&u.type==="video"),u&&u.type==="video"&&Ke(),c.clear(),a.result=null,c.picking&&te(),s.refresh(),s.sourceChanged(),Ue(),qe()}a.select=He;function It(u){let g=a.items.indexOf(u);g<0||(a.items.splice(g,1),r.dropTarget(u.id),u.type==="video"&&(u.source.pause(),URL.revokeObjectURL(u.source.src)),u.source.close&&!a.items.some(S=>S.source===u.source)&&u.source.close(),a.current===u&&He(a.items[Math.min(g,a.items.length-1)]||null),s.refresh(),l.sync(r.settings,Je()))}a.removeItem=It,a.clearItems=()=>{for(let u of a.items.slice())It(u)};let De=u=>u===a.current?r.settings:u&&u.own||a.shared;a.settingsFor=De;let $e=u=>JSON.parse(JSON.stringify(u));function ct(u,g=!1){let S=u&&u.own?u.id:"shared";r.target===S&&!g||r.setTarget(S,S==="shared"?a.shared:u.own)}function Qe(u,g,{quiet:S=!1}={}){if(!(!u||!!u.own===g)){if(g)u.own=$e(De(u)),u===a.current&&ct(u),S||Q(`${u.name} now has its own settings. Changes no longer affect other files.`);else{let R=u.own;u.own=null,r.dropTarget(u.id),u===a.current&&ct(u),S||Q(`${u.name} uses the shared settings again`,{action:{label:"Undo",onClick:()=>{u.own=R,u===a.current&&ct(u),je()}}})}je()}}function je(){s.refresh();let u=Je();l.sync(r.settings,u),u&&Re(u),Ue()}a.setOwn=Qe,a.copySettings=u=>{a.clipboard=$e(De(u)),Q(`Copied the settings of ${u.name}`,{timeout:1800}),s.refresh()},a.pasteSettings=u=>{a.clipboard&&(u.own||Qe(u,!0,{quiet:!0}),u===a.current?r.replace(a.clipboard,"paste"):u.own=$e(a.clipboard),Q(`Pasted settings onto ${u.name}`,{kind:"ok",timeout:1800}),je())},a.applyToAll=u=>{let g={shared:a.shared,own:new Map(a.items.map(S=>[S,S.own]))};a.shared=$e(De(u));for(let S of a.items)S.own&&r.dropTarget(S.id),S.own=null;r.setTarget("shared",a.shared),n&&Be(),Q(`Every file now uses the settings of ${u.name}`,{action:{label:"Undo",onClick:()=>{a.shared=g.shared;for(let[S,R]of g.own)S.own=R;ct(a.current,!0),je()}}}),je()},a.duplicate=async u=>{let g;u.type==="video"?g=await Ge(lt(u.name),u.file):g=await Fe(lt(u.name),u.source,u.file),a.items.splice(a.items.indexOf(g),1),a.items.splice(a.items.indexOf(u)+1,0,g),g.own=$e(De(u)),He(g),Q(`Duplicated ${u.name}. The copy has its own settings.`,{timeout:2400})};let lt=u=>{let g=/^(.*?)(\.[^.]*)?$/.exec(u);return`${g[1]} copy${g[2]||""}`};a.move=(u,g)=>{let S=a.items.indexOf(u),R=S+g;S<0||R<0||R>=a.items.length||([a.items[S],a.items[R]]=[a.items[R],a.items[S]],s.refresh(),(document.activeElement===document.body||document.activeElement?.closest?.(".itp-files"))&&s.focusFile(u))};let Ve=u=>{let g=/^(.*?)(\.[^.\s]{1,5})?$/.exec(u);return[g[1],g[2]||""]};a.rename=(u,g)=>{let[,S]=Ve(u.name),R=String(g||"").trim().replace(/[\\/:*?"<>|]+/g,"-");S&&R.toLowerCase().endsWith(S.toLowerCase())&&(R=R.slice(0,-S.length)),!(!R||R+S===u.name)&&(u.name=R+S,s.refresh(),qe())};function Ne(u){if(!u||f.hidden)return;a.current!==u&&He(u);let[g]=Ve(u.name),S=m("input.itp-name-input",{type:"text",value:u.name,"aria-label":"File name",spellcheck:!1});S.style.width=`${Math.min(40,Math.max(12,u.name.length+2))}ch`,f.hidden=!0,f.after(S),S.focus(),S.setSelectionRange(0,g.length);let R=!1,q=Z=>{R||(R=!0,Z&&a.rename(u,S.value),S.remove(),f.hidden=!1)};S.addEventListener("keydown",Z=>{Z.stopPropagation(),Z.key==="Enter"&&(Z.preventDefault(),q(!0)),Z.key==="Escape"&&(Z.preventDefault(),q(!1))}),S.addEventListener("blur",()=>q(!0))}a.startRename=Ne;let it=null;a.savedWorkspace=()=>it;async function xt(u){if(u.file)return u.file;let g=document.createElement("canvas");return g.width=u.width,g.height=u.height,g.getContext("2d").drawImage(u.source,0,0),new Promise(S=>g.toBlob(R=>S(R),"image/png"))}async function Ct(){if(n){if(!a.items.length){if(it){await Lt();return}Q("Add files first, then Save keeps them here for next time.");return}I.disabled=!0;try{let u=[];for(let R of a.items)u.push({name:R.name,type:R.type,file:await xt(R),own:R.own?$e(R.own):null});let g=await ta({shared:$e(a.shared),current:Math.max(0,a.items.indexOf(a.current)),items:u}),S=!it;it={count:u.length,bytes:g,savedAt:Date.now()},s.refresh(),Q(S?`Saved ${u.length} file${u.length===1?"":"s"} (${Zo(g)}) in this browser only. They reopen next time; remove them with Forget in the Files list.`:`Saved ${u.length} file${u.length===1?"":"s"} (${Zo(g)})`,{kind:"ok",timeout:S?7e3:2200})}catch(u){console.error(u),Q(ra(u)?"Not enough browser storage to save these files. Remove some (videos are large) and try again.":`Couldn't save: ${u.message}`,{kind:"error"})}finally{I.disabled=!1}}}a.saveWorkspace=Ct;async function Lt(){try{await oa()}catch(u){Q(`Couldn't remove the saved files: ${u.message}`,{kind:"error"});return}it=null,s.refresh(),Q("Removed the saved files from this browser. Files open now stay open.")}a.forgetWorkspace=Lt;async function ut(){let u=await na();if(!u)return;if(it={count:u.items.length,bytes:u.items.reduce((q,Z)=>q+(Z.file?Z.file.size:0),0),savedAt:u.savedAt},a.items.length||!u.items.length){s.refresh();return}u.shared&&!/[#&]s=/.test(location.hash)&&r.setTarget("shared",u.shared);let g=u.items.length>2?Q(`Opening ${u.items.length} saved files`,{progress:!0}):null,S=[];for(let q=0;q<u.items.length;q++){let Z=u.items[q];try{let ne=Z.file instanceof File?Z.file:new File([Z.file],Z.name,{type:Z.file.type}),Ee;if(Z.type==="video")Ee=await Ge(Z.name,ne);else{let _e;try{_e=await createImageBitmap(ne)}catch{_e=new Image,_e.src=URL.createObjectURL(ne),await _e.decode()}Ee=await Fe(Z.name,_e,ne)}Ee.own=Z.own||null,S.push(Ee)}catch(ne){console.warn("[workspace] skipped",Z.name,ne)}g?.progress((q+1)/u.items.length)}g?.close();let R=S[Math.min(u.current||0,S.length-1)];R&&He(R),s.refresh(),S.length&&Q(`Reopened your saved files (${S.length})`,{timeout:2200})}function Ke(){let u=a.current;if(!u||u.type!=="video")return;let g=u.source;ve.innerHTML=ie(g.paused?"play":"pause"),ve.setAttribute("aria-label",g.paused?"Play (Space)":"Pause (Space)");let S=Math.floor(g.currentTime*u.fps+1e-6);ke.innerHTML=`${Tn(g.currentTime)} <span>/ ${Tn(g.duration)}</span>`,ke.title=`Frame ${S}`,fe.value=String(Math.round(g.currentTime/(g.duration||1)*1e3)),fe.style.setProperty("--p",`${fe.value/10}%`),se.textContent=`${u.fps} fps`,z.hidden=u.hasAudio===!1,dt(g)}function dt(u){u&&!a.exporting&&!a.current?.fpsReady&&(u.muted!==de.muted&&(u.muted=de.muted),u.volume!==de.volume&&(u.volume=de.volume));let g=de.muted?0:de.volume,S=Math.round(g*100);ze.innerHTML=ie(g?"volume":"volumeOff");let R=g?`Volume ${S}% (M mutes)`:"Muted (M unmutes)";ze.setAttribute("aria-label",R),ze.title=R,V.setAttribute("aria-valuenow",String(S)),V.setAttribute("aria-valuetext",g?`${S}%`:"Muted"),V.style.setProperty("--v",`${S}%`),Ce.textContent=g?String(S):"Off"}function L(u){Object.assign(de,u),u.muted===!1&&!de.volume&&(de.volume=1),_t("muted",de.muted),_t("volume",de.volume),dt(a.current&&a.current.type==="video"?a.current.source:null)}function $(u){let g=u.source,S=()=>{g.paused||a.current!==u||(Ue(),"requestVideoFrameCallback"in g?g.requestVideoFrameCallback(S):requestAnimationFrame(S))};S()}async function Y(){let u=a.current;if(!(!u||u.type!=="video")){if(ce.active){ce.toggleAnimation();return}if(!u.source.paused){u.source.pause();return}u.fpsReady&&await u.fpsReady,!(a.current!==u||ce.active)&&(dt(u.source),u.source.ended&&(u.source.currentTime=0),u.source.play().catch(g=>Q(g.message,{kind:"error"})))}}function oe(u){let g=a.current;if(!g||g.type!=="video"||ce.active)return;let S=g.source;S.pause();let R=Math.floor(S.currentTime*g.fps+1e-6)+u;zt(S,(Math.max(0,R)+.5)/g.fps).then(()=>{Ke(),Ue()})}fe.addEventListener("input",()=>{let u=a.current;!u||u.type!=="video"||(u.source.currentTime=fe.value/1e3*u.source.duration)});function he(u){if(ce.active)return;let g=u??!c.compare;c.setCompare(g),v.setAttribute("aria-pressed",String(g))}function ae(u){if(ce.active)return;let g=u??!c.grid;c.setGrid(g),k.setAttribute("aria-pressed",String(g)),g&&c.zoom<6&&a.result&&Q("The grid shows from 6\xD7 zoom")}function Le(u){let g=ce.active?ce:c;vn(u,[{label:ce.active?"Fit canvas to view":"Fit to view",kbd:"F",icon:"fit",onClick:()=>g.fit()},"sep",...[1,2,4,8,16,32].map(S=>({label:`${S}\xD7`,sub:S===1&&!ce.active?"One screen pixel per pixel":null,onClick:()=>g.zoomTo(S)})),"sep",{label:"Zoom in",kbd:"+",icon:"zoomIn",onClick:()=>g.zoomStep(1)},{label:"Zoom out",kbd:"-",icon:"zoomOut",onClick:()=>g.zoomStep(-1)}])}function C(u){let g=u==="lib"?"lib":"insp",S=Oe.dataset[g]!=="open";Oe.dataset[g]=S?"open":"closed",(!o()||u==="insp")&&_t(g,Oe.dataset[g]),requestAnimationFrame(()=>c.resize())}function U(u){u?document.documentElement.dataset.theme=u:delete document.documentElement.dataset.theme;let g=u?u==="dark":!matchMedia("(prefers-color-scheme: light)").matches;w.innerHTML=ie(g?"sun":"moon"),w.setAttribute("aria-label",g?"Switch to light theme (T)":"Switch to dark theme (T)"),c.redraw()}function B(){let g=(document.documentElement.dataset.theme||(matchMedia("(prefers-color-scheme: light)").matches?"light":"dark"))==="dark"?"light":"dark";_t("theme",g),U(g)}function K(u,g=4096){let S=u.width,R=u.height,q=Math.min(1,g/Math.max(S,R)),Z=document.createElement("canvas");Z.width=Math.round(S*q),Z.height=Math.round(R*q);let ne=Z.getContext("2d",{willReadFrequently:!0});return ne.drawImage(u.source,0,0,Z.width,Z.height),ne.getImageData(0,0,Z.width,Z.height)}function re(u,g){let S=a.current;if(!S)return;let R=K(S,1024),q=a.result?a.result.crop:{x:0,y:0,w:1,h:1},Z=Math.min(R.width-1,Math.floor((q.x+u*q.w)*R.width)),Ee=(Math.min(R.height-1,Math.floor((q.y+g*q.h)*R.height))*R.width+Z)*4,_e=qt([R.data[Ee],R.data[Ee+1],R.data[Ee+2]]),Mt=r.settings,Jo=Mt.palette.source==="custom"?Mt.palette.colors:[];if(Jo.includes(_e))return Q(`${_e} is already in the palette`);r.update({palette:{source:"custom",name:Mt.palette.source==="custom"?Mt.palette.name:"Picked",colors:[...Jo,_e]}}),Q(`Added ${_e}`,{kind:"ok",timeout:1500})}let j=null;function te(u){u&&(j=u);let g=!c.picking;c.setPicking(g),j?.setAttribute("aria-pressed",String(g)),g&&(he(!0),Q("Click the image to add colours. Press Esc when done."))}a.togglePicker=te;function le(u){u.id&&!u.custom?r.update({palette:{source:"builtin",id:u.id}}):r.update({palette:{source:"custom",name:u.name,colors:u.colors}})}a.usePalette=le;function Ae(u,g){let S=a.userPalettes.filter(R=>R.name!==u);S.unshift({name:u,colors:g,custom:!0}),a.userPalettes=S.slice(0,100),n&&_t("palettes",a.userPalettes),s.tab==="palettes"&&s.refresh()}async function ye(u,g){try{let S=Co(g??await u.text(),u.name);Ae(S.name||"Imported",S.colors),r.update({palette:{source:"custom",name:S.name||"Imported",colors:S.colors}}),Q(`Imported "${S.name}" (${S.colors.length} colours)`,{kind:"ok"})}catch(S){Q(`${u.name}: ${S.message}`,{kind:"error"})}}a.importPalette=async()=>{let[u]=await jn({accept:".gpl,.hex,.pal,.txt,.json"});u&&ye(u)},a.savePalette=()=>{let u=r.settings,g=u.palette.source==="extract"?a.result?.palette||[]:u.palette.colors;if(!g.length)return Q("There is no palette to save",{kind:"error"});let S=m("input.itp-input",{value:u.palette.source==="custom"?u.palette.name:`${u.palette.name} copy`,"aria-label":"Palette name"}),R=m("select.itp-select",{"aria-label":"Also download as"},m("option",{value:"",text:"Don't download"}),m("option",{value:"gpl",text:".gpl (GIMP, Aseprite)"}),m("option",{value:"hex",text:".hex (Lospec)"}),m("option",{value:"json",text:".json"}));En("Save palette",[m("div.itp-field",{},m("div.lab",{},m("span",{text:"Name"})),S),m("div.itp-field",{},m("div.lab",{},m("span",{text:"Also download as"})),R),m("div.itp-strip",{style:{height:"18px"}},...g.map(q=>m("i",{style:{background:q}})))],{actions:[{label:"Cancel"},{label:"Save",primary:!0,onClick:()=>{let q=S.value.trim()||"Palette";Ae(q,g),r.update({palette:{source:"custom",name:q,colors:g}});let Z=q.replace(/[^\w-]+/g,"-").toLowerCase();R.value==="gpl"&&vt(di(q,g),`${Z}.gpl`,"text/plain"),R.value==="hex"&&vt(fi(g),`${Z}.hex`,"text/plain"),R.value==="json"&&vt(pi(q,g),`${Z}.json`,"application/json"),Q(`Saved "${q}" to Your palettes`,{kind:"ok"})}}]}),S.select()},a.deletePalette=u=>{a.userPalettes=a.userPalettes.filter(g=>g!==u),n&&_t("palettes",a.userPalettes),s.refresh(),Q(`Deleted "${u.name}"`,{action:{label:"Undo",onClick:()=>Ae(u.name,u.colors)}})},a.lospecDialog=()=>{let u=m("input.itp-input",{placeholder:"e.g. rgbg-36 or a lospec.com palette URL","aria-label":"Lospec slug or URL"}),g=m("div.help",{text:"Looks the palette up on lospec.com. Needs an internet connection."}),S=En("Palette from Lospec",[m("div.itp-field",{},m("div.lab",{},m("span",{text:"Slug or URL"})),u,g)],{actions:[{label:"Cancel"},{label:"Fetch",primary:!0,onClick:async()=>{g.textContent="Fetching\u2026",g.style.color="";try{let R=await hi(u.value);return Ae(R.name,R.colors),r.update({palette:{source:"custom",name:R.name,colors:R.colors}}),Q(`Loaded "${R.name}" from Lospec`,{kind:"ok"}),!0}catch(R){return g.textContent=R.message,g.style.color="var(--danger)",!1}}}]});u.addEventListener("keydown",R=>{R.key==="Enter"&&S.querySelector("footer .primary").click()}),u.focus()},a.detectGrid=()=>{let u=a.current;if(!u||u.type!=="image")return Q("Open an image first",{kind:"error"});let g=si(K(u));if(g<=1)return Q("No pixel grid found. This image doesn't look upscaled.");r.update({size:{mode:"block",block:g,resample:"nearest"}}),Q(`Found ${g} px blocks: switched to pixel size ${g} with nearest sampling`,{kind:"ok"})},a.settingsJSON=()=>an(r.settings),a.copyLink=async()=>{let u=`${location.origin}${location.pathname}#s=${co(r.settings)}`;try{await navigator.clipboard.writeText(u),Q("Link copied. It holds the settings, not the image.",{kind:"ok"})}catch{En("Share link",[m("textarea.itp-input",{rows:3,readOnly:!0,value:u})])}history.replaceState(null,"",`#s=${co(r.settings)}`)},a.saveSettingsFile=()=>vt(an(r.settings),"image-to-pixel-settings.json","application/json"),a.loadSettingsFile=async()=>{let[u]=await jn({accept:".json,application/json"});if(u)try{r.replace(uo(await u.text())),Q(`Loaded ${u.name}`,{kind:"ok"})}catch(g){Q(`${u.name}: ${g.message}`,{kind:"error"})}},a.resetSettings=()=>{r.replace(Dt()),Q("Settings reset",{action:{label:"Undo",onClick:()=>r.undo()}})},a.applyPreset=u=>{r.replace(Ht(Dt(),{...u.settings,export:r.settings.export}),"preset"),a.activePreset=u.id,s.refresh()},Object.assign(a,d);function we(u){let g=a.current,S=g&&g.type==="video",R=a.items.filter(Ee=>Ee.type==="image").length,q=r.settings,Z=ce.active,ne=Z?"Turn off frame selection first":null;vn(u,[{group:"Image"},{label:"PNG",sub:ne||(a.result?`${a.result.width*q.export.scale} \xD7 ${a.result.height*q.export.scale}, ${q.export.scale}\xD7 scale`:"Open an image first"),icon:"image",kbd:"Ctrl S",disabled:!a.result||Z,onClick:()=>a.exportPNG()},{label:"Copy to clipboard",sub:ne,icon:"copy",disabled:!a.result||Z,onClick:()=>a.copyImage()},{label:a.items.length>1?`All ${a.items.length} files as ZIP`:"All files as ZIP",sub:a.items.length>1?null:"Add two or more files",icon:"zip",disabled:a.items.length<2,onClick:()=>a.exportZip()},{group:"Animation"},{label:S?"GIF from this video":"GIF from all images",icon:"gif",disabled:!S&&R<2,onClick:()=>a.exportAnimation({...Te(),format:"gif"})},{label:"More formats\u2026",sub:"WebM, MP4, PNG sequence, sprite sheet",icon:"film",onClick:()=>{l.setTab("export"),Oe.dataset.insp!=="open"&&C("insp")}},{group:"Other"},{label:"Tileset",sub:ne||"16 \xD7 16 tiles, duplicates removed",icon:"tiles",disabled:!a.result||Z,onClick:()=>a.exportTileset({tile:16,flips:!1})},{label:"Copy settings link",icon:"link",onClick:()=>a.copyLink()},{label:"Settings as JSON",icon:"braces",onClick:()=>a.saveSettingsFile()}])}let Te=()=>{let u=a.current,g=u&&u.type==="video";return{source:g?"video":"files",fps:g?Math.min(30,Math.round(u.fps||12)):8,start:0,end:g?u.duration:0}};function E(){En("Keyboard shortcuts",[m("div.itp-keys",{},...[["Open files","Ctrl O"],["Paste image","Ctrl V"],["Export PNG","Ctrl S"],["Undo","Ctrl Z"],["Redo","Ctrl Shift Z"],["Compare","C"],["Pixel grid","G"],["Fit","F"],["Zoom in / out","+ -"],["Pixel width \xB11","[ ]"],["Pixel width \xB18","Shift [ ]"],["Next / previous dither","D Shift D"],["Play / pause video","Space"],["Mute / unmute video","M"],["Rename file","F2"],["Step one frame",", ."],["Library","\\"],["Inspector","/"],["Theme","T"],["Next / previous file","Alt \u2193 \u2191"],["Move file down / up","Alt Shift \u2193 \u2191"],["This list","?"]].map(([g,S])=>m("div",{},m("span",{text:g}),m("span",{},...S.split(" ").filter(Boolean).map(R=>m("kbd",{text:R}))))))])}let X=u=>u.target.closest('input, select, textarea, [contenteditable="true"]')&&!(u.target.type==="range"||u.target.type==="checkbox"),ue=["none","bayer4","bayer8","bluenoise","cluster4","floyd-steinberg","atkinson","sierra-lite","jarvis"];window.addEventListener("keydown",u=>{if(!Oe.isConnected||document.querySelector("dialog[open]"))return;let g=u.ctrlKey||u.metaKey,S=u.key;if(g&&S.toLowerCase()==="z"){if(X(u))return;u.preventDefault(),u.shiftKey?r.redo():r.undo();return}if(g&&S.toLowerCase()==="y"){if(X(u))return;u.preventDefault(),r.redo();return}if(g&&S.toLowerCase()==="s"){u.preventDefault(),a.exportPNG();return}if(g&&S.toLowerCase()==="o"){u.preventDefault(),bt();return}if(g||u.altKey&&!["ArrowUp","ArrowDown"].includes(S))return;if(X(u)){S==="Escape"&&u.target.blur();return}let R=r.settings;switch(S){case"c":case"C":he();break;case"g":case"G":ae();break;case"f":case"F":ce.active?ce.fit():c.fit();break;case"+":case"=":ce.active?ce.zoomStep(1):c.zoomIn();break;case"-":case"_":ce.active?ce.zoomStep(-1):c.zoomOut();break;case"t":case"T":B();break;case"\\":C("lib");break;case"/":C("insp");break;case"?":E();break;case"[":case"{":r.update({size:{mode:"width",width:Math.max(8,R.size.width-(u.shiftKey?8:1))}},{key:"kw"});break;case"]":case"}":r.update({size:{mode:"width",width:R.size.width+(u.shiftKey?8:1)}},{key:"kw"});break;case"d":case"D":{let q=ue.indexOf(R.dither.method),Z=ue[(q+(u.shiftKey?-1:1)+ue.length)%ue.length];r.update({dither:{method:Z}}),Q(Z==="none"?"No dither":Z.replace(/-/g," "),{timeout:900});break}case" ":if(u.target.closest("button"))break;a.current?.type==="video"&&(u.preventDefault(),Y());break;case"F2":a.current&&(u.preventDefault(),Ne(a.current));break;case"m":case"M":a.current?.type==="video"&&!z.hidden&&(u.preventDefault(),L({muted:!de.muted}));break;case",":oe(-1);break;case".":oe(1);break;case"Escape":c.picking?te():nn();break;case"ArrowDown":case"ArrowUp":if(u.altKey&&u.shiftKey&&a.current){u.preventDefault(),a.move(a.current,S==="ArrowDown"?1:-1);break}if(u.altKey&&a.items.length>1){u.preventDefault();let q=a.items.indexOf(a.current);He(a.items[(q+(S==="ArrowDown"?1:-1)+a.items.length)%a.items.length])}break;default:return}});let Me=0;return Oe.addEventListener("dragenter",u=>{[...u.dataTransfer.types].includes("Files")&&(Me++,Oe.classList.add("itp-dragging"))}),Oe.addEventListener("dragleave",()=>{--Me<=0&&(Me=0,Oe.classList.remove("itp-dragging"))}),Oe.addEventListener("dragover",u=>{[...u.dataTransfer.types].includes("Files")&&u.preventDefault()}),Oe.addEventListener("drop",u=>{u.preventDefault(),Me=0,Oe.classList.remove("itp-dragging"),u.dataTransfer.files.length&&st([...u.dataTransfer.files])}),window.addEventListener("paste",u=>{if(!Oe.isConnected||X(u))return;let g=[...u.clipboardData?.files||[]];if(g.length){u.preventDefault(),st(g);return}let S=u.clipboardData?.getData("text")||"";if(/#?[0-9a-f]{6}/i.test(S)&&/\n|,|\s/.test(S.trim()))try{let R=Co(S);r.update({palette:{source:"custom",name:"Pasted",colors:R.colors}}),Q(`Pasted a ${R.colors.length}-colour palette`,{kind:"ok"})}catch{}}),window.addEventListener("hashchange",()=>{if(/[#&]s=/.test(location.hash))try{r.replace(lo(location.hash))}catch{}}),l.sync(r.settings,null),s.refresh(),qe(),b.disabled=M.disabled=!0,n&&t.restore!==!1&&ut().catch(u=>console.warn("[workspace]",u)),{app:a,store:r,addFiles:st,async addImage(u,g="image"){let S=await Fe(g,u);return He(S),s.refresh(),S},openSample:u=>kt(oo.find(g=>g.id===u)||oo[0]),applyPreset:u=>{let g=yn.find(S=>S.id===u);g&&a.applyPreset(g)},setTheme:u=>{_t("theme",u),U(u)},get result(){return a.result},get view(){return c.rect},async idle(){for(let u=0;u<200&&(Ye||ot);u++)await new Promise(g=>setTimeout(g,25))}}}export{oo as SAMPLES,pd as mountEditor};
|
|
372
372
|
/*! Bundled license information:
|
|
373
373
|
|
|
374
374
|
shadermate/dist/shadermate.esm.js:
|