{"version":3,"file":"LandingGrid.CP_zEOYR.mjs","names":["React","e","T","p","React","p"],"sources":["https:/framerusercontent.com/modules/E1IwyvRWgM7l8ivu3HAK/PXK7hJZGBPKqLak5Efgc/FlipLogoGrid.js","https:/framerusercontent.com/modules/l4rflN6PTxoPPAcAD0WK/z2QU9ySDKKWvVsuIr1wj/LandingGrid.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import React from\"react\";import{addPropertyControls,ControlType}from\"framer\";/**\n * FlippingLogoGrid\n * ────────────────────────────────────────────────────────────\n * A responsive grid of logo \"slots\" where each slot can hold 1–3 logos\n * that flip in and out over time (3D card flip on the X axis).\n *\n * • Logos are visually normalized to a common rendered height.\n * • Logos are auto-recolored to a single flat color (black by default)\n *   using each PNG/SVG's alpha channel as a mask.\n * • Each slot flips on its own staggered, jittered schedule so the grid\n *   never flips in unison.\n * • You set how many columns AND rows are visible per breakpoint — the\n *   grid shows exactly columns × rows slots (extras are ignored).\n *\n * Each slot has up to three explicit logo fields (A / B / C). Provide an\n * uploaded image OR paste an image URL for each. Slots with 2–3 logos flip.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight auto\n * @framerIntrinsicWidth 1000\n * @framerIntrinsicHeight 384\n */// ── Tokens ────────────────────────────────────────────────────────────────\nconst T={bg:\"rgb(255, 255, 255)\",border:\"rgb(232, 235, 237)\",placeholder:\"rgb(247, 247, 247)\",placeholderText:\"rgb(147, 149, 153)\"};// ── Hook: container width ─────────────────────────────────────────────────\nfunction useContainerWidth(){const ref=React.useRef(null);const[w,setW]=React.useState(0);React.useEffect(()=>{if(!ref.current)return;const el=ref.current;const ro=new ResizeObserver(entries=>{for(const e of entries)setW(e.contentRect.width);});ro.observe(el);return()=>ro.disconnect();},[]);return[ref,w];}// Framer's Image control returns a URL string or { src, srcSet, alt }.\n// A pasted URL string (imageUrl) takes priority when present.\nfunction resolveImageSrc(logo){if(!logo)return undefined;if(logo.imageUrl&&logo.imageUrl.trim())return logo.imageUrl.trim();const image=logo.image;if(!image)return undefined;if(typeof image===\"string\")return image;if(typeof image===\"object\")return image.src||image.url||undefined;return undefined;}// Collect the 1–3 present logos for a slot.\nfunction slotLogos(slot){const out=[];for(const key of[\"logoA\",\"logoB\",\"logoC\"]){const l=slot[key];if(!l)continue;const src=resolveImageSrc(l);if(src)out.push({src,alt:l.alt,heightOverride:l.heightOverride||0});}// Always render at least an (empty) placeholder so the cell isn't blank.\nif(out.length===0)out.push({heightOverride:0});return out;}// ── Optical sizing ──────────────────────────────────────────────────────────\n// Capping every logo to the same HEIGHT makes wide wordmarks look huge and\n// compact/square marks look tiny (they all share a height but differ wildly in\n// width → unequal visual mass). To equalize, we normalize by AREA: measure each\n// logo's aspect ratio and give squarer logos more height, very wide ones less,\n// so each carries roughly the same visual weight. `strength` blends between\n// pure-height (0) and full area-equalization (1).\nconst OPT_REF_ASPECT=3// a \"typical\" wordmark; logos near this stay ~unchanged\n;const OPT_MIN_FACTOR=.62;const OPT_MAX_FACTOR=1.62;function opticalHeight(baseHeight,aspect,enabled,strength){if(!enabled||!aspect||aspect<=0)return baseHeight;const k=.5*Math.max(0,Math.min(1,strength));let factor=Math.pow(OPT_REF_ASPECT/aspect,k);factor=Math.max(OPT_MIN_FACTOR,Math.min(OPT_MAX_FACTOR,factor));return baseHeight*factor;}// Measure an image's natural aspect ratio (width / height).\nfunction useAspect(src){const[aspect,setAspect]=React.useState(0);React.useEffect(()=>{if(!src){setAspect(0);return;}let alive=true;const img=new Image;img.onload=()=>{if(alive&&img.naturalWidth&&img.naturalHeight){setAspect(img.naturalWidth/img.naturalHeight);}};img.src=src;return()=>{alive=false;};},[src]);return aspect;}// ── One logo, rendered (mask or img) ────────────────────────────────────────\nfunction LogoArt({logo,baseHeight,opticalSizing,opticalStrength,effectiveMode,logoColor}){const useMask=effectiveMode===\"black\"||effectiveMode===\"custom\";const fillColor=effectiveMode===\"black\"?\"#000000\":logoColor;const imgSrc=logo.src;const aspect=useAspect(imgSrc);// Per-logo override always wins; otherwise apply optical normalization.\nconst imgHeight=logo.heightOverride&&logo.heightOverride>0?logo.heightOverride:opticalHeight(baseHeight,aspect,opticalSizing,opticalStrength);if(!imgSrc){return /*#__PURE__*/_jsx(\"div\",{style:{height:imgHeight,width:\"70%\",backgroundColor:T.placeholder,color:T.placeholderText,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",fontFamily:\"SF Mono, Menlo, monospace\",fontSize:10,letterSpacing:\"0.06em\",textTransform:\"uppercase\",borderRadius:4},children:\"logo\"});}if(useMask){return /*#__PURE__*/_jsx(\"div\",{\"aria-label\":logo.alt||\"\",role:\"img\",style:{height:imgHeight,width:\"100%\",maxWidth:\"100%\",margin:\"0 auto\",backgroundColor:fillColor,WebkitMaskImage:`url(\"${imgSrc}\")`,maskImage:`url(\"${imgSrc}\")`,WebkitMaskRepeat:\"no-repeat\",maskRepeat:\"no-repeat\",WebkitMaskPosition:\"center\",maskPosition:\"center\",WebkitMaskSize:\"contain\",maskSize:\"contain\",flexShrink:0}});}return /*#__PURE__*/_jsx(\"img\",{src:imgSrc,alt:logo.alt||\"\",style:{height:imgHeight,width:\"auto\",maxWidth:\"100%\",objectFit:\"contain\",display:\"block\",margin:\"0 auto\",flexShrink:0,filter:effectiveMode===\"grayscale\"?\"grayscale(100%)\":\"none\"}});}// ── Single slot (flips through its logos) ───────────────────────────────────\nfunction FlipSlot({logos,cellHeight,logoHeight,opticalSizing,opticalStrength,paddingX,paddingY,colorMode,logoColor,opacity,hoverColorize,link,newTab,label,showSlotInfo,showRightDivider,showBottomDivider,dividerColor,shown,enterDelay,enterDuration,enterOffset,flipInterval,flipDuration,firstDelay,jitter}){const[hover,setHover]=React.useState(false);const count=logos.length;const[idx,setIdx]=React.useState(0);const[angle,setAngle]=React.useState(0);const[animOn,setAnimOn]=React.useState(true);// Keep idx valid if the logo set shrinks.\nReact.useEffect(()=>{setIdx(i=>i>=count?0:i);},[count]);// ── Flip loop ──\nReact.useEffect(()=>{if(count<=1||!shown)return;let cancelled=false;const timers=[];const flipOnce=()=>{if(cancelled)return;setAnimOn(true);setAngle(90);timers.push(setTimeout(()=>{if(cancelled)return;setAnimOn(false);setAngle(-90);setIdx(i=>(i+1)%count);requestAnimationFrame(()=>requestAnimationFrame(()=>{if(cancelled)return;setAnimOn(true);setAngle(0);}));},flipDuration));};const schedule=()=>{if(cancelled)return;const wait=flipInterval+Math.random()*jitter;timers.push(setTimeout(()=>{flipOnce();schedule();},wait));};timers.push(setTimeout(schedule,firstDelay));return()=>{cancelled=true;timers.forEach(clearTimeout);};},[count,shown,flipInterval,flipDuration,firstDelay,jitter]);const effectiveMode=hover&&hoverColorize?\"original\":colorMode;const op=hover&&hoverColorize?1:opacity;const logo=logos[Math.min(idx,count-1)]||logos[0];const flipOpacity=Math.max(0,Math.cos(angle*Math.PI/180));const cellStyle={display:\"flex\",alignItems:\"center\",justifyContent:\"center\",padding:`${paddingY}px ${paddingX}px`,boxSizing:\"border-box\",minWidth:0,height:cellHeight+paddingY*2,overflow:\"visible\",borderRight:showRightDivider?`1px solid ${dividerColor}`:undefined,borderBottom:showBottomDivider?`1px solid ${dividerColor}`:undefined,position:\"relative\",perspective:600};const flipStyle={display:\"flex\",alignItems:\"center\",justifyContent:\"center\",width:\"100%\",transformStyle:\"preserve-3d\",backfaceVisibility:\"hidden\",transform:`rotateX(${angle}deg)`,opacity:(count>1?flipOpacity:1)*op,transition:animOn?`transform ${flipDuration}ms cubic-bezier(0.22, 1, 0.36, 1), opacity ${flipDuration}ms ease`:\"none\",willChange:\"transform\"};const enterStyle={width:\"100%\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",opacity:shown?1:0,transform:shown?\"translateY(0)\":`translateY(${enterOffset}px)`,transitionProperty:\"opacity, transform\",transitionDuration:`${enterDuration}ms, ${enterDuration}ms`,transitionTimingFunction:\"cubic-bezier(0.22, 1, 0.36, 1)\",transitionDelay:`${enterDelay}ms, ${enterDelay}ms`};// Optional authoring badge: how many logos this slot holds + which is showing.\nconst badge=showSlotInfo?/*#__PURE__*/_jsxs(\"div\",{style:{position:\"absolute\",top:4,left:4,zIndex:2,display:\"flex\",alignItems:\"center\",gap:4,padding:\"2px 6px\",borderRadius:5,background:\"rgba(31,31,33,0.82)\",color:\"#fff\",fontFamily:\"SF Mono, Menlo, monospace\",fontSize:9,lineHeight:1.4,letterSpacing:\"0.04em\",pointerEvents:\"none\",whiteSpace:\"nowrap\"},children:[/*#__PURE__*/_jsxs(\"span\",{style:{fontWeight:700},children:[count,\"\\xd7\"]}),/*#__PURE__*/_jsxs(\"span\",{style:{opacity:.75},children:[label?label+\" \\xb7 \":\"\",Math.min(idx,count-1)+1,\"/\",count]})]}):null;const content=/*#__PURE__*/_jsx(\"div\",{style:enterStyle,children:/*#__PURE__*/_jsx(\"div\",{style:flipStyle,children:logo?/*#__PURE__*/_jsx(LogoArt,{logo:logo,baseHeight:logoHeight,opticalSizing:opticalSizing,opticalStrength:opticalStrength,effectiveMode:effectiveMode,logoColor:logoColor}):null})});if(link){return /*#__PURE__*/_jsxs(\"a\",{href:link,target:newTab?\"_blank\":undefined,rel:newTab?\"noopener noreferrer\":undefined,onMouseEnter:()=>setHover(true),onMouseLeave:()=>setHover(false),style:{...cellStyle,textDecoration:\"none\"},children:[badge,content]});}return /*#__PURE__*/_jsxs(\"div\",{onMouseEnter:()=>setHover(true),onMouseLeave:()=>setHover(false),style:cellStyle,children:[badge,content]});}// ── Main component ──────────────────────────────────────────────────────────\nexport default function FlippingLogoGrid(props){const{slots,logoHeight,opticalSizing,opticalStrength,showSlotInfo,desktopColumns,desktopRows,mobileColumns,mobileRows,gap,mobileGap,mobileBreakpoint,cellPaddingX,cellPaddingY,showDividers,dividerColor,borderTop,borderRight,borderBottom,borderLeft,outerBorderWidth,outerBorderColor,background,colorMode,logoColor,logoOpacity,hoverColorize,flipInterval,flipDuration,flipStagger,flipJitter,animate,animateStagger,animateDuration,animateOffset,animateOnView}=props;const[ref,width]=useContainerWidth();const isMobile=width>0&&width<mobileBreakpoint;// ── Entrance animation ──\nconst[shown,setShown]=React.useState(!animate);const triggeredRef=React.useRef(false);React.useEffect(()=>{if(!animate){setShown(true);return;}setShown(false);triggeredRef.current=false;if(!animateOnView){const t=setTimeout(()=>setShown(true),50);return()=>clearTimeout(t);}const el=ref.current;if(!el||typeof IntersectionObserver===\"undefined\"){setShown(true);return;}const io=new IntersectionObserver(entries=>{for(const e of entries){if(e.isIntersecting&&!triggeredRef.current){triggeredRef.current=true;setShown(true);io.disconnect();}}},{threshold:.15});io.observe(el);return()=>io.disconnect();},[animate,animateOnView]);const columns=isMobile?mobileColumns:desktopColumns;const rows=isMobile?mobileRows:desktopRows;const maxCells=Math.max(1,columns)*Math.max(1,rows);const effectiveGap=isMobile&&mobileGap>=0?mobileGap:gap;// Pick the slots to show: on mobile, only those flagged for mobile; then\n// cap to exactly columns × rows for the active breakpoint.\nconst visible=React.useMemo(()=>{const pool=isMobile?slots.filter(s=>s.showOnMobile):slots;return pool.slice(0,maxCells);},[slots,isMobile,maxCells]);const ob=`${outerBorderWidth}px solid ${outerBorderColor}`;const gridStyle={display:\"grid\",gridTemplateColumns:`repeat(${columns}, minmax(0, 1fr))`,gap:showDividers?0:effectiveGap,width:\"100%\",backgroundColor:background,boxSizing:\"border-box\",borderTop:borderTop?ob:undefined,borderRight:borderRight?ob:undefined,borderBottom:borderBottom?ob:undefined,borderLeft:borderLeft?ob:undefined};return /*#__PURE__*/_jsx(\"div\",{ref:ref,style:{width:\"100%\"},children:/*#__PURE__*/_jsx(\"div\",{style:gridStyle,children:visible.map((slot,i)=>{const col=i%columns;const row=Math.floor(i/columns);const totalRows=Math.ceil(visible.length/columns);const isLastCol=col===columns-1;const isLastRow=row===totalRows-1;const logos=slotLogos(slot);return /*#__PURE__*/_jsx(FlipSlot,{logos:logos,cellHeight:logoHeight,logoHeight:logoHeight,opticalSizing:opticalSizing,opticalStrength:opticalStrength,paddingX:cellPaddingX,paddingY:cellPaddingY,colorMode:colorMode,logoColor:logoColor,opacity:logoOpacity,hoverColorize:hoverColorize,link:slot.link,newTab:slot.newTab,label:slot.label,showSlotInfo:showSlotInfo,showRightDivider:showDividers&&!isLastCol,showBottomDivider:showDividers&&!isLastRow,dividerColor:dividerColor,shown:shown,enterDelay:animate?i*animateStagger:0,enterDuration:animate?animateDuration:0,enterOffset:animate?animateOffset:0,flipInterval:flipInterval,flipDuration:flipDuration,firstDelay:i*flipStagger+i*977%1e3*(flipJitter/1e3),jitter:flipJitter},i);})})});}// ── Property controls ─────────────────────────────────────────────────────\n// One reusable logo control (image OR pasted URL).\nconst logoControl=(title,hideDesc)=>({type:ControlType.Object,title,controls:{image:{type:ControlType.Image,title:\"Upload\"},imageUrl:{type:ControlType.String,title:\"Or URL\",placeholder:\"https://…/logo.png\",description:hideDesc?undefined:\"Paste an image URL — overrides Upload if set.\"},alt:{type:ControlType.String,title:\"Alt\",defaultValue:\"\"},heightOverride:{type:ControlType.Number,title:\"Height\",description:\"Override default height (px). 0 = use default.\",min:0,max:200,step:1,defaultValue:0}}});addPropertyControls(FlippingLogoGrid,{slots:{type:ControlType.Array,title:\"Slots\",control:{type:ControlType.Object,controls:{label:{type:ControlType.String,title:\"Label\",placeholder:\"e.g. CVC / Bridgepoint\",description:\"Just to identify this slot (and show in the count badge). Framer always names rows “Object”.\",defaultValue:\"\"},logoA:logoControl(\"Logo 1\"),logoB:logoControl(\"Logo 2 (flips)\",true),logoC:logoControl(\"Logo 3 (flips)\",true),showOnMobile:{type:ControlType.Boolean,title:\"On mobile\",defaultValue:true,enabledTitle:\"Show\",disabledTitle:\"Hide\"},link:{type:ControlType.Link,title:\"Link\"},newTab:{type:ControlType.Boolean,title:\"New tab\",defaultValue:false}}},defaultValue:[{showOnMobile:true,newTab:false},{showOnMobile:true,newTab:false},{showOnMobile:true,newTab:false},{showOnMobile:false,newTab:false},{showOnMobile:false,newTab:false},{showOnMobile:false,newTab:false},{showOnMobile:true,newTab:false},{showOnMobile:true,newTab:false},{showOnMobile:true,newTab:false},{showOnMobile:false,newTab:false},{showOnMobile:false,newTab:false},{showOnMobile:false,newTab:false}]},logoHeight:{type:ControlType.Number,title:\"Logo height\",min:12,max:160,step:1,defaultValue:32},opticalSizing:{type:ControlType.Boolean,title:\"Optical size\",description:\"Equalize visual weight by area — squarer logos get more height, very wide ones less — so they all feel the same size.\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},opticalStrength:{type:ControlType.Number,title:\"  Balance\",description:\"0 = same height for all, 1 = fully equalized area.\",min:0,max:1,step:.05,defaultValue:.7,hidden:p=>!p.opticalSizing},showSlotInfo:{type:ControlType.Boolean,title:\"Slot badges\",description:\"Show a small badge in each cell with its logo count — handy while authoring, turn off for production.\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},desktopColumns:{type:ControlType.Number,title:\"Desktop cols\",min:1,max:12,step:1,defaultValue:6,displayStepper:true},desktopRows:{type:ControlType.Number,title:\"Desktop rows\",min:1,max:12,step:1,defaultValue:2,displayStepper:true},mobileColumns:{type:ControlType.Number,title:\"Mobile cols\",min:1,max:6,step:1,defaultValue:3,displayStepper:true},mobileRows:{type:ControlType.Number,title:\"Mobile rows\",min:1,max:12,step:1,defaultValue:2,displayStepper:true},gap:{type:ControlType.Number,title:\"Gap\",min:0,max:120,step:1,defaultValue:32},mobileGap:{type:ControlType.Number,title:\"Mobile gap\",description:\"−1 = match desktop.\",min:-1,max:120,step:1,defaultValue:-1},mobileBreakpoint:{type:ControlType.Number,title:\"Mobile <\",min:320,max:1200,step:1,defaultValue:810},cellPaddingX:{type:ControlType.Number,title:\"Cell pad X\",min:0,max:80,step:1,defaultValue:24},cellPaddingY:{type:ControlType.Number,title:\"Cell pad Y\",min:0,max:80,step:1,defaultValue:22},showDividers:{type:ControlType.Boolean,title:\"Dividers\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},dividerColor:{type:ControlType.Color,title:\"  Color\",defaultValue:\"#E8EBED\",hidden:p=>!p.showDividers},borderTop:{type:ControlType.Boolean,title:\"Border top\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},borderRight:{type:ControlType.Boolean,title:\"Border right\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},borderBottom:{type:ControlType.Boolean,title:\"Border bottom\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},borderLeft:{type:ControlType.Boolean,title:\"Border left\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},outerBorderWidth:{type:ControlType.Number,title:\"Border width\",min:0,max:12,step:1,defaultValue:1},outerBorderColor:{type:ControlType.Color,title:\"Border color\",defaultValue:\"#E8EBED\"},background:{type:ControlType.Color,title:\"Background\",defaultValue:\"#FFFFFF\"},colorMode:{type:ControlType.Enum,title:\"Color\",options:[\"original\",\"black\",\"custom\",\"grayscale\"],optionTitles:[\"Original\",\"Black\",\"Custom\",\"Grayscale\"],defaultValue:\"black\",description:\"Black/Custom recolor each logo using its alpha channel — works with transparent PNGs/SVGs.\"},logoColor:{type:ControlType.Color,title:\"  Color\",defaultValue:\"#1F1F21\",hidden:p=>p.colorMode!==\"custom\"},logoOpacity:{type:ControlType.Number,title:\"Opacity\",min:.1,max:1,step:.05,defaultValue:1},hoverColorize:{type:ControlType.Boolean,title:\"Hover full\",description:\"On hover, revert to the original logo (full color).\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},flipInterval:{type:ControlType.Number,title:\"Flip every\",description:\"Base time a logo is held before flipping (ms).\",min:800,max:12e3,step:100,defaultValue:4e3},flipDuration:{type:ControlType.Number,title:\"  Flip time\",description:\"Length of the flip itself (ms).\",min:150,max:1500,step:50,defaultValue:500},flipStagger:{type:ControlType.Number,title:\"  Stagger\",description:\"Per-slot offset for the first flip (ms).\",min:0,max:2e3,step:50,defaultValue:350},flipJitter:{type:ControlType.Number,title:\"  Jitter\",description:\"Random extra time added to each interval so slots drift apart (ms).\",min:0,max:6e3,step:100,defaultValue:2500},animate:{type:ControlType.Boolean,title:\"Entrance\",description:\"Stagger fade-in for each slot on load.\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},animateOnView:{type:ControlType.Boolean,title:\"  On scroll\",defaultValue:true,enabledTitle:\"Yes\",disabledTitle:\"No\",hidden:p=>!p.animate},animateStagger:{type:ControlType.Number,title:\"  Stagger\",min:0,max:500,step:10,defaultValue:80,hidden:p=>!p.animate},animateDuration:{type:ControlType.Number,title:\"  Duration\",min:100,max:2e3,step:50,defaultValue:600,hidden:p=>!p.animate},animateOffset:{type:ControlType.Number,title:\"  Rise\",min:0,max:60,step:1,defaultValue:8,hidden:p=>!p.animate}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"FlippingLogoGrid\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./FlipLogoGrid.map","import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import React from\"react\";import{addPropertyControls,ControlType}from\"framer\";/**\n * LandingGridHero\n * ────────────────────────────────────────────────────────────\n * A hero / landing section framed by a single ring of square tiles.\n *\n *   • Center        — one empty slot. Drop ANY Framer component in (design or\n *                     code). It fills the middle \"hole\" of the frame.\n *   • Tile frame    — exactly ONE row of square tiles on every side (top,\n *                     bottom, left, right) wrapping the center. The count per\n *                     side is fixed, so the tiles scale up / down with the\n *                     screen and the amount of squares always stays the same.\n *   • Feature squares — up to 4 of the corner tiles can be \"filled\" (solid ink\n *                     in v1; illustration + caption later). They optionally\n *                     drift DOWN as the page scrolls, each at its own speed.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight auto\n * @framerIntrinsicWidth 1240\n * @framerIntrinsicHeight 640\n */// ── Tokens ──────────────────────────────────────────────────────────────────\nconst T={ink:\"rgb(31, 31, 33)\",bg:\"rgb(255, 255, 255)\",tileLine:\"rgba(31, 31, 33, 0.07)\",fgMuted:\"rgb(147, 149, 153)\"};// ── Hooks ───────────────────────────────────────────────────────────────────\nfunction useElementWidth(){const ref=React.useRef(null);const[w,setW]=React.useState(0);React.useLayoutEffect(()=>{const el=ref.current;if(!el)return;const read=()=>setW(el.clientWidth);read();let ro;if(typeof ResizeObserver!==\"undefined\"){ro=new ResizeObserver(read);ro.observe(el);}window.addEventListener(\"resize\",read);// Fallback re-measures (some embeds don't deliver RO callbacks).\nconst timers=[60,300,800].map(t=>window.setTimeout(read,t));return()=>{ro?.disconnect();window.removeEventListener(\"resize\",read);timers.forEach(clearTimeout);};},[]);return[ref,w];}// Measure an element's content height in a way that survives an out-of-flow\n// child. A connected Framer instance frequently renders position:absolute, so\n// it's removed from normal flow and clientHeight reads 0 — which previously\n// collapsed the hole to the one-cell floor (the \"Fit collapses\" bug). We take\n// the lowest edge of any descendant (relative to the element's own top) in\n// addition to client/scroll height, so the hole hugs the real content whether\n// the instance is in flow or absolutely positioned.\nfunction measureContentHeight(el){let h=Math.max(el.clientHeight,el.scrollHeight);const top=el.getBoundingClientRect().top;const descendants=el.querySelectorAll(\"*\");for(let i=0;i<descendants.length;i++){const r=descendants[i].getBoundingClientRect();if(r.height||r.width)h=Math.max(h,r.bottom-top);}return Math.round(h);}function useElementHeight(){const ref=React.useRef(null);const[h,setH]=React.useState(0);React.useLayoutEffect(()=>{const el=ref.current;if(!el)return;const read=()=>setH(measureContentHeight(el));read();let ro;if(typeof ResizeObserver!==\"undefined\"){ro=new ResizeObserver(read);ro.observe(el);}window.addEventListener(\"resize\",read);const timers=[60,300,800].map(t=>window.setTimeout(read,t));// Web fonts load after first paint; when the hero text reflows to its\n// real font metrics the measured height changes. Re-measure the moment\n// fonts settle so the hole lands on the final height in one step.\nconst fonts=document.fonts;if(fonts&&typeof fonts.ready?.then===\"function\"){fonts.ready.then(read);}return()=>{ro?.disconnect();window.removeEventListener(\"resize\",read);timers.forEach(clearTimeout);};},[]);return[ref,h];}/**\n * Distance the section has been scrolled past the top of the viewport, rAF\n * throttled. 0 until the section's top crosses the viewport top, then grows —\n * so the drift is local to wherever the section sits on the page.\n */function useScrollProgress(ref,enabled){const[offset,setOffset]=React.useState(0);React.useEffect(()=>{if(!enabled){setOffset(0);return;}if(typeof window===\"undefined\")return;let raf=0;let ticking=false;const measure=()=>{ticking=false;const el=ref.current;if(!el)return;const rect=el.getBoundingClientRect();setOffset(Math.max(0,-rect.top));};const onScroll=()=>{if(!ticking){ticking=true;raf=requestAnimationFrame(measure);}};window.addEventListener(\"scroll\",onScroll,{passive:true});window.addEventListener(\"resize\",onScroll);measure();return()=>{window.removeEventListener(\"scroll\",onScroll);window.removeEventListener(\"resize\",onScroll);cancelAnimationFrame(raf);};},[ref,enabled]);return offset;}// ── Main component ───────────────────────────────────────────────────────────\nexport default function LandingGridHero(props){const{centerComponent,componentLaptop,componentTablet,centerComponentMobile,layoutMode,centerBg,centerPadding,clipOverflow,widthMode,heightMode,centerFillHeight,sectionBg,cols,cellMax,rowsThick,colsThick,largeBreakpoint,laptopBreakpoint,rowsThickLarge,colsThickLarge,mobileBreakpoint,mobileSideRows,tileColor,tileLineWidth,tileRadius,showFaintGrid,squareCount,squareColor,squareRadius,parallax,maxDrift}=props;const[sectionRef,width]=useElementWidth();const[contentRef,contentH]=useElementHeight();const scrolled=useScrollProgress(sectionRef,parallax);// Reveal gate. The side-tile count derives from the measured hole height,\n// so any post-paint reflow (web fonts swapping in, async content in the\n// connected instance) re-divides the side tiles — a visible \"jump\" on load.\n// We hold the frame hidden until the measured height has STOPPED changing\n// (layout settled) and then fade it in, so the reflow is never on-screen.\n// The settle/cap effects live further down, after holeH is computed.\nconst[revealed,setRevealed]=React.useState(false);// Track web-font loading: we must not reveal before fonts swap in, or the\n// count would be frozen against the fallback-font height and then visibly\n// re-derive when the real font lands.\nconst[fontsReady,setFontsReady]=React.useState(false);React.useEffect(()=>{const fonts=document.fonts;if(fonts&&typeof fonts.ready?.then===\"function\"){let done=false;fonts.ready.then(()=>!done&&setFontsReady(true));// safety in case fonts.ready resolves before the listener attaches\nconst t=window.setTimeout(()=>setFontsReady(true),1200);return()=>{done=true;clearTimeout(t);};}setFontsReady(true);},[]);// Width / height modes are independent:\n//   • width  fit  — component sits at its natural width, centered in the hole.\n//   • width  fill — component stretches to the hole's full width.\n//   • height fit  — the hole hugs the component's own measured height.\n//   • height fill — component stretches to a fixed hole height (set below).\nconst fillW=widthMode===\"fill\";const fillH=heightMode===\"fill\";const centerFill=fillH// hole height comes from the fixed value in fill mode\n;// ── Geometry ──\nconst nCols=Math.max(3,Math.round(cols));const cellSize=width>0?Math.min(cellMax,width/nCols):0;const frameW=cellSize*nCols;const startX=Math.max(0,(width-frameW)/2);const autoTier=width<=0?\"laptop\":width>=largeBreakpoint?\"desktop\":width>=laptopBreakpoint?\"laptop\":width>=mobileBreakpoint?\"tablet\":\"phone\";const tier=layoutMode===\"auto\"?autoTier:layoutMode;const isPhone=tier===\"phone\";// Frame thickness, per axis, per tier. tkX = side columns (left/right),\n// tkY = top/bottom rows.\n//   • Desktop → the \"large\" counts.   • Laptop → the base counts.\n//   • Tablet / Phone → a single ring on both axes.\n// tkX is clamped so the centre hole keeps at least one column.\nconst rawTkX=tier===\"desktop\"?Math.round(colsThickLarge):tier===\"laptop\"?Math.round(colsThick):1;const rawTkY=tier===\"desktop\"?Math.round(rowsThickLarge):tier===\"laptop\"?Math.round(rowsThick):1;const tkX=Math.max(1,Math.min(rawTkX,Math.floor((nCols-1)/2)));const tkY=Math.max(1,rawTkY);// Phone hides the feature squares and uses a fixed, smaller side count\n// (taller rectangles). Other tiers compute the side-row count from the hole\n// height so the tiles stay close to square.\nconst showFeatures=!isPhone;const holeW=(nCols-2*tkX)*cellSize;const bandX=tkX*cellSize// left / right band thickness in px\n;const bandY=tkY*cellSize// top / bottom band thickness in px\n;// The center component is inset from the hole rectangle by the tile line\n// width on every side, so its (clipped) edges land just INSIDE the tiles'\n// inner border lines instead of painting on top of them. Without this, a\n// component wider than the hole gets clipped exactly on the side tiles'\n// borders and the card's edge/corner sits on the grid lines.\nconst holeInset=Math.max(1,tileLineWidth);// Hole height.\n//   • fit  — follows the component's measured height. The measured content\n//            sits INSIDE the wrapper's padding (centerPadding) AND the tile\n//            inset, so the hole must reserve room for BOTH on top/bottom —\n//            otherwise the wrapper is sized to the bare content height, the\n//            padding then eats 2×centerPadding out of the usable area, and\n//            the component is squeezed (a fixed-gap stack overflows/clips;\n//            a space-between / fill-height stack compresses its gaps).\n//   • fill — the component stretches to a fixed hole height; the inset just\n//            trims a hair off the usable area.\nconst holeH=centerFill?Math.max(centerFillHeight,cellSize):Math.max(contentH+2*holeInset+2*centerPadding,cellSize);// Side-tile count. The count is derived from the measured hole height while\n// the frame is still hidden (settling). The moment it's revealed we FREEZE\n// the count: later height changes (async content, a stray re-measure) only\n// resize the existing tiles smoothly instead of adding/removing a row — so\n// the count can never \"snap\" on-screen. It re-derives only on a genuine\n// width change (cell size), i.e. a real resize. Mutating the ref during\n// render is a pure memo here — deterministic for the given inputs.\nconst sideMemo=React.useRef({count:0,cell:0});let autoSide=1;if(cellSize>0){const ideal=Math.max(1,Math.round(holeH/cellSize));const prev=sideMemo.current;const cellChanged=Math.abs(prev.cell-cellSize)>.5;if(prev.count<1||cellChanged||!revealed){// first run, a real resize, or still settling (hidden) → track live\nautoSide=ideal;}else{// revealed and same width → frozen; height changes just resize tiles\nautoSide=prev.count;}sideMemo.current={count:autoSide,cell:cellSize};}const nSide=isPhone?Math.max(1,Math.round(mobileSideRows)):autoSide;const sectionH=holeH+2*bandY;// Side tiles divide the hole height evenly — square when it works out, a bit\n// taller (rectangular) otherwise.\nconst sideTileH=holeH/nSide;const ready=width>0&&cellSize>0;// Reveal once the hole height stops changing. Every height change restarts a\n// short timer; when it survives, the layout has settled and we fade in — so\n// the font/async reflow that re-divides the side tiles happens off-screen.\nReact.useEffect(()=>{if(revealed||!ready||!fontsReady)return;const t=window.setTimeout(()=>setRevealed(true),280);return()=>clearTimeout(t);},[holeH,ready,fontsReady,revealed]);// Hard cap: always reveal eventually, even if something never settles.\nReact.useEffect(()=>{const cap=window.setTimeout(()=>setRevealed(true),1400);return()=>clearTimeout(cap);},[]);// ── Feature (filled) square config ──\nconst featureCfgs=[{corner:props.square1Corner,speed:props.square1Speed},{corner:props.square2Corner,speed:props.square2Speed},{corner:props.square3Corner,speed:props.square3Speed},{corner:props.square4Corner,speed:props.square4Speed}].slice(0,Math.max(0,Math.min(4,Math.round(squareCount))));const cornerXY=corner=>{const lastColX=startX+(nCols-1)*cellSize;const bottomY=sectionH-cellSize;switch(corner){case\"top-left\":return{x:startX,y:0};case\"top-right\":return{x:lastColX,y:0};case\"bottom-left\":return{x:startX,y:bottomY};case\"bottom-right\":return{x:lastColX,y:bottomY};}};const filledCorners=new Set(showFeatures?featureCfgs.map(f=>f.corner):[]);// ── Tile (empty frame cell) ──\n// Each tile is enlarged by one line-width so its right / bottom border\n// lands exactly on top of the neighbouring tile's left / top border — the\n// two collapse into a single shared line instead of stacking into a double.\nconst tileStyle=(x,y,w=cellSize,h=cellSize)=>({position:\"absolute\",left:x,top:y,width:w+tileLineWidth,height:h+tileLineWidth,border:`${tileLineWidth}px solid ${tileColor}`,borderRadius:tileRadius,boxSizing:\"border-box\",zIndex:1});// Build the frame as four bands. Top/bottom are tkY rows; left/right are\n// tkX columns. The centre hole is left empty. Outer-corner cells filled by\n// a feature square are skipped.\nconst tiles=[];if(ready){// top band (tkY rows) + bottom band (tkY rows), full width\nfor(let r=0;r<tkY;r++){for(let c=0;c<nCols;c++){const x=startX+c*cellSize;// top — outermost row is r === 0\nconst skipTop=r===0&&(c===0&&filledCorners.has(\"top-left\")||c===nCols-1&&filledCorners.has(\"top-right\"));if(!skipTop)tiles.push(/*#__PURE__*/_jsx(\"div\",{style:tileStyle(x,r*cellSize)},`t${r}-${c}`));// bottom — outermost row is r === tkY - 1\nconst yB=sectionH-bandY+r*cellSize;const skipBot=r===tkY-1&&(c===0&&filledCorners.has(\"bottom-left\")||c===nCols-1&&filledCorners.has(\"bottom-right\"));if(!skipBot)tiles.push(/*#__PURE__*/_jsx(\"div\",{style:tileStyle(x,yB)},`b${r}-${c}`));}}// left + right bands (tkX columns each), between the rows\nfor(let cc=0;cc<tkX;cc++){for(let r=0;r<nSide;r++){const y=bandY+r*sideTileH;tiles.push(/*#__PURE__*/_jsx(\"div\",{style:tileStyle(startX+cc*cellSize,y,cellSize,sideTileH)},`l${cc}-${r}`));tiles.push(/*#__PURE__*/_jsx(\"div\",{style:tileStyle(startX+(nCols-1-cc)*cellSize,y,cellSize,sideTileH)},`r${cc}-${r}`));}}}// ── Styles ──\nconst sectionStyle={position:\"relative\",width:\"100%\",height:ready?sectionH:undefined,minHeight:ready?sectionH:320,background:sectionBg,overflow:\"visible\",boxSizing:\"border-box\",// Hidden until the layout settles (see `revealed`), then fades in so\n// the font/async reflow that re-divides the side tiles is never seen.\nopacity:revealed&&ready?1:0,transition:\"opacity 240ms ease\",willChange:\"opacity\"};const faintGridStyle={position:\"absolute\",inset:0,zIndex:0,pointerEvents:\"none\",backgroundImage:`\n            linear-gradient(to right, ${tileColor} 0, ${tileColor} ${tileLineWidth}px, transparent ${tileLineWidth}px),\n            linear-gradient(to bottom, ${tileColor} 0, ${tileColor} ${tileLineWidth}px, transparent ${tileLineWidth}px)\n        `,backgroundSize:`${cellSize}px ${cellSize}px`,backgroundPosition:`${startX}px 0px`,opacity:.5};const centerWrapStyle={position:\"absolute\",// Inset by one tile line so the component (and its clip box) sits just\n// inside the tiles' inner borders rather than on top of them.\nleft:startX+bandX+holeInset,top:bandY+holeInset,width:Math.max(0,holeW-2*holeInset),height:Math.max(0,holeH-2*holeInset),background:centerBg,boxSizing:\"border-box\",display:\"flex\",// This wrapper is a flex ROW, so alignItems is the VERTICAL axis — it\n// must follow HEIGHT mode, not width. In height-Fill we stretch the\n// child to the fixed hole. In Fit the hole is sized to the content, so\n// we TOP-align (flex-start): if the connected instance renders\n// out-of-flow (position:absolute — common in Framer) the measured\n// wrapper's in-flow height is 0, and centering would drop it to the\n// hole's vertical middle and overflow downward. Top-align keeps it\n// anchored at the top of the hole it's being measured into.\nalignItems:fillH?\"stretch\":\"flex-start\",justifyContent:\"center\",padding:centerPadding,overflow:clipOverflow?\"hidden\":\"visible\",// min-height/width:0 lets the flex children actually shrink to the hole\n// instead of refusing (flex default min-size = content) and pushing the\n// section taller — the cause of \"Fill height does nothing\" in Framer,\n// where the hole height is flex-derived rather than a fixed inline px.\nminHeight:0,minWidth:0,zIndex:3};// Framer passes a ComponentInstance as an ARRAY of nodes; an unfilled slot\n// is an empty array (which is truthy!) — so test for real content by length.\nconst hasContent=c=>Array.isArray(c)?c.length>0:!!c;// ── Active component slot ──\n// One slot per tier. The active tier picks its slot; if that slot is empty\n// we fall back to the nearest filled slot — preferring a larger tier\n// (more detail) before a smaller one — so a single connected component\n// still shows even if you only filled one slot.\nconst slotOrder=[\"desktop\",\"laptop\",\"tablet\",\"phone\"];const slotNodes={desktop:centerComponent,laptop:componentLaptop,tablet:componentTablet,phone:centerComponentMobile};const resolveActiveTier=t=>{if(hasContent(slotNodes[t]))return t;const i=slotOrder.indexOf(t);for(let j=i-1;j>=0;j--)if(hasContent(slotNodes[slotOrder[j]]))return slotOrder[j];for(let j=i+1;j<slotOrder.length;j++)if(hasContent(slotNodes[slotOrder[j]]))return slotOrder[j];return t// nothing connected → show the placeholder in this tier's slot\n;};const activeTier=resolveActiveTier(tier);// Sizing: clone the connected instance and inject constraints so it can\n// never exceed the hole, then stretch it on whichever axis is set to Fill.\n//   • max-width:100% — CSS max-width WINS over a fixed `width`, so a\n//     desktop-width component (e.g. an 800px form) is clamped to the hole\n//     instead of overflowing the sides and getting clipped on phone/tablet.\n//   • width/height:100% — only on the axis set to Fill (stretch to hole).\n// Framer ComponentInstances merge an injected `style`, so this works for\n// both design and code components without a second wrapper.\nconst applyFill=node=>{const arr=Array.isArray(node)?node:[node];return arr.map((el,i)=>/*#__PURE__*/React.isValidElement(el)?/*#__PURE__*/React.cloneElement(el,{key:el.key??i,style:{...el.props?.style||{},boxSizing:\"border-box\",maxWidth:\"100%\",...fillW?{width:\"100%\"}:null,// In height-fill the component can't exceed the hole:\n    // cap it and let its own content scroll inside rather\n    // than bleed past the frame / push the section taller.\n    ...fillH?{height:\"100%\",maxHeight:\"100%\",overflow:\"auto\"}:null}}):el);};const placeholderStyle={width:\"100%\",minHeight:240,border:`1px dashed ${T.fgMuted}`,borderRadius:10,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",color:T.fgMuted,fontFamily:\"SF Mono, Menlo, Monaco, monospace\",fontSize:12,letterSpacing:\"0.06em\",textTransform:\"uppercase\",boxSizing:\"border-box\"};return /*#__PURE__*/_jsxs(\"div\",{ref:sectionRef,style:sectionStyle,children:[ready&&showFaintGrid&&/*#__PURE__*/_jsx(\"div\",{style:faintGridStyle,\"aria-hidden\":true}),tiles,ready&&showFeatures&&featureCfgs.map((f,i)=>{const{x,y}=cornerXY(f.corner);const drift=parallax?Math.min(maxDrift,scrolled*f.speed):0;return /*#__PURE__*/_jsx(\"div\",{\"aria-hidden\":true,style:{position:\"absolute\",left:x,top:y,width:cellSize,height:cellSize,background:squareColor,borderRadius:squareRadius,transform:`translateY(${drift}px)`,transition:\"none\",willChange:\"transform\",boxSizing:\"border-box\",zIndex:4}},`f${i}`);}),/*#__PURE__*/_jsx(\"div\",{style:centerWrapStyle,children:/*#__PURE__*/_jsx(\"div\",{ref:contentRef,style:{// Positioning context: an out-of-flow connected\n// instance (position:absolute) anchors to THIS measured\n// element, so its real height is captured below.\nposition:\"relative\",width:\"100%\",maxWidth:\"100%\",height:fillH?\"100%\":undefined,// Only cap height in Fill mode. In Fit mode this wrapper\n// is MEASURED to size the hole, so it must be free to\n// grow — a maxHeight here would pin it small and collapse.\nmaxHeight:fillH?\"100%\":undefined,minHeight:0,minWidth:0,display:\"flex\",flexDirection:\"column\",alignItems:fillW?\"stretch\":\"center\",// Top-align in Fit (see centerWrap note); center only\n// when stretching to a fixed Fill height.\njustifyContent:fillH?\"center\":\"flex-start\"},children:slotOrder.map(t=>{const label=t===\"desktop\"?\"Desktop\":t===\"laptop\"?\"Laptop\":t===\"tablet\"?\"Tablet\":\"Phone\";return /*#__PURE__*/_jsxs(\"div\",{style:{width:\"100%\",height:fillH?\"100%\":undefined,maxHeight:fillH?\"100%\":undefined,minHeight:0,minWidth:0,display:activeTier===t?\"flex\":\"none\",flexDirection:\"column\",alignItems:fillW?\"stretch\":\"center\",justifyContent:fillH?\"center\":\"flex-start\"},children:[applyFill(slotNodes[t]),!hasContent(slotNodes[t])&&/*#__PURE__*/_jsxs(\"div\",{style:placeholderStyle,children:[label,\" slot — connect a component\"]})]},t);})})})]});}// ── Property controls ─────────────────────────────────────────────────────────\nfunction squareControls(prefix,title,defCorner,defSpeed,idx){const key=k=>`${prefix}${k}`;const hide=p=>Math.round(p.squareCount)<idx;return{[key(\"Corner\")]:{type:ControlType.Enum,title,options:[\"top-left\",\"top-right\",\"bottom-left\",\"bottom-right\"],optionTitles:[\"Top L\",\"Top R\",\"Bot L\",\"Bot R\"],defaultValue:defCorner,hidden:hide},[key(\"Speed\")]:{type:ControlType.Number,title:\"  Drift speed\",description:\"Parallax multiplier. 0 = static, higher = drifts down faster.\",min:0,max:2,step:.01,defaultValue:defSpeed,hidden:p=>hide(p)||!p.parallax}};}addPropertyControls(LandingGridHero,{// ─── Component slots (one per device tier) ────────────\ncenterComponent:{type:ControlType.ComponentInstance,title:\"Desktop\",description:\"Component shown on the Desktop tier (the widest). Used as the fallback when a smaller slot is left empty.\"},componentLaptop:{type:ControlType.ComponentInstance,title:\"Laptop\"},componentTablet:{type:ControlType.ComponentInstance,title:\"Tablet\"},centerComponentMobile:{type:ControlType.ComponentInstance,title:\"Phone\"},layoutMode:{type:ControlType.Enum,title:\"Layout mode\",description:\"Force a device tier (override this per Framer breakpoint), or Auto to derive it from width. Tablet/Phone use a single-ring frame; Phone also hides the feature squares.\",options:[\"auto\",\"desktop\",\"laptop\",\"tablet\",\"phone\"],optionTitles:[\"Auto (by width)\",\"Desktop\",\"Laptop\",\"Tablet\",\"Phone\"],defaultValue:\"auto\",displaySegmentedControl:false},centerBg:{type:ControlType.Color,title:\"  Background\",defaultValue:\"rgba(255, 255, 255, 0)\"},centerPadding:{type:ControlType.Number,title:\"  Padding\",min:0,max:160,step:2,defaultValue:32},clipOverflow:{type:ControlType.Boolean,title:\"  Clip overflow\",description:\"Clip the center component to the hole so an oversized instance can't bleed across the frame.\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},widthMode:{type:ControlType.Enum,title:\"  Width\",description:\"Fit = component sits at its natural width, centered in the hole. Fill = component stretches to the hole's full width.\",options:[\"fit\",\"fill\"],optionTitles:[\"Fit\",\"Fill\"],defaultValue:\"fit\",displaySegmentedControl:true},heightMode:{type:ControlType.Enum,title:\"  Height\",description:\"Fit = the hole hugs your component's natural height. Fill = your component stretches to the fixed hole height set below.\",options:[\"fit\",\"fill\"],optionTitles:[\"Fit\",\"Fill (fixed)\"],defaultValue:\"fit\",displaySegmentedControl:true},centerFillHeight:{type:ControlType.Number,title:\"  Fill height\",description:\"Height of the hole when Height is set to Fill (the component fills the hole, so it can't set its own height).\",min:120,max:1600,step:10,unit:\"px\",defaultValue:480,hidden:p=>p.heightMode!==\"fill\"},// ─── Frame ────────────────────────────────────────────\nsectionBg:{type:ControlType.Color,title:\"Section BG\",defaultValue:\"#FFFFFF\"},cols:{type:ControlType.Number,title:\"  Columns\",description:\"Number of square tiles across the top / bottom (stays constant; tiles scale).\",min:3,max:16,step:1,displayStepper:true,defaultValue:9},cellMax:{type:ControlType.Number,title:\"  Max cell\",description:\"Caps how large a tile can grow on very wide screens.\",min:80,max:480,step:4,unit:\"px\",defaultValue:240},rowsThick:{type:ControlType.Number,title:\"  Top/bot rows\",description:\"How many rows of tiles thick the top and bottom of the frame are.\",min:1,max:4,step:1,displayStepper:true,defaultValue:1},colsThick:{type:ControlType.Number,title:\"  Side cols\",description:\"How many columns of tiles thick the left and right of the frame are.\",min:1,max:4,step:1,displayStepper:true,defaultValue:1},largeBreakpoint:{type:ControlType.Number,title:\"  Desktop ≥\",description:\"Auto mode: at/above this width the Desktop tier (large row/column counts) is used.\",min:900,max:2400,step:20,unit:\"px\",defaultValue:1280},laptopBreakpoint:{type:ControlType.Number,title:\"  Laptop ≥\",description:\"Auto mode: at/above this width (and below Desktop) the Laptop tier is used.\",min:700,max:1800,step:20,unit:\"px\",defaultValue:1024},rowsThickLarge:{type:ControlType.Number,title:\"  Large rows\",description:\"Top/bottom rows of tiles on large screens.\",min:1,max:4,step:1,displayStepper:true,defaultValue:1},colsThickLarge:{type:ControlType.Number,title:\"  Large sides\",description:\"Left/right columns of tiles on large screens.\",min:1,max:4,step:1,displayStepper:true,defaultValue:2},mobileBreakpoint:{type:ControlType.Number,title:\"  Phone <\",description:\"Auto mode: below this width the Phone tier is used (fewer, taller side tiles; feature squares hidden). At/above it (and below Laptop) the Tablet tier is used.\",min:320,max:1024,step:8,unit:\"px\",defaultValue:700},mobileSideRows:{type:ControlType.Number,title:\"  Phone sides\",description:\"Number of (taller) side tiles per side on the Phone tier.\",min:1,max:6,step:1,displayStepper:true,defaultValue:2},// ─── Tiles ────────────────────────────────────────────\ntileColor:{type:ControlType.Color,title:\"Tile line\",defaultValue:\"rgba(31, 31, 33, 0.07)\"},tileLineWidth:{type:ControlType.Number,title:\"  Line width\",min:.5,max:6,step:.5,defaultValue:1},tileRadius:{type:ControlType.Number,title:\"  Radius\",min:0,max:40,step:1,defaultValue:6},showFaintGrid:{type:ControlType.Boolean,title:\"  Faint grid\",description:\"Draw a faint full grid behind the frame, aligned to the tiles.\",defaultValue:false,enabledTitle:\"On\",disabledTitle:\"Off\"},// ─── Feature squares ──────────────────────────────────\nsquareCount:{type:ControlType.Number,title:\"Feature sq.\",description:\"How many corner tiles are filled solid (0–4).\",min:0,max:4,step:1,displayStepper:true,defaultValue:3},squareColor:{type:ControlType.Color,title:\"  Color\",defaultValue:\"#1F1F21\"},squareRadius:{type:ControlType.Number,title:\"  Radius\",min:0,max:80,step:1,defaultValue:16},...squareControls(\"square1\",\"Square 1\",\"top-right\",.4,1),...squareControls(\"square2\",\"Square 2\",\"bottom-left\",.6,2),...squareControls(\"square3\",\"Square 3\",\"bottom-right\",.3,3),...squareControls(\"square4\",\"Square 4\",\"top-left\",.5,4),// ─── Parallax ─────────────────────────────────────────\nparallax:{type:ControlType.Boolean,title:\"Parallax\",description:\"Feature squares drift down as the page scrolls.\",defaultValue:true,enabledTitle:\"On\",disabledTitle:\"Off\"},maxDrift:{type:ControlType.Number,title:\"  Max drift\",min:0,max:4e3,step:20,defaultValue:2e3,hidden:p=>!p.parallax}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"LandingGridHero\",\"slots\":[\"centerComponent\",\"componentLaptop\",\"componentTablet\",\"centerComponentMobile\"],\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./LandingGrid.map"],"mappings":"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"}