Spaces:
Running
Running
Usa deepseek para crear una app funcional para buscar personas en internet usando una foto de su rostro
ad8d311 verified | <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">© 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> |