{"version":3,"file":"PixelatedAnimation.DOCfR9OQ.mjs","names":["useRef","useState","useMemo"],"sources":["https:/framerusercontent.com/modules/tZ0NPvPjQQNp6mMxzMZ9/0cuB0L2YupQ13wJbNIrM/PixelatedAnimation.js"],"sourcesContent":["// Pixelated grid animation with configurable colors and animation controls based on user specified image\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{useState,useRef,useMemo,useEffect,startTransition}from\"react\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";/**\n * Pixelated Grid Animation\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */export default function PixelatedAnimation(props){const{pixelSize,color,specialColor,background,specialPercentage,animationDuration,animate,borderRadius,pixelDensity,avoidCenter,style}=props;const isStatic=useIsStaticRenderer();const containerRef=useRef(null);const[dimensions,setDimensions]=useState({width:300,height:300});const rows=Math.floor(dimensions.height/pixelSize);const cols=Math.floor(dimensions.width/pixelSize);const total=rows*cols;const numSpecial=Math.max(1,Math.floor(specialPercentage/100*total));const numCircles=Math.max(1,Math.floor(.01*total))// 1% will be circles\n;// Seed for reproducible randomness\nconst[seed]=useState(()=>Math.floor(Math.random()*1e5));// Track visible clusters for animation\nconst[visibleClusters,setVisibleClusters]=useState(0);const[flickerState,setFlickerState]=useState(0);// Observe container size changes\nuseEffect(()=>{if(!containerRef.current)return;const updateDimensions=()=>{if(containerRef.current){const rect=containerRef.current.getBoundingClientRect();startTransition(()=>{setDimensions({width:rect.width||300,height:rect.height||300});});}};updateDimensions();const resizeObserver=new ResizeObserver(updateDimensions);resizeObserver.observe(containerRef.current);return()=>resizeObserver.disconnect();},[]);// Assign special pixels by seeded shuffle\nfunction seededRandom(i){// Simple oscillator\nreturn Math.abs(Math.sin(seed+i*7919))%1;}const specialPixelIdxs=useMemo(()=>{// Assign based on deterministic random\nreturn Array(total).fill(0).map((_,i)=>({i,v:seededRandom(i)})).sort((a,b)=>a.v-b.v).slice(0,numSpecial).map(obj=>obj.i);},[total,numSpecial,seed]);const circlePixelIdxs=useMemo(()=>{// Assign circles based on deterministic random (different offset)\nreturn Array(total).fill(0).map((_,i)=>({i,v:seededRandom(i+12345)})).sort((a,b)=>a.v-b.v).slice(0,numCircles).map(obj=>obj.i);},[total,numCircles,seed]);// Animate pixel appearance\nuseEffect(()=>{if(isStatic){startTransition(()=>{setVisibleClusters(1e3);setFlickerState(0);});return;}if(!animate){startTransition(()=>{setVisibleClusters(1e3);setFlickerState(0);});return;}let timeout;let shown=0;const totalClusters=Math.ceil(total*.05/3)// Estimate cluster count\n;function step(){shown+=1;startTransition(()=>setVisibleClusters(shown));if(shown<totalClusters){timeout=window.setTimeout(step,animationDuration);}else{// After fully constructed, start constant flicker animation\nfunction randomFlicker(){if(!animate)return;startTransition(()=>setFlickerState(prev=>prev+1));timeout=window.setTimeout(randomFlicker,Math.max(320,animationDuration*6));}randomFlicker();}}shown=0;startTransition(()=>{setVisibleClusters(0);setFlickerState(0);});timeout=window.setTimeout(step,animationDuration);return()=>clearTimeout(timeout);},[rows,cols,animationDuration,animate,isStatic,total,seed]);// Construct pixels\nconst pixels=useMemo(()=>{const result=[];let k=0;// Use clusters instead of full grid\n// Group contiguous pixels together in random clusters\n// Cluster size: 2 to 9 pixels, randomly chosen for each cluster\nconst totalPixels=rows*cols;const taken=Array(totalPixels).fill(false);let clusters=[];let remaining=totalPixels;// Use 5-10% of the grid for more visible pixels\nconst targetPixelCount=Math.floor(totalPixels*(pixelDensity/100));let pixelsToPlace=targetPixelCount;while(pixelsToPlace>0){// Find a random free pixel (not sequential)\nlet attempts=0;let startIdx=-1;while(attempts<100){const randomIdx=Math.floor(Math.abs(Math.sin(seed+attempts*997+clusters.length*313))*totalPixels);if(!taken[randomIdx]){// Check if we should avoid center\nif(avoidCenter){const row=Math.floor(randomIdx/cols);const col=randomIdx%cols;const centerRow=rows/2;const centerCol=cols/2;const radiusRow=rows*.25// 25% of height from center\n;const radiusCol=cols*.25// 25% of width from center\n;// Skip if in central area\nconst inCenterZone=Math.abs(row-centerRow)<radiusRow&&Math.abs(col-centerCol)<radiusCol;if(inCenterZone){attempts++;continue;}}startIdx=randomIdx;break;}attempts++;}if(startIdx===-1)break;// More varied cluster sizes: 30% single, 30% pairs/triples, 25% medium (4-6), 15% large (7-12)\nconst clusterRoll=Math.abs(Math.sin(seed+startIdx*101));let cSize;if(clusterRoll<.3){cSize=1// Single pixel\n;}else if(clusterRoll<.6){cSize=Math.min(2+Math.floor(Math.abs(Math.sin(seed+startIdx*211))*2),pixelsToPlace)// 2-3 pixels\n;}else if(clusterRoll<.85){cSize=Math.min(4+Math.floor(Math.abs(Math.sin(seed+startIdx*311))*3),pixelsToPlace)// 4-6 pixels\n;}else{cSize=Math.min(7+Math.floor(Math.abs(Math.sin(seed+startIdx*411))*6),pixelsToPlace)// 7-12 pixels\n;}let curr=[startIdx];taken[startIdx]=true;for(let cc=1;cc<cSize;cc++){// Pick a random neighbor\nconst ni=curr[curr.length-1];const row=Math.floor(ni/cols);const col=ni%cols;const nbs=[];if(row>0&&!taken[ni-cols])nbs.push(ni-cols);if(row<rows-1&&!taken[ni+cols])nbs.push(ni+cols);if(col>0&&!taken[ni-1])nbs.push(ni-1);if(col<cols-1&&!taken[ni+1])nbs.push(ni+1);if(nbs.length===0)break;// Pick one neighbor pseudo-randomly\nconst nbIdx=nbs[Math.floor(Math.abs(Math.sin(seed+ni*211+cc*3))*nbs.length)];curr.push(nbIdx);taken[nbIdx]=true;}clusters.push(curr);pixelsToPlace-=curr.length;}// Render clusters up to visibleClusters count\nconst clustersToShow=Math.min(visibleClusters,clusters.length);for(let ci=0;ci<clustersToShow;ci++){const cluster=clusters[ci];for(const idx of cluster){// Add flicker effect - randomly hide some pixels\nconst flickerChance=Math.abs(Math.sin(seed+idx*719+flickerState*113));if(animate&&flickerChance<.08)continue;// 8% chance to be hidden during flicker\nconst row=Math.floor(idx/cols);const col=idx%cols;const isSpecial=specialPixelIdxs.includes(idx);const isCircle=circlePixelIdxs.includes(idx);result.push(/*#__PURE__*/_jsx(\"div\",{style:{width:pixelSize,height:pixelSize,background:isSpecial?specialColor:color,boxShadow:pixelSize>=14?\"0 0 0 1px #fff2\":undefined,borderRadius:isCircle?\"50%\":borderRadius,transition:\"background 0.2s, opacity 0.15s\",margin:0,position:\"absolute\",left:col*pixelSize,top:row*pixelSize}},idx));}}return result;},[rows,cols,pixelSize,color,specialColor,specialPixelIdxs,visibleClusters,flickerState,seed,animate]);// Calculate container size for grid\nconst width=cols*pixelSize;const height=rows*pixelSize;return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{position:\"relative\",width:\"100%\",height:\"100%\",background,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",...style,overflow:\"hidden\"},children:/*#__PURE__*/_jsx(\"div\",{style:{position:\"relative\",width:width,height:height,maxWidth:\"100%\",maxHeight:\"100%\"},children:pixels})});}addPropertyControls(PixelatedAnimation,{pixelSize:{type:ControlType.Number,title:\"Pixel Size\",min:4,max:48,step:1,defaultValue:12},pixelDensity:{type:ControlType.Number,title:\"Pixel Density\",min:1,max:50,step:.5,defaultValue:7,unit:\"%\"},color:{type:ControlType.Color,title:\"Pixel Color\",defaultValue:\"#18D4FD\"},specialColor:{type:ControlType.Color,title:\"Special Pixel\",defaultValue:\"#FF007F\"},background:{type:ControlType.Color,title:\"Background\",defaultValue:\"#fff\"},specialPercentage:{type:ControlType.Number,title:\"% Special\",min:.1,max:20,step:.1,defaultValue:1,unit:\"%\"},animationDuration:{type:ControlType.Number,title:\"Anim Delay\",min:8,max:1e3,step:1,unit:\"ms\",defaultValue:32},animate:{type:ControlType.Boolean,title:\"Animate\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},borderRadius:{type:ControlType.Number,title:\"Border Radius\",min:0,max:20,step:1,defaultValue:2,unit:\"px\"},avoidCenter:{type:ControlType.Boolean,title:\"Avoid Center\",defaultValue:false,enabledTitle:\"Yes\",disabledTitle:\"No\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"PixelatedAnimation\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./PixelatedAnimation.map"],"mappings":"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"}