/* Custom styles for SeReact Frontend */ :root { --primary-color: #0d6efd; --secondary-color: #6c757d; --success-color: #198754; --info-color: #0dcaf0; --warning-color: #ffc107; --danger-color: #dc3545; --light-color: #f8f9fa; --dark-color: #212529; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: #f8f9fa; } .navbar-brand { font-weight: bold; font-size: 1.5rem; } .page { min-height: 70vh; } .jumbotron { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border-radius: 15px; } .card { border: none; box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); transition: box-shadow 0.15s ease-in-out; } .card:hover { box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); } .btn { border-radius: 8px; font-weight: 500; transition: all 0.2s ease-in-out; } .btn:hover { transform: translateY(-1px); } .image-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 1rem; margin-top: 1rem; } .image-card { border-radius: 12px; overflow: hidden; transition: transform 0.2s ease-in-out; } .image-card:hover { transform: scale(1.02); } .image-card img { width: 100%; height: 200px; object-fit: cover; } .search-result { border-left: 4px solid var(--primary-color); background-color: white; margin-bottom: 1rem; border-radius: 0 8px 8px 0; } .similarity-score { background: linear-gradient(90deg, var(--success-color), var(--warning-color), var(--danger-color)); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; font-weight: bold; } .loading-spinner { display: inline-block; width: 20px; height: 20px; border: 3px solid rgba(255, 255, 255, 0.3); border-radius: 50%; border-top-color: #fff; animation: spin 1s ease-in-out infinite; } @keyframes spin { to { transform: rotate(360deg); } } .alert { border-radius: 8px; border: none; } .modal-content { border-radius: 12px; border: none; } .form-control, .form-select { border-radius: 8px; border: 1px solid #dee2e6; transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; } .form-control:focus, .form-select:focus { border-color: var(--primary-color); box-shadow: 0 0 0 0.2rem rgba(13, 110, 253, 0.25); } .table { border-radius: 8px; overflow: hidden; } .table thead th { background-color: var(--light-color); border-bottom: 2px solid var(--primary-color); font-weight: 600; } .badge { font-size: 0.75em; padding: 0.5em 0.75em; border-radius: 6px; } .nav-link { border-radius: 6px; margin: 0 2px; transition: background-color 0.2s ease-in-out; } .nav-link:hover { background-color: rgba(255, 255, 255, 0.1); } .nav-link.active { background-color: rgba(255, 255, 255, 0.2); } /* Responsive adjustments */ @media (max-width: 768px) { .image-grid { grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); } .jumbotron { padding: 2rem 1rem; } .display-4 { font-size: 2rem; } } /* Custom scrollbar */ ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 4px; } ::-webkit-scrollbar-thumb { background: var(--secondary-color); border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: var(--primary-color); } /* Animation for page transitions */ .page { animation: fadeIn 0.3s ease-in-out; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } /* File upload area */ .upload-area { border: 2px dashed var(--primary-color); border-radius: 12px; padding: 2rem; text-align: center; background-color: rgba(13, 110, 253, 0.05); transition: all 0.2s ease-in-out; cursor: pointer; } .upload-area:hover { background-color: rgba(13, 110, 253, 0.1); border-color: var(--primary-color); } .upload-area.dragover { background-color: rgba(13, 110, 253, 0.15); border-color: var(--primary-color); transform: scale(1.02); } /* Status indicators */ .status-online { color: var(--success-color); } .status-offline { color: var(--danger-color); } .status-pending { color: var(--warning-color); } /* Tag styles */ .tag { display: inline-block; background-color: var(--light-color); color: var(--dark-color); padding: 0.25rem 0.5rem; margin: 0.125rem; border-radius: 12px; font-size: 0.875rem; border: 1px solid var(--secondary-color); } .tag-input { border: none; outline: none; background: transparent; min-width: 100px; } /* Progress bars */ .progress { height: 8px; border-radius: 4px; background-color: var(--light-color); } .progress-bar { border-radius: 4px; } /* Utility classes */ .text-muted-light { color: #6c757d !important; } .bg-gradient-primary { background: linear-gradient(135deg, var(--primary-color), #0056b3); } .bg-gradient-success { background: linear-gradient(135deg, var(--success-color), #146c43); } .bg-gradient-info { background: linear-gradient(135deg, var(--info-color), #0aa2c0); } .shadow-sm-hover:hover { box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; } .cursor-pointer { cursor: pointer; } .user-select-none { user-select: none; }