00Boobs00's picture
Upload folder using huggingface_hub
f1085da verified
raw
history blame
36.8 kB
<!DOCTYPE html>
<html lang="en" class="scroll-smooth">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>DroidDrop | Next-Gen Android Emulation</title>
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;600;700;900&family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet">
<!-- Tailwind CSS -->
<script src="https://cdn.tailwindcss.com"></script>
<!-- Feather Icons -->
<script src="https://unpkg.com/feather-icons"></script>
<!-- Config for Tailwind -->
<script>
tailwind.config = {
darkMode: 'class',
theme: {
extend: {
fontFamily: {
sans: ['Inter', 'sans-serif'],
mono: ['JetBrains Mono', 'monospace'],
},
colors: {
brand: {
50: '#f0f9ff',
500: '#0ea5e9',
600: '#0284c7',
900: '#0c4a6e',
accent: '#6366f1', // Indigo
glow: '#818cf8',
},
dark: {
bg: '#0f172a',
card: '#1e293b',
border: '#334155'
}
},
animation: {
'float': 'float 6s ease-in-out infinite',
'pulse-glow': 'pulse-glow 2s cubic-bezier(0.4, 0, 0.6, 1) infinite',
'spin-slow': 'spin 3s linear infinite',
},
keyframes: {
float: {
'0%, 100%': { transform: 'translateY(0)' },
'50%': { transform: 'translateY(-20px)' },
},
'pulse-glow': {
'0%, 100%': { opacity: 1, boxShadow: '0 0 20px #6366f1' },
'50%': { opacity: .7, boxShadow: '0 0 10px #6366f1' },
}
}
}
}
}
</script>
<style>
/* Custom CSS for things Tailwind can't easily do */
body {
background-color: #0f172a;
color: #f8fafc;
overflow-x: hidden;
}
/* Glassmorphism */
.glass {
background: rgba(30, 41, 59, 0.7);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.glass-high {
background: rgba(255, 255, 255, 0.05);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border: 1px solid rgba(255, 255, 255, 0.15);
box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1);
}
/* Neon Text */
.text-glow {
text-shadow: 0 0 20px rgba(99, 102, 241, 0.5);
}
/* Scrollbar */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: #0f172a;
}
::-webkit-scrollbar-thumb {
background: #334155;
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: #475569;
}
/* Utility for animation states */
.reveal {
opacity: 0;
transform: translateY(30px);
transition: all 0.8s ease-out;
}
.reveal.active {
opacity: 1;
transform: translateY(0);
}
/* Phone Mockup CSS */
.phone-frame {
border: 12px solid #1e293b;
border-radius: 40px;
overflow: hidden;
position: relative;
background: #000;
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
}
.phone-notch {
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
width: 120px;
height: 25px;
background: #1e293b;
border-bottom-left-radius: 12px;
border-bottom-right-radius: 12px;
z-index: 20;
}
/* Boot Animation States */
.boot-screen {
display: none;
width: 100%;
height: 100%;
align-items: center;
justify-content: center;
flex-direction: column;
background: #000;
}
.boot-active .boot-screen { display: flex; }
.boot-active .home-screen { display: none; }
.android-logo {
width: 60px;
height: 60px;
border-radius: 50%;
border: 2px solid #3ddc84; /* Android Green */
position: relative;
animation: pulse 1.5s infinite;
}
.android-logo::after {
content: '';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 40px;
height: 40px;
background: #3ddc84;
border-radius: 50%;
opacity: 0.5;
}
@keyframes pulse {
0% { transform: scale(1); box-shadow: 0 0 0 0 rgba(61, 220, 132, 0.7); }
70% { transform: scale(1.1); box-shadow: 0 0 0 10px rgba(61, 220, 132, 0); }
100% { transform: scale(1); box-shadow: 0 0 0 0 rgba(61, 220, 132, 0); }
}
/* Canvas z-index */
#bg-canvas {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: -1;
opacity: 0.4;
}
</style>
</head>
<body class="antialiased">
<!-- Background Canvas -->
<canvas id="bg-canvas"></canvas>
<!-- Navigation -->
<nav class="fixed w-full z-50 transition-all duration-300 glass" id="navbar">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between items-center h-20">
<!-- Logo -->
<div class="flex items-center space-x-3 cursor-pointer group">
<div class="bg-gradient-to-br from-brand-500 to-brand-accent p-2 rounded-lg group-hover:rotate-12 transition-transform">
<i data-feather="cpu" class="text-white w-6 h-6"></i>
</div>
<span class="text-2xl font-bold tracking-tight text-white group-hover:text-brand-500 transition-colors">
DroidDrop
</span>
</div>
<!-- Desktop Menu -->
<div class="hidden md:flex items-center space-x-8">
<a href="#features" class="text-gray-300 hover:text-white font-medium transition-colors">Features</a>
<a href="#demo" class="text-gray-300 hover:text-white font-medium transition-colors">Live Demo</a>
<a href="#pricing" class="text-gray-300 hover:text-white font-medium transition-colors">Pricing</a>
<a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" class="text-xs text-gray-500 hover:text-brand-500 transition-colors border border-gray-700 px-2 py-1 rounded">
Built with anycoder
</a>
<button class="bg-white text-dark-bg hover:bg-gray-200 px-6 py-2 rounded-full font-bold transition-all transform hover:scale-105 shadow-lg shadow-brand-500/20">
Get Started
</button>
</div>
<!-- Mobile Menu Button -->
<button class="md:hidden text-white p-2" id="mobile-menu-btn">
<i data-feather="menu" class="w-8 h-8"></i>
</button>
</div>
</div>
<!-- Mobile Menu -->
<div class="md:hidden hidden bg-dark-card border-b border-gray-800" id="mobile-menu">
<div class="px-4 py-6 space-y-4">
<a href="#features" class="block text-gray-300 hover:text-brand-500">Features</a>
<a href="#demo" class="block text-gray-300 hover:text-brand-500">Live Demo</a>
<a href="#pricing" class="block text-gray-300 hover:text-brand-500">Pricing</a>
<a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" class="block text-gray-500 text-sm">Built with anycoder</a>
<button class="w-full bg-brand-600 text-white py-3 rounded-lg font-bold mt-4">Get Started</button>
</div>
</div>
</nav>
<!-- Hero Section -->
<section class="relative pt-32 pb-20 lg:pt-48 lg:pb-32 overflow-hidden">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10 text-center">
<div class="inline-block mb-6 px-4 py-1 rounded-full glass-high border border-brand-500/30 animate-float">
<span class="text-brand-400 font-mono text-sm flex items-center gap-2">
<span class="w-2 h-2 rounded-full bg-green-400 animate-pulse"></span>
v2.0 Now Available
</span>
</div>
<h1 class="text-5xl md:text-7xl lg:text-8xl font-black text-white mb-8 tracking-tight leading-none">
Test Android.<br>
<span class="text-transparent bg-clip-text bg-gradient-to-r from-brand-400 via-purple-400 to-brand-accent text-glow">
Anywhere. Instantly.
</span>
</h1>
<p class="mt-4 max-w-2xl mx-auto text-xl text-gray-400 mb-10 leading-relaxed">
Disposable, secure, and lightning-fast Android emulators in the cloud.
No setup. No installation. Just pure development velocity.
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center items-center">
<a href="#demo" class="w-full sm:w-auto px-8 py-4 bg-gradient-to-r from-brand-600 to-brand-accent rounded-xl font-bold text-white text-lg shadow-lg shadow-brand-500/30 hover:shadow-brand-500/50 hover:scale-105 transition-all duration-300 flex items-center justify-center gap-2">
<i data-feather="play-circle" class="w-5 h-5"></i>
Launch Demo
</a>
<a href="https://github.com" class="w-full sm:w-auto px-8 py-4 glass-high rounded-xl font-bold text-white text-lg hover:bg-white/10 transition-all duration-300 flex items-center justify-center gap-2">
<i data-feather="github" class="w-5 h-5"></i>
View Source
</a>
</div>
<!-- Stats -->
<div class="mt-20 grid grid-cols-2 md:grid-cols-4 gap-8 border-t border-gray-800 pt-8">
<div>
<div class="text-4xl font-bold text-white mb-1">30s</div>
<div class="text-sm text-gray-500 uppercase tracking-wider">Boot Time</div>
</div>
<div>
<div class="text-4xl font-bold text-white mb-1">99.9%</div>
<div class="text-sm text-gray-500 uppercase tracking-wider">Uptime</div>
</div>
<div>
<div class="text-4xl font-bold text-white mb-1">0</div>
<div class="text-sm text-gray-500 uppercase tracking-wider">Latency</div>
</div>
<div>
<div class="text-4xl font-bold text-white mb-1"></div>
<div class="text-sm text-gray-500 uppercase tracking-wider">Scalability</div>
</div>
</div>
</div>
</section>
<!-- Features Section -->
<section id="features" class="py-24 bg-dark-bg relative">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16 reveal">
<h2 class="text-3xl md:text-5xl font-bold text-white mb-4">Why DroidDrop?</h2>
<p class="text-gray-400 max-w-2xl mx-auto">Engineered for modern mobile development workflows.</p>
</div>
<div class="grid md:grid-cols-3 gap-8">
<!-- Feature 1 -->
<div class="glass-high p-8 rounded-2xl hover:bg-white/10 transition-all duration-300 group reveal border border-gray-800 hover:border-brand-500/50">
<div class="w-14 h-14 bg-brand-900/50 rounded-xl flex items-center justify-center mb-6 group-hover:scale-110 transition-transform">
<i data-feather="zap" class="text-brand-400 w-8 h-8"></i>
</div>
<h3 class="text-xl font-bold text-white mb-3">Instant Boot</h3>
<p class="text-gray-400 leading-relaxed">Our proprietary containerization technology spins up fresh Android instances in under 30 seconds.</p>
</div>
<!-- Feature 2 -->
<div class="glass-high p-8 rounded-2xl hover:bg-white/10 transition-all duration-300 group reveal border border-gray-800 hover:border-purple-500/50" style="transition-delay: 100ms;">
<div class="w-14 h-14 bg-purple-900/50 rounded-xl flex items-center justify-center mb-6 group-hover:scale-110 transition-transform">
<i data-feather="shield" class="text-purple-400 w-8 h-8"></i>
</div>
<h3 class="text-xl font-bold text-white mb-3">Ephemeral Security</h3>
<p class="text-gray-400 leading-relaxed">Every session is isolated. Data is wiped immediately upon termination. Zero residue, zero risk.</p>
</div>
<!-- Feature 3 -->
<div class="glass-high p-8 rounded-2xl hover:bg-white/10 transition-all duration-300 group reveal border border-gray-800 hover:border-pink-500/50" style="transition-delay: 200ms;">
<div class="w-14 h-14 bg-pink-900/50 rounded-xl flex items-center justify-center mb-6 group-hover:scale-110 transition-transform">
<i data-feather="layers" class="text-pink-400 w-8 h-8"></i>
</div>
<h3 class="text-xl font-bold text-white mb-3">Device Matrix</h3>
<p class="text-gray-400 leading-relaxed">Test across Pixel, Samsung, Xiaomi, and more with different API levels and screen sizes simultaneously.</p>
</div>
</div>
</div>
</section>
<!-- Interactive Demo Section -->
<section id="demo" class="py-24 bg-gradient-to-b from-dark-bg to-dark-card relative overflow-hidden">
<!-- Background Glow -->
<div class="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[500px] h-[500px] bg-brand-600/20 rounded-full blur-[100px] pointer-events-none"></div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid lg:grid-cols-2 gap-16 items-center">
<!-- Controls -->
<div class="reveal">
<h2 class="text-3xl md:text-5xl font-bold text-white mb-6">Try it live.</h2>
<p class="text-gray-400 mb-8 text-lg">Select a device configuration and launch a simulated environment directly in your browser.</p>
<div class="space-y-6">
<!-- Device Selection -->
<div>
<label class="block text-sm font-medium text-gray-400 mb-2">Select Device Model</label>
<div class="grid grid-cols-3 gap-3">
<button class="device-btn active p-3 rounded-xl border border-brand-500 bg-brand-500/20 text-white text-center transition-all" data-device="pixel">
<i data-feather="smartphone" class="mx-auto mb-1 h-5 w-5"></i>
<span class="text-xs font-bold block">Pixel 7</span>
</button>
<button class="device-btn p-3 rounded-xl border border-gray-700 bg-dark-card text-gray-400 hover:text-white hover:border-gray-500 text-center transition-all" data-device="samsung">
<i data-feather="tablet" class="mx-auto mb-1 h-5 w-5"></i>
<span class="text-xs font-bold block">Galaxy S23</span>
</button>
<button class="device-btn p-3 rounded-xl border border-gray-700 bg-dark-card text-gray-400 hover:text-white hover:border-gray-500 text-center transition-all" data-device="fold">
<i data-feather="layers" class="mx-auto mb-1 h-5 w-5"></i>
<span class="text-xs font-bold block">Fold 4</span>
</button>
</div>
</div>
<!-- OS Selection -->
<div>
<label class="block text-sm font-medium text-gray-400 mb-2">Android Version</label>
<div class="flex gap-4">
<label class="flex items-center space-x-2 cursor-pointer">
<input type="radio" name="os" checked class="text-brand-500 focus:ring-brand-500 bg-gray-800 border-gray-600">
<span class="text-white">Android 13</span>
</label>
<label class="flex items-center space-x-2 cursor-pointer">
<input type="radio" name="os" class="text-brand-500 focus:ring-brand-500 bg-gray-800 border-gray-600">
<span class="text-white">Android 14</span>
</label>
</div>
</div>
<!-- Action Button -->
<button id="launch-btn" class="w-full py-4 bg-gradient-to-r from-brand-600 to-purple-600 rounded-xl font-bold text-white text-lg shadow-lg hover:shadow-brand-500/40 hover:scale-[1.02] transition-all duration-300 flex items-center justify-center gap-3">
<i data-feather="power" class="w-5 h-5"></i>
Launch Instance
</button>
<p class="text-xs text-gray-500 text-center mt-2">*Demo mode only. No persistent data.</p>
</div>
</div>
<!-- Phone Visualization -->
<div class="flex justify-center reveal delay-200">
<div class="phone-frame w-[300px] h-[600px] relative transform transition-transform duration-500 hover:rotate-y-12" style="perspective: 1000px;">
<div class="phone-notch"></div>
<!-- Screen Content -->
<div class="w-full h-full bg-gray-900 relative overflow-hidden" id="phone-screen">
<!-- State: Idle/Off -->
<div id="screen-idle" class="w-full h-full flex flex-col items-center justify-center bg-gray-900 text-gray-700">
<i data-feather="power" class="w-16 h-16 mb-4 opacity-50"></i>
<span class="font-mono text-sm">Ready to Launch</span>
</div>
<!-- State: Booting -->
<div id="screen-boot" class="boot-screen hidden">
<div class="android-logo mb-6"></div>
<div class="text-green-400 font-mono text-sm animate-pulse">Starting Android...</div>
<div class="w-48 h-1 bg-gray-800 rounded-full mt-4 overflow-hidden">
<div class="h-full bg-green-400 animate-[width_2s_ease-in-out_infinite]" style="width: 50%"></div>
</div>
</div>
<!-- State: Home -->
<div id="screen-home" class="w-full h-full bg-[url('https://images.unsplash.com/photo-1550684848-fac1c5b4e853?q=80&w=1000&auto=format&fit=crop')] bg-cover bg-center hidden">
<div class="absolute inset-0 bg-black/20"></div>
<!-- Status Bar -->
<div class="absolute top-2 w-full px-6 flex justify-between text-white text-xs font-bold pt-2">
<span>12:45</span>
<div class="flex gap-1">
<i data-feather="wifi" class="w-3 h-3"></i>
<i data-feather="battery-charging" class="w-3 h-3"></i>
</div>
</div>
<!-- Home Apps -->
<div class="absolute bottom-10 w-full flex justify-center gap-6">
<div class="flex flex-col items-center gap-1">
<div class="w-12 h-12 rounded-2xl bg-white/20 backdrop-blur-md flex items-center justify-center border border-white/30 shadow-lg">
<i data-feather="message-square" class="text-white"></i>
</div>
</div>
<div class="flex flex-col items-center gap-1">
<div class="w-14 h-14 rounded-2xl bg-gradient-to-br from-brand-500 to-brand-accent flex items-center justify-center shadow-lg border border-white/20">
<i data-feather="chrome" class="text-white"></i>
</div>
</div>
<div class="flex flex-col items-center gap-1">
<div class="w-12 h-12 rounded-2xl bg-white/20 backdrop-blur-md flex items-center justify-center border border-white/30 shadow-lg">
<i data-feather="camera" class="text-white"></i>
</div>
</div>
</div>
<!-- Dock -->
<div class="absolute bottom-2 w-full flex justify-center pb-4">
<div class="w-32 h-1 bg-white/50 rounded-full"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Pricing Section -->
<section id="pricing" class="py-24 bg-dark-bg">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16">
<h2 class="text-4xl font-bold text-white mb-4">Simple, Transparent Pricing</h2>
<p class="text-gray-400">Pay only for the minutes you use.</p>
</div>
<div class="grid md:grid-cols-3 gap-8 max-w-5xl mx-auto">
<!-- Free Tier -->
<div class="glass p-8 rounded-2xl border border-gray-800 hover:border-gray-600 transition-colors">
<h3 class="text-xl font-bold text-white">Hobbyist</h3>
<div class="text-4xl font-bold text-white mt-4 mb-2">$0<span class="text-lg text-gray-500 font-normal">/mo</span></div>
<p class="text-gray-400 text-sm mb-6">Perfect for casual testing.</p>
<ul class="space-y-3 mb-8 text-gray-300 text-sm">
<li class="flex items-center gap-2"><i data-feather="check" class="w-4 h-4 text-green-400"></i> 5 Hours / Month</li>
<li class="flex items-center gap-2"><i data-feather="check" class="w-4 h-4 text-green-400"></i> Standard Devices</li>
<li class="flex items-center gap-2"><i data-feather="check" class="w-4 h-4 text-green-400"></i> Community Support</li>
</ul>
<button class="w-full py-3 rounded-xl border border-gray-600 text-white hover:bg-white/5 transition-colors font-semibold">Start Free</button>
</div>
<!-- Pro Tier -->
<div class="glass p-8 rounded-2xl border-2 border-brand-500 relative transform scale-105 shadow-xl shadow-brand-500/10">
<div class="absolute top-0 right-0 bg-brand-600 text-white text-xs font-bold px-3 py-1 rounded-bl-lg rounded-tr-lg">POPULAR</div>
<h3 class="text-xl font-bold text-white">Developer</h3>
<div class="text-4xl font-bold text-white mt-4 mb-2">$29<span class="text-lg text-gray-500 font-normal">/mo</span></div>
<p class="text-gray-400 text-sm mb-6">For serious mobile devs.</p>
<ul class="space-y-3 mb-8 text-gray-300 text-sm">
<li class="flex items-center gap-2"><i data-feather="check" class="w-4 h-4 text-brand-400"></i> 50 Hours / Month</li>
<li class="flex items-center gap-2"><i data-feather="check" class="w-4 h-4 text-brand-400"></i> Premium Devices (Foldables)</li>
<li class="flex items-center gap-2"><i data-feather="check" class="w-4 h-4 text-brand-400"></i> ADB Access</li>
<li class="flex items-center gap-2"><i data-feather="check" class="w-4 h-4 text-brand-400"></i> Priority Support</li>
</ul>
<button class="w-full py-3 rounded-xl bg-brand-600 text-white hover:bg-brand-500 transition-colors font-semibold shadow-lg shadow-brand-500/20">Get Started</button>
</div>
<!-- Enterprise Tier -->
<div class="glass p-8 rounded-2xl border border-gray-800 hover:border-gray-600 transition-colors">
<h3 class="text-xl font-bold text-white">Team</h3>
<div class="text-4xl font-bold text-white mt-4 mb-2">Custom</div>
<p class="text-gray-400 text-sm mb-6">For large organizations.</p>
<ul class="space-y-3 mb-8 text-gray-300 text-sm">
<li class="flex items-center gap-2"><i data-feather="check" class="w-4 h-4 text-green-400"></i> Unlimited Hours</li>
<li class="flex items-center gap-2"><i data-feather="check" class="w-4 h-4 text-green-400"></i> Dedicated Hardware</li>
<li class="flex items-center gap-2"><i data-feather="check" class="w-4 h-4 text-green-400"></i> SSO & Audit Logs</li>
<li class="flex items-center gap-2"><i data-feather="check" class="w-4 h-4 text-green-400"></i> SLA Guarantee</li>
</ul>
<button class="w-full py-3 rounded-xl border border-gray-600 text-white hover:bg-white/5 transition-colors font-semibold">Contact Sales</button>
</div>
</div>
</div>
</section>
<!-- Footer -->
<footer class="bg-dark-card border-t border-gray-800 pt-16 pb-8">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid md:grid-cols-4 gap-12 mb-12">
<div class="col-span-1 md:col-span-2">
<div class="flex items-center space-x-2 mb-4">
<i data-feather="cpu" class="text-brand-500 w-6 h-6"></i>
<span class="text-xl font-bold text-white">DroidDrop</span>
</div>
<p class="text-gray-400 max-w-sm">
The next generation of mobile testing infrastructure.
Secure, fast, and accessible from anywhere in the world.
</p>
</div>
<div>
<h4 class="text-white font-bold mb-4">Platform</h4>
<ul class="space-y-2 text-gray-400 text-sm">
<li><a href="#" class="hover:text-brand-400 transition-colors">Features</a></li>
<li><a href="#" class="hover:text-brand-400 transition-colors">Device Grid</a></li>
<li><a href="#" class="hover:text-brand-400 transition-colors">Pricing</a></li>
<li><a href="#" class="hover:text-brand-400 transition-colors">API</a></li>
</ul>
</div>
<div>
<h4 class="text-white font-bold mb-4">Company</h4>
<ul class="space-y-2 text-gray-400 text-sm">
<li><a href="#" class="hover:text-brand-400 transition-colors">About</a></li>
<li><a href="#" class="hover:text-brand-400 transition-colors">Blog</a></li>
<li><a href="#" class="hover:text-brand-400 transition-colors">Careers</a></li>
<li><a href="#" class="hover:text-brand-400 transition-colors">Legal</a></li>
</ul>
</div>
</div>
<div class="border-t border-gray-800 pt-8 flex flex-col md:flex-row justify-between items-center gap-4">
<p class="text-gray-500 text-sm">&copy; 2024 DroidDrop Inc. All rights reserved.</p>
<div class="flex space-x-4">
<a href="#" class="text-gray-500 hover:text-white transition-colors"><i data-feather="twitter" class="w-5 h-5"></i></a>
<a href="#" class="text-gray-500 hover:text-white transition-colors"><i data-feather="github" class="w-5 h-5"></i></a>
<a href="#" class="text-gray-500 hover:text-white transition-colors"><i data-feather="linkedin" class="w-5 h-5"></i></a>
</div>
</div>
</div>
</footer>
<!-- JavaScript Logic -->
<script>
// Feather Icons Init
feather.replace();
// --- Canvas Background Animation ---
const canvas = document.getElementById('bg-canvas');
const ctx = canvas.getContext('2d');
let width, height;
let particles = [];
function resize() {
width = canvas.width = window.innerWidth;
height = canvas.height = window.innerHeight;
}
class Particle {
constructor() {
this.x = Math.random() * width;
this.y = Math.random() * height;
this.vx = (Math.random() - 0.5) * 0.5;
this.vy = (Math.random() - 0.5) * 0.5;
this.size = Math.random() * 2;
}
update() {
this.x += this.vx;
this.y += this.vy;
if (this.x < 0 || this.x > width) this.vx *= -1;
if (this.y < 0 || this.y > height) this.vy *= -1;
}
draw() {
ctx.fillStyle = 'rgba(99, 102, 241, 0.5)'; // Indigo color
ctx.beginPath();
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
ctx.fill();
}
}
function initParticles() {
particles = [];
for (let i = 0; i < 50; i++) particles.push(new Particle());
}
function animateParticles() {
ctx.clearRect(0, 0, width, height);
for (let i = 0; i < particles.length; i++) {
particles[i].update();
particles[i].draw();
for (let j = i; j < particles.length; j++) {
const dx = particles[i].x - particles[j].x;
const dy = particles[i].y - particles[j].y;
const dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 150) {
ctx.strokeStyle = `rgba(99, 102, 241, ${0.1 - dist/1500})`;
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(particles[i].x, particles[i].y);
ctx.lineTo(particles[j].x, particles[j].y);
ctx.stroke();
}
}
}
requestAnimationFrame(animateParticles);
}
window.addEventListener('resize', () => { resize(); initParticles(); });
resize();
initParticles();
animateParticles();
// --- Scroll Reveal Animation ---
const observerOptions = { threshold: 0.1 };
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('active');
}
});
}, observerOptions);
document.querySelectorAll('.reveal').forEach(el => observer.observe(el));
// --- Navbar Scroll Effect ---
const navbar = document.getElementById('navbar');
window.addEventListener('scroll', () => {
if (window.scrollY > 20) {
navbar.classList.add('shadow-lg');
navbar.style.background = 'rgba(15, 23, 42, 0.9)';
} else {
navbar.classList.remove('shadow-lg');
navbar.style.background = 'rgba(30, 41, 59, 0.7)';
}
});
// --- Mobile Menu Toggle ---
const mobileBtn = document.getElementById('mobile-menu-btn');
const mobileMenu = document.getElementById('mobile-menu');
mobileBtn.addEventListener('click', () => {
mobileMenu.classList.toggle('hidden');
});
// --- Emulator Simulation Logic ---
const launchBtn = document.getElementById('launch-btn');
const screenIdle = document.getElementById('screen-idle');
const screenBoot = document.getElementById('screen-boot');
const screenHome = document.getElementById('screen-home');
let isRunning = false;
launchBtn.addEventListener('click', () => {
if (isRunning) return;
isRunning = true;
// UI Feedback
const originalText = launchBtn.innerHTML;
launchBtn.innerHTML = `<i data-feather="loader" class="animate-spin w-5 h-5"></i> Booting...`;
feather.replace();
launchBtn.classList.add('opacity-75', 'cursor-not-allowed');
// 1. Hide Idle, Show Boot
screenIdle.classList.add('hidden');
screenBoot.classList.remove('hidden');
screenHome.classList.add('hidden');
// 2. Wait for boot sequence (3 seconds)
setTimeout(() => {
// 3. Show Home Screen
screenBoot.classList.add('hidden');
screenHome.classList.remove('hidden');
// Reset Button
launchBtn.innerHTML = `<i data-feather="refresh-cw" class="w-5 h-5"></i> Restart`;
launchBtn.classList.remove('opacity-75', 'cursor-not-allowed');
feather.replace();
isRunning = false;
}, 3000);
});
// Device Selection Styling
const deviceBtns = document.querySelectorAll('.device-btn');
deviceBtns.forEach(btn => {
btn.addEventListener('click', () => {
deviceBtns.forEach(b => {
b.classList.remove('border-brand-500', 'bg-brand-500/20', 'text-white');
b.classList.add('border-gray-700', 'bg-dark-card', 'text-gray-400');
});
btn.classList.remove('border-gray-700', 'bg-dark-card', 'text-gray-400');
btn.classList.add('border-brand-500', 'bg-brand-500/20', 'text-white');
});
});
</script>
</body>
</html>