/* ==========================================================================
   views.css —— 各模块的视图布局
   ========================================================================== */

/* ============================================================
   首页仪表盘：12 栅格 bento（非对称 7/5 分栏，窄屏塌成单列）
   ============================================================ */

.bento { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); gap: var(--sp-5); align-items: start; }
/* 每个格子都是纵向 flex，卡片自动撑满同一行的高度 */
.bento > * { display: flex; flex-direction: column; }
.bento > * > * { flex: 1; }
.bento__status   { grid-column: span 5; }
.bento__summary  { grid-column: span 7; }
.bento__schedule { grid-column: span 7; }
.bento__exams    { grid-column: span 5; }
.bento__todos    { grid-column: span 5; }
.bento__papers   { grid-column: span 7; }
.bento__projects { grid-column: span 7; }
.bento__notices  { grid-column: span 5; }
.bento__targets  { grid-column: span 12; }

@media (max-width: 1080px) {
  .bento__status, .bento__summary, .bento__schedule, .bento__exams,
  .bento__todos, .bento__papers { grid-column: span 12; }
}

/* ---------------- 状态卡片 ---------------- */

.status-card {
  position: relative;
  overflow: hidden;
  padding: var(--sp-6);
  border-radius: var(--r-xl);
  background: var(--surface);
  border: 1px solid var(--line);
  box-shadow: var(--sh-2);
}
.status-card::after {
  content: "";
  position: absolute;
  right: -60px; top: -80px;
  width: 240px; height: 240px;
  border-radius: 50%;
  background: var(--tone-soft, var(--surface-2));
  opacity: .7;
  pointer-events: none;
  z-index: 0;
  transition: background var(--dur-4) var(--ease);
}
.status-card__inner { position: relative; z-index: 1; display: flex; gap: var(--sp-5); align-items: flex-start; }
.status-card__tile {
  width: 56px; height: 56px;
  border-radius: 18px;
  display: grid; place-items: center;
  background: var(--tone-soft, var(--surface-2));
  color: var(--tone, var(--ink-2));
  flex-shrink: 0;
  box-shadow: var(--sh-inset);
  transition: background var(--dur-4) var(--ease), color var(--dur-4) var(--ease);
}
.status-card__tile svg { width: 26px; height: 26px; }
.status-card__meta { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; }
.status-card__text {
  font-size: var(--fs-3xl);
  font-weight: 620;
  letter-spacing: -.035em;
  line-height: 1.15;
  margin: var(--sp-2) 0 6px;
  word-break: break-word;
  max-width: 26ch;
}
.status-card__text--empty { color: var(--ink-4); font-size: var(--fs-2xl); }
.status-card__time { font-size: var(--fs-sm); color: var(--ink-3); display: flex; align-items: center; gap: 6px; }
.status-card__time svg { width: 14px; height: 14px; }
.status-card.is-switching .status-card__text,
.status-card.is-switching .status-card__tile { animation: popIn var(--dur-3) var(--ease) both; }

.live-dot {
  position: relative;
  width: 9px; height: 9px;
  border-radius: 50%;
  background: var(--tone, var(--ok));
  flex-shrink: 0;
}
.live-dot::after {
  content: "";
  position: absolute;
  inset: -4px;
  border-radius: 50%;
  border: 1.5px solid currentColor;
  color: var(--tone, var(--ok));
  opacity: .5;
  animation: softPulse 2.2s var(--ease-soft) infinite;
}

.status-quick { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: auto; padding-top: var(--sp-5); position: relative; z-index: 1; }
.status-quick__btn {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px;
  border-radius: var(--r-pill);
  border: 1px solid var(--line);
  background: var(--surface);
  font-size: var(--fs-sm);
  color: var(--ink-2);
  transition: all var(--dur-2) var(--ease);
}
.status-quick__btn svg { width: 14px; height: 14px; color: var(--tone, var(--ink-3)); }
.status-quick__btn:hover { border-color: var(--tone, var(--line-strong)); background: var(--tone-soft, var(--surface-2)); transform: translateY(-1px); }
.status-quick__btn:active { transform: scale(.97); }
.status-quick__btn.is-active { border-color: var(--tone); background: var(--tone-soft); color: var(--tone); font-weight: 600; }

.status-editor { display: flex; gap: var(--sp-2); margin-top: var(--sp-3); position: relative; z-index: 1; }
.status-editor .input { background: var(--surface); }

@media (max-width: 620px) {
  .status-card { padding: var(--sp-5); }
  .status-card__text { font-size: var(--fs-2xl); max-width: none; }
  .status-card__text--empty { font-size: var(--fs-xl); }
  .bento { gap: var(--sp-4); }
}

/* ---------------- 摘要卡（日期 + 四个指标） ---------------- */

.summary-card { display: flex; flex-direction: column; height: 100%; padding: var(--sp-5); }
.summary-card__date { display: flex; align-items: baseline; gap: var(--sp-3); }
.summary-card__day { font-family: var(--font-mono); font-size: var(--fs-3xl); font-weight: 640; letter-spacing: -.05em; line-height: 1; }
.summary-card__month { font-size: var(--fs-sm); color: var(--ink-3); }

/* 2×2 指标格：比原来的竖排列表紧凑，卡片高度也更好搭配左边的状态卡 */
.summary-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--sp-3);
  margin-top: var(--sp-5);
}
.summary-tile {
  display: flex;
  flex-direction: column;
  gap: 3px;
  min-width: 0;
  padding: 10px var(--sp-4);
  border-radius: var(--r-md);
  background: var(--bg-soft);
  border: 1px solid var(--line);
  transition: border-color var(--dur-2) var(--ease), transform var(--dur-2) var(--ease);
}
.summary-tile:hover { border-color: var(--line-strong); transform: translateY(-1px); }
.summary-tile__head {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: var(--fs-xs);
  color: var(--ink-3);
}
.summary-tile__head .ic { width: 13px; height: 13px; }
.summary-tile__value { font-size: var(--fs-lg); font-weight: 620; letter-spacing: -.02em; }
.summary-tile__value--text {
  font-size: var(--fs-sm);
  font-weight: 600;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.summary-tile__hint {
  font-size: var(--fs-xs);
  color: var(--ink-4);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* 周概览小条 */
.week-strip { margin-top: var(--sp-4); padding-top: var(--sp-4); border-top: 1px dashed var(--line); }
.week-strip__head { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 8px; }
.week-strip__days { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 6px; }
.week-strip__day {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  padding: 7px 2px;
  border-radius: var(--r-sm);
  background: var(--bg-soft);
  border: 1px solid var(--line);
  color: var(--ink-2);
  transition: transform var(--dur-2) var(--ease), border-color var(--dur-2) var(--ease),
    background var(--dur-2) var(--ease);
}
.week-strip__day:hover { transform: translateY(-2px); border-color: var(--line-strong); background: var(--surface); }
.week-strip__label { font-size: var(--fs-xs); color: var(--ink-3); }
.week-strip__count { font-size: var(--fs-md); font-weight: 620; }
.week-strip__day.is-today { background: var(--ink); border-color: var(--ink); color: #fff; }
.week-strip__day.is-today .week-strip__label { color: rgba(255, 255, 255, .75); }
.week-strip__day.is-empty { opacity: .55; }

/* ---------------- 今日课表横向时间轴 ---------------- */

.rail { position: relative; }
.rail__track {
  position: absolute;
  left: 12px; right: 12px; top: 52px;
  height: 2px;
  background: repeating-linear-gradient(90deg, var(--line-strong) 0 6px, transparent 6px 12px);
  z-index: 0;
}
.rail__scroll {
  display: flex;
  gap: var(--sp-3);
  overflow-x: auto;
  padding: var(--sp-2) 2px var(--sp-4);
  scroll-snap-type: x proximity;
  position: relative;
  z-index: 1;
}
.rail__scroll::-webkit-scrollbar { height: 6px; }
.rail__item {
  flex: 0 0 auto;
  width: 178px;
  scroll-snap-align: start;
  display: flex;
  flex-direction: column;
  gap: var(--sp-2);
}
.rail__time {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  color: var(--ink-3);
  display: flex; align-items: center; gap: 6px;
}
.rail__node {
  width: 11px; height: 11px;
  border-radius: 50%;
  background: var(--surface);
  border: 2px solid var(--line-strong);
  transition: all var(--dur-3) var(--ease);
}
.rail__card {
  background: hsl(var(--course-h, 220) 34% 97%);
  border: 1px solid hsl(var(--course-h, 220) 30% 88%);
  border-left: 3px solid hsl(var(--course-h, 220) 38% 62%);
  border-radius: var(--r-md);
  padding: 10px 12px;
  min-height: 78px;
  transition: transform var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease);
}
.rail__card:hover { transform: translateY(-2px); box-shadow: var(--sh-2); }
.rail__course { font-size: var(--fs-sm); font-weight: 620; color: hsl(var(--course-h, 220) 42% 26%); }
.rail__room { font-size: var(--fs-xs); color: var(--ink-3); margin-top: 3px; }
.rail__item.is-past { opacity: .5; }
.rail__item.is-past .rail__node { border-color: var(--line-strong); background: var(--surface-2); }
.rail__item.is-current .rail__node { border-color: var(--accent); background: var(--accent); box-shadow: 0 0 0 4px var(--accent-soft); }
.rail__item.is-current .rail__card {
  border-color: var(--accent-line);
  box-shadow: 0 0 0 3px var(--accent-soft), var(--sh-2);
  animation: breathe 2.8s var(--ease-soft) infinite;
}
.rail__item.is-current .rail__time { color: var(--accent-ink); font-weight: 620; }
.rail__empty {
  display: flex; align-items: center; gap: var(--sp-3);
  padding: var(--sp-5);
  border-radius: var(--r-md);
  background: var(--bg-soft);
  border: 1px dashed var(--line-strong);
  color: var(--ink-3);
  font-size: var(--fs-sm);
}
.rail__now-line { position: relative; }

/* ---------------- 考试倒计时环 ---------------- */

.exam-hero { display: flex; align-items: center; gap: var(--sp-5); }
.exam-hero__info { min-width: 0; }
.exam-hero__name { font-size: var(--fs-lg); font-weight: 620; letter-spacing: -.02em; }
.exam-hero__date { font-size: var(--fs-sm); color: var(--ink-3); margin-top: 4px; }
.exam-mini-list { display: flex; flex-direction: column; margin-top: var(--sp-4); }
.exam-mini {
  display: flex; align-items: center; gap: var(--sp-3);
  padding: 10px 0;
  font-size: var(--fs-sm);
}
.exam-mini + .exam-mini { border-top: 1px solid var(--line); }
.exam-mini__days {
  font-family: var(--font-mono);
  font-size: var(--fs-md);
  font-weight: 620;
  min-width: 44px;
  color: var(--accent-ink);
}
.exam-mini.is-soon .exam-mini__days { color: var(--warn); }
.exam-mini__name { min-width: 0; }

/* ---------------- 待办迷你列表 ---------------- */

.todo-mini {
  display: flex; align-items: center; gap: var(--sp-3);
  padding: 10px 0;
  transition: opacity var(--dur-2) var(--ease);
}
.todo-mini + .todo-mini { border-top: 1px solid var(--line); }
.todo-mini__title { font-size: var(--fs-sm); min-width: 0; transition: color var(--dur-2) var(--ease); }
.todo-mini.is-done .todo-mini__title { color: var(--ink-4); }
.todo-mini__when { margin-left: auto; font-size: var(--fs-xs); color: var(--ink-4); flex-shrink: 0; }

/* ---------------- 论文阶段总览 ---------------- */

.paper-overview { display: flex; gap: var(--sp-5); align-items: center; flex-wrap: wrap; }
.paper-overview__body { flex: 1; min-width: 220px; }
.paper-stage-chips { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: var(--sp-4); }
.stage-chip {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 5px 11px;
  border-radius: var(--r-pill);
  background: var(--tone-soft);
  color: var(--tone);
  font-size: var(--fs-xs);
  font-weight: 600;
}
.stage-chip__n { font-family: var(--font-mono); opacity: .8; }

/* ---------------- 周次选择栏 ---------------- */

.week-bar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-4);
  padding: var(--sp-3) var(--sp-4);
  margin-bottom: var(--sp-4);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-1);
}
.week-bar__nav { display: flex; align-items: center; gap: 6px; }
.week-bar__nav .select { min-width: 240px; }
.week-bar__info { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-left: auto; }
.week-bar__skip { max-width: 46ch; }

.sch-course__span {
  margin-top: auto;
  padding-top: 4px;
  font-size: 10px;
  color: var(--ink-4);
  letter-spacing: .04em;
}

@media (max-width: 860px) {
  .week-bar { gap: var(--sp-3); padding: var(--sp-3); }
  .week-bar__nav .select { min-width: 0; flex: 1; }
  .week-bar__nav { flex: 1; min-width: 200px; }
  .week-bar__info { margin-left: 0; }
}

/* ============================================================
   通知中心
   ============================================================ */

.masonry { columns: 3 300px; column-gap: var(--sp-5); }
.masonry > * { break-inside: avoid; margin-bottom: var(--sp-5); display: block; }
@media (max-width: 700px) { .masonry { columns: 1; } }

/* 正文预览类通知：通栏展示，PDF 才看得清 */
.notice-stack { display: flex; flex-direction: column; gap: var(--sp-5); margin-bottom: var(--sp-5); }
.notice-stack .notice { padding: var(--sp-6); }
.notice-stack .notice__frame { height: 620px; }
.notice-stack .notice__title { font-size: var(--fs-xl); }
@media (max-width: 860px) {
  .notice-stack .notice__frame { height: 420px; }
  .notice-stack .notice { padding: var(--sp-4); }
}

.notice {
  position: relative;
  padding: var(--sp-5);
  border-radius: var(--r-lg);
  background: var(--surface);
  border: 1px solid var(--line);
  box-shadow: var(--sh-1);
  transition: transform var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease),
    border-color var(--dur-2) var(--ease);
}
.notice:hover { transform: translateY(-3px); box-shadow: var(--sh-2); border-color: var(--line-strong); }
.notice.is-pinned { border-color: var(--accent-line); box-shadow: var(--sh-1), inset 3px 0 0 var(--accent); }
.notice.is-new { animation: slideInRight var(--dur-3) var(--ease) both; }
.notice__head { display: flex; align-items: flex-start; gap: var(--sp-3); }
.notice__title { font-size: var(--fs-md); font-weight: 620; letter-spacing: -.015em; line-height: 1.4; }
.notice__meta { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; margin-top: var(--sp-3); }
.notice__time { font-size: var(--fs-xs); color: var(--ink-3); display: inline-flex; align-items: center; gap: 5px; }
.notice__time svg { width: 13px; height: 13px; }
.notice__excerpt { font-size: var(--fs-sm); color: var(--ink-3); margin-top: var(--sp-3); }
.notice__detail {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows var(--dur-3) var(--ease);
}
.notice__detail > div { overflow: hidden; }
.notice.is-open .notice__detail { grid-template-rows: 1fr; }
.notice__detail-inner {
  padding-top: var(--sp-3);
  margin-top: var(--sp-3);
  border-top: 1px dashed var(--line-strong);
  font-size: var(--fs-sm);
  color: var(--ink-2);
  white-space: pre-wrap;
  word-break: break-word;
}
.notice__foot { display: flex; align-items: center; gap: var(--sp-2); margin-top: var(--sp-4); }
.notice__actions { margin-left: auto; display: flex; gap: 4px; opacity: 0; transition: opacity var(--dur-2) var(--ease); }
.notice:hover .notice__actions, .notice:focus-within .notice__actions { opacity: 1; }
@media (hover: none) { .notice__actions { opacity: 1; } }

/* 正文预览类通知：通栏展示，默认收成"封面"，需要时展开 */
.notice-stack { display: flex; flex-direction: column; gap: var(--sp-4); margin-bottom: var(--sp-5); }
.notice-stack .notice { padding: var(--sp-5); }
.notice-stack .notice__title { font-size: var(--fs-lg); }
.notice__preview { margin-top: var(--sp-3); }
.notice__preview-bar { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: 8px; }
.notice__preview-bar .attach { min-width: 0; }
.notice__preview-bar .spacer { flex: 1; min-width: 4px; }
.notice__preview-bar .ic { transition: transform var(--dur-2) var(--ease); }
.notice__preview.is-expanded .notice__preview-bar [data-act="expand-preview"] .ic { transform: rotate(180deg); }

.notice__preview-body {
  position: relative;
  height: 300px;
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  background: var(--surface-2);
  transition: height var(--dur-3) var(--ease);
}
.notice__preview.is-expanded .notice__preview-body { height: min(78vh, 900px); }
.notice__preview-fade {
  position: absolute;
  left: 0; right: 0; bottom: 0;
  height: 96px;
  background: linear-gradient(to bottom, rgba(255, 255, 255, 0), var(--surface));
  pointer-events: none;
  transition: opacity var(--dur-3) var(--ease);
  border-radius: 0 0 var(--r-md) var(--r-md);
}
.notice__preview.is-expanded .notice__preview-fade { opacity: 0; }
.notice__frame iframe, iframe.notice__frame {
  display: block;
  width: 100%;
  height: 100%;
  border: 0;
}
.notice__image { display: block; width: 100%; height: auto; }
.notice__nopreview {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  height: 100%;
  color: var(--ink-3);
  font-size: var(--fs-sm);
}

/* ============================================================
   课表视图
   ============================================================ */

.sch-wrap { overflow-x: auto; padding-bottom: var(--sp-3); }
.sch-grid {
  display: grid;
  grid-template-columns: 62px repeat(7, minmax(122px, 1fr));
  gap: 6px;
  min-width: 900px;
}
.sch-grid__corner { position: sticky; left: 0; z-index: 2; background: var(--bg); }
.sch-day {
  padding: 9px 10px;
  border-radius: var(--r-sm);
  background: var(--surface-2);
  text-align: center;
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--ink-2);
  transition: all var(--dur-2) var(--ease);
}
.sch-day.is-today { background: var(--ink); color: #fff; }
.sch-day__sub { display: block; font-size: var(--fs-xs); font-weight: 500; opacity: .65; margin-top: 1px; }
.sch-period {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 1px;
  padding: 8px 4px;
  border-radius: var(--r-sm);
  background: var(--bg-soft);
  border: 1px solid var(--line);
  font-size: var(--fs-xs);
  color: var(--ink-3);
  position: sticky;
  left: 0;
  z-index: 2;
}
.sch-period__n { font-family: var(--font-mono); font-weight: 620; color: var(--ink-2); font-size: var(--fs-sm); }
.sch-period.is-current { border-color: var(--accent); background: var(--accent-soft); color: var(--accent-ink); }
.sch-period.is-current .sch-period__n { color: var(--accent-ink); }

.sch-cell {
  min-height: 76px;
  border-radius: var(--r-sm);
  border: 1px dashed var(--line);
  background: transparent;
  transition: background var(--dur-2) var(--ease), border-color var(--dur-2) var(--ease);
  position: relative;
}
.sch-cell:hover { background: var(--bg-soft); border-color: var(--line-strong); }
.sch-cell.is-now {
  border-style: solid;
  border-color: var(--accent-line);
  background: var(--accent-soft);
}
.sch-cell.is-now::after {
  content: "现在";
  position: absolute;
  left: 8px; top: 8px;
  font-size: 10px;
  font-weight: 600;
  color: var(--accent-ink);
  letter-spacing: .04em;
}

/* 本周不上（周次/单双周不匹配）的课 */
.sch-cell--off {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 3px;
  padding: 9px 11px;
  border-style: dashed;
  border-color: var(--line-strong);
  background: repeating-linear-gradient(
    -45deg,
    transparent 0 6px,
    rgba(27, 27, 26, .022) 6px 12px
  );
}
.sch-cell--off .sch-cell__off-label {
  font-size: var(--fs-sm);
  color: var(--ink-4);
  text-decoration: line-through;
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
}
.sch-cell--off .sch-cell__off-week { font-size: 10px; color: var(--ink-4); }
.sch-cell__add {
  position: absolute; inset: 0;
  display: grid; place-items: center;
  color: var(--ink-4);
  opacity: 0;
  transition: opacity var(--dur-2) var(--ease);
}
.sch-cell:hover .sch-cell__add { opacity: 1; }
.sch-cell__add svg { width: 16px; height: 16px; }

.sch-course {
  min-height: 76px;
  padding: 9px 11px;
  border-radius: var(--r-sm);
  background: hsl(var(--course-h, 220) 36% 96%);
  border: 1px solid hsl(var(--course-h, 220) 30% 88%);
  border-left: 3px solid hsl(var(--course-h, 220) 40% 60%);
  display: flex;
  flex-direction: column;
  gap: 2px;
  cursor: pointer;
  transition: transform var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease);
  animation: fadeIn var(--dur-3) var(--ease) both;
}
.sch-course:hover { transform: translateY(-2px); box-shadow: var(--sh-2); z-index: 1; }
.sch-course__name { font-size: var(--fs-sm); font-weight: 620; color: hsl(var(--course-h, 220) 44% 26%); line-height: 1.35; }
.sch-course__meta { font-size: var(--fs-xs); color: var(--ink-3); }
.sch-course.is-current {
  border-color: var(--accent);
  box-shadow: 0 0 0 2px var(--accent-soft);
  animation: breathe 2.6s var(--ease-soft) infinite;
  position: relative;
}
.sch-course.is-current::before {
  content: "进行中";
  position: absolute;
  top: 6px; right: 6px;
  padding: 1px 6px;
  border-radius: var(--r-pill);
  background: var(--accent);
  color: #fff;
  font-size: 10px;
  font-weight: 600;
  letter-spacing: .02em;
}

/* 星期切换过渡 */
.sch-views { position: relative; }
.sch-views__pane { animation: fadeUp var(--dur-3) var(--ease) both; }
.sch-views__pane.is-leaving { animation: fadeIn var(--dur-1) var(--ease) reverse both; }
.slide-pane { animation: slidePane var(--dur-3) var(--ease) both; }

@keyframes slidePane {
  from { opacity: 0; transform: translate3d(18px, 0, 0); }
  to { opacity: 1; transform: none; }
}

/* 移动端：今日时间轴 */
.day-timeline { display: none; flex-direction: column; }
.day-timeline__item {
  display: grid;
  grid-template-columns: 58px 1fr;
  gap: var(--sp-3);
  padding-bottom: var(--sp-4);
  position: relative;
}
.day-timeline__time {
  font-family: var(--font-mono);
  font-size: var(--fs-xs);
  color: var(--ink-3);
  text-align: right;
  padding-top: 10px;
}
.day-timeline__body {
  padding: var(--sp-3) var(--sp-4);
  border-radius: var(--r-md);
  background: hsl(var(--course-h, 220) 36% 97%);
  border: 1px solid hsl(var(--course-h, 220) 30% 89%);
  border-left: 3px solid hsl(var(--course-h, 220) 40% 62%);
  position: relative;
}
.day-timeline__body::before {
  content: "";
  position: absolute;
  left: -13px; top: 18px;
  width: 9px; height: 9px;
  border-radius: 50%;
  background: var(--surface);
  border: 2px solid hsl(var(--course-h, 220) 34% 72%);
}
.day-timeline__item.is-current .day-timeline__body { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
.day-timeline__item.is-current .day-timeline__body::before { border-color: var(--accent); background: var(--accent); }
.day-timeline__item.is-past { opacity: .55; }
.day-timeline::before {
  content: ""; position: absolute; left: 61px; top: 12px; bottom: 12px;
  border-left: 1.5px dashed var(--line-strong);
}
.day-timeline { position: relative; }

@media (max-width: 860px) {
  .sch-views { display: none; }
  .day-timeline { display: flex; }
}

@media (max-width: 860px) {
  [data-grid] { display: none; }
  .sch-period.is-current { border-color: var(--accent); }
}

@media (min-width: 861px) {
  [data-mobile], .only-sm { display: none !important; }
}

/* ============================================================
   考试节点
   ============================================================ */

.exam-node {
  display: flex;
  gap: var(--sp-5);
  align-items: center;
  padding: var(--sp-5);
  border-radius: var(--r-lg);
  background: var(--surface);
  border: 1px solid var(--line);
  box-shadow: var(--sh-1);
  transition: transform var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease);
}
.exam-node__main { flex: 1; min-width: 0; }
.exam-node:hover { transform: translateY(-2px); box-shadow: var(--sh-2); }
.exam-node.is-next { border-color: var(--accent-line); box-shadow: var(--sh-2); }
.exam-node__top { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; }
.exam-node__name { font-size: var(--fs-lg); font-weight: 620; letter-spacing: -.02em; }
.exam-node__date { font-size: var(--fs-sm); color: var(--ink-3); margin-top: 6px; display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; }
.exam-node__date > span { display: inline-flex; align-items: center; gap: 6px; }
.exam-node__date .ic { width: 14px; height: 14px; }
.exam-node__note { font-size: var(--fs-sm); color: var(--ink-3); margin-top: var(--sp-3); }
.exam-node__count {
  display: flex;
  align-items: baseline;
  gap: 6px;
  flex-shrink: 0;
  padding-left: var(--sp-3);
}
.exam-node__count .mono { font-size: var(--fs-2xl); font-weight: 640; letter-spacing: -.05em; }
.exam-node__count-unit { font-size: var(--fs-xs); color: var(--ink-3); }
.exam-node__actions { display: flex; gap: 4px; margin-left: auto; }
.exam-node.is-expired { opacity: .6; }
.exam-node.is-expired .exam-node__name { color: var(--ink-3); }

@media (max-width: 620px) {
  .exam-node { flex-direction: column; align-items: stretch; gap: var(--sp-3); }
  .exam-node__count { justify-content: flex-end; padding-left: 0; }
}

/* ============================================================
   待办清单
   ============================================================ */

.todo-row {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-4);
  padding: var(--sp-4) var(--sp-5);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  transition: transform var(--dur-2) var(--ease), opacity var(--dur-3) var(--ease),
    box-shadow var(--dur-2) var(--ease), border-color var(--dur-2) var(--ease);
}
.todo-row:hover { box-shadow: var(--sh-1); border-color: var(--line-strong); }
.todo-row__title {
  position: relative;
  font-size: var(--fs-md);
  line-height: 1.5;
  word-break: break-word;
  transition: color var(--dur-3) var(--ease);
  display: inline-block;
}
.todo-row__title::after {
  content: "";
  position: absolute;
  left: 0; top: 52%;
  height: 1.5px;
  width: 100%;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform var(--dur-3) var(--ease);
}
.todo-row__meta { display: flex; align-items: center; gap: var(--sp-3); margin-top: 5px; font-size: var(--fs-xs); color: var(--ink-4); }
.todo-row__actions { margin-left: auto; display: flex; gap: 4px; opacity: 0; transition: opacity var(--dur-2) var(--ease); }
.todo-row:hover .todo-row__actions, .todo-row:focus-within .todo-row__actions { opacity: 1; }
@media (hover: none) { .todo-row__actions { opacity: 1; } }

.todo-row.is-done { background: var(--bg-soft); border-color: var(--line); opacity: .62; }
.todo-row.is-done .todo-row__title { color: var(--ink-4); }
.todo-row.is-done .todo-row__title::after { transform: scaleX(1); }
.todo-row.is-just-done { animation: doneShrink var(--dur-3) var(--ease) both; }
@keyframes doneShrink {
  0% { transform: scale(1); }
  38% { transform: scale(.985); }
  100% { transform: scale(1); }
}
.todo-row.is-new { animation: slideInTop var(--dur-3) var(--ease) both; }
.todo-row.is-leaving { animation: fadeIn var(--dur-2) var(--ease) reverse both; }

.todo-filters { animation: fadeIn var(--dur-3) var(--ease) both; }

/* ============================================================
   论文模块
   ============================================================ */

.paper-card {
  padding: var(--sp-5);
  border-radius: var(--r-lg);
  background: var(--surface);
  border: 1px solid var(--line);
  box-shadow: var(--sh-1);
  transition: transform var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease),
    border-color var(--dur-2) var(--ease);
  cursor: pointer;
}
.paper-card:hover { transform: translateY(-4px); box-shadow: var(--sh-3); border-color: var(--line-strong); }
.paper-card__top { display: flex; align-items: center; gap: var(--sp-3); }
.paper-card__direction { font-size: var(--fs-xs); color: var(--ink-3); letter-spacing: .04em; text-transform: uppercase; font-weight: 600; }
.paper-card__topic {
  font-size: var(--fs-lg);
  font-weight: 620;
  letter-spacing: -.02em;
  line-height: 1.4;
  margin: var(--sp-3) 0 var(--sp-2);
}
.paper-card__note { font-size: var(--fs-sm); color: var(--ink-3); line-height: 1.6; }
.paper-card__foot { display: flex; align-items: center; gap: var(--sp-3); margin-top: var(--sp-4); flex-wrap: wrap; }
.paper-card__time { font-size: var(--fs-xs); color: var(--ink-4); display: inline-flex; align-items: center; gap: 5px; }
.paper-card__time svg { width: 13px; height: 13px; }
.paper-card__steps {
  margin-top: var(--sp-4);
  padding-top: var(--sp-4);
  border-top: 1px dashed var(--line);
  opacity: .55;
  transform: translateY(2px);
  transition: opacity var(--dur-3) var(--ease), transform var(--dur-3) var(--ease);
}
.paper-card:hover .paper-card__steps { opacity: 1; transform: none; }
.paper-card__actions { margin-left: auto; display: flex; gap: 4px; opacity: 0; transition: opacity var(--dur-2) var(--ease); }
.paper-card:hover .paper-card__actions, .paper-card:focus-within .paper-card__actions { opacity: 1; }
@media (hover: none) { .paper-card__actions { opacity: 1; } }

.stage-tag {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 10px;
  border-radius: var(--r-pill);
  font-size: var(--fs-xs);
  font-weight: 620;
  background: var(--tone-soft);
  color: var(--tone);
}
[data-stage="选题"] { --tone: #6c6b64; --tone-soft: #eeeeec; }
[data-stage="开题"] { --tone: #3a63c8; --tone-soft: #eaeffb; }
[data-stage="初稿"] { --tone: #c07a2c; --tone-soft: #f8eee0; }
[data-stage="修改"] { --tone: #7159b0; --tone-soft: #eeebf8; }
[data-stage="定稿"] { --tone: #2f8f6a; --tone-soft: #e6f2ec; }

.paper-stats { display: flex; flex-wrap: wrap; gap: var(--sp-5); }
.paper-stat { display: flex; flex-direction: column; gap: 4px; min-width: 84px; }
.paper-stat__n { font-family: var(--font-mono); font-size: var(--fs-xl); font-weight: 620; letter-spacing: -.04em; }
.paper-stat__l { font-size: var(--fs-xs); color: var(--ink-3); }

/* 卡片里的小网格：列宽自适应，超宽屏也不会把两张卡拉得太夸张 */
.mini-grid {
  display: grid;
  gap: var(--sp-4);
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
}

/* ============================================================
   项目板块
   ============================================================ */

.project-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: var(--sp-5); }

.project-card {
  display: flex;
  flex-direction: column;
  gap: var(--sp-3);
  padding: var(--sp-5);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-1);
  cursor: pointer;
  transition: transform var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease),
    border-color var(--dur-2) var(--ease);
}
.project-card:hover { transform: translateY(-3px); box-shadow: var(--sh-2); border-color: var(--line-strong); }
.project-card__top { display: flex; align-items: center; gap: 8px; }
.project-card__actions { margin-left: auto; display: flex; gap: 4px; opacity: 0; transition: opacity var(--dur-2) var(--ease); }
.project-card:hover .project-card__actions, .project-card:focus-within .project-card__actions { opacity: 1; }
@media (hover: none) { .project-card__actions { opacity: 1; } }
.project-card__name { font-size: var(--fs-lg); font-weight: 620; letter-spacing: -.02em; line-height: 1.35; }
.project-card__summary { font-size: var(--fs-sm); color: var(--ink-3); line-height: 1.55; }
.project-card__progress { display: flex; align-items: center; gap: 10px; margin-top: auto; }
.project-card__progress .progress { flex: 1; }
.project-card__foot { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: var(--fs-xs); }

.project-mini {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: var(--sp-4);
  background: var(--bg-soft);
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  cursor: pointer;
  transition: transform var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease);
}
.project-mini:hover { transform: translateY(-2px); box-shadow: var(--sh-1); }
.project-mini__name {
  font-size: var(--fs-md);
  font-weight: 600;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ============================================================
   考研目标院校
   ============================================================ */

.target-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: var(--sp-5); }

.target-card {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: var(--sp-5);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-lg);
  box-shadow: var(--sh-1);
  cursor: pointer;
  overflow: hidden;
  transition: transform var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease),
    border-color var(--dur-2) var(--ease);
}
.target-card::before {
  content: "";
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 3px;
  background: var(--tone, var(--accent));
  opacity: .9;
}
[data-tier="reach"] { --tone: var(--warn); }
[data-tier="match"] { --tone: var(--accent); }
[data-tier="safe"]  { --tone: var(--ok); }

.target-card:hover { transform: translateY(-3px); box-shadow: var(--sh-2); border-color: var(--line-strong); }
.target-card__top { display: flex; align-items: center; gap: 8px; }
.target-card__actions { margin-left: auto; display: flex; gap: 4px; opacity: 0; transition: opacity var(--dur-2) var(--ease); }
.target-card:hover .target-card__actions, .target-card:focus-within .target-card__actions { opacity: 1; }
@media (hover: none) { .target-card__actions { opacity: 1; } }
.target-card__school { font-size: var(--fs-xl); font-weight: 640; letter-spacing: -.03em; line-height: 1.25; }
.target-card__major { display: flex; align-items: center; gap: 6px; font-size: var(--fs-sm); color: var(--ink-2); }
.target-card__major .ic { width: 15px; height: 15px; color: var(--tone, var(--accent)); flex-shrink: 0; }
.target-card__note { font-size: var(--fs-sm); color: var(--ink-3); line-height: 1.6; }
.target-card__foot {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  margin-top: auto;
  padding-top: var(--sp-3);
  border-top: 1px dashed var(--line);
}

.target-hero {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-width: 132px;
  padding: var(--sp-4);
  border-radius: var(--r-lg);
  background: var(--accent-soft);
  border: 1px solid var(--accent-line);
}
.target-hero__num { font-size: var(--fs-3xl); font-weight: 660; letter-spacing: -.05em; line-height: 1; color: var(--accent-ink); }
.target-hero__unit { font-size: var(--fs-xs); color: var(--accent-ink); margin: 4px 0 2px; }

/* 首页上的考研目标横条 */
.target-strip { display: flex; align-items: center; gap: var(--sp-4); flex-wrap: wrap; }
.target-strip__head {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: var(--fs-sm);
  font-weight: 600;
  color: var(--ink-2);
  flex-shrink: 0;
}
.target-strip__head .ic { width: 16px; height: 16px; color: var(--accent); }
.target-strip__list { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; flex: 1; min-width: 0; }
.target-chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 6px 12px;
  border-radius: var(--r-pill);
  background: var(--bg-soft);
  border: 1px solid var(--line);
  transition: transform var(--dur-2) var(--ease), border-color var(--dur-2) var(--ease),
    background var(--dur-2) var(--ease);
}
.target-chip:hover { transform: translateY(-2px); background: var(--surface); border-color: var(--line-strong); }
.target-chip__school { font-size: var(--fs-sm); font-weight: 620; color: var(--ink); }
.target-chip__major { font-size: var(--fs-xs); color: var(--ink-3); }
.target-strip__days {
  display: inline-flex;
  align-items: baseline;
  gap: 5px;
  padding: 4px 12px;
  border-radius: var(--r-pill);
  background: var(--accent-soft);
  color: var(--accent-ink);
  flex-shrink: 0;
}
.target-strip__days .mono { font-size: var(--fs-lg); font-weight: 660; letter-spacing: -.04em; }

/* ============================================================
   通用列表 / 表格
   ============================================================ */

.list { display: flex; flex-direction: column; gap: var(--sp-3); }
.list--tight { gap: var(--sp-2); }
/* 单条内容较短的列表限制宽度，避免超宽屏上过于空旷 */
.list--narrow { max-width: 940px; }
.list__row {
  display: flex; align-items: center; gap: var(--sp-4);
  padding: var(--sp-4) var(--sp-5);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  transition: transform var(--dur-2) var(--ease), box-shadow var(--dur-2) var(--ease);
}
.list__row:hover { transform: translateY(-2px); box-shadow: var(--sh-2); }

.course-hue-legend { display: flex; gap: var(--sp-3); flex-wrap: wrap; margin-top: var(--sp-4); }
.legend-item { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-xs); color: var(--ink-3); }
.legend-item i {
  width: 10px; height: 10px; border-radius: 3px;
  background: hsl(var(--course-h, 220) 40% 70%);
}
