{"version":3,"file":"LoopVideo.Biq6_i69.mjs","names":["useState","useRef","shown"],"sources":["https:/framerusercontent.com/modules/IqBRRZKKMwNPq6uVzC54/Txd418zihUr1NmkKbzTp/LoopVideo.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";import{useEffect,useRef,useState}from\"react\";const DEFAULT_SRC=\"https://d2ol7oe51mr4n9.cloudfront.net/user_3FMPqLZy3N0UPmCIAVAvDMjs76h/319ebca4-068e-461f-b826-422f9073086c.mp4\";/**\n * Loop Video — autoplaying, muted background video that fills its frame.\n * With `smooth` on, two stacked copies crossfade at the loop point so the\n * restart is invisible instead of a hard cut; off = native loop.\n *\n * `srcUrl` (string) overrides the File control — File controls can't be set\n * via the plugin. `srcUrlMobile` + `mobileMax` serve a portrait cut at and\n * below the given viewport width.\n *\n * PERFORMANCE (2026-09-28, PageSpeed pass):\n *  - ONE download per device. The desktop and mobile cuts are <source>\n *    elements with media queries, so the browser picks the right file when it\n *    loads. Before, the server HTML always carried the desktop URL and phones\n *    swapped to the mobile cut after hydration, downloading BOTH (6.6 MB on\n *    the home hero). Crossing mobileMax later (rotation, resize) re-picks.\n *  - `deferLoad` (default on): the video starts once the page has loaded AND\n *    painted its first content, plus a second and an idle beat (never later\n *    than 6 s), instead of competing with the fonts, scripts and first paint\n *    for bandwidth, then fades in on its first frame. Set `poster` to show a\n *    still before that.\n *  - With `smooth`, the crossfade copy starts loading only once the first copy\n *    can play through (the same file, so it then comes from cache) instead of\n *    both copies downloading the same video at once.\n *  - Save-Data: the video is skipped (poster only).\n *  - `poster` / `posterMobile`: a still (ideally the cut's first frame) is\n *    server-rendered as a <picture> BEHIND the video, with the same mobileMax\n *    switch, so the hero shows the opening frame with the page instead of a\n *    flat colour while the deferred video waits, and the video fades in over\n *    the matching frame. framerusercontent posters get a 512/1024/2048 srcset\n *    (WebP/AVIF). Note: Chrome ignores a full-viewport image (and video) as a\n *    Largest Contentful Paint candidate - it treats it as background - so a\n *    full-bleed poster improves what people see, not the LCP number.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n * @framerIntrinsicWidth 640\n * @framerIntrinsicHeight 540\n * @framerDisableUnlink\n */// Resolves once the page has loaded AND painted its first content, plus\n// AFTER_PAINT ms and an idle beat, or after MAX_WAIT ms at the latest. One\n// promise shared by every instance on the page.\n//\n// The load event alone was not enough (measured live, 2026-09-28): in\n// Lighthouse's run it can land just BEFORE the first paint, so the video\n// request started 10-120 ms ahead of it and the whole file (3 MB on home,\n// 16-18 MB on /about and /corporate) was counted into the simulated LCP.\n// Requests that start after the first paint are left out of it.\nconst MAX_WAIT=6e3;const AFTER_PAINT=1e3;let pageReady=null;function firstPaintTime(){try{const e=performance.getEntriesByName(\"first-contentful-paint\")[0];return e?e.startTime:-1;}catch(e){return 0;}}function whenPageReady(){if(pageReady)return pageReady;pageReady=new Promise(resolve=>{if(typeof window===\"undefined\")return resolve();let started=false;const go=()=>{if(started)return;started=true;const ric=window.requestIdleCallback;if(typeof ric===\"function\")ric(()=>resolve(),{timeout:800});else setTimeout(resolve,200);};let loaded=document.readyState===\"complete\";let painted=firstPaintTime();const check=()=>{if(!loaded||painted<0)return;setTimeout(go,Math.max(0,painted+AFTER_PAINT-performance.now()));};if(!loaded)window.addEventListener(\"load\",()=>{loaded=true;check();},{once:true});if(painted<0){// Browsers without paint timing fall back to the load event alone.\nconst types=typeof PerformanceObserver!==\"undefined\"&&PerformanceObserver.supportedEntryTypes||[];if(types.indexOf(\"paint\")===-1)painted=0;else{try{const po=new PerformanceObserver(()=>{const t=firstPaintTime();if(t<0)return;painted=t;po.disconnect();check();});po.observe({type:\"paint\",buffered:true});}catch(e){painted=0;}}}check();setTimeout(go,MAX_WAIT);});return pageReady;}function frSrcSet(url){if(!/^https:\\/\\/framerusercontent\\.com\\/images\\//.test(url))return undefined;const clean=url.split(\"?\")[0];return[512,1024,2048].map(w=>`${clean}?scale-down-to=${w} ${w}w`).join(\", \");}function saveData(){const c=typeof navigator!==\"undefined\"?navigator.connection:null;return!!(c&&c.saveData);}export default function LoopVideo(props){const{src,srcUrl=\"\",srcUrlMobile=\"\",mobileMax=810,fit=\"cover\",radius=0,smooth=true,fade=1,poster=\"\",posterMobile=\"\",deferLoad=true}=props;const isStatic=useIsStaticRenderer();const desktopSrc=(srcUrl||\"\").trim()||src||DEFAULT_SRC;const mobileSrc=(srcUrlMobile||\"\").trim();const posterUrl=(poster||\"\").trim();const posterMobileUrl=(posterMobile||\"\").trim();const immediate=isStatic||!deferLoad;const[armed,setArmed]=useState(immediate);const[armedB,setArmedB]=useState(immediate);const[playing,setPlaying]=useState(isStatic);const a=useRef(null);const b=useRef(null);const st=useRef({active:0,switching:false,armedB:immediate});st.current.armedB=armedB;// 1. Attach the sources once the page has loaded (unless Save-Data).\nuseEffect(()=>{if(armed||saveData())return;let alive=true;whenPageReady().then(()=>{if(alive)setArmed(true);});return()=>{alive=false;};},[armed]);// 2. Start playback and fade in on the first frame.\nuseEffect(()=>{if(!armed||isStatic)return;const v=a.current;if(!v)return;const on=()=>setPlaying(true);v.addEventListener(\"playing\",on);const p=v.play();if(p&&p.catch)p.catch(()=>{});return()=>v.removeEventListener(\"playing\",on);},[armed,isStatic]);// 3. Re-pick the cut when the viewport crosses mobileMax.\nuseEffect(()=>{if(!armed||isStatic||!mobileSrc||typeof window===\"undefined\"||!window.matchMedia)return;const mq=window.matchMedia(`(max-width: ${mobileMax}px)`);const repick=()=>{const s=st.current;s.active=0;s.switching=false;const va=a.current,vb=b.current;if(vb){try{vb.pause();if(st.current.armedB)vb.load();}catch(e){}vb.style.opacity=\"0\";}if(va){va.style.opacity=\"1\";try{va.load();}catch(e){}const p=va.play();if(p&&p.catch)p.catch(()=>{});}};mq.addEventListener?mq.addEventListener(\"change\",repick):mq.addListener(repick);return()=>{mq.removeEventListener?mq.removeEventListener(\"change\",repick):mq.removeListener(repick);};},[armed,isStatic,mobileSrc,mobileMax]);// 4. Smooth loop: crossfade to the second copy just before the end.\nuseEffect(()=>{if(isStatic||!smooth||!armed)return;const vids=[a.current,b.current];if(!vids[0]||!vids[1])return;const s=st.current;s.active=0;s.switching=false;vids[0].style.opacity=\"1\";vids[1].style.opacity=\"0\";const armSecond=()=>setArmedB(true);vids[0].addEventListener(\"canplaythrough\",armSecond,{once:true});const fallback=setTimeout(armSecond,8e3);const tick=()=>{const cur=vids[s.active],nxt=vids[1-s.active];if(!cur||!nxt||s.switching)return;if(cur.duration&&cur.duration-cur.currentTime<=Math.max(.3,fade)){// Crossfade copy not ready yet: loop the current one with a cut.\nif(!s.armedB||nxt.readyState<2){if(cur.ended||cur.duration-cur.currentTime<.08){try{cur.currentTime=0;}catch(e){}const p=cur.play();if(p&&p.catch)p.catch(()=>{});}return;}s.switching=true;try{nxt.currentTime=0;}catch(e){}const p=nxt.play();if(p&&p.catch)p.catch(()=>{});nxt.style.opacity=\"1\";cur.style.opacity=\"0\";setTimeout(()=>{cur.pause();s.active=1-s.active;s.switching=false;},Math.max(.3,fade)*1e3);}};const id=setInterval(tick,100);return()=>{clearInterval(id);clearTimeout(fallback);vids[0]&&vids[0].removeEventListener(\"canplaythrough\",armSecond);};},[isStatic,smooth,armed,fade]);// Desktop cut first with a media query, portrait cut as the fallback: a\n// browser that ignores `media` still gets the desktop file (today's\n// behaviour), every current browser gets the right one.\nconst sources=on=>!on?null:mobileSrc?[/*#__PURE__*/_jsx(\"source\",{src:desktopSrc,media:`(min-width: ${mobileMax+.02}px)`},\"d\"),/*#__PURE__*/_jsx(\"source\",{src:mobileSrc},\"m\")]:[/*#__PURE__*/_jsx(\"source\",{src:desktopSrc},\"d\")];const outer={position:\"relative\",width:\"100%\",height:\"100%\",overflow:\"hidden\",borderRadius:radius,...props.style};const shown=playing;const reveal={position:\"absolute\",inset:0,opacity:shown?1:0,transition:isStatic?\"none\":\"opacity .6s ease\"};const base={width:\"100%\",height:\"100%\",objectFit:fit,display:\"block\"};// A <video> ignores a changed <source src> until load() is called, so a URL\n// swap left the old clip playing on the Framer canvas (2026-09-29). Keying\n// the elements on the URLs remounts them, and the new file loads.\nconst vkey=`${desktopSrc}|${mobileSrc}`;// The still behind the video (see PERFORMANCE). Never lazy: it is the\n// first thing the hero paints.\nconst stillDesktop=posterUrl||posterMobileUrl;const stillMobile=posterMobileUrl&&mobileSrc?posterMobileUrl:\"\";const still=!stillDesktop?null:/*#__PURE__*/_jsxs(\"picture\",{children:[stillMobile?/*#__PURE__*/_jsx(\"source\",{media:`(max-width: ${mobileMax}px)`,srcSet:frSrcSet(stillMobile)||stillMobile,sizes:\"100vw\"}):null,/*#__PURE__*/_jsx(\"img\",{src:stillDesktop,srcSet:frSrcSet(stillDesktop),sizes:frSrcSet(stillDesktop)?\"100vw\":undefined,alt:\"\",decoding:\"async\",draggable:false,style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",objectFit:fit,display:\"block\"}})]});if(isStatic||!smooth){return /*#__PURE__*/_jsxs(\"div\",{style:outer,children:[still,/*#__PURE__*/_jsx(\"div\",{style:reveal,children:/*#__PURE__*/_jsx(\"video\",{ref:a,autoPlay:true,loop:true,muted:true,playsInline:true,preload:armed?\"auto\":\"none\",style:base,children:sources(armed)},vkey)})]});}const layer={...base,position:\"absolute\",inset:0,transition:`opacity ${Math.max(.3,fade)}s ease`};return /*#__PURE__*/_jsxs(\"div\",{style:outer,children:[still,/*#__PURE__*/_jsxs(\"div\",{style:reveal,children:[/*#__PURE__*/_jsx(\"video\",{ref:a,autoPlay:true,muted:true,playsInline:true,preload:armed?\"auto\":\"none\",style:{...layer,opacity:1},children:sources(armed)},vkey+\"|a\"),/*#__PURE__*/_jsx(\"video\",{ref:b,muted:true,playsInline:true,preload:armedB?\"auto\":\"none\",style:{...layer,opacity:0},children:sources(armedB)},vkey+\"|b\")]})]});}addPropertyControls(LoopVideo,{src:{type:ControlType.File,title:\"Video\",allowedFileTypes:[\"mp4\",\"webm\",\"mov\"]},srcUrl:{type:ControlType.String,title:\"Video URL\",defaultValue:\"\"},srcUrlMobile:{type:ControlType.String,title:\"Mobile URL\",defaultValue:\"\"},mobileMax:{type:ControlType.Number,title:\"Mobile max px\",defaultValue:810,min:320,max:1200},fit:{type:ControlType.Enum,title:\"Fit\",options:[\"cover\",\"contain\"],defaultValue:\"cover\"},radius:{type:ControlType.Number,title:\"Radius\",defaultValue:0,min:0,max:48},smooth:{type:ControlType.Boolean,title:\"Smooth loop\",defaultValue:true},fade:{type:ControlType.Number,title:\"Crossfade (s)\",defaultValue:1,min:.3,max:3,step:.1},poster:{type:ControlType.Image,title:\"Poster\",description:\"The cut's first frame, shown with the page and behind the video until it plays.\"},posterMobile:{type:ControlType.Image,title:\"Poster (mobile)\",description:\"First frame of the mobile cut; used at and below Mobile max px.\"},deferLoad:{type:ControlType.Boolean,title:\"Load after page\",defaultValue:true,description:\"Starts the video after the page has loaded, so it never competes with the first paint. Off = load immediately.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"LoopVideo\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LoopVideo.map"],"mappings":"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"}