{"version":3,"file":"shared-lib.DZFUI77s.mjs","names":["useState","useMemo","_Fragment","useRef"],"sources":["https:/framerusercontent.com/modules/Akf3MdDZpOWKPqIYdIEj/YhOrlCz7ppxZxM6x1RFa/GlassMenu.js","https:/framerusercontent.com/modules/rr8XK9er9dkhNpq6OIlb/QtOGTi41CiF2HlwYplLm/siteMetadata.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs,Fragment as _Fragment}from\"react/jsx-runtime\";import{useEffect,useMemo,useRef,useState}from\"react\";import{addPropertyControls,ControlType}from\"framer\";// Resolves any valid CSS color string (hex, rgb, rgba, hsl, named, etc.)\n// to its {r,g,b,a} components by letting the browser do the parsing.\nfunction resolveColor(colorStr){if(typeof document===\"undefined\")return{r:0,g:0,b:0,a:1};const el=document.createElement(\"div\");el.style.color=colorStr;document.body.appendChild(el);const computed=getComputedStyle(el).color;document.body.removeChild(el);const match=computed.match(/rgba?\\(([^)]+)\\)/);if(!match)return{r:0,g:0,b:0,a:1};const parts=match[1].split(\",\").map(s=>parseFloat(s.trim()));return{r:parts[0],g:parts[1],b:parts[2],a:parts.length>3?parts[3]:1};}// Takes the hue/saturation/lightness from `colorStr` but forces a\n// specific alpha — used so swapping colors for the active page keeps\n// each slot's own original transparency instead of carrying over the\n// other color's alpha along with its hue.\nfunction withAlpha(colorStr,alpha){const{r,g,b}=resolveColor(colorStr);return`rgba(${r}, ${g}, ${b}, ${alpha})`;}// Detects graphics acceleration the same way as GradientBackground, but\n// with the opposite intent: here we WANT to know if it's off, since\n// that's what decides which color set to use. Passing\n// failIfMajorPerformanceCaveat: true makes context creation fail\n// whenever only a software (unaccelerated) renderer is available —\n// exactly the signal we need. A browser with real GPU acceleration\n// still gets a context; one running in software mode (or with\n// acceleration disabled in settings) does not.\nfunction isGraphicsAccelerated(){if(typeof document===\"undefined\")return true;try{const canvas=document.createElement(\"canvas\");const gl=canvas.getContext(\"webgl\",{failIfMajorPerformanceCaveat:true})||canvas.getContext(\"experimental-webgl\",{failIfMajorPerformanceCaveat:true});return!!gl;}catch{return false;}}// Tracks whether the viewport is narrower than `breakpoint`, updating\n// live on resize/rotation — this drives the hamburger vs. full-menu\n// switch, independent of whatever breakpoint the Framer frame itself\n// happens to be previewed at.\nfunction useIsMobile(breakpoint){const[isMobile,setIsMobile]=useState(false);useEffect(()=>{if(typeof window===\"undefined\")return;const check=()=>setIsMobile(window.innerWidth<breakpoint);check();window.addEventListener(\"resize\",check);window.addEventListener(\"orientationchange\",check);return()=>{window.removeEventListener(\"resize\",check);window.removeEventListener(\"orientationchange\",check);};},[breakpoint]);return isMobile;}// Tracks the current page path live (updates on browser back/forward),\n// shared by both the desktop items and the mobile dropdown rows so\n// whichever one matches the current page can highlight itself.\nfunction useCurrentPath(){const[path,setPath]=useState(\"\");useEffect(()=>{const update=()=>setPath(window.location.pathname);update();window.addEventListener(\"popstate\",update);return()=>window.removeEventListener(\"popstate\",update);},[]);return path;}// item.link may resolve to a bare path (\"/about\") or a full URL\n// depending on how it was picked — extract just the path either way,\n// and only treat it as a match if it's the same origin (so an external\n// link that happens to share a path string can't falsely light up as\n// \"active\").\nfunction isLinkActive(link,currentPath){if(!link||typeof window===\"undefined\")return false;const normalize=p=>!p?\"\":p.length>1&&p.endsWith(\"/\")?p.slice(0,-1):p;try{const url=new URL(link,window.location.origin);return url.origin===window.location.origin&&normalize(url.pathname)===normalize(currentPath);}catch{return false;}}/**\n * A liquid-glass menu — translucent color-mix background, a plain\n * backdrop-filter blur, a cursor-tracking specular highlight per item,\n * and a subtle elastic scale on hover.\n *\n * Blur radius is intentionally small: a wide blur fully averages out a\n * fine, closely-spaced dot pattern into a flat wash (basic signal\n * processing — the blur radius exceeds the pattern's repeat spacing),\n * which reads as \"no blur.\" A tighter radius keeps individual dots\n * visibly soft instead of erasing them.\n *\n * On viewers without graphics acceleration, the glass tint and text\n * swap to their own separate \"Fallback\" colors — tune these to match\n * whatever the background looks like in that same no-acceleration case\n * (e.g. GradientBackground's static fallback), since the normal tint\n * was chosen against the animated background, not the static one.\n *\n * Below \"Mobile Breakpoint\" (viewport width, not this frame's own\n * width), the desktop item list is replaced entirely by a different\n * layout: a glass brand-label pill on the left, a circular glass\n * plus/close toggle on the right, and — once opened — a single glass\n * panel below holding all the items as plain rows (an arrow per row,\n * a divider between them). The glass effect wraps the whole panel as\n * one shape here rather than each item individually, unlike the\n * desktop version.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n */export default function GlassMenu(props){const{items,textColor,glassTint,blurAmount,shadowEnabled,shadowSize,shadowHardness,shadowDirection,fallbackTextColor,fallbackGlassTint,mobileBreakpoint,displayMode,desktopSettings,mobileSettings}=props;const[accelerated,setAccelerated]=useState(true);useEffect(()=>{setAccelerated(isGraphicsAccelerated());},[]);// Framer commonly keeps every breakpoint's copy of a component in\n// the live page's DOM at once (hiding the non-matching ones with\n// CSS, not by not rendering them). If two GlassMenu instances on\n// the same page both used the plain class name \"glassmenu-item\",\n// their <style> blocks would collide — same selector, same\n// specificity, so whichever instance's <style> tag happens to sit\n// later in the DOM wins for BOTH instances, no matter which one's\n// Blur slider you actually move. A random per-instance suffix\n// keeps every instance's CSS isolated to itself.\nconst[uid]=useState(()=>\"gm\"+Math.random().toString(36).slice(2,9));const glassItemClass=`glassmenu-item-${uid}`;const glassHighlightClass=`glassmenu-highlight-${uid}`;const dropdownInKeyframes=`glassmenu-dropdown-in-${uid}`;const dropdownOutKeyframes=`glassmenu-dropdown-out-${uid}`;const dropdownFadeMs=200;const effectiveTextColor=accelerated?textColor:fallbackTextColor||textColor;const effectiveGlassTint=accelerated?glassTint:fallbackGlassTint||glassTint;// \"Responsive\" follows the real viewport width against\n// Mobile Breakpoint, same as before. \"Mobile Only\"/\"Desktop Only\"\n// override that — both for forcing a preview of one version while\n// editing in Framer, and for locking the live site to just one\n// version if that's ever wanted. Same control does both jobs.\nconst viewportIsMobile=useIsMobile(mobileBreakpoint);const isMobile=displayMode===\"mobile\"?true:displayMode===\"desktop\"?false:viewportIsMobile;const[menuOpen,setMenuOpen]=useState(false);// React unmounts on the very next render when a condition goes\n// false — there's no window for a CSS animation to play during\n// that. So the dropdown's presence in the DOM (dropdownMounted)\n// lags one beat behind the open/close intent (menuOpen): opening\n// mounts it immediately, closing keeps it mounted just long enough\n// to play the fade-out, then removes it.\nconst[dropdownMounted,setDropdownMounted]=useState(false);useEffect(()=>{if(menuOpen){setDropdownMounted(true);return;}const timeout=setTimeout(()=>setDropdownMounted(false),dropdownFadeMs);return()=>clearTimeout(timeout);},[menuOpen]);// A menu left open while resizing past the breakpoint (e.g.\n// rotating a tablet, or a desktop window being resized) would\n// otherwise get stuck open with no toggle left to close it.\nuseEffect(()=>{if(!isMobile)setMenuOpen(false);},[isMobile]);// Forces every page this menu appears on to open scrolled to the\n// top, regardless of scroll position on the page you clicked from —\n// handles both a fresh page load and browsers/scroll-restoration\n// libraries trying to remember/restore a previous scroll position.\nuseEffect(()=>{if(typeof window===\"undefined\")return;if(\"scrollRestoration\"in window.history){window.history.scrollRestoration=\"manual\";}window.scrollTo(0,0);},[]);// Same drop-shadow recipe as the CD player: direction (angle of the\n// offset), size (how far/large it's cast), and hardness (0 = soft\n// and faint, 100 = crisp and dark).\nconst shadowRad=(shadowDirection??135)*Math.PI/180;const shadowDist=shadowSize??20;const shadowOffsetX=Math.round(Math.cos(shadowRad)*shadowDist);const shadowOffsetY=Math.round(Math.sin(shadowRad)*shadowDist);const shadowHardnessValue=shadowHardness??40;const shadowBlur=Math.max(2,Math.round(shadowDist*(1.6-shadowHardnessValue/100)));const shadowOpacity=(.15+shadowHardnessValue/100*.35).toFixed(2);const dropShadow=`${shadowOffsetX}px ${shadowOffsetY}px ${shadowBlur}px rgba(0,0,0,${shadowOpacity})`;const glassInsets=\"inset 0 1px 1px rgba(255,255,255,0.35), inset 0 -1px 1px rgba(0,0,0,0.25)\";const itemBoxShadow=[glassInsets,shadowEnabled?dropShadow:\"\"].filter(Boolean).join(\", \")||\"none\";// Active-page colors: swap the hues between Text and Glass Tint, but\n// keep each slot's own original transparency — e.g. if Text is fully\n// opaque normally, the active background stays fully opaque too\n// (using Text's hue), rather than picking up Glass Tint's alpha.\nconst{activeTextValue,activeBackgroundValue}=useMemo(()=>{const textAlpha=resolveColor(effectiveTextColor).a;const tintAlpha=resolveColor(effectiveGlassTint).a;return{activeTextValue:withAlpha(effectiveGlassTint,textAlpha),activeBackgroundValue:withAlpha(effectiveTextColor,tintAlpha)};},[effectiveTextColor,effectiveGlassTint]);const desktopItemProps={textColor:effectiveTextColor,glassTint:effectiveGlassTint,itemBoxShadow,activeTextValue,activeBackgroundValue,fontSize:desktopSettings.fontSize,paddingHorizontal:desktopSettings.paddingHorizontal,paddingVertical:desktopSettings.paddingVertical,hoverGrow:desktopSettings.hoverGrow,cornerRadius:desktopSettings.cornerRadius,glassItemClass,glassHighlightClass};const glassStyleTag=/*#__PURE__*/_jsx(\"style\",{children:`\n            .${glassHighlightClass} {\n                opacity: 0;\n                transition: opacity 0.6s ease;\n            }\n            .${glassItemClass}:hover .${glassHighlightClass} {\n                opacity: 1;\n            }\n            .${glassItemClass} {\n                backdrop-filter: blur(${blurAmount}px) saturate(160%);\n                -webkit-backdrop-filter: blur(${blurAmount}px) saturate(160%);\n            }\n            @keyframes ${dropdownInKeyframes} {\n                from { opacity: 0; transform: translateY(-6px) scale(0.98); }\n                to { opacity: 1; transform: translateY(0) scale(1); }\n            }\n            @keyframes ${dropdownOutKeyframes} {\n                from { opacity: 1; transform: translateY(0) scale(1); }\n                to { opacity: 0; transform: translateY(-6px) scale(0.98); }\n            }\n        `});if(isMobile){const iconSize=mobileSettings.hamburgerSize*.4;const barThickness=Math.max(1.5,mobileSettings.hamburgerSize*.08);return /*#__PURE__*/_jsxs(\"div\",{style:{position:\"relative\",width:\"100%\"},children:[/*#__PURE__*/_jsxs(\"div\",{style:{display:\"flex\",alignItems:\"center\",justifyContent:\"space-between\",gap:mobileSettings.gap},children:[/*#__PURE__*/_jsx(BrandPill,{label:mobileSettings.brandLabel,link:mobileSettings.brandLink,glassItemClass:glassItemClass,onNavigate:()=>setMenuOpen(false),style:{height:mobileSettings.hamburgerSize,color:effectiveTextColor,fontSize:mobileSettings.fontSize,fontWeight:600,padding:`0 ${mobileSettings.paddingHorizontal}px`,borderRadius:mobileSettings.cornerRadius,background:effectiveGlassTint,border:\"1px solid color-mix(in srgb, white 18%, transparent)\",boxShadow:itemBoxShadow}}),/*#__PURE__*/_jsx(\"button\",{\"aria-label\":menuOpen?\"Close menu\":\"Open menu\",onClick:()=>setMenuOpen(open=>!open),className:glassItemClass,style:{width:mobileSettings.hamburgerSize,height:mobileSettings.hamburgerSize,borderRadius:\"50%\",flexShrink:0,background:effectiveGlassTint,border:\"1px solid color-mix(in srgb, white 18%, transparent)\",boxShadow:itemBoxShadow,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",cursor:\"pointer\",padding:0,WebkitTapHighlightColor:\"transparent\"},children:/*#__PURE__*/_jsxs(\"div\",{style:{position:\"relative\",width:iconSize,height:iconSize,transform:menuOpen?\"rotate(45deg)\":\"rotate(0deg)\",transition:\"transform 0.35s cubic-bezier(0.34, 1.56, 0.64, 1)\"},children:[/*#__PURE__*/_jsx(\"span\",{style:{position:\"absolute\",top:\"50%\",left:0,right:0,height:barThickness,borderRadius:2,background:effectiveTextColor,transform:\"translateY(-50%)\"}}),/*#__PURE__*/_jsx(\"span\",{style:{position:\"absolute\",left:\"50%\",top:0,bottom:0,width:barThickness,borderRadius:2,background:effectiveTextColor,transform:\"translateX(-50%)\"}})]})})]}),dropdownMounted&&/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(\"div\",{onClick:()=>setMenuOpen(false),style:{position:\"fixed\",inset:0,zIndex:8}}),/*#__PURE__*/_jsx(\"div\",{className:glassItemClass,style:{position:\"absolute\",top:`calc(100% + ${mobileSettings.gap}px)`,left:0,right:0,zIndex:9,borderRadius:mobileSettings.cornerRadius,background:effectiveGlassTint,border:\"1px solid color-mix(in srgb, white 18%, transparent)\",boxShadow:itemBoxShadow,overflow:\"hidden\",animation:menuOpen?`${dropdownInKeyframes} 0.2s ease-out forwards`:`${dropdownOutKeyframes} ${dropdownFadeMs}ms ease-in forwards`},children:(items||[]).map((item,i)=>/*#__PURE__*/_jsx(MobileMenuRow,{item:item,isLast:i===(items||[]).length-1,textColor:effectiveTextColor,fontSize:mobileSettings.fontSize,paddingHorizontal:mobileSettings.paddingHorizontal,paddingVertical:mobileSettings.paddingVertical,showArrow:mobileSettings.showArrows,activeTextValue:activeTextValue,activeBackgroundValue:activeBackgroundValue,onNavigate:()=>setMenuOpen(false)},i))})]}),glassStyleTag]});}return /*#__PURE__*/_jsxs(\"div\",{style:{width:\"100%\",height:\"100%\",display:\"flex\",flexDirection:desktopSettings.direction,alignItems:\"center\",justifyContent:\"center\",gap:desktopSettings.gap},children:[(items||[]).map((item,i)=>/*#__PURE__*/_jsx(GlassMenuItem,{item:item,...desktopItemProps},i)),glassStyleTag]});}// A single menu item, as its own component so it can measure its own\n// rendered size — that's what lets the hover-grow amount be a genuinely\n// fixed number of pixels (independent of that item's own width/height)\n// while using transform: scale() so the text and the box are guaranteed\n// to move as a single rigid unit (a transform moves everything painted\n// inside the element together; padding/margin tricks don't).\nfunction GlassMenuItem({item,textColor,fontSize,paddingHorizontal,paddingVertical,hoverGrow,cornerRadius,glassTint,itemBoxShadow,activeTextValue,activeBackgroundValue,glassItemClass,glassHighlightClass}){const ref=useRef(null);const innerRef=useRef(null);const[scale,setScale]=useState({x:1,y:1});const currentPath=useCurrentPath();const isActive=isLinkActive(item.link,currentPath);useEffect(()=>{// Measure the actual visible box (inner), not the outer\n// transform-only wrapper — an inline-block wrapper around a flex\n// child can report a subtly different size than the visible box.\nconst el=innerRef.current;if(!el)return;const measure=()=>{const w=el.offsetWidth;const h=el.offsetHeight;setScale({x:w>0?1+hoverGrow/w:1,y:h>0?1+hoverGrow/h:1});};measure();const ro=new ResizeObserver(measure);ro.observe(el);return()=>ro.disconnect();},[hoverGrow]);const onMouseMove=e=>{const el=e.currentTarget;const rect=el.getBoundingClientRect();const mx=(e.clientX-rect.left)/rect.width*100;const my=(e.clientY-rect.top)/rect.height*100;el.style.setProperty(\"--mx\",`${mx}%`);el.style.setProperty(\"--my\",`${my}%`);};return(// Outer element handles ONLY the transform — that's GPU-composited\n// and updates instantly. The inner element handles border-radius\n// (which needs an actual repaint each frame) and everything else\n// visual. Keeping them on separate elements lets both animate on\n// the same hover trigger without fighting each other for a frame.\n/*#__PURE__*/_jsx(\"a\",{ref:ref,href:item.link||\"#\",onMouseMove:onMouseMove,onClick:e=>{// A link to the exact URL you're already on still causes\n// the browser to reload the page — which cuts the smooth\n// scroll off before it can even move. Block that default\n// navigation only for this same-page case, and do the\n// scroll ourselves instead. A different-page link is left\n// alone; its destination page's own on-mount reset (set\n// up elsewhere) already handles that instant, no reload\n// to block since it's actually going somewhere.\nif(isActive){e.preventDefault();window.scrollTo({top:0,behavior:\"smooth\"});}},style:{display:\"inline-block\",textDecoration:\"none\",position:\"relative\",// Explicit positive z-index — backdrop-filter can't\n// see behind negative-z-index content (confirmed via\n// testing), so DotPattern sits at 0 and this has to\n// be above it, not just later in the DOM.\nzIndex:1,cursor:\"pointer\",transform:\"scale(1, 1)\",transition:\"transform 0.6s cubic-bezier(0.34, 1.56, 0.64, 1)\",WebkitTapHighlightColor:\"transparent\"},onMouseEnter:e=>{e.currentTarget.style.transform=`scale(${scale.x}, ${scale.y})`;if(innerRef.current)innerRef.current.style.borderRadius=\"17px\";},onMouseLeave:e=>{e.currentTarget.style.transform=\"scale(1, 1)\";if(innerRef.current)innerRef.current.style.borderRadius=`${cornerRadius}px`;},children:/*#__PURE__*/_jsxs(\"div\",{ref:innerRef,className:glassItemClass,style:{// On the active page, just swap the two existing\n// colors instead of introducing separate ones.\ncolor:isActive?activeTextValue:textColor,fontSize,fontWeight:500,padding:`${paddingVertical}px ${paddingHorizontal}px`,borderRadius:cornerRadius,transition:\"border-radius 0.6s cubic-bezier(0.34, 1.56, 0.64, 1)\",position:\"relative\",// Flexbox centers on the actual rendered line box\n// rather than relying on padding to look balanced —\n// different fonts have different internal spacing\n// above/below their glyphs, so equal padding alone\n// doesn't always look vertically centered.\ndisplay:\"flex\",alignItems:\"center\",overflow:\"hidden\",whiteSpace:\"nowrap\",// Uses the color exactly as picked — Framer's color\n// control already has its own opacity slider built\n// in, so whatever saturation/alpha is chosen renders\n// as-is, with no extra dilution layered on top.\nbackground:isActive?activeBackgroundValue:glassTint,border:\"1px solid color-mix(in srgb, white 18%, transparent)\",boxShadow:itemBoxShadow},children:[/*#__PURE__*/_jsx(\"span\",{className:glassHighlightClass,style:{position:\"absolute\",inset:0,// Above the text (zIndex: 1 below), not behind it,\n// so the sheen passes over the letters too instead\n// of only showing in the gaps around them. Blend\n// mode keeps it reading as light on the text, not\n// a cover.\nzIndex:2,pointerEvents:\"none\",borderRadius:\"inherit\",background:\"radial-gradient(circle at var(--mx, 50%) var(--my, 50%), rgba(255,255,255,0.4), rgba(255,255,255,0) 55%)\",mixBlendMode:\"overlay\"}}),/*#__PURE__*/_jsx(\"span\",{style:{position:\"relative\",zIndex:1,lineHeight:1},children:item.label})]})}));}// A single row inside the mobile dropdown's one shared glass panel —\n// plain text + optional arrow, no individual glass/blur of its own\n// (the panel around all of them carries that instead). Active-page\n// highlighting still works the same way as the desktop version, just\n// as a background fill behind the row rather than its own pill.\nfunction MobileMenuRow({item,isLast,textColor,fontSize,paddingHorizontal,paddingVertical,showArrow,activeTextValue,activeBackgroundValue,onNavigate}){const currentPath=useCurrentPath();const isActive=isLinkActive(item.link,currentPath);const rowColor=isActive?activeTextValue:textColor;return /*#__PURE__*/_jsxs(\"a\",{href:item.link||\"#\",onClick:e=>{if(isActive){e.preventDefault();window.scrollTo({top:0,behavior:\"smooth\"});}onNavigate?.();},style:{display:\"flex\",alignItems:\"center\",justifyContent:\"space-between\",gap:12,textDecoration:\"none\",cursor:\"pointer\",WebkitTapHighlightColor:\"transparent\",color:rowColor,fontSize,fontWeight:500,padding:`${paddingVertical}px ${paddingHorizontal}px`,background:isActive?activeBackgroundValue:\"transparent\",borderBottom:isLast?\"none\":`1px solid color-mix(in srgb, ${textColor} 18%, transparent)`},children:[/*#__PURE__*/_jsx(\"span\",{children:item.label}),showArrow&&/*#__PURE__*/_jsx(PlusMinusArrowIcon,{size:fontSize*.8,color:rowColor})]});}// The brand label at the top of the mobile menu — a link when Brand\n// Link is set, a plain (non-interactive) pill otherwise. Reuses the\n// same same-page smooth-scroll behavior as the other links.\nfunction BrandPill({label,link,glassItemClass,onNavigate,style}){const currentPath=useCurrentPath();const isActive=isLinkActive(link,currentPath);const sharedStyle={display:\"flex\",alignItems:\"center\",whiteSpace:\"nowrap\",WebkitTapHighlightColor:\"transparent\",...style};if(!link){return /*#__PURE__*/_jsx(\"div\",{className:glassItemClass,style:sharedStyle,children:label});}return /*#__PURE__*/_jsx(\"a\",{href:link,onClick:e=>{if(isActive){e.preventDefault();window.scrollTo({top:0,behavior:\"smooth\"});}onNavigate?.();},className:glassItemClass,style:{textDecoration:\"none\",cursor:\"pointer\",...sharedStyle},children:label});}// Same flat, stroke-based art style as the plus/close toggle — a small\n// right-pointing arrow for the dropdown rows. Drawn as a single SVG\n// path (shaft + arrowhead as one continuous stroke with round joins)\n// rather than separately-rotated bars, so it reads as one solid shape\n// with no visible seams at the joints.\nfunction PlusMinusArrowIcon({size,color}){return /*#__PURE__*/_jsx(\"svg\",{\"aria-hidden\":\"true\",width:size,height:size,viewBox:\"0 0 24 24\",fill:\"none\",style:{flexShrink:0,display:\"block\"},children:/*#__PURE__*/_jsx(\"path\",{d:\"M4 12h15M13 5l7 7-7 7\",stroke:color,strokeWidth:2.25,strokeLinecap:\"round\",strokeLinejoin:\"round\"})});}addPropertyControls(GlassMenu,{items:{type:ControlType.Array,title:\"Items\",control:{type:ControlType.Object,controls:{label:{type:ControlType.String,title:\"Label\",defaultValue:\"menu item\"},link:{type:ControlType.Link,title:\"Link\"}}},defaultValue:[{label:\"dtc brands\",link:\"\"},{label:\"game development\",link:\"\"},{label:\"extras\",link:\"\"},{label:\"about\",link:\"\"},{label:\"contact\",link:\"\"}]},displayMode:{type:ControlType.Enum,title:\"Display Mode\",options:[\"responsive\",\"mobile\",\"desktop\"],optionTitles:[\"Both (Responsive)\",\"Mobile Only\",\"Desktop Only\"],defaultValue:\"responsive\",description:\"Responsive switches automatically at Mobile Breakpoint. The other two force one version — useful both for previewing it while editing and for locking the live site to just one.\"},mobileBreakpoint:{type:ControlType.Number,title:\"Mobile Breakpoint\",min:320,max:1200,step:10,defaultValue:810,description:\"Below this viewport width (in Responsive mode), the desktop item list is replaced by the mobile layout.\",hidden:props=>props.displayMode!==\"responsive\"},desktopSettings:{type:ControlType.Object,title:\"Desktop\",controls:{direction:{type:ControlType.Enum,title:\"Direction\",options:[\"column\",\"row\"],optionTitles:[\"Vertical\",\"Horizontal\"],defaultValue:\"column\"},gap:{type:ControlType.Number,title:\"Gap\",min:0,max:80,step:1,defaultValue:24},fontSize:{type:ControlType.Number,title:\"Font Size\",min:10,max:48,step:1,defaultValue:18},paddingHorizontal:{type:ControlType.Number,title:\"Padding X\",min:0,max:60,step:1,defaultValue:16},paddingVertical:{type:ControlType.Number,title:\"Padding Y\",min:0,max:40,step:1,defaultValue:12},hoverGrow:{type:ControlType.Number,title:\"Hover Grow\",min:0,max:5,step:.1,defaultValue:1.5},cornerRadius:{type:ControlType.Number,title:\"Corner Radius\",min:0,max:60,step:1,defaultValue:16}},defaultValue:{direction:\"column\",gap:24,fontSize:18,paddingHorizontal:16,paddingVertical:12,hoverGrow:1.5,cornerRadius:16}},mobileSettings:{type:ControlType.Object,title:\"Mobile\",controls:{brandLabel:{type:ControlType.String,title:\"Brand Label\",defaultValue:\"ethan fitz\"},brandLink:{type:ControlType.Link,title:\"Brand Link\",description:\"Optional — makes the brand pill clickable. Leave empty to keep it as a plain label.\"},showArrows:{type:ControlType.Boolean,title:\"Show Arrows\",defaultValue:true},gap:{type:ControlType.Number,title:\"Gap\",min:0,max:80,step:1,defaultValue:14},fontSize:{type:ControlType.Number,title:\"Font Size\",min:10,max:48,step:1,defaultValue:17},paddingHorizontal:{type:ControlType.Number,title:\"Padding X\",min:0,max:60,step:1,defaultValue:18},paddingVertical:{type:ControlType.Number,title:\"Padding Y\",min:0,max:40,step:1,defaultValue:14},cornerRadius:{type:ControlType.Number,title:\"Corner Radius\",min:0,max:60,step:1,defaultValue:20},hamburgerSize:{type:ControlType.Number,title:\"Toggle Size\",min:32,max:96,step:1,defaultValue:48}},defaultValue:{brandLabel:\"ethan fitz\",showArrows:true,gap:14,fontSize:17,paddingHorizontal:18,paddingVertical:14,cornerRadius:20,hamburgerSize:48}},textColor:{type:ControlType.Color,title:\"Text\",defaultValue:\"#333333\"},glassTint:{type:ControlType.Color,title:\"Glass Tint\",// Alpha is part of the color itself (drag the opacity slider in\n// this same swatch) — no separate strength control needed.\ndefaultValue:\"rgba(255, 255, 255, 0.25)\"},fallbackTextColor:{type:ControlType.Color,title:\"Fallback Text\",defaultValue:\"#333333\",description:\"Used instead of Text on viewers without graphics acceleration — tune to match the static background.\"},fallbackGlassTint:{type:ControlType.Color,title:\"Fallback Glass Tint\",defaultValue:\"rgba(255, 255, 255, 0.25)\",description:\"Used instead of Glass Tint on viewers without graphics acceleration — tune to match the static background.\"},blurAmount:{type:ControlType.Number,title:\"Blur\",min:0,max:30,step:.5,defaultValue:5},shadowEnabled:{type:ControlType.Boolean,title:\"Shadow\",defaultValue:true},shadowSize:{type:ControlType.Number,title:\"Size\",min:0,max:100,step:1,defaultValue:20,hidden:props=>!props.shadowEnabled},shadowHardness:{type:ControlType.Number,title:\"Hardness\",min:0,max:100,step:1,defaultValue:40,hidden:props=>!props.shadowEnabled},shadowDirection:{type:ControlType.Number,title:\"Direction\",min:0,max:360,step:1,defaultValue:135,hidden:props=>!props.shadowEnabled}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"GlassMenu\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"any\",\"framerSupportedLayoutWidth\":\"any\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./GlassMenu.map","// Generated by Framer (aa2af64)\nexport default function metadata(params,activeLocale){return{description:\"The Portfolio of Ethan Fitz\",favicon:\"https://framerusercontent.com/assets/5UZ8OVabGw6FQATqWK4nELymCLg.svg\",robots:\"max-image-preview:large\",title:\"ethan fitz\"};}export const metadataVersion=1;\nexport const __FramerMetadata__ = {\"exports\":{\"metadataVersion\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"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"}