{"version":3,"file":"DottedVideo_Prod.CMkdKx-R.mjs","names":["useState","useMemo","hash","useRef","useState","sizing","dotSize","dotGap","dotColor","colorValue","color2Value","color1Value","dotShape","useId"],"sources":["https:/framerusercontent.com/modules/k76epLFsVsF4jlsF5pgg/vhK3G0ntf62fqS2tFDno/useColors.js","https:/framerusercontent.com/modules/ecXhgQXKT3kSdHJqMqeO/nZZQFiuTp5lA7f2LIPAu/DottedVideo_Prod.js"],"sourcesContent":["import{RenderTarget}from\"framer\";import{useEffect,useState,useMemo}from\"react\";const cssVariableRegex=/var\\s*\\(\\s*(--[\\w-]+)(?:\\s*,\\s*((?:[^)(]+|\\((?:[^)(]+|\\([^)(]*\\))*\\))*))?\\s*\\)/;export function useColors(...colors){const isCanvas=RenderTarget.current()===RenderTarget.canvas;const isOptimizing=typeof window===\"undefined\";const darkMode=useDarkMode();const[styleValues,setStyleValues]=useState(()=>extractStyleValues(colors.map(extractCSSVariableName)));useEffect(()=>{if(!isCanvas)return;const div=document.body.querySelector(\"main > div\");if(!div)return;const observer=new MutationObserver(()=>{setStyleValues(extractStyleValues(colors.map(extractCSSVariableName)));});observer.observe(div,{attributes:true,attributeFilter:[\"style\"]});return()=>observer.disconnect();},colors);const variableNames=useMemo(()=>colors.map(extractCSSVariableName),[colors]);if(isOptimizing){return colors.map(color=>extractDefaultValue(color));}let values=[];for(let i=0;i<colors.length;i++){const color=colors[i];// Return original value if not a string\nif(typeof color!==\"string\"){values.push(color);continue;}const variableName=variableNames[i];const colorValues=styleValues[variableName];if(variableName&&colorValues){values.push(darkMode?colorValues.dark||colorValues.light||color:colorValues.light||color);}else{values.push(color);}}return values;}////////////////////\nfunction extractStyleValues(variableNames){const isCanvas=RenderTarget.current()===RenderTarget.canvas;const result={};let lightVars={};let darkVars={};if(isCanvas&&typeof document!==\"undefined\"){const div=document.body.querySelector(\"main > div\");if(div){const style=div.getAttribute(\"style\");if(style){const vars=parseVariables(style);lightVars=vars;darkVars=vars;}}}else{const{light,dark}=extractColorStyles();lightVars=parseVariables(light);darkVars=parseVariables(dark);}// Include all variables\nconst allVarNames=new Set([...Object.keys(lightVars),...Object.keys(darkVars)]);allVarNames.forEach(varName=>{result[varName]={light:lightVars[varName]||\"\",dark:darkVars[varName]||\"\"};});return result;}function extractColorStyles(){let lightSection=\"\";let darkSection=\"\";if(typeof document!==\"undefined\"){const styles=document.head.querySelectorAll(\"style[data-framer-css], style[data-framer-css-ssr], style[data-framer-css-ssr-minified]\");for(const style of styles){const rules=style.sheet?.cssRules;if(!rules)continue;const styleRules=[];for(const rule of rules){if(rule instanceof CSSStyleRule){styleRules.push([rule,false]);}else if(rule instanceof CSSMediaRule){if(rule.conditionText===\"(prefers-color-scheme: dark)\"){for(const subrule of rule.cssRules){if(subrule instanceof CSSStyleRule){styleRules.push([subrule,true]);}}}}}for(const[rule,isDarkMedia]of styleRules){const css=rule.cssText;const hasVars=css.includes(\"--token-\");if(!hasVars)continue;const isDark=isDarkMedia?rule.selectorText===\"body\":rule.selectorText==='body[data-framer-theme=\"dark\"]';const isLight=!isDarkMedia&&rule.selectorText===\"body\";if(!isDark&&!isLight)continue;if(isDark){if(!darkSection){darkSection=css.substring(css.indexOf(\"{\")+1,css.lastIndexOf(\"}\")).trim();}}else{if(!lightSection){lightSection=css.substring(css.indexOf(\"{\")+1,css.lastIndexOf(\"}\")).trim();}}if(darkSection&&lightSection)break;}if(darkSection&&lightSection)break;}}return{light:lightSection,dark:darkSection};}export function useDarkMode(){const isPreview=typeof window!==\"undefined\"&&window.location.origin.endsWith(\"framercanvas.com\");const[isDarkMode,setIsDarkMode]=useState(()=>{if(typeof window===\"undefined\"){return false;}else if(isPreview&&typeof document!==\"undefined\"){return document.body.getAttribute(\"data-framer-theme\")===\"dark\";}else{return window.matchMedia(\"(prefers-color-scheme: dark)\").matches;}});useEffect(()=>{if(isPreview){const observer=new MutationObserver(mutations=>{mutations.forEach(mutation=>{if(mutation.attributeName===\"data-framer-theme\"){const theme=document.body.getAttribute(\"data-framer-theme\");setIsDarkMode(theme===\"dark\");}});});observer.observe(document.body,{attributes:true,attributeFilter:[\"data-framer-theme\"]});return()=>observer.disconnect();}else{const mediaQuery=window.matchMedia(\"(prefers-color-scheme: dark)\");const handleChange=e=>{setIsDarkMode(e.matches);};// Update initial value\nif(mediaQuery.matches!==isDarkMode){setIsDarkMode(mediaQuery.matches);}mediaQuery.addListener(handleChange);return()=>mediaQuery.removeListener(handleChange);}},[isPreview]);return isDarkMode;}function extractCSSVariableName(cssString){if(!cssString||!cssString.startsWith(\"var(\")){return\"\";}const match=cssVariableRegex.exec(cssString);if(match){const variableName=match[1];return variableName||\"\";}return\"\";}function parseVariables(section){const vars={};if(!section)return vars;const declarations=section.split(\";\").filter(Boolean);declarations.forEach(declaration=>{const[name,value]=declaration.split(\":\").map(s=>s.trim());if(name&&value){vars[name]=value;}});return vars;}function extractDefaultValue(cssVar){// Check if the string starts with \"var(\"\nif(!cssVar||!cssVar.startsWith(\"var(\")){return cssVar// Return the original value if it doesn't start with \"var(\"\n;}// Remove \"var(\" from the beginning and \")\" from the end\nconst content=cssVar.slice(4,-1);// Split the content by comma\nconst parts=content.split(\",\");// If there's more than one part, the second part is the default value\nif(parts.length>1){// Trim any whitespace from the default value\nreturn parts.slice(1).join(\",\").trim();}// If there's no comma, return an empty string or null\nreturn\"\";}\nexport const __FramerMetadata__ = {\"exports\":{\"useDarkMode\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useColors\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./useColors.map","import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,RenderTarget,Color}from\"framer\";import{useEffect,useState,useRef,useId}from\"react\";import{useColors}from\"https://framerusercontent.com/modules/k76epLFsVsF4jlsF5pgg/vhK3G0ntf62fqS2tFDno/useColors.js\";import hash from\"@emotion/hash\";/**\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n *\n * @framerDisableUnlink\n *\n * @framerIntrinsicWidth 480\n * @framerIntrinsicHeight 270\n */export default function DottedVideo({id,type,image,videoSource,videoFile,videoUrl,sizing,playing,loop,muted,volume,preview,dotShape,dotSize,dotGap,dotColor,backgroundColor,radius,style,endEvent,clickEvent,hoverEvent}){const componentId=id?hash(id):\"\";const instanceId=useInstanceId();const isCanvas=RenderTarget.current()===RenderTarget.canvas;const videoUrlValue=videoSource===\"upload\"?videoFile:videoUrl;const videoIsPlaying=isCanvas?playing&&preview:playing;const sizeMode=style?.width&&style?.height?\"none\":!style?.width&&!style?.height?\"both\":!style?.width?\"width\":!style?.height?\"height\":\"none\";const canvasRef=useRef(null);const offscreenCanvasRef=useRef(null);const videoRef=useRef(null);const imageRef=useRef(null);const[isVideoLoaded,setIsVideoLoaded]=useState(false);const[isImageLoaded,setIsImageLoaded]=useState(false);const[dimensions,setDimensions]=useState({width:0,height:0,pixelRatio:1});const dimensionsRef=useRef(dimensions);const imageSizeRef=useRef({width:0,height:0});const videoSizeRef=useRef({width:0,height:0});const animationFrameRef=useRef(null);const typeRef=useRef(type);const videoIsPlayingRef=useRef(videoIsPlaying);const[colorValue,color1Value,color2Value]=useColors(dotColor.color,dotColor.color1,dotColor.color2);const colorInterpolatorRef=useRef(()=>Color.interpolate(new Color(color1Value),new Color(color2Value)));// Create a ref to store all rendering values\nconst renderValuesRef=useRef({dotShape,dotSize,dotGap,dotColor,colorValue,color1Value,color2Value,sizing});// Update the ref whenever any of the rendering values change\nuseEffect(()=>{renderValuesRef.current={dotShape,dotSize,dotGap,dotColor,colorValue,color1Value,color2Value,sizing};},[dotShape,dotSize,dotGap,dotColor,colorValue,color1Value,color2Value,sizing]);useEffect(()=>{colorInterpolatorRef.current=Color.interpolate(new Color(color1Value),new Color(color2Value));},[color1Value,color2Value]);// Update typeRef when type changes\nuseEffect(()=>{typeRef.current=type;},[type]);// Update videoIsPlayingRef when videoIsPlaying changes\nuseEffect(()=>{videoIsPlayingRef.current=videoIsPlaying;},[videoIsPlaying]);// Handle type changes\nuseEffect(()=>{// Clear any existing animation frame\nif(animationFrameRef.current){cancelAnimationFrame(animationFrameRef.current);animationFrameRef.current=null;}// Reset canvas\nif(canvasRef.current){const ctx=canvasRef.current.getContext(\"2d\");ctx.clearRect(0,0,canvasRef.current.width,canvasRef.current.height);}// Handle video pause when switching to image\nif(type===\"image\"&&videoRef.current){videoRef.current.pause();setIsVideoLoaded(false);}// Reset image loaded state when switching to video\nif(type===\"video\"){setIsImageLoaded(false);}// Trigger appropriate rendering based on type\nif(type===\"image\"&&isImageLoaded){drawPixelatedImage();}else if(type===\"video\"&&isVideoLoaded){drawPixelatedVideo();}},[type]);// Handle image loading\nuseEffect(()=>{if(type===\"image\"&&image?.src){// Create a new image element\nconst img=new Image;img.crossOrigin=\"anonymous\";img.src=image.src;// Set up load handler\nimg.onload=()=>{imageRef.current=img;// Update the image size ref with natural dimensions\nimageSizeRef.current={width:img.naturalWidth,height:img.naturalHeight};setIsImageLoaded(true);};img.onerror=err=>{console.error(\"Error loading image:\",err);};}},[type,image?.src]);// Handle video loading\nuseEffect(()=>{if(type===\"video\"){if(videoRef.current){if(videoUrlValue){videoRef.current.src=videoUrlValue;videoRef.current.crossOrigin=\"anonymous\";videoRef.current.load();// Add an event listener for loadeddata to ensure we draw the first frame\n// regardless of whether the video is playing or not\nconst handleLoadedData=()=>{// Ensure we draw the first frame even if not playing\nif(!videoIsPlayingRef.current){drawPixelatedVideo();}};videoRef.current.addEventListener(\"loadeddata\",handleLoadedData);if(videoIsPlaying){videoRef.current.play().catch(err=>{console.error(\"Error playing video:\",err);});}// Clean up event listener\nreturn()=>{if(videoRef.current){videoRef.current.removeEventListener(\"loadeddata\",handleLoadedData);}};}else{// Clear video source\nvideoRef.current.src=\"\";videoRef.current.load();setIsVideoLoaded(false);// Clear the canvas when there's no video URL\nif(canvasRef.current){const ctx=canvasRef.current.getContext(\"2d\");ctx.clearRect(0,0,canvasRef.current.width,canvasRef.current.height);}// Cancel any ongoing animation frame\nif(animationFrameRef.current){cancelAnimationFrame(animationFrameRef.current);animationFrameRef.current=null;}}}}},[type,videoUrlValue,videoIsPlaying]);// Handle video loaded data event\nconst handleVideoLoaded=()=>{if(typeRef.current===\"video\"){setIsVideoLoaded(true);// Update the video size ref with video dimensions\nif(videoRef.current){videoSizeRef.current={width:videoRef.current.videoWidth,height:videoRef.current.videoHeight};}// Draw the first frame regardless of play state\ndrawPixelatedVideo();// If video is not playing, we need to manually start the animation loop\n// when it starts playing again\nif(!videoIsPlayingRef.current&&animationFrameRef.current){// Don't cancel the animation frame if we just drew the first frame\n// This allows the first frame to be drawn even when not playing\nif(videoRef.current&&videoRef.current.currentTime>0){cancelAnimationFrame(animationFrameRef.current);animationFrameRef.current=null;}}}};useEffect(()=>{const handleResize=()=>{if(canvasRef.current){try{// Get the device pixel ratio\nconst pixelRatio=window.devicePixelRatio||1;const canvasWidth=canvasRef.current.offsetWidth||1// Ensure non-zero\n;const canvasHeight=canvasRef.current.offsetHeight||1// Ensure non-zero\n;// Store previous dimensions to check if we need to update\nconst prevWidth=dimensionsRef.current.width;const prevHeight=dimensionsRef.current.height;let finalWidth=canvasWidth;let finalHeight=canvasHeight;const size=type===\"image\"?imageSizeRef.current:videoSizeRef.current;if(size&&size.width>0&&size.height>0){if(sizeMode===\"both\"){finalWidth=100;finalHeight=100;}else if(sizeMode===\"width\"||sizeMode===\"height\"){const aspectRatio=size.width/size.height;if(sizeMode===\"height\"){finalHeight=finalWidth/aspectRatio;}else if(sizeMode===\"width\"){finalWidth=finalHeight*aspectRatio;}}}// Ensure we have valid positive values\nfinalWidth=Math.max(1,finalWidth);finalHeight=Math.max(1,finalHeight);const cellSize=dotSize+dotGap;// Ensure at least one cell in each dimension\nconst width=Math.max(cellSize,Math.floor(finalWidth/cellSize)*cellSize);const height=Math.max(cellSize,Math.floor(finalHeight/cellSize)*cellSize);// Validate dimensions before setting\nif(isNaN(width)||isNaN(height)||isNaN(pixelRatio)||width<=0||height<=0||pixelRatio<=0){console.error(\"Invalid dimensions in handleResize:\",{width,height,pixelRatio});return;}// Only update dimensions if the relevant dimension has changed based on sizeMode\nconst shouldUpdate=sizeMode===\"both\"?width!==prevWidth||height!==prevHeight:sizeMode===\"width\"?width!==prevWidth:sizeMode===\"height\"?height!==prevHeight:width!==prevWidth||height!==prevHeight// For \"none\" mode\n;if(shouldUpdate||dimensionsRef.current.pixelRatio!==pixelRatio){const newDimensions={width,height,pixelRatio};setDimensions(newDimensions);dimensionsRef.current=newDimensions;// Redraw content when dimensions change\nif(typeRef.current===\"image\"&&isImageLoaded){drawPixelatedImage();}else if(typeRef.current===\"video\"&&isVideoLoaded){drawPixelatedVideo();}}}catch(error){console.error(\"Error in handleResize:\",error);}}};// Create a ResizeObserver to watch the canvas element\nconst resizeObserver=new ResizeObserver(handleResize);// Start observing the canvas element if it exists\nif(canvasRef.current){resizeObserver.observe(canvasRef.current);}handleResize();return()=>{// Clean up\nif(canvasRef.current){resizeObserver.unobserve(canvasRef.current);}resizeObserver.disconnect();};},[dotSize,dotGap,type,isImageLoaded,isVideoLoaded,dimensions,sizeMode]);// Unified drawing function for both image and video\nconst drawPixelated=(source=null)=>{// Determine if we're drawing from video or image\nconst isVideo=typeRef.current===\"video\";// For video mode, check if we should continue the animation loop\nif(isVideo&&!source){// Only draw new frames if the video is playing\nconst shouldDrawNewFrame=videoIsPlayingRef.current;if(!videoRef.current||videoRef.current.readyState<videoRef.current.HAVE_CURRENT_DATA||videoRef.current.videoWidth===0||videoRef.current.videoHeight===0){if(isVideo){animationFrameRef.current=requestAnimationFrame(()=>drawPixelated());}return;}source=videoRef.current;}else if(!isVideo&&!source){source=imageRef.current;}// Common validation for both modes\nif(!source||!canvasRef.current||!offscreenCanvasRef.current){return;}const{width,height,pixelRatio}=dimensionsRef.current;if(width<=0||height<=0||!pixelRatio){return;}// Access rendering values from the ref\nconst{dotShape,dotSize,dotGap,dotColor,colorValue,color1Value,color2Value,sizing}=renderValuesRef.current;const canvas=canvasRef.current;const offscreenCanvas=offscreenCanvasRef.current;const ctx=canvas.getContext(\"2d\");const offscreenCtx=offscreenCanvas.getContext(\"2d\");// Ensure width, height and pixelRatio are valid numbers\nif(isNaN(width)||isNaN(height)||isNaN(pixelRatio)){console.error(\"Invalid dimensions:\",{width,height,pixelRatio});return;}const fullWidth=width*pixelRatio;const fullHeight=height*pixelRatio;// Validate calculated dimensions\nif(isNaN(fullWidth)||isNaN(fullHeight)||fullWidth<=0||fullHeight<=0){console.error(\"Invalid calculated dimensions:\",{fullWidth,fullHeight,width,height,pixelRatio});return;}// Apply device pixel ratio to canvas dimensions\ncanvas.width=fullWidth;canvas.height=fullHeight;offscreenCanvas.width=fullWidth;offscreenCanvas.height=fullHeight;// Scale the context to account for the pixel ratio\nctx.scale(pixelRatio,pixelRatio);offscreenCtx.scale(pixelRatio,pixelRatio);offscreenCtx.clearRect(0,0,width,height);// Get source dimensions\nconst sourceWidth=isVideo?source.videoWidth:source.width;const sourceHeight=isVideo?source.videoHeight:source.height;// Calculate dimensions based on sizing option\nlet drawWidth,drawHeight,offsetX=0,offsetY=0;if(sizing===\"fill\"){// Cover: maintain aspect ratio and fill the entire canvas\nconst sourceRatio=sourceWidth/sourceHeight;const canvasRatio=width/height;if(sourceRatio>canvasRatio){// Source is wider than canvas\ndrawHeight=height;drawWidth=height*sourceRatio;offsetX=(width-drawWidth)/2;}else{// Source is taller than canvas\ndrawWidth=width;drawHeight=width/sourceRatio;offsetY=(height-drawHeight)/2;}}else if(sizing===\"fit\"){// Contain: maintain aspect ratio and fit within canvas\nconst sourceRatio=sourceWidth/sourceHeight;const canvasRatio=width/height;if(sourceRatio>canvasRatio){// Source is wider than canvas\ndrawWidth=width;drawHeight=width/sourceRatio;offsetY=(height-drawHeight)/2;}else{// Source is taller than canvas\ndrawHeight=height;drawWidth=height*sourceRatio;offsetX=(width-drawWidth)/2;}}else if(sizing===\"stretch\"){// Stretch: fill the entire canvas without maintaining aspect ratio\ndrawWidth=width;drawHeight=height;}// Draw the source to the offscreen canvas with the calculated dimensions\noffscreenCtx.drawImage(source,offsetX,offsetY,drawWidth,drawHeight);// Use Math.round for reliable integer conversion\nconst intFullWidth=Math.round(fullWidth);const intFullHeight=Math.round(fullHeight);try{const pixelData=offscreenCtx.getImageData(0,0,intFullWidth,intFullHeight);const data=pixelData.data;ctx.clearRect(0,0,width,height);// Calculate the total size of each dot cell (dot + gap)\nlet adjustedDotSize=dotSize;let cellSize=adjustedDotSize+dotGap;// Calculate the number of dots that would be drawn on each axis\nconst dotsX=Math.floor(width/cellSize);const dotsY=Math.floor(height/cellSize);// If either axis exceeds 200 dots, adjust the dot size\nconst MAX_DOTS=200;if(dotsX>MAX_DOTS||dotsY>MAX_DOTS){// Determine which axis has more dots\nconst maxDots=Math.max(dotsX,dotsY);// Calculate the minimum cell size needed to have at most MAX_DOTS dots\nconst minCellSize=maxDots===dotsX?width/MAX_DOTS:height/MAX_DOTS;// Adjust the dot size, keeping the gap the same\nadjustedDotSize=minCellSize-dotGap;// Recalculate the cell size with the adjusted dot size\ncellSize=adjustedDotSize+dotGap;}const threshold=dotColor.threshold/100*255;const color1Point=dotColor.color1Point/100;const color2Point=dotColor.color2Point/100;const dotColorMode=dotColor.mode;const colorInterpolator=colorInterpolatorRef.current;const offset=dotGap/2;const circleRadius=adjustedDotSize/2;const circlePosition=circleRadius+offset;for(let y=0;y<height;y+=cellSize){for(let x=0;x<width;x+=cellSize){// Sample the pixel at the center of where the dot will be\nconst sampleX=Math.min(Math.round(x*pixelRatio),intFullWidth-1);const sampleY=Math.min(Math.round(y*pixelRatio),intFullHeight-1);const idx=(sampleY*intFullWidth+sampleX)*4;const r=data[idx];const g=data[idx+1];const b=data[idx+2];const brightness=.2126*r+.7152*g+.0722*b;const isLight=brightness>threshold;let pixelColor;switch(dotColorMode){case\"color\":if(dotColor.invert?isLight:!isLight){pixelColor=colorValue;}break;case\"duotone\":pixelColor=isLight?color2Value:color1Value;break;case\"gradient\":const percent=brightness/255;pixelColor=percent<=color1Point?color1Value:percent>=color2Point?color2Value:colorInterpolator?colorInterpolator(mapRange(percent,color1Point,color2Point,0,1)).toValue():color1Value;break;case\"sourceColor\":const a=data[idx+3]/255// Alpha value normalized to 0-1\n;pixelColor=`rgba(${r}, ${g}, ${b}, ${a})`;break;}if(!pixelColor)continue;ctx.fillStyle=pixelColor;if(dotShape===\"circle\"){ctx.beginPath();ctx.arc(x+circlePosition,y+circlePosition,circleRadius,0,2*Math.PI);ctx.fill();}else if(dotShape===\"square\"){ctx.fillRect(x+offset,y+offset,adjustedDotSize,adjustedDotSize);}}}// For video mode, continue the animation loop if playing\nif(isVideo&&videoIsPlayingRef.current){animationFrameRef.current=requestAnimationFrame(()=>drawPixelated());}}catch(error){console.error(\"Error in drawPixelated:\",error,{dimensions:{width,height,pixelRatio},calculated:{fullWidth,fullHeight,intFullWidth,intFullHeight}});// Try to continue the animation loop for video even if there was an error\nif(isVideo&&videoIsPlayingRef.current){animationFrameRef.current=requestAnimationFrame(()=>drawPixelated());}}};// Replace the original functions with wrappers that call the unified function\nconst drawPixelatedImage=()=>{if(imageRef.current){drawPixelated(imageRef.current);}};const drawPixelatedVideo=()=>{if(typeRef.current!==\"video\"){if(animationFrameRef.current){cancelAnimationFrame(animationFrameRef.current);animationFrameRef.current=null;}return;}drawPixelated();};// Clean up animation frame on unmount\nuseEffect(()=>{return()=>{if(animationFrameRef.current){cancelAnimationFrame(animationFrameRef.current);animationFrameRef.current=null;}};},[]);useEffect(()=>{if(videoRef.current&&type===\"video\"){if(muted||volume<=0){videoRef.current.muted=true;videoRef.current.volume=0;}else{videoRef.current.muted=false;videoRef.current.volume=volume/100;}videoRef.current.loop=!!loop;if(videoIsPlaying){videoRef.current.play().catch(err=>{console.error(\"Error playing video:\",err);});}else{videoRef.current.pause();}}},[muted,volume,loop,videoIsPlaying,type]);// Handle video playing state changes\nuseEffect(()=>{if(type===\"video\"&&isVideoLoaded){if(videoIsPlaying){// If video starts playing and we don't have an animation frame running,\n// restart the animation loop\nif(!animationFrameRef.current){drawPixelatedVideo();}}}},[videoIsPlaying,type,isVideoLoaded]);// Handle image loaded event and re-render when properties change\nuseEffect(()=>{if(type===\"image\"&&isImageLoaded){if(animationFrameRef.current){cancelAnimationFrame(animationFrameRef.current);animationFrameRef.current=null;}drawPixelatedImage();}},[type,isImageLoaded,dimensions,dotShape,dotSize,dotGap,dotColor,colorValue,color1Value,color2Value,sizing]);return /*#__PURE__*/_jsxs(\"div\",{id:instanceId,onClick:clickEvent,onMouseEnter:hoverEvent,style:{...style,backgroundColor,borderRadius:radius,overflow:\"hidden\",position:\"relative\",aspectRatio:style?.width&&style?.height?undefined:dimensions.width/dimensions.height},children:[/*#__PURE__*/_jsx(\"canvas\",{ref:canvasRef,width:dimensions.width*dimensions.pixelRatio,height:dimensions.height*dimensions.pixelRatio,style:{display:\"block\",imageRendering:dotShape===\"square\"?\"pixelated\":\"auto\",...style}}),/*#__PURE__*/_jsx(\"canvas\",{ref:offscreenCanvasRef,style:{display:\"none\"}}),/*#__PURE__*/_jsx(\"video\",{ref:videoRef,style:{display:\"none\"},crossOrigin:\"anonymous\",onLoadedData:handleVideoLoaded,onEnded:()=>type===\"video\"&&endEvent?.(),muted:muted||volume<=0,loop:loop,playsInline:true}),/*#__PURE__*/_jsx(\"style\",{children:isCanvas?`div:has(> #${instanceId}) { overflow: hidden !important; }`:`.framer-${componentId}-container { overflow: hidden !important; }`})]});}DottedVideo.displayName=\"Dotted Image/Video\";addPropertyControls(DottedVideo,{type:{type:ControlType.Enum,defaultValue:\"image\",options:[\"image\",\"video\"],optionTitles:[\"Image\",\"Video\"],displaySegmentedControl:true},image:{type:ControlType.ResponsiveImage,hidden:props=>props.type!==\"image\"},videoSource:{type:ControlType.Enum,defaultValue:\"url\",options:[\"url\",\"upload\"],optionTitles:[\"URL\",\"Upload\"],displaySegmentedControl:true,title:\"Source\",hidden:props=>props.type!==\"video\"},videoFile:{type:ControlType.File,allowedFileTypes:[\"mp4\",\"webm\"],description:\"MP4 or WebM\",title:\"File\",hidden:props=>props.type!==\"video\"||props.videoSource!==\"upload\"},videoUrl:{type:ControlType.String,title:\"URL\",placeholder:\"Enter a video URL\",description:\"MP4 or WebM\",hidden:props=>props.type!==\"video\"||props.videoSource!==\"url\"},sizing:{type:ControlType.Enum,defaultValue:\"fill\",options:[\"fill\",\"fit\",\"stretch\"],optionTitles:[\"Fill\",\"Fit\",\"Stretch\"]},playing:{type:ControlType.Boolean,defaultValue:true,hidden:props=>props.type!==\"video\"},loop:{type:ControlType.Boolean,defaultValue:true,hidden:props=>props.type!==\"video\"},muted:{type:ControlType.Boolean,defaultValue:true,hidden:props=>props.type!==\"video\"},volume:{type:ControlType.Number,defaultValue:50,min:0,max:100,unit:\"%\",hidden:props=>props.type!==\"video\"||props.muted},preview:{type:ControlType.Boolean,defaultValue:true,description:\"Play in editor\",hidden:props=>props.type!==\"video\"},dotShape:{type:ControlType.Enum,defaultValue:\"circle\",options:[\"circle\",\"square\"],optionTitles:[\"Circle\",\"Square\"],displaySegmentedControl:true,title:\"Shape\"},dotSize:{type:ControlType.Number,defaultValue:30,min:1,max:100},dotGap:{type:ControlType.Number,defaultValue:0,min:0,step:1},dotColor:{type:ControlType.Object,title:\"Dot Color\",controls:{mode:{type:ControlType.Enum,defaultValue:\"color\",options:[\"color\",\"duotone\",\"gradient\",\"sourceColor\"],optionTitles:[\"Color\",\"Duotone\",\"Gradient\",\"Source Color\"],displaySegmentedControl:true,segmentedControlDirection:\"vertical\"},color:{type:ControlType.Color,defaultValue:\"#000000\",hidden:props=>props.mode!==\"color\"},color1:{type:ControlType.Color,defaultValue:\"#000000\",title:\"Color 1\",hidden:props=>props.mode!==\"duotone\"&&props.mode!==\"gradient\"},color1Point:{type:ControlType.Number,defaultValue:0,min:0,max:100,step:1,unit:\"%\",title:\"Position\",hidden:props=>props.mode!==\"gradient\"},color2:{type:ControlType.Color,defaultValue:\"#d9d9d9\",title:\"Color 2\",hidden:props=>props.mode!==\"duotone\"&&props.mode!==\"gradient\"},color2Point:{type:ControlType.Number,defaultValue:100,min:0,max:100,step:1,unit:\"%\",title:\"Position\",hidden:props=>props.mode!==\"gradient\"},threshold:{type:ControlType.Number,defaultValue:50,min:0,max:100,step:1,unit:\"%\",hidden:props=>props.mode===\"gradient\"||props.mode===\"sourceColor\"},invert:{type:ControlType.Boolean,defaultValue:false,title:\"Invert\",hidden:props=>props.mode!==\"color\"}}},backgroundColor:{type:ControlType.Color,defaultValue:\"#ffffff\",optional:true,title:\"Background\"},radius:{type:ControlType.BorderRadius,defaultValue:\"0px\",description:\"More components at [Framer University](https://frameruni.link/cc).\"},endEvent:{type:ControlType.EventHandler,title:\"End\"},clickEvent:{type:ControlType.EventHandler,title:\"Click\"},hoverEvent:{type:ControlType.EventHandler,title:\"Hover\"}});function mapRange(value,fromLow,fromHigh,toLow,toHigh){if(fromLow===fromHigh){return toLow;}const percentage=(value-fromLow)/(fromHigh-fromLow);return toLow+percentage*(toHigh-toLow);}const useInstanceId=()=>{const id=useId();const cleanId=id.replace(/:/g,\"\");const instanceId=`frameruni-${cleanId}`;return instanceId;};\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"DottedVideo\",\"slots\":[],\"annotations\":{\"framerDisableUnlink\":\"*\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerIntrinsicHeight\":\"270\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerIntrinsicWidth\":\"480\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}