:root{
  --paper:#F1F2EC; --paper-2:#E9EBE3; --rule:#CBD5C6;
  --ink:#1C241F; --ink-soft:#5A6560;
  --green:#2E5B4C; --green-deep:#17342A; --red:#B23A32;
  --serif:"Noto Serif CJK SC","Songti SC",serif;
  --sans:"Noto Sans CJK SC","PingFang SC",sans-serif;
  --mono:"JetBrains Mono","DejaVu Sans Mono",monospace;
}
*{box-sizing:border-box}
body{margin:0;background:var(--paper);color:var(--ink);
  font-family:var(--sans);font-size:15px;line-height:1.75}
.wrap{max-width:900px;margin:0 auto;padding:32px 20px 64px}
.nav{display:flex;gap:20px;align-items:center;padding:14px 20px;
  border-bottom:2px solid var(--ink);font-family:var(--mono);font-size:13px}
.nav a{color:var(--green);text-decoration:none}
.nav a:hover{text-decoration:underline}
.nav form{margin-left:auto}
/* 特异性要压过下面的 button[type=submit]（同为 0-1-1，靠后者胜出），
   否则「退出」会渲染成实心大按钮。同 .sheet .cell 的问题，一并按 0-2-0 处理。 */
.nav .nav-btn{background:none;border:1px solid var(--rule);color:var(--ink-soft);
  font-family:var(--mono);font-size:12px;padding:4px 10px;cursor:pointer}
.display{font-family:var(--serif);font-weight:600;
  font-size:clamp(36px,8vw,64px);line-height:1;margin:24px 0 8px}
.sub{font-family:var(--mono);font-size:12px;letter-spacing:.1em;
  color:var(--green);margin:0 0 32px}
.card{display:flex;flex-direction:column;gap:14px;max-width:340px;
  border:1px solid var(--rule);padding:22px;background:var(--paper-2)}
label{display:flex;flex-direction:column;gap:6px;font-size:13px;
  color:var(--ink-soft)}
input,textarea{font-family:inherit;font-size:15px;padding:8px 10px;
  border:1px solid var(--rule);background:var(--paper);color:var(--ink)}
input:focus,textarea:focus{outline:2px solid var(--green);outline-offset:-2px}
button[type=submit]{font-family:var(--sans);font-size:14px;padding:9px;
  background:var(--green-deep);color:var(--paper);border:none;cursor:pointer}
.error{color:var(--red);font-size:14px;margin:0 0 16px}
h2{font-family:var(--serif);font-size:24px;font-weight:600;margin:34px 0 12px}
table{width:100%;border-collapse:collapse;font-size:14px}
th,td{border:1px solid var(--rule);padding:8px 11px;text-align:left}
thead th{background:var(--paper-2);font-size:13px}
.hint{font-size:13px;color:var(--ink-soft);border-left:2px solid var(--rule);
  padding-left:12px;margin:0 0 20px}
.ok{color:var(--green);font-size:14px;margin:0 0 16px}
textarea{width:100%;font-family:var(--mono);font-size:13px}
.check{flex-direction:row;align-items:flex-start;gap:10px;
  font-size:15px;color:var(--ink);cursor:pointer}
.check input{width:18px;height:18px;margin-top:4px;flex:none;accent-color:var(--green-deep)}
.exam{color:var(--red)}

.sheet{display:grid;gap:3px;margin:20px 0 16px;
  grid-template-columns:2.4em repeat(13, minmax(0,1fr))}
.sheet form{margin:0;display:contents}
.sheet .ml-narrow{display:none}
/* 特异性必须高于 button[type=submit]（0-1-1）：.cell 单独只有 0-1-0，
   会被那条全局按钮规则的 border:none / font-size:14px / padding:9px /
   color:var(--paper) 压掉，稿纸格线、考试周红框、阶段一二的可读字色
   全部消失。这里用 .sheet .cell（0-2-0）赢过它，且必须写完整的
   border 简写（不能只覆盖 border-color/border-width），否则
   border-style:none 仍然生效，边框依旧不绘制。 */
.sheet .cell{aspect-ratio:1/1;border:1px solid var(--rule);background:var(--paper-2);
  font-family:var(--mono);font-size:9px;color:var(--ink-soft);
  cursor:pointer;padding:0}
.sheet .cell.p1{background:#DDE5DA} .sheet .cell.p2{background:#BACCBF}
.sheet .cell.p3{background:#89AA9B;color:#EDF1EC}
.sheet .cell.p4{background:#4C7A67;color:#EDF1EC}
.sheet .cell.on{background:var(--green-deep);color:transparent}
.sheet .cell.exam{border:2px solid var(--red)}
.sheet .cell.today{box-shadow:0 0 0 2px var(--red)}
.sheet .cell:disabled{cursor:default}
.month-label{display:flex;align-items:center;justify-content:flex-end;
  font-family:var(--mono);font-size:10px;color:var(--ink-soft);
  padding-right:4px;white-space:nowrap}
/* 窄屏切 5 列：13 列时每格只有 21px，远小于 44×44 的最小触摸目标，
   拇指点下去很容易点中相邻的周。5 列 × 26 行下每格约 58px（390px 视口）。
   断点 700px 是算出来的：13 列要让每格 ≥44px 需要约 684px 视口，取 700 留余量。
   这一段必须放在上面所有 .sheet .cell 规则之后：媒体查询不增加特异性，
   同为 0-2-0 时靠后者取胜，写在前面 font-size 会被基础规则压回 9px。 */
@media (max-width:700px){
  .sheet{grid-template-columns:3em repeat(5, minmax(0,1fr))}
  .sheet .ml-wide{display:none}
  .sheet .ml-narrow{display:flex}
  .sheet .cell{font-size:13px}   /* 格子大了，9px 的周号会显得过小 */
}
.legend{display:flex;gap:18px;flex-wrap:wrap;font-family:var(--mono);
  font-size:11px;color:var(--ink-soft)}
.legend i{display:inline-block;width:11px;height:11px;
  border:1px solid var(--rule);margin-right:6px;vertical-align:-1px}
.legend i.p1{background:#DDE5DA} .legend i.p2{background:#BACCBF}
.legend i.p3{background:#89AA9B} .legend i.p4{background:#4C7A67}
.legend i.exam{border-color:var(--red);border-width:2px}
