:root{--bg:#f7f8fc;--surface:#fff;--border:#e3e6ee;--text:#202337;--muted:#667085;--muted-text:#667085;--primary:#4f46e5;--primary-dark:#4338ca;--primary-light:#eef0ff;--accent:#2563eb;--danger:#dc2626;--danger-light:#fee2e2;--warning:#d97706;--warning-light:#fef3c7;--ok:#16a34a;--radius:14px;--shadow:0 3px 16px #20233706;--mono:ui-monospace, SFMono-Regular, Menlo, Consolas, monospace}*{box-sizing:border-box;margin:0;padding:0}html,body,#root{min-height:100vh}body{background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Microsoft YaHei,Roboto,sans-serif;font-size:14px;line-height:1.65}code{font-family:var(--mono);background:var(--primary-light);border-radius:4px;padding:0 4px;font-size:.88em}a{color:inherit}button,a,input,select,summary,[role=button]{-webkit-tap-highlight-color:transparent}:focus-visible{outline-offset:3px;outline:3px solid #a5a3ff}input[type=checkbox],input[type=radio],input[type=range]{accent-color:var(--primary)}.ui-icon{vertical-align:middle;flex:none;display:inline-block}.suite-bar{background:var(--surface);border-bottom:1px solid var(--border)}.suite-bar-inner{justify-content:space-between;align-items:center;gap:18px;max-width:1240px;min-height:66px;margin:0 auto;padding:0 26px;display:flex}.suite-with-home{flex-wrap:wrap;padding-top:10px;padding-bottom:10px}.suite-brand{letter-spacing:.02em;align-items:center;gap:10px;font-weight:650;display:inline-flex}.suite-mark{width:30px;height:30px;color:var(--primary);background:var(--primary-light);border-radius:9px;justify-content:center;align-items:center;display:inline-flex}.suite-nav{background:var(--bg);border:1px solid var(--border);border-radius:10px;gap:4px;padding:4px;display:flex}.suite-nav a{text-align:center;min-width:62px;color:var(--muted-text);border-radius:7px;padding:5px 13px;font-size:13px;font-weight:600;text-decoration:none}.suite-nav a:hover{color:var(--primary);background:var(--primary-light)}.suite-nav a[aria-current=page]{background:var(--primary);color:#fff;box-shadow:0 2px 4px #4f46e51a}.container{max-width:1240px;margin:0 auto;padding:30px 26px 28px}.app-header{justify-content:space-between;align-items:center;gap:24px;margin-bottom:26px;display:flex}.app-title{min-width:0}.app-eyebrow{color:var(--primary);letter-spacing:.16em;margin-bottom:4px;font-size:10px;font-weight:700;display:block}.app-header h1{letter-spacing:-.04em;color:var(--text);font-size:29px;font-weight:700;line-height:1.45}.app-header .sub{color:var(--muted-text);margin-top:5px;font-size:13px}.header-tools{flex-direction:column;flex:none;align-items:flex-end;gap:10px;display:flex}.header-actions{gap:8px;display:flex}.header-actions button{padding:7px 13px;font-size:13px}.privacy-note{color:var(--muted-text);align-items:center;gap:6px;font-size:12px;display:inline-flex}.privacy-note .ui-icon{width:15px;height:15px}.current-project{color:var(--muted-text);align-items:center;gap:8px;min-width:0;margin:-8px 0 18px;font-size:12px;display:flex}.current-project strong{color:var(--text);text-overflow:ellipsis;white-space:nowrap;font-weight:500;overflow:hidden}.current-project>span{flex:none}.steps{grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:0 0 22px;display:grid}.step{text-align:left;background:var(--surface);border:1px solid var(--border);color:var(--muted-text);cursor:default;-webkit-user-select:none;user-select:none;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;font-size:13px;font-weight:600;display:flex}.step .num{background:var(--bg);width:29px;height:29px;color:var(--muted-text);border-radius:9px;flex:none;justify-content:center;align-items:center;font-size:12px;font-weight:600;display:inline-flex}.step-copy{flex-direction:column;gap:1px;min-width:0;display:flex}.step-copy small{color:var(--muted-text);font-size:11px;font-weight:400}.step.active{color:var(--primary-dark);background:var(--primary-light);border-color:#b8b6f4}.step.active .num{background:var(--primary);color:#fff}.step.done{color:var(--primary-dark);cursor:pointer}.step.done .num{background:var(--primary-dark);color:#fff}.step.done:hover{border-color:var(--primary)}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);min-width:0;margin-bottom:18px;padding:24px}.card h2{color:var(--text);margin-bottom:14px;font-size:16px;font-weight:650;line-height:1.6}.card h2 .hint{color:var(--muted-text);margin-left:8px;font-size:.82rem;font-weight:400}button{line-height:1.5;font:inherit;cursor:pointer;border:1px solid var(--border);background:var(--surface);color:var(--text);border-radius:8px;justify-content:center;align-items:center;gap:7px;padding:8px 16px;font-weight:500;transition:background-color .12s,border-color .12s,color .12s;display:inline-flex}button:hover:not(:disabled){border-color:var(--primary);color:var(--primary-dark)}button:disabled{opacity:.45;cursor:not-allowed}button.primary{background:var(--primary);border-color:var(--primary);color:#fff;box-shadow:0 2px 3px #4f46e512}button.primary:hover:not(:disabled){background:var(--primary-dark);color:#fff}button.ghost{color:var(--muted-text);background:0 0;border-color:#0000}button.danger{color:var(--danger);border-color:var(--danger-light);background:var(--danger-light)}button.small{padding:4px 10px;font-size:.82rem}input[type=text],input[type=number],input[type=password],select{font:inherit;border:1px solid var(--border);color:var(--text);background:#fff;border-radius:8px;min-width:0;padding:7px 10px}input:focus,select:focus{outline:3px solid var(--primary-light);border-color:var(--primary);outline-offset:1px}.upload-area{text-align:center;cursor:pointer;background:#fafbff;border:1.5px dashed #c9ccdf;border-radius:12px;flex-direction:column;align-items:center;padding:30px 20px;transition:background-color .15s,border-color .15s;display:flex}.upload-area:hover,.upload-area.dragover{border-color:var(--primary);background:var(--primary-light)}.upload-area .big{margin:16px 0 5px;font-size:17px;font-weight:600}.upload-area .formats{color:var(--muted-text);font-size:12px}.upload-area small{color:var(--muted-text);margin-top:12px;font-size:11px}.upload-icon{width:54px;height:54px;color:var(--primary);background:#fff;border:1px solid #e2e3fb;border-radius:14px;justify-content:center;align-items:center;display:flex;box-shadow:0 4px 8px #4f46e507}.upload-icon .ui-icon{width:25px;height:25px}.upload-select{background:var(--surface);border:1px solid var(--border);border-radius:8px;align-items:center;gap:28px;margin-top:22px;padding:8px 15px;font-size:13px;font-weight:600;display:flex}.upload-select .ui-icon{width:15px;height:15px}.import-heading{justify-content:space-between;align-items:flex-start;gap:20px;margin-bottom:20px;display:flex}.import-heading h2{margin:0 0 5px}.import-heading .hint-line{margin:0;font-size:13px}.format-badge{border:1px solid var(--border);background:var(--bg);color:var(--muted-text);white-space:nowrap;border-radius:6px;padding:4px 8px;font-size:10px}.import-layout{grid-template-columns:minmax(0,1fr) 285px;gap:24px;display:grid}.instrument-note{color:var(--muted-text);margin:13px 2px 0;font-size:11px;line-height:1.8}.import-shortcuts{border:1px solid var(--border);background:#fafbfe;border-radius:12px;padding:20px}.auto-analysis-intro h3{margin:10px 0 5px;font-size:15px;font-weight:650}.auto-analysis-intro p{color:var(--muted-text);font-size:12px;line-height:1.8}.shortcut-icon{color:var(--primary)}.auto-analysis-action{margin:16px 0 0}.auto-analysis-action button{width:100%;padding:10px 12px;font-size:13px}.auto-analysis-action button .ui-icon:last-child{width:15px;height:15px;margin-left:auto}.import-shortcuts .demo-row{border-top:1px solid var(--border);justify-content:stretch;gap:6px;margin-top:20px;padding-top:16px}.demo-caption{color:var(--muted-text);width:100%;margin-bottom:4px;font-size:11px}.import-shortcuts .demo-row button{justify-content:space-between;width:100%;padding:7px 10px;font-size:12px;font-weight:500}.import-shortcuts .demo-row .ui-icon{width:13px;height:13px;color:var(--muted-text)}.parsing{text-align:center;color:var(--muted-text);padding:30px}.sheet-list{flex-direction:column;gap:8px;margin:12px 0;display:flex}.sheet-item{border:1px solid var(--border);cursor:pointer;border-radius:8px;align-items:center;gap:10px;padding:10px 14px;display:flex}.sheet-item:hover{border-color:var(--primary)}.sheet-item.picked{border-color:var(--primary);background:var(--primary-light)}.sheet-item .radio{border:2px solid var(--border);border-radius:50%;flex:none;width:14px;height:14px}.sheet-item.picked .radio{border-color:var(--primary);background:var(--primary)}.sheet-item .meta{color:var(--muted-text);font-size:.82rem}.modal-overlay{z-index:50;background:#0f283259;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.modal{background:var(--surface);border-radius:12px;width:92vw;max-width:640px;max-height:82vh;padding:22px;overflow:auto;box-shadow:0 12px 40px #0f283240}.modal h3{margin-bottom:10px}.mapping-grid{grid-template-columns:repeat(auto-fit,minmax(min(240px,100%),1fr));gap:16px;margin-bottom:18px;display:grid}.mapping-field{flex-direction:column;gap:4px;display:flex}.mapping-field label{font-size:.84rem;font-weight:600}.mapping-field .req{color:var(--danger)}.mapping-field .score{color:var(--muted-text);font-size:.76rem}.mapping-field select.auto-ok{border-color:var(--primary)}.header-row-row{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:14px;display:flex}.header-row-row input[type=range]{flex:1;min-width:180px}.preview-wrap{border:1px solid var(--border);border-radius:8px;max-height:340px;overflow:auto}table.preview{border-collapse:collapse;white-space:nowrap;font-size:.83rem}table.preview th,table.preview td{border:1px solid var(--border);text-align:left;text-overflow:ellipsis;max-width:220px;padding:4px 9px;overflow:hidden}table.preview th{background:#f3f4fa;position:sticky;top:0}table.preview th.mapped{background:var(--primary-light);color:var(--primary-dark)}table.preview td.flagged{background:var(--danger-light)}.plate-wrap{padding-bottom:6px;overflow:auto}table.plate{border-collapse:collapse;margin:0 auto}table.plate th,table.plate td{border:1px solid var(--border);text-align:center;vertical-align:middle;width:52px;height:40px;padding:1px;font-size:.68rem}table.plate th{background:#f3f4fa;font-size:.72rem;font-weight:600}td.well{cursor:pointer;border-radius:4px}td.well:hover{outline:2px solid var(--primary)}td.well .wellname{color:var(--muted-text);font-size:.6rem;display:block}td.well.empty{cursor:default;background:#f2f5f6}td.well.excluded{opacity:.6;background:repeating-linear-gradient(45deg,#f3f4f6,#f3f4f6 4px,#e5e7eb 4px 8px);text-decoration:line-through}td.well.flagged{box-shadow:inset 0 0 0 2px var(--warning)}.legend{color:var(--muted-text);flex-wrap:wrap;gap:14px;margin:10px 0 0;font-size:.8rem;display:flex}.legend .chip{vertical-align:-1px;border-radius:3px;width:12px;height:12px;margin-right:4px;display:inline-block}.config-grid{grid-template-columns:1fr 1fr;gap:16px;display:grid}@media (width<=900px){.config-grid{grid-template-columns:1fr}}.check-list{border:1px solid var(--border);border-radius:8px;max-height:220px;padding:8px;overflow:auto}.check-list label{cursor:pointer;border-radius:6px;align-items:center;gap:7px;padding:3px 6px;display:flex}.check-list label:hover{background:var(--primary-light)}.check-list .tag{color:var(--muted-text);margin-left:auto;font-size:.78rem}.qc-inputs{grid-template-columns:1fr 1fr;gap:10px;display:grid}.qc-inputs label{color:var(--muted-text);flex-direction:column;gap:3px;font-size:.82rem;display:flex}.qc-summary{grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px;margin-bottom:14px;display:grid}.qc-card{border:1px solid var(--border);text-align:center;background:#f7f8fc;border-radius:10px;padding:14px 12px}.qc-card .v{color:var(--primary-dark);font-size:1.35rem;font-weight:700}.qc-card .l{color:var(--muted-text);font-size:.78rem}.qc-flag-list{max-height:260px;font-size:.85rem;overflow:auto}.qc-flag-row{border-radius:6px;align-items:baseline;gap:10px;padding:5px 8px;display:flex}.qc-flag-row:hover{background:var(--danger-light)}.qc-flag-row .reasons{color:var(--danger);font-size:.8rem}.results-toolbar{flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:12px;display:flex}.gene-tabs{flex-wrap:wrap;gap:6px;display:flex}.gene-tabs button.on{background:var(--primary);border-color:var(--primary);color:#fff}table.results{border-collapse:collapse;width:100%;font-size:.85rem}table.results th,table.results td{border-bottom:1px solid var(--border);text-align:right;padding:6px 10px}table.results th:first-child,table.results td:first-child{text-align:left}table.results th{background:#f3f4fa;font-weight:600;position:sticky;top:0}table.results tr.ctrl td{color:var(--muted-text);background:#fafbfe}table.results .sig{color:var(--primary-dark);font-weight:700}.chart-box{background:#fff}.chart-box svg{width:100%;height:auto;display:block}.warning-banner{background:var(--warning-light);color:#7c5a0a;border:1px solid #f0d48a;border-radius:8px;margin-bottom:14px;padding:10px 14px;font-size:.88rem}.toast{background:var(--text);color:#fff;z-index:99;overflow-wrap:anywhere;border-radius:20px;max-width:calc(100vw - 32px);padding:9px 20px;font-size:.88rem;position:fixed;bottom:26px;left:50%;transform:translate(-50%);box-shadow:0 6px 24px #00000040}.row-actions{flex-wrap:wrap;gap:8px;margin-top:10px;display:flex}.hint-line{color:var(--muted-text);margin:6px 0 10px;font-size:.84rem}.empty-note{color:var(--muted-text);text-align:center;padding:30px 0}td.well.ntc{background:#dce6ec}td.well.ntc .wellname{color:#8a9aa3}.ntc-list{flex-direction:column;gap:6px;font-size:.88rem;display:flex}.ntc-row{border:1px solid var(--border);border-radius:8px;align-items:baseline;gap:12px;padding:7px 10px;display:flex}.ntc-row .tag{color:var(--muted-text);margin-left:auto;font-size:.78rem}.ntc-row.ntc-contaminated{background:var(--danger-light);border-color:#f3c1c1}.ntc-row.ntc-late{background:var(--warning-light);border-color:#f0d48a}.ntc-row.ntc-pass{background:#f2faf6}.report-head{align-items:center;gap:18px;margin-bottom:14px;display:flex}.score-ring{background:conic-gradient(var(--primary) calc(var(--score,0) * 1%), #e8eef0 0);border-radius:50%;flex-direction:column;flex:none;justify-content:center;align-items:center;width:92px;height:92px;display:flex;position:relative}.score-ring:before{content:"";background:#fff;border-radius:50%;position:absolute;inset:8px}.score-ring .score-num{color:var(--primary-dark);font-size:1.7rem;font-weight:800;position:relative}.score-ring .score-cap{color:var(--muted-text);font-size:.68rem;position:relative}.report-summary p{font-size:.92rem}.report-section{margin-top:12px}.report-section>strong{font-size:.9rem}.issue-list,.advice-list{flex-direction:column;gap:6px;margin-top:8px;list-style:none;display:flex}.issue-list li{background:#f7f8fc;border-radius:8px;flex-wrap:wrap;align-items:baseline;gap:8px;padding:6px 10px;font-size:.88rem;display:flex}.issue-list li.sev-error{background:var(--danger-light)}.issue-list li.sev-warning{background:var(--warning-light)}.sev-chip{color:var(--muted-text);background:#e2e8ea;border-radius:10px;flex:none;padding:1px 8px;font-size:.72rem;font-weight:700}.sev-error .sev-chip{background:var(--danger);color:#fff}.sev-warning .sev-chip{background:var(--warning);color:#fff}.advice-list li{padding:4px 0;font-size:.88rem}.merge-list{flex-direction:column;gap:8px;margin-bottom:12px;display:flex}.merge-row{border:1px solid var(--border);border-radius:8px;align-items:flex-start;gap:10px;padding:10px 14px;display:flex}.merge-row.merge-bad{background:var(--danger-light)}.std-list{flex-direction:column;gap:6px;font-size:.88rem;display:flex}.std-row{border:1px solid var(--border);border-radius:8px;flex-wrap:wrap;align-items:center;gap:12px;padding:8px 12px;display:flex}.std-row.std-good{background:#f2faf6}.std-row.std-warn{background:var(--warning-light);border-color:#f0d48a}.std-row button{margin-left:auto}.help-box{background:var(--surface);border:1px solid var(--border);border-radius:12px;margin-bottom:18px;padding:14px 18px;font-size:13px}.help-box summary{cursor:pointer;color:var(--primary-dark);-webkit-user-select:none;user-select:none;font-weight:600}.help-box .help-body{flex-direction:column;gap:10px;margin-top:10px;display:flex}.help-box .help-body ul{margin:4px 0 0 18px}.help-box .help-body li{margin:2px 0}.demo-row{flex-wrap:wrap;justify-content:center;align-items:center;gap:8px;margin-top:10px;display:flex}.ai-answer{border-top:1px solid var(--border);margin-top:10px;padding-top:10px;font-size:.92rem}.ai-answer h3,.ai-answer h4{color:var(--primary-dark);margin:10px 0 4px}.project-list{flex-direction:column;gap:8px;max-height:50vh;margin:12px 0;display:flex;overflow:auto}.project-row{border:1px solid var(--border);border-radius:8px;align-items:center;gap:10px;padding:10px 14px;display:flex}.project-row.project-current{border-color:var(--primary);background:var(--primary-light)}.project-row input{flex:1}.tag-current{background:var(--primary);color:#fff;border-radius:10px;margin-left:8px;padding:1px 8px;font-size:.72rem;display:inline-block}.chart-settings{border:1px solid var(--border);background:#fafbfe;border-radius:10px;margin-bottom:18px;padding:18px}.chart-settings summary{cursor:pointer;color:var(--primary-dark);-webkit-user-select:none;user-select:none;font-weight:600}.chart-settings-grid{grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px;margin-top:10px;display:grid}.chart-settings-grid label{color:var(--muted-text);flex-direction:column;gap:3px;font-size:.82rem;display:flex}.chart-settings-grid input[type=color]{height:32px;padding:2px}.chart-setting-hint{color:var(--muted-text);margin:8px 0 0;font-size:.8rem;line-height:1.5}.chart-break-settings{background:var(--primary-light);border:1px solid var(--border);border-radius:8px;margin-top:14px;padding:12px}.chart-break-toggle{align-items:center;gap:6px;font-size:.88rem;font-weight:600;display:flex}.chart-break-summary{flex-wrap:wrap;align-items:center;gap:12px;margin-top:10px;font-size:.82rem;display:flex}.chart-setting-error{color:var(--danger);margin:8px 0 0;font-size:.84rem}.chart-preview{border:1px solid var(--border);background:#fff;border-radius:8px;overflow:auto hidden}.chart-preview svg{width:auto;max-width:none;height:auto;display:block}.method-caption{color:var(--muted-text);margin-top:8px;font-size:.82rem;line-height:1.5}.gene-multiselect{flex-wrap:wrap;align-items:center;gap:2px 0;margin-top:8px;display:flex}.label-input{width:90px;padding:4px 8px;font-size:.84rem}.config-grid>*,.import-layout>*,.mapping-grid>*,.chart-settings-grid>*{min-width:0}.preview-wrap,.plate-wrap,.chart-preview{max-width:100%}.results-toolbar>*,.std-row>*,.project-row>*,.merge-row>*{min-width:0}.hint-line,.warning-banner,.report-summary,.ntc-row,.std-row,.merge-row{overflow-wrap:anywhere}.workflow-actions{justify-content:space-between;margin-top:8px}.app-footer{color:var(--muted-text);border-top:1px solid var(--border);justify-content:space-between;gap:16px;margin-top:28px;padding-top:18px;font-size:11px;display:flex}.app-footer>span:first-child{font-weight:600}@media (width<=900px){.import-layout{grid-template-columns:minmax(0,1fr) 250px;gap:18px}.import-shortcuts{padding:16px}.step{gap:8px;padding:12px}.step-copy small{font-size:10px}.format-badge{display:none}.app-header{align-items:flex-start}.header-tools{padding-top:6px}}@media (width<=700px){.suite-bar-inner{min-height:60px;padding:0 18px}.container{padding:24px 18px}.app-header{flex-direction:column;gap:16px;margin-bottom:20px}.app-header h1{font-size:27px}.header-tools{flex-flow:wrap;justify-content:space-between;align-items:center;gap:12px;width:100%;padding:0}.steps{grid-template-columns:repeat(2,minmax(0,1fr))}.step-copy small{font-size:11px}.import-layout{grid-template-columns:minmax(0,1fr)}.import-shortcuts,.card{padding:20px}.upload-area{padding:28px 16px}.auto-analysis-intro h3{margin-left:8px;display:inline}.auto-analysis-intro p{margin-top:8px}.results-toolbar>button{flex:auto}.report-head{align-items:flex-start;gap:14px}.score-ring{width:76px;height:76px}.score-ring .score-num{font-size:1.4rem}.report-summary{min-width:0}.ntc-row{flex-wrap:wrap;gap:6px 10px}.project-row{flex-wrap:wrap}.modal{padding:18px}button:not(.step){min-height:40px}.chart-settings{padding:14px}.card h2 .hint{margin:4px 0 0;display:block}}@media (width<=440px){.suite-bar-inner{gap:10px;padding:0 14px}.suite-with-home{padding-top:10px;padding-bottom:10px}.suite-brand{gap:7px;font-size:12px}.suite-mark{width:27px;height:27px}.suite-nav{gap:2px;padding:3px}.suite-nav a{min-width:44px;padding:5px 9px;font-size:12px}.container{padding:22px 14px}.app-header .sub{font-size:12px}.card{padding:16px}.step{padding:11px 10px}.step-copy small{font-size:10px}.steps{gap:8px;margin-bottom:16px}.card h2{font-size:15px}.import-heading .hint-line{font-size:12px}.upload-area .big{font-size:16px}.upload-area small{max-width:220px}.upload-select{min-height:42px}.qc-inputs{grid-template-columns:minmax(0,1fr)}.qc-summary{grid-template-columns:repeat(2,minmax(0,1fr))}.workflow-actions{gap:12px}.workflow-actions>span{max-width:100%}.workflow-actions .primary{font-size:12px}.app-footer{flex-direction:column;gap:4px;margin-top:24px}}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important}}
