/* ========================================================================== Cyclic Voltammetry Analysis - High-Contrast Academic Theme WCAG AAA High Contrast & Crisp Typography ========================================================================== */ :root { --color-bg-site: #0b1120; --color-bg-panel: #131d31; --color-bg-alt: #1e293b; --color-bg-input: #0f172a; --color-text-main: #ffffff; --color-text-body: #e2e8f0; --color-text-muted: #cbd5e1; --color-text-dim: #94a3b8; --color-primary: #2563eb; --color-primary-hover: #1d4ed8; --color-accent: #38bdf8; --color-accent-rose: #f43f5e; --color-accent-emerald: #10b981; --color-accent-amber: #fbbf24; --color-border: #334155; --color-border-subtle: #1e293b; --color-border-input: #475569; --color-focus: rgba(56, 189, 248, 0.4); --shadow-panel: 0 4px 16px rgba(0, 0, 0, 0.4); --radius-lg: 10px; --radius-md: 8px; --radius-sm: 6px; --font-stack: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; --font-mono: 'JetBrains Mono', monospace; } * { box-sizing: border-box; margin: 0; padding: 0; } /* Force dark theme baseline over any Gradio parent injection */ html, body, .gradio-container { background-color: var(--color-bg-site) !important; color: var(--color-text-body) !important; font-family: var(--font-stack) !important; line-height: 1.5; -webkit-font-smoothing: antialiased; min-height: 100vh; } body { display: flex; flex-direction: column; } /* Headings with Maximum Contrast */ h1, h2, h3, h4, h5, h6 { font-weight: 700 !important; color: #ffffff !important; letter-spacing: -0.015em; } h1 { font-size: 1.5rem !important; } h2 { font-size: 1.15rem !important; } h3 { font-size: 1.0rem !important; } p { margin-bottom: 0.75rem; color: var(--color-text-body) !important; } /* Top Navigation Bar */ .top-nav { background-color: var(--color-bg-panel); border-bottom: 1px solid var(--color-border); padding: 0 1.5rem; position: sticky; top: 0; z-index: 50; } .nav-container { max-width: 1750px; margin: 0 auto; display: flex; justify-content: space-between; align-items: center; height: 60px; } .nav-brand { display: flex; align-items: baseline; gap: 0.85rem; } .brand-title { font-size: 1.25rem; font-weight: 800; color: #ffffff !important; letter-spacing: -0.02em; } .brand-subtitle { font-size: 0.88rem; font-weight: 500; color: #94a3b8 !important; } .nav-links { display: flex; align-items: center; gap: 1rem; } /* JAX Engine Status Badge - Ultra-Crisp High-Contrast Text */ .engine-badge { display: flex; align-items: center; gap: 0.6rem; background-color: #1e293b !important; border: 1px solid #475569 !important; padding: 0.45rem 1rem; border-radius: 9999px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); } .engine-text, #engine-label { font-size: 0.88rem !important; font-weight: 700 !important; color: #ffffff !important; letter-spacing: 0.01em; } .status-dot { width: 9px; height: 9px; border-radius: 50%; } .status-dot.online { background-color: #4ade80 !important; box-shadow: 0 0 10px #4ade80 !important; } /* Main Layout Grid */ .app-container { flex: 1; max-width: 1750px; margin: 0 auto; padding: 1.25rem 1.5rem; width: 100%; } .content-grid { display: grid; grid-template-columns: 350px 1fr; gap: 1.5rem; align-items: start; } @media (max-width: 1100px) { .content-grid { grid-template-columns: 1fr; } } /* Panels */ .panel { background-color: var(--color-bg-panel) !important; border: 1px solid var(--color-border) !important; border-radius: var(--radius-md); box-shadow: var(--shadow-panel); overflow: hidden; margin-bottom: 1.25rem; } .panel-header { padding: 1rem 1.25rem; border-bottom: 1px solid var(--color-border); background-color: rgba(255, 255, 255, 0.025); } .panel-header h2, .panel-header h3 { color: #ffffff !important; font-weight: 700 !important; } .panel-body { padding: 1.25rem; } .chart-panel-body { padding: 0.75rem 1rem 1rem 1rem; } /* File Upload Area */ .file-upload-wrapper { margin-bottom: 1.25rem; } .section-label { display: block; font-size: 0.85rem !important; font-weight: 700 !important; color: #e2e8f0 !important; margin-bottom: 0.5rem; text-transform: uppercase; letter-spacing: 0.05em; } .file-upload-box { border: 1.5px dashed #475569; border-radius: var(--radius-md); padding: 1.25rem 1rem; text-align: center; background-color: var(--color-bg-alt); transition: all 0.2s ease; cursor: pointer; display: flex; flex-direction: column; align-items: center; gap: 0.4rem; } .file-upload-box:hover, .file-upload-wrapper.dragover .file-upload-box { border-color: #38bdf8; background-color: rgba(56, 189, 248, 0.08); } .file-icon { font-size: 1.5rem; } .btn-file-select { display: inline-block; background-color: #0f172a !important; border: 1px solid #475569 !important; color: #ffffff !important; padding: 0.45rem 1rem; font-size: 0.85rem !important; font-weight: 600 !important; border-radius: var(--radius-sm); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); } .drag-hint { font-size: 0.78rem !important; color: #94a3b8 !important; } .file-status-row { margin-top: 0.5rem; font-size: 0.82rem !important; color: #cbd5e1 !important; font-family: var(--font-mono); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .file-status-row span.has-file { color: #38bdf8 !important; font-weight: 700 !important; } .hidden-file-input { display: none; } /* Form Styles & High-Contrast Inputs */ .form-section { border: 1px solid #334155 !important; padding: 1rem; margin-bottom: 1.15rem; background-color: rgba(15, 23, 42, 0.6) !important; border-radius: var(--radius-md); } .form-section legend { font-weight: 700 !important; font-size: 0.82rem !important; color: #38bdf8 !important; text-transform: uppercase; letter-spacing: 0.06em; padding: 0 0.4rem; border: none; } .input-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.85rem; } .form-group { display: flex; flex-direction: column; } label { font-size: 0.82rem !important; font-weight: 600 !important; color: #e2e8f0 !important; margin-bottom: 0.35rem; } label i, label sub { font-family: serif; font-style: italic; color: #f1f5f9 !important; } input[type="number"], input[type="text"], select.academic-dropdown { font-family: var(--font-mono) !important; font-size: 0.88rem !important; font-weight: 500 !important; padding: 0.55rem 0.75rem !important; border: 1px solid #475569 !important; border-radius: var(--radius-sm); background-color: #0f172a !important; color: #ffffff !important; transition: all 0.2s ease; width: 100%; } select.academic-dropdown { font-family: var(--font-stack) !important; cursor: pointer; } select.academic-dropdown option { background-color: #0f172a !important; color: #ffffff !important; } input:focus, select:focus { outline: none; border-color: #38bdf8 !important; box-shadow: 0 0 0 3px var(--color-focus) !important; } .column-meta-bar { margin-top: 0.65rem; font-size: 0.8rem !important; color: #cbd5e1 !important; } .column-meta-bar strong { color: #ffffff !important; } .col-stats-preview { margin-top: 0.75rem; display: flex; flex-direction: column; gap: 0.35rem; } .stat-pill { display: flex; justify-content: space-between; font-size: 0.8rem !important; background-color: #1e293b !important; padding: 0.35rem 0.65rem; border-radius: 4px; border: 1px solid #334155 !important; } .stat-k { color: #94a3b8 !important; font-weight: 500; } .stat-v { color: #38bdf8 !important; font-family: var(--font-mono); font-weight: 700; } /* Advanced Collapsible Section */ .advanced-section { margin-bottom: 1.15rem; } .advanced-toggle { background-color: #1e293b !important; border: 1px solid #334155 !important; color: #e2e8f0 !important; padding: 0.55rem 0.85rem !important; font-size: 0.82rem !important; font-weight: 600 !important; display: flex; justify-content: space-between; align-items: center; width: 100%; border-radius: var(--radius-sm); cursor: pointer; transition: all 0.2s ease; } .advanced-toggle:hover { color: #ffffff !important; border-color: #38bdf8 !important; background-color: #0f172a !important; } .advanced-content { margin-top: 0.65rem; } .sub-section { margin-bottom: 0; } /* Buttons */ button { font-family: var(--font-stack) !important; font-weight: 700 !important; font-size: 0.92rem !important; padding: 0.75rem 1.5rem !important; border-radius: var(--radius-sm); cursor: pointer; text-align: center; transition: all 0.2s ease; width: 100%; border: 1px solid transparent; } .btn-primary { background-color: #2563eb !important; color: #ffffff !important; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4); } .btn-primary:hover:not(:disabled) { background-color: #1d4ed8 !important; } button:disabled { opacity: 0.6; cursor: not-allowed; } /* Export Actions */ .results-header-row { display: flex; justify-content: space-between; align-items: center; } .export-actions { display: flex; gap: 0.6rem; } .btn-export { background-color: #1e293b !important; border: 1px solid #475569 !important; color: #ffffff !important; padding: 0.45rem 0.9rem !important; font-size: 0.82rem !important; font-weight: 600 !important; border-radius: var(--radius-sm); width: auto; transition: all 0.2s ease; } .btn-export:hover { border-color: #38bdf8 !important; color: #38bdf8 !important; background-color: #0f172a !important; } /* Status Header in Chart Panel */ .status-header-row { display: flex; align-items: center; justify-content: space-between; } .status-left { display: flex; align-items: center; gap: 1rem; } .status-left h2 { font-size: 1.15rem !important; color: #38bdf8 !important; margin-bottom: 0.15rem; } .status-left p { font-size: 0.85rem !important; color: #cbd5e1 !important; margin: 0; } .status-left p strong { color: #ffffff !important; } /* Spinner */ .spinner { width: 24px; height: 24px; border: 3px solid #334155; border-top-color: #38bdf8; border-radius: 50%; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } /* Chart Canvas Dimensions */ .chart-wrapper-large { height: 580px; width: 100%; min-height: 580px; } .secondary-charts-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1.5rem; margin-top: 1.5rem; } .chart-wrapper-diagnostic { height: 460px; width: 100%; min-height: 460px; } @media (max-width: 1280px) { .secondary-charts-grid { grid-template-columns: 1fr; } } /* Parameter Stat Cards */ .stats-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 1rem; } .stat-card { background-color: #1e293b !important; border: 1px solid #334155 !important; border-radius: var(--radius-md); padding: 1rem 1.15rem; display: flex; flex-direction: column; } .stat-card .stat-label { font-size: 0.76rem !important; font-weight: 700 !important; text-transform: uppercase; letter-spacing: 0.05em; color: #94a3b8 !important; margin-bottom: 0.35rem; } .stat-card .stat-value { font-size: 1.25rem !important; font-weight: 800 !important; color: #ffffff !important; font-family: var(--font-mono); } .hidden { display: none !important; }