* { margin: 0; padding: 0; box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
/* v20260914s 自动填充样式：主应用一律白底深字。
   原规则（v20260914j 为登录页深色主题写的 #202839 深底）是全局的 → 误伤所有浅色表单：
   从浏览器历史下拉里选一个值会触发 :-webkit-autofill，输入框当场变黑底白字（正哥报「执行人选人就变黑」）。
   现在只把深色规则限定在登录页 .lg-wrap 内。 */
input:-webkit-autofill, textarea:-webkit-autofill, select:-webkit-autofill {
  -webkit-text-fill-color: var(--text, #1F2329);
  caret-color: var(--text, #1F2329);
  -webkit-box-shadow: 0 0 0 1000px #fff inset;
  transition: background-color 99999s ease-in-out 0s;
}
.lg-wrap input:-webkit-autofill, .lg-wrap textarea:-webkit-autofill {
  -webkit-text-fill-color: #fff;
  caret-color: #fff;
  -webkit-box-shadow: 0 0 0 1000px #202839 inset;
}
:root {
  /* ===== 设计规范 v1.0（design-system.md）===== */
  /* 品牌橙 5 档 */
  --brand-50: #FFF1EA; --brand-100: #FFE0D1; --brand-500: #FF6A3D;
  --brand-600: #E85325; --brand-700: #C2441A;
  /* 中性色 */
  --text-1: #1F2329; --text-2: #646A73; --text-3: #8F959E;
  --bg: #f5f6f8; --card: #ffffff; --line: #e5e6eb; --fill: #F2F3F5;
  /* 语义色 5 个 */
  --success: #1E7F3C; --warning: #B26A00; --danger: #D93A3A; --info: #185FA5;
  /* 字号四档 */
  --fs-display: 20px; --fs-title: 15px; --fs-body: 13px; --fs-caption: 11px;
  /* 间距四档 */
  --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px;
  /* 圆角 */
  --r-card: 12px; --r-btn: 10px; --r-tag: 999px;
  /* ===== 旧变量映射（渐进替换，兼容存量代码）===== */
  --brand: var(--brand-600);
  --brand2: #ff3d6e;
  --text: var(--text-1);
  --muted: var(--text-3);
  --primary: var(--info);
  --green: var(--success);
  --red: var(--danger);
  /* v20260911g 补齐历史遗留的 4 个「设计 token」——此前它们在 :root 里从未定义，
     而 app.js 内联样式里有 49 处裸用（--color-border-secondary 28 次、--color-text-secondary 16 次、
     --color-background-primary 3 次、--color-text-tertiary 2 次），导致：
       · border:1px solid var(--color-border-secondary) → 整条 border 简写在计算值阶段失效 → 边框不渲染
       · background:var(--color-background-primary) → 回退透明 → 卡片没白底
       · color:var(--color-text-secondary/-tertiary) → 回退 inherit → 次级/三级文字全变纯黑，层次丢失
     这里一次性映射到既有语义色，全站 49 处立即恢复正常。 */
  --color-border-secondary: var(--line);
  --color-border-tertiary: var(--line);
  --color-background-primary: var(--card);
  --color-text-secondary: var(--text-2);
  --color-text-tertiary: var(--text-3);
}
body { font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif; background: var(--bg); color: var(--text); font-size: 14px; }
button { font-family: inherit; cursor: pointer; }
input, select, textarea { font-family: inherit; font-size: 14px; padding: 8px 10px; border: 1px solid var(--line); border-radius: 8px; width: 100%; background: #fff; color: var(--text); }
input:focus, select:focus, textarea:focus { outline: none; border-color: var(--brand); }
.btn { background: var(--brand); color: #fff; border: none; padding: 9px 16px; border-radius: 8px; font-size: 14px; }
.btn:hover { opacity: .9; }
.btn.ghost { background: #fff; color: var(--text); border: 1px solid var(--line); }
.btn.ghost.danger { color: #e24b4a; border-color: #e24b4a; }
.btn.ghost.danger:hover { background: #e24b4a; color: #fff; }
.btn.sm { padding: 5px 10px; font-size: 12px; }
.btn.xs { padding: 2px 6px; font-size: 11px; }
.btn.primary-lg { background:#1D9E75; color:#fff; padding:12px 28px; font-size:15px; border-radius:10px; box-shadow:0 2px 8px rgba(29,158,117,.3); }
.btn.primary-lg:hover { background:#0F6E56; }
.btn.danger { background: #e24b4a; }

/* login */
.login-wrap { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #fff1ea, #ffe9ef); }
.login-card { background: #fff; padding: 36px 32px; border-radius: 16px; width: 340px; box-shadow: 0 8px 30px rgba(0,0,0,.06); }
.login-card h1 { font-size: 22px; text-align: center; margin-bottom: 4px; }
.login-card .sub { text-align: center; color: var(--muted); margin-bottom: 22px; font-size: 13px; }
.login-card .field { margin-bottom: 14px; }
.login-card .hint { text-align: center; color: var(--muted); font-size: 12px; margin-top: 14px; }
.wx-btn { background: #07c160; color: #fff; border: none; font-weight: 500; }
.wx-btn:hover { background: #06ad56; }

/* ===== v20260913aa 登录页重做：现场实景 + 毛玻璃双栏（左扫码 / 右验证码·密码） =====
   v20260914d 正哥三图定版：①整页 zoom .64 会把 12.5px 缩成 8px 看不见 →
   登录页所有小字字号按 ÷0.64 预放大（tab 26 / footer 22 / 品牌胶囊 22 / 输入 21），
   移动端(≤760px)媒体查询里再收回常规尺寸；②左栏加宽让右栏输入框短一点；
   ③二维码下方小字默认隐藏（#lgQrTip 加 hidden，仅异常/超时才显示）。 */
.lg-wrap { position: relative; min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 36px 18px; background: #07080C; overflow: hidden; }
.lg-bg { position: absolute; inset: -2%; background: url('/hero-poster.jpg') center/cover no-repeat; filter: saturate(.82) brightness(.46) contrast(1.06); }
.lg-veil { position: absolute; inset: 0; background: radial-gradient(130% 95% at 80% 6%, rgba(249,115,22,.20), rgba(0,0,0,0) 58%), linear-gradient(168deg, rgba(8,7,11,.80) 0%, rgba(6,8,15,.76) 46%, rgba(4,6,11,.93) 100%); }
.lg-stage { position: relative; z-index: 2; width: min(790px, 100%); zoom: .64; }
.lg-card { display: flex; background: rgba(17,20,29,.72); backdrop-filter: blur(24px) saturate(1.25); -webkit-backdrop-filter: blur(24px) saturate(1.25); border: 1px solid rgba(255,255,255,.10); border-radius: 24px; box-shadow: 0 34px 90px rgba(0,0,0,.6), inset 0 1px 0 rgba(255,255,255,.07); padding: 42px 44px; }
/* v20260914f 左右两栏对称：左栏 314 = 二维码 194 + 两侧各 60，右栏 padding-left 也 60
   → 二维码↔分隔线 与 分隔线↔表单 的留白相等；同时右栏内容宽 328 不变（输入框仍是 208px） */
.lg-left { width: 314px; flex: none; padding-right: 0; border-right: 1px solid rgba(255,255,255,.09); display: flex; flex-direction: column; align-items: center; justify-content: center; }
.lg-right { flex: 1; min-width: 0; padding-left: 60px; }
.lg-h { color: #fff; font-size: 26px; font-weight: 800; letter-spacing: 2px; margin-bottom: 18px; }
/* 左栏 · 二维码 */
.lg-qr { width: 194px; height: 194px; border-radius: 18px; background: #fff; padding: 10px; display: flex; align-items: center; justify-content: center; box-shadow: 0 10px 30px rgba(0,0,0,.35); }
.lg-qr img { width: 100%; height: 100%; display: block; border-radius: 8px; }
.lg-qr-none { width: 100%; height: 100%; border: 1.5px dashed #C9CDD4; border-radius: 12px; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; color: #8A9099; font-size: 17px; text-align: center; line-height: 1.65; }
.lg-tip { color: rgba(255,255,255,.66); font-size: 17px; margin-top: 16px; text-align: center; line-height: 1.7; }
.lg-wxbtn { width: 100%; padding: 15px 0; border-radius: 12px; border: none; background: #07C160; color: #fff; font-size: 15px; font-weight: 700; cursor: pointer; }
/* 右栏 · tab（⚠️ 整页有 zoom:.64，此处字号已按 ÷0.64 预放大，视觉才够大） */
.lg-tabs { display: flex; gap: 26px; margin-bottom: 24px; align-items: flex-end; }
.lg-tab { position: relative; background: none; border: none; padding: 0 0 13px; color: rgba(255,255,255,.68); font-size: 26px; line-height: 1.1; font-weight: 600; cursor: pointer; letter-spacing: .5px; }
.lg-tab.on { color: #fff; font-weight: 800; }
.lg-tab.on::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 3px; border-radius: 2px; background: linear-gradient(90deg,#FDBA74,#F97316); }
/* 右栏 · 输入框 */
.lg-field { display: flex; align-items: center; gap: 10px; background: rgba(255,255,255,.055); border: 1px solid rgba(255,255,255,.13); border-radius: 11px; padding: 0 14px; height: 52px; margin-bottom: 14px; position: relative; transition: .2s; }
.lg-field:focus-within { border-color: rgba(249,115,22,.65); background: rgba(255,255,255,.085); }
.lg-field .lg-ico { font-size: 18px; opacity: .55; flex: none; }
.lg-field input { flex: 1; min-width: 0; background: none; border: none; outline: none; color: #fff; font-size: 21px; height: 100%; caret-color: #fff; }
.lg-field input::placeholder { color: rgba(255,255,255,.80); }
.lg-field .lg-eye { position: absolute; right: 12px; top: 50%; transform: translateY(-50%); cursor: pointer; user-select: none; line-height: 1; width: 26px; height: 26px; display: flex; align-items: center; justify-content: center; background: #28324A; border-radius: 50%; font-size: 15px; z-index: 2; }
.lg-field-code { padding-right: 8px; }
.lg-send { flex: none; background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.16); color: rgba(255,255,255,.9); border-radius: 9px; padding: 10px 16px; font-size: 17px; cursor: pointer; white-space: nowrap; transition: .2s; }
.lg-send:hover:not(:disabled) { background: rgba(249,115,22,.18); border-color: rgba(249,115,22,.5); }
.lg-send:disabled { opacity: .45; cursor: not-allowed; }
/* 右栏 · 主按钮 */
.lg-submit { width: 100%; height: 52px; margin-top: 6px; border: none; border-radius: 11px; background: linear-gradient(135deg,#FBBF24,#F97316); color: #fff; font-size: 24px; font-weight: 800; letter-spacing: 3px; cursor: pointer; box-shadow: 0 10px 26px rgba(249,115,22,.34); transition: .2s; }
.lg-submit:hover:not(:disabled) { transform: translateY(-1px); box-shadow: 0 14px 32px rgba(249,115,22,.45); }
.lg-submit:disabled { opacity: .6; cursor: not-allowed; }
/* 底部说明 + 邀请横幅（同样按 ÷0.64 预放大） */
.lg-foot { margin-top: 16px; color: rgba(255,255,255,.68); font-size: 22px; line-height: 1.7; }
.lg-link { color: #FDBA74; cursor: pointer; text-decoration: none; -webkit-tap-highlight-color: transparent; }
.lg-link:hover { text-decoration: underline; }
.lg-inv { display: inline-block; background: rgba(30,190,110,.14); border: 1px solid rgba(30,190,110,.35); color: #8DE8B8; border-radius: 8px; padding: 8px 13px; font-size: 17px; margin-bottom: 14px; }
.lg-inv.warn { background: rgba(249,115,22,.14); border-color: rgba(249,115,22,.4); color: #FDBA74; }
/* v20260914g ×清空 + 就地报错 + 忘记密码 + 协议行（字号同样按 ÷0.64 预放大） */
.lg-clear { display: none; flex: none; width: 26px; height: 26px; margin-left: 2px; border: none; border-radius: 50%; background: rgba(255,255,255,.14); color: rgba(255,255,255,.85); font-size: 17px; line-height: 1; cursor: pointer; align-items: center; justify-content: center; padding: 0; }
.lg-field input:not(:placeholder-shown) ~ .lg-clear { display: flex; }
.lg-clear:hover { background: rgba(255,255,255,.26); color: #fff; }
.lg-field.err { border-color: rgba(255,110,110,.8); background: rgba(255,110,110,.09); }
.lg-err { color: #FF9A9A; font-size: 19px; line-height: 1.55; margin-top: 8px; }
.lg-sub { margin-top: 12px; text-align: right; font-size: 19px; }
.lg-legal { margin-top: 16px; color: rgba(255,255,255,.55); font-size: 16px; text-align: center; line-height: 1.6; white-space: nowrap; user-select: none; -webkit-user-select: none; }
.lg-legal .lg-link { color: #FDBA74; }
@media (max-width: 760px) {
  /* 移动端不再缩放，下面把预放大的字号收回常规尺寸 */
  .lg-stage { zoom: 1; }
  .lg-card { flex-direction: column; padding: 30px 20px; }
  .lg-left { width: auto; padding: 0 0 22px; border-right: none; border-bottom: 1px solid rgba(255,255,255,.09); margin-bottom: 22px; }
  .lg-right { padding-left: 0; }
  .lg-h { font-size: 18px; margin-bottom: 14px; }
  .lg-qr { width: 148px; height: 148px; }
  .lg-tip { font-size: 13px; }
  .lg-tabs { gap: 20px; margin-bottom: 20px; }
  .lg-tab { font-size: 17px; padding-bottom: 11px; }
  .lg-field .lg-ico { font-size: 15px; }
  .lg-field input { font-size: 16px; }
  .lg-field .lg-eye { font-size: 13px; }
  .lg-send { padding: 9px 12px; font-size: 14px; }
  .lg-submit { font-size: 17px; }
  .lg-foot { font-size: 14px; }
  .lg-inv { font-size: 13px; }
  .lg-clear { width: 20px; height: 20px; font-size: 14px; }
  .lg-err { font-size: 13px; margin-top: 6px; }
  .lg-sub { font-size: 13px; margin-top: 8px; }
  .lg-legal { font-size: 12px; margin-top: 12px; }
}
.dot-red{display:inline-block;min-width:18px;height:18px;line-height:18px;padding:0 5px;background:#e24b4a;color:#fff;border-radius:9px;font-size:11px;text-align:center;margin-left:6px;vertical-align:middle}
.tag.red{background:#FCEBEB;color:#A32D2D}
.tag.green{background:#EAF3DE;color:#3B6D11}
.guest-msg{padding:12px 0;border-bottom:1px solid #eef0ea}
.guest-msg:last-child{border-bottom:0}
.gm-head{margin-bottom:4px;font-size:13px}
.gm-body{font-size:14px;line-height:1.6;color:#333;white-space:pre-wrap}
.gm-reply{margin-top:6px;padding:8px 10px;background:#F3F6FB;border-radius:8px;font-size:13px;color:#444}

/* 密码显示/隐藏 */
.pwd-wrap { position: relative; }
input::-ms-reveal, input::-ms-clear { display: none; }
.pwd-wrap input { padding-right: 32px; }
.pwd-toggle { position: absolute; right: 10px; top: 50%; transform: translateY(-50%); cursor: pointer; user-select: none; line-height: 1; width: 26px; height: 26px; display: flex; align-items: center; justify-content: center; background: #28324A; border-radius: 50%; font-size: 15px; z-index: 2; }
.pwd-toggle:hover { opacity: 1; }

/* layout */
.topbar { background: #fff; border-bottom: 2px solid #cfd6e0; height: 56px; display: flex; align-items: center; padding: 0 20px; gap: 12px; position: sticky; top: 0; z-index: 10; }
.logo { width: 30px; height: 30px; border-radius: 8px; background: linear-gradient(135deg, var(--brand), var(--brand2)); color: #fff; font-weight: 700; display: flex; align-items: center; justify-content: center; }
.topbar .title { font-weight: 600; }
.topbar .spacer { flex: 1; }
.topbar .who { color: var(--muted); font-size: 13px; cursor: pointer; white-space: nowrap; word-break: keep-all; flex: none; }
.topbar .who-mini { display: none; }   /* v20260915m 手机端才用「账号 ▾」 */
/* v20260915m 顶栏重要功能胶囊（执行 / 日志 / 签到）：正哥"把最重要的业务放上面"。
   铁律：中文词组绝不折行 → nowrap + keep-all + 宽度靠 padding 撑开、不写死；空间不够靠横滑（手机端 overflow-x:auto） */
.topbar .quicknav { display: flex; align-items: center; gap: 6px; margin-left: 4px; min-width: 0; }
.topbar .quicknav a { display: inline-flex; align-items: center; padding: 6px 13px; border: 1px solid var(--line); border-radius: 999px; background: #fff; color: var(--text); font-size: 13px; font-weight: 600; line-height: 1.15; text-decoration: none; white-space: nowrap; word-break: keep-all; flex: none; transition: background .15s ease, color .15s ease, border-color .15s ease; }
.topbar .quicknav a:hover { background: #f2f3f5; }
.topbar .quicknav a.active { background: var(--brand); border-color: var(--brand); color: #fff; }
.layout { display: flex; min-height: calc(100vh - 56px); }
/* v20260915m flex 列：让底部「通知 / 刷新」工具区能用 margin-top:auto 贴到侧栏最下面 */
.sidebar { width: 180px; background: #fff; border-right: 1px solid var(--line); padding: 14px 10px; display: flex; flex-direction: column; }
.sidebar a { display: block; padding: 10px 14px; border-radius: 8px; color: var(--text); text-decoration: none; font-size: 14px; margin-bottom: 4px; }
.sidebar a:hover { background: var(--bg); }
.sidebar a.active { background: #fff1ea; color: var(--brand); font-weight: 600; }
.content { flex: 1; padding: 22px; overflow: auto; }
.page-title { font-size: 18px; font-weight: 600; margin-bottom: 16px; }
.user-actions { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; margin: 0 0 18px; }
.user-actions .btn { font-size: 15px; padding: 11px 26px; box-shadow: 0 2px 8px rgba(43,125,233,.25); }
.perm-pos { width: 120px; padding: 5px 8px; border: 1px solid #dfe3ea; border-radius: 6px; }
.perm-role { width: 150px; padding: 5px 8px; border: 1px solid #dfe3ea; border-radius: 6px; }

/* cards & stats */
.grid { display: grid; gap: 14px; }
.stats { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
.stat { background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 16px; min-width: 0; }
.stat .num { font-size: 24px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.stat .lbl { color: var(--muted); font-size: 13px; margin-top: 4px; }

/* table */
table { width: 100%; border-collapse: collapse; background: #fff; border-radius: 12px; overflow: hidden; border: 1px solid var(--line); }
th, td { text-align: left; padding: 11px 14px; border-bottom: 1px solid var(--line); font-size: 13px; }
th { background: #fafbfc; color: var(--muted); font-weight: 500; }
tr:last-child td { border-bottom: none; }
tr:hover td { background: #fafbfc; }

/* v20260912ad 项目列表表格：固定列宽 + 数字列表头/数据同右对齐，保证每列上下严格对齐 */
/* v20261008p 正哥反馈间距太大，cell padding 由 10px 减半到 5px，整体更紧凑 */
/* v20261016s 项目列表加竖向网格线，每列用 | 分隔，对齐伙伴云那种清爽表格式（最后一列不画线） */
.proj-table { table-layout: fixed; }
.proj-table th, .proj-table td { padding: 5px 5px; border-right: 1px solid var(--line); }
.proj-table th:last-child, .proj-table td:last-child { border-right: none; }
.proj-table th.num, .proj-table td.num { text-align: right; font-variant-numeric: tabular-nums; }
.proj-table th.num { color: var(--muted); }
.proj-table td .cell-ell { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.proj-table td .proj-code { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sup-table th, .sup-table td { border-right: 1px solid var(--line); }
.sup-table th:last-child, .sup-table td:last-child { border-right: none; }
/* v20261018o 卡片头加「人员/名称/地址」字段标签（正哥：像项目表加栏目名才看得懂；推荐=卡片内 label+value，手机不挤） */
.exec-head { display:flex; flex-direction:column; gap:4px; cursor:pointer; user-select:none; min-width:0; }
.exec-head .eh-arrow { display:none; }
.exec-head .eh-row { display:flex; gap:6px; align-items:baseline; }
.exec-head .eh-k { flex:0 0 36px; color:var(--color-muted,#8a94a6); font-size:12px; flex-shrink:0; }
.exec-head .eh-v { font-size:14px; color:inherit; }
.exec-head .eh-name .eh-v { font-weight:600; line-height:1.4; word-break:break-word; white-space:normal; }
.exec-head .eh-meta-row { display:flex; flex-wrap:wrap; gap:6px 14px; }
.exec-head .eh-kv { display:inline-flex; gap:4px; align-items:baseline; }
.exec-head .eh-meta-row .eh-k { flex:none; }
.exec-head .eh-meta-row .eh-v { font-size:12px; }
/* v20261018j 执行分工表在手机端可横向滑动：触摸滚动 + 不被父级裁剪 */
.exec-crew-wrap { overflow-x:auto; -webkit-overflow-scrolling:touch; max-width:100%; }

/* kanban */
.kanban { display: flex; gap: 12px; overflow-x: auto; padding-bottom: 8px; }
.kcol { background: #fff; border: 1px solid var(--line); border-radius: 12px; width: 230px; flex: 0 0 230px; padding: 10px; }
.kcol h3 { font-size: 13px; margin-bottom: 10px; display: flex; justify-content: space-between; }
.kcol .cnt { color: var(--muted); font-weight: 400; }
.kcard { border: 1px solid var(--line); border-radius: 8px; padding: 10px; margin-bottom: 8px; cursor: pointer; background: #fff; }
.kcard:hover { border-color: var(--brand); }
.kcard .t { font-weight: 500; font-size: 13px; }
.kcard .m { color: var(--muted); font-size: 12px; margin-top: 4px; }

/* 阶段筛选 chip 标签组 */
.chip { display: inline-block; padding: 4px 12px; border-radius: 999px; border: 1px solid var(--line); background: #fff; font-size: 12px; color: var(--muted); cursor: pointer; user-select: none; transition: all .15s; }
.chip:hover { border-color: var(--brand); color: var(--brand); }
.chip.on { background: var(--brand); color: #fff; border-color: var(--brand); }

/* modal */
.modal-mask { position: fixed; inset: 0; background: rgba(0,0,0,.35); display: flex; align-items: center; justify-content: center; z-index: 50; }
.modal { background: #fff; border-radius: 14px; padding: 24px; width: 620px; max-width: 94vw; max-height: 90vh; overflow: auto; }
.modal h3 { margin-bottom: 16px; font-size: 18px; }
.form-row { margin-bottom: 12px; }
.form-row label { display: block; font-size: 12px; color: var(--muted); margin-bottom: 5px; }
/* v20260921r 供应商安排弹窗 label 统一加粗显色：服务项目/姓名/公司等标签不再灰蒙蒙，一眼能看到 */
.wz-form .form-row label { color: var(--text); font-weight: 600; font-size: 13px; }
.form-actions { display: flex; gap: 10px; justify-content: flex-end; margin-top: 8px; }
.row2 { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.row3 { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; }
.row3 select { padding: 6px 8px; border: 1px solid var(--line); border-radius: 6px; background: #fff; }
.tag { display: inline-block; padding: 2px 8px; border-radius: 6px; font-size: 12px; background: #fff1ea; color: var(--brand); }
.tag.blue { background: #e6f1fb; color: var(--primary); }
.tag.green { background: #eaf3de; color: #3b6d11; }
.tag.gray { background: #f1efe8; color: #5f5e5a; }
.tag.orange { background: #fff1e0; color: #ba7517; }
.tag.lvl-a { background: #fde2e2; color: #c0392b; font-weight: 600; }
.tag.lvl-b { background: #fdebd0; color: #b9770e; font-weight: 600; }
.tag.lvl-c { background: #e3eefb; color: #1f5fb0; }
.tag.lvl-d { background: #E8F5E9; color: #2E7D32; }
.tag.lvl-e { background: #F3E5F5; color: #7B1FA2; }
.tag.lvl-f { background: #E0F7FA; color: #00838F; }
.chks { display: flex; flex-wrap: wrap; gap: 8px 14px; padding: 6px 0; }
.chk { display: inline-flex; align-items: center; gap: 4px; font-size: 13px; color: var(--text); cursor: pointer; user-select: none; }
.chk input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--brand); cursor: pointer; flex-shrink: 0; margin: 0; }
.muted { color: var(--muted); }
.section { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 16px; margin-bottom: 14px; }
.section h4 { font-size: 14px; margin-bottom: 12px; }
.item { border-bottom: 1px solid var(--line); padding: 10px 0; }
.item:last-child { border-bottom: none; }
/* 执行排期 */
.sched-item { border-bottom: 1px solid var(--line); padding: 12px 0; display: flex; gap: 12px; align-items: flex-start; }
.sched-item:last-child { border-bottom: none; }
.sched-time { flex: 0 0 76px; font-size: 13px; color: var(--brand); line-height: 1.4; }
.sched-body { flex: 1 1 auto; min-width: 0; }
.sched-loc { font-size: 13px; font-weight: 600; color: var(--text); margin-bottom: 2px; }
.sched-task { font-size: 14px; color: var(--text); line-height: 1.5; margin-bottom: 6px; }
.sched-staff { display: flex; flex-wrap: wrap; gap: 6px; }
.sched-ops { flex: 0 0 auto; display: flex; gap: 6px; align-items: center; }
.empty { color: var(--muted); text-align: center; padding: 30px; }
.q-row { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 8px; margin-bottom: 8px; align-items: center; }
.toast { position: fixed; bottom: 36px; left: 50%; transform: translateX(-50%); background: #1f2329; color: #fff; padding: 10px 18px; border-radius: 8px; font-size: 13px; z-index: 99999; }

/* 工作日志 */
.wl-tabs { display: flex; gap: 8px; margin-bottom: 14px; }
.wl-views { display: flex; gap: 8px; margin-bottom: 14px; }
.wl-views .tab.sm { padding: 5px 14px; font-size: 13px; }
/* 类型胶囊：文字按钮 + 周期下拉合并为一个控件 */
.wl-type-pills { display: flex; gap: 12px; align-items: center; flex-wrap: wrap; }
.wl-type-pill { display: inline-flex; align-items: center; gap: 8px; background: var(--card); border: 1px solid var(--line); border-radius: 8px; padding: 4px 8px 4px 4px; }
.wl-type-pill .tab { margin: 0; border: none; background: transparent; white-space: nowrap; word-break: keep-all; min-width: max-content; flex-shrink: 0; }
.wl-type-pill .btn.ghost.sm { margin: 0; border: none; background: transparent; white-space: nowrap; min-width: max-content; flex-shrink: 0; padding: 5px 8px; }
.wl-filters { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.wl-filter-pill { display: inline-flex; align-items: center; border: 1px solid var(--line); border-radius: 8px; padding: 3px 8px 3px 6px; background: var(--card); }
.wl-filter-pill select.btn.ghost.sm { margin: 0; border: none; background: transparent; padding: 0; min-width: max-content; flex-shrink: 0; font-size: 13px; }
.wl-actions .btn.ghost.active { background: var(--brand); color: #fff; border-color: var(--brand); }
.inv-banner { background: #eef6ff; border: 1px solid #cfe3ff; padding: 8px 10px; border-radius: 8px; margin-bottom: 10px; font-size: 13px; }
.inv-banner.warn { background: #fff4e5; border-color: #ffd8a8; }
.inv-banner.login-inv { background: #eafaf0; border-color: #b7e8c8; color: #1d7a45; }
.inv-hint { background: #f0f9ff; border: 1px solid #bae3ff; border-radius: 8px; padding: 8px 10px; margin: 10px 0 4px; font-size: 12.5px; color: #0c5a8a; line-height: 1.6; }
.inv-list { max-height: 200px; overflow: auto; margin-top: 4px; }
.inv-row { display: flex; align-items: center; gap: 8px; padding: 5px 0; font-size: 13px; border-bottom: 1px dashed #eee; }
.inv-row code { background: #f5f5f5; padding: 2px 6px; border-radius: 4px; }
.set-row { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 13px 14px; border-bottom: 1px solid var(--line); }
.set-row:last-child { border-bottom: none; }
.set-row input[type=checkbox] { width: 18px; height: 18px; accent-color: var(--accent, #185fa5); }
.set-row b { font-weight: 500; }
.token-row { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 10px 2px; border-top: 1px solid var(--line); }
.token-row.token-head { border-top: none; padding-top: 2px; color: var(--muted); font-size: 12px; }
.token-name { font-size: 14px; font-weight: 500; }
.token-meta { font-size: 12px; color: var(--muted); flex: 1; padding: 0 10px; }
.token-ops { flex-shrink: 0; }
.token-empty { font-size: 13px; color: var(--muted); padding: 4px 0; }

/* 入驻审核提示墙 */
.wall-wrap { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #f3f7fb, #e9f0f8); }
.wall-card { background: #fff; border: 1px solid var(--line); border-radius: 16px; padding: 40px 46px; text-align: center; max-width: 420px; box-shadow: 0 10px 40px rgba(20, 50, 90, .08); }
.wall-icon { font-size: 52px; margin-bottom: 8px; }
.wall-card h2 { margin: 6px 0 12px; font-size: 22px; }
.wall-tip { color: var(--text); line-height: 1.8; font-size: 14px; }

/* 入驻审核列表 */
.rev-list { display: flex; flex-direction: column; gap: 12px; margin-top: 14px; }
.rev-row { display: flex; justify-content: space-between; align-items: center; gap: 16px; background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 16px 18px; }
.rev-row b { font-size: 15px; }
.rev-main b + .tag { margin-left: 8px; vertical-align: middle; }
.rev-main { flex: 1; min-width: 0; }
.rev-ops { display: flex; gap: 8px; flex-shrink: 0; }
.tab { background: #fff; border: 1px solid var(--line); border-radius: 8px; padding: 7px 18px; font-size: 14px; color: var(--text); cursor: pointer; }
.tab.active { background: var(--brand); color: #fff; border-color: var(--brand); }
.wl-remind { background: #fff7e6; border: 1px solid #ffd591; color: #ad6800; border-radius: 10px; padding: 10px 14px; margin-bottom: 14px; display: flex; align-items: center; gap: 10px; font-size: 13px; }

/* 邀请内部成员醒目提示（公司成员页横幅） */
.invite-tip { background: #fff3e0; border: 1px solid #ff9f43; border-left: 4px solid #ff7a00; border-radius: 10px; padding: 12px 16px; margin-bottom: 14px; color: #8a4b00; font-size: 13.5px; line-height: 1.7; }
.invite-tip-h { font-weight: 700; font-size: 14.5px; margin-bottom: 4px; color: #b45309; }
.invite-tip b { color: #b45309; }
.wl-card { margin-bottom: 12px; }
.wl-head { display: flex; align-items: center; gap: 6px; flex-wrap: nowrap; overflow-x: auto; margin-bottom: 10px; padding-bottom: 2px; }
.wl-head .btn.sm { padding: 4px 8px; font-size: 12px; white-space: nowrap; flex-shrink: 0; }
.wl-head .tag { flex-shrink: 0; white-space: nowrap; word-break: keep-all; }
.wl-row { padding: 6px 0; font-size: 14px; line-height: 1.6; }
.wl-k { color: var(--muted); font-size: 13px; margin-right: 4px; }
.wl-comment { margin-top: 10px; background: #f7f8fa; border-radius: 8px; padding: 10px 12px; font-size: 13px; color: #3b6d11; }
.wl-cc { display: inline-flex; align-items: center; gap: 4px; }

.wl-bar { display: flex; gap: 14px; flex-wrap: wrap; align-items: center; margin-bottom: 12px; }
.wl-years { display: flex; gap: 6px; flex-wrap: wrap; }
.wl-quick { display: flex; gap: 6px; flex-wrap: wrap; }
.wl-group { margin-bottom: 10px; }
.wl-group-head { display: flex; align-items: center; gap: 8px; padding: 11px 14px; background: #f2f4f7; border-radius: 10px; cursor: pointer; user-select: none; font-size: 14px; }
.wl-group-head:hover { background: #e9edf2; }
.wl-group-head .muted { font-size: 12px; }
.wl-arrow { font-size: 12px; color: var(--muted); }
.wl-group-body { padding: 12px 4px 2px; }
.btn.ghost.sm.active { background: var(--brand); color: #fff; border-color: var(--brand); }

/* ========== 移动端适配 ========== */
@media (max-width: 768px) {
  .topbar { padding: 0 12px; height: 48px; gap: 8px; }
  .topbar .title { display: none; }
  /* v20260915m 账号不再隐藏：退出通道合并进「账号 ▾」下拉（正哥："账号退出2个可以合并"），手机必须看得见点得到 */
  .topbar .who { display: inline-flex; align-items: center; padding: 5px 10px; border: 1px solid var(--line); border-radius: 999px; color: var(--text); font-size: 12.5px; font-weight: 600; line-height: 1.15; }
  .topbar .who-full { display: none; }
  .topbar .who-mini { display: inline; }
  .topbar .spacer { display: none; }
  /* 胶囊区占满剩余宽度、可横滑（正哥："可以滑动也要得"）—— 顺序固定 执行 / 日志 / 签到，绝不折行 */
  .topbar .quicknav { flex: 1 1 auto; min-width: 0; margin-left: 0; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; -ms-overflow-style: none; }
  .topbar .quicknav::-webkit-scrollbar { display: none; }
  .topbar .quicknav a { padding: 5px 11px; font-size: 12.5px; }
  .menu-toggle { display: flex !important; position: relative; width: 32px; height: 32px; align-items: center; justify-content: center; background: none; border: 1px solid var(--line); border-radius: 8px; font-size: 18px; color: var(--text); padding: 0; flex: none; }

  /* 侧边栏：默认隐藏，点击菜单按钮滑出 */
  .sidebar { position: fixed; left: 0; top: 48px; bottom: 0; width: 220px; z-index: 40;
    transform: translateX(-100%); transition: transform .25s ease; box-shadow: none; border-right: none;
    overflow-y: auto; -webkit-overflow-scrolling: touch; }
  .sidebar.open { transform: translateX(0); box-shadow: 4px 0 20px rgba(0,0,0,.1); border-right: 1px solid var(--line); }
  .sidebar-overlay { display: none; position: fixed; inset: 0; top: 48px; background: rgba(0,0,0,.3); z-index: 35; }
  .sidebar-overlay.show { display: block; }

  .layout { flex-direction: column; }
  .content { padding: 14px 12px; overflow-x: hidden; }
  .page-title { font-size: 16px; margin-bottom: 12px; flex-wrap: wrap; gap: 8px; }

  /* 统计卡片：2列 */
  .stats { grid-template-columns: repeat(2, 1fr); }
  .stat { padding: 12px; }
  .stat .num { font-size: 20px; }

  /* 表格：横向滚动 */
  table { font-size: 12px; display: block; overflow-x: auto; white-space: nowrap; }
  th, td { padding: 8px 10px; min-width: 70px; }

  /* 看板：横向滚动 */
  .kanban { gap: 10px; }
  .kcol { width: 200px; flex: 0 0 200px; padding: 8px; }

  /* 弹窗：几乎全屏 */
  .modal { width: 94vw; padding: 18px; max-height: 90vh; }
  .row2 { grid-template-columns: 1fr; }

  /* 项目详情 */
  .section { padding: 12px; margin-bottom: 10px; }
  .row2 { gap: 8px; }

  /* 按钮：小一点 */
  .btn.sm { padding: 6px 10px; font-size: 11px; }
  .btn.ghost.sm { padding: 4px 8px; font-size: 11px; }

  /* 登录页 */
  .login-card { padding: 28px 20px; width: auto; margin: 0 16px; border-radius: 14px; }
}
@media (max-width: 480px) {
  .stats { grid-template-columns: 1fr 1fr; gap: 8px; }
  .stat .num { font-size: 18px; }
  .kcol { width: 170px; flex: 0 0 170px; }
}

/* 桌面端隐藏菜单按钮 */
.menu-toggle { display: none; }
/* v20260915m ☰ 上的未读小红点：通知挪进侧栏后，抽屉关着也能一眼看到有新消息 */
.menu-toggle .badge { position: absolute; top: -3px; right: -3px; width: 9px; height: 9px; padding: 0; border-radius: 50%; background: #f5222d; box-shadow: 0 0 0 2px #fff; }

/* ========== 通知中心 ========== */
.bell { position: relative; background: transparent; border: none; font-size: 20px; line-height: 1; cursor: pointer; padding: 4px 6px; border-radius: 8px; }
.bell:hover { background: #f2f3f5; }
/* v20260915l 正哥定：刷新按钮从 emoji（🔄）改成**文字「刷新」**——
   原因：🔄 在他浏览器里被系统字体降级渲染成看不懂的「← END」，任何 emoji 都有这个风险，文字不会。
   铁律：中文短语不许折行 → nowrap + keep-all + flex:none，宽度靠 padding 撑开，不写死宽度。 */
.refresh { background: transparent; border: 1px solid var(--line); color: var(--text); font-size: 13px; font-weight: 600; line-height: 1.15; cursor: pointer; padding: 5px 10px; border-radius: 8px; white-space: nowrap; word-break: keep-all; flex: none; transition: background .2s ease, opacity .2s ease; }
.refresh:hover { background: #f2f3f5; }
.refresh.busy { opacity: .55; cursor: default; }   /* 点了之后的「刷新中…」态，防重复点击的观感 */
/* v20260915j 添加到桌面：底部居中深色胶囊，对齐总站样式。文字固定「添加到桌面」五个字，禁止折行
   （原顶栏 📲 图标按钮已删除：正哥说"根本看不到、这符号什么意思也看不明白"） */
.pwa-install-bar { position: fixed; left: 50%; bottom: 22px; transform: translateX(-50%); z-index: 9998; display: flex; align-items: center; gap: 10px; padding: 7px 9px 7px 7px; background: #0b1424; border: 1px solid #6d5c2c; border-radius: 14px; box-shadow: 0 10px 30px rgba(0,0,0,.35); opacity: 1; transition: opacity .35s ease, transform .35s ease; }
.pwa-install-bar.pwa-hide { opacity: 0; transform: translateX(-50%) translateY(10px); pointer-events: none; }
.pwa-install-bar .pwa-go { display: flex; align-items: center; gap: 9px; background: transparent; border: 0; padding: 0 4px 0 0; cursor: pointer; }
.pwa-install-bar .pwa-go:active { transform: scale(.97); }
.pwa-install-bar .pwa-logo { width: 30px; height: 30px; border-radius: 8px; display: block; flex: none; }
.pwa-install-bar .pwa-txt { font-size: 16px; font-weight: 700; color: #fff; white-space: nowrap; word-break: keep-all; line-height: 1.1; flex: none; }
.pwa-install-bar .pwa-x { flex: none; width: 24px; height: 24px; border: 0; border-radius: 7px; background: #2a3141; color: #fff; font-size: 13px; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; padding: 0; }
.pwa-install-bar .pwa-x:hover { background: #3a4457; }

/* ========== 新版本提示横幅 ========== */
.update-banner { position: fixed; bottom: 20px; right: 20px; z-index: 9999; background: linear-gradient(90deg,#2b7de9,#1e63c2); color: #fff; display: flex; align-items: center; justify-content: space-between; padding: 10px 16px; font-size: 13px; box-shadow: 0 4px 16px rgba(0,0,0,.22); border-radius: 10px; max-width: 360px; min-width: 240px; }
.update-banner span { flex: 1; }
.update-banner .btn { background: #fff; color: #1e63c2; border: none; margin-left: 12px; padding: 4px 12px; font-size: 12px; flex: none; }
.update-banner .btn:hover { background: #eef3fb; }
/* 支付状态快捷弹层（点项目列表/详情的收款 tag 弹出） */
.pay-status-pop { position: fixed; z-index: 100000; background: #fff; border-radius: 10px; box-shadow: 0 6px 24px rgba(0,0,0,.18); padding: 6px; display: flex; flex-direction: column; min-width: 150px; }
.pay-status-pop .psp-item { display: flex; align-items: center; gap: 8px; background: none; border: 0; padding: 8px 12px; font-size: 13px; cursor: pointer; border-radius: 8px; text-align: left; }
.pay-status-pop .psp-item:hover { background: #f4f5f7; }
.pay-status-pop .psp-dot { width: 10px; height: 10px; border-radius: 50%; flex: none; }
.pay-status-pop .psp-dot.unpaid { background: #e24b4a; }
.pay-status-pop .psp-dot.partial { background: #BA7517; }
.pay-status-pop .psp-dot.paid { background: #0F6E56; }
.pay-status-pop .psp-dot.advance { background: #d99b26; }
.pay-status-pop .psp-dot.sponsor { background: #D6338A; }
.pay-status-pop .psp-dot.auto { background: #888; }

/* v20260915j 旧的「左下角小卡片」.pwa-banner 样式已废弃删除（v20260914c 起就不再用；样式统一到 .pwa-install-bar） */
/* 微信内引导遮罩：指向右上角 */
.pwa-wechat-mask { position: fixed; inset: 0; z-index: 99999; background: rgba(0,0,0,.5); display: flex; justify-content: flex-end; align-items: flex-start; padding: 54px 16px; }
.pwa-wechat-box { background: #fff; color: #1f2329; border-radius: 14px; padding: 16px 18px; font-size: 14px; line-height: 1.8; text-align: center; max-width: 190px; box-shadow: 0 6px 24px rgba(0,0,0,.3); }
.pwa-wechat-box .pwa-arrow { font-size: 26px; color: #534AB7; margin-bottom: 2px; font-weight: 700; }
.bell .badge { position: absolute; top: -2px; right: -2px; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 9px; background: #f5222d; color: #fff; font-size: 11px; line-height: 16px; text-align: center; }
.notif-list { max-height: 56vh; overflow: auto; margin: -4px -4px 12px; }
.notif-item { padding: 10px 8px; border-radius: 8px; cursor: pointer; border-bottom: 1px solid var(--line); }
.notif-item:hover { background: #f7f8fa; }
.notif-item.read { opacity: .55; }
.notif-item .notif-main { font-size: 14px; }
.notif-item.read .notif-main { font-weight: 400; }
.notif-item:not(.read) .notif-main { font-weight: 600; }

/* ========== @提及浮层 ========== */
.mention-drop { position: fixed; z-index: 200; background: #fff; border: 1px solid var(--line); border-radius: 10px; box-shadow: 0 8px 24px rgba(0,0,0,.14); max-height: 220px; overflow: auto; min-width: 180px; display: none; }
.mention-item { padding: 8px 12px; cursor: pointer; font-size: 13px; display: flex; align-items: baseline; gap: 8px; }
.mention-item:hover, .mention-item.active { background: var(--brand); color: #fff; }
.mention-item .muted { font-size: 11px; }
.mention-item.active .muted { color: rgba(255,255,255,.8); }
.at { color: var(--brand); font-weight: 600; }

@media (max-width: 768px) {
  .bell { font-size: 18px; padding: 4px; }
  .pwa-install-bar { bottom: 16px; padding: 6px 8px 6px 6px; }   /* v20260915j 手机上也贴底居中，稍收一点 padding */
  .refresh { font-size: 12px; padding: 4px 8px; }                 /* v20260915l 手机上「刷新」文字按钮收紧一点，别挤爆顶栏 */
}

/* ========== 公告（老板全员广播） ========== */
.ann-bar { display: flex; gap: 12px; background: linear-gradient(135deg, #fff7ed, #fff1f0); border: 1px solid #ffc9a8; border-left: 4px solid var(--brand); border-radius: 12px; padding: 14px 16px; margin-bottom: 16px; }
.ann-bar.imp { background: linear-gradient(135deg, #fff1f0, #ffe9e9); border-color: #ffa8a8; border-left-color: #e24b4a; }
.ann-ico { font-size: 22px; line-height: 1.4; flex-shrink: 0; }
.ann-body { flex: 1; min-width: 0; }
.ann-top { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ann-tag { display: inline-block; padding: 1px 8px; border-radius: 6px; font-size: 12px; background: var(--brand); color: #fff; font-weight: 600; }
.ann-imp { display: inline-block; padding: 1px 8px; border-radius: 6px; font-size: 12px; background: #e24b4a; color: #fff; font-weight: 600; }
.ann-title { font-size: 15px; font-weight: 600; }
.ann-meta { color: var(--muted); font-size: 12px; margin: 4px 0 6px; }
.ann-text { font-size: 13.5px; line-height: 1.7; color: var(--text); white-space: pre-wrap; }
.ann-foot { margin-top: 10px; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.ann-done { color: #3b6d11; font-size: 13px; font-weight: 600; }
.ann-list { max-height: 60vh; overflow: auto; margin: -4px -4px 12px; display: flex; flex-direction: column; gap: 10px; }
.ann-item { border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; }
/* 旧语义色覆盖已并入 :root 映射（设计规范 v1.0）*/
.ann-itop { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 14px; }
.ann-imeta { color: var(--muted); font-size: 12px; margin: 4px 0 6px; }
.ann-itext { font-size: 13px; line-height: 1.7; white-space: pre-wrap; margin-bottom: 8px; }

/* ========== 每日经营简报 ========== */
.digest-bar { display: flex; flex-direction: column; background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 6px 14px; margin: 4px 0; }
.dig-row { display: flex; align-items: center; gap: 10px; padding: 8px 0; border-bottom: 1px solid #f3f3f3; }
.dig-row:last-child { border-bottom: none; }
.dig-ico { font-size: 16px; width: 22px; text-align: center; flex-shrink: 0; }
.dig-lbl { flex: 1; color: var(--text); font-size: 13.5px; }
.dig-val { font-weight: 600; font-size: 14px; }
.dig-val.danger { color: #e24b4a; }

/* ========== 财务 / 报账与收支 ========== */
:root { --green: #3b6d11; --red: #e24b4a; }
.fin-tabs { display: flex; gap: 8px; margin-bottom: 14px; }
.fin-toolbar { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
.chip { background: #fff; border: 1px solid var(--line); border-radius: 8px; padding: 5px 12px; font-size: 12px; cursor: pointer; color: var(--text); }
.chip.active { background: var(--brand); color: #fff; border-color: var(--brand); }
.exp-status { display: inline-block; padding: 2px 8px; border-radius: 6px; font-size: 12px; }
.exp-status.draft { background: #f1efe8; color: #5f5e5a; }
.exp-status.pending_mgmt, .exp-status.pending_boss, .exp-status.pending_finance { background: #fff7e6; color: #ad6800; }
.exp-status.paid { background: #eaf3de; color: var(--green); }
.exp-status.rejected { background: #fde2e2; color: #c0392b; }
/* ===== 报账列表：卡片式（替代 8 列表格，移动端友好） ===== */
.exp-cards { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 6px; align-items: stretch; } /* v20260912z 报账列表改横排小卡，与项目详情支付明细一致，不浪费版面 */
.exp-card { flex: 1 1 280px; min-width: 240px; max-width: 360px; background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 12px 14px; display: flex; flex-direction: column; }
.exp-card-head { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; }
.exp-card-type { font-size: 14px; font-weight: 600; color: #222; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.exp-card-amt { font-size: 16px; font-weight: 700; color: var(--red); white-space: nowrap; }
.exp-card-meta { display: flex; flex-wrap: wrap; gap: 8px 14px; margin-top: 7px; font-size: 12px; color: #888; align-items: center; }
.exp-card-meta .exp-owner { color: #555; font-weight: 600; }
.exp-card-meta .exp-date { margin-left: auto; }
.exp-card-acts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: auto; padding-top: 10px; border-top: 1px dashed var(--line); }
.exp-group { width: 100%; }
.exp-group-head { display: flex; align-items: baseline; gap: 10px; margin-bottom: 8px; padding-bottom: 6px; border-bottom: 1px solid var(--line); flex-wrap: wrap; }
.exp-group-head b { font-size: 14px; color: var(--text-1); }
.tag-personal { background: #fff3e0; color: #ba7517; font-size: 11px; padding: 1px 7px; border-radius: 6px; font-weight: 600; }
.fin-charts { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 14px; margin: 14px 0; }
.fin-charts .card { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 14px; }
.fin-charts .card h4 { font-size: 14px; margin-bottom: 10px; }
.chart-box { position: relative; height: 240px; }
table.mini { font-size: 13px; }

/* ===== 供应商：搜索并加入已注册用户 ===== */
.sup-search { display: flex; gap: 8px; margin: 0 0 12px; }
.sup-search input { flex: 1; }
.stray-list { margin: 0 0 14px; border: 1px solid var(--line); border-radius: 10px; overflow: hidden; }
.stray-item { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 9px 12px; border-bottom: 1px solid var(--line); font-size: 13px; }
.stray-item:last-child { border-bottom: 0; }
.stray-info { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ===== 客户档案：卡片网格 ===== */
.cust-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 14px; }
.cust-card { background: #fff; border: 1px solid var(--color-border-secondary, #e2e2e2); border-radius: 12px; padding: 14px; transition: box-shadow .15s, transform .15s; }
.cust-card:hover { box-shadow: 0 4px 14px rgba(0,0,0,.08); transform: translateY(-2px); }
.cust-avatar { width: 36px; height: 36px; border-radius: 9px; display: flex; align-items: center; justify-content: center; font-weight: 500; font-size: 15px; flex: 0 0 auto; }
.cust-name { font-size: 14px; font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cust-more-btn { position:absolute;top:8px;right:8px;width:28px;height:28px;border:none;background:transparent;font-size:18px;color:#999;border-radius:6px;cursor:pointer;line-height:1;z-index:2 }
.cust-more-btn:hover { background:#f0f0f0; color:#333; }
.cust-menu { position:absolute;top:36px;right:8px;z-index:10;background:#fff;border:1px solid #e0e0e0;border-radius:8px;box-shadow:0 4px 16px rgba(0,0,0,.12);min-width:120px;padding:4px 0 }
.cust-menu span { display:block;padding:8px 14px;font-size:13px;cursor:pointer;color:#c0392b;white-space:nowrap }
.cust-menu span:hover { background:#fef0f0; }
.cust-paid { font-size: 20px; font-weight: 500; color: var(--color-text-primary, #222); }
.cust-caps { display: flex; gap: 6px; flex-wrap: wrap; }
.cust-caps .cap { font-size: 11px; padding: 2px 8px; border-radius: 10px; background: #f1efea; color: #5f5e5a; }
.cust-caps .cap.blue { background: #e6f1fb; color: #185fa5; }
.cust-caps .cap.green { background: #eaf3de; color: #3b6d11; }

/* ===== chips 筛选/切换 ===== */
.chip { font-size: 12px; padding: 5px 12px; border-radius: 14px; border: 1px solid var(--color-border-secondary, #dcdcdc); background: #fff; color: #444; cursor: pointer; }
.chip:hover { border-color: #b5b5b5; }
.chip.active { background: #534ab7; border-color: #534ab7; color: #fff; }

/* ===== 年度时间线 ===== */
.tl-head { display: grid; grid-template-columns: 160px repeat(12, 1fr); gap: 2px; font-size: 11px; color: #888; margin-bottom: 4px; }
.tl-head div:not(:first-child) { text-align: center; }
.tl-row { display: grid; grid-template-columns: 160px repeat(12, 1fr); gap: 2px; align-items: center; padding: 3px 0; border-top: 1px solid #f0f0f0; cursor: pointer; }
.tl-row:hover { background: #fafafa; }
.tl-name { font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; padding-right: 8px; color: #333; }
.tl-track { grid-column: 2 / 14; display: grid; grid-template-columns: repeat(12, 1fr); gap: 2px; }
.tl-cell { height: 14px; border-radius: 3px; background: #f1efea; }
.tl-cell.on { height: 14px; border-radius: 3px; }

/* ========== 产品化侧栏（分组 + 锁定） ========== */
.nav-group { margin-bottom: 8px; }
.nav-group-title { font-size: 11px; color: var(--muted); padding: 10px 16px 4px; letter-spacing: .5px; display: flex; align-items: center; gap: 6px; font-weight: 600; }
.nav-tag { background: var(--brand); color: #fff; font-size: 10px; padding: 1px 6px; border-radius: 6px; font-weight: 600; }
.sidebar a.locked { opacity: .72; }
.sidebar a.locked:hover { opacity: 1; }

/* ========== 素材中心 ========== */
.mat-toolbar { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; align-items: center; }
.mat-toolbar input, .mat-toolbar select { flex: 0 0 auto; }
.mat-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; }
.mat-card { border: 1px solid var(--line); border-radius: 10px; overflow: hidden; background: #fff; cursor: pointer; transition: .15s; }
.mat-card:hover { box-shadow: 0 4px 14px rgba(0,0,0,.08); transform: translateY(-2px); }
.mat-thumb { width: 100%; height: 130px; object-fit: cover; display: block; background: #f3f3f3; }
.mat-meta { padding: 8px 10px; }
.mat-title { font-size: 13px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.mat-tags { margin-top: 4px; display: flex; gap: 4px; flex-wrap: wrap; }
.mat-cat { font-size: 11px; background: #eef2ff; color: #3b4db8; padding: 1px 6px; border-radius: 5px; }
.mat-cat.gray { background: #f1f1f1; color: #666; }
.asset-preview { text-align: center; }
.btn.primary { background: var(--brand); color: #fff; }
.btn.danger { background: #e24b4a; color: #fff; }
.btn.ghost.danger { background: transparent; color: #e24b4a; border: 1px solid #e24b4a; }

/* ========== 每日签到 ========== */
.signin-wrap { display: grid; grid-template-columns: 320px 1fr; gap: 16px; align-items: start; }
.signin-hero { background: linear-gradient(135deg,#ff7e5f,#ff5e62); border-radius: 16px; padding: 28px 22px; color: #fff; text-align: center; box-shadow: 0 8px 24px rgba(255,94,98,.25); }
.signin-flame { font-size: 46px; line-height: 1; }
.signin-streak { font-size: 17px; margin-top: 8px; }
.signin-streak b { font-size: 30px; }
.signin-pts { font-size: 14px; margin-top: 6px; opacity: .95; }
.signin-pts b { font-size: 20px; }
.signin-btn { margin-top: 18px; width: 100%; background: #fff; color: #ff5e62; font-weight: 700; font-size: 16px; padding: 14px; border: none; box-shadow: 0 4px 12px rgba(0,0,0,.15); }
.signin-btn.done { background: rgba(255,255,255,.25); color: #fff; font-weight: 600; cursor: default; }
.signin-bonus { margin-top: 12px; font-size: 12px; opacity: .92; line-height: 1.5; }
.signin-side { display: flex; flex-direction: column; gap: 16px; }
.card-mini { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 14px; }
.card-mini-title { font-weight: 600; font-size: 14px; margin-bottom: 10px; }
.cal-head, .cal-grid { display: grid; grid-template-columns: repeat(7,1fr); gap: 4px; }
.cal-head span { text-align: center; font-size: 11px; color: var(--muted); padding: 2px 0; }
.cal-cell { aspect-ratio: 1 / 1; display: flex; flex-direction: column; align-items: center; justify-content: center; font-size: 12px; border-radius: 6px; background: #f6f6f6; color: #888; position: relative; }
.cal-cell.empty { background: transparent; }
.cal-cell.done { background: #fff0ec; color: #ff5e62; font-weight: 600; }
.cal-cell.today { outline: 2px solid #ff5e62; outline-offset: -1px; }
.cal-pts { font-size: 9px; line-height: 1; margin-top: 1px; }
.heat-row { display: flex; flex-wrap: wrap; gap: 6px; }
.heat-cell { display: flex; flex-direction: column; align-items: center; min-width: 46px; padding: 6px 4px; border-radius: 8px; background: #fff0ec; color: #ff5e62; font-size: 11px; }
.heat-cell.today { outline: 2px solid #ff5e62; }
.heat-d { font-weight: 600; }
.heat-p { font-size: 10px; opacity: .8; }
.signin-exchange { margin-top: 16px; }
.ex-cards { display: grid; grid-template-columns: repeat(auto-fill,minmax(150px,1fr)); gap: 12px; }
.ex-card { border: 1px dashed #ffb3a7; border-radius: 12px; padding: 14px; text-align: center; background: #fffaf8; }
.ex-ico { font-size: 28px; }
.ex-name { font-weight: 600; font-size: 14px; margin-top: 6px; }
.ex-cost { font-size: 12px; color: #ff5e62; margin-top: 4px; }
.ex-tag { display: inline-block; margin-top: 6px; font-size: 10px; background: #ff5e62; color: #fff; padding: 1px 8px; border-radius: 8px; }
.hist-list { display: flex; flex-direction: column; gap: 6px; }
/* v20260917q 上下班打卡 */
.cal-cell.absent { background: #fdecea; color: #d93025; }
.cl-badges { display: flex; flex-direction: column; align-items: center; gap: 1px; margin-top: 2px; line-height: 1; }
.cl-on, .cl-off { font-size: 9px; padding: 0 3px; border-radius: 4px; }
.cl-on { background: #e6f4ea; color: #1e7e34; }
.cl-off { background: #e8f0fe; color: #1a56c4; }
.cl-late { font-size: 9px; background: #fff3e0; color: #e65100; padding: 0 3px; border-radius: 4px; }
.cl-early { font-size: 9px; background: #f3e5f5; color: #6a1b9a; padding: 0 3px; border-radius: 4px; }
.cl-abs { font-size: 10px; font-weight: 700; }
.cal-legend { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 10px; font-size: 11px; color: var(--muted); }
.cal-legend i.lg { display: inline-block; width: 10px; height: 10px; border-radius: 3px; margin-right: 3px; vertical-align: -1px; }
.cal-legend i.on { background: #e6f4ea; border: 1px solid #1e7e34; }
.cal-legend i.off { background: #e8f0fe; border: 1px solid #1a56c4; }
.cal-legend i.late { background: #fff3e0; border: 1px solid #e65100; }
.cal-legend i.early { background: #f3e5f5; border: 1px solid #6a1b9a; }
.cal-legend i.absent { background: #fdecea; border: 1px solid #d93025; }
.clock-hero { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; background: linear-gradient(135deg,#fff7ed,#e8f0fe); border: 1px solid var(--line); border-radius: 14px; padding: 16px 18px; }
.clock-hero-l { flex: 1; min-width: 120px; }
.clock-h-date { font-size: 18px; font-weight: 700; }
.clock-h-sub { font-size: 12px; color: var(--muted); margin-top: 2px; }
.clock-hero-r { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.clock-pill { cursor: pointer; min-width: 110px; text-align: center; background: #fff; border: 2px solid #ff5e62; border-radius: 12px; padding: 10px 14px; transition: .15s; }
.clock-pill:hover { box-shadow: 0 4px 14px rgba(255,94,98,.2); }
.clock-pill.done { border-color: #2e7d32; background: #f1f8f3; }
.clock-pill-lbl { font-size: 13px; font-weight: 600; white-space: nowrap; }
.clock-pill-time { font-size: 16px; font-weight: 700; margin-top: 2px; }
.clock-pill.done .clock-pill-time { color: #2e7d32; }
.clock-arrow { font-size: 20px; color: var(--muted); }
.clock-rule { width: 100%; font-size: 12px; color: var(--muted); margin-top: 4px; }
.clock-nav { display: flex; align-items: center; justify-content: center; gap: 14px; margin: 14px 0 4px; }
.clock-nav-m { font-weight: 600; font-size: 14px; white-space: nowrap; }
.att-list { display: flex; flex-direction: column; gap: 10px; }
.att-row { border: 1px solid var(--line); border-radius: 12px; padding: 12px 14px; background: #fff; }
.att-name { font-weight: 600; font-size: 14px; display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.att-tag { font-size: 11px; background: #eef2f7; color: #555; padding: 1px 8px; border-radius: 8px; font-weight: 400; }
.att-stats { display: flex; gap: 12px; font-size: 12px; margin: 6px 0; }
.att-stats .ok { color: #2e7d32; }
.att-stats .late { color: #e65100; }
.att-stats .early { color: #6a1b9a; }
.att-stats .absent { color: #d93025; }
.att-strip { display: flex; flex-wrap: wrap; gap: 3px; }
.day-cell { width: 16px; height: 16px; border-radius: 4px; background: #eee; }
.day-cell.ok { background: #c8e6c9; }
.day-cell.late { background: #ffcc80; }
.day-cell.early { background: #e1bee7; }
.day-cell.late-early { background: linear-gradient(135deg,#ffcc80 50%,#e1bee7 50%); }
.day-cell.absent { background: #ffcdd2; }
.day-cell.future { background: #f2f2f2; }
.hist-row { display: flex; align-items: center; gap: 12px; font-size: 13px; padding: 7px 10px; border-radius: 8px; background: #fafafa; }
.hist-row b { margin-left: auto; color: #ff5e62; }

/* ========== 幸运抽奖（大转盘） ========== */
.lottery-wrap { display: grid; grid-template-columns: 320px 1fr; gap: 20px; align-items: start; }
.lottery-wheel-area { position: relative; width: 280px; height: 280px; margin: 0 auto; }
.wheel-svg { display: block; border-radius: 50%; box-shadow: 0 10px 30px rgba(0,0,0,.12); background: #fff; }
#wheel-rot { transform-box: view-box; transform-origin: 120px 120px; transition: transform 2.6s cubic-bezier(.17,.67,.3,1.2); }
.wheel-pointer { position: absolute; top: -6px; left: 50%; transform: translateX(-50%); font-size: 26px; color: #ff3b3b; z-index: 3; filter: drop-shadow(0 2px 2px rgba(0,0,0,.2)); }
.wheel-center-btn { position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%); width: 78px; height: 78px; border-radius: 50%; border: 4px solid #fff; background: linear-gradient(135deg,#ff7e5f,#ff5e62); color: #fff; font-weight: 700; font-size: 15px; line-height: 1.15; cursor: pointer; box-shadow: 0 4px 14px rgba(255,94,98,.4); z-index: 2; }
.wheel-center-btn:disabled { cursor: default; opacity: .85; }
.wheel-center-btn .cost { font-size: 11px; font-weight: 500; opacity: .95; }
.lottery-side { display: flex; flex-direction: column; gap: 16px; }
.lottery-records { display: flex; flex-direction: column; gap: 6px; max-height: 280px; overflow-y: auto; }
.lottery-rec { display: flex; align-items: center; gap: 10px; font-size: 13px; padding: 7px 10px; border-radius: 8px; background: #fafafa; }
.lr-emoji { font-size: 18px; }
.lr-name { font-weight: 600; }
.lr-gain { margin-left: auto; color: #ff5e62; font-weight: 700; }
.lr-date { font-size: 11px; color: var(--muted); margin-left: 8px; }
.lottery-modal-mask { position: fixed; inset: 0; background: rgba(0,0,0,.45); display: flex; align-items: center; justify-content: center; z-index: 999; }
/* 图片放大 Lightbox */
.lightbox-overlay { position: fixed; inset: 0; background: rgba(0,0,0,.75); display: flex; align-items: center; justify-content: center; z-index: 900; cursor: zoom-out; animation: fadeIn .15s ease; }
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
.lottery-modal { background: #fff; border-radius: 18px; padding: 30px 36px; text-align: center; box-shadow: 0 20px 60px rgba(0,0,0,.3); animation: pop .3s ease; }
@keyframes pop { from { transform: scale(.8); opacity: 0; } to { transform: scale(1); opacity: 1; } }
.lm-emoji { font-size: 56px; line-height: 1; }
.lm-title { font-size: 22px; font-weight: 800; margin: 12px 0 6px; }
.lm-sub { font-size: 14px; color: var(--muted); margin-bottom: 18px; }

/* ========== AI 群聊 ========== */
.chat-demo-banner { background: #fff7e6; border: 1px solid #ffe0a3; color: #8a5a00; padding: 8px 12px; border-radius: 8px; font-size: 12px; margin-bottom: 12px; }
.chat-wrap { display: grid; grid-template-columns: 240px 1fr; gap: 14px; height: calc(100vh - 200px); min-height: 480px; }
.chat-side { background: #fff; border: 1px solid var(--line); border-radius: 12px; padding: 12px; overflow-y: auto; }
.chat-side-sec { margin-bottom: 16px; }
.chat-side-h { font-size: 12px; font-weight: 700; color: var(--muted); margin-bottom: 8px; }
.sess-list { display: flex; flex-direction: column; gap: 4px; }
.sess-item { font-size: 13px; padding: 7px 9px; border-radius: 8px; background: #f6f6f6; cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sess-item:hover { background: #eee; }
.sess-item.active { background: #e8edff; color: #3b4db8; font-weight: 600; }
.role-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.role-chip { font-size: 12px; padding: 5px 10px; border-radius: 16px; background: #f1f1f1; color: #888; cursor: pointer; border: 1px solid transparent; user-select: none; }
.role-chip.on { background: #e8f7f0; color: #0F6E56; border-color: #9fe0c4; font-weight: 600; }
.chat-main { display: flex; flex-direction: column; background: #fff; border: 1px solid var(--line); border-radius: 12px; overflow: hidden; }
.chat-msgs { flex: 1; overflow-y: auto; padding: 16px; background: #fafbfc; }
.msg { display: flex; margin-bottom: 14px; }
.msg.user { justify-content: flex-end; }
.msg.user .bubble { background: var(--brand); color: #fff; border-radius: 14px 14px 4px 14px; padding: 9px 13px; max-width: 70%; font-size: 14px; line-height: 1.5; white-space: pre-wrap; }
.msg.ai { gap: 10px; align-items: flex-start; }
.msg.ai .avatar { width: 36px; height: 36px; border-radius: 50%; background: #fff; display: flex; align-items: center; justify-content: center; font-size: 20px; border: 1px solid var(--line); flex-shrink: 0; }
.ai-body { max-width: 80%; }
.ai-name { font-size: 11px; color: var(--muted); margin-bottom: 3px; }
.msg.ai .bubble { background: #fff; border: 1px solid var(--line); border-radius: 4px 14px 14px 14px; padding: 9px 13px; font-size: 14px; line-height: 1.6; white-space: pre-wrap; }
.chat-input { display: flex; gap: 10px; padding: 12px; border-top: 1px solid var(--line); background: #fff; }
.chat-input textarea { flex: 1; resize: none; border: 1px solid var(--line); border-radius: 10px; padding: 10px; font-size: 14px; font-family: inherit; }
.chat-input .btn { align-self: flex-end; }

/* ========== 方案中心 ========== */
.sol-search { display:flex; gap:8px; margin-bottom:14px; }
.sol-cats { display:flex; gap:6px; flex-wrap:wrap; margin-bottom:16px; }
.cat-btn { padding:5px 14px; border:1px solid var(--line); border-radius:20px; background:#fff; font-size:12px; color:var(--muted); cursor:pointer; transition:all .2s; }
.cat-btn:hover { border-color:var(--brand); color:var(--brand); }
.cat-btn.active { background:var(--brand); color:#fff; border-color:var(--brand); }
.sol-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(300px,1fr)); gap:14px; }
.sol-card { background:#fff; border:1px solid var(--line); border-radius:12px; padding:18px; cursor:pointer; transition:all .2s; position:relative; }
.sol-card:hover { border-color:var(--brand); box-shadow:0 4px 16px rgba(255,106,61,.12); transform:translateY(-2px); }
.sol-cat-tag { position:absolute;top:12px;right:12px;background:#f0f7ff;color:#185fa5;font-size:11px;padding:2px 10px;border-radius:10px; }
.sol-title { font-size:16px;font-weight:700;margin:6px 0 8px;line-height:1.4; }
.sol-summary { font-size:13px;color:var(--muted);line-height:1.6;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden; }
.sol-meta { display:flex; gap:8px; align-items:center; margin-top:10px; flex-wrap:wrap; }
.sol-tag { background:#fff3e0;color:#e65100;font-size:11px;padding:2px 8px;border-radius:4px; }
.sol-views { font-size:12px;color:#999;margin-left:auto; }
.sol-act { margin-top:10px;font-size:13px;color:var(--brand);font-weight:600; }
.sol-detail-body { max-height:60vh; overflow-y:auto;padding:16px;background:#fafbfc;border-radius:10px;font-size:14px;line-height:1.8; }
.sol-detail-body h2,.sol-detail-body h3,.sol-detail-body h4 { margin:12px 0 6px; color:var(--text); }
.sol-detail-body ul { padding-left:20px; }
.sol-detail-body li { margin:4px 0; }
.sol-detail-body .md-table { width:100%;border-collapse:collapse;margin:8px 0;font-size:13px; }
.sol-detail-body .md-table th,.sol-detail-body .md-table td { border:1px solid #ddd;padding:6px 10px;text-align:left; }
.sol-detail-body .md-table th { background:#f5f5f5; }

/* ========== 免费工具 ========== */
.ft-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(200px,1fr)); gap:14px; }
.ft-card { background:#fff; border:1px solid var(--line); border-radius:12px; padding:20px;text-align:center;cursor:pointer;transition:all .2s; }
.ft-card:hover { border-color:var(--brand); box-shadow:0 4px 12px rgba(0,0,0,.08); transform:translateY(-2px); }
.ft-ico { font-size:36px;margin-bottom:8px; }
.ft-name { font-size:15px;font-weight:700;margin-bottom:4px; }
.ft-desc { font-size:12px;color:var(--muted);line-height:1.4; }

/* ========== 集章寻宝·分享弹窗 ========== */
.share-box { background:#f4f8ff;border:1px solid var(--brand);border-radius:12px;padding:14px;margin-bottom:12px; }
.sb-title { font-weight:700;margin-bottom:8px;color:var(--brand); }
.sb-link { width:100%;font-size:13px;line-height:1.5;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:#fff;color:var(--text);resize:vertical; }
.share-box .btn.sm { margin-top:8px; }

/* ========== 集章寻宝 / 任务打卡 ========== */
.task-progress { background:#fff;border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:16px; }
.tp-bar { height:10px;background:#eef0f3;border-radius:6px;overflow:hidden; }
.tp-fill { height:100%;background:linear-gradient(90deg,#ff9a3c,#ff5e62);transition:width .4s; }
.tp-text { font-size:13px;color:var(--muted);margin-top:8px;font-weight:600; }
.task-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)); gap:14px; }
.task-card { background:#fff;border:1px solid var(--line);border-radius:12px;padding:18px 16px;display:flex;flex-direction:column;align-items:center;text-align:center;gap:10px;transition:all .2s; }
.task-card.on { border-color:#ffb74d;background:#fffaf2; }
.task-icon { font-size:34px;line-height:1;flex:0 0 auto; }
.task-main { flex:none;width:100%;min-width:0; }
.task-title { font-size:15px;font-weight:700; }
.task-desc { font-size:12px;color:var(--muted);margin:6px 0; }
.stamp-done { color:#2e7d32;font-weight:600;font-size:13px; }
.stamp-ready { color:#ff8f00;font-weight:600;font-size:13px; }
.stamp-lock { color:#bbb;font-size:13px; }
.task-act { flex:none; }
.task-act .btn { white-space:nowrap; }
.task-claim { margin-top:18px;text-align:center; }
.claim-done { display:inline-block;background:#e8f5e9;color:#2e7d32;font-weight:700;padding:12px 20px;border-radius:10px; }
.btn.big { font-size:15px;padding:14px 28px; }

/* ========== 供需名片墙 ========== */
.market-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(280px,1fr)); gap:14px; }
.market-card { background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px;display:flex;gap:12px; }
.mc-avatar { width:46px;height:46px;border-radius:50%;background:linear-gradient(135deg,#5b8def,#9b6dff);color:#fff;font-size:20px;font-weight:700;display:flex;align-items:center;justify-content:center;flex:0 0 auto; }
.mc-body { flex:1;min-width:0; }
.mc-name { font-size:15px;font-weight:700;margin-bottom:6px; }
.mc-tag { display:inline-block;background:#eef3ff;color:#3a6df0;font-size:12px;padding:2px 10px;border-radius:20px;margin-bottom:6px; }
.mc-line { font-size:13px;color:#555;margin:3px 0; }
.mc-demand { color:#e65100; }
.mc-phone { color:#888;font-size:12px; }

/* ========== 供应商公开名片区块 ========== */
.pub-card { margin-top:12px;padding:14px;border:1px dashed #c7c7e8;border-radius:10px;background:#fafaff; }
.pub-card-title { font-weight:600;margin-bottom:8px; }
.chk-row { display:flex;align-items:center;gap:6px;font-size:13px;cursor:pointer; }

/* ========== 项目佐证图网格 ========== */
/* v20260912b 佐证图缩小约 1/3（110px 高 → 76px 高、单张宽 120→108 上限），一屏能多放几张，
   顺带把「佐证卡一高、右边『方案备份』被网格拉伸跟着变高」的问题一起解决（交付区网格改 align-items:start）。 */
.ev-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(84px,108px)); gap:8px; }
.ev-card { border:1px solid #eee; border-radius:8px; overflow:hidden; background:#fff; }
.ev-card img { width:100%; aspect-ratio:4/3; height:auto; object-fit:contain; display:block; background:#f5f5f5; }
/* 说明文字最多 2 行（超出省略号，鼠标悬停看全）：图变小后单行放不下「现场拍照 09/10 20:13」这种时间戳，
   单行省略会把时间吃掉，2 行既保住信息又不至于把卡片重新撑高 */
.ev-cap { font-size:11px; padding:4px 6px; color:#444; line-height:1.25; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; word-break:break-all; }
/* v20260912a 佐证图右上角「⋯」删除键：默认半透明不抢眼，hover/按住才明显（就是正哥要的"不太显眼的地方"） */
/* v20260917y 增左上角下载键 + 改图片为 4:3 contain 保持原比例 */
.ev-card { position: relative; }
.ev-more { position:absolute; top:4px; right:4px; width:18px; height:18px; padding:0; line-height:1;
  display:flex; align-items:center; justify-content:center; border:none; border-radius:50%;
  background:rgba(0,0,0,.45); color:#fff; font-size:13px; font-weight:700; cursor:pointer;
  opacity:.5; transition:opacity .15s, background .15s, transform .15s; -webkit-tap-highlight-color:transparent; }
.ev-more:hover { opacity:1; background:var(--danger); transform:scale(1.08); }
.ev-more:active { transform:scale(.94); }
.ev-dl { position:absolute; top:4px; left:4px; width:18px; height:18px; padding:0; line-height:1;
  display:flex; align-items:center; justify-content:center; border:none; border-radius:50%;
  background:rgba(0,0,0,.45); color:#fff; font-size:10px; font-weight:700; cursor:pointer;
  opacity:.5; transition:opacity .15s, background .15s, transform .15s; -webkit-tap-highlight-color:transparent; text-decoration:none; }
.ev-dl:hover { opacity:1; background:var(--info); transform:scale(1.08); }
.ev-dl:active { transform:scale(.94); }

/* ========== 微信内授权引导遮罩（安卓/鸿蒙手动点击跳转，避免 webview 拦截） ========== */
.wx-auth-mask { position:fixed; inset:0; background:rgba(0,0,0,.55); z-index:99998; display:flex; align-items:center; justify-content:center; padding:24px; }
.wx-auth-card { background:#fff; border-radius:16px; padding:28px 22px; width:100%; max-width:320px; text-align:center; box-shadow:0 8px 30px rgba(0,0,0,.18); }
.wx-auth-title { font-size:18px; font-weight:700; color:#222; margin-bottom:8px; }
.wx-auth-tip { font-size:13px; color:#888; margin-bottom:18px; line-height:1.5; }
.wx-auth-qr { width:200px; height:200px; border:1px solid #eee; border-radius:10px; display:block; margin:0 auto; }

/* ========== 跨租户协作 ========== */
.collab-banner { background:#EAF0FF; border:1px solid #C9D6FF; color:#274690; border-radius:8px; padding:10px 12px; font-size:13px; margin-bottom:12px; }
.collab-sec-title { font-size:13px; font-weight:600; color:#534AB7; margin:16px 0 8px; }
.collab-card { display:flex; justify-content:space-between; align-items:center; gap:12px; background:#fff; border:1px solid var(--color-border); border-radius:10px; padding:12px 14px; margin-bottom:8px; }
.collab-card.rejected { opacity:.6; }
.collab-main { flex:1; }
.collab-ops { display:flex; gap:8px; align-items:center; }
.dir-results { margin:6px 0 4px; max-height:220px; overflow:auto; }
.dir-item { display:flex; justify-content:space-between; align-items:center; gap:10px; background:#fafaff; border:1px solid #eee; border-radius:8px; padding:8px 10px; margin-bottom:6px; }
.dir-info { font-size:13px; color:#333; }
.dir-info b { color:#222; }

/* 悬浮添加按钮（资源整合页 · 底部居中） */
.res-fab {
  position: fixed; left: 50%; bottom: 24px; transform: translateX(-50%); z-index: 999;
  height: 44px; border-radius: 22px; padding: 0 24px;
  background: var(--brand, #e24b4a); color: #fff;
  border: none; font-size: 16px; font-weight: 600; line-height: 1;
  cursor: pointer; box-shadow: 0 4px 14px rgba(226,75,74,.35);
  display: flex; align-items: center; justify-content: center; gap: 6px;
  white-space: nowrap; word-break: keep-all; flex-shrink: 0;
  transition: transform .15s, box-shadow .15s;
}
.res-fab::before { content: '+ '; font-size: 18px; font-weight: 700; }
.res-fab:hover { transform: translateX(-50%) scale(1.04); box-shadow: 0 6px 20px rgba(226,75,74,.45); }
.res-fab:active { transform: translateX(-50%) scale(.97); }

/* ================== 库管（设备台账 / 借用归还 / 提醒）2026-09 ================== */
/* 表单通用字段（库管各弹窗使用，与资源弹窗同一套视觉） */
.res-form .field { margin-bottom: 14px; }
.res-form .field label { display: block; font-size: 13px; color: var(--muted); margin-bottom: 5px; }
.res-form .field label .req { color: #e24b4a; font-weight: 700; }

/* 侧栏菜单角标（库管提醒数 / 超管待审） */
.sidebar a { position: relative; }
.sidebar a .badge { position: absolute; top: 4px; right: 6px; min-width: 16px; height: 16px; padding: 0 4px; border-radius: 9px; background: #f5222d; color: #fff; font-size: 11px; line-height: 16px; text-align: center; }

/* 设备列表行 */
.eq-row { background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 12px 14px; margin-bottom: 10px; }
.eq-row[data-action] { cursor: pointer; }
.eq-row[data-action]:hover { border-color: var(--brand); }

/* 驾驶舱设备提醒横幅 */
.eq-remind-bar { background: #fff7e6; border: 1px solid #ffd591; color: #ad6800; border-radius: 10px; padding: 10px 14px; margin-bottom: 14px; cursor: pointer; font-size: 13px; }
.eq-remind-bar:hover { border-color: #e6a23c; }

/* ============ 漂流瓶（2026-09-02） ============ */
.bottle-entry { display: flex; align-items: center; gap: 12px; background: linear-gradient(120deg, #e3f2fd, #fff3e0); border: 1px solid #bbdefb; border-radius: 12px; padding: 12px 14px; margin-bottom: 12px; cursor: pointer; }
.bottle-entry:hover { border-color: var(--brand); }
.bottle-entry-emoji { font-size: 28px; animation: bottle-bob 2s ease-in-out infinite; }
.bottle-entry-main { flex: 1; }
.bottle-entry-go { color: var(--brand); font-weight: 600; white-space: nowrap; }
.bottle-hero { background: linear-gradient(160deg, #0b3d91 0%, #1565c0 45%, #42a5f5 100%); border-radius: 16px; padding: 22px 18px; color: #fff; margin-bottom: 14px; position: relative; overflow: hidden; }
.bottle-hero::after { content: ''; position: absolute; inset: 0; background: radial-gradient(ellipse at 70% 120%, rgba(255,255,255,.25), transparent 60%); pointer-events: none; }
.bottle-hero-title { font-size: 22px; font-weight: 700; }
.bottle-hero-sub { font-size: 12px; opacity: .85; margin: 4px 0 14px; line-height: 1.6; }
.bottle-hero-actions { display: flex; gap: 10px; flex-wrap: wrap; }
.bottle-pick-btn { background: #fff; color: #0b3d91; font-size: 15px; font-weight: 700; padding: 12px 24px; border-radius: 999px; box-shadow: 0 4px 14px rgba(0,0,0,.25); }
.bottle-pick-btn:hover { transform: translateY(-1px); }
.bottle-pick-btn:disabled { opacity: .6; }
.bottle-hero .btn.ghost { background: rgba(255,255,255,.14); color: #fff; border-color: rgba(255,255,255,.4); }
.bottle-hero-quota { font-size: 12px; opacity: .9; margin-top: 10px; }
.bottle-hero-quota b { color: #ffd54f; }
.bottle-sea { margin-top: 14px; min-height: 60px; }
.bottle-sea-hint { color: rgba(255,255,255,.75); font-size: 13px; padding: 8px 0; }
.bottle-rise { font-size: 44px; text-align: center; animation: bottle-rise 1s ease; }
@keyframes bottle-bob { 0%,100% { transform: translateY(0); } 50% { transform: translateY(-4px); } }
@keyframes bottle-rise { 0% { transform: translateY(26px); opacity: 0; } 60% { transform: translateY(-6px); opacity: 1; } 100% { transform: translateY(0); } }
.bottle-card { background: #fff; color: var(--text); border-radius: 14px; padding: 14px 16px; box-shadow: 0 4px 16px rgba(0,0,0,.12); margin-top: 8px; }
.bottle-card-top { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; }
.bottle-type { font-weight: 700; font-size: 13px; }
.bottle-card.mood .bottle-type { color: #2e7d32; }
.bottle-card.biz .bottle-type { color: var(--brand); }
.bottle-tag { font-size: 12px; color: var(--muted); }
.bottle-title { font-weight: 700; margin-bottom: 4px; }
.bottle-content { font-size: 14px; line-height: 1.7; white-space: pre-wrap; word-break: break-all; }
.bottle-budget { font-size: 12px; color: #ad6800; background: #fff7e6; display: inline-block; padding: 2px 8px; border-radius: 6px; margin-top: 8px; }
.bottle-meta { font-size: 11px; color: var(--muted); margin-top: 8px; }
.bottle-actions { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 10px; }
.bottle-partner { font-size: 12px; color: #2e7d32; background: #e8f5e9; border-radius: 8px; padding: 8px 10px; margin-top: 8px; }
.bottle-wait { font-size: 12px; color: var(--muted); align-self: center; }
.bottle-mine { background: var(--card); border: 1px solid var(--line); border-radius: 14px; padding: 12px; }
.bottle-tabs { display: flex; gap: 8px; margin-bottom: 10px; }
.bottle-tab { padding: 6px 14px; border-radius: 999px; background: var(--bg); font-size: 13px; cursor: pointer; color: var(--muted); }
.bottle-tab.on { background: var(--brand); color: #fff; font-weight: 600; }
.bottle-thread { border: 1px solid var(--line); border-radius: 10px; padding: 10px; margin-bottom: 10px; }
.bottle-msg { font-size: 13px; background: var(--bg); border-radius: 10px; padding: 8px 10px; margin-top: 6px; line-height: 1.6; }
.bottle-msg.me { background: #e8f5e9; }
.bottle-msg-time { font-size: 11px; color: var(--muted); margin-top: 4px; }

/* ---------- 发票/凭证 拖拽上传（多张） ---------- */
.fin-drop { border: 2px dashed var(--line); border-radius: 10px; padding: 14px 10px; text-align: center; cursor: pointer; background: var(--card); color: var(--text); transition: border-color .15s, background .15s; }
.fin-drop:hover { border-color: var(--brand); }
.fin-drop.over { border-color: var(--brand); background: #fff7f2; box-shadow: 0 0 0 3px rgba(255,106,61,.12); }
.fin-quick { display: flex; gap: 8px; margin-bottom: 8px; }
.fin-qbtn { flex: 1; display: flex; align-items: center; justify-content: center; gap: 6px; padding: 9px 6px; background: var(--card); border: 1px solid var(--line); border-radius: 10px; font-size: 13px; color: var(--text); cursor: pointer; transition: border-color .12s, background .12s; }
.fin-qbtn:hover { border-color: var(--brand); background: #fff7f2; }
.fin-qbtn .ic { font-size: 18px; line-height: 1; }
/* 扫码弹窗 */
.qr-overlay { position: fixed; inset: 0; background: rgba(15,23,42,.55); display: flex; align-items: center; justify-content: center; z-index: 9999; padding: 20px; }
.qr-card { background: #fff; border-radius: 16px; padding: 22px 20px; max-width: 360px; width: 100%; box-shadow: 0 20px 50px rgba(0,0,0,.25); }
.qr-head { text-align: center; margin-bottom: 12px; }
.qr-head h3 { font-size: 17px; font-weight: 600; margin: 0 0 4px; }
.qr-head .sub { font-size: 12px; color: var(--muted); }
.qr-timer { display: inline-flex; align-items: center; gap: 6px; margin-top: 10px; padding: 4px 12px; background: #f3f4f6; border-radius: 14px; font-size: 12px; color: #6b7280; font-variant-numeric: tabular-nums; }
.qr-timer.warn { background: #fff7ed; color: #ea580c; }
.qr-timer.expired { background: #fef2f2; color: #dc2626; }
.qr-box { display: flex; justify-content: center; padding: 6px 0; min-height: 212px; align-items: center; }
.qr-box #qrcode, .qr-box > div, .qr-box canvas, .qr-box img { width: 200px !important; height: 200px !important; }
.qr-id { text-align: center; font-size: 12px; color: var(--muted); margin-top: 4px; }
.qr-id b { color: var(--text); font-family: ui-monospace, SFMono-Regular, Menlo, monospace; letter-spacing: 0.5px; }
.qr-list { background: #f9fafb; border-radius: 10px; padding: 8px 10px; margin-top: 12px; max-height: 120px; overflow: auto; }
.qr-list .row { display: flex; align-items: center; gap: 8px; padding: 4px 0; font-size: 12px; }
.qr-list .row .nm { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text); }
.qr-list .row .ok { color: #22c55e; font-weight: 600; }
.qr-empty { color: var(--muted); text-align: center; padding: 10px 0; font-size: 12px; }
.qr-foot { display: flex; gap: 8px; margin-top: 14px; }
.qr-foot .btn { flex: 1; }
.fin-receipt-grid { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; align-items: center; }
.fin-receipt-thumb { position: relative; width: 84px; height: 84px; border-radius: 8px; overflow: hidden; border: 1px solid var(--line); background: #fff; flex: 0 0 auto; }
.fin-receipt-thumb.view { width: 120px; height: 120px; }
.fin-receipt-thumb img { width: 100%; height: 100%; object-fit: cover; cursor: zoom-in; display: block; }
.fin-receipt-del { position: absolute; top: -7px; right: -7px; width: 20px; height: 20px; border-radius: 50%; border: 1px solid #fff; background: #e24b4a; color: #fff; font-size: 13px; line-height: 1; cursor: pointer; box-shadow: 0 1px 3px rgba(0,0,0,.25); padding: 0; }
.fin-receipt-del:hover { background: #c0392b; }
.fin-receipt-count { font-size: 12px; color: var(--muted); }

/* ---------- 行业要闻（驾驶舱首页） ---------- */
.news-list { background: var(--card); border: 1px solid var(--line); border-radius: 12px; padding: 4px 16px; }
.news-item { display: block; padding: 11px 0; border-bottom: 1px dashed var(--line); text-decoration: none; }
.news-item:last-child { border-bottom: none; }
.news-title { font-size: 14px; font-weight: 600; line-height: 1.5; color: var(--text); }
.news-item:hover .news-title { color: var(--brand); }
.news-sum { font-size: 12px; color: var(--muted); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.news-meta { font-size: 11px; color: var(--muted); margin-top: 4px; }
.news-read { color: var(--brand); font-weight: 600; }
.news-item:hover .news-title { color: var(--brand); }
.news-body { background: #fbfaf7; border-radius: 8px; padding: 2px 12px 8px; margin: 4px -6px 0; }

/* 营销获客外链工具卡（a 标签复用 ft-card） */
a.ft-card { display: block; text-decoration: none; color: var(--text); }

/* 视觉隐藏的 file input（display:none 在部分浏览器会拦截程序化 click 弹文件框） */
.vis-hidden-input { position: absolute !important; width: 1px !important; height: 1px !important; opacity: 0 !important; overflow: hidden !important; clip: rect(0 0 0 0) !important; pointer-events: none; }
.fin-drop { display: block; }
label.fin-qbtn { user-select: none; }

/* 项目详情「更多操作」原生下拉 */
.pd-ops { margin-top: 10px; }
.pd-ops summary { display: inline-block; padding: 7px 14px; background: var(--card); border: 1px solid var(--line); border-radius: 8px; font-size: 13px; cursor: pointer; user-select: none; color: var(--text); }
.pd-ops summary:hover { border-color: var(--brand); }
.pd-ops[open] summary { background: #fff7f2; border-color: var(--brand); }
.pd-ops-menu { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 8px; padding: 10px; background: var(--card); border: 1px solid var(--line); border-radius: 8px; }

/* v20260904x 侧边栏手风琴：一级区名 / 二级菜单 */
.nav-l1 { display: flex; justify-content: space-between; align-items: center; padding: 11px 14px; margin: 2px 0; font-weight: 700; font-size: 14.5px; color: var(--color-text-primary, #1f2330); border-radius: 10px; cursor: pointer; user-select: none; }
.nav-l1:hover { background: #F2F3F5; }
.nav-l1 .caret { font-size: 10px; color: var(--muted); transition: transform .15s; }
.nav-l1.open .caret { transform: rotate(90deg); }
/* v20260917x 直达项（报账台/假期区）右侧小箭头 ›，与分组 ▶ 视觉对齐；hover/选中时箭头位移+变色，呼应品牌色 */
.nav-l1 .nav-go { font-size: 15px; line-height: 1; color: var(--muted); font-weight: 700; margin-left: 6px; transition: color .15s, transform .15s; }
.nav-l1:hover .nav-go { color: var(--brand-600, #E85325); transform: translateX(2px); }
.nav-l1.active .nav-go { color: var(--brand-600, #E85325); }
.nav-l1 .nav-right { display: inline-flex; align-items: center; gap: 6px; }
.nav-sub { margin: 2px 0 8px; }
.nav-sub a { padding-left: 34px !important; font-size: 13px; }

/* v20260915m 桌面端：侧栏自身吸顶且高 = 一屏，底部「通知 / 刷新」永远露在屏幕下沿
   （否则页面一长，侧栏跟着滚动，底部的通知/刷新就滚没了；手机端是 fixed 抽屉，不受此规则影响） */
@media (min-width: 769px) {
  .sidebar { position: sticky; top: 56px; height: calc(100vh - 56px); }
}

/* v20260915m 侧栏底部工具区（通知 / 刷新）：原来在顶栏，正哥要求挪到左边侧栏下面。
   结构：.side-menu（菜单，自己滚）+ .side-tools（工具，恒贴底）。
   菜单再长也不会把「通知 / 刷新」顶出屏幕——这是"放侧栏下面"能成立的前提。 */
.side-menu { flex: 1 1 auto; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch; }
.side-tools { flex: none; margin-top: 8px; padding-top: 10px; border-top: 1px solid var(--line); display: flex; gap: 8px; }
.sidebar .side-tool { flex: 1 1 0; display: flex; align-items: center; justify-content: center; gap: 6px;
  padding: 9px 8px; margin-bottom: 0; border: 1px solid var(--line); border-radius: 8px; background: #fff;
  color: var(--text); font-size: 13px; font-weight: 600; line-height: 1.15; text-decoration: none;
  white-space: nowrap; word-break: keep-all; transition: background .15s ease; }
.sidebar .side-tool:hover { background: #f2f3f5; }
/* 角标贴在「通知」文字后面（覆盖 .sidebar a .badge 的绝对定位） */
.sidebar .side-tool .badge { position: static; top: auto; right: auto; margin-left: 1px;
  min-width: 16px; height: 16px; padding: 0 4px; border-radius: 9px; background: #f5222d; color: #fff;
  font-size: 11px; line-height: 16px; text-align: center; }
/* v20261005 侧栏「联系我们」满行高亮按钮 + 联系面板样式 */
.sidebar .side-tool.side-contact { flex: 1 1 100%; background: linear-gradient(135deg, var(--brand), #2f6bff); color: #fff; border-color: transparent; font-weight: 700; }
.sidebar .side-tool.side-contact:hover { filter: brightness(1.05); background: linear-gradient(135deg, var(--brand), #2f6bff); }
.side-tools { flex-wrap: wrap; }
.contact-card { max-width: 360px; }
.contact-card h3 { margin: 0 0 2px; }
.contact-line { display: flex; align-items: center; gap: 12px; padding: 12px 14px; margin-bottom: 10px; border: 1px solid var(--line); border-radius: 10px; background: #fff; text-decoration: none; color: var(--text); }
.contact-line:hover { background: #f7f8fa; }
.contact-ic { font-size: 22px; }
.contact-txt { flex: 1; line-height: 1.4; font-size: 13px; color: var(--text-2); }
.contact-txt b { font-size: 15px; color: var(--text); }
.contact-go { color: var(--brand); font-weight: 700; font-size: 13px; }
.contact-wx { margin-top: 4px; padding: 14px; border: 1px dashed var(--brand); border-radius: 12px; background: #fafcff; text-align: center; }
.contact-wx-title { font-weight: 700; margin-bottom: 4px; }
.contact-qr-img { width: 160px; height: 160px; object-fit: contain; border-radius: 8px; background: #fff; border: 1px solid var(--line); }
.contact-qr-empty { padding: 20px 10px; color: var(--text-2); font-size: 13px; line-height: 1.6; }
.contact-wxid { margin-top: 10px; font-size: 13px; color: var(--text-2); }
.contact-wxid b { color: var(--text); }

/* v20260904y 右上角公司名下拉（会员中心/账号设置/退出） */
.user-dd { position: fixed; top: 50px; right: 10px; z-index: 100000; background: #fff; border: 1px solid #e5e7eb; border-radius: 10px; box-shadow: 0 6px 24px rgba(0,0,0,.14); min-width: 150px; padding: 5px; display: none; }
.user-dd a { display: block; padding: 9px 12px; font-size: 13px; border-radius: 8px; color: var(--color-text-primary, #1f2330); text-decoration: none; }
.user-dd a:hover { background: #F2F3F5; }

/* ===== v20260905o 项目详情页双栏（设计规范 v1.0 第三批）===== */
.pd-hero { display: grid; grid-template-columns: 1fr; gap: var(--sp-3); margin-bottom: var(--sp-3); }
@media (min-width: 992px) {
  .pd-hero { grid-template-columns: minmax(0, 1fr) 400px; align-items: stretch; }
  .pd-hero-fin { position: sticky; top: 16px; }
}
.pd-hero-fin .fin-line { padding: 7px 0; font-size: var(--fs-body); border-bottom: 1px dashed var(--line); }
.pd-hero-fin .fin-line:last-child { border-bottom: none; }
.pd-hero .section { margin-bottom: 0; }
/* 统一板块标题：四字标题、同字号、同颜色、同间距（设计规范 v1.0） */
.pd-sec-title { display: flex; align-items: center; gap: 8px; font-size: var(--fs-title); font-weight: 600; color: var(--text-1); margin: 0 0 var(--sp-3); }
.pd-sec-title::before { content: ''; width: 4px; height: 14px; border-radius: 2px; background: var(--brand-600); flex-shrink: 0; }
.pd-sec-title .pd-sec-sub { font-size: var(--fs-caption); color: var(--text-3); font-weight: 400; }
.pd-sec-title .pd-sec-right { margin-left: auto; font-weight: 400; }
/* v20260910j 标题旁的小操作按钮：有边框、看得清，但比正文轻 */
.pd-sec-title .pd-mini-btn {
  display: inline-flex; align-items: center; gap: 3px;
  font-size: 12px; font-weight: 500; line-height: 1;
  padding: 4px 9px; border-radius: 999px;
  color: var(--brand-600); background: var(--brand-50);
  border: 1px solid var(--brand-100);
  text-decoration: none; white-space: nowrap; flex: 0 0 auto;
  transition: background .15s, border-color .15s;
}
.pd-sec-title .pd-mini-btn:hover { background: var(--brand-100); border-color: var(--brand-500); }
.pd-sec-title .pd-mini-btn:active { transform: translateY(1px); }

/* ============ v20260918c 新人引导向导（正中半透明磨砂弹层） ============ */
.ob-mask {
  position: fixed; inset: 0; z-index: 10000;
  display: none; align-items: center; justify-content: center;
  padding: 20px;
  overflow-y: auto;
  background: rgba(10, 14, 22, .42);
  backdrop-filter: blur(14px) saturate(1.2);
  -webkit-backdrop-filter: blur(14px) saturate(1.2);
  animation: obFade .25s ease;
}
@keyframes obFade { from { opacity: 0; } to { opacity: 1; } }
.ob-card {
  width: min(560px, 100%);
  margin: auto;
  background: rgba(255, 255, 255, .92);
  border: 1px solid rgba(255, 255, 255, .6);
  border-radius: 22px;
  box-shadow: 0 30px 80px rgba(0, 0, 0, .35);
  padding: 30px 30px 26px;
  text-align: center;
  animation: obPop .28s cubic-bezier(.2, .8, .3, 1);
}
@keyframes obPop { from { opacity: 0; transform: translateY(14px) scale(.97); } to { opacity: 1; transform: none; } }
.ob-step { font-size: 12px; color: var(--brand-600); font-weight: 700; letter-spacing: .5px; margin-bottom: 8px; }
.ob-card h2 { font-size: 21px; font-weight: 800; color: var(--text-1); margin: 0 0 6px; }
.ob-sub { font-size: 13px; color: var(--text-3); margin: 0 auto 18px; max-width: 420px; line-height: 1.6; }
.ob-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 12px; }
.ob-grid-2 { grid-template-columns: repeat(2, 1fr); }
.ob-ind, .ob-mode {
  display: flex; flex-direction: column; align-items: flex-start; gap: 4px;
  padding: 16px 16px; border-radius: 14px; cursor: pointer; text-align: left;
  background: #fff; border: 1.5px solid var(--line);
  transition: border-color .15s, box-shadow .15s, transform .1s;
}
.ob-ind:hover, .ob-mode:hover { border-color: var(--brand-500); box-shadow: 0 6px 18px rgba(0, 0, 0, .08); transform: translateY(-2px); }
.ob-ind:active, .ob-mode:active { transform: translateY(0); }
.ob-ic { font-size: 26px; line-height: 1; }
.ob-nm { font-size: 15px; font-weight: 700; color: var(--text-1); }
.ob-ds { font-size: 12px; color: var(--text-3); line-height: 1.45; }
.ob-next { width: 100%; margin-top: 16px; font-size: 15px; padding: 12px; }
.ob-link { background: none; border: 0; color: var(--text-3); font-size: 13px; cursor: pointer; margin-top: 14px; padding: 4px; }
.ob-link:hover { color: var(--brand-600); }
.ob-invite { font-size: 13px; color: var(--text-1); background: var(--card, #f5f6f8); border: 1px solid var(--line); border-radius: 10px; padding: 10px 12px; word-break: break-all; line-height: 1.5; }
/* v20260918c 新人上手提示条（固定底部，可关闭） */
.onboard-tip {
  position: fixed; left: 50%; bottom: 18px; transform: translateX(-50%);
  z-index: 9990; display: flex; align-items: center; gap: 12px;
  max-width: min(680px, calc(100% - 24px));
  padding: 12px 14px; border-radius: 14px;
  background: #0b1424; border: 1px solid #6d5c2c;
  box-shadow: 0 10px 30px rgba(0, 0, 0, .35);
  animation: obFade .3s ease;
}
.onboard-tip .ob-tip-ic { font-size: 20px; flex: none; }
.onboard-tip .ob-tip-body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.onboard-tip .ob-tip-body b { color: #fff; font-size: 13px; }
.onboard-tip .ob-tip-body span { color: rgba(255, 255, 255, .75); font-size: 12px; line-height: 1.5; }
.onboard-tip .ob-tip-acts { display: flex; gap: 8px; flex: none; }
.onboard-tip .ob-tip-acts a { color: #ffd479; font-size: 13px; font-weight: 600; text-decoration: none; white-space: nowrap; padding: 6px 10px; border: 1px solid rgba(255, 212, 121, .4); border-radius: 999px; }
.onboard-tip .ob-tip-acts a:hover { background: rgba(255, 212, 121, .12); }
.onboard-tip .ob-tip-x { flex: none; width: 24px; height: 24px; border: 0; border-radius: 7px; background: #2a3141; color: #fff; font-size: 13px; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; padding: 0; }
.onboard-tip .ob-tip-x:hover { background: #3a4457; }
@media (max-width: 560px) {
  .ob-grid { grid-template-columns: repeat(2, 1fr); gap: 10px; }
  .ob-card { padding: 22px 18px 20px; }
  .ob-ind, .ob-mode { padding: 12px 12px; }
  .ob-ic { font-size: 22px; }
  .ob-nm { font-size: 14px; }
  .ob-ds { font-size: 11px; }
  .ob-card h2 { font-size: 19px; white-space: nowrap; }
  .ob-sub { font-size: 12.5px; white-space: nowrap; }
  .onboard-tip .ob-tip-body span { display: none; }
}

/* ===== v20260922i 供应商选择器（替代浏览器原生 datalist：可搜索、点箭头必弹、不依赖浏览器实现）===== */
.sp-wrap { position: relative; display: block; }
.sp-wrap .sp-inp { width: 100%; padding-right: 28px; box-sizing: border-box; }
.sp-ar { position: absolute; right: 10px; top: 50%; transform: translateY(-50%); pointer-events: none; color: #8a94a6; font-size: 11px; line-height: 1; }
/* 用 fixed 定位：绕开 .modal 的 overflow:auto 裁剪（原生 datalist 在这里就会被裁掉） */
.sp-panel { position: fixed; z-index: 9999; background: #fff; border: 1px solid var(--line, #e3e3e3); border-radius: 10px; box-shadow: 0 10px 30px rgba(0, 0, 0, .16); max-height: 264px; overflow: auto; display: none; }
.sp-panel.open { display: block; }
.sp-hint { padding: 6px 10px; font-size: 11px; color: #8a94a6; border-bottom: 1px solid #f2f2f2; position: sticky; top: 0; background: #fff; z-index: 1; }
.sp-item { padding: 8px 10px; font-size: 13px; cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sp-item:hover { background: #FFF3EC; }
.sp-item .sp-sub { color: #8a94a6; font-size: 12px; }
.sp-empty { padding: 9px 10px; font-size: 12px; color: #c0392b; }

/* ===== v20261010p 展会库紧凑列表（固定列宽 · 全国大数据量） ===== */
.exh-toolbar { display:flex; flex-wrap:nowrap; gap:8px; align-items:center; margin-bottom:8px; }
.exh-sel { width:auto; flex:0 0 auto; min-width:92px; max-width:120px; padding:6px 10px; border:1px solid var(--line,#e3e3e3); border-radius:8px; font-size:13px; background:var(--card,#fff); color:var(--text,#222); }
.exh-search { flex:0 1 220px; min-width:140px; max-width:280px; padding:7px 12px; border:1px solid var(--line,#e3e3e3); border-radius:8px; font-size:13px; background:var(--card,#fff); color:var(--text,#222); }
.exh-toolbar .btn.sm { flex:0 0 auto; white-space:nowrap; }
.exh-month-tabs { display:flex; flex-wrap:wrap; gap:5px; margin-bottom:8px; }
.exh-month-tabs .mtab { padding:3px 11px; font-size:12px; border:1px solid var(--line,#e3e3e3); border-radius:14px; cursor:pointer; color:var(--muted,#8a94a6); background:var(--card,#fff); user-select:none; white-space:nowrap; }
.exh-month-tabs .mtab:hover { border-color:var(--brand,#ff7a00); color:var(--brand,#ff7a00); }
.exh-month-tabs .mtab.active { background:var(--brand,#ff7a00); color:#fff; border-color:var(--brand,#ff7a00); }
.exh-list { border:1px solid var(--line,#e3e3e3); border-radius:10px; overflow:hidden; background:var(--card,#fff); }
.exh-row { display:grid; grid-template-columns:64px 120px 230px 90px 170px 90px 110px 120px; gap:16px; align-items:center; padding:8px 12px; border-bottom:1px solid var(--line,#eee); font-size:13px; line-height:1.35; color:var(--text,#222); }
.exh-row:last-child { border-bottom:none; }
.exh-row.head { position:sticky; top:0; background:var(--bg,#f6f7f9); font-weight:600; color:var(--muted,#8a94a6); font-size:12px; z-index:2; }
.exh-row > div { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.exh-row .name { font-weight:400; }
.exh-row .scale { color:var(--text,#222); }
.exh-row .date { font-weight:400; }
.exh-days { color:#e67e22; font-size:11px; font-weight:600; }
.exh-row .ops { display:flex; flex-direction:row; flex-wrap:nowrap; gap:24px; justify-content:flex-end; overflow:visible; }
.exh-row .ops .btn { white-space:nowrap; flex-shrink:0; min-width:max-content; }
@media (max-width:760px){
  .exh-toolbar { flex-wrap:wrap; }
  .exh-search { min-width:100%; max-width:none; flex:1 1 100%; order:4; }
  .exh-sel { max-width:none; }
  .exh-list { overflow-x:auto; }
  .exh-row { min-width:1114px; grid-template-columns:64px 120px 230px 90px 170px 90px 110px 120px; }
  .exh-month-tabs { display:grid; grid-template-columns:repeat(6,1fr); gap:6px; }
  .exh-month-tabs .mtab { text-align:center; padding:5px 0; }
}

/* ============ 工作台执行分工表：手机端改为卡片式，解决「执行内容」竖向占板、其他列很空 ============ */
@media (max-width: 768px) {
  .exec-crew-wrap { overflow-x: visible !important; }
  .exec-crew-table,
  .exec-crew-table thead,
  .exec-crew-table tbody,
  .exec-crew-table th,
  .exec-crew-table td,
  .exec-crew-table tr { display: block; width: auto !important; min-width: auto !important; }
  .exec-crew-table thead { display: none; }
  .exec-crew-table tr { margin-bottom: 10px; border: 1px solid var(--color-border,#e5e8ef); border-radius: 10px; padding: 8px 10px; background: var(--color-card,#fff); }
  .exec-crew-table td { border: none; padding: 2px 0; text-align: left !important; vertical-align: top; line-height: 1.5; }
  /* 时间/地方/人员/工种 压缩成一行，不显示 label */
  .exec-crew-table td[data-label="时间"],
  .exec-crew-table td[data-label="地方"],
  .exec-crew-table td[data-label="人员"],
  .exec-crew-table td[data-label="工种"] { display: inline-block; margin-right: 10px; margin-bottom: 2px; }
  .exec-crew-table td[data-label="时间"]::before,
  .exec-crew-table td[data-label="地方"]::before,
  .exec-crew-table td[data-label="人员"]::before,
  .exec-crew-table td[data-label="工种"]::before { content: none; }
  /* 执行内容单独占满整行 */
  .exec-crew-table td[data-label="执行内容"] { display: block; margin-top: 6px; padding-top: 6px; border-top: 1px dashed var(--color-border,#e5e8ef); }
  .exec-crew-table td[data-label="执行内容"]::before { content: '执行内容'; display: block; font-size: 11px; color: var(--color-muted,#8a94a6); font-weight: 600; margin-bottom: 2px; }
  /* 操作按钮右下对齐 */
  .exec-crew-table td[data-label="操作"] { display: flex; justify-content: flex-end; gap: 10px; margin-top: 6px; padding-top: 6px; border-top: 1px dashed var(--color-border,#e5e8ef); }
  .exec-crew-table td[data-label="操作"]::before { content: none; }
  .exec-crew-table td[data-label="操作"] .btn { flex-shrink: 0; }
}
