snet / index.html
lpetrov's picture
undefined - Initial Deployment
423e9b6 verified
<!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">
<!-- Sidebar -->
<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>
<!-- Main Content -->
<div class="flex-1 overflow-auto">
<!-- Top Navigation -->
<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>
<!-- Dashboard Content -->
<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>
<!-- Stats Cards -->
<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>
<!-- Recent Projects -->
<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>
<!-- Quick Actions -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<!-- Video Upload Card -->
<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>
<!-- New Project Card -->
<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">
<!-- Classes will be added here -->
</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>
// Mobile menu toggle
document.querySelector('.md\\:hidden button').addEventListener('click', function() {
document.querySelector('.hidden.md\\:flex').classList.toggle('hidden');
});
// Dropzone functionality
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>
`;
// Simulate upload progress
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);
}
}
// Class management for new project
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 = '';
// Add remove functionality
classTag.querySelector('button').addEventListener('click', function() {
classTag.remove();
});
}
});
// Allow pressing Enter to add class
classInput.addEventListener('keypress', function(e) {
if (e.key === 'Enter') {
e.preventDefault();
addClassBtn.click();
}
});
// Animate sidebar icons on hover
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>