|
|
import { useNavigate } from "react-router-dom"; |
|
|
import { Button } from "@/components/ui/button"; |
|
|
import { Menu } from "lucide-react"; |
|
|
|
|
|
export function Landing() { |
|
|
const navigate = useNavigate(); |
|
|
|
|
|
|
|
|
const youtubeVideoId = "VJBMRebMHtI"; |
|
|
const videoTitle = "EdgeLLM Demo - Offline AI in Action"; |
|
|
|
|
|
return ( |
|
|
<div className="min-h-screen bg-white"> |
|
|
{/* Navigation */} |
|
|
<nav className="bg-white border-b border-gray-200"> |
|
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"> |
|
|
<div className="flex justify-between items-center h-20"> |
|
|
{/* Logo */} |
|
|
<div className="flex items-center"> |
|
|
<img |
|
|
src="/assets/logo.png" |
|
|
alt="EdgeLLM Logo" |
|
|
className="h-20 w-20" |
|
|
onError={(e) => { |
|
|
console.error("Logo failed to load"); |
|
|
e.currentTarget.style.display = "none"; |
|
|
}} |
|
|
/> |
|
|
</div> |
|
|
|
|
|
{/* Navigation Links */} |
|
|
<div className="hidden md:flex items-center space-x-8"> |
|
|
<span className="text-white bg-purple-600 px-4 py-2 rounded-md font-medium"> |
|
|
Home |
|
|
</span> |
|
|
<button |
|
|
onClick={() => navigate("/technology")} |
|
|
className="text-gray-700 hover:text-purple-600 font-medium transition-colors" |
|
|
> |
|
|
Technology |
|
|
</button> |
|
|
<button |
|
|
onClick={() => navigate("/usecases")} |
|
|
className="text-gray-700 hover:text-purple-600 font-medium transition-colors" |
|
|
> |
|
|
Use Cases |
|
|
</button> |
|
|
<Button |
|
|
variant="outline" |
|
|
onClick={() => navigate("/mydevice")} |
|
|
className="border-purple-600 text-purple-600 hover:bg-purple-50" |
|
|
> |
|
|
My Device |
|
|
</Button> |
|
|
</div> |
|
|
|
|
|
{/* Mobile menu button */} |
|
|
<div className="md:hidden"> |
|
|
<Button variant="ghost" size="sm"> |
|
|
<Menu className="h-5 w-5" /> |
|
|
</Button> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</nav> |
|
|
|
|
|
{/* Hero Section */} |
|
|
<div className="relative py-12 px-4 sm:px-6 lg:px-8"> |
|
|
<div className="max-w-4xl mx-auto text-center"> |
|
|
{/* Main Headline */} |
|
|
<div className="relative mb-6"> |
|
|
<h1 className="text-4xl md:text-6xl lg:text-7xl font-bold text-black leading-tight"> |
|
|
Offline AI that |
|
|
<br /> |
|
|
works where the |
|
|
<br /> |
|
|
cloud cannot |
|
|
</h1> |
|
|
</div> |
|
|
|
|
|
{/* Subtitle */} |
|
|
<p className="text-lg md:text-xl text-purple-700 font-semibold mb-8 max-w-3xl mx-auto"> |
|
|
AI that stays reliable, private, and resilient in any environment |
|
|
</p> |
|
|
|
|
|
{/* CTA Buttons */} |
|
|
<div className="flex flex-col sm:flex-row gap-3 justify-center items-center mb-8"> |
|
|
<Button |
|
|
size="lg" |
|
|
className="bg-purple-600 hover:bg-purple-700 text-white px-8 py-3 text-lg font-medium" |
|
|
onClick={() => navigate("/usecases")} |
|
|
> |
|
|
Learn More |
|
|
</Button> |
|
|
<Button |
|
|
size="lg" |
|
|
variant="outline" |
|
|
className="border-purple-600 text-purple-600 hover:bg-purple-50 px-8 py-3 text-lg font-medium" |
|
|
onClick={() => navigate("/mydevice")} |
|
|
> |
|
|
I already have a device |
|
|
</Button> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
{/* Features Section */} |
|
|
<div className="py-12 px-4 sm:px-6 lg:px-8 bg-gray-50"> |
|
|
<div className="max-w-6xl mx-auto"> |
|
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-6"> |
|
|
{/* Always Available & Reliable */} |
|
|
<div className="bg-white rounded-2xl p-6 shadow-lg border border-gray-200 text-center"> |
|
|
<div className="mb-6"> |
|
|
<div className="w-16 h-16 bg-purple-600 rounded-full flex items-center justify-center mx-auto mb-4"> |
|
|
<img |
|
|
src="/assets/24h.png" |
|
|
alt="Always Available & Reliable" |
|
|
className="h-10 w-10" |
|
|
onError={(e) => { |
|
|
console.error("24h icon failed to load"); |
|
|
e.currentTarget.style.display = "none"; |
|
|
}} |
|
|
/> |
|
|
</div> |
|
|
<h3 className="text-lg font-bold text-black mb-3"> |
|
|
Always Available & Reliable |
|
|
</h3> |
|
|
</div> |
|
|
<p className="text-gray-600 text-sm leading-relaxed"> |
|
|
Cloud AI fails without internet and latency can cost lives. Our |
|
|
offline AI runs instantly on-device, ready anywhere from remote |
|
|
locations to safety-critical moments. |
|
|
</p> |
|
|
</div> |
|
|
|
|
|
{/* Privacy & Security */} |
|
|
<div className="bg-white rounded-2xl p-6 shadow-lg border border-gray-200 text-center"> |
|
|
<div className="mb-6"> |
|
|
<div className="w-16 h-16 bg-purple-600 rounded-full flex items-center justify-center mx-auto mb-4"> |
|
|
<img |
|
|
src="/assets/privacy.png" |
|
|
alt="Privacy & Security" |
|
|
className="h-10 w-10" |
|
|
onError={(e) => { |
|
|
console.error("Privacy icon failed to load"); |
|
|
e.currentTarget.style.display = "none"; |
|
|
}} |
|
|
/> |
|
|
</div> |
|
|
<h3 className="text-lg font-bold text-black mb-3"> |
|
|
Privacy & Security |
|
|
</h3> |
|
|
</div> |
|
|
<p className="text-gray-600 text-sm leading-relaxed"> |
|
|
Cloud AI requires uploading sensitive data. Offline AI keeps all |
|
|
processing local, protecting personal privacy and enterprise |
|
|
security. |
|
|
</p> |
|
|
</div> |
|
|
|
|
|
{/* Affordable & Powerful */} |
|
|
<div className="bg-white rounded-2xl p-6 shadow-lg border border-gray-200 text-center"> |
|
|
<div className="mb-6"> |
|
|
<div className="w-16 h-16 bg-purple-600 rounded-full flex items-center justify-center mx-auto mb-4"> |
|
|
<img |
|
|
src="/assets/reliablity.png" |
|
|
alt="Affordable & Powerful" |
|
|
className="h-10 w-10" |
|
|
onError={(e) => { |
|
|
console.error("Affordable icon failed to load"); |
|
|
e.currentTarget.style.display = "none"; |
|
|
}} |
|
|
/> |
|
|
</div> |
|
|
<h3 className="text-lg font-bold text-black mb-3"> |
|
|
Affordable & Powerful |
|
|
</h3> |
|
|
</div> |
|
|
<p className="text-gray-600 text-sm leading-relaxed"> |
|
|
Cloud AI charges expensive per-token fees that scale with usage. |
|
|
Offline AI provides unlimited conversations with premium |
|
|
performance without recurring costs. |
|
|
</p> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
{/* Video Section */} |
|
|
<div className="py-16 px-4 sm:px-6 lg:px-8 bg-white"> |
|
|
<div className="max-w-4xl mx-auto text-center"> |
|
|
<h2 className="text-3xl md:text-4xl font-bold text-black mb-4"> |
|
|
See EdgeLLM in Action |
|
|
</h2> |
|
|
<p className="text-lg text-gray-600 mb-8"> |
|
|
Watch how our offline AI delivers instant responses without internet |
|
|
connection |
|
|
</p> |
|
|
|
|
|
{/* YouTube Video Container */} |
|
|
<div className="relative rounded-2xl overflow-hidden shadow-2xl"> |
|
|
<div className="aspect-video"> |
|
|
<iframe |
|
|
className="w-full h-full" |
|
|
src={`https://www.youtube.com/embed/${youtubeVideoId}?rel=0&modestbranding=1&showinfo=0`} |
|
|
title={videoTitle} |
|
|
frameBorder="0" |
|
|
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" |
|
|
allowFullScreen |
|
|
/> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
{/* Video Caption */} |
|
|
<p className="text-sm text-gray-500 mt-4"> |
|
|
Demo: Offline AI responding instantly in remote locations without |
|
|
internet |
|
|
</p> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
{/* Footer */} |
|
|
<footer className="bg-white text-gray-600 py-8 px-4 sm:px-6 lg:px-8 border-t border-gray-200"> |
|
|
<div className="max-w-6xl mx-auto text-center"> |
|
|
<div className="flex items-center justify-center mb-4"> |
|
|
<img |
|
|
src="/assets/logo.png" |
|
|
alt="EdgeLLM Logo" |
|
|
className="h-12 w-12" |
|
|
onError={(e) => { |
|
|
console.error("Footer logo failed to load"); |
|
|
e.currentTarget.style.display = "none"; |
|
|
}} |
|
|
/> |
|
|
</div> |
|
|
<p className="text-gray-600 mb-6"> |
|
|
Need help? Contact us to get customized device and services |
|
|
</p> |
|
|
<div className="flex justify-center space-x-6"> |
|
|
<a href="#" className="text-gray-500 hover:text-gray-700"> |
|
|
Privacy Policy |
|
|
</a> |
|
|
<a href="#" className="text-gray-500 hover:text-gray-700"> |
|
|
Terms of Service |
|
|
</a> |
|
|
<a href="#" className="text-gray-500 hover:text-gray-700"> |
|
|
Support |
|
|
</a> |
|
|
</div> |
|
|
</div> |
|
|
</footer> |
|
|
</div> |
|
|
); |
|
|
} |
|
|
|