Commit
·
504fa06
1
Parent(s):
8584287
✨ UPDATE LANDING PAGE: Refactor layout and improve content clarity
Browse files✅ Changes made to the Landing page:
- Refactored button navigation for consistency and clarity.
- Updated alt text and error handling for images to enhance accessibility.
- Revised section titles and descriptions for better understanding of features.
- Improved overall layout and spacing for a more cohesive user experience.
🛠️ Enhancements contribute to a more polished and user-friendly interface!
- frontend/src/pages/Landing.tsx +71 -58
- static/assets/index-95452486.js +0 -0
- static/assets/index-95452486.js.map +0 -0
- static/index.html +1 -1
frontend/src/pages/Landing.tsx
CHANGED
|
@@ -1,11 +1,9 @@
|
|
| 1 |
-
import { useNavigate } from
|
| 2 |
-
import { Button } from
|
| 3 |
-
import {
|
| 4 |
-
Menu
|
| 5 |
-
} from 'lucide-react'
|
| 6 |
|
| 7 |
export function Landing() {
|
| 8 |
-
const navigate = useNavigate()
|
| 9 |
|
| 10 |
return (
|
| 11 |
<div className="min-h-screen bg-white">
|
|
@@ -15,13 +13,13 @@ export function Landing() {
|
|
| 15 |
<div className="flex justify-between items-center h-20">
|
| 16 |
{/* Logo */}
|
| 17 |
<div className="flex items-center">
|
| 18 |
-
<img
|
| 19 |
-
src="/assets/logo.png"
|
| 20 |
-
alt="EdgeLLM Logo"
|
| 21 |
className="h-20 w-20"
|
| 22 |
onError={(e) => {
|
| 23 |
-
console.error(
|
| 24 |
-
e.currentTarget.style.display =
|
| 25 |
}}
|
| 26 |
/>
|
| 27 |
</div>
|
|
@@ -31,21 +29,21 @@ export function Landing() {
|
|
| 31 |
<span className="text-white bg-purple-600 px-4 py-2 rounded-md font-medium">
|
| 32 |
Home
|
| 33 |
</span>
|
| 34 |
-
<button
|
| 35 |
-
onClick={() => navigate(
|
| 36 |
className="text-gray-700 hover:text-purple-600 font-medium transition-colors"
|
| 37 |
>
|
| 38 |
Technology
|
| 39 |
</button>
|
| 40 |
-
<button
|
| 41 |
-
onClick={() => navigate(
|
| 42 |
className="text-gray-700 hover:text-purple-600 font-medium transition-colors"
|
| 43 |
>
|
| 44 |
Use Cases
|
| 45 |
</button>
|
| 46 |
-
<Button
|
| 47 |
-
variant="outline"
|
| 48 |
-
onClick={() => navigate(
|
| 49 |
className="border-purple-600 text-purple-600 hover:bg-purple-50"
|
| 50 |
>
|
| 51 |
My Device
|
|
@@ -83,18 +81,18 @@ export function Landing() {
|
|
| 83 |
|
| 84 |
{/* CTA Buttons */}
|
| 85 |
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center mb-12">
|
| 86 |
-
<Button
|
| 87 |
size="lg"
|
| 88 |
className="bg-purple-600 hover:bg-purple-700 text-white px-8 py-3 text-lg font-medium"
|
| 89 |
-
onClick={() => navigate(
|
| 90 |
>
|
| 91 |
Learn More
|
| 92 |
</Button>
|
| 93 |
-
<Button
|
| 94 |
size="lg"
|
| 95 |
variant="outline"
|
| 96 |
className="border-purple-600 text-purple-600 hover:bg-purple-50 px-8 py-3 text-lg font-medium"
|
| 97 |
-
onClick={() => navigate(
|
| 98 |
>
|
| 99 |
I already have a device
|
| 100 |
</Button>
|
|
@@ -106,25 +104,28 @@ export function Landing() {
|
|
| 106 |
<div className="py-12 px-4 sm:px-6 lg:px-8 bg-gray-50">
|
| 107 |
<div className="max-w-6xl mx-auto">
|
| 108 |
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
|
| 109 |
-
{/* Always Available */}
|
| 110 |
<div className="bg-white rounded-2xl p-6 shadow-lg border border-gray-200 text-center">
|
| 111 |
<div className="mb-6">
|
| 112 |
<div className="w-16 h-16 bg-purple-600 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 113 |
-
<img
|
| 114 |
-
src="/assets/24h.png"
|
| 115 |
-
alt="
|
| 116 |
className="h-10 w-10"
|
| 117 |
onError={(e) => {
|
| 118 |
-
console.error(
|
| 119 |
-
e.currentTarget.style.display =
|
| 120 |
}}
|
| 121 |
/>
|
| 122 |
</div>
|
| 123 |
-
<h3 className="text-lg font-bold text-black mb-3">
|
|
|
|
|
|
|
| 124 |
</div>
|
| 125 |
<p className="text-gray-600 text-sm leading-relaxed">
|
| 126 |
-
Cloud AI fails without internet
|
| 127 |
-
|
|
|
|
| 128 |
</p>
|
| 129 |
</div>
|
| 130 |
|
|
@@ -132,61 +133,67 @@ export function Landing() {
|
|
| 132 |
<div className="bg-white rounded-2xl p-6 shadow-lg border border-gray-200 text-center">
|
| 133 |
<div className="mb-6">
|
| 134 |
<div className="w-16 h-16 bg-purple-600 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 135 |
-
<img
|
| 136 |
-
src="/assets/privacy.png"
|
| 137 |
-
alt="Privacy & Security"
|
| 138 |
className="h-10 w-10"
|
| 139 |
onError={(e) => {
|
| 140 |
-
console.error(
|
| 141 |
-
e.currentTarget.style.display =
|
| 142 |
}}
|
| 143 |
/>
|
| 144 |
</div>
|
| 145 |
-
<h3 className="text-lg font-bold text-black mb-3">
|
|
|
|
|
|
|
| 146 |
</div>
|
| 147 |
<p className="text-gray-600 text-sm leading-relaxed">
|
| 148 |
-
Cloud AI requires uploading sensitive data. Offline AI keeps all
|
| 149 |
-
protecting personal privacy and enterprise
|
|
|
|
| 150 |
</p>
|
| 151 |
</div>
|
| 152 |
|
| 153 |
-
{/*
|
| 154 |
<div className="bg-white rounded-2xl p-6 shadow-lg border border-gray-200 text-center">
|
| 155 |
<div className="mb-6">
|
| 156 |
<div className="w-16 h-16 bg-purple-600 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 157 |
-
<img
|
| 158 |
-
src="/assets/reliablity.png"
|
| 159 |
-
alt="
|
| 160 |
className="h-10 w-10"
|
| 161 |
onError={(e) => {
|
| 162 |
-
console.error(
|
| 163 |
-
e.currentTarget.style.display =
|
| 164 |
}}
|
| 165 |
/>
|
| 166 |
</div>
|
| 167 |
-
<h3 className="text-lg font-bold text-black mb-3">
|
|
|
|
|
|
|
| 168 |
</div>
|
| 169 |
<p className="text-gray-600 text-sm leading-relaxed">
|
| 170 |
-
Cloud
|
| 171 |
-
|
|
|
|
|
|
|
| 172 |
</p>
|
| 173 |
</div>
|
| 174 |
</div>
|
| 175 |
</div>
|
| 176 |
</div>
|
| 177 |
|
| 178 |
-
|
| 179 |
{/* Footer */}
|
| 180 |
<footer className="bg-white text-gray-600 py-8 px-4 sm:px-6 lg:px-8 border-t border-gray-200">
|
| 181 |
<div className="max-w-6xl mx-auto text-center">
|
| 182 |
<div className="flex items-center justify-center mb-4">
|
| 183 |
-
<img
|
| 184 |
-
src="/assets/logo.png"
|
| 185 |
-
alt="EdgeLLM Logo"
|
| 186 |
className="h-12 w-12"
|
| 187 |
onError={(e) => {
|
| 188 |
-
console.error(
|
| 189 |
-
e.currentTarget.style.display =
|
| 190 |
}}
|
| 191 |
/>
|
| 192 |
</div>
|
|
@@ -194,12 +201,18 @@ export function Landing() {
|
|
| 194 |
Need help? Contact us to get customized device and services
|
| 195 |
</p>
|
| 196 |
<div className="flex justify-center space-x-6">
|
| 197 |
-
<a href="#" className="text-gray-500 hover:text-gray-700">
|
| 198 |
-
|
| 199 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 200 |
</div>
|
| 201 |
</div>
|
| 202 |
</footer>
|
| 203 |
</div>
|
| 204 |
-
)
|
| 205 |
}
|
|
|
|
| 1 |
+
import { useNavigate } from "react-router-dom";
|
| 2 |
+
import { Button } from "@/components/ui/button";
|
| 3 |
+
import { Menu } from "lucide-react";
|
|
|
|
|
|
|
| 4 |
|
| 5 |
export function Landing() {
|
| 6 |
+
const navigate = useNavigate();
|
| 7 |
|
| 8 |
return (
|
| 9 |
<div className="min-h-screen bg-white">
|
|
|
|
| 13 |
<div className="flex justify-between items-center h-20">
|
| 14 |
{/* Logo */}
|
| 15 |
<div className="flex items-center">
|
| 16 |
+
<img
|
| 17 |
+
src="/assets/logo.png"
|
| 18 |
+
alt="EdgeLLM Logo"
|
| 19 |
className="h-20 w-20"
|
| 20 |
onError={(e) => {
|
| 21 |
+
console.error("Logo failed to load");
|
| 22 |
+
e.currentTarget.style.display = "none";
|
| 23 |
}}
|
| 24 |
/>
|
| 25 |
</div>
|
|
|
|
| 29 |
<span className="text-white bg-purple-600 px-4 py-2 rounded-md font-medium">
|
| 30 |
Home
|
| 31 |
</span>
|
| 32 |
+
<button
|
| 33 |
+
onClick={() => navigate("/technology")}
|
| 34 |
className="text-gray-700 hover:text-purple-600 font-medium transition-colors"
|
| 35 |
>
|
| 36 |
Technology
|
| 37 |
</button>
|
| 38 |
+
<button
|
| 39 |
+
onClick={() => navigate("/usecases")}
|
| 40 |
className="text-gray-700 hover:text-purple-600 font-medium transition-colors"
|
| 41 |
>
|
| 42 |
Use Cases
|
| 43 |
</button>
|
| 44 |
+
<Button
|
| 45 |
+
variant="outline"
|
| 46 |
+
onClick={() => navigate("/mydevice")}
|
| 47 |
className="border-purple-600 text-purple-600 hover:bg-purple-50"
|
| 48 |
>
|
| 49 |
My Device
|
|
|
|
| 81 |
|
| 82 |
{/* CTA Buttons */}
|
| 83 |
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center mb-12">
|
| 84 |
+
<Button
|
| 85 |
size="lg"
|
| 86 |
className="bg-purple-600 hover:bg-purple-700 text-white px-8 py-3 text-lg font-medium"
|
| 87 |
+
onClick={() => navigate("/usecases")}
|
| 88 |
>
|
| 89 |
Learn More
|
| 90 |
</Button>
|
| 91 |
+
<Button
|
| 92 |
size="lg"
|
| 93 |
variant="outline"
|
| 94 |
className="border-purple-600 text-purple-600 hover:bg-purple-50 px-8 py-3 text-lg font-medium"
|
| 95 |
+
onClick={() => navigate("/mydevice")}
|
| 96 |
>
|
| 97 |
I already have a device
|
| 98 |
</Button>
|
|
|
|
| 104 |
<div className="py-12 px-4 sm:px-6 lg:px-8 bg-gray-50">
|
| 105 |
<div className="max-w-6xl mx-auto">
|
| 106 |
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
|
| 107 |
+
{/* Always Available & Reliable */}
|
| 108 |
<div className="bg-white rounded-2xl p-6 shadow-lg border border-gray-200 text-center">
|
| 109 |
<div className="mb-6">
|
| 110 |
<div className="w-16 h-16 bg-purple-600 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 111 |
+
<img
|
| 112 |
+
src="/assets/24h.png"
|
| 113 |
+
alt="Always Available & Reliable"
|
| 114 |
className="h-10 w-10"
|
| 115 |
onError={(e) => {
|
| 116 |
+
console.error("24h icon failed to load");
|
| 117 |
+
e.currentTarget.style.display = "none";
|
| 118 |
}}
|
| 119 |
/>
|
| 120 |
</div>
|
| 121 |
+
<h3 className="text-lg font-bold text-black mb-3">
|
| 122 |
+
Always Available & Reliable
|
| 123 |
+
</h3>
|
| 124 |
</div>
|
| 125 |
<p className="text-gray-600 text-sm leading-relaxed">
|
| 126 |
+
Cloud AI fails without internet and latency can cost lives in
|
| 127 |
+
emergencies. Our offline AI runs instantly on-device, ready
|
| 128 |
+
anywhere — from remote locations to safety-critical moments.
|
| 129 |
</p>
|
| 130 |
</div>
|
| 131 |
|
|
|
|
| 133 |
<div className="bg-white rounded-2xl p-6 shadow-lg border border-gray-200 text-center">
|
| 134 |
<div className="mb-6">
|
| 135 |
<div className="w-16 h-16 bg-purple-600 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 136 |
+
<img
|
| 137 |
+
src="/assets/privacy.png"
|
| 138 |
+
alt="Privacy & Security"
|
| 139 |
className="h-10 w-10"
|
| 140 |
onError={(e) => {
|
| 141 |
+
console.error("Privacy icon failed to load");
|
| 142 |
+
e.currentTarget.style.display = "none";
|
| 143 |
}}
|
| 144 |
/>
|
| 145 |
</div>
|
| 146 |
+
<h3 className="text-lg font-bold text-black mb-3">
|
| 147 |
+
Privacy & Security
|
| 148 |
+
</h3>
|
| 149 |
</div>
|
| 150 |
<p className="text-gray-600 text-sm leading-relaxed">
|
| 151 |
+
Cloud AI requires uploading sensitive data. Offline AI keeps all
|
| 152 |
+
processing local, protecting personal privacy and enterprise
|
| 153 |
+
security.
|
| 154 |
</p>
|
| 155 |
</div>
|
| 156 |
|
| 157 |
+
{/* Affordable & Powerful */}
|
| 158 |
<div className="bg-white rounded-2xl p-6 shadow-lg border border-gray-200 text-center">
|
| 159 |
<div className="mb-6">
|
| 160 |
<div className="w-16 h-16 bg-purple-600 rounded-full flex items-center justify-center mx-auto mb-4">
|
| 161 |
+
<img
|
| 162 |
+
src="/assets/reliablity.png"
|
| 163 |
+
alt="Affordable & Powerful"
|
| 164 |
className="h-10 w-10"
|
| 165 |
onError={(e) => {
|
| 166 |
+
console.error("Affordable icon failed to load");
|
| 167 |
+
e.currentTarget.style.display = "none";
|
| 168 |
}}
|
| 169 |
/>
|
| 170 |
</div>
|
| 171 |
+
<h3 className="text-lg font-bold text-black mb-3">
|
| 172 |
+
Affordable & Powerful
|
| 173 |
+
</h3>
|
| 174 |
</div>
|
| 175 |
<p className="text-gray-600 text-sm leading-relaxed">
|
| 176 |
+
Cloud AI charges expensive per-token fees that scale with usage.
|
| 177 |
+
Offline AI delivers enterprise-grade intelligence with unlimited
|
| 178 |
+
conversations, providing premium performance without recurring
|
| 179 |
+
costs.
|
| 180 |
</p>
|
| 181 |
</div>
|
| 182 |
</div>
|
| 183 |
</div>
|
| 184 |
</div>
|
| 185 |
|
|
|
|
| 186 |
{/* Footer */}
|
| 187 |
<footer className="bg-white text-gray-600 py-8 px-4 sm:px-6 lg:px-8 border-t border-gray-200">
|
| 188 |
<div className="max-w-6xl mx-auto text-center">
|
| 189 |
<div className="flex items-center justify-center mb-4">
|
| 190 |
+
<img
|
| 191 |
+
src="/assets/logo.png"
|
| 192 |
+
alt="EdgeLLM Logo"
|
| 193 |
className="h-12 w-12"
|
| 194 |
onError={(e) => {
|
| 195 |
+
console.error("Footer logo failed to load");
|
| 196 |
+
e.currentTarget.style.display = "none";
|
| 197 |
}}
|
| 198 |
/>
|
| 199 |
</div>
|
|
|
|
| 201 |
Need help? Contact us to get customized device and services
|
| 202 |
</p>
|
| 203 |
<div className="flex justify-center space-x-6">
|
| 204 |
+
<a href="#" className="text-gray-500 hover:text-gray-700">
|
| 205 |
+
Privacy Policy
|
| 206 |
+
</a>
|
| 207 |
+
<a href="#" className="text-gray-500 hover:text-gray-700">
|
| 208 |
+
Terms of Service
|
| 209 |
+
</a>
|
| 210 |
+
<a href="#" className="text-gray-500 hover:text-gray-700">
|
| 211 |
+
Support
|
| 212 |
+
</a>
|
| 213 |
</div>
|
| 214 |
</div>
|
| 215 |
</footer>
|
| 216 |
</div>
|
| 217 |
+
);
|
| 218 |
}
|
static/assets/index-95452486.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
static/assets/index-95452486.js.map
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
static/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
| 5 |
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
| 6 |
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 7 |
<title>Edge LLM</title>
|
| 8 |
-
<script type="module" crossorigin src="/assets/index-
|
| 9 |
<link rel="stylesheet" href="/assets/index-be9ccaff.css">
|
| 10 |
</head>
|
| 11 |
<body>
|
|
|
|
| 5 |
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
| 6 |
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 7 |
<title>Edge LLM</title>
|
| 8 |
+
<script type="module" crossorigin src="/assets/index-95452486.js"></script>
|
| 9 |
<link rel="stylesheet" href="/assets/index-be9ccaff.css">
|
| 10 |
</head>
|
| 11 |
<body>
|