asciify-engine 4.8.0 → 4.10.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 +19 -3
- package/dist/animation-presets-DhswE0D_.d.cts +105 -0
- package/dist/animation-presets-ZujFF3i8.d.ts +105 -0
- package/dist/core.cjs +1 -1
- package/dist/core.d.cts +4 -4
- package/dist/core.d.ts +4 -4
- package/dist/core.js +1 -1
- package/dist/{hover-catalog-BeIkNwhH.d.cts → hover-catalog-D85jh6dR.d.cts} +40 -1
- package/dist/{hover-catalog-BeIkNwhH.d.ts → hover-catalog-D85jh6dR.d.ts} +40 -1
- package/dist/hover.cjs +1 -1
- package/dist/hover.d.cts +4 -3
- package/dist/hover.d.ts +4 -3
- package/dist/hover.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +1 -1
- package/dist/{model-CMKdRB30.d.ts → model-BVeBDUa9.d.ts} +46 -3
- package/dist/{model-fP9NdG-w.d.cts → model-DQNOpbbG.d.cts} +46 -3
- package/dist/studio.cjs +1 -1
- package/dist/studio.d.cts +4 -3
- package/dist/studio.d.ts +4 -3
- package/dist/studio.js +1 -1
- package/dist/{types-C05AfrjT.d.ts → types-CM4452nD.d.ts} +1 -1
- package/dist/{types-D38BMBRB.d.cts → types-FkqhgDYx.d.cts} +1 -1
- package/examples/living-image.ts +15 -0
- package/examples/print-composition.ts +15 -0
- package/package.json +4 -2
- package/skills/asciify-engine/SKILL.md +10 -4
- package/skills/asciify-engine/references/print-styles.md +63 -0
- package/skills/asciify-engine/references/studio-effects.md +29 -0
- package/skills/asciify-engine/references/studio-workspace.md +11 -3
- package/skills/asciify-engine/references/upgrading.md +8 -0
package/dist/core.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var t={standard:{label:"Classic ASCII",chars:" .:-=+*#%@"},asciify:{label:"Asciify",chars:" .:-=+ASCIIFY#@"},minimal:{label:"Minimal",chars:" .:+"},detailed:{label:"Detailed",chars:" .,:;i1tfLCG08@"},letters:{label:"Letters",chars:" .ilLCFTYASMW"},technical:{label:"Technical",chars:" .:;>_/[{}]=+*#@$"},blocks:{label:"Tonal blocks",chars:" ░▒▓█"},braille:{label:"Braille",chars:" ⠁⠃⠇⡇⣇⣧⣷⣿"}},e={dracula:{name:"Dracula",accent:"#bd93f9",bg:"#282a36",fg:"#f8f8f2"},monokai:{name:"Monokai",accent:"#a6e22e",bg:"#272822",fg:"#f8f8f2"},nord:{name:"Nord",accent:"#88c0d0",bg:"#2e3440",fg:"#eceff4"},catppuccin:{name:"Catppuccin",accent:"#cba6f7",bg:"#1e1e2e",fg:"#cdd6f4"},solarized:{name:"Solarized",accent:"#268bd2",bg:"#002b36",fg:"#839496"},gruvbox:{name:"Gruvbox",accent:"#b8bb26",bg:"#282828",fg:"#ebdbb2"}},n={fontSize:7,charSpacing:1,brightness:0,contrast:0,charset:t.standard.chars,colorMode:"grayscale",accentColor:"#d4ff00",invert:!1,renderMode:"ascii",animationStyle:"none",animationSpeed:1,dotSizeRatio:.8,ditherStrength:0,charAspect:.55,normalize:!1,hoverStrength:0,hoverRadius:.2,hoverEffect:"spotlight",hoverColor:"#ffffff",hoverShape:"circle",hoverText:"ASCIIFY",artStyle:"classic",fineDither:!1,customText:"",chromaKey:null,chromaKeyTolerance:60,chromaKeyTrimPadding:.002,chromaKeyTrimLuminanceThreshold:0,chromaKeyTrimMode:"range"},o={none:{label:"Off",options:{hoverStrength:0,hoverEffect:"spotlight",hoverRadius:.2,hoverColor:"#ffffff"}},subtle:{label:"Subtle",options:{hoverStrength:.25,hoverEffect:"glow",hoverRadius:.12,hoverColor:"#ffffff"}},flashlight:{label:"Flashlight",options:{hoverStrength:.6,hoverEffect:"spotlight",hoverRadius:.15,hoverColor:"#fffbe6"}},magnifier:{label:"Magnifier",options:{hoverStrength:.7,hoverEffect:"magnify",hoverRadius:.12,hoverColor:"#ffffff"}},forceField:{label:"Force Field",options:{hoverStrength:.7,hoverEffect:"repel",hoverRadius:.15,hoverColor:"#a0e8ff"}},neon:{label:"Neon",options:{hoverStrength:.6,hoverEffect:"colorShift",hoverRadius:.15,hoverColor:"#d946ef"}},fire:{label:"Fire",options:{hoverStrength:.7,hoverEffect:"spotlight",hoverRadius:.15,hoverColor:"#ff6b2b"}},ice:{label:"Ice",options:{hoverStrength:.5,hoverEffect:"glow",hoverRadius:.15,hoverColor:"#60d5f7"}},gravity:{label:"Gravity",options:{hoverStrength:.7,hoverEffect:"attract",hoverRadius:.18,hoverColor:"#a5d6ff"}},shatter:{label:"Shatter",options:{hoverStrength:.8,hoverEffect:"shatter",hoverRadius:.14,hoverColor:"#ff6090"}},ghost:{label:"Fluid trail",options:{hoverStrength:.55,hoverEffect:"trail",hoverRadius:.2,hoverColor:"#b39ddb"}},glitchReveal:{label:"Glitch Reveal",options:{hoverStrength:.8,hoverEffect:"glitchText",hoverRadius:.18,hoverColor:"#a3e635"}}},r=[{value:"none",mode:"none",group:"Still",label:"Off",description:"Keep the image still. Hover stays available."},{value:"caustics",mode:"caustics",group:"Light and texture",label:"Caustics",description:"Soft ribbons of light travel across a stationary character grid."},{value:"current",mode:"current",group:"Flow and depth",label:"Slow Current",description:"A gentle flow through the image, with steady edges."},{value:"reform",mode:"reform",group:"Rebuild",label:"Reveal & Reform",description:"Disperse, gather, then hold the complete image."},{value:"sheen",mode:"sheen",group:"Light and texture",label:"Sheen",description:"A broad diagonal light sweep; characters stay anchored."},{value:"tidal",mode:"tidal",group:"Flow and depth",label:"Tidal Rings",description:"Concentric currents travel outward, with protected edges."},{value:"grain",mode:"grain",group:"Light and texture",label:"Living Grain",description:"Slow, individually phased tonal changes on a stationary grid."},{value:"parallax",mode:"parallax",group:"Flow and depth",label:"Parallax",description:"A shallow, continuous drift through the image, with the edges held in place."},{value:"weave",mode:"weave",group:"Flow and depth",label:"Woven Flow",description:"Interlaced bands move in opposing directions, like a flexible printed fabric."},{value:"print",mode:"print",group:"Rebuild",label:"Print Shift",description:"Staggered rows lift, soften and register back into the image."},{value:"trace",mode:"trace",group:"Light and texture",label:"Contour Light",description:"Light follows the source image’s tonal contours; every character stays anchored."}];var a=t=>Math.max(0,Math.min(1,t)),i=(t,e,n)=>{const o=a((n-t)/(e-t));return o*o*(3-2*o)},s=(t,e)=>{const n=(.06711056*t+.00583715*e)%1*52.9829189;return n-Math.floor(n)};function c(t,e,n,o,r,c=.5){if(r[0]=r[1]=r[2]=0,r[3]=1,"none"===t)return r;const l=o*Math.PI/6,h=i(0,.12,Math.min(e,1-e,n,1-n));if("caustics"===t){const t=Math.sin(9*e+5*n+l)+Math.sin(8*n-3*e-l),o=Math.pow(Math.max(0,1-.72*Math.abs(t)),3);r[2]=(.22*o-.045)*h}else if("current"===t)r[0]=Math.sin(9*n+l)*Math.cos(7*e-l)*10*h,r[1]=Math.cos(8*e+l)*Math.sin(6*n-l)*7*h;else if("sheen"===t)r[2]=.2*Math.pow(.5+.5*Math.cos(5*e+3*n-l),8)-.025;else if("tidal"===t){const t=e-.5,o=n-.5,a=Math.hypot(t,o),i=Math.sin(22*a-l)*h;r[0]=t*i*9,r[1]=o*i*9,r[2]=.035*i}else if("grain"===t){const t=s(Math.floor(160*e),Math.floor(100*n))*Math.PI*2;r[2]=.07*Math.sin(l+t)}else if("parallax"===t){const t=.45+.55*Math.max(0,1-1.4*Math.hypot(e-.5,n-.5));r[0]=12*Math.sin(l)*t*h,r[1]=6*(Math.cos(l)-1)*t*h}else if("weave"===t)r[0]=Math.sin(n*Math.PI*6+l)*Math.sin(l)*8*h,r[1]=Math.sin(e*Math.PI*6-l)*Math.sin(l)*6*h;else if("print"===t){const t=Math.floor(24*n),e=((o+3*s(t,3))%12+12)%12,a=i(1,2.5,e)*(1-i(3.5,5,e));r[0]=Math.sin(2.4*t)*a*9*h,r[1]=5*-a*h,r[2]=.22*-a,r[3]=1-.45*a}else if("trace"===t){const t=.5+.5*Math.cos(l);r[2]=.22*Math.pow(Math.max(0,1-Math.abs(a(c)-t)/.16),3)-.015}else if("reform"===t){const t=(o%12+12)%12,a=s(Math.floor(160*e),Math.floor(100*n)),c=.65*e+.2*n+.15*a+.08*Math.sin(8*e-5*n),d=i(1.8+1.2*c,3.8+1.2*c,t)*(1-i(5+1.7*c,7.2+1.7*c,t));r[0]=Math.sin(9*n+l)*d*(1-d)*24*h,r[1]=-d*(1-d)*(8+12*a)*h,r[2]=.45*-d,r[3]=1-.9*d}return r}function l(t,e){const n=document.createElement("canvas");n.width=t,n.height=e;const o=n.getContext("2d",{willReadFrequently:!0});return{canvas:n,ctx:o}}function h(t,e,n){let o=t+255*e;return o=259*(255*n+255)/(255*(259-255*n))*(o-128)+128,Math.max(0,Math.min(255,o))}function d(t,e,n,o,r,a){if((a?1-t/255:t/255)<.12)return" ";const i=[...e];return i[(o*r+n)%i.length]}var f=[[0,8,2,10],[12,4,14,6],[3,11,1,9],[15,7,13,5]];function m(t,e,n,o){if(o<=0)return t;const r=(f[n%4][e%4]/16-.5)*o*128;return Math.max(0,Math.min(255,t+r))}var u=new Array(256),g=new Array(256);for(let t=0;t<256;t++)u[t]=`rgb(${t},${t},${t})`,g[t]=`rgb(0,${t},0)`;function p(t,e,n,o,r,a=!1){switch(e){case"fullcolor":return`rgb(${t.r},${t.g},${t.b})`;case"matrix":return g[.299*t.r+.587*t.g+.114*t.b|0];case"accent":return`rgb(${n},${o},${r})`;default:{const e=.299*t.r+.587*t.g+.114*t.b|0;return u[e]}}}var M=[0,0,0];function v(t,e,n,o,r,a=!1){switch(e){case"fullcolor":M[0]=t.r,M[1]=t.g,M[2]=t.b;break;case"matrix":{const e=.299*t.r+.587*t.g+.114*t.b|0;M[0]=0,M[1]=e,M[2]=0;break}case"accent":M[0]=n,M[1]=o,M[2]=r;break;default:{const e=.299*t.r+.587*t.g+.114*t.b|0;M[0]=e,M[1]=e,M[2]=e;break}}return M}function w(t){const e=t.match(/rgba?\(\s*(\d+)\s*[,\s]\s*(\d+)\s*[,\s]\s*(\d+)(?:\s*[,/]\s*([\d.]+))?\s*\)/);return e?{r:+e[1],g:+e[2],b:+e[3],a:void 0!==e[4]?+e[4]:1}:null}function y(t){let e=t;for(;e&&e!==document.documentElement.parentElement;){const t=getComputedStyle(e).backgroundColor;if(t&&"transparent"!==t&&"rgba(0, 0, 0, 0)"!==t){const e=w(t);if(e&&e.a>.1)return e}e=e.parentElement}return null}function x(t){if(t){const e=y(t);if(e){return(.299*e.r+.587*e.g+.114*e.b)/255<.4}}if("undefined"!=typeof document){const t=document.documentElement,e=(t.getAttribute("data-theme")||"").toLowerCase();if("dark"===e)return!0;if("light"===e)return!1;if(t.classList.contains("dark"))return!0;if(document.body){const t=y(document.body);if(t){return(.299*t.r+.587*t.g+.114*t.b)/255<.4}}}return"undefined"!=typeof window&&window.matchMedia("(prefers-color-scheme: dark)").matches}function b(t){if("string"!=typeof t)return t;const e=document.createElement("canvas");e.width=1,e.height=1;const n=e.getContext("2d");n.fillStyle=t,n.fillRect(0,0,1,1);const o=n.getImageData(0,0,1,1).data;return{r:o[0],g:o[1],b:o[2]}}function S(t){return t*t*(3-2*t)}var E={scale:1,offsetX:0,offsetY:0,glow:0,colorBlend:0,proximity:0};function C(t,e,n,o,r,a,i,s,c="spotlight",l=.5,h="circle",d=[],f=1){const m=(t-n)*Math.max(1,f),u=(e-o)*Math.max(1,1/f),g=.08+.35*l+.04*a;let p,M;if("box"===h){const t=Math.abs(m),e=Math.abs(u);p=Math.max(t,e),M=g}else p=Math.sqrt(m*m+u*u),M=g;if(p>=M&&("trail"!==c||0===d.length))return E.scale=1,E.offsetX=0,E.offsetY=0,E.glow=0,E.colorBlend=0,E.proximity=0,E;const v=S(Math.max(0,1-p/M))*r;let w=1,y=0,x=0,b=0,C=0;switch(c){case"spotlight":{w=1+v*a*1.8;const t=Math.atan2(u,m),e=v*v*a*.6;y=Math.cos(t)*e*i,x=Math.sin(t)*e*s,b=v*a*.4,C=v*v*a*.25;break}case"magnify":w=1+v*a*.85,b=v*a*.15;break;case"repel":{w=1;const t=Math.atan2(u,m),e=v*v*a*1.8;y=Math.cos(t)*e*i,x=Math.sin(t)*e*s;break}case"glow":b=v*a*.8,C=v*a*.4;break;case"colorShift":w=1,b=v*a*.12,C=v*a;break;case"attract":{const t=Math.atan2(u,m),e=v*v*a*1;y=(.45*-Math.cos(t)-1.6*Math.sin(t))*e*i,x=(.45*-Math.sin(t)+1.6*Math.cos(t))*e*s,b=v*a*.3;break}case"shatter":{const t=Math.atan2(u,m),e=.5*Math.sin(43.7*m+29.3*u),n=v*a*1.4*(.7+.3*e);y=Math.cos(t+e)*n*i,x=Math.sin(t+e)*n*s,w=Math.max(.1,1-v*a*.6),b=v*a*.25;break}case"trail":{let n=v,o=-u*v,r=m*v;for(const a of d){const i=(t-a.x)*Math.max(1,f),s=(e-a.y)*Math.max(1,1/f),c=Math.hypot(i,s)/g;if(c>=1)continue;const l=S(1-c)*a.intensity;n=Math.max(n,l),o+=(.35*a.vx-2*s)*l*.35,r+=(.35*a.vy+2*i)*l*.35}y=Math.tanh(2*o)*a*i*3,x=Math.tanh(2*r)*a*s*3,C=n*a*.65,b=n*a*.35,w=1+n*a*.08,E.proximity=n;break}case"glitchText":w=1,b=v*a*.5,C=v*a*.6}return E.scale=w,E.offsetX=y,E.offsetY=x,E.glow=b,E.colorBlend=C,"trail"!==c&&(E.proximity=v),E}function T(t,e,{continuous:n=!1,interactive:o=!1}={}){const r=t.parentElement??t;let a=null,i=0,s=!1,c=!0,l=!0,h=-1/0;const d=window.matchMedia("(prefers-reduced-motion: reduce)"),f=()=>{l=!0,s||!c||document.hidden||i||(i=requestAnimationFrame(m))},m=t=>{if(i=0,s||!c||document.hidden)return;const o=!d.matches&&(n||t-h<1500);(l||o)&&(e(t,d.matches?null:a),l=!1),o&&(i=requestAnimationFrame(m))},u=e=>{if("touch"===e.pointerType)return;const n=t.getBoundingClientRect();if(!n.width||!n.height)return;const o=(e.clientX-n.left)/n.width,r=(e.clientY-n.top)/n.height;a=o>=0&&o<=1&&r>=0&&r<=1?{x:o,y:r}:null,h=performance.now(),f()},g=()=>{a=null,h=performance.now(),f()},p=()=>{document.hidden&&i?(cancelAnimationFrame(i),i=0):f()},M="undefined"==typeof IntersectionObserver?null:new IntersectionObserver(([t])=>{c=t.isIntersecting,c?f():i&&(cancelAnimationFrame(i),i=0)});return M?.observe(t),o&&(r.addEventListener("pointermove",u),r.addEventListener("pointerleave",g)),document.addEventListener("visibilitychange",p),d.addEventListener("change",f),f(),{wake:f,stop:()=>{s=!0,cancelAnimationFrame(i),M?.disconnect(),r.removeEventListener("pointermove",u),r.removeEventListener("pointerleave",g),document.removeEventListener("visibilitychange",p),d.removeEventListener("change",f)}}}var A=null,F=null;function L(t,e){if(!A||!F){const n=l(t,e);A=n.canvas,F=n.ctx}return A.width!==t&&(A.width=t),A.height!==e&&(A.height=e),F}var I=new Map,R=new Map,k=new WeakMap;function H(t){const e=Intl.Segmenter;return e?Array.from(new e(void 0,{granularity:"grapheme"}).segment(t),({segment:t})=>t):[...t]}function W(t){let e=I.get(t);return e||(e=H(t),I.set(t,e)),e}function $(t){return H(t)}function P(t,e,n){const o=n?1-t/255:t/255,r=Math.floor(o*(e.length-1));return e[Math.max(0,Math.min(e.length-1,r))]??" "}function j(t,e,n,o){const r=`${t}\0${e?1:0}\0${n}\0${o}`;let a=R.get(r);if(!a){const i=W(t);a=new Array(256);for(let t=0;t<256;t++)a[t]=P(h(t,n,o),i,e);R.set(r,a)}return a}function z(){I.clear(),R.clear(),J=new WeakMap,Z=new WeakMap,Q=new WeakMap,A=null,F=null}function O(t,e){return"auto"!==t?t:!x(e)}function q(t){const e=t.match(/^#([0-9a-fA-F]{3,6})$/);if(e){let t=e[1];if(3===t.length&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),6===t.length)return t}const n=t.match(/rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/);return n?[n[1],n[2],n[3]].map(t=>parseInt(t).toString(16).padStart(2,"0")).join(""):null}function B(t){const e=t||"auto";if("auto"!==e)return q(e)??"ffffff";if("undefined"!=typeof document){const t=getComputedStyle(document.documentElement);for(const e of["--accent-color","--color-accent","--accent","--color-primary","--primary","--brand-color"]){const n=q(t.getPropertyValue(e).trim());if(n)return n}const e=q(getComputedStyle(document.body).accentColor??"");if(e)return e}return x("undefined"!=typeof document?document.body:null)?"faf9f7":"0d0d0d"}function V(t,e,n){return Math.max(e,Math.min(n,t))}function D(t,e,n){if(!t)return{x:0,y:0,width:e,height:n};const o=t.unit??"percent",r=!1!==t.preserveAspect,a=t=>void 0===t?void 0:"percent"===o?t*e:t,i=t=>void 0===t?void 0:"percent"===o?t*n:t,s=V(a(t.left)??0,0,e-1),c=V(a(t.right)??0,0,e-s-1),l=V(i(t.top)??0,0,n-1),h=V(i(t.bottom)??0,0,n-l-1),d=void 0!==t.left||void 0!==t.right||void 0!==t.top||void 0!==t.bottom,f=Math.max(1,e-s-c),m=Math.max(1,n-l-h),u=d?f:a(t.width),g=d?m:i(t.height);let p=u??e,M=g??n;if(r&&!d){const t=p/e,o=M/n,r=Math.min(t,o),a=void 0===u?o:void 0===g?t:r;p=e*a,M=n*a}p=V(p,1,d?f:e),M=V(M,1,d?m:n);const v=t.anchor??"center",w=a(t.x),y=i(t.y),x=d?s:0,b=d?l:0,S=d?f:e,E=d?m:n,C=v.endsWith("left")||"left"===v?0:v.endsWith("right")||"right"===v?S-p:(S-p)/2,T=v.startsWith("top")||"top"===v?0:v.startsWith("bottom")||"bottom"===v?E-M:(E-M)/2;return{x:V(w??x+C,0,Math.max(0,e-p)),y:V(y??b+T,0,Math.max(0,n-M)),width:p,height:M}}function K(t,e,n,o){const r=t instanceof HTMLVideoElement?t.videoWidth:t.width,a=t instanceof HTMLVideoElement?t.videoHeight:t.height;if(0===r||0===a)return{frame:[],cols:0,rows:0};const i=e.charAspect,s=e.fontSize*e.charSpacing,c=e.fontSize/i*e.charSpacing,l=n||r,f=o||a,u=Math.floor(l/s),g=Math.floor(f/c);if(u<=0||g<=0)return{frame:[],cols:0,rows:0};const p=D(e.sourceCrop,r,a),M=Math.max(1,Math.min(Math.floor(2048/u),Math.floor(p.width/u))),v=Math.max(1,Math.min(Math.floor(2048/g),Math.floor(p.height/g))),w=u*M,y=g*v,x=L(w,y),S=x.globalCompositeOperation;x.globalCompositeOperation="copy";try{x.drawImage(t,p.x,p.y,p.width,p.height,0,0,w,y)}finally{x.globalCompositeOperation=S}const E=x.getImageData(0,0,w,y).data,C=e.chromaKey,T=null!=C&&!1!==C,A=!0===C,F="blue-screen"===C;let I=null,R=0;!T||A||F||(I=b(C),R=(e.chromaKeyTolerance??60)**2);let k=0,H=255;if(e.normalize){let t=255,e=0;for(let n=0;n<E.length;n+=4){if(T){const t=E[n],e=E[n+1],o=E[n+2];let r=!1;if(A)r=e>1.4*t&&e>1.4*o&&e>80;else if(F)r=o>1.4*t&&o>1.4*e&&o>80;else if(null!==I){const n=t-I.r,a=e-I.g,i=o-I.b;r=n*n+a*a+i*i<=R}if(r)continue}const o=.299*E[n]+.587*E[n+1]+.114*E[n+2];o<t&&(t=o),o>e&&(e=o)}k=t,H=e>t?e-t:255}const $=[],z=O(e.invert),q=T&&e.charset.replace(/ /g,"")||e.charset,B=W(q),V=e.customText?null:j(q,z,e.brightness,e.contrast),K=M*v;for(let t=0;t<g;t++){const n=[];for(let o=0;o<u;o++){let r=0,a=0,i=0,s=0,c=0;for(let e=0;e<v;e++){const n=(t*v+e)*w;for(let t=0;t<M;t++){const e=4*(n+o*M+t),l=E[e],h=E[e+1],d=E[e+2],f=E[e+3];if(T){let t=!1;if(A)t=h>1.4*l&&h>1.4*d&&h>80;else if(F)t=d>1.4*l&&d>1.4*h&&d>80;else if(null!==I){const e=l-I.r,n=h-I.g,o=d-I.b;t=e*e+n*n+o*o<=R}if(t){c++;continue}}r+=l,a+=h,i+=d,s+=f}}if(T&&c>K/2){n.push({char:" ",r:0,g:0,b:0,a:0});continue}const l=K-c,f=l>0?r/l:0,g=l>0?a/l:0,p=l>0?i/l:0,y=l>0?s/l:0,x=.299*f+.587*g+.114*p,b=e.normalize?(x-k)/H*255:x,S=h(b,e.brightness,e.contrast),C=e.ditherStrength>0?m(S,o,t,e.ditherStrength):S,L=e.customText?d(C,e.customText,o,t,u,z):e.ditherStrength>0?P(C,B,z):V[Math.max(0,Math.min(255,0|b))];n.push({char:L,r:f,g:g,b:p,a:y,lum:C})}$.push(n)}return{frame:$,cols:u,rows:g}}function N(t,e,n,o){const r=t instanceof HTMLVideoElement?t.videoWidth:t.width,a=t instanceof HTMLVideoElement?t.videoHeight:t.height;if(0===r||0===a)return{rows:[],cols:0,rowCount:0};const i=e.charAspect,s=e.fontSize*e.charSpacing,c=e.fontSize/i*e.charSpacing,l=n||r,d=o||a,f=Math.floor(l/s),u=Math.floor(d/c);if(f<=0||u<=0)return{rows:[],cols:0,rowCount:0};const g=f,p=u,M=L(g,p),v=D(e.sourceCrop,r,a),w=M.globalCompositeOperation;M.globalCompositeOperation="copy";try{M.drawImage(t,v.x,v.y,v.width,v.height,0,0,g,p)}finally{M.globalCompositeOperation=w}const y=M.getImageData(0,0,g,p).data,x=e.chromaKey,S=null!=x&&!1!==x,E=!0===x,C="blue-screen"===x;let T=null,A=0;!S||E||C||(T=b(x),A=(e.chromaKeyTolerance??60)**2);let F=0,I=255;if(e.normalize){let t=255,e=0;for(let n=0;n<y.length;n+=4){if(S){const t=y[n],e=y[n+1],o=y[n+2];let r=!1;if(E)r=e>1.4*t&&e>1.4*o&&e>80;else if(C)r=o>1.4*t&&o>1.4*e&&o>80;else if(null!==T){const n=t-T.r,a=e-T.g,i=o-T.b;r=n*n+a*a+i*i<=A}if(r)continue}const o=.299*y[n]+.587*y[n+1]+.114*y[n+2];o<t&&(t=o),o>e&&(e=o)}F=t,I=e>t?e-t:255}const R=O(e.invert),k=S&&e.charset.replace(/ /g,"")||e.charset,H=W(k),$=e.customText?null:j(k,R,e.brightness,e.contrast),z=e.customText?W(e.customText):null,q="fullcolor"===e.colorMode?new Uint8ClampedArray(f*u*4):void 0,B=[];for(let t=0;t<u;t++){let n="";for(let o=0;o<f;o++){const r=4*(t*g+o),a=r,i=y[r],s=y[r+1],c=y[r+2],l=y[r+3];if(S){let t=!1;if(E)t=s>1.4*i&&s>1.4*c&&s>80;else if(C)t=c>1.4*i&&c>1.4*s&&c>80;else if(null!==T){const e=i-T.r,n=s-T.g,o=c-T.b;t=e*e+n*n+o*o<=A}if(t){n+=" ",q&&(q[a]=0,q[a+1]=0,q[a+2]=0,q[a+3]=0);continue}}q&&(q[a]=i,q[a+1]=s,q[a+2]=c,q[a+3]=l);const d=.299*i+.587*s+.114*c,u=e.normalize?(d-F)/I*255:d,p=e.ditherStrength>0||z?h(u,e.brightness,e.contrast):u,M=e.ditherStrength>0?m(p,o,t,e.ditherStrength):p;if(z){n+=(R?1-M/255:M/255)<.12?" ":z[(t*f+o)%z.length]}else e.ditherStrength<=0?n+=$[Math.max(0,Math.min(255,0|u))]:n+=P(M,H,R)}B.push(n)}return{rows:B,cols:f,rowCount:u,colors:q}}function U(t,e,n,o,r){if(0===e.rows.length)return;const a=t.canvas,i=Boolean(n.chromaKey)||e.rows.some(t=>t.includes(" "));i||(k.delete(t),t.clearRect(0,0,o,r),t.fillStyle=x(a)?"#0a0a0a":"#faf9f7",t.fillRect(0,0,o,r));const s=B(n.accentColor),c=parseInt(s.substring(0,2),16),l=parseInt(s.substring(2,4),16),h=parseInt(s.substring(4,6),16),d=o/e.cols,f=r/e.rowCount,m=.9*Math.min(d/.55,f),u=e.colors;if("fullcolor"===n.colorMode&&u){k.delete(t),t.clearRect(0,0,o,r),t.font=`${m}px "JetBrains Mono", monospace`,t.textAlign="left",t.textBaseline="middle",t.globalAlpha=1;let n="";for(let o=0;o<e.rows.length;o++){const r=$(e.rows[o]);let a=0;for(;a<e.cols;){for(;a<e.cols&&" "===r[a];)a++;if(a>=e.cols)break;const i=a,s=4*(o*e.cols+a),c=240&u[s],l=240&u[s+1],h=240&u[s+2];for(a++;a<e.cols&&" "!==r[a];){const t=4*(o*e.cols+a);if((240&u[t])!==c||(240&u[t+1])!==l||(240&u[t+2])!==h)break;a++}const m=`rgb(${c},${l},${h})`;m!==n&&(t.fillStyle=m,n=m),t.fillText(r.slice(i,a).join(""),i*d+.5*d,o*f+.5*f)}}return void(t.globalAlpha=1)}t.font=`${m}px "JetBrains Mono", monospace`,t.textAlign="left",t.textBaseline="middle";const g="matrix"===n.colorMode?"rgb(0,255,0)":"grayscale"===n.colorMode?x(a)?"rgb(230,230,230)":"rgb(24,24,24)":`rgb(${c},${l},${h})`;t.fillStyle=g,t.globalAlpha=1;const p=k.get(t),M=i&&p&&p.cols===e.cols&&p.rowCount===e.rowCount&&p.canvasWidth===o&&p.canvasHeight===r&&p.fillStyle===g;M||t.clearRect(0,0,o,r);for(let n=0;n<e.rows.length;n++){const r=e.rows[n];M&&p.rows[n]===r||(M&&t.clearRect(0,n*f,o,f+1),0!==r.trim().length&&t.fillText(r,.5*d,n*f+.5*f))}k.set(t,{rows:e.rows.slice(),cols:e.cols,rowCount:e.rowCount,canvasWidth:o,canvasHeight:r,fillStyle:g}),t.globalAlpha=1}async function Y(t,e,n,o,r=12,a=10,i,s=0){const c=Math.min(t.duration-s,a),l=Math.ceil(c*r),h=[];let d=0,f=0;for(let a=0;a<l;a++){const m=s+a/r;if(m>s+c)break;t.currentTime=m,await new Promise(e=>{const n=()=>{t.removeEventListener("seeked",n),e()};t.addEventListener("seeked",n)});const u=K(t,e,n,o);h.push(u.frame),d=u.cols,f=u.rows,i?.((a+1)/l)}return{frames:h,cols:d,rows:f,fps:r}}async function G(t,e,n,o,r=12,a=10,i,s=0){const c=Math.min(t.duration-s,a),l=Math.ceil(c*r),h=[];let d=0,f=0;for(let a=0;a<l;a++){const m=s+a/r;if(m>s+c)break;t.currentTime=m,await new Promise(e=>{const n=()=>{t.removeEventListener("seeked",n),e()};t.addEventListener("seeked",n)});const u=N(t,e,n,o);h.push(u),d=u.cols,f=u.rowCount,i?.((a+1)/l)}return{frames:h,cols:d,rows:f,fps:r}}async function X(t,e,n,o,r){const{parseGIF:a,decompressFrames:i}=await import("gifuct-js"),s=a(t),c=i(s,!0);if(0===c.length)return{frames:[],cols:0,rows:0,fps:10};const l=c[0].dims.width,h=c[0].dims.height,d=s.lsd?.width||l,f=s.lsd?.height||h,m=document.createElement("canvas");m.width=d,m.height=f;const u=m.getContext("2d"),g=document.createElement("canvas");g.width=d,g.height=f;const p=g.getContext("2d"),M=document.createElement("canvas"),v=M.getContext("2d"),w=[];let y=0,x=0,b=0;for(const t of c)b+=t.delay||100;const S=b/c.length,E=Math.round(Math.min(30,Math.max(5,1e3/S))),C=Math.min(c.length,300);for(let t=0;t<C;t++){const a=c[t],{dims:i,patch:s,disposalType:l}=a;3===l&&(p.clearRect(0,0,d,f),p.drawImage(m,0,0)),M.width!==i.width&&(M.width=i.width),M.height!==i.height&&(M.height=i.height);const h=new ImageData(new Uint8ClampedArray(s.buffer),i.width,i.height);v.putImageData(h,0,0),u.drawImage(M,i.left||0,i.top||0);const b=K(m,e,n,o);w.push(b.frame),y=b.cols,x=b.rows,2===l?u.clearRect(i.left||0,i.top||0,i.width,i.height):3===l&&(u.clearRect(0,0,d,f),u.drawImage(g,0,0)),r?.((t+1)/C)}return{frames:w,cols:y,rows:x,fps:E}}async function _(t,e,n,o,r){const{parseGIF:a,decompressFrames:i}=await import("gifuct-js"),s=a(t),c=i(s,!0);if(0===c.length)return{frames:[],cols:0,rows:0,fps:10};const l=c[0].dims.width,h=c[0].dims.height,d=s.lsd?.width||l,f=s.lsd?.height||h,m=document.createElement("canvas");m.width=d,m.height=f;const u=m.getContext("2d"),g=document.createElement("canvas");g.width=d,g.height=f;const p=g.getContext("2d"),M=document.createElement("canvas"),v=M.getContext("2d"),w=[];let y=0,x=0,b=0;for(const t of c)b+=t.delay||100;const S=b/c.length,E=Math.round(Math.min(30,Math.max(5,1e3/S))),C=Math.min(c.length,300);for(let t=0;t<C;t++){const a=c[t],{dims:i,patch:s,disposalType:l}=a;3===l&&(p.clearRect(0,0,d,f),p.drawImage(m,0,0)),M.width!==i.width&&(M.width=i.width),M.height!==i.height&&(M.height=i.height);const h=new ImageData(new Uint8ClampedArray(s.buffer),i.width,i.height);v.putImageData(h,0,0),u.drawImage(M,i.left||0,i.top||0);const b=N(m,e,n,o);w.push(b),y=b.cols,x=b.rowCount,2===l?u.clearRect(i.left||0,i.top||0,i.width,i.height):3===l&&(u.clearRect(0,0,d,f),u.drawImage(g,0,0)),r?.((t+1)/C)}return{frames:w,cols:y,rows:x,fps:E}}var J=new WeakMap,Q=new WeakMap,Z=new WeakMap;function tt(t,e,n,o,r,a=0,i){if(!e.length||!e[0].length||o<=0||r<=0)return;let s=null;if(n.hoverStrength>0){let e=J.get(t);e||(e={x:.5,y:.5,intensity:0,time:-1,emittedAt:-1,points:[]},J.set(t,e)),s=function(t,e,n){const o=t.time<0?1/60:Math.max(0,Math.min(.1,(n-t.time)/1e3));t.time=n;const r=t.intensity<.003,a=t.x,i=t.y;if(e){r&&(t.x=e.x,t.y=e.y);const n=1-Math.exp(-o/.055);t.x+=(e.x-t.x)*n,t.y+=(e.y-t.y)*n}t.intensity+=((e?.intensity??(e?1:0))-t.intensity)*(1-Math.exp(-o/(e?.09:.18)));const s=Math.exp(-o/.22);for(const e of t.points)e.intensity*=s;for(;t.points.length&&t.points[0].intensity<.01;)t.points.shift();return e&&!r&&n-t.emittedAt>=24&&Math.hypot(t.x-a,t.y-i)>5e-4&&(t.points.push({x:t.x,y:t.y,intensity:t.intensity,vx:Math.max(-1,Math.min(1,(t.x-a)/Math.max(o,.001))),vy:Math.max(-1,Math.min(1,(t.y-i)/Math.max(o,.001)))}),t.points.length>12&&t.points.shift(),t.emittedAt=n),!e&&t.intensity<.003&&!t.points.length?(t.intensity=0,null):{x:t.x,y:t.y,intensity:t.intensity,trail:t.points}}(e,i??null,performance.now())}else J.delete(t);if("none"!==n.animationStyle||n.charsetFrames?.length||n.hoverStrength<=0)return Z.delete(t),void et(t,e,n,o,r,a,s);const c=Q.get(t);if(c?.frame!==e)return Q.set(t,{frame:e,since:performance.now()}),Z.delete(t),void et(t,e,n,o,r,a,s);if(performance.now()-c.since<100)return void et(t,e,n,o,r,a,s);const l=t.getTransform();if(l.b||l.c||l.a<=0||l.d<=0)return void et(t,e,n,o,r,a,s);if(!s||(s.intensity??0)<.003)return void et(t,e,n,o,r,a,null);const h=x(t.canvas),d={...n,accentColor:"#"+B(n.accentColor)},f=JSON.stringify([d,o,r,l.a,l.d,h,void 0!==document.fonts?document.fonts.status:"loaded"]);let m=Z.get(t);if(!m||m.frame!==e||m.key!==f){const n=m?.canvas??document.createElement("canvas");n.width=Math.ceil(o*l.a),n.height=Math.ceil(r*l.d);const a=n.getContext("2d");a.setTransform(l.a,0,0,l.d,0,0),et(a,e,d,o,r,0,null,void 0,h),m={frame:e,key:f,canvas:n},Z.set(t,m)}if(t.clearRect(0,0,o,r),t.drawImage(m.canvas,0,0,o,r),!s||(s.intensity??0)<.003)return;const u=e.length,g=e[0].length,p=.08+.35*n.hoverRadius+.04*n.hoverStrength,M="trail"===n.hoverEffect?[s,...s.trail??[]]:[s];let v=1,w=1,y=0,b=0;for(const t of M)v=Math.min(v,t.x-p),y=Math.max(y,t.x+p),w=Math.min(w,t.y-p),b=Math.max(b,t.y+p);if("glitchText"===n.hoverEffect){const t=n.hoverText,e=Math.max(1,...(Array.isArray(t)?t:[t]).map(t=>t.length));v=Math.min(v,s.x-e/g),y=Math.max(y,s.x+e/g)}const S=Math.ceil(5+4*n.hoverStrength),E={x:Math.max(0,Math.floor(v*g)-S),y:Math.max(0,Math.floor(w*u)-S),right:Math.min(g,Math.ceil(y*g)+S),bottom:Math.min(u,Math.ceil(b*u)+S)};t.save(),t.beginPath(),t.rect(E.x*o/g,E.y*r/u,(E.right-E.x)*o/g,(E.bottom-E.y)*r/u),t.clip(),et(t,e,d,o,r,a,s,E,h),t.restore()}function et(t,e,n,o,a,i=0,s,l,h){const d=e.length;if(0===d)return;const f=e[0].length;t.clearRect(0,0,o,a);let m=!1;const u=Math.max(1,d>>2),g=Math.max(1,f>>2);t:for(let t=0;t<d;t+=u){const n=e[t];for(let t=0;t<f;t+=g)if(n[t].a<200){m=!0;break t}}const M=t.canvas,w=h??x(M);m||(t.fillStyle=w?"#0a0a0a":"#faf9f7",t.fillRect(0,0,o,a));const y=o/f,b=a/d,S=s?.intensity??1,E=!!(s&&n.hoverStrength>0&&S>.005),T="#"+(q(n.hoverColor||"#ffffff")??"ffffff"),A=parseInt(T.slice(1,3),16),F=parseInt(T.slice(3,5),16),L=parseInt(T.slice(5,7),16),I=B(n.accentColor),R=parseInt(I.substring(0,2),16),k=parseInt(I.substring(2,4),16),H=parseInt(I.substring(4,6),16),$=n.hoverRadius;let j=0,z=f,V=0,D=d,K=0,N=0;if(E&&s){K=s.x,N=s.y;const t=.08+.35*$+.04*n.hoverStrength;j=Math.max(0,Math.floor((K-t)*f)-1),z=Math.min(f,Math.ceil((K+t)*f)+1),V=Math.max(0,Math.floor((N-t)*d)-1),D=Math.min(d,Math.ceil((N+t)*d)+1)}if(E&&"trail"===n.hoverEffect)for(const t of s?.trail??[]){const e=.08+.35*$+.04*n.hoverStrength;j=Math.min(j,Math.max(0,Math.floor((t.x-e)*f)-1)),z=Math.max(z,Math.min(f,Math.ceil((t.x+e)*f)+1)),V=Math.min(V,Math.max(0,Math.floor((t.y-e)*d)-1)),D=Math.max(D,Math.min(d,Math.ceil((t.y+e)*d)+1))}const U=n.animationStyle,Y=n.animationSpeed,G=(X=U,r.find(t=>t.value===X||t.mode===X)?.mode??"none");var X;const _="none"===G,J=[0,0,0,1],Q=n.hoverStrength,Z=n.hoverEffect,tt=$,et=n.hoverShape||"circle",nt=O(n.invert,M),ot=n.colorMode,rt=2*Math.PI,at=1/f,it=1/d;let st="",ct=-1;if("dots"===n.renderMode){const r=.5*Math.min(y,b)*n.dotSizeRatio;for(let n=l?.y??0;n<(l?.bottom??d);n++){const h=e[n];for(let e=l?.x??0;e<(l?.right??f);e++){const l=h[e];if(l.a<10)continue;const m=.00392156863*(.299*l.r+.587*l.g+.114*l.b),u=nt?1-m:m;if(u<.02)continue;_||c(G,e/f,n/d,i*Y,J,(.299*l.r+.587*l.g+.114*l.b)/255);const g=Math.max(0,Math.min(1,(1+J[2])*J[3]));let M=1,w=0,x=0,T=0,I=0;if(E&&e>=j&&e<=z&&n>=V&&n<=D){const t=C(e*at,n*it,K,N,S,Q,y,b,Z,tt,et,s?.trail,o/a);M=t.scale,w=t.offsetX,x=t.offsetY,T=t.glow,I=t.colorBlend}const W=r*u*g*M;if(W<.3)continue;const $=e*y+.5*y+w+J[0],P=n*b+.5*b+x+J[1];let O;if(I>0){const t=v(l,ot,R,k,H,nt);O=`rgb(${Math.min(255,t[0]+(A-t[0])*I|0)},${Math.min(255,t[1]+(F-t[1])*I|0)},${Math.min(255,t[2]+(L-t[2])*I|0)})`}else O=p(l,ot,R,k,H,nt);const q=Math.min(1,.00392156863*l.a*g*(1+T));if(q!==ct&&(t.globalAlpha=q,ct=q),O!==st&&(t.fillStyle=O,st=O),W<=3){const e=2*W;t.fillRect($-W,P-W,e,e)}else t.beginPath(),t.arc($,P,W,0,rt),t.fill()}}}else{const r=.55,h=.9*Math.min(y/r,b);{const e=/\p{Extended_Pictographic}/u.test(n.customText||n.charset);t.font=e?`${h}px "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", "Twemoji Mozilla", sans-serif`:`${h}px "JetBrains Mono", monospace`,t.textAlign="center",t.textBaseline="middle"}const m=n.charsetFrames,u=!!m?.length,g=u?m[Math.floor(Math.max(0,i)*(n.charsetFps??2))%m.length]:n.charset,M=t.getTransform();if(!E&&_&&!u&&"accent"===ot&&!l&&n.hoverStrength<=0&&!/\p{Extended_Pictographic}/u.test(n.customText||n.charset)&&"letterSpacing"in t&&/^[\x20-\x7e]*$/.test(n.customText||n.charset)&&e.every(t=>t.every(t=>t.a<10||255===t.a&&1===t.char.length&&/^[\x20-\x7e]$/.test(t.char)))){const n=t.letterSpacing;t.letterSpacing="0px";const o=t.measureText("M").width;t.letterSpacing=y-o+"px",t.fillStyle=`rgb(${R},${k},${H})`,t.globalAlpha=1,t.textAlign="left";for(let n=0;n<d;n++){const r=e[n];let a="";for(let t=0;t<f;t++){const e=r[t];a+=e.a<10?" ":e.char}0!==a.trim().length&&t.fillText(a,.5*(y-o),n*b+.5*b)}return t.letterSpacing=n,t.textAlign="center",void(t.globalAlpha=1)}const w="glitchText"===Z&&E,x="!@#$%^&*<>{}[]|/\\~`0123456789",T=x.length;let I="",O=0,q=0,B=0,U=0,X=0,rt=0;if(w){const t=n.hoverText??"ASCIIFY";if(q=Math.round(K*f),B=Math.round(N*d),Array.isArray(t)){const e=t.filter(t=>t.length>0);0===e.length&&e.push("ASCIIFY");I=e[((7*Math.floor(q/Math.max(1,Math.ceil(f/5)))+13*Math.floor(B/Math.max(1,Math.ceil(d/3))))%e.length+e.length)%e.length]}else I=t||"ASCIIFY";O=I.length,U=Math.max(3,Math.min(12,Math.round(d*$*.6)));const e=Math.floor(U/2);X=Math.max(0,B-e),X+U>d&&(X=Math.max(0,d-U)),rt=q-Math.floor(O/2)}for(let n=l?.y??0;n<(l?.bottom??d);n++){const r=e[n];for(let h=l?.x??0;h<(l?.right??f);h++){const l=r[h];if(l.a<10)continue;let m=u&&null!=l.lum?P(l.lum,W(g),nt):l.char;if(" "===m)continue;_||c(G,h/f,n/d,i*Y,J,(.299*l.r+.587*l.g+.114*l.b)/255);const $=Math.max(0,Math.min(1,(1+J[2])*J[3]));if($<.05)continue;let lt=1,ht=0,dt=0,ft=0,mt=0;if(E&&!w&&h>=j&&h<=z&&n>=V&&n<=D){const t=C(h*at,n*it,K,N,S,Q,y,b,Z,tt,et,s?.trail,o/a);if(lt=t.scale,ht=t.offsetX,dt=t.offsetY,ft=t.glow,mt=t.colorBlend,"trail"===Z&&t.proximity>0){const o=Math.max(0,Math.min(f-1,Math.round(h-t.offsetX/y))),r=e[Math.max(0,Math.min(d-1,Math.round(n-t.offsetY/b)))][o],a=r.lum??.299*r.r+.587*r.g+.114*r.b;m=P(Math.min(255,a+t.proximity*Q*65),W(g),nt)}}if(w&&n>=X&&n<X+U){const t=h-rt;if(t>=0&&t<O){const e=I[t],o=Math.abs(n-B)/Math.max(1,.5*U),r=Math.abs(h-q)/Math.max(1,O),a=Math.max(o,r),s=Math.max(0,Math.min(1,1-.9*a)),c=43758.5453*Math.sin(127.1*h+311.7*n+43758.5453*Math.floor(12*i));m=Math.abs(c-Math.floor(c))<s?e:x[Math.abs(Math.floor(97*c))%T],ft=.3+.7*s,mt=.3+.65*s}}const ut=h*y+.5*y+ht+J[0],gt=n*b+.5*b+dt+J[1];let pt;if(mt>0){const t=v(l,ot,R,k,H,nt);pt=`rgb(${Math.min(255,t[0]+(A-t[0])*mt|0)},${Math.min(255,t[1]+(F-t[1])*mt|0)},${Math.min(255,t[2]+(L-t[2])*mt|0)})`}else pt=p(l,ot,R,k,H,nt);const Mt=Math.min(1,.00392156863*l.a*$*(1+ft));Mt!==ct&&(t.globalAlpha=Mt,ct=Mt),pt!==st&&(t.fillStyle=pt,st=pt),1!==lt?(t.translate(ut,gt),t.scale(lt,lt),t.fillText(m,0,0),t.setTransform(M)):t.fillText(m,ut,gt)}}}t.globalAlpha=1}function nt(t="classic"){if("classic"!==t)throw new RangeError(`Art preset "${String(t)}" was removed in 4.1. Use a StudioStyle with asciify-engine/studio, or supply options.charset directly.`);return{artStyle:"classic"}}function ot(t){return Math.max(0,Math.min(1,t))}function rt(t){return"string"==typeof t?document.querySelector(t):t instanceof HTMLElement?t:null}function at(t){return"ascii"===t.renderMode&&"none"===t.animationStyle&&t.hoverStrength<=0&&!t.charsetFrames?.length}function it(t,e={}){const n=ot(t),o=ot(n*(void 0===e.speed?1:Math.max(.001,e.speed)));return ot(e.ease?e.ease(o):o)}function st(t,e,n={}){if(!Number.isFinite(t.duration)||t.duration<=0)return;const o=n.from??0,r=n.to??t.duration,a=Math.max(o,Math.min(r,t.duration)),i=it(e,n),s=o+(a-o)*i;t.currentTime=Math.min(Math.max(o,s),Math.max(o,a-.04)),n.onUpdate?.(i,t)}function ct(t,e){return Math.abs(t.currentTime-e)<1/240?lt(t):new Promise(n=>{const o=()=>{t.removeEventListener("seeked",o),n()};t.addEventListener("seeked",o,{once:!0});const r=t.fastSeek;r?r.call(t,e):t.currentTime=e})}function lt(t){const e=t.requestVideoFrameCallback;return new Promise(e?n=>{let o=!1;const r=()=>{o||(o=!0,n())};e.call(t,r),window.setTimeout(r,32)}:t=>requestAnimationFrame(()=>t()))}function ht(t,e={}){const n=rt(e.trigger)??t;t.pause();const o=e.gsap,r=e.ScrollTrigger??o?.ScrollTrigger;if(o&&r?.create){o.registerPlugin?.(r);const a=r.create({trigger:n,start:e.start??"top bottom",end:e.end??"bottom top",scrub:e.scrub??!0,onUpdate:n=>st(t,n.progress,e)});return()=>a.kill?.()}return function(t,e,n){let o=0;const r=()=>{o=0;const r=e.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,i=r.height+a,s=i>0?ot((a-r.top)/i):0;st(t,s,n)},a=()=>{o||(o=requestAnimationFrame(r))};return window.addEventListener("scroll",a,{passive:!0}),window.addEventListener("resize",a),a(),()=>{window.removeEventListener("scroll",a),window.removeEventListener("resize",a),o&&cancelAnimationFrame(o)}}(t,n,e)}function dt(t,e,n){const o=e.gsap,r=e.ScrollTrigger??o?.ScrollTrigger;if(o&&r?.create){o.registerPlugin?.(r);const a=r.create({trigger:t,start:e.start??"top bottom",end:e.end??"bottom top",scrub:e.scrub??!0,onUpdate:t=>n(t.progress)});return()=>a.kill?.()}return function(t,e){let n=0;const o=()=>{n=0;const o=t.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight,a=o.height+r,i=a>0?ot((r-o.top)/a):0;e(i)},r=()=>{n||(n=requestAnimationFrame(o))};return window.addEventListener("scroll",r,{passive:!0}),window.addEventListener("resize",r),r(),()=>{window.removeEventListener("scroll",r),window.removeEventListener("resize",r),n&&cancelAnimationFrame(n)}}(t,n)}function ft(t,e,n){if(!t||!e||!n.sourceCrop)return{w:t,h:e};const o=D(n.sourceCrop,t,e);return{w:Math.max(1,Math.round(o.width)),h:Math.max(1,Math.round(o.height))}}function mt(t,e,n,o){const r=o.chromaKey;if(null==r||!1===r)return!1;if(!0===r)return e>1.4*t&&e>1.4*n&&e>80;if("blue-screen"===r)return n>1.4*t&&n>1.4*e&&n>80;const a=b(r),i=(o.chromaKeyTolerance??60)**2,s=t-a.r,c=e-a.g,l=n-a.b;return s*s+c*c+l*l<=i}function ut(t,e,n){if(!e.chromaKey||!e.sourceCrop||"off"===e.chromaKeyTrimMode)return e;const o=t instanceof HTMLVideoElement?t.videoWidth:t.width,r=t instanceof HTMLVideoElement?t.videoHeight:t.height;if(!o||!r)return e;const a=D(e.sourceCrop,o,r),i=Math.min(360,Math.max(1,Math.round(a.width))),s=Math.max(1,Math.round(i*(a.height/a.width))),{ctx:c}=l(i,s);c.drawImage(t,a.x,a.y,a.width,a.height,0,0,i,s);const h=c.getImageData(0,0,i,s).data,d=Math.max(0,Math.min(255,e.chromaKeyTrimLuminanceThreshold??0));let f=i,m=s,u=-1,g=-1;for(let t=0;t<s;t++)for(let n=0;n<i;n++){const o=4*(t*i+n),r=h[o+3],a=h[o],s=h[o+1],c=h[o+2];r<=8||.2126*a+.7152*s+.0722*c<=d||mt(a,s,c,e)||(n<f&&(f=n),t<m&&(m=t),n>u&&(u=n),t>g&&(g=t))}if(u<f||g<m)return e;const p=Math.max(0,Math.min(.25,e.chromaKeyTrimPadding??.002)),M=Math.round(i*p),v=Math.round(s*p);f=Math.max(0,f-M),m=Math.max(0,m-v),u=Math.min(i-1,u+M),g=Math.min(s-1,g+v);const w=function(t,e,n,o,r){const a=r&&Number.isFinite(r)&&r>0?r:null;if(!a)return t;const i=e.x,s=e.y,c=e.x+e.width,l=e.y+e.height,h=Math.max(i,t.left),d=Math.max(s,t.top),f=Math.min(c,n-t.right),m=Math.min(l,o-t.bottom),u=Math.max(1,f-h),g=Math.max(1,m-d),p=h+u/2,M=d+g/2;let v=u,w=g;v/w<a?v=w*a:w=v/a;v>e.width&&(v=e.width,w=Math.max(g,Math.min(e.height,v/a)));w>e.height&&(w=e.height,v=Math.max(u,Math.min(e.width,w*a)));let y=p-v/2,x=M-w/2;return y=Math.max(i,Math.min(c-v,y)),x=Math.max(s,Math.min(l-w,x)),{left:y,top:x,right:n-(y+v),bottom:o-(x+w)}}({left:a.x+f/i*a.width,top:a.y+m/s*a.height,right:o-(a.x+(u+1)/i*a.width),bottom:r-(a.y+(g+1)/s*a.height)},{x:a.x,y:a.y,width:a.width,height:a.height},o,r,n);return{...e,sourceCrop:{unit:"pixel",...w,preserveAspect:!1}}}function gt(t){const e=t.sourceCrop;return e&&"pixel"===e.unit?void 0===e.left||void 0===e.top||void 0===e.right||void 0===e.bottom?null:{left:e.left,top:e.top,right:e.right,bottom:e.bottom}:null}async function pt(t,e,n,o,r){if(!e.chromaKey||!e.sourceCrop||"range"!==e.chromaKeyTrimMode)return e;const a=t.currentTime,i=function(t,e,n,o){const r=!0===o?{}:o||{},a=Math.max(0,r.from??e),i=r.to??n??(Number.isFinite(t.duration)?t.duration:a),s=Math.max(a,i-.04),c=Math.max(0,s-a),l=c>.1?[a,a+.25*c,a+.5*c,a+.75*c,s]:[a];return Array.from(new Set(l.map(t=>Math.max(0,Number(t.toFixed(3))))))}(t,n,o,r);let s=null;for(const n of i){await ct(t,n),await lt(t);const o=gt(ut(t,e));o&&(s=s?{left:Math.min(s.left,o.left),top:Math.min(s.top,o.top),right:Math.min(s.right,o.right),bottom:Math.min(s.bottom,o.bottom)}:o)}return await ct(t,a),await lt(t),s?{...e,sourceCrop:{unit:"pixel",...s,preserveAspect:!0}}:e}function Mt(t,e,n=2048){return vt({sourceWidth:t,sourceHeight:e,maxRenderDimension:n})}function vt({sourceWidth:t,sourceHeight:e,cssWidth:n=0,cssHeight:o=0,maxRenderDimension:r=2048}){const a=Math.max(1,t),i=Math.max(1,e),s=a/i,c=Math.max(1,r),l=Math.min(1,c/Math.max(a,i)),h=Math.max(a,i)*l,d=Math.max(0,n,o),f=Math.min(c,Math.max(h,d));return s>=1?{renderW:Math.round(f),renderH:Math.round(f/s)}:{renderW:Math.round(f*s),renderH:Math.round(f)}}function wt(t,e,n,o){if(void 0===t)return;if("number"==typeof t)return t;const r=t.trim();if(r.endsWith("%")){const t=Number.parseFloat(r)/100;return Number.isFinite(t)?e*t:void 0}if(r.endsWith("px")){const t=Number.parseFloat(r);return Number.isFinite(t)?t:void 0}if(r.endsWith("vw")){const t=Number.parseFloat(r)/100;return Number.isFinite(t)?n*t:void 0}if(r.endsWith("vh")){const t=Number.parseFloat(r)/100;return Number.isFinite(t)?o*t:void 0}}function yt(t,e,n,o,r,a=2048,i={}){const{width:s,height:c}=e.getBoundingClientRect();if(!s||!c)return{renderW:0,renderH:0,dpr:1};const l="undefined"!=typeof window?window.innerWidth:s,h="undefined"!=typeof window?window.innerHeight:c,d=wt(i.width,s,l,h)??s,f=wt(i.height,c,l,h)??c,m=function(t,e,n,o,r){const a=t=>{const n=wt(t,e,o,r);return n&&n>0?n:0},i=t=>{const e=wt(t,n,o,r);return e&&e>0?e:0};return void 0===t?{x:0,y:0}:"number"==typeof t||"string"==typeof t?{x:a(t),y:i(t)}:{x:a(t.x),y:i(t.y)}}(i.bleed,s,c,l,h),u=d+2*m.x,g=f+2*m.y,{cssW:p,cssH:M}=function(t,e,n,o="contain"){if("fill"===o)return{cssW:t,cssH:e};let r=t,a=r/n;const i="cover"===o,s=a>e;return(i&&!s||!i&&s)&&(a=e,r=a*n),"scale-down"===o&&(r=Math.min(r,t),a=Math.min(a,e)),{cssW:Math.round(r),cssH:Math.round(a)}}(u,g,n,i.objectFit??"contain"),v="undefined"!=typeof window&&window.devicePixelRatio||1;let w,y;o&&r?({renderW:w,renderH:y}=vt({sourceWidth:o,sourceHeight:r,cssWidth:p,cssHeight:M,maxRenderDimension:a})):(w=p,y=M);const x=8e6,b=w*v*y*v>x?Math.sqrt(x/(w*y)):v;return t.width=Math.round(w*b),t.height=Math.round(y*b),t.style.width=`${p}px`,t.style.height=`${M}px`,{renderW:w,renderH:y,dpr:b}}async function xt(t,e,{fontSize:o,artStyle:r="classic",options:a={}}={}){let i;if("string"==typeof t){const e=new Image;e.crossOrigin="anonymous",await new Promise((n,o)=>{e.onload=()=>n(),e.onerror=()=>o(new Error(`Failed to load image: ${t}`)),e.src=t}),i=e}else t instanceof HTMLImageElement&&!t.complete?(await new Promise((e,n)=>{t.onload=()=>e(),t.onerror=()=>n(new Error("Image failed to load"))}),i=t):i=t;const s=nt(r),c=o??a.fontSize??10,l={...n,...s,artStyle:r,...a,fontSize:c},h=e.getContext("2d");if(!h)throw new Error("Could not get 2d context from canvas");const{w:d,h:f}=function(t){return t instanceof HTMLVideoElement?{w:t.videoWidth,h:t.videoHeight}:t instanceof HTMLImageElement?{w:t.naturalWidth||t.width,h:t.naturalHeight||t.height}:{w:t.width,h:t.height}}(i),{renderW:m,renderH:u}=Mt(d,f),g="undefined"!=typeof window&&window.devicePixelRatio||1,p=8e6,M=m*g*u*g>p?Math.sqrt(p/(m*u)):g;e.width===Math.round(m*M)&&e.height===Math.round(u*M)||(e.width=Math.round(m*M),e.height=Math.round(u*M));const{frame:v}=K(i,l,m,u),w=(t,e)=>{h.save(),h.setTransform(M,0,0,M,0,0),tt(h,v,l,m,u,t/1e3,e),h.restore()};w(0,null);return T(e,w,{continuous:"none"!==l.animationStyle||!!l.charsetFrames?.length,interactive:l.hoverStrength>0}).stop}async function bt(t,e,{fontSize:o,artStyle:r="classic",options:a={}}={}){const i="string"==typeof t?await fetch(t).then(t=>t.arrayBuffer()):t,s=o??a.fontSize??10;let c={...n,...nt(r),artStyle:r,...a,fontSize:s};const l=e.getContext("2d");if(!l)throw new Error("Could not get 2d context from canvas");const{frames:h,fps:d}=await X(i,c,e.width,e.height);if(!h.length)throw new Error("asciifyGif: the GIF contains no renderable frames.");const f=performance.now();let m=-1;return T(e,(t,n)=>{const o=Math.floor((t-f)*d/1e3)%h.length;o===m&&!n&&c.hoverStrength<=0&&"none"===c.animationStyle&&!c.charsetFrames?.length||(tt(l,h[o],c,e.width,e.height,(t-f)/1e3,n),m=o)},{continuous:!0,interactive:c.hoverStrength>0}).stop}async function St(t,e,{fontSize:o,artStyle:r="classic",options:a={},fitTo:i,objectFit:s,objectPosition:c,scale:l,width:h,height:d,bleed:f,preExtract:m=!1,fps:u,maxRenderDimension:g=2048,trim:p,scroll:M,maxCachedFrames:v=90,onReady:w,onFrame:y}={}){const x=p?.start??0,b=p?.end,S=o??a.fontSize??10;let E={...n,...nt(r),artStyle:r,...a,fontSize:S};const C=e.getContext("2d");if(!C)throw new Error("asciifyVideo: could not get 2d context from canvas.");const A="string"==typeof i?document.querySelector(i):i instanceof HTMLElement?i:null,F={objectFit:s,objectPosition:c,scale:l,width:h,height:d,bleed:f},L=function(t,e){var n;if(!function(t){return void 0!==t.objectFit||void 0!==t.objectPosition||void 0!==t.scale||void 0!==t.width||void 0!==t.height||void 0!==t.bleed}(e))return()=>{};const o={width:t.style.width,height:t.style.height,objectFit:t.style.objectFit,objectPosition:t.style.objectPosition,maxWidth:t.style.maxWidth,maxHeight:t.style.maxHeight,transformOrigin:t.style.transformOrigin,scale:t.style.getPropertyValue("scale")};if(e.objectFit&&(t.style.objectFit=e.objectFit),e.objectPosition&&(t.style.objectPosition=e.objectPosition,t.style.transformOrigin=e.objectPosition),void 0===e.scale&&void 0===e.bleed||(t.style.maxWidth="none",t.style.maxHeight="none"),void 0!==e.scale){const o=Number.isFinite(e.scale)&&e.scale>0?e.scale:1;t.style.setProperty("scale",String(o)),(n=t.style).transformOrigin||(n.transformOrigin=e.objectPosition??"center center")}return()=>{t.style.width=o.width,t.style.height=o.height,t.style.objectFit=o.objectFit,t.style.objectPosition=o.objectPosition,t.style.maxWidth=o.maxWidth,t.style.maxHeight=o.maxHeight,t.style.transformOrigin=o.transformOrigin,o.scale?t.style.setProperty("scale",o.scale):t.style.removeProperty("scale")}}(e,F),I=t=>()=>{t(),L()};if(m){let n;"string"==typeof t?(n=document.createElement("video"),n.crossOrigin="anonymous",n.src=t,n.readyState<2&&await new Promise((e,o)=>{n.onloadeddata=()=>e(),n.onerror=()=>o(new Error(`asciifyVideo: failed to load "${t}"`))})):n=t,E=await pt(n,E,x,b,M);const o=ft(n.videoWidth,n.videoHeight,E);A&&yt(e,A,o.w/o.h,o.w,o.h,g,F);const{renderW:r,renderH:a}=Mt(o.w,o.h,g),i="undefined"!=typeof window&&window.devicePixelRatio||1,s=8e6,c=r*i*a*i>s?Math.sqrt(s/(r*a)):i;e.width===Math.round(r*c)&&e.height===Math.round(a*c)||(e.width=Math.round(r*c),e.height=Math.round(a*c));const l=void 0!==b?b-x:10,h=u??(M?18:void 0);if(at(E)){const{frames:t,fps:o}=await G(n,E,r,a,h,l,void 0,x),i=e=>{const n=t[e];n&&(C.save(),C.setTransform(c,0,0,c,0,0),U(C,n,E,r,a),C.restore(),y?.())};if(M){let o=!1,r=-1;const a=!0===M?{}:M,s=dt(rt(a.trigger)??A??e,a,e=>{const s=it(e,a),c=Math.max(0,Math.min(t.length-1,Math.round(s*(t.length-1))));c!==r&&(r=c,i(c),o||(o=!0,w?.(n)),a.onUpdate?.(s,n))});return i(0),o=!0,w?.(n),I(s)}let s,d=!1,f=0,m=performance.now(),u=!0;const g=1e3/o,p=e=>{d||(e-m>=g&&(i(f),f=(f+1)%t.length,m=e,u&&(u=!1,w?.(n))),s=requestAnimationFrame(p))};return s=requestAnimationFrame(p),I(()=>{d=!0,cancelAnimationFrame(s)})}const{frames:d,fps:f}=await Y(n,E,r,a,h,l,void 0,x);if(!d.length)throw new Error("asciifyVideo: no frames were decoded.");let m=0;const p=performance.now(),v=T(e,(t,e)=>{M||(m=Math.floor((t-p)*f/1e3)%d.length),C.save(),C.setTransform(c,0,0,c,0,0),tt(C,d[m],E,r,a,(t-p)/1e3,e),C.restore(),y?.()},{continuous:!M||"none"!==E.animationStyle||!!E.charsetFrames?.length,interactive:E.hoverStrength>0});let S;if(M){const t=!0===M?{}:M;S=dt(rt(t.trigger)??A??e,t,e=>{m=Math.max(0,Math.min(d.length-1,Math.round(it(e,t)*(d.length-1)))),v.wake(),t.onUpdate?.(e,n)})}return w?.(n),I(()=>{v.stop(),S?.()})}let R,k=!1;"string"==typeof t?(R=document.createElement("video"),R.crossOrigin="anonymous",R.src=t,R.muted=!0,R.loop=!0,R.playsInline=!0,R.setAttribute("playsinline",""),Object.assign(R.style,{position:"fixed",top:"0",left:"0",width:"1px",height:"1px",opacity:"0",pointerEvents:"none",zIndex:"-1"}),document.body.appendChild(R),k=!0,await new Promise((e,n)=>{R.onloadedmetadata=()=>e(),R.onerror=()=>n(new Error(`asciifyVideo: failed to load "${t}"`))}),await R.play().catch(()=>{})):(R=t,R.readyState<HTMLMediaElement.HAVE_METADATA&&await new Promise((t,e)=>{const n=()=>{R.removeEventListener("loadedmetadata",o),R.removeEventListener("error",r)},o=()=>{n(),t()},r=()=>{n(),e(new Error("asciifyVideo: provided video element failed to load metadata."))};R.addEventListener("loadedmetadata",o),R.addEventListener("error",r),R.load()}),R.paused&&await R.play().catch(()=>{})),x>0&&(R.currentTime=x,await new Promise(t=>{const e=()=>{R.removeEventListener("seeked",e),t()};R.addEventListener("seeked",e)}),await lt(R));let H=null;(x>0||void 0!==b)&&(H=()=>{(void 0!==b&&R.currentTime>=b||x>0&&R.currentTime<x)&&(R.currentTime=x)},R.addEventListener("timeupdate",H)),E=await pt(R,E,x,b,M);let W=null;const $=ft(R.videoWidth,R.videoHeight,E);let{renderW:P,renderH:j}=Mt($.w,$.h,g);const z=t=>"frame"===E.chromaKeyTrimMode?ut(t,E,P/j):E;if(A){const t=$.w/$.h,n=$.w,o=$.h,r=yt(e,A,t,n,o,g,F);P=r.renderW,j=r.renderH;const a=e.getContext("2d");a&&a.setTransform(r.dpr,0,0,r.dpr,0,0),W=new ResizeObserver(()=>{const r=yt(e,A,t,n,o,g,F);P=r.renderW,j=r.renderH;const a=e.getContext("2d");a&&a.setTransform(r.dpr,0,0,r.dpr,0,0)}),W.observe(A)}else{const t="undefined"!=typeof window&&window.devicePixelRatio||1,n=8e6,o=P*t*j*t>n?Math.sqrt(n/(P*j)):t;e.width===Math.round(P*o)&&e.height===Math.round(j*o)||(e.width=Math.round(P*o),e.height=Math.round(j*o)),C.setTransform(o,0,0,o,0,0)}let O=!0,q=null;const B=M&&!m,V=u&&u>0?1e3/u:0;let D=0;const X=!B&&at(E);if(B&&"ascii"===E.renderMode&&"none"===E.animationStyle&&E.hoverStrength<=0&&!E.charsetFrames?.length){const t=!0===M?{}:M,n=rt(t.trigger)??A??e,o=t.from??x,r=t.to??b??R.duration,a=Math.max(o,Math.min(r,R.duration)),i=Math.max(.001,a-o),s=Math.min(60,Math.max(12,u??30)),c=Math.max(2,Math.ceil(i*s)+1),l=new Array(c),h=[],d=Math.max(2,Math.min(c,Math.floor(v))),f=()=>{for(;h.length>d;){const t=h.findIndex(t=>t!==g&&Math.abs(t-g)>2),e=t>=0?t:0,n=h.splice(e,1)[0];void 0!==n&&(l[n]=void 0)}},m=t=>{const e=h.indexOf(t);e>=0&&h.splice(e,1),h.push(t),f()};let g=0,p=0,S=-1,T=0,F=!1,L=!1,$=!1;const O=new Set,B=document.createElement("video");B.muted=!0,B.playsInline=!0,B.preload="auto",B.crossOrigin=R.crossOrigin||"anonymous",B.src=R.currentSrc||R.src,Object.assign(B.style,{position:"fixed",top:"0",left:"0",width:"1px",height:"1px",opacity:"0",pointerEvents:"none",zIndex:"-1"}),document.body.appendChild(B),B.readyState<HTMLMediaElement.HAVE_METADATA&&await new Promise((t,e)=>{const n=()=>{B.removeEventListener("loadedmetadata",o),B.removeEventListener("error",r)},o=()=>{n(),t()},r=()=>{n(),e(new Error("asciifyVideo: cache video failed to load metadata."))};B.addEventListener("loadedmetadata",o),B.addEventListener("error",r),B.load()}),B.pause(),R.paused&&await R.play().catch(()=>{});const K=t=>o+i*t/Math.max(1,c-1),Y=t=>Math.max(0,Math.min(c-1,Math.round(t*(c-1)))),G=z(R),X=N(R,G,P,j);X.rows.length>0&&(l[0]=X,m(0),U(C,X,G,P,j),$=!0,w?.(R),y?.());const _=t=>{if(l[t])return t;for(let e=1;e<c;e++){const n=t-e,o=t+e;if(n>=0&&l[n])return n;if(o<c&&l[o])return o}return-1},J=()=>{if(!l[g])return g;for(const t of O)if(!l[t])return t;for(let t=1;t<c;t++){const e=g-t,n=g+t;if(e>=0&&!l[e])return e;if(n<c&&!l[n])return n}return-1},Q=t=>{t<0||t>=c||l[t]||(O.add(t),Z())},Z=async()=>{if(F||L)return;const t=J();if(!(t<0)){O.delete(t),L=!0;try{if(await ct(B,K(t)),!F){const e=z(B),n=N(B,e,P,j);n.rows.length>0&&(l[t]=n,m(t))}}finally{L=!1,F||requestAnimationFrame(()=>{Z()})}}},tt=()=>{if(F)return;const t=_(g);if(t>=0&&t!==S){const e=l[t];e&&(U(C,e,E,P,j),S=t,$||($=!0,w?.(R)),y?.())}else if(t<0||S<0){const t=performance.now();if(V<=0||t-D>=V){const e=z(R),n=N(R,e,P,j);n.rows.length>0&&(U(C,n,e,P,j),D=t,$||($=!0,w?.(R)),y?.())}}Q(g),T=requestAnimationFrame(tt)};return q=dt(n,t,e=>{const n=function(t,e,n={}){if(!Number.isFinite(t.duration)||t.duration<=0)return null;const o=n.from??0,r=n.to??t.duration,a=Math.max(o,Math.min(r,t.duration)),i=it(e,n),s=o+(a-o)*i;return{progress:i,time:Math.min(Math.max(o,s),Math.max(o,a-.04))}}(R,e,{...t,from:o,to:a});p=n?.progress??ot(e),g=Y(p),Q(g),Q(g-1),Q(g+1),Q(g-2),Q(g+2),Q(g-3),Q(g+3),t.onUpdate?.(p,R)}),Q(0),Q(1),T=requestAnimationFrame(tt),I(()=>{F=!0,cancelAnimationFrame(T),q?.(),W?.disconnect(),O.clear(),h.length=0,l.fill(void 0),B.pause(),B.src="",B.removeAttribute("src"),B.load(),B.isConnected&&B.remove(),H&&R.removeEventListener("timeupdate",H),k&&(R.pause(),R.src="",R.removeAttribute("src"),R.load(),R.isConnected&&R.remove())})}if(B){const t=!0===M?{}:M;q=ht(R,{...t,trigger:t.trigger??A??e,from:t.from??x,to:t.to??b})}let _=-1,J=0,Q=-1,Z=0;const et="function"==typeof R.requestVideoFrameCallback,st=()=>{Z=R.requestVideoFrameCallback(()=>{J++,st()})};et&&st();let mt=0,gt=0,vt=null;const wt=T(e,(t,n)=>{if(R.readyState<2||0===e.width||0===e.height)return;if(V>0&&t-D<V&&!n)return;if(x>0&&R.currentTime<x)return;if(void 0!==b&&R.currentTime>=b)return;const o=(et?J!==Q:R.currentTime!==_)||mt!==P||gt!==j;if(o||!(E.hoverStrength<=0)||"none"!==E.animationStyle||E.charsetFrames?.length){if(X){const t=z(R),e=N(R,t,P,j);U(C,e,t,P,j)}else!o&&vt||(vt=K(R,z(R),P,j).frame),tt(C,vt,E,P,j,t/1e3,n);_=R.currentTime,Q=J,mt=P,gt=j,D=t,O&&(O=!1,w?.(R)),y?.()}},{continuous:!0,interactive:E.hoverStrength>0});return I(()=>{wt.stop(),Z&&R.cancelVideoFrameCallback(Z),q?.(),W?.disconnect(),H&&R.removeEventListener("timeupdate",H),k&&(R.pause(),R.src="",R.removeAttribute("src"),R.load(),R.isConnected&&R.remove())})}function Et(t,e,n){return St(t,e,n)}function Ct(t,e={},o,r){const a={...n,...e},{frame:i,cols:s}=K(t,a,o,r);if(!i.length||0===s)return"";const c=[];for(const t of i)c.push(t.map(t=>t.char).join(""));return c.join("\n")}function Tt(t,e={},o,r){const a={...n,...e},{frame:i,cols:s}=K(t,a,o,r);if(!i.length||0===s)return"";const c=[];for(const t of i){let e="";for(const n of t)" "===n.char||n.a<10?e+=" ":e+=`[38;2;${n.r};${n.g};${n.b}m${n.char}[0m`;c.push(e)}return c.join("\n")}function At(t,e,n,o="#505050",r=100){if(!t||e<=0||n<=0)return[];const a=function(t){const e=t.match(/^#([0-9a-f]{3,8})$/i)?.[1];if(e){const t=e.length<=4?e.split("").map(t=>parseInt(t+t,16)):[parseInt(e.slice(0,2),16),parseInt(e.slice(2,4),16),parseInt(e.slice(4,6),16)];return{r:t[0],g:t[1],b:t[2]}}const n=t.match(/rgba?\(\s*(\d+)[,\s]+(\d+)[,\s]+(\d+)/i);return n?{r:+n[1],g:+n[2],b:+n[3]}:null}(o)??{r:80,g:80,b:80},i=t,s=i.length;return Array.from({length:n},(t,n)=>Array.from({length:e},(t,o)=>({char:i[(n*e+o)%s],r:a.r,g:a.g,b:a.b,a:r})))}var Ft=new WeakMap;function Lt(t,e,o,r,a={},i){const{fontSize:s=10,lineHeight:c=1.6,color:l="#505050",opacity:h=100,hoverEffect:d="spotlight",hoverStrength:f=.85,hoverRadius:m=.18,hoverColor:u="#d4ff00"}=a,g=Math.max(1,Math.floor(e/s)),p=Math.max(1,Math.floor(o/(s*c))),M=JSON.stringify([r,g,p,l,h]);let v=Ft.get(t);v&&v.key===M||(v={key:M,frame:At(r,g,p,l,h)},Ft.set(t,v));tt(t,v.frame,{...n,fontSize:s,hoverEffect:d,hoverStrength:f,hoverRadius:m,hoverColor:u},e,o,0,i??null)}function It(t,{format:e="png",quality:n=.92,scale:o=1}={}){return new Promise((r,a)=>{let i=t;if(1!==o){const e=document.createElement("canvas");e.width=Math.round(t.width*o),e.height=Math.round(t.height*o);const n=e.getContext("2d");if(!n)return void a(new Error("captureSnapshot: could not get 2d context"));n.drawImage(t,0,0,e.width,e.height),i=e}i.toBlob(t=>t?r(t):a(new Error("captureSnapshot: toBlob returned null")),`image/${e}`,n)})}async function Rt(t,e={}){const{filename:n="asciify-snapshot",format:o="png",...r}=e,a=await It(t,{format:o,...r}),i="jpeg"===o?"jpg":o,s=document.createElement("a");s.href=URL.createObjectURL(a),s.download=`${n}.${i}`,s.click(),setTimeout(()=>URL.revokeObjectURL(s.href),1e4)}async function kt(t,{fontSize:e=10,style:o="classic",options:r={},liveOptions:a,mirror:i=!0,constraints:s={facingMode:"user"},dpr:c}={}){if(!navigator.mediaDevices?.getUserMedia)throw new Error("asciifyWebcam: getUserMedia is not supported in this browser.");const l=nt(o),h=await navigator.mediaDevices.getUserMedia({video:s}),d=document.createElement("video");d.srcObject=h,d.muted=!0,d.playsInline=!0,await new Promise((t,e)=>{d.onloadedmetadata=()=>t(),d.onerror=()=>e(new Error("asciifyWebcam: video stream failed to load.")),d.play().catch(e)});const f={...n,...l,...r,fontSize:e},m=t.getContext("2d");if(!m)throw new Error("asciifyWebcam: could not get 2d context from canvas.");const u=c??("undefined"!=typeof window?window.devicePixelRatio:1)??1;1!==u&&m.scale(u,u);let g=null;const p=e=>{const n=t.getBoundingClientRect();g={x:(e.clientX-n.left)/n.width,y:(e.clientY-n.top)/n.height}},M=()=>{g=null};f.hoverStrength>0&&(t.addEventListener("mousemove",p),t.addEventListener("mouseleave",M));let v,w=!1;const y=performance.now(),x=e=>{if(!w){if(d.readyState>=d.HAVE_CURRENT_DATA){const n=t.width/u,o=t.height/u,r=(e-y)/1e3,s=a?{...f,...a()}:f;s.hoverStrength>0?(t.addEventListener("mousemove",p),t.addEventListener("mouseleave",M)):(t.removeEventListener("mousemove",p),t.removeEventListener("mouseleave",M));const{frame:c}=K(d,s,n,o),l=g&&i?{x:1-g.x,y:g.y}:g;i?(m.save(),m.scale(-1,1),m.translate(-n,0),tt(m,c,s,n,o,r,l),m.restore()):tt(m,c,s,n,o,r,l)}v=requestAnimationFrame(x)}};return v=requestAnimationFrame(x),()=>{w=!0,cancelAnimationFrame(v),t.removeEventListener("mousemove",p),t.removeEventListener("mouseleave",M),h.getTracks().forEach(t=>t.stop()),d.srcObject=null}}var Ht={A:[28,54,99,127,99,99,99],B:[126,99,99,126,99,99,126],C:[62,99,96,96,96,99,62],D:[124,102,99,99,99,102,124],E:[127,96,96,124,96,96,127],F:[127,96,96,124,96,96,96],G:[62,99,96,111,99,99,62],H:[99,99,99,127,99,99,99],I:[127,8,8,8,8,8,127],J:[63,6,6,6,102,102,60],K:[99,102,108,120,108,102,99],L:[96,96,96,96,96,96,127],M:[99,119,107,107,99,99,99],N:[99,115,107,103,99,99,99],O:[62,99,99,99,99,99,62],P:[126,99,99,126,96,96,96],Q:[62,99,99,99,107,102,61],R:[126,99,99,126,108,102,99],S:[62,99,96,62,3,99,62],T:[127,8,8,8,8,8,8],U:[99,99,99,99,99,99,62],V:[99,99,99,99,54,28,8],W:[99,99,99,107,107,54,20],X:[99,54,28,8,28,54,99],Y:[99,99,54,28,8,8,8],Z:[127,3,6,12,24,48,127],a:[0,0,60,3,62,99,61],b:[96,96,124,99,99,99,124],c:[0,0,62,96,96,96,62],d:[3,3,31,99,99,99,31],e:[0,0,62,99,127,96,62],f:[30,48,48,126,48,48,48],g:[0,0,63,99,63,3,62],h:[96,96,124,99,99,99,99],i:[8,0,24,8,8,8,28],j:[4,0,12,4,4,36,24],k:[96,96,102,108,120,108,102],l:[24,8,8,8,8,8,28],m:[0,0,92,107,107,99,99],n:[0,0,94,99,99,99,99],o:[0,0,62,99,99,99,62],p:[0,0,126,99,126,96,96],q:[0,0,63,99,63,3,3],r:[0,0,94,99,96,96,96],s:[0,0,62,96,62,3,124],t:[48,48,126,48,48,48,30],u:[0,0,99,99,99,103,59],v:[0,0,99,99,54,28,8],w:[0,0,99,99,107,54,20],x:[0,0,99,54,28,54,99],y:[0,0,99,99,63,3,62],z:[0,0,127,6,12,24,127],0:[62,99,103,107,115,99,62],1:[8,24,56,8,8,8,62],2:[62,99,3,6,24,48,127],3:[62,99,3,30,3,99,62],4:[6,14,22,38,127,6,6],5:[127,96,126,3,3,99,62],6:[62,99,96,126,99,99,62],7:[127,3,6,12,24,24,24],8:[62,99,99,62,99,99,62],9:[62,99,99,63,3,99,62]," ":[0,0,0,0,0,0,0],"!":[24,24,24,24,24,0,24],"?":[62,99,3,14,8,0,8],".":[0,0,0,0,0,24,24],",":[0,0,0,0,0,24,48],";":[0,24,24,0,24,24,48],":":[0,24,24,0,24,24,0],"-":[0,0,0,62,0,0,0],_:[0,0,0,0,0,0,127],"'":[24,24,32,0,0,0,0],'"':[54,54,36,0,0,0,0],"`":[24,8,0,0,0,0,0],")":[24,12,6,6,6,12,24],"(":[12,24,48,48,48,24,12],"[":[60,48,48,48,48,48,60],"]":[30,6,6,6,6,6,30],"{":[14,24,24,48,24,24,14],"}":[56,12,12,6,12,12,56],"/":[3,6,12,24,48,96,0],"\\":[96,48,24,12,6,3,0],"|":[8,8,8,8,8,8,8],"+":[0,8,8,62,8,8,0],"=":[0,0,62,0,62,0,0],"*":[0,42,28,127,28,42,0],"#":[36,36,127,36,127,36,36],"@":[62,99,111,107,111,96,62],"&":[24,36,24,60,74,68,58],"%":[99,38,4,8,16,50,99],$:[8,62,72,62,9,62,8],"^":[8,20,34,0,0,0,0],"~":[0,0,50,76,0,0,0],"<":[6,12,24,48,24,12,6],">":[48,24,12,6,12,24,48]},Wt=[127,65,65,65,65,65,127];function $t(t){return Ht[t]??Ht[t.toUpperCase()]??Wt}function Pt(t,e={}){if(!t)return"";const{char:n="█",scale:o=1}=e,r=[...n][0]??"█",a=Math.max(1,Math.floor(o)),i=7*a,s=a,c=Array.from({length:i},()=>"");for(let e=0;e<t.length;e++){const n=$t(t[e]);for(let t=0;t<7;t++){const e=n[t];let o="";for(let t=6;t>=0;t--)o+=(e>>t&1?r:" ").repeat(a);for(let e=0;e<a;e++)c[t*a+e]+=o}if(e<t.length-1)for(let t=0;t<i;t++)c[t]+=" ".repeat(s)}return c.join("\n")}function jt(t,e,n={}){const{color:o="#d4ff00",bgColor:r,fontSize:a=10}=n,i=Pt(e,n);if(!i)return;const s=i.split("\n"),c=Math.max(...s.map(t=>[...t].length));t.width=Math.ceil(c*a*.6),t.height=Math.ceil(s.length*a);const l=t.getContext("2d");r&&"transparent"!==r?(l.fillStyle=r,l.fillRect(0,0,t.width,t.height)):l.clearRect(0,0,t.width,t.height),l.fillStyle=o,l.font=`${a}px monospace`,l.textBaseline="top",s.forEach((t,e)=>l.fillText(t,0,e*a))}var zt=["ascii","blocks","braille","dots","lines","cross","diagonal","diamond","mixed","pixel","mosaic","lego","voxel","disco","dither","hex","led","cmyk"];export{t as CHARACTER_SETS,n as DEFAULT_OPTIONS,o as HOVER_PRESETS,e as PALETTE_THEMES,zt as STUDIO_STYLES,Ct as asciiText,Tt as asciiTextAnsi,xt as asciify,bt as asciifyGif,Et as asciifyLiveVideo,Pt as asciifyText,St as asciifyVideo,kt as asciifyWebcam,At as buildTextFrame,It as captureSnapshot,z as clearAsciifyCaches,vt as computeCanvasRenderSize,ht as createVideoScrollScrub,X as gifToAsciiFrames,_ as gifToAsciiTextFrames,K as imageToAsciiFrame,N as imageToAsciiTextFrame,tt as renderFrameToCanvas,Lt as renderTextBackground,U as renderTextFrameToCanvas,jt as renderTextToCanvas,Rt as snapshotAndDownload,Y as videoToAsciiFrames,G as videoToAsciiTextFrames};//# sourceMappingURL=core.js.map
|
|
1
|
+
var t={standard:{label:"Classic ASCII",chars:" .:-=+*#%@"},asciify:{label:"Asciify",chars:" .:-=+ASCIIFY#@"},minimal:{label:"Minimal",chars:" .:+"},detailed:{label:"Detailed",chars:" .,:;i1tfLCG08@"},letters:{label:"Letters",chars:" .ilLCFTYASMW"},technical:{label:"Technical",chars:" .:;>_/[{}]=+*#@$"},blocks:{label:"Tonal blocks",chars:" ░▒▓█"},braille:{label:"Braille",chars:" ⠁⠃⠇⡇⣇⣧⣷⣿"}},e={dracula:{name:"Dracula",accent:"#bd93f9",bg:"#282a36",fg:"#f8f8f2"},monokai:{name:"Monokai",accent:"#a6e22e",bg:"#272822",fg:"#f8f8f2"},nord:{name:"Nord",accent:"#88c0d0",bg:"#2e3440",fg:"#eceff4"},catppuccin:{name:"Catppuccin",accent:"#cba6f7",bg:"#1e1e2e",fg:"#cdd6f4"},solarized:{name:"Solarized",accent:"#268bd2",bg:"#002b36",fg:"#839496"},gruvbox:{name:"Gruvbox",accent:"#b8bb26",bg:"#282828",fg:"#ebdbb2"}},n={fontSize:7,charSpacing:1,brightness:0,contrast:0,charset:t.standard.chars,colorMode:"grayscale",accentColor:"#d4ff00",invert:!1,renderMode:"ascii",animationStyle:"none",animationSpeed:1,dotSizeRatio:.8,ditherStrength:0,charAspect:.55,normalize:!1,hoverStrength:0,hoverRadius:.2,hoverEffect:"spotlight",hoverColor:"#ffffff",hoverShape:"circle",hoverText:"ASCIIFY",artStyle:"classic",fineDither:!1,customText:"",chromaKey:null,chromaKeyTolerance:60,chromaKeyTrimPadding:.002,chromaKeyTrimLuminanceThreshold:0,chromaKeyTrimMode:"range"},o={none:{label:"Off",options:{hoverStrength:0,hoverEffect:"spotlight",hoverRadius:.2,hoverColor:"#ffffff"}},subtle:{label:"Subtle",options:{hoverStrength:.25,hoverEffect:"glow",hoverRadius:.12,hoverColor:"#ffffff"}},flashlight:{label:"Flashlight",options:{hoverStrength:.6,hoverEffect:"spotlight",hoverRadius:.15,hoverColor:"#fffbe6"}},magnifier:{label:"Magnifier",options:{hoverStrength:.7,hoverEffect:"magnify",hoverRadius:.12,hoverColor:"#ffffff"}},forceField:{label:"Force Field",options:{hoverStrength:.7,hoverEffect:"repel",hoverRadius:.15,hoverColor:"#a0e8ff"}},neon:{label:"Neon",options:{hoverStrength:.6,hoverEffect:"colorShift",hoverRadius:.15,hoverColor:"#d946ef"}},fire:{label:"Fire",options:{hoverStrength:.7,hoverEffect:"spotlight",hoverRadius:.15,hoverColor:"#ff6b2b"}},ice:{label:"Ice",options:{hoverStrength:.5,hoverEffect:"glow",hoverRadius:.15,hoverColor:"#60d5f7"}},gravity:{label:"Gravity",options:{hoverStrength:.7,hoverEffect:"attract",hoverRadius:.18,hoverColor:"#a5d6ff"}},shatter:{label:"Shatter",options:{hoverStrength:.8,hoverEffect:"shatter",hoverRadius:.14,hoverColor:"#ff6090"}},ghost:{label:"Fluid trail",options:{hoverStrength:.55,hoverEffect:"trail",hoverRadius:.2,hoverColor:"#b39ddb"}},glitchReveal:{label:"Glitch Reveal",options:{hoverStrength:.8,hoverEffect:"glitchText",hoverRadius:.18,hoverColor:"#a3e635"}}},r=[{value:"none",mode:"none",group:"Still",label:"Off",description:"Keep the image still. Hover stays available."},{value:"caustics",mode:"caustics",group:"Light and texture",label:"Caustics",description:"Soft ribbons of light travel across a stationary character grid."},{value:"current",mode:"current",group:"Flow and depth",label:"Slow Current",description:"A gentle flow through the image, with steady edges."},{value:"reform",mode:"reform",group:"Rebuild",label:"Reveal & Reform",description:"Disperse, gather, then hold the complete image."},{value:"sheen",mode:"sheen",group:"Light and texture",label:"Sheen",description:"A broad diagonal light sweep; characters stay anchored."},{value:"tidal",mode:"tidal",group:"Flow and depth",label:"Tidal Rings",description:"Concentric currents travel outward, with protected edges."},{value:"grain",mode:"grain",group:"Light and texture",label:"Living Grain",description:"Slow, individually phased tonal changes on a stationary grid."},{value:"parallax",mode:"parallax",group:"Flow and depth",label:"Parallax",description:"A shallow, continuous drift through the image, with the edges held in place."},{value:"weave",mode:"weave",group:"Flow and depth",label:"Woven Flow",description:"Interlaced bands move in opposing directions, like a flexible printed fabric."},{value:"print",mode:"print",group:"Rebuild",label:"Print Shift",description:"Staggered rows lift, soften and register back into the image."},{value:"trace",mode:"trace",group:"Light and texture",label:"Contour Light",description:"Light follows the source image’s tonal contours; every character stays anchored."},{value:"relight",mode:"relight",group:"Light and texture",label:"Relight",description:"A slow orbit of light models the image’s midtones, while the character grid stays fixed."},{value:"shimmer",mode:"shimmer",group:"Light and texture",label:"Shimmer",description:"Small highlights glint at different moments. Shadows stay quiet and the image stays in place."},{value:"breeze",mode:"breeze",group:"Flow and depth",label:"Breeze",description:"A traveling bend gently sways the image, like a print suspended in moving air."},{value:"unfold",mode:"unfold",group:"Rebuild",label:"Unfold",description:"Narrow panels turn, soften and return to a complete image, with a readable hold between cycles."}];var a=t=>Math.max(0,Math.min(1,t)),i=(t,e,n)=>{const o=a((n-t)/(e-t));return o*o*(3-2*o)},s=(t,e)=>{const n=(.06711056*t+.00583715*e)%1*52.9829189;return n-Math.floor(n)};function c(t,e,n,o,r,c=.5){if(r[0]=r[1]=r[2]=0,r[3]=1,"none"===t)return r;const l=o*Math.PI/6,h=i(0,.12,Math.min(e,1-e,n,1-n));if("caustics"===t){const t=Math.sin(9*e+5*n+l)+Math.sin(8*n-3*e-l),o=Math.pow(Math.max(0,1-.72*Math.abs(t)),3);r[2]=(.22*o-.045)*h}else if("current"===t)r[0]=Math.sin(9*n+l)*Math.cos(7*e-l)*10*h,r[1]=Math.cos(8*e+l)*Math.sin(6*n-l)*7*h;else if("sheen"===t)r[2]=.2*Math.pow(.5+.5*Math.cos(5*e+3*n-l),8)-.025;else if("tidal"===t){const t=e-.5,o=n-.5,a=Math.hypot(t,o),i=Math.sin(22*a-l)*h;r[0]=t*i*9,r[1]=o*i*9,r[2]=.035*i}else if("grain"===t){const t=s(Math.floor(160*e),Math.floor(100*n))*Math.PI*2;r[2]=.07*Math.sin(l+t)}else if("parallax"===t){const t=.45+.55*Math.max(0,1-1.4*Math.hypot(e-.5,n-.5));r[0]=12*Math.sin(l)*t*h,r[1]=6*(Math.cos(l)-1)*t*h}else if("weave"===t)r[0]=Math.sin(n*Math.PI*6+l)*Math.sin(l)*8*h,r[1]=Math.sin(e*Math.PI*6-l)*Math.sin(l)*6*h;else if("print"===t){const t=Math.floor(24*n),e=((o+3*s(t,3))%12+12)%12,a=i(1,2.5,e)*(1-i(3.5,5,e));r[0]=Math.sin(2.4*t)*a*9*h,r[1]=5*-a*h,r[2]=.22*-a,r[3]=1-.45*a}else if("trace"===t){const t=.5+.5*Math.cos(l);r[2]=.22*Math.pow(Math.max(0,1-Math.abs(a(c)-t)/.16),3)-.015}else if("relight"===t){const t=n-.5,o=1.3*((e-.5)*Math.cos(l)+t*Math.sin(l));r[2]=.3*o*(.25+3*a(c)*(1-a(c)))*h}else if("shimmer"===t){const t=s(Math.floor(160*e),Math.floor(100*n))*Math.PI*2,o=Math.pow(.5+.5*Math.cos(l+t),10);r[2]=.28*(o-.1762)*i(.35,.9,c)}else if("breeze"===t){const t=Math.sin(l-4*n),o=.35+.65*(1-n);r[0]=10*t*o*h,r[1]=2.5*Math.sin(2*l-4*n+3*e)*o*h,r[2]=.035*Math.cos(l-4*n)*h}else if("unfold"===t){const t=Math.floor(12*e),n=12*e-t-.5,a=((o-.11*t)%12+12)%12,s=i(1,3,a)*(1-i(5,7,a));r[0]=-n*s*24*h,r[1]=Math.sin(1.7*t)*s*3*h,r[2]=.12*-s,r[3]=1-.65*s}else if("reform"===t){const t=(o%12+12)%12,a=s(Math.floor(160*e),Math.floor(100*n)),c=.65*e+.2*n+.15*a+.08*Math.sin(8*e-5*n),d=i(1.8+1.2*c,3.8+1.2*c,t)*(1-i(5+1.7*c,7.2+1.7*c,t));r[0]=Math.sin(9*n+l)*d*(1-d)*24*h,r[1]=-d*(1-d)*(8+12*a)*h,r[2]=.45*-d,r[3]=1-.9*d}return r}function l(t,e){const n=document.createElement("canvas");n.width=t,n.height=e;const o=n.getContext("2d",{willReadFrequently:!0});return{canvas:n,ctx:o}}function h(t,e,n){let o=t+255*e;return o=259*(255*n+255)/(255*(259-255*n))*(o-128)+128,Math.max(0,Math.min(255,o))}function d(t,e,n,o,r,a){if((a?1-t/255:t/255)<.12)return" ";const i=[...e];return i[(o*r+n)%i.length]}var f=[[0,8,2,10],[12,4,14,6],[3,11,1,9],[15,7,13,5]];function m(t,e,n,o){if(o<=0)return t;const r=(f[n%4][e%4]/16-.5)*o*128;return Math.max(0,Math.min(255,t+r))}var u=new Array(256),g=new Array(256);for(let t=0;t<256;t++)u[t]=`rgb(${t},${t},${t})`,g[t]=`rgb(0,${t},0)`;function p(t,e,n,o,r,a=!1){switch(e){case"fullcolor":return`rgb(${t.r},${t.g},${t.b})`;case"matrix":return g[.299*t.r+.587*t.g+.114*t.b|0];case"accent":return`rgb(${n},${o},${r})`;default:{const e=.299*t.r+.587*t.g+.114*t.b|0;return u[e]}}}var M=[0,0,0];function v(t,e,n,o,r,a=!1){switch(e){case"fullcolor":M[0]=t.r,M[1]=t.g,M[2]=t.b;break;case"matrix":{const e=.299*t.r+.587*t.g+.114*t.b|0;M[0]=0,M[1]=e,M[2]=0;break}case"accent":M[0]=n,M[1]=o,M[2]=r;break;default:{const e=.299*t.r+.587*t.g+.114*t.b|0;M[0]=e,M[1]=e,M[2]=e;break}}return M}function w(t){const e=t.match(/rgba?\(\s*(\d+)\s*[,\s]\s*(\d+)\s*[,\s]\s*(\d+)(?:\s*[,/]\s*([\d.]+))?\s*\)/);return e?{r:+e[1],g:+e[2],b:+e[3],a:void 0!==e[4]?+e[4]:1}:null}function y(t){let e=t;for(;e&&e!==document.documentElement.parentElement;){const t=getComputedStyle(e).backgroundColor;if(t&&"transparent"!==t&&"rgba(0, 0, 0, 0)"!==t){const e=w(t);if(e&&e.a>.1)return e}e=e.parentElement}return null}function x(t){if(t){const e=y(t);if(e){return(.299*e.r+.587*e.g+.114*e.b)/255<.4}}if("undefined"!=typeof document){const t=document.documentElement,e=(t.getAttribute("data-theme")||"").toLowerCase();if("dark"===e)return!0;if("light"===e)return!1;if(t.classList.contains("dark"))return!0;if(document.body){const t=y(document.body);if(t){return(.299*t.r+.587*t.g+.114*t.b)/255<.4}}}return"undefined"!=typeof window&&window.matchMedia("(prefers-color-scheme: dark)").matches}function b(t){if("string"!=typeof t)return t;const e=document.createElement("canvas");e.width=1,e.height=1;const n=e.getContext("2d");n.fillStyle=t,n.fillRect(0,0,1,1);const o=n.getImageData(0,0,1,1).data;return{r:o[0],g:o[1],b:o[2]}}function S(t){return t*t*(3-2*t)}var E={scale:1,offsetX:0,offsetY:0,glow:0,colorBlend:0,proximity:0};function C(t,e,n,o,r,a,i,s,c="spotlight",l=.5,h="circle",d=[],f=1){const m=(t-n)*Math.max(1,f),u=(e-o)*Math.max(1,1/f),g=.08+.35*l+.04*a;let p,M;if("box"===h){const t=Math.abs(m),e=Math.abs(u);p=Math.max(t,e),M=g}else p=Math.sqrt(m*m+u*u),M=g;if(p>=M&&("trail"!==c||0===d.length))return E.scale=1,E.offsetX=0,E.offsetY=0,E.glow=0,E.colorBlend=0,E.proximity=0,E;const v=S(Math.max(0,1-p/M))*r;let w=1,y=0,x=0,b=0,C=0;switch(c){case"spotlight":{w=1+v*a*1.8;const t=Math.atan2(u,m),e=v*v*a*.6;y=Math.cos(t)*e*i,x=Math.sin(t)*e*s,b=v*a*.4,C=v*v*a*.25;break}case"magnify":w=1+v*a*.85,b=v*a*.15;break;case"repel":{w=1;const t=Math.atan2(u,m),e=v*v*a*1.8;y=Math.cos(t)*e*i,x=Math.sin(t)*e*s;break}case"glow":b=v*a*.8,C=v*a*.4;break;case"colorShift":w=1,b=v*a*.12,C=v*a;break;case"attract":{const t=Math.atan2(u,m),e=v*v*a*1;y=(.45*-Math.cos(t)-1.6*Math.sin(t))*e*i,x=(.45*-Math.sin(t)+1.6*Math.cos(t))*e*s,b=v*a*.3;break}case"shatter":{const t=Math.atan2(u,m),e=.5*Math.sin(43.7*m+29.3*u),n=v*a*1.4*(.7+.3*e);y=Math.cos(t+e)*n*i,x=Math.sin(t+e)*n*s,w=Math.max(.1,1-v*a*.6),b=v*a*.25;break}case"trail":{let n=v,o=-u*v,r=m*v;for(const a of d){const i=(t-a.x)*Math.max(1,f),s=(e-a.y)*Math.max(1,1/f),c=Math.hypot(i,s)/g;if(c>=1)continue;const l=S(1-c)*a.intensity;n=Math.max(n,l),o+=(.35*a.vx-2*s)*l*.35,r+=(.35*a.vy+2*i)*l*.35}y=Math.tanh(2*o)*a*i*3,x=Math.tanh(2*r)*a*s*3,C=n*a*.65,b=n*a*.35,w=1+n*a*.08,E.proximity=n;break}case"glitchText":w=1,b=v*a*.5,C=v*a*.6}return E.scale=w,E.offsetX=y,E.offsetY=x,E.glow=b,E.colorBlend=C,"trail"!==c&&(E.proximity=v),E}function T(t,e,{continuous:n=!1,interactive:o=!1}={}){const r=t.parentElement??t;let a=null,i=0,s=!1,c=!0,l=!0,h=-1/0;const d=window.matchMedia("(prefers-reduced-motion: reduce)"),f=()=>{l=!0,s||!c||document.hidden||i||(i=requestAnimationFrame(m))},m=t=>{if(i=0,s||!c||document.hidden)return;const o=!d.matches&&(n||t-h<1500);(l||o)&&(e(t,d.matches?null:a),l=!1),o&&(i=requestAnimationFrame(m))},u=e=>{if("touch"===e.pointerType)return;const n=t.getBoundingClientRect();if(!n.width||!n.height)return;const o=(e.clientX-n.left)/n.width,r=(e.clientY-n.top)/n.height;a=o>=0&&o<=1&&r>=0&&r<=1?{x:o,y:r}:null,h=performance.now(),f()},g=()=>{a=null,h=performance.now(),f()},p=()=>{document.hidden&&i?(cancelAnimationFrame(i),i=0):f()},M="undefined"==typeof IntersectionObserver?null:new IntersectionObserver(([t])=>{c=t.isIntersecting,c?f():i&&(cancelAnimationFrame(i),i=0)});return M?.observe(t),o&&(r.addEventListener("pointermove",u),r.addEventListener("pointerleave",g)),document.addEventListener("visibilitychange",p),d.addEventListener("change",f),f(),{wake:f,stop:()=>{s=!0,cancelAnimationFrame(i),M?.disconnect(),r.removeEventListener("pointermove",u),r.removeEventListener("pointerleave",g),document.removeEventListener("visibilitychange",p),d.removeEventListener("change",f)}}}var A=null,F=null;function L(t,e){if(!A||!F){const n=l(t,e);A=n.canvas,F=n.ctx}return A.width!==t&&(A.width=t),A.height!==e&&(A.height=e),F}var I=new Map,R=new Map,k=new WeakMap;function H(t){const e=Intl.Segmenter;return e?Array.from(new e(void 0,{granularity:"grapheme"}).segment(t),({segment:t})=>t):[...t]}function W(t){let e=I.get(t);return e||(e=H(t),I.set(t,e)),e}function $(t){return H(t)}function P(t,e,n){const o=n?1-t/255:t/255,r=Math.floor(o*(e.length-1));return e[Math.max(0,Math.min(e.length-1,r))]??" "}function j(t,e,n,o){const r=`${t}\0${e?1:0}\0${n}\0${o}`;let a=R.get(r);if(!a){const i=W(t);a=new Array(256);for(let t=0;t<256;t++)a[t]=P(h(t,n,o),i,e);R.set(r,a)}return a}function z(){I.clear(),R.clear(),J=new WeakMap,Z=new WeakMap,Q=new WeakMap,A=null,F=null}function O(t,e){return"auto"!==t?t:!x(e)}function q(t){const e=t.match(/^#([0-9a-fA-F]{3,6})$/);if(e){let t=e[1];if(3===t.length&&(t=t[0]+t[0]+t[1]+t[1]+t[2]+t[2]),6===t.length)return t}const n=t.match(/rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/);return n?[n[1],n[2],n[3]].map(t=>parseInt(t).toString(16).padStart(2,"0")).join(""):null}function B(t){const e=t||"auto";if("auto"!==e)return q(e)??"ffffff";if("undefined"!=typeof document){const t=getComputedStyle(document.documentElement);for(const e of["--accent-color","--color-accent","--accent","--color-primary","--primary","--brand-color"]){const n=q(t.getPropertyValue(e).trim());if(n)return n}const e=q(getComputedStyle(document.body).accentColor??"");if(e)return e}return x("undefined"!=typeof document?document.body:null)?"faf9f7":"0d0d0d"}function V(t,e,n){return Math.max(e,Math.min(n,t))}function D(t,e,n){if(!t)return{x:0,y:0,width:e,height:n};const o=t.unit??"percent",r=!1!==t.preserveAspect,a=t=>void 0===t?void 0:"percent"===o?t*e:t,i=t=>void 0===t?void 0:"percent"===o?t*n:t,s=V(a(t.left)??0,0,e-1),c=V(a(t.right)??0,0,e-s-1),l=V(i(t.top)??0,0,n-1),h=V(i(t.bottom)??0,0,n-l-1),d=void 0!==t.left||void 0!==t.right||void 0!==t.top||void 0!==t.bottom,f=Math.max(1,e-s-c),m=Math.max(1,n-l-h),u=d?f:a(t.width),g=d?m:i(t.height);let p=u??e,M=g??n;if(r&&!d){const t=p/e,o=M/n,r=Math.min(t,o),a=void 0===u?o:void 0===g?t:r;p=e*a,M=n*a}p=V(p,1,d?f:e),M=V(M,1,d?m:n);const v=t.anchor??"center",w=a(t.x),y=i(t.y),x=d?s:0,b=d?l:0,S=d?f:e,E=d?m:n,C=v.endsWith("left")||"left"===v?0:v.endsWith("right")||"right"===v?S-p:(S-p)/2,T=v.startsWith("top")||"top"===v?0:v.startsWith("bottom")||"bottom"===v?E-M:(E-M)/2;return{x:V(w??x+C,0,Math.max(0,e-p)),y:V(y??b+T,0,Math.max(0,n-M)),width:p,height:M}}function N(t,e,n,o){const r=t instanceof HTMLVideoElement?t.videoWidth:t.width,a=t instanceof HTMLVideoElement?t.videoHeight:t.height;if(0===r||0===a)return{frame:[],cols:0,rows:0};const i=e.charAspect,s=e.fontSize*e.charSpacing,c=e.fontSize/i*e.charSpacing,l=n||r,f=o||a,u=Math.floor(l/s),g=Math.floor(f/c);if(u<=0||g<=0)return{frame:[],cols:0,rows:0};const p=D(e.sourceCrop,r,a),M=Math.max(1,Math.min(Math.floor(2048/u),Math.floor(p.width/u))),v=Math.max(1,Math.min(Math.floor(2048/g),Math.floor(p.height/g))),w=u*M,y=g*v,x=L(w,y),S=x.globalCompositeOperation;x.globalCompositeOperation="copy";try{x.drawImage(t,p.x,p.y,p.width,p.height,0,0,w,y)}finally{x.globalCompositeOperation=S}const E=x.getImageData(0,0,w,y).data,C=e.chromaKey,T=null!=C&&!1!==C,A=!0===C,F="blue-screen"===C;let I=null,R=0;!T||A||F||(I=b(C),R=(e.chromaKeyTolerance??60)**2);let k=0,H=255;if(e.normalize){let t=255,e=0;for(let n=0;n<E.length;n+=4){if(T){const t=E[n],e=E[n+1],o=E[n+2];let r=!1;if(A)r=e>1.4*t&&e>1.4*o&&e>80;else if(F)r=o>1.4*t&&o>1.4*e&&o>80;else if(null!==I){const n=t-I.r,a=e-I.g,i=o-I.b;r=n*n+a*a+i*i<=R}if(r)continue}const o=.299*E[n]+.587*E[n+1]+.114*E[n+2];o<t&&(t=o),o>e&&(e=o)}k=t,H=e>t?e-t:255}const $=[],z=O(e.invert),q=T&&e.charset.replace(/ /g,"")||e.charset,B=W(q),V=e.customText?null:j(q,z,e.brightness,e.contrast),N=M*v;for(let t=0;t<g;t++){const n=[];for(let o=0;o<u;o++){let r=0,a=0,i=0,s=0,c=0;for(let e=0;e<v;e++){const n=(t*v+e)*w;for(let t=0;t<M;t++){const e=4*(n+o*M+t),l=E[e],h=E[e+1],d=E[e+2],f=E[e+3];if(T){let t=!1;if(A)t=h>1.4*l&&h>1.4*d&&h>80;else if(F)t=d>1.4*l&&d>1.4*h&&d>80;else if(null!==I){const e=l-I.r,n=h-I.g,o=d-I.b;t=e*e+n*n+o*o<=R}if(t){c++;continue}}r+=l,a+=h,i+=d,s+=f}}if(T&&c>N/2){n.push({char:" ",r:0,g:0,b:0,a:0});continue}const l=N-c,f=l>0?r/l:0,g=l>0?a/l:0,p=l>0?i/l:0,y=l>0?s/l:0,x=.299*f+.587*g+.114*p,b=e.normalize?(x-k)/H*255:x,S=h(b,e.brightness,e.contrast),C=e.ditherStrength>0?m(S,o,t,e.ditherStrength):S,L=e.customText?d(C,e.customText,o,t,u,z):e.ditherStrength>0?P(C,B,z):V[Math.max(0,Math.min(255,0|b))];n.push({char:L,r:f,g:g,b:p,a:y,lum:C})}$.push(n)}return{frame:$,cols:u,rows:g}}function U(t,e,n,o){const r=t instanceof HTMLVideoElement?t.videoWidth:t.width,a=t instanceof HTMLVideoElement?t.videoHeight:t.height;if(0===r||0===a)return{rows:[],cols:0,rowCount:0};const i=e.charAspect,s=e.fontSize*e.charSpacing,c=e.fontSize/i*e.charSpacing,l=n||r,d=o||a,f=Math.floor(l/s),u=Math.floor(d/c);if(f<=0||u<=0)return{rows:[],cols:0,rowCount:0};const g=f,p=u,M=L(g,p),v=D(e.sourceCrop,r,a),w=M.globalCompositeOperation;M.globalCompositeOperation="copy";try{M.drawImage(t,v.x,v.y,v.width,v.height,0,0,g,p)}finally{M.globalCompositeOperation=w}const y=M.getImageData(0,0,g,p).data,x=e.chromaKey,S=null!=x&&!1!==x,E=!0===x,C="blue-screen"===x;let T=null,A=0;!S||E||C||(T=b(x),A=(e.chromaKeyTolerance??60)**2);let F=0,I=255;if(e.normalize){let t=255,e=0;for(let n=0;n<y.length;n+=4){if(S){const t=y[n],e=y[n+1],o=y[n+2];let r=!1;if(E)r=e>1.4*t&&e>1.4*o&&e>80;else if(C)r=o>1.4*t&&o>1.4*e&&o>80;else if(null!==T){const n=t-T.r,a=e-T.g,i=o-T.b;r=n*n+a*a+i*i<=A}if(r)continue}const o=.299*y[n]+.587*y[n+1]+.114*y[n+2];o<t&&(t=o),o>e&&(e=o)}F=t,I=e>t?e-t:255}const R=O(e.invert),k=S&&e.charset.replace(/ /g,"")||e.charset,H=W(k),$=e.customText?null:j(k,R,e.brightness,e.contrast),z=e.customText?W(e.customText):null,q="fullcolor"===e.colorMode?new Uint8ClampedArray(f*u*4):void 0,B=[];for(let t=0;t<u;t++){let n="";for(let o=0;o<f;o++){const r=4*(t*g+o),a=r,i=y[r],s=y[r+1],c=y[r+2],l=y[r+3];if(S){let t=!1;if(E)t=s>1.4*i&&s>1.4*c&&s>80;else if(C)t=c>1.4*i&&c>1.4*s&&c>80;else if(null!==T){const e=i-T.r,n=s-T.g,o=c-T.b;t=e*e+n*n+o*o<=A}if(t){n+=" ",q&&(q[a]=0,q[a+1]=0,q[a+2]=0,q[a+3]=0);continue}}q&&(q[a]=i,q[a+1]=s,q[a+2]=c,q[a+3]=l);const d=.299*i+.587*s+.114*c,u=e.normalize?(d-F)/I*255:d,p=e.ditherStrength>0||z?h(u,e.brightness,e.contrast):u,M=e.ditherStrength>0?m(p,o,t,e.ditherStrength):p;if(z){n+=(R?1-M/255:M/255)<.12?" ":z[(t*f+o)%z.length]}else e.ditherStrength<=0?n+=$[Math.max(0,Math.min(255,0|u))]:n+=P(M,H,R)}B.push(n)}return{rows:B,cols:f,rowCount:u,colors:q}}function K(t,e,n,o,r){if(0===e.rows.length)return;const a=t.canvas,i=Boolean(n.chromaKey)||e.rows.some(t=>t.includes(" "));i||(k.delete(t),t.clearRect(0,0,o,r),t.fillStyle=x(a)?"#0a0a0a":"#faf9f7",t.fillRect(0,0,o,r));const s=B(n.accentColor),c=parseInt(s.substring(0,2),16),l=parseInt(s.substring(2,4),16),h=parseInt(s.substring(4,6),16),d=o/e.cols,f=r/e.rowCount,m=.9*Math.min(d/.55,f),u=e.colors;if("fullcolor"===n.colorMode&&u){k.delete(t),t.clearRect(0,0,o,r),t.font=`${m}px "JetBrains Mono", monospace`,t.textAlign="left",t.textBaseline="middle",t.globalAlpha=1;let n="";for(let o=0;o<e.rows.length;o++){const r=$(e.rows[o]);let a=0;for(;a<e.cols;){for(;a<e.cols&&" "===r[a];)a++;if(a>=e.cols)break;const i=a,s=4*(o*e.cols+a),c=240&u[s],l=240&u[s+1],h=240&u[s+2];for(a++;a<e.cols&&" "!==r[a];){const t=4*(o*e.cols+a);if((240&u[t])!==c||(240&u[t+1])!==l||(240&u[t+2])!==h)break;a++}const m=`rgb(${c},${l},${h})`;m!==n&&(t.fillStyle=m,n=m),t.fillText(r.slice(i,a).join(""),i*d+.5*d,o*f+.5*f)}}return void(t.globalAlpha=1)}t.font=`${m}px "JetBrains Mono", monospace`,t.textAlign="left",t.textBaseline="middle";const g="matrix"===n.colorMode?"rgb(0,255,0)":"grayscale"===n.colorMode?x(a)?"rgb(230,230,230)":"rgb(24,24,24)":`rgb(${c},${l},${h})`;t.fillStyle=g,t.globalAlpha=1;const p=k.get(t),M=i&&p&&p.cols===e.cols&&p.rowCount===e.rowCount&&p.canvasWidth===o&&p.canvasHeight===r&&p.fillStyle===g;M||t.clearRect(0,0,o,r);for(let n=0;n<e.rows.length;n++){const r=e.rows[n];M&&p.rows[n]===r||(M&&t.clearRect(0,n*f,o,f+1),0!==r.trim().length&&t.fillText(r,.5*d,n*f+.5*f))}k.set(t,{rows:e.rows.slice(),cols:e.cols,rowCount:e.rowCount,canvasWidth:o,canvasHeight:r,fillStyle:g}),t.globalAlpha=1}async function Y(t,e,n,o,r=12,a=10,i,s=0){const c=Math.min(t.duration-s,a),l=Math.ceil(c*r),h=[];let d=0,f=0;for(let a=0;a<l;a++){const m=s+a/r;if(m>s+c)break;t.currentTime=m,await new Promise(e=>{const n=()=>{t.removeEventListener("seeked",n),e()};t.addEventListener("seeked",n)});const u=N(t,e,n,o);h.push(u.frame),d=u.cols,f=u.rows,i?.((a+1)/l)}return{frames:h,cols:d,rows:f,fps:r}}async function G(t,e,n,o,r=12,a=10,i,s=0){const c=Math.min(t.duration-s,a),l=Math.ceil(c*r),h=[];let d=0,f=0;for(let a=0;a<l;a++){const m=s+a/r;if(m>s+c)break;t.currentTime=m,await new Promise(e=>{const n=()=>{t.removeEventListener("seeked",n),e()};t.addEventListener("seeked",n)});const u=U(t,e,n,o);h.push(u),d=u.cols,f=u.rowCount,i?.((a+1)/l)}return{frames:h,cols:d,rows:f,fps:r}}async function X(t,e,n,o,r){const{parseGIF:a,decompressFrames:i}=await import("gifuct-js"),s=a(t),c=i(s,!0);if(0===c.length)return{frames:[],cols:0,rows:0,fps:10};const l=c[0].dims.width,h=c[0].dims.height,d=s.lsd?.width||l,f=s.lsd?.height||h,m=document.createElement("canvas");m.width=d,m.height=f;const u=m.getContext("2d"),g=document.createElement("canvas");g.width=d,g.height=f;const p=g.getContext("2d"),M=document.createElement("canvas"),v=M.getContext("2d"),w=[];let y=0,x=0,b=0;for(const t of c)b+=t.delay||100;const S=b/c.length,E=Math.round(Math.min(30,Math.max(5,1e3/S))),C=Math.min(c.length,300);for(let t=0;t<C;t++){const a=c[t],{dims:i,patch:s,disposalType:l}=a;3===l&&(p.clearRect(0,0,d,f),p.drawImage(m,0,0)),M.width!==i.width&&(M.width=i.width),M.height!==i.height&&(M.height=i.height);const h=new ImageData(new Uint8ClampedArray(s.buffer),i.width,i.height);v.putImageData(h,0,0),u.drawImage(M,i.left||0,i.top||0);const b=N(m,e,n,o);w.push(b.frame),y=b.cols,x=b.rows,2===l?u.clearRect(i.left||0,i.top||0,i.width,i.height):3===l&&(u.clearRect(0,0,d,f),u.drawImage(g,0,0)),r?.((t+1)/C)}return{frames:w,cols:y,rows:x,fps:E}}async function _(t,e,n,o,r){const{parseGIF:a,decompressFrames:i}=await import("gifuct-js"),s=a(t),c=i(s,!0);if(0===c.length)return{frames:[],cols:0,rows:0,fps:10};const l=c[0].dims.width,h=c[0].dims.height,d=s.lsd?.width||l,f=s.lsd?.height||h,m=document.createElement("canvas");m.width=d,m.height=f;const u=m.getContext("2d"),g=document.createElement("canvas");g.width=d,g.height=f;const p=g.getContext("2d"),M=document.createElement("canvas"),v=M.getContext("2d"),w=[];let y=0,x=0,b=0;for(const t of c)b+=t.delay||100;const S=b/c.length,E=Math.round(Math.min(30,Math.max(5,1e3/S))),C=Math.min(c.length,300);for(let t=0;t<C;t++){const a=c[t],{dims:i,patch:s,disposalType:l}=a;3===l&&(p.clearRect(0,0,d,f),p.drawImage(m,0,0)),M.width!==i.width&&(M.width=i.width),M.height!==i.height&&(M.height=i.height);const h=new ImageData(new Uint8ClampedArray(s.buffer),i.width,i.height);v.putImageData(h,0,0),u.drawImage(M,i.left||0,i.top||0);const b=U(m,e,n,o);w.push(b),y=b.cols,x=b.rowCount,2===l?u.clearRect(i.left||0,i.top||0,i.width,i.height):3===l&&(u.clearRect(0,0,d,f),u.drawImage(g,0,0)),r?.((t+1)/C)}return{frames:w,cols:y,rows:x,fps:E}}var J=new WeakMap,Q=new WeakMap,Z=new WeakMap;function tt(t,e,n,o,r,a=0,i){if(!e.length||!e[0].length||o<=0||r<=0)return;let s=null;if(n.hoverStrength>0){let e=J.get(t);e||(e={x:.5,y:.5,intensity:0,time:-1,emittedAt:-1,points:[]},J.set(t,e)),s=function(t,e,n){const o=t.time<0?1/60:Math.max(0,Math.min(.1,(n-t.time)/1e3));t.time=n;const r=t.intensity<.003,a=t.x,i=t.y;if(e){r&&(t.x=e.x,t.y=e.y);const n=1-Math.exp(-o/.055);t.x+=(e.x-t.x)*n,t.y+=(e.y-t.y)*n}t.intensity+=((e?.intensity??(e?1:0))-t.intensity)*(1-Math.exp(-o/(e?.09:.18)));const s=Math.exp(-o/.22);for(const e of t.points)e.intensity*=s;for(;t.points.length&&t.points[0].intensity<.01;)t.points.shift();return e&&!r&&n-t.emittedAt>=24&&Math.hypot(t.x-a,t.y-i)>5e-4&&(t.points.push({x:t.x,y:t.y,intensity:t.intensity,vx:Math.max(-1,Math.min(1,(t.x-a)/Math.max(o,.001))),vy:Math.max(-1,Math.min(1,(t.y-i)/Math.max(o,.001)))}),t.points.length>12&&t.points.shift(),t.emittedAt=n),!e&&t.intensity<.003&&!t.points.length?(t.intensity=0,null):{x:t.x,y:t.y,intensity:t.intensity,trail:t.points}}(e,i??null,performance.now())}else J.delete(t);if("none"!==n.animationStyle||n.charsetFrames?.length||n.hoverStrength<=0)return Z.delete(t),void et(t,e,n,o,r,a,s);const c=Q.get(t);if(c?.frame!==e)return Q.set(t,{frame:e,since:performance.now()}),Z.delete(t),void et(t,e,n,o,r,a,s);if(performance.now()-c.since<100)return void et(t,e,n,o,r,a,s);const l=t.getTransform();if(l.b||l.c||l.a<=0||l.d<=0)return void et(t,e,n,o,r,a,s);if(!s||(s.intensity??0)<.003)return void et(t,e,n,o,r,a,null);const h=x(t.canvas),d={...n,accentColor:"#"+B(n.accentColor)},f=JSON.stringify([d,o,r,l.a,l.d,h,void 0!==document.fonts?document.fonts.status:"loaded"]);let m=Z.get(t);if(!m||m.frame!==e||m.key!==f){const n=m?.canvas??document.createElement("canvas");n.width=Math.ceil(o*l.a),n.height=Math.ceil(r*l.d);const a=n.getContext("2d");a.setTransform(l.a,0,0,l.d,0,0),et(a,e,d,o,r,0,null,void 0,h),m={frame:e,key:f,canvas:n},Z.set(t,m)}if(t.clearRect(0,0,o,r),t.drawImage(m.canvas,0,0,o,r),!s||(s.intensity??0)<.003)return;const u=e.length,g=e[0].length,p=.08+.35*n.hoverRadius+.04*n.hoverStrength,M="trail"===n.hoverEffect?[s,...s.trail??[]]:[s];let v=1,w=1,y=0,b=0;for(const t of M)v=Math.min(v,t.x-p),y=Math.max(y,t.x+p),w=Math.min(w,t.y-p),b=Math.max(b,t.y+p);if("glitchText"===n.hoverEffect){const t=n.hoverText,e=Math.max(1,...(Array.isArray(t)?t:[t]).map(t=>t.length));v=Math.min(v,s.x-e/g),y=Math.max(y,s.x+e/g)}const S=Math.ceil(5+4*n.hoverStrength),E={x:Math.max(0,Math.floor(v*g)-S),y:Math.max(0,Math.floor(w*u)-S),right:Math.min(g,Math.ceil(y*g)+S),bottom:Math.min(u,Math.ceil(b*u)+S)};t.save(),t.beginPath(),t.rect(E.x*o/g,E.y*r/u,(E.right-E.x)*o/g,(E.bottom-E.y)*r/u),t.clip(),et(t,e,d,o,r,a,s,E,h),t.restore()}function et(t,e,n,o,a,i=0,s,l,h){const d=e.length;if(0===d)return;const f=e[0].length;t.clearRect(0,0,o,a);let m=!1;const u=Math.max(1,d>>2),g=Math.max(1,f>>2);t:for(let t=0;t<d;t+=u){const n=e[t];for(let t=0;t<f;t+=g)if(n[t].a<200){m=!0;break t}}const M=t.canvas,w=h??x(M);m||(t.fillStyle=w?"#0a0a0a":"#faf9f7",t.fillRect(0,0,o,a));const y=o/f,b=a/d,S=s?.intensity??1,E=!!(s&&n.hoverStrength>0&&S>.005),T="#"+(q(n.hoverColor||"#ffffff")??"ffffff"),A=parseInt(T.slice(1,3),16),F=parseInt(T.slice(3,5),16),L=parseInt(T.slice(5,7),16),I=B(n.accentColor),R=parseInt(I.substring(0,2),16),k=parseInt(I.substring(2,4),16),H=parseInt(I.substring(4,6),16),$=n.hoverRadius;let j=0,z=f,V=0,D=d,N=0,U=0;if(E&&s){N=s.x,U=s.y;const t=.08+.35*$+.04*n.hoverStrength;j=Math.max(0,Math.floor((N-t)*f)-1),z=Math.min(f,Math.ceil((N+t)*f)+1),V=Math.max(0,Math.floor((U-t)*d)-1),D=Math.min(d,Math.ceil((U+t)*d)+1)}if(E&&"trail"===n.hoverEffect)for(const t of s?.trail??[]){const e=.08+.35*$+.04*n.hoverStrength;j=Math.min(j,Math.max(0,Math.floor((t.x-e)*f)-1)),z=Math.max(z,Math.min(f,Math.ceil((t.x+e)*f)+1)),V=Math.min(V,Math.max(0,Math.floor((t.y-e)*d)-1)),D=Math.max(D,Math.min(d,Math.ceil((t.y+e)*d)+1))}const K=n.animationStyle,Y=n.animationSpeed,G=(X=K,r.find(t=>t.value===X||t.mode===X)?.mode??"none");var X;const _="none"===G,J=[0,0,0,1],Q=n.hoverStrength,Z=n.hoverEffect,tt=$,et=n.hoverShape||"circle",nt=O(n.invert,M),ot=n.colorMode,rt=2*Math.PI,at=1/f,it=1/d;let st="",ct=-1;if("dots"===n.renderMode){const r=.5*Math.min(y,b)*n.dotSizeRatio;for(let n=l?.y??0;n<(l?.bottom??d);n++){const h=e[n];for(let e=l?.x??0;e<(l?.right??f);e++){const l=h[e];if(l.a<10)continue;const m=.00392156863*(.299*l.r+.587*l.g+.114*l.b),u=nt?1-m:m;if(u<.02)continue;_||c(G,e/f,n/d,i*Y,J,(.299*l.r+.587*l.g+.114*l.b)/255);const g=Math.max(0,Math.min(1,(1+J[2])*J[3]));let M=1,w=0,x=0,T=0,I=0;if(E&&e>=j&&e<=z&&n>=V&&n<=D){const t=C(e*at,n*it,N,U,S,Q,y,b,Z,tt,et,s?.trail,o/a);M=t.scale,w=t.offsetX,x=t.offsetY,T=t.glow,I=t.colorBlend}const W=r*u*g*M;if(W<.3)continue;const $=e*y+.5*y+w+J[0],P=n*b+.5*b+x+J[1];let O;if(I>0){const t=v(l,ot,R,k,H,nt);O=`rgb(${Math.min(255,t[0]+(A-t[0])*I|0)},${Math.min(255,t[1]+(F-t[1])*I|0)},${Math.min(255,t[2]+(L-t[2])*I|0)})`}else O=p(l,ot,R,k,H,nt);const q=Math.min(1,.00392156863*l.a*g*(1+T));if(q!==ct&&(t.globalAlpha=q,ct=q),O!==st&&(t.fillStyle=O,st=O),W<=3){const e=2*W;t.fillRect($-W,P-W,e,e)}else t.beginPath(),t.arc($,P,W,0,rt),t.fill()}}}else{const r=.55,h=.9*Math.min(y/r,b);{const e=/\p{Extended_Pictographic}/u.test(n.customText||n.charset);t.font=e?`${h}px "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", "Twemoji Mozilla", sans-serif`:`${h}px "JetBrains Mono", monospace`,t.textAlign="center",t.textBaseline="middle"}const m=n.charsetFrames,u=!!m?.length,g=u?m[Math.floor(Math.max(0,i)*(n.charsetFps??2))%m.length]:n.charset,M=t.getTransform();if(!E&&_&&!u&&"accent"===ot&&!l&&n.hoverStrength<=0&&!/\p{Extended_Pictographic}/u.test(n.customText||n.charset)&&"letterSpacing"in t&&/^[\x20-\x7e]*$/.test(n.customText||n.charset)&&e.every(t=>t.every(t=>t.a<10||255===t.a&&1===t.char.length&&/^[\x20-\x7e]$/.test(t.char)))){const n=t.letterSpacing;t.letterSpacing="0px";const o=t.measureText("M").width;t.letterSpacing=y-o+"px",t.fillStyle=`rgb(${R},${k},${H})`,t.globalAlpha=1,t.textAlign="left";for(let n=0;n<d;n++){const r=e[n];let a="";for(let t=0;t<f;t++){const e=r[t];a+=e.a<10?" ":e.char}0!==a.trim().length&&t.fillText(a,.5*(y-o),n*b+.5*b)}return t.letterSpacing=n,t.textAlign="center",void(t.globalAlpha=1)}const w="glitchText"===Z&&E,x="!@#$%^&*<>{}[]|/\\~`0123456789",T=x.length;let I="",O=0,q=0,B=0,K=0,X=0,rt=0;if(w){const t=n.hoverText??"ASCIIFY";if(q=Math.round(N*f),B=Math.round(U*d),Array.isArray(t)){const e=t.filter(t=>t.length>0);0===e.length&&e.push("ASCIIFY");I=e[((7*Math.floor(q/Math.max(1,Math.ceil(f/5)))+13*Math.floor(B/Math.max(1,Math.ceil(d/3))))%e.length+e.length)%e.length]}else I=t||"ASCIIFY";O=I.length,K=Math.max(3,Math.min(12,Math.round(d*$*.6)));const e=Math.floor(K/2);X=Math.max(0,B-e),X+K>d&&(X=Math.max(0,d-K)),rt=q-Math.floor(O/2)}for(let n=l?.y??0;n<(l?.bottom??d);n++){const r=e[n];for(let h=l?.x??0;h<(l?.right??f);h++){const l=r[h];if(l.a<10)continue;let m=u&&null!=l.lum?P(l.lum,W(g),nt):l.char;if(" "===m)continue;_||c(G,h/f,n/d,i*Y,J,(.299*l.r+.587*l.g+.114*l.b)/255);const $=Math.max(0,Math.min(1,(1+J[2])*J[3]));if($<.05)continue;let lt=1,ht=0,dt=0,ft=0,mt=0;if(E&&!w&&h>=j&&h<=z&&n>=V&&n<=D){const t=C(h*at,n*it,N,U,S,Q,y,b,Z,tt,et,s?.trail,o/a);if(lt=t.scale,ht=t.offsetX,dt=t.offsetY,ft=t.glow,mt=t.colorBlend,"trail"===Z&&t.proximity>0){const o=Math.max(0,Math.min(f-1,Math.round(h-t.offsetX/y))),r=e[Math.max(0,Math.min(d-1,Math.round(n-t.offsetY/b)))][o],a=r.lum??.299*r.r+.587*r.g+.114*r.b;m=P(Math.min(255,a+t.proximity*Q*65),W(g),nt)}}if(w&&n>=X&&n<X+K){const t=h-rt;if(t>=0&&t<O){const e=I[t],o=Math.abs(n-B)/Math.max(1,.5*K),r=Math.abs(h-q)/Math.max(1,O),a=Math.max(o,r),s=Math.max(0,Math.min(1,1-.9*a)),c=43758.5453*Math.sin(127.1*h+311.7*n+43758.5453*Math.floor(12*i));m=Math.abs(c-Math.floor(c))<s?e:x[Math.abs(Math.floor(97*c))%T],ft=.3+.7*s,mt=.3+.65*s}}const ut=h*y+.5*y+ht+J[0],gt=n*b+.5*b+dt+J[1];let pt;if(mt>0){const t=v(l,ot,R,k,H,nt);pt=`rgb(${Math.min(255,t[0]+(A-t[0])*mt|0)},${Math.min(255,t[1]+(F-t[1])*mt|0)},${Math.min(255,t[2]+(L-t[2])*mt|0)})`}else pt=p(l,ot,R,k,H,nt);const Mt=Math.min(1,.00392156863*l.a*$*(1+ft));Mt!==ct&&(t.globalAlpha=Mt,ct=Mt),pt!==st&&(t.fillStyle=pt,st=pt),1!==lt?(t.translate(ut,gt),t.scale(lt,lt),t.fillText(m,0,0),t.setTransform(M)):t.fillText(m,ut,gt)}}}t.globalAlpha=1}function nt(t="classic"){if("classic"!==t)throw new RangeError(`Art preset "${String(t)}" was removed in 4.1. Use a StudioStyle with asciify-engine/studio, or supply options.charset directly.`);return{artStyle:"classic"}}function ot(t){return Math.max(0,Math.min(1,t))}function rt(t){return"string"==typeof t?document.querySelector(t):t instanceof HTMLElement?t:null}function at(t){return"ascii"===t.renderMode&&"none"===t.animationStyle&&t.hoverStrength<=0&&!t.charsetFrames?.length}function it(t,e={}){const n=ot(t),o=ot(n*(void 0===e.speed?1:Math.max(.001,e.speed)));return ot(e.ease?e.ease(o):o)}function st(t,e,n={}){if(!Number.isFinite(t.duration)||t.duration<=0)return;const o=n.from??0,r=n.to??t.duration,a=Math.max(o,Math.min(r,t.duration)),i=it(e,n),s=o+(a-o)*i;t.currentTime=Math.min(Math.max(o,s),Math.max(o,a-.04)),n.onUpdate?.(i,t)}function ct(t,e){return Math.abs(t.currentTime-e)<1/240?lt(t):new Promise(n=>{const o=()=>{t.removeEventListener("seeked",o),n()};t.addEventListener("seeked",o,{once:!0});const r=t.fastSeek;r?r.call(t,e):t.currentTime=e})}function lt(t){const e=t.requestVideoFrameCallback;return new Promise(e?n=>{let o=!1;const r=()=>{o||(o=!0,n())};e.call(t,r),window.setTimeout(r,32)}:t=>requestAnimationFrame(()=>t()))}function ht(t,e={}){const n=rt(e.trigger)??t;t.pause();const o=e.gsap,r=e.ScrollTrigger??o?.ScrollTrigger;if(o&&r?.create){o.registerPlugin?.(r);const a=r.create({trigger:n,start:e.start??"top bottom",end:e.end??"bottom top",scrub:e.scrub??!0,onUpdate:n=>st(t,n.progress,e)});return()=>a.kill?.()}return function(t,e,n){let o=0;const r=()=>{o=0;const r=e.getBoundingClientRect(),a=window.innerHeight||document.documentElement.clientHeight,i=r.height+a,s=i>0?ot((a-r.top)/i):0;st(t,s,n)},a=()=>{o||(o=requestAnimationFrame(r))};return window.addEventListener("scroll",a,{passive:!0}),window.addEventListener("resize",a),a(),()=>{window.removeEventListener("scroll",a),window.removeEventListener("resize",a),o&&cancelAnimationFrame(o)}}(t,n,e)}function dt(t,e,n){const o=e.gsap,r=e.ScrollTrigger??o?.ScrollTrigger;if(o&&r?.create){o.registerPlugin?.(r);const a=r.create({trigger:t,start:e.start??"top bottom",end:e.end??"bottom top",scrub:e.scrub??!0,onUpdate:t=>n(t.progress)});return()=>a.kill?.()}return function(t,e){let n=0;const o=()=>{n=0;const o=t.getBoundingClientRect(),r=window.innerHeight||document.documentElement.clientHeight,a=o.height+r,i=a>0?ot((r-o.top)/a):0;e(i)},r=()=>{n||(n=requestAnimationFrame(o))};return window.addEventListener("scroll",r,{passive:!0}),window.addEventListener("resize",r),r(),()=>{window.removeEventListener("scroll",r),window.removeEventListener("resize",r),n&&cancelAnimationFrame(n)}}(t,n)}function ft(t,e,n){if(!t||!e||!n.sourceCrop)return{w:t,h:e};const o=D(n.sourceCrop,t,e);return{w:Math.max(1,Math.round(o.width)),h:Math.max(1,Math.round(o.height))}}function mt(t,e,n,o){const r=o.chromaKey;if(null==r||!1===r)return!1;if(!0===r)return e>1.4*t&&e>1.4*n&&e>80;if("blue-screen"===r)return n>1.4*t&&n>1.4*e&&n>80;const a=b(r),i=(o.chromaKeyTolerance??60)**2,s=t-a.r,c=e-a.g,l=n-a.b;return s*s+c*c+l*l<=i}function ut(t,e,n){if(!e.chromaKey||!e.sourceCrop||"off"===e.chromaKeyTrimMode)return e;const o=t instanceof HTMLVideoElement?t.videoWidth:t.width,r=t instanceof HTMLVideoElement?t.videoHeight:t.height;if(!o||!r)return e;const a=D(e.sourceCrop,o,r),i=Math.min(360,Math.max(1,Math.round(a.width))),s=Math.max(1,Math.round(i*(a.height/a.width))),{ctx:c}=l(i,s);c.drawImage(t,a.x,a.y,a.width,a.height,0,0,i,s);const h=c.getImageData(0,0,i,s).data,d=Math.max(0,Math.min(255,e.chromaKeyTrimLuminanceThreshold??0));let f=i,m=s,u=-1,g=-1;for(let t=0;t<s;t++)for(let n=0;n<i;n++){const o=4*(t*i+n),r=h[o+3],a=h[o],s=h[o+1],c=h[o+2];r<=8||.2126*a+.7152*s+.0722*c<=d||mt(a,s,c,e)||(n<f&&(f=n),t<m&&(m=t),n>u&&(u=n),t>g&&(g=t))}if(u<f||g<m)return e;const p=Math.max(0,Math.min(.25,e.chromaKeyTrimPadding??.002)),M=Math.round(i*p),v=Math.round(s*p);f=Math.max(0,f-M),m=Math.max(0,m-v),u=Math.min(i-1,u+M),g=Math.min(s-1,g+v);const w=function(t,e,n,o,r){const a=r&&Number.isFinite(r)&&r>0?r:null;if(!a)return t;const i=e.x,s=e.y,c=e.x+e.width,l=e.y+e.height,h=Math.max(i,t.left),d=Math.max(s,t.top),f=Math.min(c,n-t.right),m=Math.min(l,o-t.bottom),u=Math.max(1,f-h),g=Math.max(1,m-d),p=h+u/2,M=d+g/2;let v=u,w=g;v/w<a?v=w*a:w=v/a;v>e.width&&(v=e.width,w=Math.max(g,Math.min(e.height,v/a)));w>e.height&&(w=e.height,v=Math.max(u,Math.min(e.width,w*a)));let y=p-v/2,x=M-w/2;return y=Math.max(i,Math.min(c-v,y)),x=Math.max(s,Math.min(l-w,x)),{left:y,top:x,right:n-(y+v),bottom:o-(x+w)}}({left:a.x+f/i*a.width,top:a.y+m/s*a.height,right:o-(a.x+(u+1)/i*a.width),bottom:r-(a.y+(g+1)/s*a.height)},{x:a.x,y:a.y,width:a.width,height:a.height},o,r,n);return{...e,sourceCrop:{unit:"pixel",...w,preserveAspect:!1}}}function gt(t){const e=t.sourceCrop;return e&&"pixel"===e.unit?void 0===e.left||void 0===e.top||void 0===e.right||void 0===e.bottom?null:{left:e.left,top:e.top,right:e.right,bottom:e.bottom}:null}async function pt(t,e,n,o,r){if(!e.chromaKey||!e.sourceCrop||"range"!==e.chromaKeyTrimMode)return e;const a=t.currentTime,i=function(t,e,n,o){const r=!0===o?{}:o||{},a=Math.max(0,r.from??e),i=r.to??n??(Number.isFinite(t.duration)?t.duration:a),s=Math.max(a,i-.04),c=Math.max(0,s-a),l=c>.1?[a,a+.25*c,a+.5*c,a+.75*c,s]:[a];return Array.from(new Set(l.map(t=>Math.max(0,Number(t.toFixed(3))))))}(t,n,o,r);let s=null;for(const n of i){await ct(t,n),await lt(t);const o=gt(ut(t,e));o&&(s=s?{left:Math.min(s.left,o.left),top:Math.min(s.top,o.top),right:Math.min(s.right,o.right),bottom:Math.min(s.bottom,o.bottom)}:o)}return await ct(t,a),await lt(t),s?{...e,sourceCrop:{unit:"pixel",...s,preserveAspect:!0}}:e}function Mt(t,e,n=2048){return vt({sourceWidth:t,sourceHeight:e,maxRenderDimension:n})}function vt({sourceWidth:t,sourceHeight:e,cssWidth:n=0,cssHeight:o=0,maxRenderDimension:r=2048}){const a=Math.max(1,t),i=Math.max(1,e),s=a/i,c=Math.max(1,r),l=Math.min(1,c/Math.max(a,i)),h=Math.max(a,i)*l,d=Math.max(0,n,o),f=Math.min(c,Math.max(h,d));return s>=1?{renderW:Math.round(f),renderH:Math.round(f/s)}:{renderW:Math.round(f*s),renderH:Math.round(f)}}function wt(t,e,n,o){if(void 0===t)return;if("number"==typeof t)return t;const r=t.trim();if(r.endsWith("%")){const t=Number.parseFloat(r)/100;return Number.isFinite(t)?e*t:void 0}if(r.endsWith("px")){const t=Number.parseFloat(r);return Number.isFinite(t)?t:void 0}if(r.endsWith("vw")){const t=Number.parseFloat(r)/100;return Number.isFinite(t)?n*t:void 0}if(r.endsWith("vh")){const t=Number.parseFloat(r)/100;return Number.isFinite(t)?o*t:void 0}}function yt(t,e,n,o,r,a=2048,i={}){const{width:s,height:c}=e.getBoundingClientRect();if(!s||!c)return{renderW:0,renderH:0,dpr:1};const l="undefined"!=typeof window?window.innerWidth:s,h="undefined"!=typeof window?window.innerHeight:c,d=wt(i.width,s,l,h)??s,f=wt(i.height,c,l,h)??c,m=function(t,e,n,o,r){const a=t=>{const n=wt(t,e,o,r);return n&&n>0?n:0},i=t=>{const e=wt(t,n,o,r);return e&&e>0?e:0};return void 0===t?{x:0,y:0}:"number"==typeof t||"string"==typeof t?{x:a(t),y:i(t)}:{x:a(t.x),y:i(t.y)}}(i.bleed,s,c,l,h),u=d+2*m.x,g=f+2*m.y,{cssW:p,cssH:M}=function(t,e,n,o="contain"){if("fill"===o)return{cssW:t,cssH:e};let r=t,a=r/n;const i="cover"===o,s=a>e;return(i&&!s||!i&&s)&&(a=e,r=a*n),"scale-down"===o&&(r=Math.min(r,t),a=Math.min(a,e)),{cssW:Math.round(r),cssH:Math.round(a)}}(u,g,n,i.objectFit??"contain"),v="undefined"!=typeof window&&window.devicePixelRatio||1;let w,y;o&&r?({renderW:w,renderH:y}=vt({sourceWidth:o,sourceHeight:r,cssWidth:p,cssHeight:M,maxRenderDimension:a})):(w=p,y=M);const x=8e6,b=w*v*y*v>x?Math.sqrt(x/(w*y)):v;return t.width=Math.round(w*b),t.height=Math.round(y*b),t.style.width=`${p}px`,t.style.height=`${M}px`,{renderW:w,renderH:y,dpr:b}}async function xt(t,e,{fontSize:o,artStyle:r="classic",options:a={}}={}){let i;if("string"==typeof t){const e=new Image;e.crossOrigin="anonymous",await new Promise((n,o)=>{e.onload=()=>n(),e.onerror=()=>o(new Error(`Failed to load image: ${t}`)),e.src=t}),i=e}else t instanceof HTMLImageElement&&!t.complete?(await new Promise((e,n)=>{t.onload=()=>e(),t.onerror=()=>n(new Error("Image failed to load"))}),i=t):i=t;const s=nt(r),c=o??a.fontSize??10,l={...n,...s,artStyle:r,...a,fontSize:c},h=e.getContext("2d");if(!h)throw new Error("Could not get 2d context from canvas");const{w:d,h:f}=function(t){return t instanceof HTMLVideoElement?{w:t.videoWidth,h:t.videoHeight}:t instanceof HTMLImageElement?{w:t.naturalWidth||t.width,h:t.naturalHeight||t.height}:{w:t.width,h:t.height}}(i),{renderW:m,renderH:u}=Mt(d,f),g="undefined"!=typeof window&&window.devicePixelRatio||1,p=8e6,M=m*g*u*g>p?Math.sqrt(p/(m*u)):g;e.width===Math.round(m*M)&&e.height===Math.round(u*M)||(e.width=Math.round(m*M),e.height=Math.round(u*M));const{frame:v}=N(i,l,m,u),w=(t,e)=>{h.save(),h.setTransform(M,0,0,M,0,0),tt(h,v,l,m,u,t/1e3,e),h.restore()};w(0,null);return T(e,w,{continuous:"none"!==l.animationStyle||!!l.charsetFrames?.length,interactive:l.hoverStrength>0}).stop}async function bt(t,e,{fontSize:o,artStyle:r="classic",options:a={}}={}){const i="string"==typeof t?await fetch(t).then(t=>t.arrayBuffer()):t,s=o??a.fontSize??10;let c={...n,...nt(r),artStyle:r,...a,fontSize:s};const l=e.getContext("2d");if(!l)throw new Error("Could not get 2d context from canvas");const{frames:h,fps:d}=await X(i,c,e.width,e.height);if(!h.length)throw new Error("asciifyGif: the GIF contains no renderable frames.");const f=performance.now();let m=-1;return T(e,(t,n)=>{const o=Math.floor((t-f)*d/1e3)%h.length;o===m&&!n&&c.hoverStrength<=0&&"none"===c.animationStyle&&!c.charsetFrames?.length||(tt(l,h[o],c,e.width,e.height,(t-f)/1e3,n),m=o)},{continuous:!0,interactive:c.hoverStrength>0}).stop}async function St(t,e,{fontSize:o,artStyle:r="classic",options:a={},fitTo:i,objectFit:s,objectPosition:c,scale:l,width:h,height:d,bleed:f,preExtract:m=!1,fps:u,maxRenderDimension:g=2048,trim:p,scroll:M,maxCachedFrames:v=90,onReady:w,onFrame:y}={}){const x=p?.start??0,b=p?.end,S=o??a.fontSize??10;let E={...n,...nt(r),artStyle:r,...a,fontSize:S};const C=e.getContext("2d");if(!C)throw new Error("asciifyVideo: could not get 2d context from canvas.");const A="string"==typeof i?document.querySelector(i):i instanceof HTMLElement?i:null,F={objectFit:s,objectPosition:c,scale:l,width:h,height:d,bleed:f},L=function(t,e){var n;if(!function(t){return void 0!==t.objectFit||void 0!==t.objectPosition||void 0!==t.scale||void 0!==t.width||void 0!==t.height||void 0!==t.bleed}(e))return()=>{};const o={width:t.style.width,height:t.style.height,objectFit:t.style.objectFit,objectPosition:t.style.objectPosition,maxWidth:t.style.maxWidth,maxHeight:t.style.maxHeight,transformOrigin:t.style.transformOrigin,scale:t.style.getPropertyValue("scale")};if(e.objectFit&&(t.style.objectFit=e.objectFit),e.objectPosition&&(t.style.objectPosition=e.objectPosition,t.style.transformOrigin=e.objectPosition),void 0===e.scale&&void 0===e.bleed||(t.style.maxWidth="none",t.style.maxHeight="none"),void 0!==e.scale){const o=Number.isFinite(e.scale)&&e.scale>0?e.scale:1;t.style.setProperty("scale",String(o)),(n=t.style).transformOrigin||(n.transformOrigin=e.objectPosition??"center center")}return()=>{t.style.width=o.width,t.style.height=o.height,t.style.objectFit=o.objectFit,t.style.objectPosition=o.objectPosition,t.style.maxWidth=o.maxWidth,t.style.maxHeight=o.maxHeight,t.style.transformOrigin=o.transformOrigin,o.scale?t.style.setProperty("scale",o.scale):t.style.removeProperty("scale")}}(e,F),I=t=>()=>{t(),L()};if(m){let n;"string"==typeof t?(n=document.createElement("video"),n.crossOrigin="anonymous",n.src=t,n.readyState<2&&await new Promise((e,o)=>{n.onloadeddata=()=>e(),n.onerror=()=>o(new Error(`asciifyVideo: failed to load "${t}"`))})):n=t,E=await pt(n,E,x,b,M);const o=ft(n.videoWidth,n.videoHeight,E);A&&yt(e,A,o.w/o.h,o.w,o.h,g,F);const{renderW:r,renderH:a}=Mt(o.w,o.h,g),i="undefined"!=typeof window&&window.devicePixelRatio||1,s=8e6,c=r*i*a*i>s?Math.sqrt(s/(r*a)):i;e.width===Math.round(r*c)&&e.height===Math.round(a*c)||(e.width=Math.round(r*c),e.height=Math.round(a*c));const l=void 0!==b?b-x:10,h=u??(M?18:void 0);if(at(E)){const{frames:t,fps:o}=await G(n,E,r,a,h,l,void 0,x),i=e=>{const n=t[e];n&&(C.save(),C.setTransform(c,0,0,c,0,0),K(C,n,E,r,a),C.restore(),y?.())};if(M){let o=!1,r=-1;const a=!0===M?{}:M,s=dt(rt(a.trigger)??A??e,a,e=>{const s=it(e,a),c=Math.max(0,Math.min(t.length-1,Math.round(s*(t.length-1))));c!==r&&(r=c,i(c),o||(o=!0,w?.(n)),a.onUpdate?.(s,n))});return i(0),o=!0,w?.(n),I(s)}let s,d=!1,f=0,m=performance.now(),u=!0;const g=1e3/o,p=e=>{d||(e-m>=g&&(i(f),f=(f+1)%t.length,m=e,u&&(u=!1,w?.(n))),s=requestAnimationFrame(p))};return s=requestAnimationFrame(p),I(()=>{d=!0,cancelAnimationFrame(s)})}const{frames:d,fps:f}=await Y(n,E,r,a,h,l,void 0,x);if(!d.length)throw new Error("asciifyVideo: no frames were decoded.");let m=0;const p=performance.now(),v=T(e,(t,e)=>{M||(m=Math.floor((t-p)*f/1e3)%d.length),C.save(),C.setTransform(c,0,0,c,0,0),tt(C,d[m],E,r,a,(t-p)/1e3,e),C.restore(),y?.()},{continuous:!M||"none"!==E.animationStyle||!!E.charsetFrames?.length,interactive:E.hoverStrength>0});let S;if(M){const t=!0===M?{}:M;S=dt(rt(t.trigger)??A??e,t,e=>{m=Math.max(0,Math.min(d.length-1,Math.round(it(e,t)*(d.length-1)))),v.wake(),t.onUpdate?.(e,n)})}return w?.(n),I(()=>{v.stop(),S?.()})}let R,k=!1;"string"==typeof t?(R=document.createElement("video"),R.crossOrigin="anonymous",R.src=t,R.muted=!0,R.loop=!0,R.playsInline=!0,R.setAttribute("playsinline",""),Object.assign(R.style,{position:"fixed",top:"0",left:"0",width:"1px",height:"1px",opacity:"0",pointerEvents:"none",zIndex:"-1"}),document.body.appendChild(R),k=!0,await new Promise((e,n)=>{R.onloadedmetadata=()=>e(),R.onerror=()=>n(new Error(`asciifyVideo: failed to load "${t}"`))}),await R.play().catch(()=>{})):(R=t,R.readyState<HTMLMediaElement.HAVE_METADATA&&await new Promise((t,e)=>{const n=()=>{R.removeEventListener("loadedmetadata",o),R.removeEventListener("error",r)},o=()=>{n(),t()},r=()=>{n(),e(new Error("asciifyVideo: provided video element failed to load metadata."))};R.addEventListener("loadedmetadata",o),R.addEventListener("error",r),R.load()}),R.paused&&await R.play().catch(()=>{})),x>0&&(R.currentTime=x,await new Promise(t=>{const e=()=>{R.removeEventListener("seeked",e),t()};R.addEventListener("seeked",e)}),await lt(R));let H=null;(x>0||void 0!==b)&&(H=()=>{(void 0!==b&&R.currentTime>=b||x>0&&R.currentTime<x)&&(R.currentTime=x)},R.addEventListener("timeupdate",H)),E=await pt(R,E,x,b,M);let W=null;const $=ft(R.videoWidth,R.videoHeight,E);let{renderW:P,renderH:j}=Mt($.w,$.h,g);const z=t=>"frame"===E.chromaKeyTrimMode?ut(t,E,P/j):E;if(A){const t=$.w/$.h,n=$.w,o=$.h,r=yt(e,A,t,n,o,g,F);P=r.renderW,j=r.renderH;const a=e.getContext("2d");a&&a.setTransform(r.dpr,0,0,r.dpr,0,0),W=new ResizeObserver(()=>{const r=yt(e,A,t,n,o,g,F);P=r.renderW,j=r.renderH;const a=e.getContext("2d");a&&a.setTransform(r.dpr,0,0,r.dpr,0,0)}),W.observe(A)}else{const t="undefined"!=typeof window&&window.devicePixelRatio||1,n=8e6,o=P*t*j*t>n?Math.sqrt(n/(P*j)):t;e.width===Math.round(P*o)&&e.height===Math.round(j*o)||(e.width=Math.round(P*o),e.height=Math.round(j*o)),C.setTransform(o,0,0,o,0,0)}let O=!0,q=null;const B=M&&!m,V=u&&u>0?1e3/u:0;let D=0;const X=!B&&at(E);if(B&&"ascii"===E.renderMode&&"none"===E.animationStyle&&E.hoverStrength<=0&&!E.charsetFrames?.length){const t=!0===M?{}:M,n=rt(t.trigger)??A??e,o=t.from??x,r=t.to??b??R.duration,a=Math.max(o,Math.min(r,R.duration)),i=Math.max(.001,a-o),s=Math.min(60,Math.max(12,u??30)),c=Math.max(2,Math.ceil(i*s)+1),l=new Array(c),h=[],d=Math.max(2,Math.min(c,Math.floor(v))),f=()=>{for(;h.length>d;){const t=h.findIndex(t=>t!==g&&Math.abs(t-g)>2),e=t>=0?t:0,n=h.splice(e,1)[0];void 0!==n&&(l[n]=void 0)}},m=t=>{const e=h.indexOf(t);e>=0&&h.splice(e,1),h.push(t),f()};let g=0,p=0,S=-1,T=0,F=!1,L=!1,$=!1;const O=new Set,B=document.createElement("video");B.muted=!0,B.playsInline=!0,B.preload="auto",B.crossOrigin=R.crossOrigin||"anonymous",B.src=R.currentSrc||R.src,Object.assign(B.style,{position:"fixed",top:"0",left:"0",width:"1px",height:"1px",opacity:"0",pointerEvents:"none",zIndex:"-1"}),document.body.appendChild(B),B.readyState<HTMLMediaElement.HAVE_METADATA&&await new Promise((t,e)=>{const n=()=>{B.removeEventListener("loadedmetadata",o),B.removeEventListener("error",r)},o=()=>{n(),t()},r=()=>{n(),e(new Error("asciifyVideo: cache video failed to load metadata."))};B.addEventListener("loadedmetadata",o),B.addEventListener("error",r),B.load()}),B.pause(),R.paused&&await R.play().catch(()=>{});const N=t=>o+i*t/Math.max(1,c-1),Y=t=>Math.max(0,Math.min(c-1,Math.round(t*(c-1)))),G=z(R),X=U(R,G,P,j);X.rows.length>0&&(l[0]=X,m(0),K(C,X,G,P,j),$=!0,w?.(R),y?.());const _=t=>{if(l[t])return t;for(let e=1;e<c;e++){const n=t-e,o=t+e;if(n>=0&&l[n])return n;if(o<c&&l[o])return o}return-1},J=()=>{if(!l[g])return g;for(const t of O)if(!l[t])return t;for(let t=1;t<c;t++){const e=g-t,n=g+t;if(e>=0&&!l[e])return e;if(n<c&&!l[n])return n}return-1},Q=t=>{t<0||t>=c||l[t]||(O.add(t),Z())},Z=async()=>{if(F||L)return;const t=J();if(!(t<0)){O.delete(t),L=!0;try{if(await ct(B,N(t)),!F){const e=z(B),n=U(B,e,P,j);n.rows.length>0&&(l[t]=n,m(t))}}finally{L=!1,F||requestAnimationFrame(()=>{Z()})}}},tt=()=>{if(F)return;const t=_(g);if(t>=0&&t!==S){const e=l[t];e&&(K(C,e,E,P,j),S=t,$||($=!0,w?.(R)),y?.())}else if(t<0||S<0){const t=performance.now();if(V<=0||t-D>=V){const e=z(R),n=U(R,e,P,j);n.rows.length>0&&(K(C,n,e,P,j),D=t,$||($=!0,w?.(R)),y?.())}}Q(g),T=requestAnimationFrame(tt)};return q=dt(n,t,e=>{const n=function(t,e,n={}){if(!Number.isFinite(t.duration)||t.duration<=0)return null;const o=n.from??0,r=n.to??t.duration,a=Math.max(o,Math.min(r,t.duration)),i=it(e,n),s=o+(a-o)*i;return{progress:i,time:Math.min(Math.max(o,s),Math.max(o,a-.04))}}(R,e,{...t,from:o,to:a});p=n?.progress??ot(e),g=Y(p),Q(g),Q(g-1),Q(g+1),Q(g-2),Q(g+2),Q(g-3),Q(g+3),t.onUpdate?.(p,R)}),Q(0),Q(1),T=requestAnimationFrame(tt),I(()=>{F=!0,cancelAnimationFrame(T),q?.(),W?.disconnect(),O.clear(),h.length=0,l.fill(void 0),B.pause(),B.src="",B.removeAttribute("src"),B.load(),B.isConnected&&B.remove(),H&&R.removeEventListener("timeupdate",H),k&&(R.pause(),R.src="",R.removeAttribute("src"),R.load(),R.isConnected&&R.remove())})}if(B){const t=!0===M?{}:M;q=ht(R,{...t,trigger:t.trigger??A??e,from:t.from??x,to:t.to??b})}let _=-1,J=0,Q=-1,Z=0;const et="function"==typeof R.requestVideoFrameCallback,st=()=>{Z=R.requestVideoFrameCallback(()=>{J++,st()})};et&&st();let mt=0,gt=0,vt=null;const wt=T(e,(t,n)=>{if(R.readyState<2||0===e.width||0===e.height)return;if(V>0&&t-D<V&&!n)return;if(x>0&&R.currentTime<x)return;if(void 0!==b&&R.currentTime>=b)return;const o=(et?J!==Q:R.currentTime!==_)||mt!==P||gt!==j;if(o||!(E.hoverStrength<=0)||"none"!==E.animationStyle||E.charsetFrames?.length){if(X){const t=z(R),e=U(R,t,P,j);K(C,e,t,P,j)}else!o&&vt||(vt=N(R,z(R),P,j).frame),tt(C,vt,E,P,j,t/1e3,n);_=R.currentTime,Q=J,mt=P,gt=j,D=t,O&&(O=!1,w?.(R)),y?.()}},{continuous:!0,interactive:E.hoverStrength>0});return I(()=>{wt.stop(),Z&&R.cancelVideoFrameCallback(Z),q?.(),W?.disconnect(),H&&R.removeEventListener("timeupdate",H),k&&(R.pause(),R.src="",R.removeAttribute("src"),R.load(),R.isConnected&&R.remove())})}function Et(t,e,n){return St(t,e,n)}function Ct(t,e={},o,r){const a={...n,...e},{frame:i,cols:s}=N(t,a,o,r);if(!i.length||0===s)return"";const c=[];for(const t of i)c.push(t.map(t=>t.char).join(""));return c.join("\n")}function Tt(t,e={},o,r){const a={...n,...e},{frame:i,cols:s}=N(t,a,o,r);if(!i.length||0===s)return"";const c=[];for(const t of i){let e="";for(const n of t)" "===n.char||n.a<10?e+=" ":e+=`[38;2;${n.r};${n.g};${n.b}m${n.char}[0m`;c.push(e)}return c.join("\n")}function At(t,e,n,o="#505050",r=100){if(!t||e<=0||n<=0)return[];const a=function(t){const e=t.match(/^#([0-9a-f]{3,8})$/i)?.[1];if(e){const t=e.length<=4?e.split("").map(t=>parseInt(t+t,16)):[parseInt(e.slice(0,2),16),parseInt(e.slice(2,4),16),parseInt(e.slice(4,6),16)];return{r:t[0],g:t[1],b:t[2]}}const n=t.match(/rgba?\(\s*(\d+)[,\s]+(\d+)[,\s]+(\d+)/i);return n?{r:+n[1],g:+n[2],b:+n[3]}:null}(o)??{r:80,g:80,b:80},i=t,s=i.length;return Array.from({length:n},(t,n)=>Array.from({length:e},(t,o)=>({char:i[(n*e+o)%s],r:a.r,g:a.g,b:a.b,a:r})))}var Ft=new WeakMap;function Lt(t,e,o,r,a={},i){const{fontSize:s=10,lineHeight:c=1.6,color:l="#505050",opacity:h=100,hoverEffect:d="spotlight",hoverStrength:f=.85,hoverRadius:m=.18,hoverColor:u="#d4ff00"}=a,g=Math.max(1,Math.floor(e/s)),p=Math.max(1,Math.floor(o/(s*c))),M=JSON.stringify([r,g,p,l,h]);let v=Ft.get(t);v&&v.key===M||(v={key:M,frame:At(r,g,p,l,h)},Ft.set(t,v));tt(t,v.frame,{...n,fontSize:s,hoverEffect:d,hoverStrength:f,hoverRadius:m,hoverColor:u},e,o,0,i??null)}function It(t,{format:e="png",quality:n=.92,scale:o=1}={}){return new Promise((r,a)=>{let i=t;if(1!==o){const e=document.createElement("canvas");e.width=Math.round(t.width*o),e.height=Math.round(t.height*o);const n=e.getContext("2d");if(!n)return void a(new Error("captureSnapshot: could not get 2d context"));n.drawImage(t,0,0,e.width,e.height),i=e}i.toBlob(t=>t?r(t):a(new Error("captureSnapshot: toBlob returned null")),`image/${e}`,n)})}async function Rt(t,e={}){const{filename:n="asciify-snapshot",format:o="png",...r}=e,a=await It(t,{format:o,...r}),i="jpeg"===o?"jpg":o,s=document.createElement("a");s.href=URL.createObjectURL(a),s.download=`${n}.${i}`,s.click(),setTimeout(()=>URL.revokeObjectURL(s.href),1e4)}async function kt(t,{fontSize:e=10,style:o="classic",options:r={},liveOptions:a,mirror:i=!0,constraints:s={facingMode:"user"},dpr:c}={}){if(!navigator.mediaDevices?.getUserMedia)throw new Error("asciifyWebcam: getUserMedia is not supported in this browser.");const l=nt(o),h=await navigator.mediaDevices.getUserMedia({video:s}),d=document.createElement("video");d.srcObject=h,d.muted=!0,d.playsInline=!0,await new Promise((t,e)=>{d.onloadedmetadata=()=>t(),d.onerror=()=>e(new Error("asciifyWebcam: video stream failed to load.")),d.play().catch(e)});const f={...n,...l,...r,fontSize:e},m=t.getContext("2d");if(!m)throw new Error("asciifyWebcam: could not get 2d context from canvas.");const u=c??("undefined"!=typeof window?window.devicePixelRatio:1)??1;1!==u&&m.scale(u,u);let g=null;const p=e=>{const n=t.getBoundingClientRect();g={x:(e.clientX-n.left)/n.width,y:(e.clientY-n.top)/n.height}},M=()=>{g=null};f.hoverStrength>0&&(t.addEventListener("mousemove",p),t.addEventListener("mouseleave",M));let v,w=!1;const y=performance.now(),x=e=>{if(!w){if(d.readyState>=d.HAVE_CURRENT_DATA){const n=t.width/u,o=t.height/u,r=(e-y)/1e3,s=a?{...f,...a()}:f;s.hoverStrength>0?(t.addEventListener("mousemove",p),t.addEventListener("mouseleave",M)):(t.removeEventListener("mousemove",p),t.removeEventListener("mouseleave",M));const{frame:c}=N(d,s,n,o),l=g&&i?{x:1-g.x,y:g.y}:g;i?(m.save(),m.scale(-1,1),m.translate(-n,0),tt(m,c,s,n,o,r,l),m.restore()):tt(m,c,s,n,o,r,l)}v=requestAnimationFrame(x)}};return v=requestAnimationFrame(x),()=>{w=!0,cancelAnimationFrame(v),t.removeEventListener("mousemove",p),t.removeEventListener("mouseleave",M),h.getTracks().forEach(t=>t.stop()),d.srcObject=null}}var Ht={A:[28,54,99,127,99,99,99],B:[126,99,99,126,99,99,126],C:[62,99,96,96,96,99,62],D:[124,102,99,99,99,102,124],E:[127,96,96,124,96,96,127],F:[127,96,96,124,96,96,96],G:[62,99,96,111,99,99,62],H:[99,99,99,127,99,99,99],I:[127,8,8,8,8,8,127],J:[63,6,6,6,102,102,60],K:[99,102,108,120,108,102,99],L:[96,96,96,96,96,96,127],M:[99,119,107,107,99,99,99],N:[99,115,107,103,99,99,99],O:[62,99,99,99,99,99,62],P:[126,99,99,126,96,96,96],Q:[62,99,99,99,107,102,61],R:[126,99,99,126,108,102,99],S:[62,99,96,62,3,99,62],T:[127,8,8,8,8,8,8],U:[99,99,99,99,99,99,62],V:[99,99,99,99,54,28,8],W:[99,99,99,107,107,54,20],X:[99,54,28,8,28,54,99],Y:[99,99,54,28,8,8,8],Z:[127,3,6,12,24,48,127],a:[0,0,60,3,62,99,61],b:[96,96,124,99,99,99,124],c:[0,0,62,96,96,96,62],d:[3,3,31,99,99,99,31],e:[0,0,62,99,127,96,62],f:[30,48,48,126,48,48,48],g:[0,0,63,99,63,3,62],h:[96,96,124,99,99,99,99],i:[8,0,24,8,8,8,28],j:[4,0,12,4,4,36,24],k:[96,96,102,108,120,108,102],l:[24,8,8,8,8,8,28],m:[0,0,92,107,107,99,99],n:[0,0,94,99,99,99,99],o:[0,0,62,99,99,99,62],p:[0,0,126,99,126,96,96],q:[0,0,63,99,63,3,3],r:[0,0,94,99,96,96,96],s:[0,0,62,96,62,3,124],t:[48,48,126,48,48,48,30],u:[0,0,99,99,99,103,59],v:[0,0,99,99,54,28,8],w:[0,0,99,99,107,54,20],x:[0,0,99,54,28,54,99],y:[0,0,99,99,63,3,62],z:[0,0,127,6,12,24,127],0:[62,99,103,107,115,99,62],1:[8,24,56,8,8,8,62],2:[62,99,3,6,24,48,127],3:[62,99,3,30,3,99,62],4:[6,14,22,38,127,6,6],5:[127,96,126,3,3,99,62],6:[62,99,96,126,99,99,62],7:[127,3,6,12,24,24,24],8:[62,99,99,62,99,99,62],9:[62,99,99,63,3,99,62]," ":[0,0,0,0,0,0,0],"!":[24,24,24,24,24,0,24],"?":[62,99,3,14,8,0,8],".":[0,0,0,0,0,24,24],",":[0,0,0,0,0,24,48],";":[0,24,24,0,24,24,48],":":[0,24,24,0,24,24,0],"-":[0,0,0,62,0,0,0],_:[0,0,0,0,0,0,127],"'":[24,24,32,0,0,0,0],'"':[54,54,36,0,0,0,0],"`":[24,8,0,0,0,0,0],")":[24,12,6,6,6,12,24],"(":[12,24,48,48,48,24,12],"[":[60,48,48,48,48,48,60],"]":[30,6,6,6,6,6,30],"{":[14,24,24,48,24,24,14],"}":[56,12,12,6,12,12,56],"/":[3,6,12,24,48,96,0],"\\":[96,48,24,12,6,3,0],"|":[8,8,8,8,8,8,8],"+":[0,8,8,62,8,8,0],"=":[0,0,62,0,62,0,0],"*":[0,42,28,127,28,42,0],"#":[36,36,127,36,127,36,36],"@":[62,99,111,107,111,96,62],"&":[24,36,24,60,74,68,58],"%":[99,38,4,8,16,50,99],$:[8,62,72,62,9,62,8],"^":[8,20,34,0,0,0,0],"~":[0,0,50,76,0,0,0],"<":[6,12,24,48,24,12,6],">":[48,24,12,6,12,24,48]},Wt=[127,65,65,65,65,65,127];function $t(t){return Ht[t]??Ht[t.toUpperCase()]??Wt}function Pt(t,e={}){if(!t)return"";const{char:n="█",scale:o=1}=e,r=[...n][0]??"█",a=Math.max(1,Math.floor(o)),i=7*a,s=a,c=Array.from({length:i},()=>"");for(let e=0;e<t.length;e++){const n=$t(t[e]);for(let t=0;t<7;t++){const e=n[t];let o="";for(let t=6;t>=0;t--)o+=(e>>t&1?r:" ").repeat(a);for(let e=0;e<a;e++)c[t*a+e]+=o}if(e<t.length-1)for(let t=0;t<i;t++)c[t]+=" ".repeat(s)}return c.join("\n")}function jt(t,e,n={}){const{color:o="#d4ff00",bgColor:r,fontSize:a=10}=n,i=Pt(e,n);if(!i)return;const s=i.split("\n"),c=Math.max(...s.map(t=>[...t].length));t.width=Math.ceil(c*a*.6),t.height=Math.ceil(s.length*a);const l=t.getContext("2d");r&&"transparent"!==r?(l.fillStyle=r,l.fillRect(0,0,t.width,t.height)):l.clearRect(0,0,t.width,t.height),l.fillStyle=o,l.font=`${a}px monospace`,l.textBaseline="top",s.forEach((t,e)=>l.fillText(t,0,e*a))}var zt=["ascii","blocks","braille","dots","lines","cross","diagonal","diamond","mixed","pixel","mosaic","lego","voxel","disco","dither","hex","led","cmyk","stipple","engraving","crosshatch","woodblock","risograph","pointillism"];export{t as CHARACTER_SETS,n as DEFAULT_OPTIONS,o as HOVER_PRESETS,e as PALETTE_THEMES,zt as STUDIO_STYLES,Ct as asciiText,Tt as asciiTextAnsi,xt as asciify,bt as asciifyGif,Et as asciifyLiveVideo,Pt as asciifyText,St as asciifyVideo,kt as asciifyWebcam,At as buildTextFrame,It as captureSnapshot,z as clearAsciifyCaches,vt as computeCanvasRenderSize,ht as createVideoScrollScrub,X as gifToAsciiFrames,_ as gifToAsciiTextFrames,N as imageToAsciiFrame,U as imageToAsciiTextFrame,tt as renderFrameToCanvas,Lt as renderTextBackground,K as renderTextFrameToCanvas,jt as renderTextToCanvas,Rt as snapshotAndDownload,Y as videoToAsciiFrames,G as videoToAsciiTextFrames};//# sourceMappingURL=core.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type AmbientMotion = 'none' | 'caustics' | 'current' | 'reform' | 'sheen' | 'tidal' | 'grain' | 'parallax' | 'weave' | 'print' | 'trace';
|
|
1
|
+
type AmbientMotion = 'none' | 'caustics' | 'current' | 'reform' | 'sheen' | 'tidal' | 'grain' | 'parallax' | 'weave' | 'print' | 'trace' | 'relight' | 'shimmer' | 'breeze' | 'unfold';
|
|
2
2
|
declare const MOTION_STYLES: readonly [{
|
|
3
3
|
readonly value: "none";
|
|
4
4
|
readonly mode: "none";
|
|
@@ -65,6 +65,30 @@ declare const MOTION_STYLES: readonly [{
|
|
|
65
65
|
readonly group: "Light and texture";
|
|
66
66
|
readonly label: "Contour Light";
|
|
67
67
|
readonly description: "Light follows the source image’s tonal contours; every character stays anchored.";
|
|
68
|
+
}, {
|
|
69
|
+
readonly value: "relight";
|
|
70
|
+
readonly mode: "relight";
|
|
71
|
+
readonly group: "Light and texture";
|
|
72
|
+
readonly label: "Relight";
|
|
73
|
+
readonly description: "A slow orbit of light models the image’s midtones, while the character grid stays fixed.";
|
|
74
|
+
}, {
|
|
75
|
+
readonly value: "shimmer";
|
|
76
|
+
readonly mode: "shimmer";
|
|
77
|
+
readonly group: "Light and texture";
|
|
78
|
+
readonly label: "Shimmer";
|
|
79
|
+
readonly description: "Small highlights glint at different moments. Shadows stay quiet and the image stays in place.";
|
|
80
|
+
}, {
|
|
81
|
+
readonly value: "breeze";
|
|
82
|
+
readonly mode: "breeze";
|
|
83
|
+
readonly group: "Flow and depth";
|
|
84
|
+
readonly label: "Breeze";
|
|
85
|
+
readonly description: "A traveling bend gently sways the image, like a print suspended in moving air.";
|
|
86
|
+
}, {
|
|
87
|
+
readonly value: "unfold";
|
|
88
|
+
readonly mode: "unfold";
|
|
89
|
+
readonly group: "Rebuild";
|
|
90
|
+
readonly label: "Unfold";
|
|
91
|
+
readonly description: "Narrow panels turn, soften and return to a complete image, with a readable hold between cycles.";
|
|
68
92
|
}];
|
|
69
93
|
|
|
70
94
|
/** One public catalog for the hero, studio, documentation and integrations. */
|
|
@@ -93,6 +117,11 @@ declare const SURFACE_HOVERS: readonly [{
|
|
|
93
117
|
readonly label: "Emboss";
|
|
94
118
|
readonly group: "Change characters";
|
|
95
119
|
readonly description: "Press a light-and-shadow impression into the characters; the grid stays fixed.";
|
|
120
|
+
}, {
|
|
121
|
+
readonly value: "ripple";
|
|
122
|
+
readonly label: "Ripple rings";
|
|
123
|
+
readonly group: "Change characters";
|
|
124
|
+
readonly description: "Expanding light-and-shadow rings follow your stroke. Faster movement excites stronger rings; the grid stays still.";
|
|
96
125
|
}, {
|
|
97
126
|
readonly value: "water";
|
|
98
127
|
readonly label: "Water";
|
|
@@ -128,6 +157,16 @@ declare const SURFACE_HOVERS: readonly [{
|
|
|
128
157
|
readonly label: "Rake";
|
|
129
158
|
readonly group: "Move the image";
|
|
130
159
|
readonly description: "Comb the image into alternating ribbons that glide back into alignment.";
|
|
160
|
+
}, {
|
|
161
|
+
readonly value: "lens";
|
|
162
|
+
readonly label: "Lens wake";
|
|
163
|
+
readonly group: "Move the image";
|
|
164
|
+
readonly description: "A soft magnifying wake brings details closer, then relaxes back into focus.";
|
|
165
|
+
}, {
|
|
166
|
+
readonly value: "smudge";
|
|
167
|
+
readonly label: "Smudge";
|
|
168
|
+
readonly group: "Move the image";
|
|
169
|
+
readonly description: "Drag the image in the direction of your stroke; a smooth, lingering pull settles without a bounce.";
|
|
131
170
|
}];
|
|
132
171
|
type SurfaceHover = typeof SURFACE_HOVERS[number]['value'];
|
|
133
172
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
type AmbientMotion = 'none' | 'caustics' | 'current' | 'reform' | 'sheen' | 'tidal' | 'grain' | 'parallax' | 'weave' | 'print' | 'trace';
|
|
1
|
+
type AmbientMotion = 'none' | 'caustics' | 'current' | 'reform' | 'sheen' | 'tidal' | 'grain' | 'parallax' | 'weave' | 'print' | 'trace' | 'relight' | 'shimmer' | 'breeze' | 'unfold';
|
|
2
2
|
declare const MOTION_STYLES: readonly [{
|
|
3
3
|
readonly value: "none";
|
|
4
4
|
readonly mode: "none";
|
|
@@ -65,6 +65,30 @@ declare const MOTION_STYLES: readonly [{
|
|
|
65
65
|
readonly group: "Light and texture";
|
|
66
66
|
readonly label: "Contour Light";
|
|
67
67
|
readonly description: "Light follows the source image’s tonal contours; every character stays anchored.";
|
|
68
|
+
}, {
|
|
69
|
+
readonly value: "relight";
|
|
70
|
+
readonly mode: "relight";
|
|
71
|
+
readonly group: "Light and texture";
|
|
72
|
+
readonly label: "Relight";
|
|
73
|
+
readonly description: "A slow orbit of light models the image’s midtones, while the character grid stays fixed.";
|
|
74
|
+
}, {
|
|
75
|
+
readonly value: "shimmer";
|
|
76
|
+
readonly mode: "shimmer";
|
|
77
|
+
readonly group: "Light and texture";
|
|
78
|
+
readonly label: "Shimmer";
|
|
79
|
+
readonly description: "Small highlights glint at different moments. Shadows stay quiet and the image stays in place.";
|
|
80
|
+
}, {
|
|
81
|
+
readonly value: "breeze";
|
|
82
|
+
readonly mode: "breeze";
|
|
83
|
+
readonly group: "Flow and depth";
|
|
84
|
+
readonly label: "Breeze";
|
|
85
|
+
readonly description: "A traveling bend gently sways the image, like a print suspended in moving air.";
|
|
86
|
+
}, {
|
|
87
|
+
readonly value: "unfold";
|
|
88
|
+
readonly mode: "unfold";
|
|
89
|
+
readonly group: "Rebuild";
|
|
90
|
+
readonly label: "Unfold";
|
|
91
|
+
readonly description: "Narrow panels turn, soften and return to a complete image, with a readable hold between cycles.";
|
|
68
92
|
}];
|
|
69
93
|
|
|
70
94
|
/** One public catalog for the hero, studio, documentation and integrations. */
|
|
@@ -93,6 +117,11 @@ declare const SURFACE_HOVERS: readonly [{
|
|
|
93
117
|
readonly label: "Emboss";
|
|
94
118
|
readonly group: "Change characters";
|
|
95
119
|
readonly description: "Press a light-and-shadow impression into the characters; the grid stays fixed.";
|
|
120
|
+
}, {
|
|
121
|
+
readonly value: "ripple";
|
|
122
|
+
readonly label: "Ripple rings";
|
|
123
|
+
readonly group: "Change characters";
|
|
124
|
+
readonly description: "Expanding light-and-shadow rings follow your stroke. Faster movement excites stronger rings; the grid stays still.";
|
|
96
125
|
}, {
|
|
97
126
|
readonly value: "water";
|
|
98
127
|
readonly label: "Water";
|
|
@@ -128,6 +157,16 @@ declare const SURFACE_HOVERS: readonly [{
|
|
|
128
157
|
readonly label: "Rake";
|
|
129
158
|
readonly group: "Move the image";
|
|
130
159
|
readonly description: "Comb the image into alternating ribbons that glide back into alignment.";
|
|
160
|
+
}, {
|
|
161
|
+
readonly value: "lens";
|
|
162
|
+
readonly label: "Lens wake";
|
|
163
|
+
readonly group: "Move the image";
|
|
164
|
+
readonly description: "A soft magnifying wake brings details closer, then relaxes back into focus.";
|
|
165
|
+
}, {
|
|
166
|
+
readonly value: "smudge";
|
|
167
|
+
readonly label: "Smudge";
|
|
168
|
+
readonly group: "Move the image";
|
|
169
|
+
readonly description: "Drag the image in the direction of your stroke; a smooth, lingering pull settles without a bounce.";
|
|
131
170
|
}];
|
|
132
171
|
type SurfaceHover = typeof SURFACE_HOVERS[number]['value'];
|
|
133
172
|
|