:root{--bg:#eef2f7;--bg2:#dbe5f0;--ink:#17202c;--muted:#627084;--card:#ffffff;--soft:#f6f8fb;--line:#d5dde8;--brand:#2563eb;--brand2:#60a5fa;--brand-dark:#1e40af;--danger:#b42318;--warn:#b7791f;--shadow:0 24px 80px rgba(30,41,59,.13),0 2px 10px rgba(30,41,59,.07)}*{box-sizing:border-box}body{margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;background:radial-gradient(circle at top left,#dce8f7,transparent 34rem),linear-gradient(135deg,var(--bg),var(--bg2));color:var(--ink);-webkit-font-smoothing:antialiased}.shell{max-width:1440px;margin:0 auto;padding:28px}.hero{display:flex;justify-content:space-between;gap:24px;align-items:flex-start;margin-bottom:24px}.eyebrow{letter-spacing:.14em;text-transform:uppercase;color:var(--brand);font-weight:800;font-size:12px;margin:0 0 8px}.hero h1{font-size:clamp(32px,5vw,58px);line-height:.95;margin:0;text-wrap:balance}.sub{color:var(--muted);font-size:18px;max-width:760px;text-wrap:pretty}.server-pill{padding:10px 14px;border-radius:999px;background:#fff;border:1px solid var(--line);box-shadow:0 1px 0 rgba(0,0,0,.02);font-size:13px;color:var(--muted)}.server-pill.ok{color:var(--brand-dark);border-color:#b8cdf6}.grid{display:grid;grid-template-columns:390px 430px 1fr;gap:18px;align-items:start}.card{background:rgba(255,255,255,.9);backdrop-filter:blur(10px);border:1px solid rgba(255,255,255,.75);border-radius:28px;padding:22px;box-shadow:var(--shadow)}.card-title{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:16px}.card-title h2{font-size:20px;margin:0;text-wrap:balance}.card-title span{font-size:13px;color:var(--muted)}.drop-zone{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:245px;border:2px dashed #aebbd0;border-radius:20px;background:linear-gradient(180deg,#fbfdff,#f3f6fb);cursor:pointer;transition:border-color .15s ease-out,transform .15s ease-out,background .15s ease-out;text-align:center;padding:20px}.drop-zone:hover,.drop-zone.drag{border-color:var(--brand);transform:translateY(-1px);background:#eef5ff}.drop-zone:active{transform:scale(.96)}.drop-zone input{display:none}.drop-icon{width:56px;height:56px;border-radius:18px;background:#dbeafe;color:var(--brand);display:grid;place-items:center;font-size:26px;margin-bottom:12px}.drop-zone strong{font-size:24px}.drop-zone small,.drop-zone em,.hint{color:var(--muted)}.drop-zone em{font-style:normal;margin-top:16px;max-width:100%;overflow:hidden;text-overflow:ellipsis}.slider-row{display:flex;justify-content:space-between;align-items:center;gap:12px;margin:18px 0 8px}.slider-row label{font-weight:700}.limit-control-box{display:flex;align-items:center;gap:8px;background:#eef4fb;border:1px solid #d4e1f1;border-radius:14px;padding:5px 8px}.limit-number{width:88px;min-height:40px;border:0;background:#fff;border-radius:10px;padding:0 10px;color:var(--brand-dark);font-weight:850;font-variant-numeric:tabular-nums;text-align:right;box-shadow:inset 0 0 0 1px #d8e1ee}.limit-number:focus{outline:2px solid #93c5fd;outline-offset:2px}.limit-max{color:var(--muted);font-size:13px;font-variant-numeric:tabular-nums;white-space:nowrap}.slider-row output{font-variant-numeric:tabular-nums;background:#eef4fb;color:var(--brand-dark);border-radius:999px;padding:5px 10px;font-weight:800}input[type=range]{width:100%;accent-color:var(--brand)}button{border:0;border-radius:14px;min-height:44px;padding:0 16px;font-weight:800;cursor:pointer;transition:transform .12s ease-out,opacity .12s ease-out,background .12s ease-out}button:active{transform:scale(.96)}.primary{width:100%;margin-top:18px;background:linear-gradient(90deg,var(--brand-dark),var(--brand));color:white}.secondary{background:#e7eef8;color:var(--brand-dark);margin-top:10px}.ghost{background:#f1f4f8;color:var(--muted);min-height:38px}.runs-list{display:flex;flex-direction:column;gap:12px;max-height:70vh;overflow:auto;padding-right:4px}.run-item{border:1px solid var(--line);border-radius:20px;background:#fbfdff;padding:14px;cursor:pointer;transition:transform .15s ease-out,border-color .15s ease-out}.run-item:hover,.run-item.active{transform:translateY(-1px);border-color:var(--brand)}.run-top{display:flex;justify-content:space-between;gap:10px}.run-title{font-weight:850;word-break:break-word}.badge{border-radius:999px;padding:4px 8px;font-size:12px;background:#edf2f8;color:var(--muted);white-space:nowrap}.badge.complete{background:#dbeafe;color:var(--brand-dark)}.badge.partial,.badge.uploaded{background:#fff3d8;color:var(--warn)}.bar{height:10px;background:#e8edf4;border-radius:999px;margin:12px 0;overflow:hidden}.bar span{display:block;height:100%;background:linear-gradient(90deg,var(--brand-dark),var(--brand2));border-radius:inherit}.run-meta{font-size:13px;color:var(--muted);font-variant-numeric:tabular-nums}.detail-card{min-height:720px}.empty{min-height:560px;display:grid;place-items:center;text-align:center;color:var(--muted);border:1px dashed var(--line);border-radius:20px;padding:30px}.hidden{display:none}.progress-wrap{display:flex;gap:22px;align-items:center;margin-bottom:18px}.wheel{--pct:0;--review:0;--fail:0;position:relative;width:132px;height:132px;border-radius:50%;background:conic-gradient(var(--brand) 0 calc(var(--pct)*1%),var(--warn) calc(var(--pct)*1%) calc((var(--pct) + var(--review))*1%),var(--danger) calc((var(--pct) + var(--review))*1%) calc((var(--pct) + var(--review) + var(--fail))*1%),#e8edf4 0);display:grid;place-items:center;box-shadow:inset 0 0 0 1px rgba(0,0,0,.04);transition:background .9s ease-out}.wheel:after{content:"";position:absolute;inset:14px;background:white;border-radius:50%;box-shadow:inset 0 0 0 1px var(--line)}.wheel span{position:relative;z-index:1;font-size:26px;font-weight:900;font-variant-numeric:tabular-nums}.numbers{display:grid;grid-template-columns:repeat(3,minmax(80px,1fr));gap:10px;flex:1}.numbers div{border:1px solid var(--line);border-radius:18px;padding:14px;background:#fbfdff}.numbers strong{display:block;font-size:28px;font-variant-numeric:tabular-nums}.numbers small{color:var(--muted)}h3{font-size:16px;margin:24px 0 10px}.table-wrap{max-height:360px;overflow:auto;border:1px solid var(--line);border-radius:18px}table{width:100%;border-collapse:collapse;font-size:13px}th,td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--line);vertical-align:top}th{position:sticky;top:0;background:#f7f9fc;z-index:1;color:#415067}td:nth-child(1){font-variant-numeric:tabular-nums;color:var(--muted)}.status{font-size:12px;font-weight:800;border-radius:999px;padding:4px 8px;display:inline-block;background:#edf2f8;color:var(--muted)}.status.completed{background:#dbeafe;color:var(--brand-dark)}.status.failed{background:#fde5e2;color:var(--danger)}.asset-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}.asset{border:1px solid var(--line);border-radius:18px;background:#fbfdff;overflow:hidden}.asset img{width:100%;height:120px;object-fit:contain;background:white;outline:1px solid oklch(0 0 0 / .1)}.asset a{display:block;padding:10px 12px;color:var(--brand-dark);text-decoration:none;font-size:13px;font-weight:800;word-break:break-word}.asset small{display:block;color:var(--muted);padding:0 12px 12px;font-variant-numeric:tabular-nums}@media(max-width:1180px){.grid{grid-template-columns:1fr}.runs-list{max-height:none}.hero{flex-direction:column}.detail-card{min-height:auto}}.action-row{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:10px}.action-row .primary,.action-row .secondary{margin-top:0}.inline-primary{width:auto}.run-log{max-height:160px;overflow:auto;background:#0f172a;color:#dbeafe;border-radius:16px;padding:14px;font-size:12px;line-height:1.45;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;white-space:pre-wrap;border:1px solid #253454}.run-item .badge.running,.run-item .badge.starting{background:#dbeafe;color:var(--brand-dark)}.run-item .badge.error{background:#fde5e2;color:var(--danger)}button[disabled]{opacity:.55;cursor:not-allowed}.bar span.failed{background:linear-gradient(90deg,var(--danger),#f97373)}

.asset-section{grid-column:1/-1;margin-bottom:16px}.asset-section h4{margin:0 0 10px;color:#314158;font-size:14px}.asset-grid-inner{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:12px}.asset-click{cursor:pointer;transition:transform .14s ease-out,box-shadow .14s ease-out}.asset-click:hover{transform:translateY(-2px);box-shadow:0 12px 30px rgba(30,41,59,.12)}.asset-open{width:100%;min-height:74px;text-align:left;background:#fbfdff;color:var(--ink);border-radius:0;padding:10px 12px;margin:0}.asset-open strong{display:block;color:var(--brand-dark);font-size:13px;word-break:break-word}.asset-open span,.asset-open small{display:block;color:var(--muted);font-size:12px;margin-top:4px}.asset-icon{height:120px;display:grid;place-items:center;background:#eef4fb;color:var(--brand-dark);font-weight:900;font-size:28px;letter-spacing:.05em}.asset-icon.zip{background:#e5edfa}.asset-icon.pdf{background:#dbeafe}.modal{position:fixed;inset:0;z-index:30;display:grid;place-items:center;padding:24px}.modal.hidden{display:none}.modal-backdrop{position:absolute;inset:0;background:rgba(15,23,42,.58);backdrop-filter:blur(5px)}.modal-card{position:relative;width:min(1120px,96vw);max-height:92vh;overflow:auto;background:white;border-radius:28px;box-shadow:0 30px 90px rgba(15,23,42,.35);border:1px solid rgba(255,255,255,.6);padding:20px}.modal-head{display:flex;justify-content:space-between;align-items:start;gap:20px;border-bottom:1px solid var(--line);padding-bottom:14px;margin-bottom:14px}.modal-head h2{margin:0;font-size:24px;word-break:break-word}.modal-body{min-height:260px}.preview-layout{display:grid;grid-template-columns:minmax(0,1.35fr) 330px;gap:18px;align-items:start}.big-preview{width:100%;max-height:70vh;object-fit:contain;background:white;border-radius:18px;outline:1px solid oklch(0 0 0 / .1)}.doc-frame{width:100%;height:min(72vh,760px);border:1px solid var(--line);border-radius:18px;background:#f8fafc}.download-link{display:inline-flex;align-items:center;min-height:42px;margin-top:12px;padding:0 14px;border-radius:14px;background:#e7eef8;color:var(--brand-dark);text-decoration:none;font-weight:850}.related-list,.zip-list{display:flex;flex-direction:column;gap:8px}.related-list button,.zip-entry{min-height:48px;text-align:left;background:#f7f9fc;color:var(--ink);border:1px solid var(--line);border-radius:14px;padding:9px 12px}.related-list button span,.zip-entry span{display:inline-block;min-width:42px;color:var(--brand-dark);font-size:11px;font-weight:900}.zip-entry strong{font-size:13px;word-break:break-word}.zip-entry small{display:block;color:var(--muted);margin-left:46px}.zip-entry.pdf{background:#eef5ff}.zip-entry.image{background:#f6f8fb}@media(max-width:900px){.preview-layout{grid-template-columns:1fr}.modal{padding:10px}.modal-card{border-radius:20px}.doc-frame{height:65vh}}

.result-files{margin:0 0 14px;border:1px solid #c8d7eb;background:linear-gradient(180deg,#f8fbff,#eef5ff);border-radius:18px;padding:14px}.result-main{display:flex;justify-content:space-between;align-items:center;gap:14px}.result-main strong{display:block;color:var(--brand-dark);font-size:16px}.result-main small{display:block;color:var(--muted);margin-top:4px;word-break:break-word}.result-download{margin-top:0;white-space:nowrap;background:linear-gradient(90deg,var(--brand-dark),var(--brand));color:white}.result-other{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.result-other a{background:white;border:1px solid var(--line);border-radius:999px;padding:7px 10px;color:var(--brand-dark);text-decoration:none;font-size:12px;font-weight:800}@media(max-width:700px){.result-main{flex-direction:column;align-items:flex-start}.result-download{width:100%;justify-content:center}}
.badge.needs_review{background:#fff7ed;color:#9a3412;border-color:#fed7aa}.run-item .bar span.needs-review{background:linear-gradient(90deg,#f59e0b,#2563eb)}
.title-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.danger-ghost{color:var(--danger);border-color:#f2b8b5;background:#fff7f6}.danger-ghost:hover{background:#fee2e2;color:#991b1b}
.manufacturer-panel{margin:0 0 14px;border:1px solid var(--line);border-radius:18px;padding:14px;background:#f8fbff}.manufacturer-panel.needs-learning{border-color:#fed7aa;background:#fffaf3}.manufacturer-panel.ready{border-color:#bfdbfe;background:#eff6ff}.manufacturer-summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:12px}.manufacturer-summary div{background:white;border:1px solid var(--line);border-radius:14px;padding:10px}.manufacturer-summary strong{display:block;font-size:22px;color:var(--brand-dark)}.manufacturer-summary small{display:block;color:var(--muted);font-size:12px}.warn-text{color:#9a3412;font-weight:700}.ok-text{color:var(--brand-dark);font-weight:700}.manufacturer-list{display:grid;gap:8px;margin-top:10px}.manufacturer-item{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;background:white;border:1px solid var(--line);border-radius:14px;padding:10px}.manufacturer-item.unsupported{border-color:#fed7aa}.manufacturer-item.supported{border-color:#bfdbfe}.manufacturer-item strong{display:block;color:var(--ink)}.manufacturer-item small{display:block;color:var(--muted);margin-top:3px}.manufacturer-item span{font-size:12px;font-weight:800;color:var(--brand-dark);white-space:nowrap}.manufacturer-item.unsupported span{color:#9a3412}.manufacturer-item ul{margin:8px 0 0 18px;padding:0;color:#475569;font-size:12px}.manufacturer-panel details{margin-top:10px}.manufacturer-panel summary{cursor:pointer;font-weight:800;color:#314158}@media(max-width:900px){.manufacturer-summary{grid-template-columns:repeat(2,minmax(0,1fr))}.manufacturer-item{flex-direction:column}.manufacturer-item span{white-space:normal}}
.learning-controls{display:flex;gap:10px;align-items:end;flex-wrap:wrap;margin:0 0 12px}.learning-controls div{display:flex;flex-direction:column;gap:5px}.learning-controls label{font-size:12px;color:var(--muted);font-weight:800}.learning-controls input{width:110px;border:1px solid var(--line);border-radius:12px;padding:10px 12px;background:white;font-weight:800;color:var(--ink)}.learning-live{margin:0 0 14px;border:1px solid #c8d7eb;background:linear-gradient(180deg,#f8fbff,#edf5ff);border-radius:20px;padding:14px;overflow:hidden}.learning-live.active{border-color:#93c5fd;box-shadow:0 0 0 1px rgba(37,99,235,.12),0 14px 34px rgba(37,99,235,.12)}.learning-head{display:flex;justify-content:space-between;gap:16px;align-items:start}.learning-head strong{display:block;color:var(--brand-dark);font-size:16px}.learning-head small{display:block;color:var(--muted);font-size:12px;margin-top:4px}.learning-pct{font-variant-numeric:tabular-nums;font-size:28px;font-weight:900;color:var(--brand-dark)}.learning-bar{height:10px;border-radius:999px;background:#dbeafe;overflow:hidden;margin:12px 0}.learning-bar span{display:block;height:100%;border-radius:inherit;background:linear-gradient(90deg,var(--brand-dark),var(--brand2));transition:width .25s ease-out}.learning-stats{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px}.learn-stat{background:white;border:1px solid var(--line);border-radius:14px;padding:9px;font-variant-numeric:tabular-nums}.learn-stat strong{display:block;color:var(--ink);font-size:19px}.learn-stat small{display:block;color:var(--muted);font-size:11px}.learn-stat.running{border-color:#93c5fd}.learn-stat.learned{border-color:#bfdbfe}.learn-stat.review{border-color:#fed7aa}.learn-stat.failed{border-color:#fecaca}.learning-current{display:flex;gap:10px;align-items:center;margin-top:12px;background:white;border:1px solid var(--line);border-radius:16px;padding:11px}.learning-current strong{display:block}.learning-current small{display:block;color:var(--muted);margin-top:2px}.pulse-dot{width:12px;height:12px;border-radius:999px;background:#94a3b8;flex:none}.learning-current.on .pulse-dot{background:var(--brand);box-shadow:0 0 0 0 rgba(37,99,235,.45);animation:pulseLearning 1.4s ease-out infinite}@keyframes pulseLearning{to{box-shadow:0 0 0 12px rgba(37,99,235,0)}}.learning-mini-list{display:flex;flex-wrap:wrap;gap:7px;margin-top:12px}.learn-chip{display:inline-flex;gap:6px;align-items:center;border:1px solid var(--line);border-radius:999px;padding:6px 9px;background:white;font-size:12px;font-weight:800}.learn-chip small{font-weight:700;color:var(--muted)}.learn-chip.learning{border-color:#93c5fd;color:var(--brand-dark)}.learn-chip.needs_manual_review{border-color:#fed7aa;color:#9a3412}.learn-chip.learned{border-color:#bfdbfe;color:var(--brand-dark)}@media(max-width:900px){.learning-stats{grid-template-columns:repeat(2,minmax(0,1fr))}.learning-head{flex-direction:column}.learning-pct{font-size:22px}}
.check-toggle{display:flex!important;flex-direction:row!important;align-items:center;gap:8px;min-height:42px;border:1px solid var(--line);border-radius:12px;padding:8px 11px;background:#fff;font-size:13px;font-weight:800;color:var(--ink);cursor:pointer}.check-toggle input{width:18px;height:18px;accent-color:var(--brand);flex:none}
.learning-explain{display:flex;gap:10px;align-items:flex-start;margin:12px 0;padding:12px;border-radius:16px;border:1px solid var(--line);background:white}.learning-explain strong{white-space:nowrap;color:var(--brand-dark)}.learning-explain span{color:#475569;font-size:13px;line-height:1.35}.learning-explain.idle{border-color:#fed7aa;background:#fffaf3}.learning-explain.running{border-color:#93c5fd;background:#eff6ff}.learn-stat em{display:block;margin-top:4px;color:#64748b;font-size:10px;font-style:normal}.learning-detail-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:12px}.learn-detail{background:white;border:1px solid var(--line);border-radius:16px;padding:10px}.learn-detail[open]{box-shadow:0 8px 20px rgba(30,41,59,.05)}.learn-detail summary{cursor:pointer;font-weight:900;color:#314158;font-size:13px}.learn-detail.compact{grid-column:auto}.learn-rows{display:grid;gap:7px;margin-top:9px;max-height:320px;overflow:auto}.learn-row{display:grid;grid-template-columns:minmax(130px,1fr) minmax(120px,.8fr) minmax(120px,1.4fr) 70px;gap:8px;align-items:start;border:1px solid var(--line);border-radius:12px;padding:9px;background:#fbfdff}.learn-row strong{display:block;color:var(--ink);font-size:13px}.learn-row small,.learn-row p,.learn-row time{color:#64748b;font-size:11px;margin:0;line-height:1.3}.learn-row span{font-size:11px;font-weight:900;border-radius:999px;padding:4px 7px;text-align:center;background:#eef2ff;color:#3730a3}.learn-row.running{border-color:#93c5fd;background:#eff6ff}.learn-row.open{border-color:#fed7aa;background:#fffaf3}.learn-row.open span{background:#ffedd5;color:#9a3412}.learn-row.review{border-color:#fde68a;background:#fffbeb}.learn-row.learned{border-color:#bfdbfe;background:#eff6ff}.learn-row.learned span{background:#dbeafe;color:#1e40af}.learn-row.failed{border-color:#fecaca;background:#fff1f2}.learn-row.failed span{background:#fee2e2;color:#991b1b}@media(max-width:900px){.learning-detail-grid{grid-template-columns:1fr}.learn-row{grid-template-columns:1fr}.learning-explain{flex-direction:column}.learning-explain strong{white-space:normal}}
.learn-actions{display:flex;flex-direction:column;gap:6px;align-items:flex-end}.adapter-request-btn{border:0;border-radius:999px;padding:7px 10px;background:linear-gradient(90deg,#1e40af,#2563eb);color:white;font-size:11px;font-weight:900;cursor:pointer;box-shadow:0 6px 14px rgba(37,99,235,.18)}.adapter-request-btn:hover{filter:brightness(1.05)}.adapter-request-btn:disabled{cursor:not-allowed;background:#cbd5e1;color:#475569;box-shadow:none}.learn-row.has-request{outline:2px solid rgba(37,99,235,.18)}@media(max-width:900px){.learn-actions{align-items:flex-start}.adapter-request-btn{width:100%}}

.adapter-request-btn.running,.adapter-request-btn.requested{background:#f59e0b;color:#111827}.adapter-request-btn.completed{background:#16a34a;color:white}.adapter-request-btn.failed{background:#dc2626;color:white}.adapter-request-btn.failed:disabled{background:#dc2626;color:white}

.manufacturer-actions{display:flex;flex-direction:column;gap:7px;align-items:flex-end}.manufacturer-item em{display:block;margin-top:5px;color:#64748b;font-size:12px;font-style:normal}.adapter-test-btn{border:0;border-radius:999px;padding:7px 11px;background:linear-gradient(90deg,#0f766e,#14b8a6);color:white;font-size:11px;font-weight:900;cursor:pointer}.adapter-test-btn:hover{filter:brightness(1.06)}.adapter-test-btn:disabled{background:#cbd5e1;color:#475569;cursor:not-allowed}.manufacturer-item.passed{border-color:#86efac;background:#f0fdf4}.manufacturer-item.partial{border-color:#fde68a;background:#fffbeb}.manufacturer-item.failed{border-color:#fecaca;background:#fff1f2}@media(max-width:900px){.manufacturer-actions{align-items:flex-start;width:100%}.adapter-test-btn{width:100%}}

.manufacturer-filter-box{margin:12px 0 14px;border:1px solid var(--line);border-radius:18px;padding:13px;background:#fbfdff}.manufacturer-filter-box label{display:block;font-size:12px;color:var(--muted);font-weight:900;margin-bottom:7px}.manufacturer-filter-row{display:flex;gap:8px;align-items:center}.manufacturer-filter-row select{flex:1;min-width:220px;border:1px solid var(--line);border-radius:12px;padding:10px 12px;background:white;color:var(--ink);font-weight:800}.manufacturer-filter-box small{display:block;margin-top:7px;color:#64748b}.manufacturer-filter-row button{white-space:nowrap}@media(max-width:700px){.manufacturer-filter-row{flex-direction:column;align-items:stretch}.manufacturer-filter-row select{min-width:0;width:100%}}
