Compare commits
15 Commits
cdc957832f
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5eae6e5094 | ||
|
|
e40faf0418 | ||
|
|
a2ce7c7b49 | ||
|
|
ba725c328d | ||
|
|
da2f956de9 | ||
|
|
7a804e84a1 | ||
|
|
468a6d48ec | ||
|
|
a78ba9b343 | ||
|
|
241c10fe29 | ||
|
|
34ce6929e5 | ||
|
|
5c16cb788d | ||
|
|
cd156b0ff4 | ||
|
|
8c59ac9944 | ||
|
|
637e46b76f | ||
|
|
16c9d9e6f3 |
21
deploy.sh
21
deploy.sh
@@ -5,22 +5,17 @@ echo "Building project..."
|
|||||||
npm run build
|
npm run build
|
||||||
|
|
||||||
# Create a deployment folder
|
# Create a deployment folder
|
||||||
echo "Preparing standalone deployment files for cPanel..."
|
echo "Preparing deployment files..."
|
||||||
rm -rf deploy
|
rm -rf deploy deploy.zip
|
||||||
mkdir -p deploy
|
mkdir -p deploy
|
||||||
|
cp -r .next deploy/
|
||||||
# Copy standalone output which includes the minimal server.js and node_modules
|
cp -r public deploy/
|
||||||
cp -r .next/standalone/* deploy/
|
cp server.js deploy/
|
||||||
|
cp package.json deploy/
|
||||||
# Copy public assets
|
cp next.config.ts deploy/
|
||||||
cp -r public deploy/public
|
|
||||||
|
|
||||||
# Copy static assets (required by standalone server)
|
|
||||||
mkdir -p deploy/.next
|
|
||||||
cp -r .next/static deploy/.next/static
|
|
||||||
|
|
||||||
# Optional: Zip the files
|
# Optional: Zip the files
|
||||||
echo "Zipping deployment files..."
|
echo "Zipping deployment files..."
|
||||||
cd deploy && zip -r ../deploy.zip . && cd ..
|
cd deploy && zip -r ../deploy.zip . && cd ..
|
||||||
|
|
||||||
echo "Done! Upload 'deploy.zip' to your cPanel directory, extract it, and point the Node.js app to 'server.js'."
|
echo "Done! Upload 'deploy.zip' to your cPanel directory and follow the guide."
|
||||||
|
|||||||
5
note.md
5
note.md
@@ -19,4 +19,7 @@
|
|||||||
- To be built
|
- To be built
|
||||||
|
|
||||||
## Step 5: Documents
|
## Step 5: Documents
|
||||||
- To be built
|
- To be built
|
||||||
|
|
||||||
|
|
||||||
|
"@ducanh2912/next-pwa": "^10.2.9",
|
||||||
2999
package-lock.json
generated
2999
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
11
package.json
11
package.json
@@ -12,13 +12,14 @@
|
|||||||
"@ducanh2912/next-pwa": "^10.2.9",
|
"@ducanh2912/next-pwa": "^10.2.9",
|
||||||
"@react-three/drei": "^10.7.7",
|
"@react-three/drei": "^10.7.7",
|
||||||
"@react-three/fiber": "^9.6.1",
|
"@react-three/fiber": "^9.6.1",
|
||||||
"date-fns": "^4.1.0",
|
"date-fns": "^4.4.0",
|
||||||
|
"glob": "^13.0.6",
|
||||||
"jspdf": "^4.2.1",
|
"jspdf": "^4.2.1",
|
||||||
"jspdf-autotable": "^5.0.7",
|
"jspdf-autotable": "^5.0.8",
|
||||||
"lucide-react": "^1.8.0",
|
"lucide-react": "^1.8.0",
|
||||||
"next": "16.2.4",
|
"next": "^16.2.9",
|
||||||
"react": "19.2.4",
|
"react": "^19.2.7",
|
||||||
"react-dom": "19.2.4",
|
"react-dom": "^19.2.7",
|
||||||
"react-hot-toast": "^2.6.0",
|
"react-hot-toast": "^2.6.0",
|
||||||
"three": "^0.184.0"
|
"three": "^0.184.0"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
const { createServer } = require('http')
|
const { createServer } = require('http')
|
||||||
const { parse } = require('url')
|
const { parse } = require('url')
|
||||||
|
|
||||||
const next = require('next')
|
const next = require('next')
|
||||||
|
|
||||||
const dev = process.env.NODE_ENV !== 'production'
|
const dev = process.env.NODE_ENV !== 'production'
|
||||||
@@ -16,4 +17,4 @@ app.prepare().then(() => {
|
|||||||
if (err) throw err
|
if (err) throw err
|
||||||
console.log(`> Ready on http://localhost:${port}`)
|
console.log(`> Ready on http://localhost:${port}`)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -8,7 +8,7 @@ const ICONS = [Bike, Zap, Battery, Shield, Bike, Zap, Battery, Shield];
|
|||||||
|
|
||||||
export default function ComingSoonPage() {
|
export default function ComingSoonPage() {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
// Mini Game State (Memory Match)
|
// Mini Game State (Memory Match)
|
||||||
const [cards, setCards] = useState<{ id: number; Icon: any; isFlipped: boolean; isMatched: boolean }[]>([]);
|
const [cards, setCards] = useState<{ id: number; Icon: any; isFlipped: boolean; isMatched: boolean }[]>([]);
|
||||||
const [flippedIndices, setFlippedIndices] = useState<number[]>([]);
|
const [flippedIndices, setFlippedIndices] = useState<number[]>([]);
|
||||||
@@ -23,11 +23,11 @@ export default function ComingSoonPage() {
|
|||||||
startNewGame();
|
startNewGame();
|
||||||
|
|
||||||
const targetDate = new Date('2026-08-01T00:00:00').getTime();
|
const targetDate = new Date('2026-08-01T00:00:00').getTime();
|
||||||
|
|
||||||
const updateCountdown = () => {
|
const updateCountdown = () => {
|
||||||
const now = new Date().getTime();
|
const now = new Date().getTime();
|
||||||
const distance = targetDate - now;
|
const distance = targetDate - now;
|
||||||
|
|
||||||
if (distance > 0) {
|
if (distance > 0) {
|
||||||
setTimeLeft({
|
setTimeLeft({
|
||||||
days: Math.floor(distance / (1000 * 60 * 60 * 24)),
|
days: Math.floor(distance / (1000 * 60 * 60 * 24)),
|
||||||
@@ -37,7 +37,7 @@ export default function ComingSoonPage() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
updateCountdown();
|
updateCountdown();
|
||||||
const interval = setInterval(updateCountdown, 1000);
|
const interval = setInterval(updateCountdown, 1000);
|
||||||
return () => clearInterval(interval);
|
return () => clearInterval(interval);
|
||||||
@@ -94,8 +94,8 @@ export default function ComingSoonPage() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-slate-900 flex flex-col items-center justify-center p-4 text-center">
|
<div className="min-h-screen bg-slate-900 flex flex-col items-center justify-center p-4 text-center">
|
||||||
<div className="absolute top-6 left-6">
|
<div className="absolute top-6 left-6 z-50">
|
||||||
<button
|
<button
|
||||||
onClick={() => router.push('/')}
|
onClick={() => router.push('/')}
|
||||||
className="text-slate-400 hover:text-white flex items-center gap-2 transition-colors"
|
className="text-slate-400 hover:text-white flex items-center gap-2 transition-colors"
|
||||||
>
|
>
|
||||||
@@ -107,7 +107,7 @@ export default function ComingSoonPage() {
|
|||||||
<h1 className="text-4xl sm:text-6xl font-black text-transparent bg-clip-text bg-gradient-to-r from-accent to-emerald-400 mb-6 animate-pulse">
|
<h1 className="text-4xl sm:text-6xl font-black text-transparent bg-clip-text bg-gradient-to-r from-accent to-emerald-400 mb-6 animate-pulse">
|
||||||
COMING SOON
|
COMING SOON
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
{/* Countdown Timer */}
|
{/* Countdown Timer */}
|
||||||
<div className="flex justify-center gap-3 sm:gap-4 mb-8">
|
<div className="flex justify-center gap-3 sm:gap-4 mb-8">
|
||||||
{[
|
{[
|
||||||
@@ -128,7 +128,7 @@ export default function ComingSoonPage() {
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
{/* Mini Game Container */}
|
{/* Mini Game Container */}
|
||||||
<div className="bg-slate-800 p-6 rounded-3xl border border-slate-700 shadow-2xl">
|
<div className="bg-slate-800 p-6 rounded-3xl border border-slate-700 shadow-2xl z-[9999]">
|
||||||
<div className="flex justify-between items-center mb-6 text-slate-300">
|
<div className="flex justify-between items-center mb-6 text-slate-300">
|
||||||
<span className="font-semibold">Moves: <span className="text-accent">{moves}</span></span>
|
<span className="font-semibold">Moves: <span className="text-accent">{moves}</span></span>
|
||||||
{won && <span className="text-yellow-400 font-bold flex items-center gap-1"><Trophy className="w-5 h-5" /> You Won!</span>}
|
{won && <span className="text-yellow-400 font-bold flex items-center gap-1"><Trophy className="w-5 h-5" /> You Won!</span>}
|
||||||
@@ -145,11 +145,10 @@ export default function ComingSoonPage() {
|
|||||||
<button
|
<button
|
||||||
key={card.id}
|
key={card.id}
|
||||||
onClick={() => handleCardClick(index)}
|
onClick={() => handleCardClick(index)}
|
||||||
className={`aspect-square rounded-xl flex items-center justify-center text-2xl transition-all duration-300 transform ${
|
className={`aspect-square rounded-xl flex items-center justify-center text-2xl transition-all duration-300 transform ${isVisible
|
||||||
isVisible
|
? 'bg-accent/20 border-2 border-accent text-accent scale-100 rotate-0'
|
||||||
? 'bg-accent/20 border-2 border-accent text-accent scale-100 rotate-0'
|
: 'bg-slate-700 border-2 border-slate-600 hover:bg-slate-600 scale-95'
|
||||||
: 'bg-slate-700 border-2 border-slate-600 hover:bg-slate-600 scale-95'
|
} ${card.isMatched ? 'opacity-50' : ''}`}
|
||||||
} ${card.isMatched ? 'opacity-50' : ''}`}
|
|
||||||
>
|
>
|
||||||
{isVisible ? <Icon className="w-8 h-8" /> : '?'}
|
{isVisible ? <Icon className="w-8 h-8" /> : '?'}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 25 KiB |
BIN
src/app/icon.png
Normal file
BIN
src/app/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 981 KiB |
144
src/app/page.tsx
144
src/app/page.tsx
@@ -62,7 +62,7 @@ export default function LandingPage() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-slate-50 font-sans selection:bg-accent selection:text-white pb-20 lg:pb-0">
|
<div className="min-h-screen bg-slate-50 font-sans selection:bg-accent selection:text-white">
|
||||||
{/* Dynamic Header */}
|
{/* Dynamic Header */}
|
||||||
<header className={`fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${scrolled ? 'bg-white/90 backdrop-blur-md shadow-sm py-3' : 'bg-transparent py-5'}`}>
|
<header className={`fixed top-0 left-0 right-0 z-50 transition-all duration-300 ${scrolled ? 'bg-white/90 backdrop-blur-md shadow-sm py-3' : 'bg-transparent py-5'}`}>
|
||||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 flex items-center justify-between">
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 flex items-center justify-between">
|
||||||
@@ -102,7 +102,7 @@ export default function LandingPage() {
|
|||||||
<span className="text-transparent bg-clip-text bg-gradient-to-r from-accent via-emerald-400 to-accent-light">Go Electric</span> with JAIBEN.
|
<span className="text-transparent bg-clip-text bg-gradient-to-r from-accent via-emerald-400 to-accent-light">Go Electric</span> with JAIBEN.
|
||||||
</h1>
|
</h1>
|
||||||
<p className="text-slate-300 text-lg sm:text-xl mb-10 drop-shadow-lg">
|
<p className="text-slate-300 text-lg sm:text-xl mb-10 drop-shadow-lg">
|
||||||
The largest EV Tech platform enabling the Gig Economy. Rent, Rent-to-Own, or Invest in EVs. Join the sustainable mobility revolution today.
|
The largest EV Tech platform enabling the Gig Economy. Choose from Single Rent, Rent to Own, or Share an EV. Join the sustainable mobility revolution today.
|
||||||
</p>
|
</p>
|
||||||
<div className="flex flex-col sm:flex-row items-center lg:items-start justify-center lg:justify-start gap-4">
|
<div className="flex flex-col sm:flex-row items-center lg:items-start justify-center lg:justify-start gap-4">
|
||||||
<button
|
<button
|
||||||
@@ -140,7 +140,7 @@ export default function LandingPage() {
|
|||||||
<h3 className="text-4xl md:text-5xl font-black text-slate-900 mb-2 text-accent">
|
<h3 className="text-4xl md:text-5xl font-black text-slate-900 mb-2 text-accent">
|
||||||
<AnimatedCounter end={18} suffix="%" />
|
<AnimatedCounter end={18} suffix="%" />
|
||||||
</h3>
|
</h3>
|
||||||
<p className="text-xs sm:text-sm font-semibold text-slate-500 uppercase tracking-wider">Avg. Investor ROI</p>
|
<p className="text-xs sm:text-sm font-semibold text-slate-500 uppercase tracking-wider">Avg. Rider Savings</p>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex flex-col items-center justify-center text-center px-2">
|
<div className="flex flex-col items-center justify-center text-center px-2">
|
||||||
<h3 className="text-4xl md:text-5xl font-black text-slate-900 mb-2">
|
<h3 className="text-4xl md:text-5xl font-black text-slate-900 mb-2">
|
||||||
@@ -165,14 +165,14 @@ export default function LandingPage() {
|
|||||||
{/* Service 1 */}
|
{/* Service 1 */}
|
||||||
<div className="group bg-white rounded-3xl p-8 shadow-lg hover:shadow-[0_20px_50px_rgba(0,0,0,0.1)] transition-all duration-500 border border-slate-100 relative overflow-hidden flex flex-col h-full transform hover:-translate-y-2">
|
<div className="group bg-white rounded-3xl p-8 shadow-lg hover:shadow-[0_20px_50px_rgba(0,0,0,0.1)] transition-all duration-500 border border-slate-100 relative overflow-hidden flex flex-col h-full transform hover:-translate-y-2">
|
||||||
<div className="absolute top-0 left-0 w-64 h-64 bg-gradient-to-br from-biker/10 to-transparent rounded-full blur-3xl -ml-16 -mt-16 transition-transform duration-700 group-hover:scale-150"></div>
|
<div className="absolute top-0 left-0 w-64 h-64 bg-gradient-to-br from-biker/10 to-transparent rounded-full blur-3xl -ml-16 -mt-16 transition-transform duration-700 group-hover:scale-150"></div>
|
||||||
|
|
||||||
<div className="w-24 h-24 bg-gradient-to-br from-white to-slate-50 shadow-inner rounded-2xl flex items-center justify-center mb-8 relative z-10 border border-slate-100/50">
|
<div className="w-24 h-24 bg-gradient-to-br from-white to-slate-50 shadow-inner rounded-2xl flex items-center justify-center mb-8 relative z-10 border border-slate-100/50">
|
||||||
<CardIcon3D type="bike" />
|
<CardIcon3D type="bike" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h4 className="text-2xl font-extrabold text-slate-900 mb-4 relative z-10">Biker Rentals</h4>
|
<h4 className="text-2xl font-extrabold text-slate-900 mb-4 relative z-10">Biker Rentals</h4>
|
||||||
<p className="text-slate-600 mb-8 flex-grow relative z-10 leading-relaxed">Save on petrol costs and rent a high-performance e-scooter for your daily commute or delivery gigs.</p>
|
<p className="text-slate-600 mb-8 flex-grow relative z-10 leading-relaxed">Save money on fuel. Pick the plan that works for you: Single Rent for quick trips, Rent to Own to keep the bike later, or Share an EV for flexibility.</p>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
onClick={() => router.push('/coming-soon')}
|
onClick={() => router.push('/coming-soon')}
|
||||||
disabled={loading}
|
disabled={loading}
|
||||||
@@ -182,7 +182,7 @@ export default function LandingPage() {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Service 2 - FICO Investment - User will redesign this section */}
|
{/* Service 2 - FICO Partners - User will redesign this section */}
|
||||||
{/*
|
{/*
|
||||||
<div className="group bg-white rounded-3xl p-8 shadow-sm hover:shadow-2xl transition-all duration-300 border border-slate-100 relative overflow-hidden flex flex-col h-full">
|
<div className="group bg-white rounded-3xl p-8 shadow-sm hover:shadow-2xl transition-all duration-300 border border-slate-100 relative overflow-hidden flex flex-col h-full">
|
||||||
...
|
...
|
||||||
@@ -192,14 +192,14 @@ export default function LandingPage() {
|
|||||||
{/* Service 3 */}
|
{/* Service 3 */}
|
||||||
<div className="group bg-white rounded-3xl p-8 shadow-lg hover:shadow-[0_20px_50px_rgba(0,0,0,0.1)] transition-all duration-500 border border-slate-100 relative overflow-hidden flex flex-col h-full transform hover:-translate-y-2">
|
<div className="group bg-white rounded-3xl p-8 shadow-lg hover:shadow-[0_20px_50px_rgba(0,0,0,0.1)] transition-all duration-500 border border-slate-100 relative overflow-hidden flex flex-col h-full transform hover:-translate-y-2">
|
||||||
<div className="absolute top-0 right-0 w-64 h-64 bg-gradient-to-bl from-purple-500/10 to-transparent rounded-full blur-3xl -mr-16 -mt-16 transition-transform duration-700 group-hover:scale-150"></div>
|
<div className="absolute top-0 right-0 w-64 h-64 bg-gradient-to-bl from-purple-500/10 to-transparent rounded-full blur-3xl -mr-16 -mt-16 transition-transform duration-700 group-hover:scale-150"></div>
|
||||||
|
|
||||||
<div className="w-24 h-24 bg-gradient-to-br from-white to-slate-50 shadow-inner rounded-2xl flex items-center justify-center mb-8 relative z-10 border border-slate-100/50">
|
<div className="w-24 h-24 bg-gradient-to-br from-white to-slate-50 shadow-inner rounded-2xl flex items-center justify-center mb-8 relative z-10 border border-slate-100/50">
|
||||||
<CardIcon3D type="swap" />
|
<CardIcon3D type="swap" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h4 className="text-2xl font-extrabold text-slate-900 mb-4 relative z-10">Swap Stations</h4>
|
<h4 className="text-2xl font-extrabold text-slate-900 mb-4 relative z-10">Swap Stations</h4>
|
||||||
<p className="text-slate-600 mb-8 flex-grow relative z-10 leading-relaxed">Never wait to charge. Swap your depleted battery for a fully charged one in less than 2 minutes.</p>
|
<p className="text-slate-600 mb-8 flex-grow relative z-10 leading-relaxed">Never wait hours to charge your bike. Find a swap station near you, drop off your empty battery, and get a full one in under 2 minutes so you can keep riding.</p>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
onClick={() => router.push('/coming-soon')}
|
onClick={() => router.push('/coming-soon')}
|
||||||
disabled={loading}
|
disabled={loading}
|
||||||
@@ -212,14 +212,14 @@ export default function LandingPage() {
|
|||||||
{/* Service 3 (Merchant/Deliveries) */}
|
{/* Service 3 (Merchant/Deliveries) */}
|
||||||
<div className="group bg-white rounded-3xl p-8 shadow-lg hover:shadow-[0_20px_50px_rgba(0,0,0,0.1)] transition-all duration-500 border border-slate-100 relative overflow-hidden flex flex-col h-full transform hover:-translate-y-2">
|
<div className="group bg-white rounded-3xl p-8 shadow-lg hover:shadow-[0_20px_50px_rgba(0,0,0,0.1)] transition-all duration-500 border border-slate-100 relative overflow-hidden flex flex-col h-full transform hover:-translate-y-2">
|
||||||
<div className="absolute top-0 right-0 w-64 h-64 bg-gradient-to-bl from-accent/10 to-transparent rounded-full blur-3xl -mr-16 -mt-16 transition-transform duration-700 group-hover:scale-150"></div>
|
<div className="absolute top-0 right-0 w-64 h-64 bg-gradient-to-bl from-accent/10 to-transparent rounded-full blur-3xl -mr-16 -mt-16 transition-transform duration-700 group-hover:scale-150"></div>
|
||||||
|
|
||||||
<div className="w-24 h-24 bg-gradient-to-br from-white to-slate-50 shadow-inner rounded-2xl flex items-center justify-center mb-8 relative z-10 border border-slate-100/50">
|
<div className="w-24 h-24 bg-gradient-to-br from-white to-slate-50 shadow-inner rounded-2xl flex items-center justify-center mb-8 relative z-10 border border-slate-100/50">
|
||||||
<CardIcon3D type="merchant" />
|
<CardIcon3D type="merchant" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h4 className="text-2xl font-extrabold text-slate-900 mb-4 relative z-10">Merchants & Deliveries</h4>
|
<h4 className="text-2xl font-extrabold text-slate-900 mb-4 relative z-10">Merchants & Deliveries</h4>
|
||||||
<p className="text-slate-600 mb-8 flex-grow relative z-10 leading-relaxed">Are you a delivery partner or company? Request any amount of riders for your delivery needs. Partner with us for dedicated EV riders.</p>
|
<p className="text-slate-600 mb-8 flex-grow relative z-10 leading-relaxed">Grow your delivery business with ease. Request verified EV riders whenever you need them, deliver more orders smoothly, and help keep the environment green.</p>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
onClick={() => router.push('/coming-soon')}
|
onClick={() => router.push('/coming-soon')}
|
||||||
className="inline-flex items-center gap-2 text-white bg-accent px-6 py-3 rounded-full font-bold shadow-lg shadow-accent/30 hover:bg-accent-dark hover:shadow-accent/50 transition-all relative z-10 w-fit"
|
className="inline-flex items-center gap-2 text-white bg-accent px-6 py-3 rounded-full font-bold shadow-lg shadow-accent/30 hover:bg-accent-dark hover:shadow-accent/50 transition-all relative z-10 w-fit"
|
||||||
@@ -303,7 +303,7 @@ export default function LandingPage() {
|
|||||||
<div className="absolute -top-2 -right-2 w-8 h-8 bg-accent rounded-full flex items-center justify-center font-bold text-sm">2</div>
|
<div className="absolute -top-2 -right-2 w-8 h-8 bg-accent rounded-full flex items-center justify-center font-bold text-sm">2</div>
|
||||||
</div>
|
</div>
|
||||||
<h4 className="text-xl font-bold mb-3">Choose Your Plan</h4>
|
<h4 className="text-xl font-bold mb-3">Choose Your Plan</h4>
|
||||||
<p className="text-slate-400">Select your EV model and subscription plan (Daily, Weekly, or Rent-to-Own).</p>
|
<p className="text-slate-400">Select your EV model and preferred plan (Single Rent, Rent to Own, or Share an EV).</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="relative text-center">
|
<div className="relative text-center">
|
||||||
@@ -330,31 +330,31 @@ export default function LandingPage() {
|
|||||||
{/* Download App Section */}
|
{/* Download App Section */}
|
||||||
<section className="py-20 bg-accent relative overflow-hidden">
|
<section className="py-20 bg-accent relative overflow-hidden">
|
||||||
<div className="absolute inset-0 bg-[url('/noise.png')] opacity-10 mix-blend-overlay"></div>
|
<div className="absolute inset-0 bg-[url('/noise.png')] opacity-10 mix-blend-overlay"></div>
|
||||||
|
|
||||||
{/* Background decorative circles */}
|
{/* Background decorative circles */}
|
||||||
<div className="absolute top-0 right-0 w-96 h-96 bg-white/10 rounded-full blur-3xl -mr-20 -mt-20"></div>
|
<div className="absolute top-0 right-0 w-96 h-96 bg-white/10 rounded-full blur-3xl -mr-20 -mt-20"></div>
|
||||||
<div className="absolute bottom-0 left-0 w-64 h-64 bg-emerald-900/30 rounded-full blur-3xl -ml-20 -mb-20"></div>
|
<div className="absolute bottom-0 left-0 w-64 h-64 bg-emerald-900/30 rounded-full blur-3xl -ml-20 -mb-20"></div>
|
||||||
|
|
||||||
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10 flex flex-col md:flex-row items-center justify-between gap-12">
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10 flex flex-col md:flex-row items-center justify-between gap-12">
|
||||||
<div className="w-full md:w-1/2 text-center md:text-left text-white">
|
<div className="w-full md:w-1/2 text-center md:text-left text-white">
|
||||||
<h2 className="text-3xl md:text-5xl font-extrabold mb-6 leading-tight drop-shadow-sm">Ready to ride? <br/>Download the JAIBEN App</h2>
|
<h2 className="text-3xl md:text-5xl font-extrabold mb-6 leading-tight drop-shadow-sm">Ready to ride? <br />Download the JAIBEN App</h2>
|
||||||
<p className="text-white/90 text-lg mb-8 max-w-lg mx-auto md:mx-0 drop-shadow-sm">Get full access to biker rentals, swap station locations, and real-time earnings directly from your smartphone.</p>
|
<p className="text-white/90 text-lg mb-8 max-w-lg mx-auto md:mx-0 drop-shadow-sm">Get full access to biker rentals, swap station locations, and real-time earnings directly from your smartphone.</p>
|
||||||
<div className="flex flex-col sm:flex-row items-center justify-center md:justify-start gap-4">
|
<div className="flex flex-col sm:flex-row items-center justify-center md:justify-start gap-4">
|
||||||
<button
|
<button
|
||||||
onClick={() => router.push('/coming-soon')}
|
onClick={() => router.push('/coming-soon')}
|
||||||
className="flex items-center gap-3 bg-black text-white px-6 py-3 rounded-xl hover:bg-slate-900 hover:scale-105 transition-all shadow-xl shadow-black/20 w-full sm:w-auto justify-center"
|
className="flex items-center gap-3 bg-black text-white px-6 py-3 rounded-xl hover:bg-slate-900 hover:scale-105 transition-all shadow-xl shadow-black/20 w-full sm:w-auto justify-center"
|
||||||
>
|
>
|
||||||
<svg viewBox="0 0 512 512" className="w-6 h-6 fill-current"><path d="M325.3 234.3L104.6 13l280.8 161.2-60.1 60.1zM47 0C34 6.8 25.3 19.2 25.3 35.3v441.3c0 16.1 8.7 28.5 21.7 35.3l256.6-256L47 0zm425.2 225.6l-58.9-34.1-65.7 64.5 65.7 64.5 60.1-34.1c18-14.3 18-46.5-1.2-60.8zM104.6 499l280.8-161.2-60.1-60.1L104.6 499z"/></svg>
|
<svg viewBox="0 0 512 512" className="w-6 h-6 fill-current"><path d="M325.3 234.3L104.6 13l280.8 161.2-60.1 60.1zM47 0C34 6.8 25.3 19.2 25.3 35.3v441.3c0 16.1 8.7 28.5 21.7 35.3l256.6-256L47 0zm425.2 225.6l-58.9-34.1-65.7 64.5 65.7 64.5 60.1-34.1c18-14.3 18-46.5-1.2-60.8zM104.6 499l280.8-161.2-60.1-60.1L104.6 499z" /></svg>
|
||||||
<div className="flex flex-col text-left">
|
<div className="flex flex-col text-left">
|
||||||
<span className="text-[10px] leading-none text-slate-300 font-semibold">GET IT ON</span>
|
<span className="text-[10px] leading-none text-slate-300 font-semibold">GET IT ON</span>
|
||||||
<span className="text-lg font-bold leading-none mt-1">Google Play</span>
|
<span className="text-lg font-bold leading-none mt-1">Google Play</span>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
onClick={() => router.push('/coming-soon')}
|
onClick={() => router.push('/coming-soon')}
|
||||||
className="flex items-center gap-3 bg-black text-white px-6 py-3 rounded-xl hover:bg-slate-900 hover:scale-105 transition-all shadow-xl shadow-black/20 w-full sm:w-auto justify-center"
|
className="flex items-center gap-3 bg-black text-white px-6 py-3 rounded-xl hover:bg-slate-900 hover:scale-105 transition-all shadow-xl shadow-black/20 w-full sm:w-auto justify-center"
|
||||||
>
|
>
|
||||||
<svg viewBox="0 0 384 512" className="w-6 h-6 fill-current"><path d="M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z"/></svg>
|
<svg viewBox="0 0 384 512" className="w-6 h-6 fill-current"><path d="M318.7 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7C63.3 141.2 4 184.8 4 273.5q0 39.3 14.4 81.2c12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zm-56.6-164.2c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z" /></svg>
|
||||||
<div className="flex flex-col text-left">
|
<div className="flex flex-col text-left">
|
||||||
<span className="text-[10px] leading-none text-slate-300 font-semibold">Download on the</span>
|
<span className="text-[10px] leading-none text-slate-300 font-semibold">Download on the</span>
|
||||||
<span className="text-lg font-bold leading-none mt-1">App Store</span>
|
<span className="text-lg font-bold leading-none mt-1">App Store</span>
|
||||||
@@ -362,52 +362,52 @@ export default function LandingPage() {
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="w-full md:w-1/2 flex justify-center">
|
|
||||||
{/* Abstract Phone Mockup */}
|
|
||||||
<div className="w-64 h-[450px] bg-slate-900 rounded-[3rem] border-[8px] border-slate-800 shadow-[0_30px_60px_rgba(0,0,0,0.4)] relative overflow-hidden flex flex-col -mb-32 md:-mb-40 transform rotate-12 hover:rotate-6 transition-transform duration-500">
|
|
||||||
<div className="h-6 w-1/2 bg-slate-800 absolute top-0 left-1/2 -translate-x-1/2 rounded-b-xl z-20"></div>
|
|
||||||
<div className="flex-1 bg-slate-50 p-4 pt-12 relative flex flex-col gap-4">
|
|
||||||
{/* Mock App Header */}
|
|
||||||
<div className="flex justify-between items-center">
|
|
||||||
<div className="w-10 h-10 bg-accent rounded-full flex items-center justify-center">
|
|
||||||
<Image src="/jaiben.png" alt="Logo" width={24} height={24} className="brightness-0 invert" />
|
|
||||||
</div>
|
|
||||||
<div className="w-8 h-8 bg-slate-200 rounded-full"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Mock App Banner */}
|
|
||||||
<div className="w-full h-32 bg-gradient-to-br from-accent to-emerald-700 rounded-2xl p-4 shadow-sm relative overflow-hidden">
|
|
||||||
<div className="w-32 h-32 bg-white/10 rounded-full absolute -right-10 -bottom-10 blur-xl"></div>
|
|
||||||
<div className="w-1/2 h-3 bg-white/40 rounded-full mb-2 relative z-10"></div>
|
|
||||||
<div className="w-1/3 h-3 bg-white/20 rounded-full relative z-10"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* Mock App Grid */}
|
<div className="w-full md:w-1/2 flex justify-center">
|
||||||
<div className="grid grid-cols-2 gap-3 flex-grow">
|
{/* Abstract Phone Mockup */}
|
||||||
<div className="bg-white rounded-xl shadow-sm border border-slate-100 p-3 flex flex-col gap-2">
|
<div className="w-64 h-[450px] bg-slate-900 rounded-[3rem] border-[8px] border-slate-800 shadow-[0_30px_60px_rgba(0,0,0,0.4)] relative overflow-hidden flex flex-col -mb-32 md:-mb-40 transform rotate-12 hover:rotate-6 transition-transform duration-500">
|
||||||
<div className="w-8 h-8 bg-orange-100 rounded-lg"></div>
|
<div className="h-6 w-1/2 bg-slate-800 absolute top-0 left-1/2 -translate-x-1/2 rounded-b-xl z-20"></div>
|
||||||
<div className="w-full h-2 bg-slate-200 rounded-full"></div>
|
<div className="flex-1 bg-slate-50 p-4 pt-12 relative flex flex-col gap-4">
|
||||||
<div className="w-1/2 h-2 bg-slate-100 rounded-full"></div>
|
{/* Mock App Header */}
|
||||||
</div>
|
<div className="flex justify-between items-center">
|
||||||
<div className="bg-white rounded-xl shadow-sm border border-slate-100 p-3 flex flex-col gap-2">
|
<div className="w-10 h-10 bg-accent rounded-full flex items-center justify-center">
|
||||||
<div className="w-8 h-8 bg-purple-100 rounded-lg"></div>
|
<Image src="/jaiben.png" alt="Logo" width={24} height={24} className="brightness-0 invert" />
|
||||||
<div className="w-full h-2 bg-slate-200 rounded-full"></div>
|
</div>
|
||||||
<div className="w-1/2 h-2 bg-slate-100 rounded-full"></div>
|
<div className="w-8 h-8 bg-slate-200 rounded-full"></div>
|
||||||
</div>
|
</div>
|
||||||
<div className="bg-white rounded-xl shadow-sm border border-slate-100 p-3 flex flex-col gap-2">
|
|
||||||
<div className="w-8 h-8 bg-blue-100 rounded-lg"></div>
|
{/* Mock App Banner */}
|
||||||
<div className="w-full h-2 bg-slate-200 rounded-full"></div>
|
<div className="w-full h-32 bg-gradient-to-br from-accent to-emerald-700 rounded-2xl p-4 shadow-sm relative overflow-hidden">
|
||||||
<div className="w-1/2 h-2 bg-slate-100 rounded-full"></div>
|
<div className="w-32 h-32 bg-white/10 rounded-full absolute -right-10 -bottom-10 blur-xl"></div>
|
||||||
</div>
|
<div className="w-1/2 h-3 bg-white/40 rounded-full mb-2 relative z-10"></div>
|
||||||
<div className="bg-white rounded-xl shadow-sm border border-slate-100 p-3 flex flex-col gap-2">
|
<div className="w-1/3 h-3 bg-white/20 rounded-full relative z-10"></div>
|
||||||
<div className="w-8 h-8 bg-emerald-100 rounded-lg"></div>
|
</div>
|
||||||
<div className="w-full h-2 bg-slate-200 rounded-full"></div>
|
|
||||||
<div className="w-1/2 h-2 bg-slate-100 rounded-full"></div>
|
{/* Mock App Grid */}
|
||||||
</div>
|
<div className="grid grid-cols-2 gap-3 flex-grow">
|
||||||
</div>
|
<div className="bg-white rounded-xl shadow-sm border border-slate-100 p-3 flex flex-col gap-2">
|
||||||
</div>
|
<div className="w-8 h-8 bg-orange-100 rounded-lg"></div>
|
||||||
</div>
|
<div className="w-full h-2 bg-slate-200 rounded-full"></div>
|
||||||
|
<div className="w-1/2 h-2 bg-slate-100 rounded-full"></div>
|
||||||
|
</div>
|
||||||
|
<div className="bg-white rounded-xl shadow-sm border border-slate-100 p-3 flex flex-col gap-2">
|
||||||
|
<div className="w-8 h-8 bg-purple-100 rounded-lg"></div>
|
||||||
|
<div className="w-full h-2 bg-slate-200 rounded-full"></div>
|
||||||
|
<div className="w-1/2 h-2 bg-slate-100 rounded-full"></div>
|
||||||
|
</div>
|
||||||
|
<div className="bg-white rounded-xl shadow-sm border border-slate-100 p-3 flex flex-col gap-2">
|
||||||
|
<div className="w-8 h-8 bg-blue-100 rounded-lg"></div>
|
||||||
|
<div className="w-full h-2 bg-slate-200 rounded-full"></div>
|
||||||
|
<div className="w-1/2 h-2 bg-slate-100 rounded-full"></div>
|
||||||
|
</div>
|
||||||
|
<div className="bg-white rounded-xl shadow-sm border border-slate-100 p-3 flex flex-col gap-2">
|
||||||
|
<div className="w-8 h-8 bg-emerald-100 rounded-lg"></div>
|
||||||
|
<div className="w-full h-2 bg-slate-200 rounded-full"></div>
|
||||||
|
<div className="w-1/2 h-2 bg-slate-100 rounded-full"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
@@ -438,9 +438,9 @@ export default function LandingPage() {
|
|||||||
<div>
|
<div>
|
||||||
<h4 className="text-white font-bold mb-6">Services</h4>
|
<h4 className="text-white font-bold mb-6">Services</h4>
|
||||||
<ul className="space-y-3 text-slate-400">
|
<ul className="space-y-3 text-slate-400">
|
||||||
<li><button onClick={() => router.push('/coming-soon')} className="hover:text-accent transition-colors">EV for Deliveries</button></li>
|
<li><button onClick={() => router.push('/coming-soon')} className="hover:text-accent transition-colors">Single Rent</button></li>
|
||||||
<li><button onClick={() => router.push('/coming-soon')} className="hover:text-accent transition-colors">Rent to Own</button></li>
|
<li><button onClick={() => router.push('/coming-soon')} className="hover:text-accent transition-colors">Rent to Own</button></li>
|
||||||
<li><button onClick={() => router.push('/coming-soon')} className="hover:text-accent transition-colors">Investor Platform</button></li>
|
<li><button onClick={() => router.push('/coming-soon')} className="hover:text-accent transition-colors">Share an EV</button></li>
|
||||||
<li><button onClick={() => router.push('/coming-soon')} className="hover:text-accent transition-colors">Swap Stations</button></li>
|
<li><button onClick={() => router.push('/coming-soon')} className="hover:text-accent transition-colors">Swap Stations</button></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -457,8 +457,8 @@ export default function LandingPage() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="border-t border-slate-800 pt-8 flex flex-col md:flex-row justify-between items-center gap-4">
|
<div className="border-t border-slate-800 pt-8 flex flex-col md:flex-row justify-between items-center gap-4">
|
||||||
<p className="text-slate-500 text-sm">
|
<p className="text-slate-500 text-sm text-center md:text-left">
|
||||||
© {new Date().getFullYear()} JAIBEN Mobility Ltd. All rights reserved.
|
© {new Date().getFullYear()} JAIBEN Mobility Ltd. All rights reserved. <span className="hidden md:inline">|</span><br className="md:hidden" /> Developed by <a href="https://forenizence.com/" target="_blank" rel="noopener noreferrer" className="hover:text-accent transition-colors font-medium">Forenizence</a>
|
||||||
</p>
|
</p>
|
||||||
<div className="flex gap-6 text-sm text-slate-500">
|
<div className="flex gap-6 text-sm text-slate-500">
|
||||||
<a href="#" className="hover:text-white transition-colors">Privacy Policy</a>
|
<a href="#" className="hover:text-white transition-colors">Privacy Policy</a>
|
||||||
|
|||||||
@@ -14,6 +14,9 @@ import {
|
|||||||
import * as THREE from 'three';
|
import * as THREE from 'three';
|
||||||
import { OBJLoader } from 'three-stdlib';
|
import { OBJLoader } from 'three-stdlib';
|
||||||
|
|
||||||
|
useLoader.preload(OBJLoader, '/aerox.obj');
|
||||||
|
useLoader.preload(THREE.TextureLoader, '/jaiben.png');
|
||||||
|
|
||||||
const ACCENT = '#00bc84';
|
const ACCENT = '#00bc84';
|
||||||
const ACCENT_BRIGHT = '#10b981';
|
const ACCENT_BRIGHT = '#10b981';
|
||||||
|
|
||||||
@@ -138,7 +141,7 @@ function Battery({ position, scale = 1, rotation = [0, 0, 0] }: { position: [num
|
|||||||
{/* Handle */}
|
{/* Handle */}
|
||||||
<mesh position={[0, 0.70, 0]} castShadow receiveShadow>
|
<mesh position={[0, 0.70, 0]} castShadow receiveShadow>
|
||||||
<torusGeometry args={[0.15, 0.04, 16, 32, Math.PI]} />
|
<torusGeometry args={[0.15, 0.04, 16, 32, Math.PI]} />
|
||||||
<meshStandardMaterial color="#0d7a33ff" roughness={0.2} metalness={0.9} />
|
<meshStandardMaterial color="#0d7a33" roughness={0.2} metalness={0.9} />
|
||||||
</mesh>
|
</mesh>
|
||||||
|
|
||||||
{/* Glowing Indicator Light */}
|
{/* Glowing Indicator Light */}
|
||||||
|
|||||||
Reference in New Issue
Block a user