Splash logo: drop framer wrapper + CSS filter (cleaner LCP); nudge tracer

- Logo is a plain <img fetchPriority=high> in a plain div (no framer-motion,
  no drop-shadow filter) so it is a clean, statically-painted LCP candidate.
  Water filter + a CSS zoom apply only on enter.
- Tracer target nudged to computerX/Y +1.5 (between the low-right +2.5 and the
  high-left +0.5).
This commit is contained in:
jwinterm
2026-06-06 18:36:58 -04:00
parent c85383eff2
commit 980bd963fc
3 changed files with 15 additions and 9 deletions
+6 -1
View File
@@ -227,4 +227,9 @@
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}
}
/* Splash logo zoom on click-to-enter (CSS, so the logo needs no framer-motion
wrapper and stays a clean LCP candidate). */
@keyframes splash-zoom { 0% { transform: scale(1); } 50% { transform: scale(1.06); } 100% { transform: scale(1.14); } }
.splash-zoom { animation: splash-zoom 0.8s ease-in-out forwards; }
@@ -104,18 +104,19 @@ export function HeroSplash({ onEnter, sectionRef, leaving }: { onEnter: () => vo
className="pointer-events-none absolute h-[120%] w-[120%] rounded-full bg-[radial-gradient(circle,rgba(34,211,238,0.2),transparent_65%)] motion-safe:animate-pulse"
style={{ animationDuration: "4.5s" }}
/>
<motion.div
{/* Plain div, no framer: keeps the logo (the LCP element) a clean,
statically-painted image. The water filter + zoom only apply on enter. */}
<div
className={entering ? "splash-zoom" : undefined}
style={{ filter: entering ? "url(#splash-water)" : undefined }}
initial={{ opacity: 1, scale: 1 }}
animate={entering ? { scale: [1, 1.06, 1.14] } : undefined}
transition={entering ? { duration: 0.8, ease: "easeInOut" } : undefined}
>
<img
src="/images/branding/splash-such.svg"
alt="Such Software"
className="h-auto w-[min(72vw,42vh)] drop-shadow-[0_0_40px_rgba(34,211,238,0.25)]"
fetchPriority="high"
className="h-auto w-[min(72vw,42vh)]"
/>
</motion.div>
</div>
</button>
{/* Cover text hidden on mobile (logo + corner icons carry it there); fades out on enter */}