204 lines
7.1 KiB
TypeScript
204 lines
7.1 KiB
TypeScript
"use client"
|
|
|
|
import { useState, useEffect } from 'react'
|
|
import { motion } from 'framer-motion'
|
|
import {
|
|
Shield,
|
|
Lock,
|
|
Zap,
|
|
Globe,
|
|
ArrowUp,
|
|
Key
|
|
} from 'lucide-react'
|
|
import { PasswordGenerator } from '@/components/PasswordGenerator'
|
|
import { FAQ } from '@/components/FAQ'
|
|
import { FloatingCTA } from '@/components/FloatingCTA'
|
|
|
|
export default function HomePage() {
|
|
const [showScrollTop, setShowScrollTop] = useState(false)
|
|
|
|
useEffect(() => {
|
|
const handleScroll = () => {
|
|
setShowScrollTop(window.scrollY > 400)
|
|
}
|
|
|
|
window.addEventListener('scroll', handleScroll)
|
|
return () => window.removeEventListener('scroll', handleScroll)
|
|
}, [])
|
|
|
|
const scrollToTop = () => {
|
|
window.scrollTo({ top: 0, behavior: 'smooth' })
|
|
}
|
|
|
|
const features = [
|
|
{
|
|
icon: Lock,
|
|
title: "End-to-End Client-Side Encryption",
|
|
description: "Your passwords are generated locally in your browser. Nothing is ever sent to our servers."
|
|
},
|
|
{
|
|
icon: Zap,
|
|
title: "Works Offline (PWA)",
|
|
description: "Install as an app and generate passwords even without an internet connection."
|
|
},
|
|
{
|
|
icon: Globe,
|
|
title: "100% Privacy-First",
|
|
description: "Transparent code that you can audit. No tracking, no data collection, no server communication."
|
|
}
|
|
]
|
|
|
|
return (
|
|
<div className="min-h-screen">
|
|
{/* Hero Section */}
|
|
<section className="py-20 px-4 sm:px-6 lg:px-8">
|
|
<div className="max-w-4xl mx-auto text-center">
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6 }}
|
|
className="mb-8"
|
|
>
|
|
<div className="flex justify-center mb-6">
|
|
<div className="p-4 bg-primary-100 dark:bg-primary-900/20 rounded-full">
|
|
<Shield className="h-12 w-12 text-primary-600" />
|
|
</div>
|
|
</div>
|
|
<h1 className="text-4xl md:text-6xl font-bold text-gray-900 dark:text-white mb-6">
|
|
Free Offline Secure Password Generator
|
|
</h1>
|
|
<p className="text-xl md:text-2xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto leading-relaxed">
|
|
Generate strong, unique passwords in seconds — fully client-side, private, and secure.
|
|
</p>
|
|
</motion.div>
|
|
|
|
{/* Primary CTA */}
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 20 }}
|
|
animate={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6, delay: 0.2 }}
|
|
className="mb-12"
|
|
>
|
|
<a
|
|
href="#generator"
|
|
className="btn-primary text-lg px-8 py-4 inline-flex items-center space-x-2"
|
|
>
|
|
<Key className="h-5 w-5" />
|
|
<span>Generate Password</span>
|
|
</a>
|
|
</motion.div>
|
|
</div>
|
|
</section>
|
|
|
|
{/* Features Section */}
|
|
<section className="py-16 px-4 sm:px-6 lg:px-8 bg-gray-50 dark:bg-gray-800">
|
|
<div className="max-w-7xl mx-auto">
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 20 }}
|
|
whileInView={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6 }}
|
|
viewport={{ once: true }}
|
|
className="text-center mb-12"
|
|
>
|
|
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 dark:text-white mb-4">
|
|
Why PassMaster is Safer
|
|
</h2>
|
|
<p className="text-lg text-gray-600 dark:text-gray-300 max-w-2xl mx-auto">
|
|
Built with privacy and security as the foundation, not an afterthought.
|
|
</p>
|
|
</motion.div>
|
|
|
|
<div className="grid md:grid-cols-3 gap-8">
|
|
{features.map((feature, index) => (
|
|
<motion.div
|
|
key={feature.title}
|
|
initial={{ opacity: 0, y: 20 }}
|
|
whileInView={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6, delay: index * 0.1 }}
|
|
viewport={{ once: true }}
|
|
whileHover={{ y: -5 }}
|
|
className="card text-center group cursor-pointer"
|
|
>
|
|
<div className="flex justify-center mb-4">
|
|
<div className="p-3 bg-primary-100 dark:bg-primary-900/20 rounded-full group-hover:bg-primary-200 dark:group-hover:bg-primary-900/40 transition-colors duration-200">
|
|
<feature.icon className="h-8 w-8 text-primary-600" />
|
|
</div>
|
|
</div>
|
|
<h3 className="text-xl font-semibold text-gray-900 dark:text-white mb-3">
|
|
{feature.title}
|
|
</h3>
|
|
<p className="text-gray-600 dark:text-gray-300">
|
|
{feature.description}
|
|
</p>
|
|
</motion.div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
{/* Password Generator Section */}
|
|
<section id="generator" className="py-16 px-4 sm:px-6 lg:px-8">
|
|
<div className="max-w-4xl mx-auto">
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 20 }}
|
|
whileInView={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6 }}
|
|
viewport={{ once: true }}
|
|
className="text-center mb-12"
|
|
>
|
|
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 dark:text-white mb-4">
|
|
Generate Your Strong Password
|
|
</h2>
|
|
<p className="text-lg text-gray-600 dark:text-gray-300">
|
|
Customize your password settings and generate secure passwords instantly.
|
|
</p>
|
|
</motion.div>
|
|
|
|
<PasswordGenerator />
|
|
</div>
|
|
</section>
|
|
|
|
{/* FAQ Section */}
|
|
<section id="faq" className="py-16 px-4 sm:px-6 lg:px-8 bg-gray-50 dark:bg-gray-800">
|
|
<div className="max-w-4xl mx-auto">
|
|
<motion.div
|
|
initial={{ opacity: 0, y: 20 }}
|
|
whileInView={{ opacity: 1, y: 0 }}
|
|
transition={{ duration: 0.6 }}
|
|
viewport={{ once: true }}
|
|
className="text-center mb-12"
|
|
>
|
|
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 dark:text-white mb-4">
|
|
Frequently Asked Questions
|
|
</h2>
|
|
<p className="text-lg text-gray-600 dark:text-gray-300">
|
|
Everything you need to know about PassMaster and password security.
|
|
</p>
|
|
</motion.div>
|
|
|
|
<FAQ />
|
|
</div>
|
|
</section>
|
|
|
|
{/* Floating CTA */}
|
|
<FloatingCTA />
|
|
|
|
{/* Scroll to Top Button */}
|
|
{showScrollTop && (
|
|
<motion.button
|
|
onClick={scrollToTop}
|
|
className="fixed bottom-6 right-6 z-50 p-3 bg-primary-600 hover:bg-primary-700 text-white rounded-full shadow-lg transition-colors duration-200"
|
|
initial={{ opacity: 0, scale: 0 }}
|
|
animate={{ opacity: 1, scale: 1 }}
|
|
exit={{ opacity: 0, scale: 0 }}
|
|
whileHover={{ scale: 1.1 }}
|
|
whileTap={{ scale: 0.9 }}
|
|
aria-label="Scroll to top"
|
|
>
|
|
<ArrowUp className="h-5 w-5" />
|
|
</motion.button>
|
|
)}
|
|
</div>
|
|
)
|
|
}
|