:root{
  /* ---- 品牌 ---- */
  --c-primary:#3b6bf0;
  --c-primary-deep:#2450c8;
  --c-primary-soft:#eef3ff;
  --c-accent:#7c5cff;
  /* ---- 中性 ---- */
  --c-bg:#f4f6fb;
  --c-panel:#ffffff;
  --c-border:#e7ecf5;
  --c-border-strong:#d9e2f1;
  --c-text:#0f172a;
  --c-text-2:#33415a;
  --c-muted:#6b7a90;
  --c-soft:#f7f9fd;
  /* ---- 深色侧栏 ---- */
  --c-side-text:rgba(233,240,251,.70);
  /* ---- 圆角 / 阴影 / 焦点环 ---- */
  --r-sm:8px; --r-md:12px; --r-lg:16px;
  --sh-1:0 1px 2px rgba(15,23,42,.04), 0 1px 3px rgba(15,23,42,.03);
  --sh-2:0 1px 2px rgba(15,23,42,.05), 0 12px 30px -16px rgba(15,23,42,.26);
  --sh-3:0 24px 60px -24px rgba(15,23,42,.38);
  --ring:0 0 0 3px rgba(59,107,240,.15);
  /* ---- Element Plus 主题接管 ---- */
  --el-color-primary:#3b6bf0;
  --el-color-primary-light-3:#6b8ff5;
  --el-color-primary-light-5:#93aef8;
  --el-color-primary-light-7:#bccdfb;
  --el-color-primary-light-8:#d3dffc;
  --el-color-primary-light-9:#eef3ff;
  --el-color-primary-dark-2:#2450c8;
  --el-border-radius-base:8px;
  --el-border-radius-small:7px;
  --el-text-color-primary:#0f172a;
  --el-text-color-regular:#33415a;
  --el-border-color:#e7ecf5;
  --el-border-color-light:#eef2f8;
  --el-border-color-lighter:#f2f6fb;
  --el-fill-color-light:#f7f9fd;
  --el-fill-color-blank:#ffffff;
  --el-font-size-base:13px;
  --el-box-shadow-light:var(--sh-2);
}
*{box-sizing:border-box}
[v-cloak]{display:none}
html,body{margin:0;padding:0;height:100%}
body{
  font-family:"Inter","SF Pro Text",-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  background:var(--c-bg);color:var(--c-text);font-size:13px;line-height:1.55;
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
  font-variant-numeric:tabular-nums;
}
#app,.layout{height:100%}
.layout{display:flex}

/* ---------------- 侧栏（深色玻璃，带品牌光晕） ---------------- */
.sidebar{
  width:232px;flex:0 0 232px;position:relative;
  background:
    radial-gradient(680px 300px at 18% -10%, rgba(59,107,240,.34), transparent 62%),
    radial-gradient(520px 260px at 104% 6%, rgba(124,92,255,.20), transparent 60%),
    linear-gradient(180deg,#0e1729 0%,#101b31 48%,#0b1322 100%);
  color:var(--c-side-text);
  display:flex;flex-direction:column;padding:18px 14px 14px;
  border-right:1px solid rgba(255,255,255,.07);
}
.sidebar::after{
  content:"";position:absolute;top:0;right:0;width:1px;height:100%;pointer-events:none;
  background:linear-gradient(180deg,transparent,rgba(255,255,255,.16) 30%,rgba(255,255,255,.06) 70%,transparent);
}
.brand{display:flex;gap:11px;align-items:center;padding:2px 4px 18px}
.brand-mark{
  width:38px;height:38px;border-radius:12px;flex:0 0 auto;
  background:linear-gradient(140deg,#4f7dff 0%,#3b6bf0 55%,#7c5cff 100%);
  color:#fff;display:flex;align-items:center;justify-content:center;
  font-size:12.5px;font-weight:600;letter-spacing:.5px;
  box-shadow:0 10px 22px -10px rgba(79,125,255,.95), inset 0 1px 0 rgba(255,255,255,.4);
}
.brand-title{font-size:13.5px;font-weight:600;line-height:1.3;color:#fff;letter-spacing:.01em}
.brand-sub{font-size:10.5px;color:rgba(226,233,246,.46);margin-top:3px;letter-spacing:.02em}
.game-picker{padding:0 4px 16px;border-bottom:1px solid rgba(255,255,255,.08);margin-bottom:12px}
.picker-label{
  font-size:10px;color:rgba(226,233,246,.42);margin-bottom:7px;
  letter-spacing:.12em;text-transform:uppercase;font-weight:600;
}
.sidebar .el-select__wrapper{
  background:rgba(255,255,255,.06)!important;border:1px solid rgba(255,255,255,.12);
  border-radius:10px;box-shadow:none!important;min-height:34px;
  transition:background .16s,border-color .16s;
}
.sidebar .el-select__wrapper:hover{background:rgba(255,255,255,.10)!important;border-color:rgba(255,255,255,.22)}
.sidebar .el-select__wrapper.is-focused{border-color:rgba(124,157,255,.75)!important;box-shadow:0 0 0 3px rgba(79,125,255,.22)!important}
.sidebar .el-select__placeholder,.sidebar .el-select__selected-item{color:#eaf0fb!important;font-size:12.5px}
.sidebar .el-select__placeholder.is-transparent{color:rgba(233,240,251,.42)!important}
.sidebar .el-select__caret{color:rgba(233,240,251,.55)}
.nav{display:flex;flex-direction:column;gap:4px;flex:1;overflow:auto;margin:0 -2px;padding:0 2px}
.nav-item{
  position:relative;display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:10px;
  cursor:pointer;color:var(--c-side-text);font-size:13px;font-weight:500;letter-spacing:.01em;
  transition:background .18s ease,color .18s ease,box-shadow .18s ease;
}
.nav-item:hover{background:rgba(255,255,255,.07);color:#fff}
.nav-item.active{
  color:#fff;font-weight:600;
  background:linear-gradient(100deg,rgba(59,107,240,.46) 0%,rgba(124,92,255,.22) 100%);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.14), 0 10px 22px -14px rgba(59,107,240,.95);
}
.nav-item.active::before{
  content:"";position:absolute;left:0;top:50%;transform:translateY(-50%);
  width:3px;height:18px;border-radius:0 3px 3px 0;
  background:linear-gradient(180deg,#9db6ff,#7c5cff);
}
.nav-dot{
  width:6px;height:6px;border-radius:50%;flex:0 0 auto;
  background:rgba(226,233,246,.30);box-shadow:0 0 0 3px rgba(255,255,255,.04);
  transition:background .18s,box-shadow .18s;
}
.nav-item:hover .nav-dot{background:rgba(255,255,255,.55)}
.nav-item.active .nav-dot{background:#fff;box-shadow:0 0 0 3px rgba(255,255,255,.20)}
.ai-badge{border-radius:10px;padding:9px 11px;font-size:10.5px;line-height:1.5;border:1px solid transparent}
.ai-badge.off{background:rgba(245,158,11,.12);border-color:rgba(245,158,11,.30);color:#f0cd8c}
.ai-badge.on{background:rgba(34,197,94,.13);border-color:rgba(34,197,94,.30);color:#9ddfb5}
.ai-title{font-weight:600;margin-bottom:2px;letter-spacing:.02em}

/* ---------------- 主区 ---------------- */
.main{
  flex:1;overflow:auto;padding:22px 26px 46px;position:relative;
  background:
    radial-gradient(1000px 340px at 100% -8%, rgba(59,107,240,.075), transparent 62%),
    radial-gradient(760px 320px at -8% 0%, rgba(124,92,255,.055), transparent 58%);
}
.page-head{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:20px;gap:16px}
.page-head h1{
  font-size:20px;margin:0;font-weight:650;letter-spacing:-.01em;color:#0b1425;
  display:flex;align-items:center;flex-wrap:wrap;line-height:1.35;
}
.head-actions{display:flex;align-items:center;gap:8px;flex-shrink:0}
.game-chip{
  display:inline-block;margin-left:10px;padding:2px 10px;border-radius:999px;
  background:linear-gradient(120deg,#eef3ff,#f4efff);color:#3358c9;font-size:11px;font-weight:600;
  vertical-align:middle;border:1px solid #dfe7fb;box-shadow:inset 0 1px 0 #fff;
  letter-spacing:.02em;
}
.sub{color:var(--c-muted);font-size:12.5px;margin:7px 0 0;line-height:1.6;max-width:960px}

/* 「游戏数据」下的子页签：胶囊分段控件 */
.data-subtabs{
  display:inline-flex;align-items:center;gap:2px;margin:0 0 18px;
  padding:4px;background:#eaeff8;border:1px solid var(--c-border);border-radius:12px;
  box-shadow:inset 0 1px 2px rgba(15,23,42,.04);
}
.data-subtab{
  position:relative;padding:6px 18px;font-size:12.5px;color:#5a6a80;font-weight:500;
  cursor:pointer;border-radius:9px;user-select:none;
  transition:color .16s ease,background .16s ease,box-shadow .16s ease;
}
.data-subtab:hover{color:var(--c-primary-deep);background:rgba(255,255,255,.6)}
.data-subtab.active{
  color:var(--c-primary-deep);font-weight:600;background:#fff;
  box-shadow:0 1px 2px rgba(15,23,42,.07), 0 4px 12px -6px rgba(15,23,42,.24);
}
.data-subtab.active::after{display:none}
.tip{margin-top:16px}
.muted{color:var(--c-muted)}
.small{font-size:11px}
.unit{color:var(--c-muted);font-size:11px;margin-left:2px}

.panel{
  background:var(--c-panel);border:1px solid var(--c-border);border-radius:var(--r-md);
  overflow:hidden;box-shadow:var(--sh-1);
}
.panel-head{
  display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:13px 16px;border-bottom:1px solid var(--c-border);
  font-size:13.5px;font-weight:600;letter-spacing:.01em;color:#16233b;
  background:linear-gradient(180deg,#fbfcff,#fff);
}
.panel-sub{color:var(--c-muted);font-weight:400;font-size:11px;letter-spacing:0}
.empty{padding:30px;text-align:center;color:#93a0b4;font-size:12px;line-height:1.9}
.empty.big{padding:72px 24px;background:
  radial-gradient(420px 180px at 50% 0%, rgba(59,107,240,.05), transparent 70%);}

/* ---------------- 分类树 ---------------- */
.split{display:grid;grid-template-columns:320px 1fr;gap:16px;align-items:start}
.tree-panel,.field-panel{min-height:320px}
.tree-body{padding:8px;max-height:calc(100vh - 210px);overflow:auto}
.tree-l1{margin-bottom:2px}
.tree-l1-head{
  display:flex;align-items:center;gap:6px;padding:7px 8px;border-radius:6px;cursor:pointer;
}
.tree-l1-head:hover{background:var(--c-soft)}
.caret{color:#9aa5b5;font-size:10px;width:10px}
.tree-name{font-size:13px}
.tree-badge{
  background:#eef1f6;color:#6b7686;border-radius:9px;padding:0 6px;font-size:11px;
}
.tree-actions{margin-left:auto;display:none;gap:0}
.tree-l1-head:hover .tree-actions{display:flex}
.tree-l2-list{margin-left:16px;border-left:1px solid var(--c-border);padding-left:4px}
.tree-l2{
  padding:6px 8px;border-radius:6px;cursor:pointer;display:flex;justify-content:space-between;gap:8px;
}
.tree-l2:hover{background:var(--c-soft)}
.tree-l2.active{background:#eaf1fd}
.tree-l2.active .tree-name{color:var(--c-primary-deep);font-weight:600}
.tree-meta{color:var(--c-muted);font-size:11px;white-space:nowrap}
.tree-empty{padding:6px 10px;color:#b3bcc9;font-size:11px}

/* ---------------- 录入页 ---------------- */
.entry-split{display:grid;grid-template-columns:minmax(280px,42%) 1fr;gap:16px;align-items:start}
.shot-body{padding:12px;max-height:calc(100vh - 210px);overflow:auto}
.shot-item{margin-bottom:12px;border:1px solid var(--c-border);border-radius:8px;overflow:hidden}
.shot-img{width:100%;height:220px;background:#f2f4f8;display:block}
.shot-bar{display:flex;justify-content:space-between;align-items:center;padding:5px 8px;background:var(--c-soft)}
.shot-name{font-size:11px;color:var(--c-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.composite{display:flex;gap:4px}
.comp-input{flex:1}
.comp-def-row{display:flex;align-items:center;margin-bottom:6px}

/* ---------------- 展示 ---------------- */
.view-config{display:grid;grid-template-columns:1fr 250px;gap:16px;align-items:start;margin-bottom:16px}
/* 配置区折叠条：生成表格后收起，只留一行摘要 */
.cfg-bar{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin-bottom:10px;font-size:12px;color:var(--c-muted);
}
.cfg-bar.is-collapsed{
  margin-bottom:12px;padding:8px 12px;background:var(--c-soft);
  border:1px solid var(--c-border);border-radius:9px;
}
.cfg-tag{
  flex:0 0 auto;padding:1px 7px;border-radius:5px;
  background:#eaf0fc;color:var(--c-primary-deep);font-size:11px;font-weight:600;
}
.cfg-summary{flex:1;min-width:0;color:#5a6678;line-height:1.6}
.cfg-ops{display:flex;align-items:center;margin-left:auto}
.view-picker{
  padding:10px 14px;max-height:380px;overflow:auto;
  display:grid;grid-template-columns:repeat(auto-fill,minmax(196px,1fr));
  gap:8px 14px;align-items:start;
}
.picker-log{
  padding:8px 10px;border:1px solid var(--c-border);border-radius:8px;
  background:#fbfcfe;min-width:0;overflow:hidden;
}
.picker-log-head{display:flex;align-items:center;justify-content:space-between;gap:8px}
.picker-fields{display:flex;flex-wrap:wrap;gap:2px 10px;margin:5px 0 0 22px}
.picker-ops{margin-left:auto;display:flex;align-items:center;gap:2px}
.filter-body{padding:12px 14px}
.filter-row{margin-bottom:10px}
.filter-row label{display:block;font-size:11px;color:var(--c-muted);margin-bottom:4px}
.filter-label-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:2px}
.filter-label-row label{margin-bottom:0}
.filter-label-row .el-button{height:18px;padding:0}
.saved-view{display:flex;justify-content:space-between;align-items:center;padding:4px 0}
.saved-view-name{cursor:pointer;color:var(--c-primary);font-size:12px}
.saved-view-name:hover{text-decoration:underline}

.result-panel{margin-top:4px}
.result-scroll{overflow:auto;max-height:calc(100vh - 320px)}
.result-table{border-collapse:collapse;font-size:12px;min-width:100%}
.result-table th,.result-table td{border:1px solid var(--c-border);padding:5px 10px;text-align:center;white-space:nowrap}
.result-table thead th{
  background:#f2f6fd;position:sticky;top:0;z-index:2;font-weight:600;color:#33415a;
}
.result-table .day-label{font-size:10px;color:var(--c-muted);font-weight:400}
.result-table .sticky-col{
  position:sticky;left:0;z-index:1;background:#fff;text-align:left;min-width:180px;
}
.result-table thead .sticky-col{background:#f2f6fd;z-index:3}
.result-table .group-row td{background:#f8fafd;font-weight:600;color:#2c3e57;text-align:left}
.result-table .group-row .sticky-col{background:#f8fafd}
.result-table .field-cell{padding-left:22px;color:#475467}
.result-table .val-cell{color:#1f2937;white-space:pre-line;word-break:break-word}
.result-table .val-cell.blank{background:#fbfcfe}

.field-picker{border:1px solid var(--c-border);border-radius:8px;padding:10px 12px;width:100%;max-height:240px;overflow:auto}
.prompt-box{
  background:#0f172a;color:#d6e2f5;padding:14px;border-radius:8px;font-size:12px;
  line-height:1.7;white-space:pre-wrap;word-break:break-all;max-height:420px;overflow:auto;
  font-family:Consolas,Monaco,monospace;
}

/* ---------------- 游戏框架拆解 ---------------- */
/* 一级维度现在是三个（商业化已独立成模块），所以栅格按三列铺满 */
.framework-grid{
  display:grid;grid-template-columns:repeat(3,1fr);gap:14px;align-items:start;
}
@media (max-width:1400px){.framework-grid{grid-template-columns:repeat(2,1fr)}}
.fw-col{background:#fff;border:1px solid var(--c-border);border-radius:10px;overflow:hidden}
.fw-head{padding:13px 14px;border-bottom:1px solid var(--c-border);background:#f8fafd}
.fw-title{font-size:14px;font-weight:600;color:#22304a;margin-bottom:4px}
.fw-desc{font-size:11px;color:var(--c-muted);line-height:1.6;min-height:34px}
.fw-meta{font-size:11px;color:#8d97a8;margin:6px 0 4px}
.fw-body{padding:8px;max-height:calc(100vh - 300px);overflow:auto}
.fw-node{margin-bottom:4px}
.fw-node-head{
  display:flex;align-items:center;gap:6px;padding:7px 8px;border-radius:6px;cursor:default;
}
.fw-node-head:hover{background:var(--c-soft)}
.fw-node-name{font-size:13px;color:#2c3a52;font-weight:500}
.fw-badge{background:#eef1f6;color:#6b7686;border-radius:9px;padding:0 6px;font-size:10px}
.fw-actions{margin-left:auto;display:none;white-space:nowrap}
.fw-node-head:hover .fw-actions{display:block}
.fw-leaf:hover .fw-actions{display:block}
.fw-children{margin-left:18px;border-left:1px solid var(--c-border);padding-left:4px}
.fw-leaf{display:flex;align-items:center;gap:6px;padding:5px 8px;border-radius:6px}
.fw-leaf:hover{background:var(--c-soft)}
.fw-leaf-name{font-size:12px;color:#4a5668}
.fw-empty{padding:16px 10px;color:#b3bcc9;font-size:11px;text-align:center}
.fw-empty.small{padding:6px 10px;text-align:left}

/* ---------------- 角色弹窗 ---------------- */
.role-add{display:flex;align-items:center}

/* ---------------- 日志详情 ---------------- */
.detail-title{font-size:19px;margin:6px 0 5px;font-weight:600;color:#1c2740}
.log-layout{display:grid;grid-template-columns:290px 1fr;gap:16px;align-items:start}
.log-fields-panel{max-height:calc(100vh - 220px);display:flex;flex-direction:column}
.sys-fields{padding:10px 14px;border-bottom:1px dashed var(--c-border);background:#fbfcfe}
.sys-label{font-size:11px;color:var(--c-muted);margin-bottom:6px}
.sys-chips{display:flex;gap:6px;flex-wrap:wrap}
.sys-chip{
  background:#eaf1fd;color:var(--c-primary-deep);border:1px solid #d3e2fb;
  border-radius:10px;padding:1px 9px;font-size:11px;
}
.field-list{overflow:auto;padding:6px 8px}
.field-item{display:flex;align-items:center;gap:8px;padding:5px 6px;border-radius:5px}
.field-item:hover{background:var(--c-soft)}
.fi-name{font-size:12px;color:#374357;flex:1}
.fi-type{font-size:10px;color:#8d97a8;background:#f1f4f9;border-radius:8px;padding:0 5px}
.fi-unit{font-size:10px;color:#9aa5b5}
.req-mark{color:#d94a4a;margin-left:2px}

/* ---------------- 录入模式 ---------------- */
.entry-modes{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:14px}
.mode-card{
  background:#fff;border:1px solid var(--c-border);border-radius:9px;padding:11px 14px;
}
.mode-card.active{border-color:#b9d1f7;background:#f7faff}
.mode-card.disabled{opacity:.62}
.mode-title{font-size:13px;font-weight:600;color:#26334a;display:flex;align-items:center}
.mode-desc{font-size:11px;color:var(--c-muted);margin-top:4px}

/* ---------------- 系统字段表单 ---------------- */
.sys-form{padding:12px 14px;background:#fbfcfe;border-bottom:1px solid var(--c-border)}
.sys-form-label{
  font-size:11px;color:var(--c-primary-deep);font-weight:600;margin-bottom:8px;
  display:inline-block;padding:1px 8px;background:#eaf1fd;border-radius:9px;
}
.sys-form-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:0 12px}
.sys-form-grid .el-form-item{margin-bottom:4px}

/* ---------------- 日志字段编辑器 ---------------- */
.log-field-editor{border:1px solid var(--c-border);border-radius:8px;overflow:hidden}
.lfe-head{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:9px 12px;background:#f8fafd;border-bottom:1px solid var(--c-border);
}
.lfe-title{font-size:13px;font-weight:600;margin-right:8px}
.lfe-actions{display:flex;gap:8px}
.lfe-empty{padding:26px;text-align:center;color:#a8b0be;font-size:12px}
.lfe-table{width:100%;border-collapse:collapse;font-size:12px}
.lfe-table th{
  background:#fbfcfe;border-bottom:1px solid var(--c-border);padding:6px 6px;
  font-weight:600;color:#5b6676;font-size:11px;text-align:left;
}
.lfe-table td{border-bottom:1px solid #f0f3f8;padding:4px 6px}
.lfe-table td.idx{color:#a8b0be;text-align:center;font-size:11px}
.lfe-table td.center{text-align:center}
.lfe-foot{padding:7px 12px;background:#fbfcfe}
.filter-row.inline{display:flex;align-items:center;justify-content:space-between}
.filter-row.inline label{margin-bottom:0}

/* ---------------- 展示表：系统字段行 ---------------- */
.result-table tr.sys-row td{background:#fcfdff;color:#6b7686;font-style:normal}
.result-table tr.sys-row .sticky-col{background:#fcfdff;color:#5b6676}

/* ---------------- 日志详情：字段条 ---------------- */
.field-strip{
  display:flex;align-items:flex-start;gap:12px;padding:10px 14px;margin-bottom:14px;
}
.field-strip-label{font-size:11px;color:var(--c-muted);white-space:nowrap;padding-top:3px}
.field-strip-list{display:flex;flex-wrap:wrap;gap:6px;flex:1}
.biz-chip{
  background:#f4f6fa;color:#43506a;border:1px solid var(--c-border);
  border-radius:10px;padding:1px 9px;font-size:11px;
}
.biz-chip em{font-style:normal;color:#9aa5b5;font-size:10px}

/* ---------------- 日志详情：数据矩阵 ---------------- */
.matrix-panel{margin-bottom:16px}
.matrix-head-right{display:flex;align-items:center;gap:12px}
.matrix-table th, .matrix-table td{min-width:110px}
.matrix-table .op-col{width:1%;white-space:nowrap;min-width:auto;padding:2px 6px}
.matrix-op-row td{background:#fcfdff}
.matrix-op-row .sticky-col{background:#fcfdff;font-size:11px;color:var(--c-muted)}
.col-ops{display:flex;justify-content:center;gap:2px}
.col-meta{
  display:flex;align-items:center;justify-content:center;gap:4px;
  font-size:10px;color:#9aa5b5;margin-top:2px;
}
.col-meta .dot{
  width:6px;height:6px;border-radius:50%;background:#d6dbe4;display:inline-block;
}
.col-meta .dot.on{background:#4caf7d}
.matrix-foot{padding:9px 14px;background:#fbfcfe;border-top:1px solid var(--c-border)}
.val-cell.warn-cell{background:#fffbe8;color:#8a6321}
.val-cell.na-cell{color:#a8b0be}

/* ---------------- 表单内单元格就地编辑 ---------------- */
.val-cell.cell-editable{cursor:cell}
.val-cell.cell-editable:hover{background:#f2f7ff;box-shadow:inset 0 0 0 1px #cfe0ff}
.val-cell.editing{padding:0 !important;background:#fff;vertical-align:top;
  box-shadow:inset 0 0 0 2px var(--c-primary, #3b82f6)}
.cell-input{
  display:block;width:100%;min-width:56px;min-height:26px;box-sizing:border-box;
  border:0;outline:none;background:#fff;padding:6px 10px;margin:0;
  font:inherit;color:#1f2937;text-align:inherit;line-height:1.5;
}
.cell-area{resize:vertical;white-space:pre;overflow:auto}

/* ---------------- 弹窗内联建角色 ---------------- */
.role-inline{display:flex;gap:8px;width:100%}
.dialog-tip{margin-top:-4px;padding-left:2px;line-height:1.6}

/* ---------------- 录入页：角色提示 ---------------- */
.role-hint{
  display:flex;align-items:center;gap:8px;padding:8px 12px;margin-bottom:10px;
  background:#fffbe8;border:1px solid #f5e2c3;border-radius:8px;font-size:12px;color:#8a6321;
}

.entry-foot-tip{padding:9px 14px;background:#fbfcfe;border-top:1px solid var(--c-border);line-height:1.7}
.entry-foot-tip b{color:#8a6321}

/* ---------------- 日志页：双页签 ---------------- */
.logs-tabs{margin-top:-4px}
.logs-tabs .el-tabs__header{margin-bottom:14px}
.tab-label{font-size:13px;font-weight:500}

/* ---------------- 数据录入工作台 ---------------- */
.entry-work{display:grid;grid-template-columns:270px 1fr;gap:16px;align-items:start}
.work-log-list{max-height:calc(100vh - 250px);display:flex;flex-direction:column}
.work-log-body{overflow:auto;padding:8px}
.work-log-item{
  padding:9px 10px;border-radius:7px;cursor:pointer;margin-bottom:2px;
  border:1px solid transparent;
}
.work-log-item:hover{background:var(--c-soft)}
.work-log-item.active{background:#eaf1fd;border-color:#d3e2fb}
.wli-name{font-size:13px;font-weight:500;color:#2c3a52}
.work-log-item.active .wli-name{color:var(--c-primary-deep)}
.wli-path{font-size:11px;color:var(--c-muted);margin:3px 0 5px;line-height:1.5}
.wli-meta{display:flex;gap:12px;font-size:10px;color:#9aa5b5}

.work-entry{min-height:320px}
.we-new{padding:12px 14px;background:#fbfcfe;border-bottom:1px solid var(--c-border)}
.we-new-title{font-size:12px;font-weight:600;color:#33415a;margin-bottom:10px}
.we-new-form{display:grid;grid-template-columns:1.3fr 1fr 0.8fr auto;gap:12px;align-items:end}
.we-field label{display:block;font-size:11px;color:var(--c-muted);margin-bottom:5px}
.we-field label i{color:#d94a4a;font-style:normal}
.we-action{padding-bottom:1px}
.we-list-head{
  display:flex;justify-content:space-between;align-items:center;
  padding:10px 14px 6px;font-size:12px;font-weight:600;color:#33415a;
}

/* ---------------- 创建日志弹窗 ---------------- */
.log-basic{padding-bottom:6px}
.locked-path{
  display:flex;align-items:center;gap:8px;font-size:13px;color:#33415a;
  padding:4px 0;
}
.fixed-cols{
  display:flex;align-items:center;flex-wrap:wrap;gap:6px;
  padding:8px 12px;background:#f7faff;border-bottom:1px solid var(--c-border);
}
.fixed-label{font-size:11px;color:var(--c-muted)}
.fixed-chip{
  background:#eaeff7;color:#5b6676;border:1px solid #dde4ee;
  border-radius:9px;padding:0 8px;font-size:11px;
}

/* ---------------- 数据表格：表头作列、记录作行 ---------------- */
.data-table th, .data-table td{min-width:100px}
.data-table th.sys-head{background:#eef3fb;color:#3a4a63}
.data-table .idx-col{
  width:1%;min-width:44px;white-space:nowrap;padding:4px 8px;
  color:#9aa5b5;font-size:11px;text-align:center;
}
.data-table thead .idx-col{background:#f2f6fd}
.head-meta{font-size:10px;color:#8d97a8;font-weight:400;margin-top:1px}
.lock-tag{
  display:inline-block;margin-left:4px;padding:0 5px;border-radius:7px;
  background:#e3ecfa;color:#4a6091;font-size:9px;
}
.data-table tbody tr:hover td{background:#f7faff}

/* ---------------- 展示页：分日志区块 ---------------- */
.group-block{border-top:1px solid var(--c-border)}
.group-block:first-of-type{border-top:none}
.group-title{
  display:flex;align-items:center;gap:12px;padding:10px 14px;background:#f8fafd;
}
.gt-name{font-size:13px;font-weight:600;color:#2c3e57}
.gt-meta{font-size:11px;color:#9aa5b5}
.group-empty{padding:16px 14px;text-align:center}

/* ---------------- 展示页：透视表（指标为行、日期为列） ---------------- */
.pivot-table thead th{text-align:center;white-space:nowrap}
.pivot-table th.log-col{
  position:sticky;left:0;z-index:3;text-align:left;
  width:120px;min-width:120px;max-width:120px;
  background:#f2f6fd;
}
.pivot-table th.metric-col{
  position:sticky;left:120px;z-index:3;text-align:left;
  min-width:126px;background:#f2f6fd;
}
.pivot-table td.log-cell{
  position:sticky;left:0;z-index:2;background:#f7f9fd;
  width:120px;min-width:120px;max-width:120px;
  text-align:center;vertical-align:middle;white-space:normal;word-break:break-all;
  padding:6px 10px;color:#2c3e57;font-size:12px;font-weight:500;
  border-right:1px solid var(--c-border);
}
.pivot-table td.metric-cell{
  position:sticky;left:120px;z-index:2;text-align:left;white-space:nowrap;
  padding:6px 12px;background:#fff;color:#3a4a63;font-size:12px;
}
.pivot-table tbody tr:hover td.metric-cell,
.pivot-table tbody tr:hover td.log-cell{background:#f7faff}
.pivot-table td.val-cell{text-align:center;font-variant-numeric:tabular-nums}
.filter-hint{padding:0 0 8px;line-height:1.5}

/* ---------------- 侧栏版本标记（用于确认是否加载到最新前端） ---------------- */
.build-tag{
  margin-top:auto;padding:8px 2px 0;font-size:10px;color:#9aa5b5;
  border-top:1px solid var(--c-border);word-break:break-all;
}

/* ---------------- 日志展示页签：只读提示 ---------------- */
.readonly-hint{
  display:flex;flex-wrap:wrap;gap:6px;align-items:center;
  padding:9px 14px;margin-bottom:12px;
  background:#f7f9fc;border:1px solid var(--c-border);border-radius:8px;
  font-size:12px;color:#5b6676;
}

/* ---------------- 数据录入：上传 Excel ---------------- */
.import-tip{
  background:#f7f9fc;border:1px solid var(--c-border);border-radius:8px;
  padding:12px 14px;margin-bottom:14px;font-size:12px;color:#5b6676;
}
.import-tip .it-title{font-size:13px;font-weight:600;color:#2f3a4a;margin-bottom:6px}
.import-tip ul{margin:0 0 4px;padding-left:18px;line-height:1.9}
.import-upload .el-upload,.import-upload .el-upload-dragger{width:100%}
.import-result{margin-top:14px;border-top:1px dashed var(--c-border);padding-top:12px}
.import-result .ir-sum{
  font-size:12px;color:#3d4859;background:#f7f9fc;border-radius:6px;
  padding:8px 12px;margin-bottom:10px;
}
.import-result .ok-text{color:#2f9e63;font-size:12px}

/* ---------------- 数据录入：日志项内删除 ---------------- */
.wli-top{display:flex;align-items:center;justify-content:space-between;gap:8px}
.wli-del{opacity:0;transition:opacity .12s;padding:0 2px !important;font-size:11px !important}
.work-log-item:hover .wli-del{opacity:1}

/* ---------------- 登录 / 启动 ---------------- */
.boot-screen{
  display:flex;align-items:center;justify-content:center;height:100vh;
  color:var(--c-muted);font-size:13px;
}
.login-screen{
  display:flex;align-items:center;justify-content:center;min-height:100vh;
  background:linear-gradient(160deg,#eef3fb,#f8fafd 45%,#eef3fb);
}
.login-card{
  width:382px;padding:26px 26px 20px;background:#fff;border:1px solid var(--c-border);
  border-radius:14px;box-shadow:0 14px 44px rgba(31,41,55,.09);
}
.login-brand{display:flex;gap:12px;align-items:center;margin-bottom:22px}
.login-title{font-size:15px;font-weight:600}
.login-sub{font-size:12px;color:var(--c-muted);margin-top:3px}
.login-error{margin:-2px 0 10px;color:#c0392b;font-size:12px}
.login-tip{margin-top:14px;font-size:11px;color:var(--c-muted);line-height:1.7}

/* ---------------- 侧栏账号块 ---------------- */
.user-box{
  padding:9px 10px;margin:8px 0 10px;border:1px solid var(--c-border);
  border-radius:9px;background:var(--c-soft);
}
.user-main{display:flex;align-items:center;gap:9px}
.user-avatar{
  width:30px;height:30px;border-radius:50%;background:var(--c-primary);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600;flex:0 0 auto;
}
.user-info{min-width:0}
.user-name{font-size:12.5px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.user-role{font-size:11px;color:var(--c-muted)}
.user-ops{display:flex;justify-content:space-between;margin-top:5px}
.user-ops .el-button{font-size:11px}

/* ---------------- 账号权限 ---------------- */
.perm-chips{display:flex;flex-wrap:wrap;gap:4px}
.perm-chip{margin:0!important}
.perm-head{display:flex;align-items:center;gap:10px;margin:6px 0 8px}
.perm-title{font-size:13px;font-weight:600}
.perm-quick{margin-left:auto;display:flex;gap:2px}
.perm-global{
  display:flex;align-items:center;gap:10px;padding:8px 10px;margin-bottom:8px;
  background:var(--c-soft);border:1px solid var(--c-border);border-radius:8px;
}
.perm-global-name{font-size:12.5px;font-weight:600}
.perm-global .el-select{margin-left:auto}
.cfg-columns{font-size:11.5px;color:#5a6678;line-height:1.6}

/* ==================== 商业化 ==================== */
.spacer{flex:1 1 auto}
.comm-bar{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin-bottom:12px;padding:9px 12px;background:var(--c-panel);
  border:1px solid var(--c-border);border-radius:9px;
}
.comm-bar-label{font-size:12px;font-weight:600;color:#475569}

/* ---------- 活动定义 ---------- */
.comm-cats{display:grid;gap:10px}
.comm-cat-card{
  background:var(--c-panel);border:1px solid var(--c-border);border-radius:10px;
  padding:10px 12px;
}
.comm-cat-head{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.comm-cat-name{font-size:13px;font-weight:700;color:#1e293b}
.comm-cat-ops{margin-left:auto;display:flex;gap:2px}
/* 分类的判断依据：一行小字，鼠标悬停看全文，避免卡片被长文本撑高 */
.comm-cat-hint{
  font-size:11px;color:#64748b;line-height:1.6;margin:-2px 0 8px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:help;
}
.comm-act-list{display:flex;flex-wrap:wrap;gap:6px}
.comm-act-chip{
  display:inline-flex;align-items:center;gap:4px;
  padding:3px 8px;border:1px solid var(--c-border);border-radius:20px;
  background:var(--c-soft);font-size:12px;color:#334155;
}
.comm-act-text{cursor:pointer}
.comm-act-text:hover{color:var(--c-primary)}
.comm-act-del{
  font-style:normal;color:#c0392b;cursor:pointer;opacity:.55;
  font-size:13px;line-height:1;
}
.comm-act-del:hover{opacity:1}
.comm-empty{text-align:left}
.comm-tpl{
  margin:10px 0 0;padding:10px 12px;background:#f1f5f9;border-radius:8px;
  font-size:12px;line-height:1.8;color:#475569;white-space:pre-wrap;
}

/* ---------- 活动截图 ---------- */
.shot-grid{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));
  gap:12px;min-height:80px;
}
.shot-card{
  background:var(--c-panel);border:1px solid var(--c-border);border-radius:10px;
  overflow:hidden;display:flex;flex-direction:column;
}
.shot-img{width:100%;height:132px;background:#f1f5f9;display:block;cursor:zoom-in}
.shot-img-lost{
  width:100%;height:132px;display:flex;align-items:center;justify-content:center;
  font-size:12px;color:#94a3b8;background:#f1f5f9;
}
.shot-imgwrap{position:relative}
.shot-busy{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;
  justify-content:center;gap:6px;background:rgba(15,23,42,.62);color:#fff;
  font-size:11.5px;pointer-events:none}
.shot-busy-txt{font-weight:600;letter-spacing:.3px}
.shot-busy-tip{font-size:10px;opacity:.82}
.spin{width:18px;height:18px;border:2px solid rgba(255,255,255,.32);
  border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.sg-busy{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  background:rgba(15,23,42,.55)}
.shot-body{padding:8px 10px 9px}
.shot-act{display:flex;flex-direction:column;gap:1px;margin-bottom:6px;min-width:0}
.shot-act b{font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.shot-foot{display:flex;align-items:center;gap:4px}
.comm-empty-grid{grid-column:1/-1}
.shot-sum{font-size:11px;color:var(--c-muted);margin-bottom:6px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 已识别：按「活动 + 同一期」整合的组卡 */
.shot-grid-groups{grid-template-columns:repeat(auto-fill,minmax(320px,1fr))}
.shot-group{
  background:var(--c-panel);border:1px solid var(--c-border);border-radius:10px;
  overflow:hidden;display:flex;flex-direction:column;
}
.sg-head{display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  padding:8px 10px;background:var(--c-soft);border-bottom:1px solid var(--c-border)}
.sg-head b{font-size:12.5px;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;max-width:130px}
.sg-dates{display:flex;align-items:center;gap:6px;padding:8px 10px 0;min-height:30px;
  flex-wrap:wrap}
.sg-range-label{font-size:11px;color:var(--c-muted);flex:none}
.sg-nodate{font-size:11px;color:var(--c-muted)}
.sg-tip{flex:1 1 100%;margin-top:-2px}
.sg-thumbs{display:flex;flex-wrap:wrap;gap:6px;padding:8px 10px 4px}
.sg-thumb{position:relative;width:70px;height:94px;border-radius:6px;overflow:hidden;
  background:#f1f5f9;border:1px solid var(--c-border)}
.sg-img{width:100%;height:100%;display:block;cursor:zoom-in}
.sg-del{position:absolute;right:0;top:0;width:16px;height:16px;line-height:14px;
  text-align:center;background:rgba(15,23,42,.62);color:#fff;font-size:13px;
  border-bottom-left-radius:6px;cursor:pointer;opacity:0;transition:opacity .15s}
.sg-thumb:hover .sg-del{opacity:1}
.sg-foot{display:flex;align-items:center;gap:2px;padding:2px 10px 8px}

/* ---------- 截图库：左树 + 右网格 ---------- */
.shot-layout{display:flex;gap:12px;align-items:flex-start}
.shot-side{
  width:216px;flex:none;border:1px solid var(--c-border);border-radius:10px;
  background:var(--c-panel);overflow:hidden;position:sticky;top:8px;
}
.shot-side-head{
  display:flex;justify-content:space-between;align-items:center;
  padding:8px 10px;background:var(--c-soft);border-bottom:1px solid var(--c-border);
  font-size:12.5px;font-weight:600;
}
.shot-tree{max-height:calc(100vh - 250px);overflow:auto;padding:4px 0}
.st-node{
  display:flex;align-items:center;gap:5px;padding:5px 8px;cursor:pointer;
  font-size:12.5px;line-height:1.4;border-left:2px solid transparent;
}
.st-node:hover{background:#f5f8ff}
.st-node.on{background:#eef4ff;border-left-color:var(--c-primary);font-weight:600}
.st-root{padding-left:8px}
.st-cat{padding-left:20px}
.st-act{padding-left:34px;font-size:12px}
.st-caret{width:10px;flex:none;color:var(--c-muted);font-size:10px;text-align:center}
.st-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.st-count{
  font-size:11px;color:var(--c-muted);background:var(--c-soft);
  border-radius:8px;padding:0 6px;flex:none;white-space:nowrap;
}
.st-badge{
  font-size:10px;color:#b45309;background:#fef3c7;border-radius:8px;
  padding:0 5px;flex:none;white-space:nowrap;
}
.st-empty{padding:10px 12px;line-height:1.6}
.shot-main{flex:1;min-width:0}
.shot-cur{font-size:13px}
.ls-empty-in-grid{grid-column:1/-1;width:100%;text-align:center;padding:36px 16px}
.comm-batch-bar{display:flex;align-items:center;gap:10px;margin-bottom:10px}

/* ---------- 排期表（长箭头甘特） ---------- */
.gantt-wrap{
  background:var(--c-panel);border:1px solid var(--c-border);border-radius:10px;
  padding:10px 0 0;overflow:hidden;
}
.gantt-head{display:flex;align-items:baseline;gap:10px;padding:0 12px 8px;flex-wrap:wrap}
.gantt-head b{font-size:13px}
.gantt-legend{display:inline-flex;align-items:center;gap:4px}
.gantt-legend .lg-bar{
  display:inline-block;width:20px;height:9px;border-radius:4px 0 0 4px;
  background:#3d9be9;
  clip-path:polygon(0 0, calc(100% - 5px) 0, 100% 50%, calc(100% - 5px) 100%, 0 100%);
}
.gantt-legend .lg-dash{
  display:inline-block;width:16px;height:9px;border-radius:1px;
  background:#3d9be9;border-left:2px dashed #fff;
}
.gantt-legend .lg-perm{
  display:inline-block;width:18px;height:9px;border-radius:3px;
  background:repeating-linear-gradient(135deg,#fbf3d8 0 4px,#f5e9c2 4px 8px);
  border:1px solid #e8d59a;
}
.gantt-hint{opacity:.8}
.gantt-scroll{overflow:auto;max-height:calc(100vh - 250px)}

/* 列宽由 colgroup 固定，保证表头与箭头轨道严丝合缝对齐 */
.gantt-table{border-collapse:separate;border-spacing:0;font-size:11px;table-layout:fixed}
.gantt-table th,.gantt-table td{
  border-right:1px solid #e8edf4;border-bottom:1px solid #e8edf4;
  padding:3px 4px;text-align:center;white-space:nowrap;
}
.gantt-table thead th{
  background:#2f6db5;color:#fff;font-weight:600;font-size:10.5px;
  position:sticky;z-index:3;padding:0 2px;overflow:hidden;
}
.gantt-table thead tr:nth-child(1) th{top:0;height:22px}
.gantt-table thead tr:nth-child(2) th{top:22px;height:20px;font-weight:400;font-size:9.5px}
.gantt-table thead tr:nth-child(3) th{top:42px;height:20px;font-weight:400;font-size:10px}
/* 日期三行表头：列宽由 colgroup 控制（一天 52px），字放大一点也放得下 */
.gantt-table thead th.day-col{font-size:10.5px}
.gantt-table thead th.date-col{font-size:10px}
/* 周末淡染、今天高亮，方便一眼定位 */
.gantt-table thead th.wk-end{background:#3b7cc4}
.gantt-table thead th.is-today{background:#e2703a}
/* 左边两列冻结：横向滚动时不动 */
.gantt-table th.cat-col,
.gantt-table th.act-col{left:0;z-index:6;background:#2f6db5}
.gantt-table th.cat-col{left:0}
.gantt-table th.act-col{left:88px}
.gantt-table td.cat-cell{
  position:sticky;left:0;z-index:2;background:#eef3fa;
  font-weight:600;color:#1e3a5f;font-size:11.5px;vertical-align:middle;
  white-space:normal;line-height:1.35;
}
.gantt-table td.act-cell{
  position:sticky;left:88px;z-index:2;background:#fff;
  text-align:left;padding-left:8px;font-size:11.5px;color:#334155;
  overflow:hidden;text-overflow:ellipsis;
}
.gantt-table td.lane-cell{padding:0;background:#fff;text-align:left}
/* 日期列的竖线：一格 34px，用背景渐变画出来，不额外 DOM */
.lane-track{
  position:relative;
  background-image:repeating-linear-gradient(to right,#eef2f7 0 1px,transparent 1px 34px);
}
.gantt-bar{
  position:absolute;height:19px;
  border-radius:5px 0 0 5px;
  padding:0;box-sizing:border-box;
  clip-path:polygon(0 0, calc(100% - 8px) 0, 100% 50%, calc(100% - 8px) 100%, 0 100%);
  cursor:default;
}
/* 开始日未知（倒计时类）：左端虚线，表示这条之前活动已经开始 */
.gantt-bar.open-l{border-left:2px dashed rgba(255,255,255,.92)}
/* 区间超出当前可见窗口：那一侧不画箭头尖，表示还有后续 */
.gantt-bar.clip-r{clip-path:none;border-radius:5px}
.gantt-bar.clip-l{border-top-left-radius:0;border-bottom-left-radius:0}
/* 常驻：斜纹浅黄通栏条 */
.gantt-bar.is-perm{
  background:repeating-linear-gradient(135deg,#fbf3d8 0 6px,#f5e9c2 6px 12px);
  border:1px solid #e8d59a;border-radius:5px;
  clip-path:none;
}

.gantt-table tbody tr:hover td.act-cell{background:#f7faff}
.gantt-table tbody tr:hover .gantt-bar:not(.is-perm){filter:brightness(1.06)}
/* 常驻活动行：整行浅黄底 */
.gantt-table tbody tr.perm-row td.act-cell,
.gantt-table tbody tr.perm-row td.lane-cell{background:#fffdf6}
.gantt-table tbody tr.perm-row td.cat-cell{background:#f4ecd7}
.perm-tag{
  display:inline-block;margin-left:5px;padding:0 4px;border-radius:4px;
  background:#f0e2b6;color:#8a6d1f;font-size:9.5px;line-height:15px;vertical-align:1px;
}

/* ---------- 识别结果 ---------- */
.reco-evidence{
  margin-top:8px;padding:8px 10px;background:#f8fafd;border:1px solid var(--c-border);
  border-radius:8px;font-size:12px;color:#475569;line-height:1.7;
}

/* ---------- 模型接入 ---------- */
.ai-presets{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:12px 0 4px}
.ai-model-row{display:flex;gap:8px;width:100%}
.ai-model-row .el-input{flex:1}
/* API Key 输入框下的说明：留空=沿用；浏览器自动填充的提醒 */
.ai-key-hint{display:flex;align-items:center;gap:4px;flex-wrap:wrap;
  font-size:12px;line-height:1.7;color:var(--c-muted,#8a93a3)}
.ai-key-hint .el-button{font-size:12px;height:auto;padding:0 2px}
.ai-key-warn{margin-top:2px;font-size:12px;line-height:1.6;color:#b07a2a}
.ai-model-pick{margin-top:4px;width:100%}
.ai-result{
  margin-top:10px;padding:9px 11px;border-radius:8px;font-size:12px;line-height:1.7;
  word-break:break-all;
}
.ai-result.ok{background:#eefaf3;border:1px solid #b7e4c9;color:#1e7e4f}
.ai-result.bad{background:#fdf1f0;border:1px solid #f3c5c0;color:#b03a2e}

/* ---------- 识别设置 ---------- */
.recog-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:6px 0 10px}
.recog-scope-note{max-width:300px;line-height:1.5}
.recog-tip{
  margin-top:8px;padding:8px 10px;background:#f8fafd;border:1px solid var(--c-border);
  border-radius:8px;font-size:12px;color:#475569;line-height:1.75;white-space:pre-line;
}
.bulk-input{margin-top:10px}

/* ---------- 日志截图录入 ---------- */
.ls-bar{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin:10px 0;padding:10px 12px;background:#f8fafd;
  border:1px solid var(--c-border);border-radius:8px;
}
.ls-lbl{font-size:12px;color:#64748b;font-weight:600;margin-left:4px}
.ls-lbl:first-child{margin-left:0}
/* 拖拽上传区：整行虚线框，拖进来直接开始上传 */
.ls-ready{
  margin-left:auto;font-size:11.5px;font-weight:600;padding:2px 9px;border-radius:20px;
  color:#b45309;background:#fef3c7;border:1px solid #fde68a;white-space:nowrap;
}
.ls-ready.ok{color:#15803d;background:#dcfce7;border-color:#bbf7d0}
.ls-drop{margin-bottom:10px}
.ls-drop .el-upload{display:block;width:100%}
.ls-drop .el-upload-dragger{
  width:100%;padding:10px 14px;border:1px dashed #c7d2e0;border-radius:9px;
  background:#fbfcfe;transition:border-color .15s,background .15s;
}
.ls-drop .el-upload-dragger:hover{border-color:#7aa7e6;background:#f5f9ff}
.ls-drop .el-upload-dragger.is-dragover{
  border-color:#2f6fdd;background:#eaf2ff;border-width:2px;padding:9px 13px;
}
.ls-drop .el-upload.is-disabled .el-upload-dragger{background:#f8fafc;cursor:not-allowed;opacity:.75}
.ls-drop-in{display:flex;align-items:center;gap:12px;text-align:left}
.ls-drop-ico{
  width:34px;height:34px;flex:0 0 34px;border-radius:50%;display:flex;
  align-items:center;justify-content:center;font-size:17px;font-weight:700;
  color:#2f6fdd;background:#e8f0fe;
}
.ls-drop-txt{flex:1;min-width:0;line-height:1.6}
.ls-drop-main{font-size:13px;color:#334155;font-weight:600}
.ls-drop-main em{font-style:normal;color:#2f6fdd}
.ls-drop-busy{margin-left:8px;font-size:11.5px;font-weight:600;color:#b45309}
.ls-drop-sub{font-size:11.5px;color:#94a3b8;margin-top:2px}

.ls-head{display:flex;align-items:center;gap:12px;margin:6px 0 10px}
.ls-grid{
  display:grid;grid-template-columns:repeat(auto-fill,minmax(212px,1fr));
  gap:12px;min-height:230px;max-height:calc(100vh - 330px);
  overflow:auto;padding:2px;align-content:start;
}
.ls-card{
  border:1px solid var(--c-border);border-radius:10px;overflow:hidden;
  background:#fff;display:flex;flex-direction:column;
}
.ls-img{position:relative;height:132px;background:#0f172a}
.ls-img img{width:100%;height:100%;object-fit:cover;display:block}
.ls-badge{
  position:absolute;left:6px;top:6px;padding:1px 7px;border-radius:20px;
  font-size:10.5px;font-weight:600;background:rgba(15,23,42,.72);color:#fff;
}
.ls-badge.st-done{background:#1f8f52}
.ls-badge.st-failed{background:#b03a2e}
.ls-badge.st-none{background:rgba(15,23,42,.6)}
.ls-mask{
  position:absolute;inset:0;background:rgba(15,23,42,.62);color:#fff;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;
  font-size:11.5px;text-align:center;padding:6px;
}
.ls-mask .spin{width:20px;height:20px;border:2px solid rgba(255,255,255,.3);
  border-top-color:#fff;border-radius:50%;animation:spin .9s linear infinite}
.ls-slow{font-size:10px;opacity:.85}
.ls-meta{padding:8px 10px;flex:1;line-height:1.55}
.ls-row{font-size:11.5px;color:#334155;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ls-row.muted{color:#94a3b8}
.ls-row.ok{color:#1f8f52}
.ls-row.err{color:#b03a2e}
.ls-ops{
  display:flex;align-items:center;gap:6px;padding:0 8px 8px 10px;
}
.ls-ops .el-button+.el-button{margin-left:0}
.ls-empty{
  grid-column:1/-1;padding:26px;text-align:center;color:#94a3b8;font-size:12.5px;
  border:1px dashed var(--c-border);border-radius:10px;background:#fbfcfe;
}
/* 识别结果弹窗：左图右表 */
.ls-res{display:flex;gap:14px;align-items:flex-start}
.ls-res-img{width:300px;flex:0 0 300px}
.ls-res-img > img{
  width:100%;max-height:min(430px, calc(94vh - 330px));object-fit:contain;border-radius:8px;
  border:1px solid var(--c-border);background:#0f172a;
}
.ls-res-main{flex:1;min-width:0}
.ls-res-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.ls-res-tools{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.ls-tip-inline{color:#94a3b8}
.ls-low{color:#d97706;font-weight:600}

/* 识别结果：整批合并 + 按类分组给表头 */
.ls-note{
  font-size:12px;line-height:1.6;color:#475569;background:#f1f5f9;
  border:1px solid #e2e8f0;border-radius:6px;padding:7px 10px;margin-bottom:8px;
}
.ls-note b{color:#0f172a}
.ls-groups{max-height:calc(94vh - 300px);overflow:auto;padding-right:2px}
.ls-group{border:1px solid var(--c-border);border-radius:8px;margin-bottom:10px;overflow:hidden}
.ls-group-head{
  display:flex;align-items:center;gap:8px;padding:6px 10px;
  background:#f8fafc;border-bottom:1px solid var(--c-border);
}
.ls-group-name{font-size:12.5px;font-weight:700;color:#334155}

/* 待建表头的表：左上两列是系统固定列（角色/日期），右侧每列填一个表头名 */
.ls-tbl-wrap{overflow:auto;max-height:calc(94vh - 330px)}
.ls-tbl{border-collapse:separate;border-spacing:0;width:100%;table-layout:fixed}
.ls-tbl th,.ls-tbl td{
  border-bottom:1px solid #e8edf4;border-right:1px solid #eef2f7;
  padding:0 6px;height:32px;font-size:12.5px;color:#0f172a;background:#fff;
  vertical-align:middle;
}
.ls-tbl thead th{
  position:sticky;top:0;z-index:2;background:#f8fafc;
  text-align:left;font-weight:600;padding:5px 6px;
}
.ls-tbl tbody tr:hover td{background:#fbfdff}
.ls-no{
  width:64px;text-align:left !important;color:#94a3b8 !important;
  background:#fbfcfe !important;font-variant-numeric:tabular-nums;
  padding-left:8px !important;
}
/* 行首勾选：取消勾选的行整行淡下去，一眼能看出哪条不写 */
.ls-pick{display:flex;align-items:center;gap:5px}
.ls-pick .el-checkbox{height:auto;margin-right:0}
.ls-idx{font-size:11.5px;color:#94a3b8}
.ls-pick-tip{color:#b45309;font-size:11.5px;margin-left:6px}
.ls-tbl tbody tr.is-unpicked td:not(.ls-no){opacity:.4}
.ls-tbl tbody tr.is-unpicked td:not(.ls-no) .el-input__wrapper{background:#fafbfc}
/* 列勾选：取消勾选的列整列淡下去，表头输入框也锁住，一眼看出这列不写 */
.ls-th-pick{display:flex;align-items:center;gap:4px;margin-bottom:3px}
.ls-th-pick .el-checkbox{height:auto;margin-right:0}
.ls-pick-lbl{font-size:10.5px;color:#64748b;font-weight:400}
.ls-lock-tip{font-size:10px;color:#b45309;border-bottom:1px dashed #d97706;cursor:help}
.ls-tbl thead th.is-col-off{background:#f2f4f7}
.ls-tbl thead th.is-col-off .ls-th-pick .ls-pick-lbl{color:#b0b7c3}
.ls-tbl tbody td.is-col-off{opacity:.4}
.ls-tbl tbody td.is-col-off .el-input__wrapper{background:#fafbfc;box-shadow:none}
.ls-sys{color:#475569 !important;background:#fbfcfe !important;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
.ls-th .el-input__wrapper{padding:0 6px}
.ls-th-blank .el-input__wrapper{box-shadow:0 0 0 1px #f0b429 inset !important;background:#fffdf5}
.ls-th-sub{
  font-size:10.5px;font-weight:400;color:#94a3b8;margin-top:3px;
  display:flex;align-items:center;gap:5px;white-space:nowrap;
}
.ls-th-sub .ls-ok,.ls-th-sub .ls-low{font-size:10px}
.ls-tbl tbody td .el-input__wrapper{padding:0 6px;box-shadow:none;background:transparent}
.ls-tbl tbody td .el-input__wrapper:hover{box-shadow:0 0 0 1px #cbd5e1 inset}
.ls-tbl tbody td .el-input__wrapper.is-focus{box-shadow:0 0 0 1px #3b82f6 inset !important;background:#fff}
.ls-grid-tip{font-size:11.5px;color:#94a3b8;padding:5px 10px;background:#fbfcfe;
  border-top:1px dashed #e8edf4}
.ls-ok{color:#15803d;font-size:12px;font-weight:600}
.ls-diff{color:#b45309;font-size:11.5px;margin-left:6px;cursor:help;border-bottom:1px dashed #d97706}

/* 杂项：读不懂的数据单列一组，底色偏黄提醒，不进日志、可逐条删 */
.ls-group.is-misc{border-color:#fcd34d;background:#fffdf5}
.ls-group.is-misc .ls-group-head{background:#fffbeb;border-bottom-color:#fde68a}
.ls-group.is-misc .ls-group-name{color:#b45309}
.ls-group.is-misc .ls-tbl tbody td{background:#fffdf5;color:#475569}
.ls-group.is-misc .ls-tbl tbody tr:hover td{background:#fef9e7}
.ls-misc-hint{color:#b45309}
.ls-th-fixed{display:block;font-size:12.5px;font-weight:600;color:#64748b;padding:1px 0}
.ls-fixed-val{
  display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:12.5px;color:#475569;
}
.ls-fixed-val.is-wrap{white-space:normal;line-height:1.45;color:#78716c;font-size:12px}
.ls-group.is-misc .ls-tbl td{height:30px;padding-top:3px;padding-bottom:3px}
.ls-del,.ls-del-h{text-align:center !important;border-right:none !important}
.ls-del .el-button{font-size:11.5px;padding:0}
.ls-del .el-button:hover{text-decoration:underline}
.ls-thumbs{display:flex;gap:5px;margin-top:7px;flex-wrap:wrap;max-height:64px;overflow:auto}
.ls-thumb{
  width:52px;height:40px;object-fit:cover;border-radius:5px;cursor:pointer;
  border:2px solid transparent;opacity:.7;
}
.ls-thumb.on{border-color:#3b82f6;opacity:1}

/* 定向抽取：列名直接来自日志字段，操作者不再起表头 */
.ls-th-name{
  font-size:12.5px;font-weight:700;color:#0f172a;line-height:1.35;
  display:flex;align-items:center;gap:4px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}

/* 表外发现：图上还有、但这本日志没有对应列的指标，默认不写入 */
.ls-extra{margin-top:10px;border:1px solid #fde68a;border-radius:8px;background:#fffdf5}
.ls-extra-head{
  display:flex;align-items:center;gap:8px;padding:7px 10px;cursor:pointer;
  background:#fffbeb;user-select:none;
}
.ls-extra-head b{font-size:12.5px;color:#b45309}
.ls-extra-caret{color:#b45309;font-size:11px;width:10px}
.ls-extra-body{padding:8px 10px 10px;border-top:1px solid #fde68a}
.ls-extra-body .ls-tbl th,.ls-extra-body .ls-tbl td{background:transparent}
.ls-extra-body .ls-tbl thead th{background:#fffbeb}
.ls-extra-body .ls-tbl tbody tr.is-unpicked td:not(.ls-no){opacity:.5}

/* 结果弹窗工具条：字段多时右侧按钮会被挤出去，允许换行 */
.ls-res-tools{flex-wrap:wrap}
.ls-res-tools > span:last-child{white-space:nowrap}
.ls-extra-body b{color:#b45309}

/* 表头编辑器：列名旁的「分行」标记 */
.lfe-name{display:flex;align-items:center;gap:5px}
.lfe-name .el-input{flex:1;min-width:0}
.lfe-name .el-tag{flex:none}

/* 识别示例图：缩略图 + 一句「这张该怎么读」 */
.ex-block{border:1px solid #e2e8f0;border-radius:9px;padding:10px 11px;background:#fbfcfe}
.ex-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:7px}
.ex-head b{font-size:13px;color:#0f172a}
.ex-head .muted{line-height:1.55;flex:1;min-width:220px}
.ex-empty{padding:10px 2px;line-height:1.6}
.ex-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:9px}
.ex-card{display:flex;gap:9px;background:#fff;border:1px solid #e7ecf3;border-radius:8px;padding:7px}
.ex-card:hover{border-color:#c7d4e6}
.ex-thumb{width:86px;height:86px;flex:none;border-radius:6px;background:#f1f5f9;cursor:zoom-in}
.ex-thumb-lost{width:86px;height:86px;display:flex;align-items:center;justify-content:center;
  font-size:11px;color:#94a3b8;background:#f1f5f9;border-radius:6px}
.ex-body{flex:1;min-width:0;display:flex;flex-direction:column;gap:5px}
.ex-body .el-textarea__inner{font-size:12px;line-height:1.55;min-height:66px!important;
  padding:5px 8px;resize:vertical}
.ex-foot{display:flex;align-items:center;gap:6px;min-width:0}
.ex-fname{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:110px}
.ex-divider{height:1px;background:#eef2f7;margin:12px 0 10px}

/* 拖文件悬停时的提示：底部浮起的胶囊，不压弹窗、不吃鼠标事件 */
.drop-hint{
  position:fixed;left:0;right:0;bottom:34px;z-index:3000;
  pointer-events:none;display:flex;justify-content:center;
}
.drop-hint-box{
  padding:11px 22px;text-align:center;border-radius:10px;
  background:rgba(37,99,235,.96);color:#fff;
  box-shadow:0 10px 30px rgba(15,23,42,.28);
}
.drop-hint-box .dh-main{font-size:14.5px;font-weight:700;letter-spacing:.4px}
.drop-hint-box .dh-sub{font-size:12px;color:rgba(255,255,255,.88);margin-top:3px}
.el-upload__text b{color:#2563eb;font-weight:700}

/* 统计指标：选择区里的配置胶囊 */
.picker-metrics{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:7px;
  padding-top:6px;border-top:1px dashed #e8eef7;min-width:0}
.metric-chip{display:inline-flex;align-items:center;gap:2px;background:#eef4ff;
  border:1px solid #c9dcff;border-radius:12px;padding:1px 3px 1px 9px;
  font-size:12px;color:#1d4ed8;line-height:18px;max-width:100%;min-width:0}
.metric-chip-txt{cursor:pointer;flex:1 1 auto;min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.metric-chip-txt:hover{text-decoration:underline}
.metric-chip-x{font-style:normal;cursor:pointer;color:#9db2d4;padding:0 4px;font-size:13px;line-height:1}
.metric-chip-x:hover{color:#dc2626}
.metric-add{margin-left:2px}

/* 结果表：统计行与明细行区分开 */
.pivot-table tr.metric-row td{background:#f6f9ff}
.pivot-table tr.metric-row td.val-cell{font-weight:600;color:#1d4ed8}
.pivot-table tr.metric-row td.metric-cell{background:#eef4ff}
.metric-badge{display:inline-block;font-size:10px;line-height:1;padding:2px 4px;border-radius:3px;
  background:#dbeafe;color:#1d4ed8;margin-right:5px;vertical-align:1px}
.metric-name{font-weight:600;color:#1e3a8a}

/* 统计指标弹窗 */
.metric-intro{font-size:12px;line-height:1.7;color:#64748b;background:#f8fafc;
  border:1px solid #e8eef7;border-radius:7px;padding:8px 10px;margin-bottom:12px}
.metric-hint{line-height:1.6;margin-top:2px}
.cond-row{display:flex;align-items:center;gap:6px;margin-bottom:6px;flex-wrap:wrap}
.cond-foot{display:flex;align-items:center;gap:8px;flex-wrap:wrap}

/* 带名称的统计值（如 60 · 安提戈涅）同样居中，整列读数一致 */
.pivot-table td.val-cell.val-left{text-align:center}

/* ==================================================================
   视觉系统 v2（2026-10-24）
   目标：统一圆角/阴影/间距语言，Element Plus 全组件配色收敛，
   卡片与表格有层级、侧栏深色化。只做叠加覆盖，不改模板结构。
   ================================================================== */

/* ---------------- 滚动条 ---------------- */
*::-webkit-scrollbar{width:10px;height:10px}
*::-webkit-scrollbar-track{background:transparent}
*::-webkit-scrollbar-thumb{
  background:#d7e0ee;border-radius:999px;border:3px solid transparent;background-clip:content-box;
}
*::-webkit-scrollbar-thumb:hover{background:#c2d0e6;background-clip:content-box}
.sidebar ::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);background-clip:content-box}

/* ---------------- 按钮 ---------------- */
.el-button{
  font-weight:500;border-radius:9px;transition:transform .14s ease,box-shadow .16s ease,
    border-color .16s ease,background .16s ease,color .16s ease;
}
.el-button:not(.is-link):not(.is-text):not(.is-disabled):hover{transform:translateY(-1px)}
.el-button:not(.is-link):not(.is-text):not(.is-disabled):active{transform:translateY(0)}
.el-button--primary{
  background:linear-gradient(135deg,#4f7dff 0%,#3b6bf0 55%,#3059de 100%);
  border-color:transparent;color:#fff;
  box-shadow:0 6px 16px -10px rgba(48,89,222,.95), inset 0 1px 0 rgba(255,255,255,.22);
}
.el-button--primary:hover,.el-button--primary:focus{
  background:linear-gradient(135deg,#5b86ff 0%,#4372f5 55%,#3560e6 100%);
  border-color:transparent;color:#fff;
  box-shadow:0 10px 22px -12px rgba(48,89,222,1), inset 0 1px 0 rgba(255,255,255,.26);
}
.el-button--default{
  background:#fff;border-color:var(--c-border-strong);color:var(--c-text-2);
  box-shadow:0 1px 1px rgba(15,23,42,.03);
}
.el-button--default:hover{
  background:#fff;border-color:#bfd0e9;color:var(--c-primary-deep);
  box-shadow:0 4px 12px -8px rgba(15,23,42,.35);
}
.el-button--danger.is-plain{
  background:#fff5f5;border-color:#fbd5d5;color:#d64545;
}
.el-button--danger.is-plain:hover{background:#ffecec;border-color:#f6bcbc;color:#c23636}
.el-button.is-link{font-weight:500}
.el-button.is-link:hover{transform:none}
.el-button--small{border-radius:8px}
.el-button+.el-button{margin-left:8px}

/* ---------------- 输入 / 选择 / 日期 ---------------- */
.el-input__wrapper,.el-select__wrapper,.el-textarea__inner{
  border-radius:9px;background:#fff;
  box-shadow:0 0 0 1px var(--c-border) inset;
  transition:box-shadow .16s ease,background .16s ease;
}
.el-input__wrapper:hover,.el-select__wrapper:hover,.el-textarea__inner:hover{
  box-shadow:0 0 0 1px #cad6e8 inset;
}
.el-input__wrapper.is-focus,.el-select__wrapper.is-focused{
  box-shadow:0 0 0 1px var(--c-primary) inset, var(--ring)!important;
}
.el-textarea__inner:focus{box-shadow:0 0 0 1px var(--c-primary) inset, var(--ring)!important}
.el-input__inner{color:var(--c-text-2)}
.el-input__inner::placeholder{color:#a7b3c4}
.el-form-item__label{color:#4a5a72;font-weight:500}
.el-form-item{margin-bottom:16px}

/* ---------------- 弹窗 ---------------- */
.el-dialog{
  border-radius:var(--r-lg);overflow:hidden;padding:0;
  box-shadow:var(--sh-3);border:1px solid rgba(15,23,42,.06);
}
.el-dialog__header{
  padding:16px 20px;margin:0;border-bottom:1px solid var(--c-border);
  background:linear-gradient(180deg,#fbfcff,#fff);
}
.el-dialog__title{font-size:15px;font-weight:650;color:#0b1425;letter-spacing:-.005em}
.el-dialog__headerbtn{top:14px;right:16px}
.el-dialog__body{padding:18px 20px;color:var(--c-text-2)}
.el-dialog__footer{padding:12px 20px 16px;border-top:1px solid #f1f5fb;background:#fcfdff}
.el-overlay{background-color:rgba(15,23,42,.42)}

/* ---------------- 分段式页签（el-tabs → 胶囊） ---------------- */
.el-tabs__header{margin:0 0 16px}
.el-tabs__nav-wrap::after{display:none}
.el-tabs__nav{
  display:inline-flex!important;gap:2px;padding:4px;background:#eaeff8;
  border:1px solid var(--c-border);border-radius:12px;
  box-shadow:inset 0 1px 2px rgba(15,23,42,.04);
}
.el-tabs__item{
  height:30px!important;line-height:30px!important;padding:0 18px!important;
  font-size:12.5px!important;font-weight:500;color:#5a6a80;border-radius:9px;
  transition:color .16s ease,background .16s ease,box-shadow .16s ease;
}
.el-tabs__item.is-top:nth-child(2){padding-left:18px!important}
.el-tabs__item.is-top:last-child{padding-right:18px!important}
.el-tabs__item:hover{color:var(--c-primary-deep);background:rgba(255,255,255,.55)}
.el-tabs__item.is-active{
  color:var(--c-primary-deep)!important;font-weight:600;background:#fff;
  box-shadow:0 1px 2px rgba(15,23,42,.07), 0 4px 12px -6px rgba(15,23,42,.24);
}
.el-tabs__active-bar{display:none}
.el-tabs__content{overflow:visible}
.el-tabs--border-card{border-radius:12px;border-color:var(--c-border);box-shadow:var(--sh-1)}

/* ---------------- 表格 ---------------- */
.el-table{
  --el-table-border-color:var(--c-border);
  --el-table-header-bg-color:#f7f9fd;
  --el-table-row-hover-bg-color:#f6f9ff;
  border-radius:var(--r-md);overflow:hidden;border:1px solid var(--c-border);
  background:#fff;box-shadow:var(--sh-1);font-size:12.5px;color:#233049;
}
.panel .el-table{border:none;border-radius:0;box-shadow:none}
.el-table th.el-table__cell{
  background:linear-gradient(180deg,#f9fbfe,#f4f7fc);color:#54637a;
  font-weight:600;font-size:12px;letter-spacing:.02em;
}
.el-table td.el-table__cell{padding:9px 0}
.el-table .cell{padding:0 14px}
.el-table__row:hover>td.el-table__cell{background:#f6f9ff!important}
.el-table__inner-wrapper::before{display:none}
.el-table--border .el-table__inner-wrapper::after{background:var(--c-border)}

/* ---------------- 标签 / 徽章 ---------------- */
.el-tag{border-radius:999px;font-weight:500;border-color:transparent;padding:0 9px}
.el-tag--info{background:#f1f5fb;color:#5b6b83}
.el-tag--success{background:#ecfaf1;color:#1f8a52}
.el-tag--warning{background:#fdf6e9;color:#96652a}
.el-tag--danger{background:#fdeeee;color:#c23b3b}

/* ---------------- 提示 / 加载 / 消息 ---------------- */
.el-alert{border-radius:10px;padding:10px 14px;border:1px solid transparent}
.el-alert--info{background:#f6f9fe;border-color:#e4ecf9}
.el-alert--info .el-alert__title,.el-alert--info .el-alert__description{color:#5a6a80}
.el-alert--warning{background:#fffaf0;border-color:#f7e8c9}
.el-loading-mask{background:rgba(255,255,255,.72);backdrop-filter:blur(1px)}
.el-message{border-radius:10px;box-shadow:var(--sh-2);border-color:var(--c-border)}
.el-message-box{border-radius:14px;padding:20px;box-shadow:var(--sh-3)}
.el-popper.is-light{border-radius:10px;border-color:var(--c-border);box-shadow:var(--sh-2)}
.el-select-dropdown__item{border-radius:7px;margin:1px 6px;padding:0 10px}
.el-select-dropdown__item.is-selected{font-weight:600}
.el-checkbox__inner,.el-radio__inner{border-color:#c6d2e4}
.el-checkbox__inner{border-radius:4px}
.el-pagination{border-radius:9px;font-weight:500}
.el-pagination button,.el-pager li{border-radius:7px}

/* ---------------- 侧栏底部账号块 / 版本号（深色适配） ---------------- */
.user-box{
  padding:10px;margin:10px 0;border-radius:12px;
  background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.10);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.06);backdrop-filter:blur(6px);
}
.user-main{display:flex;align-items:center;gap:10px}
.user-avatar{
  width:32px;height:32px;border-radius:10px;flex:0 0 auto;
  background:linear-gradient(140deg,#4f7dff,#7c5cff);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:13px;font-weight:600;
  box-shadow:0 6px 16px -10px rgba(79,125,255,.95);
}
.user-name{font-size:12.5px;font-weight:600;color:#fff}
.user-role{font-size:10.5px;color:rgba(226,233,246,.48)}
.user-ops{margin-top:7px;display:flex;justify-content:space-between;align-items:center}
.user-ops .el-button{font-size:11px!important;color:rgba(233,240,251,.66)}
.user-ops .el-button:hover{color:#fff}
.user-ops .el-button--danger,.user-ops .el-button--danger:hover{
  color:#ff9d9d!important;background:transparent!important;
}
.build-tag{
  margin-top:auto;padding:9px 2px 0;font-size:10px;letter-spacing:.01em;
  color:rgba(226,233,246,.32);border-top:1px solid rgba(255,255,255,.08);word-break:break-all;
}

/* ---------------- 卡片统一：白底 / 细边 / 轻投影 / 悬停微浮 ---------------- */
.picker-log,.comm-cat-card,.fw-col,.shot-side,.shot-group,.shot-card,.tree-panel,.field-panel{
  background:#fff;border:1px solid var(--c-border);border-radius:var(--r-md);box-shadow:var(--sh-1);
}
.picker-log{transition:border-color .16s ease,box-shadow .16s ease,transform .16s ease}
.picker-log:hover{border-color:#cfdcf3;box-shadow:var(--sh-2);transform:translateY(-1px)}
.comm-cat-card,.shot-group,.shot-card,.fw-col{transition:border-color .16s ease,box-shadow .16s ease}
.comm-cat-card:hover,.shot-group:hover,.shot-card:hover,.fw-col:hover{
  border-color:#d5e0f1;box-shadow:var(--sh-2);
}
.fw-head{background:linear-gradient(180deg,#fbfcff,#f7f9fd);border-bottom:1px solid var(--c-border)}
.fw-title{font-size:13.5px;font-weight:650;color:#12203a;letter-spacing:.01em}
.comm-cat-name{font-size:13px;font-weight:650;color:#12203a}
.shot-img,.shot-img-lost,.sg-thumb{background:linear-gradient(160deg,#f4f7fc,#eef2f9)}
.sg-head{background:linear-gradient(180deg,#fbfcff,#f6f9fd)}

/* 统计指标胶囊 / 各类小标签 */
.metric-chip{
  background:linear-gradient(120deg,#eef3ff,#f3efff);border-color:#dbe5fb;
  box-shadow:inset 0 1px 0 #fff;
}
.metric-badge{background:linear-gradient(135deg,#4f7dff,#7c5cff);color:#fff;border-radius:999px}
.cfg-tag{background:#eef3ff;color:#3358c9;border-radius:999px}
.lock-tag{background:#eef3ff;color:#4a6091;border-radius:999px}
.tree-badge{background:#eef2f9;color:#61728a;border-radius:999px}
.comm-act-chip{background:#f7f9fd;border-color:var(--c-border);border-radius:999px}

/* ---------------- 登录页 ---------------- */
.login-screen{
  background:
    radial-gradient(900px 480px at 18% 8%, rgba(59,107,240,.20), transparent 62%),
    radial-gradient(760px 420px at 88% 14%, rgba(124,92,255,.18), transparent 60%),
    radial-gradient(700px 500px at 50% 108%, rgba(59,107,240,.14), transparent 62%),
    #f4f6fb;
}
.login-card{
  width:392px;padding:30px 30px 24px;background:rgba(255,255,255,.86);
  border:1px solid rgba(255,255,255,.9);border-radius:20px;
  box-shadow:0 30px 70px -32px rgba(15,23,42,.42), inset 0 1px 0 #fff;
  backdrop-filter:blur(14px);
}
.login-title{font-size:16px;font-weight:650;letter-spacing:-.01em}
.login-sub{font-size:11.5px;color:var(--c-muted);margin-top:4px}
.login-tip{margin-top:16px;font-size:11px;color:#8b98ab;line-height:1.8}
.boot-screen{background:radial-gradient(700px 400px at 50% 30%,rgba(59,107,240,.10),transparent 60%)}

/* ---------------- 其它细节 ---------------- */
.readonly-hint,.import-tip,.perm-global,.comm-bar{
  background:#f8fafd;border-color:var(--c-border);border-radius:11px;
}
.comm-bar{box-shadow:var(--sh-1)}
.result-table thead th,.pivot-table th.log-col,.pivot-table th.metric-col{
  background:linear-gradient(180deg,#f9fbfe,#f4f7fc);color:#54637a;
  font-weight:600;font-size:12px;letter-spacing:.02em;
}
.pivot-table td.log-cell{background:#f8fafd}
.result-table{border-collapse:separate;border-spacing:0;font-size:12px}
.result-table th,.result-table td{border:none;border-bottom:1px solid var(--c-border);padding:7px 12px}
.result-table thead th{border-bottom:1px solid var(--c-border-strong)}
.result-table tbody tr:hover td{background:#f7faff}
.prompt-box{border-radius:12px;box-shadow:inset 0 1px 0 rgba(255,255,255,.06)}
.field-picker{border-radius:11px;background:#fcfdff}

/* ---------------- 收尾打磨：对比度 / 栅格 / 入场动画 ---------------- */
.el-alert.is-light .el-alert__title,.el-alert .el-alert__title{color:#46566e;font-weight:500}
.el-alert.is-light .el-alert__description{color:#6b7a90}
.el-alert .el-alert__icon{color:#8ea3c0}

/* 商业化：分类卡在宽屏两列，避免一列拉到很长 */
.comm-cats{grid-template-columns:repeat(auto-fill,minmax(420px,1fr))}

/* 框架三列：顶部一条品牌色细线，视觉上区分三个维度 */
.fw-col{position:relative;overflow:hidden}
.fw-col::before{
  content:"";position:absolute;top:0;left:0;right:0;height:3px;
  background:linear-gradient(90deg,#4f7dff,#7c5cff);
  opacity:.9;
}
.framework-grid>.fw-col:nth-child(2)::before{background:linear-gradient(90deg,#7c5cff,#e26bb8)}
.framework-grid>.fw-col:nth-child(3)::before{background:linear-gradient(90deg,#26b3a6,#4f7dff)}

/* 工具条统一成白底轻卡 */
.comm-bar,.cfg-bar.is-collapsed,.readonly-hint,.import-tip{
  background:#fff;border:1px solid var(--c-border);box-shadow:var(--sh-1);
}

/* 页面切换的入场动效（很轻，不干扰阅读） */
.main>section{animation:viewIn .28s cubic-bezier(.22,.61,.36,1) both}
@keyframes viewIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){
  .main>section{animation:none}
  .el-button:not(.is-link):not(.is-text):not(.is-disabled):hover{transform:none}
}

/* 弹窗入场稍微“收”一点，避免整屏抖动 */
.el-dialog{transform-origin:center top}

/* ---------------- 二次打磨 ---------------- */
/* 截图库左树：选中有圆角胶囊 + 左侧短竖条，不再用贴边的整条粗线 */
.shot-tree{padding:6px}
.st-node{border-left:none;border-radius:8px;padding:6px 8px;position:relative;
  transition:background .14s ease,box-shadow .14s ease}
.st-node.on{background:#eef4ff;box-shadow:inset 0 0 0 1px #dbe7ff;font-weight:600}
.st-node.on::before{
  content:"";position:absolute;left:2px;top:50%;transform:translateY(-50%);
  width:3px;height:14px;border-radius:3px;background:var(--c-primary);
}
.st-root{padding-left:10px}
.st-cat{padding-left:22px}
.st-act{padding-left:34px}

/* 聚合表：斑马纹帮助横向读数（只染数据格，粘性列同步） */
.pivot-table tbody tr:nth-child(even) td.metric-cell,
.pivot-table tbody tr:nth-child(even) td.val-cell{background:#fbfcff}
.pivot-table tbody tr:nth-child(even) td.log-cell{background:#f6f9fd}
.pivot-table tbody tr:hover td.metric-cell,
.pivot-table tbody tr:hover td.val-cell{background:#f4f8ff}
.pivot-table tbody tr:hover td.log-cell{background:#eef4fd}

/* 登录卡片：更有产品感 */
.login-card{position:relative;overflow:hidden}
.login-card::before{
  content:"";position:absolute;left:0;right:0;top:0;height:3px;
  background:linear-gradient(90deg,#4f7dff,#7c5cff 60%,#e26bb8);
}
.login-brand .brand-mark{width:44px;height:44px;border-radius:14px;font-size:13.5px}
.login-brand{gap:13px;margin-bottom:24px}
.login-card .el-input__wrapper{height:38px;border-radius:10px}
.login-card .el-button{height:38px;font-size:13px}

/* 浅色（plain）主按钮：加强文字对比，避免像“禁用” */
.el-button--primary.is-plain{
  background:linear-gradient(180deg,#f5f8ff,#eaf1ff);border-color:#cfdefb;color:#2f55c4;
  box-shadow:inset 0 1px 0 #fff;
}
.el-button--primary.is-plain:hover{
  background:linear-gradient(180deg,#eef4ff,#e0ebff);border-color:#b7cbf7;color:#2346b0;
}
.el-button--danger.is-plain{box-shadow:inset 0 1px 0 #fff}

/* 侧栏图标（替换原来的小圆点） */
.nav-ico{width:16px;height:16px;flex:0 0 16px;display:inline-flex;align-items:center;
  justify-content:center;color:rgba(226,233,246,.62);transition:color .18s ease,transform .18s ease}
.nav-ico svg{width:16px;height:16px;display:block}
.nav-item:hover .nav-ico{color:#fff}
.nav-item.active .nav-ico{color:#fff;transform:translateY(-.5px)}
.nav-dot{display:none}

/* 日志详情矩阵：表头跟全局统一 */
.data-table th{background:linear-gradient(180deg,#f9fbfe,#f4f7fc);color:#54637a;
  font-weight:600;font-size:12px;letter-spacing:.02em}
.data-table th.sys-head{background:linear-gradient(180deg,#eef4ff,#e8effd);color:#33507f}
.data-table thead .idx-col{background:#f4f7fc}
.data-table tbody tr:nth-child(even) td{background:#fcfdff}
.data-table tbody tr:hover td{background:#f6f9ff}

/* 图标再亮一点，深色底上更清楚 */
.nav-ico{color:rgba(230,237,248,.78);width:17px;height:17px;flex:0 0 17px}
.nav-ico svg{width:17px;height:17px}
.nav-item{font-size:13px}
