Definitive source for "Neural Flux" motion standards, Framer Motion patterns, and performance rules.
Use this skill to ensure all animations align with the "Neural Flux" aesthetic: fluid, magnetic, and 60fps stable.
These are the actual values used in the codebase. Copy these directly.
const springConfig = { stiffness: 100, damping: 30, restDelta: 0.001 }
const springConfig = { stiffness: 300, damping: 50, restDelta: 0.01 }
// Lenis smooth scroll easing — initialized in App.jsx
const lenis = new Lenis({
duration: prefersReducedMotion ? 0 : 1.2,
easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),
smoothWheel: !prefersReducedMotion,
})
All 5 section components use this exact pattern for scroll-triggered animations:
const containerRef = useRef(null)
const isInView = useInView(containerRef, { once: true, margin: "-100px" })
// Section header animation
<motion.div
initial={{ opacity: 0, y: 50 }}
animate={isInView ? { opacity: 1, y: 0 } : {}}
transition={{ duration: 0.8 }}
>
once: true (animate only once as user scrolls down)margin: "-100px" (trigger 100px before element enters viewport)whileInView — use animate={isInView ? ... : {}} conditional patternUsed in App.jsx and OrbitalNavigation.jsx for components that enter/exit:
<AnimatePresence>
{isExpanded && (
<motion.div
initial={{ opacity: 0, scale: 0 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0 }}
/>
)}
</AnimatePresence>
transform and opacity ONLY.top, left, width, height, margin (Layout Thrashing).x, y, scale, rotate, opacity..cursor-arrow uses will-change: transform.dpr={[1, 1.5]}. Disable heavy post-processing on mobile.useFrame with direct property mutation for 3D objects. Framer Motion is for DOM/CSS animations only.whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
transition={{ duration: 0.5, delay: index * 0.1 }}
const { scrollYProgress } = useScroll({ target: containerRef, offset: ["start start", "end start"] })
const titleY = useTransform(scrollYProgress, [0, 1], [0, 200])
const titleYSpring = useSpring(titleY, springConfig)
Elements use data-cursor attribute. MagneticCursor reads via event delegation. Element moves 20% of cursor distance.