Production ready

This commit is contained in:
2026-02-09 22:31:22 +01:00
parent fd6e7c44e1
commit 7814548e11
82 changed files with 3390 additions and 2026 deletions

View File

@@ -9,7 +9,9 @@ import { ThemeToggle } from '@/components/ui/ThemeToggle'
import { HeroSection } from '@/components/landing/LandingSections'
import { motion, AnimatePresence } from 'framer-motion'
import { Footer } from '@/components/layout/Footer'
import { Check, ChevronDown, Monitor, Globe, Shield, Clock, Zap, Menu } from 'lucide-react'
import { MagneticButton } from '@/components/landing/MagneticElements'
import { Check, ChevronDown, Menu } from 'lucide-react'
import { BackgroundGradient, FloatingElements, InteractiveGrid, GlowEffect } from '@/components/landing/BackgroundEffects'
// Dynamic imports for performance optimization (lazy loading)
const UseCaseShowcase = dynamic(
@@ -56,54 +58,76 @@ export default function Home() {
const faqs = [
{
question: 'What is website monitoring?',
answer: 'Website monitoring is the process of testing and verifying that end-users can interact with a website or web application as expected. It continuously checks your website for changes, downtime, or performance issues.'
question: 'What is the most accurate site change monitor for 2026?',
answer: 'SiteChangeMonitor.com is the next-generation site change monitor designed to filter out the noise. Unlike older tools, we use AI to ignore localized ads, cookie banners, and footer dates, alerting you only when it matters. Join the waitlist to access the first "Zero-Noise" tracking engine.'
},
{
question: 'How fast are the alerts?',
answer: 'Our alerts are sent within seconds of detecting a change. You can configure notifications via email, webhook, Slack, or other integrations.'
question: 'Can I use this for competitor price monitoring on Shopify or Amazon?',
answer: 'Yes, this is our specialty. Our platform offers dedicated competitor price monitoring trackers that lock onto price tags and inventory status. We automatically filter out false positives.'
},
{
question: 'Can I monitor SSL certificates?',
answer: 'Yes! We automatically monitor SSL certificate expiration and will alert you before your certificate expires.'
question: 'How do I monitor a website for changes without coding?',
answer: "With SiteChangeMonitor.com, you don't need CSS selectors. Simply paste the URL. Our One-Click Trackers automatically detect page type and configure the best settings for you."
},
{
question: 'Do you offer a free trial?',
answer: 'Yes, we offer a free Starter plan that includes 3 monitors with hourly checks. No credit card required.'
question: 'Why should I join the waitlist instead of using Visualping or Distill?',
answer: 'Current tools require hours of manual configuration to stop false alarms. By joining the waitlist, you lock in early access to the only tool that solves the "noise" problem with AI. Plus, waitlist members receive a permanent discount on the Pro plan.'
},
{
question: 'Is there a free version available?',
answer: 'Yes. We will launch with a "Forever Free" plan for casual users. Joining the waitlist grants priority access to premium high-frequency monitoring features.'
}
]
return (
<div className="min-h-screen bg-background text-foreground font-sans selection:bg-primary/20 selection:text-primary">
<div className="min-h-screen bg-background text-foreground font-sans selection:bg-primary/20 selection:text-primary relative overflow-hidden">
{/* Background Effects */}
<BackgroundGradient />
<InteractiveGrid />
<FloatingElements />
<GlowEffect />
{/* Header */}
<header className="fixed top-0 z-50 w-full border-b border-border/40 bg-background/80 backdrop-blur-xl supports-[backdrop-filter]:bg-background/60">
<div className="mx-auto flex h-16 max-w-7xl items-center justify-between px-6 transition-all duration-200">
<div className="flex items-center gap-8">
<Link href="/" className="flex items-center gap-2 group">
<div className="relative h-8 w-8 transition-transform group-hover:scale-110">
<Image src="/logo.png" alt="Alertify Logo" fill className="object-contain" />
<Image
src="/logo.png"
alt="SiteChangeMonitor Logo"
fill
className="object-contain"
priority
fetchPriority="high"
sizes="32px"
/>
</div>
<span className="text-lg font-bold tracking-tight text-foreground">Alertify</span>
<span className="text-lg font-bold tracking-tight text-foreground">SiteChangeMonitor</span>
</Link>
<nav className="hidden items-center gap-6 md:flex">
<Link href="#features" className="text-sm font-medium text-muted-foreground hover:text-foreground transition-colors">Features</Link>
<Link href="#use-cases" className="text-sm font-medium text-muted-foreground hover:text-foreground transition-colors">Use Cases</Link>
<Link href="/features" className="text-sm font-medium text-muted-foreground hover:text-foreground transition-colors">Features</Link>
<Link href="/use-cases" className="text-sm font-medium text-muted-foreground hover:text-foreground transition-colors">Use Cases</Link>
</nav>
</div>
<div className="flex items-center gap-3">
<ThemeToggle />
<Button
size="sm"
className="bg-primary hover:bg-primary/90 text-primary-foreground rounded-full px-5 transition-transform hover:scale-105 active:scale-95 shadow-md shadow-primary/20"
onClick={() => document.getElementById('hero')?.scrollIntoView({ behavior: 'smooth' })}
>
Join Waitlist
</Button>
<MagneticButton strength={0.4}>
<Button
size="sm"
className="bg-primary hover:bg-primary/90 text-primary-foreground rounded-full px-5 transition-transform active:scale-95 shadow-md shadow-primary/20"
onClick={() => document.getElementById('hero')?.scrollIntoView({ behavior: 'smooth' })}
aria-label="Join the waitlist"
>
Join Waitlist
</Button>
</MagneticButton>
{/* Mobile Menu Button */}
<button
className="md:hidden p-2 text-muted-foreground hover:text-foreground"
onClick={() => setMobileMenuOpen(!mobileMenuOpen)}
aria-label="Toggle mobile menu"
>
<Menu className="h-6 w-6" />
</button>
@@ -120,8 +144,8 @@ export default function Home() {
className="md:hidden border-t border-border bg-background px-6 py-4 shadow-lg overflow-hidden"
>
<div className="flex flex-col gap-4">
<Link href="#features" onClick={() => setMobileMenuOpen(false)} className="text-sm font-medium text-muted-foreground hover:text-foreground">Features</Link>
<Link href="#use-cases" onClick={() => setMobileMenuOpen(false)} className="text-sm font-medium text-muted-foreground hover:text-foreground">Use Cases</Link>
<Link href="/features" onClick={() => setMobileMenuOpen(false)} className="text-sm font-medium text-muted-foreground hover:text-foreground">Features</Link>
<Link href="/use-cases" onClick={() => setMobileMenuOpen(false)} className="text-sm font-medium text-muted-foreground hover:text-foreground">Use Cases</Link>
<button
onClick={() => {
setMobileMenuOpen(false)
@@ -147,58 +171,64 @@ export default function Home() {
{/* Hero Section */}
<HeroSection />
{/* Live SERP Preview Tool */}
<LiveSerpPreview />
{/* Continuous Gradient Wrapper for Content */}
<div className="gradient-ivory">
{/* Live SERP Preview Tool */}
<LiveSerpPreview />
{/* Use Case Showcase */}
<UseCaseShowcase />
{/* Use Case Showcase */}
<UseCaseShowcase />
{/* How It Works */}
<HowItWorks />
{/* How It Works */}
<HowItWorks />
{/* Differentiators */}
<Differentiators />
{/* Differentiators */}
<Differentiators />
{/* FAQ Section */}
< section id="faq" className="border-t border-border/40 py-24 bg-background" >
<div className="mx-auto max-w-3xl px-6">
<h2 className="mb-12 text-center text-3xl font-bold sm:text-4xl text-foreground">
Frequently Asked Questions
</h2>
{/* FAQ Section */}
<section id="faq" className="border-t border-border/40 py-24">
<div className="mx-auto max-w-3xl px-6">
<h2 className="mb-12 text-center text-3xl font-bold sm:text-4xl text-foreground">
Frequently Asked Questions
</h2>
<div className="space-y-4">
{faqs.map((faq, index) => (
<motion.div
key={index}
className="rounded-2xl border border-border bg-card overflow-hidden"
initial={false}
>
<button
onClick={() => setOpenFaq(openFaq === index ? null : index)}
className="flex w-full items-center justify-between p-6 text-left hover:bg-secondary/30 transition-colors"
<div className="space-y-4">
{faqs.map((faq, index) => (
<motion.div
key={index}
className="rounded-2xl border border-border bg-card overflow-hidden"
initial={false}
>
<span className="font-medium text-foreground">{faq.question}</span>
<ChevronDown
className={`h-5 w-5 text-muted-foreground transition-transform duration-300 ${openFaq === index ? 'rotate-180' : ''}`}
/>
</button>
<AnimatePresence>
{openFaq === index && (
<motion.div
initial={{ height: 0, opacity: 0 }}
animate={{ height: "auto", opacity: 1 }}
exit={{ height: 0, opacity: 0 }}
className="border-t border-border px-6 pb-6 pt-4 text-muted-foreground bg-secondary/5"
>
{faq.answer}
</motion.div>
)}
</AnimatePresence>
</motion.div>
))}
<button
onClick={() => setOpenFaq(openFaq === index ? null : index)}
className="flex w-full items-center justify-between p-6 text-left hover:bg-secondary/30 transition-colors"
>
<span className="font-medium text-foreground">{faq.question}</span>
<ChevronDown
className={`h-5 w-5 text-muted-foreground transition-transform duration-300 ${openFaq === index ? 'rotate-180' : ''}`}
/>
</button>
<AnimatePresence initial={false}>
{openFaq === index && (
<motion.div
initial={{ height: 0, opacity: 0 }}
animate={{ height: "auto", opacity: 1 }}
exit={{ height: 0, opacity: 0 }}
transition={{ duration: 0.3, ease: "easeInOut" }}
className="overflow-hidden"
>
<div className="border-t border-border px-6 pb-6 pt-4 text-muted-foreground bg-secondary/5">
{faq.answer}
</div>
</motion.div>
)}
</AnimatePresence>
</motion.div>
))}
</div>
</div>
</div>
</section >
</section >
</div>
{/* Final CTA */}
<FinalCTA />