/* ==================================================================
   pages/tasks.css — 班级作业看板·双界面（页面层：只写本页布局几何）
   ------------------------------------------------------------------
   依赖：static/base.css 的 token 与组件（.card/.stat-card 卡片家族、
        .btn-* 按钮、.chip、.toast、.modal-overlay/.modal-box、
        .g-empty 空态、.page-container/.page-title/.page-subtitle、
        .tabs/.tab-btn/.tab-panel、.g-table-wrap/.data-table、:focus-visible）
   纪律（对应《前端显示优化方案_20260925.md》§3/§9）：
     1. 本文件不得出现字面色值（十六进制、颜色函数一律不用），全部走 var(--g-*) token；
        色条渐变用 color-mix() 派生图表色 token，不引入新字面色；
     2. 不得用强制覆盖（无 important 声明）；
     3. 字号一律走 --g-fs-*（最小正文 12.5px）；
     4. 不改 HTML 既有 class 名与任何 id（页内 JS 依赖）。
   ================================================================== */

/* ---------- 工具行（标题） ---------- */
.top-row {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--g-sp-3); flex-wrap: wrap;
  margin-bottom: var(--g-sp-4);
}
.tabs { margin-bottom: var(--g-sp-4); }
.muted { color: var(--g-mute); font-weight: 400; }

/* ---------- 顶部双卡：下一节课 + 我的选修课 ---------- */
.row-cards {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--g-sp-3); margin-bottom: var(--g-sp-4);
}
.mini-card { padding: var(--g-sp-3) var(--g-sp-4); }
.mini-label {
  font-size: var(--g-fs-xs); font-weight: 700; color: var(--g-mute);
  margin-bottom: var(--g-sp-2);
}
.mini-tag { font-weight: 600; color: var(--g-ink-2); }
.mini-main { min-height: 44px; }
.nc-course {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: var(--g-fs-md); font-weight: 700; color: var(--g-ink);
}
.nc-course::before {
  content: ''; width: 10px; height: 10px; border-radius: 50%;
  background: var(--p-color, var(--g-tasks));
}
.nc-course.p0::before { background: var(--g-subj-1); }
.nc-course.p1::before { background: var(--g-subj-2); }
.nc-course.p2::before { background: var(--g-subj-3); }
.nc-course.p3::before { background: var(--g-subj-4); }
.nc-course.p4::before { background: var(--g-subj-5); }
.nc-course.p5::before { background: var(--g-subj-6); }
.nc-tag {
  padding: 0 8px; border-radius: var(--g-r-pill);
  background: var(--g-primary-soft); color: var(--g-primary);
  font-size: var(--g-fs-xs); font-weight: 600;
}
.nc-meta { margin-top: 4px; font-size: var(--g-fs-sm); color: var(--g-ink-2); }
.nc-dues { margin-top: 6px; font-size: var(--g-fs-sm); color: var(--g-danger); font-weight: 600; }
.nc-dues.none { color: var(--g-mute); font-weight: 400; }

/* ---------- 我的选修课 ---------- */
.elec-login-hint { font-size: var(--g-fs-sm); color: var(--g-mute); }
.elec-login-hint a { color: var(--g-primary); font-weight: 600; }
.elec-empty { font-size: var(--g-fs-sm); color: var(--g-mute); margin-bottom: var(--g-sp-2); }
.elec-tpls { display: flex; flex-wrap: wrap; gap: 6px; margin-top: var(--g-sp-2); }
.elec-item {
  padding: var(--g-sp-2) var(--g-sp-3); margin-bottom: var(--g-sp-2);
  border: 1px solid var(--g-line); border-radius: var(--g-r-md);
  background: var(--g-surface);
}
.ei-head { display: flex; align-items: center; justify-content: space-between; gap: var(--g-sp-2); }
.ei-head b { font-size: var(--g-fs-base); color: var(--g-ink); }
.ei-ops { display: flex; gap: 6px; }
.ei-rows { margin-top: 4px; display: flex; flex-wrap: wrap; gap: 4px 10px; }
.ei-row { font-size: var(--g-fs-xs); color: var(--g-mute); }
/* 折叠卡（V9.3：选修课收成一行小入口，点开才占版面） */
.elec-card { align-self: start; padding: 0; }
.elec-card summary {
  display: flex; align-items: center; justify-content: space-between; gap: var(--g-sp-2);
  padding: var(--g-sp-3) var(--g-sp-4); cursor: pointer; list-style: none;
}
.elec-card summary::-webkit-details-marker { display: none; }
.elec-card .mini-label { margin-bottom: 0; }
.elec-chev { color: var(--g-mute); transition: transform var(--g-dur) var(--g-ease); }
.elec-card[open] .elec-chev { transform: rotate(180deg); }
.elec-body { padding: 0 var(--g-sp-4) var(--g-sp-3); }
/* 归档库抽屉（V9.4）：默认收起一行，全员只读查历史，管理员多恢复/删除按钮 */
.arch-card { padding: 0; margin-bottom: var(--g-sp-4); }
.arch-card summary {
  display: flex; align-items: center; justify-content: space-between; gap: var(--g-sp-2);
  padding: var(--g-sp-3) var(--g-sp-4); cursor: pointer; list-style: none;
  font-size: var(--g-fs-sm); font-weight: 700; color: var(--g-ink);
}
.arch-card summary::-webkit-details-marker { display: none; }
.arch-body { padding: 0 var(--g-sp-4) var(--g-sp-3); }
.arch-empty { font-size: var(--g-fs-sm); color: var(--g-mute); }
.arch-row {
  display: flex; align-items: center; gap: var(--g-sp-2);
  padding: 8px 0; border-bottom: 1px dashed var(--g-line); cursor: pointer;
}
.arch-row:last-child { border-bottom: 0; }
.arch-row:hover .at .t { color: var(--g-primary); }
.arch-row .at { flex: 1; min-width: 0; }
.arch-row .at .t {
  font-size: var(--g-fs-sm); font-weight: 600; color: var(--g-ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.arch-row .at .d { font-size: var(--g-fs-xs); color: var(--g-mute); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.arch-row .ai-ops { display: flex; gap: 6px; flex: 0 0 auto; }

/* ---------- 统计条（V9.5：Linear 式语义色链——卡片颜色=图例，不随数值变；
     顶部 3px 色条是第二视觉通道，色弱用户不靠数字颜色也能分区） ---------- */
.stat-strip {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--g-sp-3); margin-bottom: var(--g-sp-4);
}
.stat-card {
  position: relative; overflow: hidden;
  display: flex; flex-direction: column; gap: 2px; min-width: 0;
  padding: calc(var(--g-sp-3) + 3px) var(--g-sp-4) var(--g-sp-3);   /* 顶部给色条让位 */
}
.stat-card::before {
  content: ""; position: absolute; top: 0; left: 0; right: 0; height: 3px;
  background: var(--g-mute-2);                                      /* 老内核(X5)回退 */
  background: color-mix(in srgb, var(--g-mute) 55%, transparent);
}
.stat-card.soon::before { background: var(--g-warn); }
.stat-card.overdue::before { background: var(--g-danger); }
.stat-card .v {
  font-size: var(--g-fs-2xl); font-weight: 800; line-height: 1.1;
  font-variant-numeric: tabular-nums;
}
.stat-card .l { font-size: var(--g-fs-xs); color: var(--g-mute); }
.stat-card.all .v { color: var(--g-ink-2); }
.stat-card.soon .v { color: var(--g-warn); }
.stat-card.overdue .v { color: var(--g-danger); }

/* ---------- 筛选 chips（V9.5：与统计卡/时间轴同一套语义色；
     active 下沉 1px 的按压反馈，新粗野主义标志性手感） ---------- */
.chip-row { display: flex; gap: var(--g-sp-2); margin-bottom: var(--g-sp-3); flex-wrap: wrap; }
.chip-row .chip {
  flex: 0 0 auto; padding: 5px 14px; border-radius: var(--g-r-pill);
  border: 1px solid var(--g-line); background: var(--g-surface);
  color: var(--g-mute); font-size: var(--g-fs-sm); cursor: pointer;
  transition: background var(--g-dur) var(--g-ease), color var(--g-dur) var(--g-ease),
    border-color var(--g-dur) var(--g-ease), transform var(--g-dur) var(--g-ease),
    box-shadow var(--g-dur) var(--g-ease);
}
.chip-row .chip:hover { transform: translateY(-1px); box-shadow: var(--g-sh-sm); }
.chip-row .chip:active { transform: translateY(1px); box-shadow: none; }
.chip-row .chip[data-f="all"]:hover { border-color: var(--g-primary); color: var(--g-primary); }
.chip-row .chip[data-f="active"]:hover { border-color: var(--g-tasks); color: var(--g-tasks); }
.chip-row .chip[data-f="soon"]:hover { border-color: var(--g-warn); color: var(--g-warn); }
.chip-row .chip[data-f="expired"]:hover { border-color: var(--g-danger); color: var(--g-danger); }
.chip-row .chip.on { font-weight: 600; transform: none; }
.chip-row .chip.on[data-f="all"] {
  background: var(--g-primary); border-color: var(--g-primary); color: var(--g-surface);
}
.chip-row .chip.on[data-f="active"] {
  background: var(--g-tasks); border-color: var(--g-tasks); color: var(--g-surface);
}
.chip-row .chip.on[data-f="soon"] {
  background: var(--g-warn); border-color: var(--g-warn); color: var(--g-surface);
}
.chip-row .chip.on[data-f="expired"] {
  background: var(--g-danger); border-color: var(--g-danger); color: var(--g-surface);
}

/* ==================================================================
   版本日历（V9.6.1：游戏版本日历风——按科目分组，一条作业一行，条间距恒 10px；
   科目标签 sticky 钉在滚动区左缘随横向滚动跟随，点击只看该科目；
   色块为纯甘特条；文字块 .binfo 纯文字骑在色条上，右缘贴今日线、被色条
   两端挡住（大滑块套小滑块，JS positionInfo 定位，硬约束不出色条块）。
   几何分工：列宽 --gd 由 JS 按视口写入（窄竖屏 34px / 宽屏·横屏 48px），
   色块位置由 JS 内联（LANE_H=30 与 .lane-row 的 height 同步 / BAR_H=20）。
   ================================================================== */
.tl-wrap {
  overflow: hidden;
  padding: 0 0 var(--g-sp-2);
  margin-bottom: var(--g-sp-4);
}
/* 图例行：彩点/今天线的唯一解释入口；sticky 钉在面板顶部，
     纵向滚动看后面泳道时图例不丢（z-index 须压过周行 7/日头 6/文字标签 4） */
.tl-legend {
  position: sticky; top: 0; z-index: 8;
  display: flex; align-items: center; gap: var(--g-sp-4);
  padding: var(--g-sp-2) var(--g-sp-3);
  border-bottom: 1px solid var(--g-line-2);
  background: var(--g-surface);
  font-size: var(--g-fs-xs); color: var(--g-mute);
}
.tl-legend .lg-item { display: inline-flex; align-items: center; gap: 5px; }
.tl-legend .lg-hint { margin-left: auto; }
.tl-legend .lg-line {
  display: inline-block; width: 14px; height: 0;
  border-top: 2px solid var(--g-danger);                      /* 老内核(X5)无 color-mix 的回退 */
  border-top: 2px solid color-mix(in srgb, var(--g-danger) 60%, transparent);
}
/* 科目圆点（泳道标签/归档行共用） */
.dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; background: var(--g-mute); }
.dot.p0 { background: var(--g-subj-1); } .dot.p1 { background: var(--g-subj-2); }
.dot.p2 { background: var(--g-subj-3); } .dot.p3 { background: var(--g-subj-4); }
.dot.p4 { background: var(--g-subj-5); } .dot.p5 { background: var(--g-subj-6); }
.tl-scroll { flex: 1 1 auto; min-width: 0; overflow-x: auto; -webkit-overflow-scrolling: touch; }
.tl-inner2 { position: relative; }
.tl-weeks {
  display: flex; height: 26px; position: sticky; top: 0; z-index: 7;
  background: var(--g-surface);
}
.tl-wk {
  flex: 0 0 auto; display: flex; align-items: center;
  padding-left: 8px; box-sizing: border-box; overflow: hidden; white-space: nowrap;
  font-size: var(--g-fs-xs); color: var(--g-mute); font-weight: 700;
  border-left: 2px solid var(--g-line-2);
}
.tl-wk b { color: var(--g-primary); font-size: var(--g-fs-sm); margin-right: 4px; }
.tl-head {
  display: flex; height: 58px; position: sticky; top: 26px; z-index: 6;
  background: var(--g-surface);
}
.tl-cell {
  width: var(--gd, 36px); flex: 0 0 auto; text-align: center; box-sizing: border-box;
  padding-top: 4px; font-size: var(--g-fs-xs); color: var(--g-mute); line-height: 1.4;
}
.tl-cell.wk-start { border-left: 1px dashed var(--g-line-2); }
/* 日期数字：11.5px + 紧边距，"10.11" 五字符在最小 34px 格内不再相撞 */
.tl-cell b {
  display: block; margin: 0 1px; border-radius: var(--g-r-sm);
  font-size: 11.5px; color: var(--g-ink); font-weight: 600;
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.tl-cell.wek b { color: var(--g-warn); }
.tl-cell.today b { background: var(--g-danger); color: var(--g-surface); }
.tl-cell.today { color: var(--g-danger); font-weight: 700; }
.tl-cell.has-cls { cursor: pointer; }
.tl-cell.has-cls:hover b { outline: 2px solid var(--g-primary-soft); }
/* 日格课程横杠：一杠一节课，纵向按上课时间早晚排列（V9.1） */
.dts {
  display: inline-flex; flex-direction: column; align-items: center;
  gap: 2px; margin-top: 2px;
}
.dtn {
  width: 13px; height: 3px; border-radius: 2px; display: inline-block;
  background: var(--g-mute);
}
.dtn.p0 { background: var(--g-subj-1); } .dtn.p1 { background: var(--g-subj-2); }
.dtn.p2 { background: var(--g-subj-3); } .dtn.p3 { background: var(--g-subj-4); }
.dtn.p4 { background: var(--g-subj-5); } .dtn.p5 { background: var(--g-subj-6); }
.dtn.mine { background: transparent; border: 1.5px solid var(--g-primary); height: 5px; }
.dtn.more {
  width: auto; height: auto; border-radius: var(--g-r-pill); background: var(--g-surface-3);
  color: var(--g-mute); font-size: 10px; line-height: 1; padding: 1px 3px; font-style: normal;
}
/* 泳道组：仅作分组间距（V9.6.2 删去组头科目标签——色条上的文字块已带学科名） */
.lane-group { margin-bottom: 10px; }
.lane-bars { position: relative; }
/* V9.6 行结构：一条作业一行（height 与 JS 的 LANE_H 同步），条间距恒 10px */
.lane-row { position: relative; height: 30px; }
/* 泳道区：按天分格的底纹跟随 --gd；高度由 JS 内联（空态时无高度、走文档流） */
.tl-body {
  position: relative; border-radius: var(--g-r-sm); padding-bottom: var(--g-sp-3);
  background-image: repeating-linear-gradient(90deg,
    transparent 0 calc(var(--gd, 36px) - 1px), var(--g-surface-3) calc(var(--gd, 36px) - 1px) var(--gd, 36px));
}
.tl-week-line {
  position: absolute; top: 0; bottom: 0; width: 0; z-index: 0; pointer-events: none;
  border-left: 1px dashed var(--g-line-2);
}
/* 色块：纯甘特条（无内嵌文字），位置/尺寸全部 JS 内联；信息在 .binfo 文字标签上 */
.tl-bar {
  position: absolute; border-radius: var(--g-r-sm);
  cursor: pointer; min-width: var(--gd, 36px);
  box-shadow: var(--g-sh-sm);
  transition: filter var(--g-dur) var(--g-ease), transform var(--g-dur) var(--g-ease);
}
.tl-bar:hover { filter: brightness(1.08); transform: scaleY(1.12); }
/* 滑块式文字块（V9.6.1）：纯文字无底衬无边框，骑在自己色条上（元素盒子隐形，
   仅用于限位与撞墙检测），右缘贴今日线、被色条两端挡住（JS positionInfo 定位）。
   白字直接压在色条渐变上（同 V9.4 块内文字的对比度方案）；left 由 JS 内联 */
.binfo {
  position: absolute; top: 0; bottom: 0; z-index: 4;
  display: flex; align-items: center; gap: 6px;
  max-width: min(46vw, 520px); padding: 0 2px;
  cursor: pointer; user-select: none; overflow: hidden;
}
.binfo:hover .bt { text-decoration: underline; text-underline-offset: 3px; }
.binfo .bs {
  flex: 0 0 auto; font-size: var(--g-fs-xs); font-weight: 700;
  color: var(--g-surface); opacity: 0.82; white-space: nowrap;
  text-shadow: 0 1px 2px color-mix(in srgb, var(--g-ink) 35%, transparent);
}
.binfo .bt {
  flex: 0 1 auto; min-width: 0;
  font-size: var(--g-fs-xs); font-weight: 600; color: var(--g-surface);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
  text-shadow: 0 1px 2px color-mix(in srgb, var(--g-ink) 35%, transparent);
}
/* 倒计时角标：深色半透明底保证白字在渐变亮端也可读；老内核回退纯深色 */
.binfo .cd {
  flex: 0 0 auto; padding: 0 7px; border-radius: var(--g-r-pill);
  font-size: var(--g-fs-xs); font-weight: 700; color: var(--g-surface);
  font-variant-numeric: tabular-nums; line-height: 16px;
  background: var(--g-ink);
  background: color-mix(in srgb, var(--g-ink) 34%, transparent);
}
/* 窄条降级：条内可用宽 <110px 时只留作业名（科目/角标让位，省略号兜底） */
.binfo.slim .bs, .binfo.slim .cd { display: none; }
/* 已截止：斜纹条上用深字（同 .tl-bar.expired 的对比度方案） */
.binfo.expired .bs { color: var(--g-ink-2); opacity: 1; }
.binfo.expired .bt { color: var(--g-ink-2); text-decoration: line-through; text-decoration-color: var(--g-mute-2); text-shadow: none; }
.binfo.expired .cd {
  color: var(--g-ink-2);
  background: var(--g-surface-3);                                 /* 老内核(X5)回退 */
  background: color-mix(in srgb, var(--g-ink) 10%, transparent);
}
/* 六组科目渐变（V9.2.1 亮色色板沿用，整组同色强调科目分组） */
.tl-bar.p0 { background: var(--g-subj-1); background: linear-gradient(100deg, var(--g-subj-1), color-mix(in srgb, var(--g-subj-1) 72%, white)); }
.tl-bar.p1 { background: var(--g-subj-2); background: linear-gradient(100deg, var(--g-subj-2), color-mix(in srgb, var(--g-subj-2) 72%, white)); }
.tl-bar.p2 { background: var(--g-subj-3); background: linear-gradient(100deg, var(--g-subj-3), color-mix(in srgb, var(--g-subj-3) 72%, white)); }
.tl-bar.p3 { background: var(--g-subj-4); background: linear-gradient(100deg, var(--g-subj-4), color-mix(in srgb, var(--g-subj-4) 72%, white)); }
.tl-bar.p4 { background: var(--g-subj-5); background: linear-gradient(100deg, var(--g-subj-5), color-mix(in srgb, var(--g-subj-5) 72%, white)); }
.tl-bar.p5 { background: var(--g-subj-6); background: linear-gradient(100deg, var(--g-subj-6), color-mix(in srgb, var(--g-subj-6) 72%, white)); }
.tl-bar.expired {
  /* 已截止：斜纹是色彩之外的第二通道（色弱用户也能一眼区分结束/进行中），
     底用 surface-3 保证对比度达标 */
  background: var(--g-surface-3);
  background: repeating-linear-gradient(-45deg,
    var(--g-surface-3) 0 7px,
    color-mix(in srgb, var(--g-mute) 16%, var(--g-surface-3)) 7px 14px);
  border: 1px solid var(--g-line);
  box-shadow: none; opacity: 1;
}
.tl-bar.expired:hover { filter: none; transform: none; }
/* 封顶截断：右缘渐隐示意“未完”，hover 提示完整信息在详情 */
.tl-bar.clipped { mask-image: linear-gradient(90deg, var(--g-surface) 0 88%, transparent); -webkit-mask-image: linear-gradient(90deg, var(--g-surface) 0 88%, transparent); }
.tl-today {
  position: absolute; top: 0; bottom: 0; width: 0; z-index: 2;   /* 色块之上、科目标签(3)/文字标签(4)之下 */
  border-left: 2px solid var(--g-danger);                     /* 老内核(X5)无 color-mix 的回退 */
  border-left: 2px solid color-mix(in srgb, var(--g-danger) 60%, transparent);
  box-shadow: 1px 0 0 0 color-mix(in srgb, var(--g-danger) 18%, transparent);
  pointer-events: none;
}
/* 窄竖屏：文字块宽度上限收紧（科目 span 由 JS 的 slim 降级处理） */
@media (max-width: 699px) {
  .binfo { max-width: 62vw; }
}

/* ---------- 班级管理 ---------- */
.admin-toolbar {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--g-sp-3); flex-wrap: wrap; margin-bottom: var(--g-sp-4);
  padding: var(--g-sp-3) var(--g-sp-4);
}
.admin-tip { font-size: var(--g-fs-sm); color: var(--g-mute); flex: 1; min-width: 220px; }
.admin-list-card, .sched-card { padding: var(--g-sp-4); margin-bottom: var(--g-sp-4); }
.card-title { font-size: var(--g-fs-md); font-weight: 700; color: var(--g-ink); margin-bottom: var(--g-sp-3); }
.card-title-row {
  display: flex; align-items: center; justify-content: space-between;
  gap: var(--g-sp-2); flex-wrap: wrap; margin-bottom: var(--g-sp-3);
}
.card-title-row .card-title { margin-bottom: 0; }
.card-title-row .btn + .btn { margin-left: 6px; }
.sched-hint { font-size: var(--g-fs-xs); color: var(--g-mute); margin-bottom: var(--g-sp-3); line-height: 1.7; }
/* 课表编辑器：输入框紧凑化 */
.sched-table .sc-in {
  width: 100%; min-width: 0; padding: 4px 8px; font-size: var(--g-fs-xs);
  border: 1px solid var(--g-line-2); border-radius: var(--g-r-sm);
  background: var(--g-surface); color: var(--g-ink); box-sizing: border-box;
}
.sched-table .sc-in:focus { outline: none; border-color: var(--g-primary); }
.sched-table .w-course { min-width: 110px; }
.sched-table .w-periods { min-width: 82px; }
.sched-table .sc-time { font-size: var(--g-fs-xs); color: var(--g-mute); white-space: nowrap; }
.wk-pair { display: flex; align-items: center; gap: 4px; }
.wk-pair input { width: 52px; }

/* ---------- 弹窗内部结构（外壳走 base） ---------- */
.modal-box h3 { margin-bottom: var(--g-sp-4); font-size: var(--g-fs-md); font-weight: 700; }
.modal-actions { display: flex; gap: var(--g-sp-2); margin-top: var(--g-sp-4); }
.modal-actions .btn { flex: 1; }
.form-row { margin-bottom: var(--g-sp-4); }
.form-row.two-col { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--g-sp-3); }
.form-row.two-col.three { grid-template-columns: repeat(3, minmax(0, 1fr)); }
#pub-error, #elec-error { margin-top: var(--g-sp-2); }
/* 收取方式分段 */
.seg-row { display: flex; gap: var(--g-sp-2); }
.seg-opt {
  flex: 1; display: flex; align-items: center; justify-content: center; gap: 6px;
  border: 1.5px solid var(--g-line-2); border-radius: var(--g-r-md);
  padding: 9px 6px; font-size: var(--g-fs-sm); background: var(--g-surface-2);
  color: var(--g-mute); cursor: pointer;
  transition: border-color var(--g-dur) var(--g-ease), background var(--g-dur) var(--g-ease),
    color var(--g-dur) var(--g-ease);
}
.seg-opt input { margin: 0; accent-color: var(--g-primary); }
.seg-opt.on {
  border-color: var(--g-primary); background: var(--g-primary-soft);
  color: var(--g-primary); font-weight: 600;
}
/* 对齐课次 */
.align-box {
  margin: calc(-1 * var(--g-sp-2)) 0 var(--g-sp-4);
  padding: var(--g-sp-3); border: 1px dashed var(--g-line-2); border-radius: var(--g-r-md);
  background: var(--g-surface-2);
}
.align-btns { display: flex; flex-wrap: wrap; gap: 6px; }
.align-btn {
  padding: 5px 12px; border-radius: var(--g-r-pill);
  border: 1px solid var(--g-line); background: var(--g-surface);
  color: var(--g-ink-2); font-size: var(--g-fs-xs); font-weight: 600; cursor: pointer;
  transition: border-color var(--g-dur) var(--g-ease), color var(--g-dur) var(--g-ease);
}
.align-btn:hover { border-color: var(--g-primary); color: var(--g-primary); }
/* 详情弹窗 */
.d-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--g-sp-2); margin-bottom: var(--g-sp-3); }
.d-item { background: var(--g-surface-2); border-radius: var(--g-r-md); padding: 8px 12px; }
.d-item.full { grid-column: 1 / -1; }
.d-item span { display: block; font-size: var(--g-fs-xs); color: var(--g-mute); margin-bottom: 2px; }
.d-item b { font-size: var(--g-fs-sm); }
.d-req {
  background: var(--g-warn-bg); border: 1px solid var(--g-line-2); border-radius: var(--g-r-md);
  padding: 10px 14px; font-size: var(--g-fs-sm); line-height: 1.8;
  white-space: pre-wrap; word-break: break-word; margin-bottom: var(--g-sp-3);
}
.rm { font-weight: 700; }
.rm.ok { color: var(--g-ok); } .rm.soon { color: var(--g-warn); }
.rm.urgent { color: var(--g-danger); } .rm.over { color: var(--g-mute); }
/* 当日课程弹窗 */
.day-cls {
  padding: var(--g-sp-3); margin-bottom: var(--g-sp-2);
  border: 1px solid var(--g-line); border-radius: var(--g-r-md); background: var(--g-surface);
}
.day-cls.mine { border-style: dashed; }
.dc-head { display: flex; align-items: center; gap: var(--g-sp-2); flex-wrap: wrap; }
.dc-name { font-size: var(--g-fs-base); font-weight: 700; color: var(--g-ink); }
.dc-time {
  padding: 1px 8px; border-radius: var(--g-r-sm);
  background: var(--g-tasks-bg); color: var(--g-tasks);
  font-size: var(--g-fs-xs); font-weight: 700; font-variant-numeric: tabular-nums;
}
.dc-tag {
  padding: 1px 8px; border-radius: var(--g-r-pill);
  background: var(--g-primary-soft); color: var(--g-primary);
  font-size: var(--g-fs-xs); font-weight: 600;
}
.dc-note { font-size: var(--g-fs-xs); color: var(--g-mute); }
.dc-meta { margin-top: 4px; font-size: var(--g-fs-sm); color: var(--g-ink-2); }
.dc-dues { margin-top: 6px; font-size: var(--g-fs-sm); color: var(--g-danger); font-weight: 600; }
.dc-dues.none { color: var(--g-mute); font-weight: 400; }
.dc-due {
  display: inline-block; margin: 2px 6px 0 0; padding: 1px 8px;
  border-radius: var(--g-r-sm); background: var(--g-danger-bg); color: var(--g-danger);
  font-size: var(--g-fs-xs); font-weight: 600;
}
/* ---------- 附件：详情图片网格 / 文档行 / 灯箱 / 编辑态文件行 ---------- */
.att-grid {
  display: grid; grid-template-columns: 1fr;   /* 作业要求图须完整可读：单列原比例（原3列方形裁切只剩中间一条） */
  gap: var(--g-sp-2); margin-bottom: var(--g-sp-3);
}
.modal-box .att-img {                           /* 提权压过 base.css 的 .modal-box img 通用规则 */
  width: 100%; height: auto;
  border-radius: var(--g-r-md); cursor: zoom-in;
  border: 1px solid var(--g-line); background: var(--g-surface-2);
}
.att-doc {
  display: flex; align-items: center; gap: var(--g-sp-2);
  background: var(--g-surface-2); border-radius: var(--g-r-md);
  padding: 9px 12px; font-size: var(--g-fs-sm); margin-bottom: 6px;
  text-decoration: none; color: var(--g-ink);
}
.att-doc:hover { background: var(--g-surface-3); }
.att-doc .fname { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lightbox {
  position: fixed; inset: 0; z-index: 200; display: none;
  align-items: center; justify-content: center; padding: var(--g-sp-4);
  background: rgba(10, 14, 22, .92); cursor: zoom-out;
}
.lightbox.show { display: flex; }
.lightbox img { max-width: 100%; max-height: 100%; border-radius: var(--g-r-sm); }
.pub-filelist { display: flex; flex-direction: column; gap: 6px; margin-bottom: var(--g-sp-2); }
.pub-file-row {
  display: flex; align-items: center; gap: var(--g-sp-2);
  background: var(--g-surface-2); border-radius: var(--g-r-md); padding: 6px 10px;
  font-size: var(--g-fs-sm);
}
.pub-file-row .fname { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
#file-edit-row .btn { margin-top: 4px; }

/* ---------- 响应式（断点与 base.css 的导航断点 860px 对齐） ---------- */
@media (max-width: 860px) {
  .row-cards { grid-template-columns: 1fr; }
}
@media (max-width: 560px) {
  .stat-strip { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .form-row.two-col, .form-row.two-col.three { grid-template-columns: 1fr; }
  .admin-toolbar .btn { width: 100%; }
  .admin-ops { display: flex; gap: var(--g-sp-2); width: 100%; }
  .admin-ops .btn { flex: 1; width: auto; }
  .d-grid { grid-template-columns: 1fr; }
  .tl-legend .lg-hint { display: none; }
}

/* ---------- 横屏（手机横置）：纵向密度收紧，双卡恢复并排 ---------- */
@media (orientation: landscape) and (max-height: 540px) {
  .row-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .top-row { margin-bottom: var(--g-sp-3); }
  .tabs { margin-bottom: var(--g-sp-3); }
  .stat-strip { margin-bottom: var(--g-sp-3); }
  .mini-card { padding: var(--g-sp-2) var(--g-sp-3); }
  .tl-wrap { margin-bottom: var(--g-sp-3); }
  .tl-legend { padding: 4px var(--g-sp-3); }
}
