Files
ASF_tools_legacy/asf-cloud-server/testarena_1/app/static/css/style.css

756 lines
12 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

:root {
--primary: #2563eb;
--primary-dark: #1e40af;
--success: #10b981;
--danger: #ef4444;
--warning: #f59e0b;
--dark: #1f2937;
--light: #f3f4f6;
--border: #e5e7eb;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
min-height: 100vh;
}
.container {
max-width: 1400px;
margin: 0 auto;
padding: 20px;
}
/* Login Page */
.login-container {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}
.login-box {
background: white;
padding: 40px;
border-radius: 12px;
box-shadow: 0 10px 40px rgba(0,0,0,0.2);
width: 100%;
max-width: 400px;
}
.logo {
text-align: center;
margin-bottom: 30px;
}
.logo img {
max-width: 120px;
height: auto;
}
.logo h1 {
color: var(--dark);
margin-top: 15px;
font-size: 24px;
}
.form-group {
margin-bottom: 20px;
}
.form-group label {
display: block;
margin-bottom: 8px;
color: var(--dark);
font-weight: 500;
}
.form-control {
width: 100%;
padding: 12px;
border: 2px solid var(--border);
border-radius: 8px;
font-size: 14px;
}
.form-control:focus {
outline: none;
border-color: var(--primary);
}
.btn {
padding: 12px 24px;
border: none;
border-radius: 8px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s;
}
.btn-primary {
background: var(--primary);
color: white;
width: 100%;
}
.btn-primary:hover {
background: var(--primary-dark);
}
.btn-success {
background: var(--success);
color: white;
}
.btn-danger {
background: var(--danger);
color: white;
}
.btn-sm {
padding: 6px 12px;
font-size: 12px;
}
/* Alert Messages */
.alert {
padding: 12px 16px;
border-radius: 8px;
margin-bottom: 20px;
}
.alert-success {
background: #d1fae5;
color: #065f46;
border: 1px solid #10b981;
}
.alert-error {
background: #fee2e2;
color: #991b1b;
border: 1px solid #ef4444;
}
/* Navbar */
.navbar {
background: white;
padding: 15px 30px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
display: flex;
justify-content: space-between;
align-items: center;
}
.navbar-brand {
display: flex;
align-items: center;
gap: 15px;
}
.navbar-brand img {
height: 40px;
}
.navbar-brand h2 {
color: var(--dark);
font-size: 20px;
}
.navbar-menu {
display: flex;
gap: 20px;
align-items: center;
}
.navbar-menu a {
color: var(--dark);
text-decoration: none;
font-weight: 500;
transition: color 0.3s;
}
.navbar-menu a:hover {
color: var(--primary);
}
/* Dashboard Layout */
.dashboard-container {
display: grid;
grid-template-columns: 400px 1fr;
gap: 20px;
margin-top: 20px;
height: calc(100vh - 120px);
}
.panel {
background: white;
border-radius: 12px;
padding: 20px;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
overflow-y: auto;
}
.panel-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 2px solid var(--border);
}
.panel-header h3 {
color: var(--dark);
font-size: 18px;
}
/* Job List */
.job-list {
display: flex;
flex-direction: column;
gap: 10px;
}
.job-item {
padding: 15px;
border: 2px solid var(--border);
border-radius: 8px;
cursor: pointer;
transition: all 0.3s;
display: flex;
align-items: center;
gap: 12px;
}
.job-item:hover {
border-color: var(--primary);
background: var(--light);
}
.job-item.active {
border-color: var(--primary);
background: #eff6ff;
}
.job-status-icon {
font-size: 24px;
}
.job-info h4 {
color: var(--dark);
font-size: 14px;
margin-bottom: 4px;
}
.job-info p {
color: #6b7280;
font-size: 12px;
}
/* Job Details */
.job-details {
display: none;
}
.job-details.active {
display: block;
}
.detail-row {
display: grid;
grid-template-columns: 150px 1fr;
padding: 12px 0;
border-bottom: 1px solid var(--border);
}
.detail-label {
font-weight: 600;
color: var(--dark);
}
.detail-value {
color: #4b5563;
}
.status-badge {
display: inline-block;
padding: 4px 12px;
border-radius: 20px;
font-size: 12px;
font-weight: 600;
}
.status-in_progress {
background: #fef3c7;
color: #92400e;
}
.status-passed {
background: #d1fae5;
color: #065f46;
}
.status-failed {
background: #fee2e2;
color: #991b1b;
}
.status-aborted {
background: #f3f4f6;
color: #374151;
}
/* Admin Dashboard */
.admin-container {
background: white;
border-radius: 12px;
padding: 30px;
margin-top: 20px;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
}
.admin-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 30px;
}
.admin-header h2 {
color: var(--dark);
}
.user-table {
width: 100%;
border-collapse: collapse;
}
.user-table th {
background: var(--light);
padding: 12px;
text-align: left;
font-weight: 600;
color: var(--dark);
border-bottom: 2px solid var(--border);
}
.user-table td {
padding: 12px;
border-bottom: 1px solid var(--border);
}
.user-table tr:hover {
background: var(--light);
}
.badge {
display: inline-block;
padding: 4px 8px;
border-radius: 4px;
font-size: 11px;
font-weight: 600;
}
.badge-admin {
background: #dbeafe;
color: #1e40af;
}
.badge-user {
background: #f3f4f6;
color: #374151;
}
/* Modal */
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.5);
z-index: 1000;
}
.modal.active {
display: flex;
justify-content: center;
align-items: center;
}
.modal-content {
background: white;
padding: 30px;
border-radius: 12px;
width: 90%;
max-width: 500px;
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.modal-header h3 {
color: var(--dark);
}
.close-btn {
background: none;
border: none;
font-size: 24px;
cursor: pointer;
color: #6b7280;
}
/* Submit Form */
.submit-container {
background: white;
border-radius: 12px;
padding: 40px;
margin-top: 20px;
max-width: 800px;
margin-left: auto;
margin-right: auto;
box-shadow: 0 4px 20px rgba(0,0,0,0.1);
}
.step-indicator {
display: flex;
justify-content: space-between;
margin-bottom: 40px;
}
.step {
flex: 1;
text-align: center;
position: relative;
}
.step::after {
content: '';
position: absolute;
top: 15px;
left: 50%;
width: 100%;
height: 2px;
background: var(--border);
z-index: -1;
}
.step:last-child::after {
display: none;
}
.step.active .step-number {
background: var(--primary);
color: white;
}
.step.completed .step-number {
background: var(--success);
color: white;
}
.step-number {
width: 30px;
height: 30px;
border-radius: 50%;
background: var(--border);
color: var(--dark);
display: inline-flex;
align-items: center;
justify-content: center;
font-weight: 600;
margin-bottom: 8px;
}
.step-label {
font-size: 12px;
color: #6b7280;
}
.checkbox-group {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 10px;
margin: 20px 0;
}
.checkbox-item {
display: flex;
align-items: center;
gap: 8px;
}
.checkbox-item input[type="checkbox"] {
width: 18px;
height: 18px;
}
.radio-group {
display: flex;
flex-direction: column;
gap: 12px;
margin: 20px 0;
}
.radio-item {
display: flex;
align-items: center;
gap: 10px;
padding: 12px;
border: 2px solid var(--border);
border-radius: 8px;
cursor: pointer;
}
.radio-item:hover {
border-color: var(--primary);
}
.radio-item input[type="radio"]:checked + label {
color: var(--primary);
font-weight: 600;
}
.form-actions {
display: flex;
gap: 10px;
justify-content: flex-end;
margin-top: 30px;
}
.empty-state {
text-align: center;
padding: 60px 20px;
color: #6b7280;
}
.empty-state h3 {
margin-bottom: 10px;
}
/* Context Menu */
.context-menu {
display: none;
position: absolute;
background: white;
border: 1px solid var(--border);
border-radius: 8px;
box-shadow: 0 4px 20px rgba(0,0,0,0.15);
z-index: 1000;
min-width: 150px;
}
.context-menu-item {
padding: 12px 16px;
cursor: pointer;
display: flex;
align-items: center;
gap: 8px;
transition: background-color 0.2s;
}
.context-menu-item:hover {
background: var(--light);
}
.context-menu-item:first-child {
border-radius: 8px 8px 0 0;
}
.context-menu-item:last-child {
border-radius: 0 0 8px 8px;
}
.context-menu-icon {
font-size: 16px;
}
/* Branch Validation */
.branch-validation {
margin-top: 15px;
padding: 12px;
border-radius: 8px;
display: none;
}
.branch-validation.success {
background: #d1fae5;
color: #065f46;
border: 1px solid #10b981;
}
.branch-validation.error {
background: #fee2e2;
color: #991b1b;
border: 1px solid #ef4444;
}
.branch-validation.loading {
background: #fef3c7;
color: #92400e;
border: 1px solid #f59e0b;
}
.loading-spinner {
display: inline-block;
width: 16px;
height: 16px;
border: 2px solid #f3f3f3;
border-top: 2px solid var(--primary);
border-radius: 50%;
animation: spin 1s linear infinite;
margin-right: 8px;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.btn:disabled {
background: #9ca3af;
cursor: not-allowed;
opacity: 0.6;
}/
* Scenario Tree Styles */
.scenario-controls {
margin: 20px 0;
padding: 15px;
background: var(--light);
border-radius: 8px;
display: flex;
align-items: center;
gap: 10px;
}
.scenario-tree {
border: 1px solid var(--border);
border-radius: 8px;
padding: 20px;
background: white;
margin: 20px 0;
max-height: 500px;
overflow-y: auto;
}
.tree-layer {
margin-bottom: 15px;
}
.tree-stack {
margin-left: 20px;
margin-bottom: 10px;
}
.tree-scenario {
margin-left: 40px;
margin-bottom: 5px;
}
.tree-node {
display: flex;
align-items: center;
gap: 8px;
padding: 8px 0;
cursor: pointer;
user-select: none;
}
.tree-toggle {
width: 16px;
height: 16px;
display: inline-flex;
align-items: center;
justify-content: center;
font-size: 12px;
color: var(--primary);
font-weight: bold;
cursor: pointer;
}
.tree-spacer {
width: 16px;
height: 16px;
}
.tree-label {
font-weight: 500;
cursor: pointer;
margin: 0;
}
.layer-label {
font-size: 16px;
font-weight: 600;
color: var(--dark);
}
.stack-label {
font-size: 14px;
font-weight: 500;
color: #4b5563;
}
.scenario-label {
font-size: 13px;
font-weight: 400;
color: #6b7280;
}
.tree-children {
margin-top: 5px;
}
.layer-checkbox, .stack-checkbox, .scenario-checkbox {
width: 16px;
height: 16px;
cursor: pointer;
}
.layer-node:hover {
background: rgba(59, 130, 246, 0.05);
border-radius: 4px;
}
.stack-node:hover {
background: rgba(16, 185, 129, 0.05);
border-radius: 4px;
}
.scenario-node:hover {
background: rgba(245, 158, 11, 0.05);
border-radius: 4px;
}
/* Indeterminate checkbox styling */
input[type="checkbox"]:indeterminate {
background-color: var(--primary);
border-color: var(--primary);
}
input[type="checkbox"]:indeterminate::before {
content: '';
color: white;
font-weight: bold;
display: block;
text-align: center;
line-height: 14px;
}
/* Selection count styling */
#selectionCount {
color: var(--primary);
font-size: 14px;
}