{"version":3,"file":"PageSnap.BNKnnxo7.mjs","names":["useRef","__esmMin","init_npm_react_18_3_1","init_ssg_sandbox_shims","window","c","init_jsx_runtime","ce","de","init_framer_DymZktPS","RenderTarget","ControlType","addPropertyControls","PageSnap","enabled","props","stopAlways","keepStopAtShowcase","assistWheel","freeFromEnd","endStopIds","splitIdsProp","ref","marker","touchOnly","wheelAssist","idList","s","x","endIds","splitIds","root","reducedMotion","restoreScrollTo","nativeScrollTo","raf","styleEl","finish","glideTo","from","max","dist","top","duration","t0","step","p","now","eased","o","a","b","countable","el","cs","findSection","split","PHONE_MAX_WIDTH","list","out","parts","m","id","sections","container","node","sibling","groups","vh","current","currentH","flush","h","SMALL_TAIL","SMALL_TAIL_UP_TO","applied","clear","measure","stops","free","last","i","g","bottom","v","lo","hi","arr","endEl","endOn","setEnd","on","updateEnd","place","y","geo","freeFrom","apply","freeCount","target","holdsMarker","kids","k","sync","resting","ownedByShowcase","gliding","tail","settleTimer","failsafe","tailTimer","restTimer","snapOff","blocking","want","onWheel","endGlide","TAIL_MS","glide","nextStop","dir","onScroll","SETTLED_MS","lastTime","lastAbs","nativeSwipe","gap","abs","prevAbs","newSwipe","NEW_SWIPE_GAP_MS","next","lastWidth","onResize","debugBox","debugTimer","box","draw","vv","footer","endPlace","previousType","settle","settleLate","resizeTimer","observer","init_PageSnap"],"sources":["https:/framerusercontent.com/modules/Eh8ObEXJA2koYgtRLV97/sldLYALVZ30QQPR1as94/PageSnap.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{useEffect,useRef}from\"react\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";const NEW_SWIPE_GAP_MS=120// a pause this long means a new scroll has started\n;const TAIL_MS=700// after a move, the coasting of the swipe that started it is ignored for this long\n;const SETTLED_MS=140// the page counts as having arrived when it has not scrolled for this long\n;const PHONE_MAX_WIDTH=809// `splitIds` only works on a screen this narrow or narrower\n;const SMALL_TAIL=.3// on a touch screen: a short section under this fraction of the screen's height ...\n;const SMALL_TAIL_UP_TO=1.25// ... still joins the page before it if together they are no taller than this fraction\n;/**\n * Page-by-page scrolling with the browser's own scroll snapping (CSS `scroll-snap-type: y mandatory`\n * on the page), like mosche.co: the page can only rest at a few places, and the browser does the\n * moving itself, off the main thread, so it stays light however busy the page is.\n *  - The sections of the page are put into pages: a section a screen or more tall is a page of its\n *    own (top aligned; if it is taller than the screen the page can rest anywhere inside it, e.g. a\n *    pinned, scroll-driven block); neighbouring shorter sections that fit on one screen together are\n *    one page, centred on the screen (on a touch screen: top aligned, see below). The last page (the footer) is aligned\n *    to the bottom so the very end of the page can be reached.\n *  - `stopAlways`: on, a fast swipe can't fly past a page, it stops at the next one. Off, a strong\n *    swipe can carry the page past several pages (as on mosche.co): the browser lands on the page\n *    its momentum points to. With `keepStopAtShowcase` the page this component sits in (the showcase)\n *    always stops the page even then, so it is never skipped.\n *  - `assistWheel`: on, while the page rests on a page, the first wheel event of a scroll is taken\n *    over and the page is moved on to the next / previous page straight away with the browser's own\n *    smooth scroll. That makes every scroll exactly one page (no stumbling on a short scroll), but\n *    also stops a strong swipe from covering several pages. Off, the browser alone decides (a single\n *    notch of a mouse wheel may spring back to where it was, as on mosche.co).\n *  - The showcase's one-work-per-scroll moves the page on itself through `window.__miscPageGo`.\n * Put it in any section of the page (it draws nothing); all the sections are found from it, and so\n * is whatever comes after them (the footer). On touch screens (a phone, a tablet) the snapping is the\n * browser's own and nothing else: no wheel handling, a flick of the finger simply comes to rest on a page\n * (with `stopAlways` on, on the next one). There a short page is not centred but top aligned, and the places are\n * not worked out again when only the height of the screen changes (the browser's address bar sliding in and out):\n * both would make the page nudge to a new place right after it has come to rest. A small section (a link row, under\n * 30% of the screen) that would just not fit on the page before it still joins that page (up to 125% of the screen\n * together), so it never becomes a page of its own with empty space under it. The Framer canvas is left alone.\n *\n * On a touch screen a page that snaps refuses the browser's own smooth scroll (`window.scrollTo({ behavior: \"smooth\" })`:\n * a link that scrolls to a section, the menu's links did nothing). So there that call is taken over: the page is moved\n * by this component frame by frame with an eased curve, the snapping switched off while it moves and on again at the end.\n * A touch on the screen stops it.\n *\n * On a touch screen the last pages that fit on a screen (at most `freeFromEnd` of them: with the landing page \"Who We\n * Work With\", the newsletter and the footer) are the end of the page, where it scrolls freely. The first of them is\n * still a place the page comes to rest on (it is how the page gets there from the tall block before it); from there on\n * the snapping is switched off, and it is on again as soon as the page is back a little above it. A phone's browser\n * (Safari) lets the page rest a little further down than the page's script can scroll to (room for its bar), and with\n * the snapping on it pulled the page back from there, which was seen as a nudge at the very end of the page.\n *\n * `splitIds` (phone width only, under 810px): ids of elements (e.g. a section marker's `elementId`) that sit inside one\n * wrapper section of the page. On a phone that wrapper is not one page: each of its own parts is a page (or short\n * parts together one), so the page comes to rest on every part, going down and coming back up. On wider screens the\n * wrapper stays one block.\n *\n * `endStopIds` (touch screens only): ids of elements that sit inside a block taller than the screen. The bottom of such\n * a block becomes a place the page comes to rest on as well, but only while the page is at or below it (inside the\n * block the page scrolls freely). Not needed when `splitIds` covers the block.\n *\n * Opening the page with `?snapdebug` at the end of its address shows a small readout of the numbers involved\n * (for checking the end of the page on a phone).\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */export default function PageSnap(props){const enabled=props.enabled??true;const stopAlways=props.stopAlways??true;const keepStopAtShowcase=props.keepStopAtShowcase??true;const assistWheel=props.assistWheel??true;const freeFromEnd=Math.max(0,Math.round(props.freeFromEnd??3));const endStopIds=props.endStopIds??\"\";const splitIdsProp=props.splitIds??\"\";const ref=useRef(null);useEffect(()=>{if(!enabled||typeof window===\"undefined\")return undefined;if(RenderTarget.current()===RenderTarget.canvas)return undefined;const marker=ref.current;if(!marker)return undefined;// On a touch screen only the browser's snapping is used (no wheel at all).\nconst touchOnly=!!window.matchMedia&&window.matchMedia(\"(hover: none)\").matches;const wheelAssist=assistWheel&&!touchOnly;const idList=s=>s.split(\",\").map(x=>x.trim()).filter(Boolean);const endIds=idList(endStopIds);const splitIds=idList(splitIdsProp);const root=document.documentElement;const reducedMotion=!!window.matchMedia&&window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;// On a touch screen: smooth scrolls asked for by other components (`window.scrollTo({ top, behavior: \"smooth\" })`)\n// are done here, frame by frame, with the snapping switched off by a style rule that outranks the page's own\n// (an inline style set by this component or another cannot undo it).\nlet restoreScrollTo=null;if(touchOnly&&!reducedMotion){const nativeScrollTo=window.scrollTo.bind(window);let raf=0;let styleEl=null;const finish=()=>{if(raf)window.cancelAnimationFrame(raf);raf=0;if(styleEl){styleEl.remove();styleEl=null;window.dispatchEvent(new Event(\"scroll\"));}};const glideTo=top=>{finish();const from=window.scrollY;const max=Math.max(root.scrollHeight-window.innerHeight,0);const to=Math.min(Math.max(top,0),max);const dist=to-from;if(Math.abs(dist)<2)return;styleEl=document.createElement(\"style\");styleEl.textContent=\"html { scroll-snap-type: none !important; }\";document.head.appendChild(styleEl);const duration=Math.min(1500,Math.max(600,450+Math.abs(dist)*.12));const t0=performance.now();const step=now=>{const p=Math.min(1,(now-t0)/duration);const eased=p<.5?4*p*p*p:1-Math.pow(-2*p+2,3)/2;nativeScrollTo({top:from+dist*eased,left:0,behavior:\"instant\"});if(p<1)raf=window.requestAnimationFrame(step);else finish();};raf=window.requestAnimationFrame(step);};window.scrollTo=(a,b)=>{const o=a;if(o&&typeof o===\"object\"&&o.behavior===\"smooth\"&&typeof o.top===\"number\")glideTo(o.top);else nativeScrollTo(a,b);};// A touch on the screen takes the page back into the user's hands.\nwindow.addEventListener(\"touchstart\",finish,{passive:true});restoreScrollTo=()=>{finish();window.scrollTo=nativeScrollTo;window.removeEventListener(\"touchstart\",finish);};}const countable=el=>{if(!(el instanceof HTMLElement))return false;if(/^(SCRIPT|STYLE|LINK|TEMPLATE|NOSCRIPT)$/.test(el.tagName))return false;const cs=getComputedStyle(el);return el.offsetHeight>0&&cs.position!==\"fixed\"&&cs.position!==\"absolute\";};// The sections of the page: the siblings of the screen-tall section this component sits in,\n// followed by everything that comes after them further up the tree (the footer).\nconst findSection=()=>{let el=marker.parentElement;while(el&&el!==document.body){if(el.offsetHeight>=window.innerHeight*.9)return el;el=el.parentElement;}return null;};// On a phone: a wrapper section that holds one of the `splitIds` is replaced by its own parts.\nconst split=list=>{if(!splitIds.length||window.innerWidth>PHONE_MAX_WIDTH)return list;const out=[];list.forEach(el=>{const holds=splitIds.some(id=>{const m=document.getElementById(id);return!!m&&m!==el&&el.contains(m);});const parts=holds?Array.from(el.children).filter(countable):[];if(parts.length>1)out.push(...parts);else out.push(el);});return out;};const sections=()=>{const s=findSection();if(!s||!s.parentElement)return[];const container=s.parentElement;const list=Array.from(container.children).filter(countable);let node=container;while(node&&node!==document.body&&node.parentElement){let sibling=node.nextElementSibling;while(sibling){if(countable(sibling))list.push(sibling);sibling=sibling.nextElementSibling;}node=node.parentElement;}return split(list);};// Pages: a tall section on its own, neighbouring short sections together while they fit on a screen.\nconst groups=()=>{const vh=window.innerHeight;const out=[];let current=[];let currentH=0;const flush=()=>{if(current.length)out.push({els:current,h:currentH});current=[];currentH=0;};sections().forEach(el=>{const h=el.offsetHeight;if(h>=vh*.95){flush();out.push({els:[el],h});return;}if(current.length&&currentH+h>vh*.95){// A small section (a link row) that only just does not fit still joins the page before it on a\n// touch screen, rather than becoming a page of its own with empty space under it.\nconst smallTail=touchOnly&&h<vh*SMALL_TAIL&&currentH+h<=vh*SMALL_TAIL_UP_TO;if(!smallTail)flush();}current.push(el);currentH+=h;});flush();return out;};const applied=[];const clear=()=>{applied.forEach(el=>{el.style.scrollSnapAlign=\"\";el.style.scrollMarginTop=\"\";el.style.removeProperty(\"scroll-snap-stop\");});applied.length=0;};// The places the page can rest: every page's snap offset, plus the last position at which a block\n// taller than the screen still fills it (the page can rest anywhere between that block's top and there).\nconst measure=list=>{const vh=window.innerHeight;const max=Math.max(root.scrollHeight-vh,0);const stops=[];const free=[];list.forEach((g,i)=>{const last=i===list.length-1;const top=g.els[0].getBoundingClientRect().top+window.scrollY;const bottom=top+g.h;const v=last?bottom-vh:g.h>=vh*.95||touchOnly?top:top-(vh-g.h)/2;stops.push(Math.round(Math.min(Math.max(v,0),max)));if(g.h>vh*1.05){const lo=Math.round(top);const hi=Math.round(Math.min(top+g.h-vh,max));if(hi>lo){free.push([lo,hi]);stops.push(hi);}}});const sorted=stops.sort((a,b)=>a-b).filter((v,i,arr)=>i===0||v!==arr[i-1]);return{stops:sorted,free};};// The element whose bottom is the end place of a tall block (see `endStopIds`), and whether that place is\n// switched on right now (only while the page is at or below it).\nlet endEl=null;let endOn=false;const setEnd=on=>{if(!endEl||on===endOn)return;endOn=on;if(on){endEl.style.scrollSnapAlign=\"end\";endEl.style.setProperty(\"scroll-snap-stop\",\"always\");}else{endEl.style.scrollSnapAlign=\"\";endEl.style.removeProperty(\"scroll-snap-stop\");}};const updateEnd=()=>{if(!endEl)return;const place=endEl.getBoundingClientRect().bottom+window.scrollY-window.innerHeight;const y=window.scrollY;if(!endOn&&y>=place-8)setEnd(true);else if(endOn&&y<place-60)setEnd(false);};// Measured now and whenever the page changes size, never while a scroll is under way.\nlet geo={stops:[],free:[]};// On a touch screen: the page's top edge of the first of the last pages, from which on the snapping is off\n// (Infinity: it never is).\nlet freeFrom=Infinity;const apply=()=>{clear();endEl=null;endOn=false;const vh=window.innerHeight;const list=groups();// On a touch screen: the last pages that fit on a screen (at most `freeFromEnd`) are the end of the page. The\n// first page always stays a place.\nlet freeCount=0;if(touchOnly){for(let i=list.length-1;i>=1&&freeCount<freeFromEnd;i--){if(list[i].h>=vh*.95)break;freeCount++;}}list.forEach((g,i)=>{// Only the first of the last pages is still a place; the ones after it are not.\nif(freeCount>0&&i>list.length-freeCount)return;const last=i===list.length-1;const target=last?g.els[g.els.length-1]:g.els[0];target.style.scrollSnapAlign=last?\"end\":\"start\";// A page that fits on the screen is centred: its top rests this far below the top of the screen.\n// (Not on a touch screen: the screen's height changes there with the address bar, and a centred\n// page would move with it.)\nif(!last&&!touchOnly&&g.h<vh*.95)target.style.scrollMarginTop=`${Math.round((vh-g.h)/2)}px`;// The page this component sits in (the showcase) can be kept as a place no swipe flies past.\nconst holdsMarker=g.els.some(el=>el.contains(marker));if(stopAlways||keepStopAtShowcase&&holdsMarker)target.style.setProperty(\"scroll-snap-stop\",\"always\");applied.push(target);// On a touch screen: a block taller than the screen that holds one of the `endStopIds` also has a place\n// at its bottom (its last part, aligned to the bottom of the screen), switched on by `updateEnd`.\nif(touchOnly&&!last&&!endEl&&g.els.length===1&&g.h>vh*1.05&&endIds.length){const holdsEnd=endIds.some(id=>{const m=document.getElementById(id);return!!m&&g.els[0].contains(m);});if(holdsEnd){const kids=Array.from(g.els[0].children);for(let k=kids.length-1;k>=0;k--){if(countable(kids[k])){endEl=kids[k];applied.push(endEl);break;}}}}});freeFrom=freeCount>0?list[list.length-freeCount].els[0].getBoundingClientRect().top+window.scrollY:Infinity;geo=measure(list);updateEnd();sync();};// The page resting on one of its pages (and not somewhere inside a tall block).\nconst resting=()=>{if(!geo.stops.length)return false;const y=window.scrollY;if(geo.free.some(([lo,hi])=>y>lo+2&&y<hi-2))return false;return geo.stops.some(v=>Math.abs(v-y)<=6);};// The showcase (the section this component sits in) takes the scroll for itself while the page\n// rests on it.\nconst ownedByShowcase=()=>{const s=findSection();if(!s||!s.querySelector(\"[data-misc-showcase-tile]\"))return false;return Math.abs(s.getBoundingClientRect().top)<=window.innerHeight*.06;};let gliding=false;let tail=false// the coasting after a move: ignored until a new swipe starts\n;let settleTimer=0;let failsafe=0;let tailTimer=0;let restTimer=0;// On a touch screen: the snapping is off because the page is in the last pages.\nlet snapOff=false;// The wheel listener has to be able to stop the page's own scroll, so the browser holds every\n// scroll back until it has run: it only exists while the page rests on a page or is on its way\n// (and never when `assistWheel` is off, or on a touch screen).\nlet blocking=false;function sync(){const want=wheelAssist&&(gliding||tail||resting()&&!ownedByShowcase());if(want&&!blocking){window.addEventListener(\"wheel\",onWheel,{passive:false});blocking=true;}else if(!want&&blocking){window.removeEventListener(\"wheel\",onWheel);blocking=false;}}const endGlide=()=>{window.clearTimeout(settleTimer);window.clearTimeout(failsafe);if(!gliding)return;gliding=false;tail=true;window.clearTimeout(tailTimer);tailTimer=window.setTimeout(()=>{tail=false;sync();},TAIL_MS);sync();};// Move the page on with the browser's own smooth scroll (the movement of its snapping).\nconst glide=target=>{if(Math.abs(target-window.scrollY)<2)return;window.clearTimeout(tailTimer);tail=false;gliding=true;sync();window.clearTimeout(settleTimer);window.clearTimeout(failsafe);window.scrollTo({top:target,behavior:reducedMotion?\"auto\":\"smooth\"});settleTimer=window.setTimeout(endGlide,450);// If scroll events stop for good (hidden tab), the page is never left locked.\nfailsafe=window.setTimeout(endGlide,1800);};const nextStop=dir=>{const y=window.scrollY;return dir>0?geo.stops.find(v=>v>y+2):[...geo.stops].reverse().find(v=>v<y-2);};// For components that step through their own content: move the page on to the next / previous place.\nwindow.__miscPageGo=dir=>{const target=nextStop(dir);if(target!==undefined)glide(target);};const onScroll=()=>{updateEnd();if(touchOnly&&freeFrom!==Infinity){// Past the top of the first of the last pages: the snapping is off. A little above it, on again.\nconst y=window.scrollY;if(!snapOff&&y>freeFrom+2){root.style.scrollSnapType=\"none\";snapOff=true;}else if(snapOff&&y<freeFrom-40){root.style.scrollSnapType=\"y mandatory\";snapOff=false;}}if(gliding){// Still on its way: arrived once it has not scrolled for a moment.\nwindow.clearTimeout(settleTimer);settleTimer=window.setTimeout(endGlide,SETTLED_MS);return;}// Scrolling by itself (inside a tall block, a swipe the browser handles): nothing in its way.\nif(blocking&&!tail&&!resting())sync();window.clearTimeout(restTimer);restTimer=window.setTimeout(sync,SETTLED_MS);};let lastTime=0;let lastAbs=0;let nativeSwipe=false// this swipe began where the page scrolls by itself: it stays that way\n;function onWheel(e){if(e.ctrlKey||e.deltaY===0||Math.abs(e.deltaX)>Math.abs(e.deltaY))return;const now=performance.now();const gap=now-lastTime;const abs=Math.abs(e.deltaY);const prevAbs=lastAbs;lastAbs=abs;lastTime=now;if(ownedByShowcase()){nativeSwipe=false;return;}if(gliding){e.preventDefault();return;}// A new swipe starts after a pause or with a clearly stronger push than the coasting before it.\nconst newSwipe=gap>=NEW_SWIPE_GAP_MS||abs>prevAbs*1.25+3;if(tail){if(!newSwipe){e.preventDefault();return;}tail=false;}if(nativeSwipe&&!newSwipe)return;const dir=e.deltaY>0?1:-1;let target=null;if(resting()){const next=nextStop(dir);// Far to the next place (the stretch through a tall block): the page scrolls by itself there.\nif(next!==undefined&&Math.abs(next-window.scrollY)<=window.innerHeight*1.3)target=next;}nativeSwipe=target===null;if(target===null)return;e.preventDefault();glide(target);}// On a touch screen the screen's height changes by itself (the address bar slides in and out): only a change\n// of its width (turning the phone) is worth working the places out again.\nlet lastWidth=window.innerWidth;const onResize=()=>{if(touchOnly&&window.innerWidth===lastWidth)return;lastWidth=window.innerWidth;apply();};// `?snapdebug`: a small readout of the numbers involved, for checking the end of the page on a phone.\nlet debugBox=null;let debugTimer=0;if(window.location.search.indexOf(\"snapdebug\")>=0){const box=document.createElement(\"div\");box.style.cssText=\"position:fixed;left:6px;top:96px;z-index:2147483647;padding:6px 8px;border-radius:6px;background:rgba(0,0,0,0.78);color:#fff;font:10px/1.35 ui-monospace,Menlo,monospace;white-space:pre;pointer-events:none\";document.body.appendChild(box);debugBox=box;const draw=()=>{const vv=window.visualViewport;const footer=document.querySelector(\"footer\");const max=Math.round(root.scrollHeight-window.innerHeight);const y=Math.round(window.scrollY);const endPlace=endEl?Math.round(endEl.getBoundingClientRect().bottom+window.scrollY-window.innerHeight):\"-\";box.textContent=[`y ${y}  max ${max}  extra ${y-max}`,`scrollH ${root.scrollHeight}  clientH ${root.clientHeight}`,`innerH ${window.innerHeight}  vvH ${vv?Math.round(vv.height):\"-\"}  screenH ${window.screen.height}`,`footerBottom ${footer?Math.round(footer.getBoundingClientRect().bottom):\"-\"}`,`touch ${touchOnly?\"yes\":\"no\"}  snap ${snapOff?\"off\":\"on\"}  freeFrom ${freeFrom===Infinity?\"-\":Math.round(freeFrom)}`,`endPlace ${endPlace}  ${endOn?\"on\":\"off\"}`,`stops ${geo.stops.join(\",\")}`].join(\"\\n\");};draw();debugTimer=window.setInterval(draw,120);}apply();const previousType=root.style.scrollSnapType;root.style.scrollSnapType=\"y mandatory\";window.addEventListener(\"resize\",onResize);window.addEventListener(\"scroll\",onScroll,{passive:true});// The sections can change height as the page settles (fonts, videos): re-measure now and then.\nconst settle=window.setTimeout(apply,1500);const settleLate=window.setTimeout(apply,4e3);let resizeTimer=0;const observer=typeof ResizeObserver!==\"undefined\"?new ResizeObserver(()=>{window.clearTimeout(resizeTimer);resizeTimer=window.setTimeout(()=>{if(!gliding)apply();},250);}):null;observer?.observe(document.body);return()=>{window.clearTimeout(settle);window.clearTimeout(settleLate);window.clearTimeout(resizeTimer);window.clearTimeout(settleTimer);window.clearTimeout(failsafe);window.clearTimeout(tailTimer);window.clearTimeout(restTimer);window.clearInterval(debugTimer);debugBox?.remove();observer?.disconnect();restoreScrollTo?.();window.removeEventListener(\"wheel\",onWheel);window.removeEventListener(\"scroll\",onScroll);window.removeEventListener(\"resize\",onResize);window.__miscPageGo=undefined;root.style.scrollSnapType=previousType;clear();};},[enabled,stopAlways,keepStopAtShowcase,assistWheel,freeFromEnd,endStopIds,splitIdsProp]);return /*#__PURE__*/_jsx(\"div\",{ref:ref,style:{width:1,height:1,pointerEvents:\"none\"}});}addPropertyControls(PageSnap,{enabled:{type:ControlType.Boolean,defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},stopAlways:{type:ControlType.Boolean,defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\",description:\"On: a fast swipe always stops at the next page instead of flying past several. Off: a strong swipe can skip pages (like mosche.co).\"},keepStopAtShowcase:{type:ControlType.Boolean,defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\",title:\"Always stop at showcase\",description:\"On: even when Stop always is off, the page this component sits in (the showcase) is never skipped.\"},assistWheel:{type:ControlType.Boolean,defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\",description:\"On: one scroll of the wheel / trackpad moves straight on to the next page (one page per scroll). Off: the browser decides, so a strong swipe can cover several pages. (Not used on touch screens.)\"},freeFromEnd:{type:ControlType.Number,defaultValue:3,min:0,max:8,step:1,title:\"Free pages at the end\",description:\"On a touch screen: at most how many of the last pages that fit on a screen (the landing page: Who We Work With, the newsletter, the footer) are the end of the page, where it scrolls freely (the first of them is still a place it rests on, from there the snapping is off). 0: all pages snap.\"},splitIds:{type:ControlType.String,defaultValue:\"\",title:\"Split on phone\",description:\"On a phone (under 810px): ids of elements inside a wrapper section (e.g. services). That wrapper is not one page there: each of its parts is a page, so the page rests on every part. Separate several with commas.\"},endStopIds:{type:ControlType.String,defaultValue:\"\",title:\"Stop at end of\",description:\"On a touch screen: ids of elements inside a block taller than the screen. The bottom of that block also becomes a place the page rests on while the page is at or below it (inside the block it scrolls freely). Not needed when Split on phone covers the block. Separate several with commas.\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"PageSnap\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"any\",\"framerSupportedLayoutWidth\":\"any\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./PageSnap.map"],"mappings":"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"}