Premium design updates for Smoking Aids and enhanced image blending

This commit is contained in:
Avery Felts 2026-01-28 10:37:59 -07:00
parent 3cf2e805f2
commit 143258a86d
2 changed files with 174 additions and 91 deletions

View File

@ -671,4 +671,55 @@
scroll-snap-align: center; scroll-snap-align: center;
height: fit-content; height: fit-content;
} }
}
@keyframes gradient-x {
0%,
100% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
}
.animate-gradient-x {
background-size: 200% 200%;
animation: gradient-x 15s ease infinite;
}
@keyframes pulse-subtle {
0%,
100% {
opacity: 0.5;
transform: translate(-50%, -50%) scale(1);
}
50% {
opacity: 0.8;
transform: translate(-50%, -50%) scale(1.05);
}
}
.animate-pulse-subtle {
animation: pulse-subtle 10s ease-in-out infinite;
}
@keyframes float {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-10px);
}
}
.animate-float {
animation: float 6s ease-in-out infinite;
} }

View File

@ -19,9 +19,9 @@ const smokingAids = [
url: 'https://amzn.to/3Z2BuCk', url: 'https://amzn.to/3Z2BuCk',
icon: Wind, icon: Wind,
color: 'text-sky-400', color: 'text-sky-400',
bgColor: 'bg-sky-500/10', themeColor: 'sky',
borderColor: 'border-sky-500/20', gradient: 'from-sky-500/20 to-indigo-500/20',
buttonColor: 'bg-sky-500 hover:bg-sky-600', borderColor: 'border-sky-500/30',
}, },
{ {
id: 'nicotine-lozenge', id: 'nicotine-lozenge',
@ -33,10 +33,10 @@ const smokingAids = [
image: 'https://m.media-amazon.com/images/I/61h+Z88Ev9S._AC_SX679_.jpg', image: 'https://m.media-amazon.com/images/I/61h+Z88Ev9S._AC_SX679_.jpg',
url: 'https://amzn.to/4rfQl8s', url: 'https://amzn.to/4rfQl8s',
icon: Pill, icon: Pill,
color: 'text-red-400', color: 'text-rose-400',
bgColor: 'bg-red-500/10', themeColor: 'rose',
borderColor: 'border-red-500/20', gradient: 'from-rose-500/20 to-pink-500/20',
buttonColor: 'bg-red-500 hover:bg-red-600', borderColor: 'border-rose-500/30',
}, },
{ {
id: 'recovery-complex', id: 'recovery-complex',
@ -48,10 +48,10 @@ const smokingAids = [
image: 'https://m.media-amazon.com/images/I/51HWgmCW1-L._AC_SX679_.jpg', image: 'https://m.media-amazon.com/images/I/51HWgmCW1-L._AC_SX679_.jpg',
url: 'https://amzn.to/3NFU1Sx', url: 'https://amzn.to/3NFU1Sx',
icon: Sparkles, icon: Sparkles,
color: 'text-purple-400', color: 'text-amber-400',
bgColor: 'bg-purple-500/10', themeColor: 'amber',
borderColor: 'border-purple-500/20', gradient: 'from-amber-500/20 to-orange-500/20',
buttonColor: 'bg-purple-500 hover:bg-purple-600', borderColor: 'border-amber-500/30',
}, },
{ {
id: 'mullein-tea', id: 'mullein-tea',
@ -63,10 +63,10 @@ const smokingAids = [
image: 'https://m.media-amazon.com/images/I/81NU8bv72uL._SX679_PIbundle-20,TopRight,0,0_SX679SY693SH20_.jpg', image: 'https://m.media-amazon.com/images/I/81NU8bv72uL._SX679_PIbundle-20,TopRight,0,0_SX679SY693SH20_.jpg',
url: 'https://amzn.to/3LzNpEM', url: 'https://amzn.to/3LzNpEM',
icon: Coffee, icon: Coffee,
color: 'text-green-400', color: 'text-emerald-400',
bgColor: 'bg-green-500/10', themeColor: 'emerald',
borderColor: 'border-green-500/20', gradient: 'from-emerald-500/20 to-teal-500/20',
buttonColor: 'bg-green-500 hover:bg-green-600', borderColor: 'border-emerald-500/30',
}, },
]; ];
@ -74,99 +74,131 @@ export function SmokingAidsContent() {
const { theme } = useTheme(); const { theme } = useTheme();
return ( return (
<div className="min-h-screen pb-24 pt-8 px-4 sm:px-6 lg:px-8 max-w-7xl mx-auto space-y-16"> <div className="min-h-screen pb-24 pt-8 px-4 sm:px-6 lg:px-8 max-w-7xl mx-auto space-y-16 overflow-hidden">
{/* Hero Section */} {/* Hero Section */}
<div className="relative text-center space-y-6 max-w-4xl mx-auto animate-in fade-in slide-in-from-bottom-8 duration-700"> <div className="relative text-center space-y-6 max-w-4xl mx-auto animate-in fade-in slide-in-from-bottom-8 duration-1000">
<div className="absolute top-0 left-1/2 -translate-x-1/2 w-32 h-32 bg-purple-500/20 rounded-full blur-3xl -z-10" /> <div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[120%] h-[120%] bg-purple-500/10 dark:bg-purple-500/5 rounded-full blur-[120px] -z-10 animate-pulse-subtle" />
<h1 className="text-4xl sm:text-6xl font-extrabold tracking-tight"> <h1 className="text-4xl sm:text-6xl lg:text-7xl font-extrabold tracking-tight">
Tools for Your <span className="text-transparent bg-clip-text bg-gradient-to-r from-purple-400 via-pink-400 to-orange-400">Freedom</span> Tools for Your <span className="text-transparent bg-clip-text bg-gradient-to-r from-purple-400 via-pink-400 to-orange-400 animate-gradient-x">Freedom</span>
</h1> </h1>
<p className="text-lg sm:text-xl text-muted-foreground leading-relaxed max-w-2xl mx-auto"> <p className="text-lg sm:text-xl text-muted-foreground leading-relaxed max-w-2xl mx-auto font-medium">
Transform your journey with tools designed to support your physical recovery and mental resilience. You don't have to do this alone. Transform your journey with tools designed to support your physical recovery and mental resilience. You don&apos;t have to do this alone.
</p> </p>
</div> </div>
{/* Grid Section */} {/* Grid Section */}
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6 sm:gap-8"> <div className="grid grid-cols-1 lg:grid-cols-2 gap-8 sm:gap-10">
{smokingAids.map((item, index) => ( {smokingAids.map((item, index) => {
<div const cardBackground = theme === 'light'
key={item.id} ? `linear-gradient(135deg, rgba(255, 255, 255, 0.96) 0%, rgba(255, 255, 255, 0.9) 100%)`
className="group animate-in fade-in slide-in-from-bottom-12 fill-mode-both" : `linear-gradient(135deg, rgba(16, 16, 32, 0.7) 0%, rgba(24, 24, 48, 0.6) 100%)`;
style={{ animationDelay: `${index * 150}ms` }}
>
<Card className="h-full flex flex-col overflow-hidden border-border/40 hover:border-border/80 transition-all duration-300 hover:shadow-2xl hover:-translate-y-1 bg-card/30 backdrop-blur-xl relative group">
{/* Full card gradient overlay on hover */}
<div className={`absolute inset-0 bg-gradient-to-br ${item.bgColor.replace('bg-', 'from-').split('/')[0]}/10 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-500 pointer-events-none z-0`} />
<div className="flex flex-col sm:flex-row h-full relative z-10"> return (
{/* Image Section - Top on mobile, Left on desktop */} <div
<div className="relative w-full sm:w-2/5 h-64 sm:h-auto bg-gradient-to-br from-white/5 to-white/0 p-6 flex items-center justify-center shrink-0"> key={item.id}
<div className="relative w-40 h-40 sm:w-48 sm:h-48 transition-transform duration-500 group-hover:scale-105 bg-white rounded-full shadow-lg flex items-center justify-center overflow-hidden"> className="group animate-in fade-in slide-in-from-bottom-12 fill-mode-both"
<div className="relative w-3/4 h-3/4"> style={{ animationDelay: `${index * 150}ms` }}
<Image >
src={item.image} <Card
alt={item.title} className="h-full flex flex-col overflow-hidden border-border/40 transition-all duration-500 hover:shadow-[0_20px_50px_rgba(0,0,0,0.2)] dark:hover:shadow-[0_20px_50px_rgba(0,0,0,0.4)] hover:-translate-y-2 backdrop-blur-xl relative group"
fill style={{
className="object-contain drop-shadow-sm" background: cardBackground,
sizes="(max-width: 640px) 100vw, 300px" borderColor: `rgba(var(--${item.themeColor}-500), 0.3)`
/> }}
</div> >
</div> {/* Specific card glow on hover */}
<Badge variant="secondary" className="absolute top-4 left-4 backdrop-blur-md bg-white text-black border-white/20 shadow-sm px-3 py-1 text-sm font-medium"> <div className={`absolute top-0 right-0 w-64 h-64 opacity-0 group-hover:opacity-100 transition-opacity duration-700 pointer-events-none blur-[80px] -translate-y-1/2 translate-x-1/2`}
{item.category} style={{ backgroundColor: `rgba(var(--${item.themeColor}-500), 0.1)` }} />
</Badge>
</div>
{/* Content Section */} <div className="flex flex-col sm:flex-row h-full relative z-10">
<div className="flex flex-col flex-grow p-6 sm:p-8"> {/* Image Section - Now with seamless blending */}
<div className="flex items-start justify-between gap-4 mb-4"> <div className="relative w-full sm:w-2/5 h-72 sm:h-auto overflow-hidden flex items-center justify-center shrink-0">
<div> {/* Atmospheric background glow - larger and softer */}
<h3 className="text-xl font-bold group-hover:text-primary transition-colors line-clamp-2"> <div className={`absolute inset-0 bg-gradient-to-br ${item.gradient} opacity-20 group-hover:opacity-40 transition-all duration-700 blur-[60px] transform scale-150`} />
{item.title}
</h3> {/* Vertical fader to blend image area into content area */}
<div className="flex items-center gap-1 mt-2"> <div className="absolute inset-y-0 right-0 w-24 bg-gradient-to-l from-transparent to-transparent group-hover:from-white/5 transition-colors duration-500 hidden sm:block" />
{[...Array(5)].map((_, i) => (
<Star <div className="relative w-48 h-48 sm:w-56 sm:h-56 transition-all duration-1000 group-hover:scale-105 flex items-center justify-center">
key={i} {/* High-fidelity glass orb effect */}
className={`w-3.5 h-3.5 ${i < Math.floor(item.rating) ? 'fill-yellow-400 text-yellow-400' : 'text-muted'}`} <div className="absolute inset-0 bg-white/10 dark:bg-white/[0.03] backdrop-blur-[30px] rounded-full border border-white/20 dark:border-white/10 shadow-[0_0_50px_rgba(0,0,0,0.3)]" />
/>
))} {/* Inner glow/shimmer */}
<span className="text-xs text-muted-foreground ml-2">({item.rating})</span> <div className="absolute inset-2 rounded-full bg-gradient-to-tr from-white/10 to-transparent opacity-50" />
<div className="relative w-[75%] h-[75%] z-20">
<Image
src={item.image}
alt={item.title}
fill
className="object-contain filter drop-shadow-[0_15px_15px_rgba(0,0,0,0.4)] brightness-110"
style={{
maskImage: 'radial-gradient(circle at center, black 60%, transparent 100%)',
WebkitMaskImage: 'radial-gradient(circle at center, black 60%, transparent 100%)'
}}
sizes="(max-width: 640px) 100vw, 300px"
/>
</div> </div>
</div> </div>
<div className={`p-2.5 rounded-xl ${item.bgColor} ${item.color} shrink-0`}> <div className="absolute top-4 left-4">
<item.icon className="w-5 h-5" /> <Badge className="bg-white/10 dark:bg-black/20 backdrop-blur-xl text-foreground border-white/20 px-3 py-1.5 text-xs font-bold uppercase tracking-widest shadow-lg">
{item.category}
</Badge>
</div> </div>
</div> </div>
<p className="text-muted-foreground text-sm leading-relaxed mb-6 line-clamp-3"> {/* Content Section */}
{item.description} <div className="flex flex-col flex-grow p-6 sm:p-8">
</p> <div className="flex items-start justify-between gap-4 mb-4">
<div className="flex-1">
<div className={`mt-auto p-4 rounded-xl ${item.bgColor} border ${item.borderColor} mb-6`}> <h3 className="text-xl sm:text-2xl font-bold tracking-tight group-hover:text-primary transition-colors duration-300">
<div className="flex gap-3"> {item.title}
<Quote className={`w-4 h-4 ${item.color} shrink-0 flip-x`} /> </h3>
<p className="text-xs font-medium italic opacity-90"> <div className="flex items-center gap-1.5 mt-3">
{item.benefit} {[...Array(5)].map((_, i) => (
</p> <Star
key={i}
className={`w-4 h-4 ${i < Math.floor(item.rating) ? 'fill-yellow-400 text-yellow-400' : 'text-muted-foreground/30'}`}
/>
))}
<span className="text-xs font-bold text-muted-foreground/70 ml-2 tracking-wide tracking-widest">{item.rating}</span>
</div>
</div>
<div className={`p-3 rounded-2xl bg-white/5 border border-white/10 ${item.color} shadow-lg shrink-0 group-hover:scale-110 transition-transform duration-500`}>
<item.icon className="w-5 h-5 sm:w-6 sm:h-6" />
</div>
</div> </div>
</div>
<Button <p className="text-muted-foreground/80 text-sm leading-relaxed mb-8 line-clamp-3 font-medium">
asChild {item.description}
className={`w-full text-white font-semibold shadow-lg transition-all duration-300 hover:ring-2 hover:ring-offset-2 hover:ring-offset-background ${item.buttonColor} rounded-xl h-12`} </p>
>
<a href={item.url} target="_blank" rel="noopener noreferrer" className="flex items-center justify-center gap-2"> <div className={`mt-auto p-5 rounded-2xl bg-gradient-to-br ${item.gradient} border ${item.borderColor} mb-8 relative overflow-hidden group/benefit`}>
View on Amazon <div className="absolute inset-0 bg-white/5 opacity-0 group-hover/benefit:opacity-100 transition-opacity duration-500" />
<ExternalLink className="w-4 h-4 ml-1" /> <div className="flex gap-4 relative z-10">
</a> <Quote className={`w-5 h-5 ${item.color} shrink-0 opacity-80`} />
</Button> <p className="text-[13px] font-semibold leading-relaxed opacity-90 italic">
{item.benefit}
</p>
</div>
</div>
<Button
asChild
className={`w-full text-white font-bold shadow-[0_10px_20px_rgba(0,0,0,0.2)] hover:shadow-[0_15px_30px_rgba(0,0,0,0.3)] transition-all duration-500 hover:ring-2 hover:ring-${item.themeColor}-500/50 hover:ring-offset-4 hover:ring-offset-background bg-gradient-to-r from-primary to-primary/80 rounded-2xl h-14 group-hover:scale-[1.02] active:scale-95`}
>
<a href={item.url} target="_blank" rel="noopener noreferrer" className="flex items-center justify-center gap-3">
View Details
<ExternalLink className="w-5 h-5 opacity-70 group-hover:translate-x-1 group-hover:-translate-y-1 transition-transform" />
</a>
</Button>
</div>
</div> </div>
</div> </Card>
</Card> </div>
</div> );
))} })}
</div> </div>
{/* Trust/Disclaimer Section */} {/* Trust/Disclaimer Section */}