{"version":3,"file":"HeroVideoAlt.DeQfLLYm.mjs","names":["React.useRef","React.useState","React.useCallback"],"sources":["https:/framerusercontent.com/modules/Kb1kgT33TI0Ht9DP2NZM/fOo4dTDF9mLtEC7r5LP9/HeroVideoAlt.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import*as React from\"react\";import{addPropertyControls,ControlType}from\"framer\";/**\n * Full-height hero background for public, direct video URLs (Cloudflare R2).\n * Autoplays muted, loops, and crops to fill the available width at 100vh.\n * Starts loading within 300px of the viewport. Optional WebVTT captions.\n */export function HeroVideo({videoUrl=\"\",posterFile=\"\",showSubtitles=false,subtitlesUrl=\"\",style}){const wrapperRef=React.useRef(null);const[shouldLoadVideo,setShouldLoadVideo]=React.useState(false);const source=videoUrl.trim();const captions=subtitlesUrl.trim();React.useEffect(()=>{const wrapper=wrapperRef.current;if(!wrapper)return;if(typeof IntersectionObserver===\"undefined\"){setShouldLoadVideo(true);return;}const observer=new IntersectionObserver(([entry])=>{if(entry.isIntersecting){setShouldLoadVideo(true);observer.disconnect();}},{rootMargin:\"300px\",threshold:.01});observer.observe(wrapper);return()=>observer.disconnect();},[]);return /*#__PURE__*/_jsx(\"div\",{ref:wrapperRef,style:{...wrapperStyle,...style,height:\"100vh\",flexShrink:0,overflow:\"hidden\",...posterFile?{backgroundImage:`url(${JSON.stringify(posterFile)})`,backgroundSize:\"cover\",backgroundPosition:\"center\"}:{}},children:shouldLoadVideo&&source&&/*#__PURE__*/_jsx(VideoSurface,{source:source,poster:posterFile,captions:captions,showSubtitles:showSubtitles},`${source}|${captions}`)});}function VideoSurface({source,poster,captions,showSubtitles}){const videoRef=React.useRef(null);const[failed,setFailed]=React.useState(false);const syncCaptions=React.useCallback(()=>{const tracks=videoRef.current?.textTracks;if(!tracks)return;for(let i=0;i<tracks.length;i++){if(tracks[i].kind===\"captions\"||tracks[i].kind===\"subtitles\"){tracks[i].mode=showSubtitles?\"showing\":\"disabled\";}}},[showSubtitles]);React.useEffect(syncCaptions,[syncCaptions]);// Keep the wrapper's poster background visible if the video cannot load.\nif(failed)return null;return /*#__PURE__*/_jsx(\"video\",{ref:videoRef,src:source,poster:poster||undefined,style:videoStyle,autoPlay:true,muted:true,loop:true,playsInline:true,controls:false,preload:\"metadata\",crossOrigin:captions?\"anonymous\":undefined,disablePictureInPicture:true,\"aria-hidden\":!showSubtitles,onLoadedMetadata:syncCaptions,onError:()=>setFailed(true),children:captions&&/*#__PURE__*/_jsx(\"track\",{kind:\"captions\",src:captions,srcLang:\"en\",label:\"English\",default:showSubtitles,onLoad:syncCaptions})});}const wrapperStyle={position:\"relative\",width:\"100%\",height:\"100vh\",overflow:\"hidden\",backgroundColor:\"#000\"};const videoStyle={position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",objectFit:\"cover\",objectPosition:\"center\",display:\"block\",border:0,pointerEvents:\"none\"};addPropertyControls(HeroVideo,{videoUrl:{type:ControlType.String,title:\"Video URL\",defaultValue:\"\",placeholder:\"https://your-video-domain.com/hero.mp4\",description:\"Public, direct video file URL from Cloudflare R2.\"},posterFile:{type:ControlType.Image,title:\"Poster Image\",defaultValue:\"\"},showSubtitles:{type:ControlType.Boolean,title:\"Subtitles\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},subtitlesUrl:{type:ControlType.String,title:\"Captions URL\",defaultValue:\"\",placeholder:\"https://your-video-domain.com/captions.vtt\",description:\"Optional English WebVTT file. For cross-origin captions, enable CORS on both the video and captions files.\",hidden:props=>!props.showSubtitles}});\nexport const __FramerMetadata__ = {\"exports\":{\"HeroVideo\":{\"type\":\"reactComponent\",\"name\":\"HeroVideo\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./HeroVideoAlt.map"],"mappings":"gMAIG,SAAgB,EAAU,CAAC,WAAS,GAAG,aAAW,GAAG,gBAAc,GAAM,eAAa,GAAG,SAAO,CAAC,IAAM,EAAWA,EAAa,IAAI,EAAO,CAAC,EAAgB,GAAoBC,EAAe,EAAK,EAAQ,EAAO,EAAS,KAAK,EAAQ,EAAS,EAAa,KAAK,EAA6X,OAA3X,MAAoB,CAAC,IAAM,EAAQ,EAAW,QAAQ,GAAG,CAAC,EAAQ,OAAO,GAAG,OAAO,qBAAuB,IAAY,CAAC,EAAmB,EAAI,EAAE,MAAO,CAAC,IAAM,EAAS,IAAI,sBAAsB,CAAC,KAAS,CAAI,EAAM,iBAAgB,EAAmB,EAAI,EAAE,EAAS,WAAW,EAAG,EAAE,CAAC,WAAW,QAAQ,UAAU,GAAG,CAAC,EAA4B,OAA1B,EAAS,QAAQ,CAAO,MAAY,EAAS,WAAW,CAAE,EAAE,CAAC,CAAC,EAAsB,EAAK,MAAM,CAAC,IAAI,EAAW,MAAM,CAAC,GAAG,EAAa,GAAG,EAAM,OAAO,QAAQ,WAAW,EAAE,SAAS,SAAS,GAAG,EAAW,CAAC,gBAAgB,OAAO,KAAK,UAAU,CAAU,EAAE,GAAG,eAAe,QAAQ,mBAAmB,QAAQ,EAAE,CAAC,CAAC,EAAE,SAAS,GAAiB,GAAqB,EAAK,EAAa,CAAQ,SAAO,OAAO,EAAoB,WAAuB,eAAa,EAAE,GAAG,EAAO,GAAG,GAAU,CAAC,CAAC,CAAE,CAAC,SAAS,EAAa,CAAC,SAAO,SAAO,WAAS,iBAAe,CAAC,IAAM,EAASD,EAAa,IAAI,EAAO,CAAC,EAAO,GAAWC,EAAe,EAAK,EAAQ,EAAaC,MAAsB,CAAC,IAAM,EAAO,EAAS,SAAS,WAAe,KAAc,IAAI,IAAI,EAAE,EAAE,EAAE,EAAO,OAAO,KAAQ,EAAO,EAAE,CAAC,OAAO,YAAY,EAAO,EAAE,CAAC,OAAO,eAAa,EAAO,EAAE,CAAC,KAAK,EAAc,UAAU,WAAa,EAAE,CAAC,CAAa,CAAC,EAC36C,OAD66C,EAAgB,EAAa,CAAC,CAAY,CAAC,EAC3+C,EAAc,KAAyB,EAAK,QAAQ,CAAC,IAAI,EAAS,IAAI,EAAO,OAAO,GAAQ,IAAA,GAAU,MAAM,EAAW,SAAS,GAAK,MAAM,GAAK,KAAK,GAAK,YAAY,GAAK,SAAS,GAAM,QAAQ,WAAW,YAAY,EAAS,YAAY,IAAA,GAAU,wBAAwB,GAAK,cAAc,CAAC,EAAc,iBAAiB,EAAa,YAAY,EAAU,EAAI,EAAE,SAAS,GAAuB,EAAK,QAAQ,CAAC,KAAK,WAAW,IAAI,EAAS,QAAQ,KAAK,MAAM,UAAU,QAAQ,EAAc,OAAO,CAAY,CAAC,CAAC,CAAC,CAAE,qBAL3d,IAA4B,IAAoD,EAKkZ,EAAa,CAAC,SAAS,WAAW,MAAM,OAAO,OAAO,QAAQ,SAAS,SAAS,gBAAgB,MAAM,EAAQ,EAAW,CAAC,SAAS,WAAW,MAAM,EAAE,MAAM,OAAO,OAAO,OAAO,UAAU,QAAQ,eAAe,SAAS,QAAQ,QAAQ,OAAO,EAAE,cAAc,MAAM,EAAE,EAAoB,EAAU,CAAC,SAAS,CAAC,KAAK,EAAY,OAAO,MAAM,YAAY,aAAa,GAAG,YAAY,yCAAyC,YAAY,mDAAmD,EAAE,WAAW,CAAC,KAAK,EAAY,MAAM,MAAM,eAAe,aAAa,EAAE,EAAE,cAAc,CAAC,KAAK,EAAY,QAAQ,MAAM,YAAY,aAAa,GAAM,aAAa,KAAK,cAAc,KAAK,EAAE,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,eAAe,aAAa,GAAG,YAAY,6CAA6C,YAAY,6GAA6G,OAAO,GAAO,CAAC,EAAM,aAAa,CAAC,CAAC"}