asciify-engine 4.21.0 → 4.22.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.
Files changed (32) hide show
  1. package/README.md +7 -0
  2. package/dist/{animation-presets-DztfFvTc.d.cts → animation-presets-CEdD0FMM.d.cts} +42 -28
  3. package/dist/{animation-presets-Bqupq1Gx.d.ts → animation-presets-KnEWoJ_q.d.ts} +42 -28
  4. package/dist/core.cjs +1 -1
  5. package/dist/core.d.cts +4 -4
  6. package/dist/core.d.ts +4 -4
  7. package/dist/core.js +1 -1
  8. package/dist/{hover-guide-DKRQPtDO.d.cts → hover-guide-CAfsLjFZ.d.cts} +56 -77
  9. package/dist/{hover-guide-DKRQPtDO.d.ts → hover-guide-CAfsLjFZ.d.ts} +56 -77
  10. package/dist/hover.cjs +1 -1
  11. package/dist/hover.d.cts +6 -6
  12. package/dist/hover.d.ts +6 -6
  13. package/dist/hover.js +1 -1
  14. package/dist/index.cjs +1 -1
  15. package/dist/index.d.cts +3 -3
  16. package/dist/index.d.ts +3 -3
  17. package/dist/index.js +1 -1
  18. package/dist/{model-D2L86aNZ.d.ts → model-BHIQYYk-.d.ts} +1 -1
  19. package/dist/{model-BNShxUhx.d.cts → model-BzgEEqzP.d.cts} +1 -1
  20. package/dist/studio.cjs +1 -1
  21. package/dist/studio.d.cts +4 -5
  22. package/dist/studio.d.ts +4 -5
  23. package/dist/studio.js +1 -1
  24. package/dist/{types-Bmu4dXdQ.d.ts → types-C9lka3yC.d.ts} +2 -2
  25. package/dist/{types-Cn3wY-ST.d.cts → types-DOl5f2x3.d.cts} +2 -2
  26. package/package.json +1 -1
  27. package/skills/asciify-engine/SKILL.md +3 -3
  28. package/skills/asciify-engine/references/design-matching.md +1 -1
  29. package/skills/asciify-engine/references/looks.md +2 -2
  30. package/skills/asciify-engine/references/studio-effects.md +21 -6
  31. package/skills/asciify-engine/references/studio-workspace.md +6 -7
  32. package/skills/asciify-engine/references/upgrading.md +6 -0
package/dist/core.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { a as AsciiOptions, A as AsciiFrame, b as ArtStyle, H as HoverEffect } from './types-Bmu4dXdQ.js';
2
- export { c as AnimationStyle, d as AsciiCell, e as AsciiResult, C as ColorMode, D as DEFAULT_OPTIONS, f as HOVER_PRESETS, g as HoverPreset, h as HoverShape, P as PALETTE_THEMES, i as PaletteTheme, R as RenderMode, S as SourceType } from './types-Bmu4dXdQ.js';
1
+ import { a as AsciiOptions, A as AsciiFrame, b as ArtStyle, H as HoverEffect } from './types-C9lka3yC.js';
2
+ export { c as AnimationStyle, d as AsciiCell, e as AsciiResult, C as ColorMode, D as DEFAULT_OPTIONS, f as HOVER_PRESETS, g as HoverPreset, h as HoverShape, P as PALETTE_THEMES, i as PaletteTheme, R as RenderMode, S as SourceType } from './types-C9lka3yC.js';
3
3
  export { C as CHARACTER_SETS } from './characters-BgECi5Lf.js';
4
- export { i as STUDIO_STYLES, r as StudioStyle } from './model-D2L86aNZ.js';
5
- import './hover-guide-DKRQPtDO.js';
4
+ export { i as STUDIO_STYLES, r as StudioStyle } from './model-BHIQYYk-.js';
5
+ import './hover-guide-CAfsLjFZ.js';
6
6
 
7
7
  /**
8
8
  * Core frame-to-canvas renderer and source-to-frame converters.
package/dist/core.js CHANGED
@@ -1 +1 @@
1
- var t={standard:{label:"Classic ASCII",chars:" .:-=+*#%@"},asciify:{label:"Asciify",chars:" .:-=+YCIFSA#@"},minimal:{label:"Minimal",chars:" .:+"},detailed:{label:"Detailed",chars:" .,:;-~=+*xX#%@"},letters:{label:"Letters",chars:" .liLTYCFSAWM"},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 X(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 G(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,X=(G=K,r.find(t=>t.value===G||t.mode===G)?.mode??"none");var G;const _="none"===X,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(X,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,G=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);G=Math.max(0,B-e),G+K>d&&(G=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(X,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>=G&&n<G+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 G(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 X(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 G=!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)))),X=z(R),G=U(R,X,P,j);G.rows.length>0&&(l[0]=G,m(0),K(C,G,X,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(G){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}`;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,G 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,X as videoToAsciiTextFrames};//# sourceMappingURL=core.js.map
1
+ var t={standard:{label:"Classic ASCII",chars:" .:-=+*#%@"},asciify:{label:"Asciify",chars:" .:-=+YCIFSA#@"},minimal:{label:"Minimal",chars:" .:+"},detailed:{label:"Detailed",chars:" .,:;-~=+*xX#%@"},letters:{label:"Letters",chars:" .liLTYCFSAWM"},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={caustics:"sheen",grain:"shimmer",trace:"relight",tidal:"current",weave:"current",breeze:"current",reform:"develop",print:"develop",unfold:"develop"},a=[{value:"none",mode:"none",group:"Still",label:"Off",description:"Keep the image still. Hover stays available."},{value:"relight",mode:"relight",group:"Light",label:"Relight",description:"A key light circles the subject and models its own relief, like moving a lamp around a sculpture."},{value:"sheen",mode:"sheen",group:"Light",label:"Specular sweep",description:"One slow pass of light glances across the highlights and follows their form, then rests."},{value:"glow",mode:"glow",group:"Light",label:"Highlight bloom",description:"The brightest areas breathe a soft halo into their surroundings. Shadows stay deep."},{value:"shimmer",mode:"shimmer",group:"Light",label:"Glints",description:"Sparse glints on bright fine detail, like light on water, metal or an eye. Everything else holds still."},{value:"parallax",mode:"parallax",group:"Depth",label:"Parallax",description:"A slow camera drift: the subject moves against its background, read from the photo’s own depth cues."},{value:"push",mode:"push",group:"Depth",label:"Slow push",description:"A gentle push toward the subject and back, with nearer areas moving slightly more."},{value:"focus",mode:"focus",group:"Depth",label:"Focus pull",description:"Focus racks from the subject to the background and back; the characters soften out of focus."},{value:"mist",mode:"mist",group:"Atmosphere",label:"Mist",description:"Soft mist drifts through the distance and plain areas, leaving the subject clear."},{value:"current",mode:"current",group:"Atmosphere",label:"Drift",description:"Sky, water and smooth grounds flow slowly, like a cinemagraph; detailed areas hold still."},{value:"develop",mode:"develop",group:"Reveal",label:"Develop",description:"The image holds, fades, then develops back in from its highlights to its shadows, like a print in the tray."}];var i=t=>Math.max(0,Math.min(1,t)),s=(t,e,n)=>{const o=i((n-t)/(e-t));return o*o*(3-2*o)},c=(t,e)=>{const n=(.06711056*t+.00583715*e)%1*52.9829189;return n-Math.floor(n)};function l(t,e,n,o,r,a=.5,l,h=0){if(r[0]=r[1]=r[2]=0,r[3]=1,"none"===t)return r;a=i(a);const d=l?l[h]:a,f=l?l[h+1]:.5+.5*i(1-2*Math.hypot(e-.5,n-.55)),m=l?l[h+2]:s(.55,1,a)**2,u=l?l[h+3]:.5,g=l?l[h+4]:0,p=l?l[h+5]:0,M=o*Math.PI/6,v=(o%12+12)%12,w=s(0,.12,Math.min(e,1-e,n,1-n));if("relight"===t){const t=M+.6,o=Math.cos(t),i=Math.sin(t),c=Math.max(-1,Math.min(1,g*o+p*i))+.35*(o*(e-.5)+i*(n-.5));r[2]=.2*c*(.3+.7*s(.04,.3,d)*(1-.6*s(.82,1,a)))}else if("sheen"===t){const t=1.9*s(0,8,v)-.35,o=(.75*e+.45*n)/1.2+.05*(.75*g+.45*p),i=Math.exp(-(((o-t)/.12)**2));r[2]=i*s(.3,.8,d)*(1-.5*s(.9,1,a))*.45}else if("glow"===t){const t=.5-.5*Math.cos(M),e=1-.8*t;r[2]=.2*s(e-.3,e+.02,m)*Math.sqrt(m)*(1-.65*a)+.05*t*s(.6,.95,a)}else if("shimmer"===t){const t=c(Math.floor(160*e),Math.floor(100*n))*Math.PI*2,o=Math.pow(.5+.5*Math.cos(2*M+t),28);r[2]=o*s(.5,.88,a)*(.35+.65*s(.1,.55,u))*.42}else if("parallax"===t){const t=f-.45;r[0]=16*t*Math.sin(M)*w,r[1]=7*t*Math.sin(2*M)*w}else if("push"===t){const t=.045*(.5-.5*Math.cos(M))*(.7+.6*f)*960,o=l?l[h+6]:.5,a=l?l[h+7]:.5;r[0]=(e-o)*t,r[1]=(n-a)*t}else if("focus"===t){const t=Math.sin(M),e=t*t*s(.15,.6,t>=0?1-f:f);r[2]=(d-a)*e*.9}else if("mist"===t){const t=Math.pow(1-f,1.5)*(1-.6*u),o=.5*Math.sin(4.1*e-M+.9*Math.sin(3.3*n+M))+.3*Math.sin(7.3*e+2.1*n-2*M+1.1*Math.sin(2.7*e-5.1*n+M))+.2*Math.sin(5.7*n-1.9*e+M);r[2]=s(-.3,.9,o)*t*.16*(1-.55*a)}else if("current"===t){const t=(1-.4*u)*(1-.8*f)*w,o=t=>14*n-t+1.5*Math.sin(3*e+t);r[0]=7*(Math.sin(o(M))-Math.sin(o(0))+.43*(Math.sin(5*e-3*n+M)-Math.sin(5*e-3*n)))*t,r[1]=2*(Math.sin(11*e+M)-Math.sin(11*e))*t,r[2]=.03*(Math.cos(o(M))-Math.cos(o(0)))*t}else if("develop"===t){const t=s(7,8.5,v),o=i((v-8.5)/3.5),l=v<8.5?1-t:s(0,1,(1.45*o-(1-a)+.06*(c(Math.floor(160*e),Math.floor(100*n))-.5))/.3);r[2]=.3*-(1-l),r[3]=1-.9*(1-l)}return r}function h(t,e,n,o,r){if(!(r<1))for(let a=0;a<2;a++){for(let a=0;a<o;a++){let o=0;const i=a*n;for(let e=-r;e<=r;e++)o+=t[i+Math.max(0,Math.min(n-1,e))];for(let a=0;a<n;a++)e[i+a]=o/(2*r+1),o+=t[i+Math.min(n-1,a+r+1)]-t[i+Math.max(0,a-r)]}for(let a=0;a<n;a++){let i=0;for(let t=-r;t<=r;t++)i+=e[Math.max(0,Math.min(o-1,t))*n+a];for(let s=0;s<o;s++)t[s*n+a]=i/(2*r+1),i+=e[Math.min(o-1,s+r+1)*n+a]-e[Math.max(0,s-r)*n+a]}}}var d=(t,e,n)=>{const o=Math.max(0,Math.min(1,(n-t)/(e-t)));return o*o*(3-2*o)};function f(t,e,n=256){let o=0;for(let e=0;e<t.length;e++)t[e]>o&&(o=t[e]);if(o<=0)return 0;const r=new Uint32Array(n);for(let e=0;e<t.length;e++)r[Math.min(n-1,Math.floor(t[e]/o*n))]++;let a=0;const i=t.length*e;for(let t=0;t<n;t++)if(a+=r[t],a>=i)return(t+1)/n*o;return o}function m(t,e,n,o){const r=e*n,a=o?.length===8*r?o:new Float32Array(8*r);if(!r)return a;const i=Math.min(e,n),s=new Float32Array(r),c=new Float32Array(r),l=new Float32Array(r),m=new Float32Array(r),u=new Float32Array(r),g=new Float32Array(r),p=new Float32Array(r);for(let e=0;e<r;e++){const n=t[4*e+3]/255;s[e]=(.299*t[4*e]+.587*t[4*e+1]+.114*t[4*e+2])/255*n}c.set(s),h(c,p,e,n,Math.max(1,Math.round(.012*i))),l.set(s),h(l,p,e,n,Math.max(1,Math.round(.03*i)));for(let t=0;t<r;t++){m[t]=Math.abs(s[t]-c[t]);const e=Math.max(0,s[t]-.55)/.45;u[t]=e*e}h(m,p,e,n,Math.max(1,Math.round(.02*i)));const M=1/Math.max(.02,f(m,.95));h(u,p,e,n,Math.max(1,Math.round(.05*i)));const v=1/Math.max(.03,f(u,.98)),w=function(t,e,n){const o=e*n,r={width:e,height:n,subject:new Float32Array(o),depth:new Float32Array(o),key:"none"},{subject:a,depth:i}=r;let s=0;for(let e=0;e<o;e++)t[4*e+3]<250&&s++;const c=e=>(.2126*t[4*e]+.7152*t[4*e+1]+.0722*t[4*e+2])/255;let l="none",d=0;if(s>.01*o)l="alpha";else{let t=0,o=0,r=0;const a=Math.max(1,Math.round(.03*Math.min(e,n)));for(let i=0;i<n;i++)for(let s=0;s<e;s++){if(s>=a&&i>=a&&s<e-a&&i<n-a)continue;const l=c(i*e+s);t+=l,o+=l*l,r++}d=t/Math.max(1,r),Math.sqrt(Math.max(0,o/Math.max(1,r)-d*d))<.07&&(l="ground")}for(let e=0;e<o;e++){const n=t[4*e+3]/255,o=c(e);let r=1;if("alpha"===l)r=n;else if("ground"===l){const t=Math.max(0,Math.min(1,(Math.abs(o-d)-.035)/.12));r=t*t*(3-2*t)}a[e]=1*r,i[e]=o*n}r.key=l;const f=new Float32Array(o);return h(a,f,e,n,Math.max(1,Math.round(.02*Math.min(e,n)))),h(i,f,e,n,Math.max(1,Math.round(.035*Math.min(e,n)))),r}(t,e,n);let x=0,y=0,b=0;for(let t=0;t<n;t++)for(let o=0;o<e;o++){const r=t*e+o,a=(o+.5)/e,i=(t+.5)/n,c=.55*Math.min(1,m[r]*M)+.3*(1-Math.min(1,1.6*Math.hypot(1.3*(a-.5),i-.55)))+.15*d(.2,1,i);g[r]="none"===w.key?c:.75*w.subject[r]+.25*c;const l=g[r]*g[r]*(.25+s[r]);x+=a*l,y+=i*l,b+=l}h(g,p,e,n,Math.max(1,Math.round(.06*i)));const S=f(g,.05),E=f(g,.95),A=Math.max(.05,E-S);x=b>0?Math.max(.3,Math.min(.7,x/b)):.5,y=b>0?Math.max(.3,Math.min(.7,y/b)):.5;const C=1/Math.max(.004,f((()=>{const t=new Float32Array(r);for(let o=0;o<n;o++)for(let r=0;r<e;r++){t[o*e+r]=Math.hypot(l[o*e+Math.min(e-1,r+1)]-l[o*e+Math.max(0,r-1)],l[Math.min(n-1,o+1)*e+r]-l[Math.max(0,o-1)*e+r])}return t})(),.97));for(let t=0;t<n;t++)for(let o=0;o<e;o++){const r=t*e+o,i=8*r,s=(l[t*e+Math.min(e-1,o+1)]-l[t*e+Math.max(0,o-1)])*C,c=(l[Math.min(n-1,t+1)*e+o]-l[Math.max(0,t-1)*e+o])*C;a[i]=l[r],a[i+1]=Math.max(0,Math.min(1,(g[r]-S)/A)),a[i+2]=Math.min(1,u[r]*v),a[i+3]=Math.min(1,m[r]*M),a[i+4]=Math.max(-1,Math.min(1,-s)),a[i+5]=Math.max(-1,Math.min(1,-c)),a[i+6]=x,a[i+7]=y}return a}var u=new WeakMap;function g(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 p(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 M(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 v=[[0,8,2,10],[12,4,14,6],[3,11,1,9],[15,7,13,5]];function w(t,e,n,o){if(o<=0)return t;const r=(v[n%4][e%4]/16-.5)*o*128;return Math.max(0,Math.min(255,t+r))}var x=new Array(256),y=new Array(256);for(let t=0;t<256;t++)x[t]=`rgb(${t},${t},${t})`,y[t]=`rgb(0,${t},0)`;function b(t,e,n,o,r,a=!1){switch(e){case"fullcolor":return`rgb(${t.r},${t.g},${t.b})`;case"matrix":return y[.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 x[e]}}}var S=[0,0,0];function E(t,e,n,o,r,a=!1){switch(e){case"fullcolor":S[0]=t.r,S[1]=t.g,S[2]=t.b;break;case"matrix":{const e=.299*t.r+.587*t.g+.114*t.b|0;S[0]=0,S[1]=e,S[2]=0;break}case"accent":S[0]=n,S[1]=o,S[2]=r;break;default:{const e=.299*t.r+.587*t.g+.114*t.b|0;S[0]=e,S[1]=e,S[2]=e;break}}return S}function A(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 C(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=A(t);if(e&&e.a>.1)return e}e=e.parentElement}return null}function T(t){if(t){const e=C(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=C(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 F(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 k(t){return t*t*(3-2*t)}var L={scale:1,offsetX:0,offsetY:0,glow:0,colorBlend:0,proximity:0};function I(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 L.scale=1,L.offsetX=0,L.offsetY=0,L.glow=0,L.colorBlend=0,L.proximity=0,L;const v=k(Math.max(0,1-p/M))*r;let w=1,x=0,y=0,b=0,S=0;switch(c){case"spotlight":{w=1+v*a*1.8;const t=Math.atan2(u,m),e=v*v*a*.6;x=Math.cos(t)*e*i,y=Math.sin(t)*e*s,b=v*a*.4,S=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;x=Math.cos(t)*e*i,y=Math.sin(t)*e*s;break}case"glow":b=v*a*.8,S=v*a*.4;break;case"colorShift":w=1,b=v*a*.12,S=v*a;break;case"attract":{const t=Math.atan2(u,m),e=v*v*a*1;x=(.45*-Math.cos(t)-1.6*Math.sin(t))*e*i,y=(.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);x=Math.cos(t+e)*n*i,y=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=k(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}x=Math.tanh(2*o)*a*i*3,y=Math.tanh(2*r)*a*s*3,S=n*a*.65,b=n*a*.35,w=1+n*a*.08,L.proximity=n;break}case"glitchText":w=1,b=v*a*.5,S=v*a*.6}return L.scale=w,L.offsetX=x,L.offsetY=y,L.glow=b,L.colorBlend=S,"trail"!==c&&(L.proximity=v),L}function R(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 H=null,W=null;function $(t,e){if(!H||!W){const n=g(t,e);H=n.canvas,W=n.ctx}return H.width!==t&&(H.width=t),H.height!==e&&(H.height=e),W}var j=new Map,P=new Map,z=new WeakMap;function O(t){const e=Intl.Segmenter;return e?Array.from(new e(void 0,{granularity:"grapheme"}).segment(t),({segment:t})=>t):[...t]}function q(t){let e=j.get(t);return e||(e=O(t),j.set(t,e)),e}function D(t){return O(t)}function B(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 U(t,e,n,o){const r=`${t}\0${e?1:0}\0${n}\0${o}`;let a=P.get(r);if(!a){const i=q(t);a=new Array(256);for(let t=0;t<256;t++)a[t]=B(p(t,n,o),i,e);P.set(r,a)}return a}function V(){j.clear(),P.clear(),ot=new WeakMap,at=new WeakMap,rt=new WeakMap,H=null,W=null}function K(t,e){return"auto"!==t?t:!T(e)}function N(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 Y(t){const e=t||"auto";if("auto"!==e)return N(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=N(t.getPropertyValue(e).trim());if(n)return n}const e=N(getComputedStyle(document.body).accentColor??"");if(e)return e}return T("undefined"!=typeof document?document.body:null)?"faf9f7":"0d0d0d"}function X(t,e,n){return Math.max(e,Math.min(n,t))}function G(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=X(a(t.left)??0,0,e-1),c=X(a(t.right)??0,0,e-s-1),l=X(i(t.top)??0,0,n-1),h=X(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=X(p,1,d?f:e),M=X(M,1,d?m:n);const v=t.anchor??"center",w=a(t.x),x=i(t.y),y=d?s:0,b=d?l:0,S=d?f:e,E=d?m:n,A=v.endsWith("left")||"left"===v?0:v.endsWith("right")||"right"===v?S-p:(S-p)/2,C=v.startsWith("top")||"top"===v?0:v.startsWith("bottom")||"bottom"===v?E-M:(E-M)/2;return{x:X(w??y+A,0,Math.max(0,e-p)),y:X(x??b+C,0,Math.max(0,n-M)),width:p,height:M}}function _(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,h=o||a,d=Math.floor(l/s),f=Math.floor(h/c);if(d<=0||f<=0)return{frame:[],cols:0,rows:0};const m=G(e.sourceCrop,r,a),u=Math.max(1,Math.min(Math.floor(2048/d),Math.floor(m.width/d))),g=Math.max(1,Math.min(Math.floor(2048/f),Math.floor(m.height/f))),v=d*u,x=f*g,y=$(v,x),b=y.globalCompositeOperation;y.globalCompositeOperation="copy";try{y.drawImage(t,m.x,m.y,m.width,m.height,0,0,v,x)}finally{y.globalCompositeOperation=b}const S=y.getImageData(0,0,v,x).data,E=e.chromaKey,A=null!=E&&!1!==E,C=!0===E,T="blue-screen"===E;let k=null,L=0;!A||C||T||(k=F(E),L=(e.chromaKeyTolerance??60)**2);let I=0,R=255;if(e.normalize){let t=255,e=0;for(let n=0;n<S.length;n+=4){if(A){const t=S[n],e=S[n+1],o=S[n+2];let r=!1;if(C)r=e>1.4*t&&e>1.4*o&&e>80;else if(T)r=o>1.4*t&&o>1.4*e&&o>80;else if(null!==k){const n=t-k.r,a=e-k.g,i=o-k.b;r=n*n+a*a+i*i<=L}if(r)continue}const o=.299*S[n]+.587*S[n+1]+.114*S[n+2];o<t&&(t=o),o>e&&(e=o)}I=t,R=e>t?e-t:255}const H=[],W=K(e.invert),j=A&&e.charset.replace(/ /g,"")||e.charset,P=q(j),z=e.customText?null:U(j,W,e.brightness,e.contrast),O=u*g;for(let t=0;t<f;t++){const n=[];for(let o=0;o<d;o++){let r=0,a=0,i=0,s=0,c=0;for(let e=0;e<g;e++){const n=(t*g+e)*v;for(let t=0;t<u;t++){const e=4*(n+o*u+t),l=S[e],h=S[e+1],d=S[e+2],f=S[e+3];if(A){let t=!1;if(C)t=h>1.4*l&&h>1.4*d&&h>80;else if(T)t=d>1.4*l&&d>1.4*h&&d>80;else if(null!==k){const e=l-k.r,n=h-k.g,o=d-k.b;t=e*e+n*n+o*o<=L}if(t){c++;continue}}r+=l,a+=h,i+=d,s+=f}}if(A&&c>O/2){n.push({char:" ",r:0,g:0,b:0,a:0});continue}const l=O-c,h=l>0?r/l:0,f=l>0?a/l:0,m=l>0?i/l:0,x=l>0?s/l:0,y=.299*h+.587*f+.114*m,b=e.normalize?(y-I)/R*255:y,E=p(b,e.brightness,e.contrast),F=e.ditherStrength>0?w(E,o,t,e.ditherStrength):E,H=e.customText?M(F,e.customText,o,t,d,W):e.ditherStrength>0?B(F,P,W):z[Math.max(0,Math.min(255,0|b))];n.push({char:H,r:h,g:f,b:m,a:x,lum:F})}H.push(n)}return{frame:H,cols:d,rows:f}}function J(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,h=o||a,d=Math.floor(l/s),f=Math.floor(h/c);if(d<=0||f<=0)return{rows:[],cols:0,rowCount:0};const m=d,u=f,g=$(m,u),M=G(e.sourceCrop,r,a),v=g.globalCompositeOperation;g.globalCompositeOperation="copy";try{g.drawImage(t,M.x,M.y,M.width,M.height,0,0,m,u)}finally{g.globalCompositeOperation=v}const x=g.getImageData(0,0,m,u).data,y=e.chromaKey,b=null!=y&&!1!==y,S=!0===y,E="blue-screen"===y;let A=null,C=0;!b||S||E||(A=F(y),C=(e.chromaKeyTolerance??60)**2);let T=0,k=255;if(e.normalize){let t=255,e=0;for(let n=0;n<x.length;n+=4){if(b){const t=x[n],e=x[n+1],o=x[n+2];let r=!1;if(S)r=e>1.4*t&&e>1.4*o&&e>80;else if(E)r=o>1.4*t&&o>1.4*e&&o>80;else if(null!==A){const n=t-A.r,a=e-A.g,i=o-A.b;r=n*n+a*a+i*i<=C}if(r)continue}const o=.299*x[n]+.587*x[n+1]+.114*x[n+2];o<t&&(t=o),o>e&&(e=o)}T=t,k=e>t?e-t:255}const L=K(e.invert),I=b&&e.charset.replace(/ /g,"")||e.charset,R=q(I),H=e.customText?null:U(I,L,e.brightness,e.contrast),W=e.customText?q(e.customText):null,j="fullcolor"===e.colorMode?new Uint8ClampedArray(d*f*4):void 0,P=[];for(let t=0;t<f;t++){let n="";for(let o=0;o<d;o++){const r=4*(t*m+o),a=r,i=x[r],s=x[r+1],c=x[r+2],l=x[r+3];if(b){let t=!1;if(S)t=s>1.4*i&&s>1.4*c&&s>80;else if(E)t=c>1.4*i&&c>1.4*s&&c>80;else if(null!==A){const e=i-A.r,n=s-A.g,o=c-A.b;t=e*e+n*n+o*o<=C}if(t){n+=" ",j&&(j[a]=0,j[a+1]=0,j[a+2]=0,j[a+3]=0);continue}}j&&(j[a]=i,j[a+1]=s,j[a+2]=c,j[a+3]=l);const h=.299*i+.587*s+.114*c,f=e.normalize?(h-T)/k*255:h,u=e.ditherStrength>0||W?p(f,e.brightness,e.contrast):f,g=e.ditherStrength>0?w(u,o,t,e.ditherStrength):u;if(W){n+=(L?1-g/255:g/255)<.12?" ":W[(t*d+o)%W.length]}else e.ditherStrength<=0?n+=H[Math.max(0,Math.min(255,0|f))]:n+=B(g,R,L)}P.push(n)}return{rows:P,cols:d,rowCount:f,colors:j}}function Q(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||(z.delete(t),t.clearRect(0,0,o,r),t.fillStyle=T(a)?"#0a0a0a":"#faf9f7",t.fillRect(0,0,o,r));const s=Y(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){z.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=D(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?T(a)?"rgb(230,230,230)":"rgb(24,24,24)":`rgb(${c},${l},${h})`;t.fillStyle=g,t.globalAlpha=1;const p=z.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))}z.set(t,{rows:e.rows.slice(),cols:e.cols,rowCount:e.rowCount,canvasWidth:o,canvasHeight:r,fillStyle:g}),t.globalAlpha=1}async function Z(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=_(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 tt(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=J(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 et(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 x=0,y=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))),A=Math.min(c.length,300);for(let t=0;t<A;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=_(m,e,n,o);w.push(b.frame),x=b.cols,y=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)/A)}return{frames:w,cols:x,rows:y,fps:E}}async function nt(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 x=0,y=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))),A=Math.min(c.length,300);for(let t=0;t<A;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=J(m,e,n,o);w.push(b),x=b.cols,y=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)/A)}return{frames:w,cols:x,rows:y,fps:E}}var ot=new WeakMap,rt=new WeakMap,at=new WeakMap;function it(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=ot.get(t);e||(e={x:.5,y:.5,intensity:0,time:-1,emittedAt:-1,points:[]},ot.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 ot.delete(t);if("none"!==n.animationStyle||n.charsetFrames?.length||n.hoverStrength<=0)return at.delete(t),void st(t,e,n,o,r,a,s);const c=rt.get(t);if(c?.frame!==e)return rt.set(t,{frame:e,since:performance.now()}),at.delete(t),void st(t,e,n,o,r,a,s);if(performance.now()-c.since<100)return void st(t,e,n,o,r,a,s);const l=t.getTransform();if(l.b||l.c||l.a<=0||l.d<=0)return void st(t,e,n,o,r,a,s);if(!s||(s.intensity??0)<.003)return void st(t,e,n,o,r,a,null);const h=T(t.canvas),d={...n,accentColor:"#"+Y(n.accentColor)},f=JSON.stringify([d,o,r,l.a,l.d,h,void 0!==document.fonts?document.fonts.status:"loaded"]);let m=at.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),st(a,e,d,o,r,0,null,void 0,h),m={frame:e,key:f,canvas:n},at.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,x=0,y=0;for(const t of M)v=Math.min(v,t.x-p),x=Math.max(x,t.x+p),w=Math.min(w,t.y-p),y=Math.max(y,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),x=Math.max(x,s.x+e/g)}const b=Math.ceil(5+4*n.hoverStrength),S={x:Math.max(0,Math.floor(v*g)-b),y:Math.max(0,Math.floor(w*u)-b),right:Math.min(g,Math.ceil(x*g)+b),bottom:Math.min(u,Math.ceil(y*u)+b)};t.save(),t.beginPath(),t.rect(S.x*o/g,S.y*r/u,(S.right-S.x)*o/g,(S.bottom-S.y)*r/u),t.clip(),st(t,e,d,o,r,a,s,S,h),t.restore()}function st(t,e,n,o,i,s=0,c,h,d){const f=e.length;if(0===f)return;const g=e[0].length;t.clearRect(0,0,o,i);let p=!1;const M=Math.max(1,f>>2),v=Math.max(1,g>>2);t:for(let t=0;t<f;t+=M){const n=e[t];for(let t=0;t<g;t+=v)if(n[t].a<200){p=!0;break t}}const w=t.canvas,x=d??T(w);p||(t.fillStyle=x?"#0a0a0a":"#faf9f7",t.fillRect(0,0,o,i));const y=o/g,S=i/f,A=c?.intensity??1,C=!!(c&&n.hoverStrength>0&&A>.005),F="#"+(N(n.hoverColor||"#ffffff")??"ffffff"),k=parseInt(F.slice(1,3),16),L=parseInt(F.slice(3,5),16),R=parseInt(F.slice(5,7),16),H=Y(n.accentColor),W=parseInt(H.substring(0,2),16),$=parseInt(H.substring(2,4),16),j=parseInt(H.substring(4,6),16),P=n.hoverRadius;let z=0,O=g,D=0,U=f,V=0,X=0;if(C&&c){V=c.x,X=c.y;const t=.08+.35*P+.04*n.hoverStrength;z=Math.max(0,Math.floor((V-t)*g)-1),O=Math.min(g,Math.ceil((V+t)*g)+1),D=Math.max(0,Math.floor((X-t)*f)-1),U=Math.min(f,Math.ceil((X+t)*f)+1)}if(C&&"trail"===n.hoverEffect)for(const t of c?.trail??[]){const e=.08+.35*P+.04*n.hoverStrength;z=Math.min(z,Math.max(0,Math.floor((t.x-e)*g)-1)),O=Math.max(O,Math.min(g,Math.ceil((t.x+e)*g)+1)),D=Math.min(D,Math.max(0,Math.floor((t.y-e)*f)-1)),U=Math.max(U,Math.min(f,Math.ceil((t.y+e)*f)+1))}const G=n.animationStyle,_=n.animationSpeed,J=function(t){const e=t&&Object.prototype.hasOwnProperty.call(r,t)?r[t]:t;return a.find(t=>t.value===e||t.mode===e)?.mode??"none"}(G),Q="none"===J,Z=[0,0,0,1],tt=Q?void 0:function(t){const e=u.get(t);if(e)return e;const n=t.length,o=t[0]?.length??0,r=new Uint8ClampedArray(o*n*4);for(let e=0;e<n;e++)for(let n=0;n<o;n++){const a=t[e][n],i=4*(e*o+n);r[i]=a.r,r[i+1]=a.g,r[i+2]=a.b,r[i+3]=a.a}const a=m(r,o,n);return u.set(t,a),a}(e),et=n.hoverStrength,nt=n.hoverEffect,ot=P,rt=n.hoverShape||"circle",at=K(n.invert,w),it=n.colorMode,st=2*Math.PI,ct=1/g,lt=1/f;let ht="",dt=-1;if("dots"===n.renderMode){const r=.5*Math.min(y,S)*n.dotSizeRatio;for(let n=h?.y??0;n<(h?.bottom??f);n++){const a=e[n];for(let e=h?.x??0;e<(h?.right??g);e++){const h=a[e];if(h.a<10)continue;const d=.00392156863*(.299*h.r+.587*h.g+.114*h.b),m=at?1-d:d;if(m<.02)continue;Q||l(J,e/g,n/f,s*_,Z,(.299*h.r+.587*h.g+.114*h.b)/255,tt,8*(n*g+e));const u=Math.max(0,Math.min(1,(1+Z[2])*Z[3]));let p=1,M=0,v=0,w=0,x=0;if(C&&e>=z&&e<=O&&n>=D&&n<=U){const t=I(e*ct,n*lt,V,X,A,et,y,S,nt,ot,rt,c?.trail,o/i);p=t.scale,M=t.offsetX,v=t.offsetY,w=t.glow,x=t.colorBlend}const T=r*m*u*p;if(T<.3)continue;const F=e*y+.5*y+M+Z[0],H=n*S+.5*S+v+Z[1];let P;if(x>0){const t=E(h,it,W,$,j,at);P=`rgb(${Math.min(255,t[0]+(k-t[0])*x|0)},${Math.min(255,t[1]+(L-t[1])*x|0)},${Math.min(255,t[2]+(R-t[2])*x|0)})`}else P=b(h,it,W,$,j,at);const q=Math.min(1,.00392156863*h.a*u*(1+w));if(q!==dt&&(t.globalAlpha=q,dt=q),P!==ht&&(t.fillStyle=P,ht=P),T<=3){const e=2*T;t.fillRect(F-T,H-T,e,e)}else t.beginPath(),t.arc(F,H,T,0,st),t.fill()}}}else{const r=.55,a=.9*Math.min(y/r,S);{const e=/\p{Extended_Pictographic}/u.test(n.customText||n.charset);t.font=e?`${a}px "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", "Twemoji Mozilla", sans-serif`:`${a}px "JetBrains Mono", monospace`,t.textAlign="center",t.textBaseline="middle"}const d=n.charsetFrames,m=!!d?.length,u=m?d[Math.floor(Math.max(0,s)*(n.charsetFps??2))%d.length]:n.charset,p=t.getTransform();if(!C&&Q&&!m&&"accent"===it&&!h&&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(${W},${$},${j})`,t.globalAlpha=1,t.textAlign="left";for(let n=0;n<f;n++){const r=e[n];let a="";for(let t=0;t<g;t++){const e=r[t];a+=e.a<10?" ":e.char}0!==a.trim().length&&t.fillText(a,.5*(y-o),n*S+.5*S)}return t.letterSpacing=n,t.textAlign="center",void(t.globalAlpha=1)}const M="glitchText"===nt&&C,v="!@#$%^&*<>{}[]|/\\~`0123456789",w=v.length;let x="",T=0,F=0,H=0,K=0,N=0,Y=0;if(M){const t=n.hoverText??"ASCIIFY";if(F=Math.round(V*g),H=Math.round(X*f),Array.isArray(t)){const e=t.filter(t=>t.length>0);0===e.length&&e.push("ASCIIFY");x=e[((7*Math.floor(F/Math.max(1,Math.ceil(g/5)))+13*Math.floor(H/Math.max(1,Math.ceil(f/3))))%e.length+e.length)%e.length]}else x=t||"ASCIIFY";T=x.length,K=Math.max(3,Math.min(12,Math.round(f*P*.6)));const e=Math.floor(K/2);N=Math.max(0,H-e),N+K>f&&(N=Math.max(0,f-K)),Y=F-Math.floor(T/2)}for(let n=h?.y??0;n<(h?.bottom??f);n++){const r=e[n];for(let a=h?.x??0;a<(h?.right??g);a++){const h=r[a];if(h.a<10)continue;let d=m&&null!=h.lum?B(h.lum,q(u),at):h.char;if(" "===d)continue;Q||l(J,a/g,n/f,s*_,Z,(.299*h.r+.587*h.g+.114*h.b)/255,tt,8*(n*g+a));const P=Math.max(0,Math.min(1,(1+Z[2])*Z[3]));if(P<.05)continue;let G=1,st=0,ft=0,mt=0,ut=0;if(C&&!M&&a>=z&&a<=O&&n>=D&&n<=U){const t=I(a*ct,n*lt,V,X,A,et,y,S,nt,ot,rt,c?.trail,o/i);if(G=t.scale,st=t.offsetX,ft=t.offsetY,mt=t.glow,ut=t.colorBlend,"trail"===nt&&t.proximity>0){const o=Math.max(0,Math.min(g-1,Math.round(a-t.offsetX/y))),r=e[Math.max(0,Math.min(f-1,Math.round(n-t.offsetY/S)))][o],i=r.lum??.299*r.r+.587*r.g+.114*r.b;d=B(Math.min(255,i+t.proximity*et*65),q(u),at)}}if(M&&n>=N&&n<N+K){const t=a-Y;if(t>=0&&t<T){const e=x[t],o=Math.abs(n-H)/Math.max(1,.5*K),r=Math.abs(a-F)/Math.max(1,T),i=Math.max(o,r),c=Math.max(0,Math.min(1,1-.9*i)),l=43758.5453*Math.sin(127.1*a+311.7*n+43758.5453*Math.floor(12*s));d=Math.abs(l-Math.floor(l))<c?e:v[Math.abs(Math.floor(97*l))%w],mt=.3+.7*c,ut=.3+.65*c}}const gt=a*y+.5*y+st+Z[0],pt=n*S+.5*S+ft+Z[1];let Mt;if(ut>0){const t=E(h,it,W,$,j,at);Mt=`rgb(${Math.min(255,t[0]+(k-t[0])*ut|0)},${Math.min(255,t[1]+(L-t[1])*ut|0)},${Math.min(255,t[2]+(R-t[2])*ut|0)})`}else Mt=b(h,it,W,$,j,at);const vt=Math.min(1,.00392156863*h.a*P*(1+mt));vt!==dt&&(t.globalAlpha=vt,dt=vt),Mt!==ht&&(t.fillStyle=Mt,ht=Mt),1!==G?(t.translate(gt,pt),t.scale(G,G),t.fillText(d,0,0),t.setTransform(p)):t.fillText(d,gt,pt)}}}t.globalAlpha=1}function ct(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 lt(t){return Math.max(0,Math.min(1,t))}function ht(t){return"string"==typeof t?document.querySelector(t):t instanceof HTMLElement?t:null}function dt(t){return"ascii"===t.renderMode&&"none"===t.animationStyle&&t.hoverStrength<=0&&!t.charsetFrames?.length}function ft(t,e={}){const n=lt(t),o=lt(n*(void 0===e.speed?1:Math.max(.001,e.speed)));return lt(e.ease?e.ease(o):o)}function mt(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=ft(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 ut(t,e){return Math.abs(t.currentTime-e)<1/240?gt(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 gt(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 pt(t,e={}){const n=ht(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=>mt(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?lt((a-r.top)/i):0;mt(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 Mt(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?lt((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 vt(t,e,n){if(!t||!e||!n.sourceCrop)return{w:t,h:e};const o=G(n.sourceCrop,t,e);return{w:Math.max(1,Math.round(o.width)),h:Math.max(1,Math.round(o.height))}}function wt(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=F(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 xt(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=G(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}=g(i,s);c.drawImage(t,a.x,a.y,a.width,a.height,0,0,i,s);const l=c.getImageData(0,0,i,s).data,h=Math.max(0,Math.min(255,e.chromaKeyTrimLuminanceThreshold??0));let d=i,f=s,m=-1,u=-1;for(let t=0;t<s;t++)for(let n=0;n<i;n++){const o=4*(t*i+n),r=l[o+3],a=l[o],s=l[o+1],c=l[o+2];r<=8||.2126*a+.7152*s+.0722*c<=h||wt(a,s,c,e)||(n<d&&(d=n),t<f&&(f=t),n>m&&(m=n),t>u&&(u=t))}if(m<d||u<f)return e;const p=Math.max(0,Math.min(.25,e.chromaKeyTrimPadding??.002)),M=Math.round(i*p),v=Math.round(s*p);d=Math.max(0,d-M),f=Math.max(0,f-v),m=Math.min(i-1,m+M),u=Math.min(s-1,u+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 x=p-v/2,y=M-w/2;return x=Math.max(i,Math.min(c-v,x)),y=Math.max(s,Math.min(l-w,y)),{left:x,top:y,right:n-(x+v),bottom:o-(y+w)}}({left:a.x+d/i*a.width,top:a.y+f/s*a.height,right:o-(a.x+(m+1)/i*a.width),bottom:r-(a.y+(u+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 yt(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 bt(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 ut(t,n),await gt(t);const o=yt(xt(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 ut(t,a),await gt(t),s?{...e,sourceCrop:{unit:"pixel",...s,preserveAspect:!0}}:e}function St(t,e,n=2048){return Et({sourceWidth:t,sourceHeight:e,maxRenderDimension:n})}function Et({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 At(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 Ct(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=At(i.width,s,l,h)??s,f=At(i.height,c,l,h)??c,m=function(t,e,n,o,r){const a=t=>{const n=At(t,e,o,r);return n&&n>0?n:0},i=t=>{const e=At(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,x;o&&r?({renderW:w,renderH:x}=Et({sourceWidth:o,sourceHeight:r,cssWidth:p,cssHeight:M,maxRenderDimension:a})):(w=p,x=M);const y=8e6,b=w*v*x*v>y?Math.sqrt(y/(w*x)):v;return t.width=Math.round(w*b),t.height=Math.round(x*b),t.style.width=`${p}px`,t.style.height=`${M}px`,{renderW:w,renderH:x,dpr:b}}async function Tt(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=ct(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}=St(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}=_(i,l,m,u),w=(t,e)=>{h.save(),h.setTransform(M,0,0,M,0,0),it(h,v,l,m,u,t/1e3,e),h.restore()};w(0,null);return R(e,w,{continuous:"none"!==l.animationStyle||!!l.charsetFrames?.length,interactive:l.hoverStrength>0}).stop}async function Ft(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,...ct(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 et(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 R(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||(it(l,h[o],c,e.width,e.height,(t-f)/1e3,n),m=o)},{continuous:!0,interactive:c.hoverStrength>0}).stop}async function kt(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:x}={}){const y=p?.start??0,b=p?.end,S=o??a.fontSize??10;let E={...n,...ct(r),artStyle:r,...a,fontSize:S};const A=e.getContext("2d");if(!A)throw new Error("asciifyVideo: could not get 2d context from canvas.");const C="string"==typeof i?document.querySelector(i):i instanceof HTMLElement?i:null,T={objectFit:s,objectPosition:c,scale:l,width:h,height:d,bleed:f},F=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,T),k=t=>()=>{t(),F()};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 bt(n,E,y,b,M);const o=vt(n.videoWidth,n.videoHeight,E);C&&Ct(e,C,o.w/o.h,o.w,o.h,g,T);const{renderW:r,renderH:a}=St(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-y:10,h=u??(M?18:void 0);if(dt(E)){const{frames:t,fps:o}=await tt(n,E,r,a,h,l,void 0,y),i=e=>{const n=t[e];n&&(A.save(),A.setTransform(c,0,0,c,0,0),Q(A,n,E,r,a),A.restore(),x?.())};if(M){let o=!1,r=-1;const a=!0===M?{}:M,s=Mt(ht(a.trigger)??C??e,a,e=>{const s=ft(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),k(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),k(()=>{d=!0,cancelAnimationFrame(s)})}const{frames:d,fps:f}=await Z(n,E,r,a,h,l,void 0,y);if(!d.length)throw new Error("asciifyVideo: no frames were decoded.");let m=0;const p=performance.now(),v=R(e,(t,e)=>{M||(m=Math.floor((t-p)*f/1e3)%d.length),A.save(),A.setTransform(c,0,0,c,0,0),it(A,d[m],E,r,a,(t-p)/1e3,e),A.restore(),x?.()},{continuous:!M||"none"!==E.animationStyle||!!E.charsetFrames?.length,interactive:E.hoverStrength>0});let S;if(M){const t=!0===M?{}:M;S=Mt(ht(t.trigger)??C??e,t,e=>{m=Math.max(0,Math.min(d.length-1,Math.round(ft(e,t)*(d.length-1)))),v.wake(),t.onUpdate?.(e,n)})}return w?.(n),k(()=>{v.stop(),S?.()})}let L,I=!1;"string"==typeof t?(L=document.createElement("video"),L.crossOrigin="anonymous",L.src=t,L.muted=!0,L.loop=!0,L.playsInline=!0,L.setAttribute("playsinline",""),Object.assign(L.style,{position:"fixed",top:"0",left:"0",width:"1px",height:"1px",opacity:"0",pointerEvents:"none",zIndex:"-1"}),document.body.appendChild(L),I=!0,await new Promise((e,n)=>{L.onloadedmetadata=()=>e(),L.onerror=()=>n(new Error(`asciifyVideo: failed to load "${t}"`))}),await L.play().catch(()=>{})):(L=t,L.readyState<HTMLMediaElement.HAVE_METADATA&&await new Promise((t,e)=>{const n=()=>{L.removeEventListener("loadedmetadata",o),L.removeEventListener("error",r)},o=()=>{n(),t()},r=()=>{n(),e(new Error("asciifyVideo: provided video element failed to load metadata."))};L.addEventListener("loadedmetadata",o),L.addEventListener("error",r),L.load()}),L.paused&&await L.play().catch(()=>{})),y>0&&(L.currentTime=y,await new Promise(t=>{const e=()=>{L.removeEventListener("seeked",e),t()};L.addEventListener("seeked",e)}),await gt(L));let H=null;(y>0||void 0!==b)&&(H=()=>{(void 0!==b&&L.currentTime>=b||y>0&&L.currentTime<y)&&(L.currentTime=y)},L.addEventListener("timeupdate",H)),E=await bt(L,E,y,b,M);let W=null;const $=vt(L.videoWidth,L.videoHeight,E);let{renderW:j,renderH:P}=St($.w,$.h,g);const z=t=>"frame"===E.chromaKeyTrimMode?xt(t,E,j/P):E;if(C){const t=$.w/$.h,n=$.w,o=$.h,r=Ct(e,C,t,n,o,g,T);j=r.renderW,P=r.renderH;const a=e.getContext("2d");a&&a.setTransform(r.dpr,0,0,r.dpr,0,0),W=new ResizeObserver(()=>{const r=Ct(e,C,t,n,o,g,T);j=r.renderW,P=r.renderH;const a=e.getContext("2d");a&&a.setTransform(r.dpr,0,0,r.dpr,0,0)}),W.observe(C)}else{const t="undefined"!=typeof window&&window.devicePixelRatio||1,n=8e6,o=j*t*P*t>n?Math.sqrt(n/(j*P)):t;e.width===Math.round(j*o)&&e.height===Math.round(P*o)||(e.width=Math.round(j*o),e.height=Math.round(P*o)),A.setTransform(o,0,0,o,0,0)}let O=!0,q=null;const D=M&&!m,B=u&&u>0?1e3/u:0;let U=0;const V=!D&&dt(E);if(D&&"ascii"===E.renderMode&&"none"===E.animationStyle&&E.hoverStrength<=0&&!E.charsetFrames?.length){const t=!0===M?{}:M,n=ht(t.trigger)??C??e,o=t.from??y,r=t.to??b??L.duration,a=Math.max(o,Math.min(r,L.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,R=!1,$=!1;const O=new Set,D=document.createElement("video");D.muted=!0,D.playsInline=!0,D.preload="auto",D.crossOrigin=L.crossOrigin||"anonymous",D.src=L.currentSrc||L.src,Object.assign(D.style,{position:"fixed",top:"0",left:"0",width:"1px",height:"1px",opacity:"0",pointerEvents:"none",zIndex:"-1"}),document.body.appendChild(D),D.readyState<HTMLMediaElement.HAVE_METADATA&&await new Promise((t,e)=>{const n=()=>{D.removeEventListener("loadedmetadata",o),D.removeEventListener("error",r)},o=()=>{n(),t()},r=()=>{n(),e(new Error("asciifyVideo: cache video failed to load metadata."))};D.addEventListener("loadedmetadata",o),D.addEventListener("error",r),D.load()}),D.pause(),L.paused&&await L.play().catch(()=>{});const V=t=>o+i*t/Math.max(1,c-1),K=t=>Math.max(0,Math.min(c-1,Math.round(t*(c-1)))),N=z(L),Y=J(L,N,j,P);Y.rows.length>0&&(l[0]=Y,m(0),Q(A,Y,N,j,P),$=!0,w?.(L),x?.());const X=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},G=()=>{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},_=t=>{t<0||t>=c||l[t]||(O.add(t),Z())},Z=async()=>{if(F||R)return;const t=G();if(!(t<0)){O.delete(t),R=!0;try{if(await ut(D,V(t)),!F){const e=z(D),n=J(D,e,j,P);n.rows.length>0&&(l[t]=n,m(t))}}finally{R=!1,F||requestAnimationFrame(()=>{Z()})}}},tt=()=>{if(F)return;const t=X(g);if(t>=0&&t!==S){const e=l[t];e&&(Q(A,e,E,j,P),S=t,$||($=!0,w?.(L)),x?.())}else if(t<0||S<0){const t=performance.now();if(B<=0||t-U>=B){const e=z(L),n=J(L,e,j,P);n.rows.length>0&&(Q(A,n,e,j,P),U=t,$||($=!0,w?.(L)),x?.())}}_(g),T=requestAnimationFrame(tt)};return q=Mt(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=ft(e,n),s=o+(a-o)*i;return{progress:i,time:Math.min(Math.max(o,s),Math.max(o,a-.04))}}(L,e,{...t,from:o,to:a});p=n?.progress??lt(e),g=K(p),_(g),_(g-1),_(g+1),_(g-2),_(g+2),_(g-3),_(g+3),t.onUpdate?.(p,L)}),_(0),_(1),T=requestAnimationFrame(tt),k(()=>{F=!0,cancelAnimationFrame(T),q?.(),W?.disconnect(),O.clear(),h.length=0,l.fill(void 0),D.pause(),D.src="",D.removeAttribute("src"),D.load(),D.isConnected&&D.remove(),H&&L.removeEventListener("timeupdate",H),I&&(L.pause(),L.src="",L.removeAttribute("src"),L.load(),L.isConnected&&L.remove())})}if(D){const t=!0===M?{}:M;q=pt(L,{...t,trigger:t.trigger??C??e,from:t.from??y,to:t.to??b})}let K=-1,N=0,Y=-1,X=0;const G="function"==typeof L.requestVideoFrameCallback,et=()=>{X=L.requestVideoFrameCallback(()=>{N++,et()})};G&&et();let nt=0,ot=0,rt=null;const at=R(e,(t,n)=>{if(L.readyState<2||0===e.width||0===e.height)return;if(B>0&&t-U<B&&!n)return;if(y>0&&L.currentTime<y)return;if(void 0!==b&&L.currentTime>=b)return;const o=(G?N!==Y:L.currentTime!==K)||nt!==j||ot!==P;if(o||!(E.hoverStrength<=0)||"none"!==E.animationStyle||E.charsetFrames?.length){if(V){const t=z(L),e=J(L,t,j,P);Q(A,e,t,j,P)}else!o&&rt||(rt=_(L,z(L),j,P).frame),it(A,rt,E,j,P,t/1e3,n);K=L.currentTime,Y=N,nt=j,ot=P,U=t,O&&(O=!1,w?.(L)),x?.()}},{continuous:!0,interactive:E.hoverStrength>0});return k(()=>{at.stop(),X&&L.cancelVideoFrameCallback(X),q?.(),W?.disconnect(),H&&L.removeEventListener("timeupdate",H),I&&(L.pause(),L.src="",L.removeAttribute("src"),L.load(),L.isConnected&&L.remove())})}function Lt(t,e,n){return kt(t,e,n)}function It(t,e={},o,r){const a={...n,...e},{frame:i,cols:s}=_(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 Rt(t,e={},o,r){const a={...n,...e},{frame:i,cols:s}=_(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}`;c.push(e)}return c.join("\n")}function Ht(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 Wt=new WeakMap;function $t(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=Wt.get(t);v&&v.key===M||(v={key:M,frame:Ht(r,g,p,l,h)},Wt.set(t,v));it(t,v.frame,{...n,fontSize:s,hoverEffect:d,hoverStrength:f,hoverRadius:m,hoverColor:u},e,o,0,i??null)}function jt(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 Pt(t,e={}){const{filename:n="asciify-snapshot",format:o="png",...r}=e,a=await jt(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 zt(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=ct(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 x=performance.now(),y=e=>{if(!w){if(d.readyState>=d.HAVE_CURRENT_DATA){const n=t.width/u,o=t.height/u,r=(e-x)/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}=_(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),it(m,c,s,n,o,r,l),m.restore()):it(m,c,s,n,o,r,l)}v=requestAnimationFrame(y)}};return v=requestAnimationFrame(y),()=>{w=!0,cancelAnimationFrame(v),t.removeEventListener("mousemove",p),t.removeEventListener("mouseleave",M),h.getTracks().forEach(t=>t.stop()),d.srcObject=null}}var Ot={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]},qt=[127,65,65,65,65,65,127];function Dt(t){return Ot[t]??Ot[t.toUpperCase()]??qt}function Bt(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=Dt(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 Ut(t,e,n={}){const{color:o="#d4ff00",bgColor:r,fontSize:a=10}=n,i=Bt(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 Vt=["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,Vt as STUDIO_STYLES,It as asciiText,Rt as asciiTextAnsi,Tt as asciify,Ft as asciifyGif,Lt as asciifyLiveVideo,Bt as asciifyText,kt as asciifyVideo,zt as asciifyWebcam,Ht as buildTextFrame,jt as captureSnapshot,V as clearAsciifyCaches,Et as computeCanvasRenderSize,pt as createVideoScrollScrub,et as gifToAsciiFrames,nt as gifToAsciiTextFrames,_ as imageToAsciiFrame,J as imageToAsciiTextFrame,it as renderFrameToCanvas,$t as renderTextBackground,Q as renderTextFrameToCanvas,Ut as renderTextToCanvas,Pt as snapshotAndDownload,Z as videoToAsciiFrames,tt as videoToAsciiTextFrames};//# sourceMappingURL=core.js.map
@@ -1,4 +1,7 @@
1
- type AmbientMotion = 'none' | 'caustics' | 'current' | 'reform' | 'sheen' | 'tidal' | 'grain' | 'parallax' | 'weave' | 'print' | 'trace' | 'relight' | 'shimmer' | 'breeze' | 'unfold';
1
+ type AmbientMotion = 'none' | 'relight' | 'sheen' | 'glow' | 'shimmer' | 'parallax' | 'push' | 'focus' | 'mist' | 'current' | 'develop';
2
+ /** Retired after 4.21: each still loads, as its closest photo-aware replacement. */
3
+ type LegacyAmbientMotion = 'caustics' | 'grain' | 'trace' | 'tidal' | 'weave' | 'breeze' | 'reform' | 'print' | 'unfold';
4
+ declare const DEPRECATED_MOTIONS: Readonly<Record<LegacyAmbientMotion, AmbientMotion>>;
2
5
  declare const MOTION_STYLES: readonly [{
3
6
  readonly value: "none";
4
7
  readonly mode: "none";
@@ -6,89 +9,65 @@ declare const MOTION_STYLES: readonly [{
6
9
  readonly label: "Off";
7
10
  readonly description: "Keep the image still. Hover stays available.";
8
11
  }, {
9
- readonly value: "caustics";
10
- readonly mode: "caustics";
11
- readonly group: "Light and texture";
12
- readonly label: "Caustics";
13
- readonly description: "Soft ribbons of light travel across a stationary character grid.";
14
- }, {
15
- readonly value: "current";
16
- readonly mode: "current";
17
- readonly group: "Flow and depth";
18
- readonly label: "Slow Current";
19
- readonly description: "A gentle flow through the image, with steady edges.";
20
- }, {
21
- readonly value: "reform";
22
- readonly mode: "reform";
23
- readonly group: "Rebuild";
24
- readonly label: "Reveal & Reform";
25
- readonly description: "Disperse, gather, then hold the complete image.";
12
+ readonly value: "relight";
13
+ readonly mode: "relight";
14
+ readonly group: "Light";
15
+ readonly label: "Relight";
16
+ readonly description: "A key light circles the subject and models its own relief, like moving a lamp around a sculpture.";
26
17
  }, {
27
18
  readonly value: "sheen";
28
19
  readonly mode: "sheen";
29
- readonly group: "Light and texture";
30
- readonly label: "Sheen";
31
- readonly description: "A broad diagonal light sweep; characters stay anchored.";
32
- }, {
33
- readonly value: "tidal";
34
- readonly mode: "tidal";
35
- readonly group: "Flow and depth";
36
- readonly label: "Tidal Rings";
37
- readonly description: "Concentric currents travel outward, with protected edges.";
38
- }, {
39
- readonly value: "grain";
40
- readonly mode: "grain";
41
- readonly group: "Light and texture";
42
- readonly label: "Living Grain";
43
- readonly description: "Slow, individually phased tonal changes on a stationary grid.";
20
+ readonly group: "Light";
21
+ readonly label: "Specular sweep";
22
+ readonly description: "One slow pass of light glances across the highlights and follows their form, then rests.";
23
+ }, {
24
+ readonly value: "glow";
25
+ readonly mode: "glow";
26
+ readonly group: "Light";
27
+ readonly label: "Highlight bloom";
28
+ readonly description: "The brightest areas breathe a soft halo into their surroundings. Shadows stay deep.";
29
+ }, {
30
+ readonly value: "shimmer";
31
+ readonly mode: "shimmer";
32
+ readonly group: "Light";
33
+ readonly label: "Glints";
34
+ readonly description: "Sparse glints on bright fine detail, like light on water, metal or an eye. Everything else holds still.";
44
35
  }, {
45
36
  readonly value: "parallax";
46
37
  readonly mode: "parallax";
47
- readonly group: "Flow and depth";
38
+ readonly group: "Depth";
48
39
  readonly label: "Parallax";
49
- readonly description: "A shallow, continuous drift through the image, with the edges held in place.";
50
- }, {
51
- readonly value: "weave";
52
- readonly mode: "weave";
53
- readonly group: "Flow and depth";
54
- readonly label: "Woven Flow";
55
- readonly description: "Interlaced bands move in opposing directions, like a flexible printed fabric.";
56
- }, {
57
- readonly value: "print";
58
- readonly mode: "print";
59
- readonly group: "Rebuild";
60
- readonly label: "Print Shift";
61
- readonly description: "Staggered rows lift, soften and register back into the image.";
62
- }, {
63
- readonly value: "trace";
64
- readonly mode: "trace";
65
- readonly group: "Light and texture";
66
- readonly label: "Contour Light";
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.";
40
+ readonly description: "A slow camera drift: the subject moves against its background, read from the photo’s own depth cues.";
41
+ }, {
42
+ readonly value: "push";
43
+ readonly mode: "push";
44
+ readonly group: "Depth";
45
+ readonly label: "Slow push";
46
+ readonly description: "A gentle push toward the subject and back, with nearer areas moving slightly more.";
47
+ }, {
48
+ readonly value: "focus";
49
+ readonly mode: "focus";
50
+ readonly group: "Depth";
51
+ readonly label: "Focus pull";
52
+ readonly description: "Focus racks from the subject to the background and back; the characters soften out of focus.";
53
+ }, {
54
+ readonly value: "mist";
55
+ readonly mode: "mist";
56
+ readonly group: "Atmosphere";
57
+ readonly label: "Mist";
58
+ readonly description: "Soft mist drifts through the distance and plain areas, leaving the subject clear.";
74
59
  }, {
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.";
60
+ readonly value: "current";
61
+ readonly mode: "current";
62
+ readonly group: "Atmosphere";
63
+ readonly label: "Drift";
64
+ readonly description: "Sky, water and smooth grounds flow slowly, like a cinemagraph; detailed areas hold still.";
65
+ }, {
66
+ readonly value: "develop";
67
+ readonly mode: "develop";
68
+ readonly group: "Reveal";
69
+ readonly label: "Develop";
70
+ readonly description: "The image holds, fades, then develops back in from its highlights to its shadows, like a print in the tray.";
92
71
  }];
93
72
 
94
73
  /** One public catalog for the hero, studio, documentation and integrations. */
@@ -208,4 +187,4 @@ declare const HOVER_SCOPES: readonly {
208
187
  description: string;
209
188
  }[];
210
189
 
211
- export { type AmbientMotion as A, type DeprecatedSurfaceHover as D, type HoverScope as H, MOTION_STYLES as M, type SurfaceHover as S, DEPRECATED_SURFACE_HOVERS as a, HOVER_SCOPES as b, SURFACE_HOVERS as c };
190
+ export { type AmbientMotion as A, type DeprecatedSurfaceHover as D, type HoverScope as H, type LegacyAmbientMotion as L, MOTION_STYLES as M, type SurfaceHover as S, DEPRECATED_SURFACE_HOVERS as a, DEPRECATED_MOTIONS as b, HOVER_SCOPES as c, SURFACE_HOVERS as d };