{"version":3,"file":"LEDMatrixText.DeOr893-.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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"}