| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>SNET - Object Detection Platform</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
| <style> |
| .gradient-bg { |
| background: linear-gradient(135deg, #6e8efb, #a777e3); |
| } |
| .sidebar-item:hover .sidebar-icon { |
| transform: translateX(5px); |
| } |
| .progress-ring__circle { |
| transition: stroke-dashoffset 0.35s; |
| transform: rotate(-90deg); |
| transform-origin: 50% 50%; |
| } |
| .dropzone { |
| border: 2px dashed #a0aec0; |
| transition: all 0.3s ease; |
| } |
| .dropzone.active { |
| border-color: #4fd1c5; |
| background-color: rgba(79, 209, 197, 0.1); |
| } |
| .fade-in { |
| animation: fadeIn 0.5s ease-in-out; |
| } |
| @keyframes fadeIn { |
| from { opacity: 0; transform: translateY(10px); } |
| to { opacity: 1; transform: translateY(0); } |
| } |
| </style> |
| </head> |
| <body class="bg-gray-50 font-sans"> |
| <div class="flex h-screen overflow-hidden"> |
| |
| <div class="hidden md:flex md:flex-shrink-0"> |
| <div class="flex flex-col w-64 gradient-bg text-white"> |
| <div class="flex items-center justify-center h-16 px-4"> |
| <div class="flex items-center"> |
| <i class="fas fa-eye text-2xl mr-2"></i> |
| <span class="text-xl font-bold">SNET</span> |
| </div> |
| </div> |
| <div class="flex flex-col flex-grow px-4 py-4 overflow-y-auto"> |
| <div class="space-y-1"> |
| <a href="#" class="sidebar-item flex items-center px-2 py-3 text-sm font-medium rounded-md text-white bg-black bg-opacity-20"> |
| <i class="sidebar-icon fas fa-home mr-3 transition-transform"></i> |
| Dashboard |
| </a> |
| <a href="#" class="sidebar-item flex items-center px-2 py-3 text-sm font-medium rounded-md text-white hover:bg-black hover:bg-opacity-20"> |
| <i class="sidebar-icon fas fa-project-diagram mr-3 transition-transform"></i> |
| Projects |
| </a> |
| <a href="#" class="sidebar-item flex items-center px-2 py-3 text-sm font-medium rounded-md text-white hover:bg-black hover:bg-opacity-20"> |
| <i class="sidebar-icon fas fa-video mr-3 transition-transform"></i> |
| Video Management |
| </a> |
| <a href="#" class="sidebar-item flex items-center px-2 py-3 text-sm font-medium rounded-md text-white hover:bg-black hover:bg-opacity-20"> |
| <i class="sidebar-icon fas fa-draw-polygon mr-3 transition-transform"></i> |
| Annotation |
| </a> |
| <a href="#" class="sidebar-item flex items-center px-2 py-3 text-sm font-medium rounded-md text-white hover:bg-black hover:bg-opacity-20"> |
| <i class="sidebar-icon fas fa-robot mr-3 transition-transform"></i> |
| Model Training |
| </a> |
| <a href="#" class="sidebar-item flex items-center px-2 py-3 text-sm font-medium rounded-md text-white hover:bg-black hover:bg-opacity-20"> |
| <i class="sidebar-icon fas fa-chart-line mr-3 transition-transform"></i> |
| Validation |
| </a> |
| </div> |
| <div class="mt-auto mb-4"> |
| <div class="p-4 bg-black bg-opacity-20 rounded-lg"> |
| <h4 class="text-sm font-medium mb-2">Storage Usage</h4> |
| <div class="flex items-center"> |
| <div class="w-12 h-12 mr-3"> |
| <svg class="progress-ring" width="48" height="48"> |
| <circle class="progress-ring__circle" stroke="#4fd1c5" stroke-width="4" fill="transparent" r="20" cx="24" cy="24" stroke-dasharray="125.6" stroke-dashoffset="62.8"></circle> |
| </svg> |
| </div> |
| <div> |
| <p class="text-sm">50% used</p> |
| <p class="text-xs text-gray-300">250MB of 500MB</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="flex-1 overflow-auto"> |
| |
| <div class="flex items-center justify-between h-16 px-4 bg-white border-b border-gray-200"> |
| <div class="flex items-center md:hidden"> |
| <button class="text-gray-500 focus:outline-none"> |
| <i class="fas fa-bars"></i> |
| </button> |
| </div> |
| <div class="flex-1 max-w-md ml-4 md:ml-0"> |
| <div class="relative"> |
| <div class="absolute inset-y-0 left-0 flex items-center pl-3"> |
| <i class="fas fa-search text-gray-400"></i> |
| </div> |
| <input class="block w-full pl-10 pr-3 py-2 border border-gray-300 rounded-md leading-5 bg-white placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:border-purple-500 sm:text-sm" placeholder="Search projects..." type="search"> |
| </div> |
| </div> |
| <div class="flex items-center"> |
| <button class="p-1 text-gray-400 rounded-full hover:text-gray-500 focus:outline-none focus:ring-2 focus:ring-purple-500"> |
| <i class="fas fa-bell"></i> |
| </button> |
| <div class="ml-3 relative"> |
| <div> |
| <button class="flex items-center max-w-xs text-sm rounded-full focus:outline-none focus:ring-2 focus:ring-purple-500" id="user-menu"> |
| <img class="h-8 w-8 rounded-full" src="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=2&w=256&h=256&q=80" alt=""> |
| </button> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="p-6"> |
| <div class="flex justify-between items-center mb-6"> |
| <h2 class="text-2xl font-bold text-gray-800">Dashboard</h2> |
| <button class="px-4 py-2 bg-purple-600 text-white rounded-md hover:bg-purple-700 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2"> |
| <i class="fas fa-plus mr-2"></i> New Project |
| </button> |
| </div> |
|
|
| |
| <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-6"> |
| <div class="bg-white rounded-lg shadow p-6"> |
| <div class="flex items-center"> |
| <div class="p-3 rounded-full bg-purple-100 text-purple-600 mr-4"> |
| <i class="fas fa-project-diagram"></i> |
| </div> |
| <div> |
| <p class="text-sm font-medium text-gray-500">Active Projects</p> |
| <p class="text-2xl font-semibold text-gray-800">12</p> |
| </div> |
| </div> |
| </div> |
| <div class="bg-white rounded-lg shadow p-6"> |
| <div class="flex items-center"> |
| <div class="p-3 rounded-full bg-blue-100 text-blue-600 mr-4"> |
| <i class="fas fa-video"></i> |
| </div> |
| <div> |
| <p class="text-sm font-medium text-gray-500">Videos Uploaded</p> |
| <p class="text-2xl font-semibold text-gray-800">47</p> |
| </div> |
| </div> |
| </div> |
| <div class="bg-white rounded-lg shadow p-6"> |
| <div class="flex items-center"> |
| <div class="p-3 rounded-full bg-green-100 text-green-600 mr-4"> |
| <i class="fas fa-robot"></i> |
| </div> |
| <div> |
| <p class="text-sm font-medium text-gray-500">Trained Models</p> |
| <p class="text-2xl font-semibold text-gray-800">8</p> |
| </div> |
| </div> |
| </div> |
| <div class="bg-white rounded-lg shadow p-6"> |
| <div class="flex items-center"> |
| <div class="p-3 rounded-full bg-yellow-100 text-yellow-600 mr-4"> |
| <i class="fas fa-tasks"></i> |
| </div> |
| <div> |
| <p class="text-sm font-medium text-gray-500">Pending Tasks</p> |
| <p class="text-2xl font-semibold text-gray-800">3</p> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="bg-white rounded-lg shadow overflow-hidden mb-6"> |
| <div class="px-6 py-4 border-b border-gray-200"> |
| <h3 class="text-lg font-medium text-gray-900">Recent Projects</h3> |
| </div> |
| <div class="divide-y divide-gray-200"> |
| <div class="px-6 py-4 hover:bg-gray-50 transition-colors"> |
| <div class="flex items-center justify-between"> |
| <div class="flex items-center"> |
| <div class="flex-shrink-0 h-10 w-10 rounded-full bg-purple-100 flex items-center justify-center text-purple-600"> |
| <i class="fas fa-box"></i> |
| </div> |
| <div class="ml-4"> |
| <div class="text-sm font-medium text-gray-900">Package Detection</div> |
| <div class="text-sm text-gray-500">Last trained: 2 days ago</div> |
| </div> |
| </div> |
| <div class="flex items-center"> |
| <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800"> |
| Active |
| </span> |
| <button class="ml-4 text-gray-400 hover:text-gray-500"> |
| <i class="fas fa-ellipsis-v"></i> |
| </button> |
| </div> |
| </div> |
| </div> |
| <div class="px-6 py-4 hover:bg-gray-50 transition-colors"> |
| <div class="flex items-center justify-between"> |
| <div class="flex items-center"> |
| <div class="flex-shrink-0 h-10 w-10 rounded-full bg-blue-100 flex items-center justify-center text-blue-600"> |
| <i class="fas fa-user"></i> |
| </div> |
| <div class="ml-4"> |
| <div class="text-sm font-medium text-gray-900">Person Detection</div> |
| <div class="text-sm text-gray-500">Last trained: 1 week ago</div> |
| </div> |
| </div> |
| <div class="flex items-center"> |
| <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-green-100 text-green-800"> |
| Active |
| </span> |
| <button class="ml-4 text-gray-400 hover:text-gray-500"> |
| <i class="fas fa-ellipsis-v"></i> |
| </button> |
| </div> |
| </div> |
| </div> |
| <div class="px-6 py-4 hover:bg-gray-50 transition-colors"> |
| <div class="flex items-center justify-between"> |
| <div class="flex items-center"> |
| <div class="flex-shrink-0 h-10 w-10 rounded-full bg-yellow-100 flex items-center justify-center text-yellow-600"> |
| <i class="fas fa-car"></i> |
| </div> |
| <div class="ml-4"> |
| <div class="text-sm font-medium text-gray-900">Vehicle Detection</div> |
| <div class="text-sm text-gray-500">Training in progress</div> |
| </div> |
| </div> |
| <div class="flex items-center"> |
| <span class="px-2 inline-flex text-xs leading-5 font-semibold rounded-full bg-yellow-100 text-yellow-800"> |
| Processing |
| </span> |
| <button class="ml-4 text-gray-400 hover:text-gray-500"> |
| <i class="fas fa-ellipsis-v"></i> |
| </button> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="px-6 py-4 bg-gray-50 text-right"> |
| <a href="#" class="text-sm font-medium text-purple-600 hover:text-purple-500">View all projects</a> |
| </div> |
| </div> |
|
|
| |
| <div class="grid grid-cols-1 md:grid-cols-2 gap-6"> |
| |
| <div class="bg-white rounded-lg shadow overflow-hidden fade-in"> |
| <div class="px-6 py-4 border-b border-gray-200"> |
| <h3 class="text-lg font-medium text-gray-900">Upload Training Videos</h3> |
| </div> |
| <div class="px-6 py-4"> |
| <div id="dropzone" class="dropzone rounded-lg p-8 text-center cursor-pointer"> |
| <div class="flex flex-col items-center justify-center"> |
| <i class="fas fa-cloud-upload-alt text-4xl text-gray-400 mb-3"></i> |
| <p class="text-sm text-gray-600">Drag and drop your videos here, or click to browse</p> |
| <p class="text-xs text-gray-500 mt-1">Supports MP4, MOV, AVI up to 2GB</p> |
| </div> |
| <input type="file" id="file-upload" class="hidden" multiple accept="video/mp4,video/quicktime,video/x-msvideo"> |
| </div> |
| <div id="upload-progress" class="mt-4 hidden"> |
| <div class="flex justify-between text-sm text-gray-600 mb-1"> |
| <span>package_delivery.mp4</span> |
| <span>45%</span> |
| </div> |
| <div class="w-full bg-gray-200 rounded-full h-2.5"> |
| <div class="bg-purple-600 h-2.5 rounded-full" style="width: 45%"></div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="bg-white rounded-lg shadow overflow-hidden fade-in"> |
| <div class="px-6 py-4 border-b border-gray-200"> |
| <h3 class="text-lg font-medium text-gray-900">Create New Project</h3> |
| </div> |
| <div class="px-6 py-4"> |
| <form> |
| <div class="mb-4"> |
| <label for="project-name" class="block text-sm font-medium text-gray-700 mb-1">Project Name</label> |
| <input type="text" id="project-name" class="block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-purple-500 focus:border-purple-500 sm:text-sm" placeholder="e.g. Package Detection"> |
| </div> |
| <div class="mb-4"> |
| <label for="detection-classes" class="block text-sm font-medium text-gray-700 mb-1">Detection Classes</label> |
| <div class="flex flex-wrap gap-2 mb-2" id="classes-container"> |
| |
| </div> |
| <div class="flex"> |
| <input type="text" id="class-input" class="block w-full px-3 py-2 border border-gray-300 rounded-l-md shadow-sm focus:outline-none focus:ring-purple-500 focus:border-purple-500 sm:text-sm" placeholder="Add a class (e.g. 'package')"> |
| <button type="button" id="add-class" class="px-4 py-2 bg-purple-600 text-white rounded-r-md hover:bg-purple-700 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2"> |
| Add |
| </button> |
| </div> |
| </div> |
| <div class="mb-4"> |
| <label for="frame-frequency" class="block text-sm font-medium text-gray-700 mb-1">Frame Frequency</label> |
| <select id="frame-frequency" class="block w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm focus:outline-none focus:ring-purple-500 focus:border-purple-500 sm:text-sm"> |
| <option value="1">Every frame</option> |
| <option value="5" selected>Every 5 frames</option> |
| <option value="10">Every 10 frames</option> |
| <option value="30">Every 30 frames</option> |
| </select> |
| </div> |
| <button type="submit" class="w-full px-4 py-2 bg-purple-600 text-white rounded-md hover:bg-purple-700 focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2"> |
| Create Project |
| </button> |
| </form> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| <script> |
| |
| document.querySelector('.md\\:hidden button').addEventListener('click', function() { |
| document.querySelector('.hidden.md\\:flex').classList.toggle('hidden'); |
| }); |
| |
| |
| const dropzone = document.getElementById('dropzone'); |
| const fileInput = document.getElementById('file-upload'); |
| const uploadProgress = document.getElementById('upload-progress'); |
| |
| dropzone.addEventListener('click', () => fileInput.click()); |
| |
| ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { |
| dropzone.addEventListener(eventName, preventDefaults, false); |
| }); |
| |
| function preventDefaults(e) { |
| e.preventDefault(); |
| e.stopPropagation(); |
| } |
| |
| ['dragenter', 'dragover'].forEach(eventName => { |
| dropzone.addEventListener(eventName, highlight, false); |
| }); |
| |
| ['dragleave', 'drop'].forEach(eventName => { |
| dropzone.addEventListener(eventName, unhighlight, false); |
| }); |
| |
| function highlight() { |
| dropzone.classList.add('active'); |
| } |
| |
| function unhighlight() { |
| dropzone.classList.remove('active'); |
| } |
| |
| dropzone.addEventListener('drop', handleDrop, false); |
| |
| function handleDrop(e) { |
| const dt = e.dataTransfer; |
| const files = dt.files; |
| handleFiles(files); |
| } |
| |
| fileInput.addEventListener('change', function() { |
| handleFiles(this.files); |
| }); |
| |
| function handleFiles(files) { |
| if (files.length > 0) { |
| uploadProgress.classList.remove('hidden'); |
| dropzone.innerHTML = ` |
| <div class="flex items-center justify-center"> |
| <i class="fas fa-check-circle text-green-500 text-4xl mr-3"></i> |
| <div> |
| <p class="text-sm font-medium text-gray-900">${files.length} file(s) selected</p> |
| <p class="text-xs text-gray-500">Ready to upload</p> |
| </div> |
| </div> |
| `; |
| |
| |
| let progress = 0; |
| const interval = setInterval(() => { |
| progress += Math.random() * 10; |
| if (progress >= 100) { |
| progress = 100; |
| clearInterval(interval); |
| setTimeout(() => { |
| uploadProgress.classList.add('hidden'); |
| dropzone.innerHTML = ` |
| <div class="flex flex-col items-center justify-center"> |
| <i class="fas fa-check-circle text-green-500 text-4xl mb-3"></i> |
| <p class="text-sm font-medium text-gray-900">Upload complete!</p> |
| <p class="text-xs text-gray-500">${files.length} file(s) uploaded successfully</p> |
| </div> |
| `; |
| }, 500); |
| } |
| document.querySelector('.bg-purple-600').style.width = `${progress}%`; |
| document.querySelector('#upload-progress span:last-child').textContent = `${Math.round(progress)}%`; |
| }, 500); |
| } |
| } |
| |
| |
| const classInput = document.getElementById('class-input'); |
| const addClassBtn = document.getElementById('add-class'); |
| const classesContainer = document.getElementById('classes-container'); |
| |
| addClassBtn.addEventListener('click', function() { |
| const className = classInput.value.trim(); |
| if (className) { |
| const classTag = document.createElement('div'); |
| classTag.className = 'flex items-center bg-purple-100 text-purple-800 px-3 py-1 rounded-full text-sm'; |
| classTag.innerHTML = ` |
| ${className} |
| <button type="button" class="ml-1 text-purple-600 hover:text-purple-800"> |
| <i class="fas fa-times"></i> |
| </button> |
| `; |
| classesContainer.appendChild(classTag); |
| classInput.value = ''; |
| |
| |
| classTag.querySelector('button').addEventListener('click', function() { |
| classTag.remove(); |
| }); |
| } |
| }); |
| |
| |
| classInput.addEventListener('keypress', function(e) { |
| if (e.key === 'Enter') { |
| e.preventDefault(); |
| addClassBtn.click(); |
| } |
| }); |
| |
| |
| document.querySelectorAll('.sidebar-item').forEach(item => { |
| item.addEventListener('mouseenter', function() { |
| this.querySelector('.sidebar-icon').classList.add('translate-x-1'); |
| }); |
| item.addEventListener('mouseleave', function() { |
| this.querySelector('.sidebar-icon').classList.remove('translate-x-1'); |
| }); |
| }); |
| </script> |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=lpetrov/snet" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
| </html> |