/* EpiPred - Custom Styles */ /* Global Styles */ :root { --primary-color: #007bff; --secondary-color: #6c757d; --success-color: #28a745; --danger-color: #dc3545; --warning-color: #ffc107; --info-color: #17a2b8; --light-color: #f8f9fa; --dark-color: #343a40; --epitope-b-color: #ff6b6b; --epitope-t-color: #4ecdc4; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: #333; } /* Navigation */ .navbar-brand { font-weight: bold; font-size: 1.5rem; } .navbar-brand img { transition: transform 0.3s ease; } .navbar-brand:hover img { transform: scale(1.05); } .navbar-nav .nav-link { font-weight: 500; transition: color 0.3s ease; } .navbar-nav .nav-link:hover { color: rgba(255, 255, 255, 0.8) !important; } /* Logo Styles */ .logo-header { max-height: 80px; width: auto; transition: transform 0.3s ease; } .logo-header:hover { transform: scale(1.02); } .logo-footer { max-height: 40px; width: auto; filter: brightness(0.9); transition: filter 0.3s ease; } .logo-footer:hover { filter: brightness(1.1); } /* Header Section */ .bg-light { background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%) !important; } .display-6 { font-weight: 600; color: var(--dark-color); } .lead { font-size: 1.1rem; } /* Cards */ .card { border: none; border-radius: 10px; transition: transform 0.2s ease, box-shadow 0.2s ease; } .card:hover { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1) !important; } .card-header { border-radius: 10px 10px 0 0 !important; font-weight: 600; border-bottom: none; } .card-body { padding: 1.5rem; } /* Form Elements */ .form-control { border-radius: 8px; border: 2px solid #e9ecef; transition: border-color 0.3s ease, box-shadow 0.3s ease; } .form-control:focus { border-color: var(--primary-color); box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25); } textarea.form-control { resize: vertical; min-height: 120px; } .form-label { font-weight: 600; color: var(--dark-color); margin-bottom: 0.75rem; } .form-text { font-size: 0.875rem; color: var(--secondary-color); } /* Buttons */ .btn { border-radius: 8px; font-weight: 500; padding: 0.5rem 1.5rem; transition: all 0.3s ease; border: none; } .btn-lg { padding: 0.75rem 2rem; font-size: 1.1rem; } .btn-primary { background: linear-gradient(135deg, #007bff 0%, #0056b3 100%); box-shadow: 0 4px 15px rgba(0, 123, 255, 0.3); } .btn-primary:hover { background: linear-gradient(135deg, #0056b3 0%, #004085 100%); transform: translateY(-1px); box-shadow: 0 6px 20px rgba(0, 123, 255, 0.4); } .btn-success { background: linear-gradient(135deg, #28a745 0%, #1e7e34 100%); box-shadow: 0 4px 15px rgba(40, 167, 69, 0.3); } .btn-success:hover { background: linear-gradient(135deg, #1e7e34 0%, #155724 100%); transform: translateY(-1px); box-shadow: 0 6px 20px rgba(40, 167, 69, 0.4); } .btn-outline-secondary { border: 2px solid var(--secondary-color); color: var(--secondary-color); } .btn-outline-secondary:hover { background-color: var(--secondary-color); border-color: var(--secondary-color); transform: translateY(-1px); } /* Alerts */ .alert { border-radius: 8px; border: none; font-weight: 500; } .alert-info { background: linear-gradient(135deg, #d1ecf1 0%, #bee5eb 100%); color: #0c5460; } .alert-success { background: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%); color: #155724; } .alert-danger { background: linear-gradient(135deg, #f8d7da 0%, #f5c6cb 100%); color: #721c24; } /* Sequence Display */ .sequence-display { font-family: 'Courier New', 'Monaco', 'Menlo', monospace; font-size: 14px; line-height: 1.6; word-break: break-all; background: #f8f9fa; padding: 20px; border-radius: 8px; border: 2px solid #e9ecef; max-height: 300px; overflow-y: auto; white-space: pre-wrap; } .epitope-b { background-color: var(--epitope-b-color); color: white; padding: 2px 3px; border-radius: 3px; font-weight: bold; margin: 0 1px; } .epitope-t { background-color: var(--epitope-t-color); color: white; padding: 2px 3px; border-radius: 3px; font-weight: bold; margin: 0 1px; } .non-epitope { color: var(--secondary-color); opacity: 0.7; } /* Confidence Bars */ .confidence-bar { height: 20px; background: linear-gradient(90deg, #dc3545 0%, #ffc107 50%, #28a745 100%); border-radius: 10px; position: relative; overflow: hidden; box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1); } .confidence-indicator { position: absolute; top: 0; left: 0; height: 100%; background: rgba(255, 255, 255, 0.4); border-radius: 10px; transition: width 0.3s ease; box-shadow: 0 0 10px rgba(255, 255, 255, 0.5); } /* Tables */ .table { border-radius: 8px; overflow: hidden; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05); } .table thead th { background-color: var(--light-color); border-bottom: 2px solid #dee2e6; font-weight: 600; color: var(--dark-color); } .table tbody tr { transition: background-color 0.2s ease; } .table tbody tr:hover { background-color: rgba(0, 123, 255, 0.05); } /* Threshold Slider */ .form-range { height: 8px; background: linear-gradient(90deg, #dc3545 0%, #ffc107 50%, #28a745 100%); border-radius: 4px; outline: none; } .form-range::-webkit-slider-thumb { width: 20px; height: 20px; background: #007bff; border-radius: 50%; border: 3px solid white; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2); cursor: pointer; transition: transform 0.2s ease; } .form-range::-webkit-slider-thumb:hover { transform: scale(1.1); } .form-range::-moz-range-thumb { width: 20px; height: 20px; background: #007bff; border-radius: 50%; border: 3px solid white; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2); cursor: pointer; } /* Badges */ .badge { font-size: 0.8rem; padding: 0.5rem 0.75rem; border-radius: 20px; } /* Modal */ .modal-content { border-radius: 10px; border: none; box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2); } .modal-header { border-bottom: 2px solid #e9ecef; background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); border-radius: 10px 10px 0 0; } .modal-title { font-weight: 600; color: var(--dark-color); } /* Code blocks */ pre { background: #f8f9fa; border: 2px solid #e9ecef; border-radius: 8px; padding: 1rem; font-size: 0.9rem; line-height: 1.4; } code { color: #e83e8c; font-size: 0.9rem; } /* Footer */ footer { background: linear-gradient(135deg, #343a40 0%, #212529 100%) !important; } footer h5 { color: #fff; font-weight: 600; } footer p { color: #adb5bd; } /* Responsive Design */ @media (max-width: 768px) { .display-6 { font-size: 1.5rem; } .lead { font-size: 1rem; } .card-body { padding: 1rem; } .sequence-display { font-size: 12px; padding: 15px; } .btn-lg { padding: 0.6rem 1.5rem; font-size: 1rem; } .logo-header { max-height: 60px; } .navbar-brand img { height: 25px; } } @media (max-width: 576px) { .container { padding-left: 15px; padding-right: 15px; } .sequence-display { font-size: 11px; padding: 10px; max-height: 200px; } .table-responsive { font-size: 0.875rem; } .logo-header { max-height: 50px; } .navbar-brand img { height: 20px; } .logo-footer { max-height: 30px; } } /* Loading Animation */ .spinner-border-sm { width: 1rem; height: 1rem; } /* Utility Classes */ .shadow-sm { box-shadow: 0 2px 10px rgba(0, 0, 0, 0.08) !important; } .text-monospace { font-family: 'Courier New', 'Monaco', 'Menlo', monospace !important; } /* Hover Effects */ .epitope-card { transition: all 0.3s ease; } .epitope-card:hover { transform: translateY(-3px); box-shadow: 0 10px 30px rgba(0, 0, 0, 0.15) !important; } /* Custom Scrollbar */ .sequence-display::-webkit-scrollbar { width: 8px; } .sequence-display::-webkit-scrollbar-track { background: #f1f1f1; border-radius: 4px; } .sequence-display::-webkit-scrollbar-thumb { background: #c1c1c1; border-radius: 4px; } .sequence-display::-webkit-scrollbar-thumb:hover { background: #a8a8a8; }