/* GEЯE — shared primitives */ const { useState, useEffect, useRef } = React; /* Lucide icon — renders an that lucide.createIcons() upgrades */ function Icon({ name, className }) { return ; } function Button({ variant = "primary", icon, iconRight, children, href = "#", onClick }) { return ( {icon && } {children} {iconRight && } ); } function Label({ children, center }) { return {children}; } /* Brand lockup: coin + GEЯE wordmark (reversed R) */ function Brand({ size }) { return (
window.scrollTo({ top: 0, behavior: "smooth" })}> GEЯE Solutions GERE
); } /* Scroll-position reveal (robust where IntersectionObserver doesn't fire) */ function Reveal({ children, className = "", style, as = "div" }) { const ref = useRef(null); useEffect(() => { const el = ref.current; if (!el) return; let done = false; const check = () => { if (done || !el) return; const r = el.getBoundingClientRect(); const vh = window.innerHeight || document.documentElement.clientHeight; if (r.top < vh * 0.92 && r.bottom > 0) { el.classList.add("in"); done = true; window.removeEventListener("scroll", check); window.removeEventListener("resize", check); } }; const raf = requestAnimationFrame(check); window.addEventListener("scroll", check, { passive: true }); window.addEventListener("resize", check); return () => { cancelAnimationFrame(raf); window.removeEventListener("scroll", check); window.removeEventListener("resize", check); }; }, []); const Tag = as; const mergedStyle = style && style.transitionDelay ? { ...style, animationDelay: style.transitionDelay } : style; return {children}; } Object.assign(window, { Icon, Button, Label, Brand, Reveal });