{"version":3,"file":"MouseCursor.gN3IjZTZ.mjs","names":["useState","useRef"],"sources":["https:/framerusercontent.com/modules/63mtqZ0r2aIeo31LmFO1/hRkqNeBUDCdhRtSB6xR7/MouseCursor.js"],"sourcesContent":["import{jsx as _jsx}from\"react/jsx-runtime\";import{cloneElement,forwardRef,isValidElement,useEffect,useRef,useState}from\"react\";import{createPortal}from\"react-dom\";import{RenderTarget}from\"framer\";// Site code: every custom component and override lives in this one file.\n// - MouseCursor (default export): mouse follower dot + smooth wheel scrolling (desktop pointers)\n// - withCountUp: counter text animation\n// - withHoverParallax: service card image drift\n// - withSearchForm: blog search submit\n// - withSearchPagination: blog page links keep the ?s= search\n// - withServiceHoverImage: service row hover image\n// - withNewsHoverImage: news article hover image\n// - withHideOnScrollDown: sticky header hides on scroll down, shows on scroll up\n// - withTabFade: Why Hire Me cards fade when the tab changes\n// - withSingleActiveCard: blog grid keeps one dark card at a time\n// - withKeyboardDropdown: nav dropdowns open on keyboard focus\n//\n// Every motion here respects the visitor's \"reduce motion\" setting: decorative movement is skipped\n// and state changes happen instantly.\nconst reducedMotion=()=>typeof window!==\"undefined\"&&window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;// ---------------------------------------------------------------- Mouse cursor\n// Mouse follower: a 14px dark dot that trails the pointer\n// (closes 15% of the gap every frame), fades in on the first mouse move, shrinks away over\n// links, buttons and Framer cursor areas, and fades out when the mouse leaves the page.\n// Fine pointers (mouse/trackpad) only, so touch devices never get it, and off for reduced motion.\n// The frame loop only runs while the dot is catching up, so an idle page does no work.\nconst SIZE=14;const RATIO=.15;const CURSOR_EASE=\"0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94)\";const HIDE_OVER=\"a, button, [data-framer-cursor]\";// ---------------------------------------------------------------- Smooth wheel scrolling\n// Every wheel input restarts a 2s catch-up from the position currently on screen to the new target,\n// eased with expo.out (1 - 2^-10t), for momentum and a slow, gradual stop. Off for reduced motion. The real scroll position is animated (no transformed\n// wrapper), so the sticky header, fixed layers and Framer scroll animations keep working unchanged.\nconst SMOOTH_WHEEL_MS=2e3;const SCROLL_KEYS=[\"ArrowUp\",\"ArrowDown\",\"PageUp\",\"PageDown\",\"Home\",\"End\",\" \"];const easeOutExpo=t=>t>=1?1:1-Math.pow(2,-10*t);function canScrollInside(start,deltaY){for(let el=start;el&&el!==document.body&&el!==document.documentElement;el=el.parentElement){const overflowY=getComputedStyle(el).overflowY;if(!/(auto|scroll)/.test(overflowY)||el.scrollHeight<=el.clientHeight+1)continue;if(deltaY>0?el.scrollTop+el.clientHeight<el.scrollHeight-1:el.scrollTop>0)return true;}return false;}function useSmoothWheel(enabled){useEffect(()=>{if(!enabled)return;const root=document.documentElement;let from=window.scrollY;let to=from;let start=0;let restart=false;let frame=0;// Exact position last written. The browser reports scrollY rounded to whole pixels, so\n// restarting from scrollY would step backwards for a frame on every new wheel notch.\nlet current=from;const stop=()=>{cancelAnimationFrame(frame);frame=0;};const step=now=>{// rAF timestamps are taken before input is handled, so a new ease starts on the frame clock,\n// one frame in; timing it from the wheel event would make the first frame step backwards.\nif(restart){start=now-1e3/60;restart=false;}const progress=Math.min(1,(now-start)/SMOOTH_WHEEL_MS);const y=from+(to-from)*easeOutExpo(progress);current=y;window.scrollTo({top:y,behavior:\"instant\"});frame=progress<1?requestAnimationFrame(step):0;};const onWheel=event=>{if(event.defaultPrevented||event.ctrlKey||Math.abs(event.deltaX)>Math.abs(event.deltaY))return;// A locked page (open menu or overlay) and inner scroll areas keep their own behaviour.\nif(getComputedStyle(root).overflowY===\"hidden\"||getComputedStyle(document.body).overflowY===\"hidden\")return;if(canScrollInside(event.target,event.deltaY))return;const delta=event.deltaMode===1?event.deltaY*16:event.deltaMode===2?event.deltaY*window.innerHeight:event.deltaY;event.preventDefault();if(!frame)current=to=window.scrollY;from=current;to=Math.max(0,Math.min(root.scrollHeight-window.innerHeight,to+delta));restart=true;if(!frame)frame=requestAnimationFrame(step);};// Keyboard, scrollbar, anchor links and route changes take over immediately.\nconst onScroll=()=>{if(frame&&Math.abs(window.scrollY-current)>2)stop();};const onKey=event=>{if(SCROLL_KEYS.includes(event.key))stop();};window.addEventListener(\"wheel\",onWheel,{passive:false});window.addEventListener(\"scroll\",onScroll,{passive:true});window.addEventListener(\"keydown\",onKey);window.addEventListener(\"mousedown\",stop);window.addEventListener(\"touchstart\",stop,{passive:true});return()=>{stop();window.removeEventListener(\"wheel\",onWheel);window.removeEventListener(\"scroll\",onScroll);window.removeEventListener(\"keydown\",onKey);window.removeEventListener(\"mousedown\",stop);window.removeEventListener(\"touchstart\",stop);};},[enabled]);}/**\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n */export default function MouseCursor(){const[enabled,setEnabled]=useState(false);const outer=useRef(null);const mover=useRef(null);const dot=useRef(null);useSmoothWheel(enabled);useEffect(()=>{if(RenderTarget.current()!==RenderTarget.preview)return;setEnabled(window.matchMedia(\"(hover: hover) and (pointer: fine)\").matches&&!reducedMotion());},[]);useEffect(()=>{if(!enabled)return;const mouse={x:0,y:0};const pos={x:0,y:0};let hoverTarget=null;let clickHidden=false;let frame=0;const setDot=(visible,scale=visible?1:0)=>{if(!dot.current)return;dot.current.style.opacity=visible?\"1\":\"0\";dot.current.style.transform=`scale(${scale})`;};const setOuter=visible=>{if(outer.current)outer.current.style.opacity=visible?\"1\":\"0\";};const tick=()=>{pos.x+=(mouse.x-pos.x)*RATIO;pos.y+=(mouse.y-pos.y)*RATIO;if(mover.current)mover.current.style.transform=`translate3d(${pos.x-SIZE/2}px, ${pos.y-SIZE/2}px, 0)`;const settled=Math.abs(mouse.x-pos.x)<.1&&Math.abs(mouse.y-pos.y)<.1;frame=settled?0:requestAnimationFrame(tick);};const onMove=e=>{mouse.x=e.clientX;mouse.y=e.clientY;if(!frame)frame=requestAnimationFrame(tick);setOuter(true);if(clickHidden){clickHidden=false;setDot(!hoverTarget);}};const onOver=e=>{const target=e.target.closest?.(HIDE_OVER)??null;if(target===hoverTarget)return;hoverTarget=target;if(!clickHidden)setDot(!target);};const onClick=e=>{const link=e.target.closest?.(\"a\");const href=link?.getAttribute(\"href\")??\"\";if(!link||link.target===\"_blank\"||/^(#|mailto:|tel:)/.test(href))return;clickHidden=true;setDot(false,1.3);};const onLeave=()=>setOuter(false);const onEnter=()=>setOuter(true);frame=requestAnimationFrame(tick);document.addEventListener(\"mousemove\",onMove);document.addEventListener(\"mouseover\",onOver);document.addEventListener(\"click\",onClick);document.documentElement.addEventListener(\"mouseleave\",onLeave);document.documentElement.addEventListener(\"mouseenter\",onEnter);return()=>{cancelAnimationFrame(frame);document.removeEventListener(\"mousemove\",onMove);document.removeEventListener(\"mouseover\",onOver);document.removeEventListener(\"click\",onClick);document.documentElement.removeEventListener(\"mouseleave\",onLeave);document.documentElement.removeEventListener(\"mouseenter\",onEnter);};},[enabled]);if(!enabled)return null;return /*#__PURE__*/createPortal(/*#__PURE__*/_jsx(\"div\",{ref:outer,\"data-mouse-cursor\":\"\",style:{position:\"fixed\",inset:0,pointerEvents:\"none\",zIndex:99999,opacity:0,transition:`opacity ${CURSOR_EASE}`},children:/*#__PURE__*/_jsx(\"div\",{ref:mover,style:{position:\"fixed\",top:0,left:0,width:SIZE,height:SIZE,willChange:\"transform\"},children:/*#__PURE__*/_jsx(\"div\",{ref:dot,style:{width:\"100%\",height:\"100%\",borderRadius:\"50%\",backgroundColor:\"var(--token-e802d96d-4653-443a-85e3-b69cc98b9999, #333333)\",transition:`opacity ${CURSOR_EASE}, transform ${CURSOR_EASE}`}})})}),document.body);}// ---------------------------------------------------------------- Count up\n// Counts a text layer's number up from 0 when it enters the viewport, one integer at a time.\n// 4000ms total, a tick every 15ms, linear, rounded.\nconst TIME=4e3;const DELAY=15;const STEPS=Math.ceil(TIME/DELAY);function textOf(node){if(typeof node===\"string\"||typeof node===\"number\")return String(node);if(Array.isArray(node))return node.map(textOf).join(\"\");if(/*#__PURE__*/isValidElement(node))return textOf(node.props.children);return\"\";}// Swaps the first run of digits in the rich text tree, keeping every styled wrapper intact.\nfunction withNumber(node,value){let done=false;const walk=n=>{if(done)return n;if((typeof n===\"string\"||typeof n===\"number\")&&/\\d/.test(String(n))){done=true;return String(n).replace(/\\d[\\d,]*/,value);}if(Array.isArray(n))return n.map(walk);if(/*#__PURE__*/isValidElement(n)){const children=n.props.children;return children===undefined?n:/*#__PURE__*/cloneElement(n,{children:walk(children)});}return n;};return walk(node);}export function withCountUp(Component){return props=>{const source=props.text??textOf(props.children);const target=parseInt(String(source).replace(/[^\\d]/g,\"\"),10)||0;// Rich text does not forward refs, so a layout-neutral wrapper (display: contents) is observed instead.\n// Its ref survives hydration, unlike a generated class name.\nconst wrapper=useRef(null);const[value,setValue]=useState(null);useEffect(()=>{const el=wrapper.current?.firstElementChild;// With reduced motion the final number simply stays in place.\nif(!el||reducedMotion())return;setValue(0);let timer;const observer=new IntersectionObserver(entries=>{if(!entries.some(e=>e.isIntersecting))return;observer.disconnect();let i=0;const tick=()=>{i++;setValue(Math.round(target*i/STEPS));if(i<STEPS)timer=setTimeout(tick,DELAY);};timer=setTimeout(tick,DELAY);});observer.observe(el);return()=>{observer.disconnect();clearTimeout(timer);};},[target]);let content;if(value===null)content=/*#__PURE__*/_jsx(Component,{...props});else if(props.text!==undefined)content=/*#__PURE__*/_jsx(Component,{...props,text:String(value)});else content=/*#__PURE__*/_jsx(Component,{...props,children:withNumber(props.children,String(value))});return /*#__PURE__*/_jsx(\"div\",{ref:wrapper,\"data-count-up\":\"\",style:{display:\"contents\"},children:content});};}// ---------------------------------------------------------------- Hover parallax\n// Service card image drift: while the pointer moves over the card,\n// the image frame eases toward it (up to ~20px, 1s power2.out) and settles back on leave.\n// Uses the CSS `translate` property so Framer's own transforms (hover scale, appear) stay untouched.\nconst MOVE=20;const PARALLAX_EASE=\"translate 1s cubic-bezier(0.215, 0.61, 0.355, 1)\";export function withHoverParallax(Component){return props=>{const ref=useRef(null);useEffect(()=>{const el=ref.current;const card=el?.parentElement;if(!el||!card||!window.matchMedia(\"(hover: hover) and (pointer: fine)\").matches||reducedMotion())return;el.style.transition=[el.style.transition,PARALLAX_EASE].filter(Boolean).join(\", \");const move=e=>{const r=card.getBoundingClientRect();const x=(e.clientX-r.left-r.width/2.5)/r.width*MOVE;const y=(e.clientY-r.top-r.height/2.5)/r.height*MOVE;el.style.translate=`${x}px ${y}px`;};const leave=()=>{el.style.translate=\"0px 0px\";};card.addEventListener(\"mousemove\",move);card.addEventListener(\"mouseleave\",leave);return()=>{card.removeEventListener(\"mousemove\",move);card.removeEventListener(\"mouseleave\",leave);};},[]);return /*#__PURE__*/_jsx(Component,{...props,ref:ref});};}// ---------------------------------------------------------------- Blog search\n// Blog sidebar search: Enter or the search button opens /blog?s=<query>\n// (an empty query opens the normal /blog listing). Native Framer forms\n// cannot submit as a GET navigation, so this override handles the submit.\nfunction goToResults(input){const query=(input?.value||\"\").trim();window.location.assign(query?\"/blog?s=\"+encodeURIComponent(query):\"/blog\");}export function withSearchForm(Component){return /*#__PURE__*/forwardRef((props,forwardedRef)=>{const ref=useRef(null);useEffect(()=>{const form=ref.current;if(!form)return;const input=form.querySelector(\"input\");const onSubmit=event=>{event.preventDefault();goToResults(input);};const onKeyDown=event=>{if(event.key!==\"Enter\")return;event.preventDefault();goToResults(input);};const onClick=event=>{const target=event.target;if(!target||target.closest(\"input\"))return;event.preventDefault();goToResults(input);};form.addEventListener(\"submit\",onSubmit);form.addEventListener(\"click\",onClick);input?.addEventListener(\"keydown\",onKeyDown);return()=>{form.removeEventListener(\"submit\",onSubmit);form.removeEventListener(\"click\",onClick);input?.removeEventListener(\"keydown\",onKeyDown);};},[]);const setRef=node=>{ref.current=node;if(typeof forwardedRef===\"function\")forwardedRef(node);else if(forwardedRef)forwardedRef.current=node;};return /*#__PURE__*/_jsx(Component,{...props,ref:setRef});});}// Blog pagination while searching: the page links sit inside a CMS list, where Framer's\n// \"preserve params\" does not carry ?s= across, so a click on page 2 lost the search. With a\n// search active, the link navigates to its page with the same ?s= query.\nexport function withSearchPagination(Component){return /*#__PURE__*/forwardRef((props,forwardedRef)=>{const ref=useRef(null);useEffect(()=>{const link=ref.current;if(!link)return;const onClick=event=>{const query=new URLSearchParams(window.location.search).get(\"s\");const anchor=link.closest(\"a\")??link.querySelector(\"a\");if(!query||!anchor?.href)return;event.preventDefault();event.stopPropagation();const target=new URL(anchor.href,window.location.href);target.searchParams.set(\"s\",query);window.location.assign(target.pathname+target.search);};link.addEventListener(\"click\",onClick,true);return()=>link.removeEventListener(\"click\",onClick,true);},[]);const setRef=node=>{ref.current=node;if(typeof forwardedRef===\"function\")forwardedRef(node);else if(forwardedRef)forwardedRef.current=node;};return /*#__PURE__*/_jsx(Component,{...props,ref:setRef});});}// ---------------------------------------------------------------- Service hover image\n// Service rows: the \"Hover Image\" layer sits at the row's top-left and is translated to the\n// pointer. The 8deg CSS `rotate` is applied after the translate, so the image drifts lower the\n// further right the pointer is. It only moves\n// on mousemove, so a wheel scroll carries it along with the row.\nconst HOVER_IMAGE_EASE=\"transform 0.5s cubic-bezier(0.215, 0.61, 0.355, 1)\";export function withServiceHoverImage(Component){return props=>{// Instances do not forward refs to the DOM, so a layout-neutral wrapper (display: contents) is used.\nconst wrapper=useRef(null);useEffect(()=>{const host=wrapper.current;const row=host?.firstElementChild;if(!host||!row||!window.matchMedia(\"(hover: hover) and (pointer: fine)\").matches)return;const image=row.querySelector('[data-framer-name=\"Hover Image\"]');if(!image)return;image.style.rotate=\"8deg\";if(!reducedMotion())image.style.transition=[image.style.transition,HOVER_IMAGE_EASE].filter(Boolean).join(\", \");// The instance container is the stack item; lifting it lets the image paint over the rows below.\nconst container=host.closest('[data-framer-name=\"Service Row\"]')??row;const move=event=>{const box=(image.offsetParent||row).getBoundingClientRect();image.style.transform=`translate(${event.clientX-box.left}px, ${event.clientY-box.top}px)`;};const enter=()=>container.style.zIndex=\"5\";const leave=()=>container.style.zIndex=\"\";row.addEventListener(\"mousemove\",move);row.addEventListener(\"mouseenter\",enter);row.addEventListener(\"mouseleave\",leave);return()=>{row.removeEventListener(\"mousemove\",move);row.removeEventListener(\"mouseenter\",enter);row.removeEventListener(\"mouseleave\",leave);};},[]);return /*#__PURE__*/_jsx(\"div\",{ref:wrapper,style:{display:\"contents\"},children:/*#__PURE__*/_jsx(Component,{...props})});};}// News rows: the \"Hover Image\" layer (150x240, 10deg) fades in over 0.3s while the pointer is over\n// the article and follows it with the same 0.5s ease. It stays behind all article text (z-index -1).\nconst NEWS_IMAGE_EASE=`opacity 0.3s, ${HOVER_IMAGE_EASE}`;// The layer sits at left -55px and is 150px wide, so translate(x) puts its centre at x + 20.\nconst NEWS_IMAGE_CENTER=20;const NEWS_IMAGE_LEFT=-160;const NEWS_IMAGE_DRIFT=60;const NEWS_IMAGE_MIN_SPACE=280;export function withNewsHoverImage(Component){// The article is a plain frame with an appear effect, so the ref must reach the DOM node\n// (a wrapper would starve Framer's in-view observer and the article would never fade in).\nreturn /*#__PURE__*/forwardRef((props,forwardedRef)=>{const ref=useRef(null);useEffect(()=>{const article=ref.current;if(!article||!window.matchMedia(\"(hover: hover) and (pointer: fine)\").matches)return;const image=article.querySelector('[data-framer-name=\"Hover Image\"]');if(!image)return;image.style.rotate=\"10deg\";image.style.transition=reducedMotion()?\"none\":NEWS_IMAGE_EASE;const move=event=>{const box=article.getBoundingClientRect();const x=event.clientX-box.left;// With whitespace left of the article (desktop two-column layout), keep the image in\n// it: centred NEWS_IMAGE_LEFT px left of the article, drifting ±NEWS_IMAGE_DRIFT/2 with\n// the pointer, so it never covers the article text. Stacked layouts follow the pointer.\nconst left=box.left>=NEWS_IMAGE_MIN_SPACE?NEWS_IMAGE_LEFT+(x/box.width-.5)*NEWS_IMAGE_DRIFT-NEWS_IMAGE_CENTER:x;image.style.transform=`translate(${left}px, ${event.clientY-box.top}px)`;};const enter=event=>{move(event);image.style.opacity=\"1\";};const leave=()=>{image.style.opacity=\"0\";};article.addEventListener(\"mousemove\",move);article.addEventListener(\"mouseenter\",enter);article.addEventListener(\"mouseleave\",leave);return()=>{article.removeEventListener(\"mousemove\",move);article.removeEventListener(\"mouseenter\",enter);article.removeEventListener(\"mouseleave\",leave);};},[]);const setRef=node=>{ref.current=node;if(typeof forwardedRef===\"function\")forwardedRef(node);else if(forwardedRef)forwardedRef.current=node;};return /*#__PURE__*/_jsx(Component,{...props,ref:setRef});});}// ---------------------------------------------------------------- Sticky header: hide on scroll down\n// The template Sticky Header (always in its visible Sticky variant) slides out of view while the page\n// scrolls down and back in as soon as the page scrolls up. Near the top it stays hidden.\nconst STICKY_FROM=100;const STICKY_EASE=\"transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)\";export function withHideOnScrollDown(Component){return props=>{// Instances do not forward refs to the DOM, so a layout-neutral wrapper (display: contents) is used.\nconst wrapper=useRef(null);useEffect(()=>{const host=wrapper.current;const header=host?.closest('[data-framer-name=\"Sticky Header\"]')??(host?.firstElementChild);if(!header)return;if(!reducedMotion())header.style.transition=[header.style.transition,STICKY_EASE].filter(Boolean).join(\", \");const hide=()=>header.style.transform=\"translateY(-110%)\";const show=()=>header.style.transform=\"translateY(0)\";// Near the top the page header is in view, so the sticky copy stays out of the way.\nif(window.scrollY<=STICKY_FROM)hide();let lastY=window.scrollY;let frame=0;const update=()=>{frame=0;const y=window.scrollY;const delta=y-lastY;if(y<=STICKY_FROM){lastY=y;return hide();}if(Math.abs(delta)<3)return;lastY=y;if(delta>0)hide();else show();};const onScroll=()=>{if(!frame)frame=requestAnimationFrame(update);};window.addEventListener(\"scroll\",onScroll,{passive:true});return()=>{cancelAnimationFrame(frame);window.removeEventListener(\"scroll\",onScroll);};},[]);return /*#__PURE__*/_jsx(\"div\",{ref:wrapper,style:{display:\"contents\"},children:/*#__PURE__*/_jsx(Component,{...props})});};}// ---------------------------------------------------------------- Tab fade (Why Hire Me)\n// Switching tabs fades the cards out and back in (0.15s each) whenever a different tab in the\n// section's Tab Bar is clicked.\nexport function withTabFade(Component){return /*#__PURE__*/forwardRef((props,forwardedRef)=>{const ref=useRef(null);useEffect(()=>{const cards=ref.current;const section=cards?.closest(\"section\")??document.body;if(!cards)return;let current=\"\";const onClick=event=>{const tab=event.target?.closest('[data-framer-name^=\"Tab \"]');if(!tab||!tab.closest('[data-framer-name=\"Tab Bar\"]')||!section.contains(tab))return;const name=tab.getAttribute(\"data-framer-name\")||\"\";if(name===current)return;current=name;if(!reducedMotion())cards.animate([{opacity:1},{opacity:0,offset:.5},{opacity:1}],{duration:300,easing:\"linear\"});};section.addEventListener(\"click\",onClick);return()=>section.removeEventListener(\"click\",onClick);},[]);const setRef=node=>{ref.current=node;if(typeof forwardedRef===\"function\")forwardedRef(node);else if(forwardedRef)forwardedRef.current=node;};return /*#__PURE__*/_jsx(Component,{...props,ref:setRef});});}// ---------------------------------------------------------------- Blog grid: one dark card at a time\n// The grid starts with one card in its dark \"Active\" look. While the pointer is over any other card\n// in the same grid, that card turns dark on hover, so the Active card fades back to the plain look\n// (image off, dark text) and returns once the pointer leaves the other card.\nconst SINGLE_ACTIVE_EASE=\"0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94)\";const SINGLE_ACTIVE_TEXT=[\"Date\",\"Title\",\"Written By\",\"Author Name\"];export function withSingleActiveCard(Component){return props=>{// Instances do not forward refs to the DOM, so a layout-neutral wrapper (display: contents) is used.\nconst wrapper=useRef(null);useEffect(()=>{const host=wrapper.current;const card=host?.firstElementChild;if(!host||!card||!window.matchMedia(\"(hover: hover) and (pointer: fine)\").matches)return;const ownLink=host.closest('[data-framer-name=\"Card Link\"]');const grid=host.closest('[data-framer-name=\"Grid Lists\"]')??document.body;const bg=card.querySelector('[data-framer-name=\"BG\"]');const texts=SINGLE_ACTIVE_TEXT.flatMap(name=>[...card.querySelectorAll(`[data-framer-name=\"${name}\"] .framer-text`)]);if(!reducedMotion()){if(bg)bg.style.transition=[bg.style.transition,`opacity ${SINGLE_ACTIVE_EASE}`].filter(Boolean).join(\", \");for(const t of texts)t.style.transition=`color ${SINGLE_ACTIVE_EASE}`;}let off=false;const setOff=next=>{if(next===off)return;off=next;if(bg)bg.style.opacity=next?\"0\":\"\";for(const t of texts){if(next)t.style.setProperty(\"color\",\"rgb(0, 0, 0)\",\"important\");else t.style.removeProperty(\"color\");}};const over=event=>{const link=event.target?.closest('[data-framer-name=\"Card Link\"]');setOff(!!link&&link!==ownLink);};const leave=()=>setOff(false);grid.addEventListener(\"pointerover\",over);grid.addEventListener(\"pointerleave\",leave);return()=>{grid.removeEventListener(\"pointerover\",over);grid.removeEventListener(\"pointerleave\",leave);setOff(false);};},[]);return /*#__PURE__*/_jsx(\"div\",{ref:wrapper,style:{display:\"contents\"},children:/*#__PURE__*/_jsx(Component,{...props})});};}// ---------------------------------------------------------------- Nav dropdown: keyboard access\n// Framer has no focus gesture, so a dropdown that opens on hover alone hides its links from keyboard\n// users (they stay focusable at opacity 0). While focus is inside a Nav Dropdown its panel is shown,\n// Escape closes it again, and a label without a link becomes a focusable button that reports\n// whether its panel is open. Mouse hover keeps working through the component's own variants.\nconst DROPDOWN_OPEN=\"data-dropdown-open\";let dropdownStyleAdded=false;function addDropdownStyle(){if(dropdownStyleAdded)return;dropdownStyleAdded=true;const style=document.createElement(\"style\");style.textContent=`[${DROPDOWN_OPEN}] [data-framer-name$=\" Panel\"]{opacity:1!important;pointer-events:auto!important;visibility:visible!important}`;document.head.appendChild(style);}export function withKeyboardDropdown(Component){return props=>{// Instances do not forward refs to the DOM, so a layout-neutral wrapper (display: contents) is used.\nconst wrapper=useRef(null);useEffect(()=>{const root=wrapper.current?.firstElementChild;if(!root)return;addDropdownStyle();const trigger=root.querySelector(\"a\");if(trigger){if(!trigger.hasAttribute(\"href\")){trigger.tabIndex=0;trigger.setAttribute(\"role\",\"button\");}trigger.setAttribute(\"aria-haspopup\",\"true\");trigger.setAttribute(\"aria-expanded\",\"false\");}const setOpen=open=>{if(open)root.setAttribute(DROPDOWN_OPEN,\"\");else root.removeAttribute(DROPDOWN_OPEN);trigger?.setAttribute(\"aria-expanded\",String(open));};const onFocusIn=()=>setOpen(true);const onFocusOut=event=>{if(!root.contains(event.relatedTarget))setOpen(false);};const onKeyDown=event=>{if(event.key===\"Escape\")setOpen(false);else if((event.key===\"Enter\"||event.key===\" \")&&event.target===trigger&&!trigger?.hasAttribute(\"href\")){event.preventDefault();setOpen(!root.hasAttribute(DROPDOWN_OPEN));}};root.addEventListener(\"focusin\",onFocusIn);root.addEventListener(\"focusout\",onFocusOut);root.addEventListener(\"keydown\",onKeyDown);return()=>{root.removeEventListener(\"focusin\",onFocusIn);root.removeEventListener(\"focusout\",onFocusOut);root.removeEventListener(\"keydown\",onKeyDown);setOpen(false);};},[]);return /*#__PURE__*/_jsx(\"div\",{ref:wrapper,style:{display:\"contents\"},children:/*#__PURE__*/_jsx(Component,{...props})});};}\nexport const __FramerMetadata__ = {\"exports\":{\"withNewsHoverImage\":{\"type\":\"reactHoc\",\"name\":\"withNewsHoverImage\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withSearchForm\":{\"type\":\"reactHoc\",\"name\":\"withSearchForm\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withCountUp\":{\"type\":\"reactHoc\",\"name\":\"withCountUp\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"reactComponent\",\"name\":\"MouseCursor\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"fixed\",\"framerSupportedLayoutHeight\":\"fixed\"}},\"withHideOnScrollDown\":{\"type\":\"reactHoc\",\"name\":\"withHideOnScrollDown\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withHoverParallax\":{\"type\":\"reactHoc\",\"name\":\"withHoverParallax\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withKeyboardDropdown\":{\"type\":\"reactHoc\",\"name\":\"withKeyboardDropdown\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withServiceHoverImage\":{\"type\":\"reactHoc\",\"name\":\"withServiceHoverImage\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withSingleActiveCard\":{\"type\":\"reactHoc\",\"name\":\"withSingleActiveCard\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withTabFade\":{\"type\":\"reactHoc\",\"name\":\"withTabFade\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"withSearchPagination\":{\"type\":\"reactHoc\",\"name\":\"withSearchPagination\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./MouseCursor.map"],"mappings":"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"}