
/* ══ 硕榜统一设计层 · 润色（只改观感，不动布局）══ */
body{background:var(--c-bg);color:var(--c-t1);font:var(--f)/var(--lh) var(--font)}
/* ⚠️ 关键：别让设计层的 width:100% 撑爆筛选区 */
input,select,textarea{width:auto;font:var(--f)/1.4 var(--font);min-height:var(--h-ctl);
  padding:6px 12px;border:1px solid var(--c-line);border-radius:var(--r);
  background:var(--c-surface);color:var(--c-t1)}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--c-brand);
  box-shadow:0 0 0 3px rgba(37,99,235,.12)}
textarea{resize:vertical}
button{font:500 var(--f)/1 var(--font);min-height:var(--h-ctl);padding:0 14px;
  border:1px solid var(--c-line);border-radius:var(--r);background:var(--c-surface);
  color:var(--c-t1);cursor:pointer;white-space:nowrap;display:inline-flex;align-items:center;
  justify-content:center;gap:6px;transition:background var(--dur) var(--ease)}
button:hover{background:var(--c-surface-2);border-color:var(--c-line)}
button:disabled{opacity:.5;cursor:not-allowed}
table{width:100%;border-collapse:separate;border-spacing:0;font-size:var(--f-sm)}
th,td{padding:10px 12px;border-bottom:1px solid var(--c-line-2);text-align:left;vertical-align:middle}
th{background:var(--c-surface-2);color:var(--c-t2);font-weight:600;font-size:var(--f-xs);
  white-space:nowrap;position:sticky;top:0;z-index:1;border-bottom:1px solid var(--c-line)}
h1,h2,h3,h4{font-weight:600;letter-spacing:-.01em}
a{color:var(--c-brand)}
hr{border:0;border-top:1px solid var(--c-line)}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-thumb{background:#d5d9df;border-radius:99px;border:3px solid transparent;
  background-clip:content-box}
::-webkit-scrollbar-thumb:hover{background:#b9bfc8;background-clip:content-box}


/* ══════════════ v5 · 手写主题 ↔ 设计层桥接（2026-09-14）══════════════
   背景：设计层 /ui/shuobang-ui.css 用 --c-* 变量 + prefers-color-scheme 媒体查询，
        而本应用的主题切换走 html[data-theme]。两套机制互不知情，导致在系统为浅色
        但用户手动切到深色时，body 底色变深、文字却仍是深色（几乎不可见）。
   做法：让 data-theme 也接管设计层的 --c-* 变量（优先级更高，放在设计层之后）。 */
html[data-theme="dark"]{
  --c-bg:#16181c;--c-surface:#1e2126;--c-surface-2:#23262c;--c-line:#2c3037;--c-line-2:#33373f;
  --c-t1:#ffffff;--c-t2:#a8aeb8;--c-t3:rgba(255,255,255,.4);
  --c-pri0-flag:rgba(255,255,255,.6);
  --c-brand:#4d86ff;--c-brand-bg:rgba(77,134,255,.16);--c-ok:#3fb27f;--c-warn:#e0a020;--c-bad:#E03131;
}
html[data-theme="light"]{
  --c-bg:#f5f6f8;--c-surface:#fff;--c-surface-2:#f0f2f5;--c-line:#e8eaed;--c-line-2:#eef0f3;
  --c-t1:#191919;--c-t2:#5c636e;--c-t3:rgba(25,25,25,.4);
  /* ★ 2026-09-19 B1：「无优先级旗」的颜色（滴答 `#priority-0` 无 fill，实例渲染 = 60% 灰）*/
  --c-pri0-flag:rgba(25,25,25,.6);
  --c-brand:#2d6ff7;--c-brand-bg:rgba(45,111,247,.09);--c-ok:#30a46c;--c-warn:#f5a524;--c-bad:#E03131;
}
/* 深色下修正若干硬编码浅色（原设计层/本应用内联的浅底） */
html[data-theme="dark"] .task .tm .tag{background:#2a2e35;color:var(--c-t2)}
/* 滴答菜单两段：浅色下 label rgba(25,25,25,.4) / hover 底 rgba(25,25,25,.05)；深色对称（滴答也是 grey-5↔white-5 双写） */
html[data-theme="dark"] .dt-menu .sec68 .ms-t{color:rgba(255,255,255,.4)}
html[data-theme="dark"] .dt-menu .sec68 .ms-i:hover{background:rgba(255,255,255,.05)}
html[data-theme="dark"] .chip{background:var(--c-surface);border-color:var(--c-line)}
html[data-theme="dark"] .chip:hover{background:var(--c-surface-2)}
html[data-theme="dark"] .dt-foldbox,html[data-theme="dark"] .dt-ibox{background:var(--c-surface)}
html[data-theme="dark"] .dt-drow .dchk,html[data-theme="dark"] .chk{border-color:#4a5058}
html[data-theme="dark"] .ab-hint b,html[data-theme="dark"] .zsec .zact:hover{color:var(--c-brand)}
/* r95/池51：同 `#sview` —— 暗色下的 `.zbody .task:hover` 不透明灰底覆盖**已删除**，统一交给 `.task:hover::before` 的 4% 令牌混合（否则层级叠加过深）。 */
html[data-theme="dark"] ::-webkit-scrollbar-thumb{background:#3a4048}
html[data-theme="dark"] ::-webkit-scrollbar-thumb:hover{background:#4a515b}
/* 深色下任务完成态文字与删除按钮 */
html[data-theme="dark"] .task.done .t{color:var(--c-t3)}

/* ══ UX 优化 2026-09-14（真机走动后修）══ */
/* F1 描述模式（**2026-09-17 修正**）：原「按内容自适应」在**描述为空**时会塌到 min-height，
   反而让下面的空子任务区吃掉全屏 → 现改为**描述区恒撑满**（滴答同款） */
.dt-main.no-sub .dt-descwrap{flex:1;max-height:none;overflow-y:auto}   /* fb#86 同修 */
/* F1 描述 与「子任务/检查项」之间给一条淡分隔线，避免两块糊在一起 */
/* ★ r115：删掉 `border-top:1px dashed`（**滴答无此线** —— `_dida_r115c.js` A1 实测：
   描述底 → 子任务区顶 **20px** 区间内元素数 **0**）⇒ 只留 20px 间距；并让区自己的 `margin-top` 归零避免叠加。 */
.dt-subwrap{margin-top:20px}
.dt-subwrap .dt-sec{margin-top:0}
.dt-subwrap .dt-sec+.dt-sec{margin-top:14px;padding-top:14px;border-top:1px solid var(--c-line-2)}   /* ★ r116 运维(反馈#8)：两块明确错开，不再连成一片看着像重复 */
/* F2 模式按钮明确「当前处在哪个模式」（原来两个都没选中态） */
.dt-mode-btn.on{border-color:var(--c-brand);color:var(--c-brand);background:var(--c-brand-bg);font-weight:600}
/* F3 非列表视图且未选中任务时收起右侧空详情，别白占 400px */
#detail.solo{display:none}
/* F6 站内轻提示（替代 alert） */
#tkToast{position:fixed;left:50%;bottom:26px;transform:translateX(-50%) translateY(8px);
  background:rgba(28,32,38,.94);color:#fff;font-size:13px;padding:8px 16px;border-radius:9px;
  z-index:99;opacity:0;pointer-events:none;transition:opacity .18s,transform .18s;max-width:76vw;
  box-shadow:0 6px 20px rgba(0,0,0,.2)}
#tkToast.on{opacity:1;transform:translateX(-50%) translateY(0)}

/* ══════════════ 工作区（2026-09-14 · 第 2 步前端）══════════════
   组件类一律 ws- 前缀：本页 .chip/.tag/.empty 已被占用且无作用域，直接同名会打架。
   颜色/间距/字号只用设计层令牌，不写十六进制。 */
#wsPage{display:none;padding:var(--s6) var(--s6) 72px}
/* 2026-09-14：补上 flex:1 + overflow —— 本页与 #list/#cal/#tl/#board 一致，
   否则内容超出会被 body{overflow:hidden} 裁掉且自己不能滚（负责人：工作区没法下滑） */
#wsPage.on{display:block;flex:1;min-width:0;min-height:0;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch}
.wsgrid{display:grid;grid-template-columns:minmax(0,1fr) 244px;gap:var(--s5);align-items:start}
@media(max-width:980px){.wsgrid{grid-template-columns:minmax(0,1fr)}}
.wscol{display:flex;flex-direction:column;gap:var(--s3)}
.wscard{background:var(--c-surface);border:1px solid var(--c-line);border-radius:var(--r-lg);
  padding:var(--s4) var(--s5);margin-bottom:var(--s3)}
.wscard-t{display:flex;align-items:center;gap:var(--s2);flex-wrap:wrap;margin-bottom:var(--s3)}
.wscard-t h4{margin:0;font-size:var(--f-lg);font-weight:600}
.wssp{flex:1}
.wsmut{color:var(--c-t3);font-size:var(--f-sm)}
.wsrow{display:flex;align-items:center;gap:var(--s2)}
.wspillbtn{display:inline-flex;align-items:center;gap:var(--s1);border:1px solid var(--c-line);
  background:var(--c-surface);color:var(--c-t2);border-radius:var(--r);padding:var(--s1) var(--s2);
  font-size:var(--f-sm);cursor:pointer;min-height:28px}
.wspillbtn:hover{background:var(--c-surface-2);color:var(--c-t1)}
.wspillbtn.pri{background:var(--c-brand);border-color:var(--c-brand);color:var(--c-surface)}
.wspillbtn.pri:hover{background:var(--c-brand-h);border-color:var(--c-brand-h)}
.wspillbtn.dgr:hover{border-color:var(--c-bad);color:var(--c-bad)}
/* 颗粒行（对齐设计稿 .chip，但改名 ws-chip） */
.wschip{display:flex;align-items:center;gap:var(--s2);padding:var(--s2) var(--s3);border-radius:var(--r);
  background:var(--c-surface-2);border:1px solid transparent;transition:background var(--dur) var(--ease);
  min-height:44px}
.wschip.run{background:var(--c-brand-bg);border-color:var(--c-brand);
  box-shadow:inset 3px 0 0 var(--c-brand)}
.wschip .nm{flex:1;min-width:0;font-size:var(--f);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wschip .src{font-size:var(--f-xs);color:var(--c-t3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wschip.done .nm{color:var(--c-t3);text-decoration:line-through}
.wschip.run .nm{color:var(--c-brand);font-weight:600}
.wschip.run .src{color:var(--c-brand)}
.wschip .dur{font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--c-t2);flex:0 0 auto;font-size:var(--f-sm)}
.wschip.run .dur{color:var(--c-brand);font-weight:600}
.wschip .rk{width:9px;height:9px;border-radius:var(--r-full);border:1.5px solid var(--c-t3);flex:0 0 auto;margin:0 2px}
.wschip.run .rk{border:0;background:var(--c-brand);width:9px}
.wschip.done .rk{border:0;background:var(--c-ok);width:9px}
/* 时长/时间 */
.wsmono{font-family:var(--mono);font-variant-numeric:tabular-nums;flex:0 0 auto}
/* 徽标（对齐设计稿 .tag，改名 ws-tag） */
.wstag{display:inline-flex;align-items:center;gap:var(--s1);border-radius:var(--r-sm);
  padding:var(--s1) var(--s2);font-size:var(--f-xs);font-weight:500;background:var(--c-surface-2);color:var(--c-t2)}
.wstag .dot{width:6px;height:6px;border-radius:var(--r-full);background:currentColor;display:inline-block}
.wstag.ok{background:var(--c-ok-bg,rgba(48,163,108,.12));color:var(--c-ok)}
.wstag.brand{background:var(--c-brand-bg);color:var(--c-brand)}
.wstag.warn{background:var(--c-warn-bg,rgba(245,165,36,.14));color:var(--c-warn)}
.wstag.bad{background:var(--c-bad-bg,rgba(229,72,77,.12));color:var(--c-bad)}
/* 进度条 */
.wsbar{height:6px;background:var(--c-brand-bg);border-radius:var(--r-full);overflow:hidden;flex:1;min-width:40px}
.wsbar>i{display:block;height:6px;background:var(--c-brand)}
/* 时间去向 / 空档 提示条（对齐设计稿 .note，改名 ws-note） */
.wsnote{display:flex;gap:var(--s2);border-radius:var(--r);padding:var(--s2) var(--s3);font-size:var(--f-sm);
  background:var(--c-surface-2);color:var(--c-t2);border:1px solid var(--c-line)}
.wsnote.brand{background:var(--c-brand-bg);border-color:var(--c-brand);color:var(--c-t1)}
.wsnote.bad{background:var(--c-bad-bg,rgba(229,72,77,.10));border-color:var(--c-bad);color:var(--c-t1)}
.wsnote.bad a{color:var(--c-bad);text-decoration:underline;cursor:pointer}
.wsgap{cursor:pointer}
/* 空状态 */
.wsempty{text-align:center;color:var(--c-t3);padding:var(--s8) var(--s4);font-size:var(--f-sm)}
.wsempty .big{font-size:var(--f-lg);color:var(--c-t2);margin-bottom:var(--s3)}
/* 时间轴（历史/今日列表头） */
.wsaxis{display:flex;align-items:center;gap:var(--s3);padding:var(--s2) 0}
.wsaxis .hh{font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--c-t3);font-size:var(--f-sm);flex:0 0 auto;width:88px}
/* 模板块行 */
.wsblk{display:flex;align-items:center;gap:var(--s3);padding:var(--s2);border-radius:var(--r);border:1px solid var(--c-line-2)}
.wsblk .t{font-size:var(--f);font-weight:500;min-width:0;flex:1}
.wsblk .h{font-size:var(--f-sm);color:var(--c-t3)}
.wsblk .grip{cursor:grab;color:var(--c-t3)}
.wsblk .durip{width:64px;text-align:right}
.wstplcard{border:1px solid var(--c-line);border-radius:var(--r);padding:var(--s3) var(--s4);cursor:pointer}
.wstplcard.on{border-color:var(--c-brand);background:var(--c-brand-bg)}
/* 顶栏里的工作区控件 */
.wsdatenav{display:flex;align-items:center;gap:0;border:1px solid var(--c-line);border-radius:var(--r);
  background:var(--c-surface);height:var(--h-ctl);overflow:hidden;flex:0 0 auto}
.wsdatenav button{height:100%;border:0;border-radius:0;padding:0 var(--s2);background:transparent;min-height:0}
.wsdatenav span{padding:0 var(--s2);font-size:var(--f-sm);border-left:1px solid var(--c-line-2);
  border-right:1px solid var(--c-line-2);line-height:var(--h-ctl);white-space:nowrap}
.wssubnav{display:flex;gap:var(--s1);border:1px solid var(--c-line);border-radius:var(--r);overflow:hidden;flex:0 0 auto}
.wssubnav button{border:0;border-radius:0;background:var(--c-surface);padding:0 var(--s3);height:var(--h-ctl);
  font-size:var(--f-sm);color:var(--c-t2);min-height:0}
.wssubnav button.on{background:var(--c-brand);color:var(--c-surface)}
/* 底部常驻条（窄屏主操作） */
.wsfoot{display:none;position:fixed;left:0;right:0;bottom:0;z-index:30;background:var(--c-surface);
  border-top:1px solid var(--c-line);padding:var(--s2) var(--s4);align-items:center;gap:var(--s2)}
@media(max-width:980px){.wsfoot.on{display:flex}}
.wsfoot .tot{margin-left:auto;font-family:var(--mono);font-variant-numeric:tabular-nums;color:var(--c-t2)}
/* 开始面板里的清单药丸 */
.wspickwrap{display:flex;flex-wrap:wrap;gap:var(--s2);margin:var(--s2) 0 var(--s3)}
.wspick{border:1px solid var(--c-line);border-radius:var(--r-full);padding:var(--s1) var(--s3);font-size:var(--f-sm);
  cursor:pointer;background:var(--c-surface);color:var(--c-t2);display:inline-flex;align-items:center;gap:var(--s1)}
.wspick:hover{border-color:var(--c-brand);color:var(--c-brand)}
.wspick.on{border-color:var(--c-brand);background:var(--c-brand-bg);color:var(--c-brand);font-weight:600}
.wssec-h{font-size:var(--f-xs);color:var(--c-t3);margin:var(--s3) 0 var(--s1);font-weight:600}
.wskpi{font-size:var(--f-2xl);font-weight:600;line-height:1.2;font-variant-numeric:tabular-nums}
.wsdotline{display:flex;align-items:center;gap:var(--s2);flex-wrap:nowrap}
.wsdotline .nm{color:var(--c-t3);font-size:var(--f-sm);width:56px;flex:0 0 auto;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.wsdotline .vv{font-family:var(--mono);font-variant-numeric:tabular-nums;width:48px;text-align:right;
  flex:0 0 auto;font-size:var(--f-sm);color:var(--c-t2)}
.wswarnrow{border-left:3px solid var(--c-warn)}

/* ══════════════ 设置·智能清单（2026-09-14）══════════════ */
.sset-h{font-size:var(--f-xs);color:var(--c-t3);font-weight:600;margin:var(--s4) 0 var(--s2)}
.sset-h:first-child{margin-top:0}
.sset-l{border:1px solid var(--c-line);border-radius:var(--r);overflow:hidden}
.sset-r{display:flex;align-items:center;gap:var(--s2);padding:var(--s2) var(--s3);
  border-bottom:1px solid var(--c-line-2);font-size:var(--f)}
.sset-r:last-child{border-bottom:0}
.sset-n{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sset-c{font-family:var(--mono);color:var(--c-t3);font-size:var(--f-sm);min-width:22px;text-align:right}
.sset-r select{min-width:92px}
.sset-lb{cursor:pointer}
.sset-tip{margin-top:var(--s3);font-size:var(--f-xs);color:var(--c-t3);line-height:1.7}

/* ══════════════ 工作区 UI 优化（2026-09-14 · 老板「太宽了」）══════════════ */
/* 实测：设计层 .modal{width:min(760px,96vw)} 覆盖了本页 .modal{width:470px}，
   工作区弹窗因此横跨整屏（比内容区还宽）→ 这里限宽 */
#wsMaskBox{width:min(520px,92vw);padding:var(--s5)}
#wsMaskBox.wide{width:min(680px,94vw)}
/* 弹窗里的按钮原来被 .wscol 拉伸到全宽、文字又被 button{justify-content:center} 居中 → 改左对齐菜单项 */
.wsmi{display:flex;align-items:center;gap:var(--s2);width:100%;justify-content:flex-start;
  text-align:left;padding:var(--s3) var(--s2);border:0;border-bottom:1px solid var(--c-line-2);
  border-radius:0;background:transparent;font-size:var(--f);color:var(--c-t1);cursor:pointer;
  min-height:38px;transition:background var(--dur) var(--ease)}
.wsmi:first-child{margin-top:calc(-1 * var(--s1))}
.wsmi:last-child{border-bottom:0}
.wsmi:hover{background:var(--c-surface-2)}
.wsmi.dgr{color:var(--c-bad)}
.wsmi .dti{color:var(--c-t3);flex:none}
.wsmi.dgr .dti{color:var(--c-bad)}
/* 卡片更紧凑（原 padding 偏松，窄窗口下显宽） */
#wsPage .wscard{padding:var(--s4) var(--s4)}
#wsPage{padding:var(--s5) var(--s5) 72px}
/* 顶栏：允许换行 + 窄屏收敛 */
#wsPage .wshead{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s2);margin-bottom:var(--s4)}
#wsPage .wshead .wssp{flex:1 1 auto;min-width:0}
@media(max-width:1180px){#wsClock{display:none}}
@media(max-width:1080px){.wsbacktx{display:none}}
/* ③ 未开始的分区合并成一张紧凑卡（原来每段一张卡，松散显宽） */
.wsidle{padding:var(--s3) var(--s4)}
.wsidle-h{font-size:var(--f-xs);color:var(--c-t3);font-weight:600;margin-bottom:var(--s1)}
.wsidle-r{display:flex;align-items:center;gap:var(--s2);padding:var(--s2) 0;
  border-bottom:1px solid var(--c-line-2)}
.wsidle-r:last-child{border-bottom:0;padding-bottom:0}
.wsidle-n{font-size:var(--f);color:var(--c-t2);min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
/* 已完成的分区卡收紧一档（进行中保持大卡、是视觉重点） */
.wscard.wsdone{padding:var(--s3) var(--s4)}
.wscard.wsdone .wscard-t{margin-bottom:var(--s2)}

/* ══════════════ 工作区 · 暂停/备注/待开始放颗粒（2026-09-14）══════════════ */
/* 分区备注区（老板：每个分区要有备注描述区，跟清单一样） */
.wsnoteed{width:100%;margin-top:var(--s3);padding:var(--s2) var(--s3);border:1px solid var(--c-line);
  border-radius:var(--r);background:var(--c-surface);color:var(--c-t1);font:var(--f)/1.6 var(--font);
  resize:vertical;min-height:56px;box-sizing:border-box}
.wsnoteed::placeholder{color:var(--c-t3)}
.wsnoteed:focus{outline:none;border-color:var(--c-brand);box-shadow:0 0 0 3px var(--c-brand-bg)}
.wsnote-ro{margin-top:var(--s3);padding:var(--s2) var(--s3);background:var(--c-surface-2);
  border-radius:var(--r);font-size:var(--f-sm);color:var(--c-t2);line-height:1.7;white-space:pre-wrap}
/* 待开始行里的备注摘要 */
.wsidle-note{font-size:var(--f-xs);color:var(--c-t3);max-width:180px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;flex:0 1 auto}
@media(max-width:1180px){.wsidle-note{display:none}}

/* ══════════════ 放进颗粒 · 搜索优先（2026-09-14）══════════════ */
.wshit{display:flex;align-items:center;gap:var(--s2);padding:var(--s2) var(--s3);border-radius:var(--r);
  background:var(--c-surface-2);cursor:pointer;min-height:40px}
.wshit:hover{background:var(--c-brand-bg)}
.wshit .ico{color:var(--c-t3);flex:none}
.wshit .tx{flex:1;min-width:0}
.wshit .t{font-size:var(--f);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wshit .m{font-size:var(--f-xs);color:var(--c-t3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wshit .k{color:var(--c-brand);font-weight:600;background:var(--c-brand-bg);border-radius:var(--r-sm);padding:0 2px}
.wsnew{display:flex;align-items:center;gap:var(--s2);padding:var(--s2) var(--s3);
  border:1px dashed var(--c-brand);border-radius:var(--r);cursor:pointer;color:var(--c-brand);
  min-height:40px;font-size:var(--f)}
.wsnew:hover{background:var(--c-brand-bg)}
.wsnew .tx{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wscqwrap{display:flex;align-items:center;gap:var(--s2);border:1px solid var(--c-line);
  border-radius:var(--r);padding:0 var(--s3);background:var(--c-surface);min-height:var(--h-ctl)}
.wscqwrap:focus-within{border-color:var(--c-brand);box-shadow:0 0 0 3px var(--c-brand-bg)}
.wscqwrap input{border:0!important;background:transparent!important;box-shadow:none!important;
  outline:none;flex:1;min-height:auto;padding:0}
.wscqwrap .ico{color:var(--c-t3);flex:none}

/* ══════════════ 输入框边框可见性（2026-09-14 老板：「外边加个灰框都会好很多」）══════════════
   实测原边框 var(--c-line) 压在白底上几乎看不见（等于没有框）→ 加深一档，并给悬停/聚焦反馈。
   同一规则作用于列表页「添加任务」、搜索弹窗、过滤器弹窗三处 .addbar，观感统一。
   颜色全部由令牌混合得出，浅/深色主题自动适配；不支持 color-mix 的浏览器回退到 --c-line。 */
.addbar{border-color:var(--c-line)}
@supports (border-color:color-mix(in srgb,red,blue)){
  .addbar{border-color:color-mix(in srgb,var(--c-line) 52%,var(--c-t3))}
  .addbar:hover{border-color:color-mix(in srgb,var(--c-line) 22%,var(--c-t3))}
  .addbar:focus-within{border-color:var(--c-brand)!important}
}

/* 模板块编辑：名称 / 说明 可改（2026-09-14） */
.wsblk .bname{flex:0 0 118px;min-width:0}
.wsblk .bdesc{flex:1;min-width:0}
.wsblk .bname,.wsblk .bdesc{font-size:var(--f-sm);padding:var(--s1) var(--s2);min-height:28px}
@media(max-width:1100px){.wsblk .bname{flex:0 0 90px}}

/* 详情页返回按钮（2026-09-14） */
.dt-back{flex:none;border:0;background:transparent;color:var(--c-t3);cursor:pointer;
  padding:2px 4px;border-radius:6px;display:inline-flex;align-items:center;margin-top:1px}
.dt-back:hover{background:var(--c-surface-2);color:var(--c-t1)}

/* ══════════════ 清单行 & 清单弹窗（2026-09-14 老板 4 条）══════════════ */
.pj-li{position:relative}
/* ★ C4：滴答清单行图标位 **20×20**（dx12）⇒ 名称起点 = 12 + 20 + gap6 = **38**；
   我方原来包了 18 宽 ⇒ 名称 dx 36（差 2）*/
.pj-li .pico{flex:none;width:20px;display:inline-flex;align-items:center;justify-content:center;
  font-size:14px;line-height:1}
.pj-li .pico .pkind{color:var(--c-t3);display:inline-flex}
.pj-li .pdot{flex:none;width:8px;height:8px;border-radius:50%;margin-left:6px;
  box-shadow:0 0 0 1px rgba(0,0,0,.06) inset}
/* ── 右侧固定槽位（负责人 2026-09-15：「颜色的位置是不会变的 清单没内容就空着 鼠标放上去颜色依旧不变」）──
   规范 R-07：交互态不得改变元素位置/尺寸。所以：
     · .cnt 给**固定宽度**（数量为空也占位）→ 颜色点在行间也恒定对齐；
     · .pedit 改成**绝对定位叠加**在槽位上（不再 display 切换）→ hover 不推挤任何元素；
     · hover 时只把数量**淡出**（opacity），不动布局。 */
.pj-li .cnt{flex:none;width:26px;text-align:right;margin-left:4px;transition:opacity .12s}
.pj-li .pedit{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:inline-flex;
  align-items:center;justify-content:center;border:0;background:transparent;color:var(--c-t3);
  cursor:pointer;padding:2px 4px;border-radius:6px;min-height:0;opacity:0;pointer-events:none;
  transition:opacity .12s;z-index:1}
.pj-li:hover .pedit{opacity:1;pointer-events:auto}
.pj-li:hover .pedit:hover{background:var(--c-surface-2);color:var(--c-brand)}
.pj-li .pmore{position:absolute;right:30px;top:50%;transform:translateY(-50%);display:inline-flex;
  align-items:center;justify-content:center;border:0;background:transparent;color:var(--c-t3);
  cursor:pointer;padding:2px 4px;border-radius:6px;min-height:0;opacity:0;pointer-events:none;
  transition:opacity .12s;z-index:1;font-size:15px;line-height:1}
.pj-li:hover .pmore{opacity:1;pointer-events:auto}
.pj-li:hover .pmore:hover{background:var(--c-surface-2);color:var(--c-brand)}
.pj-li:hover .cnt{opacity:0}
/* 弹窗图标按钮 + 面板 */
.pj-ico{flex:none;width:30px;height:30px;border:1px solid var(--c-line);border-radius:8px;background:var(--c-surface);
  cursor:pointer;font-size:16px;line-height:1;display:inline-flex;align-items:center;justify-content:center;
  padding:0;min-height:0}
.pj-ico:hover{border-color:var(--c-brand);color:var(--c-brand)}
.pj-ico .pj-ix{color:var(--c-t3);display:inline-flex}
.pj-ipanel{display:none;position:absolute;left:0;top:calc(100% + 6px);z-index:5;width:min(340px,78vw);
  max-height:260px;overflow:auto;background:var(--c-surface);border:1px solid var(--c-line);border-radius:10px;
  box-shadow:0 10px 28px rgba(0,0,0,.14);padding:10px}
.pj-ipanel.on{display:block}
.pj-ihd{display:flex;gap:6px;align-items:center;margin-bottom:8px}
.pj-ihd input{flex:1;min-height:28px;padding:3px 8px;font-size:12.5px}
.pj-irnd{flex:none;border:1px solid var(--c-line);background:var(--c-surface);border-radius:8px;cursor:pointer;
  padding:4px 8px;min-height:28px}
.pj-irnd:hover{border-color:var(--c-brand)}
.pj-igrp{font-size:11.5px;color:var(--c-t3);margin:6px 0 4px}
.pj-igrid{display:flex;flex-wrap:wrap}
.pj-ie{width:30px;height:30px;display:inline-flex;align-items:center;justify-content:center;
  font-size:18px;border-radius:7px;cursor:pointer;margin:1px}
.pj-ie:hover{background:var(--c-surface-2)}
.pj-ie.on{background:var(--c-brand-bg);box-shadow:0 0 0 1px var(--c-brand) inset}
/* 颜色面板：色系分组 */
.pj-cgrp{font-size:11.5px;color:var(--c-t3);margin:8px 0 4px}
.pj-cgrp:first-child{margin-top:0}
.pj-crow{display:flex;flex-wrap:wrap;gap:6px}
.pj-custom{display:inline-flex;align-items:center;justify-content:center;overflow:hidden;
  background:conic-gradient(var(--c-bad),var(--c-warn),#f2e20d,var(--c-ok),#0091ff,#8e4ec6,var(--c-bad))}
.pj-custom input[type=color]{opacity:0;width:100%;height:100%;border:0;padding:0;cursor:pointer}
/* ══ 右侧功能图标栏（2026-09-14）：把「日历 / 正计时」等做成独立于清单的常驻入口 ══ */
#rail{width:52px;flex:none;border-right:1px solid var(--c-line);background:var(--c-surface);
  display:flex;flex-direction:column;align-items:center;gap:4px;padding:12px 0;overflow-y:auto}
.railb{width:38px;height:38px;border:0;background:transparent;border-radius:10px;color:var(--c-t3);
  display:flex;align-items:center;justify-content:center;cursor:pointer;padding:0;flex:none;transition:.15s}
.railb .dti{width:18px;height:18px}
.railb:hover{background:var(--c-surface-2);color:var(--c-t1)}
.railb.on{background:var(--c-brand-bg);color:var(--c-brand)}
.railsp{height:1px;width:24px;background:var(--c-line);margin:6px 0;flex:none}
.li.wsentry{margin:8px 0 3px;position:relative}
.li.wsentry:before{content:'';position:absolute;left:10px;right:10px;top:-6px;height:1px;background:var(--c-line)}
@media(max-width:860px){#rail{display:none}}
@media print{#rail{display:none}}
/* ══ 日期面板 v2（2026-09-14 对齐滴答：农历/节气/节假日+休班、4 快捷图标、底部三行、全天开关）══ */
#schedModal .sch-qbar{display:flex;justify-content:space-between;padding:0 4px 6px}
.sch-qb{position:relative;width:40px;height:40px;border:0;background:transparent;border-radius:11px;
  color:var(--c-t3);cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0}
.sch-qb svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.6;
  stroke-linecap:round;stroke-linejoin:round}
.sch-qb:hover{background:var(--c-surface-2);color:var(--c-brand)}
.sch-qb em{position:absolute;top:-26px;left:50%;transform:translateX(-50%);background:var(--c-t1);color:#fff;
  font-size:11px;font-style:normal;padding:3px 8px;border-radius:6px;white-space:nowrap;opacity:0;
  pointer-events:none;transition:.12s;z-index:3}
.sch-qb:hover em{opacity:1}
html[data-theme=dark] .sch-qb em{background:#3a3f47}
#schedModal .sch-head{font-size:15px;margin-bottom:8px}
#schedModal .sch-head .ym{margin-right:auto;font-weight:700}
.sch-head button.dot{color:var(--c-t3);font-size:13px}
.sch-cal .d{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px;
  min-height:45px;padding:3px 0;position:relative;border-radius:9px}
.sch-cal .d .n{font-size:14px;line-height:1.1}
.sch-cal .d .s{font-size:9.5px;line-height:1;color:var(--c-t3);white-space:nowrap;max-width:100%;overflow:hidden}
.sch-cal .d .s.fes{color:var(--c-bad)}
.sch-cal .d .s.jq{color:var(--c-warn)}
.sch-cal .d .bd{position:absolute;top:1px;right:3px;font-size:9px;font-style:normal;font-weight:700;line-height:1}
.sch-cal .d .bd.x{color:var(--c-ok)}
.sch-cal .d .bd.b{color:var(--c-bad)}
.sch-cal .d.today{border-color:transparent}
.sch-cal .d.today .n{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;box-shadow:inset 0 0 0 1.5px var(--c-brand);color:var(--c-brand);font-weight:700}
.sch-cal .d.on.today{border-color:transparent}
.sch-cal .d.on.today .n{box-shadow:none;background:var(--c-brand);color:#fff}
.sch-cal .d.on{background:transparent;border-color:transparent}
.sch-cal .d.on .n{background:var(--c-brand);color:#fff;border-radius:50%;width:28px;height:28px;
  display:flex;align-items:center;justify-content:center}
.sch-cal .d.on .s{color:var(--c-brand)}
.sch-cal .d.on.today .n{color:#fff}
/* 底部三行（时间 / 提醒 / 重复） */
.sch-rows{margin-top:8px;border-top:1px solid var(--c-line)}
.sch-row{display:flex;align-items:center;gap:8px;padding:8px 2px;cursor:pointer;
  border-bottom:1px solid var(--c-line-2);color:var(--c-t3)}
.sch-row:hover{color:var(--c-t1)}
.sch-row .t{font-size:13.5px;color:var(--c-t1);flex:none}
.sch-row .v{margin-left:auto;font-size:12.5px;color:var(--c-t3)}
.sch-row .arw{color:var(--c-t3);font-size:14px}
/* 时间段页：开始/结束（日期+时间）、全天开关 */
.sch-trow{display:flex;gap:8px;align-items:center;margin-bottom:10px}
.sch-trow label{font-size:13px;color:var(--c-t2);width:40px;flex:none}
.sch-trow .sp{flex:1}
#schedModal .sch-trow input[type=date]{flex:0 0 114px;border:1px solid var(--c-line);border-radius:8px;
  padding:8px 6px;font-size:13px;background:var(--c-surface);color:var(--c-t1);font-family:inherit}
#schedModal .sch-trow input[type=time]{flex:1;border:1px solid var(--c-line);border-radius:8px;
  padding:8px 10px;font-size:13.5px;background:var(--c-surface);color:var(--c-t1);font-family:inherit}
.sch-trow input:disabled{opacity:.45}
.sch-sw{width:42px;height:23px;border:0;border-radius:12px;background:var(--c-line-2);cursor:pointer;
  padding:0;position:relative;transition:.15s;flex:none}
.sch-sw i{position:absolute;top:2px;left:2px;width:19px;height:19px;border-radius:50%;background:#fff;
  box-shadow:0 1px 3px rgba(0,0,0,.25);transition:.15s}
.sch-sw.on{background:var(--c-brand)}
.sch-sw.on i{left:21px}

/* ══ 编辑清单弹窗 v2（2026-09-14 像素级对齐滴答）══ */
.pj-modal{width:min(741px,94vw);padding:20px 22px}
.pj-modal h3{text-align:center;font-size:16px;margin-bottom:18px}
.pj-body{display:flex;gap:20px;min-height:436px}   /* 撑高：让色系浮层完整落在弹窗内（滴答的弹窗也是高的） */
.pj-form{flex:1;min-width:0}
.pj-prev{width:280px;flex:none}
/* ★★ 图标面板的包含块 —— 原来漏了 position:relative，面板的包含块变成 .mask(fixed)，
      top:calc(100%+6px) 把它推到屏幕外 → 点图标「没反应」（负责人：编辑图标那个功能是坏的） */
.pj-name{position:relative}
.pj-row{align-items:center;margin-bottom:12px}
.pj-row>label{width:112px;flex:none;padding-top:0;font-size:12.5px;color:var(--c-t2);white-space:nowrap}
/* 颜色：固定一行 8 个（无颜色 + 6 色 + 彩色） */
.pj-cwrap{position:relative}
.pj-colors{display:flex;gap:10px;align-items:center;flex-wrap:nowrap;padding:0}
.pj-c{width:22px;height:22px;border-radius:50%;cursor:pointer;flex:none;position:relative;
  border:2px solid transparent;box-shadow:0 0 0 1px rgba(0,0,0,.07) inset;transition:transform .12s}
.pj-c:hover{transform:scale(1.14)}
.pj-c.on{box-shadow:0 0 0 2px var(--c-surface),0 0 0 3.5px var(--c-brand)}
.pj-cnone{background:transparent!important;box-shadow:none;border:1.6px solid var(--c-t3)}
.pj-cnone::after{content:'';position:absolute;left:-1px;right:-1px;top:50%;height:1.6px;
  background:var(--c-t3);transform:rotate(-45deg);border-radius:2px}
.pj-ccolor{background:conic-gradient(var(--c-bad),var(--c-warn),#f2e20d,var(--c-ok),#0091ff,#8e4ec6,var(--c-bad));
  display:flex;align-items:center;justify-content:center}
.pj-ccolor i{position:absolute;inset:5px;border-radius:50%;box-shadow:0 0 0 1.5px #fff}
/* 色系浮层（**点「彩色」才出现**） */
.pj-cpanel{display:none;position:absolute;left:0;top:calc(100% + 8px);z-index:6;width:264px;
  background:var(--c-surface);border:1px solid var(--c-line);border-radius:12px;
  box-shadow:0 12px 30px rgba(0,0,0,.16);padding:12px 14px}
.pj-cpanel.on{display:block}
.pj-cpanel .pj-cgrp{font-size:11.5px;color:var(--c-t3);margin:8px 0 4px}
.pj-cpanel .pj-cgrp:first-child{margin-top:0}
.pj-cpanel .pj-crow{display:flex;gap:8px;flex-wrap:wrap}
.pj-cpanel .pj-crow .pj-c{width:20px;height:20px}
.pj-custom{display:inline-flex;align-items:center;justify-content:center;overflow:hidden;position:relative;
  background:var(--c-surface-2);box-shadow:0 0 0 1px var(--c-line) inset}
.pj-custom::before{content:'+';color:var(--c-t3);font-size:14px;line-height:1}
.pj-custom input[type=color]{opacity:0;position:absolute;inset:0;width:100%;height:100%;border:0;padding:0;cursor:pointer}
/* 右侧预览（随颜色/图标/名称实时变化） */
.pj-prev{border-radius:14px;display:flex;align-items:center;justify-content:center;
  transition:background .18s;overflow:hidden}
.pj-pv{width:100%;height:100%;display:flex;align-items:center;justify-content:center;transition:background .18s}
.pj-pvc{width:80%;background:var(--c-surface);border-radius:10px;box-shadow:0 2px 12px rgba(0,0,0,.08);padding:14px}
.pj-pvh{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-size:13px;font-weight:600;
  color:var(--c-t1);overflow:hidden}
.pj-pvi{font-size:14px;line-height:1;flex:none}
.pj-pvd{color:var(--c-t3);display:inline-flex}
.pj-pvn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pj-pvb{display:flex;flex-direction:column;gap:8px}
.pj-pvr{display:flex;align-items:center;gap:8px}
.pj-pvs{width:11px;height:11px;border-radius:3px;flex:none;opacity:.9}
.pj-pvl{height:6px;border-radius:3px;background:var(--c-line-2)}
.pj-pvr-r{height:6px;border-radius:3px;background:var(--c-line-2);margin-left:auto}
/* 底栏：保存（主色）在左、取消在右 —— 对齐滴答 */
.pj-foot{display:flex;gap:10px;justify-content:flex-end;margin-top:20px}
.pj-foot .btn{padding:8px 22px}
@media(max-width:800px){.pj-prev{display:none}.pj-modal{width:min(560px,94vw)}}
html[data-theme=dark] .pj-pv .pj-pvc{box-shadow:0 2px 12px rgba(0,0,0,.4)}
/* ══ 重复页（2026-09-14 对齐滴答：8 固定推荐 + 自定义；自定义含三种模式）══ */
/* ★★ 滴答 6466 逐像素实测（换算到本弹层 260px 宽，误差 <2%）：
   卡片 inset 16 / 宽 228 / radius 8 / 外框 --c-line(=#E8EAED) / 内分隔 --c-line-2(=#EEF0F3) /
   条目高 48 / 内边距 14 /「自定义」是**第二个独立卡片**，与上卡相隔 9px。
   （卡片自带白底 + 阴影 = 浮层的「独立菜单」观感，下面内容不会透出来） */
.sch-rlist{border:1px solid var(--c-line);border-radius:8px;overflow:hidden;
  background:var(--c-surface)}
.sch-rlist-sep{margin-top:9px}
.sch-ropt{display:flex;align-items:center;gap:8px;height:48px;padding:0 14px;font-size:14px;cursor:pointer;
  border-bottom:1px solid var(--c-line-2);color:var(--c-t1);box-sizing:border-box}
.sch-ropt:last-child{border-bottom:0}
.sch-ropt:hover{background:var(--c-surface-2)}
.sch-ropt.on{color:var(--c-brand);font-weight:600}
.sch-ropt .t{flex:1}
.sch-ropt .dim{color:var(--c-t3);font-size:12px;margin-left:4px;font-weight:400}
/* ★ 2026-11-02 对齐滴答：重复建议行里的日期部分用品牌色高亮 */
.sch-ropt .hl{color:var(--c-brand);font-style:normal}
.sch-ropt .arw{color:var(--c-t3);font-size:14px}
.sch-ropt .chk{width:17px;height:17px;flex:none;border:1.5px solid var(--c-t3);border-radius:5px;
  position:relative;font-size:0;line-height:0}
.sch-ropt .chk::after{content:'';position:absolute;left:4.5px;top:1px;width:5px;height:10px;
  border:solid var(--c-brand);border-width:0 2px 2px 0;transform:rotate(45deg)}
.sch-subhd{display:flex;align-items:center;gap:6px;font-size:13.5px;font-weight:600;margin-bottom:8px;color:var(--c-t1)}
.sch-subhd .bk{cursor:pointer;color:var(--c-t3);font-size:20px;line-height:1;padding:0 6px 2px 2px}
.sch-crow{display:flex;align-items:center;gap:8px;margin-bottom:12px}
.sch-crow label{font-size:13px;color:var(--c-t2);width:64px;flex:none}
.sch-every{font-size:13px;color:var(--c-t2);flex:none}
.sch-num{width:62px;border:1px solid var(--c-line);border-radius:8px;padding:8px 8px;font-size:13.5px;
  background:var(--c-surface);color:var(--c-t1);text-align:center;font-family:inherit}
.sch-sel{flex:1;min-width:0;border:1px solid var(--c-line);border-radius:9px;padding:8px 12px;font-size:13.5px;
  background:var(--c-surface);color:var(--c-t1);font-family:inherit;outline:none}
.sch-wds{display:flex;gap:6px;justify-content:space-between;margin:2px 0 14px}
.sch-wd{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;
  font-size:13px;cursor:pointer;color:var(--c-t2);flex:none}
.sch-wd:hover{background:var(--c-surface-2)}
.sch-wd.on{background:var(--c-brand);color:#fff;font-weight:600}
.sch-ckbox{display:flex;align-items:center;gap:8px;font-size:13.5px;cursor:pointer;color:var(--c-t1);margin-bottom:2px}
.sch-ckbox .bx{width:17px;height:17px;border-radius:5px;border:1.6px solid var(--c-t3);flex:none;position:relative}
.sch-ckbox .bx.on{background:var(--c-brand);border-color:var(--c-brand)}
.sch-ckbox .bx.on::after{content:'';position:absolute;left:5px;top:1.5px;width:5px;height:10px;
  border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
.sch-quick button.ok{background:var(--c-brand);color:#fff;border-color:var(--c-brand)}
.sch-dtcount{font-size:12.5px;color:var(--c-t3);flex:1}
/* 自选重复的多选日历：选中态用 .sel（与日期页的 .on 区分开） */
.sch-cal .d.sel{background:var(--c-brand-bg)}
.sch-cal .d.sel .n{background:var(--c-brand);color:#fff;border-radius:50%;width:28px;height:28px;
  display:flex;align-items:center;justify-content:center}
.sch-cal .d.sel .s{color:var(--c-brand)}
/* 提醒推送状态条（2026-09-14） */
.sch-rembar{display:flex;align-items:center;gap:8px;font-size:12.5px;line-height:1.5;color:var(--c-t2);
  background:var(--c-surface-2);border:1px solid var(--c-line);border-radius:9px;padding:8px 12px;
  margin-bottom:10px;color:var(--c-t2)}
.sch-rembar .dti{color:var(--c-brand);flex:none}
.sch-rembar b{color:var(--c-t1)}
.sch-rembar.off{background:transparent;border-style:dashed}
.sch-rembar.off .dti{color:var(--c-t3)}

/* ══ R-06 键盘焦点可见（WCAG 2.4.7）—— 只对键盘生效，鼠标点击不出现描边 ══ */
:focus{outline:none}
:focus-visible{outline:1px auto rgb(71,114,250);outline-offset:-1px}
.li:focus-visible,.task:focus-visible,.sch-opt:focus-visible,.sch-ropt:focus-visible{
  outline:2px solid var(--c-brand);outline-offset:-2px}

/* ══ 看板（按清单内分组）2026-09-15 ══ */
#board .col h4{display:flex;align-items:center;gap:8px}
#board .col h4 .cn{font-weight:600;color:var(--c-t2)}
#board .col h4 .cc{font-size:12px;color:var(--c-t3)}
#board .col h4 .cmenu{cursor:pointer;color:var(--c-t3);padding:0 4px;border-radius:5px;line-height:1}
#board .col h4 .cmenu:hover{background:var(--c-surface-2);color:var(--c-brand)}
/* ══ 2026-09-19 C3：看板对齐滴答 kanban（真机：_dida_board.js / _dida_board2.js）══
   滴答真值：容器 .column-list-inner pad 「0 12px 12px」· 列 **282** 宽 · 列间距 **0**（相邻紧贴）
   · 列自身**透明 + 圆角 0**（白卡感来自卡片本身）· 列头 **h40**（名称 fs14/**600** 主色 · 计数 fs12/**40% 灰**且**紧贴标题** · 右端常显 ＋18×18）
     ★ 2026-09-22 第 50 轮**更正口径**：旧记「fs14/400 + 计数品牌蓝」= 测错了层／认错了元素 ——
       那个 24×18 品牌蓝是**「顺延」链接**（仅「已过期」列的条件性控件），计数真值是 40% 灰；
       标题字重真值 = 600。真机解剖见 `_regress_logs/_dida_colheader5.out`（4 列一致）。
   · 卡片 **258** 宽（= 列宽 − 12×2）· **白底 br10** · **无阴影** */
#board{gap:0;padding:0 12px 12px}
#board .col{width:282px;background:transparent;border-radius:0;padding:0 12px}
#board .col h4{height:40px;padding:0;gap:6px;font-size:14px;font-weight:400;color:var(--c-t1)}
#board .col h4 .cn{font-weight:600;color:var(--c-t1);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* ★ 2026-09-22 r50：**删掉**此处的计数覆盖（原写死 #4772FA 品牌蓝）——那是把滴答「顺延」
   (24x18 蓝链接，仅「已过期」列) 误认成计数。计数配色由上方旧块 `#board .col h4 .cc{color:var(--c-t3)}`
   定义 = rgba(25,25,25,.4)，正是滴答 P.text-grey-40 的真值。回退：把本注释换回那行规则即可。 */
#board .col h4 .cmenu{margin-left:auto;color:var(--c-t2)}
#board .cards{padding:0 0 8px}
#board .card{border-radius:10px;box-shadow:0 2px 3px rgba(25,25,25,.03)}
/* 2026-09-22 第 49 轮：卡片 hover = 滴答「4% 黑叠白」（滴答内层 .l-task-bg 层1 的 hover 真值，
   层0 恒白不动 ⇒ 合成色 rgb(246,246,246)）。保留白底、只叠加，禁用 background 直接覆盖。
   滴答侧无 transition（duration 0s）⇒ 此处也不加过渡。回退：删掉本规则即可。 */
#board .card:hover{background-image:linear-gradient(rgba(25,25,25,.04),rgba(25,25,25,.04))}
/* ══ 2026-09-22 第 51 轮（待办池 ⑬「看板·列内＋入口形态」）════════════════════════════
   滴答真机（`_regress_logs/_dida_coladd1.out` / `_dida_coladd2.out` / `_dida_coladd3.out`，
   4 列 × 常态/hover/移开 三态一致）：
   · 列底**没有**添加行（末个 li.task 之后 afterCount=0）⇒ 删掉旧的全宽虚线条 `.bnew`
   · 添加入口 = 列头 `tl-bar`（`pl-[8px] pr-[12px]`）**右端常显** `A.column-quick-add-trigger`
     `w-[18px] h-[18px] flex-none ml-[8px]` · 常态 op=1 · `title="新任务"` · 自身色 = 品牌蓝 rgb(71,114,250)
   · 其内 `svg.icon-add` **18×18** `text-grey-60` = rgba(25,25,25,.6)（`use` 字形盒 13.5×13.5）
   · 常态**无底色**；hover 才显现 **28×28** `bg_LSNT6 rounded-hover-bg`
     （inline `inset:-5px` · **br 8px** · bg rgba(25,25,25,.05)）—— hover 差分**唯一 1 条** = 该底盒 opacity 0→1
   ⇒ 锚点：＋ 右缘 = 列右 − 12（与卡片左缘同口径）；`#board .col` 的 `padding:0 12px` 天然满足。
   ★ 已知微差（不追）：＋ 字形是用本应用描边版 `ICON.plus`（20 viewBox），滴答是填充 sprite；
     实测滴答 `use` 盒 13.5×13.5 是**符号视口**而非墨迹（同族跨层坑第 3 次），故不按它断言。
   回退：删本块并恢复上面旧 `.bnew` 三行（见 `index.html.bak_r51_*`）。 */
/* ★★ R328 修正 fb#34：`.badd`（＋添加任务）从列头内移到**分组卡片下方**（底部），对齐滴答。 */
#board .col .badd{margin:8px 0 0 4px;flex:none;width:18px;height:18px;position:relative;z-index:1;
  display:inline-flex;align-items:center;justify-content:center;cursor:pointer;color:var(--c-brand)}
#board .col .badd .dti{width:18px;height:18px;position:relative;z-index:1;color:rgba(25,25,25,.6)}
#board .col .badd::before{content:'';position:absolute;left:-5px;top:-5px;width:28px;height:28px;
  border-radius:8px;background:rgba(25,25,25,.05);opacity:0;z-index:0}
#board .col .badd:hover::before{opacity:1}
/* R158(fb#38/#117): kanban column drag-to-reorder - column header draggable */
#board .col.gcol h4{cursor:grab}
#board .col.gcol h4:active{cursor:grabbing}
/* ★★ fb#34 全改：列内新建 = **「无标题」任务行**（对齐滴答：圆形勾选框 + 浅灰圆角底 + 灰字占位）*/
#board .bnew{display:flex;align-items:center;gap:8px;width:100%;margin:0 0 8px;padding:8px 10px;
  border-radius:8px;background:var(--c-surface-2)}
#board .bnewchk{flex:0 0 17px;width:17px;height:17px;border:1.5px solid var(--c-line-2);border-radius:50%}
#board .bnewin{flex:1;min-width:0;border:0;outline:0;background:transparent;font-size:13px;
  color:var(--c-t1);font-family:inherit}
#board .bnewin::placeholder{color:var(--c-t3)}
/* 旧裸输入框样式保留（仅回退用，逻辑已不再产出）*/
#board .binput{width:100%;margin:0 0 8px;padding:8px 10px;border-radius:8px;font-size:13px;
  border:1px solid var(--c-brand);background:var(--c-surface);color:var(--c-t1);font-family:inherit;outline:none}
#board .card.done{opacity:.55}
#board .addcol{width:150px;background:transparent;border:1px dashed var(--c-line);align-items:center;justify-content:flex-start;padding-top:6px}
#board .addcol .addg{width:100%;border:0;background:transparent;color:var(--c-brand);font-size:13px;
  padding:10px;cursor:pointer;font-family:inherit}
#board .addcol .addg:hover{background:var(--c-surface-2);border-radius:8px}
/* ══ 2026-09-22 第 53 轮（看板跨列拖拽 · 落点高亮对齐滴答 `.hover-mask`）════════════════
   滴答真机（`_regress_logs/_dida_bdrag1.out` / `_dida_bdrag2.out` / `_dida_bdrag3.out`）：
   · 每列**常驻**一个 `.hover-mask hidden absolute inset-0`（常态 `display:none`）；
     拖到其上 ⇒ `display:block`，计算样式 = **1px solid rgb(71,114,250)** 边框
     + **rgba(71,114,250,0.03)** 底 + **border-radius 12px**（dark 模式底为 5%）。
   · 列自身样式**不变**（`列样式差分=[]`）⇒ 高亮是独立覆盖层，不是改列底色。
   · 拖拽幽灵（滴答 258×62 · z1053 · 白卡+阴影）是**浏览器/滴搭自绘浮层**，不在 DOM 布局流内
     ⇒ 套件不可观测 ⇒ 记账不追（我方沿用原生 HTML5 DnD）。
   · 零净变更已核：Esc 取消后列卡数 18/1/18/18、总卡 55 与基线**完全一致**（`_dida_bdrag2.out`）。
   ★ 用 `inset` 环（而非真 `border`）⇒ **不挤占布局**：列宽恒 282（B78 连同几何一起断）。
   回退：删本块，并把上方旧 `.col.over` 注释换回 `#board .col.over{outline:2px dashed var(--c-brand)}`。 */
#board .col.over{box-shadow:inset 0 0 0 1px rgb(71,114,250);background:rgba(71,114,250,.03);border-radius:12px}

/* ══ 2026-09-22 第 54 轮（待办池 ⑯：看板卡片内构成对齐滴答）════════════════════════════
   滴答真机 `_regress_logs/_dida_card1.out`（55 卡 / 4 列取样，收尾 `✅还原=true`）：
   · 卡内容盒 **258x62** = 首行 `DIV.t-inner` **258x40** + 次行 `DIV.tips` **258x22**（上下紧贴）
   · **勾选框**：`SPAN.t-check` absolute（卡内 `left:16 / top:0 / bottom:0`，宽 17）⇒ 内 `SPAN.checker`
     **17x17** 垂直居中（dy=12=(40−17)/2）；`svg.icon-checkbox` 着色 = **优先级**
     （high `rgb(225,62,57)` / medium `rgb(250,168,12)` / 无 `rgba(25,25,25,.4)`）—— **55/55 卡必有**
   · **标题**：左缘 **41**（=16+17+8）· 盒宽 **200**（右缘 = 卡右 − 17 = 12+5）· fs14 · fw400 · `rgb(25,25,25)`
   · **次行**：左缘同为 **41** · fs12 · 项间距 4；日期 **过期=红 `rgb(224,49,49)` / 未过期（含未来）=蓝 `rgb(71,114,250)`**；
     图标位 14x14（墨迹 11x11）· 清单 = **8x8 圆点（清单色，无色则不出）+ 清单名 fs12 40% 灰**
   ★ 卡高恒 62 = 40 + 22：次行**恒定渲染**（滴答 55/55 卡次行均非空）。
   ★ 卡本体还要 `border:0` —— 共享设计层 `/ui/shuobang-ui.css` 的 `.card{border:1px solid var(--c-line)}`
     会渗进来（`#board .card` 只覆盖了背景/圆角/阴影，没覆盖 border），实测给内容盒多加 2px
     （`_regress_logs/_r54_diag.out`：`.card` 计算 `padding:8px 10px` 之外还有 1px 边框 ⇒ 卡高 80）。
     滴答内层 `.l-task-bg` **无边框** ⇒ 在此显式清零，内容盒才是 258x62。
   ★ 勾选框直接复用**列表行同一套** `.chk`（只在本页作用域里改定位），⇔ 列表行 x34/17px 那条对齐**不受影响**。
   回退：删本块 + 把 `renderBoard/boardByStatus` 的 `boardCard(t)` 换回旧的 `pr/title/m` 两行
         （备份 index.html.bak_r54_* ，另有 `_be_r54.py` 记录全部锚点）。*/
#board .card{display:flex;flex-direction:column;padding:0;border:0}
#board .card .cin{height:40px;position:relative;display:flex;align-items:center;padding:0 17px 0 41px}
#board .card .ckw{position:absolute;left:16px;top:0;bottom:0;width:17px;display:flex;align-items:center;justify-content:center}
#board .card .ckw .chk{margin-top:0;align-self:center}
/* ★★ R630（2026-11-09）：看板卡勾选热区 —— 热区规则原本只写在 `#tasks .task .chk::after`（本文件 877 行），
   看板卡 .chk 挂在 #board 下 ⇒ 一条都不命中 ⇒ 可点区只有 17×17，点偏 3px 就落到 .ckw/card
   ⇒ 触发 openTask（「想勾选」变成「打开详情」，实测命中链：dy±10 全落 span.ckw）。
   做法：.chk 保持 static ⇒ ::after 的包含块落到 `.ckw`（absolute + top:0/bottom:0 = 首行 40）
   ⇒ top:0/bottom:0 直接铺满首行，不吃小数（首版 -11.5/-11.5 被取整成 38，实测 vSpan -19..+18）。
   横向 -16 到卡片内容盒左缘、-8 到标题前 8px 沟（标题起于卡左+41），不侵占文字。
   回退：删本行 + 上一条。*/
#board .card .ckw .chk::after{content:'';position:absolute;left:-16px;right:-8px;top:0;bottom:0}
#board .card .ti{flex:1 1 auto;min-width:0;font-size:14px;line-height:20px;color:var(--c-t1);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#board .card .tp{height:22px;display:flex;align-items:center;gap:4px;padding:0 12px 0 41px;font-size:12px;
  color:rgba(25,25,25,.4);overflow:hidden}
#board .card .tp .du{flex:none;font-size:12px;line-height:18px;white-space:nowrap}
#board .card .tp .tpi{width:14px;height:14px;flex:none;display:flex;align-items:center;justify-content:center;
  color:rgba(25,25,25,.4)}
#board .card .tp .tpi .dti{width:14px;height:14px}
#board .card .tp .pj{display:flex;align-items:center;gap:4px;min-width:0;color:rgba(25,25,25,.4)}
#board .card .tp .pj i{width:8px;height:8px;border-radius:9999px;flex:none;display:block}
#board .card .tp .pj b{font-weight:400;font-size:12px;line-height:18px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
#board .card .tp .tag{flex:none;color:var(--c-t2)}
/* ★ r54：卡片优先级改由「勾选框边框色」表达（滴答也没有 `.pr` 色点）——
   原「已完成态给优先色点加灰度」那条规则随 `.pr` 一起作废、已在本块内删除；
   已完成态由 `.chk.on` 自带滴答 `#completed` 灰 glyph 表达（与列表行同一套）。 */


/* ══ 时间线（清单 × 日期）2026-09-15 ══ */
#tl{display:none;flex:1;overflow:auto;padding:10px 14px}
.tlbar{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.tlbtn{border:1px solid var(--c-line);background:var(--c-surface);color:var(--c-t2);border-radius:8px;
  padding:4px 10px;font-size:13px;cursor:pointer;font-family:inherit}
.tlbtn:hover{border-color:var(--c-brand);color:var(--c-brand)}
.tlbtn.tltoday{padding:4px 14px}
.tlrange{font-size:13.5px;font-weight:600;color:var(--c-t1);min-width:150px}
.tlsel{border:1px solid var(--c-line);background:var(--c-surface);color:var(--c-t1);border-radius:8px;
  padding:4px 8px;font-size:13px;font-family:inherit;outline:none}
.tlwrap{overflow:auto;border:1px solid var(--c-line);border-radius:10px}
.tltable{border-collapse:separate;border-spacing:0;font-size:12.5px}
.tltable th,.tltable td{border-right:1px solid var(--c-line-2);border-bottom:1px solid var(--c-line-2)}
.tltable thead th{position:sticky;top:0;background:var(--c-surface);z-index:2;padding:6px 0;width:96px;min-width:96px}
.tltable thead th.today{background:var(--c-brand-bg)}
.tltable thead th .d{display:block;font-size:13px;font-weight:600;color:var(--c-t1)}
.tltable thead th .w{display:block;font-size:11px;color:var(--c-t3)}
.tlcorner{position:sticky;left:0;z-index:3;background:var(--c-surface);padding:6px 10px;text-align:left;
  font-size:12px;color:var(--c-t3);min-width:110px}
.tlname{position:sticky;left:0;z-index:1;background:var(--c-surface);padding:8px 10px;font-weight:600;
  color:var(--c-t1);white-space:nowrap;max-width:130px;overflow:hidden;text-overflow:ellipsis}
.tlcell{padding:4px;vertical-align:top;min-height:44px;background:var(--c-surface)}
.tlcell.today{background:var(--c-brand-bg)}
.tlnew{color:var(--c-t3);cursor:pointer;text-align:center;border-radius:6px;padding:1px 0;font-size:13px}
.tlnew:hover{background:var(--c-surface-2);color:var(--c-brand)}
.tlinput{width:100%;box-sizing:border-box;border:1px solid var(--c-brand);border-radius:6px;padding:3px 4px;
  font-size:12px;background:var(--c-surface);color:var(--c-t1);font-family:inherit;outline:none}
.tltask{display:flex;align-items:center;gap:4px;background:var(--c-surface-2);border-radius:6px;padding:3px 6px;
  margin-top:3px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--c-t1)}
.tltask:hover{background:var(--c-brand-bg);color:var(--c-brand)}
.tltask.done{opacity:.5;text-decoration:line-through}
.tltask .d2{width:6px;height:6px;border-radius:50%;flex:none;background:var(--c-t3)}
.tlmore{font-size:11px;color:var(--c-t3);padding:2px 4px}
/* ══════════════════════════════════════════════════════════════════════
   P38 · 专注页 (#focus) + 习惯打卡页 (#habit)
   结构来源：滴答真机实测（shot_p38_focus.webp / shot_nav_habit.webp）
   ══════════════════════════════════════════════════════════════════════ */
/* habit 是「占位容器」（与 list/board/cal 同级，用 .on 切换显示）；
   focus 是「全屏弹层」（position:fixed，用 .hide 切换）——两者机制不同，别混。*/
#habit{display:none;flex-direction:column;flex:1;min-width:0;min-height:0;overflow:auto;padding:15px 20px 15px 20px;max-width:1094px;margin:0 auto}
#habit.on{display:flex;position:relative}

/* ── 专注页（全屏弹层，见上方 #focus{position:fixed...}）── */
#focus.on{display:flex}
#focus .fz{display:flex;height:100%}
/* 左主区 */
/* 习惯页按钮（沿用专注页图标按钮观感）*/
#habit .hb-ic{display:inline-flex;align-items:center;justify-content:center;gap:2px;height:30px;min-width:30px;min-height:0;
 padding:0;border:0;border-radius:8px;background:transparent;color:var(--c-t2);font-size:12px;cursor:pointer}
#habit .hb-ic:hover{background:color-mix(in srgb,var(--c-t1) 5%,transparent);color:var(--c-t1)}   /* ★ 2026-09-24 r81：盒 26×34→30×30/br8（= 滴答悬停盒 30×30/br8；min-height:0 修掉全局 min-height=34 压高，同族坑第 3 次）· 悬停底对齐滴答 bg-grey-5 */
#habit .hb-hd{display:flex;align-items:center;justify-content:space-between;
  height:34px;margin-bottom:4px;flex:none}
#habit .hb-title{font-size:16px;font-weight:600;color:var(--c-t1);
  display:flex;align-items:center;gap:2px}
#habit .hb-acts{display:flex;align-items:center;gap:2px}
#habit .hb-range{font-size:12px;font-weight:400;color:var(--c-t3);margin-left:7px}
/* 日期条：7 列 */
#habit .hb-days{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:0;flex:none}
/* ★ 2026-09-24 r82：日期格对齐滴答（_dida_hab4.js 实测）—— 格 64x84/br8（悬停底 3%）·
   星期字 11px/lh17 · 日期字 12px/700/lh15（pad 2px 0 4px）· 两字默认 60% 悬停转 100% · 圆环 24×24 */
#habit .hb-day{display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:0;width:64px;height:84px;padding:10px 0 12px;border-radius:8px;justify-self:center}
#habit .hb-day:hover{background:color-mix(in srgb,var(--c-t1) 3%,transparent)}
#habit .hb-dw{font-size:11px;line-height:17px;color:color-mix(in srgb,var(--c-t1) 60%,transparent)}
#habit .hb-dn{font-size:12px;font-weight:700;line-height:15px;padding:2px 0 4px;
  color:color-mix(in srgb,var(--c-t1) 60%,transparent);font-variant-numeric:tabular-nums}
#habit .hb-dot{width:24px;height:24px;border-radius:50%;border:1.5px solid var(--c-line)}
#habit .hb-day.today .hb-dw{color:var(--c-brand)}
#habit .hb-day.today .hb-dn{color:var(--c-brand)}
#habit .hb-day:not(.today):hover .hb-dw,
#habit .hb-day:not(.today):hover .hb-dn{color:var(--c-t1)}
#habit .hb-day.today .hb-dot{border-color:var(--c-brand)}
/* 习惯行 */
#habit .hb-row{display:grid;grid-template-columns:1fr repeat(7,1fr);gap:0;
  align-items:center;padding:9px 0;border-bottom:1px solid var(--c-line)}
#habit .hb-name{font-size:14px;color:var(--c-t1);display:flex;align-items:center;gap:7px;
  min-width:0;cursor:pointer}
#habit .hb-name span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#habit .hb-emoji{font-size:16px;flex:none;width:20px;text-align:center}
#habit .hb-cell{display:flex;align-items:center;justify-content:center}
#habit .hb-ck{width:24px;height:24px;border-radius:50%;border:1.5px solid transparent;  /* r302·㊺ 对齐滴答：未勾态无可见环（滴答父格 borderWidth:0/borderStyle:none） */
  background:transparent;cursor:pointer;padding:0;display:flex;align-items:center;
  justify-content:center;color:transparent;transition:background .12s,border-color .12s}
#habit .hb-ck:not(.on):not(.future)::before{content:"";width:13px;height:13px;  /* r302·㊺ 极淡「待打卡」ghost，对齐滴答 check_needless rgba(25,25,25,.05) */
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath d='M4.6 10.4l3.4 3.4 7.4-7.4' fill='none' stroke='%23191919' stroke-opacity='0.06' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/contain no-repeat}
#habit .hb-ck:hover{border-color:var(--c-brand)}
#habit .hb-ck.on{background:var(--c-brand);border-color:var(--c-brand);color:#fff}
/* ★ QI-1457：未来重复周期虚拟条目（虚线 + 淡色）*/
#cal .ev.fut{border:1px dashed currentColor;opacity:.85;border-radius:4px}
#cal .ev.fut .evt{opacity:.9}
#cal .arow.fut{opacity:.6;font-style:italic}
#habit .hb-ck.future{border-style:dashed;border-color:var(--c-line);cursor:not-allowed;opacity:.45}  /* 保留虚线环（未来日不可打卡） */
#habit .hb-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;
  position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);height:211px;text-align:center;pointer-events:none}
#habit .hb-empty .hbe-t{font-size:15px;color:var(--c-t1);margin:14px 0 4px}
#habit .hb-empty .hbe-s{font-size:12.5px;color:var(--c-t3)}
#habit .hb-empty .hbe-ill{width:132px;height:104px}
#habit .hb-streak{font-size:11.5px;color:var(--c-t3);margin-left:2px;flex:none}
#habit .hb-rowmenu{position:fixed;z-index:60}

/* ══ 键盘快捷键帮助面板（2026-09-21 第 32 轮：对齐滴答官方「快捷键」面板）
   滴答真机（按 ? 打开 · `_dida_keys2.js` / `_dida_keys3.js`）：
     面板 **440×928** @ right36 / top36（视口 1759×1000）· br **12px** · 白底 · 无边框
     · box-shadow **0 5px 18px rgba(0,0,0,.2)** · 头 h **57** / pad `0 20px` · 标题 fs **18** fw **500** lh25
     · 内容 pad `0 20px` · 组标题 fs **15** fw **500** lh22（组标题 → 首条间距 **18**）
     · 条目 h **40** / pad `0 18px`（左文本 fs14 flex:1 · 右键位列 **min-width 89** 右对齐 fs14）
     · **键位无底衬** —— 不是 kbd 胶囊，就是普通文字（与「滴答菜单无 kbd 节点」一致）
   ★ 只列「我方已实现」的项（宁缺勿假）：滴答的 保存/同步/撤销/重做/开始专注/指令菜单/日历视图键
     在我方**没有对应能力**或能力本身未做（日历周·日视图 = 待办池⑥）⇒ 不进面板、也不绑键。 */
#kbdCover{position:fixed;left:0;right:0;top:0;bottom:0;z-index:67;display:none;background:transparent}
#kbdCover.on{display:block}
#kbdHelp{position:fixed;left:auto;right:36px;top:36px;bottom:36px;width:440px;z-index:68;
  background:var(--c-surface);border-radius:12px;box-shadow:0 5px 18px rgba(0,0,0,.2);
  display:none;flex-direction:column;overflow:hidden}
#kbdHelp.on{display:flex}
#kbdHelp .kb-h{height:57px;flex:none;padding:0 20px;display:flex;align-items:center}
#kbdHelp .kb-h h3{margin:0;font-size:18px;font-weight:500;line-height:25px;color:var(--c-t1)}
#kbdHelp .kb-b{flex:1;min-height:0;overflow-y:auto;padding:0 20px}
#kbdHelp .kb-g{margin:0 0 18px}
#kbdHelp .kb-g h4{margin:0 0 18px;font-size:15px;font-weight:500;line-height:22px;color:var(--c-t1)}
#kbdHelp .kb-i{height:40px;padding:0 18px;display:flex;align-items:center;gap:8px}
#kbdHelp .kb-i .kt{flex:1;min-width:0;font-size:14px;line-height:18px;color:var(--c-t1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#kbdHelp .kb-i .kk{flex:none;min-width:89px;text-align:right;font-size:14px;line-height:18px;color:var(--c-t1);white-space:nowrap}

/* #344 A-2：习惯目标进度 chip（weekly/custom 达标可视化） */
.hb-prog{font-size:12px;line-height:16px;color:var(--c-t3);margin-left:6px;white-space:nowrap}
.hb-prog.met{color:var(--c-ok);font-weight:600}


/* ★★ 根因：描述容器 flex:1 1 0% 会把剩余高度全吃掉 ⇒ 检查项被顶到底部（滴答是紧贴描述）
   ★ 2026-11-03 再修：只把 grow 归零还不够 —— shrink:1 会让长描述被压到 605px 而内容 757px，
   溢出部分直接盖在 `#secChecks` 上（实测重叠 219px）。必须 grow 和 shrink 都为 0，
   让描述按内容自然撑开，滚动交给 `.dt-main`（滴答就是 `.body` 统一滚动）。 */
#detail #dtDescWrap{flex:0 0 auto!important}
/* ★ 2026-11-02 「显示详细」开关对齐滴答（实测：默认 40px；开启后 62px，标题+描述各一行）
   我们的行原来是固定 66px（标题2行+摘要2行），改为跟随开关：默认 compact 40，开启 detailed 62 */
#tasks.compact-desc .task.has-desc{height:40px;min-height:40px;padding-top:2px;padding-bottom:2px}
#tasks.compact-desc .task.has-desc .tdesc{max-height:0;overflow:hidden;opacity:0}
#tasks.compact-desc .task.has-desc .t{max-height:24px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}
#tasks.detailed-desc .task.has-desc{height:62px;min-height:62px}
#tasks.detailed-desc .task.has-desc .tdesc{max-height:18px;opacity:1}
#tasks.detailed-desc .task.has-desc .tm{display:none}
/* ★ 2026-11-02 Tab+E 折叠所有子任务 */
#tasks.kb-subhidden .task.sub{display:none}
/* ★ 2026-11-02 看板拖拽反馈（滴答实测：卡片 hover 高亮 + 落点虚线） */
#board .card:hover{box-shadow:0 2px 8px rgba(0,0,0,.10);transform:translateY(-1px);transition:all .12s}
#board .card.dragover{outline:2px dashed var(--c-brand);outline-offset:2px;border-radius:10px}
#board .cards.dragover{background:rgba(45,111,247,.05);border-radius:10px}
/* ★ 2026-11-02 看板列头高度对齐滴答（实测 h=26；我方 h=19） */
#board h4{min-height:26px!important;display:flex;align-items:center}
#board h4 .cn{line-height:26px!important}
/* ★ 2026-11-02 看板卡片标签芯片（滴答实测：高 18 / 圆角 9999 / 底 rgba(71,114,250,.5)） */
.card .ctg{display:inline-flex;align-items:center;height:18px;padding:0 6px;border-radius:9999px;background:rgba(71,114,250,.5);color:rgba(25,25,25,.8);font-size:12px;margin-right:4px}
/* ★ 2026-11-02 看板对齐滴答（原记「列 240 / 卡 239×92」；R614 活体订正：240 是 #board .cards 内层容器宽，被当成了列宽）
   真列 `#board .col` = 282（padding 0 12px ⇒ 内容盒 258）、列头 40 ⇒ 卡片须填满内容盒 = 258
   （= 滴答实测 258，账本 C3 矩阵同值）。旧值 239 会在列内容盒右缘留 19px 死区（elementFromPoint 落 .col）。
   ★ 2026-11-11 #3200 甲案′ 已落刀：卡内改三行同构 = 标题40 + 中间行30 + 底部22 = 92；
   中间行只在有标签/有描述时渲染 ⇒ 无内容卡高 62（不留空行）。
   ⇒ min-height 由 92 降为 62：旧值 92 是**硬撑**（40+22=62，余 30px 空带），
     判据「kidSum == rect.h」在旧值下恒差 30（#3200 实测 band=30、全卡命中）。 */
#board .cards, .board .cards{width:258px!important}
#board .cards > *{min-height:62px!important;width:258px!important}
/* ★ 2026-11-11 #3200：中间行 30px —— 标签芯片 + 描述预览（单行、超长省略）
   对齐口径：左缩进 41px 与标题同起点；字号 12（滴答描述行 fs12 灰）。
   回退：删本块两条规则 + 下面 min-height 改回 92 + app.js boardCard 还原（同批 bak）。 */
#board .card .cm{height:30px;display:flex;align-items:center;gap:4px;padding:0 12px 0 41px;
  font-size:12px;color:rgba(25,25,25,.4);overflow:hidden;white-space:nowrap}
#board .card .cm .ctg{flex:none}
#board .card .cm .cd{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;font-size:12px;line-height:18px;color:rgba(25,25,25,.4)}
/* ★ 2026-11-03 老板反馈「详情变浮动了」⇒ 撤销 11-02 的居中弹窗覆盖，
   恢复【右侧常驻列】（宽 615、border-left、窄屏自动收窄）。
   原始规则在文件前部（#detail{width:615px;border-left:...;flex:none}），此处不再覆盖。 */
/* ★★ 2026-11-12 详情形态：对齐滴答「视图 × 视口」机制（一手源 R1–R5，#3908）
   清单视图 ≥953 → 右侧常驻列（relative，宽 calc(36vw−18px)，min320）
   清单视图 500..952 → 400px 抽屉（fixed 右侧滑入）｜ <500 → 全幅浮层
   智能清单多列视图（#main.kb-colview）→ 一律 400px 抽屉（滴答该视图本就没有常驻列） */
#detail{position:relative!important;left:auto!important;top:auto!important;transform:none!important;
  /* ★ 2026-11-03 宽度按滴答实测拟合（原来是 35vw + 两档媒体查询硬跳变，980px 时差 23px）：
     ★★ 2026-11-08 R621 落刀改口径（欢欢拍板 R697）：w = calc(36vw - 18px)。
     理由：% 宽度的包含块是 #main（=vw-292）而非视口；vw 直接相对视口、不受包含块影响。
     原 2026-11-03 拟合 0.304393·(vw-50) 废弃；#2927 Q1（是否漂移）采「未定」，
     落刀只依「当前实测偏约 105px」事实（1920 视口 36% 命中 673.20、30.44% 差 -103.98）。
     320px 下限沿用（滴答 R2：仅 ≥953 生效；<953 交给下面两个媒体查询）。
     ⚠️ app-head.css 里 @media(max-width:1330){width:400px} / (max-width:1100){width:336px}
        是旧的手工档位，靠这里 !important 压住即可，不必删（删了反而可能影响别的分支）。 */
  width:calc(36vw - 18px)!important;min-width:320px!important;max-width:none!important;
  max-height:none!important;z-index:20!important;overflow-y:auto!important;
  border-radius:0!important;box-shadow:none!important;border-left:1px solid var(--c-line)!important;
  background:var(--c-surface)!important;transition:right .2s ease-in-out,box-shadow .2s ease-in-out}
@media screen and (max-width:952px) and (min-width:500px){
  #detail{position:fixed!important;right:-400px!important;top:52px!important;bottom:0!important;
    width:400px!important;min-width:0!important;max-width:92vw!important;
    z-index:40!important;   /* ★ 必须低于 .mask 的 50，否则会盖住日期/提醒面板（老板截图） */
    border-left:0!important;border-radius:0!important;
    box-shadow:0 6px 20px rgba(0,0,0,.15)!important;transform:none!important}
  #detail:not(.hide){right:0!important}
}
/* ★ R4：滴答 <500 是全幅浮层（#right-view min-width:100%），不是 400 抽屉 ⇒ 我方补同形态 */
@media screen and (max-width:499px){
  #detail{position:fixed!important;right:0!important;top:52px!important;bottom:0!important;
    width:100%!important;min-width:0!important;max-width:100%!important;
    z-index:40!important;border-left:0!important;border-radius:0!important;
    box-shadow:0 6px 20px rgba(0,0,0,.15)!important;transform:none!important}
  #detail:not(.hide){right:0!important}
}
#main.kb-colview #detail{position:fixed!important;right:-400px!important;top:52px!important;bottom:0!important;
  width:400px!important;min-width:0!important;max-width:92vw!important;
  z-index:40!important;   /* ★ 同上：低于 .mask(50) */
  border-left:0!important;border-radius:0!important;
  box-shadow:0 6px 20px rgba(0,0,0,.15)!important;transform:none!important}
#main.kb-colview #detail:not(.hide){right:0!important}
/* 空态占位（右栏不该是空白一片） */
#detail.hide{display:flex!important;align-items:center;justify-content:center}
#detail.hide::after{content:'选择左侧任务查看详情';color:var(--c-t3);font-size:13px}
/* ★ 2026-11-02 日期面板月份标题字号对齐滴答（实测 15px→14px） */
.ym{font-size:14px!important}
/* ★ 2026-11-02 行光标可见样式（对齐滴答「行光标模型」） */
#tasks .task.kb-cursor{outline:2px solid var(--c-brand);outline-offset:-2px;border-radius:10px}
/* ★ 2026-11-02 侧栏行内距对齐滴答（实测：滴答 padding 0 10px / 我方 0 12px，差 2px） */
#side .lists>.li{padding-left:10px;padding-right:10px}
/* ★ 2026-11-02 列表行压缩（折中 B）：标题 1 行 + 摘要 1 行 + 元信息保留 ⇒ 行高 ~102→~70
   原则：只用 max-height/clamp 截断，不改 DOM、不改字号、不在 hover 时改变高度（避免跳动） */
#tasks .task.has-desc .t{max-height:26px;overflow:hidden}
#tasks .task.has-desc .tdesc{max-height:18px;-webkit-line-clamp:1;overflow:hidden}
/* ★ 2026-11-02 列表行勾选框热区对齐滴答：视觉仍 17×17，可点区域撑到 ~39px 高（滴答 17×40） */
/* ★ R613 2026-11-07 勾选热区/垂直位对齐滴答（一手源 data_rows_precise.json md5 0c749e4b）：
   滴答热区层 .t-check = 17×40 / dy=0（盖满整行），视觉层 .checker 17×17 / dy=11；
   我方旧值：compact 行 padTop2+margin12 ⇒ dy14；::after 上下−11 只到 15+22=37 ⇒ 行顶 4px 死区。
   修：margin 11（compact/den-* 按已知 padTop 减足）+ ::after −11/−12 = 17+23 = 40 整行（0..40，不侵入相邻行）。
   验：R613 活体三模式（compact/detailed/无）dy 全 11、hit 全 40、gapTop 全 0。*/
#tasks .task .chk{position:relative;margin-top:11px}
#tasks.compact-desc .task.has-desc .chk{margin-top:9px}   /* compact 行有 padding-top:2px */
#tasks.kb-den-compact .task .chk{margin-top:10px}         /* 密度 compact 行 padding-top:1px */
#tasks.kb-den-loose .task .chk{margin-top:3px}            /* 密度 loose 行 padding-top:8px */
#tasks.kb-den-compact.compact-desc .task.has-desc .chk{margin-top:10px}
#tasks.kb-den-loose.compact-desc .task.has-desc .chk{margin-top:3px}   /* loose padTop 8 压过 compact 的 9 ⇒ 补回来 */  /* 两者叠加：padTop 被 !important 压成 1px */
#tasks .task .chk::after{content:"";position:absolute;left:-1px;right:-1px;top:-11px;bottom:-12px}
#tasks.kb-den-compact .task .chk::after{top:-11px!important;bottom:-2px!important}   /* 行高30：40px 热区会溢出到下一行顶 10px ⇒ 收成 15+15=30 */
/* ★ 2026-11-02 标签芯片对齐滴答（实测：h18 / padding 0 6px / 圆角 9999 / 底色 = 标签色 50% / 字色 rgba(25,25,25,.8)） */
#detail .dt-tg:not(.mut){height:18px!important;padding:0 6px!important;border-radius:9999px!important;
  background:rgba(71,114,250,.5)!important;color:rgba(25,25,25,.8)!important;font-size:12px!important;line-height:1!important}
/* ★ 2026-11-02 描述与检查项间距：滴答 描述文字→检查项 ≈35px，我方 78px（descIn pb24 + 容器 30） */
#detail #descIn{padding-bottom:8px!important}
#detail .dt-descwrap{padding-bottom:0!important;margin-bottom:0!important}
#detail #secChecks{margin-top:14px!important}   /* 滴答：描述→检查项 视觉 ~35px（含行内上留白） */
/* ★ 2026-11-02 标签行位置对齐滴答：滴答的标签在「描述+检查项」之后，我方原来在标题上方 */
#detail .dt-acts{order:1}
#detail .dt-head{order:2}
#detail .dt-main{order:3}
#detail .dt-tags{order:4}
#dtMain .dt-tags{order:0!important}   /* 搬进 dtMain 后由 DOM 顺序决定，别再被 order 顶到最后 */
#detail .dt-fbar{order:5}
/* ===== 2026-11-02 对齐滴答清单（老板实测对比；可整体删除回滚） ===== */
/* 1) 描述区不再撑 180px —— 滴答空描述只占一行，检查项紧跟其下（实测它 描述→检查项 间距 ~35px） */
/* ★ 2026-11-03 再修：上一条只想去掉「空描述撑 180px」，却顺手把 overflow-y 也改成 visible，
   结果长描述内容溢出父盒、直接盖到 `#secChecks` 上（实测重叠 138px）。
   滴答的真实机制是「`.body` 整块统一滚动」（`.antiscroll-inner` 一个容器包住描述+子任务），
   不是描述自己滚 ⇒ 这里改为 flex:none 让它自然撑开，滚动交给 `.dt-main`。 */
.dt-main .dt-descwrap{flex:0 0 auto!important;min-height:0!important;max-height:none!important;overflow:visible!important}
.dt-main .dt-descwrap #descIn{min-height:24px!important}
/* 2) 检查项行与滴答一致：行高 41px、下方一条 1px 分隔线 */
.dt-checkwrap .ck-add{min-height:40px;border-bottom:1px solid var(--c-line-2)}
/* 4) 检查项添加入口（2026-11-03 对齐滴答 `button.add-descendant-task`）
   滴答实测：400×40 · 蓝字 rgb(71,114,250) · 左侧 18×18 加号 · 常驻；
   空闲态 **没有** 输入行。上方那条只改了 .dt-subwrap，漏了 .dt-checkwrap，故这里补齐。 */
.dt-checkwrap .ck-add.hide{display:none}
.dt-checkwrap .ck-addbtn{display:flex;align-items:center;justify-content:flex-start;gap:9px;
  width:100%;min-height:40px;padding:0 24px;border:0;border-radius:0;background:transparent;
  cursor:pointer;font:inherit;font-size:14px;line-height:21px;color:#4772FA;text-align:left}
.dt-checkwrap .ck-addbtn:hover{background:rgba(71,114,250,.06)}
.dt-checkwrap .ck-addbtn svg{margin-left:19px;width:18px;height:18px;flex:none;fill:#4772FA}
.dt-checkwrap .ck-addbtn span{flex:none}

/* 3) 子任务入口：滴答是蓝色文字链「+ 添加子任务」，不是常显输入框 */
.dt-subwrap .dt-addrow:not(.hide) .dt-ibox{border-color:transparent;background:transparent;padding-left:0}

/* 5) 列视图卡片 76 → 92（2026-11-03 · 对齐滴答多列看板 258×92）
   滴答拆解：40(标题) + 30(标签) + 22(日期) = 92。
   我方差的那 16px **正好**在标题行：`.task .t` computed 高度只有 24px，
   虽然写了 `padding:8px 0` + `line-height:24px`，但内容区被压到 8px，
   `.tt` 的 40px 行高只能上下各溢出 8px（实测 top=-8px）—— 行高等于白算。
   这里把标题行明确成 40px、去 padding、flex 居中，三段相加即 92。 */
.col-list .col-body .task .t,
#tasks .task .t{height:40px!important;min-height:40px!important;padding:0!important;
  display:flex!important;align-items:center!important;overflow:hidden!important}
.col-list .col-body .task .t .tt,
#tasks .task .t .tt{display:block!important;width:100%!important;height:40px!important;
  line-height:40px!important;max-height:40px!important;
  white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}

/* 6) 单列列表行 → 横排（2026-11-03 · 对齐滴答「所有」· 第五版）
   前四版全部失败，真因在第四版才量出来：
     `.tb` 有**三个**子元素 [`.t`, `.tdesc`, `.tm`]（我一直当成两个）。
     `.tdesc`（描述摘要）排在第二位 ⇒ 在 grid 下抢走第 2 列 auto，把 626px 全吃光，
     `grid-template-columns` 实测被算成 "0px 626px"，于是 `.t` 宽度 = 0、`.tm` 被挤到第二行。
   第五版：用 `grid-area` 把三者位置钉死，`.tdesc` 直接隐藏（滴答 40px 单行本来就不显示描述摘要）。 */
#tasks .task .tb{display:grid!important;grid-template-columns:minmax(0,1fr) auto!important;
  grid-template-rows:40px!important;align-items:center!important;column-gap:10px!important;
  height:40px!important;width:auto!important;min-width:0!important}
#tasks .task .tb > .t{grid-area:1/1/2/2!important;display:grid!important;
  grid-template-columns:minmax(0,1fr) auto!important;align-items:center!important;column-gap:8px!important;
  min-width:0!important;width:auto!important;height:40px!important;overflow:hidden!important;padding:0!important}
#tasks:not(.detailed-desc) .task .tb > .tdesc{display:none!important}   /* 描述摘要：单行模式不显示 */
/* ★ 2026-11-04 R589（#2949 甲案 · 欢欢home 16:17 拍板）：detailed 态放开描述
   原规则恒压住下面的 max-height:18px/opacity:1，且 .tb 行高恒 40px 而 .task 已 62px ⇒ 22px 空洞。
   此处把 62px 拆成 40（标题）+22（描述行），与滴答实测一致。 */
#tasks.detailed-desc .task.has-desc .tb{grid-template-rows:40px 22px!important;height:62px!important}
#tasks.detailed-desc .task.has-desc .tb > .tdesc{display:block!important;grid-area:2/1/3/2!important;
  height:18px!important;max-height:18px!important;line-height:18px!important;margin:0!important;
  font-size:12px!important;color:var(--c-t3)!important;white-space:nowrap!important;
  overflow:hidden!important;text-overflow:ellipsis!important;padding:0 20px 0 0!important}
#tasks .task .tb > .tm{grid-area:1/2/2/3!important;display:flex!important;min-width:0!important;width:auto!important;
  height:40px!important;min-height:0!important;flex-wrap:nowrap!important;margin:0!important;
  align-items:center!important;justify-self:end!important}
#tasks .task .t .tt{grid-column:1!important;min-width:0!important;width:auto!important;max-width:none!important;
  display:block!important;height:40px!important;line-height:40px!important;max-height:40px!important;
  white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important;margin:0!important}
#tasks .task .t .tright{grid-column:2!important;margin-left:0!important;justify-self:end!important}
#tasks .task .tm .tlist{display:none!important}   /* 单列下清单名让位（滴答行右侧放标签+日期） */

/* 2026-11-02 分组头样式 */
#tasks.kb-grouped .kb-grouphead{padding:14px 16px 4px;font-size:12px;color:var(--c-t3);font-weight:600}


/* 2026-11-02 显示设置：行密度 + 显示描述 */
#tasks.kb-den-compact .task{min-height:30px!important;height:auto!important;padding-top:1px!important;padding-bottom:1px!important}
#tasks.kb-den-compact .task .tm{display:none!important}   /* 紧凑：隐藏元信息行 */
#tasks.kb-den-loose .task{min-height:48px!important;height:auto!important;padding-top:8px!important;padding-bottom:8px!important}
#tasks.kb-den-loose .task.has-desc{min-height:70px!important}   /* 有描述时宽松需高于标准 62 */
#tasks.kb-hide-desc .task .tdesc{display:none!important}

/* ★ 2026-11-04 R1696（#2971 · 显示设置两开关与实际不符）落刀
   ① 紧凑档「42px > 标准 40px」：真因是 `.tb`/`.t`/`.tt` 三处行盒被钉成 40px（标准档的值），
      紧凑只在 `.task` 上压 min-height:30 并加 2px padding ⇒ 40+2=42，方向与「紧凑」相反。
      修法：紧凑态把行盒压到 28px ⇒ 行高 28+2=30 < 标准 40（且不触碰标准档，无 #2917 C2 回归）。
   ② 「显示描述」开关零观测量：`#tasks.kb-hide-desc .task .tdesc`（1 id+3 类）被
      detailed 态的 `#tasks.detailed-desc .task.has-desc .tb > .tdesc`（1 id+4 类）压住 ⇒ 开了也不隐藏。
      修法：抬到同特异性并后置（后置者胜）⇒ detailed 态仍可隐藏；同时把 22px 描述行一并收起，
      不留 #2949 修掉的那种空洞。
   ★ 本块按「特异性 + 顺序」分层，后写的规则才是胜者，改动时勿打乱顺序。 */
#tasks.kb-den-compact .task .tb{grid-template-rows:28px!important;height:28px!important}
#tasks.kb-den-compact .task .tb > .t{height:28px!important}
#tasks.kb-den-compact .task .t .tt{height:28px!important;line-height:28px!important;max-height:28px!important}
/* 紧凑 + 显示详细：28(标题)+18(描述)+2(padding)=48 < 标准 62 */
#tasks.kb-den-compact.detailed-desc .task.has-desc .tb{grid-template-rows:28px 18px!important;height:46px!important}
/* ② 显示描述：同特异性后置 ⇒ 压过 detailed 的 display:block */
#tasks.kb-hide-desc .task.has-desc .tb > .tdesc{display:none!important}
/* ② 隐藏描述时收起描述行（否则 detailed 62px 里留 22px 空行） */
#tasks.kb-hide-desc.detailed-desc .task.has-desc{height:40px!important;min-height:40px!important}
#tasks.kb-hide-desc.detailed-desc .task.has-desc .tb{grid-template-rows:40px!important;height:40px!important}
/* 紧凑 + 隐藏描述 + 显示详细：仍保持 30 出头（最高特异性，放最后；含 .task 高度，
   否则会被上面 hide-desc 的 40px!important 顶住 ⇒ 有描述的行 40、无描述的行 31，自相矛盾） */
#tasks.kb-den-compact.kb-hide-desc.detailed-desc .task.has-desc{height:auto!important;min-height:30px!important}
#tasks.kb-den-compact.kb-hide-desc.detailed-desc .task.has-desc .tb{grid-template-rows:28px!important;height:28px!important}

/* ═══════════════════════════════════════════════════════════════════════
   ★ 2026-11-09 fb#94（琪琪·星火B）置顶行标题被竖裁 18px —— 修法：pin 脱离文档流
   现象（老板 14:44 截图「已置顶 1」唯一行「整体复盘」）：标题只剩上半截，pin 悬在行顶。
   根因（headless 实测，非推演）：`#tasks .task .t` 被钉成 `display:grid` + **2 列**
   + `height:40px` + `overflow:hidden`；而 `taskRow()` **只在置顶行**往 `.t` 里多渲染
   一个 pin `<svg>` ⇒ 该 svg 成为第 3 个网格项、自动落 row1/col1，把显式
   `grid-column:1` 的 `.tt` 挤到**隐式第 2 行** ⇒ 实测 `grid-template-rows = 14px 40px`
   （内容 58px / 盒 40px）⇒ 标题底部被裁 **18px**。非置顶行只有 2 个孩子 ⇒ 恰好不发作，
   所以这个缺陷**按数据（是否置顶）条件触发**，纯静态检查看不出来。
   修法：pin 改绝对定位（不参与网格），标题用「相邻兄弟」让出 22px，**不动列数**
   ⇒ 无 pin 的行逐像素不变（验收：plain 行 ttX/ttW/rowH 与改前全等），且不依赖 `:has()`。
   ⚠ 勿改回让 svg 参与布局：`.t` 里孩子个数由数据决定（置顶/非置顶），2 列必错位。
   ═══════════════════════════════════════════════════════════════════════ */
#tasks .task .t{position:relative!important}
#tasks .task .t > svg{position:absolute!important;left:0!important;top:50%!important;
  transform:translateY(-50%)!important;margin:0!important}
#tasks .task .t > svg + .tt{padding-left:22px!important;box-sizing:border-box!important}

/* ── #3091 · 摘要正文「区间标题」对齐滴答（`# 10月1日-10月31日`）────────────────
   滴答真值（一手截图 shot_summary.webp）：正文首行是一级标题，明显大于下面的
   「已完成」小标题；连字符两侧无空格、月日不补零。
   后端 `_summary_md` 已改为输出 `# 区间`（无空格）；这里给 md2html 注入的
   h2.smdh1 定尺寸：20px / 600（滴答正文标题约 1.45× 正文 14px；我方页头
   `.smt` 同为 20px，故靠字重与「上紧下松」的 margin 区分层级）。
   `## ` / `### ` 两级映射保持不变 ⇒ 用户手改的旧正文（`## `）仍按原样渲染。 */
#sum .smb h2.smdh1{font-size:20px;font-weight:600;line-height:1.45;margin:0 0 10px;color:var(--c-t1)}

/* ══ L105 · #4081 甲案（2026-11-13 呆呆·星火C）：看板视图详情面板改「浮层弹窗」
   滴答看板：`.out-detail-pop` 400px、absolute、z1050、**贴任务条弹出**，**看板内无右侧常驻栏**
   （`.g-right` 不存在）⇒ 主区列区不被挤压（滴答列区 1150、单列 282 不变）。
   我方原为 500px 常驻栏（`#detail` 是 `#body` 的 flex 子项）⇒ 看板列被压 500px。
   ⇒ 改 `position:fixed` 脱离 flex 流 ⇒ 主区立即回满；宽度/层级照滴答。
   ★ 范围只含**看板**（冲刺计划 §二：看板=A 类必做）；日历/时间线/摘要/习惯/四象限=B 类（记账不做）⇒ 不动。
   ★ 放在本页**末尾**：作者 !important 之间按「后出现者胜」⇒ 压得住上面的抽屉规则。
   ★ z-index 取 45：须**低于 `.mask`(50)**（功能树 §106：详情面板不得盖住日期/提醒面板）。 */
#detail.pop{position:fixed!important;left:auto!important;right:auto!important;top:auto!important;bottom:auto!important;
  transform:none!important;width:400px!important;min-width:0!important;max-width:400px!important;max-height:600px!important;
  z-index:45!important;overflow-y:auto!important;border-radius:10px!important;
  box-shadow:0 10px 30px rgba(0,0,0,.16)!important;
  border:1px solid var(--c-line)!important;background:var(--c-surface)!important}
/* 看板未选中任务 ⇒ 整块不出现（滴答看板无 .g-right；我方原为「空占位 500px」） */
#detail.pop.solo{display:none!important}

/* ══ R696 · #4075 D1/D5/D6/D7（详情面板**底部** ⋯ = 滴答独立 B 型）══
   滴答真值（欢欢home CDP 2026-11-13 实测）：164 宽 · 项 154×34 · **0 段**（无「日期」「优先级」）· **无 .msep** · 14 项。
   我方原底部 ⋯ 与任务行共用 A 型（194 / 2 段 / 多条分隔线）。
   ★ 只对 B 型（.dt-menu.b）生效 ⇒ A 型（任务行 ⋯ / 看板卡片右键 / 面板内 #dtMenu）零影响。
   项宽 154 = 164 − 边框 1×2 − margin 4×2（沿用 .dt-menu .mi 的已对齐口径，不另立尺寸）。 */
.dt-menu.b{width:164px}
.dt-menu.b .sec68{display:none}
.dt-menu.b .msep{display:none}
.dt-menu.b .mi.mv{display:none}   /* 滴答 B 型无「移动到」（底栏清单 chip 为等价入口）*/
