
*{margin:0;padding:0;box-sizing:border-box}
body{font-family:-apple-system,BlinkMacSystemFont,'PingFang SC','Microsoft YaHei',sans-serif;background:var(--c-bg);color:var(--c-t1);height:100vh;overflow:hidden}
#app{display:flex;height:100vh}
#side{width:240px;background:var(--c-surface);border-right:1px solid var(--c-line);display:flex;flex-direction:column;flex:none}
/* ★ 2026-09-16：非任务板块（日历/四象限/习惯/摘要/工作区）收起侧栏——滴答真机同款行为 */
#side.hide{display:none}
#side .hd{padding:12px 16px;font-weight:700;font-size:15px;border-bottom:1px solid var(--c-line);display:flex;align-items:center;gap:6px}
/* ★★ 2026-09-21 r42：置顶卡按滴答逐像素对齐（实测：`_dida_pin1~9.js`）
   容器 pad 16/14/19 + 下边框 5% ⇒ 总高 92；4 列 46px space-between（间距 9 @212 内容宽）
   卡 46x56 · 图标色块 28x28 br6（底色 = 清单色；无色 ⇒ 品牌蓝 10%）· emoji 14px
   名称 fs12 lh14 色 rgba(25,25,25,.8) 居中 宽44 单行省略
   滴答实测：卡**无 hover 变化**、点击后**卡无选中态**（故 `.on` / `:hover` 两条已删）
   ⚠️ 回退：换回「flex gap8 padding 10/14/12 · pic 38x38 br11 灰底 1px 边框 · hover translateY(-1) · .on 品牌边框+光晕」 */
#side .pinbar{display:grid;grid-template-columns:repeat(4,46px);justify-content:space-between;padding:16px 14px 19px;border-bottom:1px solid rgba(25,25,25,.05);flex:none;overflow:hidden}
#side .pinbar:empty{display:none}
html[data-theme="dark"] #side .pinbar{border-bottom-color:rgba(255,255,255,.06)}
#side .pinit{width:46px;height:56px;flex:none;display:flex;flex-direction:column;align-items:center;gap:4px;padding:4px 0;box-sizing:border-box;cursor:pointer;background:transparent;border:0;font:inherit}
#side .pinit .pic{width:28px;height:28px;border-radius:6px;display:flex;align-items:center;justify-content:center;font-size:14px;line-height:1;overflow:hidden}
#side .pinit .pn{font-size:12px;line-height:14px;color:rgba(25,25,25,.8);width:44px;text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
html[data-theme="dark"] #side .pinit .pn{color:rgba(255,255,255,.8)}
#side .lists{flex:1;overflow-y:auto;padding:6px}
/* ★★★ r64 / ⑳ 行盒左右内缩对齐滴答（滴答 `li` 239@inset0 内嵌画底 `button` **219** @insetL/R=**10/11**；
   我方 `.li` 是**单层**（既当行盒又当画底层），所以直接把 10/11 落在 `.li` 外边距上：
   227 − 4 − 4 = **219** · insetL = 6 + 4 = **10** · insetR = 292 − (62 + 219) = **11**。
   只写左右，**不写 shorthand** ⇒ 不覆盖 `#side .archh{margin-top:2px}`；子选择器 `>` ⇒
   不误伤 `.archlist`（孙层）里的 `.li`。段头 `.sec` 未被 `.lists` padding 波及（本轮不动 padding）。 */
/* ★★★ r66 / ㉓ 行距对齐滴答：滴答**相邻行** top 差 **38** = 行高 36 + **2px 间隙**
   （2px 来自滴答每个行包装容器 `div.project` 的 `mar 0 0 2px`）。
   ★ **段头不参与**：「段头 → 相邻行」的间隙仍为 **0**（r65 只读取证：段头 bot = 下一兄弟 top）。
   我方原为 36（无间隙）。只加 `margin-bottom` ⇒ 不影响 `#side .archh{margin-top:2px}` 的纵向 2px，
   也不动 `.lists` 的 padding；子选择器 `>` ⇒ `.archlist`（孙层）里的 `.li` 不受影响。 */
#side .lists>.li{margin-left:4px;margin-right:4px;margin-bottom:2px}
/* ★★★ r66 / ㉔ 段头 `.sec` 左右内缩对齐滴答（滴答段头**画底层** `a.drop-hover-effect`
   = **219×30 @dx10** · pad `0 10px 0 14px` · br 6 —— 与**行盒同盒**；我方段头原为
   227@inset6（`.sec`）/ 215@inset12（`.sec.secbtn`）。加左右 4px 后：
   227 − 8 = **219** · insetL = 6 + 4 = **10** · 标签 dx = 10 + 14 = **24**（滴答同值）。
   只写左右，**不写 shorthand** ⇒ 不覆盖 `.sec.secbtn{margin:0 6px}` 的纵向 0；
   子选择器 `>` ⇒ 不误伤 `.archlist`（孙层）与 `.lists` 之外的任何 `.sec`。 */
#side .lists>.sec{margin-left:4px;margin-right:4px}
/* ★ 2026-09-15 对齐滴答：侧栏条目**定高 36**、字号 14、色 rgb(25,25,25) */
/* ★★ 2026-09-19 C4 对齐滴答（`_dida_side1.js`）：行 h36 · pad `0 12px` · **br 10** ·
   图标 **20×20 @dx12** · 文字 **dx38**（= 12 + 20 + gap 6） */
.li{display:flex;align-items:center;gap:6px;padding:0 12px;min-height:36px;border-radius:10px;cursor:pointer;font-size:14px;color:var(--c-t1)}
#side .li>svg,#side .li .dti{width:20px;height:20px;flex:none}   /* 滴答图标 20×20 */
.li:hover{background:color-mix(in srgb, var(--c-t1) 4%, transparent)}   /* r94：对齐滴答清单行 hover = rgba(25,25,25,.04)（同处 3 样本 `_r94_hov3_dida.out`）；经令牌 ⇒ 暗色自动 4% 白（与 r73 段头同族）*/
/* ★★ C4：滴答选中态 = **中性 6% 灰底，文字颜色与字重都不变**（实测 bg rgba(25,25,25,.06) / col rgb(25,25,25) / fw 400）
   —— 我方原来是「品牌蓝底 + 蓝字 + 加粗」。`--c-t1` 随主题，暗色自动变 white-6% ✓ */
.li.on{background:color-mix(in srgb, var(--c-t1) 6%, transparent);color:var(--c-t1);font-weight:400}
.li .dot{width:8px;height:8px;border-radius:50%;flex:none}
/* 滴答实测：计数 12px / rgba(25,25,25,.4)，right 对齐 */
.li .cnt{margin-left:auto;font-size:12px;color:var(--c-t3);flex:none;min-width:18px;text-align:right}
/* ── 清单改名（2026-09-14）：就地编辑 + 悬浮铅笔 + 右键菜单 ── */
.li .pen:hover{opacity:1;color:var(--c-brand)}
.li .pname-in{flex:1;min-width:0;border:1px solid var(--c-brand);border-radius:6px;background:var(--c-surface);
  color:var(--c-t1);font:inherit;padding:1px 4px;outline:none;box-shadow:0 0 0 3px var(--c-brand-bg)}
#ptitle:hover{background:var(--c-surface-2);border-radius:6px;cursor:text}
.ptitle-in{border:1px solid var(--c-brand);border-radius:8px;background:var(--c-surface);color:var(--c-t1);
  font-size:18px;font-weight:700;padding:2px 8px;outline:none;box-shadow:0 0 0 3px var(--c-brand-bg);width:min(420px,60vw)}
#projMenu{position:fixed;min-width:172px}
/* ══ 专注页（2026-09-14 对齐滴答：番茄30分钟倒计时 / 正计时可选任务 / 概览 / 专注记录）══ */
/* ★ 2026-09-16 修「点开专注左上图标栏消失」：滴答真机取证（zoom_rail.png）左侧 50px 图标栏是全站常驻 · 我们 #rail 宽 52px → 专注页从图标栏右侧开始，不盖它 */
#focus{position:fixed;left:52px;right:0;top:0;bottom:0;z-index:70;background:var(--c-bg);display:flex}
#focus.hide{display:none}
.fx-left{flex:1;min-width:0;display:flex;flex-direction:column;align-items:center;position:relative;padding:14px 18px 24px}
.fx-head{display:flex;align-items:center;gap:10px;width:100%}
.fx-title{font-size:20px;font-weight:700;color:var(--c-t1)}
.fx-modes{margin-left:auto;display:flex;background:color-mix(in srgb,var(--c-t1) 5%,transparent);border:0;border-radius:999px;padding:0;height:36px;position:relative}   /* r83：滴答轨道 = bg-grey-5(5%) 胶囊 178x36/br9999（真值 _dida_r83_focus3/4.out）*/
.fx-modes button{border:2px solid transparent;background:transparent;background-clip:padding-box;color:color-mix(in srgb,var(--c-t1) 60%,transparent);font:inherit;font-size:14px;font-weight:500;line-height:1;height:36px;min-height:0;padding:0 18px;border-radius:999px;cursor:pointer;position:relative;z-index:1;user-select:none;transition:all}
.fx-modes button.on{background:transparent;background-clip:padding-box;color:var(--c-t1);font-weight:500}
.fx-modes button:not(.on):hover{background:transparent}
/* ★ 2026-09-25 r84：滴答模式段「选中」= **独立绝对层白胶囊**（`absolute inset-0` + `h-full rounded-full bg-main-background` 92x32 inset2，`transition: transform 0.3s`），
   段自身恒为透明、字色瞬时切换（段 transition:all=0s，无渐变）。真值 _regress_logs/_dida_r84_focus_int.out / _dida_r84_hoverchk.out。
   我方改前：选中态写在按钮自身 background + 150ms 底色渐隐、无平移 ⇒ 与滴答「胶囊平移」不一致。*/
.fx-mcap{position:absolute;left:0;top:2px;bottom:2px;width:92px;border-radius:999px;background:var(--c-surface);transition:transform .3s;pointer-events:none;z-index:0}   /* r84：白胶囊（几何由 fxCapSync() 按段宽/段位同步）*/   /* r83：滴答模式段 hover 零差分（_dida_r83_focus.out focusHeadM n=0）*/
.fx-ops button{border:0;background:transparent;color:var(--c-t3);font-size:18px;cursor:pointer;width:30px;height:30px;min-height:0;padding:0;border-radius:8px;line-height:1}
.fx-ops button:hover{background:color-mix(in srgb,var(--c-t1) 5%,transparent)}
.fx-task{margin-top:7vh;display:inline-flex;align-items:center;gap:6px;font-size:13.5px;color:var(--c-t3);cursor:pointer;padding:4px 12px;border-radius:9px}
.fx-task:hover{background:var(--c-surface-2);color:var(--c-brand)}
.fx-task .car{font-size:16px;line-height:1}
.fx-ring{position:relative;width:min(44vh,290px);aspect-ratio:1;margin:5vh auto 0;display:flex;align-items:center;justify-content:center}
.fx-ring svg{width:100%;height:100%;display:block}
.fx-time{position:absolute;font-size:40px;font-weight:300;letter-spacing:1.5px;color:var(--c-t1)}
.fx-ctrls{margin-top:auto;display:flex;gap:10px;align-items:center;padding-top:16px}
.fx-btn{border:0;background:var(--c-brand);color:#fff;font:inherit;font-size:14px;padding:12px 48px;border-radius:24px;cursor:pointer}
.fx-btn:active{background:color-mix(in srgb,var(--c-brand) 85%,#000)}   /* ★ r84：滴答主按钮按下态实测 rgb(71,114,250)->rgb(62,96,205)（各通道 x0.873/0.842/0.820，均值 .845）⇒ 85% 主色 + 15% 黑 */
.fx-btn:hover{background:color-mix(in srgb,var(--c-brand) 80%,#fff)}   /* ★ 2026-09-24 r81 对齐滴答：主按钮 hover = 主色 +20% 白（滴答 rgb(71,114,250)→rgb(108,142,251) 逐通道解出正是 20% 白）；★ 必须显式写 background：全局 `button:hover{background:var(--c-surface-2)}` 特异性 (0,1,1) 会压过 .fx-btn(0,1,0) ⇒ 原来 hover 被染成灰底 */
.fx-btn2{border:1px solid var(--c-line);background:var(--c-surface);color:var(--c-t2);font:inherit;font-size:13px;padding:10px 18px;border-radius:22px;cursor:pointer}
.fx-btn2:hover{background:var(--c-surface-2)}
.fx-right{width:684px;flex:none;border-left:1px solid var(--c-line);background:var(--c-surface);display:flex;flex-direction:column;overflow:auto;padding:14px 16px}
.fx-drag{flex:none;width:5px;cursor:ew-resize;background:transparent;position:relative;z-index:2}
.fx-drag:hover{background:color-mix(in srgb,var(--c-t1) 8%,transparent)}
.fx-rhead{font-size:18px;font-weight:500;line-height:24px;color:var(--c-t1);margin-bottom:22px}
.fx-stats{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:0}
.fx-st{background:color-mix(in srgb,var(--c-t1) 3%,transparent);border-radius:12px;padding:12px 12px 10px;display:flex;flex-direction:column;gap:5px}
.fx-st .n{font-size:24px;font-weight:600;line-height:30px;color:color-mix(in srgb,var(--c-t1) 80%,transparent)}
.fx-st .l{font-size:12px;line-height:16px;color:color-mix(in srgb,var(--c-t1) 40%,transparent)}
.fx-rhead2{display:flex;align-items:center;font-size:18px;font-weight:500;line-height:24px;color:var(--c-t1);margin:56px 0 6px}
.fx-plus{margin-left:auto;border:0;background:transparent;color:var(--c-t3);font-size:18px;cursor:pointer;width:28px;height:28px;min-height:0;padding:0;border-radius:8px;line-height:1}
.fx-plus:hover{background:color-mix(in srgb,var(--c-t1) 5%,transparent)}
.fx-date{font-size:14px;line-height:20px;color:color-mix(in srgb,var(--c-t1) 40%,transparent);margin:10px 0 4px}
.fx-rec{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--c-t2);padding:3px 0}
.fx-dot{width:9px;height:9px;border-radius:50%;border:2px solid var(--c-t3);flex:none}
.fx-dot.pomo{border-color:var(--c-brand);background:var(--c-brand)}
.fx-hm{color:var(--c-t2)}
.fx-dur{margin-left:auto;color:var(--c-t3);font-size:12.5px}
.fx-rt{font-size:12px;color:var(--c-t3);padding:0 0 6px 16px}
.fx-recw{position:relative}   /* r83：滴答记录行 hover 底盒 = 单独一层 `hidden group-hover:block absolute bg-grey-3` inset 上下4 左右8 br6（真值 _dida_r83_focus3.out）*/
.fx-recw::before{content:'';position:absolute;top:-4px;bottom:-4px;left:-8px;right:-8px;border-radius:6px;background:color-mix(in srgb,var(--c-t1) 3%,transparent);display:none;pointer-events:none}
.fx-recw:hover::before{display:block}
/* ★ qi0054：专注记录删除入口（后端 DELETE /focus/records/{fid} 早就在位，前端此前零消费 ⇒ 死端点）；
   hover 才显形，与滴答记录行的 hover 操作区一致（真值 _dida_r83_focus3.out） */
.fx-del{margin-left:6px;border:0;background:transparent;color:var(--c-t3);font-size:13px;cursor:pointer;
  width:20px;height:20px;min-height:0;padding:0;border-radius:6px;line-height:1;opacity:0;flex:none;position:relative}
.fx-recw:hover .fx-del{opacity:1}
.fx-del:hover{background:color-mix(in srgb,var(--c-t1) 8%,transparent);color:var(--c-bad)}
.fx-goal{margin-top:10px;font-size:12.5px;color:color-mix(in srgb,var(--c-t1) 45%,transparent)}
.fx-goal b{color:var(--c-brand);font-weight:600}
/* ★ qi0054 专注设置（对齐滴答「设置-番茄计时」：番茄时长/短休息时长/目标番茄）*/
.fx-set{position:absolute;inset:0;display:none;align-items:flex-start;justify-content:center;background:rgba(0,0,0,.18);z-index:6}
.fx-set.on{display:flex}
.fxs-in{margin-top:13vh;width:320px;background:var(--c-surface);border:1px solid var(--c-line);border-radius:12px;
  box-shadow:0 12px 32px rgba(0,0,0,.16);overflow:hidden}
.fxs-h{display:flex;align-items:center;padding:10px 12px;font-size:13.5px;font-weight:600;border-bottom:1px solid var(--c-line-2);color:var(--c-t1)}
.fxs-x{margin-left:auto;cursor:pointer;color:var(--c-t3);font-size:16px}
.fxs-row{display:flex;align-items:center;gap:10px;padding:10px 12px;font-size:13px;color:var(--c-t2)}
.fxs-row input{width:72px;margin-left:auto;border:1px solid var(--c-line);background:var(--c-surface);color:var(--c-t1);
  border-radius:7px;padding:5px 8px;font-size:13px;text-align:right}
.fxs-foot{display:flex;gap:8px;padding:10px 12px;border-top:1px solid var(--c-line-2)}
.fxs-btn{flex:1;border:0;border-radius:8px;padding:8px;font-size:13px;cursor:pointer;background:var(--c-brand);color:#fff}
.fxs-btn2{background:transparent;color:var(--c-t2);border:1px solid var(--c-line)}
.fx-empty{font-size:12.5px;color:var(--c-t3);padding:10px 0}
.fx-picker{position:absolute;inset:0;display:none;align-items:flex-start;justify-content:center;background:rgba(0,0,0,.18);z-index:5}
.fx-picker.on{display:flex}
.fxp-in{margin-top:13vh;width:344px;max-height:62vh;background:var(--c-surface);border:1px solid var(--c-line);border-radius:12px;
  box-shadow:0 12px 32px rgba(0,0,0,.16);display:flex;flex-direction:column;overflow:hidden}
.fxp-h{display:flex;align-items:center;padding:10px 12px;font-size:13.5px;font-weight:600;border-bottom:1px solid var(--c-line-2);color:var(--c-t1)}
.fxp-x{margin-left:auto;cursor:pointer;color:var(--c-t3);font-size:16px}
.fxp-range{padding:8px 12px 0}
.fxp-range select{border:1px solid var(--c-line);background:var(--c-surface);color:var(--c-t1);border-radius:7px;padding:4px 8px;font-size:12.5px}
.fxp-list{overflow:auto;padding:6px 6px 10px}
.fxp-i{display:flex;align-items:center;gap:8px;padding:8px;border-radius:8px;cursor:pointer;font-size:13px;color:var(--c-t2)}
.fxp-i:hover{background:var(--c-surface-2);color:var(--c-t1)}
.fxp-c{width:13px;height:13px;border:1.6px solid var(--c-t3);border-radius:50%;flex:none}
.fxp-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.fxp-d{font-size:12px;color:var(--c-t3);flex:none}
#fxTicks .tick{stroke:var(--c-line);stroke-width:1.5;stroke-linecap:round}
#fxTicks .tick.on{stroke:var(--c-brand);stroke-width:2.2}
html[data-theme="dark"] #fxTicks .tick{stroke:#3a3f47}
@media(max-width:860px){#focus{left:0;flex-direction:column}.fx-right{width:auto;flex:none;border-left:0;border-top:1px solid var(--c-line);max-height:44vh}
  .fx-ring{width:min(34vh,230px);margin-top:3vh}.fx-task{margin-top:3vh}}
/* ══ 打印（2026-09-14 对齐滴答）：A4 分页 · ☐+标题逐行 · 行间细线 · 页脚品牌 + page N/M ══ */
#printWrap{display:none}
#printWrap.measuring{display:block;position:fixed;left:-10000px;top:0;z-index:-1}
.pp{width:182mm;height:258mm;background:#fff;color:#111;box-sizing:border-box;display:flex;flex-direction:column;
  page-break-after:always;font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif}
.pp:last-child{page-break-after:auto}
.pp .pttl{font-size:11pt;font-weight:700;margin:0 0 4mm;color:#111;flex:none}
.pp .pbody{flex:1;min-height:0;overflow:hidden}
.prow{display:flex;align-items:flex-start;gap:3mm;padding:2.8mm 0;border-bottom:.25mm solid var(--c-line);break-inside:avoid}
.prow.sub{padding-left:7mm}
.prow .pchk{width:3.4mm;height:3.4mm;border:.3mm solid var(--c-t3);border-radius:.7mm;flex:none;margin-top:1mm}
.prow .pt{font-size:10.5pt;line-height:1.55;flex:1;min-width:0;word-break:break-word}
.pp .pfoot{flex:none;display:flex;align-items:center;justify-content:space-between;padding-top:3.5mm;
  border-top:.25mm solid var(--c-line);font-size:8.5pt;color:var(--c-t3)}
.pp .pfoot .brand{display:inline-flex;align-items:center;gap:2mm;color:#2f6fed;font-weight:600}
.pp .pfoot .brand svg{width:5.2mm;height:5.2mm;flex:none}
@media print{
  #app,.mask,.panel,.menu{display:none!important}
  #printWrap{display:block!important}
  html,body{background:#fff!important;height:auto!important;overflow:visible!important}
  @page{size:A4;margin:14mm}
}
/* ── 详情页 v5.3（2026-09-17 对齐滴答：**描述是主体、撑满**；子任务/检查项紧凑跟随）──
   旧版 v5.2 的问题（真机量测）：`dt-subwrap{flex:1}` 让**空的**子任务/检查项区吃掉全部剩余高度
   （实测 **726px**），而描述区被 `flex:0 0 auto` + `min-height:110px` 压成 **110px**
   → 表现为「一个写东西的小框 + 下面一大片空白」= 老板说的「描述界面体验很差」。
   滴答：描述区撑满剩余空间；子任务/检查项按内容排布，空区块不占高度。 */
.dt-main .dt-descwrap{flex:0 1 auto;min-height:180px;max-height:52%;overflow-y:auto}   /* ★ r116 运维(反馈#6)：不再 flex:1 吃满，把子任务/检查项区上提到描述正下方 */
   /* ★ fb#86（2026-10-23 莹莹·星火B）：补 overflow-y:auto —— 原 descIn 为 overflow:visible，描述超限高时文字直接溢出画到下方检查项上（备注与步骤重合，见反馈6 截图）；改后长描述在描述区内滚动，不再重叠 */
.dt-main.no-sub .dt-descwrap{flex:1;max-height:none;overflow-y:auto}   /* fb#86 同修 no-sub 分支 */
.dt-main .dt-descwrap #descIn{min-height:180px}
/* ── 子任务 / 检查项行：★★ r115（2026-09-26）**按滴答真值重写**（老板：「转过以后的样式 没跟滴答对齐」）──
   滴答真值（`_dida_r115b.js` / `_dida_r115d.js`；样本 **40 条子任务 · 非空自证**）：
     LI.sub-task   614×41 · `padding:0 24px` · **无圆角、无底色、无 gap**
     SPAN.checker  17×17 @x+24 · 垂直居中 · 圆角方框（我方沿用 `--c-line` 令牌，尺寸对齐）
     文本          x = 区左 + 48（= 24 pad + 17 框 + **7 gap**）· fs14 / lh21
     行底分隔线    1px · `rgba(25,25,25,.05)` · **左内缩 48 / 右内缩 24** · 每行都有（含末行）
     已完成        文本 `rgba(25,25,25,.4)` · **无删除线**
     hover         行底**不变色**（滴答只是多出左缘 12×12 拖拽柄）
   ⇒ 本轮删掉 3 条**我方自造**：① `gap:8px`+`padding:6px 8px`+`border-radius:7px` ② hover 底色 ③ 已完成删除线。
   ★ 深色主题的分隔线值（`rgba(255,255,255,.06)`）是**按层级换算**，非滴答实测（滴答侧只量了浅色）。 */
.st-row{display:flex;align-items:center;gap:7px;min-height:41px;padding:0 24px;cursor:pointer;position:relative}
.st-row::after{content:'';position:absolute;left:48px;right:24px;bottom:0;height:1px;background:rgba(25,25,25,.05)}
html[data-theme="dark"] .st-row::after{background:rgba(255,255,255,.06)}
.st-row .st-chk{width:17px;height:17px;border:1.5px solid var(--c-line);border-radius:4px;flex:none;
  display:inline-flex;align-items:center;justify-content:center;font-size:11px;color:transparent;background:var(--c-surface)}
.st-row:hover .st-chk{border-color:var(--c-t3)}
.st-row .st-chk.on{background:var(--c-brand);border-color:var(--c-brand);color:#fff}
.st-row .st-tx{flex:1;min-width:0;font-size:14px;line-height:21px;word-break:break-word;color:var(--c-t1)}
.st-row.done .st-tx{color:var(--c-t3)}
.st-row .st-x{opacity:0;color:var(--c-t3);flex:none;font-size:14px;line-height:1.3}
.st-row:hover .st-x{opacity:.65}
.st-row .st-x:hover{opacity:1;color:var(--c-bad)}
/* ★ 2026-09-28 #8后半 TASKBOARD_SUBEDIT_20260928：子任务点击直编 —— 就地编辑输入框（对齐滴答） */
.st-row .st-ed{flex:1;min-width:0;border:0;outline:0;background:transparent;font:inherit;font-size:14px;line-height:21px;color:var(--c-t1);padding:0;margin:0}
/* 添加行（**〔自有〕**：滴答详情**没有**常驻输入框，它走 ⋯ 菜单。
   我方保留输入框但**默认隐藏**（`DT_ADDOPEN` 控制），点 ⋯ →「添加子任务」才出现 ⇒ 默认视觉与滴答一致、入口不丢）。 */
.dt-addrow{margin-top:6px}
.dt-addrow.hide{display:none}

/* ══ ★★ 2026-10-10【检查项】对齐滴答（老板定：「子任务是单独加的，描述界面默认的就是检查项」）══
   段位照 `.st-row`（41 高 / 左右 24 内缩 / 分隔线左缩 48），差别：
     · 左侧多 12×12 **拖动柄**（hover 现 · cursor:move · 负边距顶到 24 内缩线上）
     · 右侧两枚：🔔 提醒 + 🗑 删除（hover 现）
     · 文本用 `<input>` 就地编辑（回车 / 失焦落库）
   末尾**常驻空行** `#chkAddRow`：☐ + placeholder「回车添加下一项」（左缩与上面的 ☐ 对齐）。 */
.ck-row{display:flex;align-items:center;gap:7px;min-height:41px;padding:0 24px;position:relative}
.ck-row::after{content:'';position:absolute;left:48px;right:24px;bottom:0;height:1px;background:rgba(25,25,25,.05)}
html[data-theme="dark"] .ck-row::after{background:rgba(255,255,255,.06)}
.ck-row .ck-drag{width:12px;height:12px;flex:none;cursor:move;opacity:0;color:var(--c-t3);margin-left:-19px;
  display:inline-flex;align-items:center;justify-content:center;font-size:11px;line-height:1}
.ck-row:hover .ck-drag{opacity:.55}
.ck-row .ck-chk{width:17px;height:17px;border:1.5px solid var(--c-line);border-radius:4px;flex:none;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;font-size:11px;color:transparent;background:var(--c-surface)}
.ck-row:hover .ck-chk{border-color:var(--c-t3)}
.ck-row .ck-chk.on{background:var(--c-brand);border-color:var(--c-brand);color:#fff}
.ck-row .ck-tx{flex:1;min-width:0;font:inherit;font-size:14px;line-height:21px;color:var(--c-t1);
  word-break:break-word;cursor:text;padding:0;margin:0}   /* fb#85：input→span 折行显示全文（滴答真值：检查项文本可折行） */
.ck-row.done .ck-tx{color:var(--c-t3)}
/* fb#85：检查项点击直编输入框（镜像 .st-ed，2026-09-28 TASKBOARD_SUBEDIT 同款） */
.ck-row .ck-ed{flex:1;min-width:0;border:0;outline:0;background:transparent;font:inherit;font-size:14px;line-height:21px;color:var(--c-t1);padding:0;margin:0}
.ck-row .ck-rem,.ck-row .ck-del{flex:none;cursor:pointer;color:var(--c-t3);opacity:0;line-height:1;
  width:18px;height:18px;display:inline-flex;align-items:center;justify-content:center}
.ck-row:hover .ck-rem,.ck-row:hover .ck-del{opacity:.6}
.ck-row .ck-rem:hover{opacity:1;color:var(--c-brand)}
.ck-row .ck-del:hover{opacity:1;color:var(--c-bad)}
.ck-row .ck-rem.on{opacity:1;color:var(--c-brand)}
.ck-row.drag{opacity:.45}
.ck-row.dragover::before{content:'';position:absolute;left:24px;right:24px;top:0;height:2px;background:var(--c-brand)}
.ck-add{display:flex;align-items:center;gap:7px;min-height:41px;padding:0 24px}
.ck-add .ck-chk{width:17px;height:17px;border:1.5px solid var(--c-line);border-radius:4px;flex:none;margin-left:19px}
.ck-add input{flex:1;min-width:0;font:inherit;font-size:14px;line-height:21px;color:var(--c-t1);
  border:0;outline:0;background:transparent;padding:0;margin:0}
.ck-add input::placeholder{color:var(--c-t3)}
.dt-checkwrap{flex:none}
.ck-rempop{position:fixed;z-index:60;background:var(--c-surface);border:1px solid var(--c-line-2);
  border-radius:8px;box-shadow:0 6px 24px rgba(0,0,0,.16);padding:10px;display:none}
.ck-rempop.on{display:block}
.ck-rempop input{font:inherit;font-size:13px;padding:4px 6px;border:1px solid var(--c-line-2);
  border-radius:6px;background:var(--c-bg);color:var(--c-t1)}
/* ★★ fb#36 全改：任务动态 = 描述区下方的**内嵌区块**（滴答同款：分隔线 + 标题 + ✕，不遮挡描述） */
.dt-actsec{margin:10px 0 0;border-top:1px solid var(--c-line-2);padding-top:8px;flex:none}
.dt-actsh{display:flex;align-items:center;height:26px;font-size:13px;color:var(--c-t2)}
.dt-actsh .t{font-weight:600}
.dt-actsh .x{margin-left:auto;cursor:pointer;color:var(--c-t3);font-size:16px;line-height:1;padding:0 4px}
.dt-actsh .x:hover{color:var(--c-t1)}
.dt-actrow{display:flex;gap:8px;padding:6px 0}
.dt-actico{flex:0 0 18px;width:18px;height:18px;border-radius:50%;color:#fff;font-size:11px;line-height:18px;
  text-align:center;font-style:normal;font-weight:600;display:inline-block}
.dt-actc{flex:1;min-width:0}
.dt-actline{font-size:13px;color:var(--c-t1);line-height:19px}
.dt-actline b{font-weight:600}
.dt-actbody{font-size:13px;color:var(--c-t2);line-height:19px;margin-top:2px;white-space:pre-wrap;
  word-break:break-word;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.dt-actbody:not(.collapsed){display:block;overflow:visible}
.dt-actexp{display:inline-block;margin-top:2px;font-size:12.5px;color:var(--c-brand);cursor:pointer}
.dt-acttime{font-size:11.5px;color:var(--c-t3);margin-top:3px}
.dt-actempty{font-size:13px;color:var(--c-t3);padding:6px 0}
/* ══ 设置·模板 / 清单·笔记 双模式（2026-09-14）══ */
.pj-kind{display:flex;gap:8px;margin:2px 0 12px}
.pj-kind button{flex:1;text-align:left;border:1px solid var(--c-line);background:var(--c-surface);border-radius:9px;
  padding:8px 10px;cursor:pointer;color:var(--c-t2);font:inherit}
.pj-kind button b{display:block;font-size:13.5px;color:var(--c-t1)}
.pj-kind button span{font-size:11.5px;color:var(--c-t3)}
.pj-kind button.on{border-color:var(--c-brand);background:var(--c-brand-bg)}
.pj-kind button.on b{color:var(--c-brand)}
/* ★ fb#35：清单设置里的「描述留痕」勾选行 */
.pj-row .pj-chk{display:flex;align-items:flex-start;gap:8px;font-size:12.5px;color:var(--c-t2);line-height:1.5;cursor:pointer}
.pj-row .pj-chk input{margin-top:2px;flex:none}
/* ★ R381：宽度 760→800px / 圆角 12→20px（=滴答实测 800×680 @ r=20）。
   ⚠ 重要：上面版写在 `.set-modal`(特异性 0,1,0) 上时**不生效**——
   外链样式表 `/opt/ui/shuobang-ui.css:186` 的 `.modal{width:min(760px,96vw);border-radius:var(--r-lg)}`
   在内联 <style> **之后** 加载、同特异性 → 后者胜 → 实测仍为 760px/r=12px。
   修法 = 提到 **ID 级** `#setMask .set-modal`(特异性 1,1,0) → 胜过外链，
   且只影响设置页、不动全局 `.modal`（全局弹窗仍是 760px，不能误伤）。 */
#setMask .set-modal{width:800px;max-width:94vw;border-radius:20px}
.set-head{display:flex;align-items:center;padding:14px 18px;border-bottom:1px solid var(--c-line-2)}
.set-head h3{margin:0;font-size:16px}
.set-x{margin-left:auto;cursor:pointer;color:var(--c-t3);font-size:20px;line-height:1}
.set-x:hover{color:var(--c-t1)}
.set-body{display:flex;min-height:380px;max-height:74vh}
/* ★ R381：导航宽 150→212px = 滴答实测 212px */
.set-nav{width:212px;flex:none;border-right:1px solid var(--c-line-2);padding:10px 8px}
/* ★ R381：字号 13.5→14px = 滴答实测 14px */
.set-nav .sn{padding:8px 10px;border-radius:7px;font-size:14px;color:var(--c-t2);cursor:pointer}
.set-nav .sn:hover{background:var(--c-surface-2)}
.set-nav .sn.on{background:var(--c-brand-bg);color:var(--c-brand);font-weight:600}
.set-main{flex:1;min-width:0;padding:14px 18px;overflow:auto}
.tpl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:12px}
.tpl-card{border:1px solid var(--c-line);border-radius:10px;padding:10px 12px;background:var(--c-surface);position:relative}
.tpl-card:hover{border-color:var(--c-brand)}
.tc-h{font-size:13.5px;font-weight:600;color:var(--c-t1);display:flex;align-items:center;gap:6px}
.tc-ops{margin-left:auto;opacity:0;display:flex;gap:2px}
.tpl-card:hover .tc-ops{opacity:1}
.tc-ops button{border:0;background:transparent;cursor:pointer;font-size:12px;color:var(--c-t3);padding:2px 4px;border-radius:5px}
.tc-ops button:hover{background:var(--c-surface-2);color:var(--c-brand)}
.tc-t{font-size:12.5px;color:var(--c-t2);margin-top:6px}
.tc-c{font-size:12px;color:var(--c-t3);margin-top:6px;white-space:pre-wrap;line-height:1.6;max-height:70px;overflow:hidden}
.tc-i{font-size:12px;color:var(--c-t3);margin-top:6px;line-height:1.7}
.tpl-empty{grid-column:1/-1;text-align:center;color:var(--c-t3);font-size:13px;padding:36px 0;line-height:1.9}
.tpl-empty span{font-size:12px}
.tpl-foot{margin-top:14px;display:flex;align-items:center;gap:12px}
.tpl-hint{font-size:12.5px;color:var(--c-brand);cursor:pointer}
.tpl-hint:hover{text-decoration:underline}
.tpl-edit{margin-top:14px;border:1px dashed var(--c-line);border-radius:10px;padding:12px 14px}
.tpl-edit label{display:block;font-size:12.5px;color:var(--c-t2);margin-bottom:8px}
.tpl-edit input,.tpl-edit textarea{width:100%;margin-top:4px;border:1px solid var(--c-line);border-radius:8px;
  background:var(--c-surface);color:var(--c-t1);font:inherit;font-size:13px;padding:6px 8px}
.tpl-edit .te-h{font-size:13.5px;font-weight:600;margin-bottom:10px}
.tpl-edit .te-f{text-align:right;display:flex;gap:8px;justify-content:flex-end}
.am-tpls{max-height:220px;overflow:auto}
.am-tpls .at{display:flex;align-items:center;gap:8px;padding:8px 8px;border-radius:7px;cursor:pointer;font-size:13px;color:var(--c-t2)}
.am-tpls .at:hover{background:var(--c-surface-2);color:var(--c-t1)}
.sec{font-size:11.5px;color:var(--c-t3);padding:8px 12px 3px;font-weight:600;display:flex;align-items:center}
.sec .add{margin-left:auto;cursor:pointer;color:var(--c-brand);font-weight:700}
#side .ft{border-top:1px solid var(--c-line);padding:8px;display:flex;gap:6px}
/* 底部固定组：只展示图标 + 名称 + 计数，钉在侧栏最下边（不随 .lists 滚动） */
#side .sfoot{border-top:1px solid var(--c-line);padding:6px 0 4px}
#side .sfoot:empty{display:none}
/* 滴答实测：过滤器区下方有一行灰字说明 */
.ftip{font-size:12px;color:var(--c-t3);line-height:1.5;padding:2px 12px 8px}
.archli{margin-top:2px}
.arow{display:flex;align-items:center;gap:8px;height:36px;padding:0 4px;border-radius:6px}
.arow .pdot{width:10px;height:10px;border-radius:50%;flex:none}
.arow .abtn{flex:none;font-size:12px;color:var(--c-brand);background:none;border:1px solid var(--c-line);
  border-radius:6px;padding:2px 8px;cursor:pointer;font-family:inherit}
.arow .abtn:hover{background:var(--c-surface-2)}
/* 摘要整页（与 #mx 同一套显隐机制：用 class，不用内联 display） */
/* 行左侧彩色竖条（滴答实测）：所属清单色；没色时留一条极浅的占位，保证所有行对齐 */
.task .tbar{position:absolute;left:16px;top:2px;bottom:2px;width:3px;border-radius:0;background:transparent;z-index:1}
.task.done .tbar{opacity:.35}
/* 清单分组头（滴答第 2 层）：顺延动作形态统一由下方 `#tasks` 作用域规则定义；
   滴答四态实测（`_dida_r67_hover1.out` B①~B⑤）text-decoration 恒 none ⇒ 不设 :hover 下划线。 */
/* 时间块说明（浅灰提示）：块的功能定义，没写就不占位 */
/* ★★ 2026-09-18 可点的时间块行（点一下开右侧详情抽屉）*/
.wsrowclick{cursor:pointer;border-radius:8px}
.wsrowclick:hover h4,.wsrowclick:hover span{color:var(--c-t1)}
.wsslotdesc{color:var(--c-t3);font-size:12.5px;line-height:1.6;margin:-4px 0 10px}
/* 右侧详情抽屉（工作区）——点分区/颗粒 → 这里显示说明与笔记 */
#wsDrawer{position:fixed;top:0;right:0;bottom:0;width:390px;max-width:94vw;background:var(--c-surface);
  border-left:1px solid var(--c-line);z-index:70;display:none;flex-direction:column;
  box-shadow:-10px 0 30px rgba(16,24,40,.10)}
#wsDrawer.on{display:flex}
#wsDrawer .dh{display:flex;align-items:center;gap:8px;padding:14px 16px;border-bottom:1px solid var(--c-line)}
#wsDrawer .dh b{flex:1;font-size:15px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#wsDrawer .db{flex:1;min-height:0;overflow:auto;padding:14px 16px 22px}
#wsDrawer .ds{margin-bottom:16px}
#wsDrawer .ds>label{display:block;font-size:12px;color:var(--c-t3);margin-bottom:6px}
#wsDrawer .ds .hint{font-size:12px;color:var(--c-t3);line-height:1.6}
#wsDrawer textarea{width:100%;box-sizing:border-box;border:1px solid var(--c-line);border-radius:8px;
  background:var(--c-surface);color:var(--c-t1);padding:9px 10px;font-size:13px;line-height:1.75;resize:vertical}
#wsDrawer textarea:focus{outline:2px solid var(--c-brand);outline-offset:1px}
#wsDrawer .dkv{display:flex;gap:8px;flex-wrap:wrap;font-size:12.5px;color:var(--c-t2)}
#wsDrawer .dkv span{background:var(--c-surface-2);border-radius:6px;padding:2px 8px}
#sum{display:none;flex-direction:column;overflow:hidden;flex:1;min-height:0}
#sum.on{display:flex}
/* ★ 2026-10-06 r294 · 决策 2（老板 2026-10-06 批复「默认直接对齐滴答⇔不需要申请」）：
   **摘要页「选中文字」高亮色**对齐滴答。真值（两侧均为**真像素众数**，非计算样式）：
   · 滴答 = rgb(186,215,251)（#BAD7FB，`.CodeMirror-selected` 独立图层）—— `_regress_logs/_dida_r90_pix.out`
   · 我方旧值 = rgb(219,234,254)（#DBEAFE）—— `_regress_logs/_our_r90_pix.out`
   ⚠️ 旧值来自**共享设计层** `/ui/shuobang-ui.css:68 ::selection{background:#dbeafe}`（14+ 页共用）
   ⇒ 按批复**只在本页覆盖**，不动共享文件；ID 前缀特异性(1,0,1) > 共享层 (0,0,1) ⇒ 与源序无关。
   两个选择器分别覆盖子树（`#sum ::selection`）与容器自身（`#sum::selection`）。 */
#sum::selection,#sum ::selection{background:rgb(186,215,251)}
/* ★ 2026-09-24 r80 对齐滴答（摘要页头部）：头部行盒 padding `0 20px 9px` + body `15px 0 0` ⇒ 我方 `.smh` `15/18/9`（行盒 46→58）；标题 H5 **20px/600/lh34**；头部右图标悬停底层 30×30/br8；工具栏行盒 36+1（我方 43→37）。横向缩进（18/22 vs 20/33）与底线色未动（待拍板）*/
#sum .smh{padding:15px 18px 9px;display:flex;align-items:center;justify-content:space-between;gap:10px}
#sum .smt{font-size:20px;font-weight:600;line-height:34px;color:var(--c-t1)}
/* 右侧图标组（滴答实测：标题右侧一个「插入/导出」图标）*/
#sum .smhic{display:flex;align-items:center;gap:2px;flex:none}
#sum .smhic button{width:30px;height:30px;min-height:0;padding:0;border:0;background:transparent;border-radius:8px;
  color:var(--c-t2);display:inline-flex;align-items:center;justify-content:center;cursor:pointer}
#sum .smhic button:hover{background:var(--c-surface-2);color:var(--c-t1)}
#sum .smd{margin-top:4px;color:var(--c-t3);font-size:12.5px}
#sum .smf{display:flex;gap:8px;flex-wrap:wrap;align-items:center;padding:12px 18px;border-bottom:1px solid var(--c-line)}
/* 筛选条：控件一律紧凑 + 定宽，**不允许换行**（2026-09-15 实测：日期框没定宽会各占一整行） */
#sum .smf select,#sum .smf input[type=date]{height:30px;flex:none;border:1px solid var(--c-line);border-radius:8px;
  background:var(--c-surface);color:var(--c-t1);padding:0 8px;font-size:13px}
#sum .smf select{max-width:168px}
#sum .smf input[type=date]{width:148px}
#sum .smtb{display:flex;gap:6px;padding:5px 18px;border-bottom:1px solid var(--c-line)}
#sum .smtb button{width:26px;height:26px;min-height:0;padding:0;border:0;border-radius:8px;background:transparent;color:var(--c-t2);
  font-size:14px;cursor:pointer}
#sum .smtb button:hover{background:var(--c-surface-2)}
/* ★ 2026-09-24 r79 对齐滴答：工具栏**分组竖线**（滴答 `div.md-tl-divider-2/3/4` = 1×16 · `border-left:1px` · `opacity:.12`）
   可比口径 = **悬停盒**：滴答相邻悬停盒间距 32、跨组 20（竖线距左盒右缘 9 / 距右盒左缘 10：实测 425−416 与 436−426）
   ⇒ 我方 gap 6 + margin-left 3 + 线 1 + margin-right 4 + gap 6 = **20，逐值一致**；分组边界 [3][3][5][3] 同滴答 */
#sum .smtb .tbsep{flex:none;align-self:center;width:1px;height:16px;background:var(--c-t1);opacity:.12;margin:0 4px 0 3px}
/* ★ 2026-09-15 对齐滴答：摘要 = 左正文 + 右属性区（约 340 宽）*/
#sum .smwrap{flex:1;min-height:0;display:flex;align-items:stretch}
#sum .smcol{flex:1;min-width:0;display:flex;flex-direction:column}
#sum .smaside{width:516px;flex:none;border-left:0;overflow:auto;padding:15px 20px 0}
#sum .smaside .asb{padding:0 0 12px}
#sum .smaside .ast{height:20px;line-height:20px;font-size:14px;font-weight:600;color:var(--c-t1);
  margin:6px 0 10px;display:flex;align-items:center;gap:6px}
#sum .smaside .asr{display:flex;align-items:center;justify-content:space-between;gap:10px;
  min-height:40px;font-size:14px;color:var(--c-t1);cursor:pointer;border-radius:8px;padding:0 18px}
#sum .smaside .asr:hover{background:var(--c-surface-2)}
#sum .smaside .asr .asv{color:rgba(25,25,25,.6);display:flex;align-items:center;gap:4px;font-size:14px}
#sum .smaside .asr .asv .arw{font-size:9px;opacity:.6}
#sum .smaside .asplus{width:26px;height:26px;border:1px dashed var(--c-line);border-radius:7px;
  background:transparent;color:var(--c-t3);cursor:pointer;font-size:15px;line-height:1}
#sum .smaside .asplus:hover{color:var(--c-brand);border-color:var(--c-brand)}
#sum .smaside .asrow{display:flex;align-items:center;justify-content:space-between;gap:10px;
  min-height:40px;font-size:14px;color:var(--c-t1);padding:0 18px}
#sum .smaside .asrow.off{opacity:.5}
html[data-theme="dark"] #sum .smaside .asr .asv{color:rgba(255,255,255,.6)}
#sum .smaside .asnote{font-size:11.5px;color:var(--c-t3);padding:0 18px 2px;line-height:1.5}
/* 开关（滴答：OFF 态灰色）*/
#sum .asw{width:36px;height:20px;border-radius:10px;background:var(--c-line);position:relative;
  flex:none;transition:background .15s}
#sum .asw::after{content:'';position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;
  background:#fff;transition:transform .15s}
#sum .asw.on{background:var(--c-brand)}
#sum .asw.on::after{transform:translateX(16px)}
#sum .smtb button.on{background:var(--c-brand-bg);color:var(--c-brand)}
#sum .smb{flex:1;min-height:0;overflow:auto;padding:14px 22px 20px}
#sum .smed{outline:0;line-height:1.85;font-size:14px;color:var(--c-t1);min-height:200px}
#sum .smed h3{margin:14px 0 6px;font-size:15px}
#sum .smed ul{margin:6px 0;padding-left:20px}
#sum .smed li{margin:2px 0}
#sum .smbar{display:flex;gap:8px;justify-content:flex-end;padding:10px 18px;border-top:1px solid var(--c-line)}
/* ⚠ 2026-09-15 修「越界」：未读徽标原是在流内的 inline-block，会把铃铛按钮撑宽 38→55px，
   整行溢出侧栏 14px 被裁切。改为**绝对定位**（不参与布局），并让按钮可收缩兜底。 */
#side .ft .btn{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#side .ft .nbBtn{position:relative;overflow:visible}
#side .ft .nbBtn #nb{position:absolute;top:-4px;right:-6px;line-height:1;pointer-events:none}
#main{flex:1;display:flex;flex-direction:column;min-width:0}

/* ── 三栏**可拖拽调宽**（2026-09-28 r117 · 对齐滴答真值；实现与真值见 JS 段 `LAY*` 注释）──
   滴答：拖拽件 5px / 全高 / **背景透明** / `cursor:ew-resize`，只靠光标形状提示；
   两条边界 = 列表栏右缘（改 `leftListWidth`）+ 详情栏左缘（改 `rightViewWidthPercent`）。
   ⚠️ 图标栏（`#rail` 52px）与滴答一样**不可拖**。 */
#app{position:relative}
.rsz{position:absolute;top:0;bottom:0;width:5px;z-index:30;cursor:ew-resize;background:transparent}

/* ── 任务「指派」菜单（2026-09-28 r118 · **按滴答真值**：容器 164 宽 / z1050 / 圆角 12 / pad `4px 0`；
      项 **34 高** / 内 `padding:0 12px`；第 1 项「不指派」；当前值右侧打勾。真值见 `_dida_r118e.out`。
      头像：**有 `avatar` 用图，无则姓名首字彩色圆**（企微 API 的 avatar 实测全空，见本轮报告）。 */
.asg-menu{position:fixed;z-index:1050;width:164px;background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:12px;padding:4px 0;box-shadow:0 6px 20px rgba(0,0,0,.14);overflow:hidden}
.asg-i{display:flex;align-items:center;gap:8px;height:34px;padding:0 12px;cursor:pointer;
  font-size:13px;line-height:34px;color:var(--c-t1)}
.asg-i:hover{background:var(--c-surface-2)}
.asg-av{width:20px;height:20px;border-radius:50%;flex:none;display:inline-flex;align-items:center;
  justify-content:center;font-size:11px;color:#fff;overflow:hidden;box-sizing:border-box}
img.asg-av{object-fit:cover}
.asg-av.none{background:transparent;color:var(--c-t3);border:1px solid var(--c-line)}
.asg-n{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.asg-ck{flex:none;color:var(--c-brand);font-size:12px}
/* 顶栏那颗「指派」按钮：**只在共享清单显示**（默认藏，取到成员后再定）*/
/* 指派按钮：**独立控件**（不复用 `.dt-flag` —— 滴答里它也是独立的 `btn-item.td-assign`，
   且复用会导致「顶栏 flag 数」类断言变化；30×30 热区 / 20×20 图标，照滴答）。 */
.dt-asgbtn{width:30px;height:30px;flex:none;display:inline-flex;align-items:center;justify-content:center;
  border-radius:7px;cursor:pointer;color:var(--c-t3)}
.dt-asgbtn:hover{background:var(--c-surface-2);color:var(--c-t1)}
.dt-asgbtn svg{width:20px;height:20px}
body.rszing{cursor:ew-resize}
body.rszing,body.rszing *{user-select:none!important}

/* ── 通用「取值」浮层（r119）：替代浏览器原生 `prompt()` ──
   为什么不用 prompt：**企微内置浏览器 / iOS WebView 不保证支持**（返回 null ⇒ 调用处静默失效，
   表现为「点了没反应、也没报错」= 老板第 7 条）。本浮层是**页面内**的，任何环境都可用，
   且 Enter 提交 / Esc 取消 / 点遮罩取消，焦点与全选都自动做好。 */
.askmask{position:fixed;left:0;right:0;top:0;bottom:0;background:rgba(0,0,0,.28);z-index:1200;
  display:flex;align-items:flex-start;justify-content:center;padding-top:16vh}
.askbox{width:360px;max-width:calc(100vw - 32px);background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:12px;box-shadow:0 10px 30px rgba(0,0,0,.18);padding:16px}
.askt{font-size:14px;font-weight:600;color:var(--c-t1);margin:0 0 10px}
.askin{width:100%;box-sizing:border-box;height:34px;border:1px solid var(--c-line);border-radius:8px;
  background:var(--c-surface);color:var(--c-t1);font-size:13.5px;padding:0 10px;outline:none}
.askin:focus{border-color:var(--c-brand)}
.askb{display:flex;justify-content:flex-end;gap:8px;margin-top:12px}
#top{height:52px;border-bottom:1px solid var(--c-line);background:var(--c-surface);display:flex;align-items:center;gap:8px;padding:0 14px;flex:none;position:relative}
#top h2{font-size:20px;font-weight:600;flex:none}   /* ★ C1 对齐滴答：20px / 600 */
.btn{border:1px solid var(--c-line);background:var(--c-surface);border-radius:8px;padding:6px 12px;font-size:13px;cursor:pointer;color:var(--c-t1)}
.btn:hover{background:var(--c-surface-2)}.btn.pri{background:var(--c-brand);color:#fff;border-color:var(--c-brand)}
.btn.sm{padding:3px 8px;font-size:12px}
.seg{display:flex;border:1px solid var(--c-line);border-radius:8px;overflow:hidden}
.seg button{border:0;background:var(--c-surface);padding:6px 12px;font-size:13px;cursor:pointer;color:var(--c-t1)}
.seg button.on{background:var(--c-brand);color:#fff}
/* ★★ 2026-09-19 老板拍板「跟滴答对齐」：清单页顶栏那排
   「列表/看板/时间线」**永久下线**（滴答没有这排；视图切换只在右上 ⋯ 菜单的「视图」图标行）。
   ⚠️ **必须用 CSS 兜底**：`_applyView()` 只在切视图时才设 inline display，
      **首屏没有它** ⇒ 只改 JS 的话首屏仍会露出来（本轮实测踩到：`segDisp: "flex"`）。
      DOM 保留以便回退（回退时删这条 + 把三处 JS 改回按视图显隐）。 */
#seg{display:none}
/* ══ 2026-09-19 C3：清单「⋯ 菜单」对齐滴答（面板几何 + 视图切换图标行）══
   滴答真值（_dida_viewsw2.js）：面板 164×222 · br12 · pad 4px 0 · 1px rgba(25,25,25,.1)
   · shadow rgba(0,0,0,.2) 0 5px 18px；「视图」标签 dx17 dy15 fs12/40%；3 个 22×22 图标 dx 17/71/125（步进 54）
   · 选中蓝 rgb(71,114,250) · hover 底 32×32 br8 rgba(25,25,25,.05)；分隔线 dx1 w162 h1 my4；菜单项 h34 pad 0 12px fs13 icon18@dx12 文字@dx38
   ⚠️ 全局 button{min-height:var(--h-ctl)}(=34px) 会把 22×22 图标按钮撑成 22×34
      ⇒ **必须显式写 min-height:22px**（这是本日第二次踩同一个坑）
   ⚠️ 全部只写 #pmenu：.menu 是共用类（#mxQMenu/#calMenu 也用） */
#pmenu{min-width:164px;border-radius:12px;border-color:rgba(25,25,25,.1);padding:4px 0;
  box-shadow:0 5px 18px rgba(0,0,0,.2)}
#pmenu .vlab{height:15px;line-height:15px;margin:10px 0 12px 16px;font-size:12px;color:rgba(25,25,25,.4)}
#pmenu .vsw{display:flex;gap:32px;margin:0 0 12px 16px;height:22px}
#pmenu .vsb{position:relative;width:22px;height:22px;min-height:22px;display:flex;align-items:center;justify-content:center;
  border:0;background:transparent;padding:0;cursor:pointer;color:var(--c-t1);border-radius:0}
#pmenu .vsb::before{content:'';position:absolute;left:-5px;top:-5px;width:32px;height:32px;
  border-radius:8px;background:transparent;transition:background .12s}
#pmenu .vsb:hover::before{background:rgba(25,25,25,.05)}
#pmenu .vsb svg{position:relative;width:22px;height:22px;flex:none}
#pmenu .vsb.on{color:#4772FA}
#pmenu .sep{margin:4px 0;background:rgba(25,25,25,.05)}
#pmenu .it{height:34px;padding:0 12px;display:flex;align-items:center;gap:8px;font-size:13px;border-radius:0}
#pmenu .it svg{width:18px;height:18px;flex:none}
html[data-theme="dark"] #pmenu{border-color:rgba(255,255,255,.12);box-shadow:0 5px 18px rgba(0,0,0,.5)}
html[data-theme="dark"] #pmenu .vlab{color:rgba(255,255,255,.4)}
html[data-theme="dark"] #pmenu .vsb:hover::before{background:rgba(255,255,255,.06)}
html[data-theme="dark"] #pmenu .sep{background:rgba(255,255,255,.08)}
#body{flex:1;display:flex;min-height:0}
#list{flex:1;overflow-y:auto;overflow-x:hidden;padding:12px 0;min-width:0}
/* ★ 2026-09-15 对齐滴答：详情面板常驻双栏 **615 宽**（实测 detail-view-wrapper）
   布局 = 列表区 854 + 面板区 615 + 图标栏 50 + 侧栏 239 = 1758 ≈ 滴答 1759 */
#detail{width:615px;border-left:1px solid var(--c-line);background:var(--c-surface);overflow-y:auto;flex:none;display:flex;flex-direction:column}
/* 宽屏：右侧详情区「常驻」——没选中任务时显示引导占位（对齐滴答）；窄屏见 @media(max-width:860px) */
#detail.hide{display:flex}
/* ══ 详情面板（滴答清单风格 · 2026-09-12 重构）══ */
/* ══ 2026-09-18 对齐滴答真机：顶栏是**两行**，不是一行 ══
   滴答：`.header` 614×48 `pad 9px 24px`（**只有** 📅日期胶囊 + 右端 ⓘ）
        → `.caption-section` 614×49（标题 fs19/700）
   我们原来把「属性 + 标题 + 一堆按钮」挤在同一行（`.dt-acts{order:-1}` 是标题的兄弟）→ 现拆两行。 */
/* ⚠️ 必须 flex:none —— `#detail` 是纵向 flex，只给 min-height 会被撑满（实测曾变 366px） */
/* ★ 滴答 `.caption-section` 614×49：标题 y=72（内边距 16px）· 左内 25 / 右内 20 */
.dt-head{position:sticky;top:48px;z-index:3;background:var(--c-surface);flex:none;
  min-height:49px;display:flex;align-items:center;gap:8px;padding:16px 20px 4px 25px;
  border-bottom:0;flex-wrap:nowrap}
.dt-title{flex:1;min-width:0;display:flex;gap:8px;align-items:center}
.dt-title .chk{margin-top:4px}
/* ★ 滴答：标题 fs 19px / fw 700（原来 16/650） */
/* ★ 滴答：fs19 / fw700 / lh27（行盒 29px）*/
.dt-title textarea{flex:1;font-size:19px;font-weight:700;line-height:27px;border:0;background:transparent;
  color:var(--c-t1);outline:none;resize:none;overflow:hidden;padding:0;min-height:29px;max-height:29px;font-family:inherit}
/* 任务名「就地可改」：聚焦有描边，一眼看出是输入框。
   ★ r96 按滴答真值删掉悬停底色 —— 滴答标题位悬停零反馈（双方各 3/3 样本）；2026-09-14 的「悬停有底色」提示作废。*/
.dt-title textarea{cursor:text;border-radius:7px;padding:1px 6px;margin:-1px -6px;transition:background .12s,box-shadow .12s}
.dt-title textarea:focus{background:var(--c-surface);box-shadow:0 0 0 3px var(--c-brand-bg)}
.dt-x{width:24px;height:24px;min-height:0;border:0;background:transparent;color:var(--c-t3);font-size:18px;line-height:1;cursor:pointer;
  padding:0;border-radius:5px;flex:none;display:inline-flex;align-items:center;justify-content:center}
.dt-x:hover{background:var(--c-surface-2);color:var(--c-t1)}
/* ══ 属性条 = 滴答的 `.header`（独立顶行 48px，pinned 在标题之上）══ */
/* ★★ 2026-09-18 对齐滴答真机：h48 · 左内 25 / 右内 20 · 底部 1px 分隔线 */
.dt-acts{display:flex;align-items:center;gap:2px;flex:none;height:48px;padding:8px 19px 8px 24px;
  border-bottom:1px solid var(--c-line-2);margin-top:8px;   /* ★ 滴答 header 从 y=8 起（面板留 8px）*/
  position:sticky;top:0;z-index:4;background:var(--c-surface)}
/* 属性胶囊：灰字、无边框、hover 出浅底（滴答：`text-grey-40` + `hover-bg`）*/
/* ★★ r111：改前是「一个整体胶囊」（图标与文字共用 `padding:0 8px`、`gap:5px`）；
   滴答实测是**两段**：`A.td-time`（图标段 **28×30 · pad `0 4px`**）+ `A.td-preview`（文字段，右内 5px）
   ⇒ 外层改为**无内边距的容器**，内边距下放到 `.dt-cal` / `.lbl`（见下方部件规则）。 */
.dt-acts .dt-ic{display:inline-flex;align-items:center;gap:0;border:0;background:transparent;
  color:rgba(25,25,25,.4);font-size:14px;cursor:pointer;height:30px;padding:0;border-radius:8px;
  overflow:hidden;white-space:nowrap;transition:background .12s,color .12s}
.dt-acts .dt-ic:hover{background:rgba(25,25,25,.05);color:var(--c-t1)}
/* ★ 2026-09-26 r107：滴答真机 —— 图标 `text-primary`（品牌蓝）· 文字 rgb(25,25,25) · hover 底 rgba(25,25,25,.05) */
.dt-acts .dt-ic.set{color:var(--c-t1)}
.dt-acts .dt-ic.set .lbl{color:#4772fa}   /* r107c：滴答有日期时**文字也是品牌蓝**（并排目视取真值）*/
.dt-acts .dt-ic.set .dti{color:#4772fa}   /* 滴答 text-primary = #4772FA（我方 --c-brand 是 #2d6ff7；按老板「像滴答」口径取滴答值）*/
.dt-acts .dt-ic .lbl{line-height:1;max-width:180px;overflow:hidden;text-overflow:ellipsis}
/* 右端 ⓘ（滴答 header 右端 20×20，hover 出 30×30 br8 底）*/
.dt-acts .dt-info{margin-left:auto;width:30px;height:30px;flex:none;display:inline-flex;align-items:center;
  justify-content:center;border-radius:8px;color:rgba(25,25,25,.4);cursor:pointer;border:0;background:transparent}
.dt-acts .dt-info:hover{background:rgba(25,25,25,.05);color:var(--c-t1)}
/* ══ 2026-09-18 滴答真机顶部栏部件 ══
   ☐ 17×17（边框色 = 优先级色）· 竖线 · 📅20×20 · ↻16×16 · 右端旗 20×20（恒显）*/
.dt-acts .chk{width:17px;height:17px;font-size:11px}
/* ★★ 2026-09-18 对齐滴答实测（分组=优先级逐组读复选框色）：
     高 = rgb(225,62,57) = #E13E39 · 中 = rgb(250,168,12) = #FAA80C · 无 = rgba(25,25,25,.4)
     （「低」档老板账号里没有数据 ⇒ **沿用我方原来的品牌蓝** #4772FB，账本里标注待核）
   抽成**共用规则**（去掉 `.dt-acts` 前缀）⇒ **列表行的圈也按优先级变色**（原来只有详情面板变色）。 */
.chk.pri-5{border-color:#E13E39}
.chk.pri-3{border-color:#FAA80C}
.chk.pri-1{border-color:#4772FB}
.chk.pri-0{border-color:var(--c-t3)}
.dt-acts .dt-sep{width:1px;height:16px;flex:none;background:rgba(25,25,25,.18);margin:0 5px 0 6px}
.dt-acts .dt-ic svg,.dt-acts .dt-ic .dti{width:20px;height:20px}
.dt-acts .dt-rep svg,.dt-acts .dt-rep .dti{width:16px;height:16px}
/* 日期「过期/今天」= 滴答 text-dark-red rgb(224,49,49) */
.dt-acts .dt-ic.due-red,.dt-acts .dt-ic.due-red .lbl,.dt-acts .dt-ic.due-red .dti{color:#e03131}
.dt-acts .dt-flag{margin-left:auto;width:30px;height:30px;flex:none;display:inline-flex;align-items:center;
  justify-content:center;border-radius:8px;cursor:pointer;border:0;background:transparent}
.dt-acts .dt-flag:hover{background:rgba(25,25,25,.05)}
.dt-acts .dt-flag svg{width:20px;height:20px}
html[data-theme="dark"] .dt-acts .dt-sep{background:rgba(255,255,255,.2)}
.dt-ic{display:inline-flex;align-items:center;gap:5px;border:0;background:transparent;color:var(--c-t3);font-size:12.5px;cursor:pointer;height:30px;padding:0 6px;border-radius:6px;white-space:nowrap;transition:background .12s}
.dt-ic:hover{background:var(--c-surface-2);color:var(--c-brand)}
.dt-ic.on{color:var(--c-t1)}
.dt-ic.warn:hover{border-color:var(--c-bad);color:var(--c-bad)}
/* ★★ 2026-09-18 滴答顶部栏度量（必须在上面这条 `.dt-ic` 全局规则**之后**，否则 fs 被它盖掉）
   ☐25..42 → 竖线 → 📅63 → 文字 87 | 右端旗贴右 x=575（右内 19）
   ★★ r111 复核（`_dida_r111_col3.out` 三态实测）：日期区两段式 ——
     图标段 `A.td-time` **28×30 · pad `0 4px`** · svg 20×20（`use` 实渲染 15×15）；
     文字段 `A.td-preview` 右内 **5px**；重复图标 `preview-repeat` **16×16 · `ml 6px` · color rgb(25,25,25)**。 */
.dt-acts .dt-ic{gap:0;padding:0;font-size:14px}
/* ★★ r111 两段式部件。⚠️ 必须排在上方 `.dt-ic.set .dti{color:#4772fa}`（407 行）**之后**：
   同特异性（0,4,0）⇒ 后出现者胜 ⇒ 重复图标在**有日期 / 过期**时也保持黑
   （滴答过期态实测：日期图标与文字都红 `rgb(224,49,49)`，但**重复图标仍是 `rgb(25,25,25)`**、不变红）。
   `.dt-rep` 色走 `--c-t1` 令牌（浅色 `#191919` ≈ 滴答 `rgb(25,25,25)`；暗色自动反白）。 */
.dt-acts .dt-cal{flex:none;width:28px;height:30px;display:inline-flex;align-items:center;justify-content:center;padding:0 4px}
.dt-acts .dt-ic .lbl{padding-right:5px}
.dt-acts .dt-ic .dt-rep{flex:none;margin-left:6px;display:inline-flex;align-items:center;color:var(--c-t1)}
/* ★★ QI-2005：已设提醒指示。与 .dt-rep 同层级（日期胶囊内），无提醒时**不渲染**。
   颜色走 --c-t1（浅色 #191919），与重复图标一致；数量角标是唯一用品牌色的地方。*/
.dt-acts .dt-ic .dt-rem{flex:none;margin-left:6px;display:inline-flex;align-items:center;color:var(--c-t1);position:relative}
.dt-acts .dt-ic .dt-rem .dti{color:var(--c-t1);width:16px;height:16px}
.dt-acts .dt-ic .dt-rem .n{position:absolute;top:-5px;left:11px;font-style:normal;font-size:9px;line-height:12px;
   min-width:12px;height:12px;padding:0 3px;border-radius:6px;background:var(--c-brand);color:#fff;text-align:center}
.dt-acts .dt-ic .dt-rep .dti{color:var(--c-t1)}
.dt-acts .dt-flag{justify-content:flex-end}
/* ★★ 描述**逐行成段**：段间 8px（滴答段行距 29 = lh21 + 8）。
   注意我方每行渲染成 `<div>`（不是 `<p>`），只写 p 不生效。 */
.dt-descwrap #descIn>div{margin:0 0 8px}
/* 优先级旗帜组 */
/* ★ 2026-09-19 B1：**无优先级旗 = 60% 灰** —— 滴答 `#priority-0` 的 path 没有 fill，
   实例渲染色实测 `rgba(25,25,25,.6)`；我方原来继承容器色 = **100% 黑**（偏黑一档）。
   ★ 注意滴答是**两套色**：列表圆圈描边用 `#E13E39`（高），而**旗标**用 `#D52B25` —— 都对，别再「统一」。 */
.ms-i.p0,.dt-flag.p0{color:rgba(25,25,25,.6)}
html[data-theme="dark"] .ms-i.p0,html[data-theme="dark"] .dt-flag.p0{color:rgba(255,255,255,.6)}
.dt-flag{display:inline-flex;gap:1px;align-items:center;border:1px solid var(--c-line);
  border-radius:8px;padding:3px 4px;background:var(--c-surface)}
.dt-flag span{display:inline-flex;align-items:center;justify-content:center;
  cursor:pointer;font-size:12px;line-height:1;padding:3px 4px;border-radius:5px;
  opacity:.30;transition:opacity .12s}
.dt-flag span:hover{opacity:.85;background:var(--c-surface-2)}
.dt-flag span.on{opacity:1;background:var(--c-surface-2)}
/* 分区 */
.dt-body{padding:0 16px 20px;flex:1}
.dt-sec{margin-top:14px}
.dt-sec>h5{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:600;color:var(--c-t3);
  margin:0 0 8px;cursor:pointer;user-select:none;letter-spacing:.02em}
.dt-sec>h5 .cnt{color:var(--c-t3);font-weight:400}
.dt-sec>h5 .arw{font-size:9px;color:var(--c-t3);transition:transform .15s;display:inline-block}
/* ══════════════ v4 · 滴答清单式详情面板（2026-09-12）══════════════ */
/* ① 顶部 ≡ 操作菜单按钮 */
.dt-title{gap:6px}
.dt-menu-btn{width:24px;height:24px;min-height:0;border:0;background:transparent;color:var(--c-t3);cursor:pointer;padding:0;display:inline-flex;align-items:center;justify-content:center;border-radius:5px}
.dt-menu-btn:hover{background:var(--c-surface-2);color:var(--c-t1)}
.dt-menu-btn.on{background:var(--c-surface-2);color:var(--c-brand)}
/* 操作菜单面板（浮层，右侧长菜单） */
/* 滴答实测：194 宽 · padding 4px 0 · br 12 · **bd 1px rgba(25,25,25,.1)**（2026-09-18 更正：原来写「无边框」是错的，
   像素实测 4 边均 (232,232,232) 硬边；`_dida_tag_menu.js` 早已量到 bd 1px）· shadow 0 6px 24px rgba(0,0,0,.08) */
/* ★ 2026-09-18 对齐滴答：⋯ 在底栏，菜单**向上弹（dropup）**（滴答 `.dropup`，164×436） */
.dt-menu{position:absolute;right:12px;bottom:54px;top:auto;z-index:30;width:194px;background:var(--c-surface);   /* 2026-09-18 更正：滴答真机 194（上一轮误改成 164） */
  border:1px solid var(--c-line);border-radius:12px;box-shadow:0 6px 24px rgba(0,0,0,.08);   /* ★ 滴答真机有 1px 边框：负着 1px 偏移+2px 高度；`*{box-sizing:border-box}` + width:194 → 外框仍 194 */
  padding:4px 0;display:none;max-height:calc(100% - 70px);overflow:auto;overflow-x:hidden}   /* 滴答 pad 4px 0 */
.dt-menu.on{display:block}
/* ══ 2026-09-18 对齐滴答真机：「日期」「优先级」两段（各 h=68）══
   段内每格：日期 34×34 · 优先级 32×32 · 均 `br 8px`；起点 x=11、**间距 46**；
   图标：日期 **22×22** · 优先级旗 **20×20**；
   每格常态 `background rgba(25,25,25,.05)` + **`opacity:0`（hover 才显）**；
   **「优先级」段当前值 = 蓝底 `rgba(71,114,250,.1)` 且不透明**。 */
.dt-menu .sec68{height:68px;flex:none;margin:0 4px;padding:10px 6px 0;box-sizing:border-box}   /* ★ 滴答：seg 盒 x=5 w=184（= 菜单194 − 边1×2 − 外边距4×2）· pad 10px 12px 0 */
.dt-menu .sec68 .ms-t{font-size:12px;color:rgba(25,25,25,.4);line-height:16px;padding:0 0 0 6px;margin:0 0 12px}   /* ★ 滴答：label x=17 y=15 h=16 lh=16 color rgba(25,25,25,.4) */
.dt-menu .sec68 .ms-row{display:flex;align-items:center;justify-content:space-between;height:22px;padding:0}   /* ★ 滴答是 flex justify-between（不是 gap）：行宽 172、li 高 22（日期）/20（优先级） */
.dt-menu .sec68 .ms-i{width:34px;height:34px;border-radius:8px;display:inline-flex;align-items:center;
  justify-content:center;cursor:pointer;flex:none;background:transparent;transition:background .12s}
.dt-menu .sec68 .ms-i:hover{background:rgba(25,25,25,.05)}
.dt-menu .sec68 .ms-i.on{background:rgba(71,114,250,.1)}
/* ★ 滴答 sprite 图标走 24 viewBox 且是**填充**路径（本应用 .dti 默认 fill:none+stroke） */
.dti.d24{fill:currentColor;stroke:none}
.dt-menu .sec68 .ms-i .dti,.dt-menu .sec68 .ms-i svg{width:22px;height:22px}
.dt-menu .sec68.pri .ms-row{height:20px}
.dt-menu .sec68.pri .ms-i{width:32px;height:32px}
.dt-menu .sec68.pri .ms-i svg{width:20px;height:20px}
/* 二级箭头 12×12（滴答：icon-right-triangle-down） */
.dt-menu .mi .dtarw .dti{width:12px;height:12px}
/* 优先级菜单：顶部弹出、窄一点（164），定位由 JS 给 left/top */
.dt-primenu{width:164px;bottom:auto}
.dt-primenu .mi{height:34px}
.dt-primenu .mi.on{color:var(--c-brand);font-weight:600}
/* 滴答实测：条目 184×34 · padding 0 12px · 文字 13px（min-height:0 防全局 button 规则撑高） */
.dt-menu .mi{display:flex;align-items:center;gap:8px;height:34px;min-height:0;padding:0 12px;margin:0 4px;border-radius:0;font-size:14px;line-height:34px;   /* ★ 滴答：条目 184 = 菜单 194 − 边框 1×2 − 外边距 4×2；r330 字号 14px / 圆角 0 对齐滴答（实测 14px / 0px）*/
  color:var(--c-t1);cursor:pointer;box-sizing:border-box}
.dt-menu .mi:hover{background:var(--c-surface-2)}
/* ★ 滴答「删除」：**常态 rgb(25,25,25)（不是红）**，hover 才 文字+图标 都变 #E03131、行底 rgba(224,49,49,.03) */
.dt-menu .mi.del:hover{color:#e03131;background:rgba(224,49,49,.03)}
.dt-menu .mi.del:hover .dti{color:#e03131}
/* 滴答实测：条目图标 18×18、右距 8、**颜色与条目文字相同**（rgb(25,25,25)，不是灰） */
.dt-menu .mi .dti{flex:none;width:18px;height:18px}
.dt-menu .mi.warn{color:var(--c-bad)}
/* 子菜单右向箭头（2026-09-16 对齐滴答实测 icon-right-triangle-down）：
   svg 12x12、**实心**窄三角(绘制区 4x8)、与文字同色、贴菜单右缘 17px */
.dt-menu .mi .dtarw{margin-left:auto;display:inline-flex;align-items:center;flex:none}
.dt-menu .mi .dtarw .dti{width:12px;height:12px;flex:none;fill:currentColor;stroke:none}
.dt-menu .mi.warn .dti{color:var(--c-bad)}
/* 滴答实测首条：日期快捷块 184×68（标题 fs12 + 4 个 22×22 快捷图标，间距 46） */
.dt-menu .menu-section{display:block;height:68px;min-height:0;padding:10px 12px 0;box-sizing:border-box;cursor:default}
.dt-menu .menu-section:hover{background:transparent}
.dt-menu .menu-section .ms-t{font-size:12px;color:var(--c-t3);line-height:16px;margin:0 0 6px}
.dt-menu .menu-section .ms-row{display:flex;align-items:center}
.dt-menu .menu-section .ms-i{width:22px;height:22px;margin-right:24px;border-radius:6px;display:inline-flex;
  align-items:center;justify-content:center;color:var(--c-t2);cursor:pointer}
.dt-menu .menu-section .ms-i:last-child{margin-right:0}
.dt-menu .menu-section .ms-i:hover{background:var(--c-surface-2);color:var(--c-brand)}
.dt-menu .menu-section .ms-i .dti{width:22px;height:22px}
/* 滴答实测：分隔线满宽（192/194）· my 4px */
.dt-menu .msep{height:1px;background:var(--c-line);margin:4px 0}
/* ② 描述条目卡片：手柄 + 勾选框 + 文本 + 悬浮图标 */
.dt-dlist{display:flex;flex-direction:column;gap:2px}
.dt-drow{display:flex;gap:8px;align-items:flex-start;border-radius:8px;padding:4px 6px;
  transition:background .12s;position:relative}
.dt-drow:hover{background:var(--c-surface-2)}
.dt-drow .grip{color:var(--c-t3);cursor:grab;flex:none;margin-top:3px;opacity:0;transition:opacity .12s}
.dt-drow:hover .grip{opacity:.75}
.dt-drow .dchk{width:16px;height:16px;border:1.6px solid var(--c-t3);border-radius:5px;flex:none;
  margin-top:2px;cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:10px;color:#fff}
.dt-drow .dchk.on{background:var(--c-ok);border-color:var(--c-ok)}
.dt-drow .dtxt{flex:1;font-size:13.5px;line-height:1.62;color:var(--c-t2);outline:none;
  word-break:break-word;min-height:22px;padding:1px 0;white-space:pre-wrap;font-family:inherit}
.dt-drow .dtxt:empty:before{content:attr(data-ph);color:var(--c-t3)}
.dt-drow .dtxt:focus{color:var(--c-t1)}
.dt-drow.done .dtxt{text-decoration:line-through;color:var(--c-t3)}
.dt-drow .dico{display:flex;gap:1px;flex:none;opacity:0;transition:opacity .12s;margin-top:1px}
.dt-drow:hover .dico{opacity:1}
.dt-drow .dico button{border:0;background:transparent;color:var(--c-t3);cursor:pointer;
  padding:2px 4px;border-radius:5px;min-height:0;display:inline-flex;align-items:center;line-height:1}
.dt-drow .dico button:hover{background:var(--c-line);color:var(--c-t1)}
/* 描述新增行按钮 */
.dt-dadd{display:flex;align-items:center;gap:8px;padding:4px 6px;border-radius:8px;
  color:var(--c-t3);font-size:13px;cursor:pointer}
.dt-dadd:hover{background:var(--c-surface-2);color:var(--c-t2)}
/* ③ 二级内容小框化 */
.dt-chips{display:flex;flex-wrap:wrap;gap:6px}
.chip{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--c-line);
  background:var(--c-surface);border-radius:8px;padding:4px 8px;font-size:12.5px;color:var(--c-t1);
  cursor:pointer;line-height:1.35;max-width:100%}
.chip:hover{background:var(--c-surface-2);border-color:var(--c-line)}
.chip .dti{color:var(--c-t2);flex:none}
.chip.on{border-color:var(--c-brand);color:var(--c-brand);background:var(--c-brand-bg)}
.chip.on .dti{color:var(--c-brand)}
.chip b{font-weight:600}
.chip .x{color:var(--c-t3);margin-left:1px;font-size:13px;line-height:1}
.chip .x:hover{color:var(--c-bad)}
.chip.mut{color:var(--c-t3);cursor:default;border-style:dashed}
.chip.mut:hover{background:var(--c-surface);border-color:var(--c-line)}
/* 小框输入条 */
.dt-ibox{display:flex;align-items:center;gap:6px;border:1px solid var(--c-line);background:var(--c-surface);
  border-radius:8px;padding:0 8px;margin-top:6px;min-height:32px}
.dt-ibox:focus-within{border-color:var(--c-brand)}
.dt-ibox .dti{color:var(--c-t3);flex:none}
.dt-ibox input{flex:1;border:0!important;background:transparent!important;outline:none;
  font-size:12.5px;padding:6px 0!important;height:auto!important;min-height:0!important;box-shadow:none!important}
.dt-ibox .go{border:0;background:transparent;color:var(--c-brand);cursor:pointer;font-size:12.5px;
  padding:2px 4px;border-radius:5px;min-height:0;font-family:inherit}
.dt-ibox .go:hover{background:var(--c-brand-bg)}
/* ④ 底部折叠框 */
.dt-foldbox{margin-top:16px;border:1px solid var(--c-line);border-radius:10px;background:var(--c-surface);overflow:hidden}
.dt-foldbox>.fb-head{display:flex;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;
  font-size:12.5px;font-weight:600;color:var(--c-t3);user-select:none}
.dt-foldbox>.fb-head:hover{background:var(--c-surface-2)}
.dt-foldbox>.fb-head .arw{font-size:9px;color:var(--c-t3);transition:transform .15s;display:inline-block}
.dt-foldbox>.fb-head .cnt{margin-left:auto;font-size:11.5px;color:var(--c-t3);font-weight:400}
.dt-foldbox.cl>.fb-head .arw{transform:rotate(-90deg)}
.dt-foldbox>.fb-body{padding:2px 12px 12px;border-top:1px solid var(--c-line-2)}
.dt-foldbox.cl>.fb-body{display:none}
.dt-foldbox .dt-sec{margin-top:12px}
.dt-foldbox .dt-sec>h5{margin-bottom:4px}
/* 面板需要相对定位承载浮层菜单 */
#detail{position:relative}

.dt-sec.cl>h5 .arw{transform:rotate(-90deg)}
.dt-sec.cl>.dt-cnt{display:none}
/* 描述区（滴答清单风格：无框、细线分隔、聚焦时底部高亮）*/
.dt-desc{width:100%!important;border:0;border-bottom:1px solid var(--c-line-2);border-radius:0;
  background:transparent;padding:6px 0 8px;font-size:14px;line-height:1.7;color:var(--c-t2);
  resize:none;min-height:88px;font-family:inherit;outline:none;transition:border-color .15s}
.dt-desc:hover{border-bottom-color:var(--c-t3)}
.dt-desc:focus{border-bottom-color:var(--c-brand);box-shadow:0 1px 0 0 var(--c-brand);color:var(--c-t1)}
.dt-desc::placeholder{color:var(--c-t3)}
.dt-md{display:flex;gap:3px;margin-top:8px;flex-wrap:wrap;align-items:center}
.dt-md button{border:0;background:transparent;border-radius:6px;min-height:0;
  padding:3px 8px;font-size:12.5px;cursor:pointer;color:var(--c-t2);font-family:inherit;line-height:1.3}
.dt-md button:hover{background:var(--c-surface-2);color:var(--c-t1)}
.dt-md .sp{flex:1}
.dt-prev{border:0;border-bottom:1px solid var(--c-line-2);border-radius:0;background:transparent;
  padding:6px 0 8px;font-size:14px;line-height:1.7;min-height:88px;word-break:break-word;color:var(--c-t2)}
.dt-prev p{margin:0 0 8px}.dt-prev p:last-child{margin:0}
.dt-prev ul{margin:0 0 8px;padding-left:20px}
.dt-prev li{margin:2px 0}
.dt-prev mark{background:#fff3b0;color:#6b5300;padding:1px 2px;border-radius:3px}
html[data-theme="dark"] .dt-prev mark{background:#5c4a00;color:#ffe9a8}
.dt-prev .bx{display:flex;gap:6px;align-items:flex-start;margin:2px 0}
.dt-prev code{background:var(--c-surface-2);border:1px solid var(--c-line);border-radius:4px;padding:1px 4px;font-size:12px}
.dt-prev .mdh{margin:8px 0 3px;line-height:1.35;font-weight:700}
.dt-prev h3.mdh{font-size:16px}.dt-prev h4.mdh{font-size:15px}.dt-prev h5.mdh{font-size:14px}.dt-prev h6.mdh{font-size:13px;color:var(--c-t2)}
.dt-prev blockquote{margin:6px 0;padding:2px 0 2px 10px;border-left:2.5px solid var(--c-line);
  color:var(--c-t2);background:transparent}
.dt-prev blockquote p{margin:2px 0}
/* 动态 / 条目 */
.dt-act{font-size:12.5px;color:var(--c-t2);padding:4px 0;line-height:1.5;border-bottom:1px dashed var(--c-line-2)}
.dt-act:last-child{border-bottom:0}
/* ③ 卡片式快速添加条（v5）：聚焦展开，露出日期/优先级快捷键 */
/* ★★ 2026-09-19 C1 纠错：滴答的添加框是**两层**（真机 `_dida_addrow2.js`）——
      · 外层包装 = 814×39 · bg rgba(25,25,25,.03) · **border-radius 10px** · **border 1px solid transparent**
      · 内层 `.task-input` = 812×32 · 透明 · padding `3px 12px 0`
   上一轮我只量到**内层**（723×32/无底/无圆角）就据此把外层的圆角与灰底一起删了 ⇒ 错改。
   基类保持原样（搜索弹窗/过滤器弹窗共用），只由下面的 `#addbar` 做滴答倾斜。 */
.addbar{display:flex;align-items:center;gap:8px;margin-bottom:12px;background:var(--c-surface);
  border:1px solid var(--c-line);border-radius:10px;padding:2px 10px;transition:border-color .15s}
.addbar:focus-within{border-color:var(--c-brand);box-shadow:0 0 0 3px var(--c-brand-bg)}
.addbar .ab-ico{color:var(--c-brand);display:inline-flex;flex:none;opacity:.9}
.addbar input{flex:1;border:0!important;background:transparent!important;border-radius:0;padding:8px 0;
  font-size:14px;outline:none;color:var(--c-t1);box-shadow:none!important;height:auto;min-height:0}
.addbar .ab-ops{display:flex;gap:2px;align-items:center;flex:none;max-width:0;overflow:hidden;
  opacity:0;transition:max-width .18s,opacity .18s}
.addbar:focus-within .ab-ops{max-width:220px;opacity:1}
.addbar .ab-ops button{border:0;background:transparent;color:var(--c-t3);cursor:pointer;padding:4px 6px;
  border-radius:6px;min-height:0;font-size:12px;line-height:1;display:inline-flex;align-items:center;gap:4px;font-family:inherit}
.addbar .ab-ops button:hover{background:var(--c-surface-2);color:var(--c-brand)}
.ab-hint{font-size:11.5px;color:var(--c-t3);margin:-6px 2px 10px;line-height:1.5}
#abHint{margin:-6px 22px 10px}
.ab-hint b{color:var(--c-brand);font-weight:600}
/* ★★ 2026-09-18 自然语言识别 chip（滴答同款：浅蓝底 + 蓝字 + 圆角，点在输入框内左侧）*/
.abnl{display:inline-flex;gap:4px;flex:none;align-items:center;margin-right:6px}
.abnl i{font-style:normal;background:var(--c-brand-bg);color:var(--c-brand);border-radius:6px;
  padding:1px 7px;font-size:12.5px;line-height:1.5;cursor:pointer;white-space:nowrap}
.abnl i:hover{text-decoration:line-through;opacity:.75}
/* ★★ R153（2026-10-08）：分组内**原地**添加任务行（对齐滴答 · 点分组头「＋」就地出输入框）── */
/* ★★ fb#34 全改：列表分区「＋」的「无标题」任务行 = 与看板列内新建同形态 */
.zinline{display:flex;align-items:center;gap:8px;margin:2px 16px 8px;padding:8px 10px;
  border-radius:8px;background:var(--c-surface-2)}
.zinline>input{flex:1;min-width:0;border:0;outline:0;background:transparent;font-size:14px;
  color:var(--c-t1);padding:9px 0;font-family:inherit}
.zinline>input::placeholder{color:var(--c-t3)}
.zinline::before{content:"";width:17px;height:17px;flex:0 0 17px;border:1.5px solid var(--c-line-2);border-radius:50%}

/* ── 添加任务：右侧「日历 / 更多」+ 下拉面板（**r122：只在聚焦/面板打开时可见**，对齐滴答）（2026-09-14 对齐滴答清单）── */
.addbar .ab-right{display:flex;gap:2px;align-items:center;flex:none}
.addbar .ab-right button{border:0;background:transparent;color:var(--c-t3);cursor:pointer;padding:4px 6px;border-radius:6px;display:inline-flex;align-items:center}
.addbar .ab-right button:hover{background:var(--c-surface-2);color:var(--c-brand)}
.addbar .ab-right button.act{color:var(--c-brand);background:var(--c-brand-bg)}
/* ── ★ 2026-09-16 对齐滴答「建任务行」（真机量测，**只作用于列表页 #addbar**，
      不动搜索弹窗/过滤器弹窗共用的 .addbar 基类）──
   滴答实测（2026-09-19 复核，`_dida_addrow2.js`）：
     外层 814×39 / 底 rgba(25,25,25,.03) / **border 1px solid transparent** / 圆角 10px
        → 聚焦：底转透明、边框变品牌蓝 rgb(71,114,250)
     内层 .task-input 812×32 / 透明 / padding `3px 12px 0`
     ＋ 24×24（与占位同色）/ 右侧图标 18×18
   证据：dida_collect/addrow2.json · addrow2_focus.png · data_new7_editor.json · 签收表 §7.2 */
#addbar{background:color-mix(in srgb, var(--c-t1) 3%, transparent);border-color:transparent;
  margin:0 20px 12px;border-radius:10px;padding:3px 12px 0;min-height:39px;transition:background .15s,border-color .15s;
  gap:0}   /* ★ 水平位移对齐：滴答的「图标→文字」无 flex 间距（改由 margin 精确控制）*/
#addbar:hover{border-color:transparent}
#addbar:focus-within{border-color:var(--c-brand);background:transparent;box-shadow:none}
#addbar input{padding:6px 0}   /* 内层做 32（= 12 + 内容 20） */
#addbar .ab-ico{color:var(--c-t1);opacity:.2;margin-left:-4px;margin-right:0}
#addbar .ab-ico svg{width:24px;height:24px}
/* ★★ 2026-09-19 水平位移对齐（真机 `_cmp_addbox3.js`）：
   滴答 ＋图标 x=9（宽 24 → 右缘 33）、**占位文字字形起点 x=33**（文字紧贴图标右缘，无额外间距）。
   我方原来 图标 13 / 文字 59（多 22px = 两个 flex gap 8 + 空 chip 容器 margin-right 6）⇒ 已收平。 */
#addbar .abnl{margin-right:0}
#addbar .abnl:not(:empty){margin-right:6px}
#addbar .ab-right svg{width:18px;height:18px}
/* ── ★★ r122（㊽② 添加框「容器两端」取证 · 滴答真值 `_regress_logs/_r122_bare_dida.out`）──────
   滴答添加框（「所有」/「收集箱」两视图 × 默认 / 悬停 / **聚焦** 三态实测）：
     · 默认 与 悬停 ⇒ **右端一个元素都没有**（连容器都不存在 · nVis 32）；**只有聚焦**才出现 2 枚（nVis 45）
     · 右端容器 = `DIV.flex-none flex-row-reverse` 56×29 @dr13（右缘 = 内容右缘 1111）
     · 图标本体 = sprite `svg 18×18`：`#date-unselected` @dr41（命中盒 26×26 · pad 4px）·
       `#preset-triangle-down` @dr13（无内边距）；两者 fill `rgba(25,25,25,.6)`（60% 黑）
   我方原为「**常显**」（2026-09-14 建）＋ 自绘描边字形 ＋ 40% ＋ dr51 / dr19
   ⇒ 本轮：改「聚焦才显」· 换 sprite 本体 · 60% 黑 · 位移收到 dr41 / dr13。
   ★ 用 opacity（**不是** display）⇒ **输入框宽度不回流**（滴答 `.task-title` 恒 788，不随聚焦变宽）。
   ★ `:has(button.act)` 兜底：日历/更多面板打开时按钮带 `act`，此时**即使焦点已移进面板**也保持可见。
   回退：删本块 ＋ 还原 `#abCal/#abMore` 的旧 svg（见 index.html.bak_r122_*）。 */
#addbar .ab-right{gap:6px;opacity:0;pointer-events:none}
#addbar:focus-within .ab-right{opacity:1;pointer-events:auto}
#addbar .ab-right:has(button.act){opacity:1;pointer-events:auto}
#addbar .ab-right button{padding:0;color:rgba(25,25,25,.6)}
#addbar .ab-right button:hover{color:var(--c-brand)}
#addbar .ab-right button.act{color:var(--c-brand);background:var(--c-brand-bg)}
#addbar #abCal{width:26px;height:26px;min-height:0;padding:4px}
#addbar #abMore{width:18px;height:18px;min-height:0}
.addmenu{position:fixed;z-index:60;background:var(--c-surface);border:1px solid var(--c-line);border-radius:10px;
  box-shadow:0 8px 28px rgba(0,0,0,.14);padding:12px;width:286px;display:none}
.addmenu.on{display:block}
.addmenu .am-h{font-size:11.5px;color:var(--c-t3);margin:12px 0 8px;letter-spacing:.3px}
.addmenu .am-h:first-child{margin-top:0}
.am-flags{display:flex;gap:6px}
.am-flags button{border:1px solid var(--c-line);background:var(--c-surface);border-radius:8px;padding:4px 8px;cursor:pointer;
  display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--c-t2)}
.am-flags button:hover{background:var(--c-surface-2)}
.am-flags button.on{border-color:var(--c-brand);background:var(--c-brand-bg);color:var(--c-brand);font-weight:600}
.am-row{display:flex;align-items:center;gap:8px;margin-bottom:2px}
.am-row label{font-size:12.5px;color:var(--c-t2);flex:none;width:32px}
.am-row select{flex:1;border:1px solid var(--c-line);background:var(--c-surface);color:var(--c-t1);border-radius:7px;padding:4px 8px;font-size:12.5px}
.am-tags{display:flex;gap:6px;flex-wrap:wrap;flex:1}
.tg-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:4px;flex:none;vertical-align:middle}
.tg-list{max-height:220px;overflow:auto;margin-top:2px}
.tg-row{display:flex;align-items:center;gap:6px;height:34px;padding:0 12px;cursor:pointer;border-radius:8px;font-size:13px}
.tg-row:hover{background:rgba(0,0,0,.05)}
.tg-ic{width:18px;height:18px;flex:none;display:flex;align-items:center;justify-content:center}
.tg-nm{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}
.tg-row.on .tg-nm{color:var(--c-brand);font-weight:600}
.tg-create{color:var(--c-brand)}
.dt-tags{display:flex;flex-wrap:wrap;gap:6px;padding:2px 24px 6px;flex:none;cursor:pointer;min-height:24px;align-items:center}
.dt-tags:hover .dt-tg.mut{border-color:var(--c-brand);color:var(--c-brand)}
.dt-tg{display:inline-flex;align-items:center;gap:4px;height:22px;padding:0 9px;border-radius:11px;
  background:rgba(45,111,247,.08);color:#4772fa;font-size:12px;line-height:1;white-space:nowrap}
.dt-tg.mut{background:transparent;color:var(--c-t3);border:1px dashed var(--c-line)}
.sec .secact{margin-left:auto;display:none;align-items:center;gap:2px}
.sec:hover .secact{display:flex}
.secact button{border:0;background:transparent;color:var(--c-t3);cursor:pointer;font-size:14px;line-height:1;padding:0 3px}
.secact button:hover{color:var(--c-t1)}
.li .tagmore{opacity:0;flex:none;margin-left:4px;cursor:pointer;color:var(--c-t3);font-size:14px;line-height:1;padding:0 2px}
.li:hover .tagmore{opacity:1}
.li .tagmore:hover{color:var(--c-t1)}
.li.on{background:var(--c-brand-bg)}
.tag-swc{transition:box-shadow .12s}
.am-tags span{border:1px solid var(--c-line);border-radius:20px;padding:3px 10px;font-size:12px;cursor:pointer;color:var(--c-t2)}
.am-tags span.on{border-color:var(--c-brand);color:var(--c-brand);background:var(--c-brand-bg);font-weight:600}
.am-empty{font-size:12px;color:var(--c-t3)}
/* 详情面板内控件收紧（设计层 --h-ctl:34px 在窄面板里过高） */
#detail .addbar{margin-bottom:0}
#detail input[type=text],#detail input:not([type]),#detail input[type=datetime-local]{
  min-height:30px!important;height:30px;padding:0 8px!important;font-size:12.5px;border-radius:7px}
#detail .dt-ic{min-height:26px;padding:0 8px;font-size:12px;border-radius:7px}
#detail .dt-flag{border-radius:7px;padding:1px 3px}
#detail select{min-height:28px!important;height:28px;font-size:12.5px;padding:0 6px!important}
/* ══════════════ v5 · 列表区对齐滴答清单（2026-09-14）══════════════ */
/* ① 任务行：两行结构（勾选框 + 正文区），悬浮显形快捷操作 */
/* ★ 2026-09-15 对齐滴答：任务行是**无圆角几何行**（不是卡片），行高 40、行底 1px 分隔线 */
/* ★★ 2026-09-18 逐像素对齐滴答（`_dida_drow.js` 实测）：
   行内左缩进链 = **padding-left 16 → 竖线 dx=16(w3) → 复选框 dx=34(17×17) → 标题 dx=58**
   （16 + 3 + margin 7 + gap 8 = 34；34 + 17 + gap 8 = 59 ≈ 58） */
/* ★ 2026-11-02 「所有」视图多列布局（对齐滴答 column-list-inner 真值） */
.col-list{display:flex;flex-direction:row;overflow-x:auto;overflow-y:hidden;padding:0 12px 12px;height:100%;min-height:0}
.col-list .col{flex-shrink:0;width:282px;height:100%;display:flex;flex-direction:column;min-height:0}
.col-list .col-hd{flex:none;height:38px;display:flex;align-items:center;gap:6px;padding:0 12px;
  font-size:12.5px;color:var(--c-t3);font-weight:600;white-space:nowrap;overflow:hidden}
.col-list .col-hd .zcnt{font-weight:400;color:var(--c-t3);font-size:11.5px}
.col-list .col-hd .zact{margin-left:auto;opacity:0;color:var(--c-t3);font-size:14px;padding:0 4px;border-radius:5px;cursor:pointer}
.col-list .col-hd:hover .zact{opacity:1}
.col-list .col-hd .zact:hover{background:var(--c-surface-2);color:var(--c-brand)}
.col-list .col-body{flex:1;overflow-y:auto;min-height:0;padding:0 12px}
/* ★ 2026-11-03 列视图卡片 = 滴答真机三行（258×92）：标题40 + 标签30 + 日期22 */
.col-list .col-body .task{display:flex;align-items:flex-start;margin:4px 0;padding:0;
  min-height:0;background:var(--c-surface);border-radius:10px}
.col-list .col-body .task .tb{display:flex;flex-direction:column;flex:1;min-width:0;margin:0}
/* ① 标题行 40px */
.col-list .col-body .task .t{height:40px;line-height:40px;padding:0 12px 0 0;display:flex;align-items:center;gap:4px}
.col-list .col-body .task .t .tt{font-size:14px;line-height:40px;max-width:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 标题行里的日期/清单签不在此显示（移到底部行） */
.col-list .col-body .task .t .tright{display:none}
/* ② 标签行 + ③ 日期行（同一容器，日期独占一行） */
.col-list .col-body .task .tm{display:flex;flex-wrap:wrap;align-items:center;gap:0 6px;
  padding:6px 20px 6px 0;font-size:13px;line-height:18px;color:var(--c-t3);min-height:0}
.col-list .col-body .task .tm:empty{display:none}
.col-list .col-body .task .tm .tag{height:18px;line-height:18px;font-size:13px;padding:0 6px;
  border-radius:9999px;background:rgba(71,114,250,.5);color:rgba(25,25,25,.8)}
.col-list .col-body .task .tm .due{flex:0 0 100%;height:22px;line-height:22px;font-size:14px;
  color:var(--c-t3);padding:0;margin:0;gap:4px}
.col-list .col-body .task .tm .due.over{color:var(--c-bad)}
.col-list .col-body .task .tm .due.today{color:#4772fa}
/* 描述行（有描述才占位，不打断三行骨架） */
.col-list .col-body .task .tdesc{display:block;padding:0 20px 0 0;font-size:12px;line-height:18px;
  color:var(--c-t3);max-width:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* 拖拽把手 / 竖线 / 复选框 */
.col-list .col-body .task .tdrag{display:none}
.col-list .col-body .task:hover .tdrag{display:inline-flex}
.col-list .col-body .task .tbar{position:absolute;left:16px;top:2px;height:40px;width:3px;z-index:1}
.col-list .col-body .task .chk{margin-top:12px}
.col-list .col-body .task .rowmore{display:none}
.col-list .col-body .task:hover .rowmore{display:inline-flex}
/* ★ 2026-11-03：列视图解除 compact/detailed 的高度锁定（那两条是给单列列表用的） */
.col-list .col-body .task,
.col-list .col-body .task.has-desc,
#tasks.compact-desc .col-list .col-body .task.has-desc,
#tasks.detailed-desc .col-list .col-body .task.has-desc{
  height:auto!important;min-height:0!important;padding-top:0!important;padding-bottom:0!important}
/* 列视图里标签行恒显示（detailed 模式原本会隐藏 .tm） */
.col-list .col-body .task .tm{display:flex!important}
/* 列视图里描述行按模式显示，但不要截成 0 高后留下空隙 */
#tasks.compact-desc .col-list .col-body .task.has-desc .tdesc{display:none}
#tasks.detailed-desc .col-list .col-body .task.has-desc .tdesc{display:block;max-height:none;opacity:1}
.task{display:flex;align-items:center;gap:8px;padding:0 30px 0 28px;min-height:40px;cursor:pointer;
  /* ★ 2026-11-02 卡片化（对齐滴答 .l-task-bg 真值）：白底 + 圆角10 + 行间距4 */
  background:var(--c-surface);border-radius:10px;margin:2px 12px;
  position:relative;z-index:0;transition:background .1s}   /* z-index:0 → 形成层叠上下文（给下面 ::before 的 -1 兜底） */
/* ★★ 2026-09-18 A3（对齐滴答）：行**没有下边框** —— 滴答实测 `.l-task` 的 border-bottom 是
   `0px none`；行与行之间靠「悬浮/选中的内缩圆角底」+ 分区头来区分。
   去掉后行高从 41 变成 40，与滴答一致。 */
/* ★ 悬浮/选中高亮改成**内缩的圆角底**（滴答 `.l-task-bg`：left 20 / right 18 / radius 10 / 高度=行高）
   —— 用 `::before` 画，`pointer-events:none` 不挡点击；它在下层，竖线与内容仍在上面。 */
/* ⚠️⚠️ 2026-09-18 血泪：`::before` 是**定位元素**（absolute），按 CSS 层叠顺序**盖在同行的普通流内容之上**
   —— 非 hover 时底色透明看不出来，**一 hover 就把整行标题/描述盖没了**（老板：「鼠标放上去直接就看不到了」）。
   正解：给 `.task` 加 `z-index:0` 形成层叠上下文，再把 `::before` 压到 `z-index:-1`
   ⇒ 高亮底落在**行背景之上、内容之下**。 */
.task::before{content:'';position:absolute;left:0;right:0;top:0;bottom:0;border-radius:10px;z-index:-1;
  background:transparent;pointer-events:none;transition:background .1s}
.task:hover::before{background:color-mix(in srgb, var(--c-t1) 4%, transparent)}
/* ★ r95（2026-09-25）池51 —— **列表任务行 hover 底**对齐滴答：真值 `_regress_logs/_r94_rowhov_dida.out`（4/4 · 滴答填充层 `div.l-task-bg` 816×40）= `rgba(25,25,25,.04)`；改前我方走的是不透明灰底令牌（`--c-surface-2` = `#f0f2f5`，真像素 240,242,245 · `_r95_rowhov_our_before.out` 2/2）⇒ 差 (6,4,1)。与 `.li:hover`(r94) / `.sec.secbtn:hover`(r73) 同族：走 `--c-t1` 令牌 ⇒ 浅色**精确** 4% 黑 · 暗色自动 4% 白。回退：`cp index.html.bak_r95_* index.html`（原文即本脚本 OLD1/OLD2/OLD3）。 */
.task.sel::before{background:var(--c-brand-bg)}
.task:hover,.task.sel{background:transparent}

/* ★★★ 2026-11-12 #3729 丙案·平铺（对齐滴答行几何 · 呆呆·星火A · 05:2x）
   依据（**刻意不依赖**「滴答今日是否画行底线」这个仍未取得的运行面真值 ⇒ #3910 等老板扫码）：
   ① 滴答行**满幅无左右外缩**：滴答真机清单色条 absolute x16（app-head.css:1149 记 r73 取证）⇒ 行盒左缘＝容器左缘
      ⇒ 我方 margin 左右 12px 属偏离 ⇒ 归零。实测：A 行宽 930.81 @x304（#list 954.81）→ B 行宽 954.81 @x292（满幅）。
   ② 滴答**行间无缝**：r651（11-02）实测滴答视觉 pitch 40/84/62＝行高本身 ⇒ 我方行间 2px 白缝（margin 2px 相邻折叠）要归零
      ⇒ 实测 A pitch 42 → B pitch 40（= 滴答 40/84/62 逐值对上）。
   ③ 滴答 hover 底 = l-task-bg，内缩 **20/18** + 圆角 10（r95/r76 真值 816×40）⇒ ::before 由 left:0/right:0
      （行盒相对＝容器相对 12/12）改行盒相对 **20/18**；圆角 10 保持。
   ④ 滴答**无常驻卡底**：白底卡是 11-02 卡片化的产物，其「对齐滴答 .l-task-bg」的依据是把 hover 层误读成常驻卡（#3729 11-11 新事实 3）
      ⇒ 行满幅 ⇒ 行不再有圆角卡 ⇒ border-radius 0（hover 底的 ::before 圆角 10 保留）。
   ⑤ hover/选中时行底色**保持白**：原 `.task:hover,.task.sel{background:transparent}` 是「卡片」前提下的写法
      （靠 margin 露出的容器灰当 hover 底）；满幅后会让整行塌成灰带 ⇒ 改回 var(--c-surface) ⇒ hover 呈「白行 + 内缩 4% 底」＝滴答。
      ★ 暗色主题选中行单独补回（原规则 html[data-theme="dark"] .task.sel 特异性低于本块 ID 选择器 ⇒ 必须补）。
   ★ 作用域限定 **#list**：看板卡在兄弟容器 #board（不受影响）；.col-list 是 11-04 前旧多列死代码（app.js 已无渲染）。
   ★ 本轮**不新增**行底 1px 分隔线（现状即无线）：滴答「今日是否画线」运行面真值未取得 ⇒ 不在无真值下改行形态。
   实测四臂（浏览器实测，非推算）：A 现状 pitch42/行宽930.81/margin2px12px/radius10/before 0,0
        → B 候选 pitch40/行宽954.81/margin0/radius0/before 20,18 ｜ C 负控(只改圆角) pitch 仍 42 ｜ D 正控(margin8) pitch 48
        ⇒ 判据有鉴别力（非恒绿）；pageerror 0。 */
#list .task{margin:0;border-radius:0}
#list .task::before{left:20px;right:18px}
#list .task:hover,#list .task.sel{background:var(--c-surface)}
html[data-theme="dark"] #list .task.sel{background:#1d3049}

/* ★★ r75（2026-09-24）㋜ 行底 1px 分隔线（对齐滴答 `div.t-line`）
   真值 `_regress_logs/_dida_r75_tline.out`（列表 **29/29 行**）· `_dida_r75_trash.out`（垃圾桶 **34/34 行**）：
   **766×1 @dx58 dr30 dy=h−1** · bg **rgba(25,25,25,.05)** · **z10** · **absolute bottom-0**；
   三态（默认 / hover / 移开）**色与透明度全不变**（hover 时它与 `.l-task-bg`(4%)叠加）。
   ★ 用 `::after` + 绝对定位 ⇒ **不参与布局、不改行高**（改前/后行高必须一致：40/62/84/102）。
   ★ 颜色走令牌 ⇒ 浅色**精确等价** rgba(25,25,25,.05)、暗色自动 5% 白（同 r73 段头 hover 底的做法，不硬编码、不新增令牌）。
   ★ 顺手删掉旧规则 `#list>.task:last-child{border-bottom:0}`：实测 `#list>.task` 命中 **0**
     （`.task` 在 `#tasks` 内、不是 `#list` 的直接子元素）⇒ **永真死规则**。
   回退：本条规则删掉即可（旧死规则无需恢复）。 */
/* ★ 2026-11-02 卡片化：行底分隔线去掉（卡片间距代替） */
html[data-theme="dark"] .task.sel{background:#1d3049}
.task.drag{opacity:.42}
.task.dragover{position:relative;z-index:2}
/* 2026-09-22 r47 拖拽落点指示线（对齐滴答）：1px 品牌蓝 #4772FA + 左端 8x8 圆点，
   左缩进 32 / 右缩进 20（滴答实测：行宽 854 -> 线宽 802）；位置 = 目标行上边界。
   回退：本段 2 条规则删掉，并把 .task.dragover 换回 box-shadow:inset 0 2px 0 var(--c-brand)。 */
#dkDrop{position:fixed;z-index:60;height:1px;border-radius:1px;background:#4772FA;display:none;pointer-events:none}
#dkDrop b{position:absolute;left:-4px;top:-4px;width:8px;height:8px;border-radius:50%;background:#4772FA}
/* ★★ 2026-09-18 滴答实测：复选框是**相对「首行行盒(40)」垂直居中**（dy=12），
   而不是相对整个多行行盒居中 —— 所以用 align-self:flex-start + margin-top:12px 钉死。 */
.chk{width:17px;height:17px;border:1.5px solid var(--c-t3);border-radius:4px;flex:none;
  align-self:flex-start;margin-top:12px;
  display:flex;align-items:center;justify-content:center;font-size:11px;color:#fff;transition:.12s}
/* ★ 有描述时底部补 6px（滴答多行行高 84 = 首行40 − 6 + 描述22 + 元信息22 + 底6）
   注意：用 flex 的 `align-self:stretch` 时竖线只铺到**内容区**，不含这 6px padding
   ⇒ 给竖线一个等量负 margin 把它「拉」满整行（滴答竖线高 = 行高）。 */
.task.has-desc{padding-bottom:6px}
.task.has-desc .tbar{margin-bottom:-6px}
/* ★★ r70（2026-09-24）：勾选框 hover 对齐滴答（真值 _regress_logs/_dida_chkhover4.out 活体 + sprite #hover-checkbox）。
   滴答任务行勾选框是两颗 svg：hover 时 #checkbox 隐、#hover-checkbox 显；
   该 sprite = 同一条外框 + 一条 fill-opacity=".1" 的 currentColor 内填充（currentColor 走 text-priority 系列）
   ⇒ 外框颜色不变，只在环内加一层「环色 10%」的填充；未加优先级的行 = rgba(25,25,25,.4) 乘 .1 = 4% 黑。
   ★ 加 :not(.on) —— 滴答的 swap 规则带 :not(.checked)（已完成行不 swap）；
     而我方已完成行同时带 chk.pri-N 与 chk.on，.pri-N:hover（(0,3,0)）会盖过 .chk.on（(0,2,0)）⇒ 必须显式排除。
   旧写法 .chk:hover 的 border-color:var(--c-ok)（边框变完成色）是我方自造、非滴答行为 ⇒ 本轮删除。*/
.chk:hover:not(.on){background:rgba(25,25,25,.04)}
.chk.pri-5:hover:not(.on){background:rgba(225,62,57,.1)}
.chk.pri-3:hover:not(.on){background:rgba(250,168,12,.1)}
.chk.pri-1:hover:not(.on){background:rgba(71,114,250,.1)}
/* ★★ 2026-09-19 B3 已完成态对齐滴答：**不是绿色实心圆**，而是「12% 灰的勾」（滴答 #completed
   实测 17×17 · color/fill rgba(25,25,25,.12)；标题 40% 灰且**无删除线**，见 .task.done .t） */
.chk.on{background:transparent;border:0;color:rgba(25,25,25,.12);font-size:17px;line-height:1}
/* ★ 2026-09-22 r44：已完成 / 已放弃行的左 glyph 改用**滴答自家 sprite**
   真机取证：`_regress_logs/_dida_donerow2.out`（use href=#completed / #wont-do-filled，
     17×17 正好填满 .chk 的 17×17 位，fill = rgba(25,25,25,.12)）；
     sprite 原文在 `_regress_logs/_dida_sym3.out`（viewBox 0 0 24 24，两者方框轮廓同一条路径）。
   回退：删 `.chk.on svg` 本块 + ICON24 两个键 + taskRow 的 `_chkOn`（备份 index.html.bak_droprow_*）。*/
.chk.on svg{width:17px;height:17px;display:block;fill:currentColor;stroke:none}
/* ★★ 2026-09-19 B4 行左图标 = 滴答同款「一个 17×17 位，按类型换 glyph」：
     普通任务 = 方框（.chk 基类）· 笔记 = 文档图标（.chk.noteic，**灰 40%**）。
     ⚠️ 修饰类**不能叫 `note`** —— 那是设计层通用组件（`/opt/ui/shuobang-ui.css:173`
        `.note{padding:11px 13px;font-size:var(--f-sm)…}`），撞名会把图标撑成 26×22。
     ⚠️ 滴答没有「有子任务 = 三横线」这种指示（两视图实测「非 4 种图标」行数 = 0）
        ⇒ 父任务行恢复**普通复选框**，信息保留在 title 提示（「有子任务 N/M」）。 */
.chk.noteic{border:0;background:transparent;color:var(--c-t3);border-radius:4px;padding:0;
  font-size:11px;line-height:1}
.chk.noteic svg{width:16px;height:16px}
/* ★★ r70：滴答笔记行勾选框无 hover 反馈（_dida_chkhover4.out 实测 ho=true 但切换=false；
   且 CSS 里 .icon-note + .icon-hover-checkbox 这一对不在 swap 规则的选择器列表内）
   ⇒ 撤销我方自造的「hover 变底 + 变品牌蓝」。*/
.chk.noteic:hover{background:transparent;color:var(--c-t3)}
.chk.noteic.on{background:transparent;color:rgba(25,25,25,.12)}
.chk.noteic.on svg{opacity:.6}
/* 任务行：标题(右日期) / 描述一行 / 所属清单 */
/* 首行右侧区（清单签 + 日期）：整块靠右，内部左→右 = 清单签 → 日期 */
.task .t .tright{margin-left:auto;flex:none;display:inline-flex;align-items:center;gap:8px;min-width:0}
.task .t .due{flex:none}
/* ★★ 2026-09-20 老板定稿口径（**此处有意不对齐滴答**，以我们的要求为准）：
   「任务的描述不要考虑换行，直接尽可能地显示已有内容，同时显示两行」。
   ⇒ 去掉单行 nowrap + 固定 h22，改成**允许折行、最多两行**、超出第二行末省略。
   ★ 短描述仍只占 22px ⇒ 行高 84 **不变**；只有长到需要第二行时行高才变高。
   ★ 例外登记：账本「例外条目」+ 技能 dida-clone-benchmark §50（下一轮**不要**按滴答改回单行）。 */
/* ★★ 2026-09-21 排版统一（老板反馈「描述某一行间隔比较大」）：
   描述里的段落 **margin 一律归零**，行距只由 line-height 决定 ⇒ 每行等距。
   滴答实测：容器 `td-task-text` pt4/pb24，内部段落 margin 全 0、lh 21px ⇒ 完全均匀。 */
.dt-descwrap #descIn p{margin:0}
.task .tdesc p{margin:0}
.task .tdesc{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
  margin-top:-6px;padding:2px 0;box-sizing:border-box;
  font-size:12px;line-height:18px;color:var(--c-t3);
  white-space:normal;overflow:hidden;word-break:break-word}
.task .tlist{display:inline-flex;align-items:center;gap:3px;max-width:180px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
/* 正文区：标题 + 元信息两行 */
.task .tb{flex:1;min-width:0;margin-left:-1px}
/* ★ 标题对齐滴答：lh 24 + 上下 padding 8 ⇒ 首行行盒正好 40 */
.task .t{font-size:14px;line-height:24px;padding:8px 0;word-break:break-word;display:flex;align-items:center;gap:4px}
.task .tt{min-width:0;word-break:break-word}
.task.done .t,.task.dropped .t{color:var(--c-t3);text-decoration:none}   /* ★ 2026-09-19 B3：滴答已完成行标题**无删除线**（实测 deco=none，只降为 40% 灰）*/
/* 元信息行：仅在非空时占位，字号更小、颜色更浅 */
/* ★ 元信息行（滴答的第三行）对齐：h=22；上边紧接描述（描述已含 -6 的负边距补偿） */
.task .tm{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:0;min-height:22px;line-height:22px;
  font-size:12px;color:var(--c-t3)}
.task .tm:empty{display:none}
.task .tm .tcreated{color:var(--c-t3)}   /* 笔记的创建时间（滴答 noteTime：12px / rgba(25,25,25,.4)） */
.task .tm .due{display:inline-flex;align-items:center;gap:3px;cursor:pointer;border-radius:5px;padding:0 4px;margin-left:-4px}
.task .tm .due:hover{background:var(--c-surface-2);text-decoration:underline}
.task .tm .due.over{color:var(--c-bad)}
.task .tm .due.today{color:#4772fa;font-weight:400}
/* 滴答实测：日期统一 rgb(71,114,250)（12px），今天不加粗 */
.task .tm .due{color:#4772fa}
/* ★★ 2026-09-19 滴答实测（`_dida_title.js`）：`.task-title` 是
     `white-space:normal` + `overflow:hidden` + 元素恒 **h=40 / lh=40** ⇒ **标题永远单行、超出裁剪**，绝不折行。
   我方原来 `.task .tt{word-break:break-word}` 会折行 ⇒ 长标题把行高撑成 2~3 行（滴答实测行高恒 40）。
   ⇒ 对齐滴答：单行 + 省略号（比滴答的 clip 更好读，且同样不占第二行）。 */
.task .t .tt{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* ★★ 2026-09-19 滴答客户端三行像素量测（`_boss_color.py`）：
     标题 = rgb(25,25,25) · **描述 = rgb(189,189,189)**（≈ rgba(25,25,25,.29)）· **清单名 = 中灰**
     —— 两句灰是**有层级的**（描述更浅、清单名更深）；都用 --c-t3 会把两层压成一层。
     取值只作用在 `.task` 作用域内，**不动设计层共享令牌**。 */
.task .tdesc{color:rgba(25,25,25,.29)}
.task .tlist{color:rgba(25,25,25,.45)}
/* ★★ r77 滴答只读实测（`_dida_rowdue1.js`）：**列表行**日期色分层 =
   过期（昨天/更早）红 rgb(224,49,49) · **今天 蓝 rgb(71,114,250)**（10/10 样本）·
   **未来 蓝 rgb(71,114,250)**（`12月31日`）· 已完成行 灰 rgba(25,25,25,.4)
   ⇒ 与看板卡同口径 = **过期红 / 非过期（含今天·明天·未来）蓝**。
   我方原来只给「今天」着色（未来落回主文字色）⇒ 本轮补「非过期一律蓝」。
   特异性三条同为 (0,4,0) ⇒ **源码靠后者胜**：over → today → done，
   保证 ①「今天且时刻已过」仍蓝（口径不变）②过期仍红 ③已完成行仍 40% 灰。 */
.task .t .due{color:#4772fa}
.task .t .due.over{color:var(--c-bad)}
.task .t .due.today{color:#4772fa}
.task.done .t .due,.task.dropped .t .due{color:var(--c-t3)}
html[data-theme="dark"] .task .tdesc{color:rgba(255,255,255,.5)}
html[data-theme="dark"] .task .tlist{color:rgba(255,255,255,.6)}
.task .tm .tag{background:var(--c-surface-2);border-radius:6px;padding:1px 6px;font-size:11px;max-width:130px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.task .tm .sub-cnt{display:inline-flex;align-items:center;gap:3px}
/* ══ 2026-09-20 第 28 轮（右键穷举取证）：行内「⋯」入口 —— **对齐滴答** ══
   滴答实测（`_dida_rc5.js`）：任务行 hover 才显形的元素**只有 2 个** ——
     · 左 `#drag` 12×12 @dx5（拖拽把手）· 右 `#more-for-task` 12×12 @dx669（行宽 685 ⇒ **距行右缘 4px**）
   点它 / 对行右键 = **打开该任务详情面板 + 弹出 ⋯ 菜单**（`_dida_rc6.js`：hasDetail false→true，菜单 194×377）。
   ⇒ 原来那 4 颗快捷按钮（日期/优先级/置顶/删除）**能力已全在 ⋯ 菜单内**（日期段 / 优先级段 / 置顶 / 删除），故移除。
   ⚠️ 仍是**绝对定位**：滴答的右侧操作不占位（若变成 flex 项会把首行右侧「清单签」挤到左边，见 2026-09-18 记录）。
   ⚠️ 回退：把本块换回 `.task .ops{…}` 那 6 条规则，JS 侧换回 `.ops` + 4 个 button（备份 index.html.bak_rowmore1_*）。*/
.task .rowmore{position:absolute;right:4px;top:50%;transform:translateY(-50%);width:12px;height:12px;flex:none;
  display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .12s;
  cursor:pointer;color:var(--c-t3);z-index:2}
.task:hover .rowmore{opacity:1}
.task .rowmore:hover{color:var(--c-t1)}   /* 滴答：hover:text-grey = rgb(25,25,25) 全黑，**不是**品牌蓝 */
/* ⋯ 字形必须是**实心点**（`.dti` 默认 fill:none + stroke = 描边，会把点画成小圈） */
.task .rowmore .dti{width:12px;height:12px;fill:currentColor;stroke:none}
/* ══ 2026-09-21 第 40 轮：行内**左侧拖拽把手** —— 对齐滴答 ══
   滴答真机（`_dida_drag3.js`，1759×1000）：行 853.8×40；行左链条**与我方已逐像素一致**
     · 清单色条 absolute x16 w3 h40（我方 `.tbar` @x16/3px ✓）· 复选框 x34 17×17（我方 `.chk` @x34/17px ✓）
   `.drag` = `w-[12px] h-[12px] absolute left-0 top-1/2 -translate-y-1/2 cursor-move invisible group-hover:visible`，rect **x5 y14 12×12**
   ⇒ 即 `left:5px` + `top:50%/translateY(-50%)`（40px 行 ⇒ y14，与实测吻合）；**默认隐形、行 hover 才显形**；
     色 `text-grey-40` = rgba(25,25,25,.4) = 我方 `--c-t3`；hover → `text-grey` = rgb(25,25,25) = 我方 `--c-t1`。
   ⚠️ 纯视觉 affordance：**不加 onclick**（点击仍落到行上）；不占位（absolute），不影响标题/勾选框链条。
   回退：删本块 + 删 `ICON48` + `ico()` 第三级 + 行内 `.tdrag` span（备份 index.html.bak_tdrag_*）。*/
.task .tdrag{position:absolute;left:5px;top:50%;transform:translateY(-50%);width:12px;height:12px;flex:none;
  display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .12s;
  cursor:move;color:var(--c-t3);z-index:2}
.task:hover .tdrag{opacity:1}
.task .tdrag:hover{color:var(--c-t1)}
.task .tdrag .dti{width:12px;height:12px;fill:currentColor;stroke:none}
/* 子任务：左侧引导线，视觉上归属父任务 */
.task.sub{padding-left:32px;background:transparent;position:relative}
.task.sub:before{content:'';position:absolute;left:20px;top:0;bottom:0;width:1.5px;
  background:#d9dde3;border-radius:1px}
html[data-theme="dark"] .task.sub:before{background:#3d434d}
html[data-theme="dark"] .task.sub:before{background:#3d434d}
.task.sub .t{font-size:13.5px}
.task.sub:hover{background:var(--c-surface-2)}
.pr{width:8px;height:8px;border-radius:50%;flex:none}
.pr5{background:var(--c-bad)}.pr3{background:var(--c-warn)}.pr1{background:var(--c-brand)}
/* ★ QI-1800：QI-1457 的「显示设置」面板用了 .cds-* 四个 class 但**零定义**（样式静默失效）。
   本轮补齐：标题行 / 说明 / 单选行 / 行列表。颜色全部走 CSS 变量 ⇒ 暗色自动跟随。 */
.cds-h{font-size:var(--f-sm);font-weight:600;color:var(--c-t1);margin:14px 0 6px}
.cds-tip{font-size:var(--f-xs);color:var(--c-t3);line-height:1.6;margin-bottom:8px}
.cds-list{display:flex;flex-direction:column;gap:2px}
.cdsrow{display:flex;align-items:center;gap:8px;padding:6px 4px;border-radius:6px;cursor:pointer;
  font-size:var(--f-sm);color:var(--c-t2)}
.cdsrow:hover{background:color-mix(in srgb, var(--c-t1) 5%, transparent)}
.cdsrow input{accent-color:var(--c-brand);cursor:pointer}
/* 色板预览（滴答：选「按清单」或「按标签」时可在下方直接看到/改颜色） */
.cds-pv{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.cds-sw{width:16px;height:16px;border-radius:4px;border:1px solid rgba(0,0,0,.12);flex:none}
.due.over{color:var(--c-bad)}
.tag{background:var(--c-surface-2);border-radius:6px;padding:1px 6px;font-size:11px}
/* ② 分区头：可折叠 + 计数 + hover 快捷添加 */
.zsec{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--c-t3);font-weight:600;
  padding:8px 8px 6px;cursor:pointer;user-select:none;border-radius:7px}
.zsec:hover{color:var(--c-t1)}
.zsec .zarw{font-size:8px;color:var(--c-t3);transition:transform .15s;display:inline-block;width:9px;flex:none}
.zsec.cl .zarw{transform:rotate(-90deg)}
.zsec .zcnt{font-weight:400;color:var(--c-t3);font-size:11.5px}
.zsec .zact{margin-left:auto;opacity:0;color:var(--c-t3);font-size:14px;padding:0 4px;border-radius:5px;
  line-height:1;transition:opacity .12s}
.zsec:hover .zact{opacity:1}
.zsec .zact:hover{background:var(--c-surface-2);color:var(--c-brand)}
.zsec.cl+.zbody{display:none}
/* ★ 2026-10-19 分组节头投放高亮（拖任务到分组标题上时） */
.zsec.over{background:var(--c-surface-2);outline:2px dashed var(--c-brand);outline-offset:-2px;border-radius:6px}
.zbody{display:block}
.zsec:after{content:'';}
/* ── ★★ 2026-09-19 分区头逐像素对齐滴答（真机 `_dida_sec3.js` / `_dida_sec4.js`）──
   滴答 `.section-header`：整宽 · flex+align-center+justify-between · lh 36px
     高度：**首段 28**（pad `0 12px`）/ **后续段 44**（pad `12px 12px 0`）· 无底色 / 无圆角 · hover **不变色**
     标题 `h6.section-title`：**fs 14 · fw 600 · color rgb(25,25,25)**（**主文字色，不是灰**）
     计数 `span.count`：**fs 12 · fw 400 · rgba(25,25,25,.4)**，与标题间隔 **8px**
     箭头：盒子 **16×12**（内 svg **12×12**）· `rgba(25,25,25,.4)` · 距容器左 **18**；**文字距容器左 36**
   ⚠️ 只作用于列表页（`#tasks`）—— **搜索弹窗 / 右栏也用 .zsec**，保持原样（配反向断言 G1e）。 */
#tasks .zsec{display:flex;align-items:center;justify-content:flex-start;gap:0;
  min-height:28px;padding:0 12px;border-radius:0;font-size:14px;font-weight:600;
  line-height:21px;color:var(--c-t1);cursor:pointer;user-select:none;position:relative}
#tasks .zbody+.zsec{padding-top:12px;min-height:44px}   /* 后续分区：+12px 顶间距 → 44 */
#tasks .zsec:hover{color:var(--c-t1)}                   /* 滴答 hover 不变色 */
/* ★★ fb#39：列表分区 / 侧栏清单 作为任务落点时的提示（拖任务行经过即高亮） */
#tasks .zsec.dropok{background:var(--c-brand-bg);border-radius:6px;color:var(--c-brand)}
#tasks .zsec.dropok .zcnt{color:var(--c-brand)}
#tasks .zsec .zarw{display:inline-flex;align-items:center;justify-content:center;
  width:16px;height:12px;flex:none;margin:0 2px 0 6px;color:var(--c-t3);transition:transform .15s}
   /* ↑ 滴答实测（`_dida_sec5.js`）：箭头 SPAN 本身 `margin-left:6px + margin-right:2px`
      ⇒ 箭头盒距头左 **18**、文字距头左 **36**（= 12 pad + 6 + 16 + 2） */
#tasks .zsec .zarw svg{width:12px;height:12px;display:block}
#tasks .zsec.cl .zarw{transform:rotate(-90deg)}
#tasks .zsec .zcnt{font-weight:400;color:var(--c-t3);font-size:12px;margin-left:8px;line-height:1}
#tasks .zsec .zact{font-size:14px;padding:0 3px}   /* 自有形态：hover 出的「＋」（滴答分组头没有）· r73/乙：盒宽 22→20，令「顺延」右内缩 34→32 与滴答逐值一致（滴答 `mr-20` 预留 20px） */
/* 顺延（已过期头右侧动作）：滴答 `ml-8 mr-20 text-xs leading-[18px] text-brand-primary`
   → fs 12 / 行高 18 / **在最右**。有它时把「＋」的 auto 边距让给它，避免两个 auto 分食空间。 */
#tasks .zsec .zsecact{color:var(--c-brand);font-size:12px;font-weight:400;line-height:18px;margin-left:8px;cursor:pointer;flex:none}
#tasks .zsec.hasact .zsecact{margin-left:auto}
#tasks .zsec.hasact .zact{margin-left:0}
.zsec .zact+.zact{margin-left:0}
/* ★★ R689（#4088-D1）：**用户分组节的拖拽手柄** —— 滴答 `.cursor-move` 14×12 贴在节左（x≈2）、
   hover 才显形。用绝对定位而**不是插入 flex 流**：现存箭头盒距左 18 / 文字距左 36 是逐像素量定值
   （见上方 `_dida_sec5.js` 注释），插一个 14px flex 项会把标题整体右移 14px。
   点阵用 radial-gradient 画（滴答是 6 点 2×3；4.5×4 步长在本机 DPR 下更接近），零图片依赖。 */
#tasks .zsec .zsecmv{position:absolute;left:2px;top:50%;width:14px;height:12px;margin-top:-6px;
  cursor:move;opacity:0;transition:opacity .12s;color:var(--c-t3);border-radius:3px;
  background-image:radial-gradient(currentColor 1px,transparent 1.3px);background-size:4.5px 4px;background-position:1px 0}
#tasks .zsec:hover .zsecmv{opacity:.55}
#tasks .zsec .zsecmv:hover{opacity:.9}
#tasks .zsec.zgrab{opacity:.45}
#tasks .zsec.zgok{background:var(--c-brand-bg);border-radius:6px;color:var(--c-brand)}
#tasks .zsec.zgok .zcnt{color:var(--c-brand)}
#board{display:none;flex:1;gap:12px;padding:12px 16px;overflow-x:auto}
#board .col{width:270px;flex:none;background:var(--c-surface-2);border-radius:10px;display:flex;flex-direction:column;max-height:100%}
#board .col h4{padding:10px 12px;font-size:13px;color:var(--c-t3)}
#board .cards{flex:1;overflow-y:auto;padding:0 8px 8px}
#board .card{background:var(--c-surface);border-radius:8px;padding:8px 10px;margin-bottom:8px;font-size:13.5px;cursor:grab;box-shadow:0 1px 2px rgba(0,0,0,.06)}
#board .card .m{font-size:11.5px;color:var(--c-t3);margin-top:4px;display:flex;gap:6px}
/* ★ r53：看板列**拖拽落点高亮**已按滴答 `.hover-mask` 真值重写（1px 实线品牌蓝 + 3% 品牌蓝底
   + 12px 圆角，`inset` 环不改布局）—— 旧形态「2px 虚线 outline」在此**删除**；
   新规则见本页最后一段 `#board .col.over` 块。回退：把本注释换回原规则即可。 */
/* ══ 日历（2026-09-15 对齐滴答，见 shot_nav_calendar.webp）══ */
#cal{display:none;flex:1;min-height:0;overflow:auto;padding:0;background:var(--c-surface)}
#cal .cbar{display:flex;align-items:center;gap:8px;padding:14px 20px;position:sticky;top:0;
  background:var(--c-surface);z-index:2}
#cal .cbar .ct{display:flex;align-items:center;gap:8px;font-size:19px;font-weight:600;color:var(--c-t1)}
#cal .cbar .cops{margin-left:auto;display:flex;align-items:center;gap:4px}
#cal .cbar .cops button{height:30px;min-width:30px;padding:0 9px;border:1px solid var(--c-line);
  background:var(--c-surface);color:var(--c-t2);border-radius:8px;cursor:pointer;font-size:13px;font-family:inherit}
#cal .cbar .cops button:hover{background:var(--c-surface-2);color:var(--c-t1)}
#cal .cweek{display:grid;grid-template-columns:repeat(7,1fr);padding:0 0 6px}
#cal .cweek div{font-size:12px;color:var(--c-t3);text-align:center}
#cal .grid{display:grid;grid-template-columns:repeat(7,1fr);
  border-top:1px solid var(--c-line-2);border-left:1px solid var(--c-line-2)}
#cal .h{display:none}   /* 星期头改由 .cweek 渲染 */
/* 日期格：淡分隔线（不是圆角卡片）*/
#cal .d{border-right:1px solid var(--c-line-2);border-bottom:1px solid var(--c-line-2);
  min-height:108px;padding:4px 5px;font-size:12px;overflow:hidden;background:var(--c-surface)}
/* ★ 滴答实测：非本月**仍是白底**，只有日期数字变淡（不能整格灰块）*/
#cal .d.out .dn{color:var(--c-t3)}
#cal .d.out .dlr{opacity:.7}
#cal .d .dtop{display:flex;align-items:flex-start;justify-content:space-between;gap:4px;min-height:18px}
#cal .d .dn{font-size:12.5px;color:var(--c-t1);width:18px;height:18px;border-radius:50%;flex:none;
  display:flex;align-items:center;justify-content:center;line-height:1}
               /* ★ 用 flex 居中（text-align 在定宽行内元素上不稳）*/
/* ★ 今天 = 蓝色实心圆底白字（滴答实测）*/
#cal .d.today .dn{background:var(--c-brand);color:#fff;font-weight:600}
#cal .d .dlr{font-size:11px;color:var(--c-t3);line-height:18px;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;text-align:right;flex:1;min-width:0}
/* 假日/节气用绿色（滴答实测）*/
#cal .d .dlr.fest{color:#0CCE9C}
/* ★ 事件条：圆角小块 + 勾选框 + 标题 + 右侧时间，**按清单色着色** */
#cal .ev{display:flex;align-items:center;gap:3px;border-radius:4px;padding:0 4px;margin-top:2px;
  font-size:11.5px;line-height:17px;cursor:pointer;overflow:hidden}
#cal .ev .evck{width:7px;height:7px;border:1.2px solid currentColor;border-radius:2px;flex:none;opacity:.75}
#cal .ev .evt{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#cal .ev .evm{flex:none;font-size:10.5px;opacity:.85}
#cal .ev.done{opacity:1}   /* ★ 滴答真值：不整条降透明 */
#cal .ev.done .evt{text-decoration:none;color:rgba(25,25,25,.4)}   /* ★ 无删除线 */
/* ★ 超 7 条折叠「+N」（滴答实测右下角灰字）*/
#cal .cmore{font-size:11px;color:var(--c-t3);text-align:right;padding:1px 4px 0;cursor:pointer}
#cal .cmore:hover{color:var(--c-brand)}
/* ══ 2026-09-19 日历月视图逐项对齐滴答（真机并排：_cmp_cal.js / _dida_caldiag2·3.js）══
   滴答真值：顶栏 h56 · pad 17px 22px 9px · 标题 14px/400
   · 加号 30x30 br8 · 月下拉 52x30 br8 · 三段导航 34/54/34 h28 br0（今天左右 1px 线）· 更多 30x30 br8
   · 星期头 h32 · 日格 244x182 无边框 · 周末列底色 rgba(25,25,25,.01)
   · 农历 12px/40% 距右 6 · 节日色 rgb(12,206,156)
   · 事件条 h18 br3 pad 3px mb2 底=清单色18% · 标题 12px/80% · 时间 10px/20% 距右 4
   · +N 12px/30% 居中 · 今天圆 rgb(14,73,250) */
#cal .cbar{height:56px;padding:17px 22px 9px;box-sizing:border-box;gap:0;align-items:center}
#cal .cbar .ct{font-size:14px;font-weight:400;gap:6px;line-height:18px}
#cal .cbar .ct .dti{width:16px;height:16px}
#cal .cbar .cops{margin-left:auto;gap:0;align-items:center;position:relative}
/* ★ 选择器必须到 (1,3,1)：遗留的 `#cal .cbar .cops button` 是 (1,2,1)，
   而全局 `button{min-height:var(--h-ctl)}`(=34px) 又压过 `height` —— 两处都要显式写。 */
#cal .cbar .cops button.cb{display:flex;align-items:center;justify-content:center;font-size:14px;
  color:var(--c-t1);font-family:inherit;cursor:pointer;background:transparent;border:0;padding:0}
#cal .cbar .cops button.cb-add{width:30px;height:30px;min-height:30px;padding:0;
  border:1px solid rgba(25,25,25,.2);border-radius:8px}
#cal .cbar .cops button.cb-view{width:52px;height:30px;min-height:30px;padding:0;gap:4px;
  border:1px solid rgba(25,25,25,.2);border-radius:8px;margin-left:16px}
#cal .cbar .cops button.cb-view .dti{width:12px;height:12px}
#cal .cbar .cops .cb-nav{display:flex;align-items:center;margin-left:17px}
#cal .cbar .cops .cb-nav button{width:34px;height:28px;min-height:28px;border:0;border-radius:0;
  padding:0;background:transparent;color:var(--c-t1);font-size:14px;font-family:inherit;cursor:pointer}
#cal .cbar .cops .cb-nav button.td{width:54px;border-left:1px solid rgba(25,25,25,.2);
  border-right:1px solid rgba(25,25,25,.2)}
#cal .cbar .cops button.cb-more{width:30px;height:30px;min-height:30px;padding:0;border:0;
  border-radius:8px;margin-left:12px;font-size:15px}
#cal .cbar .cops button.cb-add:hover,#cal .cbar .cops button.cb-view:hover,
#cal .cbar .cops button.cb-more:hover,#cal .cbar .cops .cb-nav button:hover{background:rgba(25,25,25,.05)}
html[data-theme="dark"] #cal .cbar .cops button.cb-add,html[data-theme="dark"] #cal .cbar .cops button.cb-view,
html[data-theme="dark"] #cal .cbar .cops .cb-nav button.td{border-color:rgba(255,255,255,.2)}
html[data-theme="dark"] #cal .cbar .cops button.cb-add:hover,html[data-theme="dark"] #cal .cbar .cops button.cb-view:hover,
html[data-theme="dark"] #cal .cbar .cops button.cb-more:hover,
html[data-theme="dark"] #cal .cbar .cops .cb-nav button:hover{background:rgba(255,255,255,.06)}
#cal .cbar #calMenu{right:22px;top:52px;min-width:172px}
#cal .cweek{padding:0}
#cal .cweek div{height:32px;line-height:32px;font-size:12px}
#cal .d{min-height:182px;padding:4px 5px}
/* ★★ 2026-09-23 第 68 轮 —— 日历条**拖拽改期**（对齐滴答月视图只读实测 `_dida_caldrag5/7/8.js`）：
   滴答 = ① 拖起时**源条** `opacity 1 → 0.4`；② 指针所在**日格**被加类 `highlight`，其计算背景
   由 `rgba(25,25,25,.01)` 变为 **`rgba(71,114,250,.1)`**（= primary 10%）—— 因果已用「手动加类」闭合
   （`_dida_caldrag8.js` ③：去掉拖拽、只加类，背景即变该值）；③ 释放后源条回 1、落点类移除。
   ⚠️ 与常驻的 `highlight-mask`（恒 `display:none`）**无关** —— 实测拖拽全程「可见 mask = 0 个」。
   ⇒ 我方：源条 `.ev.dz`（op .4）+ 日格 `.d.dz`（品牌色 10%）。选择器一律锁在 `#cal ` 作用域内。
   ⚠️ 此处品牌色 10% **显式写死**（而非 `var(--c-brand-bg)` = 9%）是为**逐值对齐滴答的 0.1**；
   若账本「甲 · 品牌蓝令牌」日后拍板改值，本节两条需同步。
   ★ 选择器 = `#cal .grid .d.dz`(1,3,0) 而**不是** `#cal .d.dz`(1,2,0)：后者与
   `#cal .d.wkend` **同特异性**、只能靠源序取胜 ⇒ r68 首跑 C34 正是栽在
   「拖到**周末格**被 `.wkend` 反超、背景停在 rgba(25,25,25,.01)」。
   故 ① 提高特异性 ② 整块放到 `.wkend` **之后**，双保险。 */
#cal .d.wkend{background:rgba(25,25,25,.01)}
html[data-theme="dark"] #cal .d.wkend{background:rgba(255,255,255,.02)}
#cal .ev.dz{opacity:.4}
#cal .grid .d.dz{background:rgba(45,111,247,.1)}
html[data-theme="dark"] #cal .grid .d.dz{background:rgba(77,134,255,.1)}
#cal .d .dlr{font-size:12px;line-height:18px;margin-right:1px;margin-top:4px}
#cal .ev{height:18px;line-height:18px;border-radius:3px;padding:0 3px;margin-top:2px;gap:0;
  color:rgba(25,25,25,.8)}   /* ★ 滴答真值：文字是**中性 80%**，不是清单色（底色才是清单色） */
html[data-theme="dark"] #cal .ev{color:rgba(255,255,255,.8)}
/* 事件条左侧勾选框：滴答 svg 盒 14x16、图形约 12x12，dx4；标题 dx20 */
/* ★★ 2026-09-19 事件条左侧图标 —— 按滴答**放大渲染实测**重画（`_dida_evbox2.js` 量盒 / `_dida_evicon.js` 取 sprite
   / `_evicon_measure.py`+`_evicon_knock.py` 把字形渲到 400×400 用 PIL 量几何）：
   滴答 = **svg 图标位 14×16（`margin-right:2px`）+ 24 格 viewBox 字形渲成 10.5×10.5 居中**；
   字形**两态**：未完成 = `#calendar-checkbox`（圆角方**描边**：外框 3..21 / r5 / 线宽 **1.5 格**）·
   已完成 = `#calendar-complete`（**实心**圆角方 + **挖空对勾**：中心线 (8.6,12.9)→(11.35,15.85)→(16.2,7.5)、线宽 1.6 格）。
   我方原来是「12×12 CSS 边框盒 + 1.2px 边框」⇒ 方块比滴答大 ~50%、且**没有完成态字形**（滴答已完成事件换实心勾）。
   ⇒ 图标位 14×16 + mr 2 ⇒ **标题 dx 仍是 20**（3+1+14+2 = 20，与滴答同），只是**字形**变准。 */
#cal .ev .evck{width:14px;height:16px;flex:none;display:flex;align-items:center;justify-content:center;
  margin-left:1px;margin-right:2px;border:0;background:transparent;border-radius:0}
#cal .ev .evck svg{width:10.5px;height:10.5px;display:block}
/* ⚠️ 选择器**不能带 `#cal ` 前缀** —— 这个 svg 是 `#cal` 的**兄弟**（renderCal 会清空 #cal），
   写成后代选择器规则不生效 ⇒ svg 按默认尺寸撑开布局（实测：日历日格宽 244 → 201，被 C10/C11 抓到）。 */
.evdefs{position:absolute;width:0;height:0;overflow:hidden;pointer-events:none}
#cal .ev .evt{font-size:12px}
#cal .ev .evm{font-size:10px;opacity:1;margin-left:4px;margin-right:1px;color:rgba(25,25,25,.2)}
html[data-theme="dark"] #cal .ev .evm{color:rgba(255,255,255,.2)}
#cal .cmore{font-size:12px;text-align:center;color:rgba(25,25,25,.3);padding:1px 0 0}
html[data-theme="dark"] #cal .cmore{color:rgba(255,255,255,.3)}
/* ★★ 2026-09-20 第 27 轮 —— 超 7 条折叠「+N」与第 7 条事件条**并排**（滴答真机实测 `_dida_plusN7.js` / `_dida_plusN8.js`）
   滴答 = 日格 7 个 20px 槽位；超 7 条时**不新增行**：第 7 槽内 bar 由 225 → **192**（窄 33px = `+N` 宽）
   + `.more-cel` **33×20** 贴日格右缘（距右 0、与 bar 相隔 3px）· `flex:0 0 auto` · fs12 / lh18 / `rgba(25,25,25,.3)` / 居中。
   我方原实现是把 `+N` 渲染成日格内的**第 8 行** ⇒ 改为并排。 */
#cal .evrow{display:flex;align-items:center;margin-top:2px;overflow:hidden}
#cal .evrow .ev{flex:1;min-width:0;margin-top:0}
#cal .evrow .cmore{flex:0 0 33px;width:33px;margin-top:0;padding:0;line-height:18px}
#cal .d.today .dn{background:#0E49FA}
#tl{display:none;flex:1;overflow:auto;padding:12px 16px}
#tl .row{display:flex;align-items:center;gap:10px;margin-bottom:8px}
#tl .nm{width:110px;font-size:13px;color:var(--c-t3);flex:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#tl .track{flex:1;position:relative;height:26px;background:var(--c-surface-2);border-radius:6px}
#tl .bar{position:absolute;height:20px;top:3px;background:var(--c-brand);border-radius:5px;color:#fff;font-size:11.5px;padding:0 8px;line-height:20px;white-space:nowrap;overflow:hidden}
/* ══ 四象限 v2（2026-09-14 对齐滴答）：2×2 卡片 + 象限头 + 组内分组 ══ */
/* ★★ 2026-09-17 更正（交互面4 真机实测，推翻 09-15 的「十字分隔线」结论）：
   滴答四象限**没有分隔线**，而是「页面底 #fafafa + 4 张白卡 br12 + 12px 间距」。
   实测：容器 display:grid / gap:12px / cols 826.5×2 / rows 454×2 / pad 0 22px 16px；
        象限卡 .quadrant-sortable = bg #fff / border-radius 12px / **无边框**；
        卡坐标 (72,64)(911,64)(72,530)(911,530) 各 827×454 → 横竖缝均 12px。
   原先 gap:1px + 容器底色造「十字线」是**看错**（12px 灰缝看起来像细线）。*/
#mx{display:none;flex:1;min-height:0;padding:0;gap:0;background:transparent}
#mx.on{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  grid-template-rows:minmax(0,1fr) minmax(0,1fr);
  gap:12px}  /* ★ 12px 缝（透出页面底色）—— 滴答同款
               ★ 必须 minmax(0,1fr)：纯 1fr 会被长内容撑破，四格不等宽 */
#mx .q{background:var(--c-surface);border:0;border-radius:12px;display:flex;flex-direction:column;
  min-width:0;min-height:0;overflow:hidden}   /* ★ 滴答白卡 br12、无边框 */
/* ★ 2026-09-17 更正：格标题 = emoji + 名称（无底边框）。
   实测：卡 x=72、emoji 布局 x=80（= 卡左 + 12(padding) − 4(ml)）、名称容器 x=84；
        ⋯ 右缘 887（= 卡右 899 − 12）→ padding 左右均 12px；头高 24。 */
#mx .qhead{display:flex;align-items:center;gap:8px;padding:8px 12px;border-bottom:0;flex:none}
/* ★★ 2026-09-17 更正（交互面4）：**不是序号数字**！
   滴答标题前是 **emoji 箭头** ⬆️↗️➡️⬇️ —— 视觉上的「蓝方块 + 白色箭头」是该 emoji
   的**字体渲染**，不是我们画的色块。（09-15 的「1/2/3/4」结论是错的。）
   实测：emoji 盒 24×24、margin-left:-4px、以 font-size:24px 渲染；无底色、无圆角。 */
#mx .qhead .qm{width:24px;height:24px;flex:none;margin-left:-4px;text-align:center;
  font-size:24px;line-height:24px;font-family:inherit;font-weight:400;
  background:transparent;color:inherit}
#mx .qhead .qn{font-size:14px;font-weight:400;color:var(--c-t1)}   /* ★ 滴答全量测：14px / 400 */
#mx .qhead .qc{font-size:12px;color:var(--c-t3)}
#mx .qhead .qops{margin-left:auto;display:flex;gap:2px}
#mx .qhead .qops button{border:0;background:transparent;color:var(--c-t3);cursor:pointer;border-radius:6px;
  padding:2px 6px;font-size:14px;line-height:1.2}
#mx .qhead .qops button:hover{background:var(--c-surface-2);color:var(--c-brand)}
/* ★ 2026-09-16：象限「...」菜单（滴答桌面端：编辑 / 排序 → 5 个排序键 + 自定义）*/
#mxQMenu{position:fixed;display:none;z-index:60;min-width:170px;background:var(--c-surface);
  border:1px solid var(--c-line);border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,.14);padding:5px}
#mxQMenu.on{display:block}
#mxQMenu .mi{display:flex;align-items:center;gap:8px;height:32px;padding:0 10px;border-radius:6px;
  font-size:13px;color:var(--c-t1);cursor:pointer;white-space:nowrap}
#mxQMenu .mi:hover{background:var(--c-surface-2)}
#mxQMenu .mi .dti{width:16px;height:16px;flex:none;color:var(--c-t2);fill:none;stroke:currentColor}
#mxQMenu .mihead{color:var(--c-t3);font-size:12px;height:26px;cursor:default}
#mxQMenu .mihead:hover{background:transparent}
#mxQMenu .miind{padding-left:10px}
#mxQMenu .miind.on{color:var(--c-brand);font-weight:600}
#mxQMenu .miind .miw{width:12px;flex:none;display:inline-block}
#mxQMenu .sep{height:1px;background:var(--c-line);margin:4px 2px}
/* ══ 2026-09-17 对齐滴答：象限「⋯」= 设置型菜单（202×154，4 项各带「当前值 + 右箭头」）══ */
#mxQMenu{min-width:202px;width:202px}
#mxQMenu .mi{height:36px}
#mxQMenu .mi .mxv{margin-left:auto;font-size:13px;color:var(--c-t3);max-width:96px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
#mxQMenu .mi .dtarw{flex:none;margin-left:4px;display:inline-flex;align-items:center}
#mxQMenu .mi .dtarw .dti{width:12px;height:12px;fill:currentColor;stroke:none}
#mxQMenu .mi .dti{width:18px;height:18px}
/* 二级（点击展开，位于主菜单右侧；滴答 164 宽） */
#mxQMenu2{position:fixed;display:none;z-index:61;width:164px;min-width:164px;background:var(--c-surface);
  border:1px solid var(--c-line);border-radius:12px;box-shadow:0 4px 12px rgba(0,0,0,.2);padding:4px 0}
#mxQMenu2.on{display:block}
#mxQMenu2 .mi{display:flex;align-items:center;height:36px;padding:0 12px;font-size:14px;color:var(--c-t1);cursor:pointer}
#mxQMenu2 .mi:hover{background:var(--c-surface-2)}
#mxQMenu2 .mi.on{color:var(--c-brand);font-weight:600}
#mxQMenu2 .mi .miw{width:12px;flex:none;display:inline-block}
/* ══ 「编辑象限」弹层（滴答 558×374 · br16 · 白底）══ */
#mxRuleWrap{position:fixed;left:52px;right:0;top:0;bottom:0;background:rgba(0,0,0,.38);display:none;
  align-items:center;justify-content:center;z-index:72}
#mxRuleWrap.on{display:flex}
.mxrule{width:558px;background:var(--c-surface);border-radius:16px;box-shadow:0 12px 40px rgba(0,0,0,.2);
  padding:18px 20px 16px;display:flex;flex-direction:column;gap:10px}
.mxrule h3{margin:0;font-size:16px;font-weight:600;color:var(--c-t1)}
.mxrule .mxr-q{display:flex;align-items:center;gap:8px;height:38px;padding:0 12px;border:1px solid var(--c-brand);
  border-radius:9px;background:var(--c-surface);cursor:pointer;font-size:14px;color:var(--c-t1);width:100%;
  box-sizing:border-box;text-align:left}
.mxrule .mxr-q:hover{background:var(--c-brand-bg)}
.mxrule .mxr-q .dti{width:18px;height:18px;flex:none}
.mxrule .mxr-row{display:flex;align-items:flex-start;gap:12px}
.mxrule .mxr-row>label{flex:none;width:56px;font-size:13.5px;color:var(--c-t2);padding-top:8px}
.mxrule .mxr-row .mxr-ctl{flex:1;min-width:0}
.mxrule select.mxr-sel{width:100%;height:36px;border:1px solid var(--c-line);border-radius:9px;background:var(--c-surface);
  color:var(--c-t1);font:inherit;font-size:13.5px;padding:0 10px;box-sizing:border-box}
.mxrule .mxr-opts{display:flex;align-items:center;gap:18px;padding-top:7px;flex-wrap:wrap}
.mxrule .mxr-opts .mxo{display:inline-flex;align-items:center;gap:6px;font-size:13.5px;color:var(--c-t1);cursor:pointer}
.mxrule .mxr-opts .mxo .bx{width:15px;height:15px;border:1.5px solid var(--c-line);border-radius:50%;flex:none;
  display:inline-flex;align-items:center;justify-content:center;color:transparent;font-size:10px;box-sizing:border-box}
.mxrule .mxr-opts .mxo.on .bx{background:var(--c-brand);border-color:var(--c-brand);color:#fff}
.mxrule .mxr-foot{display:flex;align-items:center;gap:10px;margin-top:6px}
.mxrule .mxr-foot .lk{background:none;border:0;color:var(--c-brand);font:inherit;font-size:13.5px;cursor:pointer;padding:4px 0}
.mxrule .mxr-foot .sp{margin-left:auto}
.mxrule .mxr-foot button{border:1px solid var(--c-line);background:var(--c-surface);color:var(--c-t1);
  border-radius:9px;height:34px;padding:0 18px;font:inherit;font-size:13.5px;cursor:pointer}
.mxrule .mxr-foot button.pri{background:var(--c-brand);border-color:var(--c-brand);color:#fff}
/* 规则示例弹层 */
#mxRuleDemo{position:fixed;left:52px;right:0;top:0;bottom:0;background:rgba(0,0,0,.38);display:none;
  align-items:center;justify-content:center;z-index:73}
#mxRuleDemo.on{display:flex}
.mxdemo{width:520px;max-height:78vh;overflow:auto;background:var(--c-surface);border-radius:16px;
  box-shadow:0 12px 40px rgba(0,0,0,.2);padding:18px 20px}
.mxdemo h3{margin:0 0 4px;font-size:16px}
.mxdemo .mxd-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin:10px 0 12px}
.mxdemo .mxd-c{border:1px solid var(--c-line);border-radius:10px;padding:10px 12px}
.mxdemo .mxd-c .t{font-size:13.5px;font-weight:600;margin-bottom:6px}
.mxdemo .mxd-c .v{font-size:13px;color:var(--c-t2)}
.mxdemo .mxd-p{font-size:13px;color:var(--c-t2);line-height:1.7;margin:6px 0 12px}
.mxdemo .mxd-foot{display:flex;gap:10px;justify-content:flex-end}
.mxdemo .mxd-foot button{border:1px solid var(--c-line);background:var(--c-surface);color:var(--c-t1);
  border-radius:9px;height:34px;padding:0 18px;font:inherit;font-size:13.5px;cursor:pointer}
.mxdemo .mxd-foot button.pri{background:var(--c-brand);border-color:var(--c-brand);color:#fff}
/* ══ 象限「＋」浮层快速添加卡（滴答 ≈392×300）══ */
#mxQA{position:fixed;display:none;z-index:74;width:392px;background:var(--c-surface);border:1px solid var(--c-line);
  border-radius:14px;box-shadow:0 12px 40px rgba(0,0,0,.18);padding:14px 16px 10px}
#mxQA.on{display:block}
#mxQA .qa-top{display:flex;align-items:center;gap:8px;margin-bottom:12px}
#mxQA .qa-b{border:1px solid var(--c-line);background:var(--c-surface);color:var(--c-t2);border-radius:8px;
  height:28px;padding:0 10px;font:inherit;font-size:12.5px;cursor:pointer;display:inline-flex;align-items:center;gap:5px}
#mxQA .qa-b.on{border-color:var(--c-brand);color:var(--c-brand);background:var(--c-brand-bg)}
#mxQA .qa-b.flag{margin-left:auto;padding:0 8px}
#mxQA .qa-b .dti{width:15px;height:15px}
#mxQA input{width:100%;border:0;outline:0;background:transparent;font:inherit;font-size:17px;color:var(--c-t1);
  padding:4px 0;box-sizing:border-box}
#mxQA input::placeholder{color:var(--c-t3)}
#mxQA .qa-sub{font-size:12.5px;color:var(--c-t3);padding:2px 0 10px}
#mxQA .qa-foot{display:flex;align-items:center;gap:8px;border-top:1px solid var(--c-line);padding-top:8px;
  font-size:12.5px;color:var(--c-t3)}
#mxQA .qa-foot .sp{margin-left:auto;letter-spacing:1px}
#mx .qbody{flex:1;min-height:0;overflow:auto;padding:4px 6px 10px}
#mx .mgrp{margin-top:4px}
#mx .mgh{display:flex;align-items:center;gap:4px;font-size:12px;color:var(--c-t3);padding:4px 6px;
  cursor:pointer;user-select:none}
#mx .mgh:hover{color:var(--c-t1)}
#mx .mgh .arw{font-size:9px;width:9px;flex:none}
#mx .mgrp.cl .mrow,#mx .mgrp.cl .mxmore{display:none}
#mx .mrow{display:flex;align-items:flex-start;gap:8px;padding:8px 8px;border-radius:8px;cursor:pointer}
#mx .mrow:hover{background:var(--c-surface-2)}
#mx .mrow.sel{background:var(--c-brand-bg)}
#mx .mxchk{width:15px;height:15px;border:1.5px solid var(--c-line);border-radius:4px;flex:none;margin-top:2px;
  display:inline-flex;align-items:center;justify-content:center;font-size:11px;color:transparent;background:var(--c-surface)}
#mx .mxchk.on{background:var(--c-brand);border-color:var(--c-brand);color:#fff}
#mx .mxt{flex:1;min-width:0;font-size:13px;line-height:1.6;word-break:break-word;color:var(--c-t1)}
#mx .mrow.done .mxt{color:var(--c-t3);text-decoration:line-through}
#mx .mxmeta{flex:none;display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--c-t3);padding-top:3px}
#mx .mxmeta .duedot{width:5px;height:5px;border-radius:50%;border:1.4px solid currentColor;display:inline-block}
#mx .mxmeta .over{color:var(--c-bad)}
#mx .mxmeta .today{color:#4772fa}
#mx .mxmore{font-size:12px;color:var(--c-t3);padding:4px 8px;cursor:pointer}
#mx .mxmore:hover{color:var(--c-brand)}
#mx .mxempty{font-size:12.5px;color:var(--c-t3);padding:10px 8px}
.mask{position:fixed;inset:0;background:rgba(0,0,0,.38);display:none;align-items:center;justify-content:center;z-index:50}
.mask.on{display:flex}
.modal{background:var(--c-surface);border-radius:12px;width:470px;max-width:93vw;max-height:86vh;overflow:auto;padding:18px}
.modal h3{font-size:16px;margin-bottom:12px}
/* ══ 添加清单弹窗（滴答清单式）══ */
.pj-modal{width:520px}
.pj-name{display:flex;align-items:center;gap:8px;border:1.5px solid var(--c-brand);border-radius:10px;
  padding:0 12px;margin-bottom:14px;background:var(--c-surface)}
.pj-name .dti{color:var(--c-t3)}
.pj-name input{flex:1;border:0!important;outline:none;background:transparent;font-size:14px;
  padding:8px 0;min-height:34px}
.pj-row{display:flex;align-items:flex-start;gap:14px;margin-bottom:12px}
.pj-row>label{width:52px;flex:none;font-size:13px;color:var(--c-t2);padding-top:8px;line-height:1.3}
.pj-row>.pj-ctl{flex:1;min-width:0}
.pj-colors{display:flex;gap:8px;flex-wrap:wrap;padding-top:4px}
.pj-c{width:23px;height:23px;border-radius:50%;cursor:pointer;flex:none;position:relative;
  border:2px solid transparent;transition:transform .12s}
.pj-c:hover{transform:scale(1.12)}
.pj-c.on{border-color:var(--c-t1);box-shadow:0 0 0 2px var(--c-surface) inset}
.pj-c.none{background:transparent!important;border:1.8px solid var(--c-t3);
  display:flex;align-items:center;justify-content:center}
.pj-c.none::after{content:'';position:absolute;width:130%;height:1.8px;background:var(--c-t3);
  transform:rotate(-45deg);border-radius:2px}
.pj-views{display:flex;gap:8px}
.pj-v{width:52px;height:44px;border:1.5px solid var(--c-line);border-radius:9px;cursor:pointer;
  display:flex;align-items:center;justify-content:center;color:var(--c-t2);background:var(--c-surface);
  transition:.14s;position:relative}
.pj-v:hover{border-color:var(--c-t3)}
.pj-v.on{border-color:var(--c-brand);color:var(--c-brand);background:var(--c-surface-2)}
.pj-sel{width:100%;border:1px solid var(--c-line);border-radius:9px;padding:8px 12px;font-size:13.5px;
  background:var(--c-surface);color:var(--c-t1);outline:none;min-height:34px}
.pj-foot{display:flex;gap:10px;justify-content:flex-end;margin-top:18px}
.pj-tabs{display:flex;gap:16px;margin-bottom:12px}
.pj-tabs span{font-size:13px;color:var(--c-t3);cursor:pointer;padding-bottom:4px;
  border-bottom:2px solid transparent}
.pj-tabs span.on{color:var(--c-brand);border-color:var(--c-brand);font-weight:600}
/* 侧栏章节可点击 */
.sec.secbtn{cursor:pointer;border-radius:7px;margin:0 6px;padding:8px 8px 3px;
  display:flex;align-items:center;gap:4px;transition:background .12s}
.sec.secbtn:hover{background:color-mix(in srgb,var(--c-t1) 4%,transparent)}   /* r73/㉘：滴答画底层 hover = rgba(25,25,25,.04)（真像素众数 246,246,246，`_r73_px_dida.out`）；经令牌 ⇒ 暗色自动为 4% 白，与既有暗色 hover 口径同族 */
/* ★★ r72 / ㉕：滴答「清单」段头（`div.project-list`）**hover 才现**的折叠三角
   真值（`_regress_logs/_dida_sec25.out`）：容器 `div.h-full.absolute` = **14 宽 @dx10**（全高 30）
   · 内 `svg 12×12 @dx11`（垂直居中）· `use=#thin-triangle-down`
   · 色 `rgba(25,25,25,.4)`（= 我方 `--c-t3`，逐值一致）· **三态 opacity 0 → hover 1 → 移开 0**
   ⚠️ 标签 dx24 三态不变（三角占的就是 padding-left 那 14px）
   ⇒ 用**绝对定位**，绝不能做 flex 项（否则挤动标签）· `pointer-events:none` 让点击穿透到整行（=折叠） */
#side .sec.secbtn{position:relative}
#side .secbtn .sarw{position:absolute;left:0;top:0;bottom:0;width:14px;display:inline-flex;
  align-items:center;justify-content:center;color:var(--c-t3);opacity:0;
  transition:opacity .12s,transform .15s;pointer-events:none}
#side .secbtn .sarw svg{width:12px;height:12px;display:block}
#side .secbtn:hover .sarw{opacity:1}
#side .secbtn.cl .sarw{transform:rotate(-90deg)}
/* ★ C4：侧栏段头的折叠箭头 = 12×12 svg（盒 16×12）· 40% 灰
   ⚠️ 只限 `#side`：`.arw` 还被四象限/详情面板等复用 */
#side .sec .arw{display:inline-flex;align-items:center;justify-content:center;width:16px;height:12px;
  flex:none;color:var(--c-t3);transition:transform .15s}
#side .sec .arw svg{width:12px;height:12px;display:block}
#side .sec.cl .arw{transform:rotate(-90deg)}
.sec .arw{font-size:9px;color:var(--c-t3);transition:transform .15s;display:inline-block;margin-left:auto}
.sec.cl .arw{transform:rotate(-90deg)}
.sec .add{margin-left:6px;color:var(--c-t3);font-size:15px;line-height:1;padding:0 3px;border-radius:5px}
/* ★ 2026-11-14 六六·星火B #4022 D5：清单段头「＋」新建入口（对齐滴答 add-icon）
   滴答真值：16×16 · 常态 opacity:0 · hover 才显形 · 点击开「新建清单」弹层
   ★ 绝对定位到段头右缘（不挤动「清单」标题 dx）· 幂等标记 PROJ_SEC_ADD_BTN */
.sec .secadd{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:16px;height:16px;
  display:inline-flex;align-items:center;justify-content:center;border-radius:4px;
  color:var(--c-t3);font-size:14px;line-height:1;cursor:pointer;opacity:0;transition:opacity .12s}
.sec:hover .secadd{opacity:1}
.sec .secadd:hover{background:var(--c-line);color:var(--c-t1)}
.sec .add:hover{background:var(--c-line);color:var(--c-t1)}
.secbtn .add{margin-left:0}
.secbtn .cnt2{margin-left:auto;font-size:11.5px;color:var(--c-t3);font-weight:400}
/* ★★ C4：滴答段头（`_dida_side1.js`）：h **30** · pad **`0 10px 0 14px`** · br 6 ·
   **fs 12 / fw 700 / rgba(25,25,25,.3)（30% 灰，比正文的 40% 又淡一档）**
   —— 作用域限定 `#side`（搜索弹窗等处也用 .sec） */
#side .sec{min-height:30px;padding:0 10px 0 14px;border-radius:6px;font-size:12px;font-weight:700;
  color:rgba(25,25,25,.3)}
html[data-theme="dark"] #side .sec{color:rgba(255,255,255,.3)}
#side .sec.sub{padding-left:14px;font-size:12px;opacity:1}
.sec.sub .cnt2{margin-left:auto;font-size:11px;color:var(--c-t3);font-weight:400}
/* ══ 文件夹（清单分组）2026-09-17 对齐滴答「用文件夹管理任务」══
   滴答：文件夹图标 + 组内清单**缩进** + 点标题展开/折叠 + 桌面端右键解散 + 拖清单进文件夹出现**蓝框** */
.sec.sub.fgrp{padding:6px 12px 3px;cursor:pointer;gap:4px}
.sec.sub.fgrp:hover{color:var(--c-t1)}
.sec.sub.fgrp .arw{font-size:9px;width:9px;flex:none}
.sec.sub.fgrp .fgn{margin-left:4px;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}
.sec.sub.fgrp .cnt2{margin-left:auto;font-size:11px;color:var(--c-t3);font-weight:400;flex:none}
.sec.sub.fgrp.droppok{box-shadow:inset 0 0 0 1px rgba(25,25,25,.2);border-radius:6px}
.li.ind{padding-left:26px}          /* ★ 组内清单缩进（滴答同款） */
.li.dropok{box-shadow:inset 0 0 0 1px rgba(25,25,25,.2)}
html[data-theme="dark"] .li.dropok,html[data-theme="dark"] .sec.sub.fgrp.droppok{box-shadow:inset 0 0 0 1px rgba(255,255,255,.2)}
.tabs{display:flex;gap:18px;border-bottom:1px solid var(--c-line);margin-bottom:14px}
.tabs div{padding:8px 0;font-size:13.5px;color:var(--c-t3);cursor:pointer;border-bottom:2px solid transparent}
.tabs div.on{color:var(--c-brand);border-color:var(--c-brand);font-weight:600}
.invite{display:flex;gap:8px;margin-bottom:12px;flex-wrap:wrap}
.invite select,.invite input{border:1px solid var(--c-line);border-radius:8px;padding:8px 10px;font-size:13px;outline:none;background:var(--c-surface);color:var(--c-t1)}
.invite select{width:96px}.invite input{flex:1;min-width:130px}
.mrow{display:flex;align-items:center;gap:8px;padding:8px 0;border-bottom:1px solid var(--c-line)}
.mrow .nm{flex:1;font-size:13.5px}
.mrow .owner{font-size:11.5px;color:var(--c-t3);background:var(--c-surface-2);border-radius:6px;padding:2px 8px}
.sw{display:flex;align-items:center;gap:8px;padding:8px 0;font-size:13.5px}
.menu{position:absolute;background:var(--c-surface);border:1px solid var(--c-line);border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,.14);padding:6px;display:none;z-index:45;min-width:190px}
.menu.on{display:block}
.menu .it{padding:8px 10px;border-radius:7px;font-size:13.5px;cursor:pointer}
.menu .it:hover{background:var(--c-surface-2)}
.menu .row{display:flex;gap:4px;padding:4px 6px 8px}
.menu .row button{border:1px solid var(--c-line);background:var(--c-surface);border-radius:7px;padding:4px 8px;font-size:12.5px;cursor:pointer;color:var(--c-t1)}
.menu .row button.on{background:var(--c-brand);color:#fff;border-color:var(--c-brand)}
.menu .sep{height:1px;background:var(--c-line);margin:4px 2px}
.panel{position:absolute;right:12px;top:54px;width:340px;background:var(--c-surface);border:1px solid var(--c-line);border-radius:10px;box-shadow:0 8px 24px rgba(0,0,0,.14);display:none;max-height:62vh;overflow:auto;z-index:44}
.panel.on{display:block}
.prow{padding:10px 12px;border-bottom:1px solid var(--c-line);font-size:13px}
.prow b{font-size:13.5px}.prow .tm{font-size:11.5px;color:var(--c-t3);margin-top:3px}
.badge{background:var(--c-bad);color:#fff;border-radius:9px;font-size:11px;padding:0 4px;min-width:17px;text-align:center;display:inline-block}
.act{font-size:12.5px;color:var(--c-t3);padding:6px 0;border-bottom:1px solid var(--c-line)}
.empty{text-align:center;color:var(--c-t3);padding:60px 0;font-size:13.5px}
.crow{display:flex;gap:8px;align-items:flex-start;padding:8px 0;border-bottom:1px solid var(--c-line);font-size:13px}
.crow .av{width:22px;height:22px;border-radius:50%;background:var(--c-brand);color:#fff;font-size:11px;display:flex;align-items:center;justify-content:center;flex:none}
/* ══ 2026-09-23 r60：对齐滴答「搜索」浮层**形态**（真机 `_dida_search1/2/5/7/8.js` × `_our_search1.js`）
   滴答 = 顶栏下**浮层**（inline `top:160px; left:50%; transform:translateX(-50%)` · `width:80%` /
   `max-width:560px` · `height:422px` / `max-height:80%` · `border-radius:12px` · 白底 ·
   `box-shadow rgba(0,0,0,.2) 0 5px 18px`）· **无标题、无关闭按钮** ⇒ 关：Esc / 点浮层外。
   输入框 520×54（容器左起 `20px`）· fs16 · lh24 · `padding:0 0 0 32px` · **仅下边框** `1px rgba(25,25,25,.1)`
   · 左放大镜 22×22（垂直居中 / `rgba(25,25,25,.6)`）。
   空态 = 170×170 插图 + 「输入关键词即可搜索」（fs14 / lh20 / `rgba(25,25,25,.6)` / `padding:0 20px`）。
   ★ r104：**范围 chips（任务/标签/清单）已落地**（`.srch-scope` ／ `.scp`，守卫 `_search_verify.js` SC1~SC5）。
       空态上方那 `44px`（间隔 16 ＋ chips 行 24 ＋ 内层 4）仍**照留**（r104 起由真 chips 行承担）。 */
#searchMask{align-items:flex-start;padding:0}
#searchMask .modal{width:80vw;max-width:560px;height:422px;max-height:80vh;margin-top:160px;padding:0;
  border-radius:12px;overflow:hidden;box-shadow:0 5px 18px rgba(0,0,0,.2);
  display:flex;flex-direction:column;box-sizing:border-box}
#searchMask .srch-in{position:relative;margin:0 20px;height:54px;flex:none}
#searchMask .srch-in input{width:100%;height:100%;box-sizing:border-box;border:0;
  border-bottom:1px solid rgba(25,25,25,.1);border-radius:0;background:transparent;
  font-size:16px;line-height:24px;padding:0 0 0 32px;margin:0;color:var(--c-t1);font-family:inherit;outline:none}
#searchMask .srch-ico{position:absolute;left:0;top:50%;transform:translateY(-50%);width:22px;height:22px;
  color:rgba(25,25,25,.6);pointer-events:none}
/* ★★ r104（矩阵「搜索 · 默认渲染」）：范围 chips 行（任务 / 标签 / 清单）—— 对齐滴答 `.filter-advance`
   滴答真值（只读探针 `_r102_dida_chips.js` ＋ `_r104_dida_chips2.js`
             → `_regress_logs/_r102_dida_chips.out` ／ `_r104_dida_chips2.out`）：
     · 行盒 = 容器左起 20px、**520×24**、位于输入框行下方（间隔 **16**）；chip 间距 **8**
     · 静息 chip = **42×24** · `border 1px rgba(25,25,25,.1)` · `border-radius 8px` · `padding 0 8px`
       · 标签文字 **fs12 / lh14** · 色 `rgb(25,25,25)`
     · hover ⇒ **只有边框色**转品牌蓝 `rgb(71,114,250)`（底色/文字色不动）
     · 点一枚 ⇒ 该范围成为筛选：结果由「分区预览（任务最多 5 条）」变「该范围**完整**列表」
       （实测 任务 9→158 行 · 标签 9→3 行 · 清单 9→0 行）；`hash` 全程不变
     · 选中 chip = **76 宽**：`16×16 图标` ＋ 2px ＋ `12px 标签（品牌蓝）` ＋ 4px ＋ `12×12 ✕`
       · 边框色仍同静息（`hover` 才转蓝 —— r102 记的「就地转蓝」实为鼠标正停在该 chip 上）
     · 点 **✕** ⇒ 清除筛选、回到 3 枚静息 chip ＋ 分区预览（实测 3→9 行）
     · 静息下再点同一枚**不回落**（只有 ✕ 能清）
   ★ 元素选择：滴答这排 chip 是 **`DIV`**（非 `button`）⇒ 我方用 **`span`**（**不是 `button`**）——
     ① 与滴答一致；② 不把浮层拽进 Tab 序（r102 `S18a` 已固化「浮层子树 `[tabindex]`=0 · 可聚焦=1 且唯一=`#sq`」，
        滴答同为仅 `input.search-box`）；③ 顺带绕开全局 `button{min-height:var(--h-ctl)}`（34px）撑高。
     `min-height:0` / `gap:0` 为冗余保险（span 本就不受全局 button 规则影响）。 */
#searchMask .srch-scope{display:flex;align-items:center;gap:8px;margin:16px 20px 0;height:24px;flex:none;
  box-sizing:border-box;overflow:hidden}
#searchMask .scp{display:inline-flex;align-items:center;box-sizing:border-box;height:24px;min-height:0;
  gap:0;padding:0 8px;flex:none;border:1px solid rgba(25,25,25,.1);border-radius:8px;background:transparent;
  color:rgb(25,25,25);font-family:inherit;font-size:12px;line-height:14px;white-space:nowrap;cursor:pointer}
#searchMask .scp:hover{border-color:rgb(71,114,250)}
#searchMask .scp.on{color:rgb(71,114,250)}
#searchMask .scp-ic{width:16px;height:16px;flex:none;display:flex;align-items:center;justify-content:center;
  margin-right:2px}
#searchMask .scp-ic svg{width:16px;height:16px;display:block;flex:none}
#searchMask .scp-x{width:12px;height:12px;flex:none;display:block;margin-left:4px;fill:none;
  stroke:currentColor;stroke-width:1.2;stroke-linecap:round}
html[data-theme="dark"] #searchMask .scp{border-color:rgba(255,255,255,.15);color:var(--c-t1)}
html[data-theme="dark"] #searchMask .scp.on{color:rgb(108,142,251)}
#searchMask .srch-empty{display:flex;flex-direction:column;align-items:center;margin-top:4px;padding:31px 0 0;flex:none}
#searchMask .srch-art{width:170px;height:170px;flex:none;color:rgba(25,25,25,.1)}
#searchMask .srch-empty p{margin:0;padding:0 20px;font-size:14px;line-height:20px;
  color:rgba(25,25,25,.6);text-align:center}
/* ★ r61fix1：有词态结果区顶部让出 56px —— 滴答实测「输入框底 214 → 分区头顶 270」
   （16 间隔 + chips 行 24 + 4 间隔 + suggest 内层 12）。范围 chips 本身仍未渲染，只补它占的高度。
   空态不受影响：`#sEmpty` 是 `#sres` 的**兄弟**（自己的 margin-top:44px 仍负责插图 +129）。 */
#searchMask #sres{flex:1;min-height:0;overflow:auto;padding:16px 0 0}

/* ★★ r61（㉑ 第 2 步「建议行三行化 + 命中染色」）—— 下列数值全部来自滴答真机实测
   （探针 `_dida_search2/4/5.js`，输出 `_regress_logs/_dida_search*.out`）：
     · 分区头 `sectionHeader` 520x17 @dx20（fs12 / fw600 / lh17 / 主文字色）
     · 建议行 `LI.suggest-item` 544x55 @dx8（pad `0 12px` / br10 / 常态透明 ·
       hover 底 `rgba(25,25,25,.04)`，移开回落）
     · 首行盒 520x32 ＝ 16x16 图标 + 标题 fs14/lh21 ＋ 右端清单名 68x19
     · 描述行 496x26 @dx24（fs12 / lh16 / `rgba(25,25,25,.4)`）
     · 命中染色 = `<marker>`（bg `rgb(242,217,162)`，标题与描述里每处命中各一个）
   ⛔ 范围 chips 仍不渲染：r59 + r60 两支只读探针均证「click 不留任何持久状态」
      （点完把鼠标移开安全区，边框回落到 `rgba(25,25,25,.1)`）⇒ 落点语义未坐实，宁缺勿假；
      它占的 44px 行高照留（否则空态插图 y 与滴答对不上）。
   ⛔ 「查看更多」入口与结果视图（滴答 hash `#s/`）= **r62 已落地**（不再是「本轮不做」）。
   ★ r101：点击落点已对齐 —— 点建议项（任务）⇒ 关浮层 + **进搜索结果视图** + 开该任务详情
      （与「查看更多」同一条路径）；滴答真值与改前对照见 `pickTask()` 上方注释。 */
#searchMask .ssec{display:block;height:17px;margin:0 20px 7px;font-size:12px;font-weight:600;
  line-height:17px;color:var(--c-t1)}   /* 盒 520×17 @dx20 · 与首行建议行留 7px（滴答 287→294） */
#searchMask .sug{margin:0 8px;padding:0 12px;border-radius:10px;box-sizing:border-box;
  overflow:hidden;cursor:pointer}
#searchMask .sug.t{height:55px}
#searchMask .sug.s{height:32px}
#searchMask .sug:hover{background:rgba(25,25,25,.04)}
#searchMask .sug.sel{background:color-mix(in srgb,var(--c-t1) 6%,transparent)}
#searchMask .sug-l1{display:flex;align-items:center;gap:8px;height:32px}
#searchMask .sug-ic{width:16px;height:16px;flex:none;display:flex;align-items:center;
  justify-content:center;color:rgba(25,25,25,.4)}
/* 行内复选框沿用列表行同一套 `.chk`（含优先级描边），只在本作用域把它收成 16x16 */
#searchMask .sug-ic .chk{align-self:center;margin-top:0;width:16px;height:16px;font-size:16px}
#searchMask .sug-ic .chk.on svg{width:16px;height:16px}
#searchMask .sug-ic svg{width:16px;height:16px;display:block;flex:none}
#searchMask .sug-tt{flex:auto;min-width:0;font-size:14px;line-height:21px;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis}
#searchMask .sug-meta{margin-left:auto;flex:none;max-width:160px;font-size:12px;line-height:19px;
  color:rgba(25,25,25,.4);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#searchMask .sug-desc{margin-left:24px;font-size:12px;line-height:16px;color:rgba(25,25,25,.4);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#searchMask mark{background:rgb(242,217,162);color:inherit}
#searchMask .sug-none{color:var(--c-t3);font-size:13px;padding:10px 20px}
html[data-theme="dark"] #searchMask .sug:hover{background:rgba(255,255,255,.06)}
html[data-theme="dark"] #searchMask mark{background:rgba(242,217,162,.32)}
html[data-theme="dark"] #searchMask .srch-in input{border-bottom-color:rgba(255,255,255,.15)}
html[data-theme="dark"] #searchMask .srch-ico{color:rgba(255,255,255,.6)}
html[data-theme="dark"] #searchMask .srch-art{color:rgba(255,255,255,.1)}
html[data-theme="dark"] #searchMask .srch-empty p{color:rgba(255,255,255,.6)}
/* ══════════════════════════════════════════════════════════════════════════
   ★★ r62（待办池 ㉑ 第 3 步）：建议区「查看更多」入口 + 分区分隔线 + **搜索结果视图**
   真值来源：探针 `_dida_srchview1/2/3.js`（视口 1759x1000，输出 `_regress_logs/_dida_srchview*.out`）
     · 建议区任务**最多 5 条**（同词 21 条命中只列 5）⇒ 第 6 条起进结果视图
     · 「查看更多」560x32 @容器左缘 · `pad 8px 20px 7px` · fs12/lh17 · 品牌蓝 `rgb(71,114,250)`
       · 常态透明 → hover `rgba(25,25,25,.04)`
       ★ 文案真值 = **「查看更多」**（r59 台账写的「查看全部」是笔误，本轮更正）
     · 分区之间 520x1（bg `rgba(25,25,25,.1)`）· `margin:8px 20px 0`；其后分区头 `margin-top:15px`
     · 结果视图（滴答 hash `#s/`）＝ 左清单栏收起、右详情栏照留 ⇒ 内容宽 = 视口 − 图标栏 − 详情栏 615
       · 首行顶 **95**（顶栏 46 + chips 行 17+24 + 间隔 8）· 行高 **62/84** · 行全宽 · 无分区头
       · 命中染色 `<mark>` bg **`rgb(251,193,64)`**（≠ 建议区的 `rgb(242,217,162)`）
     ★ r104：`filter-advance` 语义已取证（范围筛选 ＋ 选中态 ＋ 可清除 ·
        `_regress_logs/_r104_dida_chips2.out`）；浮层那排 3 枚已落地（`.srch-scope`），
        本视图这排仍**不渲染** —— 未落地的是选中后的 dropdown 取值器（语义未取证 ⇒ 宁缺勿假）。
   ══════════════════════════════════════════════════════════════════════════ */
#searchMask .ssep{height:1px;background:rgba(25,25,25,.1);margin:8px 20px 0}
#searchMask .ssep+.ssec{margin-top:15px}   /* 有分隔线时其后分区头顶距 15（首区头仍是 0） */
#searchMask .smore{display:block;height:32px;box-sizing:border-box;padding:8px 20px 7px;
  font-size:12px;line-height:17px;color:rgb(71,114,250);cursor:pointer}   /* 配色 = 滴答实测值 */
#searchMask .smore:hover{background:rgba(25,25,25,.04)}
html[data-theme="dark"] #searchMask .ssep{background:rgba(255,255,255,.15)}
html[data-theme="dark"] #searchMask .smore:hover{background:rgba(255,255,255,.06)}
/* ★★ r62：搜索结果视图 —— 与 `#list` 同级（在 `#body` 里），左右两侧的图标栏/详情栏都不动，
   正是滴答那种「左栏收起、右栏照留」。开合只靠 `body.sview-on` + `#sview.on`，
   不碰 `_applyView` 的状态机（退出时由 `_applyView(VIEW)` 统一还原各容器 inline display）。 */
#sview{flex:1;min-width:0;min-height:0;display:none;flex-direction:column;background:var(--c-surface)}
#sview.on{display:flex}
body.sview-on #top,body.sview-on #side{display:none}
#sview .sv-top{flex:none;height:46px;box-sizing:border-box;padding:16px 20px 0 48px;
  display:flex;align-items:flex-start}
#sview .sv-kw{display:flex;min-width:0}
#sview .sv-q{flex:none;margin-right:10px;font-size:20px;line-height:30px;font-weight:600;color:var(--c-t1)}
#sview .sv-term{font-size:20px;line-height:30px;font-weight:400;color:rgb(71,114,250);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#sview .sv-save{margin-left:auto;flex:none;height:30px;padding:0 16px;font-size:14px;line-height:14px;
  font-family:inherit;font-weight:400;border:1px solid rgba(25,25,25,.1);border-radius:8px;background:transparent;
  color:rgb(71,114,250);cursor:pointer;
  /* ★ 全局 `button{min-height:var(--h-ctl)}`(34px) 会压过 height（本仓第 926 行记过同坑）；
     全局 `font:500 …` 还会把字重带成 500，滴答实测是 400 ⇒ 两处都显式写。 */
  min-height:30px;font-weight:400}
#sview .sv-adv{flex:none;height:24px;margin:17px 28px 0 20px}   /* 7 个 chip 的位置占位（本轮不渲染） */
#sview .sv-body{flex:1;min-height:0;overflow-y:auto;margin-top:8px}
#sview mark{background:rgb(251,193,64);color:inherit}
html[data-theme="dark"] #sview mark{background:rgba(251,193,64,.32)}
html[data-theme="dark"] #sview .sv-save{border-color:rgba(255,255,255,.15)}
/* 深色态行 hover：`.task` 的深色 hover 原本只在 `.zbody` 作用域里给了底色，结果视图行不在其中 */
/* r95/池51：此处的暗色覆盖（不透明的灰底令牌，`#23262c`）**已删除** —— 深色 hover 底改由上面 `.task:hover::before` 的 4% 令牌混合统一负责；若两条并存，暗色会 = 不透明 `#23262c` **再叠** 4% 白 ⇒ 约 7.8%，比真值更黑。★ 深色口径由 `_rowdetail_verify.js` D14 的暗色断言守住。 */
/* ===== 日期时间面板（日期 / 时间段 / 提醒 / 重复）===== */
#schedModal{width:432px}
#schedModal .row2{display:flex;gap:8px;align-items:center;margin-bottom:10px}
#schedModal .row2 label{font-size:13px;color:var(--c-t3);width:56px;flex:none}
#schedModal input[type=date],#schedModal input[type=time],#schedModal input[type=datetime-local],#schedModal input[type=number],#schedModal select{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-head{display:flex;align-items:center;gap:8px;font-size:13.5px;font-weight:600;margin-bottom:6px}
.sch-head button{padding:2px 8px;font-size:12px;border:1px solid var(--c-line);background:var(--c-surface);border-radius:6px;cursor:pointer;color:var(--c-t1)}
.sch-cal{display:grid;grid-template-columns:repeat(7,1fr);gap:3px;margin-bottom:10px}
.sch-cal .h{font-size:11.5px;color:var(--c-t3);text-align:center;padding:3px 0}
.sch-cal .d{text-align:center;padding:6px 0;border-radius:7px;font-size:13px;cursor:pointer;border:1px solid transparent}
.sch-cal .d:hover{background:var(--c-surface-2)}
.sch-cal .d.out{color:#c8ccd2}
.sch-cal .d.today{border-color:var(--c-brand);color:var(--c-brand)}
.sch-cal .d.on{background:var(--c-brand);color:#fff;border-color:var(--c-brand)}
.sch-quick{display:flex;gap:6px;flex-wrap:wrap;margin:8px 0}
.sch-quick button{padding:4px 12px;font-size:12.5px;border:1px solid var(--c-line);background:var(--c-surface);border-radius:15px;cursor:pointer;color:var(--c-t1)}
.sch-quick button:hover{background:var(--c-surface-2)}
.sch-quick button.on{background:var(--c-brand);color:#fff;border-color:var(--c-brand)}
.sch-opt{display:flex;align-items:center;gap:8px;padding:8px 2px;font-size:13.5px;cursor:pointer;border-bottom:1px solid var(--c-line)}
.sch-opt:last-child{border-bottom:0}
.sch-opt .k{margin-left:auto;font-size:11.5px;color:var(--c-t3)}
.sch-opt.on{color:var(--c-brand);font-weight:600}
.sch-foot{display:flex;gap:8px;justify-content:flex-end;margin-top:16px}
.sch-foot button{padding:8px 16px}
/* ══ 2026-09-18 对齐滴答「日期与提醒」浮层真机（260×575 · br14 · pop-shadow · 无标题 ·
   分段控件式 tab（只 日期/时间段）· 提醒/重复 行内展开 · 底部只有 清除/确定）══ */
#schedModal{width:260px;padding:0 0 14px;border-radius:14px;box-shadow:0 8px 32px rgba(0,0,0,.16)}
#schedModal .tabs{margin:12px 16px 10px;gap:0;padding:2px;background:rgba(25,25,25,.05);
  border:0;border-radius:8px;height:30px;box-sizing:border-box}
#schedModal .tabs div{flex:1;height:26px;display:flex;align-items:center;justify-content:center;
  border:0;border-radius:6px;font-size:13px;font-weight:400;color:var(--c-t2);padding:0}
#schedModal .tabs div.on{background:var(--c-surface);color:var(--c-t1);font-weight:500;
  box-shadow:0 1px 2px rgba(0,0,0,.08)}
#stDate,#stTime{padding:0 10px}
#schedModal .sch-rows{margin-left:6px;margin-right:6px}
#schedModal .sch-row.on .t{color:var(--c-t1);font-weight:600}
/* ★★ 2026-09-18 老板：「悬浮一个单独的菜单 而不是拉长」。
   滴答真机（6466 截图逐像素 + `_dida_rep*` 探针）：展开的选项是**一块带自己边框和圆角的独立菜单**
   （卡片 inset 16 / 宽 228 / radius 8），而面板右侧仍有自己的滚动条 —— 这正是「独立浮层」的特征。
   ⇒ 展开区在流内**只留 0 高度做锚点**，真正的菜单绝对定位浮出来，**面板高度完全不变**。 */
#schedModal .sch-ex{position:relative;height:0;padding:0;border-bottom:0}
#schedModal .sch-ex>.sch-pop{position:absolute;left:0;right:0;top:-1px;z-index:6;
  max-height:min(440px,56vh);overflow-y:auto;overscroll-behavior:contain;
  background:var(--c-surface);border-radius:8px;box-shadow:0 10px 26px rgba(0,0,0,.15)}
/* ⚠️ 面板平时靠 overflow:auto 兜底滚动；**一旦有浮层就必须放开裁剪**，
      否则浮层会被面板裁掉（实测：只看得见第一项「每天」）。 */
#schedModal.has-pop{overflow:visible}
/* 下方空间不够时改为**向上弹**（`bottom:100%` 相对 0 高度的锚点 = 贴在「重复」行上边） */
#schedModal .sch-ex>.sch-pop.up{bottom:100%;top:auto}
#schedModal .sch-ex .sch-note{background:var(--c-surface);border-radius:8px;padding:8px 2px 3px;
  margin:9px 0 0}
/* ★★ r112（2026-09-26）：**「自定义重复」面板改为「内容区替换」**（子页面语义），不再是锚点浮层。
   根因（`_r112_probe.js` 实测）：该浮层锚点在卡片最底部（锚点 y=764 · 按钮 y=776），下方只剩 12px
   ⇒ 只能向上弹；而面板高 155px ⇒ **与日历重叠 228x26 = 5974 px2**（老板 r112 截图：
   日历最后一行被切开、与「重复方式/频率」糊在一起）。
   两条既有硬约束（`_reppop_verify.js`）互锁无解：R1 浮层不占流 + R12 浮层不得遮挡底部按钮。
   滴答真值（`_dida_r112f.out`）：滴答的重复选项是**向下弹的菜单**（250x112），**溢出卡片 52px**
   且**确实压住按钮** —— 滴答并不回避压按钮。
   ⇒ 我方取**内容区替换**：整块替换 `#stDate` 内容区，不重叠、不压按钮、不出视口，内容再高也能滚动看完。 */
#schedModal .sch-inline{background:var(--c-surface);border:1px solid var(--c-line);border-radius:8px;
  padding:12px 14px 10px;box-shadow:0 1px 3px rgba(0,0,0,.04)}
#schedModal .sch-inline .sch-subhd{margin:0 0 10px}
#schedModal .sch-inline .sch-crow:last-of-type{margin-bottom:6px}
#schedModal .sch-subhd{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--c-t3)}
#schedModal .sch-subhd .bk{cursor:pointer;color:var(--c-brand);font-size:13px}
#schedModal .sch-foot{margin:12px 16px 0;gap:8px;justify-content:space-between}
#schedModal .sch-foot button{flex:1;height:30px;min-height:0;padding:0;font-size:14px;border-radius:8px}
#schedModal .sch-foot button.pri{background:#4772fa;border-color:#4772fa;color:#fff}
html[data-theme="dark"] #schedModal .tabs{background:rgba(255,255,255,.06)}
html[data-theme="dark"] #schedModal .tabs div.on{background:var(--c-surface-2)}
.sch-note{font-size:12px;color:var(--c-t3);margin:6px 0 2px;line-height:1.6}
.task .due{cursor:pointer;border-radius:5px;padding:0 4px}
.task .due:hover{background:var(--c-surface-2);text-decoration:underline}
.task .addcal{opacity:0;cursor:pointer;border-radius:5px;padding:0 4px;transition:.15s}
.task:hover .addcal{opacity:1}
.sch-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--c-brand);vertical-align:middle}
/* 旧 `.sres`（搜索结果单行纯文本）已由 r61 的 `#searchMask .sug*` 取代 —— 见搜索浮层那一段样式 */
@media(max-width:860px){#side{position:absolute;left:-250px;height:100%;z-index:30;transition:.2s}#side.open{left:0}
#detail{position:absolute;right:0;top:52px;bottom:0;height:auto;z-index:20;width:92vw;box-shadow:-6px 0 20px rgba(0,0,0,.12)}
#detail.hide{display:none}   /* 窄屏：不常驻，点任务标题才作为浮层弹出 */
#menuBtn{display:inline-block!important}#mx.on{display:flex;flex-direction:column;padding:10px;gap:10px}}

/* ══ 图标系统（2026-09-12 滴答清单风格）══ */
.dti{width:16px;height:16px;flex:none;display:inline-block;vertical-align:-2px;min-height:0;
  fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.dti.sm{width:14px;height:14px}
.dti.lg{width:18px;height:18px}
/* ══ 详情页 v5（2026-09-14）：主体=自由描述 / 右上角切子任务 / 底部栏三钮 ══ */
#detail{display:flex;flex-direction:column}
/* 宽屏空态占位（对齐滴答：右侧常驻，未选中时给引导） */
.dt-empty{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;
  color:var(--c-t3);font-size:13px;padding:24px;text-align:center}
.dt-empty svg{width:56px;height:56px;stroke-width:1.3;opacity:.45}
/* 面板宽度 400→615（+215）→ 断点同步上移，避免中等屏被面板挤没列表 */
@media(max-width:1330px){#detail{width:400px}}
@media(max-width:1100px){#detail{width:336px}}   /* 中等宽度收窄详情列，给小屏留位 */
/* ★ 滴答 `.switch-mode`：**18×18、opacity .4**（hover 才提亮）*/
.dt-mode-btn{display:inline-flex;align-items:center;justify-content:center;gap:0;border:0;background:transparent;
  color:var(--c-t1);border-radius:5px;width:18px;height:18px;min-height:0;padding:0;font-size:0;cursor:pointer;flex:none;
  opacity:.4;transition:opacity .12s,background .12s}
.dt-mode-btn:hover{opacity:1;background:var(--c-surface-2)}
.dt-mode-btn svg,.dt-mode-btn .dti{width:18px;height:18px}
.dt-mode-btn span{display:none}
.dt-mode-btn:hover{background:var(--c-surface-2);color:var(--c-brand)}
.dt-main{flex:1;min-height:0;display:flex;flex-direction:column;padding:0 25px;
  overflow-y:auto;overscroll-behavior:contain}   /* ★ 2026-11-03 对齐滴答：描述+检查项+子任务同处一个滚动容器 */
/* ★ 滴答 `.td-task-text` 是**内容高度**（pt4 pb24），下方留白属于容器 → 不再撑满 */
.dt-descwrap{flex:none;min-height:0;display:flex;flex-direction:column}
/* ★★ 2026-09-18：编辑器改为**完整块级渲染**（所见即所得）→ 换行交给块级元素，不再靠 pre-wrap */
/* ★ 滴答：段落 fs14 / lh21 / pt4 pb24；`.dt-descwrap` 容器 25px 左内已由 .dt-main 给 */
.dt-descwrap #descIn{flex:none;min-height:21px;overflow:visible;outline:none;font-size:14px;line-height:21px;
  white-space:normal;
  padding:4px 0 24px 0;word-break:break-word;color:var(--c-t1);cursor:text}
.dt-descwrap #descIn:empty:before{content:attr(data-ph);color:var(--c-t3)}
/* ★★ 2026-09-19 描述区图片（老板实测反馈）：原来**按原始尺寸铺开**
   （实测：编辑器内宽 564px，800×600 的图渲成 800×600）。
   现改为**中等缩略图**：max-width 100% + **max-height 160px** + 圆角 + 点击放大。
   ★★ 2026-09-20 **拿到滴答真值了**（老板放开「可插测试图、只要不删既有数据」；
      但实际**一条都没插** —— 老板账号里**已有 81 条「描述含图」的任务**，直接量它们即可，零写入）：
      遍历已有样本（`_dida_img7.js`）拿到决定性的**大图**样本：源 **795×558 → 渲染 608×427**
      （容器内容宽 608，外面是 `.tk-md-img-wrapper` 的 1px 透明边框 ×2 = 610）；
      小图不放大（349×68 → 349×68）。
      ⇒ 滴答的规则 = **`max-width:100%` 撑满容器 + 等比缩放 + `max-height:none`（高度不限）+ `border-radius:14px`**
        （`.tk-md-img` / 包裹层 `.tk-md-img-wrapper`）。
      ⚠️ 我方上一轮因「取不到真值」先拍的 **`max-height:160px` 是错的**（比滴答小一截）⇒ 本轮按真值改正、**去掉高度上限**、圆角 6 → **14**。 */
.dt-descwrap #descIn img{display:block;max-width:100%;width:auto;height:auto;
  border-radius:14px;margin:6px 0;cursor:zoom-in}
.dt-descwrap #descIn .imgph{font-size:12.5px;color:var(--c-t3);background:var(--c-surface-2);
  border-radius:6px;padding:8px 10px;margin:6px 0}
.dt-descwrap #descIn .imgph.bad{color:var(--c-bad)}
/* 点击缩略图 → 全屏看原图 */
#imgView{position:fixed;left:0;right:0;top:0;bottom:0;display:none;z-index:90;
  background:rgba(0,0,0,.82);align-items:center;justify-content:center;cursor:zoom-out}
#imgView.on{display:flex}
#imgView img{max-width:92vw;max-height:90vh;border-radius:8px;box-shadow:0 12px 40px rgba(0,0,0,.45)}
/* ══ 编辑态（WYSIWYG）里的块级与行内样式：与「预览」渲染保持一致 ══ */
.dt-descwrap #descIn p{margin:0 0 8px}   /* ★ 滴答段间距 8px（段行距 29 = lh21 + 8）*/
.dt-descwrap #descIn ul,.dt-descwrap #descIn ol{margin:3px 0 3px 22px;padding:0}
.dt-descwrap #descIn li{margin:1px 0}
.dt-descwrap #descIn blockquote{border-left:3px solid var(--c-line);margin:4px 0;padding:0 0 0 10px;color:var(--c-t2)}
.dt-descwrap #descIn blockquote p{margin:0}
.dt-descwrap #descIn h3,.dt-descwrap #descIn h4,.dt-descwrap #descIn h5,.dt-descwrap #descIn h6{
  margin:6px 0 2px;font-weight:700;line-height:1.35;color:var(--c-t1)}
.dt-descwrap #descIn h3{font-size:17px}
.dt-descwrap #descIn h4{font-size:15.5px}
.dt-descwrap #descIn h5,.dt-descwrap #descIn h6{font-size:14px}
.dt-descwrap #descIn code{background:var(--c-surface-2);border-radius:4px;padding:1px 4px;
  font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12.5px}
.dt-descwrap #descIn mark{background:#fff2a8;color:inherit;border-radius:3px;padding:0 2px}
.dt-descwrap #descIn a{color:var(--c-brand)}
.dt-descwrap #descIn .bx{display:flex;align-items:flex-start;gap:6px;margin:2px 0}
.dt-descwrap #descIn .bx input{margin:3px 0 0;flex:none}
/* ★ 2026-09-17：由 flex:1 改为「按内容 + 上限 52%」——空的子任务/检查项区不再吃掉全屏 */
.dt-subwrap{flex:0 0 auto;max-height:52%;min-height:0;overflow:auto;padding-bottom:20px}
/* ★ 滴答底栏：清单 icon 18×18 @x24（左内 19 + 胶囊内 5）· 右端按钮组结束于 x=591（右内 24）*/
.dt-foot{display:flex;align-items:center;height:48px;padding:0 24px 0 19px;border-top:1px solid var(--c-line-2);background:var(--c-surface);flex:none}
.dt-proj{display:inline-flex;align-items:center;gap:4px;font-size:12.5px;color:var(--c-t3);cursor:pointer;height:30px;padding:0 5px;border-radius:6px}
.dt-proj svg,.dt-proj .dti{width:18px;height:18px}
.dt-proj:hover{background:var(--c-surface-2);color:var(--c-brand)}
.dt-fbtns{margin-left:auto;display:flex;align-items:center;gap:16px}
.dt-fbtns button{width:18px;height:18px;min-height:0;padding:0;border:0;background:transparent;color:var(--c-t3);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:12px;line-height:18px;border-radius:4px}
.dt-fbtns button:hover{background:var(--c-surface-2);color:var(--c-brand)}
.dt-fbtns button.on{border-color:var(--c-brand);color:var(--c-brand);background:var(--c-brand-bg)}
/* ★ 2026-09-18 对齐滴答：格式工具是**默认隐藏的浮出菜单**（滴答 `.menu_3O1Cb` op=0 disp=none，
   文本「正文/一级标题/…/检查项」），**不是常驻一整行**。
   改为：贴着底栏上方浮出、圆角卡片、**不换行**（原来 flex-wrap 会把「预览」挤到第二行）。 */
.dt-fbar{position:absolute;left:22px;right:22px;bottom:54px;z-index:29;display:none;gap:2px;align-items:center;
  flex-wrap:nowrap;overflow-x:auto;padding:6px 8px;border:1px solid var(--c-line);border-radius:12px;
  background:var(--c-surface);box-shadow:0 8px 28px rgba(0,0,0,.12)}
.dt-fbar.on{display:flex}
.dt-fbar button{border:0;background:transparent;color:var(--c-t2);cursor:pointer;border-radius:6px;padding:4px 8px;font-size:13px;min-width:28px}
.dt-fbar button:hover{background:var(--c-surface);color:var(--c-brand)}
.dt-fbar .sp{width:1px;height:16px;background:var(--c-line);margin:0 4px}
.dt-sheet{display:none;padding:10px 16px;border-top:1px solid var(--c-line-2);background:var(--c-surface);max-height:46%;overflow:auto}
.dt-sheet.on{display:block}
.dt-sheet .sh-h{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--c-t3);margin-bottom:8px}
.dt-sheet .sh-h .x{margin-left:auto;cursor:pointer;color:var(--c-t3)}
.dt-sheet .sh-h .x:hover{color:var(--c-bad)}
.dt-sheet .shrow{display:flex;align-items:center;gap:8px;padding:8px;border-radius:8px;cursor:pointer;
  font-size:13px;color:var(--c-t2)}
.dt-sheet .shrow:hover{background:var(--c-surface-2);color:var(--c-t1)}
.dt-sheet .shrow .cur{margin-left:auto;color:var(--c-brand);font-size:12px}
.dt-sheet .shnote{font-size:12.5px;color:var(--c-t3);padding:6px 2px 2px;line-height:1.7}
.dt-move{position:absolute;left:16px;bottom:56px;z-index:40;width:272px;background:var(--c-surface);
  border:1px solid var(--c-line);border-radius:10px;box-shadow:0 8px 28px rgba(0,0,0,.16);padding:10px;display:none}
.dt-move.on{display:block}
.dt-move input{width:100%;border:1px solid var(--c-line);border-radius:8px;padding:6px 8px;font-size:13px;
  background:var(--c-surface);color:var(--c-t1);margin-bottom:8px}
.dt-move .mvlist{max-height:250px;overflow:auto}
.dt-move .mv{display:flex;align-items:center;gap:8px;padding:8px 8px;border-radius:7px;cursor:pointer;font-size:13px;color:var(--c-t2)}
.dt-move .mv:hover{background:var(--c-surface-2);color:var(--c-t1)}
.dt-move .mv.on{background:var(--c-brand-bg);color:var(--c-brand);font-weight:600}
.dt-move .mv .cur{margin-left:auto;color:var(--c-brand)}
/* ══════════ 已归档的清单：就地展开的折叠段（2026-09-20 第 31 轮，按滴答实测改）══════════
   ★ 滴答真值（_dida_arch4/5/6/7.js）：段头 36 → 展开 36 + 2 + n×38 − 2（n=7 ⇒ 302）；
     折叠 `closed-list` ↔ 展开 `open`；**URL/hash 全程不变**（就地展开，不是跳转入口、也不是弹面板）；
     段头 = [箭头 12×12 @dx11] + [图标 20×20 @dx22] + [文字 @dx48]；内容行图标 @dx48 / 名称 @dx74。
   ★ 全部规则只写 `#side .arch*` 作用域：`.arow` / `.li` / `.pj-li` 都是共用类，一行不动。
   ★ 回退：删掉本块 + 用 index.html.bak_archseg_* 覆盖。 */
#side .archh{position:relative;padding-left:22px;margin-top:2px}
#side .archh .aname{order:2;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
#side .archh .aico{order:1;flex:none;width:20px;display:inline-flex;align-items:center;justify-content:center;color:var(--c-t3)}
#side .archh .arche{position:absolute;left:11px;top:50%;width:12px;height:12px;margin-top:-6px;
  display:inline-flex;align-items:center;justify-content:center;color:var(--c-t3);cursor:pointer;
  transition:transform .15s;transform:rotate(0deg)}
#side .archh .arche .dti{width:12px;height:12px}
#side .archh.on .arche{transform:rotate(90deg)}
#side .archh.on{background:transparent}
#side .archh.on:hover{background:color-mix(in srgb, var(--c-t1) 6%, transparent)}
#side .archlist{display:none;margin-top:2px}
#side .archlist.on{display:block}
#side .archlist .li{padding-left:48px}
#side .archrow .adot{flex:none;width:8px;height:8px;border-radius:50%;margin-left:6px;
  box-shadow:0 0 0 1px rgba(0,0,0,.06) inset}
#side .archrow .aslot{flex:none;width:26px}
#side .archrow:hover .adot{opacity:0}
#side .archrow .abtn{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;font-family:inherit;font-size:12px}
#side .archrow:hover .abtn{opacity:1;pointer-events:auto}
#side .archrow:hover .abtn:hover{background:var(--c-surface-2);color:var(--c-brand)}
#side .archlist .aempty{font-size:12px;color:var(--c-t3);padding:6px 12px 6px 48px}
