{"version":3,"file":"AvoidLayoutJumping_Prod.BRULeGyB.mjs","names":["useState","useRef","video","style","container","_Fragment","useRef"],"sources":["https:/framerusercontent.com/modules/I0fILe7gMdD877bkQ0j3/COZ8uuuFGZX43YFWRzg2/AsciiConverter.js","https:/framerusercontent.com/modules/zOx1Mgp5P282h4KBy6Bs/UYjkNn7tLb4hqhR0DAbV/kas1qqf4Y.js","https:/framerusercontent.com/modules/h8ioHyt4BUxuvVCE1Q10/aTM6mEMGlM19JjX8exDe/AvoidLayoutJumping_Prod.js"],"sourcesContent":["// Video to ASCII converter and previewer with upload via Framer interface, file/url support, and loop option\nimport{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{useRef,useEffect,useState,startTransition}from\"react\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{useInView}from\"framer-motion\";const defaultVideo=\"https://framerusercontent.com/assets/MLWPbW1dUQawJLhhun3dBwpgJak.mp4\";const ASCII_CHARS=\"@%#*+=-:. \";// Add performance constants\nconst MIN_FPS=15;const MAX_FPS=60;const DEFAULT_FPS=29;const PERFORMANCE_CHECK_INTERVAL=100// Increased interval for less overhead\n;const IDLE_CALLBACK_TIMEOUT=16// Max time to wait for idle callback\n;// Add function to detect and convert YouTube URLs\nfunction getYouTubeVideoId(url){if(!url)return null;// Match various YouTube URL formats\nconst patterns=[/(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/|youtube\\.com\\/embed\\/)([^&\\n?#]+)/,/youtube\\.com\\/shorts\\/([^&\\n?#]+)/];for(const pattern of patterns){const match=url.match(pattern);if(match&&match[1]){return match[1];}}return null;}function getAsciiChar(gray,asciiChars=ASCII_CHARS){const index=Math.floor(gray/255*(asciiChars.length-1));return asciiChars[index];}function frameToAscii(ctx,width,height,cols=80,asciiChars=ASCII_CHARS,inverse=false,brightness=0,contrast=1,colorMode=\"grayscale\",solidColor=\"#ffffff\",rows=40){// Use fixed cols and rows to prevent recalculation flicker\nconst targetCols=cols||80;const targetRows=rows||40;const scale=targetCols/width;const w=Math.floor(width*scale);const h=targetRows;// Get image data once\nconst imgData=ctx.getImageData(0,0,width,height).data;// Pre-allocate array for better performance\nconst lines=new Array(h);// Scale contrast from control range (1-100) to multiplier range (0.5-2.0)\nconst contrastMultiplier=.5+(contrast-1)/99*1.5;for(let y=0;y<h;y++){let line=\"\";for(let x=0;x<w;x++){const px=(Math.floor(y/h*height)*width+Math.floor(x/w*width))*4;let r=imgData[px];let g=imgData[px+1];let b=imgData[px+2];// Apply brightness and contrast with clamping to prevent jitter\nr=Math.round(Math.max(0,Math.min(255,r*contrastMultiplier+brightness)));g=Math.round(Math.max(0,Math.min(255,g*contrastMultiplier+brightness)));b=Math.round(Math.max(0,Math.min(255,b*contrastMultiplier+brightness)));const gray=Math.round(.299*r+.587*g+.114*b);const char=getAsciiChar(inverse?255-gray:gray,asciiChars);if(colorMode===\"rgb\"){// RGB mode: wrap character with ANSI-style color\nconst rgb=`rgb(${r}, ${g}, ${b})`;line+=`<span style=\"color: ${rgb}\">${char}</span>`;}else if(colorMode===\"rgb-quantized\"){// RGB Quantized mode: reduce colors to 8 levels per channel\nconst qr=Math.round(r/32)*32;const qg=Math.round(g/32)*32;const qb=Math.round(b/32)*32;const rgb=`rgb(${qr}, ${qg}, ${qb})`;line+=`<span style=\"color: ${rgb}\">${char}</span>`;}else if(colorMode===\"grayscale-quantized\"){// Grayscale Quantized mode: reduce grayscale to 8 levels\nconst qGray=Math.round(gray/32)*32;const grayColor=`rgb(${qGray}, ${qGray}, ${qGray})`;line+=`<span style=\"color: ${grayColor}\">${char}</span>`;}else if(colorMode===\"solid\"){// Solid Color mode: use a single color for all characters\nline+=`<span style=\"color: ${solidColor}\">${char}</span>`;}else{// Grayscale mode: just the character\nline+=char;}}lines[y]=line;}return lines.join(\"\\n\");}function editAscii(ascii,editFn){// editFn: (ascii: string) => string\nif(typeof editFn===\"function\"){return editFn(ascii);}return ascii;}/**\n * Video to ASCII Previewer\n *\n * @framerIntrinsicWidth 400\n * @framerIntrinsicHeight 300\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n * @framerDisableUnlink\n */export default function ASCIIConverter(props){const{videoFile=defaultVideo,videoUrl=\"\",videoSource=\"file\",loop,style,asciiFont={fontSize:\"min(max(8px, 1.5vw), 16px)\",fontFamily:\"monospace\",lineHeight:\"1.1em\"},asciiChars=ASCII_CHARS,asciiStyle=\"standard\",asciiColor=\"#fff\",asciiEditFn,inverse=false,brightness=0,contrast=1,colorMode=\"grayscale\",solidColor=\"#ffffff\"}=props;const[ascii,setAscii]=useState(\"\");const[loading,setLoading]=useState(false);const[progress,setProgress]=useState(0);const[dimensions,setDimensions]=useState({width:0,height:0});const[isVideoPlaying,setIsVideoPlaying]=useState(false);const[userPaused,setUserPaused]=useState(false);const[firstFrameAscii,setFirstFrameAscii]=useState(\"\");const[hasLoadedFirstFrame,setHasLoadedFirstFrame]=useState(false);const[isYouTube,setIsYouTube]=useState(false);const[youTubeId,setYouTubeId]=useState(null);const videoRef=useRef(null);const canvasRef=useRef(null);const containerRef=useRef(null);const animationRef=useRef(null);const idleCallbackRef=useRef(null);// Add viewport detection\nconst isInView=useInView(containerRef,{margin:\"0px\"});// Add refs for real-time brightness and contrast updates\nconst brightnessRef=useRef(brightness);const contrastRef=useRef(contrast);// Add ref for colorMode\nconst colorModeRef=useRef(colorMode);// Add ref for solidColor\nconst solidColorRef=useRef(solidColor);// Add refs to stabilize canvas dimensions and ASCII calculation\nconst canvasDimensionsRef=useRef({width:0,height:0});const asciiColsRef=useRef(80);const asciiRowsRef=useRef(40);const lastFrameTimeRef=useRef(0);const frameCounterRef=useRef(0);// Add ref to track if component is mounted\nconst isMountedRef=useRef(true);// Add ref to track font size for ASCII column calculation\nconst fontSizeRef=useRef(null);const lastAsciiUpdateRef=useRef(0);const pendingAsciiUpdateRef=useRef(false);// Move shouldPlay calculation before prevShouldPlayRef\n// Updated shouldPlay logic to work on live websites\nconst shouldPlay=!userPaused&&(RenderTarget.current()===RenderTarget.preview||RenderTarget.current()===RenderTarget.canvas&&props.showControls||typeof window!==\"undefined\"&&RenderTarget.current()!==RenderTarget.canvas&&RenderTarget.current()!==RenderTarget.preview)&&// 👇 integrate autoPause + viewport\n(!props.autoPauseWhenHidden||isInView);// Always show content on live websites\nconst shouldShowContent=true;// Add ref to track previous shouldPlay state\nconst prevShouldPlayRef=useRef(shouldPlay);// Move initializeCanvas outside to prevent stale closures\nconst initializeCanvas=()=>{const container=containerRef.current;const canvas=canvasRef.current;if(!container||!canvas)return;const containerWidth=container.offsetWidth||400;const containerHeight=container.offsetHeight||300;// Only update canvas size if dimensions actually changed\nif(canvasDimensionsRef.current.width!==containerWidth||canvasDimensionsRef.current.height!==containerHeight){canvas.width=containerWidth;canvas.height=containerHeight;canvasDimensionsRef.current={width:containerWidth,height:containerHeight};return true// Return true if dimensions changed\n;}return false;};// Update refs when props change\nuseEffect(()=>{brightnessRef.current=brightness;},[brightness]);useEffect(()=>{contrastRef.current=contrast;},[contrast]);useEffect(()=>{colorModeRef.current=colorMode;},[colorMode]);// Update solidColor ref when prop changes\nuseEffect(()=>{solidColorRef.current=solidColor;},[solidColor]);// Reset first frame state when shouldPlay changes\nuseEffect(()=>{if(prevShouldPlayRef.current!==shouldPlay){prevShouldPlayRef.current=shouldPlay;// Reset first frame state to force recapture\nif(!shouldPlay){setHasLoadedFirstFrame(false);}else{// When switching to play mode, ensure video reloads if needed\n// Also reset userPaused state when preview is turned on\nsetUserPaused(false);setHasLoadedFirstFrame(false);const video=videoRef.current;if(video){if(video.readyState>=2){// Video is already loaded, just play it\nvideo.play().catch(()=>{});}else{// Video needs to reload\nvideo.load();}}}}},[shouldPlay]);// Calculate ASCII columns when font changes\nuseEffect(()=>{const container=containerRef.current;if(!container)return;const containerWidth=container.offsetWidth||400;const containerHeight=container.offsetHeight||300;const fontSize=parseFloat(getComputedStyle(container).fontSize)||12;// Only recalculate if font size actually changed\nif(fontSizeRef.current!==fontSize){fontSizeRef.current=fontSize;const charWidth=fontSize*.6;const charHeight=fontSize*parseFloat(asciiFont.lineHeight||\"1.1\");// Calculate columns based on container width\nconst calculatedCols=Math.floor(containerWidth/charWidth);asciiColsRef.current=Math.max(10,calculatedCols);// Calculate rows based on container height\nconst calculatedRows=Math.floor(containerHeight/charHeight);asciiRowsRef.current=Math.max(5,calculatedRows);}},[asciiFont]);// Cleanup effect to pause video when component unmounts\nuseEffect(()=>{isMountedRef.current=true;// When component mounts, ensure video state matches shouldPlay\nconst video=videoRef.current;if(video&&video.readyState>=2){if(shouldPlay){video.play().catch(()=>{});}else{video.pause();}}return()=>{isMountedRef.current=false;const video=videoRef.current;if(video){video.pause();}if(animationRef.current){cancelAnimationFrame(animationRef.current);}if(idleCallbackRef.current&&typeof window!==\"undefined\"&&window.cancelIdleCallback){window.cancelIdleCallback(idleCallbackRef.current);}};},[shouldPlay]);// Pause video + cancel loop when not in view\nuseEffect(()=>{const video=videoRef.current;if(!video)return;if(props.autoPauseWhenHidden){if(isInView){// When in view and auto pause is enabled, play if not user paused\nif(!userPaused&&shouldPlay){video.play().catch(()=>{});}else if(!shouldPlay){video.pause();}}else{// When out of view and auto pause is enabled, pause the video\nvideo.pause();if(animationRef.current)cancelAnimationFrame(animationRef.current);}}else{// When auto pause is disabled, respect shouldPlay\nif(shouldPlay){video.play().catch(()=>{});}else{video.pause();}}},[isInView,userPaused,props.autoPauseWhenHidden,shouldPlay]);// Add effect to handle shouldPlay changes for already-loaded videos\nuseEffect(()=>{const video=videoRef.current;if(!video||video.readyState<2)return;// If video is already loaded and shouldPlay changes, respond immediately\nif(shouldPlay&&video.paused){video.play().catch(()=>{});}else if(!shouldPlay&&!video.paused){video.pause();}},[shouldPlay]);// Determine the source based on video source\nconst src=videoSource===\"url\"?videoUrl:videoFile;useEffect(()=>{setAscii(\"\");setProgress(0);setLoading(true);setFirstFrameAscii(\"\");setHasLoadedFirstFrame(false);// Check if URL is YouTube\nif(videoSource===\"url\"){const ytId=getYouTubeVideoId(videoUrl);if(ytId){setIsYouTube(true);setYouTubeId(ytId);// For YouTube, we'll show a message that ASCII conversion isn't available\nsetAscii(\"YouTube videos cannot be converted to ASCII due to browser restrictions.\\n\\nPlease use a direct video file URL (.mp4, .webm) for ASCII conversion.\");setLoading(false);}else{setIsYouTube(false);setYouTubeId(null);}}else{setIsYouTube(false);setYouTubeId(null);}// Force video element to reload when source changes\nconst video=videoRef.current;if(video){video.pause();video.currentTime=0;video.load();}},[src,videoSource,videoUrl]);// Determine ASCII character set based on asciiStyle\nconst getAsciiCharsForStyle=style=>{switch(style){case\"standard\":return\"@%#*+=-:. \";case\"detailed\":return\"$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\\\\|()1{}[]?-_+~<>i!lI;:,\\\"^`'. \";case\"blocks\":return\"█▓▒░ \";case\"simple\":return\"# \";case\"dots\":return\"●◐○ \";case\"custom\":return asciiChars;default:return\"@%#*+=-:. \";}};const activeAsciiChars=getAsciiCharsForStyle(asciiStyle);useEffect(()=>{const video=videoRef.current;const canvas=canvasRef.current;if(!video||!canvas)return;let stopped=false;// Fix: always set video.src and reload for both file and url\nif(video.src!==src){video.src=src;video.load();// Reset first frame state when source changes\nsetHasLoadedFirstFrame(false);setFirstFrameAscii(\"\");}function draw(){if(props.autoPauseWhenHidden&&!isInView)return;// Don't even try rendering if offscreen\nif(stopped)return;const currentTime=performance.now();const deltaTime=currentTime-lastFrameTimeRef.current;// Use fixed 29 fps\nconst targetFrameTime=1e3/29;// Frame rate limiting\nif(deltaTime<targetFrameTime){animationRef.current=requestAnimationFrame(draw);return;}lastFrameTimeRef.current=currentTime;processVideoFrame();}function processVideoFrame(){if(stopped||!isMountedRef.current)return;const w=video.videoWidth;const h=video.videoHeight;if(w===0||h===0){animationRef.current=requestAnimationFrame(draw);return;}// Initialize canvas dimensions if needed\ninitializeCanvas();const ctx=canvas.getContext(\"2d\",{willReadFrequently:true});const{width:canvasWidth,height:canvasHeight}=canvasDimensionsRef.current;// Clear canvas before drawing\nctx.clearRect(0,0,canvasWidth,canvasHeight);// Apply videoObjectFit logic\nconst{videoObjectFit=\"contain\"}=props;if(videoObjectFit===\"fill\"){ctx.drawImage(video,0,0,canvasWidth,canvasHeight);}else if(videoObjectFit===\"contain\"){const videoAspect=w/h;const containerAspect=canvasWidth/canvasHeight;let drawWidth,drawHeight,offsetX,offsetY;if(videoAspect>containerAspect){// Video is wider - fit to width\ndrawWidth=canvasWidth;drawHeight=canvasWidth/videoAspect;offsetX=0;offsetY=(canvasHeight-drawHeight)/2;}else{// Video is taller - fit to height\ndrawHeight=canvasHeight;drawWidth=canvasHeight*videoAspect;offsetX=(canvasWidth-drawWidth)/2;offsetY=0;}ctx.drawImage(video,offsetX,offsetY,drawWidth,drawHeight);}else if(videoObjectFit===\"cover\"){const videoAspect=w/h;const containerAspect=canvasWidth/canvasHeight;let srcX=0,srcY=0,srcWidth=w,srcHeight=h;if(videoAspect>containerAspect){// Video is wider - crop sides\nsrcHeight=h;srcWidth=h*containerAspect;srcX=(w-srcWidth)/2;srcY=0;}else{// Video is taller - crop top/bottom\nsrcWidth=w;srcHeight=w/containerAspect;srcX=0;srcY=(h-srcHeight)/2;}ctx.drawImage(video,srcX,srcY,srcWidth,srcHeight,0,0,canvasWidth,canvasHeight);}else if(videoObjectFit===\"scale-down\"){const scale=Math.min(1,Math.min(canvasWidth/w,canvasHeight/h));const drawWidth=w*scale;const drawHeight=h*scale;const offsetX=(canvasWidth-drawWidth)/2;const offsetY=(canvasHeight-drawHeight)/2;ctx.fillStyle=\"#000\";ctx.fillRect(0,0,canvasWidth,canvasHeight);ctx.drawImage(video,offsetX,offsetY,drawWidth,drawHeight);}else if(videoObjectFit===\"none\"){// Use natural size, centered (no scaling)\nconst offsetX=(canvasWidth-w)/2;const offsetY=(canvasHeight-h)/2;ctx.fillStyle=\"#000\";ctx.fillRect(0,0,canvasWidth,canvasHeight);ctx.drawImage(video,offsetX,offsetY,w,h);}// Update ASCII using idle callback for better performance\nconst currentTime=performance.now();const timeSinceLastUpdate=currentTime-lastAsciiUpdateRef.current;// Use fixed 29 fps\nconst targetFrameTime=1e3/29;// Only update ASCII if enough time has passed and no update is pending\nif(timeSinceLastUpdate>=targetFrameTime&&!pendingAsciiUpdateRef.current){pendingAsciiUpdateRef.current=true;lastAsciiUpdateRef.current=currentTime;// Use requestIdleCallback if available, otherwise use setTimeout\nconst updateAscii=()=>{if(!isMountedRef.current){pendingAsciiUpdateRef.current=false;return;}let asciiFrame=frameToAscii(ctx,canvasWidth,canvasHeight,asciiColsRef.current,activeAsciiChars,inverse,brightnessRef.current,contrastRef.current,colorModeRef.current,solidColorRef.current,asciiRowsRef.current);asciiFrame=editAscii(asciiFrame,asciiEditFn);startTransition(()=>setAscii(asciiFrame));pendingAsciiUpdateRef.current=false;};if(typeof window!==\"undefined\"&&window.requestIdleCallback){idleCallbackRef.current=window.requestIdleCallback(updateAscii,{timeout:IDLE_CALLBACK_TIMEOUT});}else{setTimeout(updateAscii,0);}}// Continue the loop\nanimationRef.current=requestAnimationFrame(draw);}// always start drawing when video is playing\nfunction handlePlay(){stopped=false;setIsVideoPlaying(true);// Reset frame timing on play\nlastFrameTimeRef.current=performance.now();frameCounterRef.current=0;animationRef.current=requestAnimationFrame(draw);}function handlePause(){stopped=true;setIsVideoPlaying(false);if(animationRef.current)cancelAnimationFrame(animationRef.current);}function handleProgress(){if(video.buffered.length>0&&video.duration>0){const end=video.buffered.end(video.buffered.length-1);const percent=Math.round(end/video.duration*100);setProgress(percent);}}function handleLoadedData(){setLoading(false);setProgress(100);const w=video.videoWidth;const h=video.videoHeight;if(w===0||h===0)return;// Capture first frame\nconst captureFirstFrame=()=>{initializeCanvas();const ctx=canvas.getContext(\"2d\",{willReadFrequently:true});const{width:canvasWidth,height:canvasHeight}=canvasDimensionsRef.current;ctx.clearRect(0,0,canvasWidth,canvasHeight);// Apply videoObjectFit logic for first frame\nconst{videoObjectFit=\"contain\"}=props;if(videoObjectFit===\"fill\"){ctx.drawImage(video,0,0,canvasWidth,canvasHeight);}else if(videoObjectFit===\"contain\"){const videoAspect=w/h;const containerAspect=canvasWidth/canvasHeight;let drawWidth,drawHeight,offsetX,offsetY;if(videoAspect>containerAspect){drawWidth=canvasWidth;drawHeight=canvasWidth/videoAspect;offsetX=0;offsetY=(canvasHeight-drawHeight)/2;}else{drawHeight=canvasHeight;drawWidth=canvasHeight*videoAspect;offsetX=(canvasWidth-drawWidth)/2;offsetY=0;}ctx.drawImage(video,offsetX,offsetY,drawWidth,drawHeight);}else if(videoObjectFit===\"cover\"){const videoAspect=w/h;const containerAspect=canvasWidth/canvasHeight;let srcX=0,srcY=0,srcWidth=w,srcHeight=h;if(videoAspect>containerAspect){srcHeight=h;srcWidth=h*containerAspect;srcX=(w-srcWidth)/2;srcY=0;}else{srcWidth=w;srcHeight=w/containerAspect;srcX=0;srcY=(h-srcHeight)/2;}ctx.drawImage(video,srcX,srcY,srcWidth,srcHeight,0,0,canvasWidth,canvasHeight);}else if(videoObjectFit===\"scale-down\"){const scale=Math.min(1,Math.min(canvasWidth/w,canvasHeight/h));const drawWidth=w*scale;const drawHeight=h*scale;const offsetX=(canvasWidth-drawWidth)/2;const offsetY=(canvasHeight-drawHeight)/2;ctx.fillStyle=\"#000\";ctx.fillRect(0,0,canvasWidth,canvasHeight);ctx.drawImage(video,offsetX,offsetY,drawWidth,drawHeight);}else if(videoObjectFit===\"none\"){const offsetX=(canvasWidth-w)/2;const offsetY=(canvasHeight-h)/2;ctx.fillStyle=\"#000\";ctx.fillRect(0,0,canvasWidth,canvasHeight);ctx.drawImage(video,offsetX,offsetY,w,h);}// Generate first frame ASCII\nlet firstFrame=frameToAscii(ctx,canvasWidth,canvasHeight,asciiColsRef.current,activeAsciiChars,inverse,brightnessRef.current,contrastRef.current,colorModeRef.current,solidColorRef.current,asciiRowsRef.current);firstFrame=editAscii(firstFrame,asciiEditFn);setFirstFrameAscii(firstFrame);setHasLoadedFirstFrame(true);};// Pause video first to prevent autoplay interference\nvideo.pause();// Always capture first frame when video loads\nvideo.currentTime=0;const handleSeeked=()=>{captureFirstFrame();video.removeEventListener(\"seeked\",handleSeeked);// After capturing first frame, play if shouldPlay is true\nif(shouldPlay){video.play().catch(()=>{});}};video.addEventListener(\"seeked\",handleSeeked);}// Set up ResizeObserver for real-time resizing with debouncing\nlet resizeTimeout;const resizeObserver=new ResizeObserver(()=>{// Debounce resize updates\nif(resizeTimeout)clearTimeout(resizeTimeout);resizeTimeout=setTimeout(()=>{// Immediately update canvas dimensions first\nconst dimensionsChanged=initializeCanvas();// Then recalculate ASCII columns and rows based on new container dimensions\nconst container=containerRef.current;if(container){const containerWidth=container.offsetWidth||400;const containerHeight=container.offsetHeight||300;const fontSize=parseFloat(getComputedStyle(container).fontSize)||12;const charWidth=fontSize*.6;const charHeight=fontSize*parseFloat(asciiFont.lineHeight||\"1.1\");// Calculate columns based on container width\nconst calculatedCols=Math.floor(containerWidth/charWidth);asciiColsRef.current=Math.max(10,calculatedCols);// Calculate rows based on container height\nconst calculatedRows=Math.floor(containerHeight/charHeight);asciiRowsRef.current=Math.max(5,calculatedRows);}// Force an immediate redraw with the new dimensions - always update when dimensions change\nif(dimensionsChanged&&video.readyState>=2){const w=video.videoWidth;const h=video.videoHeight;if(w>0&&h>0){const ctx=canvas.getContext(\"2d\",{willReadFrequently:true});const{width:canvasWidth,height:canvasHeight}=canvasDimensionsRef.current;// Clear canvas before drawing\nctx.clearRect(0,0,canvasWidth,canvasHeight);// Apply videoObjectFit logic\nconst{videoObjectFit=\"contain\"}=props;if(videoObjectFit===\"fill\"){ctx.drawImage(video,0,0,canvasWidth,canvasHeight);}else if(videoObjectFit===\"contain\"){const videoAspect=w/h;const containerAspect=canvasWidth/canvasHeight;let drawWidth,drawHeight,offsetX,offsetY;if(videoAspect>containerAspect){// Video is wider - fit to width\ndrawWidth=canvasWidth;drawHeight=canvasWidth/videoAspect;offsetX=0;offsetY=(canvasHeight-drawHeight)/2;}else{// Video is taller - fit to height\ndrawHeight=canvasHeight;drawWidth=canvasHeight*videoAspect;offsetX=(canvasWidth-drawWidth)/2;offsetY=0;}ctx.drawImage(video,offsetX,offsetY,drawWidth,drawHeight);}else if(videoObjectFit===\"cover\"){const videoAspect=w/h;const containerAspect=canvasWidth/canvasHeight;let srcX=0,srcY=0,srcWidth=w,srcHeight=h;if(videoAspect>containerAspect){// Video is wider - crop sides\nsrcHeight=h;srcWidth=h*containerAspect;srcX=(w-srcWidth)/2;srcY=0;}else{// Video is taller - crop top/bottom\nsrcWidth=w;srcHeight=w/containerAspect;srcX=0;srcY=(h-srcHeight)/2;}ctx.drawImage(video,srcX,srcY,srcWidth,srcHeight,0,0,canvasWidth,canvasHeight);}else if(videoObjectFit===\"scale-down\"){const scale=Math.min(1,Math.min(canvasWidth/w,canvasHeight/h));const drawWidth=w*scale;const drawHeight=h*scale;const offsetX=(canvasWidth-drawWidth)/2;const offsetY=(canvasHeight-drawHeight)/2;ctx.fillStyle=\"#000\";ctx.fillRect(0,0,canvasWidth,canvasHeight);ctx.drawImage(video,offsetX,offsetY,drawWidth,drawHeight);}else if(videoObjectFit===\"none\"){const offsetX=(canvasWidth-w)/2;const offsetY=(canvasHeight-h)/2;ctx.fillStyle=\"#000\";ctx.fillRect(0,0,canvasWidth,canvasHeight);ctx.drawImage(video,offsetX,offsetY,w,h);}// Generate and update ASCII immediately\nlet asciiFrame=frameToAscii(ctx,canvasWidth,canvasHeight,asciiColsRef.current,activeAsciiChars,inverse,brightnessRef.current,contrastRef.current,colorModeRef.current,solidColorRef.current,asciiRowsRef.current);asciiFrame=editAscii(asciiFrame,asciiEditFn);// Always update both current ASCII and first frame thumbnail on resize\nstartTransition(()=>{setAscii(asciiFrame);setFirstFrameAscii(asciiFrame);});}}},16)// ~60fps debounce\n;});const container=containerRef.current;if(container){resizeObserver.observe(container);}video.addEventListener(\"play\",handlePlay);video.addEventListener(\"pause\",handlePause);video.addEventListener(\"progress\",handleProgress);video.addEventListener(\"loadeddata\",handleLoadedData);return()=>{stopped=true;if(animationRef.current)cancelAnimationFrame(animationRef.current);resizeObserver.disconnect();video.removeEventListener(\"play\",handlePlay);video.removeEventListener(\"pause\",handlePause);video.removeEventListener(\"progress\",handleProgress);video.removeEventListener(\"loadeddata\",handleLoadedData);};},[src,activeAsciiChars,asciiEditFn,inverse,shouldPlay,props.videoObjectFit,props.showControls,brightness,contrast,colorMode,solidColor]);function handleEnded(){if(loop&&shouldPlay){videoRef.current.currentTime=0;videoRef.current.play();}}return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{...style,width:\"100%\",height:\"100%\",color:\"#fff\",fontFamily:asciiFont.fontFamily||\"monospace\",fontSize:asciiFont.fontSize||`min(max(8px, 1.5vw), 16px)`,lineHeight:asciiFont.lineHeight||\"1.1em\",overflow:\"hidden\",borderRadius:8,position:\"relative\",display:\"flex\",flexDirection:\"column\",alignItems:\"center\",justifyContent:\"center\",cursor:\"default\"},children:isYouTube&&youTubeId?// YouTube - show message about ASCII conversion\n/*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",height:\"100%\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",padding:\"20px\",textAlign:\"center\"},children:/*#__PURE__*/_jsx(\"pre\",{style:{margin:0,padding:20,whiteSpace:\"pre-wrap\",fontFamily:asciiFont.fontFamily||\"monospace\",fontSize:asciiFont.fontSize||`min(max(8px, 1.5vw), 16px)`,lineHeight:asciiFont.lineHeight||\"1.2em\",color:asciiColor},children:ascii})}):/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"video\",{ref:videoRef,src:src,style:{display:\"none\",objectFit:props.videoObjectFit||\"contain\"},loop:loop,muted:true,playsInline:true,preload:\"auto\",onEnded:handleEnded,crossOrigin:\"anonymous\"}),/*#__PURE__*/_jsx(\"canvas\",{ref:canvasRef,style:{display:\"none\"}}),/*#__PURE__*/_jsx(\"pre\",{style:{margin:0,padding:0,width:\"100%\",height:\"100%\",whiteSpace:\"pre\",userSelect:\"none\",pointerEvents:\"auto\",fontFamily:asciiFont.fontFamily||\"monospace\",fontSize:asciiFont.fontSize||`min(max(8px, 1.5vw), 16px)`,lineHeight:asciiFont.lineHeight||\"1.1em\",color:colorMode===\"grayscale\"?asciiColor:\"inherit\",overflow:\"hidden\"},\"aria-label\":\"ASCII video preview\",dangerouslySetInnerHTML:colorMode!==\"grayscale\"?{__html:isVideoPlaying||shouldPlay?ascii:firstFrameAscii}:undefined,children:colorMode===\"grayscale\"?isVideoPlaying||shouldPlay?ascii:firstFrameAscii:null})]})});}addPropertyControls(ASCIIConverter,{videoSource:{type:ControlType.Enum,title:\"Video Source\",options:[\"file\",\"url\"],optionTitles:[\"Upload\",\"URL\"],defaultValue:\"file\",displaySegmentedControl:true},videoFile:{type:ControlType.File,allowedFileTypes:[\"mp4\",\"webm\",\"mov\"],title:\"Video File\",description:\"MP4 format is preferred for best compatibility\",hidden:({videoSource})=>videoSource!==\"file\"},videoUrl:{type:ControlType.String,title:\"Video URL\",placeholder:\"https://...\",defaultValue:\"\",hidden:({videoSource})=>videoSource!==\"url\",description:\"YouTube links aren’t supported\"},videoObjectFit:{type:ControlType.Enum,title:\"Video Fit\",options:[\"contain\",\"cover\",\"fill\",\"scale-down\",\"none\"],optionTitles:[\"Contain\",\"Cover\",\"Fill\",\"Scale Down\",\"None\"],defaultValue:\"contain\"},showControls:{type:ControlType.Boolean,title:\"Preview\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\",description:\"Control video playback on canvas\"},loop:{type:ControlType.Boolean,title:\"Loop\",defaultValue:true,enabledTitle:\"Loop\",disabledTitle:\"Once\"},autoPauseWhenHidden:{type:ControlType.Boolean,title:\"Offscreen\",defaultValue:true,enabledTitle:\"Pause\",disabledTitle:\"Play\",description:\"Pause video when scrolled out of view\"},colorMode:{type:ControlType.Enum,title:\"Color Mode\",options:[\"grayscale\",\"grayscale-quantized\",\"rgb\",\"rgb-quantized\",\"solid\"],optionTitles:[\"Grayscale\",\"Grayscale (Quantized)\",\"RGB\",\"RGB (Quantized)\",\"Solid Color\"],defaultValue:\"grayscale\"},solidColor:{type:ControlType.Color,title:\"Solid Color\",defaultValue:\"#ffffff\",hidden:({colorMode})=>colorMode!==\"solid\"},asciiStyle:{type:ControlType.Enum,title:\"ASCII Style\",options:[\"standard\",\"detailed\",\"blocks\",\"simple\",\"dots\",\"custom\"],optionTitles:[\"Standard\",\"Detailed\",\"Blocks\",\"Simple\",\"Dots\",\"Custom\"],defaultValue:\"standard\"},asciiChars:{type:ControlType.String,title:\"Custom Chars\",defaultValue:\"@%#*+=-:. \",placeholder:\"Enter ASCII characters...\",hidden:({asciiStyle})=>asciiStyle!==\"custom\"},asciiFont:{type:ControlType.Font,title:\"ASCII Font\",controls:\"extended\",defaultFontType:\"monospace\",defaultValue:{fontSize:\"min(max(8px, 1.5vw), 16px)\",lineHeight:\"1.1em\"}},asciiColor:{type:ControlType.Color,title:\"ASCII Color\",defaultValue:\"#fff\",hidden:({colorMode})=>colorMode!==\"grayscale\"},inverse:{type:ControlType.Boolean,title:\"Inverse\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\",hidden:false},brightness:{type:ControlType.Number,title:\"Brightness\",defaultValue:0,min:-100,max:100,step:1},contrast:{type:ControlType.Number,title:\"Contrast\",defaultValue:1,min:1,max:100,step:1,description:\"More resources at [Velox Themes](https://veloxthemes.com)\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ASCIIConverter\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerIntrinsicWidth\":\"400\",\"framerDisableUnlink\":\"\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerIntrinsicHeight\":\"300\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./AsciiConverter.map","// Generated by Framer (265a357)\nimport{fontStore}from\"framer\";fontStore.loadFonts([\"BI;Libre Caslon Condensed/variable/v0\",\"BI;Libre Caslon Condensed/variable/v0VF=IndnaHQiIDQwMCwgIndkdGgiIDEwMA==\",\"BI;Libre Caslon Condensed/variable/v0VF=IndnaHQiIDQwMCwgIndkdGgiIDEwMA==\",\"BI;Libre Caslon Condensed/variable/v0VF=IndnaHQiIDQwMCwgIndkdGgiIDEwMA==\"]);const variationAxes=[{defaultValue:400,maxValue:700,minValue:400,name:\"Weight\",tag:\"wght\"}];export const fonts=[{explicitInter:true,fonts:[{cssFamilyName:\"Libre Caslon Condensed Variable\",source:\"builtIn\",style:\"normal\",uiFamilyName:\"Libre Caslon Condensed\",url:\"https://framerusercontent.com/assets/BLN7KMUMc3nlKAgG0QeQ7F85X4.woff2\",variationAxes,weight:\"1000\"}]}];export const css=['.framer-lmmz7 .framer-styles-preset-1uf2uwb:not(.rich-text-wrapper), .framer-lmmz7 .framer-styles-preset-1uf2uwb.rich-text-wrapper h3 { --framer-font-family: \"Libre Caslon Condensed Variable\", serif; --framer-font-family-bold: \"Libre Caslon Condensed Variable\", serif; --framer-font-family-bold-italic: \"Libre Caslon Condensed Variable\", serif; --framer-font-family-italic: \"Libre Caslon Condensed Variable\", serif; --framer-font-open-type-features: normal; --framer-font-size: 50px; --framer-font-style: normal; --framer-font-style-bold: normal; --framer-font-style-bold-italic: normal; --framer-font-style-italic: normal; --framer-font-variation-axes: \"wght\" 400, \"wdth\" 100; --framer-font-variation-axes-bold: \"wght\" 400, \"wdth\" 100; --framer-font-variation-axes-bold-italic: \"wght\" 400, \"wdth\" 100; --framer-font-variation-axes-italic: \"wght\" 400, \"wdth\" 100; --framer-font-weight: 1000; --framer-font-weight-bold: 1000; --framer-font-weight-bold-italic: 1000; --framer-font-weight-italic: 1000; --framer-letter-spacing: -0.03em; --framer-line-height: 100%; --framer-paragraph-spacing: 40px; --framer-text-alignment: center; --framer-text-color: var(--token-f4c0263d-3ac9-4a2e-9584-d24beb36ae92, #f2f2f2); --framer-text-decoration: none; --framer-text-stroke-color: initial; --framer-text-stroke-width: initial; --framer-text-transform: none; }'];export const className=\"framer-lmmz7\";\nexport const __FramerMetadata__ = {\"exports\":{\"css\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"fonts\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"className\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","import{jsx as _jsx}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{useEffect,useRef}from\"react\";/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n *\n * @framerDisableUnlink\n */export default function AvoidLayoutJumping({direction,style}){const isCanvas=RenderTarget.current()===RenderTarget.canvas;const ref=useRef(null);const rafId=useRef();const vertical=direction===\"vertical\"||direction===\"both\";const horizontal=direction===\"horizontal\"||direction===\"both\";useEffect(()=>{if(isCanvas)return;const parent=ref.current?.parentElement?.parentElement;if(!parent)return;const container=parent.parentElement;if(!container)return;const updateSize=()=>{const rect=parent.getBoundingClientRect();if(horizontal){container.style.width=`${rect.width}px`;}if(vertical){container.style.height=`${rect.height}px`;}rafId.current=requestAnimationFrame(updateSize);};// Start the RAF loop\nrafId.current=requestAnimationFrame(updateSize);return()=>{if(rafId.current){cancelAnimationFrame(rafId.current);}if(container){if(horizontal){container.style.width=\"\";}if(vertical){container.style.height=\"\";}}};},[direction]);return /*#__PURE__*/_jsx(\"div\",{ref:ref,style:{...style}});}AvoidLayoutJumping.displayName=\"Layout Jump Preventer\";addPropertyControls(AvoidLayoutJumping,{direction:{type:ControlType.Enum,defaultValue:\"vertical\",options:[\"vertical\",\"horizontal\",\"both\"],optionTitles:[\"Vertical\",\"Horizontal\",\"Both\"],displaySegmentedControl:true,segmentedControlDirection:\"vertical\",// @ts-ignore\noptionIcons:[\"direction-vertical\",\"direction-horizontal\",\"direction-all\"],description:\"More components at [Framer University](https://frameruni.link/cc).\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"AvoidLayoutJumping\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerDisableUnlink\":\"\",\"framerSupportedLayoutWidth\":\"auto\",\"framerSupportedLayoutHeight\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./AvoidLayoutJumping_Prod.map"],"mappings":"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"}