    /* ===================== 课表板块样式 ===================== */
    .sched-meta {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      gap: 10px 18px;
      background: var(--panel);
      border: 1px solid var(--line);
      border-radius: 8px;
      padding: 12px 16px;
      margin-bottom: 12px;
    }

    .sched-meta .meta-item {
      display: flex;
      align-items: center;
      gap: 6px;
      font-size: 13px;
    }

    .sched-meta .meta-label {
      color: var(--muted);
    }

    .sched-meta input {
      border: 1px solid var(--line);
      border-radius: 5px;
      padding: 3px 7px;
      font: inherit;
      font-size: 13px;
      color: var(--text);
      background: #fff;
    }

    .sched-meta input:focus {
      outline: 2px solid var(--focus);
      outline-offset: -1px;
    }

    .sched-meta .meta-owner { width: 92px; }
    .sched-meta .meta-sid { width: 118px; }
    .sched-meta .meta-year { width: 104px; }
    .sched-meta .meta-term,
    .sched-meta .meta-weeks { width: 54px; }
    .sched-meta .meta-date { width: 140px; }

    .sched-bar {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      gap: 8px;
      background: var(--panel);
      border: 1px solid var(--line);
      border-radius: 8px;
      padding: 10px 14px;
      margin-bottom: 12px;
    }

    .sched-bar .spacer {
      flex: 1 1 auto;
    }

    .week-pill {
      min-width: 92px;
      text-align: center;
      font-size: 15px;
      font-weight: 600;
      color: var(--accent);
      background: var(--accent-soft);
      border-radius: 999px;
      padding: 4px 14px;
    }

    .sched-bar select,
    .sched-bar input[type="number"] {
      border: 1px solid var(--line);
      border-radius: 5px;
      padding: 4px 8px;
      font: inherit;
      font-size: 13px;
      background: #fff;
      color: var(--text);
    }

    /* --- 课表网格 --- */
    .sched-grid-wrap {
      overflow-x: auto;
      background: var(--panel);
      border: 1px solid var(--line);
      border-radius: 8px;
    }

    table.sched-grid {
      width: 100%;
      min-width: 1080px;
      border-collapse: collapse;
      table-layout: fixed;
    }

    table.sched-grid th,
    table.sched-grid td {
      border: 1px solid var(--line);
      vertical-align: top;
      padding: 0;
    }

    table.sched-grid thead th {
      background: #eef1f4;
      color: var(--text);
      font-size: 13px;
      font-weight: 600;
      text-align: center;
      padding: 8px 4px;
    }

    table.sched-grid thead th.today-col {
      background: var(--accent-soft);
      color: var(--accent);
    }

    table.sched-grid thead th .th-date {
      font-size: 11px;
      font-weight: 400;
      color: var(--muted);
      margin-top: 2px;
    }
    table.sched-grid thead th.today-col .th-date {
      color: var(--accent);
    }

    table.sched-grid th.slot-head {
      width: 86px;
      background: #f2f4f6;
      text-align: center;
      font-size: 12px;
      font-weight: 600;
      color: var(--muted);
      padding: 8px 4px;
      vertical-align: middle;
    }

    table.sched-grid th.slot-head .slot-span {
      display: block;
      font-size: 11px;
      font-weight: 400;
      color: var(--muted);
      margin-top: 2px;
    }

    table.sched-grid tbody tr.band-start td,
    table.sched-grid tbody tr.band-start th {
      border-top: 2px solid var(--line-strong);
    }

    td.sched-cell {
      height: 92px;
      cursor: pointer;
      transition: background 0.12s;
    }

    td.sched-cell:hover {
      background: #f4f8f9;
    }

    td.sched-cell.today-col {
      background: #fbfdfd;
    }

    td.sched-cell.today-col:hover {
      background: #eff6f8;
    }

    .cell-inner {
      display: flex;
      flex-direction: column;
      gap: 4px;
      padding: 5px;
      min-height: 92px;
    }

    .course-chip {
      border-left: 3px solid var(--accent);
      background: var(--accent-soft);
      border-radius: 4px;
      padding: 5px 7px;
      font-size: 12px;
      line-height: 1.35;
      overflow: hidden;
    }

    .course-chip.nature-elective {
      border-left-color: var(--green);
      background: #e8f4ec;
    }

    .course-chip.nature-school {
      border-left-color: var(--amber);
      background: #fbf1de;
    }

    .course-chip.conflict {
      outline: 2px solid var(--red);
      outline-offset: -2px;
    }

    /* 跨节课程：用连续色块表示（首格带内容，后续格接上去） */
    td.sched-cell.cell-merged .cell-inner {
      height: 100%;
    }

    td.sched-cell.cell-merged .course-chip {
      flex: 1 1 auto;
    }

    .course-chip.chip-cont-top {
      border-bottom-left-radius: 0;
      border-bottom-right-radius: 0;
    }

    .course-chip.chip-cont {
      border-top-left-radius: 0;
      border-top-right-radius: 0;
      border-bottom-left-radius: 0;
      border-bottom-right-radius: 0;
      min-height: 62px;
    }

    .course-chip.chip-cont.chip-cont-end {
      border-bottom-left-radius: 4px;
      border-bottom-right-radius: 4px;
    }

    .course-chip .chip-name {
      font-weight: 600;
      color: var(--text);
      margin-bottom: 2px;
      word-break: break-all;
    }

    .course-chip .chip-line {
      color: var(--muted);
      font-size: 11px;
      word-break: break-all;
    }

    .course-chip .chip-weeks {
      color: var(--accent);
      font-size: 11px;
    }

    .cell-add {
      opacity: 0;
      text-align: center;
      color: var(--muted);
      font-size: 18px;
      line-height: 1;
      padding: 4px 0;
      transition: opacity 0.12s;
    }

    td.sched-cell:hover .cell-add {
      opacity: 0.55;
    }

    /* --- 导入面板 --- */
    details.sched-import {
      background: var(--panel);
      border: 1px solid var(--line);
      border-radius: 8px;
      margin-bottom: 12px;
    }

    details.sched-import > summary {
      cursor: pointer;
      padding: 11px 16px;
      font-weight: 600;
      font-size: 14px;
      list-style: none;
      display: flex;
      align-items: center;
      gap: 8px;
    }

    details.sched-import > summary::-webkit-details-marker {
      display: none;
    }

    details.sched-import > summary::before {
      content: "\25B8";
      color: var(--muted);
      font-size: 12px;
    }

    details.sched-import[open] > summary::before {
      content: "\25BE";
    }

    details.sched-import > summary .hint {
      font-weight: 400;
      font-size: 12px;
      color: var(--muted);
    }

    .import-body {
      padding: 14px 16px 16px;
      border-top: 1px solid var(--line);
    }

    .import-row {
      display: flex;
      flex-wrap: wrap;
      align-items: center;
      gap: 8px;
      margin-bottom: 10px;
    }

    .import-body textarea {
      width: 100%;
      min-height: 150px;
      border: 1px solid var(--line);
      border-radius: 6px;
      padding: 9px 11px;
      font-family: Consolas, "Courier New", monospace;
      font-size: 12px;
      line-height: 1.5;
      color: var(--text);
      resize: vertical;
    }

    .import-body textarea:focus {
      outline: 2px solid var(--focus);
      outline-offset: -1px;
    }

    .parse-log {
      margin-top: 10px;
      font-size: 12px;
      color: var(--muted);
      white-space: pre-wrap;
      line-height: 1.6;
    }

    .parse-log .ok { color: var(--green); }
    .parse-log .warn { color: var(--amber); }
    .parse-log .err { color: var(--red); }

    /* --- 校对页 --- */
    .review-panel {
      background: var(--panel);
      border: 2px solid var(--accent);
      border-radius: 8px;
      padding: 14px 16px;
      margin-bottom: 12px;
    }

    .review-panel h3 {
      margin: 0 0 4px;
      font-size: 15px;
      color: var(--accent);
    }

    .review-panel .review-sub {
      font-size: 12px;
      color: var(--muted);
      margin-bottom: 12px;
    }

    table.review-table {
      width: 100%;
      border-collapse: collapse;
      font-size: 12px;
    }

    table.review-table th,
    table.review-table td {
      border: 1px solid var(--line);
      padding: 4px 6px;
      text-align: left;
      vertical-align: middle;
    }

    table.review-table th {
      background: #eef1f4;
      font-weight: 600;
      white-space: nowrap;
    }

    table.review-table input,
    table.review-table select {
      width: 100%;
      border: 1px solid transparent;
      background: transparent;
      border-radius: 4px;
      padding: 2px 4px;
      font: inherit;
      font-size: 12px;
      color: var(--text);
    }

    table.review-table input:hover,
    table.review-table select:hover {
      border-color: var(--line);
      background: #fff;
    }

    table.review-table input:focus,
    table.review-table select:focus {
      outline: 2px solid var(--focus);
      outline-offset: -1px;
      background: #fff;
    }

    table.review-table td.missing {
      background: #fdecea;
    }

    table.review-table td.missing input {
      color: var(--red);
    }

    table.review-table tr.row-conflict td {
      background: #fdf4e3;
    }

    .review-actions {
      display: flex;
      flex-wrap: wrap;
      gap: 8px;
      margin-top: 14px;
      padding-top: 12px;
      border-top: 1px solid var(--line);
      align-items: center;
    }

    .review-actions .note {
      font-size: 12px;
      color: var(--muted);
    }

    /* --- 冲突提示 --- */
    .conflict-banner {
      background: #fdf4e3;
      border: 1px solid var(--amber);
      border-radius: 6px;
      padding: 9px 13px;
      font-size: 12px;
      color: var(--amber);
      margin-bottom: 12px;
      line-height: 1.6;
    }

    .conflict-banner .cb-title {
      display: block;
      margin-bottom: 6px;
      font-weight: 600;
    }

    .conflict-jump {
      display: inline-block;
      margin: 2px 6px 2px 0;
      padding: 3px 10px;
      background: #fff;
      border: 1px solid var(--amber);
      border-radius: 999px;
      color: var(--amber);
      font-size: 12px;
      line-height: 1.4;
      cursor: pointer;
      transition: background 0.12s, color 0.12s;
    }

    .conflict-jump:hover {
      background: var(--amber);
      color: #fff;
    }

    /* 跳转后短暂高亮目标格子 */
    @keyframes cellFlash {
      0%, 100% { box-shadow: inset 0 0 0 0 rgba(214, 69, 69, 0); }
      50% { box-shadow: inset 0 0 0 3px var(--red); }
    }

    td.sched-cell.cell-flash {
      animation: cellFlash 0.6s ease-in-out 3;
    }

    /* --- 编辑弹层 --- */
    .modal-mask {
      position: fixed;
      inset: 0;
      background: rgba(15, 25, 35, 0.42);
      display: flex;
      align-items: flex-start;
      justify-content: center;
      padding: 40px 16px;
      overflow-y: auto;
      z-index: 100;
    }

    .modal-card {
      background: var(--panel);
      border-radius: 10px;
      box-shadow: 0 12px 40px rgba(0, 0, 0, 0.25);
      width: min(680px, 100%);
      padding: 20px 22px;
    }

    .modal-card h3 {
      margin: 0 0 14px;
      font-size: 16px;
    }

    .field-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
      gap: 10px 14px;
    }

    .field {
      display: flex;
      flex-direction: column;
      gap: 4px;
    }

    .field label {
      font-size: 12px;
      color: var(--muted);
    }

    .field input,
    .field select {
      border: 1px solid var(--line);
      border-radius: 5px;
      padding: 5px 8px;
      font: inherit;
      font-size: 13px;
      color: var(--text);
      background: #fff;
    }

    .field input:focus,
    .field select:focus {
      outline: 2px solid var(--focus);
      outline-offset: -1px;
    }

    .sess-block {
      border: 1px solid var(--line);
      border-radius: 6px;
      padding: 10px 12px;
      margin-top: 8px;
      background: #fafbfc;
    }

    .sess-block .sess-title {
      font-size: 12px;
      color: var(--muted);
      margin-bottom: 8px;
      display: flex;
      justify-content: space-between;
      align-items: center;
    }

    .modal-actions {
      display: flex;
      gap: 8px;
      justify-content: flex-end;
      margin-top: 18px;
      padding-top: 14px;
      border-top: 1px solid var(--line);
    }

    .modal-actions .spacer {
      flex: 1 1 auto;
    }

    /* --- 实践页 --- */
    .practice-summary {
      display: flex;
      flex-wrap: wrap;
      gap: 10px 22px;
      background: var(--panel);
      border: 1px solid var(--line);
      border-radius: 8px;
      padding: 12px 16px;
      margin-bottom: 12px;
      font-size: 13px;
    }

    .practice-summary b {
      color: var(--accent);
      font-size: 15px;
    }

    td.pr-cell input {
      width: 100%;
      border: 1px solid transparent;
      background: transparent;
      border-radius: 4px;
      padding: 3px 5px;
      font: inherit;
      font-size: 13px;
      color: var(--text);
    }

    td.pr-cell input:hover {
      border-color: var(--line);
      background: #fff;
    }

    td.pr-cell input:focus {
      outline: 2px solid var(--focus);
      outline-offset: -1px;
      background: #fff;
    }

    .week-badge {
      display: inline-block;
      background: var(--accent-soft);
      color: var(--accent);
      border-radius: 4px;
      padding: 1px 7px;
      font-size: 12px;
      white-space: nowrap;
    }

    .week-badge.holiday {
      background: #fdf0d8;
      color: var(--amber);
    }

    /* ===================== 假日 / 调休 ===================== */
    details.sched-makeup {
      background: var(--panel);
      border: 1px solid var(--line);
      border-radius: 8px;
      margin-bottom: 12px;
    }

    details.sched-makeup > summary {
      cursor: pointer;
      padding: 10px 14px;
      font-weight: 600;
      font-size: 13px;
      display: flex;
      align-items: center;
      gap: 10px;
      flex-wrap: wrap;
    }

    /* 展开标记跟「导入课表」面板保持一致（flex 布局会吃掉默认三角） */
    details.sched-makeup > summary::-webkit-details-marker {
      display: none;
    }

    details.sched-makeup > summary::before {
      content: "\25B8";
      color: var(--muted);
      font-size: 12px;
    }

    details.sched-makeup[open] > summary::before {
      content: "\25BE";
    }

    details.sched-makeup > summary .hint {
      font-weight: 400;
      color: var(--muted);
      font-size: 12px;
    }

    .makeup-body {
      border-top: 1px solid var(--line);
      padding: 12px 14px;
    }

    .makeup-form {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
      gap: 10px 14px;
      margin-top: 12px;
      padding-top: 12px;
      border-top: 1px dashed var(--line);
    }

    .makeup-actions {
      grid-column: 1 / -1;
      display: flex;
      align-items: center;
      gap: 10px;
      flex-wrap: wrap;
    }

    .makeup-actions .note {
      font-size: 12px;
      color: var(--muted);
    }

    /* 假日/调休表单里的日期框：给足宽度，免得日历图标被挤掉 */
    .makeup-form input[type="date"] {
      min-width: 150px;
    }

    /* 编辑态：表单整体换个底色，跟「新增」区分开 */
    .makeup-form.editing {
      background: #f2f8ff;
      border: 1px solid #b9d5f2;
      border-radius: 8px;
      padding: 12px;
      margin-top: 12px;
    }

    .form-editing-tip {
      grid-column: 1 / -1;
      font-size: 12px;
      font-weight: 600;
      color: #14456f;
    }

    /* 列表里正在被编辑的那一行 */
    tr.row-editing > td {
      background: #f2f8ff;
      box-shadow: inset 2px 0 0 var(--blue, #2f6fb5);
    }

    /* 「编辑 / 删除」并排，挤在一列里 */
    td.row-ops {
      white-space: nowrap;
    }

    td.row-ops button {
      min-height: 26px;
      padding: 2px 8px;
    }

    td.row-ops button + button {
      margin-left: 6px;
    }

    /* 没填「第1周周一」时，面板里顶掉表单的那块提示 */
    .makeup-need-date {
      margin-top: 12px;
      padding: 12px 14px;
      border-top: 1px dashed var(--line);
      display: flex;
      align-items: center;
      gap: 10px;
      flex-wrap: wrap;
      font-size: 13px;
      color: var(--muted);
    }

    .makeup-need-date strong {
      color: var(--text);
    }

    /* 当周调休提示条 */
    .adjust-banner {
      background: #eef6ff;
      border: 1px solid #b9d5f2;
      color: #14456f;
      border-radius: 8px;
      padding: 9px 14px;
      margin-bottom: 10px;
      font-size: 13px;
      line-height: 1.6;
    }

    .adjust-banner.quiet {
      background: #fafbfc;
      border-color: var(--line);
      color: var(--muted);
    }

    /* 当周假日提示条 */
    .holiday-banner {
      background: #fff8e8;
      border: 1px solid #f0dcae;
      color: var(--amber);
      border-radius: 8px;
      padding: 9px 14px;
      margin-bottom: 10px;
      font-size: 13px;
      line-height: 1.6;
    }

    /* 表头上的调休标记 */
    .sched-grid th .th-adjust {
      margin-top: 2px;
      font-size: 10px;
      font-weight: 600;
      line-height: 1.3;
      border-radius: 3px;
      padding: 1px 3px;
      background: #e2eefb;
      color: #14456f;
    }

    .sched-grid th .th-adjust.out {
      background: #f1f3f5;
      color: var(--muted);
    }

    .sched-grid th .th-adjust.swap {
      background: #fdf0d8;
      color: var(--amber);
    }

    /* 假日那天的表头：比"课已调出"更显眼，一眼能认出是放假 */
    .sched-grid th .th-adjust.holiday {
      background: #fdf0d8;
      color: var(--amber);
      font-weight: 700;
    }

    .sched-grid th.day-off .th-day {
      color: var(--muted);
      text-decoration: line-through;
    }

    /* 放假那天的格子：画上斜纹，明确"这天不上课" */
    .sched-grid td.sched-cell.day-off {
      background-image: repeating-linear-gradient(135deg, rgba(0, 0, 0, 0.035) 0 6px, transparent 6px 12px);
      cursor: default;
    }

    .sched-grid td.sched-cell.day-off .cell-off {
      font-size: 11px;
      color: var(--muted);
      text-align: center;
      padding: 6px 0;
    }

    .sched-grid td.sched-cell.day-moved {
      background-color: #f7fbff;
    }

    .course-chip .chip-moved {
      margin-top: 2px;
      font-size: 10px;
      color: #14456f;
      background: #e2eefb;
      border-radius: 3px;
      padding: 0 3px;
      display: inline-block;
    }

    /* ===================== 只上一周（实验课等） ===================== */
    .sess-block .sess-single {
      display: flex;
      align-items: center;
      gap: 12px;
      flex-wrap: wrap;
      margin-top: 10px;
      padding-top: 9px;
      border-top: 1px dashed var(--line);
      font-size: 12px;
      color: var(--muted);
    }

    .sess-block .sess-single label {
      display: inline-flex;
      align-items: center;
      gap: 6px;
      cursor: pointer;
      color: var(--text);
    }

    .sess-block .sess-single input[type="checkbox"] {
      width: 15px;
      height: 15px;
      accent-color: var(--accent);
      cursor: pointer;
    }

    .field input:disabled,
    .field select:disabled {
      background: #f1f3f5;
      color: var(--muted);
      cursor: not-allowed;
    }
