{"version":3,"file":"BackNav.CtdJvlRp.mjs","names":["React.useState"],"sources":["https:/framerusercontent.com/modules/zU36YQ7RXtHs4CkPKslb/uryH04OsavWGEk82q9C9/CmsCaseStudies.js","https:/framerusercontent.com/modules/NaVM54w8Ymh9lTyfHrMz/9muDJnVqpvYKVtb4ddx8/BackNav.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import*as React from\"react\";import{addPropertyControls,ControlType}from\"framer\";const isServer=typeof window===\"undefined\";const REG=new Map;const listeners=new Set;// Server: entries older than this belong to an earlier render (an earlier publish), so they don't count\nconst FRESH_MS=15e3;let wake=null;let waiting=null;let gaveUpAt=0;function register(it){// Delete then set, so the map's order is the order of the latest render: the collection's order\nREG.delete(it.slug);REG.set(it.slug,{...it,at:Date.now()});if(wake){const w=wake;wake=null;setTimeout(w,0);}if(!isServer&&!notifying){notifying=true;queueMicrotask(()=>{notifying=false;listeners.forEach(l=>l());});}}let notifying=false;const idOf=(slug,project)=>project&&slug.startsWith(project+\"-\")?slug.slice(project.length+1):slug;function fromDom(){if(isServer||typeof document===\"undefined\")return[];const out=[],seen=new Set;document.querySelectorAll(\"[data-cs-item]\").forEach(n=>{const slug=n.getAttribute(\"data-cs-item\")||\"\";if(!slug||seen.has(slug))return;seen.add(slug);const project=n.getAttribute(\"data-cs-project\")||\"\";out.push({slug,project,id:idOf(slug,project),title:n.getAttribute(\"data-cs-title\")||\"\",outcome:n.getAttribute(\"data-cs-outcome\")||\"\"});});return out;}/** Every live case study, in the collection's order, or null when there's no CMS data on this page */export function liveCaseStudies(){if(isServer){const now=Date.now();const fresh=[...REG.values()].filter(e=>now-e.at<FRESH_MS);return fresh.length?fresh.map(({at,...c})=>c):null;}const dom=fromDom();if(dom.length)return dom;return REG.size?[...REG.values()].map(({at,...c})=>c):null;}/** One project's live case studies (possibly none), or null when there's no CMS data on this page */export function liveFor(project){const all=liveCaseStudies();return all?all.filter(c=>c.project===project):null;}/* Server only: suspend until the page's data list has registered, so the HTML has the CMS list in it */function waitOnServer(){if(!isServer||liveCaseStudies())return;if(Date.now()-gaveUpAt<1e3)return;if(!waiting){waiting=new Promise(res=>{wake=()=>{waiting=null;res();};setTimeout(()=>{if(waiting){gaveUpAt=Date.now();waiting=null;wake=null;res();}},4e3);});}throw waiting;}/** For React components: the live list (null: none on the page), kept up to date as items register */export function useLiveCaseStudies(project){waitOnServer();const[,bump]=React.useState(0);React.useEffect(()=>{const l=()=>bump(n=>n+1);listeners.add(l);// Anything that registered between the server render and now\nl();return()=>{listeners.delete(l);};},[]);return project?liveFor(project):liveCaseStudies();}/** Subscribe outside React (code overrides): called when items register */export function onCaseStudies(l){listeners.add(l);return()=>{listeners.delete(l);};}/**\n * The item inside the hidden \"Mini case studies data\" collection list. Bind each control to the CMS field of the\n * same name. It shows nothing.\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */export default function CaseStudyItem(props){const project=(props.project||\"\").trim().toLowerCase();const slug=(props.slug||\"\").trim();const it={slug,project,id:idOf(slug,project),title:(props.title||\"\").trim(),outcome:(props.outcome||\"\").trim()};// Registering during render is deliberate: on the server there is no effect phase\nif(slug&&project)register(it);return /*#__PURE__*/_jsx(\"span\",{hidden:true,\"data-cs-item\":slug,\"data-cs-project\":project,\"data-cs-title\":it.title,\"data-cs-outcome\":it.outcome});}addPropertyControls(CaseStudyItem,{slug:{type:ControlType.String,title:\"Slug\"},project:{type:ControlType.String,title:\"Project\"},title:{type:ControlType.String,title:\"Title\"},outcome:{type:ControlType.String,title:\"Outcome\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"liveCaseStudies\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useLiveCaseStudies\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"CaseStudy\":{\"type\":\"tsType\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"liveFor\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"reactComponent\",\"name\":\"CaseStudyItem\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any\",\"framerSupportedLayoutHeight\":\"any\"}},\"onCaseStudies\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./CmsCaseStudies.map","// Back navigation, site wide. Imported for its side effects by FoilCard.tsx and MiniCaseStudy.tsx (no component).\n// - Framer plays no page effect on Back (the page just cuts). Going back now plays the forward effect in reverse:\n//   Framer's own keyframes from the last forward change, copied and run backwards (the site's effect until then).\n//   Reduced motion: nothing (Framer skips page effects then, and the rules sit behind no-preference).\n//   Each history entry remembers the effect that brought it in (0 when Framer played none, e.g. the home page card\n//   that grows into the project picture), and Back from it plays exactly that, reversed.\n// - When the browser already animated the back (iOS Safari swipe, trackpad swipe, Android predictive back:\n//   popstate's hasUAVisualTransition), the page changes with no effect of our own, so it never plays twice.\n// - Back to the home page from a project page: the project picture shrinks back into its card.\n// - navUp(): the next page change is \"up\" (a case study opened from a shared link going to its project), so it\n//   animates as a back and the new history entry is marked: Back on that page goes up again instead of returning.\n// State lives on window, because Framer can load this module more than once (one copy per importing file).\nconst KF_DEFAULT={enter:\"0% { opacity: 0; transform: scale(1.02); } 100% { opacity: 1; transform: none; }\",exit:\"0% { opacity: 1; transform: none; } 100% { opacity: 0; transform: scale(0.98); }\",timing:\"0.2s cubic-bezier(0.27, 0, 0.51, 1) 0s\"};const backCss=k=>`@keyframes bw-enter { ${k.enter} }\n@keyframes bw-exit { ${k.exit} }\n@media (prefers-reduced-motion: no-preference) {\n:root[data-bw-nav=\"back\"]::view-transition-old(root) { animation: ${k.timing} 1 reverse both bw-enter !important; }\n:root[data-bw-nav=\"back\"]::view-transition-new(root) { animation: ${k.timing} 1 reverse both bw-exit !important; }\n}`;/* The forward effect Framer just injected: its keyframes and the old page's duration, easing and delay */function readForward(){let enter=\"\",exit=\"\",timing=\"\";for(const sh of Array.from(document.styleSheets)){let rules=[];try{rules=Array.from(sh.cssRules);}catch{continue;}for(const r of rules){const t=r.cssText;if(r instanceof CSSKeyframesRule&&r.name===\"view-transition-enter\")enter=t.slice(t.indexOf(\"{\")+1,t.lastIndexOf(\"}\"));if(r instanceof CSSKeyframesRule&&r.name===\"view-transition-exit\")exit=t.slice(t.indexOf(\"{\")+1,t.lastIndexOf(\"}\"));if(r instanceof CSSStyleRule&&/^::view-transition-old\\(root\\)$/.test(r.selectorText.trim())&&r.style.animationDuration)timing=`${r.style.animationDuration} ${r.style.animationTimingFunction||\"ease\"} ${r.style.animationDelay||\"0s\"}`;}}return enter&&exit?{enter,exit,timing:timing||KF_DEFAULT.timing}:null;}const stamp=s=>typeof s?.bwT===\"number\"?s.bwT:parseInt(String(s?.entryId||\"\").split(\"-\")[0],36)||0;const S=()=>window.__bwNav??={cur:0,pop:null,up:false};function morphBack(from){const m=/^\\/projects\\/([^/?#]+)/.exec(from);if(!m||location.pathname!==\"/\")return;const card=[...document.querySelectorAll(\"[data-foil-card]\")].find(c=>c.getClientRects().length&&/projects\\/([^/?#]+)/.exec(c.getAttribute(\"href\")||\"\")?.[1]===m[1]);if(!card)return;const r=card.getBoundingClientRect();if(r.bottom<0||r.top>innerHeight)return;document.querySelectorAll(\"[data-ph-morph]\").forEach(n=>{n.style.viewTransitionName=\"\";n.removeAttribute(\"data-ph-morph\");});card.style.viewTransitionName=\"ph-art\";card.setAttribute(\"data-ph-morph\",\"\");}function install(){const w=window;if(w.__bwBackNav)return;w.__bwBackNav=true;const s=S();let fxs={};try{fxs=JSON.parse(sessionStorage.getItem(\"bw-fx\")||\"{}\")||{};}catch{}const st=document.createElement(\"style\");st.setAttribute(\"data-bw-backnav\",\"\");document.head.append(st);if(typeof history.state?.bwT!==\"number\"){try{history.replaceState({...history.state||{},bwT:stamp(history.state)},\"\");}catch{}}s.cur=stamp(history.state);const push=history.pushState;history.pushState=function(state,t,u){const next={...state&&typeof state===\"object\"?state:{},bwT:Date.now(),...s.up?{bwUp:1}:{}};const r=push.call(this,next,t,u);s.cur=next.bwT;return r;};addEventListener(\"popstate\",e=>{const to=stamp(e.state);s.pop={dir:to<s.cur?\"back\":\"forward\",ua:!!e.hasUAVisualTransition,t:performance.now(),from:s.cur};s.cur=to;},true);const start=document.startViewTransition?.bind(document);if(!start)return;document.startViewTransition=arg=>{const p=s.pop&&performance.now()-s.pop.t<1500?s.pop:null;const dir=p?p.dir:s.up?\"back\":\"forward\";const leaving=p?p.from:s.cur;s.pop=null;s.up=false;const update=typeof arg===\"function\"?arg:arg?.update;if(p?.ua){const t=start(arg);t.skipTransition?.();return t;}const root=document.documentElement,from=location.pathname;if(dir===\"back\"){// The effect that brought the page we're leaving in, reversed (the site's effect when it isn't known)\nconst fx=fxs[leaving]??KF_DEFAULT;st.textContent=fx?backCss(fx):\"\";root.setAttribute(\"data-bw-nav\",\"back\");}else root.removeAttribute(\"data-bw-nav\");const t=start(async()=>{const r=await update?.();s.cur=stamp(history.state);if(dir===\"back\")morphBack(from);return r;});// Forward: the new entry remembers Framer's effect (or that there was none), so Back from it can reverse it\nif(dir===\"forward\")t.ready.then(()=>{const played=document.getAnimations().some(a=>a.effect?.pseudoElement===\"::view-transition-old(root)\");fxs[stamp(history.state)]=played?readForward()??KF_DEFAULT:0;try{sessionStorage.setItem(\"bw-fx\",JSON.stringify(fxs));}catch{}},()=>{});const done=()=>{if(root.getAttribute(\"data-bw-nav\")===dir)root.removeAttribute(\"data-bw-nav\");};t.finished.then(done,done);return t;};}if(typeof window!==\"undefined\"&&typeof document!==\"undefined\")install();/* The next page change goes up a level (a fallback, not a return): it animates as a back, and its history entry\n   says so, so that page's Back goes up again rather than returning here. Also marks the entry once the address\n   changes, in case the page change doesn't come through pushState */export function navUp(){if(typeof window===\"undefined\")return;const s=S();s.up=true;const from=location.pathname,t0=performance.now();const check=()=>{if(location.pathname!==from){setTimeout(()=>{s.up=false;},1e3);if(!history.state?.bwUp){try{history.replaceState({...history.state||{},bwUp:1},\"\");}catch{}}return;}if(performance.now()-t0<4e3)requestAnimationFrame(check);else s.up=false;};requestAnimationFrame(check);}/* This history entry was reached by going up (see navUp) */export const cameUp=()=>typeof window!==\"undefined\"&&!!history.state?.bwUp;\nexport const __FramerMetadata__ = {\"exports\":{\"cameUp\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"navUp\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./BackNav.map"],"mappings":"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"}