{"version":3,"file":"ImageReveal.D1i7zK3H.mjs","names":["useRef","_Fragment"],"sources":["https:/framerusercontent.com/modules/e4COzxlaUbSh8RlkrjAt/EtbpCTnIj3vrGxjinT4o/ImageReveal.js"],"sourcesContent":["// NOIRÉ image motion — the Acre template's image overrides, carried over unchanged.\n// withImageRevealParallax: the image is uncovered by eight vertical bands that lift away one after another the first\n// time it enters the viewport, then drifts up to 28px against the scroll inside its frame.\n// The bands take the colour of the nearest ancestor background, so the reveal reads as the page opening onto the\n// photograph. Off under prefers-reduced-motion. Applied to every photograph layer in the template.\n// (Only change from Acre: the fallback band colour is NOIRÉ Ink instead of Acre cream.)\nimport{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{forwardRef,useEffect,useRef}from\"react\";import{RenderTarget}from\"framer\";const EASE=\"cubic-bezier(0.22, 0.7, 0.2, 1)\";const clamp=(v,a=0,b=1)=>Math.min(b,Math.max(a,v));const prefersReduced=()=>window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;/* One shared, frame-throttled scroll listener for every override on the page. */const subscribers=new Set;let queued=false;const flush=()=>{queued=false;subscribers.forEach(fn=>fn());};const request=()=>{if(!queued){queued=true;requestAnimationFrame(flush);}};function onScroll(fn){if(!subscribers.size){window.addEventListener(\"scroll\",request,{passive:true});window.addEventListener(\"resize\",request);}subscribers.add(fn);fn();return()=>{subscribers.delete(fn);if(!subscribers.size){window.removeEventListener(\"scroll\",request);window.removeEventListener(\"resize\",request);}};}/* Runs once when the element first enters the viewport. */function onEnter(el,fn){const io=new IntersectionObserver(([entry])=>{if(!entry.isIntersecting)return;fn();io.disconnect();},{threshold:.1,rootMargin:\"0px 0px -6% 0px\"});io.observe(el);return()=>io.disconnect();}const jobs=[];let flushing=false;const flushJobs=()=>{flushing=false;const batch=jobs.splice(0).filter(j=>!j.cancelled);const reads=batch.map(j=>j.setup.read(j.el));batch.forEach((j,i)=>{if(!j.cancelled)j.cleanup=j.setup.write(j.el,reads[i])||null;});};function wrap(Component,setup){return /*#__PURE__*/forwardRef((props,outer)=>{const ref=useRef(null);const marker=useRef(null);useEffect(()=>{if(RenderTarget.current()===RenderTarget.canvas)return;const el=ref.current instanceof HTMLElement?ref.current:(marker.current?.previousElementSibling);if(!el)return;const job={el,setup,cleanup:null,cancelled:false};jobs.push(job);if(!flushing){flushing=true;queueMicrotask(flushJobs);}return()=>{job.cancelled=true;if(job.cleanup)job.cleanup();};},[]);return /*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(Component,{...props,ref:node=>{ref.current=node;if(typeof outer===\"function\")outer(node);else if(outer)outer.current=node;}}),/*#__PURE__*/_jsx(\"span\",{ref:marker,hidden:true,style:{display:\"none\"}})]});});}/* ---------- Images ---------- */function imageLayer(el){return el.querySelector(\":scope > [data-framer-background-image-wrapper]\")||(el.querySelector(\"img\")?.parentElement??null);}const drifts=new Map;let driftIO=null;let driftY=NaN;const driftFrame=()=>{if(window.scrollY===driftY&&!resized)return;// one pass per scroll position (several events per frame)\ndriftY=window.scrollY;resized=false;const vh=window.innerHeight;const reads=[];drifts.forEach((d,el)=>{if(d.on)reads.push([d,el.getBoundingClientRect()]);});for(const[d,b]of reads){const y=Math.round((b.top+b.height/2-vh/2)/vh*-280)/10// −28 px … +28 px, 0.1 px steps\n;if(y!==d.last){d.last=y;d.layer.style.transform=`translate3d(0, ${y}px, 0) scale(1.12)`;}}};let resized=false;const onResize=()=>{resized=true;driftFrame();};const parallaxRead=el=>({layer:imageLayer(el),visible:getComputedStyle(el).overflow===\"visible\"});function parallax(el,r){const layer=r.layer;if(!layer||prefersReduced())return()=>{};// The 1.12 scale must stay inside the frame: a frame that does not clip (a grid tile, a plain image layer) would\n// let the photo spill over its gap and onto its neighbours.\nif(r.visible)el.style.overflow=\"hidden\";layer.style.transition=\"none\";if(!driftIO){driftIO=new IntersectionObserver(entries=>{for(const e of entries){const d=drifts.get(e.target);if(!d)continue;d.on=e.isIntersecting;d.layer.style.willChange=d.on?\"transform\":\"\"// compositor layers only for what is on screen\n;}resized=true;driftFrame();},{rootMargin:\"25% 0px 25% 0px\"});window.addEventListener(\"scroll\",driftFrame,{passive:true});window.addEventListener(\"resize\",onResize);}drifts.set(el,{layer,on:false,last:NaN});driftIO.observe(el);return()=>{driftIO?.unobserve(el);drifts.delete(el);if(!drifts.size&&driftIO){driftIO.disconnect();driftIO=null;window.removeEventListener(\"scroll\",driftFrame);window.removeEventListener(\"resize\",onResize);}};}// The image is uncovered by eight vertical bands that lift away one after another.\n// The bands take the nearest ancestor background. Cached per ancestor: photographs in one section share their parents,\n// so each parent's colour is read once for all of them.\nconst bgCache=new WeakMap;function bandColour(el){const walked=[];let color=\"#0D0C0A\";for(let p=el.parentElement;p;p=p.parentElement){const known=bgCache.get(p);if(known!==undefined){color=known;break;}walked.push(p);const bg=getComputedStyle(p).backgroundColor;if(bg&&!/rgba\\(.*,\\s*0\\)$/.test(bg)&&bg!==\"transparent\"){color=bg;break;}}walked.forEach(p=>bgCache.set(p,color));return color;}function shutter(el,color){if(prefersReduced())return()=>{};const cover=document.createElement(\"span\");cover.setAttribute(\"aria-hidden\",\"true\");cover.style.cssText=\"position:absolute;inset:-1px;z-index:3;display:flex;pointer-events:none\";const bands=Array.from({length:8},(_,i)=>{const band=document.createElement(\"i\");band.style.cssText=`flex:1;margin-right:-1px;background:${color};transform-origin:top;transition:transform .75s ${EASE} ${i*45+60}ms`;cover.appendChild(band);return band;});el.appendChild(cover);const stop=onEnter(el,()=>bands.forEach(b=>b.style.transform=\"scaleY(0)\"));return()=>{stop();cover.remove();};}export function withImageRevealParallax(Component){return wrap(Component,{read:el=>({color:prefersReduced()?\"\":bandColour(el),p:parallaxRead(el)}),write:(el,r)=>{const a=shutter(el,r.color);const b=parallax(el,r.p);return()=>{a();b();};}});}\nexport const __FramerMetadata__ = {\"exports\":{\"withImageRevealParallax\":{\"type\":\"reactHoc\",\"name\":\"withImageRevealParallax\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ImageReveal.map"],"mappings":"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"}