/* css/canvas.css：页 6 项目画布（tt-cv-*）＋团团栏基础卡（tt-cb-*）。
   内容是纸：画布纸面、节点、卡片都不透明；玻璃只有团团栏外框（sidebar.css）。黄只给团团栏里最新一张卡的主按钮。 */

/* ── 页面几何：画布页比 1200 栏宽，左右各留 24；整页一屏高，画布内部滚动 ── */
#main:has(> .tt-cv-page) { width: calc(100% - var(--b-sp-6) * 2); padding-bottom: var(--b-sp-6); }
body:has(#main > .tt-cv-page) { padding-bottom: 0; }   /* 应用样式给坞留的 140px 底边，画布页一屏高、不需要 */
.tt-cv-page { display: grid; grid-template-columns: minmax(0, 1fr) var(--tt-sb-w); gap: var(--tt-gap); height: calc(100dvh - var(--b-topbar-h) - var(--b-sp-6) * 2); min-height: 620px; }
.tt-cv-work { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
.tt-cv-side { display: flex; min-height: 0; }
.tt-cv-side > * { flex: 1; min-width: 0; min-height: 0; }

/* ── 项目头：左名称＋状态，右四格；格间发丝竖线，主字 17、副字 12 ── */
.tt-cv-head { flex: none; padding: 0 var(--b-sp-1) var(--b-sp-5); }
.tt-cv-crumbs { height: 24px; }
.tt-cv-crumbs > span[aria-hidden] { color: var(--b-text-disabled); }
.tt-cv-headrow { display: flex; flex-direction: column; align-items: flex-start; gap: var(--b-sp-4); margin-top: var(--b-sp-2); }   /* 名称一行、四格一行：项目名和目标都长，两宽下同一形态 */
.tt-cv-title { display: flex; align-items: center; gap: var(--b-sp-3); min-width: 0; padding-bottom: 2px; }
.tt-cv-title h1 { font-size: var(--b-fs-28); line-height: var(--b-lh-title); font-weight: 700; letter-spacing: var(--b-ls-title); white-space: nowrap; }
.tt-cv-title .pill { height: 26px; font-size: var(--b-fs-12); font-variant-numeric: tabular-nums; }
.tt-cv-metrics { display: flex; min-width: 0; }
.tt-cv-metric { display: grid; gap: 3px; align-content: end; padding: 0 var(--b-sp-5); min-width: 0; }
.tt-cv-metric:first-child { padding-left: 0; }
.tt-cv-metric:last-child { padding-right: 0; }
.tt-cv-metric + .tt-cv-metric { border-left: 1px solid var(--b-line); }
.tt-cv-metric dt { font-size: var(--b-fs-12); line-height: 1.4; letter-spacing: var(--b-ls-cap); color: var(--b-text-3); }
.tt-cv-metric dd { display: grid; gap: 2px; }
.tt-cv-metric dd b { font-size: var(--b-fs-17); line-height: 1.3; font-weight: 600; letter-spacing: var(--b-ls-title); color: var(--b-text-1); white-space: nowrap; font-variant-numeric: tabular-nums; }
.tt-cv-metric dd small { font-size: var(--b-fs-12); line-height: 1.4; color: var(--b-text-3); white-space: nowrap; font-variant-numeric: tabular-nums; }

/* ── 画布纸面：一张纸，检查栏打开时在纸内右侧分出 400 宽一栏 ── */
.tt-cv-paper { position: relative; flex: 1; min-height: 0; display: grid; grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); border-radius: var(--b-radius-card); background: var(--b-bg-card); box-shadow: inset 0 1px 0 var(--b-card-edge), 0 1px 2px var(--b-card-shadow), 0 12px 32px -16px var(--b-card-shadow-far); overflow: hidden; }
.tt-cv-paper.is-insp { grid-template-columns: minmax(0, 1fr) 400px; }
.tt-cv-main { grid-area: 1 / 1; display: flex; flex-direction: column; min-width: 0; min-height: 0; container-type: inline-size; }

/* 画布栏 */
.tt-cv-bar { flex: none; display: flex; align-items: center; gap: var(--b-sp-2) var(--b-sp-4); min-height: 60px; padding: var(--b-sp-3) var(--b-sp-4) var(--b-sp-3) var(--b-sp-5); border-bottom: 1px solid var(--b-line); }
.tt-cv-note { flex: 0 1 auto; min-width: 0; font-size: var(--b-fs-12); color: var(--b-text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tt-cv-summary { min-width: 0; font-size: var(--b-fs-13); color: var(--b-text-2); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-variant-numeric: tabular-nums; }
.tt-cv-tools { margin-left: auto; display: flex; align-items: center; gap: var(--b-sp-1); flex: none; }
.tt-cv-tools .tt-cv-seg { margin-right: var(--b-sp-2); }
.tt-cv-tool { height: var(--b-control-h-sm); padding: 0 var(--b-sp-3); border-radius: var(--b-radius-pill); font-size: var(--b-fs-13); font-weight: 500; color: var(--b-text-2); white-space: nowrap; transition: background-color var(--m-snappy-t) var(--m-spring-snappy), color var(--m-snappy-t) var(--m-spring-snappy); }
.tt-cv-tool:hover { color: var(--b-text-1); background: var(--b-neutral-tint); }
@container (max-width: 660px) {
  .tt-cv-bar { flex-wrap: wrap; }
  .tt-cv-summary { order: 3; flex-basis: 100%; }
  .tt-cv-note { display: none; }
}
@container (max-width: 900px) {
  .tt-cv-bar.has-by { flex-wrap: wrap; }
  .tt-cv-bar.has-by .tt-cv-summary { order: 3; flex-basis: 100%; }   /* 看板多一组分组切换，窄了概况换到第二行，不截断 */
  .tt-cv-bar.has-by .tt-cv-note { display: none; }
}
@container (max-width: 460px) {
  .tt-cv-tool.is-select { display: none; }   /* 窄时收起只有样子的「选择」，保住一行 */
}
.tt-cv-seg { flex: none; display: inline-flex; padding: 3px; border-radius: var(--b-radius-pill); background: var(--b-neutral-tint); }
.tt-cv-seg button { height: 28px; padding: 0 var(--b-sp-4); border-radius: var(--b-radius-pill); font-size: var(--b-fs-13); font-weight: 600; color: var(--b-text-2); transition: background-color var(--m-snappy-t) var(--m-spring-snappy), color var(--m-snappy-t) var(--m-spring-snappy), box-shadow var(--m-snappy-t) var(--m-spring-snappy); }
.tt-cv-seg button:hover { color: var(--b-text-1); }
.tt-cv-seg button[aria-selected="true"] { color: var(--b-text-1); background: var(--b-bg-card); box-shadow: 0 1px 2px var(--b-card-shadow), inset 0 0 0 1px var(--b-line); }
html[data-theme="dark"] .tt-cv-seg button[aria-selected="true"] { background: var(--b-bg-inset); }
.tt-cv-by button { padding: 0 var(--b-sp-3); }

.tt-cv-view { position: relative; flex: 1; min-height: 0; display: flex; }
.tt-cv-view::before, .tt-cv-view::after { content: ""; position: absolute; top: 0; bottom: 0; z-index: 6; width: 56px; pointer-events: none; opacity: 0; transition: opacity var(--m-snappy-t) var(--m-spring-snappy); }
.tt-cv-view::before { left: 0; background: linear-gradient(to left, transparent, var(--b-bg-card)); }
.tt-cv-view::after { right: 0; background: linear-gradient(to right, transparent, var(--b-bg-card)); }
.tt-cv-view.is-more-left::before, .tt-cv-view.is-more-right::after { opacity: 1; }
.tt-cv-view.has-lane::before, .tt-cv-view.has-lane::after { top: 53px; }
.tt-cv-more { flex: none; height: var(--b-control-h-sm); padding: 0 var(--b-sp-3); border-radius: var(--b-radius-pill); font-size: var(--b-fs-13); font-weight: 500; white-space: nowrap; color: var(--b-text-1); background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line-strong); }   /* 栏右端：画布右边还藏着节点 */
.tt-cv-more:hover { box-shadow: inset 0 0 0 1px var(--b-text-3); }
.tt-cv-more[hidden] { display: none; }
.tt-cv-view > * { flex: 1; min-width: 0; }

/* ── 流程视图：纸上一层极淡的点阵，节点是纸片，依赖线是细线 ── */
.tt-cv-flow-scroll { position: relative; display: flex; overflow: auto; padding: 40px 24px; overscroll-behavior: contain; scrollbar-width: thin; background-image: radial-gradient(circle, var(--b-line-strong) 1px, transparent 1.3px); background-size: 20px 20px; background-position: 6px 6px; }
.tt-cv-flow { position: relative; flex: none; margin-block: auto; }
.tt-cv-edges { position: absolute; left: 0; top: 0; overflow: visible; pointer-events: none; }
.tt-cv-edges path { fill: none; stroke: var(--b-line-strong); stroke-width: 1.25; }
.tt-cv-edges path.is-pending { stroke-dasharray: 3 4; }
.tt-cv-fold { position: absolute; left: var(--b-sp-5); top: var(--b-sp-3); font-size: var(--b-fs-13); font-weight: 500; color: var(--b-text-2); }
.tt-cv-fold:hover { color: var(--b-text-1); }

/* 常驻栏：持续进行的事不进依赖图，固定在流程滚动区外（上沿），横滚时也看得见 */
.tt-cv-flowbox { display: flex; flex-direction: column; min-width: 0; min-height: 0; }
.tt-cv-flowbox > .tt-cv-flow-scroll, .tt-cv-flowbox > .tt-cv-board { flex: 1; min-height: 0; }
.tt-cv-lane { flex: none; display: flex; align-items: center; gap: var(--b-sp-3); height: 53px; padding: 0 var(--b-sp-5) 0 var(--b-sp-7); border-bottom: 1px solid var(--b-line); overflow-x: auto; scrollbar-width: none; }
.tt-cv-lane-k { flex: none; font-size: var(--b-fs-12); font-weight: 600; letter-spacing: var(--b-ls-cap); color: var(--b-text-3); }
.tt-cv-lane-item { flex: none; display: inline-flex; align-items: center; gap: var(--b-sp-2); height: 32px; padding: 0 var(--b-sp-3) 0 var(--b-sp-4); border-radius: var(--b-radius-pill); background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line-strong); white-space: nowrap; transition: box-shadow var(--m-snappy-t) var(--m-spring-snappy), background-color var(--m-snappy-t) var(--m-spring-snappy); }
.tt-cv-lane-item > b { font-size: var(--b-fs-13); font-weight: 600; color: var(--b-text-1); }
.tt-cv-lane-item .tt-cv-ex-type { font-size: var(--b-fs-12); line-height: 18px; }
.tt-cv-lane-when { font-size: var(--b-fs-12); color: var(--b-text-3); font-variant-numeric: tabular-nums; }
.tt-cv-lane-item:hover { box-shadow: inset 0 0 0 1px var(--b-text-3); }
.tt-cv-lane-item.is-selected { box-shadow: inset 0 0 0 1.5px var(--b-text-1); }
.tt-cv-lane-item:focus-visible { outline: 2px solid var(--b-focus); outline-offset: 2px; }

/* 节点：196×112 纸片；标题 15、执行方一行、日期与费用一行 */
.tt-cv-node { position: absolute; width: 164px; height: 112px; display: flex; flex-direction: column; gap: 6px; padding: 12px 14px 11px; border-radius: var(--b-radius-inner); text-align: left; color: var(--b-text-1); background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line-strong), 0 1px 2px var(--b-card-shadow), 0 10px 24px -18px var(--b-card-shadow-far); transition: transform var(--m-snappy-t) var(--m-spring-snappy), box-shadow var(--m-snappy-t) var(--m-spring-snappy); }
.tt-cv-node:hover { transform: translateY(var(--m-lift)); box-shadow: inset 0 0 0 1px var(--b-text-3), 0 1px 2px var(--b-card-shadow), 0 14px 28px -16px var(--b-card-shadow-far); }
.tt-cv-node:focus-visible { outline: 2px solid var(--b-focus); outline-offset: 3px; }
.tt-cv-node.is-selected { box-shadow: inset 0 0 0 1.5px var(--b-text-1), 0 1px 2px var(--b-card-shadow), 0 14px 28px -16px var(--b-card-shadow-far); }
.tt-cv-node-t { font-size: var(--b-fs-15); line-height: 1.35; font-weight: 600; letter-spacing: -.01em; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.tt-cv-node-ex { display: flex; align-items: center; gap: 6px; min-width: 0; font-size: var(--b-fs-12); line-height: 18px; color: var(--b-text-3); white-space: nowrap; }
/* 执行方分色相（Fable 二审 #8）：节点标签、常驻栏、时间轴条、图例同一套；不用黄（黄只给主按钮）、不用绿（绿是已完成） */
.tt-cv-page { --cv-agent: #3F6A99; --cv-expert: #9A5B34; --cv-market: #2D7783; --cv-you: var(--b-text-1); }
html[data-theme="dark"] .tt-cv-page { --cv-agent: #8DB4E6; --cv-expert: #E3A27A; --cv-market: #7CC5CF; }
.tt-cv-ex-type { flex: none; padding: 0 6px; border-radius: 6px; font-weight: 500; color: var(--cv-tone, var(--b-text-2)); background: color-mix(in srgb, var(--cv-tone, var(--b-text-2)) 13%, transparent); }
.tt-cv-node.is-agent, .tt-cv-lane-item.is-agent { --cv-tone: var(--cv-agent); }
.tt-cv-node.is-expert, .tt-cv-lane-item.is-expert { --cv-tone: var(--cv-expert); }
.tt-cv-node.is-market, .tt-cv-lane-item.is-market { --cv-tone: var(--cv-market); }
.tt-cv-node.is-ghost { pointer-events: none; color: var(--b-text-2); background: color-mix(in srgb, var(--b-bg-card) 60%, transparent); box-shadow: none; outline: 1.5px dashed var(--b-text-1); outline-offset: -1.5px; animation: tt-cv-ghost-in 200ms var(--m-ease-out) both; }
.tt-cv-node.is-ghost .tt-cv-node-t { color: var(--b-text-1); }
.tt-cv-node.is-ghost .tt-cv-ex-type { --cv-tone: var(--cv-agent); }
@keyframes tt-cv-ghost-in { from { opacity: 0; } }
.tt-cv-state.is-queued { color: var(--b-text-2); }
.tt-cv-state.is-rework { color: var(--b-danger); }
.tt-cv-ex-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; font-size: var(--b-fs-13); color: var(--b-text-2); }
.tt-cv-node-foot { margin-top: auto; display: flex; align-items: baseline; justify-content: space-between; gap: var(--b-sp-2); font-size: var(--b-fs-12); line-height: 18px; color: var(--b-text-3); white-space: nowrap; font-family: var(--b-font-num); font-variant-numeric: tabular-nums; }
.tt-cv-state { margin-right: 6px; font-family: var(--b-font-sans); font-weight: 600; color: var(--b-text-1); }
.tt-cv-state.is-done { color: var(--b-ok); }
.tt-cv-cost { color: var(--b-text-2); }
/* 待定安排：只有它用虚线 */
.tt-cv-node.is-pending { background: transparent; box-shadow: none; outline: 1.5px dashed var(--b-line-strong); outline-offset: -1.5px; }
.tt-cv-node.is-pending:hover { outline-color: var(--b-text-3); box-shadow: none; }
.tt-cv-node.is-pending.is-selected { outline: 1.5px dashed var(--b-text-1); }
.tt-cv-node.is-pending .tt-cv-node-t { color: var(--b-text-2); }
.tt-cv-node.is-pending .tt-cv-ex-name { font-size: var(--b-fs-12); color: var(--b-text-3); }
.tt-cv-node.is-done .tt-cv-node-t, .tt-cv-node.is-shelved .tt-cv-node-t { color: var(--b-text-2); }
.tt-cv-node.is-shelved .tt-cv-node-t { text-decoration: line-through; text-decoration-color: var(--b-text-3); }
/* 高亮（提议中）：墨色虚框，不用黄 */
.tt-cv-node.is-hl, .tt-cv-stack.is-hl { outline: 1.5px dashed var(--b-text-1); outline-offset: 4px; }
.tt-cv-stack.is-hl { outline-offset: 12px; }   /* 叠后面两层错开 8px，虚框要把它们一起圈进去 */
.tt-cv-stack.is-hl .tt-cv-marks { top: -22px; }   /* 标注骑在虚框线上，不压叠的上沿 */
/* 在画布上定位：一圈墨线亮一下就退（只动透明度） */
.tt-cv-node.is-flash::after { content: ""; position: absolute; inset: -5px; border-radius: 16px; box-shadow: 0 0 0 2px var(--b-text-1); pointer-events: none; animation: tt-cv-flash 1200ms var(--m-ease-out) both; }
@keyframes tt-cv-flash { 0% { opacity: 0; } 15% { opacity: 1; } 55% { opacity: .9; } 100% { opacity: 0; } }

/* 状态标注：12px 字挂在节点上沿外，墨色描边 */
.tt-cv-marks { position: absolute; left: 10px; top: -10px; display: flex; gap: 4px; pointer-events: none; }
.tt-cv-marks:empty { display: none; }
.tt-cv-mark { height: 18px; padding: 0 6px; border-radius: 6px; font-size: var(--b-fs-12); line-height: 18px; font-weight: 600; white-space: nowrap; color: var(--b-text-1); background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-text-1); }
.tt-cv-mark.is-error { color: var(--b-danger); box-shadow: inset 0 0 0 1px var(--b-danger); }

/* 已完成的一叠：纸片错开两层 */
.tt-cv-stack { position: absolute; width: 164px; height: 112px; display: flex; flex-direction: column; gap: 6px; padding: 12px 14px; border-radius: var(--b-radius-inner); text-align: left; background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line-strong), 4px 4px 0 -1px var(--b-bg-card), 4px 4px 0 0 var(--b-line-strong), 8px 8px 0 -1px var(--b-bg-card), 8px 8px 0 0 var(--b-line); }
.tt-cv-stack:hover .tt-cv-stack-k { text-decoration: underline; text-underline-offset: 3px; }
.tt-cv-stack-k { font-size: var(--b-fs-15); font-weight: 600; color: var(--b-ok); }
.tt-cv-stack-list { display: grid; gap: 2px; font-size: var(--b-fs-12); color: var(--b-text-3); }
.tt-cv-stack-list span { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* ── 时间轴：名称列 160，按日 18px；条高 8、圆角 4；执行方类型用中性色阶 ── */
.tt-cv-tl-scroll { --tl-name: 160px; display: flex; flex-direction: column; overflow: auto; padding: 0 0 80px; overscroll-behavior: contain; scrollbar-width: thin; }
.tt-cv-tl { position: relative; width: max-content; min-width: 100%; }
.tt-cv-tl-axis { position: sticky; top: 0; z-index: 4; display: flex; height: 40px; background: var(--b-bg-card); box-shadow: inset 0 -1px 0 var(--b-line); }
.tt-cv-tl-name { position: sticky; left: 0; z-index: 2; flex: none; width: var(--tl-name); display: grid; align-content: center; gap: 1px; padding: 0 var(--b-sp-3) 0 var(--b-sp-5); background: var(--b-bg-card); text-align: left; min-width: 0; }
.tt-cv-tl-name b { font-size: var(--b-fs-13); font-weight: 600; color: var(--b-text-1); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tt-cv-tl-name small { font-size: var(--b-fs-12); color: var(--b-text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.tt-cv-tl-track { position: relative; flex: none; width: calc(var(--tl-w) + 132px); }
.tt-cv-tl-axis .tt-cv-tl-track { box-shadow: inset 1px 0 0 var(--b-line); }
.tt-cv-tl-tick { position: absolute; bottom: 8px; padding-left: 5px; font-size: var(--b-fs-12); line-height: 16px; color: var(--b-text-3); white-space: nowrap; font-variant-numeric: tabular-nums; box-shadow: inset 1px 0 0 var(--b-line-strong); }
.tt-cv-tl-weekend { position: absolute; top: 0; bottom: 0; width: 18px; background: var(--b-neutral-tint); opacity: .55; }
.tt-cv-tl-axis .tt-cv-tl-weekend { display: none; }
.tt-cv-tl-rows { position: relative; }
.tt-cv-tl-track.is-bg { position: absolute; left: var(--tl-name); top: 0; bottom: 0; pointer-events: none; }
.tt-cv-tl-row { position: relative; display: flex; width: 100%; height: 48px; border-bottom: 1px solid var(--b-line); text-align: left; }
.tt-cv-tl-row:hover, .tt-cv-tl-row:hover .tt-cv-tl-name { background: var(--b-bg-inset); }
.tt-cv-tl-row.is-selected .tt-cv-tl-name { box-shadow: inset 3px 0 0 var(--b-text-1); }
.tt-cv-tl-row.is-selected .tt-cv-tl-name b { text-decoration: underline; text-underline-offset: 3px; }
.tt-cv-tl-row:focus-visible { outline: 2px solid var(--b-focus); outline-offset: -2px; }
.tt-cv-tl-row.is-done .tt-cv-tl-bar { opacity: .4; }
.tt-cv-tl-row .tt-cv-tl-bar { position: absolute; top: 20px; }
.tt-cv-tl-bar { display: inline-block; height: 8px; border-radius: 4px; background: var(--tone, var(--b-text-3)); }
.tt-cv-tl-bar.is-agent { --tone: var(--cv-agent); }
.tt-cv-tl-bar.is-expert { --tone: var(--cv-expert); }
.tt-cv-tl-bar.is-market { --tone: var(--cv-market); }
.tt-cv-tl-bar.is-you { --tone: var(--cv-you); }
/* 断轴：一道卡纸色的竖带，两条斜线；盖在条上，常驻条在这里「折断」 */
.tt-cv-tl-break { position: absolute; top: 0; bottom: 0; z-index: 1; background: var(--b-bg-card); }
.tt-cv-tl-break::after { content: ""; position: absolute; inset: 0; background: var(--b-text-3); -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='48'%3E%3Cpath d='M3 31 8 17M8 31 13 17' stroke='%23000' stroke-width='1.25' fill='none'/%3E%3C/svg%3E") 0 0 / 16px 48px repeat-y; mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='48'%3E%3Cpath d='M3 31 8 17M8 31 13 17' stroke='%23000' stroke-width='1.25' fill='none'/%3E%3C/svg%3E") 0 0 / 16px 48px repeat-y; }   /* 每行在条的高度画一对斜线 */
.tt-cv-tl-axis .tt-cv-tl-break::after { -webkit-mask-position: 0 -4px; mask-position: 0 -4px; }
.tt-cv-tl-track.is-over { z-index: 1; }   /* 盖过条（z auto），让位给吸附的名称列（z 2） */
.tt-cv-tl-dl { position: absolute; top: 0; bottom: 0; width: 0; border-left: 1px dashed var(--b-text-3); }
.tt-cv-tl-axis .tt-cv-tl-dl { display: none; }
.tt-cv-tl-bar.is-pending { background: transparent; box-shadow: inset 0 0 0 1px var(--b-text-3); outline: 1px dashed var(--b-bg-card); outline-offset: -1px; }
/* 常驻：条伸出轴外渐隐，日期写在条上方 */
.tt-cv-tl-row.is-ongoing .tt-cv-tl-bar { top: 29px; }
.tt-cv-tl-row.is-ongoing { border-top: 1px dashed var(--b-line-strong); }
.tt-cv-tl-tick.is-deadline { font-weight: 600; color: var(--b-text-2); box-shadow: none; padding-left: 0; }
.tt-cv-tl-date { position: absolute; top: 15px; font-size: var(--b-fs-12); line-height: 18px; color: var(--b-text-3); white-space: nowrap; font-variant-numeric: tabular-nums; }
.tt-cv-tl-date b { font-weight: 600; color: var(--b-text-1); }
.tt-cv-tl-today { font-style: normal; position: absolute; top: 0; bottom: 0; z-index: 5; width: 0; box-shadow: 0 0 0 .75px var(--b-text-1); pointer-events: none; }
.tt-cv-tl-today span { position: absolute; top: 11px; left: -1px; padding: 0 6px; border-radius: 0 6px 6px 0; font-size: var(--b-fs-12); line-height: 18px; font-weight: 600; white-space: nowrap; color: var(--b-bg-card); background: var(--b-text-1); }
.tt-cv-tl-legend { position: sticky; left: 0; display: flex; flex-wrap: wrap; gap: var(--b-sp-2) var(--b-sp-5); padding: var(--b-sp-4) var(--b-sp-5) 0; font-size: var(--b-fs-12); color: var(--b-text-3); }
.tt-cv-tl-legend span { display: inline-flex; align-items: center; gap: 6px; }
.tt-cv-tl-legend .tt-cv-tl-bar { width: 16px; }

/* ── 看板：五列（或按执行方），列头字 13，卡片就是节点的静态版 ── */
.tt-cv-board { display: grid; grid-auto-flow: column; grid-auto-columns: minmax(160px, 1fr); gap: var(--b-sp-4); align-items: start; overflow: auto; padding: var(--b-sp-5) var(--b-sp-5) 80px; overscroll-behavior: contain; scrollbar-width: thin; }
.tt-cv-board-col { display: grid; gap: var(--b-sp-4); align-content: start; min-width: 0; }
.tt-cv-board-col > header { display: flex; align-items: baseline; gap: var(--b-sp-2); padding: 0 2px var(--b-sp-2); margin-bottom: var(--b-sp-1); box-shadow: inset 0 -1px 0 var(--b-line); }
.tt-cv-board.is-by-state .tt-cv-state:not(.is-queued):not(.is-rework) { display: none; }   /* 按状态分列时，卡里再写一遍状态是重复 */
.tt-cv-board-col h3 { font-size: var(--b-fs-13); font-weight: 600; color: var(--b-text-1); }
.tt-cv-count { font-size: var(--b-fs-12); color: var(--b-text-3); font-variant-numeric: tabular-nums; }
.tt-cv-node.is-card { position: relative; width: auto; height: auto; min-height: 112px; }   /* 和流程节点同高，看板一列排得齐 */
.tt-cv-empty { font-size: var(--b-fs-13); color: var(--b-text-disabled); padding: 0 2px; }

/* ── 拆解落位：草稿纸面的替身层（只在过渡里存在） ── */
.tt-cv-ghosts { position: fixed; inset: 0; z-index: 85; pointer-events: none; }
.tt-cv-anchor { position: fixed; }

@media (prefers-reduced-motion: reduce) {
  .tt-cv-node, .tt-cv-seg button, .tt-cv-tool { transition: none; }
  .tt-cv-node.is-flash::after { animation: none; opacity: 0; }
}

/* ── 团团栏基础卡：团团提议、要你确认（T9／T10 用完整版覆盖） ── */
.tt-cb { display: grid; gap: var(--b-sp-3); padding: var(--b-sp-4); border-radius: 14px; background: var(--b-bg-card); box-shadow: inset 0 0 0 1px var(--b-line), 0 1px 2px var(--b-card-shadow), 0 10px 24px -18px var(--b-card-shadow-far); }
.tt-cb-k { font-size: var(--b-fs-12); line-height: 1.4; font-weight: 600; letter-spacing: var(--b-ls-cap); color: var(--b-text-3); }
.tt-cb-lead { font-size: var(--b-fs-15); line-height: 1.6; color: var(--b-text-1); }
.tt-cb-diff { display: grid; font-size: var(--b-fs-13); }
.tt-cb-diff li { display: flex; justify-content: space-between; align-items: baseline; gap: var(--b-sp-3); padding: 7px 0; border-top: 1px solid var(--b-line); }
.tt-cb-diff b { font-weight: 600; color: var(--b-text-1); white-space: nowrap; }
.tt-cb-diff span { color: var(--b-text-2); text-align: right; font-variant-numeric: tabular-nums; }
.tt-cb-diff s { color: var(--b-text-3); text-decoration-color: var(--b-text-3); }
.tt-cb-main { display: flex; justify-content: space-between; align-items: baseline; gap: var(--b-sp-3); }
.tt-cb-main b { font-size: var(--b-fs-17); line-height: 1.35; font-weight: 600; letter-spacing: var(--b-ls-title); }
.tt-cb-amt { font-size: var(--b-fs-20); font-weight: 700; letter-spacing: var(--b-ls-title); font-family: var(--b-font-num); font-variant-numeric: tabular-nums; }
.tt-cb-budget { margin-top: calc(var(--b-sp-2) * -1); font-size: var(--b-fs-13); color: var(--b-text-2); font-variant-numeric: tabular-nums; }
.tt-cb-budget span { color: var(--b-text-3); }
.tt-cb-effect { font-size: var(--b-fs-12); line-height: 1.5; color: var(--b-text-3); }
.tt-cb-foot { display: flex; flex-wrap: wrap; align-items: center; gap: var(--b-sp-2); margin-top: calc(var(--b-sp-1) * -1); }
.tt-cb-quiet { color: var(--b-text-1); background: var(--b-neutral-tint); }
.tt-cb-quiet:hover { background: var(--b-line-strong); }
.tt-cb-text { padding: 0 var(--b-sp-2); color: var(--b-text-2); font-weight: 500; }
.tt-cb-text:hover { color: var(--b-text-1); }
.tt-cb-done { display: flex; align-items: center; gap: 6px; font-size: var(--b-fs-13); color: var(--b-text-3); }
.tt-cb-done::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
.tt-cb[data-status="applied"] .tt-cb-done, .tt-cb[data-status="yes"] .tt-cb-done { color: var(--b-ok); }
.tt-cb:not([data-status="pending"]) .tt-cb-lead { color: var(--b-text-2); }
