
/* ═══ ① 视觉 token —— 紫白优雅风（含契约层 alias，整段复制） ═══ */
:root{
  --purple-800:#6D5FE0; --purple-600:#8B7CF6; --purple-400:#A8A0F2;
  --purple-200:#BFB5F2; --purple-100:#DDD8FA; --purple-light:#F0EEFD;
  --gold:#F5E6A8; --gold-light:#FBF3D4; --gold-soft:rgba(245,230,168,.20);
  --bg:#f3f1fc; --panel:#ffffff;
  --ink:#1a1a2e; --ink-soft:#4a4a6a; --muted:#8b8ba3;
  --line:#e6e3f5;
  --success:#10b981; --warning:#f59e0b; --danger:#ef4444;
  --shadow-sm:0 2px 8px rgba(139,124,246,.08);
  --shadow-md:0 6px 24px rgba(139,124,246,.12);
  --shadow-lg:0 12px 40px rgba(139,124,246,.14);
  --radius:14px; --radius-sm:8px; --radius-xs:6px;
  /* 契约层 alias（组件依赖，不可删） */
  --brand:var(--purple-600); --brand-strong:var(--purple-800); --brand-soft:var(--purple-light);
  --success-soft:#d1fae5; --warning-soft:#fef3c7; --danger-soft:#fee2e2;
  --panel2:var(--panel); --line2:var(--line);
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{font-family:-apple-system,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  background:var(--bg);color:var(--ink-soft);font-size:14px;line-height:1.55}

/* ═══ ② 布局 ═══ */
.app{display:flex;min-height:100vh}
.sidebar{width:228px;flex:none;overflow:hidden;
  background:linear-gradient(180deg,var(--purple-800),var(--purple-600) 55%,var(--purple-400));
  display:flex;flex-direction:column;position:sticky;top:0;height:100vh}
.nav-scroll{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;padding:10px 0 4px;
  -webkit-overflow-scrolling:touch;scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.45) transparent}
.nav-scroll::-webkit-scrollbar{width:6px}
.nav-scroll::-webkit-scrollbar-track{background:transparent}
.nav-scroll::-webkit-scrollbar-thumb{background:rgba(255,255,255,.40);border-radius:3px}
.nav-scroll::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.60)}
.topbar{height:64px;background:var(--panel);border-bottom:1px solid var(--line);display:flex;
  align-items:center;justify-content:space-between;padding:0 24px;position:sticky;top:0;z-index:20;gap:12px}
.content{flex:1;padding:24px 28px;max-width:1320px;min-width:0}

/* ═══ ③ 侧栏 ═══ */
.brand{height:76px;display:flex;align-items:center;gap:10px;padding:0 20px;border-bottom:1px solid rgba(255,255,255,.18)}
.brand .logo{width:36px;height:36px;border-radius:10px;background:rgba(255,255,255,.20);flex:none;
  display:flex;align-items:center;justify-content:center}
.brand .logo svg{width:20px;height:20px;stroke:#fff;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.brand .name{font-size:14px;font-weight:800;color:#fff;line-height:1.2}
.brand .sub{font-size:11px;color:rgba(255,255,255,.72)}
.nav-group-label{padding:14px 20px 6px;font-size:11px;font-weight:700;color:rgba(255,255,255,.55);letter-spacing:.08em}
.nav-item{display:flex;align-items:center;gap:10px;margin:2px 12px;padding:10px 12px;
  border-radius:12px;font-size:13.5px;color:rgba(255,255,255,.88);cursor:pointer;user-select:none}
.nav-item svg{width:18px;height:18px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex:none}
.nav-item:hover{background:rgba(255,255,255,.14)}
.nav-item.active{background:rgba(255,255,255,.96);color:var(--purple-800);font-weight:700}
.sidebar-foot{margin-top:auto;padding:14px 20px;font-size:11px;color:rgba(255,255,255,.6);line-height:1.5}

/* ═══ ④ 顶栏 ═══ */
.tb-left{display:flex;align-items:center;gap:12px;min-width:0}
.tb-title{font-size:18px;font-weight:800;color:var(--ink);white-space:nowrap}
.tb-week{font-size:12px;color:var(--muted);white-space:nowrap}
.tb-right{display:flex;align-items:center;gap:10px;flex:none}
.save-status{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:700;padding:6px 12px;border-radius:999px}
.save-status .dot{width:8px;height:8px;border-radius:50%;flex:none}
.s-unsaved{background:var(--danger-soft);color:var(--danger)} .s-unsaved .dot{background:var(--danger)}
.s-saving{background:var(--warning-soft);color:#B45309} .s-saving .dot{background:var(--warning)}
.s-saved{background:var(--success-soft);color:var(--success)} .s-saved .dot{background:var(--success)}
.store-chip{font-size:11px;font-weight:700;padding:5px 10px;border-radius:999px;border:1px solid var(--line);color:var(--muted);background:var(--soft);white-space:nowrap}
.store-chip.ok{color:var(--success);border-color:#BBF7D0;background:var(--success-soft)}
.store-chip.warn{color:#B45309;border-color:#FDE68A;background:var(--warning-soft)}
.store-chip.bad{color:var(--danger);border-color:#FECACA;background:var(--danger-soft)}
.store-warn{display:flex;gap:10px;align-items:flex-start;margin:0 0 14px;padding:12px 14px;border-radius:12px;
  background:var(--warning-soft);border:1px solid #FDE68A;color:#92400E;font-size:13px;line-height:1.7}
.store-warn b{color:#B45309}
.toast-box{position:fixed;right:18px;bottom:18px;z-index:9999;display:flex;flex-direction:column;gap:10px;max-width:min(88vw,360px)}
.toast{padding:12px 14px;border-radius:12px;background:#111827;color:#fff;font-size:13px;line-height:1.6;
  box-shadow:0 10px 30px rgba(17,24,39,.25);opacity:0;transform:translateY(8px);transition:.25s}
.toast.in{opacity:1;transform:none}
.toast.out{opacity:0;transform:translateY(6px)}
.toast.ok{background:#065F46}
.toast.bad{background:#991B1B}
@media (max-width:768px){ .store-chip{display:none} }
.btn{height:38px;padding:0 14px;border-radius:10px;font-weight:700;font-size:13px;
  border:1px solid var(--line);background:var(--panel);color:var(--ink-soft);cursor:pointer;
  display:inline-flex;align-items:center;gap:6px;white-space:nowrap;
  transition:transform .12s ease, background .18s ease, border-color .18s ease, color .18s ease, box-shadow .18s ease}
.btn:hover{border-color:var(--brand);color:var(--brand);box-shadow:0 2px 8px rgba(109,95,224,.15)}
.btn:active{transform:scale(.97)}
.btn-primary{background:linear-gradient(135deg,var(--purple-600),var(--purple-400));color:#fff;border:0}
.btn-primary:hover{background:linear-gradient(135deg,var(--purple-800),var(--purple-600));color:#fff;box-shadow:0 4px 14px rgba(109,95,224,.35)}
.btn svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.menu-btn{display:none;width:38px;height:38px;border:1px solid var(--line);border-radius:10px;
  background:var(--panel);align-items:center;justify-content:center;cursor:pointer;margin-right:10px;flex:none}
.menu-btn svg{width:18px;height:18px;stroke:var(--ink-soft);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}

/* ═══ ⑤ 卡片与统计卡 ═══ */
.banner{background:linear-gradient(135deg,var(--purple-400),var(--purple-200) 55%,var(--purple-light));
  border-radius:18px;padding:22px 26px;margin-bottom:18px;color:#2D2A5E;position:relative;overflow:hidden}
.banner h1{margin:0;font-size:24px;font-weight:800;letter-spacing:.5px}
.banner .rule{width:60px;height:2px;background:var(--gold);margin:10px 0}
.banner .sub{font-size:13px;color:#4a4a6a;display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap}
.banner .sub .motto{flex:0 0 auto;max-width:48%;text-align:right;font-weight:700;color:var(--purple-800);font-size:14px;line-height:1.45;background:rgba(255,255,255,.45);padding:6px 12px;border-radius:10px;border:1px solid rgba(109,95,224,.18)}
.banner .cd{position:absolute;right:26px;top:22px;text-align:right}
.banner .cd .n{font-size:34px;font-weight:800;color:#6D5FE0;line-height:1}
.banner .cd .t{font-size:12px;color:#4a4a6a}
@media (max-width:560px){
  .banner .sub .motto{max-width:100%;text-align:left;font-size:13px;padding:5px 10px}
}
.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-sm);padding:18px 20px;transition:box-shadow .2s, border-color .2s}
.card:hover{box-shadow:var(--shadow);border-color:#E5E0F5}
.card-title{font-size:15px;font-weight:800;color:var(--ink);margin:0 0 14px;display:flex;align-items:center;gap:8px;justify-content:space-between}
.card-title .left{display:flex;align-items:center;gap:8px}
.card-title svg{width:20px;height:20px;stroke:var(--brand);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.card-title .act{font-size:12.5px;font-weight:700;color:var(--brand);cursor:pointer;display:inline-flex;align-items:center;gap:4px;transition:color .15s}
.card-title .act:hover{text-decoration:underline;color:var(--purple-800)}
/* 表格内的操作按钮组：详情/编辑/删除 - 不可点的"链接"升级为可点的胶囊按钮 */
.row-act{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.row-act .btn-act{
  appearance:none;border:1px solid var(--line);background:var(--panel);
  color:var(--ink-soft);font-size:12px;font-weight:600;
  padding:6px 10px;border-radius:8px;cursor:pointer;line-height:1;
  display:inline-flex;align-items:center;gap:4px;
  transition:transform .12s ease, background .18s, border-color .18s, color .18s;
  min-height:28px;
}
.row-act .btn-act:hover{background:#F5F3FE;border-color:var(--brand);color:var(--brand)}
.row-act .btn-act:active{transform:scale(.95)}
.row-act .btn-act.detail{color:var(--brand);border-color:#DCD7F5;background:#F5F3FE}
.row-act .btn-act.detail:hover{background:#ECE8FA;border-color:var(--brand)}
.row-act .btn-act.edit{color:#6D5FE0;border-color:#DCD7F5;background:#F5F3FE}
.row-act .btn-act.edit:hover{background:#ECE8FA;border-color:#6D5FE0}
.row-act .btn-act.del{color:var(--danger);border-color:#FCD9D9;background:#FFF5F5}
.row-act .btn-act.del:hover{background:#FFECEC;border-color:var(--danger)}
.grid{display:grid;gap:16px}
.grid-4{grid-template-columns:repeat(4,1fr)}
.grid-3{grid-template-columns:repeat(3,1fr)}
.grid-2{grid-template-columns:repeat(2,1fr)}
/* 家校沟通 Tab */
.comm-tabs{display:flex;gap:6px;margin-bottom:14px;padding:6px;background:#E8E3FA;border-radius:12px;width:fit-content}
.comm-tab{padding:9px 20px;font-size:14px;font-weight:700;color:var(--muted);cursor:pointer;border-radius:8px;transition:background .18s,color .18s,transform .12s;user-select:none}
.comm-tab:hover{color:var(--purple-800)}
.comm-tab:active{transform:scale(.97)}
.comm-tab.active{background:linear-gradient(135deg,var(--purple-600),var(--purple-400));color:#fff;box-shadow:0 4px 12px rgba(109,95,224,.3)}
/* 家委通知列表 */
.notice-list{display:flex;flex-direction:column;gap:10px;margin-top:8px}
.notice-item{background:#FBFAFF;border:1px solid var(--line);border-radius:12px;padding:12px 14px;transition:box-shadow .18s, border-color .18s}
.notice-item:hover{box-shadow:var(--shadow-sm);border-color:#E5E0F5}
.notice-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}
.notice-date{font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums}
.notice-tag{font-size:11px;padding:2px 8px;border-radius:6px;font-weight:700}
.notice-tag.hi{background:#FEE2E2;color:#991B1B}
.notice-tag.mid{background:#FEF3C7;color:#92400E}
.notice-tag.lo{background:#E0E7FF;color:#3730A3}
.notice-title{font-weight:700;color:var(--ink);font-size:14.5px;flex:1}
.notice-body{color:var(--ink-soft);font-size:13px;line-height:1.6;margin-bottom:6px;white-space:pre-wrap}
.notice-foot{display:flex;justify-content:space-between;align-items:center;font-size:12px}
.comm-section{margin-top:14px}
.comm-section-title{display:flex;justify-content:space-between;align-items:center;font-weight:700;color:var(--ink);margin:0 0 8px;font-size:14.5px}
.comm-viewall-ft{margin-top:10px;display:flex;justify-content:center}
.comm-viewall-hint{font-size:12px;margin-bottom:8px;text-align:right}
.comm-viewall .table{max-width:100%;font-size:12.5px}
.pager{display:flex;align-items:center;justify-content:center;gap:12px;margin-top:12px;flex-wrap:wrap}
.pager-info{font-size:12.5px;color:var(--muted)}
.btn-mini:disabled{opacity:.4;cursor:not-allowed;background:#fff}
.btn-mini:disabled:hover{background:#fff}
.stat-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-sm);padding:16px 18px}
.stat-card .label{font-size:12px;color:var(--muted);display:flex;align-items:center;justify-content:space-between;gap:8px}
.stat-card .ic{width:36px;height:36px;border-radius:10px;background:var(--brand-soft);flex:none;display:flex;align-items:center;justify-content:center}
.stat-card .ic svg{width:18px;height:18px;stroke:var(--brand);fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.stat-card .num{font-size:30px;font-weight:900;color:var(--ink);line-height:1.1;margin-top:10px;font-variant-numeric:tabular-nums}
.stat-card .sub{font-size:12px;color:var(--muted);margin-top:4px}

/* ═══ ⑥ 表格 / 标签 / 分段 / 进度 / 待办 / 空状态 / 示例横幅 ═══ */
.table{width:100%;border-collapse:collapse;font-size:13px}
.table th{background:#F5F3FE;color:var(--muted);font-weight:700;font-size:12px;text-align:left;padding:10px 12px;border-bottom:1px solid var(--line)}
.table td{padding:8px 12px;border-top:1px solid var(--line);color:var(--ink-soft);vertical-align:middle}
.table tbody tr:hover{background:var(--brand-soft)}
.table .num{text-align:right;font-variant-numeric:tabular-nums}
/* 列表字段统一横向展示（不折行），仅 .wrap 单元格保留原文换行格式 */
.table th,.table td{white-space:nowrap}
.table td.wrap{white-space:pre-wrap;min-width:220px;max-width:420px;line-height:1.5}
.table-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:var(--radius-sm)}
/* 学习情况作业表：紧凑型 */
.lm-compact .table th{padding:6px 10px;font-size:11.5px}
.lm-compact .table td{padding:6px 10px;font-size:12.5px;line-height:1.35}
.lm-compact .rich-html{line-height:1.4;font-size:12.5px}
.lm-compact .rich-html p{margin:0 0 2px}
.lm-compact .thumb-grid{gap:4px}
.lm-compact .thumb{width:38px;height:38px}
.tag{display:inline-flex;align-items:center;padding:3px 10px;border-radius:999px;font-size:11.5px;font-weight:700;white-space:nowrap}
/* 富文本内容渲染：保留粘贴/录入时的换行与排版 */
.rich-html{white-space:normal;line-height:1.65;word-break:break-word}
.rich-html p{margin:0 0 4px}
.rich-html p:last-child{margin-bottom:0}
.rich-html ul,.rich-html ol{margin:2px 0;padding-left:20px}
.rich-html b,.rich-html strong{font-weight:800;color:var(--ink)}
.rich-html u{text-decoration:underline}
/* 富文本编辑器 */
.rt-box{grid-column:1/-1;border:1px solid var(--line);border-radius:var(--radius-sm);overflow:hidden;background:#fff}
.rt-toolbar{display:flex;flex-wrap:wrap;gap:4px;padding:6px 8px;background:#F5F3FE;border-bottom:1px solid var(--line)}
.rt-btn{font-family:inherit;font-size:12px;min-width:30px;height:28px;padding:0 8px;border:1px solid #DCD7F5;background:#fff;
  color:var(--purple-800);border-radius:6px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;transition:.12s}
.rt-btn:hover{background:#ECE8FA;border-color:var(--brand)}
/* 练习批改结果汇总条 */
.practice-summary{display:inline-block;padding:6px 14px;border-radius:999px;font-weight:700;font-size:13px;margin-bottom:10px;background:#F5F3FE;color:var(--muted)}

/* ═══ 筛选条件：左右排版（标签左 / 输入框右，参照 DatePicker 样式） ═══ */
.filter-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:12px;margin-top:8px;padding:14px;background:#fbfaff;border:1px solid var(--line);border-radius:12px;box-shadow:0 2px 10px rgba(80,60,150,.05)}
.filter-cell{flex:1 1 220px;display:flex;flex-direction:row;align-items:center;gap:10px;min-width:0;position:relative}
.filter-reset{margin-left:auto;align-self:flex-end;flex:none;padding-bottom:2px}
.filter-cell .filter-label{flex:none;width:72px;font-size:13px;color:var(--ink);font-weight:600;text-align:right;letter-spacing:.2px}
.filter-cell .dd-trigger{width:auto;flex:1;min-width:0}
.dd-trigger{position:relative;display:flex;align-items:center;justify-content:space-between;height:40px;padding:0 12px;border:1px solid var(--line);border-radius:10px;background:#fff;color:var(--ink);font:inherit;font-size:14px;cursor:pointer;transition:border-color .15s,box-shadow .15s;min-width:0;width:100%}
.dd-trigger:hover{border-color:var(--brand)}
.dd-trigger.open{border-color:var(--brand);box-shadow:0 0 0 3px rgba(109,95,224,.15)}
.dd-trigger .dd-text{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ink)}
.dd-trigger .dd-text.placeholder{color:var(--muted)}
.dd-trigger .dd-arrow{flex:none;margin-left:8px;width:14px;height:14px;stroke:var(--muted);fill:none;stroke-width:2;transition:transform .18s}
.dd-trigger.open .dd-arrow{transform:rotate(180deg)}
.dd-panel{position:absolute;top:calc(100% + 6px);left:0;right:0;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 12px 32px rgba(80,60,150,.18);padding:6px;z-index:50;max-height:280px;overflow-y:auto;animation:ddIn .14s ease-out}
@keyframes ddIn{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}
.dd-item{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:8px;cursor:pointer;font-size:14px;color:var(--ink);transition:background .12s;min-width:0}
.dd-item:hover{background:#F5F2FE}
.dd-item.on{background:#EDE7FF;color:var(--purple-800);font-weight:700}
.dd-item .dd-check{flex:none;width:14px;height:14px;stroke:var(--brand);fill:none;stroke-width:3;opacity:0}
.dd-item.on .dd-check{opacity:1}
.dd-item .dd-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 日期选择器面板 */
.dp-panel{position:absolute;top:calc(100% + 6px);left:0;background:#fff;border:1px solid var(--line);border-radius:12px;box-shadow:0 12px 32px rgba(80,60,150,.18);padding:12px;z-index:50;animation:ddIn .14s ease-out}
.dp-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px;color:var(--ink);font-weight:700;font-size:14px}
.dp-nav{display:flex;gap:4px}
.dp-nav button{width:26px;height:26px;border:0;background:transparent;color:var(--muted);border-radius:6px;cursor:pointer;font-size:14px;transition:.12s}
.dp-nav button:hover{background:#F5F2FE;color:var(--purple-800)}
.dp-week{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;font-size:12px;color:var(--muted);text-align:center;padding:4px 0;margin-bottom:4px}
.dp-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.dp-cell{height:34px;display:flex;align-items:center;justify-content:center;font-size:13px;color:var(--ink);border-radius:8px;cursor:pointer;transition:.12s}
.dp-cell:hover{background:#F5F2FE}
.dp-cell.muted{color:#CCC;cursor:default}
.dp-cell.muted:hover{background:transparent}
.dp-cell.today{font-weight:800;color:var(--brand)}
.dp-cell.on{background:var(--brand);color:#fff;font-weight:800}
.dp-cell.on:hover{background:var(--purple-800)}
.dp-quick{margin-top:8px;display:flex;gap:6px;flex-wrap:wrap;padding-top:8px;border-top:1px solid var(--line)}
.dp-quick button{font-family:inherit;font-size:12px;padding:4px 10px;border:1px solid var(--line);background:#fff;color:var(--ink-soft);border-radius:6px;cursor:pointer;transition:.12s}
.dp-quick button:hover{background:var(--brand-soft);border-color:var(--brand);color:var(--brand)}

/* ═══ AI 助手对话界面 ═══ */
/* 整卡自适应视口：默认浏览器大小下页面不出现滚动条，仅消息区内部滚动。
   上方占用 = 顶栏 64px + 内容区上下内边距 24px×2 = 112px。 */
.card.ai-card{display:flex;flex-direction:column;height:calc(100vh - 112px);min-height:400px;padding:16px 20px}
.card.ai-card .ai-chat{flex:1 1 auto;min-height:0;max-height:none}
.card.ai-card .ai-quick{flex:none;margin:10px 0 8px}
.card.ai-card .ai-input-row{flex:none;margin-top:8px}
.card.ai-card .ai-input-row .ai-input{min-height:56px;max-height:110px}
.card.ai-card #aiModelTip{flex:none;margin:6px 0 0}
.ai-chat{background:#FAFAFE;border:1px solid var(--line);border-radius:12px;padding:12px;min-height:240px;max-height:420px;overflow-y:auto;display:flex;flex-direction:column;gap:10px}
.ai-empty{color:var(--muted);font-size:13px;text-align:center;padding:60px 0}
.ai-msg{display:flex;flex-direction:column;max-width:78%;animation:aiIn .2s ease-out}
@keyframes aiIn{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}
.ai-msg.user{align-self:flex-end;align-items:flex-end}
.ai-msg.ai{align-self:flex-start;align-items:flex-start}
.ai-bubble{padding:10px 12px;border-radius:14px;font-size:13.5px;line-height:1.6;white-space:pre-wrap;word-break:break-word}
.ai-msg.user .ai-bubble{background:linear-gradient(135deg,var(--purple-600),var(--purple-400));color:#fff;border-bottom-right-radius:4px}
.ai-msg.ai .ai-bubble{background:#fff;color:var(--ink);border:1px solid var(--line);border-bottom-left-radius:4px;box-shadow:var(--shadow-sm)}
.ai-msg.thinking .ai-bubble{color:var(--muted);font-style:italic}
.ai-msg.thinking .ai-bubble::after{content:'';display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--muted);margin-left:4px;animation:dotPulse 1.2s infinite}
@keyframes dotPulse{0%,100%{opacity:.2}50%{opacity:1}}
.ai-meta{font-size:11px;color:var(--muted);margin-top:3px;padding:0 4px}
.ai-input-row{display:flex;gap:8px;align-items:flex-end;margin-top:10px}
.ai-input-row .ai-input{flex:1;min-height:60px;max-height:140px;resize:vertical;border-radius:12px;border:1px solid var(--line);padding:10px 12px;font:inherit;font-size:14px;color:var(--ink);background:#fff;transition:border-color .15s}
.ai-input-row .ai-input:focus{outline:0;border-color:var(--brand);box-shadow:0 0 0 3px rgba(109,95,224,.15)}
.ai-send{flex:none;height:60px;padding:0 22px;font-weight:700;border-radius:12px}
.ai-quick{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0}
.ai-quick-btn{font-family:inherit;font-size:12.5px;padding:6px 12px;border:1px solid var(--line);background:#fff;color:var(--ink-soft);border-radius:16px;cursor:pointer;transition:.15s}
.ai-quick-btn:hover{background:var(--brand-soft);border-color:var(--brand);color:var(--purple-800)}

/* ═══ 社团管理 ═══ */
.club-tabs{display:flex;gap:6px;margin-bottom:14px;padding:6px;background:#E8E3FA;border-radius:12px;width:fit-content}
.club-tab{padding:9px 20px;font-size:14px;font-weight:700;color:var(--muted);cursor:pointer;border-radius:8px;transition:background .18s,color .18s,transform .12s;user-select:none}
.club-tab:hover{color:var(--purple-800)}
.club-tab:active{transform:scale(.97)}
.club-tab.active{background:linear-gradient(135deg,var(--purple-600),var(--purple-400));color:#fff;box-shadow:0 4px 12px rgba(109,95,224,.3)}
.club-section{margin-top:14px}
.club-section-title{font-weight:700;color:var(--ink);font-size:14.5px;margin:0 0 10px;display:flex;align-items:center;gap:6px}
.club-card{background:#FBFAFF;border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:10px}
.club-name{font-weight:700;color:var(--ink);font-size:15px;margin-bottom:6px}
.club-meta{font-size:12px;color:var(--muted);margin-bottom:8px}
.club-table{width:100%;border-collapse:collapse;font-size:12.5px}
.club-table th,.club-table td{padding:8px 10px;border-bottom:1px solid var(--line);text-align:center}
.club-table th{background:#F5F3FE;color:var(--muted);font-weight:700;font-size:11.5px}
.club-table td.today-cell{background:var(--brand-soft);font-weight:700;color:var(--purple-800);border-radius:6px}
.club-train-list td{min-width:88px;vertical-align:middle}
.club-train-list td.ta-center{text-align:center;white-space:nowrap}
/* 2.0 需求 #17（TASK-023）：社团表格表头/内容/操作按钮统一居中 */
.club-train-list td.ta-content{text-align:center;min-width:160px;max-width:360px}
.club-train-list td.ta-content :where(b,strong){color:var(--purple-800)}
.club-train-list td.ta-acts{white-space:nowrap;text-align:center}
.club-train-list td .row-act{justify-content:center}
.club-train-list .empty-td{color:var(--muted);padding:18px 10px;font-size:13px}
.club-section-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 0 10px;flex-wrap:wrap}
.club-train-table td{vertical-align:top;min-width:120px;height:74px}
.cs-cell{position:relative;padding:6px 20px 6px 6px;text-align:left;font-size:12.5px;line-height:1.5;color:var(--ink);min-height:54px}
.cs-content{cursor:pointer;border-radius:6px;padding:4px 6px;transition:background .15s}
.cs-content:hover{background:#F1EEFC}
.cs-del{position:absolute;top:3px;right:3px;width:18px;height:18px;line-height:16px;text-align:center;border:none;background:#F2EFFB;color:var(--muted);border-radius:50%;cursor:pointer;font-size:13px;opacity:.55;transition:.15s}
.cs-del:hover{background:#FBE3E3;color:#E05C5C;opacity:1}
.cs-add{width:100%;border:1px dashed var(--line);background:transparent;color:var(--muted);font-size:12px;padding:8px;border-radius:8px;cursor:pointer;transition:.15s}
.cs-add:hover{border-color:var(--purple-400);color:var(--purple-600);background:#F7F5FF}
.cs-rowdel{display:inline-block;margin-left:6px;width:16px;height:16px;line-height:14px;text-align:center;border-radius:50%;background:#F2EFFB;color:var(--muted);font-size:11px;cursor:pointer;opacity:.5;vertical-align:middle}
.cs-rowdel:hover{background:#FBE3E3;color:#E05C5C;opacity:1}
/* 社团练习情况列表 */
.prac-item{display:flex;gap:12px;align-items:flex-start;padding:12px 4px;border-bottom:1px dashed var(--line)}
.prac-item:last-child{border-bottom:0}
.prac-date{flex:0 0 auto;min-width:84px;font-weight:700;color:var(--purple-700);font-size:13px;background:#F5F3FE;border-radius:8px;padding:6px 8px;text-align:center}
.prac-main{flex:1;min-width:0}
.prac-content{font-size:13px;line-height:1.6;color:var(--ink)}
.prac-content :where(b,strong){color:var(--purple-800)}
.prac-atts{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
.prac-thumb{width:48px;height:48px;border-radius:8px;object-fit:cover;border:1px solid var(--border-soft);cursor:pointer}
.prac-thumb-file{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;background:#F2EFFB;border-radius:8px;font-size:13px;color:var(--purple-600);cursor:default}
.prac-acts{display:flex;flex-direction:row;flex-wrap:wrap;gap:6px;flex:0 0 auto;justify-content:flex-end}
.btn-mini{border:1px solid var(--line);background:#fff;color:var(--purple-700);font-size:12px;padding:5px 12px;border-radius:8px;cursor:pointer;transition:.15s;white-space:nowrap}
.btn-mini:hover{background:#F5F3FE}
.btn-mini-del{color:#E05C5C;border-color:#F3D2D2}
.btn-mini-del:hover{background:#FBE9E9}
.btn-sm{padding:6px 14px;font-size:12.5px}
/* 练习详情预览 */
.dp-wrap{padding:4px 2px}
.dp-meta{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.dp-date{font-weight:700;color:var(--purple-700);font-size:14px}
.dp-tab{font-size:12px;color:#fff;background:linear-gradient(135deg,var(--purple-600),var(--purple-400));padding:3px 10px;border-radius:20px}
.dp-content{font-size:14px;line-height:1.7;color:var(--ink);margin-bottom:14px}
.dp-content :where(b,strong){color:var(--purple-800)}
.dp-att-title{font-size:13px;font-weight:700;color:var(--muted);margin-bottom:8px}
.prac-prev-thumb{display:inline-flex;flex-direction:column;align-items:center;gap:4px;max-width:120px}
.prac-prev-thumb img{width:110px;height:110px;border-radius:8px;object-fit:cover;cursor:pointer;border:1px solid var(--border-soft)}
.prac-prev-pdf{display:flex;flex-direction:column;gap:6px;max-width:340px}
.club-practice-row{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px dashed var(--line)}
.club-practice-row:last-child{border-bottom:0}
.club-practice-name{flex:1;color:var(--ink);font-size:13px}
.club-practice-bar{flex:2;height:8px;background:#F0EEFA;border-radius:4px;overflow:hidden}
.club-practice-bar i{display:block;height:100%;background:linear-gradient(90deg,var(--purple-600),var(--purple-400));border-radius:4px;transition:width .3s}
.club-practice-pct{flex:none;width:46px;text-align:right;font-variant-numeric:tabular-nums;font-weight:700;color:var(--purple-800);font-size:12.5px}
.practice-summary.all-ok{background:#DCFCE7;color:#166534}
.practice-summary.partial{background:#FEF3C7;color:#92400E}
.practice-summary.all-no{background:#FEE2E2;color:#991B1B}
.rt-btn:active{transform:scale(.94)}
.rt-btn[data-cmd="bold"]{font-weight:800}
.rt-btn[data-cmd="italic"]{font-style:italic}
.rt-btn[data-cmd="underline"]{text-decoration:underline}
.rt-editor{min-height:96px;max-height:260px;overflow-y:auto;padding:10px 12px;font-size:14px;line-height:1.7;
  color:var(--ink);outline:none;white-space:pre-wrap;word-break:break-word}
.rt-editor:focus{background:#FDFCFF}
.rt-editor:empty:before{content:attr(data-placeholder);color:var(--muted)}
.rt-editor ul,.rt-editor ol{margin:4px 0;padding-left:22px}
.rt-editor p{margin:0 0 4px}
.t-gray{background:#F1F5F9;color:#64748B} .t-blue{background:var(--brand-soft);color:var(--brand)}
.t-green{background:var(--success-soft);color:var(--success)} .t-amber{background:var(--warning-soft);color:#B45309}
.t-red{background:var(--danger-soft);color:var(--danger)} .t-purple{background:#F5F3FE;color:var(--purple-800)}
.seg{display:inline-flex;border:1px solid var(--line);border-radius:var(--radius-sm);overflow:hidden}
.seg .opt{border:0;background:var(--panel);color:var(--ink-soft);padding:4px 10px;font-size:12px;cursor:pointer}
.seg .opt.active{background:var(--brand);color:#fff;font-weight:700}
.bar{height:8px;border-radius:999px;background:#EEF2F7;overflow:hidden}
.bar>span{display:block;height:100%;background:var(--brand);border-radius:999px}
.today-list{display:flex;flex-direction:column;gap:10px}
.today-item{display:flex;align-items:center;gap:12px;padding:10px 12px;border:1px solid var(--line);border-radius:12px}
.today-item .pin{width:8px;height:8px;border-radius:50%;background:var(--brand);flex:none}
.today-item .pin.warn{background:var(--warning)} .today-item .pin.danger{background:var(--danger)}
.empty{text-align:center;color:var(--muted);padding:40px 20px;font-size:13px}
.empty h4{margin:0 0 6px;color:var(--ink);font-size:15px}
.empty svg{width:40px;height:40px;stroke:var(--line);fill:none;stroke-width:1.5;margin-bottom:10px}
.sample-banner{background:var(--warning-soft);border:1px solid #FDE68A;color:#92400E;font-size:12.5px;
  padding:10px 14px;border-radius:12px;margin-bottom:18px;display:flex;align-items:center;gap:8px}
.sample-banner svg{width:16px;height:16px;stroke:#B45309;fill:none;stroke-width:2;flex:none}
.notice{background:var(--brand-soft);border:1px solid var(--line);color:var(--ink-soft);font-size:12.5px;
  padding:10px 14px;border-radius:12px;margin-bottom:18px;display:flex;align-items:center;gap:8px}
.privacy{background:#F5F3FE;border:1px dashed var(--purple-200);color:#4a4a6a;font-size:12.5px;
  padding:12px 14px;border-radius:12px;margin-bottom:16px;display:flex;gap:8px;align-items:flex-start}
.privacy svg{width:18px;height:18px;stroke:var(--purple-600);fill:none;stroke-width:2;flex:none;margin-top:1px}
.roster-tabs{display:flex;gap:10px;margin-bottom:16px}
.roster-tab{font-size:14px;padding:8px 18px;border-radius:20px;border:1px solid var(--line);background:#fff;color:var(--ink-soft);cursor:pointer;transition:.15s}
.roster-tab.active{background:var(--purple-800);color:#fff;border-color:var(--purple-800);font-weight:700}
.roster-count{font-size:12.5px;color:var(--muted);margin-left:auto;align-self:center}
.roster-note{display:inline-block;max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--muted);cursor:pointer;padding:2px 8px;border-radius:6px;background:#f7f7fb;vertical-align:middle}
.roster-note:hover{background:var(--brand-soft);color:var(--brand)}
.roster-note.empty{color:#aaa;background:#f7f7fb}
.roster-note.empty:hover{background:var(--brand-soft);color:var(--brand)}
.resource-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14px}
.res{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px}
.res .cat{font-size:11px;font-weight:700;color:var(--brand);margin-bottom:6px}
.res h4{margin:0 0 4px;font-size:14px;color:var(--ink)}
.res p{margin:0;font-size:12.5px;color:var(--muted)}

/* ═══ ⑦ 表单与模态框 ═══ */
.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:14px}
.form-grid label{display:flex;flex-direction:column;gap:5px;font-size:12px;color:var(--muted);font-weight:600}
.form-grid input,.form-grid select,.form-grid textarea{padding:9px 11px;border:1px solid var(--line);
  border-radius:10px;font-size:13px;color:var(--ink-soft);font-family:inherit;background:#fff}
.form-grid textarea{min-height:64px;resize:vertical}
.modal-mask{position:fixed;inset:0;background:rgba(26,26,46,.0);display:flex;align-items:center;justify-content:center;z-index:100;padding:20px;
  transition:background .22s ease}
.modal-mask:not(.hidden){background:rgba(26,26,46,.35)}
.modal-mask:not(.hidden) .modal{animation:modalIn .22s cubic-bezier(.2,.7,.3,1.1)}
.modal{background:#fff;border-radius:16px;width:min(560px,100%);max-height:88vh;overflow:auto;padding:22px 24px;box-shadow:var(--shadow-lg)}
.modal h3{margin:0 0 14px;font-size:17px;color:var(--ink)}
.modal .close{float:right;cursor:pointer;color:var(--muted);border:none;background:none;font-size:20px;line-height:1;
  width:30px;height:30px;border-radius:8px;transition:background .15s}
.modal .close:hover{background:var(--brand-soft);color:var(--brand)}
@keyframes modalIn{from{opacity:0;transform:translateY(8px) scale(.96)}to{opacity:1;transform:none}}
.hidden{display:none!important}
.muted{color:var(--muted)}
.section-gap{margin-top:16px}
.row{display:flex;gap:16px;align-items:flex-start}

/* ═══ ⑧ 窄屏抽屉 ═══ */
.scrim{display:none;position:fixed;inset:0;z-index:55;background:rgba(26,26,46,.38);opacity:0;pointer-events:none;transition:opacity .2s}
.scrim.show{opacity:1;pointer-events:auto}
@media (max-width:900px){
  .scrim{display:block}
  .sidebar{position:fixed;left:0;top:0;z-index:60;transform:translateX(-100%);transition:transform .2s;box-shadow:0 0 40px rgba(26,26,46,.18)}
  .sidebar.open{transform:translateX(0)}
  .menu-btn{display:inline-flex!important}
  .content{padding:16px}
  .grid-4{grid-template-columns:repeat(2,1fr)}
  .grid-3{grid-template-columns:repeat(2,1fr)}
  .grid-2,.resource-grid,.row{grid-template-columns:1fr;flex-direction:column}
  .topbar{padding:0 16px;gap:8px}
  .tb-week{display:none}
  .tb-right .btn span{display:none}
  .tb-right .btn{padding:0 10px}
}
@media (max-width:560px){ .grid-4{grid-template-columns:1fr} .tb-title{font-size:16px} }

/* ═══ ⑨ 打印 ═══ */
@media print{
  .sidebar,.topbar,.save-status,.btn,.menu-btn,.scrim,.sample-banner,.notice,.privacy,.seg .opt:not(.active){display:none!important}
  body{background:#fff}
  .app{display:block}
  .content{max-width:none;padding:0}
  .card,.stat-card{box-shadow:none;border:1px solid #ddd;break-inside:avoid}
  .seg{border:0}
  .seg .opt.active{background:transparent;color:#000;font-weight:700}
}

/* ═══ 课程表新布局：大色块 + 课间休息行 ═══ */
.tt-head-col{line-height:1.35}
.tt-head-sub{font-size:11px;color:var(--muted);font-weight:500}
.tt-row-head{text-align:left;line-height:1.35;min-width:84px}
.tt-no{font-size:13px;font-weight:700;color:var(--ink)}
.tt-range{font-size:11px;color:var(--muted);font-weight:500}
.tt-table{border-collapse:separate;border-spacing:6px 4px;width:100%;table-layout:fixed}
.tt-table th,.tt-table td{text-align:center;vertical-align:middle;padding:0;background:transparent}
.tt-cell{
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;
  padding:8px 10px;border-radius:14px;
  height:72px;box-sizing:border-box;
  background:#F5F3FE;
  border:1px solid transparent;
  transition:.15s;
}
.tt-cell.subject-on{
  background:var(--cell-bg,#F5F3FE);
  border-color:var(--cell-border,#E6E3F5);
  box-shadow:0 1px 0 rgba(0,0,0,.02);
}
.tt-cell.subject-on .tt-subject{color:var(--ink)}
.tt-cell.subject-off{opacity:.32;filter:grayscale(.7)}
.tt-subject{font-size:16px;font-weight:800;line-height:1.25;letter-spacing:.5px}
.tt-teacher{font-size:12px;color:var(--ink-soft);white-space:nowrap;font-weight:500;opacity:.85}
.tt-empty{display:flex;align-items:center;justify-content:center;height:72px;box-sizing:border-box;color:var(--line);font-size:18px}
.tt-break-row td{
  padding:3px 8px;text-align:center;font-size:11.5px;color:var(--muted);
  background:#fbfafd;border-top:1px dashed #ece8fa;
}
.tt-break-row .tt-break-tag{
  display:inline-flex;align-items:center;gap:5px;padding:3px 12px;
  border-radius:10px;background:#fff;border:1px solid var(--line);
  font-size:11.5px;color:var(--muted);font-weight:600;letter-spacing:.5px;
}
.tt-break-row .tt-break-tag.long{background:#f3f0fb;color:var(--brand);border-color:var(--purple-200)}
.tt-break-row .tt-break-tag svg{width:12px;height:12px;stroke:currentColor;fill:none;stroke-width:2}

/* 课程表学科色块筛选（容器与筛选条件统一风格） */
.tt-filter{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px;padding:12px 14px;background:#fbfaff;border:1px solid var(--line);border-radius:12px;box-shadow:0 2px 10px rgba(80,60,150,.05)}
.subj-chip{font-family:inherit;font-size:12.5px;padding:7px 14px;border-radius:20px;border:1px solid var(--line);background:#fff;color:var(--ink-soft);cursor:pointer;transition:.15s;white-space:nowrap;margin:3px 0}
.subj-chip:hover{border-color:var(--brand);color:var(--brand)}
.subj-chip.on{color:#fff!important;font-weight:700}
/* "全选/全不选" 按钮专用：未选中时浅紫色描边高亮显眼；全选态改绿色突出反馈 */
.subj-chip.all-toggle{border-style:dashed;border-color:var(--purple-400);background:#F5F2FF;color:var(--purple-700);font-weight:700}
.subj-chip.all-toggle:hover{background:#EDE7FF;border-color:var(--purple-600)}
.subj-chip.all-toggle.on{border-style:solid;border-color:transparent;background:linear-gradient(135deg,#10b981,#0ea271);color:#fff!important}
.subj-chip:not(.on){opacity:.5}

/* ═══ 校历（仿南京市 2026-2027 学年第一学期校历格式） ═══ */
.cal-wrap{display:grid;grid-template-columns:1fr 200px;gap:14px;align-items:start}
.cal-table{width:100%;border-collapse:separate;border-spacing:0;font-size:13px;background:#fff;
  border:1px solid var(--line);border-radius:14px;overflow:hidden}
.cal-table th{background:linear-gradient(135deg,var(--purple-400),var(--purple-200));color:#fff;
  font-weight:700;font-size:13px;padding:9px 4px;text-align:center;letter-spacing:.5px}
.cal-table th.cal-weekno{background:transparent;color:var(--brand);font-weight:800;width:46px}
.cal-table th.cal-note{background:transparent;color:var(--brand);font-weight:800;width:100px}
.cal-table td{padding:6px 4px;text-align:center;border-top:1px solid var(--line);
  border-right:1px solid var(--line);vertical-align:middle;min-height:42px;height:42px;font-size:13px;color:var(--ink)}
.cal-table td:first-child{border-left:1px solid var(--line)}
.cal-table tr:last-child td{border-bottom:1px solid var(--line)}
.cal-weekno{font-family:"PingFang SC","Microsoft YaHei",serif;font-weight:700;color:var(--brand);
  background:#f7f5ff;font-size:13px}
.cal-cell{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;min-height:42px;padding:3px 2px}
.cal-cell .cal-day{font-size:14px;font-weight:600;color:var(--ink);line-height:1.1;margin-top:2px}
.cal-cell .cal-marker{font-size:10px;color:var(--brand);font-weight:700;letter-spacing:.3px;line-height:1;margin-top:4px;
  padding:3px 6px;border-radius:6px;background:rgba(255,255,255,.85);
  display:inline-block;max-width:98%;text-align:center}
.cal-cell.is-month-start .cal-day{color:var(--brand);font-weight:800;font-size:13px}
.cal-cell .cal-mday{display:inline-block;color:var(--brand);font-weight:800;font-size:12.5px;letter-spacing:.3px;background:linear-gradient(135deg,#f7f5ff,#fff);padding:2px 6px;border-radius:6px;border:1px solid #e9e2ff}
.cal-cell.is-month-start{border:1.5px solid #c4b5fd;background:linear-gradient(135deg,#faf8ff,#fff)}
.cal-title-main{font-size:18px;font-weight:800;color:var(--brand);letter-spacing:1px;font-family:"PingFang SC","Microsoft YaHei",serif}
.cal-weeknote{font-size:11.5px;color:var(--ink);text-align:left;padding:6px 10px!important;background:#faf9ff;border-left:2px solid var(--brand-soft);min-width:120px;max-width:180px;line-height:1.35;font-weight:600}
.cal-weeknote:empty{background:transparent;border-left:none}
.cal-table th.cal-weeknote-h{background:linear-gradient(135deg,var(--purple-400),var(--purple-200));color:#fff;font-size:12.5px;width:140px}
.cal-cell.is-today{background:#fef3c7}
.cal-cell.is-today .cal-day{color:#b45309;font-weight:800}
/* 节假日底色块更大（不顶住汉字）：cell 增加 padding，给 marker 留空 */
.cal-cell.is-holiday{background:#fff5f5}
.cal-cell.is-holiday .cal-day{color:#dc2626;font-weight:800}
.cal-cell.is-holiday .cal-marker{background:#fee2e2;color:#dc2626;padding:4px 8px;font-size:11px;margin-top:5px}
.cal-cell.is-vacation{background:repeating-linear-gradient(45deg,#fef9f4,#fef9f4 6px,#fff 6px,#fff 12px);color:var(--muted)}
.cal-cell.is-vacation .cal-day{color:var(--muted);text-decoration:line-through;opacity:.6}
.cal-cell.is-out{opacity:.3;background:#fafafa}
.cal-cell.is-out .cal-day{color:var(--muted)}
/* 临近假日的 cell 边上提示 —— 红点（7 天内）*/
.cal-cell.cal-near-fest{box-shadow:inset 0 0 0 2px rgba(220,38,38,.18)}
.cal-cell.cal-today-fest{box-shadow:inset 0 0 0 2px var(--gold)}
.cal-notes{display:flex;flex-direction:column;gap:10px;position:sticky;top:14px}
.cal-note-item{display:flex;gap:10px;padding:10px 12px;background:#fff;border:1px solid var(--line);
  border-radius:12px;font-size:12.5px;color:var(--ink-soft);line-height:1.5;
  border-left:3px solid var(--gold)}
.cal-note-item .cal-week{font-weight:800;color:var(--brand);min-width:38px;font-family:"PingFang SC",serif}
.cal-note-item .cal-week b{font-size:14px}
.cal-festival-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px;margin-top:6px}
.cal-festival{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#fff;
  border:1px solid var(--line);border-radius:12px;transition:.15s}
.cal-festival:hover{transform:translateY(-1px);box-shadow:0 4px 12px rgba(0,0,0,.04)}
.cal-festival .fest-date{font-size:18px;font-weight:800;color:var(--brand);font-family:"PingFang SC",serif;
  min-width:46px;text-align:center;line-height:1.1}
.cal-festival .fest-date small{display:block;font-size:10px;color:var(--muted);font-weight:600;margin-top:2px;letter-spacing:.5px}
.cal-festival .fest-info{flex:1;min-width:0}
.cal-festival .fest-name{font-size:13px;font-weight:700;color:var(--ink)}
.cal-festival .fest-tip{font-size:11px;color:var(--muted);margin-top:2px;line-height:1.4}
.cal-festival.is-holiday{background:linear-gradient(135deg,#fff5f5,#fff);border-color:#fecaca}
.cal-festival.is-holiday .fest-date{color:#dc2626}
.cal-festival.is-school{background:linear-gradient(135deg,#f7f5ff,#fff);border-color:#ddd6fe}
.cal-festival.is-school .fest-date{color:var(--brand)}
.cal-festival.is-past{opacity:.5;filter:grayscale(.3)}
.cal-festival.is-today-fest{box-shadow:0 0 0 2px var(--gold), 0 4px 14px rgba(245,230,168,.4)}
/* 临近节日（≤14 天但非今日）：金色描边 + 角标 */
.cal-festival.is-upcoming{border:2px solid var(--gold);box-shadow:0 4px 12px rgba(245,230,168,.35)}
.cal-festival.is-custom{background:linear-gradient(135deg,#fffbe6,#fff);border-color:#fde68a}
.fest-tag{display:inline-block;font-size:10px;font-weight:700;padding:1px 7px;border-radius:8px;background:#fef3c7;color:#b45309;margin-left:6px;letter-spacing:.3px;vertical-align:middle}
.fest-due{display:inline-block;font-size:11px;font-weight:700;padding:2px 8px;border-radius:8px;background:var(--gold-soft);color:#92400e;margin-left:4px;vertical-align:middle}
.fest-del{position:absolute;top:6px;right:6px;width:22px;height:22px;border-radius:50%;background:#fff;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;font-size:12px;color:var(--muted);cursor:pointer;opacity:0;transition:.15s}
.cal-festival:hover .fest-del{opacity:1}
.fest-del:hover{background:var(--danger-soft);color:var(--danger);border-color:var(--danger)}

/* 近期节日 banner（节日的快捷高亮区） */
.upcoming-fest{border:1px solid #FDE68A;background:linear-gradient(135deg,#FFFBEB,#FFF7E0);padding-bottom:14px}
.upcoming-fest .card-title{margin-bottom:8px}
.upcoming-list{display:flex;flex-wrap:wrap;gap:8px;padding:2px 0}
.fest-chip{display:inline-flex;align-items:center;gap:5px;padding:7px 13px;background:#fff;border:1px solid #fbbf24;
  border-radius:999px;font-size:13px;color:#b45309;font-weight:600;box-shadow:0 2px 6px rgba(245,158,11,.12)}
.fest-chip b{font-size:14px;color:#92400e;letter-spacing:.5px}

@media (max-width:768px){
  .cal-wrap{grid-template-columns:1fr}
  .cal-notes{position:static;flex-direction:row;overflow-x:auto;padding-bottom:4px}
  .cal-note-item{min-width:200px;flex-shrink:0}
  .cal-festival-grid{grid-template-columns:repeat(2,1fr)}
}

/* 首页进度条 / 今天课程点 */
.prog-bar{height:10px;border-radius:6px;background:rgba(139,123,216,.16);overflow:hidden}
.prog-fill{height:100%;border-radius:6px;background:linear-gradient(90deg,var(--purple-600),var(--purple-800));transition:width .4s}
.tt-dot{width:9px;height:9px;border-radius:50%;flex:none;margin-top:6px}

/* 学科复习模块 */
.banner-sub{padding:18px 20px;background:linear-gradient(135deg,#f3f0fb,#fff);border-radius:16px;margin-bottom:16px}
.banner-sub h1{margin:0;font-size:20px;color:var(--ink)}
.chip-wrap{display:flex;flex-wrap:wrap;gap:6px}
.mini{font-size:12px;padding:3px 10px;border-radius:14px;background:rgba(139,123,216,.1);color:var(--purple-800)}
.rev-list{margin:0;padding-left:18px;color:var(--ink-soft);font-size:13.5px;line-height:1.85}
.btn-sm{padding:5px 12px;font-size:12.5px;border-radius:10px;transition:transform .12s ease, background .18s, border-color .18s}
.btn-sm:active{transform:scale(.96)}
.btn-ghost{background:#fff;border:1px solid var(--line);color:var(--ink-soft)}
.btn-ghost:hover{border-color:var(--brand)}
.read-line{margin:8px 0;cursor:pointer;border-radius:8px;padding:4px 6px;transition:.15s}
.read-line:hover{background:rgba(139,123,216,.12)}

/* AI 助手 */
.ai-input{width:100%;min-height:120px;resize:vertical;padding:12px 14px;border:1px solid var(--line);border-radius:12px;font-family:inherit;font-size:14px;color:var(--ink);box-sizing:border-box}
.ai-input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(139,123,216,.18)}
.ai-result{margin-top:6px}
.ai-sug{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;border:1px solid var(--line);border-radius:12px;margin-bottom:8px;cursor:pointer;font-size:14px;color:var(--ink)}
.ai-sug input{margin-top:3px}

/* tag 补充色 */
.tag.t-red{background:#fde8e8;color:#c0392b}
.tag.t-orange{background:#fef0e0;color:#c87a1e}
.tag.t-blue{background:#e8f0fe;color:#2f6fd0}
.tag.t-cyan{background:#e3f6f3;color:#1f8a7a}

/* ═══ 古诗朗读模块（去掉粗笨的 banner，整体更轻盈） ═══ */
.poem-toolbar{display:flex;flex-wrap:wrap;gap:12px;align-items:center;background:#fff;border:1px solid var(--line);border-radius:14px;padding:12px 14px;margin-bottom:18px}
.grade-tab{font-size:14px;padding:7px 18px;border-radius:20px;border:1px solid var(--line);background:#fff;color:var(--ink-soft);cursor:pointer;transition:.15s}
.grade-tab.active{background:var(--purple-800);color:#fff;border-color:var(--purple-800);font-weight:700}
.py-switch{display:flex;align-items:center;gap:8px;font-size:14px;color:var(--ink-soft);cursor:pointer;user-select:none}
.py-switch .sw{width:46px;height:26px;border-radius:14px;background:#d8d2ec;position:relative;transition:.2s;flex:none}
.py-switch .sw::after{content:"";position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;background:#fff;transition:.2s;box-shadow:0 1px 3px rgba(0,0,0,.2)}
.py-switch.on .sw{background:var(--brand)}
.py-switch.on .sw::after{left:23px}
.poem-prog{margin-left:auto;display:flex;align-items:center;gap:8px;font-size:13px;color:var(--ink-soft)}
.poem-prog .pbar{width:140px;height:10px;border-radius:6px;background:#ece8f7;overflow:hidden;flex:none}
.poem-prog .pbar>i{display:block;height:100%;background:linear-gradient(90deg,#8b7bd8,#5b8def);border-radius:6px;transition:.3s}
.poem-prog b{color:var(--purple-800);font-size:14px}

/* 单篇古诗阅读器（大字、清晰、便于小学生阅读） */
.poem-reader{background:#fff;border:1px solid var(--line);border-radius:20px;padding:22px 30px 24px;box-shadow:0 10px 36px rgba(139,123,216,.12);max-width:780px;margin:0 auto;text-align:center}
.pr-head{margin-bottom:14px}
.pr-title-py{font-size:15px;color:var(--brand);font-weight:700;letter-spacing:3px;margin:0 0 2px;line-height:1.2}
.pr-title{font-size:30px;font-weight:800;color:var(--ink);margin:0;letter-spacing:3px;line-height:1.15}
.pr-author{display:inline-flex;justify-content:center;align-items:flex-end;gap:0;margin-top:2px;letter-spacing:.5px}
.pr-author .pr-meta-char{display:inline-flex;flex-direction:column;align-items:center;line-height:1;min-width:24px;margin:0 1px;vertical-align:top}
.pr-author .pr-meta-char .py{font-size:11px;color:var(--brand);font-weight:500;height:13px;display:flex;align-items:center;justify-content:center;width:100%;letter-spacing:0;font-family:"PingFang SC","Microsoft YaHei",sans-serif}
.pr-author .pr-meta-char .py.empty{visibility:hidden;padding:0}
.pr-author .pr-meta-char .hz{font-size:18px;font-weight:600;color:var(--muted);display:block;margin-top:1px;line-height:1.1}
/* 隐藏拼音时，作者字号保持一致（不放大），与正文一致节奏 */
.poem-reader.no-py .pr-author .pr-meta-char .hz{font-size:18px;margin-top:0}
.poem-reader.no-py .pr-author .pr-meta-char .py{display:none}
.pr-lines{display:flex;flex-direction:column;gap:18px;align-items:center;margin:6px 0 6px}
.pr-line{display:flex;justify-content:center;flex-wrap:wrap;gap:0 6px;cursor:pointer;border-radius:12px;padding:8px 12px;transition:.15s}
.pr-line:hover{background:rgba(139,123,216,.08)}

/* 每个字（拼音精准对齐汉字） */
.pr-char{
  display:inline-flex;flex-direction:column;align-items:center;
  line-height:1;min-width:36px;vertical-align:top;
}
.pr-char .py{
  font-size:13px;color:var(--brand);font-weight:500;
  height:18px;display:flex;align-items:center;justify-content:center;
  width:100%;letter-spacing:0;
}
.pr-char .py.empty{visibility:hidden}
.pr-char .hz{font-size:34px;font-weight:600;color:var(--ink);display:block;margin-top:4px;line-height:1.1}

/* 隐藏拼音：保持正文与显示拼音时一样的文字大小与节奏（不再放大到 40px） */
.poem-reader.no-py .pr-char .py{display:none}
.poem-reader.no-py .pr-char .hz{margin-top:0;font-size:34px}
.poem-reader.no-py .pr-char{min-width:auto;margin:0 4px;gap:0}

.pr-foot{display:flex;justify-content:center;gap:14px;align-items:center;margin-top:28px;flex-wrap:wrap}
.pr-status{font-size:13px;padding:6px 16px;border-radius:14px;background:#f1eefa;color:var(--purple-800)}
.pr-status.s-learning{background:#e8f0fe;color:#2f6fd0}
.pr-status.s-mastered{background:#e6f6ec;color:#1f9d57}

/* 白话文解释（点击展开/收起，折叠动画） */
.pr-gloss{max-height:0;overflow:hidden;transition:max-height .25s ease}
.pr-gloss.open{max-height:400px}
.pr-gloss-inner{margin-top:16px;padding:16px 18px;background:#faf9ff;border:1px solid var(--line);border-radius:14px;text-align:left}
.pr-gloss-title{font-size:13px;font-weight:700;color:var(--purple-800);margin-bottom:8px;letter-spacing:1px}
.pr-gloss-text{font-size:16px;line-height:1.9;color:var(--ink)}
.pr-gloss-text.muted{color:var(--ink-soft);text-align:center}

/* 翻页 */
.poem-nav{display:flex;align-items:center;justify-content:center;gap:20px;margin:24px auto 0;max-width:780px}
.poem-nav .pg{font-size:15px;color:var(--ink-soft);min-width:96px;text-align:center;font-weight:600}
.poem-dots{display:flex;gap:8px;justify-content:center;margin:18px auto 0;flex-wrap:wrap;max-width:780px}
.poem-dots .dot{width:10px;height:10px;border-radius:50%;background:#ddd6ec;cursor:pointer;transition:.15s;border:none;padding:0}
.poem-dots .dot.active{background:var(--purple-800);transform:scale(1.3)}
/* 变更006.2：古诗阅读区 + 右侧竖排导航（上一首/下一首竖排，事件逻辑零改动） */
.poem-stage{display:flex;gap:16px;max-width:860px;margin:0 auto;align-items:stretch}
.poem-stage .poem-reader{flex:1;min-width:0}
.poem-nav-vertical{width:56px;flex:none;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px}
.poem-nav-vertical .side-nav{writing-mode:vertical-rl;text-orientation:upright;letter-spacing:4px;padding:14px 8px;
  border:1px solid var(--line);border-radius:12px;background:#fff;color:var(--ink-soft);font-size:14px;font-weight:600;
  cursor:pointer;font-family:inherit;transition:.15s;line-height:1}
.poem-nav-vertical .side-nav:hover:not(:disabled){border-color:var(--brand);color:var(--brand)}
.poem-nav-vertical .side-nav:disabled{opacity:.35;cursor:not-allowed}
.poem-nav-vertical .side-page{font-size:13px;color:var(--muted);font-weight:600;white-space:nowrap}
@media (max-width:600px){
  .poem-stage{gap:10px}
  .poem-nav-vertical{width:44px;gap:12px}
  .poem-nav-vertical .side-nav{padding:10px 6px;font-size:13px;letter-spacing:3px}
}
@media (max-width:480px){
  .poem-stage{gap:8px}
  .poem-nav-vertical{width:40px;gap:10px}
}
.btn:disabled{opacity:.4;cursor:not-allowed}

/* ═══ 新增：花名册搜索（容器与筛选条件统一风格 · 左右结构） ═══ */
.roster-search{margin-bottom:14px;display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:12px 14px;background:#fbfaff;border:1px solid var(--line);border-radius:12px;box-shadow:0 2px 10px rgba(80,60,150,.05)}
.roster-search .rs-label{flex:none;font-size:13px;color:var(--ink);font-weight:600;letter-spacing:.2px}
.roster-search input{
  flex:1;min-width:180px;width:auto;max-width:100%;padding:10px 14px;border:1px solid var(--line);border-radius:10px;
  font-size:13.5px;font-family:inherit;background:#fff;color:var(--ink-soft);
}
.roster-search input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(109,95,224,.15)}
.roster-search .clear{font-size:12px;color:var(--brand);cursor:pointer;margin-left:auto}
.roster-search .clear:hover{text-decoration:underline}

/* ═══ 新增：作息表上下午分组 ═══ */
.routine-section{margin-bottom:22px;padding:14px 16px;border-radius:14px;border:1px solid var(--line)}
.routine-section.am{background:linear-gradient(135deg,#fff8e6,#fef9ef);border-color:#fde8b8}
.routine-section.lunch{background:linear-gradient(135deg,#fdf2f8,#fef7fb);border-color:#fbcfe8}
.routine-section.pm{background:linear-gradient(135deg,#eff6ff,#f5faff);border-color:#bfdbfe}
.routine-section h4{margin:0 0 12px;font-size:15px;font-weight:800;color:var(--ink);display:flex;align-items:center;gap:8px}
.routine-section h4 .badge{
  font-size:12px;font-weight:600;padding:3px 10px;border-radius:10px;
}
.routine-section.am .badge{background:#fbbf24;color:#92400e}
.routine-section.lunch .badge{background:#ec4899;color:#fff}
.routine-section.pm .badge{background:#3b82f6;color:#fff}
.routine-row{display:flex;align-items:center;gap:14px;padding:8px 0;border-top:1px dashed rgba(0,0,0,.06)}
.routine-row:first-of-type{border-top:none}
.routine-row .time{font-weight:800;color:var(--ink);min-width:88px;font-variant-numeric:tabular-nums;font-size:14px}
.routine-row .activity{flex:1;color:var(--ink-soft);font-size:13.5px}
.routine-row .act-del{font-size:12px;color:var(--muted);cursor:pointer}
.routine-row .act-del:hover{color:var(--danger)}

/* ═══ 新增：学习情况 Tab + 列表筛选 + 单选 ═══ */
.lm-tabs{display:flex;gap:6px;margin-bottom:16px;padding-bottom:0;border-bottom:1px solid var(--line)}
.lm-tab{padding:11px 18px;font-size:14px;color:var(--muted);cursor:pointer;border-bottom:3px solid transparent;transition:color .15s, border-color .15s, transform .12s;font-weight:600}
.lm-tab:hover{color:var(--purple-800)}
.lm-tab:active{transform:scale(.97)}
.lm-tab.active{color:var(--purple-800);border-bottom-color:var(--purple-800)}
.lm-tab .badge-count{font-size:11px;padding:1px 7px;border-radius:8px;background:var(--brand-soft);color:var(--brand);margin-left:6px;font-weight:700}
.lm-tab.active .badge-count{background:var(--purple-800);color:#fff}

.list-filter{display:flex;flex-wrap:wrap;gap:10px;align-items:center;margin-bottom:14px;padding:10px 14px;background:#fbfaff;border-radius:12px;border:1px solid var(--line)}
.list-filter label{font-size:12px;color:var(--muted);display:flex;align-items:center;gap:6px}
.list-filter select,.list-filter input[type=date]{font-family:inherit;font-size:13px;padding:5px 10px;border:1px solid var(--line);border-radius:8px;background:#fff;transition:border-color .15s, box-shadow .15s}
.list-filter select:focus,.list-filter input[type=date]:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px rgba(109,95,224,.15)}
.list-filter .reset{font-size:12px;color:var(--brand);cursor:pointer;margin-left:auto;transition:color .15s}
.list-filter .reset:hover{text-decoration:underline;color:var(--purple-800)}

/* 单选 radio 组（学科） */
.radio-group{display:flex;flex-wrap:wrap;gap:7px;margin:6px 0 14px}
.radio-opt{
  display:inline-flex;align-items:center;justify-content:center;
  padding:6px 13px;border:1px solid var(--line);border-radius:14px;
  font-size:12.5px;cursor:pointer;background:#fff;color:var(--ink-soft);font-weight:600;
  transition:.15s;user-select:none;
}
.radio-opt input{display:none}
.radio-opt.on{background:var(--brand);color:#fff;border-color:var(--brand)}
.radio-opt:hover:not(.on){border-color:var(--brand);color:var(--brand)}

/* ═══ 新增：详情模态框与编辑历史 ═══ */
.detail-modal{width:min(640px,100%)}
.detail-grid{display:grid;grid-template-columns:96px 1fr;gap:10px 14px;font-size:13.5px;align-items:start}
.detail-grid dt{color:var(--muted);font-weight:600;text-align:right;padding-top:2px}
.detail-grid dd{margin:0;color:var(--ink);word-break:break-word;line-height:1.6}
.detail-grid dd.empty-val{color:#bbb;font-style:italic}
.detail-grid .thumb-row{display:flex;gap:8px;flex-wrap:wrap}
.detail-grid .thumb-row .thumb{width:72px;height:72px;border-radius:10px;background-size:cover;background-position:center;cursor:pointer;border:1px solid var(--line)}
.detail-grid .file-row{display:flex;gap:6px;flex-wrap:wrap}
.detail-grid .file-row a{font-size:12px;padding:5px 11px;background:var(--brand-soft);border-radius:12px;color:var(--brand);text-decoration:none}
.detail-history{margin-top:16px;padding-top:14px;border-top:1px dashed var(--line)}
.detail-history h5{margin:0 0 8px;font-size:13px;color:var(--muted);font-weight:700;display:flex;align-items:center;gap:6px}
.detail-history-item{font-size:12.5px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;margin-bottom:8px;background:#fbfaff}
.detail-history-item .ts{color:var(--brand);font-weight:700;margin-right:6px}
.detail-history-item .note{color:var(--muted);margin-top:3px}

/* ═══ 新增：列表图片缩略图 + 文件 chips ═══ */
.thumb-grid{display:flex;gap:5px;margin-top:4px}
.thumb-grid .thumb{
  width:38px;height:38px;border-radius:6px;
  background-size:cover;background-position:center;cursor:pointer;
  border:1px solid var(--line);transition:.15s;
}
.thumb-grid .thumb:hover{transform:scale(1.1);border-color:var(--brand)}
.file-chip-row{display:flex;gap:5px;margin-top:4px;flex-wrap:wrap}
.file-chip-row .file-chip{
  font-size:11px;padding:2px 8px;background:var(--brand-soft);border-radius:8px;
  color:var(--brand);max-width:160px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}

.modal-file-list{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.modal-file-chip{
  display:inline-flex;align-items:center;gap:6px;padding:4px 10px;
  background:var(--brand-soft);border-radius:10px;font-size:12px;color:var(--brand);
}
.modal-file-chip button{
  border:none;background:rgba(0,0,0,.06);color:var(--danger);
  width:18px;height:18px;border-radius:50%;cursor:pointer;font-size:13px;line-height:1;
}
.upload-progress{font-size:12px;color:var(--muted);margin-top:4px}

/* ═══ 新增：图片预览器（lightbox） ═══ */
.lightbox{
  position:fixed;inset:0;background:rgba(15,15,30,.92);z-index:300;
  display:flex;align-items:center;justify-content:center;flex-direction:column;
}
.lightbox-img{
  max-width:90vw;max-height:78vh;object-fit:contain;border-radius:8px;
  box-shadow:0 20px 60px rgba(0,0,0,.5);
}
.lightbox-nav{
  position:absolute;top:50%;transform:translateY(-50%);
  background:rgba(255,255,255,.18);border:none;color:#fff;
  width:52px;height:52px;border-radius:50%;font-size:28px;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
  transition:.15s;
}
.lightbox-nav:hover{background:rgba(255,255,255,.32)}
.lightbox-prev{left:20px}
.lightbox-next{right:20px}
.lightbox-close{
  position:absolute;top:20px;right:20px;
  background:rgba(255,255,255,.18);border:none;color:#fff;
  width:44px;height:44px;border-radius:50%;font-size:22px;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
}
.lightbox-info{color:rgba(255,255,255,.85);margin-top:14px;font-size:13px}

/* 进度条区块：紧凑版（让进度条窄一些） */
.prog-card{padding:14px 18px}
.prog-card-inner{display:flex;align-items:center;gap:16px}
.prog-card-inner .progress-wrap{flex:1;min-width:0;max-width:640px}
.prog-card-inner .progress-wrap .progress-label{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:6px}
.prog-card-inner .progress-wrap .progress-label .small{font-size:12px;color:var(--muted)}
.prog-card-inner .progress-wrap .progress-label b{font-size:13.5px;color:var(--brand)}
.prog-card-inner .current-week{
  margin-left:auto;display:flex;align-items:center;gap:10px;
  padding:6px 14px;background:var(--brand-soft);border-radius:12px;
}
.prog-card-inner .current-week .cw-num{font-size:22px;font-weight:900;color:var(--purple-800);line-height:1}
.prog-card-inner .current-week .cw-label{font-size:11.5px;color:var(--muted);line-height:1.2}
/* ══ 数据中心 ══ */
.data-head{transition:background .15s;border-radius:8px}
.data-head:hover{background:#F5F3FE}
.badge{display:inline-block;font-size:12px;font-weight:700;padding:2px 10px;border-radius:10px;background:#EDE9FE;color:var(--purple-800)}
.data-rows{border-top:1px dashed var(--line);margin-top:6px;padding-top:6px;max-height:340px;overflow:auto}
.data-row{display:flex;gap:10px;padding:7px 4px;border-bottom:1px solid #F3F1FB;font-size:13px;line-height:1.5}
.data-row-idx{color:#a78bfa;font-weight:700;flex:none;width:30px}
.data-row-sum{color:#334155;word-break:break-word}
.btn.on{background:var(--success-soft);color:var(--success);border-color:var(--success)}
.btn.on:hover{background:var(--success-soft);color:var(--success)}

/* 问题1根因修复：richtext 字段改用 div.rt-field（label 会把点击转发给工具栏加粗按钮） */
.form-grid .rt-field{display:flex;flex-direction:column;gap:5px;font-size:12px;color:var(--muted);font-weight:600;grid-column:1/-1}
.form-grid .rt-field .rt-box{grid-column:auto}
/* 问题1修复：作业内容默认不加粗——编辑器直接字重规则（高于 .form-grid label 的 600 继承） */
#modalBody .rt-editor{font-weight:400}
#modalBody .rt-editor:empty:before{font-weight:400;color:var(--muted)}
/* 花名册分页（问题4） */
.pager{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:10px 4px 2px;font-size:13px}
.pager .pg-btn,.pager .pg-num{font-family:inherit;min-width:32px;height:30px;padding:0 10px;border:1px solid var(--line);background:#fff;border-radius:8px;color:var(--ink-soft);font-size:12.5px;cursor:pointer;transition:.12s}
.pager .pg-btn:hover:not(:disabled),.pager .pg-num:hover{border-color:var(--brand);color:var(--brand)}
.pager .pg-num.on{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:700}
.pager .pg-btn:disabled{opacity:.4;cursor:not-allowed}
.pager .pg-ell{color:var(--muted);min-width:16px;text-align:center}
.pager .pg-info{color:var(--muted);font-size:12px;margin-left:6px}
.pager .pg-info b{color:var(--brand)}
/* 筛选面板平滑展开 */
.filter-panel{overflow:hidden;max-height:0;opacity:0;transition:max-height .28s ease,opacity .28s ease,margin-top .28s ease;margin-top:0}
.filter-panel.open{max-height:460px;opacity:1;margin-top:12px;overflow:visible}
.filter-toggle{cursor:pointer;margin-left:auto;font-size:13px;color:var(--brand);align-self:center;user-select:none;font-weight:600}
.list-filter{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end}
.list-filter label{display:flex;flex-direction:column;font-size:12.5px;color:var(--muted);gap:4px}
/* 附件拖拽区 */
.hw-drop{border:1.5px dashed var(--line);border-radius:12px;padding:12px;background:var(--bg);transition:.2s;cursor:pointer;margin-top:6px}
.hw-drop.drag{border-color:var(--brand);background:var(--brand-soft)}
.hw-drop-tip{font-size:12px;color:var(--muted);margin-bottom:8px}
.att-list{display:flex;flex-direction:column;gap:3px}
.att-item{font-size:12px;color:var(--brand);text-decoration:none;word-break:break-all}
.att-item:hover{text-decoration:underline}
/* 习惯打卡列表：按钮独立展示（无 .seg 包裹、无连线） */
.habit-list{gap:10px}
.habit-row{display:flex;justify-content:space-between;align-items:center;gap:12px;
  padding:14px 16px;border:1px solid var(--line);border-radius:14px;background:#fff;flex-wrap:wrap}
.habit-info{flex:1 1 auto;min-width:0;font-size:14px}
.habit-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.habit-btn{
  display:inline-flex;align-items:center;justify-content:center;gap:4px;
  height:38px;padding:0 16px;border-radius:12px;
  background:#fff;border:1px solid var(--line);color:var(--ink-soft);
  font-weight:700;font-size:13px;cursor:pointer;white-space:nowrap;
  transition:transform .12s ease, background .18s, border-color .18s, color .18s, box-shadow .18s;
}
.habit-btn:hover{border-color:var(--brand);color:var(--brand);box-shadow:0 2px 8px rgba(109,95,224,.15)}
.habit-btn:active{transform:scale(.97)}
/* 主按钮（今日打卡）—— 主题色 */
.habit-btn-primary{
  background:linear-gradient(135deg,var(--purple-600),var(--purple-400));color:#fff;border:0;
  box-shadow:0 4px 14px rgba(109,95,224,.30);
}
.habit-btn-primary:hover{background:linear-gradient(135deg,var(--purple-800),var(--purple-600));color:#fff;box-shadow:0 6px 18px rgba(109,95,224,.40);border:0}
.habit-btn-primary.is-done{background:linear-gradient(135deg,#10b981,#0ea271);box-shadow:0 4px 14px rgba(16,185,129,.30)}
.habit-btn-primary.is-done:hover{background:linear-gradient(135deg,#0ea271,#10b981);color:#fff;border:0}
/* 删除按钮：危险色边框，颜色更醒目 */
.habit-btn-danger{color:var(--danger);border-color:#FECDD3}
.habit-btn-danger:hover{background:var(--danger-soft);border-color:var(--danger);color:var(--danger)}

@media (max-width:560px){
  .habit-row{flex-direction:column;align-items:stretch}
  .habit-actions{justify-content:flex-start}
  .habit-btn{flex:1}
}

/* 习惯打卡日历（更整齐的布局：统一间距、缩小日期数字、统一高度） */
.hc-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;margin-top:8px}
.hc-week{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;text-align:center;font-size:12px;color:var(--muted);font-weight:600;letter-spacing:.5px}
.hc-cell{border:1px solid var(--line);border-radius:10px;min-height:52px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;font-size:14px;cursor:pointer;position:relative;background:var(--panel);transition:.15s}
.hc-cell:hover:not(.empty){border-color:var(--brand);box-shadow:0 2px 6px rgba(109,95,224,.15)}
.hc-cell.empty{background:transparent;border:none;cursor:default;min-height:52px}
.hc-cell.done{background:linear-gradient(135deg,#e0f7ec,#d1fae5);border-color:#10b981}
.hc-cell.done .hc-d{color:#065f46;font-weight:700}
.hc-cell.today{border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft);background:#fff}
.hc-cell.today .hc-d{color:var(--brand);font-weight:800}
.hc-dot{color:#10b981;font-weight:700;font-size:11px}
.hc-nav{display:flex;align-items:center;justify-content:space-between;margin:14px 0;padding:0 4px}
.hc-nav b{font-size:17px;color:var(--ink);letter-spacing:1px}
.hc-head{display:flex;justify-content:space-between;align-items:center;padding:0 4px 8px}
.hc-head h3{margin:0;font-size:17px;color:var(--ink)}
.hc-tip{margin:14px 0 0;padding:10px 12px;background:var(--brand-soft);border-radius:10px;color:var(--ink-soft);font-size:12.5px;text-align:center}

/* 数学练习 */
.math-q{background:var(--bg);border-radius:12px;padding:12px 14px}
.mq-q{font-size:15px;color:var(--ink);margin-bottom:8px}
.mq-opts{display:flex;flex-direction:column;gap:6px}
.mq-opt{font-size:14px;display:flex;align-items:center;gap:6px;cursor:pointer}
.mq-input{margin-top:6px;padding:7px 10px;border:1px solid var(--line);border-radius:8px;font-size:14px;width:220px;max-width:100%}
.mq-fb{margin-top:8px;font-size:13px}
.mq-ok{color:var(--success);font-weight:600}
.mq-no{color:var(--danger);font-weight:600}
.mq-ans{color:var(--muted);margin-left:6px}
.mq-warn{color:var(--warning)}
/* 练习模态框：朗读 / 课后练习 内嵌切换 */
.prac-tabs{display:flex;gap:6px;background:var(--brand-soft);border-radius:12px;padding:4px;margin-bottom:14px}
.prac-tab{flex:1;text-align:center;padding:8px 6px;border-radius:9px;font-size:14px;font-weight:600;color:var(--muted);cursor:pointer;transition:.18s;user-select:none}
.prac-tab:hover{color:var(--brand)}
.prac-tab.active{background:#fff;color:var(--brand);box-shadow:0 2px 8px rgba(99,87,176,.14)}
.prac-pane{animation:fadeIn .22s ease}
@keyframes fadeIn{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
/* 校历周次不换行 + 每日备注列表 */
.cal-weekno{white-space:nowrap}
.cal-table th.cal-weekno{white-space:nowrap}
.cal-wrap{display:flex;gap:14px;flex-wrap:wrap}
.cal-table-box{flex:1;min-width:320px;overflow-x:auto}
.sem-notes{flex:0 0 300px;max-width:340px;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:12px 14px;align-self:flex-start}
.sem-notes h4{margin:0 0 8px;font-size:14px}
.sem-note-item{display:flex;gap:8px;padding:8px 0;border-bottom:1px dashed var(--line);font-size:13px;align-items:flex-start}
.sem-note-item:last-child{border-bottom:none}
.sem-note-date{color:var(--brand);font-weight:600;white-space:nowrap}
.sem-note-text{flex:1}
.sem-note-del{cursor:pointer;color:var(--danger);margin-left:6px;white-space:nowrap}



/* ═══ 登录遮罩（2.0 全接口保护）═══ */
.login-mask{position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(160deg,#6D5FE0 0%,#8B7CF6 55%,#A8A0F2 100%)}
.login-mask.hidden{display:none}
.login-card{width:min(360px,88vw);background:#fff;border-radius:18px;box-shadow:0 24px 80px rgba(30,20,80,.35);
  padding:32px 28px;text-align:center}
.login-card h2{margin:8px 0 2px;color:var(--ink);font-size:20px}
.login-sub{margin:0 0 18px;color:var(--muted);font-size:13px}
.login-card input{width:100%;padding:11px 12px;margin:0 0 10px;border:1.5px solid var(--line);
  border-radius:10px;font-size:15px;outline:none;background:#fff;color:var(--ink)}
.login-card input:focus{border-color:var(--brand)}
.login-err{color:var(--danger);font-size:13px;margin:-2px 0 10px;text-align:left}
.login-btn{width:100%;padding:12px;border:none;border-radius:10px;font-size:15px;cursor:pointer;
  background:linear-gradient(135deg,var(--purple-800),var(--purple-600));color:#fff;font-weight:600}
.login-btn:disabled{opacity:.6;cursor:default}
.login-logo{width:52px;height:52px;margin:0 auto;display:flex;align-items:center;justify-content:center;
  border-radius:14px;background:linear-gradient(135deg,var(--purple-800),var(--purple-400))}
.login-logo svg{width:28px;height:28px;fill:none;stroke:#fff;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
/* ═══ 首次登录改密弹窗（2026-09-09 修订）：进入系统后弹出，半透明压暗背景（非整页式），视觉为居中模态弹窗 ═══ */
.login-mask.pw-modal{background:rgba(15,23,42,.55)}
.login-mask.pw-modal .login-card{width:min(400px,92vw);box-shadow:0 24px 64px rgba(2,6,23,.5);animation:pwPop .22s ease-out}
@keyframes pwPop{from{transform:translateY(10px) scale(.97);opacity:0}to{transform:none;opacity:1}}

/* ═══ 2.0 课后延时表 & TTS 声音选择 ═══ */
.tts-voice-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:10px;padding:8px 12px;
  background:var(--brand-soft,#F5F3FE);border-radius:10px}
.tts-voice-opt{display:inline-flex;align-items:center;gap:5px;font-size:13px;color:var(--ink);cursor:pointer}
.tts-voice-opt input{accent-color:var(--purple-600,#6D5FE0)}
