{"version":3,"file":"WorkLoop.CL0y4ASI.mjs","names":["useRef"],"sources":["https:/framerusercontent.com/modules/l0yMODM0GfHYrqU8WjNR/EecHl1j0sDOMZYi95uwH/WorkLoop.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{forwardRef,useRef}from\"react\";import{RenderTarget}from\"framer\";// Work page — the same card motion as the home stage.\n//\n// withAppearCard     → the repeated \"Project Card\": fades and rises in when it enters the viewport.\n// withBendCover      → the card's \"Cover\" frame: edges bend with scroll speed, like the home slides.\nconst MAX_BEND=.05// strongest edge curve, as a fraction of the cover height\n;const BEND_STRENGTH=1// bend per (scroll px per frame / cover height)\n;const VELOCITY_SMOOTHING=.18// 0–1, how quickly the bend follows scroll speed\n;const APPEAR_DURATION=900;const APPEAR_OFFSET=60// px the card rises while fading in\n;const APPEAR_STAGGER=90// ms between cards that enter together\n;const POLYGON_POINTS=18;const cards=new Map;const covers=new Set;let raf=0;let prevScroll=0;let velocity=0;let observer=null;const clamp=(value,min,max)=>Math.min(max,Math.max(min,value));const easeOut=t=>1-Math.pow(1-t,3);function isCanvas(){return RenderTarget.current()===RenderTarget.canvas;}function prefersReducedMotion(){return window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches??false;}// Same band shape as the home slides: curved top and bottom edges.\nfunction bandPolygon(bend){const amount=Math.abs(bend);const down=bend>0;const top=[];const bottom=[];for(let i=0;i<=POLYGON_POINTS;i++){const u=i/POLYGON_POINTS;const bump=4*u*(1-u);const x=(u*100).toFixed(2);const topY=(down?amount*bump:amount*(1-bump))*100;const bottomY=100-(down?amount*(1-bump):amount*bump)*100;top.push(`${x}% ${topY.toFixed(2)}%`);bottom.unshift(`${x}% ${bottomY.toFixed(2)}%`);}return`polygon(${top.concat(bottom).join(\", \")})`;}function getObserver(){if(observer||typeof IntersectionObserver===\"undefined\")return observer;observer=new IntersectionObserver(entries=>{const now=performance.now();let order=0;entries.forEach(entry=>{const state=cards.get(entry.target);if(!state||state.revealAt!==null||!entry.isIntersecting)return;state.revealAt=now+order*APPEAR_STAGGER;order++;observer?.unobserve(entry.target);});},{threshold:.1});return observer;}function frame(now){const reduced=prefersReducedMotion();const scroll=window.scrollY;const raw=scroll-prevScroll;prevScroll=scroll;velocity+=(raw-velocity)*VELOCITY_SMOOTHING;if(Math.abs(velocity)<.01)velocity=0;// Bend covers with scroll speed.\ncovers.forEach(el=>{const height=el.offsetHeight||1;const bend=reduced?0:clamp(-velocity/height*BEND_STRENGTH,-MAX_BEND,MAX_BEND);const last=Number(el.dataset.bend??Number.NaN);if(!(Math.abs(bend-last)<=4e-4)){el.dataset.bend=bend.toFixed(4);el.style.clipPath=bandPolygon(bend);el.style.willChange=\"clip-path\";}});// Fade and rise cards in.\ncards.forEach((state,el)=>{let progress=0;if(reduced)progress=state.revealAt===null?0:1;else if(state.revealAt!==null)progress=easeOut(clamp((now-state.revealAt)/APPEAR_DURATION,0,1));if(el.dataset.appear===progress.toFixed(3))return;el.dataset.appear=progress.toFixed(3);el.style.opacity=progress.toFixed(3);el.style.transform=progress>=1?\"\":`translate3d(0, ${((1-progress)*APPEAR_OFFSET).toFixed(2)}px, 0)`;});raf=window.requestAnimationFrame(frame);}function ensureRunning(){if(raf||typeof window===\"undefined\")return;prevScroll=window.scrollY;raf=window.requestAnimationFrame(frame);}function stopIfIdle(){if(cards.size===0&&covers.size===0&&raf){window.cancelAnimationFrame(raf);raf=0;}}function assignRef(ref,value){if(typeof ref===\"function\")ref(value);else if(ref&&typeof ref===\"object\")ref.current=value;}// Tracks the element a callback ref is attached to, so it can be unregistered on change.\nfunction useElementRegistry(register,unregister){const current=useRef(null);return el=>{if(current.current===el)return;if(current.current)unregister(current.current);current.current=el;if(el)register(el);if(el)ensureRunning();else stopIfIdle();};}export function withAppearCard(Component){return /*#__PURE__*/forwardRef(function AppearCard(props,ref){const track=useElementRegistry(el=>{cards.set(el,{revealAt:null});getObserver()?.observe(el);},el=>{cards.delete(el);observer?.unobserve(el);});if(isCanvas())return /*#__PURE__*/_jsx(Component,{ref:ref,...props});return /*#__PURE__*/_jsx(Component,{...props,ref:el=>{track(el);assignRef(ref,el);}});});}export function withBendCover(Component){return /*#__PURE__*/forwardRef(function BendCover(props,ref){const track=useElementRegistry(el=>covers.add(el),el=>covers.delete(el));if(isCanvas())return /*#__PURE__*/_jsx(Component,{ref:ref,...props});return /*#__PURE__*/_jsx(Component,{...props,ref:el=>{track(el);assignRef(ref,el);}});});}\nexport const __FramerMetadata__ = {\"exports\":{\"withAppearCard\":{\"type\":\"reactHoc\",\"name\":\"withAppearCard\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withBendCover\":{\"type\":\"reactHoc\",\"name\":\"withBendCover\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./WorkLoop.map"],"mappings":"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"}