:root{--bg:#f1f3f7;--surface:#fff;--text:#172033;--muted:#55607a;--border:#dde2ec;--brand:#1d4ed8;--brand-hover:#1a43bd;--brand-soft:#e8efff;--rail:#101a33;--rail-text:#c3cde3;--radius:12px;--shadow:0 1px 2px #1720330f, 0 4px 14px #17203314;--shadow-hover:0 2px 4px #1720331a, 0 10px 26px #1720332a}*{box-sizing:border-box}body{background:var(--bg);color:var(--text);margin:0;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;line-height:1.45}:focus-visible{outline-offset:2px;outline:3px solid #f59e0b}button,select,input{font:inherit;color:inherit}button{cursor:pointer}button:where(:not(.card):not(.close)){background:var(--surface);border:1px solid #b8c0d2;border-radius:8px;padding:6px 14px}button:where(:not(.card):not(.close)):hover:where(:not(:disabled)){background:var(--brand-soft);border-color:var(--brand)}button:disabled{cursor:not-allowed;opacity:.55}button.primary{background:var(--brand);border-color:var(--brand);color:#fff;width:100%;padding:10px 18px;font-weight:600}button.primary:hover:not(:disabled){background:var(--brand-hover);border-color:var(--brand-hover)}select,input:not([type=range]):not([type=checkbox]){background:var(--surface);border:1px solid #b8c0d2;border-radius:8px;padding:7px 10px}.shell{min-height:100vh;display:flex}.rail{background:var(--rail);width:168px;color:var(--rail-text);flex:none;height:100vh;padding:18px 12px;position:sticky;top:0}.rail h1{color:#fff;letter-spacing:.2px;align-items:center;gap:8px;margin:0 0 22px;font-size:15px;display:flex}.rail .logo{color:#7fb0ff;flex:none;width:26px;height:26px}.rail a{color:var(--rail-text);border-radius:8px;padding:9px 12px;text-decoration:none;display:block}.rail a:hover{color:#fff;background:#ffffff14}.rail a.active{color:#fff;background:#ffffff1f;font-weight:600}main{flex:1;min-width:0;padding:14px 20px 40px}header{justify-content:flex-end;align-items:center;gap:12px;min-height:40px;display:flex}header .user{align-items:center;gap:8px;font-weight:600;display:inline-flex}.avatar{background:var(--brand);color:#fff;border-radius:50%;place-items:center;width:30px;height:30px;font-size:14px;display:inline-grid}.page-head h2{color:#0f1b4d;margin:6px 0 2px;font-size:26px}.page-head p{color:var(--muted);margin:0 0 4px}.filters,.login{flex-wrap:wrap;gap:8px;margin:12px 0;display:flex}.filters{background:var(--surface);border-radius:var(--radius);box-shadow:var(--shadow);padding:12px}.filters input{flex:200px;min-width:160px}.login{background:var(--surface);border-radius:var(--radius);box-shadow:var(--shadow);align-items:center;max-width:560px;padding:14px}.count{color:var(--muted);margin:14px 2px 10px;font-size:14px}.grid{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:18px;display:grid}.card{text-align:left;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;box-shadow:var(--shadow);flex-direction:column;gap:8px;padding:0 0 12px;transition:transform .15s,box-shadow .15s,border-color .15s;display:flex;position:relative;overflow:hidden}.card:hover{box-shadow:var(--shadow-hover);border-color:#b8c7f0;transform:translateY(-3px)}.card strong{-webkit-line-clamp:2;-webkit-box-orient:vertical;min-height:2.6em;padding:0 12px;font-size:15px;line-height:1.3;display:-webkit-box;overflow:hidden}.card .meta{min-height:22px;color:var(--muted);align-items:center;gap:6px;padding:0 12px;font-size:12px;display:flex}.chip{border-radius:999px;padding:2px 9px;font-size:12px;font-weight:600;display:inline-block}.chip.exp{background:var(--brand-soft);color:#1e3a8a}.chip.viewer{color:#14532d;background:#e6f6ec}.thumb{aspect-ratio:16/9;background:#dfe3ea;width:100%}.card img{aspect-ratio:16/9;object-fit:cover;background:#2b303b;width:100%;height:auto;display:block}.badge{color:#3b2a00;background:#fcd34d;border-radius:999px;padding:2px 10px;font-size:12px;font-weight:700;position:absolute;top:10px;right:10px}.card.unavailable{box-shadow:none;cursor:not-allowed;background:#f7f8fb}.card.unavailable:hover{box-shadow:none;border-color:var(--border);transform:none}.card.unavailable strong{color:var(--muted)}.card.unavailable .thumb{opacity:.55}.skeleton{pointer-events:none;box-shadow:none}.skeleton .line{background:#e4e8f0;border-radius:6px;height:12px;margin:0 12px;display:block}.skeleton .line.short{width:40%}.skeleton .thumb{animation:1.2s ease-in-out infinite alternate pulse}@keyframes pulse{0%{opacity:.55}to{opacity:1}}@media (prefers-reduced-motion:reduce){.skeleton .thumb{animation:none}.card{transition:none}.card:hover{transform:none}}.pager{justify-content:center;align-items:center;gap:14px;margin:24px 0 0;display:flex}.backdrop{background:#0b122399;position:fixed;inset:0}.detail{background:var(--surface);width:min(440px,100%);padding:20px 24px 28px;position:fixed;top:0;bottom:0;right:0;overflow:auto;box-shadow:-8px 0 30px #0005}.detail h2{color:#0f1b4d;margin:14px 0 6px;font-size:22px}.detail .detail-img{aspect-ratio:16/9;object-fit:cover;background:#2b303b;border-radius:10px;width:100%;margin-top:12px;display:block}.detail .close{float:right;background:0 0;border:1px solid #b8c0d2;border-radius:8px;padding:5px 12px}.detail .close:hover{background:var(--brand-soft);border-color:var(--brand)}.detail .hint{color:var(--muted);margin:8px 0 0;font-size:13px}@media (width<=720px){.shell{flex-direction:column}.rail{justify-content:space-between;align-items:center;width:auto;height:auto;padding:10px 14px;display:flex;position:static}.rail h1{margin:0}main{padding:10px 14px 30px}.grid{grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:12px}.page-head h2{font-size:22px}}.error{color:#b00020}.sim-bar{justify-content:space-between;align-items:center;gap:12px;display:flex}.sim-bar h2{color:#0f1b4d;margin:0;font-size:19px}.sim-body{flex-wrap:wrap;align-items:flex-start;gap:16px;margin-top:12px;display:flex}.bench{flex-direction:column;flex:560px;gap:12px;min-width:0;max-width:1240px;display:flex}.bench .scene{aspect-ratio:800/440;touch-action:none;-webkit-user-select:none;user-select:none;border-radius:8px;flex:none;width:100%;max-width:none;height:auto}.sim aside{background:var(--surface);border-radius:var(--radius);max-width:380px;box-shadow:var(--shadow);flex:280px;max-height:calc(100vh - 24px);padding:14px 18px 18px;position:sticky;top:12px;overflow:auto}.steps,.log{margin:4px 0 12px;padding:0;list-style:none}.panel-title{color:#0f1b4d;justify-content:space-between;align-items:baseline;gap:8px;margin:14px 0 6px;font-size:16px;display:flex}.panel-title:first-child{margin-top:0}.progress-text{color:var(--muted);font-size:13px;font-weight:600}.sub{color:var(--muted);margin:0 0 8px;font-size:13px}.bar{background:#e1e6f0;border-radius:999px;height:8px;margin:2px 0 10px;overflow:hidden}.bar span{background:#16a34a;border-radius:999px;height:100%;transition:width .3s;display:block}.steps li{color:var(--muted);border:1px solid #0000;border-radius:8px;align-items:flex-start;gap:10px;margin:4px 0;padding:8px 10px;font-size:14px;display:flex}.steps .num{color:#33405c;background:#e1e6f0;border-radius:50%;flex:none;place-items:center;width:24px;height:24px;font-size:12px;font-weight:700;display:inline-grid}.steps li .txt{flex:1;padding-top:2px}.steps li.done{color:#14532d}.steps li.done .num{color:#fff;background:#16a34a}.steps li.current{background:var(--brand-soft);color:var(--text);border-color:#aac0f5;font-weight:600}.steps li.current .num{background:var(--brand);color:#fff}.pill{background:var(--brand);color:#fff;border-radius:999px;flex:none;align-self:center;padding:1px 9px;font-size:12px;font-weight:700}.sr{clip:rect(0 0 0 0);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.howto{background:#f4f7ff;border:1px solid #d5def5;border-radius:10px;margin:0 0 10px;padding:8px 12px;font-size:13.5px}.howto summary{cursor:pointer;color:#0f1b4d;font-weight:700}.howto ol{counter-reset:tip;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px;margin:8px 0 2px;padding:0;list-style:none;display:grid}.howto li{counter-increment:tip;background:#fff;border:1px solid #d5def5;border-radius:8px;padding:8px 10px 8px 38px;position:relative}.howto li:before{content:counter(tip);background:var(--brand);color:#fff;border-radius:50%;place-items:center;width:20px;height:20px;font-size:12px;font-weight:700;display:grid;position:absolute;top:8px;left:10px}.log li{color:#1b2a55;background:#f1f5ff;border-radius:8px;align-items:flex-start;gap:10px;margin:6px 0;padding:8px 10px;font-size:14px;display:flex}.log li .ico{color:#16306e;background:#c9d7fb;border-radius:50%;flex:none;place-items:center;width:22px;height:22px;font-size:12px;font-weight:800;display:inline-grid}.log li.success{color:#14532d;background:#e7f6ec}.log li.success .ico{color:#14532d;background:#b7e4c6}.log li.warning{color:#5c3a00;background:#fff4d6}.log li.warning .ico{color:#5c3a00;background:#f6d98a}.log li.error{color:#8f1d1d;background:#fdeaea}.log li.error .ico{color:#8f1d1d;background:#f5b9b9}.log li.latest{outline:2px solid #94a9e8;font-weight:600}.log li.warning.latest{outline-color:#e0b13c}.log li.error.latest{outline-color:#e08a8a}.log li.success.latest{outline-color:#6bbf8a}.log li.empty{color:#44506b;background:#f4f6fa;outline:none;font-weight:400}.success{color:#1b7f4b;font-weight:600}.lbl{fill:#e6eaee;font-size:11px}.fail{fill:#ff7b7f;font-size:18px;font-weight:700}.zone{fill:#4da3ff22;stroke:#4da3ff;stroke-dasharray:5 4;pointer-events:none}.zone.hot{fill:#4da3ff55}.flame{transform-origin:0 -50px;animation:.25s infinite alternate flicker}.glow{animation:.5s infinite alternate flicker}@keyframes flicker{0%{opacity:.85;transform:scaleY(.92)}to{opacity:1;transform:scale(1.06,1.05)}}.bubble{animation-name:rise;animation-timing-function:linear;animation-iteration-count:infinite}@keyframes rise{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(-34px)}}@media (prefers-reduced-motion:reduce){.flame,.glow,.bubble{animation:none}}.notice{background:#eef6ff;border-radius:6px;padding:6px 10px;font-size:14px}.blabel{fill:#fff;font-size:8px;font-weight:700}.readout{fill:#1b1f2a;font-family:monospace;font-size:13px;font-weight:700}.stir{animation:.5s ease-in-out infinite alternate stir}@keyframes stir{0%{transform:rotate(-8deg)}to{transform:rotate(8deg)}}.failure{background:#fff0f0;border-radius:6px;padding:8px 10px;font-size:14px}@media (prefers-reduced-motion:reduce){.stir{animation:none}}.control{background:#f4f8fc;border-radius:6px;grid-template-columns:1fr auto;align-items:center;gap:4px 8px;margin:8px 0;padding:8px;font-size:14px;display:grid}.control label{grid-column:1/-1;font-weight:600}.control input[type=number]{width:70px}.control input:disabled{opacity:.5}.digits{fill:#6fe28b;font-family:monospace;font-size:15px;font-weight:700}.kbd{background:#f4f8fc;border-radius:6px;margin:10px 0;padding:8px;font-size:14px}.kbd label{margin:4px 0;display:block}.kbd select{margin-left:6px}.kbd button{margin:4px 6px 0 0}.viewer h2{margin:8px 0}.viewer .approx{background:#fff3cd;border:1px solid #e0c36a;border-radius:6px;padding:6px 10px;font-size:.9rem}.viewer-body{grid-template-columns:minmax(0,2fr) minmax(260px,1fr);align-items:start;gap:12px;display:grid}.viewer-body svg{touch-action:none;cursor:grab;border-radius:8px;width:100%;height:auto}.viewer-body svg:focus{outline:3px solid #ff9f1c}.viewer-controls{flex-wrap:wrap;gap:6px;display:flex}.viewer .parts{max-height:220px;margin:0 0 8px;padding:0;list-style:none;overflow:auto}.viewer .parts button[aria-pressed=true]{background:#ffe3b3}.viewer .info{background:#fff;border-radius:6px;min-height:80px;padding:8px}@media (width<=800px){.viewer-body{grid-template-columns:1fr}}@media (width<=900px){.sim aside{flex-basis:100%;max-width:none;max-height:none;position:static;overflow:visible}}
