:root{--bg:#f6f7f2;--panel:#fff;--text:#17201a;--muted:#5f6b61;--line:#d8ded5;--accent:#1d6b43;--accent-strong:#10482b;--warn:#a76018;--danger:#a33636}*{box-sizing:border-box}html,body{background:var(--bg);min-height:100%;color:var(--text);margin:0;font-family:Arial,Helvetica,sans-serif}button,input,select,textarea{font:inherit}a{color:inherit;text-decoration:none}.auth-page{background:radial-gradient(circle at top, #edf5ec 0, var(--bg) 48%);place-items:center;min-height:100vh;padding:24px;display:grid}.auth-card{border:1px solid var(--line);background:var(--panel);border-radius:14px;width:min(420px,100%);padding:36px;box-shadow:0 16px 48px #15351f14}.auth-brand{color:var(--accent-strong);text-align:center;margin-bottom:18px;font-size:25px;font-weight:800}.user-management-grid{grid-template-columns:minmax(420px,1.25fr) minmax(300px,.75fr);gap:16px;display:grid}.user-card-heading,.user-security-note,.info-box{align-items:flex-start;gap:12px;display:flex}.user-card-heading{margin-bottom:20px}.user-card-heading h2,.user-security-note h2{margin-bottom:4px}.user-security-note{background:#f2f7f0}.user-security-note p{color:var(--muted);line-height:1.5}@media (max-width:900px){.user-management-grid{grid-template-columns:1fr}}.shell{grid-template-columns:248px minmax(0,1fr);min-height:100vh;display:grid}.sidebar{border-right:1px solid var(--line);background:#eef2eb;height:100vh;padding:20px;position:sticky;top:0;overflow-y:auto}.brand{color:var(--accent-strong);margin-bottom:28px;font-size:20px;font-weight:700;display:block}.nav{gap:4px;display:grid}.nav-link{color:var(--muted);border-radius:6px;align-items:center;gap:10px;padding:9px 8px;font-size:14px;transition:background .1s,color .1s;display:flex}.nav-link:hover{color:var(--text);background:#d5e0d3}.nav-link.active{color:var(--accent-strong);background:#dfe8dd;font-weight:600}.main{min-width:0;padding:28px}.topbar{justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:24px;display:flex}h1{margin:0 0 6px;font-size:28px}h2{margin:0 0 12px;font-size:20px}.subtitle{color:var(--muted);margin:0;font-size:14px}.actions{flex-wrap:wrap;gap:8px;display:flex}.primary{background:var(--accent);color:#fff;cursor:pointer;border:0;border-radius:6px;align-items:center;gap:8px;padding:10px 14px;font-size:14px;display:inline-flex}.primary:hover:not(:disabled){background:var(--accent-strong)}.secondary{border:1px solid var(--line);color:var(--text);cursor:pointer;background:#fff;border-radius:6px;align-items:center;gap:8px;padding:10px 14px;font-size:14px;display:inline-flex}.secondary:hover:not(:disabled){background:var(--bg)}button:disabled{opacity:.5;cursor:not-allowed}.grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;margin-bottom:24px;display:grid}.card{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:16px}.metric{margin-top:10px;font-size:32px;font-weight:700}.label{color:var(--muted);font-size:14px}.sub{color:var(--muted);margin-top:4px;font-size:12px}.section{margin-top:24px}.section-title{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:20px 0 10px;font-size:12px;font-weight:700}.table{border-collapse:collapse;background:var(--panel);border:1px solid var(--line);border-radius:8px;width:100%;overflow:hidden}.table th,.table td{border-bottom:1px solid var(--line);text-align:left;padding:12px;font-size:14px}.table th{color:var(--muted);font-size:13px;font-weight:600}.table tr:last-child td{border-bottom:0}.status{border-radius:999px;align-items:center;padding:3px 9px;font-size:12px;font-weight:600;display:inline-flex}.status-draft{color:#374151;background:#e5e7eb}.status-training{color:#1d40ae;background:#dbeafe}.status-trained{color:#065f46;background:#d1fae5}.status-evaluated{color:#0369a1;background:#e0f2fe}.status-approved{color:#065f46;background:#d1fae5}.status-deployed{color:#15803d;background:#dcfce7}.status-delivered{color:#5b21b6;background:#ede9fe}.status-archived{color:#6b7280;background:#f3f4f6}.status-warn{color:#92400e;background:#fef3c7}.status-danger{color:#991b1b;background:#fee2e2}.status-running{color:#fff;background:#1d40ae;animation:1.8s ease-in-out infinite pulse-bg}.status-succeeded{color:#fff;background:#15803d}.status-pending{color:#0369a1;background:#e0f2fe}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.spin{animation:.9s linear infinite spin;display:inline-block}@keyframes pulse-bg{0%,to{opacity:1}50%{opacity:.65}}.form-grid{gap:16px;display:grid}.form-group{gap:5px;display:grid}.form-label{font-size:13px;font-weight:600}.form-note{color:var(--muted);font-size:12px}.input{border:1px solid var(--line);color:var(--text);background:#fff;border-radius:6px;width:100%;padding:9px 10px;font-size:14px}.input:focus{outline:2px solid var(--accent);outline-offset:1px;border-color:var(--accent)}.checkbox-row{cursor:pointer;align-items:center;gap:8px;font-size:14px;display:flex}.form-actions{align-items:center;gap:8px;margin-top:20px;display:flex}.calibration-top{grid-template-columns:minmax(260px,.8fr) minmax(360px,1.2fr);align-items:start;gap:16px;display:grid}.calibration-upload-grid{grid-template-columns:repeat(3,1fr);gap:10px;display:grid}.calibration-csv-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;max-height:330px;padding-right:4px;display:grid;overflow-y:auto}.calibration-gallery{grid-template-columns:minmax(0,1fr);gap:16px;display:grid}.calibration-table-wrap{border:1px solid var(--line);background:var(--panel);border-radius:8px;width:100%;min-width:0;max-width:100%;overflow-x:auto}.calibration-table{border-collapse:collapse;table-layout:fixed;width:100%;min-width:1360px;font-size:12px}.calibration-table caption{color:var(--muted);text-align:left;border-bottom:1px solid var(--line);padding:10px 12px;font-size:12px}.calibration-table th,.calibration-table td{border-bottom:1px solid var(--line);vertical-align:middle;text-align:left;padding:8px 6px}.calibration-table th{z-index:1;color:var(--muted);letter-spacing:.04em;text-transform:uppercase;background:#f6f7f2;font-size:11px;font-weight:700;position:sticky;top:0}.calibration-table tbody tr:last-child td{border-bottom:0}.calibration-table tbody tr:hover{background:#f8faf7}.calibration-table .calibration-row-with-image{cursor:pointer}.calibration-table .calibration-row-with-image:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.calibration-table .calibration-row-selected{background:#eef6f0}.calibration-table th:first-child{width:125px}.calibration-table th:nth-child(2){width:82px}.calibration-table th:nth-child(3){width:120px}.calibration-table th:nth-last-child(2){width:82px}.calibration-table th:last-child{width:154px}.calibration-table .secondary{padding:6px 8px;font-size:12px}.calibration-table .numeric{text-align:right;font-variant-numeric:tabular-nums}.calibration-table .metric-value{font-weight:650}.calibration-record-id{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-weight:650;overflow:hidden}.calibration-table .calibration-edit-row:hover{background:var(--panel)}.calibration-edit-row>td{padding:16px}.calibration-row-editor{gap:14px;display:grid}.calibration-table .calibration-preview-row:hover{background:var(--panel)}.calibration-preview-row>td{padding:16px}.calibration-image-inspector{gap:12px;display:grid}.calibration-inspector-heading{justify-content:space-between;align-items:flex-start;gap:14px;display:flex}.calibration-inspector-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;display:grid}.calibration-inspector-grid figure{border:1px solid var(--line);background:#111;border-radius:7px;min-width:0;margin:0;overflow:hidden}.calibration-inspector-grid figcaption{background:var(--panel);border-bottom:1px solid var(--line);padding:9px 10px;font-size:12px;font-weight:650}.calibration-inspector-grid img,.calibration-inspector-grid canvas{object-fit:contain;width:100%;height:auto;max-height:360px;display:block}.calibration-image-actions{grid-template-columns:minmax(260px,1fr) auto auto;align-items:end;gap:10px;display:grid}.calibration-relationships{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;display:grid}.calibration-score-comparison{grid-template-columns:minmax(260px,.7fr) minmax(420px,1.3fr);align-items:stretch;gap:16px;display:grid}.calibration-colour-controls{gap:14px;margin-bottom:18px;display:grid}.calibration-live-preview{border-top:1px solid var(--line);gap:10px;padding-top:14px;display:grid}.calibration-live-preview-label{color:var(--muted);letter-spacing:.04em;text-transform:uppercase;font-size:12px;font-weight:700}.calibration-controls-heading{justify-content:space-between;align-items:flex-start;gap:18px;display:flex}.calibration-controls-actions,.calibration-row-actions{align-items:center;gap:7px;display:flex}.calibration-row-actions{white-space:nowrap}.calibration-threshold-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;display:grid}.calibration-threshold-group{border:1px solid var(--line);border-radius:7px;min-width:0;padding:11px}.calibration-threshold-row{grid-template-columns:64px minmax(0,1fr) minmax(0,1fr);align-items:center;gap:8px;margin-top:8px;font-size:12px;display:grid}.calibration-threshold-row label{gap:2px;min-width:0;display:grid}.calibration-threshold-row small{color:var(--muted);font-variant-numeric:tabular-nums}.calibration-threshold-row input{width:100%}.calibration-formulas{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;display:grid}.calibration-formulas>div{background:#f6f7f2;border-radius:6px;gap:5px;min-width:0;padding:10px;font-size:12px;display:grid}.calibration-formulas code{white-space:normal;overflow-wrap:anywhere;color:var(--muted)}.calibration-method-details{color:var(--muted);font-size:12px}.calibration-method-details summary{cursor:pointer;font-weight:650}.calibration-method-details pre{white-space:pre-wrap;background:#f6f7f2;border-radius:6px;max-height:240px;padding:9px;overflow:auto}.calibration-delete{color:var(--danger);border-color:#fca5a5}@media (max-width:1050px){.calibration-controls-heading{display:grid}.calibration-score-comparison,.calibration-threshold-grid,.calibration-formulas,.calibration-inspector-grid{grid-template-columns:1fr}}.scatter-card{border:1px solid var(--line);background:var(--panel);border-radius:8px;min-width:0;padding:14px;overflow:hidden}.scatter-heading{justify-content:space-between;align-items:baseline;gap:12px;font-size:14px;display:flex}.scatter-heading span{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:12px}.scatter-chart{width:100%;height:auto;margin-top:8px;display:block}.scatter-grid-line{stroke:#e5e9e2;stroke-width:1px}.scatter-axis{stroke:#758077;stroke-width:1.2px}.scatter-tick{fill:var(--muted);font-size:11px}.scatter-axis-label{fill:var(--muted);font-size:12px}.scatter-point{fill:var(--accent);fill-opacity:.38}.scatter-trend{stroke:var(--danger);stroke-width:2px;stroke-dasharray:5 4}.error-box{color:#991b1b;background:#fee2e2;border:1px solid #fca5a5;border-radius:6px;margin-top:12px;padding:12px 16px;font-size:14px}.success-box{color:#065f46;background:#d1fae5;border:1px solid #6ee7b7;border-radius:6px;margin-top:12px;padding:12px 16px;font-size:14px}.info-box{color:#1e40af;background:#eff6ff;border:1px solid #bfdbfe;border-radius:6px;margin-top:12px;padding:12px 16px;font-size:14px}.warn-box{color:#92400e;background:#fef3c7;border:1px solid #fde68a;border-radius:6px;margin-top:12px;padding:12px 16px;font-size:14px}.loading{color:var(--muted);text-align:center;padding:40px 0;font-size:14px}.result-panel{border:1px solid var(--line);background:var(--panel);border-radius:8px;margin-top:20px;padding:24px}.score-display{color:var(--accent-strong);font-size:64px;font-weight:800;line-height:1}.score-sub{color:var(--muted);margin:4px 0 20px;font-size:14px}.kv-grid{grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:12px;display:grid}.kv-item{background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:10px 12px}.kv-label{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin-bottom:4px;font-size:11px}.kv-value{font-size:16px;font-weight:600}.code{word-break:break-all;background:#f1f5f9;border-radius:4px;padding:2px 6px;font-family:monospace;font-size:13px}.code-block{color:#e2e8f0;white-space:pre-wrap;word-break:break-all;background:#1e293b;border-radius:8px;padding:16px;font-family:monospace;font-size:13px;overflow-x:auto}.placeholder-state{text-align:center;color:var(--muted);padding:60px 20px}.placeholder-title{color:var(--text);margin-bottom:8px;font-size:18px;font-weight:600}.placeholder-desc{max-width:420px;margin:0 auto;font-size:14px}.health-row{align-items:center;gap:8px;font-size:14px;display:flex}.health-dot{border-radius:50%;flex-shrink:0;width:10px;height:10px}.health-dot.ok{background:#16a34a}.health-dot.error{background:#dc2626}.health-dot.checking{background:#d97706}.steps{flex-direction:column;gap:24px;display:flex}.step{grid-template-columns:32px 1fr;align-items:start;gap:14px;display:grid}.step-num{background:var(--accent);color:#fff;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:32px;height:32px;font-size:13px;font-weight:700;display:flex}.step-title{margin-bottom:8px;font-weight:600}.tag{color:var(--accent-strong);background:#e5efe4;border-radius:4px;align-items:center;gap:4px;margin:2px;padding:3px 8px;font-size:12px;display:inline-flex}.formula-settings-layout{grid-template-columns:280px minmax(0,1fr);align-items:start;gap:20px;display:grid}.formula-settings-layout>aside{max-height:calc(100vh - 40px);overflow-y:auto}.formula-section-heading{justify-content:space-between;align-items:flex-start;gap:16px;margin-bottom:16px;display:flex}.formula-section-heading h2{margin:0 0 4px}.formula-file-button{cursor:pointer;white-space:nowrap}.formula-reference-empty{min-height:150px;color:var(--muted);text-align:center;background:#f8faf7;border:1px dashed #b9c8b9;border-radius:10px;place-content:center;justify-items:center;gap:7px;display:grid}.formula-reference-empty strong{color:var(--text)}.formula-reference-grid{grid-template-columns:minmax(240px,1fr) minmax(240px,1fr) 260px;align-items:start;gap:14px;display:grid}.formula-reference-grid figure{border:1px solid var(--line);background:#f7f8f4;border-radius:8px;min-height:260px;margin:0;padding:10px;position:relative}.formula-reference-grid figcaption{margin-bottom:8px;font-size:12px;font-weight:700}.formula-reference-grid img,.formula-reference-grid canvas{aspect-ratio:1;object-fit:cover;background:#e9ede7;border-radius:6px;width:100%;display:block}.formula-canvas-placeholder{color:var(--muted);text-align:center;place-content:center;font-size:12px;display:grid;position:absolute;inset:48px 18px 18px}.formula-reference-results{gap:10px;display:grid}.formula-reference-score{background:#edf7ee;border:1px solid #bad8bf;border-radius:9px;gap:2px;padding:14px;display:grid}.formula-reference-score span,.formula-reference-score small{color:var(--muted);font-size:12px}.formula-reference-score strong{color:#21633b;font-size:34px;line-height:1.05}.formula-reference-metrics{grid-template-columns:repeat(7,minmax(90px,1fr));gap:8px;margin-top:12px;display:grid}.formula-reference-metrics>div{border:1px solid var(--line);background:#f6f7f2;border-radius:6px;gap:2px;padding:9px 10px;display:grid}.formula-reference-metrics span{color:var(--muted);font-size:11px}.formula-reference-metrics strong{font-size:14px}@media (max-width:1250px){.formula-settings-layout{grid-template-columns:1fr}.formula-settings-layout>aside{max-height:none;position:static!important}.formula-reference-grid{grid-template-columns:1fr 1fr}.formula-reference-results{grid-column:1/-1;grid-template-columns:repeat(2,minmax(0,1fr))}.formula-reference-metrics{grid-template-columns:repeat(4,minmax(90px,1fr))}}@media (max-width:760px){.formula-section-heading{flex-direction:column}.formula-reference-grid{grid-template-columns:1fr}.formula-reference-results{grid-column:auto;grid-template-columns:1fr}.formula-reference-metrics{grid-template-columns:repeat(2,minmax(90px,1fr))}}@media (min-width:900px){.two-col{grid-template-columns:1fr 1fr;gap:24px;display:grid}}@media (max-width:860px){.shell{grid-template-columns:1fr}.sidebar{border-right:0;border-bottom:1px solid var(--line);height:auto;position:static}.grid,.calibration-top,.calibration-upload-grid,.calibration-csv-grid,.calibration-relationships,.calibration-image-actions{grid-template-columns:1fr}}
