faceseeker-pro / index.html
Robertogdl's picture
Usa deepseek para crear una app funcional para buscar personas en internet usando una foto de su rostro
ad8d311 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FaceSeeker Pro - AI Facial Recognition Search</title>
<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
<script src="https://unpkg.com/feather-icons"></script>
<script src="https://cdn.jsdelivr.net/npm/vanta@latest/dist/vanta.net.min.js"></script>
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
:root {
--primary: #6366f1;
--secondary: #10b981;
}
body {
font-family: 'Inter', sans-serif;
}
.bg-primary-500 { background-color: var(--primary); }
.bg-secondary-500 { background-color: var(--secondary); }
.text-primary-500 { color: var(--primary); }
.text-secondary-500 { color: var(--secondary); }
.border-primary-500 { border-color: var(--primary); }
.border-secondary-500 { border-color: var(--secondary); }
.upload-area {
border: 2px dashed #d1d5db;
transition: all 0.3s ease;
}
.upload-area.dragover {
border-color: var(--primary);
background-color: rgba(99, 102, 241, 0.05);
}
.result-card {
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.result-card:hover {
transform: translateY(-5px);
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
}
.confidence-bar {
background: linear-gradient(90deg, var(--secondary) 0%, var(--primary) 100%);
}
.loading-spinner {
border: 3px solid #f3f4f6;
border-top: 3px solid var(--primary);
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.platform-icon {
width: 24px;
height: 24px;
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
font-size: 12px;
font-weight: 600;
}
</style>
</head>
<body class="bg-gray-50 min-h-screen">
<!-- Animated Background -->
<div id="vanta-bg" class="fixed inset-0 z-0"></div>
<!-- Main Content -->
<div class="relative z-10 min-h-screen flex flex-col">
<!-- Header -->
<header class="bg-white/80 backdrop-blur-lg border-b border-gray-200 sticky top-0 z-20">
<div class="container mx-auto px-4 py-4">
<div class="flex items-center justify-between">
<div class="flex items-center space-x-3">
<div class="w-10 h-10 bg-primary-500 rounded-lg flex items-center justify-center">
<i data-feather="search" class="text-white"></i>
</div>
<h1 class="text-2xl font-bold text-gray-900">FaceSeeker Pro</h1>
</div>
<nav class="hidden md:flex space-x-6">
<a href="#" class="text-gray-700 hover:text-primary-500 font-medium">Home</a>
<a href="#" class="text-gray-700 hover:text-primary-500 font-medium">How It Works</a>
<a href="#" class="text-gray-700 hover:text-primary-500 font-medium">Privacy</a>
<a href="#" class="text-gray-700 hover:text-primary-500 font-medium">Contact</a>
</nav>
<button class="md:hidden">
<i data-feather="menu" class="text-gray-700"></i>
</button>
</div>
</div>
</header>
<!-- Hero Section -->
<section class="flex-1 flex items-center justify-center py-12 px-4">
<div class="max-w-4xl mx-auto text-center">
<h2 class="text-4xl md:text-6xl font-bold text-gray-900 mb-6">
Find Anyone with Just a <span class="text-primary-500">Photo</span>
</h2>
<p class="text-xl text-gray-600 mb-8 max-w-2xl mx-auto">
Upload a facial photograph and let our advanced AI search across multiple platforms to find potential matches with confidence scores.
</p>
<!-- Upload Section -->
<div class="bg-white/80 backdrop-blur-lg rounded-2xl shadow-xl p-8 mb-8">
<div id="uploadArea" class="upload-area rounded-xl p-8 text-center cursor-pointer">
<div class="w-16 h-16 bg-primary-100 rounded-full flex items-center justify-center mx-auto mb-4">
<i data-feather="upload" class="text-primary-500 w-8 h-8"></i>
</div>
<h3 class="text-xl font-semibold text-gray-900 mb-2">Upload Facial Photo</h3>
<p class="text-gray-600 mb-4">Drag & drop your image or click to browse</p>
<input type="file" id="fileInput" class="hidden" accept="image/*">
<button onclick="document.getElementById('fileInput').click()" class="bg-primary-500 text-white px-6 py-3 rounded-lg font-medium hover:bg-primary-600 transition-colors">
Choose File
</button>
<p class="text-sm text-gray-500 mt-4">Supported formats: JPG, PNG, WEBP • Max size: 10MB</p>
</div>
<!-- Preview Section -->
<div id="previewSection" class="hidden mt-6">
<div class="flex items-center justify-between mb-4">
<h4 class="text-lg font-semibold text-gray-900">Image Preview</h4>
<button onclick="clearUpload()" class="text-red-500 hover:text-red-700">
<i data-feather="x" class="w-5 h-5"></i>
</button>
</div>
<div class="flex flex-col md:flex-row items-center gap-6">
<div class="relative">
<img id="imagePreview" class="w-48 h-48 object-cover rounded-lg shadow-md">
<div class="absolute inset-0 bg-black bg-opacity-50 rounded-lg flex items-center justify-center hidden" id="processingOverlay">
<div class="loading-spinner w-8 h-8"></div>
</div>
</div>
<div class="flex-1">
<div class="mb-4">
<label class="block text-sm font-medium text-gray-700 mb-2">Search Platforms</label>
<div class="flex flex-wrap gap-2">
<label class="inline-flex items-center">
<input type="checkbox" class="rounded border-gray-300 text-primary-500" checked>
<span class="ml-2 text-sm">Social Media</span>
</label>
<label class="inline-flex items-center">
<input type="checkbox" class="rounded border-gray-300 text-primary-500" checked>
<span class="ml-2 text-sm">Professional Networks</span>
</label>
<label class="inline-flex items-center">
<input type="checkbox" class="rounded border-gray-300 text-primary-500">
<span class="ml-2 text-sm">Public Records</span>
</label>
</div>
</div>
<button onclick="startSearch()" class="w-full bg-primary-500 text-white py-3 rounded-lg font-medium hover:bg-primary-600 transition-colors flex items-center justify-center gap-2">
<i data-feather="search" class="w-5 h-5"></i>
Start Deep Search
</button>
</div>
</div>
</div>
</div>
<!-- Features Grid -->
<div class="grid md:grid-cols-3 gap-6 mb-12">
<div class="bg-white/80 backdrop-blur-lg rounded-xl p-6 text-center">
<div class="w-12 h-12 bg-secondary-100 rounded-full flex items-center justify-center mx-auto mb-4">
<i data-feather="shield" class="text-secondary-500"></i>
</div>
<h4 class="font-semibold text-gray-900 mb-2">Secure & Private</h4>
<p class="text-gray-600 text-sm">Your data is encrypted and never stored on our servers</p>
</div>
<div class="bg-white/80 backdrop-blur-lg rounded-xl p-6 text-center">
<div class="w-12 h-12 bg-primary-100 rounded-full flex items-center justify-center mx-auto mb-4">
<i data-feather="zap" class="text-primary-500"></i>
</div>
<h4 class="font-semibold text-gray-900 mb-2">AI-Powered</h4>
<p class="text-gray-600 text-sm">Advanced facial recognition with DeepSeek technology</p>
</div>
<div class="bg-white/80 backdrop-blur-lg rounded-xl p-6 text-center">
<div class="w-12 h-12 bg-secondary-100 rounded-full flex items-center justify-center mx-auto mb-4">
<i data-feather="globe" class="text-secondary-500"></i>
</div>
<h4 class="font-semibold text-gray-900 mb-2">Multi-Platform</h4>
<p class="text-gray-600 text-sm">Search across dozens of online platforms simultaneously</p>
</div>
</div>
</div>
</section>
<!-- Results Section -->
<section id="resultsSection" class="hidden bg-white/90 backdrop-blur-lg py-12 px-4">
<div class="container mx-auto max-w-6xl">
<div class="flex items-center justify-between mb-8">
<h2 class="text-3xl font-bold text-gray-900">Search Results</h2>
<div class="flex items-center gap-4">
<span class="text-sm text-gray-600">Sort by:</span>
<select class="border border-gray-300 rounded-lg px-3 py-2 text-sm">
<option>Confidence Score</option>
<option>Platform</option>
<option>Recency</option>
</select>
</div>
</div>
<!-- Results Grid -->
<div id="resultsGrid" class="grid md:grid-cols-2 lg:grid-cols-3 gap-6">
<!-- Results will be populated here -->
</div>
<!-- Loading State -->
<div id="loadingState" class="hidden text-center py-12">
<div class="loading-spinner w-12 h-12 mx-auto mb-4"></div>
<p class="text-gray-600">Searching across platforms...</p>
</div>
<!-- Error State -->
<div id="errorState" class="hidden text-center py-12">
<div class="w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mx-auto mb-4">
<i data-feather="alert-triangle" class="text-red-500"></i>
</div>
<h3 class="text-xl font-semibold text-gray-900 mb-2">Search Failed</h3>
<p class="text-gray-600 mb-4" id="errorMessage"></p>
<button onclick="retrySearch()" class="bg-primary-500 text-white px-6 py-2 rounded-lg font-medium">
Try Again
</button>
</div>
</div>
</section>
<!-- Footer -->
<footer class="bg-gray-900 text-white py-8 mt-auto">
<div class="container mx-auto px-4 text-center">
<p class="text-gray-400">&copy; 2024 FaceSeeker Pro. All rights reserved.</p>
<div class="flex justify-center space-x-6 mt-4">
<a href="#" class="text-gray-400 hover:text-white">Privacy Policy</a>
<a href="#" class="text-gray-400 hover:text-white">Terms of Service</a>
<a href="#" class="text-gray-400 hover:text-white">Contact</a>
</div>
</div>
</footer>
</div>
<script>
// Initialize Vanta.js background
VANTA.NET({
el: "#vanta-bg",
mouseControls: true,
touchControls: true,
gyroControls: false,
minHeight: 200.00,
minWidth: 200.00,
scale: 1.00,
scaleMobile: 1.00,
color: 0x6366f1,
backgroundColor: 0xf8fafc,
points: 12.00,
maxDistance: 22.00,
spacing: 18.00
});
// File upload handling
const fileInput = document.getElementById('fileInput');
const uploadArea = document.getElementById('uploadArea');
const previewSection = document.getElementById('previewSection');
const imagePreview = document.getElementById('imagePreview');
const resultsSection = document.getElementById('resultsSection');
const resultsGrid = document.getElementById('resultsGrid');
const loadingState = document.getElementById('loadingState');
const errorState = document.getElementById('errorState');
const processingOverlay = document.getElementById('processingOverlay');
// Drag and drop functionality
uploadArea.addEventListener('dragover', (e) => {
e.preventDefault();
uploadArea.classList.add('dragover');
});
uploadArea.addEventListener('dragleave', () => {
uploadArea.classList.remove('dragover');
});
uploadArea.addEventListener('drop', (e) => {
e.preventDefault();
uploadArea.classList.remove('dragover');
const files = e.dataTransfer.files;
if (files.length > 0) {
handleFileSelect(files[0]);
}
});
fileInput.addEventListener('change', (e) => {
if (e.target.files.length > 0) {
handleFileSelect(e.target.files[0]);
}
});
function handleFileSelect(file) {
if (!file.type.match('image.*')) {
showError('Please select a valid image file (JPG, PNG, WEBP)');
return;
}
if (file.size > 10 * 1024 * 1024) {
showError('File size must be less than 10MB');
return;
}
const reader = new FileReader();
reader.onload = (e) => {
imagePreview.src = e.target.result;
previewSection.classList.remove('hidden');
uploadArea.classList.add('hidden');
};
reader.readAsDataURL(file);
}
function clearUpload() {
fileInput.value = '';
previewSection.classList.add('hidden');
uploadArea.classList.remove('hidden');
resultsSection.classList.add('hidden');
}
function startSearch() {
processingOverlay.classList.remove('hidden');
loadingState.classList.remove('hidden');
resultsSection.classList.remove('hidden');
errorState.classList.add('hidden');
// Simulate API call delay
setTimeout(() => {
processingOverlay.classList.add('hidden');
loadingState.classList.add('hidden');
displayResults(generateMockResults());
}, 3000);
}
function retrySearch() {
startSearch();
}
function showError(message) {
errorState.classList.remove('hidden');
document.getElementById('errorMessage').textContent = message;
loadingState.classList.add('hidden');
resultsSection.classList.remove('hidden');
}
function generateMockResults() {
return [
{
name: "Alex Johnson",
confidence: 92,
platform: "LinkedIn",
image: "http://static.photos/people/200x200/1",
profileUrl: "#",
lastSeen: "2 days ago"
},
{
name: "Alexandra Johnson",
confidence: 87,
platform: "Facebook",
image: "http://static.photos/people/200x200/2",
profileUrl: "#",
lastSeen: "1 week ago"
},
{
name: "Alex J.",
confidence: 78,
platform: "Instagram",
image: "http://static.photos/people/200x200/3",
profileUrl: "#",
lastSeen: "3 days ago"
},
{
name: "A. Johnson",
confidence: 65,
platform: "Twitter",
image: "http://static.photos/people/200x200/4",
profileUrl: "#",
lastSeen: "1 month ago"
},
{
name: "Alex J. Smith",
confidence: 58,
platform: "GitHub",
image: "http://static.photos/people/200x200/5",
profileUrl: "#",
lastSeen: "2 weeks ago"
},
{
name: "Johnson Alex",
confidence: 45,
platform: "Reddit",
image: "http://static.photos/people/200x200/6",
profileUrl: "#",
last
</body>
</html>