:root {
  --bg:#f7f8fa; --card:#fff; --line:#e9eaee; --line2:#f1f2f5;
  --text:#1a1b1f; --text2:#5f646b; --text3:#9aa2ab;
  --dark:#16171d; --dark-hover:#26272e; --active:#f0f1f4;
  --amber-bg:#fdf7e3; --amber-line:#f2e3b8; --amber-text:#7a5c1e;
  --pink-bg:#fdf4f3; --pink-line:#f6d9d6; --pink-text:#8a2f2f;
  --danger:#e0433f; --danger-bg:#fdf1f0;
  --link:#3a5fe0; --green:#1c9e57;
  --radius:14px;
  --shadow:0 1px 2px rgba(20,24,40,.04), 0 8px 24px -16px rgba(20,24,40,.10);
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;font-size:14px;-webkit-font-smoothing:antialiased;display:flex;flex-direction:column;min-height:100vh}
a{color:inherit;text-decoration:none}
svg{fill:none;stroke:currentColor;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round}

/* ---- topnav ---- */
.topnav{position:sticky;top:0;z-index:20;display:flex;align-items:center;gap:24px;height:64px;padding:0 28px;background:#fff;border-bottom:1px solid var(--line)}
.brand{display:flex;align-items:center;gap:10px;font-weight:700;font-size:17px;letter-spacing:.2px}
.brand-mark{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border-radius:8px;background:var(--dark)}
.tabs{display:flex;align-items:center;gap:6px;margin:0 auto}
.tab{display:inline-flex;align-items:center;gap:7px;padding:9px 16px;border:0;background:transparent;color:var(--text2);font-size:14.5px;font-weight:500;border-radius:999px;cursor:pointer;transition:.15s}
.tab:hover{color:var(--text)}
.tab.is-active{background:var(--active);color:var(--text);font-weight:600}
.tab-ic{width:16px;height:16px}
.account{display:flex;align-items:center;gap:8px}
.avatar{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;background:#e9ebef;color:var(--text);font-weight:600;font-size:14px}
.avatar-badge{display:flex;align-items:center;justify-content:center;min-width:20px;height:20px;border-radius:999px;background:var(--line);color:var(--text2);font-size:12px;padding:0 6px}

/* ---- layout ---- */
.page{max-width:1080px;margin:0 auto;padding:28px 24px 64px;flex:1 0 auto;width:100%}
.tab-panel{display:none}
.tab-panel.is-active{display:block}

.panel-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:16px}
.panel-title{font-size:20px;font-weight:700;margin:0 0 6px}
.panel-sub{color:var(--text2);margin:0}
.panel-sub.mb{margin-bottom:16px}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:22px 24px;margin-bottom:16px}
.card-title{font-size:16px;font-weight:700;margin:0 0 16px}
.mt{margin-top:14px}

/* ---- buttons ---- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:10px 18px;border-radius:999px;font-size:14px;font-weight:500;cursor:pointer;border:1px solid transparent;transition:.15s;white-space:nowrap}
.btn-dark{background:var(--dark);color:#fff}
.btn-dark:hover{background:var(--dark-hover)}
.btn-ghost{background:#fff;color:var(--text);border-color:var(--line)}
.btn-ghost:hover{border-color:#c9ccd2}
.btn-sm{padding:8px 14px;font-size:13.5px}

/* ---- overview ---- */
.metric-row{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-bottom:16px}
.metric-card{display:flex;flex-direction:column;background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:22px 24px;min-height:100px}
.metric-label{color:var(--text2);margin-bottom:18px}
.metric-main{display:flex;align-items:center;justify-content:space-between;gap:16px}
.metric-num{font-size:34px;font-weight:700;line-height:1}
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px 40px}
.form-item{display:flex;align-items:center;gap:6px;color:var(--text2)}
.form-item.gap{margin-top:14px}
.form-label{color:var(--text2)}
.form-val{color:var(--text);font-weight:500}
.quota-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.quota-card{background:var(--card);border:1px solid var(--line2);border-radius:12px;padding:16px}
.quota-label{color:var(--text2);margin-bottom:12px}
.quota-val{font-size:15px}
.info-dot{font-style:normal;color:var(--text3);font-size:12px;margin-left:4px}

/* ---- apps ---- */
.empty-box{border:1.5px dashed var(--line);border-radius:12px;padding:34px;text-align:center;color:var(--text3);background:#fbfcfd}
.app-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}
.app-card{border:1px solid var(--line);border-radius:12px;padding:18px}
.app-card-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.app-name{font-size:16px;font-weight:700}
.tag-official{background:var(--dark);color:#fff;font-size:12px;padding:3px 10px;border-radius:999px;font-weight:500}
.app-desc{color:var(--text2);min-height:40px;margin:0 0 16px}
.app-actions{display:flex;gap:10px}

/* ---- keys ---- */
.banner-warn{display:flex;gap:10px;align-items:flex-start;background:var(--amber-bg);border:1px solid var(--amber-line);border-radius:12px;padding:14px 16px;margin-bottom:16px}
.warn-ic{width:18px;height:18px;color:#c79a2a;flex:none;margin-top:2px}
.warn-ic.sm{width:14px;height:14px;vertical-align:-2px}
.banner-warn b{color:var(--amber-text);font-weight:600}
.banner-warn p{margin:4px 0 0;color:var(--amber-text)}
.table-card{padding:0;overflow:hidden}
.key-table{width:100%;border-collapse:collapse}
.key-table th{text-align:left;font-weight:500;color:var(--text2);background:#fbfcfd;padding:14px 22px;border-bottom:1px solid var(--line)}
.key-table td{padding:16px 22px;border-bottom:1px solid var(--line2);vertical-align:top}
.key-table tr:last-child td{border-bottom:0}
.key-name{font-weight:600}
.key-meta{color:var(--text3);font-family:ui-monospace,monospace;font-size:12.5px;margin-top:6px}
.copy-link{color:var(--link);cursor:pointer;margin-left:8px;font-family:inherit}
.tag-status{display:inline-block;background:var(--line);color:var(--text);font-size:13px;padding:4px 12px;border-radius:999px;font-weight:500;white-space:nowrap}
.op-btns{display:flex;gap:8px}
.op-btn{background:#fff;color:var(--text);border:1px solid var(--line);border-radius:999px;padding:7px 14px;font-size:13.5px;cursor:pointer}
.op-btn.danger{color:var(--danger);border-color:#f3c8c7;background:#fff}
.op-btn:hover{border-color:#c9ccd2}
.op-btn.danger:hover{background:var(--danger-bg)}

/* ---- auth / org ---- */
.org-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.org-card{border:1px solid var(--line);border-radius:12px;padding:18px}
.org-head{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.org-icon{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border-radius:8px;background:color-mix(in srgb,var(--c) 16%,#fff);color:var(--c);font-weight:700;font-size:14px}
.org-name{font-size:15px;font-weight:600}
.tag-mini{color:var(--text3);font-size:12px;margin-left:6px}

/* ---- docs ---- */
.doc-layout{display:grid;grid-template-columns:260px 1fr;gap:24px;align-items:start}
.doc-side{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px 14px;position:sticky;top:80px}
.doc-group{padding:6px 6px}
.doc-group-title{font-weight:600;margin-bottom:8px;padding:0 8px}
.doc-link{display:block;padding:9px 12px;border-radius:8px;color:var(--text2)}
.doc-link:hover{background:#f6f7f9;color:var(--text)}
.doc-link.is-active{background:var(--active);color:var(--text);font-weight:600}
.doc-folder{cursor:pointer;padding:9px 12px;border-radius:8px;color:var(--text2);font-weight:500}
.doc-folder:hover{background:#f6f7f9}
.doc-folder .fold{float:right;color:var(--text3)}
.doc-sub{display:none}
.doc-folder.is-open .doc-sub{display:block;padding-left:8px}
.doc-crumb{color:var(--text3);margin-bottom:8px}
.doc-title{font-size:22px;margin:0 0 10px}
.doc-para{color:var(--text2);margin:0 0 18px}
.doc-keycard{padding:0}
.key-row{display:grid;grid-template-columns:180px 1fr;align-items:center;padding:16px 24px;border-bottom:1px solid var(--line2)}
.key-row:last-child{border-bottom:0}
.key-name{color:var(--text2)}
.key-val{color:var(--text)}
.key-val code{font-family:ui-monospace,monospace;background:#f4f5f7;padding:2px 6px;border-radius:5px;font-size:13px}
.link{color:var(--link);cursor:pointer}
.step-row{display:grid;grid-template-columns:1fr 1fr 1fr;gap:16px;margin-top:16px}
.step-card{border:1px solid var(--line);border-radius:12px;padding:18px}
.step-num{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--dark);color:#fff;font-size:13px;font-weight:700;margin-bottom:12px}
.step-name{font-weight:600}
.step-desc{color:var(--text2);margin:6px 0 0}

/* ---- modals ---- */
.modal-mask{position:fixed;inset:0;background:rgba(18,20,28,.42);display:flex;align-items:flex-start;justify-content:center;padding:8vh 16px;z-index:50;animation:maskIn .16s ease}
.modal-mask[hidden]{display:none}
@keyframes maskIn{from{opacity:0}to{opacity:1}}
.modal{width:100%;max-width:480px;background:#fff;border-radius:16px;box-shadow:0 24px 80px -24px rgba(0,0,0,.4);overflow:hidden;animation:modalIn .18s ease}
@keyframes modalIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.modal-head{display:flex;align-items:center;justify-content:space-between;padding:20px 24px;border-bottom:1px solid var(--line2)}
.modal-head h3{margin:0;font-size:17px;font-weight:700}
.modal-close{background:none;border:0;font-size:22px;color:var(--text3);cursor:pointer}
.modal-body{padding:22px 24px;max-height:64vh;overflow:auto}
.modal-foot{display:flex;justify-content:flex-end;gap:10px;padding:16px 24px;border-top:1px solid var(--line2)}
.field-label{display:block;font-size:14px;color:var(--text);font-weight:500;margin-bottom:8px}
.field-label b{color:var(--danger)}
.input{width:100%;height:44px;padding:0 14px;border:1px solid var(--line);border-radius:10px;font-size:14px;background:#fff}
.input:focus{outline:none;border-color:#b9bec6}
.select{position:relative;height:44px;padding:0 40px 0 14px;border:1px solid var(--line);border-radius:10px;display:flex;align-items:center;cursor:pointer;background:#fff}
.select .caret{position:absolute;right:14px;color:var(--text3)}
.menu{position:absolute;top:calc(100% + 6px);left:0;right:0;background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow);z-index:5;overflow:hidden}
.menu-item{padding:11px 14px;cursor:pointer}
.menu-item:hover{background:#f6f7f9}
.warn-mini{color:#c79a2a;font-size:13px;margin:12px 0}
.perms{margin:4px 0 16px}
.perms-title{font-size:14px;margin-bottom:10px}
.chips{display:flex;flex-wrap:wrap;gap:8px}
.chip{border:1px solid var(--line);border-radius:999px;padding:7px 14px;font-size:13.5px;cursor:pointer;color:var(--text2);transition:.12s}
.chip:not(.on):hover{border-color:#c9ccd2}
.chip.on{background:var(--dark);border-color:var(--dark);color:#fff}
.danger-box{background:var(--pink-bg);border:1px solid var(--pink-line);border-radius:10px;padding:16px;color:var(--pink-text);font-size:13.5px;line-height:1.6}
.danger-box ol{margin:8px 0 0;padding-left:18px}
.banner-amber{background:var(--amber-bg);border:1px solid var(--amber-line);border-radius:10px;padding:12px 14px;color:var(--amber-text);margin-bottom:18px}
.code-box{display:block;border:1px solid var(--line);border-radius:10px;padding:14px;background:#fff;color:var(--text);word-break:break-all;font-size:13.5px}
.code-box.plain{border-color:var(--line2)}

/* ---- toast / footer ---- */
.toast{position:fixed;top:78px;left:50%;transform:translateX(-50%);background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:var(--shadow);padding:10px 16px;display:flex;align-items:center;gap:8px;z-index:60;font-weight:500}
.toast[hidden]{display:none}
.toast-ok{color:var(--green)}
.footer{display:flex;align-items:center;justify-content:space-between;padding:14px 28px;background:var(--card);border-top:1px solid var(--line);color:var(--text3);font-size:12.5px;margin-top:auto}
.footer-links{display:flex;gap:20px}
.footer-links a:hover{color:var(--text)}

/* ===== UPAL 平移版新增 ===== */
.metric-dim{font-size:16px;color:var(--text3);font-weight:600}
.spark{display:flex;align-items:flex-end;gap:4px;height:34px;margin-top:10px}
.spark-bar{flex:1;min-width:10px;background:var(--dark);opacity:.82;border-radius:3px 3px 0 0}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px}
.dim{color:var(--text3)}
.scroll-x{overflow-x:auto}
.input.slim{padding:8px 12px;font-size:13.5px;width:auto}
.tag-status.st-valid{background:#e7f5ee;color:var(--green)}
.tag-status.st-expired{background:var(--amber-bg);color:var(--amber-text)}
.tag-status.st-revoked{background:var(--pink-bg);color:var(--pink-text)}
.op-btn{border:1px solid var(--line);background:#fff;border-radius:999px;padding:5px 12px;font-size:12.5px;cursor:pointer;color:var(--text2)}
.op-btn:hover{border-color:#c9ccd2;color:var(--text)}
.op-btn.danger:hover{border-color:var(--danger);color:var(--danger)}
.op-btns{display:flex;gap:8px}

/* Skill 广场 */
.skill-filter{display:flex;align-items:center;gap:14px;margin-bottom:14px}
.skill-count{color:var(--text3);font-size:13px}
.skill-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px}
.skill-card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px 20px;display:flex;flex-direction:column;gap:10px}
.skill-top{display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
.skill-name{font-weight:700;font-size:15px;line-height:1.35}
.tag-cat{background:var(--line2);color:var(--text2);font-size:12px;padding:3px 10px;border-radius:999px;white-space:nowrap}
.tag-cat.warn{background:var(--amber-bg);color:var(--amber-text)}
.skill-desc{margin:0;color:var(--text2);font-size:13px;line-height:1.6;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.skill-meta{display:flex;align-items:center;gap:6px;color:var(--text3);font-size:12.5px;flex-wrap:wrap}
.skill-actions{display:flex;gap:8px;margin-top:auto}

/* 审计 */
.audit-filters{display:flex;flex-wrap:wrap;gap:10px;margin-bottom:14px}
.audit-summary{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px}
.sum-pill{background:var(--line2);border-radius:999px;padding:5px 12px;font-size:12.5px;color:var(--text2)}
.audit-table td{white-space:nowrap}

/* Skill 详情弹窗 */
.modal-wide{width:min(760px,94vw)}
.install-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:8px}
.perms-title.mt{margin-top:14px}
