refactor(motion): extraer useEnVista, compartido por las ilustraciones
This commit is contained in:
1 parent
fcd58fe00d
commit
1b1b39c67f
4 files changed
+59
-45
No files matched your search
@@ -1,8 +1,7 @@
|
||||
'use client';
|
||||
|
||||
import { useEffect, useRef, useState } from 'react';
|
||||
import { motion } from 'framer-motion';
|
||||
import { usePrefersReducedMotion } from '@/lib/motion';
|
||||
import { useEnVista } from '@/lib/motion';
|
||||
|
||||
// A literal small illustration of the section's own idea: a business grows,
|
||||
// hits its inflection point (the dot), and from there either drifts flat
|
||||
@@ -10,25 +9,7 @@ import { usePrefersReducedMotion } from '@/lib/motion';
|
||||
// (dorado). Draws itself in once scrolled into view; a decorative aside, not
|
||||
// data, so it stays purely presentational.
|
||||
export function IlustracionInflexion({ className = '' }: { className?: string }) {
|
||||
const reduced = usePrefersReducedMotion();
|
||||
const ref = useRef<SVGSVGElement>(null);
|
||||
const [inView, setInView] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
const el = ref.current;
|
||||
if (!el || reduced) return;
|
||||
const observer = new IntersectionObserver(
|
||||
([entry]) => {
|
||||
if (entry.isIntersecting) {
|
||||
setInView(true);
|
||||
observer.unobserve(el);
|
||||
}
|
||||
},
|
||||
{ threshold: 0.4 },
|
||||
);
|
||||
observer.observe(el);
|
||||
return () => observer.disconnect();
|
||||
}, [reduced]);
|
||||
const { ref, enVista, reduced } = useEnVista();
|
||||
|
||||
// `motion.path` applies its own dash-based pathLength scaffolding even with
|
||||
// no initial/animate props, which left the lines invisible for
|
||||
@@ -48,7 +29,7 @@ export function IlustracionInflexion({ className = '' }: { className?: string })
|
||||
|
||||
const draw = (delay: number) => ({
|
||||
initial: { pathLength: 0 },
|
||||
animate: inView ? { pathLength: 1 } : { pathLength: 0 },
|
||||
animate: enVista ? { pathLength: 1 } : { pathLength: 0 },
|
||||
transition: { duration: 1.1, delay, ease: [0.22, 1, 0.36, 1] as const },
|
||||
});
|
||||
|
||||
|
||||
Reference in new issue
Block a user