/* =============================================================
   京东运营数据分析工作台 - 浅色主题
   ============================================================= */
:root{
  --primary:#3b6cf6;
  --primary-soft:#eaf0ff;
  --primary-dark:#2a53cc;
  --bg:#f4f6fa;
  --card:#ffffff;
  --text:#1f2937;
  --text-2:#4b5563;
  --muted:#8a93a3;
  --border:#e8ecf3;
  --border-2:#f0f3f8;
  --up:#e34d59;      /* 涨 = 红(国内习惯) */
  --down:#17a67c;    /* 跌 = 绿 */
  --warn:#f59e0b;
  --sidebar-w:236px;
  --header-h:58px;
  --radius:10px;
  --shadow:0 1px 2px rgba(16,24,40,.04),0 4px 16px rgba(16,24,40,.05);
}
/* ============ v1.8.517 设计 token 扩展: 语义色 + 辅助色 ============
   只新增不改动, 完全向后兼容。每个语义色提供 base(文字/主色) + soft(淡背景) + bd(边框) 三件套,
   用于状态标签/徽章/卡片着色, 形成"色块"视觉语言。
   注意: --up/--down 是【金融涨跌语义】(国内习惯: 涨红跌绿), 与下方【状态语义】分离,
   不可混用 —— 状态色表达"成功/警告/错误", 涨跌色表达"同比上升/下降"。 */
:root{
  /* 状态语义色 */
  --success:#17a67c;  --success-soft:#e6f7f1;  --success-bd:#b7e4d5;
  --warning:#f59e0b;  --warning-soft:#fff4e5;  --warning-bd:#f7d9a8;
  --danger:#e34d59;   --danger-soft:#fdeced;   --danger-bd:#f5c2c7;
  --info:#3b6cf6;     --info-soft:#eaf0ff;     --info-bd:#bcd0fb;
  --neutral:#6b7280;  --neutral-soft:#f1f3f7;  --neutral-bd:#dde3ec;
  /* 辅助/分类色 (用于多系列区分、KPI 分组、渠道/地域等分类场景) */
  --purple:#7c5cf0;   --purple-soft:#f1ecfe;   --purple-bd:#d5c9fb;
  --teal:#0f9b8e;     --teal-soft:#e6f7f4;     --teal-bd:#b3e5df;
  --amber:#c77700;    --amber-soft:#fff4e5;    --amber-bd:#f7d9a8;
  --cyan:#0ea5e9;     --cyan-soft:#e6f6fd;     --cyan-bd:#b3e3f8;
  --pink:#ec4899;     --pink-soft:#fdeaf4;     --pink-bd:#f8bcd9;
  /* 阴影层级 (收敛 40 种各异阴影为 3 档) */
  --shadow-1:0 1px 2px rgba(16,24,40,.04),0 2px 6px rgba(16,24,40,.04);
  --shadow-2:0 1px 2px rgba(16,24,40,.04),0 4px 16px rgba(16,24,40,.05);
  --shadow-3:0 4px 12px rgba(16,24,40,.08),0 12px 32px rgba(16,24,40,.08);
  /* 表格斑马纹 / 行悬停 */
  --row-stripe:#fbfcfe;
  --row-hover:#f2f6fd;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  background:var(--bg);color:var(--text);font-size:14px;line-height:1.6;-webkit-font-smoothing:antialiased;
}
/* v1.8.518 排版质感: 数值/代码统一 tabular-nums(等宽数字, 表格与 KPI 对齐更整齐、更精致),
   标签类小字统一默认字重消除粗细抖动。 */
.num,td.num,th.num,.kpi-v,.compact,.mono{font-variant-numeric:tabular-nums}
a{color:var(--primary);text-decoration:none}
a:hover{color:var(--primary-dark)}
::-webkit-scrollbar{width:8px;height:8px}
::-webkit-scrollbar-thumb{background:#d5dbe6;border-radius:4px}
::-webkit-scrollbar-thumb:hover{background:#c0c8d6}
::-webkit-scrollbar-track{background:transparent}

/* ---------------- 侧边栏 ---------------- */
.sidebar{
  position:fixed;left:0;top:0;bottom:0;width:var(--sidebar-w);background:#fff;
  border-right:1px solid var(--border);display:flex;flex-direction:column;z-index:50;
  transition:width .22s ease;
}
.sidebar .brand{
  height:var(--header-h);display:flex;align-items:center;justify-content:center;gap:10px;padding:0 18px;
  border-bottom:1px solid var(--border);flex-shrink:0;overflow:hidden
}
.brand-logo-img{width:28px;height:28px;max-width:28px;max-height:28px;object-fit:contain;flex-shrink:0;display:block}
.brand-logo-wide{max-width:100%;max-height:34px;width:auto;height:auto;object-fit:contain;flex-shrink:0;display:block}
.brand-home{display:inline-flex;align-items:center;outline:none}
.brand-home:hover{opacity:.85}
.brand-meta{text-align:left}
.brand-logo{
  width:28px;height:28px;border-radius:8px;background:linear-gradient(135deg,#e34d59,#f0763f);
  color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:13px;flex-shrink:0;
}
.brand-txt{font-weight:650;font-size:15px;letter-spacing:.2px;white-space:nowrap;overflow:hidden}
.brand-sub{font-size:11px;color:var(--muted);font-weight:400}

.nav{flex:1;overflow-y:auto;padding:10px 10px 20px}
.nav-group{margin-bottom:2px}
.nav-item,.nav-parent{
  display:flex;align-items:center;gap:10px;padding:9px 12px;border-radius:8px;
  color:var(--text-2);cursor:pointer;user-select:none;font-size:14px;position:relative;
  transition:background .15s,color .15s;
}
.nav-item:hover,.nav-parent:hover{background:#f5f7fb;color:var(--text)}
.nav-item.active{background:var(--primary-soft);color:var(--primary);font-weight:600}
.nav-parent.has-active{color:var(--primary);font-weight:600}
.nav-ico{width:18px;height:18px;flex-shrink:0;opacity:.85}
.nav-item.active .nav-ico{opacity:1}
.nav-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.nav-arrow{width:12px;height:12px;transition:transform .2s;opacity:.55;flex-shrink:0}
.nav-group.open .nav-arrow{transform:rotate(90deg)}
.nav-children{max-height:0;overflow:hidden;transition:max-height .24s ease}
.nav-group.open .nav-children{max-height:420px}
.nav-child{
  display:block;padding:8px 12px 8px 40px;border-radius:8px;color:var(--text-2);
  font-size:13.5px;margin-top:1px;position:relative;transition:background .15s,color .15s;
}
.nav-child:hover{background:#f5f7fb;color:var(--text)}
.nav-child.active{background:var(--primary-soft);color:var(--primary);font-weight:600}
.nav-child::before{
  content:'';position:absolute;left:22px;top:50%;transform:translateY(-50%);
  width:5px;height:5px;border-radius:50%;background:#cbd3e0;
}
.nav-child.active::before{background:var(--primary)}
.sidebar-foot{padding:11px 14px 13px;border-top:1px solid var(--border);font-size:11.5px;color:var(--muted);flex-shrink:0;line-height:1.7}
.sidebar-foot .sf-powered{font-size:12px;color:var(--text-2);margin-bottom:4px}
.sidebar-foot .sf-powered a{color:var(--primary);text-decoration:none;font-weight:600}
.sidebar-foot .sf-powered a:hover{color:var(--primary-dark);text-decoration:underline}
.sidebar-foot .sf-line{color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sidebar-foot .sf-copy{margin-top:5px;font-size:11px;color:var(--muted);opacity:.85}

/* ---------------- 主区 ---------------- */
.main{margin-left:var(--sidebar-w);min-height:100vh;display:flex;flex-direction:column;transition:margin .22s}
/* 知识库页面: 隐藏全局左侧导航, 但保留 brand/LOGO 在原来左上角位置; 内容区直接铺满 */
body.no-sidebar .sidebar{height:var(--header-h);overflow:hidden;background:#fff;border-right:1px solid var(--border)}
body.no-sidebar .sidebar .brand{pointer-events:auto}
body.no-sidebar .sidebar .nav,
body.no-sidebar .sidebar .kb-nav-cats,
body.no-sidebar .sidebar .sidebar-foot{display:none}
body.no-sidebar .main{margin-left:0}
body.no-sidebar .menu-toggle{display:none}
body.no-sidebar .header{padding-left:calc(var(--sidebar-w) + 20px)}
body.no-sidebar .topnav{margin-left:0}
.header{
  height:var(--header-h);background:#fff;border-bottom:1px solid var(--border);
  display:flex;align-items:center;padding:0 20px;gap:14px;position:sticky;top:0;z-index:40;
}
.crumb{font-size:15px;font-weight:600;color:var(--text)}
.crumb small{font-weight:400;color:var(--muted);margin-left:8px;font-size:12.5px}
.topnav{display:flex;align-items:center;gap:8px;flex:1;min-width:0;margin-left:6px}
.topnav a{display:inline-flex;align-items:center;white-space:nowrap;padding:6px 14px;border-radius:6px;font-size:13.5px;font-weight:600;color:var(--primary);background:rgba(59,108,246,.08);border:1px solid rgba(59,108,246,.28);text-decoration:none;transition:background .15s,color .15s,border-color .15s}
.topnav a .tn-ico{width:16px;height:16px;margin-right:6px;flex-shrink:0}
.topnav a:hover{background:rgba(59,108,246,.16);border-color:rgba(59,108,246,.45);color:var(--primary)}
.topnav a.active{background:var(--primary);color:#fff;border-color:var(--primary)}
.topnav a.active .tn-ico{color:#fff}
.topnav a.strong{font-weight:700}
.topnav-dl{display:inline-flex;align-items:center;white-space:nowrap;padding:6px 14px;border-radius:6px;font-size:13.5px;font-weight:700;color:var(--primary);background:rgba(59,108,246,.08);border:1px solid rgba(59,108,246,.28);text-decoration:none;cursor:pointer;transition:background .15s,color .15s,border-color .15s}
.topnav-dl .tn-ico{width:16px;height:16px;margin-right:6px;flex-shrink:0}
.topnav-dl:hover{background:rgba(59,108,246,.16);border-color:rgba(59,108,246,.45);color:var(--primary)}

/* 顶部导航栏轮播：电商常用公式 / 名词解释（词条 1000+，见 app/data/marquee_tips.php） */
.header-marquee{flex:0 0 480px;width:480px;max-width:46vw;overflow:hidden;height:24px;border-radius:12px;background:rgba(59,108,246,.08);border:1px solid rgba(59,108,246,.15);display:flex;align-items:center;padding:0 10px;margin-left:auto;margin-right:10px;-webkit-mask-image:linear-gradient(to right,transparent,#000 22px,#000 calc(100% - 22px),transparent);mask-image:linear-gradient(to right,transparent,#000 22px,#000 calc(100% - 22px),transparent)}
.marquee-track{display:flex;align-items:center;gap:20px;white-space:nowrap;animation:marquee-scroll 3600s linear infinite;will-change:transform}
.marquee-item{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--text-2)}
.marquee-tag{flex-shrink:0;background:var(--primary);color:#fff;border-radius:4px;padding:1px 5px;font-size:10.5px;font-weight:600}
.marquee-text{color:var(--text);font-weight:500}
@keyframes marquee-scroll{0%{transform:translateX(0)}100%{transform:translateX(-50%)}}
.header-marquee:hover .marquee-track{animation-play-state:paused}
@media (max-width:1100px){.header-marquee{display:none}}

.form-row .hint{font-size:12px;color:var(--muted);margin-top:4px;line-height:1.5}
.header-right{margin-left:auto;display:flex;align-items:center;gap:12px}
.shop-switch{display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid var(--border);border-radius:8px;background:#fff;color:var(--text-2);font-size:13px;max-width:240px}
.shop-switch svg{flex-shrink:0;opacity:.7}
.shop-switch select{border:none;background:transparent;color:var(--text);font-size:13.5px;font-weight:600;outline:none;max-width:180px;cursor:pointer}
.shop-switch select:focus{outline:none}
.userbox{display:flex;align-items:center;gap:9px;padding:5px 10px;border-radius:8px;cursor:pointer;position:relative}
.userbox:hover{background:#f5f7fb}
.avatar{
  width:28px;height:28px;border-radius:50%;background:var(--primary);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex-shrink:0;
  overflow:hidden;
}
.avatar img{width:100%;height:100%;object-fit:cover;display:block}
.uname{font-size:13.5px;line-height:1.2}
.urole{font-size:11px;color:var(--muted)}
.dropdown{
  position:absolute;right:0;top:calc(100% + 6px);background:#fff;border:1px solid var(--border);
  border-radius:10px;box-shadow:var(--shadow);min-width:150px;padding:5px;display:none;z-index:60;
}
.dropdown.show{display:block}
.dropdown a{display:block;padding:8px 12px;border-radius:6px;color:var(--text-2);font-size:13.5px}
.dropdown a:hover{background:#f5f7fb}
.content{padding:18px 20px 40px;flex:1}

/* ============ v1.8.517 分区标题(.sec-hd) ============
   原先 .sec-hd / .sec-hd h2 / .sec-hd .sub 在 CSS 中完全无定义, 走浏览器默认 h2 样式
   (粗大黑体、无间距控制), dashboard 单页就有 9 处, 是明显的"毛坯"点。
   此处补: 左侧色条锚点 + 标题/副标题字号层级 + 间距。仅新增, 不影响 .card-hd。 */
.sec-hd{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin:0 0 12px;padding-left:11px;position:relative}
.sec-hd::before{content:'';position:absolute;left:0;top:3px;bottom:3px;width:3px;border-radius:2px;background:var(--primary)}
.sec-hd h2{margin:0;font-size:15px;font-weight:650;color:var(--text);letter-spacing:.2px}
.sec-hd .sub{font-size:12.5px;color:var(--muted);font-weight:400}

/* v1.8.517 卡片交互层次: 原先 .card 无 hover 反馈, 页面缺少可交互感。
   box-shadow 不占布局空间, 无回流风险。 */
.card{transition:box-shadow .15s ease,border-color .15s ease}
.card:hover{box-shadow:var(--shadow-3);border-color:#dbe2ee}

/* ---------------- 卡片 ---------------- */
.card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow)}
.card+.card{margin-top:14px}
.card-hd{
  padding:13px 16px;border-bottom:1px solid var(--border-2);display:flex;align-items:center;gap:10px;flex-wrap:wrap;
}
.card-hd h3{margin:0;font-size:14.5px;font-weight:650}
.card-hd .sub{font-size:12px;color:var(--muted);font-weight:400;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.card-hd .right{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap;flex-shrink:0}
.card-bd{padding:16px}
.card-bd.tight{padding:10px 12px}
/* 筛选条吸顶(仅数据分析分区): 随页面向下滚动保持停留在顶栏下方, 便于随时调整筛选 */
body.sec-analysis .fb-bar{position:sticky;top:var(--header-h);z-index:30}

/* ---------------- KPI ---------------- */
.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(178px,1fr));gap:12px}
/* 指标卡固定一行 N 个 (用于需要明确列数的页面, 如进店关键词/推荐流量=6 个) */
.kpi-grid.six{grid-template-columns:repeat(6,minmax(0,1fr))}
@media (max-width:1200px){.kpi-grid.six{grid-template-columns:repeat(4,minmax(0,1fr))}}
@media (max-width:860px){.kpi-grid.six{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:560px){.kpi-grid.six{grid-template-columns:repeat(2,minmax(0,1fr))}}
/* 库存概览按仓类型(B仓/C仓)分组的小标题 */
.kpi-group-label{font-size:12.5px;font-weight:600;color:var(--text);margin:2px 0 8px;padding-left:9px;position:relative}
.kpi-group-label::before{content:'';position:absolute;left:0;top:1px;bottom:1px;width:3px;border-radius:2px;background:var(--primary)}
.kpi-grid + .kpi-group-label{margin-top:14px}
.kpi{
  background:#fff;border:1px solid var(--border);border-radius:var(--radius);padding:14px 15px;
  box-shadow:var(--shadow);position:relative;overflow:hidden;transition:transform .15s,box-shadow .15s;
}
.kpi:hover{transform:translateY(-1px);box-shadow:0 4px 20px rgba(16,24,40,.09)}
.kpi::after{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--primary);opacity:.85}
.kpi.k2::after{background:#7c5cf0}.kpi.k3::after{background:#e34d59}
.kpi.k4::after{background:#17a67c}.kpi.k5::after{background:#f59e0b}
.kpi.k6::after{background:#0ea5e9}.kpi.k7::after{background:#ec4899}
/* 财务分析 KPI 正负色 (涨/盈=红, 亏=绿, 见 --up/--down) */
.kpi.k1::after{background:var(--primary)}
.kpi.pos .kpi-v{color:var(--down)}
.kpi.neg .kpi-v{color:var(--up)}
.kpi.k1 .kpi-v{color:var(--primary)}
/* 补货概览分组配色: kc=C仓/直送(青绿), kb=B仓(商)京东自营渠道(蓝) */
.kpi.kc{background:#eafaf7}
.kpi.kc::after{background:#14b8a6}
.kpi.kc .kpi-v{color:#0d9488}
.kpi.kb{background:var(--primary-soft)}
.kpi.kb::after{background:var(--primary)}
.kpi.kb .kpi-v{color:var(--primary-dark)}
/* 表格内正负值着色 */
table.tbl td.num.pos{color:var(--down);font-weight:600}
table.tbl td.num.neg{color:var(--up);font-weight:600}
/* 产品名称单元格: 允许换行, 限制最大宽度 */
.pname{max-width:240px;word-break:break-word}
/* ============ v1.8.517 KPI 卡片色块化 ============
   原来 KPI 是"白卡 + 3px 细彩条", 19 个页面里绝大多数还是默认白卡, 整体偏素。
   此处把已验证过的 .kpi.kb/.kc 模式(淡背景 + 彩条 + 彩数字)推广到默认卡与 k2~k7:
     ① 默认 .kpi 用 1 类选择器, 优先级低于 .kpi.kb/.kc(2 类), 不影响补货页既有配色;
     ② .kpi .kpi-v 用 2 类选择器, 优先级低于 .kpi.pos/.neg .kpi-v(3 类), 财务涨跌红绿不被覆盖;
     ③ k2~k7 与现有 ::after 彩条同色系, 仅新增淡背景与彩色数字。
   仅改颜色/背景, 不动任何布局与尺寸。 */
.kpi{background:var(--info-soft)}
.kpi .kpi-v{color:var(--primary-dark)}
.kpi.k2{background:var(--purple-soft)} .kpi.k2 .kpi-v{color:#6d45e0}
.kpi.k3{background:var(--danger-soft)}  .kpi.k3 .kpi-v{color:#d13c48}
.kpi.k4{background:var(--success-soft)} .kpi.k4 .kpi-v{color:#0f8f6a}
.kpi.k5{background:var(--warning-soft)} .kpi.k5 .kpi-v{color:#c77700}
.kpi.k6{background:var(--cyan-soft)}    .kpi.k6 .kpi-v{color:#0369a1}
.kpi.k7{background:var(--pink-soft)}    .kpi.k7 .kpi-v{color:#be185d}
/* 修复: 原 .kpi.k1 .kpi-v(3 类) 定义位置在 .kpi.pos/.neg(3 类) 之后, 同优先级后者胜出,
   导致财务页"涨/盈=红、亏=绿"被 k1 的蓝色覆盖而失效。此处在末尾重申, 恢复涨跌语义。 */
.kpi.pos .kpi-v{color:var(--down)}
.kpi.neg .kpi-v{color:var(--up)}
/* ============ v1.8.518 KPI 回归克制(高级感) ============
   v1.8.517 的 8 色糖果淡背景实际效果"花哨"而非"高级"——高级感的核心是少用色:
   数字与留白才是主角。本版回退为统一白卡, 但用更柔的阴影/更深的数字/淡化的彩条提升质感:
     · 统一白底(kb/kc 补货分组语义淡背景不受影响, 2 类优先级在 1 类之上);
     · 彩条保留但降不透明度(.5), 保留分类信息, 视觉更安静;
     · 数字统一近黑 #111827, tabular-nums 等宽数字, 字距收紧;
     · 卡片阴影更柔更立体, 边框更淡。
   注意本块必须在 v1.8.517 块之后(覆盖糖果色); 末尾重申 pos/neg 保证涨跌色最终生效。 */
.kpi,.kpi.k2,.kpi.k3,.kpi.k4,.kpi.k5,.kpi.k6,.kpi.k7{background:#fff}
.kpi .kpi-v,.kpi.k2 .kpi-v,.kpi.k3 .kpi-v,.kpi.k4 .kpi-v,.kpi.k5 .kpi-v,.kpi.k6 .kpi-v,.kpi.k7 .kpi-v{color:#111827}
.kpi{border-color:#eef0f4;box-shadow:0 1px 2px rgba(16,24,40,.03),0 6px 20px rgba(16,24,40,.045)}
.kpi::after{opacity:.5}
.kpi-v{font-variant-numeric:tabular-nums}
.kpi-t{font-weight:500}
.kpi.pos .kpi-v{color:var(--down)}
.kpi.neg .kpi-v{color:var(--up)}
.kpi-t{font-size:12.5px;color:var(--muted);display:flex;align-items:center;gap:5px}
.kpi-v{font-size:24px;font-weight:680;margin:6px 0 4px;letter-spacing:-.4px;line-height:1.15}
.kpi-v small{font-size:13px;font-weight:500;color:var(--muted);margin-left:2px}
.kpi-c{font-size:12px;display:flex;align-items:center;gap:5px;color:var(--muted)}
.chg{font-weight:600;display:inline-flex;align-items:center;gap:2px}
.chg.up{color:var(--up)}.chg.down{color:var(--down)}.chg.flat{color:var(--muted)}
/* 关键词色标(年度趋势页/选词助手) */
.kwtag{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:6px;vertical-align:middle;flex:0 0 auto}

/* ---------------- 表单 ---------------- */
.filters{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.fld{display:flex;flex-direction:column;gap:5px}
.fld>label{font-size:12px;color:var(--muted);font-weight:500}
/* 卡片头部横向内联筛选 (如 SKU 补货明细右上角筛选) */
.fld.row{flex-direction:row;align-items:center;gap:6px}
.fld.row>label{white-space:nowrap;margin-bottom:0}
.fld.row select,.fld.row input{height:30px;font-size:13px}
/* 月份平铺 (毛保分析等替代下拉) */
.month-tiles{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.month-tile{height:32px;padding:0 14px;border:1px solid #dde3ec;border-radius:7px;background:#fff;
  font-size:13px;color:var(--text);cursor:pointer;font-family:inherit;transition:all .15s;white-space:nowrap}
.month-tile:hover{background:#f5f7fb;border-color:#c3ccdb}
.month-tile.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
/* 月份折叠按钮(「更早 ▼」), 与普通月份chip 区分, 暗示这是一个展开动作 */
.month-tile.more{background:#f4f6fa;border-style:dashed;color:var(--muted);font-weight:500;padding:0 10px}
.month-tile.more:hover{background:#e9eef5;border-color:#b8c2d1;color:var(--text)}
.month-tile.older{background:#fafbfd;color:var(--muted)}
input[type=text],input[type=password],input[type=date],input[type=number],select,textarea{
  height:34px;padding:0 10px;border:1px solid #dde3ec;border-radius:7px;background:#fff;
  font-size:13.5px;color:var(--text);outline:none;font-family:inherit;transition:border .15s,box-shadow .15s;
}
textarea{height:auto;padding:8px 10px;resize:vertical}
input:focus,select:focus,textarea:focus{border-color:var(--primary);box-shadow:0 0 0 3px rgba(59,108,246,.11)}
input[disabled],select[disabled]{background:#f6f8fb;color:var(--muted)}
select{cursor:pointer;padding-right:26px}
/* v1.8.558: 所有下拉选择筛选按钮折叠态蓝底白字, 展开内容白底黑字 */
select:not([disabled]){
  background:var(--primary) !important;
  color:#fff !important;
  border-color:var(--primary) !important;
}
select:not([disabled]):focus{
  background:var(--primary-dark) !important;
  color:#fff !important;
  border-color:var(--primary-dark) !important;
  box-shadow:0 0 0 3px rgba(59,108,246,.18) !important;
}
/* 展开的下拉选项保持白底黑字(不受折叠态蓝底影响) */
select option,
select optgroup{
  background:#fff !important;
  color:#111827 !important;
}
select option:checked{
  background:var(--primary-soft) !important;
  color:var(--primary-dark) !important;
}
/* 顶栏店铺切换器属全局 chrome 而非筛选器, 保持透明态 */
.shop-switch select{ background:transparent !important; color:var(--text) !important; border-color:transparent !important; }
.btn{
  height:34px;padding:0 15px;border:1px solid #dde3ec;border-radius:7px;background:#fff;color:var(--text-2);
  font-size:13.5px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;font-family:inherit;
  transition:all .15s;white-space:nowrap;
}
.btn:hover{border-color:#c3ccdb;background:#fafbfd}
.btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}
.btn.primary:hover{background:var(--primary-dark);border-color:var(--primary-dark)}
.btn.danger{color:var(--up);border-color:#f3c9cd}
.btn.danger:hover{background:#fef2f3;border-color:#e8a4ab}
.btn.sm{height:28px;padding:0 10px;font-size:12.5px;border-radius:6px}
.btn:disabled{opacity:.55;cursor:not-allowed}
.btn-group{display:inline-flex;border:1px solid #dde3ec;border-radius:7px;overflow:hidden;background:#fff}
.btn-group button{
  height:32px;padding:0 13px;border:0;background:#fff;color:var(--text-2);cursor:pointer;
  font-size:13px;border-right:1px solid #eef1f6;font-family:inherit;transition:all .15s;
}
.btn-group button:last-child{border-right:0}
.btn-group button:hover{background:#f5f7fb}
.btn-group button.on{background:var(--primary);color:#fff}
.metric-tabs{flex-wrap:wrap;border-radius:7px}
.metric-tabs button{white-space:nowrap}
.btn-group.sm button{height:28px;padding:0 10px;font-size:12px}
/* 卡片头部内联复选框 */
.chk-inline{display:inline-flex;align-items:center;gap:5px;font-size:13px;color:var(--text-2);cursor:pointer;white-space:nowrap}
.chk-inline input[type=checkbox]{width:16px;height:16px;margin:0;cursor:pointer}
.trend-ctrl{display:flex;flex-wrap:wrap;gap:18px;align-items:center}
.ctrl-grp{display:flex;align-items:center;gap:8px}
.ctrl-lab{font-size:12px;color:#6b7280;font-weight:600;white-space:nowrap}
.sel{height:32px;border:1px solid #e3e8f0;border-radius:8px;padding:0 10px;background:#fff;color:#333;font-size:13px;font-family:inherit;outline:none;cursor:pointer}
.sel.sm{height:28px;font-size:12px;padding:0 8px}
.sel:focus{border-color:var(--primary)}
/* 筛选栏 input 与 select(.sel) 统一尺寸/字号, 消除对齐不齐 (input.inp 特异性需 ≥ input[type=*]) */
input.inp{height:32px;border:1px solid #e3e8f0;border-radius:8px;padding:0 10px;background:#fff;color:var(--text);font-size:13px;font-family:inherit;outline:none}
input.inp.blue{border-color:var(--primary);background:var(--primary-soft);color:var(--primary-dark);font-weight:600}

/* ---------------- 表格 ---------------- */
.tbl-wrap{overflow:auto;max-width:100%}
table.tbl{width:100%;border-collapse:collapse;font-size:13px}
table.tbl th,table.tbl td{padding:9px 11px;text-align:left;border-bottom:1px solid var(--border-2);white-space:nowrap}
table.tbl th{
  background:#fafbfd;color:var(--text-2);font-weight:600;font-size:12.5px;
  position:sticky;top:0;z-index:2;border-bottom:1px solid var(--border);
}
/* v1.8.517 表格可读性: 斑马纹 + 强化行悬停 + sticky 表头投影。
   50 行长表原先只有 1px 横线, 横向扫视易串行; 斑马纹取极淡底色, 不影响数值阅读。
   注意: XGrid 十字光标 .hl-row td 优先级更高且定义在后, 悬停/选中时仍会正确覆盖斑马纹。 */
table.tbl tbody tr:nth-child(even){background:var(--row-stripe)}
table.tbl tbody tr:hover{background:var(--row-hover)}
table.tbl th{box-shadow:0 1px 0 var(--border)}
table.tbl td.num,table.tbl th.num{text-align:right;font-variant-numeric:tabular-nums}
/* v1.8.199: SKU 补货明细表头排序 */
table.tbl th[data-sort]{cursor:pointer;user-select:none}
table.tbl th[data-sort]:hover{color:var(--primary-dark);background:var(--primary-soft)}
table.tbl th.sorted{color:var(--primary-dark);background:var(--primary-soft)}
table.tbl .muted{color:var(--muted)}
/* ============ XGrid: 通用数据明细表增强(排序 + 十字光标 + 通用着色) ============ */
table.tbl.xgrid thead th[data-k]{cursor:pointer;user-select:none;white-space:nowrap;position:relative}
table.tbl.xgrid thead th[data-k]:hover{color:var(--primary-dark);background:var(--primary-soft)}
table.tbl.xgrid thead th.sorted{color:var(--primary-dark);background:var(--primary-soft)}
table.tbl.xgrid thead th .x-arr{font-size:10px;margin-left:3px;color:var(--primary-dark)}
table.tbl.xgrid tbody td{transition:background .06s}
table.tbl.xgrid tbody tr.hl-row td{background:#fff7e6}
table.tbl.xgrid tbody tr.hl-row td.x-c-hl{background:#ffe8a3}
table.tbl.xgrid tbody td.x-c-hl{background:#fdf3dc}
table.tbl.xgrid thead th.x-c-hl{background:#f4ecf8}
/* 通用分类着色(data-kind): money/rate 深色, cnt 中性, txt 主色; 负值红全局 */
table.tbl.xgrid td.x-num{font-variant-numeric:tabular-nums}
table.tbl.xgrid td.x-neg{color:#dc2626;font-weight:600}
table.tbl.xgrid td[data-kind="money"],table.tbl.xgrid td.x-money{color:#14509a;font-weight:600}
table.tbl.xgrid td[data-kind="rate"],table.tbl.xgrid td.x-rate{color:#b45309;font-weight:600}
table.tbl.xgrid td[data-kind="cnt"],table.tbl.xgrid td.x-cnt{color:#334155;font-variant-numeric:tabular-nums}
table.tbl.xgrid td[data-kind="code"],table.tbl.xgrid td.x-code{color:#6b7280;font-family:Consolas,Menlo,monospace;font-size:11.5px}
table.tbl.xgrid td[data-kind="dim"]{color:#111827;font-weight:600}
table.tbl .muted{color:var(--muted)}
/* v1.8.220: SKU 补货明细紧凑适配 - 固定布局填满容器宽度, 单屏尽量不横向滚动; 文本列省略号截断(悬停看全称) */
table.tbl.tbl-fit{table-layout:fixed;font-size:11.5px}
table.tbl.tbl-fit th{padding:5px 6px;white-space:nowrap}
table.tbl.tbl-fit td{padding:5px 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 单元格内重点色 (数据高亮: 建议补货量 / 导入新增·更新 等) */
.c-red{color:#e34d59;font-weight:600}
.c-green{color:#17a67c;font-weight:600}
.c-blue{color:#3b6cf6;font-weight:600}
.c-orange{color:#f59e0b;font-weight:600}
.badge{display:inline-block;padding:2px 8px;border-radius:20px;font-size:11.5px;font-weight:500;line-height:18px}
.badge.blue{background:#eaf0ff;color:#3b6cf6}
.badge.green{background:#e6f7f1;color:#0f8f6a}
.badge.red{background:#fdeced;color:#d13c48}

/* ---------------- 运营工具(iframe 隔离) ---------------- */
/* .content 默认有 padding(18 20 40), 用负 margin 抵消, 让 iframe 铺满内容区,
   与工作台自身 CSS 完全隔离, 避免工具内部 .card/.btn/:root 变量冲突 */
.tool-frame{margin:-18px -20px -40px;background:#fff}
.tool-iframe{display:block;width:100%;height:calc(100vh - var(--header-h) - 58px);border:0;background:#fff}
@media (max-width:768px){
  .tool-frame{margin:-12px -12px -24px}
  .tool-iframe{height:calc(100vh - var(--header-h) - 36px)}
}
.badge.gray{background:#f1f3f7;color:#6b7280}
.badge.orange{background:#fff4e5;color:#c77700}
.badge.purple{background:#f1ecfe;color:#6d45e0}
.badge.teal{background:#e6f7f4;color:#0f9b8e}
.badge.danger{background:#fdeced;color:#e34d59;border:1px solid #f5c2c7}

/* ---------------- 词云 ---------------- */
.wordcloud{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;
  gap:6px 14px;padding:14px 10px;line-height:1.5}
.wordcloud .wc{font-weight:600;cursor:default;transition:transform .12s;white-space:nowrap}
.wordcloud .wc:hover{transform:scale(1.12);text-shadow:0 1px 4px rgba(0,0,0,.12)}

/* ---------------- 图表 ---------------- */
.chart{width:100%;height:320px}
.chart.sm{height:260px}
.chart.lg{height:400px}

/* 图表全屏放大 / 缩小 */
.chart-fs-btn{position:absolute;top:6px;right:8px;z-index:6;width:26px;height:26px;display:flex;align-items:center;justify-content:center;border:1px solid var(--border,#e3e8f0);background:rgba(255,255,255,.92);border-radius:6px;cursor:pointer;color:#5b6b82;transition:all .15s;opacity:.7}
.chart-fs-btn:hover{opacity:1;border-color:#3b6cf6;color:#3b6cf6;background:#fff}
.chart-fs-btn svg{width:15px;height:15px;display:block;pointer-events:none}
.chart-fs{position:fixed!important;left:0;top:0;right:0;bottom:0;width:100vw!important;height:100vh!important;z-index:9998!important;background:var(--card,#fff)!important;margin:0!important;padding:14px!important;border-radius:0!important;box-shadow:none!important}
body.chart-fs-open{overflow:hidden}
.chart-fs .chart-fs-btn{top:14px;right:16px;width:34px;height:34px;opacity:1;background:#fff}
.chart-fs .chart-fs-btn svg{width:20px;height:20px}
.grid-2{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:14px}
.grid-3{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:14px}
.grid-2>.card+.card,.grid-3>.card+.card{margin-top:0}
@media(max-width:1200px){.grid-2,.grid-3{grid-template-columns:1fr}}

/* ---------------- 提示 / 弹窗 ---------------- */
.alert{padding:11px 14px;border-radius:8px;font-size:13.5px;margin-bottom:14px;display:flex;gap:9px;align-items:flex-start}
.alert.info{background:#eff6ff;color:#1e40af;border:1px solid #dbe6fe}
.alert.ok{background:#ecfdf5;color:#065f46;border:1px solid #cdf0e1}
.alert.err{background:#fef2f2;color:#991b1b;border:1px solid #fbdcdc}
.alert.warn{background:#fffbeb;color:#92400e;border:1px solid #fdeec3}

.mask{position:fixed;inset:0;background:rgba(17,24,39,.42);z-index:100;display:none;align-items:center;justify-content:center;padding:20px}
.mask.show{display:flex}
.modal{background:#fff;border-radius:12px;width:100%;max-width:520px;max-height:88vh;overflow:auto;box-shadow:0 20px 60px rgba(0,0,0,.22)}
.modal.wide{max-width:800px}
.modal-hd{padding:15px 18px;border-bottom:1px solid var(--border-2);font-weight:650;display:flex;align-items:center}
.modal-hd .x{margin-left:auto;cursor:pointer;color:var(--muted);font-size:20px;line-height:1}
.modal-bd{padding:18px}
.modal-ft{padding:13px 18px;border-top:1px solid var(--border-2);display:flex;justify-content:flex-end;gap:9px}
.form-row{margin-bottom:14px}
.form-row>label{display:block;font-size:13px;color:var(--text-2);margin-bottom:6px;font-weight:500}
.form-row input,.form-row select,.form-row textarea{width:100%}
.form-row .hint{font-size:12px;color:var(--muted);margin-top:5px}

.toast{
  position:fixed;top:18px;left:50%;transform:translateX(-50%) translateY(-16px);background:#1f2937;color:#fff;
  padding:10px 18px;border-radius:8px;font-size:13.5px;z-index:200;opacity:0;transition:all .25s;pointer-events:none;
  box-shadow:0 8px 28px rgba(0,0,0,.2);
}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.toast.ok{background:#0f8f6a}.toast.err{background:#d13c48}

.empty{text-align:center;padding:52px 20px;color:var(--muted)}
.empty .ic{font-size:40px;opacity:.4;margin-bottom:10px}
.empty h4{margin:0 0 6px;color:var(--text-2);font-size:15px;font-weight:600}
.empty p{margin:0;font-size:13px}

.pager{display:flex;gap:6px;align-items:center;justify-content:flex-end;padding:12px 16px;font-size:13px;color:var(--muted);flex-wrap:wrap}
.pager button{
  min-width:31px;height:29px;padding:0 8px;border:1px solid #dde3ec;background:#fff;border-radius:6px;
  cursor:pointer;font-size:13px;color:var(--text-2);font-family:inherit;
}
.pager button:hover:not(:disabled){border-color:var(--primary);color:var(--primary)}
.pager button.on{background:var(--primary);border-color:var(--primary);color:#fff}
.pager button:disabled{opacity:.4;cursor:not-allowed}

.chk{display:flex;align-items:center;gap:7px;cursor:pointer;font-size:13.5px;user-select:none}
.chk input{width:15px;height:15px;accent-color:var(--primary);cursor:pointer;margin:0}

.spin{
  width:15px;height:15px;border:2px solid rgba(255,255,255,.35);border-top-color:#fff;
  border-radius:50%;animation:sp .7s linear infinite;display:inline-block;
}
.spin.dark{border-color:rgba(59,108,246,.25);border-top-color:var(--primary)}
@keyframes sp{to{transform:rotate(360deg)}}
.loading-box{padding:48px;text-align:center;color:var(--muted)}

/* 登录页 */
.login-body{margin:0;padding:0}
.login-wrap{
  min-height:100vh;display:flex;background:#fff;
}
.login-left{
  position:relative;width:46%;min-width:420px;display:flex;flex-direction:column;justify-content:space-between;overflow:hidden;
}
.login-left-bg{
  position:absolute;inset:0;background:url('../img/jd-building.jpg') center/cover no-repeat;z-index:1;
}
.login-left-overlay{
  position:absolute;inset:0;background:linear-gradient(135deg,rgba(18,36,82,.90) 0%,rgba(28,62,128,.78) 55%,rgba(42,88,154,.64) 100%);z-index:2;
}
.login-left-content{
  position:relative;z-index:3;height:100%;display:flex;flex-direction:column;justify-content:space-between;padding:46px 52px 64px;color:#fff;box-sizing:border-box;
}
.login-left-logo{display:flex;align-items:center}
.login-left-logo img{height:40px;width:auto;max-width:100%;object-fit:contain;display:block;filter:drop-shadow(0 2px 10px rgba(0,0,0,.25))}

/* 品牌 LOGO 自定义设置 (授权管理页) */
.logo-setting{display:flex;gap:24px;align-items:flex-start;flex-wrap:wrap;border:1px solid var(--border);border-radius:12px;padding:16px;background:var(--bg)}
.logo-preview{width:200px;flex-shrink:0;text-align:center}
.logo-prev-img{max-width:100%;max-height:64px;height:auto;width:auto;object-fit:contain;border:1px solid var(--line,#e5e7eb);border-radius:10px;background:#fff;padding:10px}
.logo-prev-dark{background:#0f172a;border-color:#1e293b}
.logo-prev-meta{margin-top:10px;font-size:13px;font-weight:600;color:var(--text,#1f2937)}
.logo-hint{margin-top:4px;font-size:12px;color:var(--muted,#6b7280);line-height:1.55}
.logo-actions{flex:1;min-width:240px;display:flex;flex-direction:column;gap:12px;padding-top:6px}
.ipt-file{display:block;font-size:13px;color:var(--muted,#6b7280);max-width:360px}
.logo-btns{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.lnk-sep{flex:none;width:1px;height:22px;background:var(--border);margin:0 4px}
.logo-msg{font-size:13px;min-height:18px}
.logo-msg.ok{color:#16a34a}
.logo-msg.err{color:#dc2626}
.logo-sep{border:none;border-top:1px dashed var(--line,#e5e7eb);margin:24px 0}
.login-left-hero{max-width:520px}
.login-left-hero h1{
  margin:0 0 14px;font-size:42px;font-weight:700;line-height:1.18;letter-spacing:1px;text-shadow:0 4px 20px rgba(0,0,0,.25);
}
.login-left-hero p{
  margin:0;font-size:18px;opacity:.92;line-height:1.6;letter-spacing:.6px;
}
.login-right{
  flex:1;display:flex;align-items:center;justify-content:center;background:#f6f8fc;padding:40px;
}
.login-card{
  background:#fff;border-radius:18px;box-shadow:0 20px 60px rgba(31,41,55,.10);width:100%;max-width:420px;padding:42px 40px;
}
.login-welcome{margin-bottom:30px}
.login-welcome h2{margin:0 0 8px;font-size:26px;font-weight:700;color:#111827}
.login-welcome p{margin:0;font-size:14px;color:#6b7280}
.login-card .form-row{margin-bottom:20px}
.login-card .form-row label{display:block;margin-bottom:8px;font-size:13.5px;color:#374151;font-weight:500}
.login-card input[type="text"],
.login-card input[type="password"]{
  width:100%;height:46px;padding:0 15px;border:1px solid #e5e7eb;border-radius:10px;font-size:14px;color:#111827;background:#fff;box-sizing:border-box;transition:border-color .15s,box-shadow .15s;
}
.login-card input[type="text"]:focus,
.login-card input[type="password"]:focus{
  outline:none;border-color:#3b6cf6;box-shadow:0 0 0 3px rgba(59,108,246,.12);
}
.login-options{
  display:flex;align-items:center;justify-content:flex-start;gap:18px;margin:6px 0 26px;font-size:13px;
}
.login-remember{
  display:flex;align-items:center;gap:7px;color:#4b5563;cursor:pointer;
}
.login-remember input{width:15px;height:15px;accent-color:#3b6cf6;cursor:pointer}
.login-forgot{
  color:#3b6cf6;text-decoration:none;transition:opacity .15s;margin-left:auto;
}
.login-forgot:hover{opacity:.8}
.login-card .btn.primary{
  width:100%;height:46px;justify-content:center;font-size:15px;font-weight:600;border-radius:10px;letter-spacing:2px;
}
.login-card .alert.err{
  margin-bottom:18px;padding:11px 14px;background:#fef2f2;color:#b91c1c;border:1px solid #fecaca;border-radius:9px;font-size:13px;
}
.login-tip-pop{
  position:fixed;left:50%;bottom:60px;transform:translateX(-50%) translateY(20px);padding:12px 22px;background:rgba(17,24,39,.88);color:#fff;font-size:13.5px;border-radius:8px;opacity:0;pointer-events:none;transition:opacity .25s,transform .25s;z-index:9999;
}
.login-tip-pop.show{opacity:1;transform:translateX(-50%) translateY(0)}

@media(max-width:900px){
  .login-left{display:none}
  .login-right{width:100%;padding:24px}
  .login-card{padding:34px 26px}
}

@media(max-width:900px){
  .sidebar{transform:translateX(-100%)}
  .sidebar.open{transform:none;box-shadow:0 0 40px rgba(0,0,0,.16)}
  .main{margin-left:0}
  .menu-toggle{display:flex !important}
}
.menu-toggle{display:none;width:32px;height:32px;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:7px;background:#fff;cursor:pointer}

/* ===================== 团队协作模块 ===================== */
/* —— 统一视觉体系: 模块标识 / 分区卡片 / 控制条 —— */
/* 模块标识: 每个页面顶部控制条左侧的徽标 + 标题 + 一句话说明, 明确当前所在模块 */
.page-id{display:flex;align-items:center;gap:10px;margin-right:6px}
.page-id .pi-ico{width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,var(--primary),#5b8bff);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:0 3px 8px rgba(43,108,255,.22)}
.page-id .pi-ico svg{width:19px;height:19px;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.page-id .pi-tx{display:flex;flex-direction:column;line-height:1.25}
.page-id .pi-name{font-size:15px;font-weight:700;color:var(--text)}
.page-id .pi-desc{font-size:12px;color:var(--muted)}
/* 分区卡片(通用容器): 页面内各板块用它包裹, 一眼可辨 */
.panel{background:#fff;border:1px solid var(--border);border-radius:12px;padding:16px 18px;margin-bottom:14px;box-shadow:0 1px 3px rgba(16,24,40,.06)}
.panel-h{display:flex;align-items:center;gap:9px;margin-bottom:14px}
.panel-h .ph-bar{width:4px;height:15px;border-radius:3px;background:var(--primary);flex-shrink:0}
.panel-h h3,.panel-h .ph-t{font-size:15px;font-weight:600;color:var(--text);margin:0}
.panel-h .ph-sub{margin-left:auto;font-size:12px;color:var(--muted);display:flex;align-items:center;gap:6px}
.panel-h .ph-act{margin-left:auto;display:flex;align-items:center;gap:6px}
/* 控制条内按钮(非小号)统一高度, 与下拉/搜索框等高对齐 */
.team-bar .btn:not(.sm){height:36px;display:inline-flex;align-items:center;white-space:nowrap}
/* 搜索框 / 下拉 focus 统一主色描边 */
.tk-search:focus,.tk-filter select:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft,rgba(43,108,255,.15));outline:none}

.team-bar{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:14px 0 12px;background:#f7f9fc;border:1px solid var(--border);border-radius:12px;padding:10px 14px}
.team-bar .grow{flex:1}
.team-bar .tk-tabs{margin:0}
/* 任务归属快速筛选 chips(日程看板 / 河道看板 共用) */
.view-chips{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:0 0 12px}
.view-chip{cursor:pointer;user-select:none;font-size:13px;padding:5px 14px;border-radius:999px;border:1px solid var(--border);background:#fff;color:var(--muted);transition:.15s}
.view-chip:hover{border-color:var(--primary);color:var(--primary)}
.view-chip.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}
/* 已归档筛选 chip: 选中态用琥珀色区分归档视图 */
.chip-arch.on{background:#e8a33d;border-color:#e8a33d;color:#fff;font-weight:600}
/* 团队协作已移除「团队」切换层级, 统一使用「全员」, 隐藏下拉 */
.team-sel{display:none}
.city-sel{height:36px;border:1px solid var(--border);border-radius:8px;padding:0 10px;background:#fff;font-size:14px;color:var(--text);min-width:120px}
.city-sel:focus{outline:none;border-color:var(--primary)}
.team-sel:focus{outline:none;border-color:var(--primary)}
.btn{border:1px solid var(--border);background:#fff;color:var(--text);padding:7px 14px;border-radius:8px;font-size:13px;cursor:pointer;transition:.15s}
.btn:hover{border-color:var(--primary);color:var(--primary)}
.btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}
.btn.primary:hover{opacity:.9;color:#fff}
.btn.ghost{background:#f5f7fb}
.btn.sm{padding:4px 9px;font-size:12px;border-radius:6px}
.btn.danger{color:#e34d59;border-color:#f3c2c6}
.btn.danger:hover{background:#fee2e2;color:#e34d59}
/* 归档/取消归档按钮: 中性琥珀描边, 与 primary/danger 区分 */
.btn.archive{color:#b9821f;border-color:#f0d9ad;background:#fffaf0}
.btn.archive:hover{background:#fdf2dd;color:#a06f15;border-color:#e8a33d}

.kpi-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px;margin:14px 0}
.kpi{background:#fff;border:1px solid var(--border);border-radius:12px;padding:14px 16px}
.kpi .n{font-size:26px;font-weight:700;line-height:1.1}
.kpi .l{font-size:13px;color:var(--muted);margin-top:4px}
.kpi.warn .n{color:#e34d59}
.kpi.blue .n{color:var(--primary)}

.dist{background:#fff;border:1px solid var(--border);border-radius:12px;padding:14px 16px;margin-bottom:12px}
.dist h4{margin:0 0 10px;font-size:14px}
.bar{display:flex;align-items:center;gap:10px;margin-bottom:8px;font-size:13px}
.bar .bl{width:64px;color:var(--muted);flex-shrink:0;text-align:right}
.bar .bt{flex:1;background:#f1f3f7;border-radius:6px;height:18px;overflow:hidden}
.bar .bf{height:100%;border-radius:6px;background:var(--primary);transition:width .3s}
.bar .bv{width:34px;text-align:right;color:var(--text);flex-shrink:0}

.kanban{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin:14px 0}
.kcol{background:#f7f9fc;border:1px solid var(--border);border-radius:12px;padding:10px;min-height:200px}
.kcol h4{margin:2px 4px 10px;font-size:14px;display:flex;align-items:center;gap:6px}
.kcol h4 .dot{width:9px;height:9px;border-radius:50%}
.kcard{background:#fff;border:1px solid var(--border);border-radius:10px;padding:10px;margin-bottom:10px;cursor:grab}
.kcard:active{cursor:grabbing}
.kcard .kt{font-size:14px;font-weight:600;margin-bottom:6px;line-height:1.35}
.kcard .kmeta{display:flex;flex-wrap:wrap;gap:6px;align-items:center;font-size:12px;color:var(--muted)}
.kcard .kacts{display:flex;gap:4px;margin-top:8px}
.kcard.dragging{opacity:.4}
.kcol.drop{border-color:var(--primary);background:#eef2ff}

.badge{display:inline-flex;align-items:center;padding:1px 8px;border-radius:9px;font-size:11px;font-weight:600;line-height:1.7;white-space:nowrap}
.pri-low{background:#eef2f7;color:#5b6b82}
.pri-normal{background:#e6f0ff;color:#2b6cff}
.pri-high{background:#fff1e6;color:#e8841a}
.pri-urgent{background:#fee2e2;color:#e34d59}
.st-todo{background:#eef2f7;color:#5b6b82}
.st-doing{background:#e6f7ee;color:#1a9c5b}
.st-done{background:#e6f0ff;color:#2b6cff}
.av{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;background:var(--primary-soft);color:var(--primary);font-size:11px;font-weight:700;margin-right:4px;overflow:hidden}.av img{width:100%;height:100%;object-fit:cover;display:block}

/* ===================== 团队协作 - 河道看板(状态列看板) ===================== */
.river{margin:14px 0}
.river .rcols{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;align-items:start}
.rcol{background:#f7f9fc;border:1px solid var(--border);border-radius:12px;padding:10px;min-height:240px;display:flex;flex-direction:column}
.rcol-h{display:flex;align-items:center;gap:8px;margin:2px 4px 12px;font-size:14px;font-weight:600;color:var(--text)}
.rcol-h .ch-ico{display:inline-flex;width:26px;height:26px;border-radius:8px;align-items:center;justify-content:center;background:#fff;border:1px solid var(--border)}
.rcol-h .ch-ico svg{width:15px;height:15px}
.rcol-h .rcol-name{flex:1}
.rcol-h .rcol-cnt{font-size:12px;font-weight:600;color:var(--muted);background:#fff;border:1px solid var(--border);border-radius:11px;padding:1px 10px}
.rcol-body{flex:1;min-height:80px;border-radius:8px;padding:2px;transition:background .15s,border-color .15s}
.rcol-body.drop{border:1px dashed var(--primary);background:#eef2ff}
.rcol.st-todo .ch-ico{color:#5b6b82}
.rcol.st-doing .ch-ico{color:#1a9c5b}
.rcol.st-done .ch-ico{color:#2b6cff}
.river .kcard{background:#fff;border:1px solid var(--border);border-radius:10px;padding:10px 11px;margin-bottom:10px;cursor:grab;box-shadow:0 1px 2px rgba(16,24,40,.04);transition:box-shadow .15s,transform .12s,opacity .15s}
.river .kcard:hover{box-shadow:0 4px 14px rgba(16,24,40,.10)}
.river .kcard:active{cursor:grabbing}
.river .kcard.dragging{opacity:.4}
.river .kcard.st-done .kt{text-decoration:line-through;color:var(--muted)}
.river .kcard .kt{font-size:14px;font-weight:600;margin-bottom:8px;line-height:1.4;color:var(--text)}
.river .kcard .kmeta{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:9px}
.river .kcard .chip.due{display:inline-flex;align-items:center;gap:3px;font-size:11.5px;color:var(--muted);background:#f1f3f7;border-radius:8px;padding:1px 8px}
.river .kcard .chip.due.red{color:#e34d59;background:#fdeced}
.river .kcard .kfoot{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}
.river .kcard .kfoot .av{width:20px;height:20px;font-size:11px}
.river .kcard .kfoot .an{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.river .kcard .kfoot .kpct{margin-left:auto;font-weight:600;color:var(--text-2)}
.river .kcard .kfoot .kdone{margin-left:auto;height:24px;padding:0 10px;font-size:12px;border-radius:6px}
.river .kcard .kbar{height:5px;background:#eef1f5;border-radius:4px;overflow:hidden;margin-top:8px}
.river .kcard .kbar i{display:block;height:100%;border-radius:4px;background:var(--primary)}
.river .kcard.st-todo .kbar i{background:#5b6b82}
.river .kcard.st-doing .kbar i{background:#1a9c5b}
.river .kcard.st-done .kbar i{background:#2b6cff}
.river .kcard.st-todo.overdue .kt{color:#e34d59}
.river .cell-empty{text-align:center;color:var(--muted);font-size:12.5px;padding:24px 8px;border:1px dashed var(--border);border-radius:10px;margin:2px}

/* 河道看板控制条: 搜索 / 优先级 / 执行人 / 项目 合并单行靠左对齐 */
.river-bar{gap:8px}
.river-bar .tk-search{flex:0 1 190px;min-width:140px}
.river-bar select{height:36px;border:1px solid var(--border);border-radius:8px;padding:0 10px;font-size:13px;background:#fff;color:var(--text)}
.river-panel{padding:14px 16px}
/* 三列按状态柔和着色, 强化状态区分同时保持清爽 */
.rcol.st-todo{background:#f6f8fb}
.rcol.st-doing{background:#f3f9f5}
.rcol.st-done{background:#f4f7fe}
/* 列头状态图标 / 计数徽标 与状态呼应 */
.rcol.st-todo .ch-ico{background:#eef2f7;color:#5b6b82}
.rcol.st-doing .ch-ico{background:#e6f7ee;color:#1a9c5b}
.rcol.st-done .ch-ico{background:#e6f0ff;color:#2b6cff}
.rcol.st-todo .rcol-cnt{background:#eef2f7;color:#5b6b82;border-color:#dde3ec}
.rcol.st-doing .rcol-cnt{background:#e6f7ee;color:#1a9c5b;border-color:#cdeadd}
.rcol.st-done .rcol-cnt{background:#e6f0ff;color:#2b6cff;border-color:#cfe0ff}
/* 卡片左侧状态色条, 一眼可辨状态 */
.river .kcard{position:relative;padding-left:15px}
.river .kcard:before{content:'';position:absolute;left:0;top:0;bottom:0;width:4px;border-radius:10px 0 0 10px}
.river .kcard.st-todo:before{background:#5b6b82}
.river .kcard.st-doing:before{background:#1a9c5b}
.river .kcard.st-done:before{background:#2b6cff}

.sched{margin:14px 0}
.sched .day{background:#fff;border:1px solid var(--border);border-radius:12px;padding:12px 16px;margin-bottom:12px}
.sched .day .dh{font-size:15px;font-weight:700;margin-bottom:8px;display:flex;align-items:center;gap:8px}
.sched .day.overdue{border-color:#f3c2c6;background:#fff7f7}
.sched .row{display:flex;align-items:center;gap:8px;padding:6px 0;border-top:1px dashed var(--border);font-size:13px}
.sched .row:first-of-type{border-top:none}

.proj-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px;margin:14px 0}
.proj{background:#fff;border:1px solid var(--border);border-radius:12px;padding:16px}
.proj h4{margin:0 0 6px;font-size:15px}
.proj .pd{font-size:13px;color:var(--muted);min-height:38px}
.proj .pstat{font-size:12px;color:var(--muted);margin:8px 0}
.proj .pbar{height:8px;background:#f1f3f7;border-radius:5px;overflow:hidden;margin:8px 0}
.proj .pbar i{display:block;height:100%;background:var(--primary)}
.proj .pacts{display:flex;gap:6px;margin-top:10px}

.mask{position:fixed;inset:0;background:rgba(15,23,42,.45);display:none;align-items:center;justify-content:center;z-index:1000}
.mask.show{display:flex}
.modal{background:#fff;border-radius:14px;width:min(460px,92vw);max-height:88vh;overflow:auto;padding:20px}
.modal h3{margin:0 0 14px;font-size:17px}
.fld{margin-bottom:12px}
.fld label{display:block;font-size:13px;color:var(--muted);margin-bottom:5px}
.fld input,.fld select,.fld textarea{width:100%;border:1px solid var(--border);border-radius:8px;padding:8px 10px;font-size:14px;font-family:inherit;box-sizing:border-box}
.fld textarea{resize:vertical;min-height:64px}
.modal-acts{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}
.muted{color:var(--muted)}
.empty{padding:40px;text-align:center;color:var(--muted);background:#fff;border:1px dashed var(--border);border-radius:12px;margin:14px 0}

/* ===================== 团队协作 - 日程看板(月历) ===================== */
.sched-bar{gap:8px}
.sched-bar .tk-search{flex:0 1 190px;min-width:140px}
.sched-bar select{height:36px;border:1px solid var(--border);border-radius:8px;padding:0 10px;font-size:13px;background:#fff;color:var(--text)}
.sched-panel{padding:14px 16px}

.cal-nav{display:flex;align-items:center;gap:8px}
.cal-nav .btn.sm{padding:4px 10px;font-size:12px}
.cal-title{font-weight:600;font-size:14px;margin-left:4px;color:var(--text)}
.sched-cal{margin:0}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:8px}
.cal-head .cal-h{text-align:center;font-size:12.5px;font-weight:600;color:var(--muted);padding:6px 0}
.cal-cell{background:#fff;border:1px solid var(--border);border-radius:10px;padding:6px;min-height:108px;overflow:hidden;cursor:pointer;transition:all .18s;position:relative}
.cal-cell:hover{transform:translateY(-2px);box-shadow:0 6px 16px rgba(16,24,40,.10);border-color:var(--primary);z-index:2}
.cal-cell.other{background:#f7f9fc;opacity:.55}
.cal-cell.today{border-color:#22c55e;box-shadow:0 0 0 2px rgba(34,197,94,.18);background:#f0fdf4}
.cal-cell.weekend{background:#fffbf5}
.cal-cell.weekend:hover{background:#fff7ed}
.cal-cell .cal-add{position:absolute;right:6px;top:6px;width:22px;height:22px;border-radius:50%;background:var(--primary-soft);color:var(--primary);display:flex;align-items:center;justify-content:center;font-size:16px;opacity:0;transition:opacity .15s,transform .15s}
.cal-cell:hover .cal-add{opacity:1;transform:scale(1.05)}
.cal-d{font-size:13px;font-weight:600;color:var(--text-2);margin-bottom:5px}
.cal-bar{display:flex;align-items:center;gap:5px;padding:3px 6px;margin-bottom:4px;border-radius:6px;font-size:12px;cursor:pointer;background:#eef2f7;border-left:3px solid #5b6b82}
.cal-bar .cb-dot{width:7px;height:7px;border-radius:50%;background:#5b6b82;flex:none}
.cal-bar .cb-t{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cal-bar .cb-pri{font-size:10px;padding:0 5px;border-radius:8px;white-space:nowrap}
.cal-bar.st-todo{background:#e6f0ff;border-left-color:#2b6cff}
.cal-bar.st-todo .cb-dot{background:#2b6cff}
.cal-bar.st-doing{background:#dcfce7;border-left-color:#16a34a}
.cal-bar.st-doing .cb-dot{background:#16a34a}
.cal-bar.st-done{background:#f1f5f9;border-left-color:#64748b}
.cal-bar.st-done .cb-dot{background:#64748b}
.cal-bar.st-done .cb-t{text-decoration:line-through;color:var(--muted)}
.cal-bar.st-todo.overdue{background:#fee2e2;border-left-color:#dc2626}
.cal-bar.st-todo.overdue .cb-dot{background:#dc2626}
.cal-more{text-align:center;font-size:11px;color:var(--muted);padding-top:2px}
.cal-unsch{margin-top:14px;background:#fff;border:1px solid var(--border);border-radius:12px;padding:14px 16px}
.cal-unsch .cu-h{font-size:14px;font-weight:600;margin-bottom:8px}

/* 无任务日期格: 天气 + 节日信息 */
.cal-info{display:flex;flex-direction:column;gap:4px;margin-top:2px}
.cal-wx{display:flex;align-items:center;gap:5px;font-size:12px;color:var(--text-2)}
.cal-wx .wx-ico{font-size:14px;line-height:1;flex:none}
.cal-wx .wx-t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cal-fest{display:inline-flex;align-items:center;align-self:flex-start;font-size:11.5px;color:#c2410c;background:#fff3ec;border:1px solid #ffd9c2;border-radius:8px;padding:1px 8px;font-weight:600}

@media (max-width:1100px){
  .sched-bar .tk-search{flex:1 1 160px}
  .river-bar .tk-search{flex:1 1 160px}
}
@media (max-width:860px){
  .cal-grid{gap:5px}
  .cal-cell{min-height:86px;padding:5px;border-radius:8px}
  .cal-bar{font-size:11px;padding:2px 5px;margin-bottom:3px}
  .cal-bar .cb-t{max-width:90px}
  .cal-wx .wx-t{display:none}
  .sched-bar .cal-title{display:none}
}

/* ===================== 团队协作 - 河道看板(状态列看板) ===================== */
/* 样式见上方 .river 区块(已改为按状态分三列 + 柔和配色 + 拖拽反馈) */

/* ===================== 团队协作 - 任务待办(标签栏 + 筛选) ===================== */
.tk-tabs{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0 10px}
.tk-tab{padding:6px 14px;border:1px solid var(--border);background:#fff;border-radius:20px;cursor:pointer;font-size:13px;color:var(--muted);transition:.15s}
.tk-tab:hover{border-color:var(--primary);color:var(--primary)}
.tk-tab.on{background:var(--primary);border-color:var(--primary);color:#fff}
/* 已归档标签: 选中态用琥珀色区分归档视图 */
.tk-tab--arch.on{background:#e8a33d;border-color:#e8a33d;color:#fff}
.tk-tab--arch.on:hover{border-color:#e8a33d;color:#fff}
.tk-filter{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px;align-items:center;background:#fff;border:1px solid var(--border);border-radius:12px;padding:10px 12px}
.tk-filter .tk-tabs{margin:0;flex-wrap:wrap}
.tk-filter .grow{flex:1}
.tk-filter .btn{height:36px;display:flex;align-items:center;white-space:nowrap}
.tk-search{flex:1;min-width:200px;height:36px;border:1px solid var(--border);border-radius:8px;padding:0 12px;font-size:13px}
.tk-filter select{height:36px;border:1px solid var(--border);border-radius:8px;padding:0 10px;font-size:13px;background:#fff}
.kanban .kcol.st-todo{background:#f4f6f9;border-color:#dde3ec}
.kanban .kcol.st-doing{background:#eef7f1;border-color:#c7e7d6}
.kanban .kcol.st-done{background:#eef3ff;border-color:#cdd9ff}

/* ===================== 团队协作 - 项目管理(列表 + 详情) ===================== */
.proj-wrap{display:grid;grid-template-columns:300px 1fr;gap:16px;margin:14px 0;align-items:start}
.proj-list{display:flex;flex-direction:column;gap:10px}
/* 项目管理工具条: 搜索/状态/负责人 + 新建/刷新 同一行, 筛选在左、按钮靠右 */
.team-bar .tk-search{flex:0 0 240px;width:240px;min-width:180px}
.team-bar select{height:36px;border:1px solid var(--border);border-radius:8px;padding:0 10px;font-size:13px;background:#fff;color:var(--text)}
.team-bar select:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft,rgba(43,108,255,.15));outline:none}
.pli{background:#fff;border:1px solid var(--border);border-radius:12px;padding:12px;cursor:pointer;transition:all .18s cubic-bezier(.34,1.56,.64,1)}
.pli:hover{transform:translateY(-2px);box-shadow:0 6px 18px rgba(16,24,40,.08);border-color:var(--primary)}
.pli.on{border-color:var(--primary);background:#f5f8ff;box-shadow:0 2px 10px rgba(43,108,255,.10)}
.river-filter{max-width:1120px;margin:0 auto 12px}
.pli-h{display:flex;justify-content:space-between;align-items:center;gap:8px;font-size:14px;margin-bottom:8px}
.pli-bar{height:6px;background:#f1f3f7;border-radius:4px;overflow:hidden;margin-bottom:6px}
.pli-bar i{display:block;height:100%;background:var(--primary)}
.pli-m{font-size:12px;color:var(--muted)}
.pli.overdue{border-color:#f5c2c7;background:#fff7f7}
.pli.overdue .pli-h b{color:#e34d59}
.pli-od{display:inline-flex;align-items:center;gap:3px;padding:1px 7px;border-radius:9px;font-size:11px;font-weight:600;background:#fdeced;color:#e34d59;white-space:nowrap}
.pd-warn{margin:10px 0;padding:8px 12px;border-radius:8px;background:#fdeced;color:#e34d59;font-size:13px;font-weight:500;display:flex;align-items:center;gap:6px}
.pd-warn.over{background:#fdeced;border:1px solid #f5c2c7}
.proj-over{display:inline-flex;align-items:center;gap:4px;margin-left:6px;font-size:12px;font-weight:600;color:#e34d59}
.proj-over.td{padding:2px 8px;border-radius:8px;background:#fdeced}
.proj-detail{background:#fff;border:1px solid var(--border);border-radius:12px;padding:18px;min-height:420px}
.pd-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}
.pd-head h3{margin:0;font-size:18px;display:flex;align-items:center;gap:8px}
.pd-acts{display:flex;gap:6px}
.pd-desc{color:var(--muted);font-size:13px;margin-bottom:12px;line-height:1.6}
.pd-sec{margin:18px 0}
.pd-sec-h{font-weight:600;font-size:14px;margin-bottom:8px;display:flex;align-items:center;gap:8px;justify-content:space-between}
.pd-goal{background:#f7f9fc;border-radius:8px;padding:10px 12px;font-size:13px;line-height:1.6}
.pd-info{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}
.ii{display:flex;flex-direction:column;gap:3px}
.ii-k{font-size:12px;color:var(--muted)}
.ii-v{font-size:13px;font-weight:500}
.pd-mem{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.av.big{width:30px;height:30px;font-size:13px}
.av.owner{background:var(--primary);color:#fff;box-shadow:0 0 0 2px #fff,0 0 0 4px var(--primary)}
.node{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--border);border-radius:8px;margin-bottom:8px}
.node.done .nt{text-decoration:line-through;color:var(--muted)}
.node.overdue{border-color:#f5c2c7;background:#fff7f7}
.node.overdue .nt{color:#e34d59}
.nmuted.red{color:#e34d59;font-weight:600}
.nbody{flex:1;min-width:0}
.nt{font-size:13px;font-weight:500}
.nmuted{font-size:12px;color:var(--muted)}
.nchk{position:relative;display:inline-flex;cursor:pointer;flex:none}
.nchk input{position:absolute;opacity:0;width:18px;height:18px;margin:0;cursor:pointer}
.nbox{width:18px;height:18px;border:2px solid var(--border);border-radius:5px;display:inline-block;box-sizing:border-box;transition:.15s}
.nchk input:checked + .nbox{background:var(--primary);border-color:var(--primary);position:relative}
.nchk input:checked + .nbox:after{content:'';position:absolute;left:5px;top:1px;width:4px;height:9px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
.rt{display:flex;align-items:center;gap:6px;padding:7px 0;border-top:1px dashed var(--border);font-size:13px}
.rt:first-of-type{border-top:none}
.rt-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cmt{display:flex;gap:8px;padding:9px 0;border-top:1px dashed var(--border)}
.cmt:first-of-type{border-top:none}
.cmt-b{flex:1;min-width:0}
.cmt-h{display:flex;gap:8px;align-items:baseline}
.cmt-h b{font-size:13px}
.cmt-c{font-size:13px;margin-top:3px;line-height:1.6}
.cmt-form{display:flex;gap:8px;margin:10px 0}
.cmt-form textarea{flex:1;border:1px solid var(--border);border-radius:8px;padding:8px 10px;font-size:13px;font-family:inherit;resize:vertical;min-height:48px;box-sizing:border-box}
.cmt-list{margin-top:4px}
.fld-row{display:flex;gap:12px}
.fld-row .fld{flex:1;min-width:0}

/* ===================== 团队协作 - 任务待办(列表视图) ===================== */
.tk-body{display:flex;align-items:flex-start;gap:16px;max-width:1120px;margin:0 auto}
.tk-side{flex:0 0 150px;background:#fff;border:1px solid var(--border);border-radius:12px;padding:12px;position:sticky;top:14px}
.tk-side-h{font-size:13px;font-weight:600;color:var(--text-2);margin-bottom:10px;padding-bottom:8px;border-bottom:1px solid var(--border)}
.tk-type{display:block;width:100%;text-align:left;border:none;background:transparent;color:var(--text-2);font-size:13px;padding:8px 10px;border-radius:8px;cursor:pointer;margin-bottom:2px;transition:.15s}
.tk-type:hover{background:#f4f6f9;color:var(--text)}
.tk-type.on{background:var(--primary);color:#fff;font-weight:600}
.tk-list-wrap{flex:1;min-width:0}
.tk-filter--c{max-width:1120px;margin:0 auto 12px}
.tk-list{background:#fff;border:1px solid var(--border);border-radius:12px;padding:10px}
.tk-row{display:flex;align-items:center;gap:12px;padding:12px 16px;border:1px solid var(--border-2);border-radius:10px;margin-bottom:8px;transition:all .2s cubic-bezier(.34,1.56,.64,1);background:#fff;position:relative}
.tk-row:last-child{margin-bottom:0}
.tk-row:hover{transform:translateY(-2px);box-shadow:0 6px 18px rgba(16,24,40,.08);z-index:2}
/* 任务行按状态强化配色: 4px 左侧强调条 + 更明显的状态底色 + 状态圆点 */
.tk-row{border-left-width:4px}
.tk-row.st-todo{background:#f5f7fb;border-left-color:#9aa6b8}
.tk-row.st-doing{background:#ecf8f1;border-left-color:#1a9c5b}
.tk-row.st-done{background:#eef3ff;border-left-color:#2b6cff}
/* 逾期(未完成且已过截止日): 红色强调, 覆盖状态色 */
.tk-row.overdue{background:#fdeced;border-left-color:#e34d59}
.tk-row.st-todo .tk-title:before,
.tk-row.st-doing .tk-title:before,
.tk-row.st-done .tk-title:before{content:'';display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:8px;vertical-align:middle}
.tk-row.st-todo .tk-title:before{background:#9aa6b8}
.tk-row.st-doing .tk-title:before{background:#1a9c5b}
.tk-row.st-done .tk-title:before{background:#2b6cff}
.tk-row.overdue .tk-title:before{background:#e34d59}
.tk-main{flex:1;min-width:0;display:flex;flex-direction:row;align-items:center;gap:12px}
.tk-title{font-size:14.5px;font-weight:600;color:var(--text);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto;min-width:0}
.tk-title:hover{color:var(--primary)}
.tk-tags{display:flex;flex-wrap:nowrap;align-items:center;gap:6px;font-size:12px;flex:0 0 auto}
.tk-tags .badge{font-size:11px}
.tk-tags .type{background:#f1ecfe;color:#6d45e0}
.tk-tags .plat{background:#e6f7f4;color:#0f9b8e}
.tk-assignee{display:inline-flex;align-items:center;color:var(--text-2)}
.tk-right{display:flex;align-items:center;gap:14px;flex-shrink:0}
.tk-progress{width:110px;height:6px;background:#f1f3f7;border-radius:3px;overflow:hidden;position:relative}
.tk-progress-bar{height:100%;border-radius:3px}
.tk-progress span{position:absolute;right:0;top:-16px;font-size:11px;color:var(--muted)}
.tk-due{font-size:12px;white-space:nowrap;width:86px;text-align:right}
.tk-due.ok{color:#17a67c}
.tk-due.warn{color:#f59e0b}
.tk-due.overdue{color:#e34d59;font-weight:600}
.tk-ops{display:flex;gap:6px;opacity:.7;transition:opacity .15s}
.tk-row:hover .tk-ops{opacity:1}

/* 任务弹窗：两列/三列字段布局 */
#taskMask .modal.wide{max-width:720px}
#taskMask .fld-row{display:flex;gap:14px}
#taskMask .fld-row.three{gap:12px}
#taskMask .fld-row .fld{flex:1;min-width:0}
#taskMask .fld-row.three .fld{flex:1}
#taskMask .hint{font-size:11.5px;color:var(--muted);margin-top:4px}
#taskMask input[type=number]{width:100%}
.tk-collab{display:flex;flex-wrap:wrap;gap:10px 16px;padding:10px 12px;border:1px solid var(--border);border-radius:8px;background:#fff}
.tk-collab .chk{display:inline-flex;align-items:center;gap:6px;font-size:13px;cursor:pointer}
.tk-collab .chk input{width:15px;height:15px;accent-color:var(--primary);margin:0;cursor:pointer}

@media (max-width: 860px){
  .proj-wrap{grid-template-columns:1fr}
  .pd-info{grid-template-columns:1fr}
  #taskMask .fld-row,#taskMask .fld-row.three{flex-direction:column;gap:0}
  .tk-right{flex-direction:column;align-items:flex-end;gap:6px}
  .tk-row{align-items:flex-start}
  .tk-body{flex-direction:column;gap:10px}
  .tk-side{position:static;flex:none;display:flex;flex-wrap:wrap;gap:6px;align-items:center}
  .tk-side-h{width:100%;border-bottom:none;padding-bottom:0;margin-bottom:4px}
  .tk-type{width:auto;flex:0 0 auto;margin-bottom:0}
}
@media (max-width: 640px){
  .tk-row{flex-direction:column;align-items:flex-start;gap:8px;padding:12px}
  .tk-right{width:100%;flex-direction:row;justify-content:space-between}
}

/* ===================== 团队协作 - 数据统计仪表板 ===================== */
.range-tabs{display:inline-flex;align-items:center;background:#eef1f5;border-radius:8px;padding:3px;gap:3px}
.range-tabs button{border:none;background:transparent;color:var(--text-2);font-size:13px;padding:6px 14px;border-radius:6px;cursor:pointer;transition:all .15s}
.range-tabs button:hover{color:var(--text)}
.range-tabs button.on{background:var(--primary);color:#fff;box-shadow:0 1px 2px rgba(59,108,246,.25)}

.stat-kpi-row{display:grid;grid-template-columns:repeat(6,1fr);gap:14px;margin:14px 0}
.stat-kpi{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:16px;display:flex;align-items:center;gap:14px;box-shadow:var(--shadow)}
.sk-icon{width:42px;height:42px;border-radius:10px;background:#f4f6fa;display:flex;align-items:center;justify-content:center}
.sk-icon svg{width:22px;height:22px}
.sk-body{flex:1;min-width:0}
.sk-num{font-size:24px;font-weight:700;color:var(--text);line-height:1.2}
.sk-label{font-size:12.5px;color:var(--muted);margin-top:3px}

.stat-grid-2{display:grid;grid-template-columns:1.25fr .75fr;gap:14px;margin:14px 0}
.stat-card{background:var(--card);border:1px solid var(--border);border-radius:12px;padding:16px;box-shadow:var(--shadow)}
.stat-card.mt{margin-top:14px}
.sc-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}
.sc-head h4{margin:0;font-size:15px;font-weight:600;color:var(--text)}
.sc-sub{font-size:12px;color:var(--muted)}
.sc-link{font-size:12.5px;color:var(--primary)}
.sc-link:hover{color:var(--primary-dark)}

/* 每日完成趋势 */
.stat-trend{height:220px}
.trend-chart{display:flex;align-items:flex-end;justify-content:space-between;height:180px;gap:4px;padding:0 4px}
.trend-col{flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;min-width:0;height:100%;justify-content:flex-end}
.trend-bar-wrap{width:100%;height:100%;display:flex;align-items:flex-end;justify-content:center;border-bottom:1px solid var(--border-2)}
.trend-bar{width:60%;max-width:18px;background:var(--primary);border-radius:4px 4px 0 0;transition:height .3s ease;min-height:2px}
.trend-bar:hover{background:var(--primary-dark)}
.trend-date{font-size:10.5px;color:var(--muted);white-space:nowrap}

/* 状态分布 */
.stat-status-list{display:flex;flex-direction:column;gap:12px}
.sd-row{display:grid;grid-template-columns:60px 1fr 50px;align-items:center;gap:12px}
.sd-label{font-size:13px;color:var(--text-2)}
.sd-bar{height:10px;background:#f1f3f7;border-radius:5px;overflow:hidden}
.sd-fill{height:100%;border-radius:5px;transition:width .3s ease}
.sd-val{font-size:12.5px;color:var(--text);text-align:right}

/* 表格 */
.stat-table-wrap{overflow-x:auto}
.stat-table{width:100%;border-collapse:collapse;font-size:13px}
.stat-table th{text-align:left;padding:10px 12px;color:var(--muted);font-weight:500;border-bottom:1px solid var(--border-2);white-space:nowrap}
.stat-table td{padding:12px;border-bottom:1px solid var(--border-2);vertical-align:middle;color:var(--text)}
.stat-table tr:last-child td{border-bottom:none}
.stat-table .tar{text-align:right}
.stat-table .empty-td{text-align:center;color:var(--muted);padding:28px}

.u-cell{display:flex;align-items:center;gap:10px}
.u-avatar{width:32px;height:32px;border-radius:50%;color:#fff;font-size:13px;font-weight:600;display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden}.u-avatar img{width:100%;height:100%;object-fit:cover;display:block}
.u-name{font-weight:500}
.role-tag{display:inline-block;font-size:11px;padding:2px 8px;border-radius:10px}
.role-tag.owner{background:#eaf0ff;color:var(--primary)}
.role-tag.member{background:#f4f6fa;color:var(--text-2)}

.load-bar{height:8px;background:#f1f3f7;border-radius:4px;overflow:hidden;min-width:120px}
.load-fill{height:100%;background:#22c55e;border-radius:4px;transition:width .3s ease}

.proj-bar{height:8px;background:#f1f3f7;border-radius:4px;overflow:hidden;display:inline-block;width:120px;vertical-align:middle;margin-right:8px}
.proj-fill{height:100%;background:var(--primary);border-radius:4px;transition:width .3s ease}
.proj-pct{font-size:12px;color:var(--text-2);display:inline-block;min-width:34px}

.st-badge{display:inline-block;font-size:11px;padding:3px 9px;border-radius:10px}
.st-badge.doing{background:#eaf0ff;color:var(--primary)}
.st-badge.done{background:#e6f7f1;color:#0f8f6a}

@media (max-width: 1100px){
  .stat-kpi-row{grid-template-columns:repeat(3,1fr)}
  .stat-grid-2{grid-template-columns:1fr}
}
@media (max-width: 640px){
  .stat-kpi-row{grid-template-columns:repeat(2,1fr)}
  .range-tabs button{padding:5px 10px;font-size:12px}
  .sd-row{grid-template-columns:50px 1fr 42px}
}

/* =============================================================
   促销监控(甘特图 + 管理)
   ============================================================= */
.promo-toolbar{display:flex;align-items:center;gap:8px;padding:12px 0;flex-wrap:wrap}
.promo-toolbar select,.promo-toolbar .f-q{height:32px;border:1px solid var(--border);border-radius:8px;background:var(--card);color:var(--text);padding:0 10px;font-size:13px}
.promo-toolbar .f-q{min-width:160px}
.promo-toolbar .grow{flex:1}
.legend{font-size:12px;color:var(--muted);display:flex;align-items:center;gap:6px}
.legend .lg{display:inline-block;width:12px;height:12px;border-radius:3px;margin-right:2px;vertical-align:middle}
.legend .lg.lg-prod{background:linear-gradient(90deg,#3b6cf6,#1a9c5b,#f59e0b,#e34d59)}

.promo-summary{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:8px;align-items:center}
.promo-summary .ps{display:inline-flex;align-items:center;gap:5px;height:30px;padding:0 12px;font-size:13px;line-height:1;color:var(--text-2);background:var(--card);border:1px solid var(--border);border-radius:8px;cursor:pointer;white-space:nowrap;transition:transform .12s,box-shadow .12s,background .12s,border-color .12s,color .12s}
.promo-summary .ps b{color:var(--text);font-weight:600}
.promo-summary .ps:hover{transform:translateY(-1px);box-shadow:0 2px 6px rgba(16,24,40,.10)}
.promo-summary .ps.on{box-shadow:0 0 0 2px var(--primary),0 2px 6px rgba(59,108,246,.18);transform:translateY(-1px);border-color:var(--primary)}
/* 风险类(排序)按钮: 仅用文字色区分, 尺寸完全统一 */
.promo-summary .ps.danger{color:var(--up)}
.promo-summary .ps.warn{color:#b97700}
.promo-summary .ps.gate{color:#c0392b}
/* 状态筛选按钮: 尺寸统一, 左侧色条区分状态; 选中态用主色环描边 */
.promo-summary .ps.st-filter{border-left-width:3px}
.promo-summary .ps.st-filter.st-active{color:#1a9c5b;border-left-color:#1a9c5b}
.promo-summary .ps.st-filter.st-expiring{color:#b97700;border-left-color:#f59e0b}
.promo-summary .ps.st-filter.st-upcoming{color:#2a6bd6;border-left-color:#3b6cf6}
.promo-summary .ps.st-filter.st-ended{color:#7a828f;border-left-color:#9aa3b2}
.promo-summary .ps.st-filter.st-disabled{color:#a23b3b;border-left-color:#c0392b}
.promo-summary .ps .sort-arr{font-style:normal;margin-left:2px;font-size:11px}
.promo-summary .ps-sep{width:1px;height:20px;background:var(--border-2);margin:0 4px}
.promo-summary .ps-cap{font-size:13px;color:var(--muted);margin-right:2px}
.st-tag{display:inline-block;border-radius:20px;padding:1px 9px;font-size:11px;border:1px solid var(--border);background:#f1f3f7;color:var(--text-2)}

.gantt-scroll{height:calc(100vh - 196px);min-height:420px;overflow:auto;border:1px solid var(--border);border-radius:var(--radius);background:var(--card)}
.gantt-grid{min-width:100%;min-height:100%}
.gantt-head{display:flex;position:sticky;top:0;z-index:3;background:#f7f9fc;border-bottom:1px solid var(--border)}
.gantt-left{position:sticky;left:0;z-index:4;background:#f7f9fc;border-right:1px solid var(--border);min-width:250px;width:250px;flex:none;padding:8px 12px;font-weight:600;color:var(--text-2);font-size:12px;align-self:stretch;box-sizing:border-box}
.head-left{border-right:1px solid var(--border)}
.gantt-axis{position:relative;height:46px;flex:none}
.gantt-axis .m-label{position:absolute;top:6px;font-size:12px;color:var(--text-2);border-left:1px solid var(--border);padding:2px 6px;white-space:nowrap;background:#f7f9fc;z-index:2;line-height:1.2}
.gantt-axis .m-label.m-minor{top:24px;font-size:11px;color:var(--muted);background:#f7f9fc}
.gantt-axis .today-line,.gantt-lane .today-line{position:absolute;top:0;bottom:0;width:2px;background:rgba(227,77,89,.55);z-index:2;pointer-events:none}
.gantt-axis .today-line{height:46px}

.gantt-row{display:flex;min-height:84px;align-items:stretch;border-bottom:1px solid #c5cedd;border-left:4px solid var(--sku-color,transparent);transition:transform .35s cubic-bezier(.34,1.56,.64,1),opacity .25s;will-change:transform;box-sizing:border-box}
.gantt-row:hover .gantt-left{background:#d4e2ff}
.gantt-lane{background:rgba(120,130,150,0)}
.gantt-row:hover .gantt-lane{background:rgba(59,108,246,.14)!important}
.gantt-lane{position:relative;flex:none}
.g-grid{position:absolute;top:0;bottom:0;width:1px;background:rgba(120,130,150,.20);z-index:0;pointer-events:none}
.g-grid.g-major{background:rgba(120,130,150,.45)}
.gantt-axis .m-label.m-major{font-weight:700;color:var(--text)}
.seg-tip{font-size:12px;color:var(--muted);margin-right:2px}
.g-bar{position:absolute;height:20px;border-radius:5px;display:flex;align-items:center;gap:4px;padding:0 6px;font-size:11px;color:#fff;cursor:pointer;overflow:hidden;white-space:nowrap;box-shadow:0 1px 2px rgba(16,24,40,.12)}
.g-bar .gb-ly{background:rgba(255,255,255,.3);border-radius:3px;padding:0 3px;font-size:10px;flex:none}
.g-bar .gb-t{overflow:hidden;text-overflow:ellipsis}
.g-bar.ly-total{border:1px dashed rgba(255,255,255,.85)}

.gantt-left .gl-sku{font-size:12px;font-weight:600;color:var(--text);cursor:pointer}
.gantt-left .gl-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:5px;vertical-align:baseline;flex:none}
.gantt-left .gl-name{font-size:12px;color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gantt-left .gl-price{font-size:11px;color:var(--muted);margin-top:2px}
.gantt-left .gl-price b{font-weight:700}
.gantt-left .risk-badge{display:inline-block;margin-top:3px;font-size:10px;border-radius:4px;padding:1px 6px}
.risk-badge.rk-ok{display:none}
.risk-badge.rk-gate{background:#ffe9e9;color:#b32020}
.risk-badge.rk-warn{background:#fff4e0;color:#9a6400}
.risk-badge.rk-danger{background:var(--up);color:#fff}
.rk-ok{color:var(--muted)}
.rk-gate{color:#b32020}
.rk-warn{color:#9a6400}
.rk-danger{color:var(--up)}

/* 管理页 */
.tbl .gb-ly,.gantt-left .gb-ly{display:inline-block;background:var(--primary-soft);color:var(--primary-dark);border-radius:4px;padding:0 5px;font-size:11px;margin-right:3px}
.tbl .ops a{margin-right:10px;cursor:pointer}
.tbl .ops a.del{color:var(--up)}
.st-pill{display:inline-block;border-radius:20px;padding:1px 9px;font-size:11px;border:1px solid transparent}
.st-pill.st-active{background:rgba(23,166,124,.12);color:var(--down)}
.st-pill.st-expiring{background:rgba(245,158,11,.14);color:#b9790a}
.st-pill.st-upcoming{background:rgba(59,108,246,.12);color:#2a53cc}
.st-pill.st-ended{background:#eef1f6;color:var(--muted)}
.st-pill.st-disabled{background:#eef1f6;color:#aab1bd}

/* 项目甘特图 (team/gantt) 专属样式, 复用 .gantt-* 容器类 */
.pg-nodate{position:absolute;top:14px;font-size:12px;color:var(--muted);background:var(--bg);border:1px dashed var(--border);border-radius:6px;padding:3px 10px}
/* 节点颜色条: 一根条上按节点分段, 每段不同颜色, 段内显示节点名称 */
.pg-nodebar{position:absolute;top:10px;height:28px;border-radius:7px;overflow:hidden;background:var(--border-2);box-shadow:0 1px 2px rgba(16,24,40,.12)}
.pg-seg{position:absolute;top:0;height:100%;border-right:1px solid rgba(255,255,255,.55);box-sizing:border-box;cursor:pointer;transition:filter .12s}
.pg-seg:last-child{border-right:none}
.pg-seg:hover{filter:brightness(1.08)}
.pg-seg-lbl{position:absolute;top:50%;left:4px;right:4px;transform:translateY(-50%);font-size:11px;font-weight:600;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.45);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}
.pg-ndot{position:absolute;top:-3px;width:6px;height:6px;margin-left:-3px;border-radius:50%;border:2px solid #fff;box-shadow:0 1px 2px rgba(16,24,40,.3);z-index:4}
/* 子任务: 每条独立颜色条, 颜色用于区分子任务(不再关联进度) */
.pg-task{position:absolute;height:16px;border-radius:5px;background:var(--border-2);overflow:visible;box-shadow:0 1px 2px rgba(16,24,40,.14);cursor:pointer}
.pg-task-lbl{position:absolute;left:5px;top:0;font-size:10px;line-height:16px;font-weight:600;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.45);white-space:nowrap;max-width:320px;overflow:visible;pointer-events:none}
.gantt-left .pg-name{font-size:13px;font-weight:600;color:var(--text);cursor:pointer;display:flex;align-items:center;gap:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-bottom:4px}
.gantt-left .pg-dot{display:inline-block;width:8px;height:8px;border-radius:50%;flex:none}
.gantt-left .pg-owner{font-size:11px;color:var(--text-2);margin:0 0 4px 14px}
.gantt-left .pg-prog{height:6px;border-radius:3px;background:var(--border-2);overflow:hidden;margin:0 0 4px 14px}
.gantt-left .pg-prog-i{display:block;height:100%;border-radius:3px}
.gantt-left .pg-prog-txt{font-size:10px;color:var(--muted);margin:4px 0 0 14px}
.tk-toggle{display:inline-flex;align-items:center;gap:5px;font-size:13px;color:var(--text-2);cursor:pointer;user-select:none}
.tk-toggle input{width:15px;height:15px;accent-color:var(--primary);cursor:pointer}
/* 项目详情弹窗 */
.pg-detail-kv{display:inline-flex;gap:6px;align-items:baseline;margin:0 18px 8px 0;font-size:13px}
.pg-detail-kv span{color:var(--text-2)}
.pg-detail-kv b{color:var(--text);font-weight:600}
.pg-warn{background:#ffe9e9;color:#b32020;border:1px solid #ffb3b3;border-radius:8px;padding:8px 12px;margin:4px 0 12px;font-size:13px}
.pg-detail-sec{margin-top:14px}
.pg-detail-sec h4{font-size:13px;color:var(--text-2);margin:0 0 8px;font-weight:600}
.ms-item{display:flex;align-items:center;gap:10px;padding:7px 10px;border-radius:8px;font-size:13px;background:var(--bg);border:1px solid var(--border);margin-bottom:6px}
.ms-item.overdue{border-color:#ffb3b3;background:#fff5f5}
.ms-dot{width:9px;height:9px;border-radius:50%;flex:none}
.ms-dot.node{background:#8b5cf6}
.ms-dot.node.st-done{background:#1a9c5b}
.ms-dot.task{background:#f59e0b}
.ms-dot.task.st-done{background:#1a9c5b}
.ms-dot.task.overdue{background:#e34d59}
.ms-date{font-variant-numeric:tabular-nums;color:var(--text-2);width:96px;flex:none}
.ms-title{flex:1;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ms-st{color:var(--muted);font-size:12px;flex:none}

/* 弹窗表单 */
.modal.wide{width:min(95vw, 960px);max-width:960px}
.row2{display:flex;gap:12px}
.row2 .fld{flex:1}
.fld{margin-bottom:10px}
.fld label{display:block;font-size:12px;color:var(--text-2);margin-bottom:4px}
.fld input,.fld select,.fld textarea{width:100%;border:1px solid var(--border);border-radius:8px;padding:7px 10px;font-size:13px;background:var(--card);color:var(--text);font-family:inherit}
.fld textarea{resize:vertical;min-height:54px}
.param-box{display:flex;flex-wrap:wrap;gap:10px;background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:10px}
.param-box .pf{flex:1;min-width:150px}
.param-box .pf label{font-size:12px;color:var(--text-2);margin-bottom:4px;display:block}
.param-box .pf input{width:100%;border:1px solid var(--border);border-radius:8px;padding:7px 10px;font-size:13px;background:var(--card)}
/* SKU 选择区: 顶部 搜索框 + 操作栏(已选/全选/反选/清空), 下方为 SKU 卡片网格 */
.sku-panel{border:1px solid var(--border);border-radius:10px;padding:10px;background:var(--card)}
.sku-bar{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.sku-bar .f-q{flex:1;min-width:140px;height:34px;border:1px solid var(--border);border-radius:8px;padding:0 10px;font-size:13px;background:var(--bg);color:var(--text);font-family:inherit;box-sizing:border-box}
.sku-acts{display:flex;align-items:center;gap:6px;flex:0 0 auto}
.sku-cnt{font-size:12px;color:var(--muted);font-weight:500;white-space:nowrap;margin-right:2px}
.sku-btn{height:28px;padding:0 13px;border:1px solid var(--border);border-radius:7px;background:#fff;color:var(--text-2);font-size:12.5px;cursor:pointer;transition:.15s;white-space:nowrap;line-height:1}
.sku-btn:hover{border-color:var(--primary);color:var(--primary);background:var(--primary-soft)}
.sku-btn:active{transform:translateY(1px)}
.sku-btn.ghost{color:var(--muted)}
.sku-btn.ghost:hover{color:var(--primary);border-color:var(--primary);background:var(--primary-soft)}
.sku-opts{display:flex;flex-wrap:wrap;align-content:flex-start;gap:8px;max-height:248px;overflow:auto;padding-right:4px}
.sku-opt{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;min-width:180px;border:1px solid var(--border);border-radius:8px;cursor:pointer;font-size:13px;background:var(--card);transition:.15s;user-select:none;box-shadow:0 1px 2px rgba(16,24,40,.04)}
.sku-opt:hover{border-color:var(--primary);background:#f5f8ff}
.sku-opt:has(input:checked){border-color:var(--primary);background:var(--primary-soft);box-shadow:inset 0 0 0 1px var(--primary),0 1px 3px rgba(59,108,246,.12)}
.sku-opt input[type=checkbox]{margin:0;width:14px;height:14px;accent-color:var(--primary);cursor:pointer;flex-shrink:0;align-self:center}
.sku-opt .sku-code{align-self:center;font-weight:600;color:var(--primary-dark);font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px}
.sku-opt .sku-name{align-self:center;color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sku-empty{width:100%;text-align:center;padding:16px;color:var(--muted);font-size:12.5px}

/* 到手价拆解 */
.calc-chain{display:flex;align-items:center;flex-wrap:nowrap;gap:10px;margin:6px 0 12px;overflow-x:auto;padding-bottom:4px}
.cc{background:var(--bg);border:1px solid var(--border);border-radius:10px;padding:10px 14px;text-align:center;min-width:120px;flex:0 0 auto}
.cc-lbl{font-size:11px;color:var(--muted)}
.cc-val{font-size:18px;font-weight:700;color:var(--text);margin-top:2px}
.cc-arrow{color:var(--muted);font-size:18px;flex:0 0 auto}
.risk-line{font-size:13px;padding:8px 12px;border-radius:8px;margin-bottom:10px}
.risk-line.rk-ok{background:var(--bg);color:var(--text-2)}
.risk-line.rk-gate{background:#ffe9e9;color:#b32020}
.risk-line.rk-warn{background:#fff4e0;color:#9a6400}
.risk-line.rk-danger{background:#fde8e8;color:var(--up);font-weight:600}
.kv{font-size:13px;margin-bottom:8px}
.kv span{color:var(--muted);margin-right:8px}
.mini-tb{width:100%;border-collapse:collapse;font-size:12px}
.mini-tb th,.mini-tb td{border:1px solid var(--border);padding:8px 10px;text-align:left;vertical-align:top}
.mini-tb th{background:var(--bg);color:var(--text-2);font-weight:600}
.mini-tb td{white-space:nowrap}
.mini-tb td:last-child{white-space:normal}

/* =============================================================
   起始页 (route: start) — 居中搜索 + 自定义背景 + 常用网址
   ============================================================= */
.start-wrap{position:relative;margin:-18px -20px -40px;min-height:calc(100vh - var(--header-h));display:flex;flex-direction:column;align-items:center;justify-content:flex-start;padding:54px 24px 96px;overflow:hidden}
.start-bg{position:fixed;inset:0;background-color:#1e3c72;background-repeat:no-repeat;background-size:cover;background-position:center;transition:background-image .35s ease,background .35s ease;z-index:0}
.start-scrim{position:fixed;inset:0;background:radial-gradient(120% 90% at 50% 0%,rgba(0,0,0,.08),rgba(0,0,0,.46));z-index:1}
.start-inner{position:relative;z-index:2;width:100%;max-width:900px;text-align:center;color:#fff;zoom:1.2}
.start-clock{font-size:80px;font-weight:300;color:#fff;letter-spacing:1px;margin-bottom:20px;text-shadow:0 2px 14px rgba(0,0,0,.28)}
.start-search{display:flex;align-items:center;width:100%;max-width:760px;margin:0 auto;background:#fff;border-radius:999px;padding:9px 9px 9px 12px;box-shadow:0 12px 36px rgba(0,0,0,.24)}
.start-engine-select{position:relative;flex:0 0 auto;display:flex;align-items:center;align-self:stretch;margin:-8px 6px -8px -12px;padding:0 18px 0 14px;background:linear-gradient(135deg,#f9fafb 0%,#f1f5f9 100%);border-right:1px solid rgba(0,0,0,.05);border-radius:999px 0 0 999px;transition:background .15s}
.start-engine-select:hover{background:linear-gradient(135deg,#f1f5f9 0%,#e7ecf1 100%)}
/* 隐藏的原生 select 仅作值存储与 localStorage 恢复, 视觉由下方自定义下拉接管 */
.start-engine-select select{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.start-engine-select .eng-arrow{position:static;transform:none;pointer-events:none;color:#cbd5e1;flex:0 0 auto;transition:transform .2s}
.eng-trigger{display:flex;align-items:center;gap:4px;border:0;background:transparent;cursor:pointer;font-family:inherit;font-size:13px;font-weight:500;color:#1f2937;padding:0 0 0 6px;outline:none;white-space:nowrap}
.eng-trigger[aria-expanded="true"] .eng-arrow{transform:rotate(180deg)}
.eng-dropdown{position:absolute;top:calc(100% + 6px);left:0;min-width:96px;background:#fff;border-radius:10px;box-shadow:0 8px 22px rgba(0,0,0,.16);padding:5px 4px;z-index:30;display:none;overflow:hidden}
.eng-dropdown.show{display:block;animation:engPop .18s ease}
@keyframes engPop{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}
.eng-ico{width:18px;height:18px;object-fit:contain;flex:0 0 auto;border-radius:2px}
.eng-trigger .eng-ico{width:24px;height:24px}
.eng-trigger .eng-arrow{display:none}
.eng-option{display:flex;align-items:center;gap:8px;width:100%;text-align:left;border:0;background:transparent;cursor:pointer;font-family:inherit;font-size:13px;color:#1f2937;padding:6px 12px;border-radius:0;transition:padding-left .16s ease;margin:0}
.eng-option:last-child{margin-bottom:0}
.eng-option:hover{background:transparent;color:#1f2937;padding-left:18px}
.eng-option.active{background:transparent;color:#1f2937;font-weight:600;padding-left:18px}
.eng-dropdown.show .eng-option{animation:engItemIn .22s ease both}
@keyframes engItemIn{from{opacity:0;transform:translateX(-8px)}to{opacity:1;transform:translateX(0)}}
.eng-dropdown.show .eng-option:nth-child(1){animation-delay:.02s}
.eng-dropdown.show .eng-option:nth-child(2){animation-delay:.05s}
.eng-dropdown.show .eng-option:nth-child(3){animation-delay:.08s}
.eng-dropdown.show .eng-option:nth-child(4){animation-delay:.11s}
.eng-dropdown.show .eng-option:nth-child(5){animation-delay:.14s}
.eng-dropdown.show .eng-option:nth-child(6){animation-delay:.17s}
/* 防御性重置: 强制起始页搜索框引擎下拉组件无蓝色药丸, 覆盖任何旧缓存/外部样式 */
.start-engine-select,
.start-engine-select:hover{background:linear-gradient(135deg,#f9fafb 0%,#f1f5f9 100%) !important}
.start-engine-select .eng-trigger,
.start-engine-select .eng-trigger:hover,
.start-engine-select .eng-trigger:focus,
.start-engine-select .eng-trigger:active{background:transparent !important;background-color:transparent !important;background-image:none !important;color:#1f2937 !important;box-shadow:none !important;border:0 !important}
.start-engine-select .eng-option,
.start-engine-select .eng-option:hover,
.start-engine-select .eng-option.active,
.start-engine-select .eng-option:focus,
.start-engine-select .eng-option:active{background:transparent !important;background-color:transparent !important;background-image:none !important;color:#1f2937 !important;border-radius:0 !important;box-shadow:none !important;border:0 !important}
.start-search>svg{display:none}
.start-search input{flex:1;min-width:0;border:0;outline:none;background:transparent;font-size:16px;color:#1f2937;padding:12px}
.start-search > button{flex:0 0 auto;border:0;cursor:pointer;background:var(--primary);color:#fff;font-size:15px;font-weight:600;padding:12px 32px;border-radius:999px;font-family:inherit;transition:.15s}
.start-search > button:hover{background:var(--primary-dark)}
.start-cat-tabs{display:flex;justify-content:center;flex-wrap:wrap;gap:10px;margin:28px 0 10px}
.start-cat-tab{padding:6px 18px;border-radius:999px;font-size:13px;font-weight:600;color:rgba(255,255,255,.85);background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.24);cursor:pointer;transition:.18s;font-family:inherit}
.start-cat-tab:hover{background:rgba(255,255,255,.26);color:#fff}
.start-cat-tab.active{background:#fff;color:#1f2937;border-color:#fff;box-shadow:0 4px 14px rgba(0,0,0,.2)}
/* 常用网址区：暗色半透明遮罩(毛玻璃) 增强可读性并与背景图分隔 */
.start-links-wrap{width:100%;max-width:760px;margin:18px auto 0;text-align:left;background:rgba(0,0,0,.06);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);border-radius:18px;padding:16px 18px;box-shadow:0 6px 20px rgba(0,0,0,.12)}
.start-cat-group{display:none}
.start-cat-group.active{display:block}
.start-links{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:12px;max-width:760px;margin:0}
.start-link{display:flex;flex-direction:column;align-items:center;gap:7px;padding:10px 10px;border-radius:18px;background:transparent;border:1px solid transparent;text-decoration:none;color:#fff;transition:.18s}
.start-link:hover{background:rgba(255,255,255,.12);transform:translateY(-2px);color:#fff}
.start-link .sl-ico{width:34px;height:34px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:700;color:#fff;box-shadow:0 2px 8px rgba(0,0,0,.18)}
.start-link .sl-name{font-size:14px;font-weight:500;line-height:1.3;max-width:100%;overflow:visible;text-overflow:clip;white-space:nowrap}
.start-link .sl-ico-img{width:34px;height:34px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 8px rgba(0,0,0,.18)}
.start-link .sl-ico-img img{width:100%;height:100%;object-fit:cover;display:block}
.start-link.start-link-text .sl-name{font-size:15px;font-weight:600;padding:8px 6px}

.start-tools{position:absolute;right:18px;bottom:16px;z-index:5;display:flex;gap:8px}
.start-tools .st-btn{padding:6px 14px;border-radius:999px;font-size:12px;cursor:pointer;border:1px solid rgba(255,255,255,.3);background:rgba(0,0,0,.3);color:#fff;text-decoration:none;font-family:inherit;line-height:1.6}
.start-tools .st-btn:hover{background:rgba(0,0,0,.48);color:#fff}
.start-tools .st-btn[disabled]{opacity:.6;cursor:default}
/* 起始页底部居中备案信息: 与右下角「网址管理/起始页设置」保持同一底边基线 */
.start-beian{position:absolute;left:50%;bottom:16px;transform:translateX(-50%);z-index:5;display:flex;gap:14px;align-items:center;justify-content:center;font-size:12px;color:rgba(255,255,255,.72);text-shadow:0 1px 2px rgba(0,0,0,.35);pointer-events:none;white-space:nowrap}
.start-beian .sb-icp,.start-beian .sb-pol{display:inline-block}
@media (max-width:640px){
  .start-wrap{padding:26px 14px 84px}
  /* 移动端窄屏取消整体放大, 避免内容被 overflow:hidden 裁切 */
  .start-inner{zoom:1}
  .start-clock{font-size:54px;margin-bottom:16px}
  .start-cat-tabs{margin:18px 0 8px}
  .start-links{gap:10px}
  .start-search{padding:5px 5px 5px 5px}
  .start-search > button{padding:9px 18px}
  .start-engine-select{margin:-5px 5px -5px -5px;padding:0 16px 0 10px}
  .start-engine-select select{font-size:13px}
  /* 窄屏: 备案信息上移, 避免与右下角工具按钮重叠 */
  .start-beian{bottom:54px;flex-direction:column;gap:3px;font-size:11px;white-space:normal}
}

/* 浅色背景(如 云雾白 #EDEFF4): 文字与控件反转为深色以保证可读性 */
.start-light .start-inner{color:#1f2937}
.start-light .start-clock{color:#1f2937;text-shadow:0 2px 14px rgba(255,255,255,.55)}
.start-light .start-cat-tab{color:rgba(31,41,55,.85);background:rgba(255,255,255,.6);border-color:rgba(31,41,55,.16)}
.start-light .start-cat-tab:hover{background:#fff;color:#1f2937}
.start-light .start-cat-tab.active{background:#1f2937;color:#fff;border-color:#1f2937;box-shadow:0 4px 14px rgba(0,0,0,.12)}
/* 浅色背景上, 网址区遮罩仍为暗色, 故文字反转为白色以保证可读 */
.start-light .start-links-wrap{background:rgba(31,41,55,.10)}
.start-light .start-link{background:transparent;border-color:transparent;color:#fff}
.start-light .start-link:hover{background:rgba(255,255,255,.2);color:#fff}
.start-light .start-link .sl-name{color:#fff}
.start-light .start-link .sl-ico{box-shadow:0 2px 8px rgba(0,0,0,.1)}
.start-light .start-tools .st-btn{background:rgba(31,41,55,.12);border-color:rgba(31,41,55,.2);color:#1f2937}
.start-light .start-tools .st-btn:hover{background:rgba(31,41,55,.22);color:#1f2937}
.start-light .start-beian{color:rgba(31,41,55,.7);text-shadow:none}
.start-light .start-scrim{background:radial-gradient(120% 90% at 50% 0%,rgba(0,0,0,.02),rgba(0,0,0,.10))}

/* 起始页顶栏：真正透明，透出同一张背景图（背景图层 .start-bg 已改为 position:fixed 铺满视口，含顶栏区域） */
body.start-transparent .header{background:transparent;border-bottom-color:transparent;box-shadow:none;position:sticky;top:0;z-index:40}
/* 起始页：直接隐藏顶部导航 / LOGO / 轮播 / 店铺切换，仅保留右上角账户菜单 */
body.start-transparent .sidebar{display:none}
body.start-transparent .topnav{display:none}
body.start-transparent .shop-switch{display:none}
body.start-transparent.no-sidebar .header{padding-left:20px}
body.start-transparent .brand-home img{filter:brightness(0) invert(1) drop-shadow(0 1px 2px rgba(0,0,0,.25))}
/* 顶栏元素隐藏后，上移起始页主体，避免顶部大片留白 */
body.start-transparent .start-wrap{padding-top:28px}
body.start-transparent .userbox:hover{background:rgba(255,255,255,.1)}
body.start-transparent .uname{color:#fff}
body.start-transparent .urole{color:rgba(255,255,255,.72)}
body.start-transparent .start-link{background:transparent;border-color:transparent;box-shadow:none}
body.start-transparent .start-link:hover{background:rgba(255,255,255,.12)}
body.start-transparent .start-link-add{background:transparent;border-color:transparent}
/* 起始页分区文字导航：置于搜索框上方，替代原顶部导航(分区切换器) */
body.start-transparent .start-footnav{display:flex;justify-content:center;gap:30px;flex-wrap:wrap;margin:4px 0 22px;font-size:16px}
body.start-transparent .start-footnav a{position:relative;color:rgba(255,255,255,.82);text-decoration:none;font-weight:700;font-size:16px;padding:5px 8px;transition:color .2s,transform .2s;text-shadow:0 1px 3px rgba(0,0,0,.35)}
body.start-transparent .start-footnav a::after{content:"";position:absolute;left:50%;right:50%;bottom:0;height:2px;background:#fff;border-radius:2px;transition:left .22s ease,right .22s ease}
body.start-transparent .start-footnav a:hover{color:#fff;transform:translateY(-2px)}
body.start-transparent .start-footnav a:hover::after{left:8px;right:8px}
/* 「数据分析」热门标记：小号火苗，紧跟文字右上角 */
/* 数据分析导航「热门」标记: 置于该项右上角的角标(而非文字右侧) */
.sec-hot{position:absolute;top:-4px;right:-8px;font-size:13px;line-height:1;filter:drop-shadow(0 1px 2px rgba(0,0,0,.3));user-select:none;pointer-events:none}
body.start-transparent.start-light .sec-hot{filter:none}
body.start-transparent .userbox{text-shadow:0 1px 3px rgba(0,0,0,.45)}

/* 浅色背景时顶栏同样透明，仅把顶部遮罩换成白色渐变以保证深色文字可读 */
body.start-transparent.start-light .header{background:transparent;border-bottom-color:transparent;box-shadow:none;position:sticky;top:0;z-index:40}
body.start-transparent.start-light .brand-home img{filter:none}
/* 浅色背景：顶栏文字/按钮统一为深色（半透明深灰底 + 深字） */
body.start-transparent.start-light .topnav a,
body.start-transparent.start-light .topnav-dl{color:#1f2937;background:rgba(31,41,55,.12);border-color:transparent}
body.start-transparent.start-light .topnav a:hover,
body.start-transparent.start-light .topnav-dl:hover{background:rgba(31,41,55,.2);border-color:transparent;color:#1f2937}
body.start-transparent.start-light .topnav a.active{background:rgba(31,41,55,.28);border-color:transparent;color:#1f2937}
body.start-transparent.start-light .header-marquee{background:transparent;border-color:transparent}
body.start-transparent.start-light .marquee-item,
body.start-transparent.start-light .marquee-text{color:#374151}
body.start-transparent.start-light .marquee-tag{background:var(--primary);color:#fff}
body.start-transparent.start-light .shop-switch{background:transparent;border-color:transparent;color:#4b5563}
body.start-transparent.start-light .shop-switch svg{color:#1f2937}
body.start-transparent.start-light .shop-switch select{color:#1f2937}
body.start-transparent.start-light .userbox:hover{background:rgba(31,41,55,.06)}
body.start-transparent.start-light .uname{color:#1f2937}
body.start-transparent.start-light .urole{color:rgba(31,41,55,.62)}
body.start-transparent.start-light .start-link:hover{background:rgba(0,0,0,.06)}
body.start-transparent.start-light .start-footnav a{color:rgba(31,41,55,.72);text-shadow:none}
body.start-transparent.start-light .start-footnav a::after{background:#1f2937}
body.start-transparent.start-light .start-footnav a:hover{color:#1f2937}
body.start-transparent.start-light .userbox{text-shadow:none}


/* ---- 授权管理页 · 起始页设置卡片 ---- */
.ss-sec-t{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px;font-weight:600;color:var(--text-2);margin:0 0 12px}
.lnk-count{font-weight:400;color:var(--muted);font-size:12px;white-space:nowrap}
.startset-presets{display:flex;flex-wrap:wrap;gap:12px}
.startset-bg{position:relative;width:136px;border-radius:10px;overflow:hidden;border:2px solid var(--border);cursor:pointer;background:var(--bg);transition:.15s}
.startset-bg:hover{border-color:var(--primary)}
.startset-bg.cur{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft)}
.startset-bg .sb-prev,.startset-bg .sb-img{display:block;width:100%;height:76px;object-fit:cover}
.startset-bg .sb-name{font-size:12px;padding:5px 8px;color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.startset-bg .sb-del{position:absolute;top:4px;right:4px;width:20px;height:20px;line-height:18px;text-align:center;border-radius:50%;background:rgba(0,0,0,.55);color:#fff;font-size:14px;cursor:pointer}
.startset-bg .sb-del:hover{background:var(--up)}
.ss-upload{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:12px}
.ss-upload .ipt-file{flex:0 0 auto}
.ss-light-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:14px}
.ss-switch{display:inline-flex;align-items:center;gap:8px;cursor:pointer;user-select:none;font-size:13px;color:var(--text);font-family:inherit}
.ss-switch input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.ss-switch-track{position:relative;width:40px;height:22px;border-radius:999px;background:var(--line,#cbd5e1);transition:background .18s;flex:0 0 auto}
.ss-switch-track .ss-switch-knob{position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.2);transition:transform .18s}
.ss-switch input:checked + .ss-switch-track{background:var(--primary)}
.ss-switch input:checked + .ss-switch-track .ss-switch-knob{transform:translateX(18px)}
.ss-switch-label{line-height:1.2}
.ss-home-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:16px}
.ss-seg-label{font-size:13px;color:var(--text-2);font-family:inherit}
.ss-seg{display:inline-flex;border:1px solid var(--border,#e5e7eb);border-radius:999px;overflow:hidden;background:var(--bg,#fff)}
.ss-seg input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
.ss-seg-btn{display:inline-block;padding:6px 18px;font-size:13px;color:var(--text-2);cursor:pointer;user-select:none;font-family:inherit;transition:background .15s,color .15s}
.ss-seg input:checked + .ss-seg-btn{background:var(--primary);color:#fff}
.ss-seg input:focus-visible + .ss-seg-btn{outline:2px solid var(--primary-soft);outline-offset:-2px}
.lnk-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.lnk-row .lnk-no{width:20px;flex:0 0 auto;font-size:12px;color:var(--muted);text-align:right}
.lnk-row input[type=text]{flex:1 1 0;min-width:0;padding:7px 10px;border:1px solid var(--border);border-radius:8px;font-size:13px;outline:none;font-family:inherit}
.lnk-row input[type=text]:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft)}
.lnk-row .lnk-name{max-width:190px}
.lnk-row .lnk-cat{max-width:140px}
.lnk-row .btn{padding:6px 10px;font-size:13px;line-height:1.4}
.lnk-row .lnk-rm{color:var(--up)}
.lnk-row .lnk-ico{width:34px;height:34px;flex:0 0 auto;border-radius:8px;border:1px solid var(--border);background:var(--bg);overflow:hidden;display:flex;align-items:center;justify-content:center;position:relative}
.lnk-row .lnk-ico img{width:100%;height:100%;object-fit:cover;display:block}
.lnk-row .lnk-ico .lnk-ico-x{position:absolute;top:-5px;right:-5px;width:16px;height:16px;line-height:14px;text-align:center;border-radius:50%;background:var(--up);color:#fff;font-size:11px;cursor:pointer}
.lnk-row .lnk-ico .lnk-ico-empty{font-size:11px;color:var(--muted)}
.lnk-row .lnk-upload{white-space:nowrap}
.lnk-row .lnk-only{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--text-2);white-space:nowrap;cursor:pointer;user-select:none}
.lnk-row .lnk-only input{margin:0;width:14px;height:14px;accent-color:var(--primary);cursor:pointer}
@media (max-width:640px){ .lnk-row{flex-wrap:wrap} .lnk-row .lnk-name{max-width:none} }

/* 常用网址：分类导航 + 单分类编辑 (授权管理页) */
.lnk-edit{display:flex;gap:16px;align-items:flex-start}
.lnk-cats{width:190px;flex:0 0 190px;display:flex;flex-direction:column;gap:6px;max-height:440px;overflow:auto;padding:2px 4px 2px 0}
.lnk-cat{display:flex;align-items:center;gap:8px;padding:9px 12px;border:1px solid var(--border);border-radius:9px;background:var(--card);cursor:pointer;font-size:13px;transition:background .12s,border-color .12s;user-select:none}
.lnk-cat:hover{background:var(--card-2,#f3f6fb);border-color:var(--primary-soft)}
.lnk-cat.active{background:var(--primary-soft);border-color:var(--primary);color:var(--primary);font-weight:600}
.lnk-cat-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lnk-cat-count{flex:0 0 auto;font-size:11px;color:var(--muted);background:var(--bg);border-radius:10px;padding:1px 7px}
.lnk-cat.active .lnk-cat-count{background:#fff;color:var(--primary)}
.lnk-pane{flex:1 1 0;min-width:0;border:1px solid var(--border);border-radius:12px;background:var(--bg);overflow:hidden}
.lnk-pane-hd{display:flex;align-items:center;gap:10px;padding:10px 12px;background:var(--card-2,#f8fafc);border-bottom:1px solid var(--border)}
.lnk-group-name{flex:0 0 auto;width:170px;max-width:46%;padding:6px 10px;border:1px solid var(--border);border-radius:8px;font-size:13px;font-weight:600;outline:none;font-family:inherit;background:var(--card)}
.lnk-group-name:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-soft)}
.lnk-group-count{font-size:12px;color:var(--muted);white-space:nowrap}
.lnk-group-actions{margin-left:auto;display:flex;gap:8px}
.lnk-pane-body{padding:10px 12px;display:flex;flex-direction:column;gap:8px}
.lnk-group-empty{font-size:12px;color:var(--muted);padding:10px 2px}
.lnk-row{margin-bottom:0;background:var(--card);border:1px solid var(--border);border-radius:9px;padding:7px 9px;cursor:grab}
.lnk-row.dragging{opacity:.5;cursor:grabbing}
.lnk-row.drop-before{border-top:2px solid var(--primary)}
.lnk-row.drop-after{border-bottom:2px solid var(--primary)}
.lnk-row .lnk-name{width:170px;max-width:170px;flex:0 0 170px}
.lnk-row .lnk-url{flex:1 1 0;min-width:0}
.lnk-grip{flex:0 0 auto;color:var(--muted);cursor:grab;font-size:16px;line-height:1;user-select:none;padding:0 2px}
@media (max-width:640px){
  .lnk-edit{flex-direction:column}
  .lnk-cats{width:100%;flex:0 0 auto;max-height:none;flex-direction:row;flex-wrap:wrap;padding:0 0 4px}
  .lnk-cat{width:auto;flex:0 0 auto}
  .lnk-pane-hd{flex-wrap:wrap}
  .lnk-group-name{width:100%;max-width:100%}
  .lnk-group-actions{margin-left:0;width:100%}
  .lnk-row .lnk-name{max-width:none;flex-basis:100%}
  .lnk-row .lnk-url{flex-basis:100%}
}

/* =============================================================
   v1.8.521 设计系统升级：全局排版节奏 / 配色 / 间距统一
   原则: 克制用色、收敛字号层级、统一垂直间距节奏、精致细节。
   本块物理定义在文件最末, 同特异性靠后胜出, 选择性精修既有骨架,
   不改 --sidebar-w / --header-h 等布局尺寸, 不做回流性改动。
   ============================================================= */
:root{
  /* —— 字号层级 (收敛散落的 11~15.5px 为 5 档) —— */
  --fs-caption:11.5px;   /* 注释/角标/次要说明 */
  --fs-small:12px;       /* 表头/标签/元信息 */
  --fs-body:13px;        /* 表格正文/按钮/筛选 */
  --fs-md:14px;          /* 导航/卡片标题上下文/正文主 */
  --fs-title:15.5px;     /* 卡片区块标题 */
  --fs-kpi:25px;         /* KPI 主数字 */
  /* —— 间距节奏 (统一垂直/水平留白) —— */
  --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px; --sp-5:20px; --sp-6:24px;
  /* —— 圆角阶梯 —— */
  --r-sm:6px; --r-md:8px; --r-lg:12px;
  /* —— 更精细的中性灰(在旧 --text/--muted 基础上细化对比) —— */
  --ink:#111827;          /* 主文字(近黑, 增强对比) */
  --ink-2:#3f4a5c;        /* 次级文字 */
  --ink-3:#667085;        /* 说明文字 */
  --line:#e6eaf1;         /* 常规分割线 */
  --line-soft:#f1f4f9;    /* 极淡分割线/内部边 */
}
/* 侧边栏: 白底 → 极淡蓝灰底, 强化与内容区层次, 边框更细 */
.sidebar{background:#fbfcfe;border-right:1px solid var(--line-soft)}
.sidebar .brand{border-bottom:1px solid var(--line-soft)}
/* 品牌区: 抬高、居中留白节奏 */
.sidebar .brand{background:linear-gradient(180deg,#fff,#fbfcfe)}
.brand-home{padding:4px 0}
/* 侧边栏导航分组: 分组标题留白 + 项间距更舒展 */
.nav{padding:12px 10px 24px}
.nav-group{margin-bottom:6px}
.nav-group[data-mod] + .nav-group[data-mod]:not([data-gid="g0"]){margin-top:2px}
.nav-item,.nav-parent{padding:8.5px 11px;border-radius:var(--r-md);font-size:var(--fs-md);gap:11px}
.nav-ico{width:17px;height:17px}
/* 激活态: 淡主色底 + 主色字, 左侧加细色条强化"当前所在" */
.nav-item.active,.nav-child.active{background:var(--primary-soft);color:var(--primary-dark);font-weight:600}
.nav-item.active::before{content:"";position:absolute;left:-10px;top:20%;bottom:20%;width:3px;border-radius:2px;background:var(--primary)}
/* 父级展开指示: 激活分组名带主色 */
.nav-parent.has-active{color:var(--primary-dark)}
.nav-parent.has-active .nav-ico{opacity:1;color:var(--primary)}
.nav-children{padding:3px 0 4px}
.nav-child{padding:7px 12px 7px 42px;font-size:13px;margin-top:2px;border-radius:7px}
.nav-child::before{left:23px;width:5px;height:5px;background:#ccd4e0}
.nav-child.active::before{background:var(--primary);box-shadow:0 0 0 3px var(--primary-soft)}
/* 侧边栏底部: 更克制 */
.sidebar-foot{border-top:1px solid var(--line-soft);font-size:11px;line-height:1.8}
/* 顶栏: 加轻微阴影层次, 与侧栏融合 */
.header{background:#fff;border-bottom:1px solid var(--line-soft);box-shadow:0 1px 2px rgba(16,24,40,.02)}
/* 顶部分区切换: 由"蓝描边胶囊"改为更高级的"ghost + 激活实心胶囊"精致版 */
.topnav a,.topnav-dl{font-size:13px;font-weight:600;border-radius:999px;padding:5px 13px;letter-spacing:.2px}
/* 内容区: 统一呼吸边距 */
.content{padding:20px 22px 48px}
/* 卡片: 更柔和的边框与圆角层次 */
.card{border-color:var(--line-soft);border-radius:var(--r-lg);box-shadow:0 1px 2px rgba(16,24,40,.02),0 3px 10px rgba(16,24,40,.03)}
.card-hd{padding:14px 18px;gap:12px}
.card-hd h3{font-size:var(--fs-title);font-weight:650;letter-spacing:.2px;color:var(--ink)}
.card-hd .sub{font-size:var(--fs-small);color:var(--ink-3)}
.card-bd{padding:18px}
/* 卡片垂直节奏统一 (图表模块间一致留白) */
.card+.card,.card + .grid-2,.grid-2 + .card{margin-top:16px}
.grid-2,.grid-3{gap:16px;margin-top:16px}
/* 分区标题(首页/图表模块分组): 统一定义, 标题加大、副题降低、节奏统一 */
.sec-hd{margin:22px 0 14px;padding-left:13px}
.sec-hd::before{width:4px;border-radius:3px;background:linear-gradient(180deg,#6aa0ff,#3b6cf6);left:0}
.sec-hd h2{font-size:var(--fs-title);font-weight:700;color:var(--ink);letter-spacing:.4px}
.sec-hd .sub{font-size:var(--fs-small);color:var(--ink-3)}
/* 筛选条(render_filterbar): 卡片化但内边距更统一, 下拉/控件高度咬合 */
.fb-bar .card-bd{padding:14px 18px}
.filters{gap:12px}
.fld{gap:5px}
.fld>label{font-size:11.5px;color:var(--ink-3);letter-spacing:.2px;font-weight:600}
/* 输入/选择/按钮: 统一到 --fs-body + 更精致边框圆角 */
input[type=text],input[type=password],input[type=date],input[type=number],select,textarea,
input.inp,.sel,.btn,.btn-group button,.month-tile{font-size:var(--fs-body)}
select,input.inp,.sel{height:33px;border-radius:var(--r-md)}
.btn{height:33px;border-radius:var(--r-md);padding:0 14px;font-size:var(--fs-body)}
.btn.primary{letter-spacing:.3px}
.btn-group{border-radius:var(--r-md)}
.btn-group button{height:31px;border-radius:0}
/* KPI: 数字更大更清晰, 标签更克制 */
.kpi{padding:15px 16px;border-color:var(--line-soft);border-radius:var(--r-lg)}
.kpi-v{font-size:var(--fs-kpi);font-weight:700;letter-spacing:-.5px;color:var(--ink)}
.kpi-t{font-size:var(--fs-small);color:var(--ink-3);font-weight:500}
.kpi-c{font-size:11.5px;color:var(--ink-3)}
/* 表格: 表头更轻、正文字号统一、行高呼吸 */
table.tbl{font-size:var(--fs-body)}
table.tbl th{font-size:var(--fs-small);color:var(--ink-2);letter-spacing:.2px;background:#fafbfd}
table.tbl th,table.tbl td{padding:9px 12px}
/* 徽章/标签: 字号统一, 圆角柔和 */
.badge,.st-pill,.kwtag~*{font-size:11.5px}
/* 空态/提示: 居中留白统一 */
.empty{padding:54px 20px}
/* 弹窗: 更精致圆角与层次 */
.modal{border-radius:var(--r-lg)}
/* 全局 tabular 数字覆盖到更多数值容器 */
.num,td.num,th.num,.kpi-v,.compact,.mono,table.tbl td[data-kind="money"],table.tbl td[data-kind="rate"],table.tbl td[data-kind="cnt"]{font-variant-numeric:tabular-nums}
/* 中英混排微调: 中文后英文/数字默认不加宽, 保持自然 */
.crumb{font-size:16px;font-weight:650;letter-spacing:.2px}

/* =============================================================
   v1.8.522 删除图表标题/卡片标题边上的副标题(灰色说明小字)
   父级反馈: "系统大部分图表标题边上都有一个副标题, 删除这个, 不需要"
   原 v1.8.517 起的 .sec-hd .sub / .card-hd .sub 一刀切隐藏, 不渲染不占位。
   JS 维护的副题(dashboard 的 lv2Sub1/2 等)DOM 仍在, setTextContent 仍生效,
   只是不可见——后续如需恢复可见性, 把这条 display:none 删掉即可。
   .sec-hd/.card-hd 原 flex 布局会把 .sub 空间让给主标题(更紧凑)。
   物理追加在最末, 同特异性靠后胜出。
   ============================================================= */
.sec-hd .sub,.card-hd .sub{display:none}

/* =============================================================
   v1.8.528 表格表头统一淡蓝背景
   父级反馈: "给所有页面的这类表格图表的表头都加一个淡蓝色"
   将 table.tbl th 背景从 v1.8.521 的 #fafbfd 改为 --info-soft(#eaf0ff),
   与表头悬停/排序态同色系但更淡, 全站数据表格表头视觉统一。
   物理追加在最末, 同特异性靠后胜出; 不影响 th.num / th[data-sort]
   等既有状态色(因其特异性相同或更高, 或靠后定义)。
   ============================================================= */
table.tbl th{background:var(--info-soft)}

/* =============================================================
   v1.8.632 卡片头部右侧筛选控件「标签与控件同行」
   父级反馈: 关键词趋势图的「关键词」标签独占一行、下拉掉到第二行,
   与右侧的图表类型按钮不在同一水平线, 看着不整齐。
   根因: .fld 默认 flex-direction:column(label 在上), 且 .fld select 带
        width:100%, 放进 .card-hd .right 这种 shrink-to-fit 的 flex 容器里
        必然换行 + 撑开。
   处理: 仅限定在 .card-hd .right 内改为横排(label 与控件同行、nowrap、
        控件宽 auto 由内联 min/max-width 决定), 不触碰筛选条与表单里的 .fld。
   仅 2 处使用该结构(关键词来源页·关键词趋势、流失分析页·竞品SKU), 统一整齐。
   物理追加在最末, 同特异性靠后胜出。
   ============================================================= */
.card-hd .right .fld{display:flex;flex-direction:row;align-items:center;gap:6px;margin:0}
.card-hd .right .fld>label{display:inline-block;white-space:nowrap;margin:0;font-size:11.5px;color:var(--ink-3);font-weight:600;letter-spacing:.2px}
.card-hd .right .fld>select,.card-hd .right .fld>input{width:auto;flex:0 0 auto}
.card-hd .right .fld>select{height:32px;padding:0 10px}

/* =============================================================
   v1.8.633 授权管理「模块开关」列表
   5 个模块(促销监控/团队协作/知识库/资料下载/热卖榜单)各一行:
   左=模块名+说明, 右=启停开关; 「资料下载」「热卖榜单」两行在开关
   下方内嵌各自配置(下载链接 / 4 条榜单网址)。
   物理追加在最末, 同特异性靠后胜出。
   ============================================================= */
.mod-list{display:flex;flex-direction:column;gap:12px}
.mod-row{border:1px solid var(--line);border-radius:var(--r-md);padding:14px 16px;background:var(--card)}
.mod-head{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.mod-info{flex:1;min-width:220px}
.mod-name{font-size:13.5px;font-weight:650;color:var(--ink);line-height:1.4}
.mod-desc{font-size:12px;color:var(--ink-3);margin-top:3px;line-height:1.5}
.mod-extra{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:12px;padding-top:12px;border-top:1px dashed var(--line-soft)}
.mod-extra-t{font-size:12px;font-weight:600;color:var(--ink-3);white-space:nowrap}
.mod-extra>input{flex:1;min-width:240px;width:auto;height:32px;border:1px solid var(--border);border-radius:8px;padding:0 10px;font-size:13px;background:var(--card);color:var(--text);font-family:inherit;box-sizing:border-box}
.mod-extra-col{margin-top:12px;padding-top:12px;border-top:1px dashed var(--line-soft)}
.mod-hot-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:8px}
.mod-hot-grid>input{width:100%;height:32px;border:1px solid var(--border);border-radius:8px;padding:0 10px;font-size:13px;background:var(--card);color:var(--text);font-family:inherit;box-sizing:border-box}
.mod-btns{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px}
@media(max-width:720px){.mod-hot-grid{grid-template-columns:1fr}}
