Spaces:
Running
Running
| :root { | |
| --bg: #f4f7ff; | |
| --bg-elevated: #eef3ff; | |
| --bg-card: #ffffff; | |
| --bg-card-soft: #f7f9ff; | |
| --border: #cdd8f3; | |
| --border-subtle: #deE6fb; | |
| --text: #18233f; | |
| --text-muted: #5f6f94; | |
| --accent: #5b6cff; | |
| --accent-hover: #4c5cf0; | |
| --accent-dim: rgba(91, 108, 255, 0.12); | |
| --success: #0aa972; | |
| --success-dim: rgba(10, 169, 114, 0.12); | |
| --warning: #d68b16; | |
| --warning-dim: rgba(214, 139, 22, 0.12); | |
| --error: #d93a5e; | |
| --error-dim: rgba(217, 58, 94, 0.12); | |
| --radius: 16px; | |
| --radius-sm: 10px; | |
| --shadow: 0 12px 34px rgba(75, 95, 148, 0.14); | |
| --font: "Inter", system-ui, -apple-system, sans-serif; | |
| } | |
| *, | |
| *::before, | |
| *::after { | |
| box-sizing: border-box; | |
| } | |
| body { | |
| font-family: var(--font); | |
| background: linear-gradient(160deg, #f9fbff 0%, #eef3ff 50%, #f4f7ff 100%); | |
| background-image: | |
| radial-gradient(ellipse 68% 50% at 10% -10%, rgba(91, 108, 255, 0.12), transparent 60%), | |
| radial-gradient(ellipse 58% 35% at 100% 100%, rgba(91, 108, 255, 0.08), transparent 70%); | |
| margin: 0; | |
| color: var(--text); | |
| line-height: 1.5; | |
| min-height: 100vh; | |
| letter-spacing: 0.01em; | |
| } | |
| /* Header */ | |
| .app-header { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| gap: 1rem; | |
| padding: 1.25rem 2rem; | |
| border-bottom: 1px solid rgba(95, 111, 148, 0.16); | |
| background: rgba(248, 251, 255, 0.95); | |
| position: sticky; | |
| top: 0; | |
| z-index: 100; | |
| } | |
| .brand { | |
| display: flex; | |
| align-items: center; | |
| gap: 0.85rem; | |
| } | |
| .brand-icon { | |
| font-size: 2rem; | |
| line-height: 1; | |
| } | |
| .brand h1 { | |
| margin: 0; | |
| font-size: 1.35rem; | |
| font-weight: 700; | |
| letter-spacing: -0.02em; | |
| } | |
| .brand-tagline { | |
| margin: 0; | |
| font-size: 0.8rem; | |
| color: var(--text-muted); | |
| } | |
| .health-pills { | |
| display: flex; | |
| gap: 0.5rem; | |
| flex-wrap: wrap; | |
| justify-content: flex-end; | |
| } | |
| .pill { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 0.35rem; | |
| padding: 0.3rem 0.7rem; | |
| border-radius: 999px; | |
| font-size: 0.75rem; | |
| font-weight: 500; | |
| border: 1px solid var(--border); | |
| background: var(--bg-card); | |
| } | |
| .pill.ok { | |
| border-color: rgba(62, 207, 142, 0.4); | |
| background: var(--success-dim); | |
| color: var(--success); | |
| } | |
| .pill.bad { | |
| border-color: rgba(245, 101, 101, 0.4); | |
| background: var(--error-dim); | |
| color: var(--error); | |
| } | |
| .pill-dot { | |
| width: 6px; | |
| height: 6px; | |
| border-radius: 50%; | |
| background: currentColor; | |
| } | |
| /* Layout */ | |
| .app-layout { | |
| display: grid; | |
| grid-template-columns: 380px 1fr; | |
| gap: 1.25rem; | |
| max-width: 1280px; | |
| margin: 0 auto; | |
| padding: 1.5rem 2rem 3rem; | |
| } | |
| .workspace { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 1.25rem; | |
| min-width: 0; | |
| } | |
| .panel { | |
| background: | |
| linear-gradient(180deg, rgba(255, 255, 255, 0.85), rgba(255, 255, 255, 0.55)), | |
| var(--bg-card); | |
| border: 1px solid rgba(95, 111, 148, 0.16); | |
| border-radius: var(--radius); | |
| padding: 1.25rem; | |
| box-shadow: var(--shadow); | |
| } | |
| .panel-header { | |
| margin-bottom: 1.1rem; | |
| } | |
| .panel-header-row { | |
| display: flex; | |
| align-items: flex-start; | |
| justify-content: space-between; | |
| gap: 0.75rem; | |
| } | |
| .panel-title { | |
| margin: 0 0 0.75rem; | |
| font-size: 0.9rem; | |
| font-weight: 600; | |
| color: var(--text-muted); | |
| } | |
| .run-title-row { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| gap: 0.75rem; | |
| } | |
| .run-title-row h2 { | |
| margin: 0; | |
| min-width: 0; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .panel-desc { | |
| margin: 0; | |
| font-size: 0.85rem; | |
| color: var(--text-muted); | |
| } | |
| /* Form */ | |
| .drop-zone { | |
| border: 1px dashed rgba(95, 111, 148, 0.35); | |
| border-radius: var(--radius); | |
| padding: 2rem 1rem; | |
| text-align: center; | |
| cursor: pointer; | |
| transition: border-color 0.2s, background 0.2s, transform 0.2s, box-shadow 0.2s; | |
| margin-bottom: 1rem; | |
| outline: none; | |
| } | |
| .drop-zone:hover, | |
| .drop-zone:focus-visible, | |
| .drop-zone.dragover { | |
| border-color: var(--accent); | |
| background: var(--accent-dim); | |
| box-shadow: inset 0 0 0 1px rgba(91, 108, 255, 0.24); | |
| transform: translateY(-1px); | |
| } | |
| .drop-icon { | |
| font-size: 2rem; | |
| display: block; | |
| margin-bottom: 0.5rem; | |
| } | |
| .drop-title { | |
| margin: 0 0 0.25rem; | |
| font-weight: 600; | |
| font-size: 0.95rem; | |
| } | |
| .drop-hint { | |
| margin: 0; | |
| font-size: 0.8rem; | |
| color: var(--text-muted); | |
| } | |
| .file-name { | |
| margin: 0.75rem 0 0; | |
| font-size: 0.85rem; | |
| color: var(--accent); | |
| font-weight: 500; | |
| word-break: break-all; | |
| } | |
| .field { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 0.35rem; | |
| margin-bottom: 0.9rem; | |
| } | |
| .field-label { | |
| font-size: 0.8rem; | |
| font-weight: 500; | |
| color: var(--text-muted); | |
| display: flex; | |
| align-items: center; | |
| gap: 0.35rem; | |
| } | |
| .field-row { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: 0.75rem; | |
| } | |
| .tooltip { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| width: 16px; | |
| height: 16px; | |
| border-radius: 50%; | |
| background: var(--border); | |
| color: var(--text-muted); | |
| font-size: 0.65rem; | |
| cursor: help; | |
| } | |
| input[type="text"], | |
| input[type="number"], | |
| select { | |
| width: 100%; | |
| padding: 0.55rem 0.7rem; | |
| font-size: 0.9rem; | |
| font-family: inherit; | |
| color: var(--text); | |
| background: #f8faff; | |
| border: 1px solid rgba(95, 111, 148, 0.25); | |
| border-radius: var(--radius-sm); | |
| transition: border-color 0.2s, box-shadow 0.2s, background 0.2s; | |
| } | |
| input:focus, | |
| select:focus { | |
| outline: none; | |
| border-color: var(--accent); | |
| box-shadow: 0 0 0 4px rgba(91, 108, 255, 0.16); | |
| background: #ffffff; | |
| } | |
| .input-suffix { | |
| display: flex; | |
| align-items: center; | |
| gap: 0.5rem; | |
| } | |
| .input-suffix input { | |
| flex: 1; | |
| } | |
| .input-suffix span { | |
| font-size: 0.8rem; | |
| color: var(--text-muted); | |
| } | |
| input[type="range"] { | |
| width: 100%; | |
| accent-color: var(--accent); | |
| } | |
| .range-labels { | |
| display: flex; | |
| justify-content: space-between; | |
| font-size: 0.75rem; | |
| color: var(--text-muted); | |
| } | |
| #parallel-value { | |
| font-weight: 600; | |
| color: var(--accent); | |
| } | |
| /* Buttons */ | |
| .btn { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| gap: 0.5rem; | |
| padding: 0.6rem 1.1rem; | |
| font-size: 0.9rem; | |
| font-weight: 500; | |
| font-family: inherit; | |
| border-radius: var(--radius-sm); | |
| border: none; | |
| cursor: pointer; | |
| transition: background 0.2s, opacity 0.2s, transform 0.1s, box-shadow 0.2s, border-color 0.2s; | |
| } | |
| .btn:active:not(:disabled) { | |
| transform: scale(0.98); | |
| } | |
| .btn:disabled { | |
| opacity: 0.5; | |
| cursor: not-allowed; | |
| } | |
| .btn-primary { | |
| background: linear-gradient(135deg, #5b6cff 0%, #6f80ff 100%); | |
| color: #fff; | |
| box-shadow: 0 10px 20px rgba(91, 108, 255, 0.24); | |
| } | |
| .btn-primary:hover:not(:disabled) { | |
| background: linear-gradient(135deg, #4c5cf0 0%, #6376ff 100%); | |
| box-shadow: 0 12px 24px rgba(91, 108, 255, 0.3); | |
| } | |
| .btn-secondary { | |
| background: #f3f6ff; | |
| color: var(--text); | |
| border: 1px solid rgba(95, 111, 148, 0.26); | |
| } | |
| .btn-secondary:hover:not(:disabled) { | |
| border-color: var(--accent); | |
| color: var(--accent); | |
| } | |
| .btn-danger { | |
| background: var(--error-dim); | |
| color: var(--error); | |
| border: 1px solid rgba(217, 58, 94, 0.3); | |
| } | |
| .btn-danger:hover:not(:disabled) { | |
| background: rgba(245, 101, 101, 0.25); | |
| } | |
| .btn-danger.btn-ghost { | |
| background: transparent; | |
| } | |
| .btn-ghost { | |
| background: #f3f6ff; | |
| color: var(--text-muted); | |
| border: 1px solid var(--border); | |
| padding: 0.35rem 0.6rem; | |
| } | |
| .btn-ghost:hover { | |
| color: var(--text); | |
| border-color: var(--text-muted); | |
| } | |
| .btn-sm { | |
| font-size: 0.85rem; | |
| padding: 0.35rem 0.65rem; | |
| } | |
| .btn-block { | |
| width: 100%; | |
| margin-top: 0.25rem; | |
| } | |
| .btn-spinner { | |
| width: 16px; | |
| height: 16px; | |
| border: 2px solid rgba(255, 255, 255, 0.3); | |
| border-top-color: #fff; | |
| border-radius: 50%; | |
| animation: spin 0.7s linear infinite; | |
| } | |
| @keyframes spin { | |
| to { | |
| transform: rotate(360deg); | |
| } | |
| } | |
| /* Run history */ | |
| .run-list { | |
| list-style: none; | |
| margin: 0; | |
| padding: 0; | |
| max-height: 220px; | |
| overflow-y: auto; | |
| } | |
| .run-list-empty { | |
| padding: 1.5rem 0.5rem; | |
| text-align: center; | |
| font-size: 0.85rem; | |
| } | |
| .run-item { | |
| display: flex; | |
| align-items: center; | |
| gap: 0.75rem; | |
| padding: 0.7rem 0.75rem; | |
| border-radius: var(--radius-sm); | |
| cursor: pointer; | |
| border: 1px solid transparent; | |
| transition: background 0.2s, border-color 0.2s, transform 0.2s; | |
| } | |
| .run-item-actions { | |
| display: flex; | |
| align-items: center; | |
| gap: 0.35rem; | |
| flex-shrink: 0; | |
| } | |
| .run-delete-btn { | |
| padding: 0.2rem 0.45rem; | |
| font-size: 0.75rem; | |
| line-height: 1; | |
| } | |
| .run-item:hover { | |
| background: #eef3ff; | |
| border-color: rgba(91, 108, 255, 0.24); | |
| transform: translateY(-1px); | |
| } | |
| .run-item.active { | |
| background: linear-gradient(90deg, rgba(91, 108, 255, 0.16), rgba(91, 108, 255, 0.07)); | |
| border-color: rgba(91, 108, 255, 0.32); | |
| } | |
| .run-item-info { | |
| flex: 1; | |
| min-width: 0; | |
| } | |
| .run-item-name { | |
| font-size: 0.85rem; | |
| font-weight: 500; | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| .run-item-meta { | |
| font-size: 0.72rem; | |
| color: var(--text-muted); | |
| margin-top: 0.1rem; | |
| } | |
| /* Status badges */ | |
| .badge { | |
| display: inline-flex; | |
| align-items: center; | |
| padding: 0.2rem 0.55rem; | |
| border-radius: 999px; | |
| font-size: 0.68rem; | |
| font-weight: 600; | |
| text-transform: capitalize; | |
| white-space: nowrap; | |
| } | |
| .badge-queued { | |
| background: var(--border); | |
| color: var(--text-muted); | |
| } | |
| .badge-running, | |
| .badge-uploading, | |
| .badge-processing, | |
| .badge-downloading { | |
| background: var(--accent-dim); | |
| color: var(--accent); | |
| } | |
| .badge-completed, | |
| .badge-succeeded { | |
| background: var(--success-dim); | |
| color: var(--success); | |
| } | |
| .badge-failed, | |
| .badge-interrupted, | |
| .badge-cancelled { | |
| background: var(--error-dim); | |
| color: var(--error); | |
| } | |
| /* Active run */ | |
| .run-meta-row { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 0.5rem; | |
| margin-bottom: 1.25rem; | |
| } | |
| .meta-chip { | |
| font-size: 0.78rem; | |
| padding: 0.3rem 0.65rem; | |
| border-radius: 999px; | |
| background: var(--bg-elevated); | |
| border: 1px solid var(--border-subtle); | |
| } | |
| .meta-chip.muted { | |
| color: var(--text-muted); | |
| } | |
| /* Pipeline */ | |
| .pipeline { | |
| display: flex; | |
| align-items: center; | |
| margin-bottom: 1.25rem; | |
| padding: 0.75rem 0; | |
| } | |
| .pipeline-step { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: 0.4rem; | |
| flex-shrink: 0; | |
| } | |
| .step-dot { | |
| width: 12px; | |
| height: 12px; | |
| border-radius: 50%; | |
| background: var(--border); | |
| border: 2px solid var(--border); | |
| transition: background 0.3s, border-color 0.3s, box-shadow 0.3s; | |
| } | |
| .pipeline-step.active .step-dot { | |
| background: var(--accent); | |
| border-color: var(--accent); | |
| box-shadow: 0 0 0 4px var(--accent-dim); | |
| } | |
| .pipeline-step.done .step-dot { | |
| background: var(--success); | |
| border-color: var(--success); | |
| } | |
| .step-label { | |
| font-size: 0.7rem; | |
| color: var(--text-muted); | |
| font-weight: 500; | |
| } | |
| .pipeline-step.active .step-label, | |
| .pipeline-step.done .step-label { | |
| color: var(--text); | |
| } | |
| .pipeline-line { | |
| flex: 1; | |
| height: 2px; | |
| background: var(--border); | |
| margin: 0 0.25rem; | |
| margin-bottom: 1.2rem; | |
| transition: background 0.3s; | |
| } | |
| .pipeline-line.done { | |
| background: var(--success); | |
| } | |
| /* Progress */ | |
| .progress-block { | |
| margin-bottom: 1rem; | |
| } | |
| .progress-header { | |
| display: flex; | |
| justify-content: space-between; | |
| font-size: 0.82rem; | |
| margin-bottom: 0.45rem; | |
| } | |
| .progress-bar { | |
| height: 10px; | |
| background: #e9efff; | |
| border-radius: 999px; | |
| overflow: hidden; | |
| border: 1px solid rgba(95, 111, 148, 0.16); | |
| } | |
| .progress-fill { | |
| height: 100%; | |
| width: 0%; | |
| background: linear-gradient(90deg, #5b6cff 0%, #7863ff 50%, #4f98ff 100%); | |
| border-radius: 999px; | |
| transition: width 0.35s ease; | |
| will-change: width; | |
| } | |
| /* Alert */ | |
| .alert { | |
| padding: 0.75rem 1rem; | |
| border-radius: var(--radius-sm); | |
| font-size: 0.85rem; | |
| margin-bottom: 1rem; | |
| } | |
| .alert-error { | |
| background: var(--error-dim); | |
| border: 1px solid rgba(245, 101, 101, 0.3); | |
| color: var(--error); | |
| } | |
| .actions { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 0.6rem; | |
| margin-bottom: 1rem; | |
| } | |
| /* Estimates */ | |
| .estimate-panel { | |
| background: #f6f9ff; | |
| border: 1px solid rgba(95, 111, 148, 0.18); | |
| border-radius: var(--radius-sm); | |
| padding: 0.85rem 1rem; | |
| margin-bottom: 0.9rem; | |
| } | |
| .estimate-panel h3 { | |
| margin: 0 0 0.6rem; | |
| font-size: 0.82rem; | |
| font-weight: 600; | |
| color: var(--text-muted); | |
| text-transform: uppercase; | |
| letter-spacing: 0.04em; | |
| } | |
| .estimate-grid { | |
| display: grid; | |
| grid-template-columns: repeat(3, 1fr); | |
| gap: 0.75rem; | |
| } | |
| .estimate-grid > div { | |
| display: flex; | |
| flex-direction: column; | |
| gap: 0.2rem; | |
| } | |
| .estimate-label { | |
| font-size: 0.72rem; | |
| color: var(--text-muted); | |
| } | |
| .estimate-grid span:last-child { | |
| font-size: 0.95rem; | |
| font-weight: 600; | |
| } | |
| .estimate-disclaimer { | |
| margin: 0.55rem 0 0; | |
| font-size: 0.72rem; | |
| } | |
| /* Video preview */ | |
| .video-preview { | |
| margin-bottom: 1rem; | |
| } | |
| .video-preview h3 { | |
| margin: 0 0 0.6rem; | |
| font-size: 0.9rem; | |
| font-weight: 600; | |
| } | |
| .video-preview video { | |
| width: 100%; | |
| max-height: 360px; | |
| border-radius: var(--radius-sm); | |
| background: #000; | |
| border: 1px solid rgba(95, 111, 148, 0.22); | |
| box-shadow: 0 10px 28px rgba(43, 59, 102, 0.2); | |
| } | |
| /* Segments table */ | |
| .segments-details { | |
| margin-top: 0.5rem; | |
| } | |
| .segments-details summary { | |
| cursor: pointer; | |
| font-size: 0.88rem; | |
| font-weight: 500; | |
| padding: 0.5rem 0; | |
| user-select: none; | |
| } | |
| .segments-details summary .muted { | |
| font-weight: 400; | |
| margin-left: 0.5rem; | |
| } | |
| .table-wrap { | |
| overflow-x: auto; | |
| margin-top: 0.5rem; | |
| } | |
| table { | |
| width: 100%; | |
| border-collapse: collapse; | |
| font-size: 0.8rem; | |
| } | |
| th, | |
| td { | |
| border: 1px solid var(--border-subtle); | |
| padding: 0.45rem 0.6rem; | |
| text-align: left; | |
| vertical-align: top; | |
| } | |
| th { | |
| background: var(--bg-elevated); | |
| font-weight: 600; | |
| color: var(--text-muted); | |
| font-size: 0.72rem; | |
| text-transform: uppercase; | |
| letter-spacing: 0.03em; | |
| } | |
| td .badge { | |
| font-size: 0.68rem; | |
| } | |
| .prediction-id { | |
| font-family: ui-monospace, monospace; | |
| font-size: 0.72rem; | |
| color: var(--text-muted); | |
| max-width: 140px; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .error-cell { | |
| color: var(--error); | |
| font-size: 0.78rem; | |
| max-width: 200px; | |
| word-break: break-word; | |
| } | |
| /* Toast */ | |
| .toast-container { | |
| position: fixed; | |
| bottom: 1.5rem; | |
| right: 1.5rem; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 0.5rem; | |
| z-index: 1000; | |
| pointer-events: none; | |
| } | |
| .toast { | |
| padding: 0.75rem 1.1rem; | |
| border-radius: var(--radius-sm); | |
| font-size: 0.85rem; | |
| background: rgba(255, 255, 255, 0.96); | |
| border: 1px solid rgba(95, 111, 148, 0.24); | |
| box-shadow: var(--shadow); | |
| animation: slideIn 0.3s ease; | |
| pointer-events: auto; | |
| max-width: 360px; | |
| } | |
| .toast-success { | |
| border-color: rgba(62, 207, 142, 0.4); | |
| } | |
| .toast-error { | |
| border-color: rgba(245, 101, 101, 0.4); | |
| } | |
| @keyframes slideIn { | |
| from { | |
| opacity: 0; | |
| transform: translateY(12px); | |
| } | |
| to { | |
| opacity: 1; | |
| transform: translateY(0); | |
| } | |
| } | |
| .hidden { | |
| display: none ; | |
| } | |
| .muted { | |
| color: var(--text-muted); | |
| } | |
| /* Responsive */ | |
| @media (max-width: 900px) { | |
| .app-layout { | |
| grid-template-columns: 1fr; | |
| padding: 1rem; | |
| } | |
| .app-header { | |
| flex-direction: column; | |
| align-items: flex-start; | |
| padding: 1rem; | |
| } | |
| .field-row { | |
| grid-template-columns: 1fr; | |
| } | |
| } | |