{"version":3,"file":"LEDMatrixText.DBwvx6oQ.mjs","names":["useRef","useState","useMemo"],"sources":["https:/framerusercontent.com/modules/iIGWibahAxIydPkYpFxo/TeWk1TleK6i5K85TsApM/LEDMatrixText.js"],"sourcesContent":["// Text Matrix component with animated accent dots - dots only render inside text mask\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef,useState,useMemo,startTransition}from\"react\";import{addPropertyControls,ControlType}from\"framer\";/**\n * Text Matrix\n *\n * @framerIntrinsicWidth 600\n * @framerIntrinsicHeight 200\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */export default function TextMatrix(props){const{text=\"AgentLab\",fontPreset=\"Inter\",customFont=\"\",sizeMode=\"fill\",fontSize=120,dotSize=6,gap=2,accentColor=\"#3B5BFF\",secondaryColor=\"#2e2e2e\",backgroundColor=\"#000000\",accentDensity=15,animate=true,speed=50,style}=props;const containerRef=useRef(null);const canvasRef=useRef(null);const[dimensions,setDimensions]=useState({width:0,height:0});const[accentPositions,setAccentPositions]=useState(new Set);const animationFrameRef=useRef();const cachedDotsRef=useRef(null);const isDirtyRef=useRef(true);const offscreenCanvasRef=useRef(null);const dotStatesRef=useRef(new Map);const fadeAnimationRef=useRef();// Determine which font to use\nconst fontFamily=useMemo(()=>{if(fontPreset===\"Custom\"){return customFont.trim()!==\"\"?customFont:\"Inter\";}return fontPreset;},[fontPreset,customFont]);// Seed-based random number generator for stable accent positions\nconst seededRandom=useMemo(()=>{return seed=>{const x=Math.sin(seed)*1e4;return x-Math.floor(x);};},[]);// Calculate grid dimensions with integer precision\nconst gridInfo=useMemo(()=>{const{width,height}=dimensions;if(width===0||height===0)return null;const cellSize=Math.floor(dotSize+gap);const cols=Math.floor(width/cellSize);const rows=Math.floor(height/cellSize);return{cols,rows,offsetX:0,offsetY:0,cellSize};},[dimensions,dotSize,gap]);// Generate text bitmap and valid dot positions (only inside text) with tight bounding\nconst textData=useMemo(()=>{if(!gridInfo)return null;const{cols,rows,cellSize,offsetX,offsetY}=gridInfo;const{width,height}=dimensions;// Step 1: Reuse offscreen canvas for performance\nconst scale=typeof window!==\"undefined\"?Math.max(2,window.devicePixelRatio||2):2;let canvas=offscreenCanvasRef.current;if(!canvas){canvas=document.createElement(\"canvas\");offscreenCanvasRef.current=canvas;}// Only resize if dimensions changed\nconst targetWidth=width*scale;const targetHeight=height*scale;if(canvas.width!==targetWidth||canvas.height!==targetHeight){canvas.width=targetWidth;canvas.height=targetHeight;}const ctx=canvas.getContext(\"2d\",{willReadFrequently:true,alpha:false});if(!ctx)return null;// Disable anti-aliasing for crisp rendering\nctx.imageSmoothingEnabled=false;// Fill solid black\nctx.fillStyle=\"#000000\";ctx.fillRect(0,0,canvas.width,canvas.height);// Calculate font size based on sizeMode\nlet finalFontSize;if(sizeMode===\"fill\"){// Step 1: Render at known large size (1000px) to measure\nconst initialFontSize=1e3;ctx.font=`bold ${initialFontSize}px ${fontFamily}`;ctx.fillStyle=\"#ffffff\";ctx.textBaseline=\"top\";ctx.textAlign=\"left\";// Measure text to get its natural dimensions\nconst metrics=ctx.measureText(text);const textWidth=metrics.width;// Use a reasonable height estimate based on font size\nconst textHeight=initialFontSize*1.2;// Step 2: Calculate scale to fit component bounds (edge to edge)\nconst scaleX=canvas.width/textWidth;const scaleY=canvas.height/textHeight;const fillScale=Math.min(scaleX,scaleY);// Step 3: Calculate final font size\nfinalFontSize=initialFontSize*fillScale;// Clear and render at final size, centered\nctx.fillStyle=\"#000000\";ctx.fillRect(0,0,canvas.width,canvas.height);ctx.font=`bold ${finalFontSize}px ${fontFamily}`;ctx.fillStyle=\"#ffffff\";ctx.textBaseline=\"middle\";ctx.textAlign=\"center\";ctx.fillText(text,canvas.width/2,canvas.height/2);}else{// Fixed mode: use exact fontSize prop\nfinalFontSize=fontSize*scale;ctx.font=`bold ${finalFontSize}px ${fontFamily}`;// Draw text in solid white, centered\nctx.fillStyle=\"#ffffff\";ctx.textBaseline=\"middle\";ctx.textAlign=\"center\";ctx.fillText(text,canvas.width/2,canvas.height/2);}// Step 2: Read back pixel data\nconst imageData=ctx.getImageData(0,0,canvas.width,canvas.height);const bitmap=imageData.data;// Step 3: Sample at dot center positions and build valid positions list\nconst validPositions=[];for(let row=0;row<rows;row++){for(let col=0;col<cols;col++){// Calculate center coordinate of this dot in component space\nconst dotCenterX=Math.floor(offsetX+col*cellSize+dotSize/2);const dotCenterY=Math.floor(offsetY+row*cellSize+dotSize/2);// Map to scaled canvas space\nconst canvasX=Math.floor(dotCenterX*scale);const canvasY=Math.floor(dotCenterY*scale);// Bounds check: ensure we're within canvas\nif(canvasX<0||canvasY<0||canvasX>=canvas.width||canvasY>=canvas.height){continue;}// Sample the pixel at this position (check red channel only for performance)\nconst pixelIndex=(canvasY*canvas.width+canvasX)*4;// If red channel > 128, dot is inside a letter\nif(bitmap[pixelIndex]>128){validPositions.push(`${col},${row}`);}}}// Cache the dot positions\ncachedDotsRef.current={positions:validPositions,cols,rows};isDirtyRef.current=true;return{validPositions};},[gridInfo,text,fontFamily,sizeMode,fontSize,dimensions,dotSize]);// Generate accent dot positions using seeded random\nconst generateAccentPositions=useMemo(()=>{return(seed,density)=>{if(!textData||textData.validPositions.length===0)return new Set;const totalTextDots=textData.validPositions.length;const accentCount=Math.max(0,Math.min(totalTextDots,Math.floor(totalTextDots*density/100)));const positions=new Set;for(let i=0;i<accentCount;i++){const randomIndex=Math.floor(seededRandom(seed+i)*totalTextDots);positions.add(textData.validPositions[randomIndex]);}return positions;};},[textData,seededRandom]);// Initialize accent positions based on text\nuseEffect(()=>{const seed=text.split(\"\").reduce((acc,char)=>acc+char.charCodeAt(0),0);startTransition(()=>{setAccentPositions(generateAccentPositions(seed,accentDensity));});},[text,generateAccentPositions,accentDensity]);// Initialize dot states when text data changes with randomized timing\nuseEffect(()=>{if(!textData)return;const states=dotStatesRef.current;// Initialize all dots with randomized timing\nfor(const posKey of textData.validPositions){if(!states.has(posKey)){states.set(posKey,{isAccent:false,progress:0,fadeInDuration:150+Math.random()*350,fadeOutDuration:150+Math.random()*350,phaseOffset:Math.random()*3e3,cycleStartTime:performance.now()});}}isDirtyRef.current=true;},[textData]);// Update dot accent assignments when accent positions change\nuseEffect(()=>{if(!textData)return;const states=dotStatesRef.current;// Update accent assignments\nfor(const posKey of textData.validPositions){const state=states.get(posKey);if(state){state.isAccent=accentPositions.has(posKey);}}isDirtyRef.current=true;},[accentPositions,textData]);// Per-dot fade animation loop with independent randomized timing\nuseEffect(()=>{if(fadeAnimationRef.current){cancelAnimationFrame(fadeAnimationRef.current);}let isRunning=true;// Smoothstep easing function\nconst smoothstep=t=>t*t*(3-2*t);const animateFades=timestamp=>{if(!isRunning)return;const states=dotStatesRef.current;let anyChanges=false;// Update all dot progress values\nfor(const[posKey,state]of states.entries()){// Normal animation (not hovering): independent cycling with randomized timing\nif(state.isAccent){// Calculate position in this dot's unique cycle\nconst timeSinceCycleStart=timestamp-state.cycleStartTime;const cycleTime=timeSinceCycleStart%(state.fadeInDuration+state.fadeOutDuration+1e3)// 1000ms hold at full\n;if(cycleTime<state.fadeInDuration){// Fade in phase\nconst fadeInProgress=cycleTime/state.fadeInDuration;const newProgress=smoothstep(fadeInProgress);if(Math.abs(state.progress-newProgress)>.01){state.progress=newProgress;anyChanges=true;}}else if(cycleTime<state.fadeInDuration+1e3){// Hold at full brightness\nif(state.progress!==1){state.progress=1;anyChanges=true;}}else{// Fade out phase\nconst fadeOutStart=state.fadeInDuration+1e3;const fadeOutProgress=(cycleTime-fadeOutStart)/state.fadeOutDuration;const newProgress=1-smoothstep(fadeOutProgress);if(Math.abs(state.progress-newProgress)>.01){state.progress=newProgress;anyChanges=true;}}}else{// Non-accent dots stay at 0\nif(state.progress!==0){state.progress=0;anyChanges=true;}}}if(anyChanges){isDirtyRef.current=true;}fadeAnimationRef.current=requestAnimationFrame(animateFades);};fadeAnimationRef.current=requestAnimationFrame(animateFades);return()=>{isRunning=false;if(fadeAnimationRef.current){cancelAnimationFrame(fadeAnimationRef.current);}};},[]);// Animation loop for accent dots with exponential speed curve\nuseEffect(()=>{// Cancel any existing animation\nif(animationFrameRef.current){cancelAnimationFrame(animationFrameRef.current);animationFrameRef.current=undefined;}// If animate is false or speed is 0, completely pause animation\nif(!animate||speed===0){return;}// Exponential curve: speed 1 → 200ms, speed 100 → 10ms\n// Formula: interval = 200 * (10/200)^((speed-1)/99)\nconst interval=Math.round(200*Math.pow(10/200,(speed-1)/99));let animationSeed=Date.now();let lastUpdateTime=performance.now();let isRunning=true;const animateLoop=timestamp=>{if(!isRunning)return;if(timestamp-lastUpdateTime>=interval){lastUpdateTime=timestamp;animationSeed+=1;const newPositions=generateAccentPositions(animationSeed,accentDensity);startTransition(()=>{setAccentPositions(newPositions);});isDirtyRef.current=true;}// Continue animation loop\nanimationFrameRef.current=requestAnimationFrame(animateLoop);};// Start the animation loop\nanimationFrameRef.current=requestAnimationFrame(animateLoop);return()=>{isRunning=false;if(animationFrameRef.current){cancelAnimationFrame(animationFrameRef.current);animationFrameRef.current=undefined;}};},[animate,speed,generateAccentPositions,accentDensity]);// Measure container dimensions with debouncing for performance\nuseEffect(()=>{const container=containerRef.current;if(!container)return;let timeoutId;const resizeObserver=new ResizeObserver(entries=>{// Clear previous timeout\nif(timeoutId){clearTimeout(timeoutId);}// Debounce resize updates to avoid excessive recalculations\ntimeoutId=window.setTimeout(()=>{for(const entry of entries){const{width,height}=entry.contentRect;// Only update if dimensions actually changed\nif(width!==dimensions.width||height!==dimensions.height){startTransition(()=>{setDimensions({width,height});});}}},16)// ~60fps\n;});resizeObserver.observe(container);return()=>{if(timeoutId){clearTimeout(timeoutId);}resizeObserver.disconnect();};},[dimensions.width,dimensions.height]);// Render dots to canvas (only inside text mask) with pixel-perfect positioning\nuseEffect(()=>{const canvas=canvasRef.current;if(!canvas||!gridInfo||!textData)return;// Only redraw if something changed\nif(!isDirtyRef.current)return;const ctx=canvas.getContext(\"2d\",{alpha:false});if(!ctx)return;const{offsetX,offsetY,cellSize}=gridInfo;// Only resize canvas if dimensions changed\nif(canvas.width!==dimensions.width||canvas.height!==dimensions.height){canvas.width=dimensions.width;canvas.height=dimensions.height;}// Disable anti-aliasing for crisp dots\nctx.imageSmoothingEnabled=false;// Fill entire background\nctx.fillStyle=backgroundColor;ctx.fillRect(0,0,canvas.width,canvas.height);// Pre-calculate size once\nconst size=Math.floor(dotSize);const canvasWidth=canvas.width;const canvasHeight=canvas.height;const states=dotStatesRef.current;// First pass: draw all dots in secondary color at full opacity\nctx.fillStyle=secondaryColor;for(const posKey of textData.validPositions){const[colStr,rowStr]=posKey.split(\",\");const col=parseInt(colStr,10);const row=parseInt(rowStr,10);const x=Math.floor(offsetX+col*cellSize);const y=Math.floor(offsetY+row*cellSize);if(x<0||y<0||x+size>canvasWidth||y+size>canvasHeight){continue;}ctx.fillRect(x,y,size,size);}// Second pass: draw accent color on top with per-dot opacity\nctx.fillStyle=accentColor;for(const posKey of textData.validPositions){const state=states.get(posKey);if(!state||state.progress<=0)continue;const[colStr,rowStr]=posKey.split(\",\");const col=parseInt(colStr,10);const row=parseInt(rowStr,10);const x=Math.floor(col*cellSize);const y=Math.floor(row*cellSize);// Set opacity based on fade progress\nctx.globalAlpha=state.progress;ctx.fillRect(x,y,size,size);ctx.globalAlpha=1// Reset for next dot\n;}isDirtyRef.current=false;},[dimensions,gridInfo,textData,accentPositions,dotSize,accentColor,secondaryColor,backgroundColor]);return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{...style,width:\"100%\",height:\"100%\",position:\"relative\",overflow:\"hidden\",backgroundColor},children:/*#__PURE__*/_jsx(\"canvas\",{ref:canvasRef,style:{position:\"absolute\",top:0,left:0,width:\"100%\",height:\"100%\"}})});}addPropertyControls(TextMatrix,{text:{type:ControlType.String,title:\"Text\",defaultValue:\"AgentLab\"},fontPreset:{type:ControlType.Enum,title:\"Font Family\",defaultValue:\"Inter\",options:[\"Inter\",\"Plus Jakarta Sans\",\"Geist\",\"Space Grotesk\",\"DM Sans\",\"Outfit\",\"Syne\",\"Nunito\",\"Poppins\",\"Raleway\",\"Montserrat\",\"Oswald\",\"Bebas Neue\",\"Anton\",\"Space Mono\",\"JetBrains Mono\",\"Roboto Mono\",\"Custom\"]},customFont:{type:ControlType.String,title:\"Custom Font Name\",defaultValue:\"\",placeholder:\"e.g. Arial, Helvetica, Georgia\",hidden(props){return props.fontPreset!==\"Custom\";}},sizeMode:{type:ControlType.Enum,title:\"Size Mode\",defaultValue:\"fill\",options:[\"fill\",\"fixed\"],optionTitles:[\"Fill\",\"Fixed\"],displaySegmentedControl:true},fontSize:{type:ControlType.Number,title:\"Font Size\",defaultValue:120,min:10,max:800,step:1,unit:\"px\",hidden(props){return props.sizeMode!==\"fixed\";}},dotSize:{type:ControlType.Number,title:\"Dot Size\",defaultValue:6,min:1,max:16,step:1,unit:\"px\"},gap:{type:ControlType.Number,title:\"Gap\",defaultValue:2,min:1,max:8,step:1,unit:\"px\"},accentColor:{type:ControlType.Color,title:\"Accent Color\",defaultValue:\"#3B5BFF\"},secondaryColor:{type:ControlType.Color,title:\"Secondary Color\",defaultValue:\"#2e2e2e\"},backgroundColor:{type:ControlType.Color,title:\"Background\",defaultValue:\"#000000\"},accentDensity:{type:ControlType.Number,title:\"Accent Density\",defaultValue:15,min:0,max:100,step:1,unit:\"%\"},animate:{type:ControlType.Boolean,title:\"Animate\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},speed:{type:ControlType.Number,title:\"Speed\",defaultValue:50,min:0,max:100,step:1,hidden(props){return!props.animate;}}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"TextMatrix\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerContractVersion\":\"1\",\"framerIntrinsicHeight\":\"200\",\"framerIntrinsicWidth\":\"600\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LEDMatrixText.map"],"mappings":"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"}