/* t-20261009-kofd 计划三处分工，按前端优化（htuw）的三层：
   T1 纸上（聊天里的计划卡、历史回执）不加底色和边框；T2 白纸细线（左栏、缩略日程）；
   T3 浮层（计划窗口、输入框上方一行）用玻璃：浅色 surface 90% + blur 22px + 顶边高光，深色 canvas 86% + 描边。 */

/* ---------- 左栏计划的家（schedule/3 窄态） ---------- */
.sidebar-plan-summary { display: block; padding: 0 0 10px; }
.plan-home { min-width: 0; }
.plan-home__row { display: flex; align-items: flex-start; gap: 6px; }
.plan-home__body { flex: 1; min-width: 0; display: grid; gap: 10px; }
.plan-home__empty { margin: 2px 0 0; color: var(--faint); font-size: var(--fs-caption); line-height: 1.6; }
/* 有待决定时一行淡底指路，不放按钮 */
.plan-home__pointer { margin: 0; padding: 8px 10px; border-radius: var(--r-sm); background: var(--surface-subtle); color: var(--muted); font-size: var(--fs-caption); line-height: 1.55; }
.plan-home__pointer b { color: var(--ink); font-weight: 600; }
/* 下一段两行：时间 / 单元名 */
.plan-home__next { display: grid; gap: 1px; padding: 0 4px; font-variant-numeric: tabular-nums; }
.plan-home__when { color: var(--muted); font-size: var(--fs-caption); line-height: 1.5; }
.plan-home__unit { color: var(--ink); font-size: var(--fs-ui); font-weight: 600; line-height: 1.45; }
.km-maximize { display: inline-flex; flex: none; align-items: center; justify-content: center; width: 28px; height: 28px; border: 1px solid transparent; border-radius: var(--r-sm); background: transparent; color: var(--muted); cursor: pointer; }
.km-maximize:hover { background: var(--surface-subtle); color: var(--ink); }

/* ---------- 左栏阶段树（t-20261021-esfa）：规划、讲解、实战各一个框（surface + 1px 边线 + 圆角 12，框间 10px）；
   进行中的阶段头部整行浅蓝块、墨水蓝字，进行中的单元左侧 2px 蓝线，学完的打勾；右侧：规划写绿勾，讲解、实战写「已完成 / 总数」 ---------- */
#leftPanel:has(.lp-pane[data-mode="tasks"].is-on) { background: var(--canvas); }
/* 同一套样子用在三处（t-20261021-esfa 统一）：左栏计划气泡与钉住的左栏（.stage-tree 里的 .stage-group）、计划窗口列表（.pt-room）。
   房间框 .room-box，头部 .room-head（序号 · 房间名 · 一行状态 · 右侧完成数 · 细进度条），单元状态圈 .unit-mark 串在一条细竖线上，
   缩进逐级：房间 → 单元（状态圈落在竖线上）→ 小节（和单元名左对齐）；学完的单元整行可进入教室，行尾 .room-go「进入教室 ›」；进行中的 .room-live。 */
.stage-tree, .room-stack { display: grid; gap: 10px; }
.stage-tree { margin-top: 2px; }
.room-box { padding: 4px; border: 1px solid var(--border); border-radius: var(--r-md); background: var(--surface); transition: border-color 140ms ease, box-shadow 140ms ease; }
/* 进行中的房间：边线带一点蓝、轻轻浮起，一眼看出现在在哪个房间 */
.room-box.is-current { border-color: color-mix(in srgb, var(--accent) 34%, var(--border)); box-shadow: 0 1px 3px color-mix(in srgb, var(--ink) 7%, transparent); }
.stage-head { display: flex; align-items: flex-start; min-width: 0; }
.room-head { display: grid; flex: 1; grid-template-columns: minmax(0, 1fr) auto; column-gap: 8px; min-width: 0; padding: 6px 8px 6px 10px; border: 0; border-radius: var(--r-sm); background: none; color: var(--muted); font-family: inherit; text-align: left; }
.stage-enter { cursor: pointer; transition: background-color 120ms ease; }
.stage-enter:hover { background: var(--surface-subtle); }
/* 进度条：已完成 / 总数，全部学完变绿 */
.room-progress { grid-column: 1 / -1; display: block; height: 3px; margin: 7px 0 1px; overflow: hidden; border-radius: 2px; background: color-mix(in srgb, var(--border) 75%, transparent); }
.room-progress i { display: block; height: 100%; border-radius: inherit; background: var(--accent); transition: width 300ms ease; }
.room-progress.is-complete i { background: var(--success); }
.stage-aside { color: var(--faint); font-size: var(--fs-caption); line-height: 21px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.stage-aside:empty { display: none; }
.stage-aside.is-complete { color: var(--success); font-weight: 600; }
.stage-copy { display: grid; min-width: 0; }
.stage-copy strong { color: var(--muted); font-size: var(--fs-ui); font-weight: 400; line-height: 21px; }
.stage-order { margin-right: 6px; color: var(--faint); font-size: var(--fs-caption); font-weight: 400; font-variant-numeric: tabular-nums; }
.stage-copy small { color: var(--accent-strong); font-size: var(--fs-caption); line-height: 1.5; }
.stage-copy small:empty { display: none; }
/* 进行中的阶段（t-20261009-htuw）：整行 --plan-current 浅蓝块；序号与状态行是同色 80%（check-contrast.mjs 的 plan-current-dim） */
.room-box.is-current .room-head { background: var(--plan-current); }
.room-box.is-current .stage-copy strong { color: var(--plan-current-ink); font-weight: 600; }
.room-box.is-current .stage-copy :is(.stage-order, small) { color: var(--plan-current-ink); opacity: .8; }
.room-box.is-current .stage-aside:not(.is-complete) { color: var(--plan-current-ink); opacity: .8; }
.room-box.is-current .room-progress { background: color-mix(in srgb, var(--plan-current-ink) 16%, transparent); }
/* 学完的房间：房间名转灰，右侧绿勾说明 */
.room-box.is-done:not(.is-current) .stage-copy strong { color: var(--muted); }
/* 正在查看的历史阶段（对话停在那个阶段）：整组左侧一道蓝边；当前阶段已有浅蓝块，不再叠 */
.stage-group.is-viewing:not(.is-current) { box-shadow: inset 3px 0 0 var(--accent); }
.stage-toggle { display: grid; flex: none; place-items: center; width: 24px; height: 24px; margin-top: 4px; padding: 0; border: 0; border-radius: var(--r-sm); background: none; color: var(--faint); font-family: inherit; cursor: pointer; }
.stage-toggle:hover { background: var(--surface-subtle); color: var(--ink); }
.stage-toggle span { display: block; font-size: var(--fs-ui); line-height: 1; transition: transform 150ms ease; }
.stage-group.is-open .stage-toggle span { transform: rotate(90deg); }
.stage-body { display: none; }
.stage-group.is-open .stage-body { display: block; }
.stage-enter:focus-visible, .stage-toggle:focus-visible, .unit:focus-visible, .unit-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
/* 单元列表：一条细竖线串起各单元的状态圈（左栏 .units 与窗口 .pt-units 同一条，圈心离列表左边 22px） */
.units, .room-units { position: relative; display: grid; margin: 2px 0 4px; padding: 0; list-style: none; }
.units > .unit-row:not(:last-child)::after, .room-units > .pt-unit:not(:last-child)::after { content: ''; position: absolute; top: 16px; bottom: -16px; left: 22.5px; width: 1px; background: var(--border); pointer-events: none; }
/* 学完的单元到下一个单元那一截是绿色细线：走过的路 */
.units > .unit-row:has(> .unit.is-done):not(:last-child)::after, .room-units > .pt-unit.is-done:not(:last-child)::after { background: color-mix(in srgb, var(--success) 60%, var(--border)); }
/* 状态圈：没开始是灰圈写序号，进行中蓝圈实心点外加一圈淡蓝，学完绿圈淡绿底打勾，先放下是虚线圈 */
.unit-mark { position: relative; z-index: 1; display: inline-grid; place-items: center; box-sizing: border-box; width: 22px; height: 22px; letter-spacing: -.02em; border: 1.5px solid var(--border-strong); border-radius: 50%; background: var(--surface); color: var(--faint); font-size: var(--fs-caption); font-weight: 600; line-height: 1; font-variant-numeric: tabular-nums; }
.unit-mark.is-done { border-color: var(--success); background: var(--success-soft); color: var(--success); }
.unit-mark.is-live { border-color: var(--accent); background: radial-gradient(circle, var(--accent) 0 3.5px, var(--surface) 4px); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 16%, transparent); }
.unit-mark.is-skipped { border-style: dashed; color: var(--muted); }
.unit-row { position: relative; display: grid; grid-template-columns: minmax(0, 1fr) 24px; align-items: start; }
.unit { position: relative; display: grid; grid-template-columns: 22px minmax(0, 1fr) auto; column-gap: 8px; align-items: start; width: 100%; padding: 5px 4px 5px 12px; border: 0; border-radius: var(--r-sm); background: none; color: var(--ink); font-family: inherit; font-size: var(--fs-ui); line-height: 1.5; text-align: left; cursor: pointer; transition: background-color 120ms ease; }
.unit:hover { background: var(--surface-subtle); }
.unit-n { font-size: var(--fs-caption); font-variant-numeric: tabular-nums; }
.unit .unit-mark { margin-top: -.5px; }
.unit-title { grid-column: 2; min-width: 0; overflow-wrap: anywhere; }
/* 日期列：学完写完成日期，进行中写「今天」或开始日期，未开始写计划日期；能进教室的日期后一个蓝色 ›，悬停时换成「进入教室 ›」 */
.unit-date { grid-column: 3; grid-row: 1; justify-self: end; padding-right: 4px; color: var(--faint); font-size: var(--fs-caption); line-height: 21px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.unit.is-current .unit-date { color: var(--accent-strong); }
.unit.is-enterable .unit-date::after { content: '›'; margin-left: 4px; color: var(--accent-strong); font-size: var(--fs-ui); font-weight: 600; }
.unit .room-go { grid-column: 3; grid-row: 1; justify-self: end; opacity: 0; pointer-events: none; transform: translateX(-4px); transition: opacity 140ms ease, transform 140ms ease; }
.unit.is-enterable:is(:hover, :focus-visible) .room-go { opacity: 1; transform: none; }
.unit.is-enterable:is(:hover, :focus-visible) .unit-date { visibility: hidden; }
@media (hover: none) {
  .unit.is-enterable .room-go { opacity: 1; transform: none; }
  .unit.is-enterable .unit-date { display: none; }
}
/* 还没轮到的单元：不可点，字用 faint */
.unit:disabled { cursor: default; }
/* 正在回看这一单元的教室：整行 accent-soft 底，副标题「正在回看」 */
.unit.is-reviewing, .unit.is-reviewing:hover { background: var(--accent-soft); }
.unit.is-reviewing .unit-tag { color: var(--muted); }
.unit:disabled:hover { background: none; }
.unit:disabled :is(.unit-title, .unit-n) { color: var(--faint); }
.unit.is-done .unit-title { color: var(--muted); }
/* 先放下（跳过）的单元：标题转灰，编号不换成钩（t-20261009-f8nf） */
.unit.is-skipped .unit-title { color: var(--muted); }
.unit.is-current .unit-title { font-weight: 600; }
.unit.is-blocked .unit-title { color: var(--danger); }
.unit-tag { grid-column: 2; display: flex; flex-wrap: wrap; align-items: center; gap: 2px 6px; color: var(--faint); font-size: var(--fs-caption); font-variant-numeric: tabular-nums; }
.unit-tag .room-live { margin: 3px 0 1px; }
.unit:disabled .unit-mark { border-color: var(--border); }
.unit-toggle { display: grid; place-items: center; width: 24px; height: 20px; margin-top: 5px; padding: 0; border: 0; border-radius: var(--r-sm); background: none; color: var(--faint); font-family: inherit; cursor: pointer; }
.unit-toggle:hover { background: var(--surface-subtle); color: var(--ink); }
.unit-toggle .icon { width: 14px; height: 14px; transition: transform 150ms ease; }
.unit-row.is-open .unit-toggle .icon { transform: rotate(90deg); }
.unit-subtasks { grid-column: 1 / -1; display: grid; gap: 1px; margin: -1px 0 6px 42px; padding: 0; list-style: none; color: var(--muted); font-size: var(--fs-caption); line-height: 1.6; }
.unit-subtasks[hidden] { display: none; }
.unit-subtasks .km-no { margin-right: 6px; color: var(--faint); font-variant-numeric: tabular-nums; }
.unit-subtasks .is-key { color: var(--ink); font-weight: 600; }
/* 重点（t-20261009-htuw）：名字的下半部垫黄色荧光笔，形状同阅读层的加粗（reading-content.css）。
   左栏知识点、计划窗口列表与它的悬停浮层、日程块详情共用这一条 */
:is(.unit-subtasks, .pt-items, .pc-pop__points) .is-key > .pt-txt { padding: 0 .08em; background: linear-gradient(transparent 35%, var(--plan-marker) 35%, var(--plan-marker) 93%, transparent 93%); -webkit-box-decoration-break: clone; box-decoration-break: clone; }
/* 亮一次：学完那一单元、导师改到的单元（1200ms 淡蓝底） */
.unit.is-lit { animation: outline-lit 1200ms ease; }
@keyframes outline-lit { 15%, 65% { background-color: var(--accent-soft); } }
@media (prefers-reduced-motion: reduce) { .unit.is-lit { animation: none; } .stage-toggle span, .unit-toggle .icon { transition: none; } }
/* 左栏简化（t-20261021-esfa，人类 10/21）：窗口列表保持完整样子；左栏只留房间框、状态圈、日期与蓝色 ›。
   去掉进度条、当前房间的蓝边浮起、单元竖线、悬停「进入教室」胶囊；「进行中」改成一行蓝字，状态圈缩到 18px */
.stage-tree { gap: 8px; }
.stage-tree .room-box.is-current { border-color: var(--border); box-shadow: none; }
.stage-tree .room-progress { display: none; }
.stage-tree .units > .unit-row::after { display: none; }
.stage-tree .unit { grid-template-columns: 18px minmax(0, 1fr) auto; padding-left: 10px; }
.stage-tree .unit-mark { width: 18px; height: 18px; margin-top: 2px; border-width: 1px; font-size: 11px; }
.stage-tree .unit-mark.is-live { background: radial-gradient(circle, var(--accent) 0 3px, var(--surface) 3.5px); box-shadow: none; }
.stage-tree .unit .room-go { display: none; }
.stage-tree .unit.is-enterable:is(:hover, :focus-visible) .unit-date { visibility: visible; color: var(--accent-strong); }
.stage-tree .unit-tag .room-live { height: auto; margin: 0; padding: 0; background: none; color: var(--accent-strong); font-weight: 400; line-height: 1.5; }
.stage-tree .unit-tag .room-live::before { display: none; }
.stage-tree .unit-subtasks { margin-left: 38px; }
@media (hover: none) { .stage-tree .unit.is-enterable .unit-date { display: block; } }

/* ---------- 聊天里的两个小组件（知识地图、计划卡）：同一个白纸框，同高 152、圆角 20，没有按钮，整张可点 ---------- */
.chat-widget { box-sizing: border-box; height: 152px; margin: 14px 0; padding: 14px; border: 1px solid var(--border); border-radius: 20px; background: var(--surface); color: var(--ink); font-size: var(--fs-ui); line-height: 1.5; cursor: pointer; transition: border-color 140ms ease, box-shadow 140ms ease; }
.chat-widget:hover, .chat-widget:focus-visible { border-color: var(--border-strong); box-shadow: var(--shadow-pop); }
.chat-widget:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* 亮一次：1200ms 淡蓝光圈，15% 出现、65% 开始退 */
.chat-widget.is-lit { animation: widget-lit 1200ms ease; }
@keyframes widget-lit { 0%, 100% { box-shadow: 0 0 0 0 transparent; } 15%, 65% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 22%, transparent); } }
@media (prefers-reduced-motion: reduce) { .chat-widget.is-lit { animation: none; } }

/* 计划卡：左缩略日程，右卡头 / 最多 3 行 / 卡尾 */
.chat-widget.plan-card { height: auto; min-height: 176px; }
.plan-card { display: grid; grid-template-columns: 164px minmax(0, 1fr); gap: 16px; max-width: 580px; }
.plan-card .pv-thumb { height: 100%; aspect-ratio: auto; border-radius: 10px; }
.plan-card__info { display: flex; flex-direction: column; min-width: 0; }
.plan-card__head { display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 8px; }
.plan-card__head strong { font-weight: 600; }
.plan-card__state { color: var(--muted); font-variant-numeric: tabular-nums; }
.plan-card__writing { display: inline-block; width: 14px; height: 2px; margin-right: 6px; border-radius: 1px; background: var(--accent); vertical-align: middle; animation: plan-writing 1s ease-in-out infinite; }
@keyframes plan-writing { 50% { opacity: .35; transform: scaleX(.6); } }
.plan-card__list { display: grid; margin: 6px 0 2px; padding: 0; list-style: none; }
/* 一行 = 分支色点 + 时段 + 单元名 */
.plan-card__row { --br: var(--map-branch-1); display: grid; grid-template-columns: 8px 92px minmax(0, 1fr); column-gap: 10px; align-items: baseline; padding: 3px 0; font-variant-numeric: tabular-nums; }
.plan-card__row > i { width: 6px; height: 6px; border-radius: 50%; background: var(--br); transform: translateY(-1px); }
/* 被改单元：名字至少留 8 个字宽；改动写不下时整段换到下一行、靠右 */
.plan-card__row.is-change { display: flex; flex-wrap: wrap; align-items: baseline; }
.plan-card__row.is-change > i { flex: none; }
.plan-card__row.is-change .plan-card__name { flex: 1 1 8em; }
.plan-card__row.is-change .plan-card__change { margin-left: auto; }
.plan-card__name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.plan-card__when, .plan-card__change { color: var(--muted); font-size: var(--fs-caption); white-space: nowrap; }
.plan-card__change { text-align: right; }
.plan-card__row.is-cut .plan-card__name { color: var(--muted); text-decoration: line-through; }
.plan-card__new { display: inline-grid; place-items: center; height: 16px; margin-right: 5px; padding: 0 4px; border: 1px solid var(--ink); border-radius: var(--r-xs); color: var(--ink); font-size: 11px; font-weight: 600; line-height: 1; vertical-align: 1px; }
.chg-old { color: var(--faint); }
.chg-arrow { margin: 0 4px; color: var(--faint); }
.chg-new { color: var(--ink); }
.plan-card__foot { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; margin-top: auto; padding: 10px 0 2px; font-size: var(--fs-caption); }
.plan-card__st { display: inline-flex; align-items: baseline; gap: 7px; color: var(--muted); }
.plan-card__st i { width: 7px; height: 7px; border-radius: 50%; background: var(--border-strong); transform: translateY(-1px); }
.plan-card__foot.is-wait .plan-card__st { color: var(--ink); font-weight: 600; }
.plan-card__foot.is-wait .plan-card__st i { background: var(--marker); box-shadow: 0 0 0 3px color-mix(in srgb, var(--marker) 28%, transparent); }
.plan-card__foot.is-ok .plan-card__st i { background: var(--success); }
/* 嵌入计划卡底部右边：一句淡字提示 + 画笔（调整）+ 蓝色对勾（确认） */
.plan-card__acts { display: inline-flex; align-items: center; gap: 8px; margin-left: auto; }
.plan-card__acts:empty { display: none; }
.plan-card__hint { color: var(--muted); white-space: nowrap; }
/* 学生改过时间的草稿卡：手机上「你改的时间会一起告诉导师」在卡尾确认勾旁边（字小、灰），换掉「可拖动改时间」；桌面不显示 */
.plan-card__hint.is-edited { display: none; }
@media (max-width: 767px) {
  .plan-card__hint.is-edited { display: inline; min-width: 0; font-size: 11px; line-height: 1.35; text-align: right; white-space: normal; }
  .plan-card__acts:has(.is-edited) > .plan-card__hint:not(.is-edited) { display: none; }
}
@media (prefers-reduced-motion: reduce) { .plan-card__writing { animation: none; } }

/* 缩略日程（T2）：窗口日程的缩小版。块 = 分支色浅底 + 左色条；实际学习时间叠同色深一档；建议时旧位置虚线框；蓝线是现在 */
.pv-thumb { --days: 1; --pv-studied: 32%; position: relative; align-self: start; aspect-ratio: 4 / 3; overflow: hidden; border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface); transition: border-color 140ms ease, box-shadow 140ms ease; }
[data-theme="dark"] .pv-thumb { --pv-studied: 24%; }
.pv-thumb__heads, .pv-thumb__grid { position: absolute; left: 6px; right: 6px; display: grid; grid-template-columns: repeat(var(--days), minmax(0, 1fr)); }
.pv-thumb__heads { top: 4px; overflow: hidden; color: var(--faint); font-size: 9px; font-weight: 600; line-height: 12px; text-align: center; white-space: nowrap; }
.pv-thumb__heads .is-today { color: var(--accent-strong); }
.pv-thumb__heads .is-exam { justify-self: center; padding: 0 2px; border: 1px solid var(--ink); border-radius: 3px; color: var(--ink); }
.pv-thumb__grid { top: 19px; bottom: 6px; }
.pv-thumb__col { position: relative; border-left: 1px solid color-mix(in srgb, var(--border) 70%, transparent); }
.pv-thumb__col.is-exam { background: repeating-linear-gradient(135deg, color-mix(in srgb, var(--ink) 8%, transparent) 0 3px, transparent 3px 6px); }
.pv-thumb__block { --br: var(--map-branch-1); position: absolute; z-index: 1; min-height: 2px; border: 1px solid color-mix(in srgb, var(--br) 38%, var(--surface)); border-left: 2px solid var(--br); border-radius: 2px; background: color-mix(in srgb, var(--br) 16%, var(--surface)); }
.pv-thumb__block.is-done { border-color: color-mix(in srgb, var(--br) 24%, var(--border)); border-left-color: color-mix(in srgb, var(--br) 60%, var(--surface)); background: color-mix(in srgb, var(--br) 6%, var(--surface)); }
.pv-thumb__block.is-landed { animation: pc-land 140ms ease-out; }
.pv-thumb__bar { --br: var(--map-branch-1); position: absolute; z-index: 2; border-radius: 1px; background: color-mix(in srgb, var(--br) var(--pv-studied), var(--surface)); pointer-events: none; }
.pv-thumb__ghost { position: absolute; left: 1px; right: 1px; z-index: 0; border: 1px dashed var(--border-strong); border-radius: 2px; }
.pv-thumb__now { position: absolute; left: -1px; right: -1px; z-index: 3; border-top: 1.5px solid var(--accent); pointer-events: none; }
@media (prefers-reduced-motion: reduce) { .pv-thumb__block.is-landed { animation: none; } }

/* 历史回执（T1）：一行，不展开 */
.plan-rcpt { display: flex; align-items: center; gap: 6px; max-width: 40em; margin: 10px 0 4px; color: var(--faint); font-size: var(--fs-caption); line-height: 1.5; font-variant-numeric: tabular-nums; }
.plan-rcpt__icon { flex: none; width: 13px; height: 13px; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }
.plan-rcpt__line { min-width: 0; overflow-wrap: anywhere; }
.plan-rcpt b { color: var(--muted); font-weight: 600; }
.plan-rcpt .chg-new { color: var(--muted); }
.plan-rcpt.is-wait { color: var(--muted); }

/* ---------- 输入框上方一行（T3 玻璃）：与输入框合成一圈边；窗口开着时整条隐藏 ---------- */
.plan-strip { overflow: hidden; border: 1px solid var(--border-strong); border-bottom: 0; border-radius: var(--r-md) var(--r-md) 0 0; background: color-mix(in srgb, var(--surface) 90%, transparent); -webkit-backdrop-filter: blur(22px) saturate(1.5); backdrop-filter: blur(22px) saturate(1.5); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .7); transition: border-color 150ms ease; }
[data-theme="dark"] .plan-strip { background: color-mix(in srgb, var(--canvas) 86%, transparent); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .05); }
.plan-strip[hidden] { display: none; }
.plan-strip:not([hidden]) + .composer-box { border-top-color: color-mix(in srgb, var(--border) 75%, transparent); border-top-left-radius: 0; border-top-right-radius: 0; }
.composer-inner:has(> .composer-box:focus-within) > .plan-strip:not([hidden]) { border-color: var(--accent); box-shadow: inset 1px 0 0 var(--accent), inset -1px 0 0 var(--accent), inset 0 1px 0 var(--accent); }
.plan-strip__row { display: flex; align-items: center; gap: 12px; padding: 8px 12px 8px 16px; cursor: pointer; }
.plan-strip__head { flex: 1; min-width: 0; display: flex; align-items: baseline; gap: 10px; overflow: hidden; white-space: nowrap; }
.plan-strip__title { flex: none; display: inline-flex; align-items: center; gap: 8px; color: var(--ink); font-size: var(--fs-ui); font-weight: 600; transition: color 140ms ease; }
/* 等你决定：提醒黄点，和停靠卡卡头、计划卡尾同一个点；标题后一个 › 说明点这一行能打开计划窗口 */
.plan-strip__title::before { content: ''; flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--marker); box-shadow: 0 0 0 3px color-mix(in srgb, var(--marker) 28%, transparent); }
.plan-strip__head::after { content: ''; flex: none; align-self: center; width: 14px; height: 14px; margin-left: -4px; background: var(--faint); -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 6 6 6-6 6'/%3E%3C/svg%3E") center / contain no-repeat; mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m9 6 6 6-6 6'/%3E%3C/svg%3E") center / contain no-repeat; transition: background-color 140ms ease, transform 140ms ease; }
.plan-strip__row:hover .plan-strip__title { color: var(--accent-strong); }
.plan-strip__row:hover .plan-strip__head::after { background: var(--accent-strong); transform: translateX(2px); }
/* 停靠卡里还有等确认的项时，蓝色留给停靠卡的下一项；那几项处理完，「应用调整 / 确认计划」变回蓝色 */
.composer-inner:has(#changeDock:not([hidden], [data-dock-bubble])) .plan-strip .btn-primary { border-color: var(--border-strong); background: var(--surface); color: var(--ink); }
.composer-inner:has(#changeDock:not([hidden], [data-dock-bubble])) .plan-strip .btn-primary:hover:not([disabled]) { background: var(--surface-subtle); }
@media (prefers-reduced-motion: reduce) { .plan-strip__head::after { transition: none; } }
.plan-strip__acts { display: flex; flex: none; align-items: center; gap: 8px; }
.plan-strip__note { color: var(--muted); font-size: var(--fs-caption); white-space: nowrap; }
.plan-strip > .sr-error { margin: 0 16px 8px; }
@media (max-width: 767px) {
  .plan-strip__row { flex-wrap: wrap; row-gap: 6px; }
  .plan-strip__acts { flex-wrap: wrap; justify-content: flex-end; margin-left: auto; }
  .chat-widget.plan-card { height: auto; grid-template-columns: minmax(0, 1fr); gap: 10px; }
  .plan-card .pv-thumb { height: 120px; }
  .plan-card__row { grid-template-columns: 8px 84px minmax(0, 1fr); }
}

/* ---------- 计划窗口（T3 玻璃） ---------- */
.plan-overlay__panel { border-color: color-mix(in srgb, var(--border) 85%, transparent); background: color-mix(in srgb, var(--surface) 90%, transparent); -webkit-backdrop-filter: blur(22px) saturate(1.5); backdrop-filter: blur(22px) saturate(1.5); box-shadow: var(--shadow-modal), inset 0 1px 0 rgba(255, 255, 255, .7); }
[data-theme="dark"] .plan-overlay__panel { border-color: var(--border-strong); background: color-mix(in srgb, var(--canvas) 86%, transparent); box-shadow: var(--shadow-modal), inset 0 1px 0 rgba(255, 255, 255, .05); }
.plan-overlay__header { flex-wrap: wrap; row-gap: 8px; }
.plan-overlay__actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 8px; }
/* 窗口底部一句说明：导师写完后可以改时间 / 你改的时间会一起告诉导师 / 虚线框是原来的位置 */
.plan-overlay__foot { flex: none; margin: 0; padding: 10px 20px; border-top: 1px solid color-mix(in srgb, var(--border) 75%, transparent); color: var(--muted); font-size: var(--fs-caption); line-height: 1.5; }
.plan-overlay__foot[hidden] { display: none; }
.plan-trial { flex: none; display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 10px 20px; border-top: 1px solid color-mix(in srgb, var(--border) 75%, transparent); background: color-mix(in srgb, var(--marker) 10%, var(--surface)); }
.plan-trial[hidden] { display: none; }
.plan-trial__copy { min-width: 0; display: grid; gap: 1px; color: var(--ink); font-size: var(--fs-ui); line-height: 1.45; }
.plan-trial__copy strong { font-weight: 600; }
.plan-trial__copy span { color: var(--muted); font-size: var(--fs-caption); }
.plan-trial__actions { flex: none; display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; }
.plan-trial__actions .btn { white-space: nowrap; }
/* 桌面上小人在计划窗口里跟到窗口右下角：试排条右边留出它的位置，「保留修改」不被它压住（t-20261027-i1dr） */
@media (min-width: 768px) { .plan-trial { padding-right: 84px; } }
.plan-overlay__notes { flex: 1 1 100%; display: grid; justify-items: end; gap: 6px; }
.plan-overlay__notes:empty { display: none; }
.plan-overlay__notes > * { margin: 0; }
/* The dialog sets the window size (78vw × 78dvh, or the stacked half); the panel fills it. */
.plan-overlay__panel { width: 100%; height: 100%; grid-template-rows: auto minmax(0, 1fr) auto auto; }
.plan-overlay__title { display: flex; align-items: baseline; gap: 10px; }
.plan-overlay__body { overflow: auto; }
/* t-20261009-zm3u 窗口左上角的视图切换（列表 / 日程，t-20261009-qcgu 改名） */
.plan-overlay__lead { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 14px; min-width: 0; }
.pv-switch { display: inline-flex; flex: none; padding: 2px; border: 1px solid var(--border); border-radius: var(--r-pill); background: var(--surface); }
.pv-switch__btn { padding: 2px 12px; border: 0; border-radius: var(--r-pill); background: none; color: var(--muted); font: inherit; font-size: var(--fs-caption); line-height: 1.6; cursor: pointer; }
.pv-switch__btn:hover { color: var(--ink); }
.pv-switch__btn[aria-pressed="true"] { background: var(--accent-soft); color: var(--accent-strong); font-weight: 600; }
.pv-switch__btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.plan-overlay__actions .btn { flex: none; }
.plan-overlay__actions .btn-xs { height: 30px; padding: 0 12px; font-size: 13px; }
/* 有待决时窗口标题写这次要决定的事，前面同一个提醒黄点 */
.plan-overlay__title h2.is-pending { display: inline-flex; align-items: center; gap: 10px; }
.plan-overlay__title h2.is-pending::before { content: ''; flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--marker); box-shadow: 0 0 0 3px color-mix(in srgb, var(--marker) 28%, transparent); }
/* 「进行中」：浅蓝胶囊前一颗蓝点（左栏单元行、计划窗口列表共用） */
.room-live { display: inline-flex; flex: none; align-items: center; gap: 5px; height: 20px; padding: 0 8px 0 7px; border-radius: var(--r-pill); background: var(--plan-current); color: var(--plan-current-ink); font-size: var(--fs-caption); font-weight: 600; line-height: 20px; white-space: nowrap; }
.room-live::before { content: ''; flex: none; width: 6px; height: 6px; border-radius: 50%; background: var(--accent); }
/* 「进入教室 ›」：白底蓝字细边的小胶囊，悬停变浅蓝底、箭头右移一点。左栏计划、计划窗口列表与日程块、学习路线共用 */
.room-go { display: inline-flex; flex: none; align-items: center; gap: 3px; box-sizing: border-box; height: 22px; padding: 0 7px 0 9px; border: 1px solid color-mix(in srgb, var(--accent) 38%, var(--border)); border-radius: var(--r-pill); background: var(--surface); color: var(--accent-strong); font-family: var(--font-sans); font-size: var(--fs-caption); font-weight: 600; line-height: 1; white-space: nowrap; cursor: pointer; transition: background-color 120ms ease, border-color 120ms ease; }
.room-go::after { content: '›'; font-size: var(--fs-ui); line-height: 1; transform: translateY(-1px); transition: transform 140ms ease; }
:is(button.room-go:hover, .room-go:focus-visible, .is-enterable:hover .room-go, .is-enterable:focus-visible .room-go) { border-color: var(--accent); background: var(--accent-soft); }
:is(button.room-go:hover, .is-enterable:hover .room-go)::after { transform: translate(2px, -1px); }
.room-go:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.room-go.is-compact { height: 18px; padding: 0 4px 0 6px; font-size: 11px; }
@media (prefers-reduced-motion: reduce) { .room-go, .room-go::after, .unit .room-go, .room-progress i { transition: none; } }

/* 列表视图（t-20261021-esfa）：规划 / 讲解 / 实战三个房间框，和左栏同一套样子；单元按计划顺序，日期与时段是行尾的辅助信息。
   单元一行 = 状态圈 + 单元名（下一行「进行中」/「已跳过」）+ 日期时段，学完的行尾「进入教室 ›」、整行可点；
   下面是计划里写的条目（和单元名左对齐），重点用荧光笔 */
.pt-outline { width: min(760px, 100%); margin: 0 auto; padding: 0 4px 12px; }
.pt-room .room-head { padding: 8px 10px 8px 12px; }
.pt-units { margin: 4px 0 2px; }
.pt-unit { position: relative; padding: 7px 10px 9px 12px; border-radius: var(--r-sm); transition: background-color 120ms ease; }
.pt-unit.is-enterable { cursor: pointer; }
.pt-unit.is-enterable:hover { background: var(--surface-subtle); }
.pt-unit.is-done .pt-unit__title, .pt-unit.is-skipped .pt-unit__title { color: var(--muted); }
.pt-unit.is-enterable:hover .pt-unit__title { color: var(--ink); }
/* 预览建议：被改到的单元垫一层浅底，一眼看出改了哪几块 */
.pt-unit.is-changed { background: var(--surface-subtle); }
.pt-unit.is-removed .unit-mark { border-style: dashed; }
.pt-unit.is-removed .pt-unit__title, .pt-unit.is-removed .pt-item { color: var(--muted); text-decoration: line-through; }
.pt-unit.is-flash { animation: pt-lit 1200ms ease; }
@keyframes pt-lit { 15%, 65% { background-color: var(--accent-soft); } }
.pt-unit__head { display: grid; grid-template-columns: 22px minmax(0, 1fr) auto auto; column-gap: 10px; align-items: start; }
.pt-unit__head > .unit-mark { grid-column: 1; grid-row: 1; margin-top: 0; }
.pt-unit__title { grid-column: 2; grid-row: 1; min-width: 0; color: var(--ink); font-size: var(--fs-ui); font-weight: 600; line-height: 1.5; overflow-wrap: anywhere; }
.pt-unit__title .diff-del, .pt-unit__title .diff-ins { margin-right: 6px; }
.pt-unit__sub { grid-column: 2; grid-row: 2; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; margin-top: 3px; }
.pt-unit__skipped { flex: none; color: var(--muted); font-size: var(--fs-caption); }
.pt-unit__when { grid-column: 3; grid-row: 1; justify-self: end; color: var(--faint); font-size: var(--fs-caption); line-height: 1.5; font-variant-numeric: tabular-nums; white-space: nowrap; }
.pt-unit__day.is-today { color: var(--accent-strong); font-weight: 600; }
.pt-unit__head > .room-go { grid-column: 4; grid-row: 1; justify-self: end; }
.plan-overlay .pt-unit__head > .room-go { margin-top: 2px; }
.pt-items { display: grid; margin: 4px 0 0 32px; padding: 0; list-style: none; color: var(--muted); font-size: var(--fs-caption); line-height: 1.6; }
/* 考试日：最后一行，「考试」胶囊 + 日期 */
.pt-exam-line { display: flex; align-items: center; gap: 8px; margin: 2px 0 0; padding: 6px 14px; color: var(--ink); font-size: var(--fs-ui); font-weight: 600; font-variant-numeric: tabular-nums; }
.pt-exam-line .pc-exam { margin: 0; }
.pt-item { position: relative; width: fit-content; max-width: 100%; margin-left: -6px; padding: 0 6px; border-radius: var(--r-xs); }
.pt-item .km-no { margin-right: 6px; color: var(--faint); font-variant-numeric: tabular-nums; }
.pt-item.is-key { color: var(--ink); font-weight: 600; }
/* 有知识点的小节：鼠标停在上面或键盘聚焦时，下方弹出它的知识点（t-20261009-htuw）。
   浮层同聊天里引用预览（workspace.css .msg-sources__pop）：玻璃底、不写标题、没有按钮；指针或焦点离开就收起。
   触屏没有悬停：点一下开、再点一下关（plan-view.js 加 is-open） */
.pt-item.has-pop { cursor: default; }
.pt-item.has-pop:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.pt-pop { display: none; position: absolute; z-index: 5; top: calc(100% + 6px); left: 0; width: max-content; max-width: min(320px, 80vw); overflow: hidden; padding: 8px 14px 10px; border: 1px solid var(--border); border-radius: var(--r-md); background: color-mix(in srgb, var(--surface) 92%, transparent); -webkit-backdrop-filter: blur(22px) saturate(1.5); backdrop-filter: blur(22px) saturate(1.5); box-shadow: var(--shadow-pop); color: var(--muted); font-weight: 400; animation: msg-sources-pop 140ms cubic-bezier(.2, .8, .2, 1); }
.pt-item.has-pop:is(:focus-visible, .is-open) { background: var(--surface-subtle); }
.pt-item.has-pop:is(:focus-visible, .is-open) > .pt-pop { display: block; }
@media (hover: hover) {
  .pt-item.has-pop:hover { background: var(--surface-subtle); }
  .pt-item.has-pop:hover > .pt-pop { display: block; }
}
.pt-pop__list { display: grid; gap: 1px; margin: 0; padding: 0; list-style: none; font-size: var(--fs-caption); line-height: 1.6; }
.pt-pop li.is-key { color: var(--ink); font-weight: 600; }
@media (prefers-reduced-motion: reduce) { .pt-pop { animation: none; } }
.pt-item__mark { display: inline-block; width: 1em; margin-right: 2px; font-weight: 700; }
.pt-item.is-add { color: var(--success); }
.pt-item.is-cut { color: var(--danger); text-decoration: line-through; }
.pt-dev { margin: 6px 0 0 26px; }
.pt-dev__note { margin: 2px 0; padding: 2px 10px; border-left: 2px solid var(--border-strong); color: var(--muted); font-size: var(--fs-caption); line-height: 1.6; white-space: pre-wrap; }
.pt-dev__note b { margin-right: 6px; color: var(--faint); font-weight: 600; }
.pt-status { position: sticky; bottom: 12px; width: max-content; margin: 0 auto; transform: none; }
@media (prefers-reduced-motion: reduce) { .pt-unit.is-flash { animation: none; } }
.pt-unit__when .chg-old, .pt-unit__when .chg-arrow { color: var(--faint); }
.pt-unit__when .chg-new { color: var(--ink); }
/* 计划窗口是主要阅读面：标题接近窗口 heading，正文回到正文字号，时间保持清楚；聊天缩略图与左栏不跟着放大。 */
.plan-overlay .pt-unit__title { font-size: 18px; line-height: 1.45; }
.plan-overlay .pt-unit__head > .unit-mark { margin-top: 2px; }
.plan-overlay .pt-unit__when { line-height: 26px; }
.plan-overlay .room-units > .pt-unit:not(:last-child)::after { top: 18px; bottom: -18px; }
.plan-overlay .pt-room .stage-copy strong { font-size: var(--fs-body); }
/* 窄屏：日期时段与「进入教室」换到单元名下面，和单元名左对齐 */
@media (max-width: 767px) {
  .pt-unit__head { grid-template-columns: 22px minmax(0, 1fr); }
  .pt-unit__when, .pt-unit__sub, .pt-unit__head > .room-go { grid-column: 2; grid-row: auto; justify-self: start; }
  .plan-overlay .pt-unit__when { line-height: 1.6; }
  .plan-overlay .pt-unit__title { font-size: 16px; }
  .plan-overlay .pt-unit__head > .unit-mark { margin-top: 1px; }
  .pt-unit { padding-right: 6px; }
}
/* 全屏计划的层次（人类 10/22）：每个单元一张淡底卡片，单元名和知识点都在卡片里；不画单元之间的竖线。
   单元名 18px 加粗；知识点 14px 常规（重点只靠荧光笔，不加粗），不和单元名抢视线；「进行中」放在单元名同一行的右侧 */
.plan-overlay .room-stack { gap: 18px; }
.plan-overlay .pt-room .room-head { padding: 10px 12px 10px 14px; }
.plan-overlay .pt-room .stage-copy strong { font-weight: 600; letter-spacing: .02em; }
.plan-overlay .room-units { gap: 8px; margin: 8px 4px 6px; }
.plan-overlay .room-units > .pt-unit::after { display: none; }
.plan-overlay .pt-unit { padding: 14px 16px 16px 14px; border-radius: var(--r-md); background: color-mix(in srgb, var(--surface-subtle) 55%, var(--surface)); }
.plan-overlay .pt-unit.is-enterable:hover, .plan-overlay .pt-unit.is-changed { background: var(--surface-subtle); }
@media (min-width: 768px) { .plan-overlay .pt-unit__head > .pt-unit__sub { grid-column: 4; grid-row: 1; justify-self: end; margin-top: 1px; } }
.plan-overlay .pt-items { font-size: var(--fs-ui); gap: 1px; margin: 8px 0 0 32px; line-height: 1.75; }
.plan-overlay .pt-item { margin-left: -4px; padding: 0 4px; }
.plan-overlay .pt-item.is-key { color: var(--ink); font-weight: 400; }
.plan-overlay .pt-dev__note { font-size: var(--fs-body); line-height: 1.65; }
.plan-overlay :is(.pt-unit__when, .pt-unit__skipped) { font-size: var(--fs-ui); }
.diff-arrow { color: var(--faint); }
.pl-note summary { display: flex; align-items: center; gap: 6px; padding: 8px 0 2px; color: var(--faint); font-size: var(--fs-body); font-weight: 600; line-height: 1.5; cursor: pointer; list-style: none; }
.pl-note summary::after { content: '›'; font-size: var(--fs-ui); font-weight: 400; transition: transform 150ms ease; }
.pl-note[open] summary::after { transform: rotate(90deg); }
.pl-note p { margin: 4px 0 6px; padding: 2px 10px; border-left: 2px solid var(--border-strong); color: var(--muted); font-size: var(--fs-body); line-height: 1.65; white-space: pre-wrap; }
/* 预览的建议改了计划说明：旧的划掉、新的蓝线（t-20261009-kofd） */
.pl-note .pl-scope-change__label { padding: 0; border: 0; color: var(--faint); font-size: var(--fs-caption); font-weight: 600; }
.pl-note .pl-scope-change .chg-old { color: var(--faint); text-decoration: line-through; }
.pl-note .pl-scope-change .chg-new { border-left-color: var(--accent); color: var(--ink); }
.pl-foot { width: min(720px, 100%); margin: 10px auto 0; padding: 8px 16px 10px; border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface); }
.pl-foot ul { margin: 6px 0 8px; padding-inline-start: 1.4em; color: var(--muted); font-size: var(--fs-body); line-height: 1.65; }
.pl-foot ul ul { margin: 3px 0 4px; padding-inline-start: 1.35em; }
.pl-foot li { min-width: 0; padding-inline-start: .15em; overflow-wrap: anywhere; }
.pl-foot li + li { margin-top: 3px; }
.plan-card-expired { opacity: .78; }

/* t-20261007-00tv 计划日历：白纸、整点细线；蓝只给「今天」「现在」和拖动落点，绿只给完成的勾。
   块按知识地图上色：--br 是单元内容所在那一章的分支色（和地图同一章同色），只用来区分章，
   状态叠在颜色上——完成变淡、当前加粗边框、过了时段没学用虚线。 */
.plan-calendar { --pc-studied-light: 22%; --pc-studied-dark: 14%; --pc-studied: var(--pc-studied-light); position: relative; display: grid; gap: 8px; min-width: 0; }
[data-theme="dark"] .plan-calendar { --pc-studied: var(--pc-studied-dark); }
.pc-note { margin: 0; color: var(--faint); font-size: var(--fs-caption); line-height: 1.5; }
.pc-status { position: absolute; bottom: 12px; left: 50%; z-index: 6; max-width: calc(100% - 32px); margin: 0; padding: 4px 12px; border: 1px solid var(--border); border-radius: var(--r-pill); background: var(--surface); color: var(--muted); font-size: var(--fs-caption); line-height: 1.5; pointer-events: none; transform: translateX(-50%); }
.pc-status.is-error { border-color: var(--danger); color: var(--danger); }
.pc-scroll { position: relative; height: clamp(320px, calc(78dvh - 190px), 760px); overflow: auto; border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface); overscroll-behavior: contain; }
/* 横竖两条滚动条相交处不画方块 */
.pc-scroll::-webkit-scrollbar-corner, .plan-overlay__body::-webkit-scrollbar-corner { background: transparent; }
.pc-scroll:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.pc-grid { --pc-days: 1; --pc-hour: 60px; --pc-height: calc(16 * var(--pc-hour)); display: grid; grid-template-columns: 52px repeat(var(--pc-days), minmax(132px, 1fr)); grid-template-rows: auto var(--pc-height); min-width: min-content; }
.pc-corner, .pc-day-head { position: sticky; top: 0; z-index: 3; background: var(--surface); border-bottom: 1px solid var(--border); }
.pc-corner { left: 0; z-index: 4; }
.pc-day-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 6px; padding: 9px 10px 8px; border-left: 1px solid var(--border); }
.pc-day-head strong { color: var(--ink); font-size: var(--fs-ui); font-weight: 600; font-variant-numeric: tabular-nums; }
.pc-day-sub { color: var(--faint); font-size: var(--fs-caption); }
.pc-day-head.is-today strong, .pc-day-head.is-today .pc-day-sub { color: var(--accent-strong); }
/* 考试日：表头实底胶囊「考试」，整列淡底斜纹，块放不上去 */
.pc-exam { flex: none; align-self: center; margin-left: 0; height: 18px; padding: 0 8px; border-radius: var(--r-pill); background: var(--ink); color: var(--canvas); font-size: 11px; font-weight: 600; line-height: 18px; }
.pc-day-head.is-exam::after { content: ""; flex-basis: 100%; order: 1; }
.pc-day-head.is-exam .pc-exam { order: 2; margin-top: 4px; }
.pc-day-head.is-exam strong { color: var(--ink); }
.pc-day.is-exam { background-color: color-mix(in srgb, var(--surface-subtle) 55%, transparent); background-image: repeating-linear-gradient(135deg, color-mix(in srgb, var(--ink) 7%, transparent) 0 6px, transparent 6px 12px); }
.pc-axis { position: sticky; left: 0; z-index: 2; background: var(--surface); }
.pc-axis span { position: absolute; right: 8px; margin-top: 3px; color: var(--faint); font-size: 11px; line-height: 1; font-variant-numeric: tabular-nums; }
/* 每列自成一层：块面在下，学习分段的实心条在中间，块上文字在最上 */
.pc-day { position: relative; isolation: isolate; border-left: 1px solid var(--border); background-image: repeating-linear-gradient(to bottom, color-mix(in srgb, var(--border) 60%, transparent) 0, color-mix(in srgb, var(--border) 60%, transparent) 1px, transparent 1px, transparent var(--pc-hour)); }
.pc-now { position: absolute; left: 0; right: 0; z-index: 4; height: 0; border-top: 2px solid var(--accent); pointer-events: none; }
.pc-now::before { content: ''; position: absolute; top: -5px; left: -4px; width: 8px; height: 8px; border-radius: 50%; background: var(--accent); }
/* 现在线右端的时间胶囊（t-20261009-kofd） */
.pc-now__time { position: absolute; top: -9px; right: 4px; padding: 0 4px; border-radius: var(--r-xs); background: var(--accent); color: var(--on-accent); font-size: 10px; font-weight: 600; line-height: 16px; font-variant-numeric: tabular-nums; }
/* 仿地图的单元节点：--br 10% 的淡底 + --br 色条。左边条画在段上，共用块里每段各用自己单元的色；块只给外框。 */
.pc-block { --br: var(--map-branch-1); position: absolute; display: flex; flex-direction: column; overflow: hidden; border: 1px solid color-mix(in srgb, var(--br) 45%, var(--surface)); border-left-width: 0; border-radius: 6px; background: var(--surface); color: var(--ink); }
.pc-block.is-shared { border-color: var(--border-strong); }
.pc-block.is-continued { border-top-left-radius: 0; border-top-right-radius: 0; }
.pc-part { --br: var(--map-branch-1); display: flex; flex: 0 0 auto; flex-direction: column; gap: 1px; min-height: 0; padding: 4px 8px 4px 7px; overflow: hidden; border-left: 3px solid var(--br); background: color-mix(in srgb, var(--br) 10%, var(--surface)); }
.pc-block.is-shared .pc-part + .pc-part { border-top: 1px solid var(--surface); }
.pc-name, .pc-meta { position: relative; z-index: 3; }
.pc-name { display: -webkit-box; overflow: hidden; color: var(--ink); font-size: 13px; font-weight: 500; line-height: 1.35; overflow-wrap: anywhere; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
.pc-part.is-short .pc-name { -webkit-line-clamp: 1; }
/* 矮到放不下第二行：只留单元名，状态由边框和底色表达 */
.pc-part.is-tiny { justify-content: center; padding-block: 2px; }
.pc-part.is-tiny .pc-meta { display: none; }
.pc-meta { overflow: hidden; color: var(--muted); font-size: 11px; line-height: 1.4; font-variant-numeric: tabular-nums; text-overflow: ellipsis; white-space: nowrap; }
.pc-check { margin-right: 4px; color: var(--success); font-weight: 600; }
/* 学完的块：右下角一枚「教室 ›」（同列表、左栏的进入教室标识），点它直接进教室；名字给它让出位置 */
.pc-part.has-room { position: relative; }
.pc-part.has-room .room-go { position: absolute; right: 4px; bottom: 4px; z-index: 4; box-shadow: 0 0 0 2px color-mix(in srgb, var(--br) 4%, var(--surface)); }
.pc-part.has-room.is-short .room-go, .pc-part.has-room.is-tiny .room-go { top: 50%; bottom: auto; transform: translateY(-50%); }
.pc-part.has-room .pc-meta, .pc-part.has-room:is(.is-short, .is-tiny) .pc-name { padding-right: 56px; }
/* 几块并排、块很窄时只留一个圆形「›」，悬停提示仍写「进入教室」 */
.pc-block:has(.pc-part.has-room) { container-type: inline-size; }
@container (max-width: 110px) {
  .pc-part.has-room .room-go { justify-content: center; width: 18px; padding: 0; font-size: 0; }
  .pc-part.has-room .room-go::after { font-size: 13px; transform: translate(.5px, -1px); }
  .pc-part.has-room .pc-meta, .pc-part.has-room:is(.is-short, .is-tiny) .pc-name { padding-right: 20px; }
}
.pc-pop__unit .room-go { justify-self: start; margin-top: 4px; }
/* 当前：同色加粗——单独的块整圈 2px，共用块里那一段内圈 2px；色条加宽 */
.pc-block.is-current { border-width: 2px 2px 2px 0; border-color: var(--br); }
.pc-part.is-current { padding-left: 5px; border-left-width: 5px; }
.pc-block.is-shared .pc-part.is-current { outline: 2px solid var(--br); outline-offset: -2px; }
.pc-part.is-current .pc-meta { color: var(--ink); font-weight: 600; }
/* 完成（含跳过）：同一章的颜色调淡，名字退成 muted，保留 ✓ 和实际分钟 */
.pc-block.is-done, .pc-block.is-skipped { border-color: color-mix(in srgb, var(--br) 20%, var(--border)); }
.pc-part.is-done, .pc-part.is-skipped { border-left-color: color-mix(in srgb, var(--br) 40%, var(--surface)); background: color-mix(in srgb, var(--br) 4%, var(--surface)); }
.pc-part.is-done .pc-name, .pc-part.is-skipped .pc-name { color: var(--muted); font-weight: 400; }
.pc-block.is-draggable { cursor: grab; touch-action: none; user-select: none; transition: border-color 120ms ease; }
.pc-block.is-draggable:hover { border-color: var(--br); }
.pc-block.is-shared.is-draggable:hover { border-color: var(--muted); }
.pc-block.is-dragging { opacity: .45; }
.plan-calendar.is-dragging, .plan-calendar.is-dragging .pc-block { cursor: grabbing; }
.pc-ghost { position: absolute; left: 3px; right: 3px; z-index: 5; border: 1.5px dashed var(--accent); border-radius: 6px; pointer-events: none; }
.pc-ghost__tag { position: absolute; top: -23px; left: -2px; padding: 2px 6px; border-radius: var(--r-xs); background: var(--accent); color: var(--on-accent); font-size: 11px; line-height: 16px; font-variant-numeric: tabular-nums; white-space: nowrap; }
/* 拉下边：加宽鼠标与触屏命中区；细横线常驻提示可拉，悬停 / 正在拉时再加强。 */
.pc-resize { position: absolute; right: 0; bottom: 0; left: 0; z-index: 4; height: 14px; cursor: ns-resize; touch-action: none; }
.pc-resize::after { content: ''; position: absolute; bottom: 3px; left: 50%; width: 32px; height: 3px; border-radius: 2px; background: var(--br); opacity: .45; transform: translateX(-50%); transition: opacity 120ms ease; }
.pc-block.is-resizable:hover .pc-resize::after, .pc-block.is-resizing .pc-resize::after { opacity: .9; }
.pc-block.is-resizing { opacity: .45; }
.plan-calendar.is-resizing, .plan-calendar.is-resizing .pc-block { cursor: ns-resize; }
/* 真实用时：每段学习按真实时间画成同色深一档的实心条，和块同一列、同宽；条在块面之上、文字之下，不接收指针，块照常能拖。
   深度 --pc-studied 让块上文字仍过 check-contrast.mjs 的门槛（pc-studied-*）。 */
.pc-studied { --br: var(--map-branch-1); position: absolute; z-index: 2; border-radius: 3px; background: color-mix(in srgb, var(--br) var(--pc-studied), transparent); pointer-events: none; }
/* 预览建议：旧位置是灰色虚线空框，删掉的单元名字划线；新增的单元标「新」 */
.pc-ghost-old { position: absolute; right: 3px; left: 3px; z-index: 0; overflow: hidden; padding: 4px 8px; border: 1.5px dashed var(--border-strong); border-radius: 6px; pointer-events: none; }
.pc-ghost-old__name { display: block; overflow: hidden; color: var(--faint); font-size: 12px; line-height: 1.35; text-overflow: ellipsis; white-space: nowrap; }
.pc-ghost-old.is-removed .pc-ghost-old__name { color: var(--muted); text-decoration: line-through; }
.pc-new { margin-right: 4px; padding: 0 4px; border: 1px solid var(--ink); border-radius: var(--r-xs); color: var(--ink); font-size: 11px; font-weight: 600; line-height: 15px; }
/* t-20261009-qcgu 点开块的详情：块旁的小浮层，单元标题、知识点、这一段的日期与开始/结束 */
.pc-block { cursor: pointer; }
.pc-block:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.pc-pop { position: fixed; inset: auto; display: grid; gap: 10px; width: min(300px, calc(100vw - 16px)); max-height: calc(100dvh - 16px); margin: 0; overflow: auto; padding: 12px 14px; border: 1px solid var(--border); border-radius: var(--r-sm); background: var(--surface); color: var(--ink); box-shadow: var(--shadow-pop); font-size: var(--fs-caption); line-height: 1.5; }
.pc-pop:focus { outline: none; }
.pc-pop__unit { --br: var(--map-branch-1); display: grid; gap: 4px; padding-left: 8px; border-left: 3px solid var(--br); }
.pc-pop__title { font-size: var(--fs-ui); }
.pc-pop__points { display: grid; gap: 2px; margin: 0; padding: 0; list-style: none; }
.pc-pop__points .km-no { margin-right: 6px; color: var(--faint); }
.pc-pop__points .is-key { font-weight: 600; }
.pc-pop__children { display: block; padding-left: 12px; color: var(--muted); font-weight: 400; }
.pc-pop__time { padding-top: 6px; border-top: 1px solid var(--border); }
.pc-pop__time-toggle { width: fit-content; color: var(--muted); font-size: var(--fs-caption); cursor: pointer; list-style-position: inside; }
.pc-pop__time-toggle:hover, .pc-pop__time-toggle:focus-visible { color: var(--accent-strong); }
.pc-pop__time-editor { display: grid; gap: 8px; padding-top: 8px; }
.pc-pop__fields { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 6px 8px; }
.pc-pop__field { display: grid; gap: 2px; color: var(--muted); }
.pc-pop__field select { min-height: 28px; padding: 2px 6px; border: 1px solid var(--border); border-radius: var(--r-xs); background: var(--surface); color: var(--ink); font: inherit; font-variant-numeric: tabular-nums; }
.pc-pop__when { margin: 0; color: var(--ink); font-variant-numeric: tabular-nums; }
.pc-pop__save { justify-self: end; }
.pc-block.is-landed { animation: pc-land 140ms ease-out; }
@keyframes pc-land { from { opacity: .55; transform: scale(.96); } to { opacity: 1; transform: none; } }
/* 日程「总览」独占一行，不覆盖日期；一行放不下全部天数时才有。 */
.pc-frame { position: relative; min-width: 0; }
.pc-overview-key { display: flex; justify-content: flex-end; align-items: center; min-height: 32px; padding: 2px 4px; }
.pc-overview-key[hidden] { display: none; }
.pc-overview-key__btn { height: 26px; padding: 0 8px; border: 0; border-radius: var(--r-xs); background: none; color: var(--accent-strong); font: inherit; font-size: var(--fs-caption); font-weight: 600; line-height: 26px; white-space: nowrap; cursor: pointer; pointer-events: auto; }
.pc-overview-key__btn:hover { background: color-mix(in srgb, var(--ink) 8%, transparent); }
.pc-day-head.is-flash { animation: pc-day-lit 1200ms ease; }
@keyframes pc-day-lit { 15%, 65% { background-color: var(--accent-soft); } }
/* 总览：一行一周（周一到周日）；每格至少放得下日期和两条小条，周数少时一屏放下，周数多时上下滚动（周名行贴顶）。
   只看不改，点哪天回到按天的那一天 */
.plan-calendar.is-overview .pc-scroll { overflow-x: hidden; overflow-y: auto; }
.pc-month { display: grid; grid-template-rows: auto 1fr; min-height: 100%; }
.pc-month__week { position: sticky; top: 0; z-index: 3; display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); border-bottom: 1px solid var(--border); background: var(--surface); }
.pc-month__week span { height: 40px; padding: 0 8px; color: var(--faint); font-size: var(--fs-caption); font-weight: 600; line-height: 40px; }
.pc-month__grid { --pc-cell-min: 68px; display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); }
.pc-cell { position: relative; display: flex; flex-direction: column; gap: 2px; min-width: 0; min-height: 0; overflow: hidden; padding: 3px 4px; border: 0; border-right: 1px solid var(--border); border-bottom: 1px solid var(--border); border-radius: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; }
.pc-cell:nth-child(7n) { border-right: 0; }
.pc-cell:nth-last-child(-n + 7) { border-bottom: 0; }
.pc-cell:hover:not(.is-out) { background: color-mix(in srgb, var(--accent) 5%, transparent); }
.pc-cell:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.pc-cell__date { display: flex; flex: none; align-items: baseline; gap: 6px; padding: 0 4px 1px; color: var(--ink); font-size: 13px; font-weight: 600; line-height: 16px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.pc-cell__date small { color: var(--faint); font-size: 11px; font-weight: 400; }
.pc-cell.is-today { background: color-mix(in srgb, var(--accent) 6%, transparent); box-shadow: inset 0 2px 0 var(--accent); }
.pc-cell.is-today .pc-cell__date, .pc-cell.is-today .pc-cell__date small { color: var(--accent-strong); }
.pc-cell.is-exam { background: color-mix(in srgb, var(--ink) 6%, transparent); }
.pc-cell.is-out { background: color-mix(in srgb, var(--surface-subtle) 40%, transparent); cursor: default; }
.pc-cell.is-out .pc-cell__date { color: var(--faint); font-weight: 400; }
.pc-chip { --br: var(--map-branch-1); display: flex; flex: none; align-items: baseline; gap: 5px; min-width: 0; height: 20px; padding: 0 5px 0 6px; border-left: 3px solid var(--br); border-radius: 3px; background: color-mix(in srgb, var(--br) 10%, var(--surface)); color: var(--ink); font-size: 11.5px; line-height: 20px; }
.pc-chip__time { flex: none; color: var(--muted); font-variant-numeric: tabular-nums; }
.pc-chip__name { min-width: 0; overflow: hidden; font-weight: 600; text-overflow: ellipsis; white-space: nowrap; }
.pc-chip .pc-new { margin-right: 3px; padding: 0 3px; font-size: 10px; line-height: 13px; }
.pc-chip .pc-check { flex: none; margin-right: -2px; }
.pc-chip.is-done, .pc-chip.is-skipped { background: color-mix(in srgb, var(--br) 4%, var(--surface)); border-left-color: color-mix(in srgb, var(--br) 40%, var(--surface)); }
.pc-chip.is-done .pc-chip__name, .pc-chip.is-skipped .pc-chip__name { color: var(--muted); font-weight: 400; }
.pc-chip.is-ghost { border: 1px dashed var(--border-strong); border-left: 3px dashed var(--border-strong); background: none; }
.pc-chip.is-ghost .pc-chip__time, .pc-chip.is-ghost .pc-chip__name { color: var(--faint); font-weight: 400; }
.pc-chip.is-ghost.is-removed .pc-chip__name { text-decoration: line-through; }
.pc-more { flex: none; align-self: flex-start; height: 20px; padding: 0 6px; color: var(--accent-strong); font-size: 11.5px; font-weight: 600; line-height: 20px; }
@media (prefers-reduced-motion: reduce) { .pc-block.is-landed, .pc-day-head.is-flash { animation: none; } .pc-block.is-draggable { transition: none; } }
@media (max-width: 767px) {
  .pc-grid { grid-template-columns: 44px repeat(var(--pc-days), minmax(116px, 1fr)); }
  .pc-scroll { height: calc(100dvh - 190px); }
  .pc-axis span { right: 6px; }
  .pc-month__week span { padding: 0 2px; text-align: center; }
  .pc-cell { padding: 3px 2px; }
  .pc-cell__date { padding: 0 2px 1px; font-size: 12px; }
  .pc-cell__date small { display: none; }
  .pc-cell .pc-exam { height: 16px; padding: 0 4px; font-size: 10px; line-height: 16px; }
  .pc-chip { height: 16px; gap: 2px; padding: 0 2px 0 3px; border-left-width: 2px; font-size: 10px; line-height: 16px; }
  .pc-chip__time { display: none; }
  .pc-more { height: 16px; padding: 0 2px; font-size: 10px; line-height: 16px; }
}
@media (max-width: 767px) {
  dialog.knowledge-map-page-overlay.plan-overlay { width: 100vw; height: 100dvh; max-width: none; max-height: none; }
  .plan-overlay { padding: 8px; }
  .plan-overlay__panel { border-radius: var(--r-md); }
  .plan-overlay__header { align-items: flex-start; padding: 12px 12px 10px 14px; }
  .plan-overlay__title { flex-direction: column; gap: 0; }
  .plan-overlay__body { padding: 10px; }
  .plan-trial { align-items: stretch; flex-direction: column; gap: 8px; padding: 10px 12px; }
  .plan-trial__actions { justify-content: stretch; }
  .plan-trial__actions .btn:not(.btn-act) { flex: 1 1 auto; }
  .plan-trial__actions .btn-act { flex: none; }
}
.sidebar-item .abar-btn .abar-pending-dot {
  position: absolute;
  inset: 6px 7px auto auto;
  display: block;
  min-width: 0;
  width: 7px;
  height: 7px;
  padding: 0;
  border: 0;
  border-radius: 50%;
  /* 等你决定只有一个记号：提醒黄点，和个性化、设置按钮上的点、停靠卡头同一个；红色只给真实错误 */
  background: var(--marker);
  outline: 2px solid var(--surface);
  opacity: 1;
  visibility: visible;
  pointer-events: none;
  transform: none;
}

.sidebar-item .abar-btn .abar-pending-dot[hidden] { display: none; }

.sr-stale {
  color: var(--muted);
  font-size: var(--fs-caption);
  margin-inline-start: auto;
}

.unit-empty {
  color: var(--muted);
  font-size: var(--fs-caption);
  padding: 7px 10px 9px 34px;
}

/* ---------- 对话嵌入窗口里的时间表（t-20261024-hnjw，plan-view.js renderTimetable） ----------
   像月历的周视图：一行一周（周一到周日），一格一天。每一段是一块：左边一条地图分支色、时段一行、单元名最多两行；
   今天的日期是蓝底圆角，考试日一格淡黄底加墨色「考试」；计划范围外的格子是空白淡底，过去的日期字变淡；
   学完的块淡下去、时段前一个绿勾，跳过的划线，计划的当前单元描一圈分支色。
   窄宽度（表宽 < 560px，手机）按天成行：左边「10月25日 周日」，右边当天的块；没有安排的日子不列。 */
.pt-tt { container-type: inline-size; font-variant-numeric: tabular-nums; }
.pt-tt__head, .pt-tt__week { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); }
.pt-tt__head { position: sticky; top: 0; z-index: 1; border-bottom: 1px solid var(--border); background: var(--surface); }
.pt-tt__head span { padding: 7px 10px 6px; color: var(--faint); font-size: var(--fs-caption); font-weight: 600; }
.pt-tt__week { border-bottom: 1px solid var(--border); }
.pt-tt__week:last-of-type { border-bottom: 0; }
.pt-tt__day { display: flex; flex-direction: column; gap: 4px; min-width: 0; min-height: 68px; padding: 5px 6px 7px; border-left: 1px solid var(--border); }
.pt-tt__day:first-child { border-left: 0; }
.pt-tt__day.is-out { background: color-mix(in srgb, var(--surface-subtle) 45%, transparent); }
.pt-tt__day.is-today { background: color-mix(in srgb, var(--accent) 6%, transparent); }
.pt-tt__day.is-exam { background: var(--marker-soft); }
.pt-tt__date { display: flex; align-items: center; gap: 6px; min-height: 22px; color: var(--ink); font-size: var(--fs-caption); font-weight: 600; line-height: 1; }
.pt-tt__num { display: inline-grid; place-items: center; min-width: 22px; height: 22px; padding: 0 4px; border-radius: 11px; white-space: nowrap; }
.pt-tt__full { display: none; }
.pt-tt__day.is-past .pt-tt__date, .pt-tt__day.is-out .pt-tt__date { color: var(--faint); font-weight: 500; }
.pt-tt__day.is-today .pt-tt__num { padding: 0 7px; background: var(--accent); color: var(--surface); }
.pt-tt__day.is-exam .pc-exam { margin-left: auto; }
.pt-tt__list { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.pt-tt__s { --br: var(--map-branch-1); display: block; width: 100%; min-width: 0; margin: 0; padding: 4px 6px 4px 8px; border: 0; border-left: 3px solid var(--br); border-radius: var(--r-xs);
  background: color-mix(in srgb, var(--br) 11%, var(--surface)); color: var(--ink); font: inherit; font-size: var(--fs-caption); line-height: 1.45; text-align: left; }
.pt-tt__line { display: -webkit-box; overflow: hidden; overflow-wrap: anywhere; -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
.pt-tt__time { margin-right: 5px; color: var(--muted); font-size: 11px; font-weight: 500; white-space: nowrap; }
.pt-tt__end { display: none; }
.pt-tt__name { font-weight: 600; }
.pt-tt__s.is-live { box-shadow: inset 0 0 0 1.5px var(--br); }
.pt-tt__s:is(.is-done, .is-skipped) { border-left-color: color-mix(in srgb, var(--br) 40%, var(--surface)); background: var(--surface-subtle); }
.pt-tt__s:is(.is-done, .is-skipped) .pt-tt__name { color: var(--muted); font-weight: 500; }
.pt-tt__s.is-done .pt-tt__time::before { content: '✓ '; color: var(--success); font-weight: 700; }
.pt-tt__s.is-skipped .pt-tt__name { text-decoration: line-through; }
button.pt-tt__s { cursor: pointer; }
button.pt-tt__s:hover { background: var(--accent-soft); }
button.pt-tt__s:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.pt-tt__s.is-flash { animation: pt-lit 1200ms ease; }
.pt-tt__undated { display: flex; flex-wrap: wrap; gap: 2px 10px; margin: 0; padding: 9px 12px 10px; border-top: 1px solid var(--border); color: var(--muted); font-size: var(--fs-caption); line-height: 1.5; }
.pt-tt__undated b { color: var(--ink); font-weight: 600; }
@container (max-width: 559px) {
  .pt-tt__head { display: none; }
  .pt-tt__week { display: block; border-bottom: 0; }
  .pt-tt__day { display: grid; grid-template-columns: 96px minmax(0, 1fr); align-items: start; gap: 10px; min-height: 0; padding: 8px 10px; border-bottom: 1px solid var(--border); border-left: 0; }
  .pt-tt__day.is-blank { display: none; }
  .pt-tt__date { flex-wrap: wrap; min-height: 26px; }
  .pt-tt__num { display: none; }
  .pt-tt__full { display: inline; }
  .pt-tt__day.is-today .pt-tt__full { color: var(--accent-strong); }
  .pt-tt__day.is-exam .pc-exam { margin-left: 0; }
  .pt-tt__line { -webkit-line-clamp: 3; }
  .pt-tt__end { display: inline; }
}
@media (prefers-reduced-motion: reduce) { .pt-tt__s.is-flash { animation: none; } }

/* ---------- 计划卡上的改动（t-20261027-pz69 g3，plan-view.js changeMarks / renderTimetable 的 marks） ----------
   旧位置是虚框（字淡，删掉的单元划线），新位置描一圈蓝笔、底色淡蓝，挪动有一道蓝箭头从虚框指过去；新增的块前一枚「新」；
   改了长短、分钟、知识点的块下面一行小字，旧值淡、新值墨色。只画改动的表（.is-diff）只留有改动的那几周、格子矮一些，
   同一周没变的单元淡淡一块（.is-quiet），其余收成卡底一行，点开换成完整日程。
   刚出现时（卡出现后 600ms 起，等同一刻出现的检查点按钮、桌宠入场走完）：虚框从实块淡下去，箭头画出来，新位置亮一下，
   同一刻最多两样在动；减少动态时直接是终态。 */
/* --enter-at：卡在动效途中被重画时已经过去的时间（plan-view.js 写成负值），接着播 */
.pt-tt { --enter-at: 0ms; position: relative; }
/* 格子底下留一道空给箭头横着走（plan-view.js drawArrows）；只画改动的表格子矮一些 */
.pt-tt.has-marks .pt-tt__day { padding-bottom: 15px; }
.pt-tt.is-diff .pt-tt__day { min-height: 0; }
/* 有改动的表只亮改动：计划当前单元那一圈不描，免得和新位置混在一起 */
.pt-tt.has-marks .pt-tt__s.is-live:not(.is-mark) { box-shadow: none; }
.pt-tt__s.is-resized .pt-tt__end { display: inline; }
/* 窄排按天成行：日期和块之间宽一点，给左边绕弯的箭头留地方 */
@container (max-width: 559px) {
  .pt-tt.has-marks .pt-tt__day { column-gap: 20px; padding-bottom: 8px; }
  /* 只画改动时，窄排只列有改动的日子和考试日 */
  .pt-tt.is-diff .pt-tt__day.is-quiet { display: none; }
}
/* 宽排同一天只改了钟点：这一格的块往右让一点给绕弯的箭头，弯道不压在格线上（日期照旧对齐） */
@container (min-width: 560px) { .pt-tt.has-marks .pt-tt__day.has-bracket .pt-tt__list { padding-left: 12px; } }
/* 只画改动时同一周没变的单元：留一块，看得出前后挨着谁、那天不是空的。
   t-20261027-pz69 h3：一眼读成「原样不动」——不上分支色，细细一圈铅灰实线、透出格子底，字照常读得清；
   不像学完的（灰底加绿勾）、不像挪走的（虚框）、也不淡到像不重要 */
.pt-tt__s.is-quiet { padding: 3px 5px 3px 7px; border: 1px solid var(--border); border-left: 3px solid var(--border-strong); background: transparent; }
.pt-tt__s.is-quiet :is(.pt-tt__name, .pt-tt__time) { color: var(--muted); font-weight: 500; }
.pt-tt__s.is-mark { box-shadow: 0 0 0 1.5px var(--accent); background: color-mix(in srgb, var(--accent) 7%, var(--surface)); }
.pt-tt__s.is-ghost { padding: 3px 5px 3px 7px; border: 1px dashed var(--border-strong); border-left: 3px solid color-mix(in srgb, var(--br) 30%, var(--surface)); background: transparent; }
.pt-tt__s.is-ghost :is(.pt-tt__name, .pt-tt__time) { color: var(--faint); font-weight: 500; }
.pt-tt__s.is-cut .pt-tt__name { text-decoration: line-through; }
.pt-tt__s .pc-new { margin-right: 4px; padding: 0 3px; font-size: 10px; line-height: 13px; vertical-align: 1px; }
.pt-tt__note { display: block; margin-top: 2px; color: var(--muted); font-size: 11px; line-height: 1.35; overflow-wrap: anywhere; }
.pt-tt__arrows { position: absolute; top: 0; left: 0; z-index: 0; overflow: visible; pointer-events: none; }
.pt-tt__arrow { fill: none; stroke: var(--accent); stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 1; }
.pt-tt__scope { margin: 0; padding: 9px 12px 10px; border-top: 1px solid var(--border); color: var(--muted); font-size: var(--fs-caption); }
.pt-tt__scope b { margin-right: 6px; color: var(--ink); font-weight: 600; }
.plan-card__fold { display: flex; align-items: center; gap: 8px; width: 100%; min-height: 38px; margin: 0; padding: 7px 12px 7px 14px; border: 0; border-top: 1px solid var(--border); background: var(--surface);
  color: var(--muted); font: inherit; font-size: var(--fs-caption); text-align: left; cursor: pointer; transition: background-color .14s ease, color .14s ease; }
.plan-card__fold:hover { background: var(--surface-subtle); color: var(--ink); }
.plan-card__fold:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.plan-card__fold svg { flex: none; width: 15px; height: 15px; margin-left: auto; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; transition: transform .2s var(--ease-out); }
.plan-card__fold[aria-expanded="true"] svg { transform: rotate(180deg); }
/* 展开完整日程时内层最多多高：整张卡放得进对话区看得见的地方（plan-view.js keepCardInView 量好写成 --pc-room） */
.plan-card.has-diff { --pc-room: 500px; }
.plan-card.has-diff.is-unfolded .plan-card__embed { max-height: min(500px, var(--pc-room)); }
/* 手机上展开的完整日程整段铺开、跟对话一起滚，不再套一层滚动（手指落在卡里滑到底，对话不跟着走）；输入框上方那一行照旧按卡尾在不在眼前让位 */
@media (max-width: 767px) { .plan-card.has-diff.is-unfolded .plan-card__embed { max-height: none; overflow: visible; overscroll-behavior: auto; } }
/* 卡里日程下面还有没露全的改动：底边渐隐一小段，坐一枚小圆钮，点一下滚到下一处（plan-view.js markScroller）。贴在滚动区底上，不占地方 */
.plan-card__more-dock { position: sticky; bottom: 0; z-index: 2; display: block; height: 0; pointer-events: none; }
.plan-card__more-dock[hidden] { display: none; }
.plan-card__more-fade { position: absolute; right: 0; bottom: 0; left: 0; height: 48px; background: linear-gradient(to bottom, transparent, var(--surface) 78%); }
.plan-card__more { position: absolute; bottom: 7px; left: 50%; display: grid; place-items: center; width: 28px; height: 28px; margin: 0 0 0 -14px; padding: 0;
  border: 1px solid color-mix(in srgb, var(--accent) 40%, var(--border)); border-radius: 50%; background: var(--surface); color: var(--accent); box-shadow: var(--shadow-pop); cursor: pointer; pointer-events: auto; }
.plan-card__more:hover { background: var(--accent-soft); }
.plan-card__more:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.plan-card__more svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.pt-tt.is-entering .pt-tt__s.is-ghost { animation: pt-ghost-out 360ms var(--ease-out) both; animation-delay: calc(600ms + var(--enter-at)); }
.pt-tt.is-entering .pt-tt__arrow { animation: pt-arrow-draw 460ms var(--ease-out) both; animation-delay: calc(820ms + var(--enter-at)); }
.pt-tt.is-entering .pt-tt__s.is-mark { animation: pt-mark-in 520ms var(--ease-out) both; animation-delay: calc(1160ms + var(--enter-at)); }
@keyframes pt-ghost-out { from { border-color: transparent; border-left-color: var(--br); background: color-mix(in srgb, var(--br) 11%, var(--surface)); } }
@keyframes pt-arrow-draw { from { stroke-dashoffset: 1; } to { stroke-dashoffset: 0; } }
@keyframes pt-mark-in {
  from { box-shadow: 0 0 0 0 transparent; background: color-mix(in srgb, var(--br) 11%, var(--surface)); }
  45% { box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 22%, transparent); }
  to { box-shadow: 0 0 0 1.5px var(--accent); background: color-mix(in srgb, var(--accent) 7%, var(--surface)); }
}
/* 「你的调整」卡上又挪了一段：只播新挪的那几块（.is-fresh），之前播过的照旧 */
.pt-tt.is-entering.is-partial :is(.pt-tt__s.is-ghost, .pt-tt__s.is-mark, .pt-tt__arrow):not(.is-fresh) { animation: none; }
@media (prefers-reduced-motion: reduce) {
  .pt-tt.is-entering :is(.pt-tt__s.is-ghost, .pt-tt__arrow, .pt-tt__s.is-mark) { animation: none; }
  .plan-card__fold svg { transition: none; }
}

/* ---------- 对话里的「你的调整」（t-20261027-pz69 h3，plan-view.js learnerCards） ----------
   学生在没确认的计划上自己拖动改的时段：靠右、和学生说的话同一边，是学生的这一轮；导师接下来那张日程卡是对它的回答。
   只读，只画挪过的块：导师排的位置虚框、挪到的位置一圈蓝笔、箭头连过去，按天成行（表窄于 560px 时的排法） */
.plan-learner { width: min(420px, 88%); margin: 0 0 30px auto; overflow: hidden; border: 1px solid var(--border); border-radius: 20px; background: var(--surface); color: var(--ink); }
.plan-learner__head { padding: 10px 16px 9px; font-size: var(--fs-ui); font-weight: 600; line-height: 1.4; }
/* 最后一天那条底线藏进卡的圆角里 */
.plan-learner .pt-tt { margin-bottom: -1px; border-top: 1px solid var(--border); }
@media (max-width: 480px) { .plan-learner { width: 92%; margin-bottom: 24px; } }

/* t-20261027-i1dr b7 规划框的前置行：知识地图、问卷各一个小记号，复用单元的状态圈 */
.room-steps { display: grid; gap: 1px; margin: 0 4px 4px; padding: 0 8px 4px 10px; }
.room-step { display: flex; align-items: center; gap: 8px; min-height: 26px; color: var(--muted); font-size: var(--fs-caption); line-height: 1.5; }
.room-step .unit-mark { flex: none; width: 16px; height: 16px; margin-top: 0; font-size: 10px; }
.stage-tree .room-step .unit-mark.is-live { background: radial-gradient(circle, var(--accent) 0 2.5px, var(--surface) 3px); }
.room-step[data-state="doing"] .room-step__label { color: var(--ink); }
.unit-mark.is-failed { border-color: var(--danger); background: var(--danger-soft); color: var(--danger); }
