@import url('https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible+Next:ital,wght@0,400;0,600;0,700;1,400&family=Fira+Code:wght@400;600&family=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap'); /* ── Reset & Base ─────────────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } :root { /* Legacy/Base compatibility tokens */ --purple: #082F49; /* Maps brand header to primary navy */ --purple-light: #F1F5F9; --purple-dark: #0A1628; --text-dark: #0A1628; --text-mid: #475569; --text-light: #64748B; --border: #E2E8F0; --white: #ffffff; --bg: #F8FAFC; --success: #10B981; --danger: #D85A30; --radius: 12px; --shadow: 0 4px 20px rgba(10, 22, 40, 0.05), 0 1px 3px rgba(10, 22, 40, 0.01); --transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); /* DermaDefect / Clinical Tech Tokens */ --brand-navy: #082F49; --dark-accent: #0A1628; --slate-light: #F8FAFC; --emerald: #10B981; --amber: #EF9F27; --rose-coral: #D85A30; --charcoal-code: #0F172A; /* Typography System */ --font-display: 'Plus Jakarta Sans', system-ui, -apple-system, sans-serif; --font-body: 'Atkinson Hyperlegible Next', system-ui, -apple-system, sans-serif; --font-mono: 'Fira Code', 'JetBrains Mono', monospace; } html, body { font-family: var(--font-body); background: var(--bg); color: var(--text-dark); line-height: 1.6; min-height: 100vh; display: flex; flex-direction: column; font-size: 16px; } h1, h2, h3, h4, h5, h6 { font-family: var(--font-display); font-weight: 700; } a { color: var(--purple); text-decoration: none; } a:hover { color: var(--purple-dark); } /* ── Navbar ───────────────────────────────────────────────────────── */ .navbar { background: var(--white) !important; border-bottom: 1px solid var(--border) !important; padding: 0 2rem !important; height: 64px !important; display: flex !important; align-items: center !important; justify-content: space-between !important; position: sticky !important; top: 0 !important; z-index: 100 !important; box-shadow: 0 1px 8px rgba(83,74,183,0.07) !important; width: 100% !important; } .navbar-brand { display: flex !important; align-items: center !important; gap: 10px !important; font-size: 1.3rem !important; font-weight: 700 !important; color: var(--purple) !important; text-decoration: none !important; } .navbar-brand .logo-dot { width: 10px !important; height: 10px !important; background: var(--purple) !important; border-radius: 50% !important; display: inline-block !important; flex-shrink: 0 !important; } .navbar-links { display: flex !important; gap: 2rem !important; list-style: none !important; margin: 0 !important; padding: 0 !important; } .navbar-links li { list-style: none !important; } .navbar-links a { font-size: 0.9rem !important; font-weight: 500 !important; color: var(--text-mid) !important; transition: var(--transition) !important; text-decoration: none !important; } .navbar-links a:hover, .navbar-links a.active { color: var(--purple) !important; } /* ── Main content ─────────────────────────────────────────────────── */ main { flex: 1; } /* ── Buttons ──────────────────────────────────────────────────────── */ .btn { display: inline-flex !important; align-items: center !important; gap: 8px !important; padding: 0.65rem 1.5rem !important; border-radius: var(--radius) !important; font-size: 0.9rem !important; font-weight: 600 !important; cursor: pointer !important; border: none !important; transition: var(--transition) !important; text-decoration: none !important; font-family: inherit !important; } .btn-primary { background: var(--purple) !important; color: var(--white) !important; } .btn-primary:hover { background: var(--purple-dark) !important; transform: translateY(-1px) !important; box-shadow: 0 4px 12px rgba(83,74,183,0.3) !important; color: var(--white) !important; } .btn-outline { background: transparent !important; color: var(--purple) !important; border: 2px solid var(--purple) !important; } .btn-outline:hover { background: var(--purple-light) !important; } .btn:disabled { opacity: 0.5 !important; cursor: not-allowed !important; transform: none !important; } .shimmer-button { background: linear-gradient(90deg, #10B981, #059669, #10B981) !important; background-size: 200% auto !important; color: var(--white) !important; border: none !important; position: relative !important; overflow: hidden !important; transition: var(--transition) !important; } .shimmer-button:hover:not(:disabled) { animation: shimmer 1.5s infinite linear !important; transform: translateY(-1.5px) !important; box-shadow: 0 4px 18px rgba(16, 185, 129, 0.4) !important; } @keyframes shimmer { 0% { background-position: 0% center; } 100% { background-position: -200% center; } } /* ── Cards ────────────────────────────────────────────────────────── */ .card { background: var(--white) !important; border: 1px solid var(--border) !important; border-radius: var(--radius) !important; box-shadow: var(--shadow) !important; padding: 1.5rem !important; transition: var(--transition) !important; } .card:hover { box-shadow: 0 8px 30px rgba(10, 22, 40, 0.08) !important; } /* ── Custom Form Inputs ────────────────────────────────────────────── */ .form-group { display: flex; flex-direction: column; gap: 6px; margin-bottom: 1rem; } .form-group label { font-family: var(--font-body); font-size: 0.8rem; font-weight: 700; color: var(--text-mid); text-transform: uppercase; letter-spacing: 0.05em; } .form-control { font-family: var(--font-body); width: 100%; padding: 0.75rem 1rem; border: 1px solid var(--border); border-radius: 8px; background: var(--slate-light); color: var(--text-dark); font-size: 0.9rem; outline: none; transition: var(--transition); } .form-control:focus { border-color: var(--brand-navy); background: var(--white); box-shadow: 0 0 0 3px rgba(8, 47, 73, 0.05); } .triage-selector { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 2px; } .triage-option { cursor: pointer; position: relative; } .triage-option input { position: absolute; opacity: 0; width: 0; height: 0; } .triage-pill { display: flex; align-items: center; justify-content: center; padding: 0.6rem; border-radius: 8px; border: 1px solid var(--border); font-family: var(--font-body); font-size: 0.82rem; font-weight: 700; color: var(--text-light); text-align: center; transition: var(--transition); background: var(--white); } .triage-option input:checked + .triage-pill.low { border-color: var(--emerald); background: rgba(16, 185, 129, 0.1); color: var(--emerald); } .triage-option input:checked + .triage-pill.moderate { border-color: var(--amber); background: rgba(239, 159, 39, 0.1); color: var(--amber); } .triage-option input:checked + .triage-pill.high { border-color: var(--rose-coral); background: rgba(216, 90, 48, 0.1); color: var(--rose-coral); } .range-slider { -webkit-appearance: none; width: 100%; height: 6px; border-radius: 3px; background: var(--border); outline: none; margin: 10px 0; } .range-slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 16px; height: 16px; border-radius: 50%; background: var(--brand-navy); cursor: pointer; transition: transform 0.1s; } .range-slider::-webkit-slider-thumb:hover { transform: scale(1.2); } /* ── JSON Response Code Block ─────────────────────────────────────── */ .json-block-card { background: var(--charcoal-code) !important; border-color: rgba(255, 255, 255, 0.05) !important; padding: 1.25rem !important; margin-bottom: 1.25rem; max-height: 250px; overflow-y: auto; display: flex; flex-direction: column; } .json-header { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid rgba(255, 255, 255, 0.08); padding-bottom: 0.75rem; margin-bottom: 0.75rem; } .json-header h3 { font-family: var(--font-display); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.08em; color: rgba(255, 255, 255, 0.5); margin: 0; } .btn-copy-json { background: rgba(255, 255, 255, 0.04); border: 1px solid rgba(255, 255, 255, 0.08); color: rgba(255, 255, 255, 0.6); padding: 4px 10px; border-radius: 6px; font-family: var(--font-body); font-size: 0.75rem; font-weight: 600; display: flex; align-items: center; gap: 6px; cursor: pointer; transition: var(--transition); } .btn-copy-json:hover { background: rgba(255, 255, 255, 0.08); color: var(--white); } .json-pre { margin: 0; padding: 0; overflow-x: auto; } .json-pre code { font-family: var(--font-mono); font-size: 0.8rem; color: #38BDF8; /* Slate light blue for nice clinical tech contrast */ line-height: 1.5; display: block; } /* ── Specimen Visualizer Grid ─────────────────────────────────────── */ .dual-specimen-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-top: 0.75rem; } .specimen-card { border: 1px solid var(--border); border-radius: 8px; overflow: hidden; background: var(--dark-accent); } .specimen-header { padding: 0.5rem 0.75rem; font-family: var(--font-display); font-size: 0.75rem; font-weight: 700; color: var(--white); background: rgba(255,255,255,0.02); border-bottom: 1px solid rgba(255,255,255,0.05); text-transform: uppercase; letter-spacing: 0.05em; } .specimen-img-container { height: 240px; display: flex; align-items: center; justify-content: center; overflow: hidden; } .specimen-img-container img { max-width: 100%; max-height: 100%; object-fit: contain; display: block; } .secondary-specimen-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; } .specimen-card-small { border: 1px solid var(--border); border-radius: 8px; overflow: hidden; background: var(--slate-light); display: flex; flex-direction: column; } .specimen-header-small { padding: 0.4rem 0.6rem; font-family: var(--font-body); font-size: 0.7rem; font-weight: 700; color: var(--text-mid); background: var(--white); border-bottom: 1px solid var(--border); text-transform: uppercase; letter-spacing: 0.05em; } .specimen-card-small img { height: 120px; object-fit: contain; background: #f1f5f9; display: block; } /* ── Workspace Containers & Header ────────────────────────────────── */ .workspace-scroll-container { height: 100%; width: 100%; padding: 2.5rem 3rem; overflow-y: auto; box-sizing: border-box; } .workspace-header-bar { margin-bottom: 2rem; } .workspace-header-bar h1 { font-size: 1.6rem; font-weight: 800; color: var(--brand-navy); } .workspace-header-bar .sub { color: var(--text-light); font-size: 0.9rem; margin-top: 4px; } /* ── Telemetry Grid ───────────────────────────────────────────────── */ .telemetry-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 1.25rem; margin-bottom: 1.5rem; } .telemetry-card { display: flex; flex-direction: column; gap: 6px; position: relative; } .telemetry-label { font-family: var(--font-body); font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-light); } .telemetry-value { font-family: var(--font-display); font-size: 1.8rem; font-weight: 800; color: var(--brand-navy); line-height: 1.1; } .telemetry-change { display: flex; align-items: center; gap: 4px; font-size: 0.76rem; font-weight: 700; } .telemetry-change.positive { color: var(--emerald); } .telemetry-change.negative { color: var(--rose-coral); } .telemetry-badge { position: absolute; top: 1.5rem; right: 1.5rem; padding: 4px 8px; border-radius: 20px; font-size: 0.68rem; font-weight: 800; text-transform: uppercase; } .telemetry-badge.success { background: rgba(16, 185, 129, 0.1); color: var(--emerald); } .telemetry-badge.warning { background: rgba(239, 159, 39, 0.1); color: var(--amber); } /* ── Vector Chart ─────────────────────────────────────────────────── */ .chart-container { width: 100%; background: var(--white); margin-top: 1rem; } .vector-chart { width: 100%; height: 200px; } .chart-labels { display: flex; justify-content: space-between; margin-top: 0.75rem; font-size: 0.75rem; color: var(--text-light); font-weight: 600; padding: 0 4px; } /* ── Clinical Tables ──────────────────────────────────────────────── */ .clinical-table { width: 100%; border-collapse: collapse; margin-top: 1rem; font-family: var(--font-body); } .clinical-table th, .clinical-table td { padding: 0.85rem 1rem; text-align: left; border-bottom: 1px solid var(--border); font-size: 0.88rem; } .clinical-table th { background: var(--slate-light); color: var(--text-mid); font-weight: 700; text-transform: uppercase; font-size: 0.72rem; letter-spacing: 0.05em; } .clinical-table td { color: var(--text-dark); } .clinical-table code { font-family: var(--font-mono); font-size: 0.8rem; background: var(--slate-light); padding: 2px 6px; border-radius: 4px; color: var(--brand-navy); } .status-pill { display: inline-flex; align-items: center; padding: 3px 8px; border-radius: 20px; font-size: 0.72rem; font-weight: 800; } .status-pill.status-ok { background: rgba(16, 185, 129, 0.1); color: var(--emerald); } .status-pill.status-error { background: rgba(216, 90, 48, 0.1); color: var(--rose-coral); } /* ── API Documentation Layout ─────────────────────────────────────── */ .docs-layout { display: grid; grid-template-columns: 1.1fr 1fr; gap: 1.5rem; align-items: start; } @media (max-width: 900px) { .docs-layout { grid-template-columns: 1fr; } } .method-badge { padding: 4px 10px; border-radius: 6px; font-family: var(--font-display); font-size: 0.72rem; font-weight: 800; color: var(--white); text-transform: uppercase; } .method-badge.post { background: var(--emerald); } .code-tabs { display: flex; gap: 6px; border-bottom: 1px solid rgba(255, 255, 255, 0.08); padding-bottom: 0.5rem; margin-top: 0.5rem; } .code-tab-btn { background: transparent; border: none; color: rgba(255, 255, 255, 0.4); font-family: var(--font-body); font-size: 0.8rem; font-weight: 700; padding: 6px 12px; border-radius: 6px; cursor: pointer; transition: var(--transition); } .code-tab-btn:hover { color: var(--white); background: rgba(255, 255, 255, 0.03); } .code-tab-btn.active { color: var(--white); background: rgba(255, 255, 255, 0.08); } /* ── Footer ───────────────────────────────────────────────────────── */ footer { background: var(--white) !important; border-top: 1px solid var(--border) !important; padding: 1.5rem 2rem !important; text-align: center !important; font-size: 0.82rem !important; color: var(--text-light) !important; } footer a { color: var(--text-light) !important; margin: 0 0.5rem !important; } footer a:hover { color: var(--purple) !important; } /* ── Badges ───────────────────────────────────────────────────────── */ .badge { display: inline-block !important; padding: 0.25rem 0.75rem !important; border-radius: 20px !important; font-size: 0.78rem !important; font-weight: 600 !important; } .badge-mass { background: #fff3e0 !important; color: #e65100 !important; } .badge-calcification { background: #e3f2fd !important; color: #1565c0 !important; } .badge-benign { background: #e8f5e9 !important; color: #2e7d32 !important; } .badge-malignant { background: #fce4ec !important; color: #c62828 !important; } /* ── Confidence bar ───────────────────────────────────────────────── */ .confidence-bar-wrap { margin-top: 6px; } .confidence-bar-track { background: var(--border); border-radius: 4px; height: 6px; overflow: hidden; } .confidence-bar-fill { height: 100%; border-radius: 4px; background: var(--purple); transition: width 0.8s ease; } /* ── Upload zone ──────────────────────────────────────────────────── */ .upload-zone { border: 2px dashed var(--border) !important; border-radius: var(--radius) !important; padding: 2.2rem 1.5rem !important; text-align: center !important; cursor: pointer !important; transition: var(--transition) !important; background: var(--white) !important; display: flex !important; flex-direction: column !important; align-items: center !important; justify-content: center !important; gap: 8px !important; box-shadow: 0 4px 12px rgba(10, 22, 40, 0.02) !important; } .upload-zone:hover, .upload-zone.dragover { border-color: var(--emerald) !important; background: rgba(16, 185, 129, 0.02) !important; box-shadow: 0 8px 24px rgba(16, 185, 129, 0.06) !important; } .upload-zone input[type="file"] { display: none !important; } .upload-zone .upload-icon { font-size: 2.2rem; color: var(--brand-navy); background: var(--purple-light); width: 60px; height: 60px; border-radius: 50%; display: flex !important; align-items: center; justify-content: center; margin-bottom: 0.5rem; transition: var(--transition); } .upload-zone:hover .upload-icon { transform: scale(1.05); background: rgba(16, 185, 129, 0.1); color: var(--emerald); } .upload-zone p { color: var(--text-mid); font-size: 0.9rem; margin: 0; } .upload-zone .file-name { margin-top: 0.75rem; font-weight: 600; color: var(--purple); font-size: 0.9rem; } /* ── Spinner ──────────────────────────────────────────────────────── */ .spinner { width: 36px; height: 36px; border: 3px solid var(--border); border-top-color: var(--purple); border-radius: 50%; animation: spin 0.8s linear infinite; margin: 0 auto; } @keyframes spin { to { transform: rotate(360deg); } } /* ── Result images grid ───────────────────────────────────────────── */ .image-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin-top: 1rem; } .image-card { border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; text-align: center; } .image-card img { width: 100%; height: 200px; object-fit: contain; background: #f0f0f0; display: block; } .image-card .image-label { padding: 0.5rem; font-size: 0.78rem; font-weight: 600; color: var(--text-mid); background: var(--bg); border-top: 1px solid var(--border); } /* ── Clinical report ──────────────────────────────────────────────── */ .report-section { border-left: 3px solid var(--purple); padding: 0.5rem 0 0.5rem 1rem; margin-bottom: 1rem; } .report-section h4 { font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--purple); margin-bottom: 4px; } .report-section p { font-size: 0.88rem; color: var(--text-dark); line-height: 1.7; } /* ── Section headings ─────────────────────────────────────────────── */ .section-label { font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-light); margin-bottom: 0.5rem; } /* ── Utility ──────────────────────────────────────────────────────── */ .mt-1 { margin-top: 0.5rem !important; } .mt-2 { margin-top: 1rem !important; } .mt-3 { margin-top: 1.5rem !important; } .mt-4 { margin-top: 2rem !important; } .hidden { display: none !important; } .text-center { text-align: center !important; } .text-purple { color: var(--purple) !important; } .text-light { color: var(--text-light) !important; } .fw-bold { font-weight: 700 !important; } /* ── Three-Panel Dashboard Grid Shell ────────────────────────────── */ .dashboard-grid { display: grid; grid-template-columns: 240px 1fr; height: calc(100vh - 64px); background: var(--bg); font-family: var(--font-body); overflow: hidden; /* Lock the viewport for a premium desktop-app feel */ } .workspace-tab { height: 100%; width: 100%; display: none; min-height: 0; overflow: hidden; } .workspace-tab.active-tab { display: block; } /* Playground tab uses internal grid to keep the side-by-side view */ #workspace-playground.workspace-tab.active-tab { display: grid; grid-template-columns: 1fr 1fr; height: 100%; width: 100%; min-height: 0; } #workspace-playground.workspace-tab.active-tab .controller-panel, #workspace-playground.workspace-tab.active-tab .monitor-panel { height: 100%; } .sidebar-panel { background: var(--brand-navy); color: var(--white); padding: 2.5rem 1.5rem; display: flex; flex-direction: column; border-right: 1px solid rgba(255,255,255,0.05); } .brand-header h2 { font-family: var(--font-display); font-size: 1.4rem; font-weight: 800; letter-spacing: -0.02em; background: linear-gradient(135deg, var(--white) 30%, rgba(255,255,255,0.7) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; } .sidebar-nav { margin-top: 3rem; display: flex; flex-direction: column; gap: 0.5rem; } .nav-item { display: flex; align-items: center; gap: 12px; padding: 0.8rem 1rem; border-radius: var(--radius); color: rgba(255, 255, 255, 0.6) !important; font-size: 0.9rem; font-weight: 600; transition: var(--transition); text-decoration: none !important; } .nav-item svg { opacity: 0.7; transition: var(--transition); } .nav-item:hover { background: rgba(255, 255, 255, 0.05); color: var(--white) !important; } .nav-item:hover svg { opacity: 1; } .nav-item.active { background: rgba(255, 255, 255, 0.1); color: var(--white) !important; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); } .nav-item.active svg { opacity: 1; color: var(--emerald); } .controller-panel { background-color: var(--slate-light); background-image: radial-gradient(#E2E8F0 1.5px, transparent 1.5px); background-size: 24px 24px; padding: 2.5rem 2rem; border-right: 1px solid var(--border); overflow-y: auto; min-height: 0; height: 100%; } .monitor-panel { background: var(--white); padding: 2rem; display: flex; flex-direction: column; gap: 1.5rem; overflow-y: auto; min-height: 0; height: 100%; } @media (max-width: 1024px) { .dashboard-grid { grid-template-columns: 1fr; height: auto !important; overflow: visible !important; } .workspace-tab { height: auto !important; overflow: visible !important; } #workspace-playground.workspace-tab.active-tab { grid-template-columns: 1fr; height: auto !important; overflow: visible !important; } .controller-panel, .monitor-panel { height: auto !important; overflow-y: visible !important; } .sidebar-panel { border-right: none; border-bottom: 1px solid rgba(255,255,255,0.05); } .controller-panel { border-right: none; border-bottom: 1px solid var(--border); } }