:root{--brand: #409EFF;--brand-soft: #ECF5FF;--brand-deep: #2F7FD1;--brand-line: #C6E2FF;--bg: #F5F7FA;--panel: #FFFFFF;--line: #E4E7ED;--line-soft: #EFF2F6;--t1: #303133;--t2: #5A6068;--t3: #909399;--t4: #C0C4CC;--ok: #67C23A;--warn: #E6A23C;--danger: #F56C6C;--purple: #8E7CFF;--cyan: #36B3C4;--stage: #22252D;--stage-2: #1A1C22;--shadow-1: 0 1px 3px rgba(0, 0, 0, .06);--shadow-2: 0 6px 20px rgba(0, 0, 0, .12);--shadow-3: 0 12px 40px rgba(0, 0, 0, .18);--r1: 4px;--r2: 6px;--r3: 9px;--topbar: 52px;--rail: 64px;--side: 248px;--insp: 300px}*{box-sizing:border-box}html,body,#app{height:100%;margin:0}body{font:13px/1.6 -apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,sans-serif;color:var(--t1);background:var(--bg);-webkit-font-smoothing:antialiased}button,input,select,textarea{font-family:inherit;font-size:inherit;color:inherit}button{cursor:pointer}::-webkit-scrollbar{width:9px;height:9px}::-webkit-scrollbar-thumb{background:#d5dae1;border-radius:5px}::-webkit-scrollbar-thumb:hover{background:#bfc6cf}::-webkit-scrollbar-track{background:transparent}.app{display:grid;grid-template-rows:var(--topbar) 1fr;height:100%;overflow:hidden}.body{display:grid;grid-template-columns:var(--rail) var(--side) 1fr var(--insp);overflow:hidden;min-height:0}.body.no-side{grid-template-columns:var(--rail) 1fr var(--insp)}.body.no-insp{grid-template-columns:var(--rail) var(--side) 1fr}.body.no-side.no-insp{grid-template-columns:var(--rail) 1fr}.topbar{display:flex;align-items:center;gap:10px;padding:0 14px;background:#fff;border-bottom:1px solid var(--line);z-index:20}.logo{display:flex;align-items:center;gap:8px}.logo .mark{width:26px;height:26px;border-radius:7px;background:linear-gradient(135deg,var(--brand),#6BA9FF);display:grid;place-items:center;color:#fff}.logo .mark svg{width:15px;height:15px}.logo b{font-size:14px;letter-spacing:.2px}.logo i{font-style:normal;font-size:11.5px;color:var(--t3)}.vdiv{width:1px;height:22px;background:var(--line)}.spacer{flex:1}.proj{display:flex;align-items:center;gap:8px;padding:5px 10px;border-radius:var(--r2);cursor:pointer;position:relative}.proj:hover{background:var(--bg)}.proj .pdot{width:7px;height:7px;border-radius:50%;flex:0 0 auto}.proj .pname{font-size:12.5px;font-weight:600;line-height:1.3}.proj .psub{font-size:10.5px;color:var(--t3);line-height:1.3}.savetag{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--t3);padding:0 8px}.savetag .dot{width:6px;height:6px;border-radius:50%;background:var(--ok)}.savetag.saving .dot{background:var(--warn);animation:pulse 1s infinite}.savetag.error .dot{background:var(--danger)}.savetag.error{color:var(--danger)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.35}}.btn{display:inline-flex;align-items:center;gap:5px;height:30px;padding:0 12px;border:1px solid var(--line);border-radius:var(--r2);background:#fff;color:var(--t1);font-size:12.5px;transition:.16s}.btn:hover{border-color:var(--brand-line);color:var(--brand-deep)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}.btn.primary:hover{background:var(--brand-deep);border-color:var(--brand-deep);color:#fff}.btn.sm{height:26px;padding:0 9px;font-size:12px}.btn.xs{height:22px;padding:0 7px;font-size:11.5px;border-radius:var(--r1)}.btn.ghost{border-color:transparent;background:transparent}.btn.ghost:hover{background:var(--bg)}.btn svg{width:14px;height:14px}.avatar{width:28px;height:28px;border-radius:50%;background:var(--brand-soft);color:var(--brand-deep);display:grid;place-items:center;font-size:12px;font-weight:600}.rail{background:#fff;border-right:1px solid var(--line);overflow-y:auto;padding:6px 0 12px;display:flex;flex-direction:column;align-items:center;gap:2px}.rail-item{width:54px;padding:7px 2px 5px;display:flex;flex-direction:column;align-items:center;gap:3px;border-radius:var(--r2);cursor:pointer;color:var(--t3);font-size:10.5px;text-align:center;transition:.15s}.rail-item:hover{background:var(--bg);color:var(--t1)}.rail-item.on{background:var(--brand-soft);color:var(--brand-deep);font-weight:600}.rail-item svg{width:18px;height:18px}.rail-sep{width:30px;height:1px;background:var(--line);margin:5px 0}.side{background:#fff;border-right:1px solid var(--line);display:flex;flex-direction:column;overflow:hidden}.side-h{display:flex;align-items:center;gap:6px;padding:9px 12px;border-bottom:1px solid var(--line-soft);flex:0 0 auto}.side-h b{font-size:12.5px}.side-h .cnt{font-size:11px;color:var(--t3)}.side-h .grow{flex:1}.side-q{padding:8px 10px;flex:0 0 auto}.side-q input{width:100%;height:28px;padding:0 9px;border:1px solid var(--line);border-radius:var(--r2);background:var(--bg);outline:none;font-size:12px}.side-q input:focus{border-color:var(--brand);background:#fff}.side-list{flex:1;overflow-y:auto;padding:2px 6px 12px}.grp-h{display:flex;align-items:center;gap:6px;padding:8px 6px 4px;font-size:11px;color:var(--t3);position:sticky;top:0;background:#fff;z-index:2}.grp-h .ln{flex:1;height:1px;background:var(--line-soft)}.eitem{display:flex;align-items:center;gap:7px;padding:6px 8px;border-radius:var(--r2);cursor:pointer;font-size:12.5px;color:var(--t2);transition:.12s}.eitem:hover{background:var(--bg)}.eitem.on{background:var(--brand-soft);color:var(--brand-deep);font-weight:600}.eitem .nm{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.eitem .st{font-size:10px;padding:0 4px;border-radius:3px}.eitem .st.draft{background:#f4f4f5;color:var(--t3)}.eitem .st.published{background:#e8f6ec;color:#3e9c5a}.eitem .st.working{background:#fdf3e5;color:#c97f1f}.eitem .st.deprecated{background:#fdecec;color:#c0504d}.eitem .id{font-size:10px;color:var(--t4);font-family:ui-monospace,Menlo,monospace}.main{overflow:hidden;display:flex;flex-direction:column;min-width:0;background:var(--bg)}.tabstrip{display:flex;align-items:center;gap:2px;padding:5px 8px 0;background:#fff;border-bottom:1px solid var(--line);overflow-x:auto;flex:0 0 auto}.tab{display:flex;align-items:center;gap:6px;height:30px;padding:0 10px;border:1px solid transparent;border-bottom:none;border-radius:6px 6px 0 0;font-size:12px;color:var(--t3);cursor:pointer;white-space:nowrap}.tab:hover{background:var(--bg)}.tab.on{background:var(--bg);border-color:var(--line);color:var(--t1);font-weight:600}.tab .x{font-size:14px;line-height:1;color:var(--t4);padding:0 2px}.tab .x:hover{color:var(--danger)}.view{flex:1;overflow-y:auto;padding:16px;min-height:0}.view.nopad{padding:0}.card{background:#fff;border:1px solid var(--line);border-radius:var(--r3);box-shadow:var(--shadow-1);margin-bottom:14px;overflow:hidden}.card-h{display:flex;align-items:center;gap:8px;padding:10px 14px;border-bottom:1px solid var(--line-soft);font-size:12.5px;font-weight:600}.card-h .ln{flex:1;height:1px;background:var(--line-soft)}.card-h .sub{font-weight:400;font-size:11.5px;color:var(--t3)}.card-b{padding:14px}.frow{display:grid;grid-template-columns:118px 1fr;gap:10px;align-items:start;padding:7px 0}.frow+.frow{border-top:1px dashed var(--line-soft)}.frow>.k{font-size:12px;color:var(--t2);text-align:right;padding-top:6px;line-height:1.4}.frow>.k .req{color:var(--danger);margin-left:2px}.frow>.v{min-width:0}.frow .hint{font-size:11px;color:var(--t4);margin-top:4px;line-height:1.5}.frow .err{font-size:11px;color:var(--danger);margin-top:4px}.in{width:100%;height:32px;padding:0 9px;border:1px solid var(--line);border-radius:var(--r2);background:#fff;outline:none;font-size:12.5px;transition:.15s}.in:focus{border-color:var(--brand);box-shadow:0 0 0 3px #409eff1a}.in:disabled{background:var(--bg);color:var(--t3)}textarea.in{height:auto;min-height:62px;padding:7px 9px;resize:vertical;line-height:1.6}select.in{cursor:pointer}.chk{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;cursor:pointer;padding-top:6px}.chk input{width:14px;height:14px;accent-color:var(--brand);cursor:pointer}.seg{display:inline-flex;border:1px solid var(--line);border-radius:var(--r2);overflow:hidden}.seg button{height:30px;padding:0 11px;border:none;background:#fff;font-size:12px;color:var(--t2);border-right:1px solid var(--line)}.seg button:last-child{border-right:none}.seg button.on{background:var(--brand);color:#fff}.v2,.v3{display:flex;gap:6px}.v2 .in,.v3 .in{flex:1}.v2 .lbl,.v3 .lbl{font-size:10.5px;color:var(--t4);position:absolute}.tag{display:inline-flex;align-items:center;gap:4px;height:19px;padding:0 6px;border-radius:3px;font-size:10.5px;background:var(--bg);color:var(--t2)}.tag.ok{background:#e8f6ec;color:#3e9c5a}.tag.warn{background:#fdf3e5;color:#c97f1f}.tag.err{background:#fdecec;color:#c0504d}.tag.blue{background:var(--brand-soft);color:var(--brand-deep)}.rel{border:1px solid var(--line-soft);border-radius:var(--r2);margin-bottom:8px}.rel-h{display:flex;align-items:center;gap:7px;padding:7px 10px;background:#fafbfc;border-bottom:1px solid var(--line-soft);font-size:12px}.rel-h .lbl{font-weight:600}.rel-h .grow{flex:1}.rel-h .card-req{font-size:10.5px;color:var(--t3)}.rel-b{padding:7px 10px;display:flex;flex-direction:column;gap:5px}.rel-item{display:flex;align-items:center;gap:7px;padding:5px 8px;background:var(--bg);border-radius:var(--r1);font-size:12px}.rel-item .nm{flex:1}.rel-item .x{color:var(--t4);cursor:pointer;font-size:14px;line-height:1}.rel-item .x:hover{color:var(--danger)}.rel-empty{font-size:11.5px;color:var(--t4);padding:2px 0}.insp{background:#fff;border-left:1px solid var(--line);overflow-y:auto;padding:12px}.insp-h{display:flex;align-items:center;gap:7px;font-size:12px;font-weight:600;margin-bottom:10px}.insp-h .ln{flex:1;height:1px;background:var(--line-soft)}.kv{display:grid;grid-template-columns:76px 1fr;gap:6px;font-size:11.5px;margin-bottom:5px}.kv .k{color:var(--t3)}.kv .v{color:var(--t1);word-break:break-all;font-family:ui-monospace,Menlo,monospace;font-size:11px}.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;height:100%;min-height:260px;color:var(--t4);font-size:12.5px;text-align:center;padding:30px}.empty svg{width:34px;height:34px;opacity:.45}.empty b{color:var(--t2);font-size:13px}.scroll-x{overflow-x:auto}.tbl{width:100%;border-collapse:collapse;font-size:12px}.tbl th{text-align:left;font-weight:600;color:var(--t3);padding:7px 9px;border-bottom:1px solid var(--line);background:#fafbfc;position:sticky;top:0;z-index:1;font-size:11.5px;white-space:nowrap}.tbl td{padding:6px 9px;border-bottom:1px solid var(--line-soft);vertical-align:middle}.tbl tr:hover td{background:#fafcfe}.tbl td .in{height:27px;font-size:12px}.toast-wrap{position:fixed;top:62px;left:50%;transform:translate(-50%);z-index:9999;display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none}.toast{display:flex;align-items:center;gap:9px;padding:10px 16px;border-radius:var(--r3);background:#fff;box-shadow:var(--shadow-3);font-size:12.5px;max-width:640px;pointer-events:auto;animation:tin .18s ease-out}@keyframes tin{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}.toast .ic{flex:0 0 18px;width:18px;height:18px;border-radius:50%;display:grid;place-items:center;font-size:11px;color:#fff;font-weight:700}.toast.ok .ic{background:#12a150}.toast.err .ic{background:#e0453b}.toast.warn .ic{background:#d98616}.toast.info .ic{background:var(--brand)}.modal-mask{position:fixed;top:0;right:0;bottom:0;left:0;background:#14161a6b;z-index:9000;display:grid;place-items:center;padding:30px}.modal{background:#fff;border-radius:12px;box-shadow:var(--shadow-3);width:520px;max-width:100%;max-height:100%;display:flex;flex-direction:column;overflow:hidden}.modal-h{display:flex;align-items:center;gap:9px;padding:13px 16px;border-bottom:1px solid var(--line-soft);font-size:13px;font-weight:600}.modal-h .grow{flex:1}.modal-h .x{color:var(--t4);cursor:pointer;font-size:17px;line-height:1}.modal-h .x:hover{color:var(--t1)}.modal-b{padding:14px 16px;overflow-y:auto}.modal-f{display:flex;justify-content:flex-end;gap:8px;padding:11px 16px;border-top:1px solid var(--line-soft);background:#fafbfc}.loading{display:flex;align-items:center;justify-content:center;gap:9px;height:100%;color:var(--t3);font-size:12.5px}.spin{width:16px;height:16px;border:2px solid var(--line);border-top-color:var(--brand);border-radius:50%;animation:sp .7s linear infinite}@keyframes sp{to{transform:rotate(360deg)}}.stats{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px}.stat{background:#fff;border:1px solid var(--line);border-radius:var(--r3);padding:12px 14px}.stat b{display:block;font-size:21px;line-height:1.2;font-variant-numeric:tabular-nums}.stat span{font-size:11.5px;color:var(--t3)}
