{"version":3,"file":"LEDMatrix.B2R7YK0w.mjs","names":["useRef"],"sources":["https:/framerusercontent.com/modules/nJotCkYONdFbf8gDAnl4/AWRQt7Oy97zgY3l5Madg/LEDMatrix.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef}from\"react\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";/**\n * LED dot-matrix display. Cycles through words, sparkles at random and lights up under the cursor.\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n */export default function LEDMatrix(props){const{words=\"VELQEN\\xae,MAKE,IDEAS,MATTER.\",interval=2.6,pitch=12,dot=.62,textScale=.5,onColor=\"#FF4F1F\",dimColor=\"rgba(255,255,255,0.07)\",sparkle=.004,fontFamily=\"Switzer, Inter, Arial, sans-serif\"}=props;const wrap=useRef(null);const cvs=useRef(null);useEffect(()=>{const el=wrap.current;const canvas=cvs.current;if(!el||!canvas)return;const ctx=canvas.getContext(\"2d\");if(!ctx)return;const isCanvas=RenderTarget.current()===RenderTarget.canvas;const list=words.split(\",\").map(w=>w.trim()).filter(Boolean);let W=0,H=0,cols=0,rows=0,dpr=1;let level=new Float32Array(0);let target=new Float32Array(0);let delay=new Float32Array(0);let spark=new Float32Array(0);let wordIndex=0;let switchedAt=0;let raf=0;let mouse={x:-9999,y:-9999};const mask=word=>{const off=document.createElement(\"canvas\");off.width=cols;off.height=rows;const o=off.getContext(\"2d\");o.fillStyle=\"#000\";o.fillRect(0,0,cols,rows);let size=Math.floor(rows*textScale);o.font=`600 ${size}px ${fontFamily}`;const maxW=cols*.86;const m=o.measureText(word);if(m.width>maxW){size=Math.floor(size*maxW/m.width);o.font=`600 ${size}px ${fontFamily}`;}o.fillStyle=\"#fff\";o.textAlign=\"center\";o.textBaseline=\"middle\";o.fillText(word,cols/2,rows/2+size*.04);const data=o.getImageData(0,0,cols,rows).data;const out=new Float32Array(cols*rows);for(let i=0;i<cols*rows;i++)out[i]=data[i*4]>110?1:0;return out;};const setWord=(i,now)=>{wordIndex=i;switchedAt=now;target=mask(list[i%list.length]||\"\");for(let k=0;k<delay.length;k++){const c=k%cols;delay[k]=c/cols*.55+Math.random()*.25;}};const resize=()=>{const r=el.getBoundingClientRect();dpr=Math.min(2,window.devicePixelRatio||1);W=Math.max(1,r.width);H=Math.max(1,r.height);canvas.width=Math.round(W*dpr);canvas.height=Math.round(H*dpr);canvas.style.width=W+\"px\";canvas.style.height=H+\"px\";cols=Math.max(8,Math.floor(W/pitch));rows=Math.max(6,Math.floor(H/pitch));level=new Float32Array(cols*rows);delay=new Float32Array(cols*rows);spark=new Float32Array(cols*rows);setWord(wordIndex,performance.now());if(isCanvas)level.set(target);};const draw=now=>{ctx.setTransform(dpr,0,0,dpr,0,0);ctx.clearRect(0,0,W,H);const ox=(W-cols*pitch)/2+pitch/2;const oy=(H-rows*pitch)/2+pitch/2;const rad=pitch*dot/2;const t=(now-switchedAt)/1e3;ctx.fillStyle=dimColor;ctx.beginPath();for(let y=0;y<rows;y++)for(let x=0;x<cols;x++){ctx.moveTo(ox+x*pitch+rad,oy+y*pitch);ctx.arc(ox+x*pitch,oy+y*pitch,rad,0,Math.PI*2);}ctx.fill();ctx.fillStyle=onColor;for(let y=0;y<rows;y++)for(let x=0;x<cols;x++){const i=y*cols+x;if(!isCanvas){const goal=t>delay[i]?target[i]:level[i]>.5?1:0;level[i]+=(goal-level[i])*.22;if(Math.random()<sparkle)spark[i]=1;spark[i]*=.9;}const px=ox+x*pitch;const py=oy+y*pitch;const d=Math.hypot(px-mouse.x,py-mouse.y);const hover=d<90?(1-d/90)*.55:0;const a=Math.min(1,level[i]+spark[i]*.7+hover);if(a<.03)continue;ctx.globalAlpha=a;ctx.beginPath();ctx.arc(px,py,rad,0,Math.PI*2);ctx.fill();}ctx.globalAlpha=1;};const loop=now=>{if(list.length>1&&now-switchedAt>interval*1e3)setWord((wordIndex+1)%list.length,now);draw(now);raf=requestAnimationFrame(loop);};const ro=new ResizeObserver(()=>{resize();if(isCanvas)draw(performance.now());});ro.observe(el);resize();const onMove=e=>{const r=el.getBoundingClientRect();mouse={x:e.clientX-r.left,y:e.clientY-r.top};};const onLeave=()=>mouse={x:-9999,y:-9999};el.addEventListener(\"pointermove\",onMove);el.addEventListener(\"pointerleave\",onLeave);let io=null;if(isCanvas)draw(performance.now());else{io=new IntersectionObserver(([entry])=>{cancelAnimationFrame(raf);if(entry.isIntersecting)raf=requestAnimationFrame(loop);});io.observe(el);}return()=>{cancelAnimationFrame(raf);ro.disconnect();io?.disconnect();el.removeEventListener(\"pointermove\",onMove);el.removeEventListener(\"pointerleave\",onLeave);};},[words,interval,pitch,dot,textScale,onColor,dimColor,sparkle,fontFamily]);return /*#__PURE__*/_jsx(\"div\",{ref:wrap,style:{...props.style,position:\"relative\",width:\"100%\",height:\"100%\",overflow:\"hidden\"},children:/*#__PURE__*/_jsx(\"canvas\",{ref:cvs,style:{position:\"absolute\",inset:0,display:\"block\"}})});}addPropertyControls(LEDMatrix,{words:{type:ControlType.String,title:\"Words\",defaultValue:\"VELQEN\\xae,MAKE,IDEAS,MATTER.\",description:\"Comma separated\"},interval:{type:ControlType.Number,title:\"Interval\",defaultValue:2.6,min:.5,max:10,step:.1,unit:\"s\"},pitch:{type:ControlType.Number,title:\"Dot Pitch\",defaultValue:12,min:4,max:40,step:1,unit:\"px\"},dot:{type:ControlType.Number,title:\"Dot Size\",defaultValue:.62,min:.2,max:1,step:.01},textScale:{type:ControlType.Number,title:\"Text Scale\",defaultValue:.5,min:.1,max:1,step:.01},onColor:{type:ControlType.Color,title:\"Lit\",defaultValue:\"#FF4F1F\"},dimColor:{type:ControlType.Color,title:\"Unlit\",defaultValue:\"rgba(255,255,255,0.07)\"},sparkle:{type:ControlType.Number,title:\"Sparkle\",defaultValue:.004,min:0,max:.05,step:.001},fontFamily:{type:ControlType.String,title:\"Font\",defaultValue:\"Switzer, Inter, Arial, sans-serif\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"LEDMatrix\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"fixed\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LEDMatrix.map"],"mappings":"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"}