{"version":3,"file":"MuxLoopVideo.CfOxE8o8.mjs","names":["React.useRef","React.useState","React.useCallback","__esmMin","ne","_e","c","init_jsx_runtime","ce","init_npm_react_18_3_1","de","addPropertyControls","init_framer_BWFVvmND","ControlType","MuxLoopVideo","props","containerRef","videoRef","visibleRef","optionsRef","systemPauseRef","pausedOffscreenRef","stoppedRef","shouldLoad","setShouldLoad","play","video","err","tryAutoPlay","muted","onPlay","onPause","onEnded","element","observer","entry","playbackId","source","cancelled","hls","Hls","HLS_URL","data","style","radius","fit","init_MuxLoopVideo"],"sources":["https:/framerusercontent.com/modules/BJpsCFrsTXAiJ6ook8E1/XDKWuL43RYCEpl9LXH01/MuxLoopVideo.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import*as React from\"react\";import{addPropertyControls,ControlType}from\"framer\";const HLS_URL=\"https://cdn.jsdelivr.net/npm/hls.js@1/+esm\";export default function MuxLoopVideo(props){// Los valores por defecto replican exactamente el comportamiento original\nconst{playbackId,poster,radius=0,style,autoPlay=true,muted=true,loop=true,controls=false,pauseOffscreen=true,fit=\"cover\"}=props;const containerRef=React.useRef(null);const videoRef=React.useRef(null);const visibleRef=React.useRef(false);// Props actuales en un ref para que observers y eventos lean siempre lo último\nconst optionsRef=React.useRef({autoPlay,controls,pauseOffscreen});optionsRef.current={autoPlay,controls,pauseOffscreen};// Estado interno de reproducción\nconst systemPauseRef=React.useRef(false)// la pausa la hizo el componente\n;const pausedOffscreenRef=React.useRef(false)// se pausó por salir de vista\n;const stoppedRef=React.useRef(false)// el usuario pausó o el video terminó\n;const[shouldLoad,setShouldLoad]=React.useState(false);const play=React.useCallback(()=>{const video=videoRef.current;if(!video||!visibleRef.current)return;video.play().catch(err=>{// Si el navegador bloquea el autoplay con sonido, reintenta en silencio\nif(err?.name===\"NotAllowedError\"&&!video.muted){video.muted=true;video.play().catch(()=>{});}});},[]);const tryAutoPlay=React.useCallback(()=>{if(!optionsRef.current.autoPlay||stoppedRef.current)return;play();},[play]);// Sincronizar muted con el elemento (React no siempre lo actualiza solo)\nReact.useEffect(()=>{const video=videoRef.current;if(!video)return;video.muted=muted;video.defaultMuted=muted;},[muted]);// Distinguir pausas del usuario / fin del video de las pausas del componente\nReact.useEffect(()=>{const video=videoRef.current;if(!video)return;const onPlay=()=>{stoppedRef.current=false;pausedOffscreenRef.current=false;};const onPause=()=>{if(systemPauseRef.current){systemPauseRef.current=false;return;}// Sin controles el usuario no puede pausar, así que se ignora\nif(optionsRef.current.controls)stoppedRef.current=true;};// Solo ocurre con loop desactivado: no volver a arrancar solo\nconst onEnded=()=>{stoppedRef.current=true;};video.addEventListener(\"play\",onPlay);video.addEventListener(\"pause\",onPause);video.addEventListener(\"ended\",onEnded);return()=>{video.removeEventListener(\"play\",onPlay);video.removeEventListener(\"pause\",onPause);video.removeEventListener(\"ended\",onEnded);};},[]);// Cargar el video poco antes de que entre al viewport\nReact.useEffect(()=>{const element=containerRef.current;if(!element)return;const observer=new IntersectionObserver(([entry])=>{if(entry.isIntersecting){setShouldLoad(true);observer.disconnect();}},{rootMargin:\"300px 0px\",threshold:0});observer.observe(element);return()=>observer.disconnect();},[]);// Reproducir / pausar según visibilidad\nReact.useEffect(()=>{const element=containerRef.current;const video=videoRef.current;if(!element||!video)return;const observer=new IntersectionObserver(([entry])=>{visibleRef.current=entry.isIntersecting;if(entry.isIntersecting){// Reanudar si lo pausamos al salir; si no, autoplay normal\nif(pausedOffscreenRef.current)play();else tryAutoPlay();}else if(optionsRef.current.pauseOffscreen&&!video.paused){pausedOffscreenRef.current=true;systemPauseRef.current=true;video.pause();}},{threshold:.01});observer.observe(element);return()=>observer.disconnect();},[play,tryAutoPlay]);// Inicializar Mux HLS\nReact.useEffect(()=>{if(!shouldLoad||!playbackId)return;const video=videoRef.current;if(!video)return;const source=`https://stream.mux.com/${playbackId}.m3u8`;stoppedRef.current=false;pausedOffscreenRef.current=false;video.addEventListener(\"canplay\",tryAutoPlay);let cancelled=false;let hls=null;const start=async()=>{let Hls=null;try{Hls=(await import(/* @vite-ignore */HLS_URL)).default;}catch(err){console.warn(\"[MuxLoopVideo] No se pudo cargar hls.js\",err);}if(cancelled)return;// 1) hls.js primero (Chrome, Edge, Firefox y también Safari moderno)\nif(Hls&&Hls.isSupported()){hls=new Hls({capLevelToPlayerSize:true,startLevel:-1});hls.on(Hls.Events.MANIFEST_PARSED,tryAutoPlay);hls.on(Hls.Events.ERROR,(_event,data)=>{console.warn(\"[MuxLoopVideo] hls error\",data.type,data.details);if(!data.fatal)return;switch(data.type){case Hls.ErrorTypes.NETWORK_ERROR:hls.startLoad();break;case Hls.ErrorTypes.MEDIA_ERROR:hls.recoverMediaError();break;default:hls.destroy();hls=null;}});hls.loadSource(source);hls.attachMedia(video);return;}// 2) Respaldo: HLS nativo (Safari antiguo / iOS)\nif(video.canPlayType(\"application/vnd.apple.mpegurl\")){video.src=source;return;}console.warn(\"[MuxLoopVideo] Este navegador no soporta HLS\");};start();return()=>{cancelled=true;video.removeEventListener(\"canplay\",tryAutoPlay);if(!video.paused){systemPauseRef.current=true;video.pause();}if(hls){hls.destroy();hls=null;}video.removeAttribute(\"src\");video.load();};},[shouldLoad,playbackId,tryAutoPlay]);return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{...style,width:\"100%\",height:\"100%\",overflow:\"hidden\",position:\"relative\",borderRadius:radius},children:/*#__PURE__*/_jsx(\"video\",{ref:videoRef,muted:muted,loop:loop,playsInline:true,controls:controls,preload:\"none\",poster:poster,style:{width:\"100%\",height:\"100%\",display:\"block\",objectFit:fit,objectPosition:\"center\"}})});}MuxLoopVideo.defaultProps={playbackId:\"tIYGT7OXdCWNw4nKfkOmv01jc77yDthwhjT001GAuiBCs\",radius:0,autoPlay:true,muted:true,loop:true,controls:false,pauseOffscreen:true,fit:\"cover\"};addPropertyControls(MuxLoopVideo,{playbackId:{type:ControlType.String,title:\"Playback ID\"},poster:{type:ControlType.Image,title:\"Poster\"},autoPlay:{type:ControlType.Boolean,title:\"Autoplay\",defaultValue:true,description:\"Si lo desactivas, activa Controls para poder darle play.\"},muted:{type:ControlType.Boolean,title:\"Muted\",defaultValue:true,description:\"Si el navegador bloquea el autoplay con sonido, arranca en silencio.\"},loop:{type:ControlType.Boolean,title:\"Loop\",defaultValue:true},controls:{type:ControlType.Boolean,title:\"Controls\",defaultValue:false},pauseOffscreen:{type:ControlType.Boolean,title:\"Pause Offscreen\",defaultValue:true},fit:{type:ControlType.Enum,title:\"Fit\",options:[\"cover\",\"contain\"],optionTitles:[\"Cover\",\"Contain\"],defaultValue:\"cover\",displaySegmentedControl:true},radius:{type:ControlType.Number,title:\"Radius\",min:0,max:100,step:1,unit:\"px\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"MuxLoopVideo\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./MuxLoopVideo.map"],"mappings":"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"}