{"version":3,"file":"TestimonialRail.CgOvgvLm.mjs","names":["useState","useRef","useLayoutEffect","useEffect"],"sources":["https:/framerusercontent.com/modules/cIhE2zaa3bbIn8uMv8zB/2TjrTyi5INpoojm8GTFo/TestimonialRail.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useEffect,useLayoutEffect,useRef,useState}from\"react\";import{createPortal}from\"react-dom\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";// ── Easing: the project curve, cubic-bezier(.2, 0, .15, 1) ────────────────\nconst CURVE=\"cubic-bezier(0.2, 0, 0.15, 1)\";// The placement effect MUST run before paint. A plain useEffect paints the new\n// slot's transform first, with the transition still armed, so the card travels\n// across the stage instead of being parked off it. Guarded because layout\n// effects warn during server rendering.\nconst useIsoLayoutEffect=typeof window!==\"undefined\"?useLayoutEffect:useEffect;/**\n * The five visible slots: centre 349x480, sides 291x400, edges 233x320. `dx`\n * is the slot's centre relative to the rail's. `sat` rides the same transition\n * as the other channels, so colour drains and returns over `slide` seconds.\n */const SLOTS_DESKTOP=[{dx:-694,w:233,h:320,opacity:.1,sat:0},{dx:-376,w:291,h:400,opacity:.3,sat:0},{dx:0,w:349,h:480,opacity:1,sat:1},{dx:376,w:291,h:400,opacity:.3,sat:0},{dx:694,w:233,h:320,opacity:.1,sat:0}];const SLOTS_MOBILE=[{dx:-484.5,w:175,h:240,opacity:.1,sat:0},{dx:-264,w:218,h:300,opacity:.3,sat:0},{dx:0,w:262,h:360,opacity:1,sat:1},{dx:264,w:218,h:300,opacity:.3,sat:0},{dx:484.5,w:175,h:240,opacity:.1,sat:0}];// Where a wrapping item is parked, off screen, before it slides in.\nconst OFFSTAGE=1100;// A fixed eight-second window, muted, on loop. A full-length clip would never\n// reach its end within a slide's hold, so every pass would show a different\n// arbitrary stretch; a fixed window is the same motion each time round.\nconst VIDEO_WINDOW=8;// ico-play-16. Inlined rather than fetched: one <svg> beats a request, and the\n// fill follows `currentColor` so the chip owns the colour.\nconst PlayGlyph=({size=16})=>/*#__PURE__*/_jsx(\"svg\",{width:size,height:size,viewBox:\"0 0 16 16\",fill:\"none\",\"aria-hidden\":\"true\",style:{display:\"block\"},children:/*#__PURE__*/_jsx(\"path\",{d:\"M5.5266 2.26535C4.43727 1.56049 3 2.3424 3 3.63988V12.3601C3 13.6576 4.43727 14.4395 5.5266 13.7346L12.265 9.37453C13.262 8.72941 13.262 7.27064 12.265 6.62547L5.5266 2.26535Z\",fill:\"currentColor\"})});// ico-close-16. The exported file wraps the path in a clipPath at the full\n// 16×16; the stroke is already inside those bounds, so it clips nothing and is\n// dropped — a duplicated clipPath id across two instances is a real hazard.\nconst CloseGlyph=({size=16})=>/*#__PURE__*/_jsx(\"svg\",{width:size,height:size,viewBox:\"0 0 16 16\",fill:\"none\",\"aria-hidden\":\"true\",style:{display:\"block\"},children:/*#__PURE__*/_jsx(\"path\",{d:\"M3.1665 3.16669L12.8332 12.8334M12.8332 3.16669L3.1665 12.8334\",stroke:\"currentColor\",strokeWidth:\"1.5\",strokeLinecap:\"round\"})});/**\n * Where the whole clip plays, with sound and controls — the card's own video is\n * a muted eight-second taste.\n *\n * PORTAL because `position: fixed` is only fixed to the viewport while no\n * ancestor has a transform, filter or will-change. The rail sits inside the\n * scroll-reveal wrappers, which animate transform, so an overlay rendered in\n * place would pin to the section instead of the screen.\n */const VideoLightbox=({item,onClose})=>{const ref=useRef(null);// `onClose` is an inline arrow in the parent, so it is a new function on\n// every render. Held in a ref, the mount effect below can depend on\n// nothing and still call the current one.\nconst closeRef=useRef(onClose);closeRef.current=onClose;// Mount only. With `onClose` in the dependency list this re-ran on every\n// parent render and called play() again — which, on a clip that had\n// already finished, restarted it from zero and read as a loop.\nuseEffect(()=>{const onKey=e=>{if(e.key===\"Escape\")closeRef.current();};window.addEventListener(\"keydown\",onKey);// The page must not scroll behind the overlay; restore whatever was\n// there rather than assuming \"visible\".\nconst prevOverflow=document.body.style.overflow;document.body.style.overflow=\"hidden\";// The click that opened this is the user gesture that permits sound,\n// but a rejected play() is still normal and must not throw.\nref.current?.play?.().catch(()=>{});return()=>{window.removeEventListener(\"keydown\",onKey);document.body.style.overflow=prevOverflow;};},[]);if(typeof document===\"undefined\")return null;return /*#__PURE__*/createPortal(/*#__PURE__*/_jsxs(\"div\",{// THE BACKDROP DOES NOT CLOSE. A click anywhere on the screen\n// used to dismiss the video mid-testimonial, which is the one\n// thing somebody watching it never means to do. The X and\n// Escape close it; nothing else does.\nrole:\"dialog\",\"aria-modal\":\"true\",\"aria-label\":`Video testimonial from ${item.name}`,style:{position:\"fixed\",inset:0,zIndex:2147483e3,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",padding:24,background:\"rgba(6, 7, 8, 0.82)\",backdropFilter:\"blur(6px)\",WebkitBackdropFilter:\"blur(6px)\"},children:[/*#__PURE__*/_jsx(\"div\",{style:{position:\"relative\",width:\"min(92vw, 880px)\",borderRadius:12,overflow:\"hidden\",background:\"#0E0F11\",boxShadow:\"0 24px 80px rgba(0, 0, 0, 0.5)\"},children:/*#__PURE__*/_jsx(\"video\",{ref:ref,src:srcOf(item.video),poster:srcOf(item.photo),controls:true,autoPlay:true,playsInline:true,// Plays once. The thumbnail loops because it is a texture;\n// this is the testimonial, and it ends when it ends.\nloop:false,onEnded:e=>{// Explicit, so nothing downstream can restart it.\ne.currentTarget.pause?.();},// From the top, and the whole clip: VIDEO_WINDOW and\n// videoStart are the thumbnail's business, not this one's.\nstyle:{display:\"block\",width:\"100%\",maxHeight:\"84vh\",objectFit:\"contain\",background:\"#0E0F11\"}})}),/*#__PURE__*/_jsx(\"button\",{type:\"button\",\"aria-label\":\"Close video\",onClick:onClose,style:{position:\"absolute\",top:20,right:20,width:40,height:40,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",borderRadius:999,border:\"none\",background:\"rgba(255, 255, 255, 0.12)\",color:\"#FFFFFF\",cursor:\"pointer\",padding:0},children:/*#__PURE__*/_jsx(CloseGlyph,{})})]}),document.body);};const PHONE_QUERY=\"(max-width: 809.98px)\";/**\n * Framer's Image control hands back an object, a String control a plain string,\n * and an Image control silently DROPS a string defaultValue. Accept both.\n */const PAGE_BG=\"var(--token-80107bf9-b042-408a-8c83-7437a03e42c2, rgb(14, 15, 17))\";const edgeFade=side=>({position:\"absolute\",top:0,bottom:0,[side]:0,width:\"6%\",pointerEvents:\"none\",background:`linear-gradient(to ${side===\"left\"?\"right\":\"left\"}, ${PAGE_BG}, rgba(0,0,0,0))`});// Where a card currently sits, read back off the transform this effect wrote.\nconst translateXOf=el=>{const m=/translateX\\((-?[0-9.]+)px\\)/.exec(el.style.transform||\"\");return m?parseFloat(m[1]):undefined;};const srcOf=v=>typeof v===\"string\"?v:v&&typeof v.src===\"string\"?v.src:\"\";// Transcribed from CTA Button's Secondary Large variant, as AshbyRoles does\n// for Secondary Small. The fill is a var so a palette change carries; hover and\n// pressed are hardcoded in the component itself, so these match it exactly.\nconst CTA_ARROW=\"https://framerusercontent.com/images/Scch5Ng1JWHfHtt7EajGoPl4DE.svg\";const CTA_FILL=\"var(--token-c6056fbc-0fe7-465e-8a63-286756c0ba39, rgb(27, 29, 32))\";const CTA_HOVER=\"#26292A\";const CTA_PRESSED=\"#0E0F11\";const CTA_LABEL=\"var(--token-a5b2ea04-6fdf-41b9-8794-5e750fb1cda9, rgb(229, 229, 229))\";const TRUST='\"Trust 3A Regular\", \"Trust 3A\", serif';const SOHNE='\"S\\xf6hne\", \"S\\xf6hne Buch\", sans-serif';// `company` is the key the Case Studies row in the property panel matches on.\n// Flexcar is the only published story; the rest are draft or absent, and\n// linking a draft is worse than no link — its page 404s.\nconst DEFAULT_ITEMS=[{company:\"mine\",quote:\"“BPOs are a whole problem unto themselves — they’re expensive, and it’s hard to audit the decisions they make. With Percy, we get the world’s best BPO built directly into our platform: incredibly easy to audit, cases done in record time, and full observability into every single decision.”\",name:\"Ben Baak\",role:\"Chief of Staff\",// Poster frame for the video below; also the fallback if the video fails.\nphoto:\"https://framerusercontent.com/images/jWjWSVR0gpuAhZF4c1VK9u1SY8.png\",video:\"https://framerusercontent.com/assets/wef1gb7BNu9Haklo8yidwCig.mp4\",videoLoop:\"https://framerusercontent.com/assets/3NW7cCAIsBNh6yiJo5iFKyrzk.mp4\",logo:\"https://framerusercontent.com/images/ZtOkIdPn1ujSMgV29QV9EBfyNc.svg\"},{company:\"flexcar\",quote:\"“I love how Footprint is able to onboard users while offloading the storage of PII. We’re able to access the data we need while leveraging Footprint’s secure vaulting for the collection and storage.”\",name:\"Michael Zambrano\",role:\"Executive Head of Risk\",// Re-exported without the original's 1px blown-out top and bottom rows.\n// The slots are portrait and this headshot is square, so cover shows its\n// full height and any bad edge row lands on the card's edge as a strip.\nphoto:\"https://framerusercontent.com/images/K3qOETqgf9kQRYItmORuAcPxZak.jpg\",logo:\"https://framerusercontent.com/images/wlJjEwBM9xArgbnqxHh4y6fpWQs.svg\"},{company:\"basic capital\",quote:\"“The great thing about using Footprint is that it gave us the institutional cache to close partnerships with institutional partners like Apex, and at the same time it gave us the quality and the taste and the front-end experience that really enables us to deliver to our customers the promise that we’ve made to them.”\",name:\"Abdul Al-Asaad\",role:\"CEO\",photo:\"https://framerusercontent.com/images/2zODxzt0KIKiIm76zIs4JpkuCU.png\",video:\"https://framerusercontent.com/assets/Xie3qMzp9qKn49lfbc6LXml3sY.mp4\",// The first four seconds are the intro; the loop cut starts after it.\nvideoLoop:\"https://framerusercontent.com/assets/f8ZkBof50NUWG3Kc1ot70qSFE.mp4\",logo:\"https://framerusercontent.com/images/jxQXVCfjX22Rkgnx2eRKEsd0y0.svg\"},{company:\"apiture\",quote:\"“Based on experience vetting and partnering with many identity-based techs, partnering with Footprint has been a breath of fresh air. In my product, IDV is critical. I want the best security net possible, configurability, trust in a reliable partner, quick support whenever asked, and a commitment to staying ahead of the bad actors. Footprint is thinking outside the box and doing things other IDV providers should have thought about years ago. Proud to stand side by side with Footprint combatting fraud.”\",name:\"Craig Pawling\",role:\"VP of Product\",photo:\"https://framerusercontent.com/images/ORygMPEc4PuUdQ14a8Pdk6xkxaM.png\",logo:\"https://framerusercontent.com/images/5qoFDi27rPSeeQPyLNlHUUU7WP0.svg\"},{company:\"chariot\",quote:\"“Footprint makes it easy to customize rules and provides detailed insights, like geographical device location and photo ID scoring, that impressed even our independent AML auditor. The Footprint team is also great to work with and very responsive when any questions or issues come up.”\",name:\"Jess Clark\",role:\"Head of Legal and Compliance\",photo:\"https://framerusercontent.com/images/wD13416L0iEVMPmT9G8rmi9RDA.jpg\",logo:\"https://framerusercontent.com/images/XdYVRQQY70NL9AS7GWhkHRC8RE.svg\"},{company:\"loanpro\",quote:\"“Before Footprint, I never saw a company handle manual reviews, in real time, during the actual loan application. Percy’s generative UI and agent capabilities can automate a manual review process that takes a human days to complete, reducing friction and increasing conversion. It’s impressive.”\",name:\"Nate Wood\",role:\"VP Strategic Partnerships\",photo:\"https://framerusercontent.com/images/Rf7pmfnmXbhCoBFNwLuefSzvDQ.png\",logo:\"https://framerusercontent.com/images/ZRVXcyXAKYvMkiu7xXHEQhjEhDE.svg\"},{company:\"findigs\",quote:\"“Footprint has been a significant improvement to our onboarding + fraud stack. It caught four new fraud cases in its first week live, and the app clip minimizes drop-off during document scanning.”\",name:\"Anuj Desai\",role:\"Lead Product Manager\",photo:\"https://framerusercontent.com/images/Pnw6CnJZqc7E7J7gOfXty8orw.jpg\",logo:\"https://framerusercontent.com/images/2qLKJbxZ0ey3JJYjQkC88beYg0.svg\"},{company:\"perpay\",quote:\"“With Footprint’s one-of-its-kind technology running underneath our identity checks, verification stopped being a point of friction and started being a point of trust.”\",name:\"Andy Billingsley\",role:\"Product Leader\",photo:\"https://framerusercontent.com/images/TxgZpHmpK7ChYZ4srXykDVeiOY.jpg\",logo:\"https://framerusercontent.com/images/p3uOeJtnJS7q0mjZbDw7waYiC5U.svg\"},{company:\"alinea\",quote:\"“Our members trust us with their first investment, so trust has to start at signup. Footprint lets us verify new investors in seconds and stay ahead of fraud and compliance as we scale – without adding friction for the people we built Alinea for.”\",name:\"Anam Lakhani\",role:\"Co-Founder & CEO\",photo:\"https://framerusercontent.com/images/0xSRHA3B5M7sMYjXAq99EdcVWA.jpg\",logo:\"https://framerusercontent.com/images/88HnrCxOAJy1eaFW1OAao6HSA.svg\"},{company:\"wingspan\",// Condensed from the video transcript; nothing added, order unchanged.\nquote:\"“Percy has enabled our team to shift their time from manual grunt work to much higher value work — saving 80% of the time in the process.”\",name:\"Wade Warren\",role:\"Director of Product\",// The frame at 6s, so the still matches exactly where the loop starts.\nphoto:\"https://framerusercontent.com/images/HS6XVRWxFTXBdXg4Md6QIRCl6I.jpg\",video:\"https://framerusercontent.com/assets/bou3GZwed4Iu6X6PzTQJXVpHM.mp4\",// The first six seconds are lead-in; the loop cut starts after them.\n// Max's instruction.\nvideoLoop:\"https://framerusercontent.com/assets/fmk9MJJI4gFHXw1Y2Mr7x5RxzPE.mp4\",logo:\"https://framerusercontent.com/images/IYSeW2UgwSv1lGPiw1HLkae6ADI.svg\"}];/**\n * Five photos on a circular rail with the active one centred.\n *\n * CODE, NOT VARIANTS: the item leaving the left edge has to become the item\n * entering on the right, and a variant transition only interpolates two states,\n * so that item crosses the whole stage or fades. Native Carousel fixes the wrap\n * but forces equal-sized items and exposes no active index.\n *\n * The wrap is two steps: park off stage with the transition disabled, animate\n * in on the next frame. Five photos, none duplicated.\n *\n * @framerIntrinsicWidth 1200\n * @framerIntrinsicHeight 834\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any-prefer-fixed\n * @framerDisableUnlink\n */export default function TestimonialRail(props){const{autoplay=true,interval=5,slide=.7,style}=props;// NOT a property control. An array-of-object control value, once\n// materialized on an instance, beats this file at runtime, is invisible to\n// every editor-side read and cannot be cleared through the agent API — the\n// published pages served a months-stale list. Reading DEFAULT_ITEMS\n// directly makes any such leftover inert.\nconst list=DEFAULT_ITEMS;const stories={mine:props.storyMine,flexcar:props.storyFlexcar,\"basic capital\":props.storyBasicCapital,apiture:props.storyApiture,chariot:props.storyChariot,loanpro:props.storyLoanpro,findigs:props.storyFindigs,perpay:props.storyPerpay,alinea:props.storyAlinea,wingspan:props.storyWingspan};const storyOf=company=>company?stories[company]:undefined;const count=list.length;const isStatic=useIsStaticRenderer();const[active,setActive]=useState(0);const[nudge,setNudge]=useState(0);const[isPhone,setIsPhone]=useState(false);// Index of the item whose video is open full size, or null. The rail keeps\n// its own state while this is open — closing returns to the same slide.\nconst[lightbox,setLightbox]=useState(null);// A rail that keeps moving can slide the story CTA out from under the\n// cursor mid-reach.\nconst[held,setHeld]=useState(false);const itemRefs=useRef([]);const videoRefs=useRef([]);const prevSlots=useRef([]);useEffect(()=>{if(typeof window===\"undefined\")return;const mq=window.matchMedia(PHONE_QUERY);const sync=()=>setIsPhone(mq.matches);sync();mq.addEventListener?.(\"change\",sync);return()=>mq.removeEventListener?.(\"change\",sync);},[]);// Autoplay. Paused on the canvas, where nothing should be moving.\n// `nudge` is bumped on every click so the interval restarts: without it a\n// click made near the end of a cycle would advance again almost at once.\nuseEffect(()=>{if(!autoplay||isStatic||typeof window===\"undefined\")return;// Advancing the rail underneath an open video would swap the card out\n// from behind the lightbox and leave it playing a different person.\nif(lightbox!==null)return;if(held)return;const reduced=window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;if(reduced)return;const id=window.setInterval(()=>setActive(a=>(a+1)%count),Math.max(1,interval)*1e3);return()=>window.clearInterval(id);},[autoplay,interval,count,isStatic,nudge,lightbox,held]);const slots=isPhone?SLOTS_MOBILE:SLOTS_DESKTOP;// Click any flanking photo to bring it to the centre. The wrap logic in the\n// placement effect already covers a two-slot move: the item that lands more\n// than one slot away is parked off stage and slides in, so clicking an edge\n// photo reads as the rail travelling, not as photos teleporting.\nconst select=i=>{if(i===active)return;setActive(i);setNudge(n=>n+1);};// Slot for an item: 0 is centre, ±1 the sides, ±2 the edges.\nconst slotOf=i=>{const raw=((i-active)%count+count)%count;return raw<=2?raw:raw-count;};useIsoLayoutEffect(()=>{if(isStatic)return;list.forEach((_,i)=>{const el=itemRefs.current[i];if(!el)return;const slot=slotOf(i);const prev=prevSlots.current[i];const spec=slots[slot+2];const place=(dx,opacity,spec2)=>{el.style.width=`${spec2.w}px`;el.style.height=`${spec2.h}px`;el.style.transform=`translate(-50%, -50%) translateX(${dx}px)`;el.style.opacity=`${opacity}`;el.style.filter=`saturate(${spec2.sat})`;};// Out of the five slots, or a jump from one edge to the other:\n// park it off stage with no transition, then slide it in.\nconst wrapped=prev!==undefined&&Math.abs(slot-prev)>1;if(!spec){// Two cases, not alike. LEAVING: exit on the side the card is\n// already on — `slot` is no guide, since stepping back off slot\n// 2 lands on -7 and would send a right-edge card out left\n// across the whole stage. ALREADY OFF: move to the side it\n// returns from with NO transition, while invisible.\nconst onStage=prev!==undefined&&Boolean(slots[prev+2]);const from=onStage?prev:slot;const exit=from>0?OFFSTAGE:-OFFSTAGE;el.style.transition=onStage?`transform ${slide}s ${CURVE}, opacity ${slide}s ${CURVE}`:\"none\";el.style.transform=`translate(-50%, -50%) translateX(${exit}px)`;el.style.opacity=\"0\";// RECORD the slot, or the item keeps whatever `prevSlots` it\n// had before and its return trip fails the wrap test below.\nprevSlots.current[i]=slot;return;}// A card parked on the far side from the one it enters by must be\n// snapped across first. `wrapped` alone misses the dot-jump case:\n// one slot by the counter, the whole stage on screen.\nconst entry=slot>0?OFFSTAGE:-OFFSTAGE;const curX=translateXOf(el);const misparked=curX!==undefined&&Math.abs(curX)>=OFFSTAGE&&Math.sign(curX)!==Math.sign(entry);if(wrapped||misparked){const side=entry;el.style.transition=\"none\";place(side,0,spec);// Force the parked position to be committed before animating.\nvoid el.offsetWidth;el.style.transition=`transform ${slide}s ${CURVE}, opacity ${slide}s ${CURVE}, width ${slide}s ${CURVE}, height ${slide}s ${CURVE}, filter ${slide}s ${CURVE}`;place(spec.dx,spec.opacity,spec);}else{el.style.transition=`transform ${slide}s ${CURVE}, opacity ${slide}s ${CURVE}, width ${slide}s ${CURVE}, height ${slide}s ${CURVE}, filter ${slide}s ${CURVE}`;place(spec.dx,spec.opacity,spec);}prevSlots.current[i]=slot;});},[active,isPhone,slide,isStatic,count]);// EVERY clip keeps playing; only the centre one restarts. Pausing the\n// off-stage ones looks frugal and is the opposite: a paused <video> drops\n// its buffer, so each return trip re-requests the bytes in ranges, and\n// those 206 replies are not reliably kept in Chrome's disk cache. Measured\n// cold at ~4-8x each file's size and still climbing, ~18 MB/hour on an open\n// tab. Playing media keeps its buffer — one download each, full stop.\n//\n// Affordable only at this size: three muted 640x480 eight-second loops.\n// Reduced motion and the open lightbox still stop everything.\nuseEffect(()=>{if(isStatic||typeof window===\"undefined\")return;const reduced=window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches;videoRefs.current.forEach((v,i)=>{if(!v)return;// While the lightbox plays, the muted thumbnail loop behind it is\n// wasted decode.\nif(!reduced&&lightbox===null){// Muted here as well as in the markup: some browsers drop the\n// attribute across hydration, and an unmuted autoplay is both\n// rude and refused by policy.\nv.muted=true;// Start of the window on arrival at centre, so each pass shows\n// the same eight seconds. The off-stage ones are left running\n// wherever they are — they are a loop, and stopping them is\n// what cost the re-download.\nif(slotOf(i)===0){try{v.currentTime=list[i]?.videoStart??0;}catch{}}// A rejected play() is normal (tab hidden, policy) and must\n// not throw into the effect.\nv.play?.().catch(()=>{});}else{v.pause?.();try{v.currentTime=list[i]?.videoStart??0;}catch{}}});},[active,isStatic,count,lightbox]);const railHeight=isPhone?360:480;// Kept to the same share of the centre card on both breakpoints, which are\n// 349x480 and 262x360. The glyph is half the chip, and its optical nudge an\n// eighth of the glyph — the ratios the 32px chip was built on.\nconst playSize=isPhone?54:72;const playGlyph=Math.round(playSize/2);const current=list[active]||list[0];return /*#__PURE__*/_jsxs(\"div\",{onMouseEnter:()=>setHeld(true),onMouseLeave:()=>setHeld(false),onFocus:()=>setHeld(true),onBlur:()=>setHeld(false),style:{...style,width:\"100%\",display:\"flex\",flexDirection:\"column\",alignItems:\"center\",gap:40,padding:10,boxSizing:\"border-box\"},children:[/*#__PURE__*/_jsx(\"style\",{children:`@keyframes tstFade{from{opacity:0;filter:blur(8px)}to{opacity:1;filter:blur(0)}}\n.tst-story{display:flex;align-items:center;justify-content:center;gap:8px;padding:8px 10px;box-sizing:border-box;border-radius:39px;overflow:hidden;text-decoration:none;cursor:pointer;background:${CTA_FILL};color:${CTA_LABEL};transition:background 0.3s ${CURVE}}\n.tst-story-icon{flex:0 0 auto;width:20px;height:20px;border-radius:50%;background:#FFFFFF url(\"${CTA_ARROW}\") center / 18px 18px no-repeat}\n@media (hover:hover){.tst-story:hover{background:${CTA_HOVER}}}\n.tst-story:active{background:${CTA_PRESSED}}\n.tst-story:focus-visible{outline:1px solid rgba(255,255,255,0.6);outline-offset:3px}\n@media (prefers-reduced-motion:reduce){.tst-story{transition:none}}`}),/*#__PURE__*/_jsxs(\"div\",{style:{position:\"relative\",width:\"100%\",height:railHeight,overflow:\"hidden\"},children:[list.map((item,i)=>{const slot=slotOf(i);// Beyond ±2 there is no slot. Park it invisible: falling\n// back to the centre spec stacked a clickable ghost card\n// over the current one, permanently so on the canvas.\nconst visible=Math.abs(slot)<=2;const spec=visible?slots[slot+2]:// slot, so nothing has a stage-width distance to\n// travel if a transition is ever armed.\n{...slots[0],dx:-OFFSTAGE,opacity:0};return /*#__PURE__*/_jsxs(\"div\",{ref:el=>{itemRefs.current[i]=el;},role:slot===0||!visible?undefined:\"button\",tabIndex:slot===0||!visible?-1:0,\"aria-label\":slot===0||!visible?undefined:`Show testimonial from ${item.name}`,onClick:()=>select(i),onKeyDown:e=>{if(e.key===\"Enter\"||e.key===\" \"){e.preventDefault();select(i);}},style:{position:\"absolute\",left:\"50%\",top:\"50%\",width:spec.w,height:spec.h,transform:`translate(-50%, -50%) translateX(${spec.dx}px)`,opacity:spec.opacity,filter:`saturate(${spec.sat})`,overflow:\"hidden\",borderRadius:8,// The centre photo is the current one, so it\n// is not a target — its story CTA is. The\n// edges at 0.1 opacity are barely visible and\n// would be a mystery click.\ncursor:slot===0||Math.abs(slot)>=2?\"default\":\"pointer\",pointerEvents:Math.abs(slot)>=2?\"none\":\"auto\",willChange:\"transform, opacity, width, height, filter\"},children:[srcOf(item.video)?/*#__PURE__*/_jsx(\"video\",{ref:el=>{videoRefs.current[i]=el;},src:srcOf(item.videoLoop??item.video),poster:srcOf(item.photo),muted:true,loop:true,playsInline:true,preload:\"metadata\",onTimeUpdate:e=>{// `loop` alone would run the whole\n// clip; cut it back to the window.\n// The lower bound matters too: `loop`\n// restarts at 0, not at the offset.\nconst v=e.currentTarget;// A loop cut is already the window,\n// so it restarts at 0; videoStart\n// only means anything on a full clip.\nconst from=item.videoLoop?0:item.videoStart??0;if(v.currentTime>=from+VIDEO_WINDOW||v.currentTime<from-.25)v.currentTime=from;},style:{width:\"100%\",height:\"100%\",objectFit:\"cover\",display:\"block\",pointerEvents:\"none\"}}):/*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",height:\"100%\",backgroundImage:`url(\"${srcOf(item.photo)}\")`,backgroundSize:\"cover\",backgroundPosition:\"center\",backgroundRepeat:\"no-repeat\"}}),storyOf(item.company)&&slot===0?/*#__PURE__*/_jsxs(\"a\",{className:\"tst-story\",href:storyOf(item.company),style:{position:\"absolute\",left:\"50%\",transform:\"translateX(-50%)\",bottom:16,// `left: 50%` alone leaves the box only\n// the right half of the card to fit in,\n// which wraps the label onto a second\n// line. Size it to its content instead.\nwidth:\"max-content\",whiteSpace:\"nowrap\",zIndex:2,fontFamily:SOHNE,fontSize:15,lineHeight:\"1.6em\",letterSpacing:0},children:[\"Read the Story\",/*#__PURE__*/_jsx(\"span\",{className:\"tst-story-icon\"})]}):null,srcOf(item.video)&&slot===0?/*#__PURE__*/_jsx(\"button\",{type:\"button\",\"aria-label\":`Play the video testimonial from ${item.name}`,onClick:e=>{// The card behind is not a click\n// target at slot 0, but stop anyway:\n// the handler is on the parent and\n// this must not read as a slide move.\ne.stopPropagation();setLightbox(i);},style:{position:\"absolute\",top:\"50%\",left:\"50%\",transform:\"translate(-50%, -50%)\",width:playSize,height:playSize,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",borderRadius:999,border:\"none\",background:\"rgba(14, 15, 17, 0.55)\",backdropFilter:\"blur(8px)\",WebkitBackdropFilter:\"blur(8px)\",color:\"#FFFFFF\",cursor:\"pointer\",padding:0,// The glyph's own left edge starts at\n// x=3 of 16, so a centred box reads too\n// far left. After `padding`, which\n// would otherwise cancel it.\npaddingLeft:Math.round(playGlyph/8),zIndex:2},children:/*#__PURE__*/_jsx(PlayGlyph,{size:playGlyph})}):null]},i);}),/*#__PURE__*/_jsx(\"div\",{style:edgeFade(\"left\")}),/*#__PURE__*/_jsx(\"div\",{style:edgeFade(\"right\")})]}),/*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",flexDirection:\"column\",alignItems:\"center\",gap:24,padding:\"0 12px\",// `88vw` is the tablet guard: `isPhone` is only ≤809.98, so\n// a flat 880 runs an 810-wide tablet nearly edge to edge.\nmaxWidth:isPhone?720:\"min(880px, 88vw)\",textAlign:\"center\",animation:`tstFade ${slide}s ${CURVE} both`},children:[/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:TRUST,fontSize:isPhone?20:28,// Tracking is -0.01em at both sizes, so it follows the\n// font size down. `lineHeight` is unitless and already\n// proportional: 1.2 × 28 = 33.6px.\nletterSpacing:isPhone?\"-0.2px\":\"-0.28px\",lineHeight:1.2,color:\"rgb(229, 229, 229)\"},children:current.quote}),/*#__PURE__*/_jsxs(\"div\",{style:{borderTop:\"1px solid rgba(255,255,255,0.1)\",paddingTop:24,width:240,display:\"flex\",flexDirection:\"column\",alignItems:\"center\",gap:4},children:[/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:SOHNE,fontSize:isPhone?15:16,letterSpacing:isPhone?\"0.15px\":\"0.16px\",color:\"var(--token-6db0e367-ec84-44ae-976c-1afdf30cff46, #e5e5e5)\"},children:current.name}),/*#__PURE__*/_jsx(\"div\",{style:{fontFamily:SOHNE,fontSize:isPhone?12:13,letterSpacing:isPhone?\"0.12px\":\"0.13px\",color:\"var(--token-add78695-5bca-47c8-a753-022462864475, #b5b5b5)\"},children:current.role}),srcOf(current.logo)?/*#__PURE__*/_jsx(\"div\",{style:{height:40,width:120,marginTop:8,backgroundImage:`url(\"${srcOf(current.logo)}\")`,backgroundSize:\"contain\",backgroundPosition:\"center\",backgroundRepeat:\"no-repeat\"}}):null]})]},active),/*#__PURE__*/_jsx(\"div\",{style:{display:\"flex\",gap:8},children:list.map((_,i)=>/*#__PURE__*/_jsx(\"div\",{onClick:()=>setActive(i),style:{width:8,height:8,borderRadius:4,cursor:\"pointer\",background:i===active?\"rgba(255,255,255,1)\":\"rgba(255,255,255,0.3)\",transition:`background ${slide}s ${CURVE}`}},i))}),lightbox!==null&&!isStatic?/*#__PURE__*/_jsx(VideoLightbox,{item:list[lightbox],onClose:()=>setLightbox(null)}):null]});}addPropertyControls(TestimonialRail,{autoplay:{type:ControlType.Boolean,title:\"Autoplay\",defaultValue:true},interval:{type:ControlType.Number,title:\"Interval\",min:1,max:20,step:.5,defaultValue:5},slide:{type:ControlType.Number,title:\"Slide\",min:.1,max:2,step:.05,defaultValue:.7,description:\"Seconds per move\"},storyMine:{type:ControlType.Link,title:\"Mine\",description:\"Case study links — only where the story is published\"},storyFlexcar:{type:ControlType.Link,title:\"Flexcar\"},storyBasicCapital:{type:ControlType.Link,title:\"Basic Capital\"},storyApiture:{type:ControlType.Link,title:\"Apiture\"},storyChariot:{type:ControlType.Link,title:\"Chariot\"},storyLoanpro:{type:ControlType.Link,title:\"Loanpro\"},storyFindigs:{type:ControlType.Link,title:\"Findigs\"},storyPerpay:{type:ControlType.Link,title:\"Perpay\"},storyAlinea:{type:ControlType.Link,title:\"Alinea\"},storyWingspan:{type:ControlType.Link,title:\"Wingspan\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"TestimonialRail\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"any-prefer-fixed\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any\",\"framerIntrinsicHeight\":\"834\",\"framerIntrinsicWidth\":\"1200\",\"framerDisableUnlink\":\"\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./TestimonialRail.map"],"mappings":"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"}