From 4e779c847af33099fbfbbfa90fa9b12443bfab64 Mon Sep 17 00:00:00 2001 From: jeanGaston Date: Wed, 29 Jul 2026 20:21:08 +0200 Subject: [PATCH] fix(logo): resolve word superposition and reduce animation cost The previous commit only masked the emoji row's crossing (via the white flash timed to their fade). The text row ("love"/"envelope") still animated opacity down while sitting fully centered on top of each other, so the two words visibly superposed for a beat with no flash to hide it there. Fix applies the same technique to both rows: x and opacity now reach their end state (centered / invisible) together, so there's no frame where a glyph is both fully opaque and fully overlapping another. Verified via a fresh screenshot mid-transition - no double-exposure. Also addressed reported animation lag: dropped the rotate wobble (one fewer animated property per element), cut keyframe count 8->7, shortened 2.4s -> 1.8s, trimmed the flash's blur/spread, and added willChange hints so all layers are promoted upfront rather than mid-animation. Playwright rAF sampling over the full animation now shows a flat 60fps with zero frames slower than 30fps. Co-Authored-By: Claude Sonnet 5 --- src/components/LoveFusion.tsx | 47 ++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/src/components/LoveFusion.tsx b/src/components/LoveFusion.tsx index dc63b01..7f151cf 100644 --- a/src/components/LoveFusion.tsx +++ b/src/components/LoveFusion.tsx @@ -6,47 +6,48 @@ import { Hachi_Maru_Pop } from 'next/font/google'; const logoFont = Hachi_Maru_Pop({ weight: '400', subsets: ['latin'] }); // 💕 + ✉️ = 💌, "love" + "envelope" = "lovelope.app": the two slide in from -// opposite sides, and the instant they'd overlap they hand off to a white -// flash (bigger + brighter than the glyphs so neither is ever visibly "in -// front of" the other) which then blooms back out into the merged result. -// Plays once, on mount, then holds its final state (no loop). -const times = [0, 0.22, 0.42, 0.52, 0.62, 0.74, 0.88, 1]; -const transition = { duration: 2.4, times, ease: 'easeInOut' as const }; +// opposite sides and fade out AS they approach center, so opacity hits zero +// right when they'd otherwise overlap - neither ever renders "in front of" +// the other. The flash on the icon row is a bonus bloom on top of that, not +// the only thing hiding the seam. Plays once, on mount, then holds. +const times = [0, 0.25, 0.45, 0.58, 0.7, 0.85, 1]; +const transition = { duration: 1.8, times, ease: 'easeInOut' as const }; +const willChange = { willChange: 'transform, opacity' } as const; export default function LoveFusion({ className = '' }: { className?: string }) { return (
💕 ✉️ 💌 @@ -55,28 +56,28 @@ export default function LoveFusion({ className = '' }: { className?: string }) {
love envelope lovelope