- Add AnnouncementBar with marquee animation - Add NewHero with floating product card - Add StatsSection with large stat numbers - Add FeaturesSection with icons - Add TestimonialsSection with cards - Add NewsletterSection with signup form - Update Header styling for new design - Update globals.css with marquee animations - Update page.tsx to use new components All existing WooCommerce functionality preserved
95 lines
3.2 KiB
TypeScript
95 lines
3.2 KiB
TypeScript
"use client";
|
|
|
|
import { motion } from "framer-motion";
|
|
import { useState } from "react";
|
|
import { ArrowRight } from "lucide-react";
|
|
|
|
export default function NewsletterSection() {
|
|
const [email, setEmail] = useState("");
|
|
const [status, setStatus] = useState<"idle" | "success" | "error">("idle");
|
|
|
|
const handleSubmit = (e: React.FormEvent) => {
|
|
e.preventDefault();
|
|
// TODO: Connect to newsletter service
|
|
setStatus("success");
|
|
setEmail("");
|
|
};
|
|
|
|
return (
|
|
<section className="border-t border-[#1A1A1A]/[0.06] py-14 lg:py-20 bg-white">
|
|
<div className="max-w-[1400px] mx-auto px-6">
|
|
<div className="max-w-2xl mx-auto text-center">
|
|
<motion.h2
|
|
initial={{ opacity: 0, y: 20 }}
|
|
whileInView={{ opacity: 1, y: 0 }}
|
|
viewport={{ once: true }}
|
|
transition={{ duration: 0.6 }}
|
|
className="font-serif italic text-4xl lg:text-5xl xl:text-[3.5rem] text-[#1A1A1A] tracking-tight leading-[1.1] mb-6"
|
|
>
|
|
Get 10% off your
|
|
<br />
|
|
first order
|
|
</motion.h2>
|
|
|
|
<motion.p
|
|
initial={{ opacity: 0, y: 20 }}
|
|
whileInView={{ opacity: 1, y: 0 }}
|
|
viewport={{ once: true }}
|
|
transition={{ duration: 0.6, delay: 0.1 }}
|
|
className="text-[#4A4A4A] mb-8"
|
|
>
|
|
Join the ManoonOils community and receive exclusive offers,
|
|
skincare tips, and early access to new products.
|
|
</motion.p>
|
|
|
|
<motion.form
|
|
initial={{ opacity: 0, y: 20 }}
|
|
whileInView={{ opacity: 1, y: 0 }}
|
|
viewport={{ once: true }}
|
|
transition={{ duration: 0.6, delay: 0.2 }}
|
|
onSubmit={handleSubmit}
|
|
className="flex flex-col sm:flex-row gap-3 max-w-md mx-auto"
|
|
>
|
|
<input
|
|
type="email"
|
|
value={email}
|
|
onChange={(e) => setEmail(e.target.value)}
|
|
placeholder="Enter your email"
|
|
required
|
|
className="flex-1 px-4 py-3 border border-[#1A1A1A]/10 rounded-[4px] text-sm focus:outline-none focus:border-[#1A1A1A]/30 transition-colors"
|
|
/>
|
|
<button
|
|
type="submit"
|
|
className="inline-flex items-center justify-center gap-2 bg-[#1A1A1A] text-white px-6 py-3 text-sm font-medium hover:bg-[#1A1A1A]/90 transition-colors rounded-[4px]"
|
|
>
|
|
Subscribe
|
|
<ArrowRight className="w-4 h-4" />
|
|
</button>
|
|
</motion.form>
|
|
|
|
{status === "success" && (
|
|
<motion.p
|
|
initial={{ opacity: 0 }}
|
|
animate={{ opacity: 1 }}
|
|
className="text-sm text-emerald-600 mt-4"
|
|
>
|
|
Thank you! Check your email for your discount code.
|
|
</motion.p>
|
|
)}
|
|
|
|
<motion.p
|
|
initial={{ opacity: 0 }}
|
|
whileInView={{ opacity: 1 }}
|
|
viewport={{ once: true }}
|
|
transition={{ duration: 0.6, delay: 0.3 }}
|
|
className="text-xs text-[#4A4A4A]/60 mt-4"
|
|
>
|
|
By subscribing, you agree to our Privacy Policy. Unsubscribe
|
|
anytime.
|
|
</motion.p>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
);
|
|
}
|