feat: Update Hero for LoRRI hackathon - AI Load Consolidation + Route Optimization focus
#14
by MouleeswaranM - opened
- landing/src/components/Hero.tsx +49 -42
landing/src/components/Hero.tsx
CHANGED
|
@@ -1,33 +1,36 @@
|
|
| 1 |
import './Hero.css'
|
| 2 |
|
| 3 |
-
const codeSnippet = `curl -X POST https://api.fairrelay.io/v1/
|
| 4 |
-H "x-api-key: fr_live_••••••••••••" \\
|
| 5 |
-H "Content-Type: application/json" \\
|
| 6 |
-d '{
|
| 7 |
-
"
|
| 8 |
-
{ "id": "
|
| 9 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
],
|
| 11 |
-
"
|
| 12 |
-
{ "id": "
|
| 13 |
-
{ "id": "rt_B", "distance_km": 67, "difficulty": "easy" }
|
| 14 |
]
|
| 15 |
}'`
|
| 16 |
|
| 17 |
const responseSnippet = `{
|
| 18 |
-
"
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
"
|
| 27 |
-
"
|
| 28 |
-
"
|
| 29 |
-
|
| 30 |
-
"
|
| 31 |
}
|
| 32 |
}`
|
| 33 |
|
|
@@ -43,57 +46,61 @@ export default function Hero() {
|
|
| 43 |
<div className="hero__left">
|
| 44 |
<div className="tag" style={{ animationDelay: '0s' }}>
|
| 45 |
<span className="tag__dot" />
|
| 46 |
-
|
| 47 |
</div>
|
| 48 |
|
| 49 |
<h1 className="hero__headline">
|
| 50 |
-
|
| 51 |
<br />
|
| 52 |
-
|
| 53 |
-
<span className="gradient-text">
|
| 54 |
</h1>
|
| 55 |
|
| 56 |
<p className="hero__sub">
|
| 57 |
-
India
|
|
|
|
|
|
|
| 58 |
</p>
|
| 59 |
|
| 60 |
<div className="hero__actions">
|
| 61 |
-
<a href="#
|
| 62 |
-
|
| 63 |
<svg width="16" height="16" viewBox="0 0 16 16" fill="none">
|
| 64 |
<path d="M3 8H13M9 4l4 4-4 4" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
|
| 65 |
</svg>
|
| 66 |
</a>
|
| 67 |
-
<a href="#
|
| 68 |
-
|
| 69 |
</a>
|
| 70 |
</div>
|
| 71 |
|
| 72 |
<div className="hero__stats">
|
| 73 |
<div className="hero__stat">
|
| 74 |
-
<strong>
|
| 75 |
-
<span>
|
| 76 |
</div>
|
| 77 |
<div className="hero__stat-divider" />
|
| 78 |
<div className="hero__stat">
|
| 79 |
-
<strong>
|
| 80 |
-
<span>
|
| 81 |
</div>
|
| 82 |
<div className="hero__stat-divider" />
|
| 83 |
<div className="hero__stat">
|
| 84 |
-
<strong>
|
| 85 |
-
<span>
|
| 86 |
</div>
|
| 87 |
</div>
|
| 88 |
|
| 89 |
-
{/*
|
| 90 |
-
<div style={{ marginTop: '2rem', padding: '1rem 1.25rem', background: 'rgba(
|
| 91 |
-
<p style={{ fontSize: '0.75rem', color: '#9CA3AF', marginBottom: '0.5rem', textTransform: 'uppercase', letterSpacing: '0.05em' }}>
|
| 92 |
<p style={{ fontSize: '0.875rem', color: '#E5E7EB', lineHeight: 1.6 }}>
|
| 93 |
-
|
|
|
|
|
|
|
| 94 |
</p>
|
| 95 |
<div style={{ display: 'flex', gap: '1.5rem', marginTop: '0.75rem', flexWrap: 'wrap' }}>
|
| 96 |
-
{[['
|
| 97 |
<span key={num} style={{ fontSize: '0.75rem', color: '#9CA3AF' }}><strong style={{ color: '#f97316' }}>{num}</strong> {label}</span>
|
| 98 |
))}
|
| 99 |
</div>
|
|
@@ -108,7 +115,7 @@ export default function Hero() {
|
|
| 108 |
<span style={{background:'#f59e0b'}} />
|
| 109 |
<span style={{background:'#10b981'}} />
|
| 110 |
</div>
|
| 111 |
-
<span className="code-window__title">POST /v1/
|
| 112 |
</div>
|
| 113 |
<div className="code-window__body">
|
| 114 |
<pre className="code-block code-block--request">
|
|
@@ -121,7 +128,7 @@ export default function Hero() {
|
|
| 121 |
<div className="code-window__header">
|
| 122 |
<div className="hero__status-chip">
|
| 123 |
<span className="hero__status-dot" />
|
| 124 |
-
200 OK ·
|
| 125 |
</div>
|
| 126 |
</div>
|
| 127 |
<div className="code-window__body">
|
|
|
|
| 1 |
import './Hero.css'
|
| 2 |
|
| 3 |
+
const codeSnippet = `curl -X POST https://api.fairrelay.io/v1/consolidate \\
|
| 4 |
-H "x-api-key: fr_live_••••••••••••" \\
|
| 5 |
-H "Content-Type: application/json" \\
|
| 6 |
-d '{
|
| 7 |
+
"shipments": [
|
| 8 |
+
{ "id": "sh_001", "pickupLat": 19.07, "pickupLng": 72.87,
|
| 9 |
+
"dropLat": 18.52, "dropLng": 73.85, "weight": 500,
|
| 10 |
+
"volume": 2.0, "timeWindowEnd": "2026-05-14T18:00" },
|
| 11 |
+
{ "id": "sh_002", "pickupLat": 19.08, "pickupLng": 72.88,
|
| 12 |
+
"dropLat": 18.53, "dropLng": 73.86, "weight": 300,
|
| 13 |
+
"volume": 1.5, "timeWindowEnd": "2026-05-14T18:00" }
|
| 14 |
],
|
| 15 |
+
"trucks": [
|
| 16 |
+
{ "id": "trk_1", "maxWeight": 2000, "maxVolume": 8.0 }
|
|
|
|
| 17 |
]
|
| 18 |
}'`
|
| 19 |
|
| 20 |
const responseSnippet = `{
|
| 21 |
+
"groups": [
|
| 22 |
+
{ "groupId": 1, "truckId": "trk_1",
|
| 23 |
+
"shipments": ["sh_001", "sh_002"],
|
| 24 |
+
"utilizationWeight": 82.5,
|
| 25 |
+
"confidence": 91 }
|
| 26 |
+
],
|
| 27 |
+
"metrics": {
|
| 28 |
+
"utilizationBefore": 27.1,
|
| 29 |
+
"utilizationAfter": 82.5,
|
| 30 |
+
"tripsReduced": 3,
|
| 31 |
+
"tripReductionPercent": 50,
|
| 32 |
+
"carbonSavedKg": 14.2,
|
| 33 |
+
"optimizationScore": 87
|
| 34 |
}
|
| 35 |
}`
|
| 36 |
|
|
|
|
| 46 |
<div className="hero__left">
|
| 47 |
<div className="tag" style={{ animationDelay: '0s' }}>
|
| 48 |
<span className="tag__dot" />
|
| 49 |
+
LoRRI AI Hackathon 2026 · PS#4 + PS#5
|
| 50 |
</div>
|
| 51 |
|
| 52 |
<h1 className="hero__headline">
|
| 53 |
+
AI Load Consolidation
|
| 54 |
<br />
|
| 55 |
+
&{' '}
|
| 56 |
+
<span className="gradient-text">Route Optimization</span>
|
| 57 |
</h1>
|
| 58 |
|
| 59 |
<p className="hero__sub">
|
| 60 |
+
India's logistics networks transport <strong>60% of shipments with partially filled vehicles</strong>.
|
| 61 |
+
FairRelay's 5-agent AI pipeline intelligently groups shipments, maximizes vehicle utilization,
|
| 62 |
+
and optimizes multi-stop routes — reducing trips, cost, and carbon emissions.
|
| 63 |
</p>
|
| 64 |
|
| 65 |
<div className="hero__actions">
|
| 66 |
+
<a href="#demo" className="btn btn--primary btn--lg">
|
| 67 |
+
Run Live Demo
|
| 68 |
<svg width="16" height="16" viewBox="0 0 16 16" fill="none">
|
| 69 |
<path d="M3 8H13M9 4l4 4-4 4" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round"/>
|
| 70 |
</svg>
|
| 71 |
</a>
|
| 72 |
+
<a href="#how-it-works" className="btn btn--outline btn--lg">
|
| 73 |
+
See 5-Agent Pipeline
|
| 74 |
</a>
|
| 75 |
</div>
|
| 76 |
|
| 77 |
<div className="hero__stats">
|
| 78 |
<div className="hero__stat">
|
| 79 |
+
<strong>27% → 82%</strong>
|
| 80 |
+
<span>Vehicle utilization</span>
|
| 81 |
</div>
|
| 82 |
<div className="hero__stat-divider" />
|
| 83 |
<div className="hero__stat">
|
| 84 |
+
<strong>50%</strong>
|
| 85 |
+
<span>Trips reduced</span>
|
| 86 |
</div>
|
| 87 |
<div className="hero__stat-divider" />
|
| 88 |
<div className="hero__stat">
|
| 89 |
+
<strong>14.2 kg</strong>
|
| 90 |
+
<span>CO₂ saved/run</span>
|
| 91 |
</div>
|
| 92 |
</div>
|
| 93 |
|
| 94 |
+
{/* Problem Statement Context */}
|
| 95 |
+
<div style={{ marginTop: '2rem', padding: '1rem 1.25rem', background: 'rgba(59,130,246,0.06)', border: '1px solid rgba(59,130,246,0.15)', borderRadius: '12px' }}>
|
| 96 |
+
<p style={{ fontSize: '0.75rem', color: '#9CA3AF', marginBottom: '0.5rem', textTransform: 'uppercase', letterSpacing: '0.05em' }}>Novelty: Two Problem Statements Combined</p>
|
| 97 |
<p style={{ fontSize: '0.875rem', color: '#E5E7EB', lineHeight: 1.6 }}>
|
| 98 |
+
<strong style={{ color: '#f97316' }}>PS#5</strong> AI Load Consolidation (primary) + <strong style={{ color: '#3b82f6' }}>PS#4</strong> AI Route Optimization (novelty).
|
| 99 |
+
5 AI agents orchestrated by <strong style={{ color: '#10b981' }}>LangGraph</strong> with OR-Tools CP-SAT solver,
|
| 100 |
+
K-Means clustering, and Q-learning RL — all integrated into <strong style={{ color: '#06b6d4' }}>LoRRI</strong> production via API.
|
| 101 |
</p>
|
| 102 |
<div style={{ display: 'flex', gap: '1.5rem', marginTop: '0.75rem', flexWrap: 'wrap' }}>
|
| 103 |
+
{[['🧠 5 AI Agents', 'LangGraph'], ['⚙️ OR-Tools', 'CP-SAT Solver'], ['📊 scikit-learn', 'KMeans'], ['🔄 RL Agent', 'Q-Learning']].map(([num, label]) => (
|
| 104 |
<span key={num} style={{ fontSize: '0.75rem', color: '#9CA3AF' }}><strong style={{ color: '#f97316' }}>{num}</strong> {label}</span>
|
| 105 |
))}
|
| 106 |
</div>
|
|
|
|
| 115 |
<span style={{background:'#f59e0b'}} />
|
| 116 |
<span style={{background:'#10b981'}} />
|
| 117 |
</div>
|
| 118 |
+
<span className="code-window__title">POST /v1/consolidate</span>
|
| 119 |
</div>
|
| 120 |
<div className="code-window__body">
|
| 121 |
<pre className="code-block code-block--request">
|
|
|
|
| 128 |
<div className="code-window__header">
|
| 129 |
<div className="hero__status-chip">
|
| 130 |
<span className="hero__status-dot" />
|
| 131 |
+
200 OK · 312ms
|
| 132 |
</div>
|
| 133 |
</div>
|
| 134 |
<div className="code-window__body">
|