:root {
  --bg:#f6f5f1;--text:#3f4245;--text-secondary:#8a8e88;--text-muted:#a8aca2;
  --border:#e7e4dc;--blue:#4f829a;--green:#6f8f4c;--orange:#c08a4b;
  --red:#c96b57;--purple:#8268ae;--indigo:#6d6f9e;
  /* 信号灯专用（比主题色更贴近真实信号灯：红更红灯、黄更黄灯、绿更正绿）—— 仅用于进度条/信号灯，不污染 --red/--orange/--green */
  --sig-red:#d2543f;--sig-yellow:#e0a82e;--sig-green:#5f8f45;
}
*{margin:0;padding:0;box-sizing:border-box;}
body{font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;background:var(--bg);color:var(--text);line-height:1.5;overflow-x:hidden;overflow-y:hidden;}

.header{background:#faf9f6;border-bottom:1px solid var(--border);padding:6px 16px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;position:fixed;top:0;left:0;right:0;z-index:200;}
.header h1{font-size:16px;font-weight:700;flex:0 0 100%;}  /* V1.266：强制标题占满第一行，其他控件自然换到第二行 */
.header-right{display:flex;gap:6px;align-items:center;flex-wrap:wrap;flex:1;min-width:0;}
.search-box,.select-box{padding:4px 8px;border:1px solid var(--border);border-radius:5px;font-size:12px;outline:none;font-family:inherit;background:#fff;}
.search-box{width:130px;}
.btn{padding:4px 10px;border:1px solid var(--border);border-radius:5px;font-size:12px;cursor:pointer;background:#fff;font-family:inherit;white-space:nowrap;}
.btn:hover{background:#f1f5f9;}
.btn.primary{background:var(--blue);color:#fff;border-color:var(--blue);}
.btn.add{background:var(--green);color:#fff;border-color:var(--green);font-weight:600;}
.stat{font-size:11px;color:var(--text-secondary);}
/* V1.418：工具栏/标题/统计行的线框图标——与文字垂直居中、不撑高、间距克制 */
.btn-ic{display:inline-flex;align-items:center;justify-content:center;vertical-align:-2px;margin-right:1px;}
.btn-ic svg,.stat-ic svg,.head-ic svg{display:block;}
.stat-ic{display:inline-flex;align-items:center;justify-content:center;vertical-align:-2px;margin-right:1px;}
.head-ic{display:inline-flex;align-items:center;justify-content:center;vertical-align:-2px;margin-right:5px;}
/* 搜索框 placeholder 里的图标已无法用 SVG，保留纯文字唤起清晰——不在此处处理 */
.btn .btn-ic{margin-right:4px;}

/* V1.112：O&G 蓝色 banner z-index 用 150——高于表头 sticky(95)、低于弹窗 modal(300+)、低于 header(200)。
   之前用 2147483647（int32.max）会盖住所有弹窗（modal z-index 300~1200），导致"弹窗不在最上面"。 */
/* V1.416：O&G 横幅改「Tower式克制的浅莫兰迪」——贴近顶部暖白连续，去重左竖条，仅细线+浅底点缀 */
.og-banner{
  position:fixed;top:48px;left:0;right:0;
  background:linear-gradient(90deg,#f4f7f6,#eef3f2 60%,#f2f4f0);
  color:#3f545c;padding:9px 16px;display:flex;gap:14px;align-items:flex-start;font-size:12px;
  min-height:60px;max-height:140px;overflow:hidden;
  border-bottom:1px solid #e3e7e2;
  box-shadow:none,inset 0 1px 0 rgba(255,255,255,.5);
  transform:translateZ(0) translateY(0);will-change:transform;z-index:150;transition:transform .25s ease-out;
}
/* V1.107：滚动时 O&G 隐藏（不挡表格），回到顶部再显示 */
.og-banner.og-hidden{transform:translateZ(0) translateY(-100%);}
.og-item{flex:1;min-width:0;}
.og-label{font-size:10px;letter-spacing:0.8px;color:#4a6a76;font-weight:600;display:flex;align-items:center;gap:5px;margin-bottom:2px;}
.og-ic{width:15px;height:15px;border-radius:4px;background:rgba(79,130,154,.14);display:inline-flex;align-items:center;justify-content:center;font-size:9px;font-weight:700;color:#4a6a76;letter-spacing:0;}
.og-text{font-size:12px;color:#4a5258;line-height:1.55;white-space:pre-wrap;word-break:break-word;max-height:80px;overflow-y:auto;}
.og-edit-btn{background:#fff;border:1px solid #e3e7e2;color:#4a5a66;font-size:13px;padding:6px 12px;border-radius:8px;cursor:pointer;font-family:inherit;align-self:flex-start;font-weight:500;min-width:60px;transition:all .14s;}
.og-edit-btn:hover{background:#fff;border-color:#8fb6c4;color:#3a5560;box-shadow:0 1px 3px rgba(74,128,150,.08);}

.table-outer{position:fixed;top:130px;left:0;right:0;bottom:0;overflow:auto;}

.tree-table{border-collapse:separate;border-spacing:0;min-width:2500px;width:max-content;table-layout:fixed;}

/* Contenteditable inline text editor */
.inline-edit-content{width:100%;min-height:60px;max-height:200px;overflow-y:auto;padding:6px 8px;border:1.5px solid var(--blue);border-radius:4px;font-family:inherit;font-size:12px;line-height:1.5;background:#fff;box-sizing:border-box;outline:none;}
.inline-edit-content:focus{box-shadow:0 0 0 3px rgba(59,130,246,0.15);}
.inline-edit-content b,.inline-edit-content strong{font-weight:700;}
.inline-edit-content u{text-decoration:underline;text-decoration-color:#f59e0b;text-underline-offset:2px;}
.inline-edit-content em,.inline-edit-content i{font-style:italic;}
.inline-edit-content del,.inline-edit-content s{text-decoration:line-through;color:var(--text-muted);}
.inline-edit-content h1{font-size:16px;font-weight:700;margin:4px 0 2px;}
.inline-edit-content h2{font-size:14px;font-weight:700;margin:3px 0 2px;}
.inline-edit-content blockquote{border-left:3px solid #d1d5db;padding-left:6px;color:var(--text-secondary);margin:2px 0;}
.inline-edit-content a{color:var(--blue);text-decoration:underline;}

/* Resize handle on column headers */
.tree-table thead th{position:relative;}
.resize-handle{position:absolute;right:-3px;top:0;width:10px;height:100%;cursor:col-resize;z-index:5;user-select:none;}
.resize-handle::before{content:'';position:absolute;left:4px;top:25%;width:2px;height:50%;background:#cbd5e1;border-radius:1px;transition:background 0.15s;}
.resize-handle:hover::before{background:var(--blue);}
.tree-table thead th.col-resizing{background:#dbeafe !important;}

/* Row height variants (padding only, font unchanged) */
.tree-table.row-short td{padding:3px 8px;line-height:1.25;}
.tree-table.row-medium td{padding:10px 10px;}
.tree-table.row-tall td{padding:18px 10px;line-height:1.7;}
.tree-table.row-xtall td{padding:30px 10px;line-height:2;}

.tree-table thead tr.group-row th{position:sticky;top:0;z-index:92;padding:7px 10px;text-align:center;font-size:11px;font-weight:700;color:#4a5054;letter-spacing:0.3px;border-bottom:1px solid var(--border);}
.tree-table thead tr.col-row th{position:sticky;top:25px;z-index:90;padding:8px 10px;text-align:left;background:#f6f5f1;font-size:11px;font-weight:600;color:var(--text-muted);border-bottom:1px solid var(--border);white-space:nowrap;}
/* 表头行内线框图标：与文字垂直居中对齐、不撑高、间距克制 */
.gh-ic{display:inline-flex;align-items:center;justify-content:center;vertical-align:-2px;margin-right:3px;}
.gh-ic svg{display:block;}

/* V1.416：表头分组改「浅底深字 + 细线分隔」（Tower式克制——去掉实心深色块，仅细色条点睛） */
.group-og{background:#f3f6f7;color:#3f5a66;border-bottom:2px solid #8fb6c4;}
.group-plan{background:#f4f6f2;color:#56624a;border-bottom:2px solid #a7ba86;}
.group-base{background:#f8f5f0;color:#6a5b45;border-bottom:2px solid #cfa87a;}
.group-archive{background:#f6f4f7;color:#59506a;border-bottom:2px solid #a99cc6;}

.tree-table td{padding:7px 10px;border-bottom:1px solid #f3f4f6;vertical-align:middle;overflow:hidden;text-overflow:ellipsis;}
.cell-static{cursor:default;}

/* Sticky first column - use CSS sticky with !important (Safari-compatible) */
.tree-table thead tr.col-row th.col-name,
.tree-table tbody td.col-name{
  position:-webkit-sticky !important;
  position:sticky !important;
  left:0 !important;
  z-index:85 !important;
  min-width:340px !important;width:340px !important;max-width:340px !important;box-sizing:border-box !important;
  box-shadow:2px 0 6px rgba(0,0,0,0.08);
}
.tree-table thead tr.col-row th.col-name{background:#f6f5f1 !important;z-index:95 !important;}
/* 🔴 V1.604：首列「项目课题」可收起（山姆需求①第三点）。
   收起后仅保留 52px 窄条（层级徽章 + 展开三角可见），把横向空间让给「端到端成果」等正文列，
   配合右侧批注抽屉 → 写批注时能同时看到更多看板内容。状态存 localStorage，跨刷新保持。 */
.tree-table.namecol-collapsed thead tr.col-row th.col-name,
.tree-table.namecol-collapsed tbody td.col-name{
  min-width:52px !important;width:52px !important;max-width:52px !important;
  padding-left:6px !important;padding-right:6px !important;
}
/* 收起时隐藏所有文字类内容，只留层级徽章与树形三角 */
.tree-table.namecol-collapsed tbody td.col-name .project-name,
.tree-table.namecol-collapsed tbody td.col-name .proj-main,
.tree-table.namecol-collapsed tbody td.col-name .proj-summary,
.tree-table.namecol-collapsed tbody td.col-name .proj-badges,
.tree-table.namecol-collapsed tbody td.col-name .note-icon-wrap,
.tree-table.namecol-collapsed tbody td.col-name .proj-name-tags{display:none !important;}
.tree-table.namecol-collapsed tbody td.col-name .project-cell{overflow:hidden;}
.tree-table.namecol-collapsed thead tr.col-row th.col-name .col-name-label{display:none;}
/* 表头里的折叠开关（小箭头按钮） */
.col-name-toggle{background:transparent;border:none;cursor:pointer;padding:1px 3px;margin-left:4px;border-radius:4px;color:var(--text-secondary);font-size:11px;line-height:1;vertical-align:middle;}
.col-name-toggle:hover{background:rgba(0,0,0,.06);color:var(--purple);}
/* 🔴 V1.604：补建基线快照的右侧圆点用琥珀色，与回退/补建提示同一视觉语言 */
.snap-pane-head .snap-dot.then.backfill{background:#d97706;}
.tree-table tbody tr.row-lv1 > td.col-name{background:#fff;}
.tree-table tbody tr.row-lv2 > td.col-name{background:#fdfcf8;}
.tree-table tbody tr.row-lv3 > td.col-name{background:#faf8f1;}
.tree-table tbody tr.row-lv4 > td.col-name{background:#f6f4eb;}
/* V1.515：L5+ 层级 col-name 背景透明导致左滑时文字重叠。仅 L1-L4 有背景色，L5 起 sticky 的 col-name 是透明 → 下滚动文字透过来。补齐 L5 及通用兜底，保证 sticky 首列不透明。 */
.tree-table tbody tr.row-lv5 > td.col-name{background:#f2efe5;}
.tree-table tbody tr.row-lv6 > td.col-name,
.tree-table tbody tr.row-lv7 > td.col-name,
.tree-table tbody tr.row-lv8 > td.col-name{background:#efece1;}
/* 兜底：任何更深层级(L9+)一律用不透明色，绝不留透明 */
.tree-table tbody tr.row-lv9 > td.col-name,
.tree-table tbody tr.row-lv10 > td.col-name,
.tree-table tbody tr.row-lv11 > td.col-name,
.tree-table tbody tr.row-lv12 > td.col-name{background:#eceadd;}
.tree-table tbody tr.drag-over > td.col-name{background:#bbf7d0!important;}
.tree-table tbody tr.row-lv1:hover > td.col-name,
.tree-table tbody tr.row-lv2:hover > td.col-name,
.tree-table tbody tr.row-lv3:hover > td.col-name,
.tree-table tbody tr.row-lv4:hover > td.col-name,
.tree-table tbody tr.row-lv5:hover > td.col-name,
.tree-table tbody tr.row-lv6:hover > td.col-name,
.tree-table tbody tr.row-lv7:hover > td.col-name,
.tree-table tbody tr.row-lv8:hover > td.col-name,
.tree-table tbody tr.row-lv9:hover > td.col-name,
.tree-table tbody tr.row-lv10:hover > td.col-name,
.tree-table tbody tr.row-lv11:hover > td.col-name,
.tree-table tbody tr.row-lv12:hover > td.col-name{background:#eef3f0;}

.tree-table tbody tr.row-lv1 > td:not(.col-name){background:#fff;}
.tree-table tbody tr.row-lv2 > td:not(.col-name){background:#fdfcf8;}
.tree-table tbody tr.row-lv3 > td:not(.col-name){background:#faf8f1;}
.tree-table tbody tr.row-lv4 > td:not(.col-name){background:#f6f4eb;}
.tree-table tbody tr.row-lv5 > td:not(.col-name){background:#f2efe5;}
.tree-table tbody tr.row-lv6 > td:not(.col-name),
.tree-table tbody tr.row-lv7 > td:not(.col-name),
.tree-table tbody tr.row-lv8 > td:not(.col-name){background:#efece1;}
.tree-table tbody tr.row-lv9 > td:not(.col-name),
.tree-table tbody tr.row-lv10 > td:not(.col-name),
.tree-table tbody tr.row-lv11 > td:not(.col-name),
.tree-table tbody tr.row-lv12 > td:not(.col-name){background:#eceadd;}
.tree-table tbody tr.row-lv1:hover > td:not(.col-name),
.tree-table tbody tr.row-lv2:hover > td:not(.col-name),
.tree-table tbody tr.row-lv3:hover > td:not(.col-name),
.tree-table tbody tr.row-lv4:hover > td:not(.col-name),
.tree-table tbody tr.row-lv5:hover > td:not(.col-name),
.tree-table tbody tr.row-lv6:hover > td:not(.col-name),
.tree-table tbody tr.row-lv7:hover > td:not(.col-name),
.tree-table tbody tr.row-lv8:hover > td:not(.col-name),
.tree-table tbody tr.row-lv9:hover > td:not(.col-name),
.tree-table tbody tr.row-lv10:hover > td:not(.col-name),
.tree-table tbody tr.row-lv11:hover > td:not(.col-name),
.tree-table tbody tr.row-lv12:hover > td:not(.col-name){background:#eef3f0;}

/* Project cell */
/* V1.391：展开/收起图标与课题名称间隙放大100% 6px→12px */
/* V1.392：图标改顶部对齐（align-items:flex-start），避免多行课题名时图标垂直漂移到中间显凌乱 */
.project-cell{display:flex;align-items:flex-start;gap:12px;min-width:280px;position:relative;cursor:grab;}
/* 图标自身顶部微调，与课题名称第一行文字顶端平齐 */
/* V1.393：统一左侧图标行高，避免猴子/hide-l1 emoji 行高过大顶出首行；图标下移贴合名称首行文字顶部 */
.project-cell .star-btn,.project-cell .hide-l1-btn,.project-cell .project-toggle,.project-cell .project-level{margin-top:2px;}
.project-cell .hide-l1-btn,.project-cell .star-btn{height:17px;line-height:17px;display:inline-flex;align-items:center;justify-content:center;}
.project-toggle{width:17px;height:17px;border-radius:3px;border:1px solid #d1d5db;background:#fff;cursor:pointer;font-size:10px;display:inline-flex;align-items:center;justify-content:center;color:var(--text-secondary);flex-shrink:0;}
.project-toggle:hover{background:#e5e7eb;}
.project-toggle.empty{visibility:hidden;}
.project-level{font-size:9px;font-weight:700;padding:1px 4px;border-radius:3px;flex-shrink:0;text-align:center;line-height:1.35;}
.lvl-1 .project-level{background:#dbeafe;color:#1d4ed8;}
.lvl-2 .project-level{background:#ede9fe;color:#7c3aed;}
.lvl-3 .project-level{background:#fef3c7;color:#92400e;}
.lvl-4 .project-level{background:#fce7f3;color:#be185d;}
/* V1.390：名称行 = [L徽章][名称] 水平排列，徽章与名称平齐（不再垂直居中到两行中间） */
/* V1.391：L徽章与名称间隙 5px→10px */
/* V1.393：name-line 改 flex-start，L徽章跟名称第一行顶端对齐；图标统一高度基准 */
.project-name-line{display:inline-flex;align-items:flex-start;gap:10px;min-width:0;width:100%;}
.project-name-line .project-level{margin-top:2px;line-height:1.2;}
.project-name{font-size:13px;font-weight:600;line-height:1.35;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;flex:1;min-width:0;cursor:pointer;}
.lvl-1 .project-name{font-size:14px;}
.lvl-2 .project-name{color:#374151;}
.lvl-3 .project-name{font-size:12px;color:#4b5563;}
.lvl-4 .project-name{font-size:12px;color:#6b7280;}
/* V1.387 项目课题列「一句话摘要」（方案二） */
/* V1.389：标题与摘要行空隙加大 gap 2px→6px */
.proj-main{flex:1;min-width:0;display:flex;flex-direction:column;align-items:flex-start;gap:6px;}
/* V1.394：摘要行不再被截断（去 nowrap/ellipsis），允许换行保证日期完整显示 */
/* V1.395：元素间隙 5px→3px、信号灯↔百分比 7px→5px，让 L3 行摘要一行放得下 */
.proj-summary{display:inline-flex;align-items:center;gap:3px;font-size:10.5px;line-height:1.4;color:#9ca3af;white-space:normal;flex-wrap:wrap;row-gap:2px;max-width:100%;margin-top:1px;}
/* V1.391：红绿灯缩小30% 14px→10px */
.sum-signal{width:10px;height:10px;border-radius:50%;display:inline-block;flex-shrink:0;vertical-align:middle;}
/* 信号灯线框圆点（替代系统 emoji 🔴🟡🟢，颜色受控） */
.signal-dot{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;flex-shrink:0;vertical-align:middle;}
.signal-dot svg{display:block;}

/* V1.423：统一线框图标库 _ic() 全局对齐 —— 内联垂直居中、不上浮下沉 */
.ic-svg{display:inline-block;vertical-align:middle;flex-shrink:0;position:relative;top:-0.5px;}
.ic-svg-wrap{display:inline-flex;align-items:center;gap:5px;vertical-align:middle;}
.icon-eyebrow{display:inline-flex;align-items:center;gap:5px;}

/* ─── V1.422 自定义日历（移植自电芯看板 cellDatePick，替代原生 input[type=date]）─── */
.d-pick{display:inline-flex;align-items:center;gap:6px;min-width:118px;border:1px solid var(--border);background:#fff;border-radius:6px;padding:4px 9px;cursor:pointer;font-family:inherit;box-sizing:border-box;color:var(--text);font-size:12.5px;vertical-align:middle;}
.d-pick:hover{border-color:var(--blue);}
.d-pick-val{flex:0 1 auto;font-size:12.5px;color:var(--text);font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.d-pick.compact .d-pick-ico{display:none;}
.d-pick.compact .d-pick-val{flex:1;max-width:96px;}
.d-pick-ico{flex-shrink:0;display:inline-flex;align-items:center;opacity:.75;color:var(--blue);}
.d-pick-ico svg{display:block;}
.d-pick-cal{width:250px;padding:12px;background:#fff;border:1px solid var(--border);border-radius:12px;box-shadow:0 12px 32px rgba(0,0,0,.14);font-family:inherit;box-sizing:border-box;font-size:12.5px;}
.d-pick-cal .dp-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;}
.d-pick-cal .dp-title{font-size:14px;font-weight:600;color:var(--text);}
.d-pick-cal .dp-nav{width:26px;height:26px;border:none;background:transparent;border-radius:6px;cursor:pointer;font-size:15px;color:var(--text-secondary);line-height:1;}
.d-pick-cal .dp-nav:hover{background:#f1f5f9;color:var(--text);}
.d-pick-cal .dp-nav-group{display:flex;gap:2px;}
.d-pick-cal .dp-week{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;}
.d-pick-cal .dp-week span{font-size:11px;color:var(--text-secondary);text-align:center;font-weight:600;padding:4px 0;}
.d-pick-cal .dp-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;}
.d-pick-cal .d-pick-day{font-size:12px;text-align:center;padding:6px 0;border-radius:6px;cursor:pointer;color:var(--text);border:1px solid transparent;}
.d-pick-cal .d-pick-day:hover{background:#eef2f5;color:var(--blue);}
.d-pick-cal .d-pick-day.sel{background:var(--blue);color:#fff;font-weight:600;}
.d-pick-cal .d-pick-day.today{border-color:var(--blue);color:var(--blue);}
.d-pick-cal .d-pick-day.sel.today{color:#fff;}
.d-pick-cal .dp-time{display:flex;gap:6px;align-items:center;margin-top:10px;}
.d-pick-cal .dp-time select{border:1px solid var(--border);border-radius:6px;padding:4px 6px;font-size:12px;font-family:inherit;color:var(--text);background:#fff;}
.d-pick-cal .dp-now{margin-left:auto;border:none;background:#eef2f5;color:var(--blue);border-radius:6px;padding:4px 10px;font-size:11px;cursor:pointer;font-family:inherit;}
.d-pick-cal .dp-now:hover{background:#e2ebef;}
.d-pick-cal .dp-foot{display:flex;justify-content:space-between;margin-top:10px;font-size:11px;}
.d-pick-cal .dp-link{color:var(--blue);cursor:pointer;background:none;border:none;padding:0;font-size:11px;font-family:inherit;}
.d-pick-cal .dp-link:hover{text-decoration:underline;}
.sum-prog{color:#3b82f6;font-weight:500;display:inline-flex;align-items:center;gap:5px;flex-shrink:0;line-height:1;}
.sum-pct{transition:color 0.15s,background 0.15s;border-radius:3px;padding:0 1px;}
.sum-pct:hover{background:#eff6ff;color:#1d4ed8;}
.sum-owner{color:#8b5cf6;font-weight:500;flex-shrink:0;}
.sum-ddl{color:#f59e0b;font-weight:500;flex-shrink:0;transition:color 0.15s,background 0.15s;border-radius:3px;padding:0 1px;}
.sum-ddl:hover{background:#fffbeb;color:#b45309;}
.sum-ddl.overdue{color:#ef4444;font-weight:600;}
.sum-ddl.overdue:hover{background:#fef2f2;color:#b91c1c;}
.sum-dot{color:#d1d5db;flex-shrink:0;}
.star-btn{background:none;border:none;cursor:pointer;font-size:14px;padding:0 2px;color:var(--text-muted);flex-shrink:0;transition:transform 0.15s;}
.star-btn:hover{transform:scale(1.25);}
.star-btn.active{color:#eab308;}
.row-edit-btn{background:none;border:none;cursor:pointer;font-size:11px;padding:2px 4px;color:var(--text-muted);border-radius:3px;opacity:0.5;}
.row-edit-btn:hover{opacity:1;background:#fee2e2;color:var(--red);}
.row-add-btn{background:none;border:none;cursor:pointer;font-size:14px;padding:0 4px;color:var(--text-muted);border-radius:3px;opacity:0.5;font-weight:bold;}
.row-add-btn:hover{opacity:1;background:#dbeafe;color:var(--blue);}
.row-actions{opacity:0;display:inline-flex;gap:2px;margin-left:6px;transition:opacity 0.12s;}
tr:hover .row-actions{opacity:1;}
.row-starred .col-name{border-left:3px solid #eab308!important;}
.row-starred .project-name{font-weight:800;}
/* V1.557：逾期行高亮 —— 用户点「逾期」筛选后要能一眼看出是哪几条。左侧红条 + 极淡红底（不抢内容可读性）。
   与 .row-starred 的左侧色条并存：两者同时命中时逾期优先（红条），星标仍保留加粗。 */
.row-overdue > td{background:#fff5f5!important;}
.row-overdue:hover > td{background:#ffecec!important;}
.row-overdue .col-name{border-left:3px solid #ef4444!important;}
.row-overdue .project-name{color:#b91c1c;font-weight:700;}
.row-hidden{display:none!important;}
/* Reference rows */
.row-ref td{background:#f0fdf4!important;opacity:0.92;}
.row-ref:hover td{background:#dcfce7!important;}
.ref-name{cursor:default!important;}
.ref-name-text{font-style:italic;color:var(--text-secondary)!important;}
.row-ref{cursor:pointer;}
.row-ref td:not(.col-name){cursor:not-allowed;}
/* Drag position indicators */
.drag-pos-before{box-shadow:inset 0 3px 0 0 #3b82f6!important;background:#eff6ff!important;}
.drag-pos-after{box-shadow:inset 0 -3px 0 0 #3b82f6!important;background:#eff6ff!important;}
.drag-pos-inside{box-shadow:inset 0 0 0 2px #10b981!important;background:#ecfdf5!important;}
.ref-level{background:#d1fae5!important;color:#059669!important;}

.dept-tag{font-size:10px;padding:1px 6px;border-radius:8px;font-weight:500;white-space:nowrap;display:inline-block;margin:1px 2px 1px 0;}
.dept-总经办{background:#fce7f3;color:#be185d;}
.dept-深圳市布宜诺创新科技有限公司{background:#ede9fe;color:#7c3aed;}
.dept-财务部{background:#dbeafe;color:#1d4ed8;}
.dept-供应链{background:#fef3c7;color:#92400e;}
.dept-市场策划{background:#d1fae5;color:#059669;}
.dept-数营部{background:#e0e7ff;color:#4338ca;}
.dept-店长部{background:#ffe4e6;color:#be123c;}
.progress-wrap{display:flex;align-items:center;gap:5px;}
.progress-bar{flex:1;height:12px;background:#e5e7eb;border-radius:6px;overflow:hidden;cursor:pointer;min-width:40px;border:1px solid #d1d5db;}
.progress-fill{height:100%;border-radius:5px;transition:width 0.3s;min-width:2px;}
.progress-fill.low{background:var(--sig-red);box-shadow:inset 0 1px 2px rgba(0,0,0,0.12);}
.progress-fill.mid{background:var(--sig-yellow);box-shadow:inset 0 1px 2px rgba(0,0,0,0.12);}
.progress-fill.high{background:var(--sig-green);box-shadow:inset 0 1px 2px rgba(0,0,0,0.12);}
.progress-num{font-size:12px;font-weight:700;min-width:28px;text-align:right;}
.progress-num.low{color:var(--sig-red);}
.progress-num.mid{color:var(--sig-yellow);}
.progress-num.high{color:var(--sig-green);}
.progress-num.high{color:var(--sig-green)!important;}
/* V1.526：状态芯片「待清晰/已清晰/需优化」三态——芯片用内联样式，无需额外 CSS 规则；完成日期在芯片旁内联 */
.text-preview{font-size:12px;color:var(--text-secondary);line-height:1.5;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;cursor:pointer;white-space:pre-wrap;word-break:break-word;}
/* V1.114：col-contra 列表用 .text-preview-cell。减小 line-height 让上下留白更紧凑（用户反馈 1.5 太宽） */
.text-preview-cell{font-size:12px;color:var(--text-secondary);line-height:1.3;cursor:pointer;white-space:normal;word-break:break-word;max-height:180px;overflow:hidden;display:block;}
/* V1.234：col-contra 单独更高上限（关键矛盾与策略内容经常较长） */
/* V1.394：col-contra 上限再放宽，显示更多内容 */
.col-contra .text-preview-cell{max-height:360px;}
/* V1.114：减小 col-contra td 上下 padding（其他列保留默认 7px） */
.col-contra{padding-top:3px;padding-bottom:3px;}
.ddl-text{font-size:12px;white-space:nowrap;}
.ddl-text.overdue{color:var(--red);font-weight:600;}
.updated-text{font-size:11px;color:var(--text-muted);white-space:nowrap;}
.archived-icon{color:#10b981;font-size:14px;}
.vis-chip{font-size:10px;background:#f0f4ff;color:var(--indigo);padding:1px 5px;border-radius:6px;}
.richtext b,.richtext strong{color:#dc2626;font-weight:700;}
.richtext u{text-decoration:underline;text-decoration-color:#f59e0b;text-underline-offset:2px;}
.richtext em{font-style:italic;color:var(--blue);}
.richtext .tag-blue{background:#dbeafe;color:#1e40af;padding:0 3px;border-radius:3px;font-size:0.9em;}
.richtext del,.richtext s{text-decoration:line-through;color:var(--text-muted);}
.richtext a{color:var(--blue);text-decoration:underline;}
.richtext h1{font-size:18px;font-weight:700;margin:6px 0 4px;color:#1e293b;}
.richtext h2{font-size:15px;font-weight:700;margin:4px 0 3px;color:#334155;}
.richtext blockquote{border-left:3px solid #d1d5db;padding-left:8px;color:var(--text-secondary);margin:4px 0;}

/* ─── Format toolbar ─── */
#fmtToolbar{position:fixed;display:none;background:#1e293b;color:#fff;border-radius:8px;box-shadow:0 6px 24px rgba(0,0,0,0.25);padding:5px 6px;z-index:500;gap:2px;align-items:center;animation:fmtFade 0.15s;}
#fmtToolbar::after{content:'';position:absolute;bottom:-6px;left:24px;border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid #1e293b;}
#fmtToolbar button{background:transparent;border:none;color:#fff;cursor:pointer;padding:4px 7px;border-radius:4px;font-size:13px;line-height:1;font-family:inherit;min-width:28px;transition:background 0.1s;}
#fmtToolbar button:hover{background:rgba(255,255,255,0.18);}
#fmtToolbar .fmt-divider{width:1px;height:18px;background:rgba(255,255,255,0.2);margin:0 3px;}
#fmtToolbar .fmt-bold{font-weight:700;}
#fmtToolbar .fmt-italic{font-style:italic;}
#fmtToolbar .fmt-underline{text-decoration:underline;}
#fmtToolbar .fmt-strike{text-decoration:line-through;}
#fmtToolbar .fmt-highlight{background:#fde047;color:#1e293b;}
#fmtToolbar .fmt-color{position:relative;}
#fmtToolbar .fmt-color::after{content:'';position:absolute;left:0;right:0;bottom:1px;height:3px;border-radius:1px;}
#fmtToolbar .fmt-color-red::after{background:#ef4444;}
#fmtToolbar .fmt-color-blue::after{background:#3b82f6;}
#fmtToolbar .fmt-color-green::after{background:#10b981;}
#fmtToolbar .fmt-color-black::after{background:#1f2937;}
#fmtToolbar .fmt-link{font-size:14px;}
@keyframes fmtFade{from{opacity:0;transform:translateY(4px);}to{opacity:1;transform:translateY(0);}}

/* Multi items */
.multi-item{padding:3px 0 3px 4px;border-bottom:0px solid transparent;position:relative;}
/* V1.313：去掉 item 之间的 border-bottom，让同组 item 视觉上连通（用 group 的 left border 包围） */
.multi-item+.multi-item{margin-top:2px;}
.multi-item:last-child{border-bottom:none;}
.multi-text{font-size:12px;line-height:1.4;margin-bottom:3px;}
.multi-progress{display:flex;align-items:center;gap:5px;}
.multi-bar{flex:1;height:4px;background:#e5e7eb;border-radius:2px;overflow:hidden;min-width:20px;}
.multi-fill{height:100%;border-radius:2px;}
.multi-fill.low{background:var(--red);}.multi-fill.mid{background:var(--orange);}.multi-fill.high{background:var(--green);}
.multi-pct{font-size:10px;min-width:22px;text-align:right;color:var(--text-muted);font-weight:600;}
.multi-ddl{font-size:10px;color:var(--text-muted);margin-top:2px;}
.multi-ddl.overdue{color:var(--red);font-weight:600;}
.multi-empty{color:var(--text-muted);font-size:11px;padding:4px 0;}

/* V1.593：关键矛盾多条目（复用 multi-* 骨架，但无进度条/DDL → 收紧下边距，避免留空洞） */
.contra-item{padding:2px 0 2px 4px;}
.contra-item .multi-text{margin-bottom:0;white-space:pre-wrap;word-break:break-word;}
/* 项目编辑器内的 contra 多条目区：textarea 聚焦高亮（与 Q3 multiEditHtml 视觉对齐） */
[data-contra-field] textarea:focus{border-color:var(--blue);outline:none;box-shadow:0 0 0 2px rgba(59,130,246,0.12);}
[data-contra-field] [data-contra-row]{transition:border-color 0.12s;}
[data-contra-field] [data-contra-row]:hover{border-color:#cbd5e1;}

/* ─── Meeting cell ─── */
.meeting-cell{padding:2px 0;max-height:160px;overflow-y:auto;cursor:pointer;}
.meeting-chip{display:flex;align-items:center;gap:6px;padding:3px 6px;margin:2px 0;border-radius:5px;font-size:11px;line-height:1.35;background:#f8fafc;border:1px solid #e2e8f0;transition:background 0.12s;min-width:0;max-width:100%;overflow:hidden;}
.meeting-chip:hover{background:#eef2ff;border-color:#c7d2fe;}
.meeting-chip.upcoming{border-left:3px solid var(--blue);}
.meeting-chip.ongoing{border-left:3px solid var(--orange);background:#fff7ed;}
.meeting-chip.completed{border-left:3px solid #9ca3af;opacity:0.65;background:#f9fafb;}
.meeting-chip-subject{font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text);}
.meeting-chip.completed .meeting-chip-subject{text-decoration:line-through;color:var(--text-muted);}
.meeting-chip-date{font-size:10px;color:var(--text-muted);white-space:nowrap;flex-shrink:0;}
.meeting-chip-status{font-size:9px;padding:1px 5px;border-radius:6px;font-weight:600;white-space:nowrap;flex-shrink:0;}
.meeting-chip-status.upcoming{background:#dbeafe;color:#1d4ed8;}
.meeting-chip-status.ongoing{background:#fed7aa;color:#c2410c;}
.meeting-chip-status.completed{background:#e5e7eb;color:#6b7280;}
.meeting-add-btn{width:100%;padding:2px 6px;margin-top:2px;font-size:11px;background:#f0f9ff;border:1px dashed #bae6fd;border-radius:4px;cursor:pointer;color:var(--blue);font-family:inherit;text-align:center;}
.meeting-add-btn:hover{background:#e0f2fe;border-color:#7dd3fc;}
.meeting-more{font-size:10px;color:var(--text-muted);text-align:center;padding:2px;}

/* Meeting modal */
.meeting-form-section{margin-bottom:16px;padding-bottom:16px;border-bottom:1px solid var(--border);}
.meeting-form-section:last-child{border-bottom:none;}
.meeting-form-title{font-size:13px;font-weight:700;color:var(--text);margin-bottom:10px;display:flex;align-items:center;gap:6px;}
.meeting-participant-chips{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px;}
.meeting-participant-chip{display:inline-flex;align-items:center;gap:3px;padding:2px 8px;background:#eef2ff;border-radius:10px;font-size:12px;color:var(--indigo);}
.meeting-participant-chip button{background:none;border:none;cursor:pointer;font-size:14px;color:var(--text-muted);padding:0 2px;line-height:1;}
.participant-opt:hover,.em-participant-opt:hover{background:#e0e7ff;}
.meeting-list-item{display:flex;align-items:center;flex-wrap:wrap;gap:10px;padding:10px 12px;border:1px solid var(--border);border-radius:8px;margin-bottom:6px;cursor:pointer;transition:all 0.12s;}
/* V1.236：src-detail 容器在 ml-list-item flex-wrap:wrap 内 width:100% 自动换行占满宽度 */
.meeting-list-item .src-detail{flex-basis:100%;width:100%;}
.meeting-list-item:hover{border-color:var(--blue);background:#f8faff;}
.meeting-list-item .ml-date{font-size:12px;color:var(--text-muted);min-width:85px;text-align:center;}
.meeting-list-item .ml-info{flex:1;min-width:0;}
.meeting-list-item .ml-subject{font-size:14px;font-weight:600;}
.meeting-list-item .ml-meta{font-size:11px;color:var(--text-muted);margin-top:2px;}
.meeting-list-item .ml-actions{display:flex;gap:4px;flex-shrink:0;}
.meeting-empty{text-align:center;color:var(--text-muted);padding:20px;font-size:13px;}


.signal-red,.signal-yellow,.signal-green{font-size:16px;cursor:pointer;}

/* Column widths */
.col-result{width:200px;}.col-contra{width:200px;}.col-q3{width:200px;}.col-q4{width:200px;}
/* V1.233：实质性进展列补默认宽度——之前没设宽度，被内容撑开失控；其他列都有 width 默认 */
.col-substantial{width:280px;overflow:hidden;word-break:break-word;}
.col-substantial,.tree-table thead th.col-substantial,.tree-table tbody td.col-substantial{overflow:hidden!important;}
.col-substantial *{max-width:100%!important;overflow:hidden!important;white-space:normal!important;word-break:break-word!important;}
/* V1.107：会议列允许换行（之前 white-space:nowrap 导致弹窗里多行内容在列表显示时挤成一行） */
.col-meeting{width:240px;overflow:hidden;word-break:break-word;}
.col-meeting,.tree-table thead th.col-meeting,.tree-table tbody td.col-meeting{overflow:hidden!important;}
.col-meeting .meeting-cell{max-width:100%!important;overflow:hidden!important;}
.col-meeting .meeting-cell *{max-width:100%!important;overflow:hidden!important;white-space:normal!important;}
.col-clarity{width:82px;position:relative;overflow:visible;}.col-signal{width:55px;text-align:center;}
.col-clarity .clarity-cell-wrap{display:block;min-height:20px;padding:3px 0;text-align:center;}
.col-clarity .clarity-chip-box{display:inline-flex;justify-content:center;}
/* V1.532：项目级批注徽章在「状态清晰」文本框里稍微往下移、不贴死右上角——top:2px→9px（避开芯片，悬在文本框右上部）；
   视觉上更自然、不压住芯片内容。absolute 相对 td（wrap 改 block 使 offsetParent=td）；内联 position:relative 优先需 !important */
.col-clarity .thread-proj-badge{position:absolute!important;top:9px!important;right:5px!important;left:auto!important;transform:none!important;margin:0!important;padding:1px 5px!important;}
.col-prog{width:110px;}.col-ddl{width:105px;}.col-note{width:150px;}
.col-dept{width:170px;}.col-owner{width:90px;}.col-updated{width:110px;}
.col-review{width:160px;}.col-archive{width:55px;}.col-visibility{width:100px;}

/* Modal */
.modal-overlay{position:fixed;inset:0;background:rgba(0,0,0,0.4);z-index:300;display:flex;align-items:center;justify-content:center;padding:20px;}
/* V1.490：个人备忘相关的弹窗(管理标签/新建标签/改名输入框/编辑备忘)要盖在右侧个人备忘栏(.memo-drawer z-406)之上，
   否则备忘录打开时管理标签弹窗被遮住。统一提级到 700(高于 drawer 406、低于临时浮层 1000+)。 */
#memoTagModal,#askTagFormModal,#askTextModal,#memoEditModal{z-index:700;}
.modal{background:#fff;border-radius:12px;width:960px;max-width:98vw;max-height:88vh;overflow-y:auto;box-shadow:0 20px 60px rgba(0,0,0,0.2);}
.modal-header{padding:16px 22px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:flex-start;position:sticky;top:0;background:#fff;border-radius:12px 12px 0 0;z-index:1;}
.modal-close{background:none;border:none;font-size:22px;cursor:pointer;color:var(--text-muted);padding:4px 8px;line-height:1;}
.modal-body{padding:18px 22px 24px;font-size:13px;}
.form-group{margin-bottom:14px;}
.form-label{font-size:12px;font-weight:600;color:var(--text-secondary);margin-bottom:5px;display:block;}
.form-input,.form-textarea,.form-select{width:100%;padding:8px 11px;border:1px solid var(--border);border-radius:6px;font-size:13px;font-family:inherit;outline:none;background:#fff;line-height:1.5;}
.form-textarea{resize:vertical;min-height:96px;line-height:1.6;}
.form-input:focus,.form-textarea:focus,.form-select:focus{border-color:var(--blue);}
.form-row{display:flex;gap:10px;}
.form-row>*{flex:1;}
.form-hint{font-size:11px;color:var(--text-muted);margin-top:3px;}
.btn-sm{padding:3px 8px;font-size:11px;border-radius:4px;border:1px solid var(--border);cursor:pointer;background:#fff;font-family:inherit;}
.btn-sm:hover{background:#f1f5f9;}
.btn-sm.danger{color:var(--red);border-color:#fecaca;}

/* Multi-item editor */
.multi-edit-item{display:flex;gap:6px;align-items:center;padding:8px;border:1px solid var(--border);border-radius:6px;margin-bottom:6px;flex-wrap:wrap;}
.multi-edit-progress{display:flex;align-items:center;gap:4px;}
.add-item-btn{width:100%;padding:8px;background:#f9fafb;border:1px dashed var(--border);border-radius:6px;cursor:pointer;font-size:13px;color:var(--text-secondary);font-family:inherit;}
.add-item-btn:hover{background:#f3f4f6;border-color:var(--blue);color:var(--blue);}
/* V1.422：cell 弹窗条目卡片「字段标签化 + 网格」深度重构 */
.mec-card{display:flex;flex-direction:column;gap:10px;padding:12px 14px;background:#fff;border:1px solid var(--border);border-radius:10px;margin-bottom:10px;box-shadow:0 1px 2px rgba(0,0,0,0.03);}
.mec-card:hover{border-color:#c8d3dd;box-shadow:0 3px 10px rgba(0,0,0,0.05);}
.mec-head{display:flex;align-items:center;justify-content:space-between;gap:8px;}
.mec-title{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-muted);}
.mec-acts{display:flex;gap:6px;flex-shrink:0;}
.mec-grid{display:grid;grid-template-columns:1fr 170px 190px;gap:10px;align-items:center;}
.mec-field{display:flex;flex-direction:column;gap:4px;min-width:0;}
.mec-flabel{font-size:10px;font-weight:600;color:var(--text-muted);letter-spacing:0.3px;}
.mec-rel{display:flex;flex-wrap:wrap;align-items:center;gap:4px;padding:5px 8px;background:#f9fafb;border:1px solid var(--border);border-radius:6px;}
.mec-field .mode-bar{display:flex;align-items:center;gap:8px;}
@media (max-width:640px){ .mec-grid{grid-template-columns:1fr;gap:8px;} }

.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted);}
@keyframes fadeIn{from{opacity:0;transform:translateY(8px);}to{opacity:1;transform:translateY(0);}}

/* ═══ V1.607：保存状态栏（#saveStatusBar）整体移除 ═══
   历史：V1.154 引入（文档流内）→ V1.578 改「顶部 fixed 全宽浮层」→ V1.606 把 saving 阈值拉到 8s、
   offline 干脆不弹。三轮收敛后它几乎不再出现，偶发出现也与工具栏 #btnSaveNow 重复 ⇒ 山姆要求删除。
   本段样式（.save-status-bar / -text / -actions / -action / -spinner 及两个 keyframes）已全部删除。
   注：@keyframes saveStatusSpin 仍被 #btnSaveNow 内的 spinner 复用 ⇒ 见下方单独保留的那一条。 */

/* V1.607：保留 —— 工具栏 #btnSaveNow 的「保存中」spinner 仍在用（原挂在 .save-status-bar 段下） */
.save-status-spinner{display:inline-block;width:11px;height:11px;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:saveStatusSpin 0.8s linear infinite;}
@keyframes saveStatusSpin{to{transform:rotate(360deg);}}

/* V1.155：启动对账横幅（admin 红色 / 普通用户黄色） */
.reconcile-banner{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 16px;font-size:13px;font-weight:500;line-height:1.5;border-bottom:1px solid transparent;}
.reconcile-banner.reconcile-admin{background:#fef2f2;color:#991b1b;border-color:#fecaca;}
.reconcile-banner.reconcile-user{background:#fffbeb;color:#92400e;border-color:#fde68a;}
.reconcile-text{flex:1;display:flex;align-items:center;gap:8px;}
.reconcile-actions{display:flex;gap:6px;flex-shrink:0;}
.reconcile-action{background:rgba(255,255,255,0.85);border:1px solid currentColor;border-radius:4px;padding:3px 10px;cursor:pointer;font-size:12px;font-weight:600;font-family:inherit;color:inherit;}
.reconcile-action:hover{background:#fff;}
.reconcile-action.reconcile-dismiss{background:transparent;border-color:transparent;opacity:0.7;}

/* V1.290：链接紧凑化 + hover popup */
.links-cell{display:inline-flex;align-items:center;position:relative;}
.links-cell .link-icon{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:9px;border-radius:50%;background:#eef2ff;color:#4f46e5;text-decoration:none;border:1px solid #c7d2fe;margin-left:-4px;line-height:1;}
.links-cell .link-icon:first-child{margin-left:0;}
.links-cell .link-icon:hover{background:#e0e7ff;transform:scale(1.15);}
.links-cell .link-more{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;font-size:9px;border-radius:50%;background:#ef4444;color:#fff;font-weight:700;margin-left:-4px;line-height:1;}
.links-cell .link-popup{display:none;position:absolute;top:100%;left:0;z-index:100;background:#fff;border:1px solid var(--border);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,0.15);padding:6px;min-width:220px;max-width:300px;margin-top:6px;}
.links-cell:hover .link-popup{display:block;}
.links-cell .link-popup-item{display:flex;align-items:center;gap:6px;padding:4px 6px;border-radius:4px;text-decoration:none;color:#1f2937;font-size:11px;}
.links-cell .link-popup-item:hover{background:#f0f4ff;}
.links-cell .link-add-btn,.links-cell .link-mgr-btn{font-size:13px;color:var(--blue);background:#fff;border:1px dashed var(--blue);padding:0 7px;border-radius:8px;cursor:pointer;line-height:18px;opacity:0;transition:opacity 0.15s;margin-left:4px;}
.links-cell .link-mgr-btn{border-style:solid;border-color:#c7d2fe;font-size:14px;padding:0 6px;}
.links-cell:hover .link-add-btn,.links-cell:hover .link-mgr-btn{opacity:1;}
.links-cell:hover .link-add-btn:hover,.links-cell:hover .link-mgr-btn:hover{background:#eef2ff;}

/* V1.297：端到端 cell 内部拖动重排 */
.multi-item.drag-over-top{box-shadow:0 -3px 0 0 #3b82f6;background:#eff6ff !important;border-radius:6px 6px 0 0;}
.multi-item.drag-over-bottom{box-shadow:0 3px 0 0 #3b82f6;background:#eff6ff !important;border-radius:0 0 6px 6px;}
.multi-letter[draggable="true"]:hover{transform:scale(1.15);transition:transform 0.1s;}
.multi-letter[draggable="true"]:active{cursor:grabbing;}

/* V1.386：批注讨论右侧竖条（drawer）—— 不再全屏遮罩，主表可正常点击/编辑，只右侧留竖条 */
.thread-drawer-overlay{position:fixed;top:0;right:0;bottom:0;width:560px;z-index:400;pointer-events:none;}
.thread-drawer{position:fixed;top:0;right:0;bottom:0;width:560px;max-width:88vw;background:#fff;z-index:401;display:flex;flex-direction:column;box-shadow:-8px 0 30px rgba(0,0,0,0.13);animation:threadDrawerIn 0.22s ease;pointer-events:auto;border-left:1px solid var(--border);}
.thread-drawer-overlay.thread-drawer-open{pointer-events:none;}
.thread-drawer.collapsed{width:28px;animation:none;box-shadow:none;background:transparent;border-left:none;}
.thread-drawer.collapsed .thread-drawer-header,.thread-drawer.collapsed .thread-drawer-body{display:none;}
.thread-drawer-expand{position:fixed;top:12px;right:8px;width:28px;height:28px;background:#fff;border:0.5px solid var(--border-secondary);border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--purple);font-size:16px;font-weight:500;box-shadow:0 1px 4px rgba(0,0,0,0.08);}
.thread-drawer-expand:hover{color:var(--indigo);background:var(--bg);}
@keyframes threadDrawerIn{from{transform:translateX(100%);}to{transform:translateX(0);}}
/* 🔴 V1.604：批注「新增」弹窗改为右侧竖向抽屉（山姆需求①：一边写批注一边看板内容、看板可滑动）。
   复用 .thread-drawer 的定位/滑入动效与 .thread-drawer-overlay 的 pointer-events:none（不遮罩）。
   差异：新增抽屉略窄（480px）+ 正文区可纵向滚动，让右侧留白更少、看板可视面积更大。 */
.thread-add-overlay{width:480px;}
.thread-add-drawer{width:480px;max-width:92vw;}
.thread-add-drawer .thread-drawer-header{background:#faf9f6;}
@media (max-width:900px){ .thread-add-overlay{width:100%;} .thread-add-drawer{width:min(480px,92vw);} }
/* V1.478：批注跳转定位高亮（简化版）—— 一圈细描边 + 淡紫底，短促提示不浮夸。
   原 V1.477 双圈描边+脉冲背景闪烁用户反馈太浮夸，去掉动画与双圈。 */
.jump-flash{position:relative;z-index:5;box-shadow:0 0 0 1.5px var(--purple);background-color:rgba(167,139,250,.14);border-radius:6px;transition:box-shadow .15s ease;}
.jump-flash{position:relative;z-index:5;box-shadow:0 0 0 1.5px var(--purple);background-color:rgba(167,139,250,.14);border-radius:6px;transition:box-shadow .15s ease;}
/* V1.605：批注快照里的引用行徽章（镜像标识）*/
.snap-ref-badge{display:inline-flex;align-items:center;justify-content:center;min-width:14px;height:14px;margin-left:2px;padding:0 3px;border-radius:3px;background:#cffafe;color:#0891b2;font-size:10px;font-weight:700;line-height:1;flex:none;}

@keyframes jumpFlashFade{0%{box-shadow:0 0 0 1.5px var(--purple);background-color:rgba(167,139,250,.20);}100%{box-shadow:none;background-color:transparent;}}
.jump-flash.jump-flash{animation:jumpFlashFade 1.6s ease forwards;}
.thread-drawer-header{padding:14px 16px;border-bottom:1px solid var(--border);display:flex;flex-direction:column;gap:7px;flex-shrink:0;background:#faf9f6;}
.thread-drawer-title{display:flex;align-items:center;justify-content:space-between;gap:10px;}
.thread-drawer-title .tt{font-size:14px;font-weight:500;color:var(--text);display:flex;align-items:center;gap:7px;}
.thread-drawer-close{background:none;border:none;font-size:18px;cursor:pointer;color:var(--text-muted);padding:2px 6px;line-height:1;border-radius:4px;}
.thread-drawer-close:hover{background:var(--bg);color:var(--text);}
.thread-drawer-sub{font-size:11px;color:var(--text-secondary);}
.thread-drawer-body{flex:1;overflow-y:auto;padding:10px 10px 20px;}
/* V1.497：批注讨论左侧分类栏 —— body 拆成「左栏(项目树/创建人) + 右列表」 */
.thread-drawer-main{display:flex;flex-direction:row;flex:1;min-height:0;}
.thread-drawer-left{flex:0 0 180px;border-right:1px solid var(--border);padding:8px 6px;overflow-y:auto;background:#fbfaf7;position:relative;}
.thread-drawer-left.collapsed{flex:0 0 30px;padding:8px 2px;overflow:hidden;}
.thread-drawer-left.collapsed .tdl-search,.thread-drawer-left.collapsed .tdl-tabs,.thread-drawer-left.collapsed .tdl-hint,.thread-drawer-left.collapsed .tdl-item,.thread-drawer-left.collapsed .tdl-label{visibility:hidden;width:0;overflow:hidden;white-space:nowrap;}
.tdl-toggle{margin:2px 2px 6px;width:100%;background:transparent;border:none;border-radius:7px;cursor:pointer;color:var(--purple);padding:4px 5px;display:flex;align-items:center;gap:5px;justify-content:flex-start;font-size:15px;font-weight:700;}
.tdl-toggle:hover{background:#f0edf7;color:var(--purple);}
.tdl-toggle .glyph{font-size:15px;font-weight:700;color:var(--purple);line-height:1;}
.tdl-toggle .ttxt{font-size:11px;font-weight:500;color:var(--text-secondary);}
.thread-drawer-left.collapsed .tdl-toggle{justify-content:center;padding:4px 0;margin:2px 1px;}
.thread-drawer-left.collapsed .tdl-toggle .ttxt{display:none;}
/* V1.504：左栏收起 → 整栏收窄（左栏 180→30px 窄条，右侧批注列表宽度不变，把让出的空间给看板）。
   用独立 class leftcollapsed，避免与 toggleThreadDrawer 的 .thread-drawer.collapsed(整条竖线) 冲突。
   410 = 右列表 380px(不变) + 左栏窄条 30px。 */
.thread-drawer.leftcollapsed{width:410px;max-width:88vw;}
.thread-drawer-overlay.leftcollapsed{width:410px;max-width:88vw;}
.thread-drawer-left::-webkit-scrollbar{width:4px;}
.tdl-label{font-size:10.5px;font-weight:700;color:var(--text-muted);padding:6px 6px 3px;letter-spacing:.2px;}
.tdl-item{display:flex;align-items:center;gap:5px;padding:5px 6px;border-radius:7px;font-size:11.5px;color:var(--text);cursor:pointer;line-height:1.3;min-width:0;}
.tdl-item:hover{background:#f0eee8;}
.tdl-item.active{background:var(--purple-soft);color:var(--purple);font-weight:600;}
.tdl-item .dot{width:7px;height:7px;border-radius:50%;flex:none;}
.tdl-item .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tdl-item .cnt{font-size:10px;color:var(--text-muted);flex:none;}
.tdl-item.active .cnt{color:var(--purple);}
/* V1.504：左栏项目树层级标记（L1/L2/L3 小徽标）。只做一点点缩进（L2 +12px、L3 +24px），避免子项标题被挤没。 */
.tdl-item .lv{flex:none;font-size:8px;font-weight:700;border-radius:4px;padding:1px 3.5px;line-height:1.25;letter-spacing:.2px;color:#fff;}
.tdl-item .lv1{background:#7c5cbf;width:18px;text-align:center;}
.tdl-item .lv2{background:#4a7aa8;width:18px;text-align:center;}
.tdl-item .lv3{background:#6fae64;width:18px;text-align:center;}
.tdl-item.lsub{padding-left:16px;font-size:11px;}
.tdl-item.lsub2{padding-left:28px;font-size:11px;}
.tdl-fold{color:var(--text-muted);font-size:9px;width:13px;flex:none;text-align:center;cursor:pointer;transition:transform .15s ease;}
.tdl-fold.open{transform:rotate(90deg);}
.tdl-fold.hid{visibility:hidden;cursor:default;}
.tdl-children{display:none;}
.tdl-children.open{display:block;}
.tdl-search{padding:7px 8px;border-bottom:1px solid var(--border);background:#fff;}
.tdl-search input{width:100%;border:1px solid var(--border);border-radius:7px;padding:5px 8px;font-size:11px;outline:none;background:#fbfaf7;}
.tdl-search input:focus{border-color:var(--purple);background:#fff;}
.tdl-tabs{display:flex;gap:4px;padding:6px 8px 0;}
.tdl-tab{flex:1;font-size:11px;padding:4px 5px;border-radius:7px;border:1px solid var(--border);background:#fff;cursor:pointer;color:var(--text-secondary);text-align:center;white-space:nowrap;overflow:hidden;}
.tdl-tab.on{background:var(--purple);color:#fff;border-color:var(--purple);}
.thread-drawer-list{flex:1;overflow-y:auto;padding:8px 9px;min-width:0;}
.thread-drawer-list::-webkit-scrollbar{width:5px;}
.thread-drawer-list::-webkit-scrollbar-thumb{background:#ddd;}
.thread-drawer-list .thread-drawer-empty{padding:30px 8px;}
.tdl-hint{font-size:10px;color:var(--text-muted);padding:5px 8px 0;display:flex;align-items:center;gap:4px;}
/* V1.479：个人备忘右侧抽屉（复用批注栏 drawer 交互，规避批注栏坑：overlay 不遮表格 / 缩起无残留）
   —— overlay 只在右侧留一个宽区、pointer-events:none 让主表可点可编辑；抽屉本体 pointer-events:auto */
.memo-drawer-overlay{position:fixed;top:0;right:0;bottom:0;width:540px;z-index:405;pointer-events:none;}
.memo-drawer{position:fixed;top:0;right:0;bottom:0;width:540px;max-width:94vw;background:#fff;z-index:406;display:flex;flex-direction:column;box-shadow:-8px 0 30px rgba(0,0,0,0.13);border-left:1px solid var(--border);padding:14px 16px 8px;pointer-events:auto;animation:memoDrawerIn 0.22s ease;}
@keyframes memoDrawerIn{from{transform:translateX(100%);}to{transform:translateX(0);}}
/* 收起态：彻底干净——去竖线/去阴影/去背景/去滚动条，只留一个无边框纯图标展开按钮（规避批注栏残留方块的坑）。
   body/header/actions/owner-hint/搜索框一律 display:none，避免 34px 窄条内残留圆点/滚动条/内边距。 */
.memo-drawer.collapsed{width:34px;padding:0;border-left:none;box-shadow:none;background:transparent;animation:none;overflow:hidden;}
.memo-drawer.collapsed .memo-drawer-header,.memo-drawer.collapsed .memo-drawer-body,.memo-drawer.collapsed .memo-drawer-actions,.memo-drawer.collapsed #memoPanelBody{display:none!important;}
.memo-drawer.collapsed .memo-drawer-owner-hint{display:none;}
.memo-drawer.collapsed .memo-drawer-expand{position:absolute;top:8px;right:4px;}
.memo-drawer-expand{position:fixed;top:10px;right:6px;width:26px;height:26px;background:transparent;border:none;box-shadow:none;border-radius:7px;cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--purple);font-size:15px;font-weight:700;}
.memo-drawer-expand:hover{background:#f0edf7;}
/* 头部 */
.memo-drawer-header{border-bottom:1px solid var(--border);padding-bottom:10px;margin-bottom:8px;flex-shrink:0;}
.memo-drawer-title{display:flex;align-items:center;justify-content:space-between;gap:10px;}
.memo-drawer-title .tt{font-size:14px;font-weight:600;color:var(--text);display:flex;align-items:baseline;gap:7px;}
.memo-drawer-close{background:none;border:none;font-size:18px;cursor:pointer;color:var(--text-muted);padding:2px 6px;line-height:1;border-radius:4px;}
.memo-drawer-close:hover{background:var(--bg);color:var(--text);}
.memo-drawer-actions{display:flex;align-items:center;gap:8px;margin-top:9px;}
.memo-btn{font-size:12px;color:var(--text-secondary);background:#fff;border:1px solid var(--border);border-radius:7px;padding:5px 10px;cursor:pointer;display:inline-flex;align-items:center;gap:5px;font-weight:500;}
.memo-btn:hover{background:var(--bg);}
.memo-btn.primary{background:var(--purple);color:#fff;border-color:var(--purple);}
.memo-btn.primary:hover{background:#7a5f9e;color:#fff;}
/* V1.495：memoOwnerHint 从独立行移到标题「我的备忘」后面同行小字——改为 baseline 基线对齐(与标题大字底部对齐，不再偏上)、显式 font-weight:400 去粗体 */
.memo-drawer-owner-hint{font-size:10.5px;font-weight:400;color:var(--text-muted);margin-top:0;padding-bottom:2px;}
.memo-drawer-body{overflow:hidden;}
/* V1.483：分组拖拽排序——拖放目标高亮 */
.memo-group-drop{border:1px solid transparent;border-radius:8px;transition:background 0.12s,border-color 0.12s;}
.memo-group-drop.drag-over{background:#f2ecfb;border-color:var(--purple);}
/* V1.485：标签级拖拽——标签行在管理弹窗内可拖动排序/换分组 */
.memo-group-drop [draggable="true"]{transition:background 0.12s,box-shadow 0.12s;}
.memo-group-drop [draggable="true"]:active{cursor:grabbing;background:#f7f5fc;}
/* V1.485：颜色浮层色板统一莫兰迪 */
.memo-tag-color-swatch{transition:transform 0.1s;}
.memo-tag-color-swatch:hover{transform:scale(1.12);}
/* V1.483：备忘抽屉整体排版更易读——分组标题层级、标签行对齐、卡片间距 */
.memo-tag-col{font-size:12.5px;line-height:1.5;}
.memo-group-label{font-size:11px;font-weight:600;color:var(--text-secondary);margin:10px 0 4px;padding-left:2px;display:flex;align-items:center;gap:5px;}
.thread-drawer-empty{text-align:center;color:var(--text-muted);padding:40px 12px;font-size:12px;line-height:1.7;}
/* V1.438：批注面板重构——卡片结构化 + 莫兰迪芯片 + 分组折叠 */
.td-group{margin-bottom:11px;}
.td-group-head{display:flex;align-items:center;gap:6px;padding:6px 9px;background:var(--bg);border:1px solid var(--border);border-radius:8px;font-size:11px;cursor:pointer;user-select:none;transition:background 0.12s;}
.td-group-head:hover{background:#efece4;}
.td-group-head .td-chev{display:inline-flex;flex-shrink:0;transition:transform 0.18s;color:var(--text-muted);}
.td-group-head .td-gname{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;color:var(--text);}
.td-group-head .td-gcount{font-size:10px;color:var(--text-secondary);flex-shrink:0;}
.td-group-body{margin-top:5px;}
.td-group.collapsed .td-group-body{display:none;}
.td-item{padding:9px 10px;border-radius:9px;border:1px solid var(--border);margin-bottom:8px;background:#fff;transition:border-color 0.12s,box-shadow 0.12s;}
.td-item:hover{border-color:#c9c4b6;}
.td-item.archived{opacity:.6;background:var(--bg);border-style:dashed;}
.td-item.mentioned{border-color:#d9c9b4;}
.td-head{display:flex;align-items:center;gap:8px;cursor:pointer;min-width:0;}
.td-meta{flex:1;min-width:0;display:flex;flex-direction:column;gap:1px;align-items:flex-start;line-height:1.3;}
.td-name{font-size:12.5px;font-weight:500;color:var(--text);}
.td-time{font-size:10.5px;color:var(--text-muted);}
.td-rows{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px;}
.td-summary{font-size:10px;color:var(--text-secondary);margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.td-body{font-size:12.5px;color:var(--text);line-height:1.6;margin-top:5px;word-break:break-word;overflow-wrap:anywhere;white-space:pre-wrap;}
.td-chip{display:inline-flex;align-items:center;gap:3px;font-size:9.5px;padding:1px 7px;border-radius:7px;line-height:1.5;font-weight:500;}
.td-chip.blue{background:#eef2f5;color:var(--blue);}
.td-chip.purple{background:#eeedfe;color:var(--purple);}
.td-chip.orange{background:#f3e6d6;color:#a0682f;}
.td-chip.amber{background:#faeeda;color:#975f13;}
.td-chip.green{background:#eaf3de;color:#5c7a35;}
.td-chip.gray{background:var(--bg);color:var(--text-secondary);}
.td-chip svg{width:10px;height:10px;}
.td-replies{margin-top:7px;border-left:2px solid #eef0ee;padding-left:9px;display:flex;flex-direction:column;gap:7px;}
.td-reply{display:flex;gap:6px;align-items:flex-start;min-width:0;}
.td-reply-main{flex:1;min-width:0;}
.td-reply-meta{display:flex;align-items:center;gap:5px;font-size:10.5px;}
.td-reply-meta .w{color:var(--text);font-weight:500;white-space:nowrap;flex-shrink:0;}
.td-reply-meta .t{color:var(--text-muted);white-space:nowrap;flex-shrink:0;}
.td-reply-txt{font-size:11.5px;color:var(--text-secondary);line-height:1.6;margin-top:1px;word-break:break-word;overflow-wrap:anywhere;white-space:pre-wrap;min-width:0;}
.td-actions{display:flex;align-items:center;gap:13px;margin-top:7px;padding-top:7px;border-top:1px solid #f1efe8;}
.td-btn{display:inline-flex;align-items:center;gap:4px;font-size:11px;cursor:pointer;user-select:none;font-weight:500;padding:1px 3px;border-radius:5px;}
.td-btn svg{width:11px;height:11px;}
.td-btn.reply{color:var(--purple);}
.td-btn.reply:hover{background:#eeedfe;}
.td-btn.more{color:var(--text-secondary);}
.td-btn.more:hover{background:var(--bg);color:var(--text);}
.td-reply-in{margin-top:7px;border-top:1px dashed var(--border);padding-top:7px;}
.td-reply-ta{width:100%;box-sizing:border-box;min-height:34px;max-height:120px;padding:6px 8px;border:1px solid var(--border);border-radius:6px;font-size:11.5px;font-family:inherit;line-height:1.55;background:#fff;outline:none;resize:none;color:var(--text);}
.td-reply-ta:focus{border-color:var(--purple);box-shadow:0 0 0 2px rgba(130,104,174,0.12);}
.td-reply-ta::placeholder{color:var(--text-muted);}
.td-reply-bar{display:flex;justify-content:flex-end;margin-top:5px;}
.td-send{background:var(--purple);color:#fff;border:none;border-radius:6px;padding:3px 12px;cursor:pointer;font-size:11px;font-family:inherit;font-weight:500;}
.td-send:hover{background:var(--indigo);}
.td-subchips{display:inline-flex;gap:4px;flex-wrap:wrap;align-items:center;}
.td-empty{color:var(--text-muted);}
.td-empty-hint{font-size:11px;color:var(--text-muted);}
.thread-drawer-section-title{font-size:10.5px;color:var(--text-muted);margin:10px 0 6px;display:flex;align-items:center;gap:5px;font-weight:500;}
/* 批注回复——头像(左) + 作者/相对时间 + 回复文本，对话线缩进分层（旧类保留兼容） */
.thread-drawer-replies{margin-top:8px;border-left:2px solid var(--border);padding-left:9px;display:flex;flex-direction:column;gap:8px;}
.thread-drawer-replies .r{display:flex;gap:6px;align-items:flex-start;min-width:0;}
.thread-drawer-replies .r-main{flex:1;min-width:0;}
.thread-drawer-replies .r-meta{display:flex;align-items:center;gap:5px;font-size:10.5px;}
.thread-drawer-replies .r-meta .w{color:var(--text-secondary);font-weight:500;white-space:nowrap;flex-shrink:0;}
.thread-drawer-replies .r-meta .t{color:var(--text-muted);white-space:nowrap;flex-shrink:0;}
.thread-drawer-replies .r-txt{font-size:12px;color:var(--text);line-height:1.6;margin-top:1px;word-break:break-word;overflow-wrap:anywhere;white-space:pre-wrap;min-width:0;}
/* 「⋯」浮出菜单 */
.thread-drawer-menu{font-family:inherit;}
.thread-drawer-menu .mm-item{padding:6px 10px;border-radius:5px;cursor:pointer;color:var(--text);display:flex;align-items:center;gap:7px;font-size:12px;width:100%;box-sizing:border-box;}
.thread-drawer-menu .mm-item svg{flex-shrink:0;}
.thread-drawer-menu .mm-item:hover,.thread-drawer-menu .mm-item.hover{background:var(--bg);color:var(--text);}
.thread-drawer-menu .mm-item.danger{color:var(--red);}
.thread-drawer-menu .mm-item.danger:hover,.thread-drawer-menu .mm-item.danger.hover{background:#f6e9e4;color:var(--red);}

/* 批注讨论图标（note 列右上角，替代 💬，区别于备注） */
.thread-proj-badge{flex-shrink:0;display:inline-flex;align-items:center;gap:1px;min-width:18px;height:18px;padding:0 4px;border-radius:6px;background:var(--purple);color:#fff;font-size:10px;font-weight:600;cursor:pointer;border:1.5px solid #fff;box-shadow:0 1px 3px rgba(0,0,0,0.12);z-index:5;line-height:1;transition:transform 0.12s;margin-top:1px;position:relative;}
.thread-proj-badge:hover{transform:scale(1.1);background:var(--indigo);}
.thread-proj-badge .ic{font-size:10px;margin-right:1px;}
.thread-proj-badge .pd{position:absolute;top:-5px;right:-5px;min-width:12px;height:12px;border-radius:6px;background:var(--orange);color:#fff;font-size:8px;display:inline-flex;align-items:center;justify-content:center;padding:0 2px;border:1.5px solid #fff;font-weight:700;line-height:1;}
.thread-proj-badge:hover .pd,.thread-proj-badge:focus .pd{border-color:var(--bg);}

/* note 列内右上角锚点（让批注图标落在单元格右上角，不溢出） */
.col-note .note-cell-wrap{position:relative;display:flex;align-items:flex-start;justify-content:space-between;gap:4px;min-height:20px;}
.col-note .note-cell-wrap .note-text-wrap{flex:1;min-width:0;padding-right:2px;}
.col-note .todo-txt{max-width:100%;}
.col-note .note-hover-badge{opacity:0;transition:opacity 0.15s;flex-shrink:0;margin-top:1px;}
.col-note:hover .note-hover-badge{opacity:1;}

/* V1.519 备忘转批注项目树（分级缩进 + L1/L2/L3 层级徽标） */
.memo-thread-node{display:flex;align-items:center;gap:7px;padding:6px 10px;border-radius:6px;cursor:pointer;margin-bottom:2px;position:relative;transition:background 0.1s;}
.memo-thread-node:hover{background:#f5f5f7;}
.memo-thread-node.memo-thread-sel{background:#eeedfe;}
.memo-thread-arrow{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;flex:none;color:#9ca3af;font-size:10px;line-height:1;cursor:pointer;border-radius:3px;}
.memo-thread-arrow:hover{color:#534ab7;background:#eef;background:rgba(83,74,183,0.08);}

/* ═══ V1.590：批注快照 · 左右对照弹窗 ═══
   需求（山姆）：点开批注 → 用当前看板的格式与 UI 左右对照（左=当前数据、右=批注时数据）。
   样式复用主表 .tree-table / .dept-tag / .meeting-chip / .clarity-chip 等既有类，
   此处只补「弹窗骨架 + 变化高亮 + 双栏滚动」三组规则。 */
.td-btn.snap{color:var(--indigo);}
.td-btn.snap:hover{background:#f0f4ff;}
.snap-overlay{z-index:1400;}
.snap-modal{position:fixed;left:2vw;right:2vw;top:3vh;bottom:3vh;background:#fff;border-radius:12px;
  box-shadow:0 12px 48px rgba(0,0,0,0.20);display:flex;flex-direction:column;overflow:hidden;
  border:0.5px solid var(--border);}
.snap-head{padding:13px 18px;border-bottom:1px solid var(--border);display:flex;align-items:center;
  justify-content:space-between;gap:12px;background:#faf9f6;flex-shrink:0;}
.snap-meta{padding:8px 18px;border-bottom:1px solid var(--border);display:flex;align-items:center;
  gap:9px;font-size:11.5px;color:var(--text-secondary);flex-shrink:0;flex-wrap:wrap;background:#fff;}
.snap-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 9px;border-radius:11px;
  font-size:11px;background:#f3f4f6;color:var(--text-secondary);font-weight:500;}
.snap-chip.warn{background:#fef3c7;color:#92400e;}
.snap-chip.ok{background:#d1fae5;color:#059669;}
.snap-body{flex:1;display:flex;min-height:0;background:#f7f6f3;}
.snap-pane{flex:1 1 50%;min-width:0;display:flex;flex-direction:column;border-right:1px solid var(--border);}
.snap-pane:last-child{border-right:none;}
.snap-pane-head{padding:8px 14px;font-size:12px;font-weight:600;color:var(--text);
  background:#fff;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:7px;flex-shrink:0;}
.snap-hint{font-weight:400;color:var(--text-muted);font-size:11px;}
.snap-dot{width:8px;height:8px;border-radius:50%;display:inline-block;flex:none;}
.snap-dot.now{background:#4f829a;}
.snap-dot.then{background:#c08a4b;}
.snap-scroll{flex:1;overflow:auto;padding:8px;}
/* 两侧表格等比缩放：列不再固定像素，按容器宽度自适应，保证左右严格对齐可比对 */
.snap-table{width:100%;table-layout:fixed;font-size:11px;}
.snap-table th,.snap-table td{padding:4px 6px;vertical-align:top;word-break:break-word;overflow-wrap:anywhere;}
.snap-table .col-name{width:17%;}
.snap-table .col-result,.snap-table .col-contra,.snap-table .col-q3,.snap-table .col-q4,
.snap-table .col-substantial,.snap-table .col-meeting{width:11%;}
.snap-table .col-clarity,.snap-table .col-ddl,.snap-table .col-note,
.snap-table .col-dept,.snap-table .col-owner,.snap-table .col-updated{width:6.5%;}
.snap-table .col-row th{font-size:10.5px;line-height:1.4;}
.snap-table .group-row th{font-size:10.5px;}
/* 变化高亮：琥珀底 + 左竖条（左右两侧都标，方便任意一侧定位） */
.snap-table td.snap-changed{background:#fffbeb;box-shadow:inset 2px 0 0 #f59e0b;}
.snap-table tr:hover td{background:#fafafa;}
.snap-table tr:hover td.snap-changed{background:#fef9e7;}
/* 🔴 V1.596：行首折叠三角（快照对照弹窗支持收起/展开子级）+ 工具栏按钮 */
.snap-fold{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;flex-shrink:0;
  margin-right:2px;font-size:9px;line-height:1;color:var(--text-muted);cursor:pointer;border-radius:3px;user-select:none;}
.snap-fold:hover{background:#eef2f7;color:var(--text-secondary);}
.snap-fold.folded{color:var(--blue);font-weight:700;}
.snap-fold.none{cursor:default;visibility:hidden;}
.snap-tool-btn{border:1px solid var(--border);background:#fff;color:var(--text-secondary);font-size:11.5px;
  padding:3px 9px;border-radius:6px;cursor:pointer;white-space:nowrap;}
.snap-tool-btn:hover{background:#f3f6fa;color:var(--text);border-color:#cbd5e1;}
@media (max-width:1100px){.snap-modal{left:0.5vw;right:0.5vw;top:1vh;bottom:1vh;border-radius:8px;}}
