{"version":3,"file":"Examples.BICbbEh3.mjs","names":["useState","useState","useRef","useCallback"],"sources":["https:/framerusercontent.com/modules/vj7bFUjvEQFgEzNBkdoG/vf3CKm378wlVcBk7IhSU/createStore.js","https:/framer.com/m/framer/store.js@^1.0.0","https:/framerusercontent.com/modules/28rXvpPsrum7FH6cMELS/1jCAazZw1EGHjrG5Nu5D/Utils.js","https:/framer.com/m/framer/utils.js@^0.9.0","https:/framerusercontent.com/modules/qPfA9TFjFQSpAcagEWC3/QUuuOynuZssT1bFrmvh4/Examples.js"],"sourcesContent":["import{useState,useEffect}from\"react\";import{Data,useObserveData}from\"framer\";export function createStore(state1){// Use Data so that a Preview reload resets the state\nconst dataStore=Data({state:Object.freeze({...state1})});// Create a set function that updates the state\nconst setDataStore=newState=>{// If the state is an object, make sure we copy it\nif(typeof newState===\"function\"){newState=newState(dataStore.state);}dataStore.state=Object.freeze({...dataStore.state,...newState});};// Store the initial state, copy the object if it's an object\nlet storeState=typeof state1===\"object\"?Object.freeze({...state1}):state1;// Keep a list of all the listeners, in the form of React hook setters\nconst storeSetters=new Set();// Create a set function that updates all the listeners / setters\nconst setStoreState=newState=>{// If the state is an object, make sure we copy it\nif(typeof newState===\"function\"){newState=newState(storeState);}storeState=typeof newState===\"object\"?Object.freeze({...storeState,...newState}):newState;// Update all the listeners / setters with the new value\nstoreSetters.forEach(setter=>setter(storeState));};// Create the actual hook based on everything above\nfunction useStore(){// Create the hook we are going to use as a listener\nconst[state,setState]=useState(storeState);// If we unmount the component using this hook, we need to remove the listener\n// @ts-ignore\nuseEffect(()=>{// But right now, we need to add the listener\nstoreSetters.add(setState);return()=>storeSetters.delete(setState);},[]);// If Data context exists, use Data, otherwise use vanilla React state\nif(useObserveData()===true){useObserveData();return[dataStore.state,setDataStore];}else{// Return the state and a function to update the central store\nreturn[state,setStoreState];}}return useStore;}\nexport const __FramerMetadata__ = {\"exports\":{\"createStore\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./createStore.map","/*\n * createStore (framer/store@1.0.1)\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/vj7bFUjvEQFgEzNBkdoG/vf3CKm378wlVcBk7IhSU/createStore.js\"\n","export const centerContent = {\n    display: \"flex\",\n    justifyContent: \"center\",\n    alignItems: \"center\"\n};\nexport const autoSizingText = {\n    width: \"max-content\",\n    wordBreak: \"break-word\",\n    overflowWrap: \"break-word\",\n    overflow: \"hidden\",\n    whiteSpace: \"pre-wrap\",\n    flexShrink: 0\n};\nexport const defaultContainerStyles = {\n    ...centerContent,\n    overflow: \"hidden\"\n};\nexport const containerStyles = defaultContainerStyles;\nexport const randomColor = ()=>\"#\" + Math.floor(Math.random() * 16777215).toString(16)\n;\n\nexport const __FramerMetadata__ = {\"exports\":{\"centerContent\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"containerStyles\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"autoSizingText\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"defaultContainerStyles\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"randomColor\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./Utils.map","/*\n * Utils (framer/utils@0.9.0)\n *\n * Learn More: https://www.framer.com/asset-urls\n */\n\nexport * from \"https://framerusercontent.com/modules/28rXvpPsrum7FH6cMELS/1jCAazZw1EGHjrG5Nu5D/Utils.js\"\n","import{jsx as _jsx}from\"react/jsx-runtime\";import{forwardRef,startTransition,useCallback,useEffect,useRef,useState}from\"react\";import{useIsStaticRenderer}from\"framer\";import{animate,useMotionValue}from\"framer-motion\";import{createStore}from\"https://framer.com/m/framer/store.js@^1.0.0\";import{randomColor}from\"https://framer.com/m/framer/utils.js@^0.9.0\";// Learn more: https://www.framer.com/developers/overrides/\nconst useStore=createStore({background:\"#0099FF\"});export function withRotate(Component){return /*#__PURE__*/forwardRef((props,ref)=>{return /*#__PURE__*/_jsx(Component,{ref:ref,...props,animate:{rotate:90},transition:{duration:2}});});}export function withHover(Component){return /*#__PURE__*/forwardRef((props,ref)=>{return /*#__PURE__*/_jsx(Component,{ref:ref,...props,whileHover:{scale:1.05}});});}export function withRandomColor(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const[store,setStore]=useStore();return /*#__PURE__*/_jsx(Component,{ref:ref,...props,animate:{background:store.background},onClick:()=>{setStore({background:randomColor()});}});});}export function withHideOnScrollDirection(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const[isHidden,setIsHidden]=useState(false);const lastScrollY=useRef(0);const ticking=useRef(false);const hiddenRef=useRef(false);const directionThreshold=8;const topGuardOffset=72;const setHiddenSafely=useCallback(nextHidden=>{if(hiddenRef.current===nextHidden)return;hiddenRef.current=nextHidden;startTransition(()=>setIsHidden(nextHidden));},[]);useEffect(()=>{if(typeof window===\"undefined\")return;lastScrollY.current=window.scrollY||0;const updateFromScroll=()=>{const currentY=window.scrollY||0;const delta=currentY-lastScrollY.current;if(currentY<=topGuardOffset){setHiddenSafely(false);}else if(delta>directionThreshold){setHiddenSafely(true);}else if(delta<-directionThreshold){setHiddenSafely(false);}lastScrollY.current=currentY;ticking.current=false;};const onScroll=()=>{if(ticking.current)return;ticking.current=true;window.requestAnimationFrame(updateFromScroll);};window.addEventListener(\"scroll\",onScroll,{passive:true});return()=>{window.removeEventListener(\"scroll\",onScroll);};},[setHiddenSafely]);const incomingTransform=props.style&&typeof props.style===\"object\"?props.style.transform:undefined;return /*#__PURE__*/_jsx(Component,{ref:ref,...props,style:{...props.style,transform:`${incomingTransform?`${incomingTransform} `:\"\"}translateY(${isHidden?\"-110%\":\"0%\"})`,opacity:isHidden?.92:1,transition:\"transform 280ms ease, opacity 280ms ease\"+(props.style?.transition?`, ${props.style.transition}`:\"\"),willChange:\"transform, opacity\"}});});}// A duplicate-structure toggle (e.g. Framer's per-breakpoint \"visible\"\n// property, used to switch between \"Desktop Scroll Section Main\" and\n// \"Mobile Scroll Section Main\") is not guaranteed to collapse an element's\n// bounding rect to zero -- some hiding techniques use opacity/visibility\n// instead of display:none, which leaves width/height intact. So checking\n// rect size alone isn't enough to tell a genuinely-rendered element apart\n// from one that's deliberately hidden but still occupying layout space.\nfunction isRenderedVisible(el){const rect=el.getBoundingClientRect();if(rect.width<=0||rect.height<=0)return false;if(typeof window===\"undefined\"||typeof window.getComputedStyle!==\"function\")return true;const style=window.getComputedStyle(el);if(style.display===\"none\")return false;if(style.visibility===\"hidden\")return false;if(parseFloat(style.opacity)===0)return false;return true;}// Resolve an element by its HTML id, preferring the currently visible copy.\n// Framer can render the same elementId across multiple breakpoints (or, as\n// with the desktop/mobile scroll-section split, across two different\n// structures sharing one id), so a plain getElementById may return a hidden\n// copy from an inactive breakpoint or structure.\nfunction getVisibleElementById(id){if(typeof document===\"undefined\")return null;const nodes=document.querySelectorAll(`[id=\"${id}\"]`);for(const el of nodes){if(isRenderedVisible(el))return el;}return nodes[0]??null;}// Try multiple candidate elementIds in order (e.g. a desktop-structure id and\n// its mobile-structure counterpart) and return whichever one is genuinely\n// rendered right now.\nfunction getFirstVisibleElementById(ids){for(const id of ids){const el=getVisibleElementById(id);if(el)return el;}return null;}// The highlight bar renders one variant at a time; each variant is a horizontal\n// row of three equal segments. This override:\n//   1. Switches the active variant based on scroll position (one/two/three).\n//   2. Makes each of the three segments jump to its section on click:\n//      left -> #section1, middle -> #section2, right -> #section3.\nexport function withScrollHighlightVariant(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const isStaticRenderer=useIsStaticRenderer();const[variant,setVariant]=useState(\"highlight-one\");// The bar is a page-level position:fixed element (needed so it never\n// reserves flow space / leaves a trailing gap). That means it must\n// manage its own visibility: show it only while \"Scroll Section Main\"\n// is actually intersecting the viewport, hide it everywhere else on\n// the page.\nconst[visible,setVisible]=useState(false);const rootRef=useRef(null);const ticking=useRef(false);const lastInteractionAt=useRef(0);const setVariantSafely=useCallback(next=>{startTransition(()=>setVariant(prev=>prev===next?prev:next));},[]);// --- Scroll-driven active state + visibility -------------------------\n// Switch based on which section has passed the vertical middle of the\n// viewport. Later sections win, so scrolling down advances one -> two ->\n// three, and scrolling back up reverts. The same scroll tick also\n// toggles visibility based on whether the scroll section is in view.\nconst updateVariantFromProgress=useCallback(()=>{if(typeof window===\"undefined\")return;// Determine overall visibility from the individual trigger\n// elements rather than the outer \"Scroll Section Main\" wrapper's\n// own measured rect -- diagnostic testing showed that rect isn't\n// reliable to measure directly (likely due to how a very tall,\n// sticky-heavy container reports its own bounding box), whereas\n// the individual trigger/section elements are already proven\n// reliable (the variant-switching logic below has always used\n// them). Visible once the first trigger has come into range,\n// hidden again once the last one has fully scrolled past.\nconst trigger1=getFirstVisibleElementById([\"trigger1\",\"trigger1.2\"]);const trigger3=getFirstVisibleElementById([\"trigger3\",\"trigger3.2\"]);let inRange=true;if(trigger1){inRange=trigger1.getBoundingClientRect().top<window.innerHeight;}if(trigger3&&trigger3.getBoundingClientRect().bottom<=0){inRange=false;}// Hide as soon as the next section (\"modular-advantage\", the\n// headline right after the scroll section) starts entering the\n// viewport, regardless of what the trigger-based bounds say.\nconst nextSection=getVisibleElementById(\"modular-advantage\");if(nextSection&&nextSection.getBoundingClientRect().top<window.innerHeight){inRange=false;}setVisible(inRange);const activationLine=window.innerHeight/2;// \"Mobile Scroll Section Main\" uses its own \".2\"-suffixed\n// elementIds (section2.2/section3.2) instead of the desktop\n// structure's plain ones -- try both, whichever is genuinely\n// rendered for the current breakpoint wins.\nconst section2=getFirstVisibleElementById([\"section2\",\"section2.2\"]);const section3=getFirstVisibleElementById([\"section3\",\"section3.2\"]);let next=\"highlight-one\";if(section2&&section2.getBoundingClientRect().top<=activationLine){next=\"highlight-two\";}if(section3&&section3.getBoundingClientRect().top<=activationLine){next=\"highlight-three\";}setVariantSafely(next);},[setVariantSafely]);useEffect(()=>{if(isStaticRenderer||typeof window===\"undefined\")return;const onScrollOrResize=()=>{if(ticking.current)return;ticking.current=true;window.requestAnimationFrame(()=>{updateVariantFromProgress();ticking.current=false;});};updateVariantFromProgress();window.addEventListener(\"scroll\",onScrollOrResize,{passive:true});window.addEventListener(\"resize\",onScrollOrResize);return()=>{window.removeEventListener(\"scroll\",onScrollOrResize);window.removeEventListener(\"resize\",onScrollOrResize);};},[isStaticRenderer,updateVariantFromProgress]);// Horizontal centering is now handled natively by the \"Highlight Bar\n// Overlay\" wrapper frame (a full-width position:fixed stack with\n// stackAlignment:\"center\") that this component sits inside as a plain\n// flow child -- no JS-driven positioning needed here.\n// --- Click-to-jump ---------------------------------------------------\n// Keep the latest props on a ref so activateFromClientX can read the\n// component's Link 1/2/3 controls without needing `props` in its own\n// dependency array (props is a new object every render).\nconst propsRef=useRef(props);propsRef.current=props;// Accepts either a full link value from the component's Link controls\n// (\"/platform#section2\", an external URL, ...) or a bare elementId\n// fallback (\"section1\"). If the (optional) hash segment matches an\n// element on the current page, scroll to it; otherwise treat the\n// value as a real navigation (different page / external URL).\nconst navigateToTarget=useCallback(hrefOrElementId=>{if(typeof window===\"undefined\"||!hrefOrElementId)return;const hashIndex=hrefOrElementId.indexOf(\"#\");const elementId=hashIndex!==-1?hrefOrElementId.slice(hashIndex+1):hrefOrElementId;const target=elementId?getVisibleElementById(elementId):null;if(target){// Snapshot the absolute document offset at click time and use\n// a single window.scrollTo call. scrollIntoView is unreliable\n// here: with several stacked position:sticky sections, a long\n// jump has to \"unstick\" intermediate sections mid-animation,\n// and browsers can cut the smooth scroll short or miscalculate\n// the target. A precomputed absolute offset isn't affected by\n// that relayout.\nconst top=target.getBoundingClientRect().top+window.scrollY;window.scrollTo({top,behavior:\"smooth\"});return;}if(hashIndex!==-1||/^https?:\\/\\//.test(hrefOrElementId)||hrefOrElementId.startsWith(\"/\")){window.location.href=hrefOrElementId;}},[]);const activateFromClientX=useCallback((clientX,el)=>{if(!el)return;// De-dupe: a single physical click can arrive via both the\n// onClick prop and the native DOM listener below.\nconst now=typeof performance!==\"undefined\"?performance.now():Date.now();if(now-lastInteractionAt.current<260)return;lastInteractionAt.current=now;const rect=el.getBoundingClientRect();if(rect.width<=0)return;const relativeX=clientX-rect.left;const third=rect.width/3;const index=relativeX>=third*2?2:relativeX>=third?1:0;const variants=[\"highlight-one\",\"highlight-two\",\"highlight-three\"];// Default targets used only if the matching Link control is\n// left empty in the component's property panel. Each entry\n// lists the desktop-structure id first, then the mobile\n// structure's \".2\"-suffixed counterpart -- whichever is\n// genuinely rendered for the current breakpoint is used.\nconst fallbackTargetCandidates=[[\"trigger1\",\"trigger1.2\"],[\"section2\",\"section2.2\"],[\"section3\",\"section3.2\"]];const configuredLinks=[propsRef.current.$control__link1,propsRef.current.$control__link2,propsRef.current.$control__link3];setVariantSafely(variants[index]);if(configuredLinks[index]){navigateToTarget(configuredLinks[index]);}else{const candidates=fallbackTargetCandidates[index];const resolved=candidates.find(id=>getVisibleElementById(id));navigateToTarget(resolved||candidates[0]);}},[navigateToTarget,setVariantSafely]);// Attach a native click listener straight to the DOM node, in case the\n// wrapped component does not forward the onClick prop.\nuseEffect(()=>{if(isStaticRenderer||typeof window===\"undefined\")return;const el=rootRef.current;if(!el)return;const onClick=event=>activateFromClientX(event.clientX,el);el.addEventListener(\"click\",onClick);return()=>el.removeEventListener(\"click\",onClick);},[isStaticRenderer,activateFromClientX]);const setRefs=useCallback(node=>{rootRef.current=node;if(typeof ref===\"function\")ref(node);else if(ref)ref.current=node;},[ref]);const handleClick=useCallback(event=>{props.onClick?.(event);activateFromClientX(event.clientX,event.currentTarget);},[activateFromClientX,props]);return /*#__PURE__*/_jsx(Component,{ref:setRefs,...props,$control__variant:variant,variant:variant,onClick:handleClick,style:{...props.style,cursor:\"pointer\",opacity:visible?1:0,pointerEvents:visible?\"auto\":\"none\",transition:`opacity 200ms ease${props.style?.transition?`, ${props.style.transition}`:\"\"}`}});});}const useExpandStore=createStore({section1:false,section2:false,section3:false});// Desktop breakpoints (L: min-width 1600px, M: min-width 1200px) must render\n// exactly as before -- but `codeOverride` is shared across all 4 breakpoint\n// replicas of a node (confirmed via Framer's own review diagnostics: \"Code\n// overrides are shared across variants\"), so the same override instance also\n// mounts on the L/M copies of these nodes. Without this guard, desktop copy\n// would default to collapsed with no way to reopen it there (the toggle\n// button is deliberately hidden on desktop via plain 0-size/pointer-events\n// attributes, not code). 1200px matches this project's own Tablet/Desktop\n// breakpoint threshold (see prompt/how-projects-work.md).\nconst MOBILE_BREAKPOINT_MAX_WIDTH=1200;function useIsMobileBreakpoint(){const[isMobile,setIsMobile]=useState(typeof window!==\"undefined\"?window.innerWidth<MOBILE_BREAKPOINT_MAX_WIDTH:false);useEffect(()=>{if(typeof window===\"undefined\")return;const onResize=()=>setIsMobile(window.innerWidth<MOBILE_BREAKPOINT_MAX_WIDTH);window.addEventListener(\"resize\",onResize);return()=>window.removeEventListener(\"resize\",onResize);},[]);return isMobile;}function makeExpandToggleOverride(sectionKey){return function(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const[store,setStore]=useExpandStore();const isMobile=useIsMobileBreakpoint();const expanded=store[sectionKey];const handleClick=useCallback(event=>{props.onClick?.(event);setStore({...store,[sectionKey]:!store[sectionKey]});},[props,setStore,store]);// Desktop: render completely unmodified, no click handling.\nif(!isMobile){return /*#__PURE__*/_jsx(Component,{ref:ref,...props});}return /*#__PURE__*/_jsx(Component,{ref:ref,...props,onClick:handleClick,style:{...props.style,cursor:\"pointer\",transform:`${props.style?.transform?`${props.style.transform} `:\"\"}rotate(${expanded?45:0}deg)`,transition:`transform 200ms ease${props.style?.transition?`, ${props.style.transition}`:\"\"}`}});});};}function makeExpandableCopyOverride(sectionKey){return function(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const[store]=useExpandStore();const isMobile=useIsMobileBreakpoint();const expanded=store[sectionKey];// Desktop: render completely unmodified -- no maxHeight/opacity\n// clipping, so the original (larger) desktop copy is never at\n// risk of being cut off by a mobile-sized cap.\nif(!isMobile){return /*#__PURE__*/_jsx(Component,{ref:ref,...props});}return /*#__PURE__*/_jsx(Component,{ref:ref,...props,style:{...props.style,maxHeight:expanded?\"240px\":\"0px\",opacity:expanded?1:0,overflow:\"hidden\",transition:\"max-height 250ms ease, opacity 200ms ease\"}});});};}// Framer only recognizes a plain `export function Name(Component) {...}`\n// declaration as an override -- `export const Name = factory(...)` is not\n// picked up by its static export scanner. These thin named-function wrappers\n// delegate to the shared factories above so the logic itself isn't repeated.\nexport function withExpandToggleSection1(Component){return makeExpandToggleOverride(\"section1\")(Component);}export function withExpandToggleSection2(Component){return makeExpandToggleOverride(\"section2\")(Component);}export function withExpandToggleSection3(Component){return makeExpandToggleOverride(\"section3\")(Component);}export function withExpandableCopySection1(Component){return makeExpandableCopyOverride(\"section1\")(Component);}export function withExpandableCopySection2(Component){return makeExpandableCopyOverride(\"section2\")(Component);}export function withExpandableCopySection3(Component){return makeExpandableCopyOverride(\"section3\")(Component);}// --- \"Compare section cards\" sticky stack -----------------------------------\n// Pure CSS, no scroll listeners or per-frame JS at all. Stacking/pinning is\n// native position:sticky with a staggered positionStickyTop per card (set via\n// SET, not here: 0 / 32 / 64) so each earlier card peeks out above the next.\n// The \"shrink as it recedes\" depth effect uses a native CSS scroll-driven\n// animation (animation-timeline: view()) instead of a JS scroll handler --\n// the browser ties the keyframe's progress directly to how far each card has\n// scrolled through its own \"cover\" range, including while position:sticky is\n// holding it in place (the timeline tracks the element's unshifted layout\n// position, not its stuck-in-place painted position, so progress keeps\n// advancing as later cards scroll in underneath).\n//\n// animation-timeline/animation-range aren't yet supported in every browser\n// (older Safari/Firefox in particular), so the whole animation is gated\n// behind @supports -- unsupported browsers just keep every card at scale(1);\n// they still get the correct sticky-stacking, just without the depth effect,\n// rather than a broken permanently-shrunk card (which is what would happen\n// without the @supports guard, since an unsupported browser would apply the\n// \"to\" keyframe immediately via the default document timeline).\n//\n// The exact animation-range offsets below are a starting point -- they're\n// the one thing that can't be tuned without watching it scroll live.\n//\n// Also gated behind a min-width media query at this project's own Mobile/XS\n// breakpoint cutoff (810px, same value the Markets Teaser section uses) --\n// below that, the shrink-as-it-recedes depth effect is skipped entirely.\n// Sticky stacking itself isn't touched by this at any width; only the\n// scroll-driven scale animation is.\nconst COMPARE_STACK_STYLE_ID=\"nth-compare-stack-styles\";const COMPARE_STACK_MOBILE_MAX_WIDTH=810;const COMPARE_STACK_CSS=`\n#compare-card-1, #compare-card-2 {\n    transform-origin: top center;\n}\n@media (min-width: ${COMPARE_STACK_MOBILE_MAX_WIDTH}px) {\n    @supports (animation-timeline: view()) {\n        #compare-card-1 {\n            animation: nth-compare-shrink-1 linear forwards;\n            animation-timeline: view();\n            animation-range: cover 20% cover 70%;\n        }\n        #compare-card-2 {\n            animation: nth-compare-shrink-2 linear forwards;\n            animation-timeline: view();\n            animation-range: cover 20% cover 70%;\n        }\n    }\n}\n@keyframes nth-compare-shrink-1 {\n    to { transform: scale(0.8); }\n}\n@keyframes nth-compare-shrink-2 {\n    to { transform: scale(0.9); }\n}\n`;export function withCompareStackStyles(Component){return /*#__PURE__*/forwardRef((props,ref)=>{useEffect(()=>{if(typeof document===\"undefined\")return;if(document.getElementById(COMPARE_STACK_STYLE_ID))return;const styleEl=document.createElement(\"style\");styleEl.id=COMPARE_STACK_STYLE_ID;styleEl.textContent=COMPARE_STACK_CSS;document.head.appendChild(styleEl);},[]);return /*#__PURE__*/_jsx(Component,{ref:ref,...props});});}// Sticky stacking (the positionStickyTop stagger above) and the depth-shrink\n// effect (the CSS animation above) are both pure CSS. This is the one piece\n// that genuinely can't be: browsers release sibling sticky elements\n// independently based on each one's own remaining room in the shared\n// container, not as a group. Card 3 sits last in the flow, so it has the\n// least room left below it and releases from sticky FIRST -- while it's\n// still the topmost z-index, so it visually slides over cards 1/2 (still\n// pinned) as it leaves. There's no CSS mechanism to make siblings wait for\n// each other.\n//\n// This applies one shared, scroll-linked translateY to all 3 OUTER card\n// wrappers (never the inner content -- that's left alone to keep doing its\n// own CSS shrink animation undisturbed), computed identically and\n// independently by each from the same inputs, so they're numerically\n// guaranteed to match at every scroll position with no shared state between\n// them. It only engages once scrolled into the dedicated dwell spacer after\n// the cards -- well before any card's own native release point -- so by the\n// time native release would otherwise kick in, the transform has already\n// carried it away; native release becomes moot rather than something to\n// fight.\nconst COMPARE_EXIT_MARKER_ELEMENT_ID=\"stack-dwell-spacer\";const COMPARE_EXIT_RAMP_PX=400;function getCompareExitOffset(){if(typeof window===\"undefined\")return 0;const spacerEl=getVisibleElementById(COMPARE_EXIT_MARKER_ELEMENT_ID);if(!spacerEl)return 0;const scrolledPastSpacerTop=Math.max(0,-spacerEl.getBoundingClientRect().top);const progress=Math.min(scrolledPastSpacerTop/COMPARE_EXIT_RAMP_PX,1);return progress*(window.innerHeight+200);}export function withCompareCardExit(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const isStaticRenderer=useIsStaticRenderer();const[exitOffset,setExitOffset]=useState(0);const ticking=useRef(false);const update=useCallback(()=>{setExitOffset(getCompareExitOffset());},[]);useEffect(()=>{if(isStaticRenderer||typeof window===\"undefined\")return;const onScrollOrResize=()=>{if(ticking.current)return;ticking.current=true;window.requestAnimationFrame(()=>{update();ticking.current=false;});};update();window.addEventListener(\"scroll\",onScrollOrResize,{passive:true});window.addEventListener(\"resize\",onScrollOrResize);return()=>{window.removeEventListener(\"scroll\",onScrollOrResize);window.removeEventListener(\"resize\",onScrollOrResize);};},[isStaticRenderer,update]);return /*#__PURE__*/_jsx(Component,{ref:ref,...props,style:{...props.style,transform:exitOffset>0?`${props.style?.transform?`${props.style.transform} `:\"\"}translateY(${-exitOffset}px)`:props.style?.transform,willChange:\"transform\"}});});}// --- Markets Teaser scroll section -----------------------------------------\n// \"Refine\" + the triangle + the plus button stay pinned in the vertical middle\n// of the viewport (native position:sticky on the section's own inner frame --\n// no code needed for that part). What drives the rest here is a DISCRETE\n// active index (0/1/2, one per third of the scroll range) -- scrolling only\n// TRIGGERS a change to that index, it does not drive the animation itself.\n// Every visual property (list position, text color/opacity, icon rotation)\n// then animates to its new resting value via a shared CSS transition, so the\n// motion is a deliberate, always-smooth snap between 3 fixed states, never a\n// value hanging mid-way between two of them.\n//\n// Progress is read from a dedicated, plain marker element the same height as\n// the section (300vh) -- NOT the section's own tall wrapper. The wrapper\n// contains a position:sticky child, and this project already hit (and\n// documented, see withScrollHighlightVariant above) that a tall,\n// sticky-bearing container's own getBoundingClientRect() is not reliable to\n// measure directly. The marker is a plain absolutely-positioned twin with no\n// sticky descendant of its own, so its rect is trustworthy -- same technique\n// as the compare-card stack's dedicated dwell spacer.\nconst MARKETS_PROGRESS_MARKER_ELEMENT_ID=\"markets-progress-marker\";const MARKETS_ACTIVE_COLOR=\"rgb(255, 102, 26)\"// Brand/Electric Orange\n;const MARKETS_INACTIVE_COLOR=\"rgb(229, 229, 229)\"// Neutrals/Grey-100\n;const MARKETS_COUNT=3;// Opacity for a name at a given |activeIndex - index| distance. Only the\n// active market (distance 0) is ever the accent color; the other two are\n// always plain gray, just at different fixed opacity tiers -- distance 1\n// (the adjacent market) stays more visible than distance 2 (the far one).\nconst MARKETS_OPACITY_BY_DISTANCE=[1,.45,.15];// Shared CSS transition for color/opacity (transform-based motion below uses\n// an actual framer-motion spring instead, see MARKETS_SPRING) -- deliberately\n// NOT a function of scroll distance/speed. Scrolling across a third-boundary\n// just flips the discrete active index; this transition is what makes that\n// flip read as a fluid glide between two fixed states instead of an instant\n// cut. A slightly longer duration + gentler \"expo-out\" curve than before.\nconst MARKETS_TRANSITION=\"550ms cubic-bezier(0.16, 1, 0.3, 1)\";// True \"Mobile\" only (this project's XS breakpoint, <810px) -- NOT the same\n// 1200px cutoff MOBILE_BREAKPOINT_MAX_WIDTH above uses for the copy panels\n// (that one treats Tablet as mobile too; Tablet's market-name layout is fine\n// as-is and keeps the peeking neighbors).\nconst MARKETS_MOBILE_MAX_WIDTH=810;function isMarketsMobileViewport(){return typeof window!==\"undefined\"&&window.innerWidth<MARKETS_MOBILE_MAX_WIDTH;}function getMarketsScrollProgress(){if(typeof window===\"undefined\")return 0;const markerEl=getVisibleElementById(MARKETS_PROGRESS_MARKER_ELEMENT_ID);if(!markerEl)return 0;const rect=markerEl.getBoundingClientRect();const totalScrollable=rect.height-window.innerHeight;if(totalScrollable<=0)return 0;const scrolled=Math.min(Math.max(-rect.top,0),totalScrollable);return scrolled/totalScrollable;}// On true Mobile (<810px, this project's XS breakpoint) the section is no\n// longer a pinned scroll track -- the DSL collapses the XS wrapper to auto\n// height and makes its inner frame static (not sticky), so nothing scroll-\n// drives the active index there. Instead it auto-advances on a timer. Because\n// EVERY override in this section polls this one function each frame and\n// animates whenever the returned index changes, switching only the SOURCE of\n// the index here flips the whole thing (name reveal, plus-icon rotation,\n// overlay variant) to a timed auto-cycle -- no other code changes needed.\n// Desktop/Tablet keep the exact scroll-driven behavior unchanged.\nconst MARKETS_AUTOCYCLE_MS=1600;// The market-name HEADLINE keeps auto-cycling on mobile (the timer inside\n// getMarketsActiveIndex below). marketsMobileSelectedIndex is a SEPARATE value\n// that drives ONLY the opened overlay on mobile, so the overlay itself never\n// auto-cycles: it opens on whichever market was showing when the user opened it\n// (captured on the opening tap) and then changes only when the user taps a\n// market inside it. Desktop/Tablet ignore this entirely (scroll-driven).\nlet marketsMobileSelectedIndex=0;function setMarketsMobileSelectedIndex(index){if(index<0||index>=MARKETS_COUNT)return;marketsMobileSelectedIndex=index;}function getMarketsActiveIndex(){if(isMarketsMobileViewport()){if(typeof window===\"undefined\")return 0;return Math.floor(Date.now()/MARKETS_AUTOCYCLE_MS)%MARKETS_COUNT;}// Desktop/Tablet: the 0..1 scroll range splits into MARKETS_COUNT even\n// zones -- the only place scroll position is read as a number.\nconst progress=getMarketsScrollProgress();return Math.min(MARKETS_COUNT-1,Math.floor(progress*MARKETS_COUNT));}function makeMarketNameRevealOverride(index){return function(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const isStaticRenderer=useIsStaticRenderer();const rootRef=useRef(null);const lastActiveIndex=useRef(null);// Rich text renders its color on the actual text-bearing element (to\n// support per-run styling), not necessarily on whatever outer node this\n// style prop lands on -- a plain `style.color` from the override was\n// silently not reaching the real text. Setting it imperatively on the\n// root AND every descendant guarantees it wins regardless of exactly\n// where Framer applied the original inline color.\nconst applyState=useCallback(activeIndex=>{const el=rootRef.current;if(!el)return;const isActive=activeIndex===index;const isMobile=isMarketsMobileViewport();let color;let opacity;let textAlign=null;if(isMobile){// Mobile: no peeking neighbors at all -- only the active market is\n// ever visible, absolutely stacked on top of the others (removed\n// from flow) so a hidden one never pushes layout below it. This is\n// what actually fixed the overlap-with-later-content bug (the\n// stack's own clip/height was also wrong, fixed separately in the\n// DSL, but this is the real belt-and-suspenders fix).\n//\n// Spans left:0/right:0 of the parent (which has an explicit width\n// set in the DSL) rather than centering via the child's own\n// intrinsic width -- position:absolute children don't contribute to\n// an \"auto\" width parent's sizing, so centering via left:50% on a\n// now-collapsed parent pushed text off-screen. Full-width + center\n// text-align sidesteps needing the child's own width at all.\n// Mobile now ROLLS in-flow like Desktop (was: absolute crossfade).\n// The XS wrap is a one-line clipped window (set in the DSL) and the\n// list slides through it (withMarketsListTranslate), so only the\n// name rolled into place is visible; neighbours are clipped, not\n// stacked. Same opacity tiers as desktop so an incoming name reads\n// as it rolls up into place.\nconst distance=Math.abs(activeIndex-index);color=isActive?MARKETS_ACTIVE_COLOR:MARKETS_INACTIVE_COLOR;opacity=MARKETS_OPACITY_BY_DISTANCE[Math.min(distance,MARKETS_OPACITY_BY_DISTANCE.length-1)];textAlign=\"center\";el.style.removeProperty(\"position\");el.style.removeProperty(\"top\");el.style.removeProperty(\"left\");el.style.removeProperty(\"right\");el.style.removeProperty(\"transform\");el.style.removeProperty(\"pointer-events\");}else{// Desktop/Tablet: unchanged -- adjacent/far neighbors still peek\n// through at their fixed opacity tiers, positioned by the normal\n// document-flow list (withMarketsListTranslate slides the list).\nconst distance=Math.abs(activeIndex-index);color=isActive?MARKETS_ACTIVE_COLOR:MARKETS_INACTIVE_COLOR;opacity=MARKETS_OPACITY_BY_DISTANCE[Math.min(distance,MARKETS_OPACITY_BY_DISTANCE.length-1)];el.style.removeProperty(\"position\");el.style.removeProperty(\"top\");el.style.removeProperty(\"left\");el.style.removeProperty(\"right\");el.style.removeProperty(\"transform\");el.style.removeProperty(\"pointer-events\");el.style.removeProperty(\"text-align\");}const apply=target=>{target.style.setProperty(\"color\",color);target.style.setProperty(\"transition\",`color ${MARKETS_TRANSITION}, opacity ${MARKETS_TRANSITION}`);if(textAlign)target.style.setProperty(\"text-align\",textAlign);else target.style.removeProperty(\"text-align\");};apply(el);el.querySelectorAll(\"*\").forEach(apply);// Opacity goes on the root ONLY -- unlike color (which needs\n// setting on every descendant since rich text renders its real\n// color on a nested span, not necessarily the root), CSS opacity\n// on an ancestor already visually affects its whole subtree.\n// Setting it again on descendants compounds multiplicatively\n// (0.45 on both a wrapper and its child text run renders at\n// ~0.2, not 0.45), which is what was making inactive markets\n// render far fainter than the intended opacity tiers.\nel.style.setProperty(\"opacity\",String(opacity));},[]);const update=useCallback(()=>{const activeIndex=getMarketsActiveIndex();// Keyed on mobile-ness too, not just the index -- otherwise resizing\n// a live window across the mobile breakpoint with the index unchanged\n// would never re-apply the different (absolute vs flow) treatment.\nconst key=`${activeIndex}:${isMarketsMobileViewport()}`;if(lastActiveIndex.current===key)return;lastActiveIndex.current=key;applyState(activeIndex);},[applyState]);useEffect(()=>{// Apply the correct initial state even during static rendering (a\n// screenshot / first paint), just not the scroll listener itself.\napplyState(0);lastActiveIndex.current=null;if(isStaticRenderer||typeof window===\"undefined\")return;// Polls every frame via rAF instead of listening for \"scroll\" --\n// a plain window scroll listener silently never fires if anything\n// (a smooth-scroll effect, a custom scroll container, etc.) is\n// virtualizing scroll instead of using real native document\n// scroll, which is exactly what made this section's highlight\n// freeze in place in production while still looking fine in\n// Framer's own preview. Polling re-measures the marker's actual\n// rendered position directly, so it's correct regardless of\n// what's driving the scroll. `update` already bails out cheaply\n// (see the key check above) when the index hasn't changed, so\n// this doesn't flood style writes.\nlet rafId;const loop=()=>{update();rafId=window.requestAnimationFrame(loop);};rafId=window.requestAnimationFrame(loop);return()=>window.cancelAnimationFrame(rafId);},[isStaticRenderer,update,applyState]);// Mobile only: tapping the (still auto-cycling) headline to open the\n// overlay captures whichever market is showing at that instant, so\n// the overlay opens on THAT market. The tap keeps bubbling to the\n// row's overlay-open interaction. The headline itself keeps cycling.\nuseEffect(()=>{if(isStaticRenderer||typeof window===\"undefined\")return;const el=rootRef.current;if(!el)return;const onClick=()=>{if(isMarketsMobileViewport()){setMarketsMobileSelectedIndex(getMarketsActiveIndex());}};el.addEventListener(\"click\",onClick);return()=>el.removeEventListener(\"click\",onClick);// eslint-disable-next-line react-hooks/exhaustive-deps\n},[isStaticRenderer]);const setRefs=useCallback(node=>{rootRef.current=node;if(typeof ref===\"function\")ref(node);else if(ref)ref.current=node;},[ref]);// The 3 names sit in a plain vertical list in normal document order\n// (never overlapping) -- only the active one is ever accent-colored;\n// the other two are always plain gray, distinguished solely by a fixed\n// opacity tier for their distance from active. The list as a whole is\n// what moves: see withMarketsListTranslate below, attached to the\n// list's own clipped one-line window, so the active name is always the\n// one sitting in that window (aligned with \"Refine\"/the triangle).\nreturn /*#__PURE__*/_jsx(Component,{ref:setRefs,...props});});};}// A shared spring config for every transform-based transition in this\n// section (list slide, icon rotation) -- gentle enough to feel smooth and\n// alive rather than a flat eased cut, matching the same technique already\n// used elsewhere in this project (the image carousel's drag-settle spring).\nconst MARKETS_SPRING={type:\"spring\",stiffness:260,damping:30,mass:1};// A slower, softer spring for the MOBILE auto-cycle roll only -- desktop's\n// scroll-driven snap keeps the quicker MARKETS_SPRING above. Lower stiffness +\n// a bit more mass makes the name roll glide unhurriedly (the client explicitly\n// asked for it not to feel fast). ~1.06 damping ratio = smooth, no overshoot.\nconst MARKETS_MOBILE_ROLL_SPRING={type:\"spring\",stiffness:60,damping:18,mass:1.2};// The market-name window (the canvas node this attaches to) is clipped to\n// exactly one line's height. This override springs the whole list inside it\n// to the active index's resting position -- using the actual rendered gap\n// between the first two items (via a ref on the list itself) rather than a\n// guessed pixel constant, so the distance always exactly matches one line\n// regardless of font metrics. Driven by an imperative framer-motion spring\n// (not a flat CSS transition) so it decelerates naturally and, if the active\n// index changes again before settling, continues smoothly from its current\n// position/velocity instead of restarting a fixed-duration ease from scratch.\nexport function withMarketsListTranslate(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const isStaticRenderer=useIsStaticRenderer();const rootRef=useRef(null);const translateY=useMotionValue(0);const lastActiveIndex=useRef(null);useEffect(()=>{const el=rootRef.current;const unsubscribe=translateY.on(\"change\",latest=>{if(!el)return;el.style.transform=`${props.style?.transform?`${props.style.transform} `:\"\"}translateY(${latest}px)`;});return unsubscribe;// eslint-disable-next-line react-hooks/exhaustive-deps\n},[]);const update=useCallback(()=>{const activeIndex=getMarketsActiveIndex();const key=`${activeIndex}:${isMarketsMobileViewport()}`;if(lastActiveIndex.current===key)return;lastActiveIndex.current=key;const el=rootRef.current;if(!el)return;const items=Array.from(el.children);if(items.length<2)return;const step=items[1].offsetTop-items[0].offsetTop;if(step<=0)return;// Mobile rolls the list on a slower, gentler spring than desktop's\n// scroll-snap (client asked for an unhurried roll); it slides inside a\n// one-line clipped wrap (set in the DSL) so only one name shows at rest.\nconst spring=isMarketsMobileViewport()?MARKETS_MOBILE_ROLL_SPRING:MARKETS_SPRING;animate(translateY,-activeIndex*step,spring);},[translateY]);useEffect(()=>{if(isStaticRenderer||typeof window===\"undefined\")return;// See the identical comment on makeMarketNameRevealOverride's effect\n// above -- rAF polling instead of a \"scroll\" listener, since the\n// latter silently never fires whenever something virtualizes scroll.\nlet rafId;const loop=()=>{update();rafId=window.requestAnimationFrame(loop);};rafId=window.requestAnimationFrame(loop);return()=>window.cancelAnimationFrame(rafId);},[isStaticRenderer,update]);const setRefs=useCallback(node=>{rootRef.current=node;if(node)node.style.transform=`translateY(${translateY.get()}px)`;if(typeof ref===\"function\")ref(node);else if(ref)ref.current=node;},[ref,translateY]);return /*#__PURE__*/_jsx(Component,{ref:setRefs,...props,style:{...props.style,willChange:\"transform\"}});});}// Rotates only the plus icon glyph (not the button's background frame) by\n// +90deg per market transition. The rotation only ever rests at an exact\n// multiple of 90deg (0/90/180) -- it changes solely when the discrete active\n// index changes, springing there (same shared spring as the list slide) so\n// it's never possible to land mid-scroll on an in-between angle, and rapid\n// successive transitions carry momentum instead of restarting.\nexport function withMarketsPlusIconRotate(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const isStaticRenderer=useIsStaticRenderer();const rootRef=useRef(null);const rotation=useMotionValue(0);const lastActiveIndex=useRef(null);// Mobile auto-cycle only advances forward, so its rotation accumulates\n// (never resets to activeIndex*90) to avoid a backwards spin on the 2->0 wrap.\nconst rotationAccum=useRef(0);// Mobile only: tapping the plus (which opens the overlay) captures the\n// currently-cycling market so the overlay opens on it. Bubbles on to the\n// row's overlay-open interaction; headline keeps cycling.\nuseEffect(()=>{if(isStaticRenderer||typeof window===\"undefined\")return;const el=rootRef.current;if(!el)return;const onClick=()=>{if(isMarketsMobileViewport()){setMarketsMobileSelectedIndex(getMarketsActiveIndex());}};el.addEventListener(\"click\",onClick);return()=>el.removeEventListener(\"click\",onClick);// eslint-disable-next-line react-hooks/exhaustive-deps\n},[isStaticRenderer]);useEffect(()=>{const unsubscribe=rotation.on(\"change\",latest=>{const el=rootRef.current;if(!el)return;el.style.transform=`${props.style?.transform?`${props.style.transform} `:\"\"}rotate(${latest}deg)`;});return unsubscribe;// eslint-disable-next-line react-hooks/exhaustive-deps\n},[]);const update=useCallback(()=>{const activeIndex=getMarketsActiveIndex();if(lastActiveIndex.current===activeIndex)return;lastActiveIndex.current=activeIndex;if(isMarketsMobileViewport()){// Forward-only: +90 per advance (so 2->0 keeps turning the same\n// way), on the slower mobile-roll spring to match the name roll.\nrotationAccum.current+=90;animate(rotation,rotationAccum.current,MARKETS_MOBILE_ROLL_SPRING);return;}animate(rotation,activeIndex*90,MARKETS_SPRING);},[rotation]);useEffect(()=>{if(isStaticRenderer||typeof window===\"undefined\")return;// See the identical comment on makeMarketNameRevealOverride's effect\n// above -- rAF polling instead of a \"scroll\" listener, since the\n// latter silently never fires whenever something virtualizes scroll.\nlet rafId;const loop=()=>{update();rafId=window.requestAnimationFrame(loop);};rafId=window.requestAnimationFrame(loop);return()=>window.cancelAnimationFrame(rafId);},[isStaticRenderer,update]);const setRefs=useCallback(node=>{rootRef.current=node;if(node)node.style.transform=`rotate(${rotation.get()}deg)`;if(typeof ref===\"function\")ref(node);else if(ref)ref.current=node;},[ref,rotation]);return /*#__PURE__*/_jsx(Component,{ref:setRefs,...props,style:{...props.style,willChange:\"transform\"}});});}export function withMarketName0(Component){return makeMarketNameRevealOverride(0)(Component);}export function withMarketName1(Component){return makeMarketNameRevealOverride(1)(Component);}export function withMarketName2(Component){return makeMarketNameRevealOverride(2)(Component);}// There is a single, permanent plus button + one shared overlay (listing all\n// 3 markets) triggered by the whole sticky row -- see the row's own onTap in\n// the DSL, not a code override. Only the icon glyph inside it rotates (see\n// withMarketsPlusIconRotate above).\n// The overlay's own content is one shared \"Overlay Dropdown\" list component\n// per market (not 3 duplicate overlays) -- this keeps its `$control__variant`\n// prop (\"Active\" / \"Default\") in sync with whichever market is currently\n// highlighted in the scroll section, using the exact same discrete\n// `getMarketsActiveIndex()` the rest of this section reads from.\n//\n// The component's own built-in click behavior toggles its OWN variant with no\n// awareness of its siblings, which is what let all 3 be expanded at once.\n// `manualIndex` here is a single shared \"which one did the user explicitly\n// click\" value (null = none yet, defer to the scroll-highlighted market) --\n// every instance reads the SAME value, so only one is ever \"Active\": clicking\n// one sets this store to its own index, which simultaneously flips the\n// previously-open one back to \"Default\" on its next render. Reset to null on\n// each mount so a freshly-opened overlay starts by matching scroll again,\n// until the user clicks something themselves.\nconst useOverlayAccordionStore=createStore({manualIndex:null});function makeMarketOverlayVariantOverride(index){return function(Component){return /*#__PURE__*/forwardRef((props,ref)=>{const isStaticRenderer=useIsStaticRenderer();const[store,setStore]=useOverlayAccordionStore();const[scrollActiveIndex,setScrollActiveIndex]=useState(0);const rootRef=useRef(null);const lastScrollActiveIndex=useRef(null);const updateFromScroll=useCallback(()=>{// On mobile the overlay must NOT auto-cycle: read the tap-driven\n// marketsMobileSelectedIndex (changes only when the user taps)\n// instead of the auto-cycling timer index. Desktop/Tablet stay\n// scroll-driven exactly as before.\nconst activeIndex=isMarketsMobileViewport()?marketsMobileSelectedIndex:getMarketsActiveIndex();if(lastScrollActiveIndex.current===activeIndex)return;lastScrollActiveIndex.current=activeIndex;startTransition(()=>setScrollActiveIndex(activeIndex));},[]);useEffect(()=>{setStore({manualIndex:null});updateFromScroll();if(isStaticRenderer||typeof window===\"undefined\")return;// See the identical comment on makeMarketNameRevealOverride's\n// effect above -- rAF polling instead of a \"scroll\" listener,\n// since the latter silently never fires whenever something\n// virtualizes scroll.\nlet rafId;const loop=()=>{updateFromScroll();rafId=window.requestAnimationFrame(loop);};rafId=window.requestAnimationFrame(loop);return()=>window.cancelAnimationFrame(rafId);// eslint-disable-next-line react-hooks/exhaustive-deps\n},[isStaticRenderer,updateFromScroll]);// Native listener (not relying on the component forwarding an onClick\n// prop) so this fires regardless of how the component's own internal\n// click handling works -- it only records \"the user picked this one\",\n// it never tries to prevent/replace whatever the component itself does\n// with the click.\nuseEffect(()=>{if(isStaticRenderer||typeof window===\"undefined\")return;const el=rootRef.current;if(!el)return;const onClick=()=>{// Mobile: taps drive the shared selected index (read by the\n// poll above) so the tapped market reveals and stays until\n// the user picks another -- no auto-cycle in the overlay.\nif(isMarketsMobileViewport())setMarketsMobileSelectedIndex(index);else setStore({manualIndex:index});};el.addEventListener(\"click\",onClick);return()=>el.removeEventListener(\"click\",onClick);},[isStaticRenderer,setStore]);const setRefs=useCallback(node=>{rootRef.current=node;if(typeof ref===\"function\")ref(node);else if(ref)ref.current=node;},[ref]);const effectiveIndex=store.manualIndex!==null?store.manualIndex:scrollActiveIndex;const variant=effectiveIndex===index?\"Active\":\"Default\";return /*#__PURE__*/_jsx(Component,{ref:setRefs,...props,$control__variant:variant,variant:variant});});};}export function withMarketOverlayVariant0(Component){return makeMarketOverlayVariantOverride(0)(Component);}export function withMarketOverlayVariant1(Component){return makeMarketOverlayVariantOverride(1)(Component);}export function withMarketOverlayVariant2(Component){return makeMarketOverlayVariantOverride(2)(Component);}\nexport const __FramerMetadata__ = {\"exports\":{\"withRandomColor\":{\"type\":\"reactHoc\",\"name\":\"withRandomColor\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withExpandToggleSection2\":{\"type\":\"reactHoc\",\"name\":\"withExpandToggleSection2\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withExpandToggleSection3\":{\"type\":\"reactHoc\",\"name\":\"withExpandToggleSection3\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withMarketName0\":{\"type\":\"reactHoc\",\"name\":\"withMarketName0\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withMarketName2\":{\"type\":\"reactHoc\",\"name\":\"withMarketName2\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withCompareStackStyles\":{\"type\":\"reactHoc\",\"name\":\"withCompareStackStyles\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withExpandToggleSection1\":{\"type\":\"reactHoc\",\"name\":\"withExpandToggleSection1\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withExpandableCopySection1\":{\"type\":\"reactHoc\",\"name\":\"withExpandableCopySection1\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withScrollHighlightVariant\":{\"type\":\"reactHoc\",\"name\":\"withScrollHighlightVariant\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withHideOnScrollDirection\":{\"type\":\"reactHoc\",\"name\":\"withHideOnScrollDirection\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withMarketsPlusIconRotate\":{\"type\":\"reactHoc\",\"name\":\"withMarketsPlusIconRotate\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withHover\":{\"type\":\"reactHoc\",\"name\":\"withHover\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withExpandableCopySection3\":{\"type\":\"reactHoc\",\"name\":\"withExpandableCopySection3\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withMarketOverlayVariant2\":{\"type\":\"reactHoc\",\"name\":\"withMarketOverlayVariant2\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withRotate\":{\"type\":\"reactHoc\",\"name\":\"withRotate\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withMarketName1\":{\"type\":\"reactHoc\",\"name\":\"withMarketName1\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withExpandableCopySection2\":{\"type\":\"reactHoc\",\"name\":\"withExpandableCopySection2\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withMarketOverlayVariant0\":{\"type\":\"reactHoc\",\"name\":\"withMarketOverlayVariant0\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withMarketsListTranslate\":{\"type\":\"reactHoc\",\"name\":\"withMarketsListTranslate\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withMarketOverlayVariant1\":{\"type\":\"reactHoc\",\"name\":\"withMarketOverlayVariant1\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withCompareCardExit\":{\"type\":\"reactHoc\",\"name\":\"withCompareCardExit\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./Examples.map"],"mappings":"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"}