Spaces:
Sleeping
Sleeping
File size: 4,983 Bytes
efb726d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | import React from 'react';
import { motion, Variants } from 'framer-motion';
import { COMPARISON_DATA } from '../../data/mockData';
import { ComparisonItem } from '../../types';
const ProblemSolution: React.FC = () => {
// Jitter animation for "Problem" items
const jitter: Variants = {
animate: {
x: [0, -2, 2, -1, 1, 0],
y: [0, 1, -1, 0, 1, 0],
opacity: [0.6, 0.8, 0.5, 0.7],
transition: {
duration: 2, // Slower, persistent unease
repeat: Infinity,
repeatType: "mirror",
ease: "linear"
}
}
};
// Smooth entry for "Solution" items
const smoothEntry: Variants = {
hidden: { opacity: 0, x: 20 },
visible: (i: number) => ({
opacity: 1,
x: 0,
transition: {
delay: i * 0.1,
duration: 0.8,
ease: [0.22, 1, 0.36, 1] as [number, number, number, number]
}
})
};
return (
<section className="relative w-full min-h-[80vh] flex flex-col md:flex-row">
{/* LEFT SIDE: The Problem (Chaos) */}
<div className="w-full md:w-1/2 bg-[#0a0202] relative overflow-hidden flex flex-col justify-center px-8 py-16 md:px-16 lg:px-24">
{/* Heavy Noise Overlay */}
<div
className="absolute inset-0 opacity-20 pointer-events-none mix-blend-overlay z-10"
style={{
backgroundImage: 'url("data:image/svg+xml,%3Csvg viewBox=\'0 0 200 200\' xmlns=\'http://www.w3.org/2000/svg\'%3E%3Cfilter id=\'noiseFilter\'%3E%3CfeTurbulence type=\'fractalNoise\' baseFrequency=\'0.9\' numOctaves=\'3\' stitchTiles=\'stitch\'/%3E%3C/filter%3E%3Crect width=\'100%25\' height=\'100%25\' filter=\'url(%23noiseFilter)\'/%3E%3C/svg%3E")'
}}
/>
<motion.div
initial={{ opacity: 0 }}
whileInView={{ opacity: 1 }}
className="relative z-20"
>
<h3 className="font-serif text-3xl md:text-4xl text-white/40 mb-12 tracking-wide">
The Uncertainty
</h3>
<div className="space-y-8">
{COMPARISON_DATA.map((item: ComparisonItem) => (
<motion.div
key={`prob-${item.id}`}
className="flex items-center gap-4"
variants={jitter}
animate="animate"
>
<div className="w-1.5 h-1.5 bg-red-900/50 rounded-full" />
<p className="font-sans text-xl md:text-2xl text-red-100/30 line-through decoration-red-900/50 decoration-2">
{item.problem}
</p>
</motion.div>
))}
</div>
</motion.div>
</div>
{/* RIGHT SIDE: The Solution (Control) */}
<div className="w-full md:w-1/2 relative bg-gradient-to-br from-[#2a0505] to-[#110101] flex flex-col justify-center px-8 py-16 md:px-16 lg:px-24 border-l border-white/5">
<motion.div
initial="hidden"
whileInView="visible"
viewport={{ once: true, margin: "-20%" }}
className="relative z-20"
>
<h3 className="font-serif text-3xl md:text-4xl text-brand-gold mb-12 tracking-wide">
The Standard
</h3>
<div className="space-y-8">
{COMPARISON_DATA.map((item: ComparisonItem, index: number) => (
<motion.div
key={`sol-${item.id}`}
custom={index}
variants={smoothEntry}
className="flex items-center gap-6"
>
<div className="w-8 h-[1px] bg-brand-red" />
<p className="font-sans text-xl md:text-2xl text-white font-medium tracking-tight">
{item.solution}
</p>
</motion.div>
))}
</div>
</motion.div>
{/* Subtle sheen effect on right side */}
<div className="absolute top-0 right-0 w-full h-full bg-gradient-to-b from-white/5 to-transparent pointer-events-none" />
</div>
</section>
);
};
export default ProblemSolution; |