Finished Landing Page

This commit is contained in:
2026-02-17 00:14:38 +01:00
parent 821ba82ecc
commit 94b0c68703
20 changed files with 1662 additions and 953 deletions

View File

@@ -1,176 +1,159 @@
'use client';
import { useScrollAnimation } from '@/hooks/useScrollAnimation';
import {
MessageSquare,
Brain,
Shield,
BarChart3,
Bell,
"use client";
import { useScrollAnimation } from "@/hooks/useScrollAnimation";
import {
MessageSquare,
Brain,
Shield,
BarChart3,
Bell,
Lock,
Sparkles,
Link,
Zap,
Check,
TrendingUp
} from 'lucide-react';
// Feature Card Component
TrendingUp,
} from "lucide-react";
import { GlowingEffect } from "@/components/ui/glowing-effect";
// Feature Card Component with Glowing Effect and Dotted Background
interface FeatureCardProps {
title: string;
description: string;
icon: React.ElementType;
gradient: string;
size?: 'normal' | 'large' | 'wide';
gridArea: string;
children?: React.ReactNode;
delay?: number;
}
function FeatureCard({
title,
description,
icon: Icon,
gradient,
size = 'normal',
function FeatureCard({
title,
description,
icon: Icon,
gradient,
gridArea,
children,
delay = 0
delay = 0,
}: FeatureCardProps) {
const { ref, isVisible } = useScrollAnimation<HTMLDivElement>({ threshold: 0.2 });
const sizeClasses = {
normal: 'md:col-span-1 aspect-square',
large: 'md:col-span-2 md:row-span-2',
wide: 'md:col-span-2',
};
const { ref, isVisible } = useScrollAnimation<HTMLLIElement>({
threshold: 0.2,
});
return (
<div
<li
ref={ref}
className={`relative group ${sizeClasses[size]} rounded-3xl overflow-hidden cursor-pointer hover-lift`}
className={`min-h-[16rem] list-none ${gridArea}`}
style={{
opacity: isVisible ? 1 : 0,
transform: isVisible ? 'translateY(0)' : 'translateY(30px)',
transition: `all 0.6s ease-out ${delay}s`,
transform: isVisible ? "translateY(0)" : "translateY(30px)",
transition: `all 0.6s cubic-bezier(0.16, 1, 0.3, 1) ${delay}s`,
}}
>
<div className={`absolute inset-0 ${gradient} backdrop-blur-xl`} />
<div className="absolute inset-0 bg-white/40 dark:bg-slate-900/40 backdrop-blur-xl" />
<div className="absolute inset-0 border border-slate-200/50 dark:border-slate-700/50 rounded-3xl group-hover:border-blue-500/30 dark:group-hover:border-blue-400/30 transition-colors duration-300" />
<div className="relative h-full p-6 md:p-8 flex flex-col">
{/* Icon */}
<div className="mb-4">
<div className="relative inline-flex p-3 rounded-2xl bg-gradient-to-br from-white/50 to-white/20 dark:from-slate-800/50 dark:to-slate-800/20 shadow-lg group-hover:shadow-xl transition-shadow duration-300">
<Icon className="w-8 h-8 text-blue-600 dark:text-blue-400" />
<div className="absolute inset-0 bg-blue-500/20 blur-xl rounded-full opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
<div className="relative h-full rounded-xl border border-slate-200/80 dark:border-slate-700/80 p-1.5 md:rounded-2xl md:p-2 hover:border-blue-500/40 dark:hover:border-blue-400/40 transition-colors duration-500 overflow-hidden">
{/* Glowing Effect */}
<GlowingEffect
spread={40}
glow={true}
disabled={false}
proximity={60}
inactiveZone={0.01}
borderWidth={1.5}
/>
<div className="relative flex h-full flex-col justify-between gap-3 overflow-hidden rounded-lg md:rounded-xl p-4 md:p-5 bg-white/60 dark:bg-slate-900/60 backdrop-blur-xl shadow-lg dark:shadow-[0px_0px_30px_0px_rgba(59,130,246,0.08)]">
<div className="relative flex flex-1 flex-col justify-between gap-3">
{/* Icon Container */}
<div className="relative inline-flex w-fit">
<div
className={`p-2.5 rounded-xl ${gradient} shadow-md group-hover:shadow-lg transition-all duration-500`}
>
<Icon className="w-5 h-5 text-white" />
</div>
</div>
{/* Content */}
<div className="space-y-2">
<h3 className="font-bold text-base md:text-lg text-slate-900 dark:text-white leading-tight">
{title}
</h3>
<p className="text-xs md:text-sm text-slate-600 dark:text-slate-400 leading-relaxed line-clamp-2">
{description}
</p>
</div>
{/* Animated Content */}
{children && <div className="mt-auto">{children}</div>}
</div>
</div>
{/* Content */}
<h3 className="text-xl md:text-2xl font-bold text-slate-800 dark:text-slate-200 mb-3">
{title}
</h3>
<p className="text-slate-600 dark:text-slate-400 text-sm md:text-base leading-relaxed">
{description}
</p>
{/* Custom Content */}
{children && (
<div className="mt-auto pt-4">
{children}
</div>
)}
{/* Hover Glow */}
<div className="absolute -inset-px bg-gradient-to-r from-blue-500/0 via-violet-500/0 to-teal-500/0 group-hover:from-blue-500/20 group-hover:via-violet-500/20 group-hover:to-teal-500/20 rounded-3xl opacity-0 group-hover:opacity-100 transition-opacity duration-500 blur-xl" />
</div>
</div>
</li>
);
}
// Animated Chat Messages
// Animated Chat Messages (Compact)
function ChatAnimation() {
const messages = [
{ text: "What's the liability cap?", isUser: true },
{ text: "The liability cap is $5M per Section 8.3", isUser: false },
{ text: "When does this contract expire?", isUser: true },
{ text: "December 31, 2024 - 45 days remaining", isUser: false },
{ text: "$5M per Section 8.3", isUser: false },
];
return (
<div className="mt-6 space-y-3">
<div className="mt-2 space-y-2">
{messages.map((msg, i) => (
<div
<div
key={i}
className={`flex ${msg.isUser ? 'justify-end' : 'justify-start'}`}
className={`flex ${msg.isUser ? "justify-end" : "justify-start"}`}
style={{
animation: `slide-up 0.4s ease-out forwards`,
animationDelay: `${i * 0.8 + 1}s`,
animation: `slide-up 0.3s ease-out forwards`,
animationDelay: `${i * 0.6 + 1}s`,
opacity: 0,
}}
>
<div
className={`max-w-[85%] px-4 py-2.5 rounded-2xl text-sm ${
msg.isUser
? 'bg-blue-600 text-white rounded-tr-sm'
: 'bg-slate-100 dark:bg-slate-800 text-slate-700 dark:text-slate-300 rounded-tl-sm'
<div
className={`max-w-[90%] px-3 py-1.5 rounded-xl text-xs shadow-sm ${
msg.isUser
? "bg-blue-600 text-white rounded-tr-sm"
: "bg-slate-100 dark:bg-slate-800 text-slate-700 dark:text-slate-300 rounded-tl-sm"
}`}
>
{msg.text}
</div>
</div>
))}
{/* Typing Indicator */}
<div
className="flex justify-start"
style={{
animation: `fade-in 0.3s ease-out forwards`,
animationDelay: '4.5s',
opacity: 0,
}}
>
<div className="bg-slate-100 dark:bg-slate-800 rounded-2xl rounded-tl-sm px-4 py-3">
<div className="flex gap-1">
<span className="w-2 h-2 bg-slate-400 rounded-full animate-bounce" style={{ animationDelay: '0s' }} />
<span className="w-2 h-2 bg-slate-400 rounded-full animate-bounce" style={{ animationDelay: '0.2s' }} />
<span className="w-2 h-2 bg-slate-400 rounded-full animate-bounce" style={{ animationDelay: '0.4s' }} />
</div>
</div>
</div>
</div>
);
}
// Document Extraction Animation
// Document Extraction Animation (Compact)
function ExtractionAnimation() {
const fields = [
{ label: 'Contract Type', value: 'Service Agreement', status: 'done' },
{ label: 'Parties', value: '3 identified', status: 'done' },
{ label: 'Effective Date', value: 'Jan 1, 2024', status: 'done' },
{ label: 'Term', value: '24 months', status: 'processing' },
{ label: 'Value', value: 'Analyzing...', status: 'pending' },
{ label: "Contract Type", value: "Service", status: "done" },
{ label: "Parties", value: "3 found", status: "done" },
{ label: "Term", value: "24 mo", status: "processing" },
];
return (
<div className="mt-6 space-y-2">
<div className="mt-2 space-y-1.5">
{fields.map((field, i) => (
<div
<div
key={i}
className="flex items-center justify-between p-3 rounded-xl bg-white/50 dark:bg-slate-800/50"
className="flex items-center justify-between p-2 rounded-lg bg-white/50 dark:bg-slate-800/50 backdrop-blur-sm"
style={{
animation: `slide-up 0.4s ease-out forwards`,
animationDelay: `${i * 0.3 + 0.5}s`,
animation: `slide-up 0.3s ease-out forwards`,
animationDelay: `${i * 0.2 + 0.5}s`,
opacity: 0,
}}
>
<span className="text-xs text-slate-500 dark:text-slate-400">{field.label}</span>
<div className="flex items-center gap-2">
<span className="text-sm font-medium text-slate-700 dark:text-slate-300">{field.value}</span>
{field.status === 'done' && <Check className="w-4 h-4 text-emerald-500" />}
{field.status === 'processing' && (
<div className="w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full animate-spin" />
<span className="text-[10px] text-slate-500 dark:text-slate-400 font-medium">
{field.label}
</span>
<div className="flex items-center gap-1.5">
<span className="text-xs font-semibold text-slate-700 dark:text-slate-300">
{field.value}
</span>
{field.status === "done" && (
<Check className="w-3 h-3 text-emerald-500" />
)}
{field.status === 'pending' && (
<div className="w-4 h-4 rounded-full bg-slate-300 dark:bg-slate-600" />
{field.status === "processing" && (
<div className="w-3 h-3 border-2 border-blue-500 border-t-transparent rounded-full animate-spin" />
)}
</div>
</div>
@@ -179,26 +162,26 @@ function ExtractionAnimation() {
);
}
// Blockchain Animation
// Blockchain Animation (Compact)
function BlockchainAnimation() {
return (
<div className="mt-6 relative h-32">
<div className="mt-2 relative h-24">
{/* Nodes */}
{[0, 1, 2, 3].map((i) => (
{[0, 1, 2].map((i) => (
<div
key={i}
className="absolute w-10 h-10 rounded-full bg-gradient-to-br from-violet-500 to-purple-600 flex items-center justify-center shadow-lg"
className="absolute w-8 h-8 rounded-full bg-gradient-to-br from-violet-500 to-purple-600 flex items-center justify-center shadow-lg"
style={{
left: `${i * 25}%`,
top: i % 2 === 0 ? '20%' : '50%',
left: `${i * 33}%`,
top: i % 2 === 0 ? "20%" : "50%",
animation: `float 3s ease-in-out infinite`,
animationDelay: `${i * 0.3}s`,
}}
>
<Link className="w-5 h-5 text-white" />
<Link className="w-4 h-4 text-white" />
</div>
))}
{/* Connection Lines */}
<svg className="absolute inset-0 w-full h-full" style={{ zIndex: -1 }}>
<defs>
@@ -207,32 +190,31 @@ function BlockchainAnimation() {
<stop offset="100%" stopColor="#a855f7" stopOpacity="0.5" />
</linearGradient>
</defs>
{[0, 1, 2].map((i) => (
{[0, 1].map((i) => (
<line
key={i}
x1={`${i * 25 + 12}%`}
y1={i % 2 === 0 ? '35%' : '65%'}
x2={`${(i + 1) * 25 + 12}%`}
y2={i % 2 === 0 ? '65%' : '35%'}
x1={`${i * 33 + 12}%`}
y1={i % 2 === 0 ? "35%" : "65%"}
x2={`${(i + 1) * 33 + 12}%`}
y2={i % 2 === 0 ? "65%" : "35%"}
stroke="url(#lineGradient)"
strokeWidth="2"
strokeDasharray="5,5"
strokeDasharray="4,4"
className="animate-pulse"
style={{ animationDelay: `${i * 0.2}s` }}
/>
))}
</svg>
{/* Transaction Hash */}
<div
className="absolute bottom-0 left-1/2 -translate-x-1/2 px-3 py-1.5 rounded-full bg-violet-500/10 dark:bg-violet-500/20"
<div
className="absolute bottom-0 left-1/2 -translate-x-1/2 px-2.5 py-1 rounded-full bg-violet-500/15 dark:bg-violet-500/25 backdrop-blur-sm"
style={{
animation: `slide-up 0.5s ease-out forwards`,
animationDelay: '1.5s',
animation: `slide-up 0.4s ease-out forwards`,
animationDelay: "1.2s",
opacity: 0,
}}
>
<span className="text-xs font-mono text-violet-600 dark:text-violet-400">
<span className="text-[10px] font-mono font-semibold text-violet-600 dark:text-violet-400">
0x7f8a...9b2c
</span>
</div>
@@ -240,83 +222,98 @@ function BlockchainAnimation() {
);
}
// Dashboard Mini Preview
// Dashboard Mini Preview (Compact)
function DashboardPreview() {
return (
<div className="mt-6 grid grid-cols-3 gap-3">
<div className="mt-2 grid grid-cols-3 gap-2">
{/* Mini Chart */}
<div className="col-span-2 glass rounded-xl p-3">
<div className="flex items-end gap-1 h-16">
{[30, 50, 40, 70, 55, 80, 65, 90, 75, 85].map((h, i) => (
<div
<div className="col-span-2 bg-white/50 dark:bg-slate-800/50 backdrop-blur-sm rounded-lg p-2 shadow-sm">
<div className="flex items-end gap-0.5 h-14">
{[30, 50, 40, 70, 55, 80, 65].map((h, i) => (
<div
key={i}
className="flex-1 bg-gradient-to-t from-blue-500 to-violet-500 rounded-t-sm"
style={{ height: `${h}%` }}
className="flex-1 bg-gradient-to-t from-blue-500 to-blue-400 rounded-t-sm transition-all duration-300 hover:opacity-80"
style={{
height: `${h}%`,
animation: `slide-up 0.3s ease-out forwards`,
animationDelay: `${i * 0.08 + 0.4}s`,
opacity: 0,
}}
/>
))}
</div>
</div>
{/* Stats */}
<div className="space-y-2">
<div className="glass rounded-lg p-2 text-center">
<TrendingUp className="w-4 h-4 mx-auto text-emerald-500 mb-1" />
<span className="text-xs font-bold text-slate-700 dark:text-slate-300">+24%</span>
<div className="space-y-1.5">
<div className="bg-white/50 dark:bg-slate-800/50 backdrop-blur-sm rounded-lg p-2 text-center shadow-sm">
<TrendingUp className="w-4 h-4 mx-auto text-emerald-500 mb-0.5" />
<span className="text-xs font-bold text-slate-700 dark:text-slate-300">
+24%
</span>
</div>
<div className="glass rounded-lg p-2 text-center">
<Zap className="w-4 h-4 mx-auto text-amber-500 mb-1" />
<span className="text-xs font-bold text-slate-700 dark:text-slate-300">98.9%</span>
<div className="bg-white/50 dark:bg-slate-800/50 backdrop-blur-sm rounded-lg p-2 text-center shadow-sm">
<Zap className="w-4 h-4 mx-auto text-amber-500 mb-0.5" />
<span className="text-xs font-bold text-slate-700 dark:text-slate-300">
98.9%
</span>
</div>
</div>
</div>
);
}
// Notification Animation
// Notification Animation (Compact)
function NotificationAnimation() {
const notifications = [
{ icon: Bell, text: 'Contract renewal in 7 days', color: 'text-amber-500' },
{ icon: Check, text: 'Document verified', color: 'text-emerald-500' },
{ icon: Sparkles, text: 'AI analysis complete', color: 'text-blue-500' },
{ icon: Bell, text: "Renewal in 7 days", color: "text-amber-500" },
{ icon: Check, text: "Doc verified", color: "text-emerald-500" },
];
return (
<div className="mt-6 space-y-2">
<div className="mt-2 space-y-1.5">
{notifications.map((notif, i) => (
<div
key={i}
className="flex items-center gap-3 p-3 rounded-xl bg-white/50 dark:bg-slate-800/50"
className="flex items-center gap-2 p-2 rounded-lg bg-white/50 dark:bg-slate-800/50 backdrop-blur-sm"
style={{
animation: `slide-up 0.4s ease-out forwards`,
animationDelay: `${i * 0.5 + 0.8}s`,
animation: `slide-up 0.3s ease-out forwards`,
animationDelay: `${i * 0.4 + 0.6}s`,
opacity: 0,
}}
>
<notif.icon className={`w-5 h-5 ${notif.color}`} />
<span className="text-sm text-slate-700 dark:text-slate-300">{notif.text}</span>
<notif.icon className={`w-4 h-4 flex-shrink-0 ${notif.color}`} />
<span className="text-xs text-slate-700 dark:text-slate-300 font-medium truncate">
{notif.text}
</span>
</div>
))}
</div>
);
}
// Security Animation
// Security Animation (Compact)
function SecurityAnimation() {
return (
<div className="mt-6 flex flex-col items-center">
<div className="mt-2 flex flex-col items-center">
<div className="relative">
<div className="w-20 h-20 rounded-full bg-gradient-to-br from-emerald-500 to-green-600 flex items-center justify-center shadow-lg animate-pulse-glow">
<Lock className="w-10 h-10 text-white" />
<div className="w-16 h-16 rounded-full bg-gradient-to-br from-emerald-500 to-green-600 flex items-center justify-center shadow-xl animate-pulse-glow">
<Lock className="w-8 h-8 text-white" />
</div>
<div className="absolute -top-1 -right-1 w-6 h-6 rounded-full bg-emerald-500 flex items-center justify-center">
<Check className="w-4 h-4 text-white" />
<div className="absolute -top-0.5 -right-0.5 w-5 h-5 rounded-full bg-emerald-500 flex items-center justify-center shadow-md">
<Check className="w-3 h-3 text-white" />
</div>
</div>
<div className="mt-4 flex gap-2 flex-wrap justify-center">
{['AES-256', 'GDPR', 'ISO 27001'].map((badge, i) => (
<span
<div className="mt-3 flex gap-1.5 flex-wrap justify-center">
{["AES-256", "GDPR", "ISO"].map((badge, i) => (
<span
key={i}
className="px-3 py-1 rounded-full text-xs font-medium bg-emerald-500/10 text-emerald-600 dark:text-emerald-400"
className="px-2.5 py-1 rounded-full text-[10px] font-bold bg-emerald-500/15 dark:bg-emerald-500/25 text-emerald-600 dark:text-emerald-400"
style={{
animation: `slide-up 0.3s ease-out forwards`,
animationDelay: `${i * 0.15 + 0.4}s`,
opacity: 0,
}}
>
{badge}
</span>
@@ -327,88 +324,104 @@ function SecurityAnimation() {
}
export function Features() {
const { ref: headerRef, isVisible: headerVisible } = useScrollAnimation<HTMLDivElement>();
const { ref: headerRef, isVisible: headerVisible } =
useScrollAnimation<HTMLDivElement>();
const features = [
{
title: 'AI-Powered Conversational Assistant',
description: 'Ask any question about your contracts. Our AI understands legal context and responds in seconds with precise answers.',
title: "AI-Powered Assistant",
description:
"Ask questions about your contracts and get instant, precise answers with legal context.",
icon: MessageSquare,
gradient: 'card-gradient-blue',
size: 'large' as const,
gradient: "bg-gradient-to-br from-blue-500 to-blue-600",
gridArea: "md:[grid-area:1/1/2/3]",
content: <ChatAnimation />,
},
{
title: 'Intelligent Document Extraction',
description: 'Advanced OCR + AI automatically extracts and structures all information from your PDF documents.',
title: "Document Extraction",
description:
"Advanced OCR + AI extracts and structures information from PDFs automatically.",
icon: Brain,
gradient: 'card-gradient-teal',
gradient: "bg-gradient-to-br from-teal-500 to-teal-600",
gridArea: "md:[grid-area:1/3/2/4]",
content: <ExtractionAnimation />,
},
{
title: 'Blockchain Proof of Submission',
description: 'Immutable timestamping on Polygon. Cryptographic proof that\'s legally valid and instantly verifiable.',
title: "Blockchain Proof",
description:
"Immutable timestamping on Polygon with cryptographic verification.",
icon: Shield,
gradient: 'card-gradient-violet',
gradient: "bg-gradient-to-br from-violet-500 to-purple-600",
gridArea: "md:[grid-area:2/3/3/4]",
content: <BlockchainAnimation />,
},
{
title: 'Comprehensive Dashboard & Analytics',
description: 'Visualize all contracts, renewal alerts, and detailed analytics in one beautiful interface.',
title: "Analytics Dashboard",
description:
"Visualize contracts, renewals, and analytics in one interface.",
icon: BarChart3,
gradient: 'from-blue-500/10 via-violet-500/10 to-teal-500/10',
size: 'wide' as const,
gradient: "bg-gradient-to-br from-indigo-500 to-indigo-600",
gridArea: "md:[grid-area:2/1/3/3]",
content: <DashboardPreview />,
},
{
title: 'Smart Notifications',
description: 'Automated alerts for renewals, deadlines, and important contract events. Never miss a date.',
title: "Smart Alerts",
description:
"Automated notifications for renewals, deadlines, and key events.",
icon: Bell,
gradient: 'card-gradient-amber',
gradient: "bg-gradient-to-br from-amber-500 to-orange-600",
gridArea: "md:[grid-area:3/3/4/4]",
content: <NotificationAnimation />,
},
{
title: 'Enterprise Security',
description: 'AES-256 encryption, GDPR compliant, secure hosting. Your data is protected at every level.',
title: "Enterprise Security",
description: "AES-256 encryption, GDPR compliant with secure hosting.",
icon: Lock,
gradient: 'card-gradient-emerald',
gradient: "bg-gradient-to-br from-emerald-500 to-green-600",
gridArea: "md:[grid-area:3/1/4/3]",
content: <SecurityAnimation />,
},
];
return (
<section id="features" className="relative py-24 px-4 sm:px-6 lg:px-8 overflow-hidden">
<section
id="features"
className="relative pt-16 pb-0 px-4 sm:px-6 lg:px-8 overflow-hidden"
>
{/* Background */}
<div className="absolute inset-0 gradient-bg-mesh opacity-50" />
<div className="absolute inset-0 gradient-bg-mesh opacity-30" />
<div className="absolute inset-0 bg-gradient-to-b from-transparent via-blue-50/50 to-transparent dark:via-slate-900/50" />
<div className="relative max-w-7xl mx-auto">
<div className="relative max-w-6xl mx-auto pb-6">
{/* Section Header */}
<div
<div
ref={headerRef}
className="text-center mb-16"
className="text-center mb-12"
style={{
opacity: headerVisible ? 1 : 0,
transform: headerVisible ? 'translateY(0)' : 'translateY(30px)',
transition: 'all 0.6s ease-out',
transform: headerVisible ? "translateY(0)" : "translateY(20px)",
transition: "all 0.6s cubic-bezier(0.16, 1, 0.3, 1)",
}}
>
<div className="inline-flex items-center gap-2 px-4 py-2 rounded-full glass mb-6">
<div className="inline-flex items-center gap-2 px-4 py-2 rounded-full glass mb-6 shadow-md">
<Sparkles className="w-4 h-4 text-blue-600 dark:text-blue-400" />
<span className="text-sm font-medium text-slate-700 dark:text-slate-300">Features</span>
<span className="text-xs font-bold text-slate-700 dark:text-slate-300">
Features
</span>
</div>
<h2 className="text-4xl md:text-5xl font-bold text-slate-900 dark:text-white mb-4">
Everything You Need to{' '}
<h2 className="text-3xl md:text-5xl font-black text-slate-900 dark:text-white mb-4 leading-tight">
Everything You Need to{" "}
<span className="gradient-text">Manage Contracts</span>
</h2>
<p className="text-xl text-slate-600 dark:text-slate-400 max-w-2xl mx-auto">
Powerful AI combined with blockchain security. Built for professionals.
<p className="text-lg md:text-xl text-slate-600 dark:text-slate-400 max-w-2xl mx-auto leading-relaxed">
Powerful AI combined with blockchain security.
</p>
</div>
{/* Bento Grid */}
<div className="grid grid-cols-1 md:grid-cols-3 gap-6">
{/* Bento Grid - Compact */}
<ul className="grid grid-cols-1 grid-rows-none gap-3 md:grid-cols-3 md:grid-rows-3 lg:gap-4">
{features.map((feature, index) => (
<FeatureCard
key={feature.title}
@@ -416,13 +429,13 @@ export function Features() {
description={feature.description}
icon={feature.icon}
gradient={feature.gradient}
size={feature.size}
delay={index * 0.1}
gridArea={feature.gridArea}
delay={index * 0.08}
>
{feature.content}
</FeatureCard>
))}
</div>
</ul>
</div>
</section>
);

View File

@@ -1,36 +1,8 @@
"use client";
import { useScrollAnimation } from "@/hooks/useScrollAnimation";
import { useTheme } from "@/hooks/useTheme";
import {
Sparkles,
Github,
Twitter,
Linkedin,
Mail,
ArrowRight,
Sun,
Moon,
} from "lucide-react";
// Footer Link Component
function FooterLink({
href,
children,
}: {
href: string;
children: React.ReactNode;
}) {
return (
<a
href={href}
className="group flex items-center gap-1 text-sm text-slate-400 hover:text-white transition-colors duration-200"
>
<span>{children}</span>
<ArrowRight className="w-3 h-3 opacity-0 -translate-x-2 group-hover:opacity-100 group-hover:translate-x-0 transition-all duration-200" />
</a>
);
}
import { Sparkles, Github, Twitter, Linkedin, Mail } from "lucide-react";
import Image from "next/image";
// Social Icon Component
function SocialIcon({
@@ -48,7 +20,7 @@ function SocialIcon({
target="_blank"
rel="noopener noreferrer"
aria-label={label}
className="w-10 h-10 rounded-full bg-white/5 backdrop-blur-sm border border-white/10 flex items-center justify-center text-white/70 hover:bg-white/10 hover:text-white hover:scale-110 transition-all duration-200"
className="text-slate-500 hover:text-slate-900 dark:hover:text-white transition-colors duration-200"
>
<Icon className="w-5 h-5" />
</a>
@@ -59,80 +31,72 @@ export function Footer() {
const { ref, isVisible } = useScrollAnimation<HTMLElement>({
threshold: 0.1,
});
const { theme, toggleTheme, mounted } = useTheme();
const productLinks = [
const navLinks = [
{ label: "Features", href: "#features" },
{ label: "How It Works", href: "#how-it-works" },
{ label: "Documentation", href: "#" },
{ label: "API Access", href: "#" },
{ label: "Updates", href: "#" },
];
const resourceLinks = [
{ label: "Blog", href: "#" },
{ label: "Guides", href: "#" },
{ label: "FAQ", href: "#" },
{ label: "Support", href: "#" },
{ label: "Contact", href: "#" },
];
const legalLinks = [
{ label: "Privacy Policy", href: "#" },
{ label: "Terms of Service", href: "#" },
{ label: "Cookie Policy", href: "#" },
{ label: "Security", href: "#" },
{ label: "GDPR", href: "#" },
{ label: "About", href: "#about" },
];
return (
<footer
id="footer"
ref={ref}
className="relative bg-slate-900 dark:bg-slate-950 pt-16 pb-8 px-4 sm:px-6 lg:px-8"
className="relative bg-white dark:bg-slate-950 border-t border-slate-200 dark:border-slate-800 py-12 px-4 sm:px-6 lg:px-8"
>
{/* Top Gradient Line */}
<div className="absolute top-0 left-0 right-0 h-px bg-gradient-to-r from-transparent via-blue-500/50 to-transparent" />
<div
className="max-w-7xl mx-auto"
style={{
opacity: isVisible ? 1 : 0,
transform: isVisible ? "translateY(0)" : "translateY(30px)",
transform: isVisible ? "translateY(0)" : "translateY(20px)",
transition: "all 0.6s ease-out",
}}
>
{/* Main Footer Content */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-12 gap-12 lg:gap-8 mb-12">
{/* Brand Column */}
<div className="lg:col-span-4">
{/* Logo */}
<a href="#" className="inline-flex items-center gap-2 group mb-4">
<div className="relative">
<Sparkles className="w-8 h-8 text-blue-500 transition-transform duration-300 group-hover:rotate-12" />
<div className="absolute inset-0 bg-blue-500/30 blur-lg rounded-full opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
</div>
<span className="text-2xl font-bold gradient-text">
Smart-Admin Copilot
</span>
</a>
{/* Main Content */}
<div className="flex flex-col items-center space-y-8">
{/* Logo */}
<a href="#" className="inline-flex items-center gap-2 group">
<div className="relative">
<Image
src="/LexiChain.png"
alt="LexiChain Logo"
width={48}
height={48}
className="
relative z-10
w-12 h-12 object-contain
transition-all duration-300 ease-out
group-hover:scale-110
"
/>
</div>
</a>
<p className="text-sm text-slate-400 mb-2">
AI-powered contract intelligence
</p>
<p className="text-sm text-slate-500 leading-relaxed max-w-xs mb-6">
Transform your contract management with cutting-edge AI and
blockchain technology. Built for banking, financial services, and
insurance.
{/* Navigation Links */}
<nav className="flex items-center gap-8">
{navLinks.map((link) => (
<a
key={link.label}
href={link.href}
className="text-sm text-slate-600 dark:text-slate-400 hover:text-slate-900 dark:hover:text-white transition-colors duration-200"
>
{link.label}
</a>
))}
</nav>
{/* Divider */}
<div className="w-full max-w-4xl h-px bg-slate-200 dark:bg-slate-800" />
{/* Bottom Row */}
<div className="flex items-center gap-8">
{/* Copyright */}
<p className="text-sm text-slate-500 dark:text-slate-500">
© LexiChain
</p>
{/* Social Icons */}
<div className="flex items-center gap-3">
<SocialIcon
icon={Github}
href="https://github.com"
label="GitHub"
/>
<div className="flex items-center gap-4">
<SocialIcon
icon={Twitter}
href="https://twitter.com"
@@ -143,103 +107,18 @@ export function Footer() {
href="https://linkedin.com"
label="LinkedIn"
/>
<SocialIcon
icon={Github}
href="https://github.com"
label="GitHub"
/>
<SocialIcon
icon={Mail}
href="mailto:contact@smartadmin.com"
href="mailto:contact@lexichain.com"
label="Email"
/>
</div>
</div>
{/* Product Links */}
<div className="lg:col-span-2 lg:col-start-6">
<h3 className="text-white font-semibold mb-4">Product</h3>
<ul className="space-y-3">
{productLinks.map((link) => (
<li key={link.label}>
<FooterLink href={link.href}>{link.label}</FooterLink>
</li>
))}
</ul>
</div>
{/* Resources Links */}
<div className="lg:col-span-2">
<h3 className="text-white font-semibold mb-4">Resources</h3>
<ul className="space-y-3">
{resourceLinks.map((link) => (
<li key={link.label}>
<FooterLink href={link.href}>{link.label}</FooterLink>
</li>
))}
</ul>
</div>
{/* Legal Links */}
<div className="lg:col-span-2">
<h3 className="text-white font-semibold mb-4">Legal</h3>
<ul className="space-y-3">
{legalLinks.map((link) => (
<li key={link.label}>
<FooterLink href={link.href}>{link.label}</FooterLink>
</li>
))}
</ul>
</div>
</div>
{/* Divider */}
<div className="h-px bg-slate-800 mb-8" />
{/* Bottom Bar */}
<div className="flex flex-col md:flex-row items-center justify-between gap-4">
{/* Copyright */}
<p className="text-sm text-slate-500">
© 2024 Smart-Admin Copilot. All rights reserved.
</p>
{/* Right Side */}
<div className="flex items-center gap-4">
{/* Language Selector */}
<button className="flex items-center gap-2 px-3 py-1.5 rounded-full bg-white/5 border border-white/10 text-sm text-slate-400 hover:text-white hover:bg-white/10 transition-all duration-200">
<span className="text-lg">🇬🇧</span>
<span>English</span>
</button>
{/* Theme Toggle */}
<button
onClick={toggleTheme}
className="flex items-center gap-2 px-3 py-1.5 rounded-full bg-white/5 border border-white/10 text-sm text-slate-400 hover:text-white hover:bg-white/10 transition-all duration-200"
aria-label="Toggle theme"
>
{mounted ? (
theme === "light" ? (
<>
<Sun className="w-4 h-4" />
<span>Light</span>
</>
) : (
<>
<Moon className="w-4 h-4" />
<span>Dark</span>
</>
)
) : (
<>
<Sun className="w-4 h-4" />
<span>Theme</span>
</>
)}
</button>
</div>
</div>
{/* Made With Love */}
<div className="mt-8 text-center">
<p className="text-xs text-slate-600">
Made with <span className="text-red-500"></span> for your PFE
project
</p>
</div>
</div>
</footer>

View File

@@ -1,10 +1,10 @@
"use client";
import { useEffect, useState, useRef, useMemo } from "react";
import { Button } from "@/components/ui/button";
import {
Sparkles,
Rocket,
Play,
Lock,
Check,
Zap,
@@ -16,6 +16,213 @@ import {
Bell,
} from "lucide-react";
// Ripple Effect Component
function BackgroundRipple() {
return (
<div className="absolute inset-0 overflow-hidden pointer-events-none">
<svg
className="absolute inset-0 w-full h-full"
xmlns="http://www.w3.org/2000/svg"
>
<defs>
<linearGradient
id="ripple-gradient-1"
x1="0%"
y1="0%"
x2="100%"
y2="100%"
>
<stop offset="0%" stopColor="rgb(59, 130, 246)" stopOpacity="0.3" />
<stop
offset="50%"
stopColor="rgb(139, 92, 246)"
stopOpacity="0.2"
/>
<stop
offset="100%"
stopColor="rgb(20, 184, 166)"
stopOpacity="0.1"
/>
</linearGradient>
<linearGradient
id="ripple-gradient-2"
x1="100%"
y1="0%"
x2="0%"
y2="100%"
>
<stop offset="0%" stopColor="rgb(139, 92, 246)" stopOpacity="0.3" />
<stop
offset="50%"
stopColor="rgb(59, 130, 246)"
stopOpacity="0.2"
/>
<stop
offset="100%"
stopColor="rgb(20, 184, 166)"
stopOpacity="0.1"
/>
</linearGradient>
</defs>
{/* First set of ripples */}
<circle
cx="50%"
cy="50%"
r="0"
fill="none"
stroke="url(#ripple-gradient-1)"
strokeWidth="2"
opacity="0"
>
<animate
attributeName="r"
from="0"
to="800"
dur="8s"
repeatCount="indefinite"
/>
<animate
attributeName="opacity"
values="0;0.5;0.3;0"
dur="8s"
repeatCount="indefinite"
/>
</circle>
<circle
cx="50%"
cy="50%"
r="0"
fill="none"
stroke="url(#ripple-gradient-2)"
strokeWidth="2"
opacity="0"
>
<animate
attributeName="r"
from="0"
to="800"
dur="8s"
begin="2s"
repeatCount="indefinite"
/>
<animate
attributeName="opacity"
values="0;0.4;0.2;0"
dur="8s"
begin="2s"
repeatCount="indefinite"
/>
</circle>
<circle
cx="50%"
cy="50%"
r="0"
fill="none"
stroke="url(#ripple-gradient-1)"
strokeWidth="3"
opacity="0"
>
<animate
attributeName="r"
from="0"
to="800"
dur="8s"
begin="4s"
repeatCount="indefinite"
/>
<animate
attributeName="opacity"
values="0;0.6;0.4;0"
dur="8s"
begin="4s"
repeatCount="indefinite"
/>
</circle>
<circle
cx="50%"
cy="50%"
r="0"
fill="none"
stroke="url(#ripple-gradient-2)"
strokeWidth="2"
opacity="0"
>
<animate
attributeName="r"
from="0"
to="800"
dur="8s"
begin="6s"
repeatCount="indefinite"
/>
<animate
attributeName="opacity"
values="0;0.5;0.3;0"
dur="8s"
begin="6s"
repeatCount="indefinite"
/>
</circle>
{/* Additional slower ripples for depth */}
<circle
cx="50%"
cy="50%"
r="0"
fill="none"
stroke="url(#ripple-gradient-1)"
strokeWidth="4"
opacity="0"
>
<animate
attributeName="r"
from="0"
to="1000"
dur="12s"
repeatCount="indefinite"
/>
<animate
attributeName="opacity"
values="0;0.3;0.15;0"
dur="12s"
repeatCount="indefinite"
/>
</circle>
<circle
cx="50%"
cy="50%"
r="0"
fill="none"
stroke="url(#ripple-gradient-2)"
strokeWidth="3"
opacity="0"
>
<animate
attributeName="r"
from="0"
to="1000"
dur="12s"
begin="4s"
repeatCount="indefinite"
/>
<animate
attributeName="opacity"
values="0;0.25;0.12;0"
dur="12s"
begin="4s"
repeatCount="indefinite"
/>
</circle>
</svg>
</div>
);
}
// Floating Orb Component
function FloatingOrb({
size,
@@ -211,7 +418,10 @@ export function Hero() {
{/* Background Layer 1 - Animated Gradient Mesh */}
<div className="absolute inset-0 gradient-bg-mesh animate-gradient-shift" />
{/* Background Layer 2 - Grid Pattern */}
{/* Background Layer 2 - Ripple Effect */}
<BackgroundRipple />
{/* Background Layer 3 - Grid Pattern */}
<div
className="absolute inset-0 grid-pattern"
style={{
@@ -222,7 +432,7 @@ export function Hero() {
}}
/>
{/* Background Layer 3 - Floating Orbs */}
{/* Background Layer 4 - Floating Orbs */}
<FloatingOrb
size={200}
color="rgba(59, 130, 246, 0.3)"
@@ -264,7 +474,7 @@ export function Hero() {
top="80%"
/>
{/* Background Layer 4 - Spotlight Effect */}
{/* Background Layer 5 - Spotlight Effect */}
<div
className="absolute inset-0 pointer-events-none opacity-30 dark:opacity-20"
style={{
@@ -289,13 +499,13 @@ export function Hero() {
<div className="relative z-10 max-w-7xl mx-auto text-center">
{/* Announcement Badge */}
<div
className={`inline-flex items-center gap-2 px-4 py-2 rounded-full glass mb-8 transition-all duration-700 ${
className={`inline-flex items-center gap-2 px-4 py-2 mt-4 rounded-full glass mb-8 transition-all duration-700 ${
isLoaded ? "opacity-100 translate-y-0" : "opacity-0 -translate-y-4"
}`}
>
<Sparkles className="w-4 h-4 text-blue-600 dark:text-blue-400 animate-spin-slow" />
<span className="text-sm font-medium text-slate-700 dark:text-slate-300">
New: GPT-4 Turbo + Blockchain Integration
Powered by Ai + Blockchain Integration
</span>
</div>
@@ -322,6 +532,7 @@ export function Hero() {
AI-Powered contract analysis meets blockchain verification. The only
platform that truly understands your banking and insurance documents.
<span className="text-blue-600 dark:text-blue-400 font-medium">
{" "}
Secure, transparent, instant.
</span>
</p>
@@ -333,22 +544,60 @@ export function Hero() {
}`}
>
{/* Primary CTA */}
<button className="group relative px-8 py-4 text-base md:text-lg font-bold text-white btn-gradient rounded-2xl overflow-hidden">
<span className="relative z-10 flex items-center gap-2">
Start Free Trial
<Rocket className="w-5 h-5 transition-transform duration-300 group-hover:translate-x-1" />
</span>
<div className="absolute inset-0 bg-gradient-to-r from-blue-500 via-violet-500 to-teal-500 opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
<div className="absolute inset-0 animate-shimmer opacity-30" />
</button>
<Button
className="
group relative px-12 py-5
text-lg md:text-xl font-semibold
text-white rounded-2xl
overflow-hidden
bg-gradient-to-r
from-[hsl(var(--primary))]
via-[hsl(var(--accent))]
to-[hsl(var(--secondary))]
shadow-lg shadow-blue-500/20
transition-all duration-300 ease-out
hover:scale-[1.04]
hover:shadow-xl hover:shadow-blue-500/40
active:scale-[0.98]
"
>
{/* Glow background layer */}
<div
className="
absolute inset-0
opacity-0 group-hover:opacity-100
transition-opacity duration-500
bg-gradient-to-r
from-blue-400/20
via-purple-400/20
to-teal-400/20
blur-xl
"
/>
{/* Secondary CTA */}
<button className="group flex items-center gap-2 px-8 py-4 text-base md:text-lg font-semibold text-slate-900 dark:text-white bg-white/10 dark:bg-white/5 backdrop-blur-sm border border-white/20 rounded-2xl hover:bg-white/20 transition-all duration-300 hover:scale-105">
<div className="p-2 rounded-full bg-blue-500/10 dark:bg-blue-500/20 group-hover:bg-blue-500/20 transition-colors">
<Play className="w-4 h-4 text-blue-600 dark:text-blue-400" />
</div>
Watch Demo
</button>
{/* Animated gradient shift layer */}
<div
className="
absolute inset-0
bg-[length:200%_200%]
animate-gradient-shift
opacity-70
mix-blend-overlay
"
/>
<span className="relative z-10 flex items-center gap-3">
Get Started
<Rocket
className="
w-6 h-6
transition-transform duration-300
group-hover:translate-x-1
group-hover:-translate-y-1
"
/>
</span>
</Button>
</div>
{/* Trust Indicators */}
@@ -468,10 +717,11 @@ export function Hero() {
</div>
</div>
{/* Right Column - Notifications */}
<div className="space-y-4">
{/* Right Column - Notifications & Chart (Equal Heights) */}
<div className="flex flex-col gap-6">
{/* Notifications - 50% height */}
<div
className="glass rounded-xl p-4"
className="glass rounded-xl p-4 flex-1"
style={{
animation: `slide-up 0.6s ease-out forwards`,
animationDelay: `1s`,
@@ -520,9 +770,9 @@ export function Hero() {
</div>
</div>
{/* Mini Chart */}
{/* Mini Chart - 50% height */}
<div
className="glass rounded-xl p-4"
className="glass rounded-xl p-4 flex-1 flex flex-col"
style={{
animation: `slide-up 0.6s ease-out forwards`,
animationDelay: `1.2s`,
@@ -532,7 +782,7 @@ export function Hero() {
<span className="text-sm font-semibold text-slate-700 dark:text-slate-300 mb-3 block">
Processing Volume
</span>
<div className="flex items-end gap-1 h-16">
<div className="flex items-end gap-1 flex-1">
{[40, 65, 45, 80, 55, 90, 70, 85, 60, 95, 75, 88].map(
(height, i) => (
<div

View File

@@ -7,6 +7,7 @@ import { Features } from "@/components/views/Home/Features";
import { HowItWorks } from "@/components/views/Home/HowItWorks";
import { Stats } from "@/components/views/Home/Stats";
import { Footer } from "@/components/views/Home/Footer";
import { Button } from "@/components/ui/button";
import { Sparkles } from "lucide-react";
function LoadingScreen({ onComplete }: { onComplete: () => void }) {
@@ -37,9 +38,7 @@ function LoadingScreen({ onComplete }: { onComplete: () => void }) {
/>
</div>
<h1 className="text-2xl font-bold gradient-text mb-8">
Smart-Admin Copilot
</h1>
<h1 className="text-2xl font-bold gradient-text mb-8">LexiChain</h1>
<div className="w-64 h-1 bg-slate-800 rounded-full overflow-hidden">
<div
@@ -98,7 +97,7 @@ function BackToTop() {
};
return (
<button
<Button
onClick={scrollToTop}
className={`fixed bottom-8 right-8 z-50 w-12 h-12 rounded-full bg-gradient-to-r from-blue-600 to-violet-600 text-white shadow-lg hover:shadow-xl hover:scale-110 transition-all duration-300 flex items-center justify-center ${
isVisible
@@ -120,7 +119,7 @@ function BackToTop() {
d="M5 10l7-7m0 0l7 7m-7-7v18"
/>
</svg>
</button>
</Button>
);
}

View File

@@ -14,16 +14,19 @@ import {
Target,
} from "lucide-react";
import { useScrollAnimation } from "@/hooks/useScrollAnimation";
import { GlowingEffect } from "@/components/ui/glowing-effect";
import { BackgroundBeams } from "@/components/ui/background-beams";
// Step Card Component
// Step Card Component with Glowing Effect
interface StepCardProps {
number: string;
title: string;
description: string;
icon: React.ElementType;
gradient: string;
glowColor: string;
delay: number;
isLast?: boolean;
children?: React.ReactNode;
}
function StepCard({
@@ -32,111 +35,95 @@ function StepCard({
description,
icon: Icon,
gradient,
glowColor,
delay,
isLast = false,
children,
}: StepCardProps) {
const { ref, isVisible } = useScrollAnimation<HTMLDivElement>({
threshold: 0.3,
threshold: 0.2,
});
return (
<div ref={ref} className="relative flex-1">
{/* Connector Line - Desktop */}
{!isLast && (
<>
{/* Horizontal connector for desktop */}
<div className="hidden md:block absolute top-12 left-[60%] w-[80%] h-0.5">
<div className="relative w-full h-full overflow-hidden">
<div
ref={ref}
className="relative h-full"
style={{
opacity: isVisible ? 1 : 0,
transform: isVisible ? "translateY(0)" : "translateY(40px)",
transition: `all 0.8s cubic-bezier(0.16, 1, 0.3, 1) ${delay}s`,
}}
>
{/* Glowing Border Card */}
<div className="relative h-full rounded-2xl border border-slate-200/80 dark:border-slate-700/80 p-2 hover:border-blue-500/40 dark:hover:border-blue-400/40 transition-colors duration-500 overflow-hidden">
{/* Rainbow Glowing Effect */}
<GlowingEffect
spread={60}
glow={true}
disabled={false}
proximity={100}
inactiveZone={0.01}
borderWidth={2}
variant="default"
/>
<div className="relative h-full flex flex-col rounded-xl p-6 bg-white/90 dark:bg-slate-900/90 backdrop-blur-xl shadow-lg">
{/* Modern Number Badge */}
<div className="absolute -top-3 -right-3 z-10">
<div className="relative">
{/* Outer glow ring */}
<div
className="absolute inset-0 bg-gradient-to-r from-blue-500 via-violet-500 to-teal-500"
style={{
transform: isVisible ? "translateX(0)" : "translateX(-100%)",
transition: `transform 1s ease-out ${delay + 0.3}s`,
}}
/>
{/* Animated dots */}
<div
className="absolute top-1/2 -translate-y-1/2 w-2 h-2 rounded-full bg-violet-500"
style={{
animationName: isVisible ? "move-right" : "none",
animationDuration: isVisible ? "2s" : undefined,
animationTimingFunction: isVisible ? "linear" : undefined,
animationIterationCount: isVisible ? "infinite" : undefined,
animationFillMode: "forwards",
animationDelay: isVisible ? `${delay + 0.5}s` : undefined,
opacity: isVisible ? 1 : 0,
transition: `opacity 0.3s ease-out ${delay + 0.5}s`,
}}
className={`absolute inset-0 ${gradient} rounded-2xl blur-xl opacity-60 animate-pulse-glow`}
style={{ padding: "4px" }}
/>
{/* Badge container */}
<div className="relative">
{/* Glass background */}
<div className="absolute inset-0 bg-white/90 dark:bg-slate-900/90 backdrop-blur-xl rounded-2xl" />
{/* Gradient border */}
<div
className={`absolute inset-0 ${gradient} rounded-2xl p-[2px]`}
>
<div className="w-full h-full bg-white dark:bg-slate-900 rounded-2xl" />
</div>
{/* Number */}
<div className="relative px-4 py-2 flex items-center justify-center">
<span
className={`text-2xl font-black bg-gradient-to-br ${gradient.replace("bg-", "from-")} to-transparent bg-clip-text text-transparent`}
>
{number}
</span>
</div>
</div>
</div>
</div>
{/* Vertical connector for mobile */}
<div className="md:hidden absolute top-20 left-8 w-0.5 h-[calc(100%-40px)]">
{/* Icon with Glow */}
<div className="relative inline-flex mb-6">
<div
className="w-full h-full bg-gradient-to-b from-blue-500 via-violet-500 to-teal-500"
style={{
transform: isVisible ? "scaleY(1)" : "scaleY(0)",
transformOrigin: "top",
transition: `transform 1s ease-out ${delay + 0.3}s`,
}}
className={`absolute inset-0 ${gradient} rounded-2xl blur-2xl opacity-40 animate-pulse-glow`}
/>
</div>
</>
)}
{/* Card */}
<div
className="relative"
style={{
opacity: isVisible ? 1 : 0,
transform: isVisible ? "translateY(0)" : "translateY(30px)",
transition: `all 0.6s ease-out ${delay}s`,
}}
>
{/* Icon with Number */}
<div className="relative inline-block mb-6">
<div
className={`w-24 h-24 rounded-full ${gradient} flex items-center justify-center shadow-lg`}
>
<Icon className="w-10 h-10 text-white" />
<div
className={`relative w-20 h-20 rounded-2xl ${gradient} flex items-center justify-center shadow-2xl`}
>
<Icon className="w-10 h-10 text-white" />
</div>
</div>
{/* Number Badge */}
<div
className="absolute -top-2 -right-2 w-10 h-10 rounded-full bg-slate-800 dark:bg-slate-700 flex items-center justify-center shadow-lg"
style={{
animationName: isVisible ? "bounce-subtle" : "none",
animationDuration: isVisible ? "0.5s" : undefined,
animationTimingFunction: isVisible ? "ease-out" : undefined,
animationDelay: `${delay + 0.2}s`,
}}
>
<span className="text-lg font-bold text-white">{number}</span>
{/* Content */}
<div className="flex-1">
<h3 className="text-xl md:text-2xl font-black text-slate-900 dark:text-white mb-3 leading-tight">
{title}
</h3>
<p className="text-sm md:text-base text-slate-600 dark:text-slate-400 leading-relaxed mb-4">
{description}
</p>
</div>
{/* Glow Effect */}
<div
className={`absolute inset-0 rounded-full ${gradient} blur-xl opacity-50`}
style={{
animationName: isVisible ? "pulse-glow" : "none",
animationDuration: isVisible ? "3s" : undefined,
animationTimingFunction: isVisible ? "ease-in-out" : undefined,
animationIterationCount: isVisible ? "infinite" : undefined,
animationFillMode: "forwards",
animationDelay: isVisible ? `${delay + 0.5}s` : undefined,
}}
/>
</div>
{/* Content */}
<div className="glass rounded-2xl p-6 hover-lift">
<h3 className="text-xl font-bold text-slate-800 dark:text-slate-200 mb-2">
{title}
</h3>
<p className="text-slate-600 dark:text-slate-400 text-sm leading-relaxed">
{description}
</p>
{/* Animation Content */}
{children && <div className="mt-auto">{children}</div>}
</div>
</div>
</div>
@@ -150,52 +137,54 @@ function UploadAnimation() {
});
return (
<div ref={ref} className="mt-6 glass rounded-xl p-4">
<div ref={ref} className="mt-4">
{/* Drop Zone */}
<div
className="border-2 border-dashed border-blue-300 dark:border-blue-700 rounded-lg p-6 text-center"
className="relative border-2 border-dashed border-blue-400/60 dark:border-blue-500/60 rounded-xl p-4 text-center overflow-hidden group hover:border-blue-500 dark:hover:border-blue-400 transition-colors"
style={{
opacity: isVisible ? 1 : 0,
transform: isVisible ? "scale(1)" : "scale(0.95)",
transition: "all 0.5s ease-out 0.3s",
}}
>
<div className="absolute inset-0 bg-gradient-to-br from-blue-500/5 via-violet-500/5 to-teal-500/5 opacity-0 group-hover:opacity-100 transition-opacity duration-500" />
<Upload
className="w-8 h-8 mx-auto text-blue-500 mb-2"
className="w-6 h-6 mx-auto text-blue-500 mb-2 relative z-10"
style={{
animation: isVisible
? "bounce-subtle 2s ease-in-out infinite"
: "none",
}}
/>
<p className="text-sm text-slate-600 dark:text-slate-400">
Drop files here or click to browse
<p className="text-xs text-slate-600 dark:text-slate-400 relative z-10">
Drop files here
</p>
</div>
{/* File List */}
<div className="mt-4 space-y-2">
<div className="mt-3 space-y-2">
{[
{ name: "contract_v2.pdf", size: "2.4 MB", progress: 100 },
{ name: "agreement_scan.jpg", size: "1.8 MB", progress: 75 },
{ name: "contract.pdf", size: "2.4 MB", progress: 100 },
{ name: "agreement.jpg", size: "1.8 MB", progress: 75 },
].map((file, i) => (
<div
key={i}
className="flex items-center gap-3 p-2 rounded-lg bg-white/50 dark:bg-slate-800/50"
className="flex items-center gap-2 p-2 rounded-lg bg-slate-50/80 dark:bg-slate-800/80 backdrop-blur-sm"
style={{
opacity: isVisible ? 1 : 0,
transform: isVisible ? "translateX(0)" : "translateX(-20px)",
transition: `all 0.4s ease-out ${0.5 + i * 0.2}s`,
}}
>
<FileText className="w-5 h-5 text-blue-500" />
<FileText className="w-4 h-4 text-blue-500 flex-shrink-0" />
<div className="flex-1 min-w-0">
<p className="text-sm font-medium text-slate-700 dark:text-slate-300 truncate">
<p className="text-xs font-medium text-slate-700 dark:text-slate-300 truncate">
{file.name}
</p>
<div className="h-1.5 bg-slate-200 dark:bg-slate-700 rounded-full mt-1 overflow-hidden">
<div className="h-1 bg-slate-200 dark:bg-slate-700 rounded-full mt-1 overflow-hidden">
<div
className="h-full bg-gradient-to-r from-blue-500 to-violet-500 rounded-full transition-all duration-1000"
className="h-full bg-gradient-to-r from-blue-500 via-violet-500 to-teal-500 rounded-full transition-all duration-1000"
style={{
width: isVisible ? `${file.progress}%` : "0%",
transitionDelay: `${0.8 + i * 0.2}s`,
@@ -203,25 +192,13 @@ function UploadAnimation() {
/>
</div>
</div>
<span className="text-xs text-slate-500">{file.size}</span>
<span className="text-[10px] text-slate-500">{file.size}</span>
{file.progress === 100 && (
<Check className="w-4 h-4 text-emerald-500" />
<Check className="w-3 h-3 text-emerald-500" />
)}
</div>
))}
</div>
{/* Format Badges */}
<div className="mt-4 flex gap-2 justify-center">
{["PDF", "JPG", "PNG"].map((format, i) => (
<span
key={i}
className="px-2 py-1 text-xs font-medium rounded-full bg-blue-500/10 text-blue-600 dark:text-blue-400"
>
{format}
</span>
))}
</div>
</div>
);
}
@@ -241,72 +218,58 @@ function AIAnalysisAnimation() {
);
const analysisPoints = [
{ label: "Clauses detected", value: "47", icon: Target },
{
label: "Risk assessment",
value: "Low",
icon: Shield,
color: "text-emerald-500",
},
{
label: "Processing time",
value: "2.3s",
icon: Zap,
color: "text-amber-500",
},
{ label: "Clauses", value: "47", icon: Target, color: "text-blue-500" },
{ label: "Risk", value: "Low", icon: Shield, color: "text-emerald-500" },
{ label: "Speed", value: "2.3s", icon: Zap, color: "text-amber-500" },
];
return (
<div ref={ref} className="mt-6 glass rounded-xl p-4">
<div ref={ref} className="mt-4">
{/* AI Brain */}
<div className="flex justify-center mb-4">
<div
className="relative"
style={{
animation: isVisible
? "pulse-glow 2s ease-in-out infinite"
: "none",
}}
>
<div className="w-16 h-16 rounded-full bg-gradient-to-br from-violet-500 to-purple-600 flex items-center justify-center">
<Cpu className="w-8 h-8 text-white" />
<div className="flex justify-center mb-3">
<div className="relative">
<div
className="absolute inset-0 bg-gradient-to-br from-violet-500 to-purple-600 rounded-2xl blur-xl opacity-60"
style={{
animation: isVisible
? "pulse-glow 2s ease-in-out infinite"
: "none",
}}
/>
<div className="relative w-14 h-14 rounded-2xl bg-gradient-to-br from-violet-500 to-purple-600 flex items-center justify-center shadow-xl">
<Cpu className="w-7 h-7 text-white" />
</div>
<div className="absolute -top-1 -right-1">
<Sparkles className="w-5 h-5 text-amber-400 animate-pulse" />
<Sparkles className="w-4 h-4 text-amber-400 animate-pulse" />
</div>
</div>
</div>
{/* Analysis Progress */}
<div className="space-y-3">
{/* Analysis Points */}
<div className="grid grid-cols-3 gap-2">
{analysisPoints.map((point, i) => (
<div
key={i}
className="flex items-center justify-between p-2 rounded-lg bg-white/50 dark:bg-slate-800/50"
className="p-2 rounded-lg bg-slate-50/80 dark:bg-slate-800/80 backdrop-blur-sm text-center"
style={{
opacity: isVisible ? 1 : 0,
transform: isVisible ? "translateY(0)" : "translateY(10px)",
transform: isVisible ? "scale(1)" : "scale(0.9)",
transition: `all 0.4s ease-out ${0.3 + i * 0.15}s`,
}}
>
<div className="flex items-center gap-2">
<point.icon
className={`w-4 h-4 ${point.color || "text-blue-500"}`}
/>
<span className="text-sm text-slate-600 dark:text-slate-400">
{point.label}
</span>
</div>
<span className="text-sm font-bold text-slate-800 dark:text-slate-200">
<point.icon className={`w-4 h-4 mx-auto mb-1 ${point.color}`} />
<p className="text-xs font-bold text-slate-800 dark:text-slate-200">
{point.value}
</span>
</p>
<p className="text-[10px] text-slate-500">{point.label}</p>
</div>
))}
</div>
{/* Scanning Effect */}
<div className="mt-4 relative h-20 rounded-lg bg-slate-100 dark:bg-slate-800 overflow-hidden">
<div className="absolute inset-0 flex items-center justify-center gap-1 opacity-30">
{/* Scanning Bar with Waveform */}
<div className="mt-3 relative h-12 rounded-lg bg-slate-100/80 dark:bg-slate-800/80 overflow-hidden">
{/* Background waveform */}
<div className="absolute inset-0 flex items-center justify-center gap-0.5 opacity-20">
{scanHeights.map((height, i) => (
<div
key={i}
@@ -315,12 +278,13 @@ function AIAnalysisAnimation() {
/>
))}
</div>
{/* Scanning line */}
<div
className="absolute top-0 bottom-0 w-1 bg-gradient-to-b from-blue-500 via-violet-500 to-transparent"
className="absolute top-0 bottom-0 w-0.5 bg-gradient-to-b from-violet-500 via-purple-500 to-transparent"
style={{
left: isVisible ? "100%" : "0%",
transition: "left 2s ease-in-out 0.5s",
boxShadow: "0 0 20px rgba(59, 130, 246, 0.5)",
boxShadow: "0 0 20px rgba(139, 92, 246, 0.6)",
}}
/>
</div>
@@ -335,20 +299,17 @@ function ChatStepAnimation() {
});
const messages = [
{ text: "Explain the termination clause", isUser: true },
{
text: "Section 12.3: Either party may terminate with 30 days written notice...",
isUser: false,
},
{ text: "Explain termination clause", isUser: true },
{ text: "Section 12.3: 30 days notice...", isUser: false },
];
return (
<div ref={ref} className="mt-6 glass rounded-xl p-4">
<div className="space-y-3">
<div ref={ref} className="mt-4">
<div className="space-y-2">
{messages.map((msg, i) => (
<div
key={i}
className={`flex ${msg.isUser ? "justify-end" : "justify-start"}`}
className={`flex ${msg.isUser ? "justify-end" : "justify-start"} items-end gap-2`}
style={{
opacity: isVisible ? 1 : 0,
transform: isVisible ? "translateY(0)" : "translateY(10px)",
@@ -356,12 +317,12 @@ function ChatStepAnimation() {
}}
>
{!msg.isUser && (
<div className="w-8 h-8 rounded-full bg-gradient-to-br from-teal-500 to-cyan-600 flex items-center justify-center mr-2 flex-shrink-0">
<Sparkles className="w-4 h-4 text-white" />
<div className="w-6 h-6 rounded-full bg-gradient-to-br from-teal-500 to-cyan-600 flex items-center justify-center flex-shrink-0 shadow-lg">
<Sparkles className="w-3 h-3 text-white" />
</div>
)}
<div
className={`max-w-[80%] px-4 py-2 rounded-2xl text-sm ${
className={`max-w-[75%] px-3 py-2 rounded-xl text-xs shadow-sm ${
msg.isUser
? "bg-blue-600 text-white rounded-tr-sm"
: "bg-slate-100 dark:bg-slate-800 text-slate-700 dark:text-slate-300 rounded-tl-sm"
@@ -375,27 +336,22 @@ function ChatStepAnimation() {
{/* RAG Indicator */}
<div
className="mt-4 flex items-center justify-center gap-2 text-xs text-slate-500"
className="mt-3 flex items-center justify-center gap-1.5 text-[10px] text-slate-500"
style={{
opacity: isVisible ? 1 : 0,
transition: "opacity 0.4s ease-out 1.2s",
}}
>
<div className="flex gap-1">
<span
className="w-2 h-2 rounded-full bg-teal-500 animate-pulse"
style={{ animationDelay: "0s" }}
/>
<span
className="w-2 h-2 rounded-full bg-teal-500 animate-pulse"
style={{ animationDelay: "0.2s" }}
/>
<span
className="w-2 h-2 rounded-full bg-teal-500 animate-pulse"
style={{ animationDelay: "0.4s" }}
/>
<div className="flex gap-0.5">
{[0, 0.2, 0.4].map((delay, i) => (
<span
key={i}
className="w-1.5 h-1.5 rounded-full bg-teal-500 animate-pulse"
style={{ animationDelay: `${delay}s` }}
/>
))}
</div>
<span>Powered by RAG</span>
<span>RAG Powered</span>
</div>
</div>
);
@@ -408,70 +364,59 @@ function BlockchainStepAnimation() {
});
return (
<div ref={ref} className="mt-6 glass rounded-xl p-4">
{/* Blockchain Visual */}
<div className="relative h-24 mb-4">
<div className="flex items-center justify-center gap-4">
{[0, 1, 2].map((i) => (
<div key={i} className="relative">
<div
className="w-12 h-12 rounded-lg bg-gradient-to-br from-emerald-500 to-green-600 flex items-center justify-center shadow-lg"
style={{
opacity: isVisible ? 1 : 0,
transform: isVisible ? "scale(1)" : "scale(0.8)",
transition: `all 0.4s ease-out ${0.2 + i * 0.2}s`,
}}
>
<Link className="w-6 h-6 text-white" />
</div>
{i < 2 && (
<div
className="absolute top-1/2 -right-4 w-8 h-0.5 bg-emerald-500/50"
style={{
transform: isVisible ? "scaleX(1)" : "scaleX(0)",
transformOrigin: "left",
transition: `transform 0.3s ease-out ${0.4 + i * 0.2}s`,
}}
/>
)}
<div ref={ref} className="mt-4">
{/* Blockchain Chain */}
<div className="flex items-center justify-center gap-2 mb-3">
{[0, 1, 2].map((i) => (
<div key={i} className="relative">
<div
className="w-10 h-10 rounded-lg bg-gradient-to-br from-emerald-500 to-green-600 flex items-center justify-center shadow-lg"
style={{
opacity: isVisible ? 1 : 0,
transform: isVisible ? "scale(1)" : "scale(0.8)",
transition: `all 0.4s ease-out ${0.2 + i * 0.2}s`,
}}
>
<Link className="w-5 h-5 text-white" />
</div>
))}
</div>
{i < 2 && (
<div
className="absolute top-1/2 -right-2 w-4 h-0.5 bg-gradient-to-r from-emerald-500 to-green-500"
style={{
transform: isVisible ? "scaleX(1)" : "scaleX(0)",
transformOrigin: "left",
transition: `transform 0.3s ease-out ${0.4 + i * 0.2}s`,
}}
/>
)}
</div>
))}
</div>
{/* Certificate */}
<div
className="glass rounded-lg p-3 border border-emerald-500/30"
className="rounded-xl p-3 bg-gradient-to-br from-emerald-50 to-green-50 dark:from-emerald-950/30 dark:to-green-950/30 border border-emerald-200/50 dark:border-emerald-700/50"
style={{
opacity: isVisible ? 1 : 0,
transform: isVisible ? "translateY(0)" : "translateY(10px)",
transition: "all 0.5s ease-out 0.8s",
}}
>
<div className="flex items-center gap-3">
<div className="w-10 h-10 rounded-full bg-emerald-500/20 flex items-center justify-center">
<Shield className="w-5 h-5 text-emerald-500" />
<div className="flex items-center gap-2">
<div className="w-8 h-8 rounded-lg bg-emerald-500/20 flex items-center justify-center flex-shrink-0">
<Shield className="w-4 h-4 text-emerald-600 dark:text-emerald-400" />
</div>
<div className="flex-1">
<p className="text-sm font-semibold text-slate-800 dark:text-slate-200">
Verified on Polygon
<div className="flex-1 min-w-0">
<p className="text-xs font-bold text-emerald-900 dark:text-emerald-100">
Polygon Verified
</p>
<p className="text-[10px] font-mono text-emerald-700 dark:text-emerald-300 truncate">
0x3f7a...9e2d
</p>
<p className="text-xs font-mono text-slate-500">0x3f7a...9e2d</p>
</div>
<Check className="w-5 h-5 text-emerald-500" />
<Check className="w-4 h-4 text-emerald-600 dark:text-emerald-400 flex-shrink-0" />
</div>
</div>
{/* Timestamp */}
<div
className="mt-3 text-center text-xs text-slate-500"
style={{
opacity: isVisible ? 1 : 0,
transition: "opacity 0.4s ease-out 1.2s",
}}
>
Timestamped: {new Date().toLocaleString()}
</div>
</div>
);
}
@@ -483,38 +428,42 @@ export function HowItWorks() {
const steps = [
{
number: "01",
title: "Upload Your Contract",
title: "Upload Contract",
description:
"PDF, images, or scanned documents. Simply drag and drop or click to browse.",
"PDF, images, or scans. Drag and drop or browse to upload instantly.",
icon: Upload,
gradient: "bg-gradient-to-br from-blue-500 to-blue-600",
glowColor: "rgba(59, 130, 246, 0.5)",
animation: <UploadAnimation />,
},
{
number: "02",
title: "AI Extracts & Analyzes",
title: "AI Analysis",
description:
"GPT-4 Turbo understands your contract deeply. Automatic extraction of all important clauses and terms.",
"GPT-4 Turbo extracts and analyzes every clause, term, and detail automatically.",
icon: Cpu,
gradient: "bg-gradient-to-br from-violet-500 to-purple-600",
glowColor: "rgba(139, 92, 246, 0.5)",
animation: <AIAnalysisAnimation />,
},
{
number: "03",
title: "Chat with AI Assistant",
title: "Chat with AI",
description:
"Get instant answers to any questions. Powered by RAG for precise, context-aware responses.",
"Ask anything. Get instant, precise answers powered by RAG technology.",
icon: MessageSquare,
gradient: "bg-gradient-to-br from-teal-500 to-cyan-600",
glowColor: "rgba(20, 184, 166, 0.5)",
animation: <ChatStepAnimation />,
},
{
number: "04",
title: "Immutable Certification",
title: "Blockchain Proof",
description:
"Registered on Polygon blockchain. Legally valid timestamped proof of submission.",
"Immutable certification on Polygon. Legally valid timestamped proof.",
icon: Shield,
gradient: "bg-gradient-to-br from-emerald-500 to-green-600",
glowColor: "rgba(16, 185, 129, 0.5)",
animation: <BlockchainStepAnimation />,
},
];
@@ -522,14 +471,14 @@ export function HowItWorks() {
return (
<section
id="how-it-works"
className="relative py-24 px-4 sm:px-6 lg:px-8 overflow-hidden"
className="relative py-20 px-4 sm:px-6 lg:px-8 overflow-hidden"
>
{/* Background */}
<div className="absolute inset-0 bg-slate-50 dark:bg-slate-900/50">
<div className="absolute inset-0 grid-pattern opacity-50" />
{/* Background with Beams */}
<div className="absolute inset-0 bg-gradient-to-b from-slate-50 via-blue-50/30 to-slate-50 dark:from-slate-950 dark:via-slate-900 dark:to-slate-950">
<BackgroundBeams className="opacity-55" />
</div>
<div className="relative max-w-7xl mx-auto">
<div className="relative z-10 max-w-7xl mx-auto">
{/* Section Header */}
<div
ref={headerRef}
@@ -537,58 +486,44 @@ export function HowItWorks() {
style={{
opacity: headerVisible ? 1 : 0,
transform: headerVisible ? "translateY(0)" : "translateY(30px)",
transition: "all 0.6s ease-out",
transition: "all 0.8s cubic-bezier(0.16, 1, 0.3, 1)",
}}
>
<div className="inline-flex items-center gap-2 px-4 py-2 rounded-full glass mb-6">
<div className="inline-flex items-center gap-2 px-4 py-2 rounded-full glass mb-6 shadow-lg">
<Target className="w-4 h-4 text-blue-600 dark:text-blue-400" />
<span className="text-sm font-medium text-slate-700 dark:text-slate-300">
<span className="text-sm font-bold text-slate-700 dark:text-slate-300">
Simple Process
</span>
</div>
<h2 className="text-4xl md:text-5xl font-bold text-slate-900 dark:text-white mb-4">
<h2 className="text-3xl md:text-5xl font-black text-slate-900 dark:text-white mb-4 leading-tight">
From Upload to Certification in{" "}
<span className="gradient-text">4 Steps</span>
<span className="gradient-text">4 Easy Steps</span>
</h2>
<p className="text-xl text-slate-600 dark:text-slate-400 max-w-2xl mx-auto">
<p className="text-lg md:text-xl text-slate-600 dark:text-slate-400 max-w-2xl mx-auto">
Our intelligent system handles everything automatically
</p>
</div>
{/* Steps Grid */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8 lg:gap-6">
{/* Steps Grid - Better Alignment */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 lg:gap-4">
{steps.map((step, index) => (
<div key={step.number} className="relative">
<StepCard
number={step.number}
title={step.title}
description={step.description}
icon={step.icon}
gradient={step.gradient}
delay={index * 0.15}
isLast={index === steps.length - 1}
/>
<StepCard
key={step.number}
number={step.number}
title={step.title}
description={step.description}
icon={step.icon}
gradient={step.gradient}
glowColor={step.glowColor}
delay={index * 0.1}
>
{step.animation}
</div>
</StepCard>
))}
</div>
</div>
{/* Custom Animation Keyframes */}
<style>{`
@keyframes move-right {
0% {
left: 0;
opacity: 1;
}
100% {
left: 100%;
opacity: 0;
}
}
`}</style>
</section>
);
}

View File

@@ -1,8 +1,10 @@
"use client";
import { useState, useEffect } from "react";
import { useTheme } from "@/hooks/useTheme";
import { Sparkles, Sun, Moon, X, ArrowRight } from "lucide-react";
import { Button } from "@/components/ui/button";
import { ModeToggle } from "@/components/ui/mode-toggle";
import { Sparkles, X, ArrowRight } from "lucide-react";
import Image from "next/image";
const navLinks = [
{ label: "Features", href: "#features" },
@@ -12,10 +14,14 @@ const navLinks = [
];
export function Navbar() {
const { theme, toggleTheme, mounted } = useTheme();
const [isScrolled, setIsScrolled] = useState(false);
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);
const [activeLink, setActiveLink] = useState("");
const [mounted, setMounted] = useState(false);
useEffect(() => {
setMounted(true);
}, []);
useEffect(() => {
const handleScroll = () => {
@@ -50,7 +56,7 @@ export function Navbar() {
<div className="flex items-center gap-2">
<Sparkles className="w-6 h-6 text-blue-600" />
<span className="text-xl font-bold gradient-text">
Smart-Admin Copilot
LexiChain
</span>
</div>
</div>
@@ -87,21 +93,50 @@ export function Navbar() {
{/* Logo */}
<a
href="#"
className="flex items-center gap-2 group"
className="flex items-center gap-3 group"
onClick={(e) => {
e.preventDefault();
window.scrollTo({ top: 0, behavior: "smooth" });
}}
>
<div className="relative">
<Sparkles className="w-6 h-6 text-blue-600 dark:text-blue-400 transition-transform duration-300 group-hover:rotate-12" />
<div className="absolute inset-0 bg-blue-500/20 blur-lg rounded-full opacity-0 group-hover:opacity-100 transition-opacity duration-300" />
<div className="relative flex items-center justify-center">
{/* Subtle background badge */}
<div
className="
absolute inset-0
rounded-xl
bg-gradient-to-tr
from-blue-500/10
via-purple-500/10
to-teal-500/10
opacity-0
group-hover:opacity-100
transition-opacity duration-300
"
/>
{/* Logo */}
<Image
src="/LexiChain.png"
alt="LexiChain Logo"
width={34}
height={34}
className="
relative z-10
w-8 h-8 object-contain
transition-all duration-300 ease-out
group-hover:scale-110
"
/>
</div>
<span className="text-lg md:text-xl font-bold gradient-text hidden sm:inline">
Smart-Admin Copilot
</span>
<span className="text-lg font-bold gradient-text sm:hidden">
SAC
<span
className="
text-lg font-semibold
gradient-text
sm:hidden
"
>
LC
</span>
</a>
@@ -129,49 +164,29 @@ export function Navbar() {
{/* Right Section */}
<div className="flex items-center gap-2 md:gap-3">
{/* Theme Toggle */}
<button
onClick={toggleTheme}
className="relative p-1 rounded-full bg-slate-100 dark:bg-slate-800 transition-colors duration-300"
aria-label="Toggle theme"
>
<div className="flex items-center gap-1">
<div
className={`p-2 rounded-full transition-all duration-300 ${
theme === "light"
? "bg-white shadow-sm text-amber-500"
: "text-slate-400"
}`}
>
<Sun className="w-4 h-4" />
</div>
<div
className={`p-2 rounded-full transition-all duration-300 ${
theme === "dark"
? "bg-slate-900 shadow-sm text-blue-400"
: "text-slate-400"
}`}
>
<Moon className="w-4 h-4" />
</div>
</div>
</button>
<ModeToggle />
{/* Sign In - Desktop */}
<button className="hidden md:flex items-center gap-2 px-5 py-2 text-sm font-medium text-slate-700 dark:text-slate-300 border border-slate-300 dark:border-slate-600 rounded-full hover:bg-slate-50 dark:hover:bg-slate-800 transition-all duration-200">
<Button
variant="outline"
className="hidden md:flex items-center gap-2 px-5 py-2 text-sm font-medium text-slate-700 dark:text-slate-300 border-slate-300 dark:border-slate-600 rounded-full hover:bg-slate-50 dark:hover:bg-slate-800 transition-all duration-200"
>
Sign In
</button>
</Button>
{/* Get Started - Desktop */}
<button className="hidden md:flex items-center gap-2 px-6 py-2.5 text-sm font-semibold text-white btn-gradient rounded-full group">
<Button className="hidden md:flex items-center gap-2 px-6 py-2.5 text-sm font-semibold text-white btn-gradient rounded-full group">
Get Started
<ArrowRight className="w-4 h-4 transition-transform duration-300 group-hover:translate-x-1" />
</button>
</Button>
{/* Mobile Menu Button */}
<button
<Button
onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}
className="lg:hidden p-2 rounded-full hover:bg-slate-100 dark:hover:bg-slate-800 transition-colors duration-200"
aria-label="Toggle menu"
variant="ghost"
size="icon"
>
<div className="relative w-6 h-6">
<span
@@ -190,7 +205,7 @@ export function Navbar() {
}`}
/>
</div>
</button>
</Button>
</div>
</div>
</div>
@@ -216,13 +231,15 @@ export function Navbar() {
}`}
>
<div className="p-6 pt-20">
<button
<Button
onClick={() => setIsMobileMenuOpen(false)}
className="absolute top-6 right-6 p-2 rounded-full hover:bg-slate-100 dark:hover:bg-slate-800 transition-colors"
aria-label="Close menu"
variant="ghost"
size="icon"
>
<X className="w-6 h-6" />
</button>
</Button>
<div className="flex flex-col gap-4">
{navLinks.map((link, index) => (
@@ -245,13 +262,16 @@ export function Navbar() {
</div>
<div className="mt-8 flex flex-col gap-3">
<button className="w-full px-5 py-3 text-sm font-medium text-slate-700 dark:text-slate-300 border border-slate-300 dark:border-slate-600 rounded-full hover:bg-slate-50 dark:hover:bg-slate-800 transition-all duration-200">
<Button
variant="outline"
className="w-full px-5 py-3 text-sm font-medium text-slate-700 dark:text-slate-300 border-slate-300 dark:border-slate-600 rounded-full hover:bg-slate-50 dark:hover:bg-slate-800 transition-all duration-200"
>
Sign In
</button>
<button className="w-full flex items-center justify-center gap-2 px-6 py-3 text-sm font-semibold text-white btn-gradient rounded-full">
</Button>
<Button className="w-full flex items-center justify-center gap-2 px-6 py-3 text-sm font-semibold text-white btn-gradient rounded-full">
Get Started
<ArrowRight className="w-4 h-4" />
</button>
</Button>
</div>
</div>
</div>

View File

@@ -10,6 +10,9 @@ import {
Award,
Check,
} from "lucide-react";
import { BentoGrid } from "@/components/ui/bento-grid";
import { Spotlight } from "@/components/ui/spotlight-new";
import { GlowingEffect } from "@/components/ui/glowing-effect";
import { useScrollAnimation } from "@/hooks/useScrollAnimation";
// Count Up Hook
@@ -55,7 +58,11 @@ function useCountUp(
// Ease out cubic
const easeOut = 1 - Math.pow(1 - progress, 3);
setCount(Math.floor(end * easeOut));
const nextValue = end * easeOut;
const formattedValue = Number.isInteger(end)
? Math.floor(nextValue)
: Number(nextValue.toFixed(1));
setCount(formattedValue);
if (progress < 1) {
animationFrame = requestAnimationFrame(animate);
@@ -83,6 +90,16 @@ interface StatCardProps {
label: string;
icon: React.ElementType;
gradient: string;
className?: string;
cardColor?: string;
glowColor?: string;
spotlight?: {
gradientFirst?: string;
gradientSecond?: string;
gradientThird?: string;
duration?: number;
xOffset?: number;
};
delay: number;
additional?: string;
isText?: boolean;
@@ -96,6 +113,10 @@ function StatCard({
label,
icon: Icon,
gradient,
className,
cardColor,
glowColor,
spotlight,
delay,
additional,
isText = false,
@@ -108,105 +129,102 @@ function StatCard({
return (
<div
ref={scrollRef}
className="relative group"
className={`relative ${className || ""}`}
style={{
opacity: isVisible ? 1 : 0,
transform: isVisible ? "translateY(0)" : "translateY(30px)",
transition: `all 0.6s ease-out ${delay}s`,
}}
>
<div className="relative glass rounded-3xl p-8 hover-lift overflow-hidden">
<div
className={`relative h-full overflow-hidden rounded-2xl border border-border/60 p-7 shadow-[0_20px_60px_-30px_rgba(15,23,42,0.25)] backdrop-blur group ${cardColor || "bg-card/80"}`}
>
{/* Glowing Effect */}
<GlowingEffect
disabled={false}
blur={40}
spread={60}
proximity={80}
variant="default"
borderWidth={2}
className="opacity-0 group-hover:opacity-100 transition-opacity duration-500"
/>
<div className="absolute inset-0">
<Spotlight
gradientFirst={spotlight?.gradientFirst}
gradientSecond={spotlight?.gradientSecond}
gradientThird={spotlight?.gradientThird}
duration={spotlight?.duration ?? 8}
xOffset={spotlight?.xOffset ?? 120}
/>
</div>
{/* Hover Glow */}
{glowColor && (
<div
className={`absolute -inset-1 ${glowColor} opacity-0 group-hover:opacity-20 blur-2xl transition-opacity duration-500 rounded-2xl`}
/>
)}
{/* Background Icon */}
<div className="absolute top-4 right-4 opacity-10">
<Icon className="w-24 h-24 text-white" />
<div className="absolute -top-6 -right-6 opacity-10">
<Icon className="w-28 h-28 text-foreground" />
</div>
{/* Content */}
<div className="relative z-10">
{/* Icon */}
<div
className={`inline-flex p-3 rounded-2xl ${gradient} mb-6 shadow-lg`}
>
<Icon className="w-8 h-8 text-white" />
</div>
{/* Value */}
<div ref={countRef} className="mb-2">
{isText ? (
<span className="text-5xl md:text-6xl lg:text-7xl font-black text-white tracking-wider">
{value}
<div className="relative z-10 flex h-full flex-col justify-between">
<div>
{/* Icon */}
<div
className={`inline-flex items-center gap-2 rounded-full ${gradient} px-4 py-2 text-foreground shadow-lg`}
>
<Icon className="w-4 h-4" />
<span className="text-xs font-semibold tracking-widest uppercase text-foreground/80">
Performance
</span>
) : (
<span className="text-5xl md:text-6xl lg:text-7xl font-black text-white">
{prefix}
{numericValue !== undefined ? count : value}
{suffix}
</span>
)}
</div>
</div>
{/* Label */}
<p className="text-lg md:text-xl font-medium text-white/90 mb-2">
{label}
</p>
{/* Value */}
<div ref={countRef} className="mt-6">
{isText ? (
<span className="text-4xl md:text-5xl lg:text-6xl font-semibold text-foreground tracking-tight">
{value}
</span>
) : (
<span className="text-4xl md:text-5xl lg:text-6xl font-semibold text-foreground tracking-tight">
{prefix}
{numericValue !== undefined && !Number.isInteger(numericValue)
? count.toFixed(1)
: numericValue !== undefined
? count
: value}
{suffix}
</span>
)}
</div>
{/* Label */}
<p className="mt-4 text-base md:text-lg font-medium text-foreground/90">
{label}
</p>
</div>
{/* Additional Info */}
{additional && (
<div className="flex items-center gap-2 mt-3">
<TrendingUp className="w-4 h-4 text-emerald-400" />
<span className="text-sm text-white/70">{additional}</span>
<div className="flex items-center gap-2 pt-6">
<TrendingUp className="w-4 h-4 text-emerald-500" />
<span className="text-sm text-muted-foreground">
{additional}
</span>
</div>
)}
</div>
{/* Glow Effect */}
<div
className={`absolute -inset-px ${gradient} opacity-0 group-hover:opacity-30 rounded-3xl blur-xl transition-opacity duration-500`}
/>
</div>
</div>
);
}
// Floating Badge Component
function FloatingBadge({
text,
icon: Icon,
delay,
position,
}: {
text: string;
icon: React.ElementType;
delay: number;
position: { top?: string; bottom?: string; left?: string; right?: string };
}) {
const { ref, isVisible } = useScrollAnimation<HTMLDivElement>({
threshold: 0.5,
});
return (
<div
ref={ref}
className="absolute glass rounded-full px-3 py-1.5 flex items-center gap-2 shadow-lg"
style={{
...position,
opacity: isVisible ? 1 : 0,
transform: isVisible ? "translateY(0)" : "translateY(20px)",
transition: `all 0.5s ease-out ${delay}s`,
animationName: isVisible ? "float" : "none",
animationDuration: isVisible ? "4s" : undefined,
animationTimingFunction: isVisible ? "ease-in-out" : undefined,
animationIterationCount: isVisible ? "infinite" : undefined,
animationFillMode: "forwards",
animationDelay: isVisible ? `${delay}s` : undefined,
}}
>
<Icon className="w-4 h-4 text-blue-400" />
<span className="text-xs font-medium text-white">{text}</span>
</div>
);
}
export function Stats() {
const { ref: headerRef, isVisible: headerVisible } =
useScrollAnimation<HTMLDivElement>();
@@ -219,6 +237,16 @@ export function Stats() {
label: string;
icon: React.ElementType;
gradient: string;
className?: string;
cardColor?: string;
glowColor?: string;
spotlight?: {
gradientFirst?: string;
gradientSecond?: string;
gradientThird?: string;
duration?: number;
xOffset?: number;
};
additional?: string;
isText?: boolean;
}
@@ -226,19 +254,38 @@ export function Stats() {
const stats: StatItem[] = [
{
value: "99.9",
numericValue: 99,
numericValue: 99.9,
suffix: "%",
label: "OCR + AI Accuracy",
icon: Target,
gradient: "bg-gradient-to-br from-blue-500 to-blue-600",
gradient: "bg-gradient-to-r from-blue-500 to-indigo-600",
cardColor:
"bg-gradient-to-br from-blue-50/80 to-indigo-50/80 dark:from-blue-950/30 dark:to-indigo-950/30",
glowColor: "bg-blue-500",
className: "md:col-span-2",
spotlight: {
gradientFirst:
"radial-gradient(68.54% 68.72% at 55.02% 31.46%, hsla(217, 91%, 60%, .28) 0, hsla(217, 91%, 60%, .12) 55%, hsla(217, 91%, 60%, 0) 80%)",
gradientSecond:
"radial-gradient(50% 50% at 50% 50%, hsla(258, 90%, 66%, .24) 0, hsla(258, 90%, 66%, .08) 80%, transparent 100%)",
gradientThird:
"radial-gradient(50% 50% at 50% 50%, hsla(217, 91%, 60%, .18) 0, hsla(217, 91%, 60%, .06) 80%, transparent 100%)",
},
additional: "+0.3% this month",
},
{
value: "< 3",
label: "Average AI Response Time",
icon: Zap,
gradient: "bg-gradient-to-br from-amber-500 to-orange-600",
additional: "Lightning fast",
gradient: "bg-gradient-to-r from-amber-500 to-orange-600",
cardColor:
"bg-gradient-to-br from-amber-50/80 to-orange-50/80 dark:from-amber-950/30 dark:to-orange-950/30",
glowColor: "bg-amber-500",
spotlight: {
gradientFirst:
"radial-gradient(68.54% 68.72% at 55.02% 31.46%, hsla(48, 96%, 53%, .28) 0, hsla(48, 96%, 53%, .12) 55%, hsla(48, 96%, 53%, 0) 80%)",
},
additional: "Average under 3 seconds",
isText: true,
},
{
@@ -247,109 +294,75 @@ export function Stats() {
suffix: "%",
label: "Blockchain Verified",
icon: Shield,
gradient: "bg-gradient-to-br from-violet-500 to-purple-600",
gradient: "bg-gradient-to-r from-emerald-500 to-teal-600",
cardColor:
"bg-gradient-to-br from-emerald-50/80 to-teal-50/80 dark:from-emerald-950/30 dark:to-teal-950/30",
glowColor: "bg-emerald-500",
spotlight: {
gradientFirst:
"radial-gradient(68.54% 68.72% at 55.02% 31.46%, hsla(158, 64%, 52%, .28) 0, hsla(158, 64%, 52%, .12) 55%, hsla(158, 64%, 52%, 0) 80%)",
},
additional: "All documents certified",
},
{
value: "GDPR",
label: "Full European Compliance",
icon: Lock,
gradient: "bg-gradient-to-br from-emerald-500 to-green-600",
additional: "ISO 27001 Certified",
gradient: "bg-gradient-to-r from-violet-500 to-purple-600",
cardColor:
"bg-gradient-to-br from-violet-50/80 to-purple-50/80 dark:from-violet-950/30 dark:to-purple-950/30",
glowColor: "bg-violet-500",
className: "md:col-span-2",
spotlight: {
gradientFirst:
"radial-gradient(68.54% 68.72% at 55.02% 31.46%, hsla(258, 90%, 66%, .28) 0, hsla(258, 90%, 66%, .12) 55%, hsla(258, 90%, 66%, 0) 80%)",
},
additional: "ISO 27001 certified",
isText: true,
},
];
const floatingBadges = [
{
text: "+1 Verified",
icon: Check,
position: { top: "10%", left: "5%" },
delay: 0.8,
},
{
text: "99.9% Uptime",
icon: Shield,
position: { top: "20%", right: "8%" },
delay: 1,
},
{
text: "AI Powered",
icon: Zap,
position: { bottom: "15%", left: "10%" },
delay: 1.2,
},
{
text: "Secure",
icon: Lock,
position: { bottom: "25%", right: "5%" },
delay: 1.4,
},
];
return (
<section
id="stats"
className="relative py-24 px-4 sm:px-6 lg:px-8 overflow-hidden"
className="relative py-16 px-4 sm:px-6 lg:px-8 overflow-hidden"
>
{/* Gradient Background */}
<div className="absolute inset-0 bg-gradient-to-br from-blue-600 via-violet-600 to-teal-600">
<div className="absolute inset-0 bg-gradient-to-br from-background via-muted/40 to-background">
{/* Grid Pattern Overlay */}
<div className="absolute inset-0 grid-pattern opacity-20" />
<div className="absolute inset-0 grid-pattern opacity-15" />
{/* Radial Glow */}
<div className="absolute inset-0 bg-[radial-gradient(ellipse_at_center,rgba(255,255,255,0.1)_0%,transparent_70%)]" />
<div className="absolute inset-0 bg-[radial-gradient(circle_at_top,hsla(var(--primary),0.2)_0%,transparent_55%)]" />
</div>
{/* Floating Badges */}
{floatingBadges.map((badge, i) => (
<FloatingBadge
key={i}
text={badge.text}
icon={badge.icon}
delay={badge.delay}
position={badge.position}
/>
))}
<div className="relative max-w-7xl mx-auto">
{/* Section Header */}
<div
ref={headerRef}
className="text-center mb-16"
className="text-center mb-14"
style={{
opacity: headerVisible ? 1 : 0,
transform: headerVisible ? "translateY(0)" : "translateY(30px)",
transition: "all 0.6s ease-out",
}}
>
<span className="inline-block text-sm uppercase tracking-widest text-white/70 mb-4">
By The Numbers
<span className="inline-flex items-center gap-2 rounded-full border border-border/60 bg-card/60 px-4 py-1 text-xs uppercase tracking-[0.3em] text-muted-foreground">
Platform Metrics
</span>
<h2 className="text-4xl md:text-5xl lg:text-6xl font-black text-white mb-4">
Results That{" "}
<span className="relative">
Speak
<svg
className="absolute -bottom-2 left-0 w-full"
viewBox="0 0 200 12"
fill="none"
>
<path
d="M2 10C50 2 150 2 198 10"
stroke="rgba(255,255,255,0.5)"
strokeWidth="3"
strokeLinecap="round"
className="animate-pulse"
/>
</svg>
</span>
<h2 className="mt-6 text-4xl md:text-5xl lg:text-6xl font-semibold text-foreground">
Corporate-Grade Results, Measured.
</h2>
<p className="mt-4 text-base md:text-lg text-muted-foreground max-w-2xl mx-auto">
Transparent performance benchmarks that prove reliability, accuracy,
and compliance at enterprise scale.
</p>
</div>
{/* Stats Grid */}
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 lg:gap-8">
<BentoGrid className="max-w-6xl gap-6 md:auto-rows-[16rem]">
{stats.map((stat, index) => (
<StatCard
key={stat.label}
@@ -360,39 +373,16 @@ export function Stats() {
label={stat.label}
icon={stat.icon}
gradient={stat.gradient}
className={stat.className}
cardColor={stat.cardColor}
glowColor={stat.glowColor}
spotlight={stat.spotlight}
delay={index * 0.1}
additional={stat.additional}
isText={stat.isText}
/>
))}
</div>
{/* Bottom Awards Row */}
<div
className="mt-16 flex flex-wrap items-center justify-center gap-4"
style={{
opacity: headerVisible ? 1 : 0,
transform: headerVisible ? "translateY(0)" : "translateY(20px)",
transition: "all 0.6s ease-out 0.5s",
}}
>
{[
{ icon: Award, text: "Best AI Solution 2024" },
{ icon: Shield, text: "SOC 2 Type II Certified" },
{ icon: Lock, text: "GDPR Compliant" },
{ icon: Check, text: "ISO 27001 Certified" },
].map((award, i) => (
<div
key={i}
className="flex items-center gap-2 px-4 py-2 rounded-full bg-white/10 backdrop-blur-sm border border-white/20"
>
<award.icon className="w-4 h-4 text-white/80" />
<span className="text-sm font-medium text-white/90">
{award.text}
</span>
</div>
))}
</div>
</BentoGrid>
</div>
</section>
);