{"version":3,"file":"Shimmercustom.DyAz6Gnd.mjs","names":["useRef","useCallback"],"sources":["https:/framerusercontent.com/modules/RB6EIyOMfUpaJDbVyJ0F/8utw7NIiEEpXfNAcor6i/Shimmercustom.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";import{useRef,useEffect,useCallback}from\"react\";/**\n * ShimmerGrid — Framer Custom Code Component v5\n *\n * Invisible at rest. On hover reveals a soft radial grid.\n * The outer radius is a large, wide, gentle falloff (the base grid).\n * The inner radius near the cursor shifts tiles toward an accent colour.\n * Uses window mousemove so it works beneath other layers at z-index 0.\n */// ─── Parse colour via canvas pixel read (respects alpha) ─────────────────────\nconst _colorCache={};function parseColor(color){if(_colorCache[color])return _colorCache[color];const cv=document.createElement(\"canvas\");cv.width=1;cv.height=1;const ctx=cv.getContext(\"2d\");ctx.fillStyle=color;ctx.fillRect(0,0,1,1);const[r,g,b,a]=ctx.getImageData(0,0,1,1).data;const result={r,g,b,a:a/255};_colorCache[color]=result;return result;}// ─── Smoothstep ───────────────────────────────────────────────────────────────\nfunction smoothstep(edge0,edge1,x){if(edge1<=edge0)return x<=edge0?1:0;const t=Math.max(0,Math.min(1,(x-edge0)/(edge1-edge0)));return t*t*(3-2*t);}// ─── Component ────────────────────────────────────────────────────────────────\nexport default function ShimmerGrid({tileSize,baseColor,baseRadius,baseFalloff,accentColor,accentRadius,accentFalloff,animationSpeed,backgroundColor,style}){const containerRef=useRef(null);const canvasRef=useRef(null);const stateRef=useRef({x:-99999,y:-99999,inside:false});// opacityMap: 0→1 overall tile visibility (outer radius)\n// accentMap:  0→1 colour shift base→accent (inner radius)\nconst opacityMapRef=useRef(null);const accentMapRef=useRef(null);const dimsRef=useRef({cols:0,rows:0,w:0,h:0});const rafRef=useRef(0);const propsRef=useRef({tileSize,baseColor,baseRadius,baseFalloff,accentColor,accentRadius,accentFalloff,animationSpeed,backgroundColor});useEffect(()=>{propsRef.current={tileSize,baseColor,baseRadius,baseFalloff,accentColor,accentRadius,accentFalloff,animationSpeed,backgroundColor};});// ── Canvas setup ──────────────────────────────────────────────────────────\nconst setupCanvas=useCallback(()=>{const container=containerRef.current;const canvas=canvasRef.current;if(!container||!canvas)return;const w=container.offsetWidth;const h=container.offsetHeight;if(w===0||h===0)return;canvas.width=w;canvas.height=h;const ts=propsRef.current.tileSize;const cols=Math.ceil(w/ts);const rows=Math.ceil(h/ts);dimsRef.current={cols,rows,w,h};opacityMapRef.current=new Float32Array(cols*rows);accentMapRef.current=new Float32Array(cols*rows);},[]);// ── Draw loop ─────────────────────────────────────────────────────────────\nuseEffect(()=>{let running=true;function draw(){if(!running)return;const canvas=canvasRef.current;const container=containerRef.current;if(!canvas||!container){rafRef.current=requestAnimationFrame(draw);return;}const ctx=canvas.getContext(\"2d\");if(!ctx){rafRef.current=requestAnimationFrame(draw);return;}const{cols,rows,w,h}=dimsRef.current;const oMap=opacityMapRef.current;const aMap=accentMapRef.current;if(!oMap||!aMap||w===0||h===0){rafRef.current=requestAnimationFrame(draw);return;}const{tileSize:ts,baseColor:bc,baseRadius:br,baseFalloff:bf,accentColor:ac,accentRadius:ar,accentFalloff:af,animationSpeed:spd,backgroundColor:bg}=propsRef.current;const{x:gx,y:gy,inside}=stateRef.current;const rect=container.getBoundingClientRect();const lx=gx-rect.left;const ly=gy-rect.top;// Lerp speed: gentle range so slow feels drifty and fast feels snappy\nconst speed=.015+spd/100*.135;const base=parseColor(bc);const accent=parseColor(ac);ctx.fillStyle=bg;ctx.fillRect(0,0,w,h);for(let row=0;row<rows;row++){for(let col=0;col<cols;col++){const idx=row*cols+col;const cx=col*ts+ts/2;const cy=row*ts+ts/2;const dist=Math.sqrt((cx-lx)**2+(cy-ly)**2);let opacityTarget=0;let accentTarget=0;if(inside){// Outer: 1 inside br, smooth fade to 0 at br+bf\nopacityTarget=1-smoothstep(br,br+bf,dist);// Inner: 1 inside ar, smooth fade to 0 at ar+af\naccentTarget=1-smoothstep(ar,ar+af,dist);}oMap[idx]+=(opacityTarget-oMap[idx])*speed;aMap[idx]+=(accentTarget-aMap[idx])*speed;const opacity=oMap[idx];const accentW=aMap[idx];if(opacity<.003)continue;// Blend colour channels base→accent\nconst r=Math.round(base.r+(accent.r-base.r)*accentW);const g=Math.round(base.g+(accent.g-base.g)*accentW);const b=Math.round(base.b+(accent.b-base.b)*accentW);// Blend picker alpha base→accent, then multiply by radial opacity\nconst pickerAlpha=base.a+(accent.a-base.a)*accentW;const finalAlpha=opacity*pickerAlpha;if(finalAlpha<.003)continue;const x=col*ts;const y=row*ts;ctx.strokeStyle=`rgba(${r},${g},${b},${finalAlpha})`;ctx.lineWidth=1;ctx.strokeRect(x+.5,y+.5,ts-1,ts-1);}}rafRef.current=requestAnimationFrame(draw);}rafRef.current=requestAnimationFrame(draw);return()=>{running=false;cancelAnimationFrame(rafRef.current);};},[]);// ── Resize when tileSize changes ──────────────────────────────────────────\nuseEffect(()=>{setupCanvas();},[tileSize,setupCanvas]);// ── Global mouse tracker ──────────────────────────────────────────────────\nuseEffect(()=>{const onMove=e=>{const container=containerRef.current;if(!container)return;const rect=container.getBoundingClientRect();const inside=e.clientX>=rect.left&&e.clientX<=rect.right&&e.clientY>=rect.top&&e.clientY<=rect.bottom;stateRef.current={x:e.clientX,y:e.clientY,inside};};const onLeave=()=>{stateRef.current={...stateRef.current,inside:false};};window.addEventListener(\"mousemove\",onMove,{passive:true});document.documentElement.addEventListener(\"mouseleave\",onLeave);return()=>{window.removeEventListener(\"mousemove\",onMove);document.documentElement.removeEventListener(\"mouseleave\",onLeave);};},[]);// ── Mount + resize observer ───────────────────────────────────────────────\nuseEffect(()=>{setupCanvas();const ro=new ResizeObserver(()=>setupCanvas());if(containerRef.current)ro.observe(containerRef.current);return()=>ro.disconnect();},[setupCanvas]);return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{position:\"relative\",width:\"100%\",height:\"100%\",overflow:\"hidden\",...style},children:/*#__PURE__*/_jsx(\"canvas\",{ref:canvasRef,style:{display:\"block\",width:\"100%\",height:\"100%\"}})});}// ─── Defaults — tuned to match reference (light bg, large tiles, faint lines) ─\nShimmerGrid.defaultProps={tileSize:130,baseColor:\"rgba(100, 120, 200, 0.18)\",baseRadius:300,baseFalloff:250,accentColor:\"rgba(80, 100, 180, 0.35)\",accentRadius:80,accentFalloff:180,animationSpeed:8,backgroundColor:\"#ffffff\"};// ─── Framer Property Controls ─────────────────────────────────────────────────\naddPropertyControls(ShimmerGrid,{backgroundColor:{type:ControlType.Color,title:\"Background\",defaultValue:\"#ffffff\"},tileSize:{type:ControlType.Number,title:\"Tile Size\",defaultValue:130,min:8,max:400,step:2,unit:\"px\",displayStepper:true},baseColor:{type:ControlType.Color,title:\"Grid Base\",defaultValue:\"rgba(100, 120, 200, 0.18)\"},baseRadius:{type:ControlType.Number,title:\"Base Radius\",defaultValue:300,min:0,max:1200,step:10,unit:\"px\",displayStepper:true},baseFalloff:{type:ControlType.Number,title:\"Base Falloff\",defaultValue:250,min:0,max:800,step:10,unit:\"px\",displayStepper:true},accentColor:{type:ControlType.Color,title:\"Hover Accent\",defaultValue:\"rgba(80, 100, 180, 0.35)\"},accentRadius:{type:ControlType.Number,title:\"Accent Radius\",defaultValue:80,min:0,max:600,step:10,unit:\"px\",displayStepper:true},accentFalloff:{type:ControlType.Number,title:\"Accent Falloff\",defaultValue:180,min:0,max:800,step:10,unit:\"px\",displayStepper:true},animationSpeed:{type:ControlType.Number,title:\"Anim. Speed\",defaultValue:8,min:1,max:100,step:1,displayStepper:true}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ShimmerGrid\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Shimmercustom.map"],"mappings":"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"}