.toast-wrap{position:fixed;top:0;right:0;bottom:0;left:0;z-index:300;pointer-events:none;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px}:root{--font:"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;--font-mono:Consolas,monospace;--bg:#f3efe8;--panel:#fcfaf6;--panel-2:#f6f1e9;--line:#ddd5c6;--line-strong:#c9bfae;--row-line:#ece5d8;--row-hover:#faf6ee;--ink:#2a2620;--ink-2:#6f675a;--ink-3:#9a9182;--accent:#a8501f;--accent-deep:#7c3a12;--accent-soft:#f2e4d6;--accent-line:#e0c4a8;--accent-ring:rgba(168,80,31,.12);--sidebar:#221f1a;--sidebar-ink:#f2ede2;--sidebar-dim:#8d8474;--sidebar-av:#4a463d;--sidebar-line:#3a352b;--sidebar-hover:#2b2720;--sidebar-act:#efe0cc;--green:#46684a;--green-soft:#e4ece0;--green-line:#b9cdb4;--red:#a03a2c;--red-soft:#f5e4df;--amber:#a5711c;--amber-soft:#f3e9d3;--dot-off:#c3baaa;--input-bg:#fff;--radius-s:3px;--radius-m:4px;--shadow:none;--h-bd:52px;--w-side:216px}*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%}body{font-family:var(--font);background:var(--bg);color:var(--ink);font-size:13.5px;-webkit-font-smoothing:antialiased}button{font-family:inherit}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}input,select,textarea{font-family:inherit}.app-header{height:var(--h-bd);background:var(--sidebar);color:var(--sidebar-ink);display:flex;align-items:center;gap:18px;padding:0 20px;flex-shrink:0}.app-header .brand{display:flex;align-items:center;gap:9px;font-size:14.5px;font-weight:600;letter-spacing:.4px;color:var(--sidebar-ink)}.app-header .brand .mark{width:16px;height:16px;background:var(--accent);display:flex;align-items:center;justify-content:center;font-size:10px;color:#fff;font-weight:700}.app-header .crumb{color:var(--sidebar-dim);font-size:12.5px}.app-header .crumb b{color:var(--sidebar-ink);font-weight:600}.app-header .spacer{flex:1}.role-badge{font-size:12px;padding:4px 12px;border:1px solid var(--sidebar-line);border-radius:3px;color:var(--sidebar-dim);background:#ffffff08;letter-spacing:.5px}.app-header .user{display:flex;align-items:center;gap:9px;font-size:12.5px;color:var(--sidebar-dim)}.app-header .user .av{width:26px;height:26px;background:var(--sidebar-av);border:1px solid var(--sidebar-line);display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--sidebar-ink);border-radius:50%}.app-header .logout{cursor:pointer}.app-header .logout:hover{color:var(--sidebar-ink)}.app-body{display:flex;flex:1;min-height:calc(100vh - var(--h-bd))}.app-aside{width:var(--w-side);background:var(--sidebar);padding:14px 10px;display:flex;flex-direction:column;flex-shrink:0}.menu{list-style:none}.menu .mi{font-size:11px;color:#6f6759;letter-spacing:1.5px;padding:10px 10px 5px}.menu li a{display:flex;align-items:center;gap:9px;padding:8px 10px;margin-bottom:2px;color:#bdb5a5;font-size:13px;text-decoration:none;border-left:3px solid transparent;border-radius:2px;cursor:pointer}.menu li a:hover{background:var(--sidebar-hover);color:var(--sidebar-ink)}.menu li a.on{background:#2f2a22;color:var(--sidebar-act);border-left-color:var(--accent);font-weight:600}.menu li a .ic{width:15px;height:15px;flex-shrink:0;display:flex;align-items:center;justify-content:center;opacity:.85}.menu li a .subc{margin-left:auto;font-size:10.5px;color:#6f6759}.app-aside .spacer{flex:1}.side-foot{border-top:1px solid var(--sidebar-line);padding:12px 10px 4px;font-size:11px;color:#6f6759;line-height:1.7}.app-main{flex:1;padding:20px 24px;min-width:0;overflow-x:hidden}.page-head{display:flex;align-items:flex-end;gap:14px;margin-bottom:16px}.page-head h1{font-size:18px;font-weight:700;letter-spacing:.3px}.page-head .sub{font-size:12px;color:var(--ink-2);margin-top:3px}.page-head .spacer{flex:1}.page-head .actions{display:flex;gap:8px}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-m);margin-bottom:16px}.card .hd{display:flex;align-items:center;gap:10px;padding:11px 16px;border-bottom:1px solid var(--line)}.card .hd .tt{font-size:13.5px;font-weight:700}.card .hd .st{font-size:11.5px;color:var(--ink-3)}.card .hd .spacer{flex:1}.card .bd{padding:14px 16px}.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:16px}.stats.c3{grid-template-columns:repeat(3,1fr)}.stat{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-m);padding:14px 16px;border-top:3px solid var(--accent);display:flex;flex-direction:column;gap:6px}.stat.g{border-top-color:var(--green)}.stat.r{border-top-color:var(--red)}.stat.a{border-top-color:var(--amber)}.stat .n{font-size:24px;font-weight:700;letter-spacing:.3px}.stat .t{font-size:12px;color:var(--ink-2)}.stat .d{font-size:11px;color:var(--ink-3)}.stat .act{font-size:11.5px;color:var(--accent);cursor:pointer;text-decoration:underline}.btn{display:inline-flex;align-items:center;gap:6px;border-radius:var(--radius-s);padding:7px 14px;font-size:12.5px;font-weight:600;cursor:pointer;border:1px solid transparent;line-height:1;background:transparent}.btn.main{background:var(--accent);color:#fff}.btn.main:hover{background:var(--accent-deep)}.btn.ghost{background:#fff;border-color:var(--line-strong);color:var(--ink)}.btn.ghost:hover{border-color:var(--accent);color:var(--accent)}.btn.mini{padding:4px 9px;font-size:11.5px;font-weight:500}.btn.danger{background:#fff;border-color:#dcbfb5;color:var(--red)}.btn.danger:hover{background:#f6e7e3}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.block{width:100%;justify-content:center;padding:11px}.tag{display:inline-block;font-size:11px;padding:1px 7px;border:1px solid var(--line-strong);border-radius:var(--radius-s);color:var(--ink-2);background:#fff;white-space:nowrap}.tag.g{background:var(--green-soft);border-color:var(--green-line);color:var(--green)}.tag.r{background:var(--red-soft);border-color:#dcbfb5;color:var(--red)}.tag.a{background:var(--amber-soft);border-color:#e0c9a0;color:var(--amber)}.tag.gray{background:#f2efe9;border-color:#dcd5c8;color:var(--ink-3)}.badge{display:inline-flex;align-items:center;justify-content:center;min-width:16px;height:16px;padding:0 4px;background:var(--red);color:#fff;font-size:10.5px;border-radius:8px;font-weight:600}table{width:100%;border-collapse:collapse;font-size:12.5px}thead th{text-align:left;font-size:11.5px;color:var(--ink-3);font-weight:600;padding:8px 10px;border-bottom:1px solid var(--line);letter-spacing:.3px;white-space:nowrap}tbody td{padding:8px 10px;border-bottom:1px solid var(--row-line);vertical-align:middle}tbody tr:hover td{background:var(--row-hover)}tbody tr:last-child td{border-bottom:0}.mono{font-family:var(--font-mono);font-size:12px}.link{color:var(--accent);cursor:pointer}.link:hover{text-decoration:underline}.tbl-ops{display:flex;gap:6px;flex-wrap:wrap}.tbl-ops .link{font-size:12px}.gen-stage{margin-top:6px;font-size:11.5px;line-height:1.4;color:var(--ink-3);max-width:320px}.gen-stage.running{color:var(--accent-deep)}.gen-stage.failed{color:var(--red)}.fm{display:grid;grid-template-columns:130px 1fr;gap:13px 14px;align-items:start}.fm label{font-size:12.5px;color:var(--ink-2);text-align:right;padding-top:7px}.fm input,.fm select,.fm textarea{width:100%;padding:7px 10px;border:1px solid var(--line-strong);border-radius:var(--radius-s);background:var(--input-bg);font-size:13px;color:var(--ink)}.fm input:focus,.fm select:focus,.fm textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-ring)}.fm .hint{font-size:11px;color:var(--ink-3);margin-top:4px}.field{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}.field label{font-size:12.5px;color:var(--ink-2)}.field input,.field select,.field textarea{width:100%;padding:9px 11px;border:1px solid var(--line-strong);border-radius:var(--radius-s);background:var(--input-bg);font-size:13px}.field input:focus,.field select:focus,.field textarea:focus{outline:none;border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-ring)}.field .hint{font-size:11px;color:var(--ink-3)}.switch{width:32px;height:17px;border-radius:9px;background:var(--dot-off);border:0;position:relative;cursor:pointer;flex-shrink:0}.switch:after{content:"";position:absolute;top:2px;left:2px;width:13px;height:13px;border-radius:50%;background:#fff;transition:left .15s;box-shadow:0 1px 2px #00000040}.switch.on{background:var(--green)}.switch.on:after{left:17px}.tabs{display:flex;border-bottom:1px solid var(--line);gap:2px;margin-bottom:14px}.tabs button{padding:8px 14px;font-size:12.5px;background:transparent;border:0;border-bottom:2px solid transparent;color:var(--ink-2);cursor:pointer;font-weight:500}.tabs button.on{color:var(--accent);border-bottom-color:var(--accent);font-weight:600}.pbar{height:6px;background:#ece5d8;border-radius:3px;overflow:hidden}.pbar i{display:block;height:100%;background:var(--accent);transition:width .4s}.steps{display:flex;gap:10px;margin:14px 0}.step{flex:1;border:1px solid var(--line);border-radius:var(--radius-m);padding:11px 13px;background:var(--panel);position:relative}.step .no{font-size:10.5px;font-weight:700;letter-spacing:1px;color:var(--ink-3);margin-bottom:4px}.step .nm{font-size:13px;font-weight:700;margin-bottom:3px}.step .ds{font-size:11px;color:var(--ink-2);line-height:1.5}.step.done{border-color:var(--green-line);background:var(--green-soft)}.step.done .no{color:var(--green)}.step.run{border-color:var(--accent);background:var(--accent-soft)}.step.run .no{color:var(--accent)}.step.run .ds{color:var(--accent-deep)}.step.wait{opacity:.55}.mask{position:fixed;top:0;right:0;bottom:0;left:0;background:#221f1a73;z-index:100;display:flex;align-items:center;justify-content:center}.dialog{width:520px;max-width:94vw;background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius-m);box-shadow:0 8px 30px #00000040}.dialog .d-hd{padding:14px 18px;border-bottom:1px solid var(--line);display:flex;align-items:center}.dialog .d-hd b{font-size:14px}.dialog .d-hd .spacer{flex:1}.dialog .d-bd{padding:16px 18px}.dialog .d-ft{padding:12px 18px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:8px}.kv{display:grid;grid-template-columns:150px 1fr;gap:6px 14px;font-size:12.5px}.kv .k{color:var(--ink-3)}.kv .v{font-weight:500}.note{font-size:11.5px;color:var(--ink-2);background:var(--panel-2);border-left:3px solid #cfc8ba;padding:8px 12px;border-radius:0 3px 3px 0;margin:10px 0;line-height:1.7}.note.danger{background:var(--red-soft);border-left-color:var(--red)}.note.warn{background:var(--amber-soft);border-left-color:var(--amber)}.note.ok{background:var(--green-soft);border-left-color:var(--green)}.seg{display:flex;gap:8px;margin-bottom:14px}.seg button{padding:6px 12px;font-size:12px;border:1px solid var(--line-strong);background:#fff;color:var(--ink-2);cursor:pointer;border-radius:var(--radius-s)}.seg button.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:600}.seg button.sel{background:var(--accent-soft);border-color:var(--accent);color:var(--accent-deep);font-weight:600}.toast{background:var(--sidebar);color:var(--sidebar-ink);padding:10px 18px;border-radius:var(--radius-s);font-size:12.5px;box-shadow:0 4px 14px #00000040;border-left:3px solid var(--accent);white-space:nowrap;max-width:80vw;overflow:hidden;text-overflow:ellipsis}.toast.ok{border-left-color:var(--green)}.toast.err{border-left-color:var(--red)}.empty{text-align:center;color:var(--ink-3);padding:36px 0;font-size:12.5px}.muted{color:var(--ink-3)}.auth-wrap{min-height:100vh;display:flex;background:var(--bg)}.auth-left{flex:1;background:var(--sidebar);color:var(--sidebar-ink);padding:60px 54px;display:flex;flex-direction:column;position:relative;overflow:hidden}.auth-left:after{content:"";position:absolute;right:-80px;bottom:-80px;width:320px;height:320px;border:1px solid rgba(242,237,226,.06);border-radius:50%}.auth-left:before{content:"";position:absolute;right:20px;bottom:20px;width:220px;height:220px;border:1px solid rgba(242,237,226,.05);border-radius:50%}.auth-left .brand{display:flex;align-items:center;gap:10px;font-size:16px;font-weight:600;letter-spacing:.5px}.auth-left .brand .mark{width:18px;height:18px;background:var(--accent);display:flex;align-items:center;justify-content:center;font-size:11px;color:#fff;font-weight:700}.auth-left h2{font-size:26px;margin:60px 0 14px;letter-spacing:1px;line-height:1.5;color:var(--sidebar-ink)}.auth-left p{font-size:13px;color:var(--sidebar-dim);line-height:2;max-width:380px}.auth-left .flow{margin-top:40px;display:flex;flex-direction:column;gap:14px}.auth-left .flow .fi{display:flex;gap:12px;align-items:flex-start;font-size:12.5px;color:#bdb5a5}.auth-left .flow .fi b{color:var(--sidebar-ink);font-weight:600}.auth-left .flow .fi .step-no{width:22px;height:22px;border:1px solid var(--accent);color:var(--accent);border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0;margin-top:1px}.auth-right{width:460px;min-width:460px;display:flex;align-items:center;justify-content:center;padding:40px}.auth-card{width:100%}.auth-card .t{font-size:20px;font-weight:700;margin-bottom:4px}.auth-card .s{font-size:12px;color:var(--ink-3);margin-bottom:26px}.auth-role{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-bottom:18px}.auth-role button{padding:10px 4px;border:1px solid var(--line-strong);background:#fff;border-radius:var(--radius-s);font-size:12px;color:var(--ink-2);cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:4px}.auth-role button.on{border-color:var(--accent);background:var(--accent-soft);color:var(--accent-deep);font-weight:600}.auth-role button small{font-size:10px;color:var(--ink-3);font-weight:400}.auth-foot{display:flex;justify-content:space-between;font-size:12px;color:var(--ink-3);margin:12px 0 18px}.auth-foot .link{font-size:12px}.demo-login{margin-top:26px;border-top:1px solid var(--line);padding-top:16px}.demo-login .dt{font-size:11.5px;color:var(--ink-3);margin-bottom:10px}@media(max-width:1024px){:root{--w-side:178px}.app-main{padding:18px}.stats{gap:10px}.page-head{align-items:flex-start}}.table-scroll{overflow-x:auto;max-width:100%}.table-scroll>table{min-width:760px}@media(max-width:768px){.app-header{padding:0 12px;gap:10px}.app-header .brand{font-size:12.5px}.app-header .crumb,.role-badge{display:none}.app-body{flex-direction:column}.app-aside{width:100%;padding:5px 7px}.menu{display:flex;overflow-x:auto;gap:3px}.menu .mi,.side-foot{display:none}.menu li{flex:0 0 auto}.menu li a{margin:0;padding:7px 9px;white-space:nowrap;border-left:0;border-bottom:2px solid transparent}.menu li a.on{border-left:0;border-bottom-color:var(--accent)}.app-main{padding:12px;overflow-x:hidden}.page-head{flex-wrap:wrap}.page-head .actions{width:100%;flex-wrap:wrap}.stats,.stats.c3{grid-template-columns:repeat(2,minmax(0,1fr))}.card .hd{padding:10px 12px;flex-wrap:wrap}.card .bd{padding:12px}.auth-left{display:none}.auth-right{width:100%;min-width:0;padding:24px}.dialog{max-height:92vh;overflow:auto}}@media(max-width:480px){.stats,.stats.c3{grid-template-columns:1fr}.app-header .user{font-size:0}.app-header .logout{font-size:12px}}
