:root{
  --bg:#f5f6f8; --card:#fff; --line:#e3e6ea; --txt:#1f2328; --muted:#6b7280;
  --blue:#1f4e79; --green:#1a7f37; --yellow:#9a6700; --red:#c0392b;
}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--txt);
  font:14px/1.5 -apple-system,"Segoe UI","Microsoft YaHei",sans-serif}
a{color:var(--blue);text-decoration:none}
a:hover{text-decoration:underline}

.topbar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  background:var(--blue);color:#fff;padding:10px 16px;position:sticky;top:0;z-index:9}
.topbar .brand{font-weight:700;font-size:16px}
.topbar nav{display:flex;gap:6px}
.topbar nav a{color:#dbe6f1;padding:5px 12px;border-radius:6px;font-size:14px}
.topbar nav a.on,.topbar nav a:hover{background:rgba(255,255,255,.16);color:#fff;text-decoration:none}

main{padding:16px;max-width:1400px;margin:0 auto}
.foot{color:var(--muted);text-align:center;padding:22px 10px;font-size:12px}

/* ★★ 2026-09-24「总订单」= 用 iframe 把订单管理（order_admin，端口 8900）嵌进来
   （用户口径：接入到网站里面，标题就叫「总订单」）。
   · .totbar 是 iframe 上方那条小说明 + 「在新窗口打开」；
   · .totframe 高度由页面内联 JS 按窗口算，这里只给个兜底和边框。 */
/* ★ 2026-09-24 查票订单页的「删除」：批量按钮 + 行内按钮 + 二次确认的红色态
   （点第一下变「确认删？」，3 秒内再点一下才真删；不用 confirm()，弹窗会被压制） */
.delbtn{font-size:13px;padding:6px 11px;border:1px solid #f0c2bd;background:#fff;color:#b3261e;
  border-radius:7px;cursor:pointer}
.delbtn:hover{background:#fff5f4}
.link.delarm{color:#b3261e}
button.arm,.delbtn.arm{background:#ffe9e9!important;border-color:#f2b8b8!important;
  color:#b3261e!important;font-weight:600}

/* ★ 2026-09-24：导航精简成「总订单/查票概览/定时」后，手动同步按钮挪到概览页顶部这一条 */
.qsync{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 10px;
  padding:8px 12px;border:1px solid #e3e6ea;border-radius:9px;background:#fbfcfd;font-size:13px}
.qsync .muted{margin-right:auto}
.qsync form{margin:0}

.totbar{display:flex;align-items:center;gap:10px;margin:0 0 8px;flex-wrap:wrap}
.totbar .muted{margin-right:auto}
.totframe{display:block;width:100%;height:calc(100vh - 160px);min-height:520px;
  border:1px solid var(--line);border-radius:10px;background:#fff}

.flash{background:#fff8e1;border:1px solid #ffe08a;border-radius:8px;padding:10px 12px;margin-bottom:14px}

/* ★★ 2026-09-21 用户口径：「缩小 我不喜欢 两列」—— 概览卡片必须**一行放得下**。
   ★★ 2026-09-23 用户要求：「缩小方块 保持一列 加一个起飞前 5 小时内」——
   卡片从 9 张加到 10 张，所以再收一档：
     格子最小宽 124→118、间距 10→8、内边距 10/8→8/6、说明 13.5→12.5、数字 22→20。
   算账：10 张 = 10*118 + 9*8 = 1252 ≤ 1368（main{max-width:1400} − padding 16*2）✓
   —— 一行还留 ~116px 余量（窗口窄到 ~1330 仍是一行）。
   字变小后「🟢 已确认·已付款」「起飞前 5 小时内」这种长标签仍在一行内，不会把卡片撑高。
   ⚠️ 以后再**加卡片**：先按上面的算式复核，并同步 selftest 里那条「N 张一行放得下」的断言。 */
/* ★★ 2026-09-21 用户选定**模板 D**：「文字放大点 / 放在方块最上面 / 下面显示数量 / 现在不明显」。
   卡片结构改成「标签在上（主题色加粗居中）→ 数量在下」，整卡铺一层极浅的主题色底，
   一眼能分清每张是什么。`.card` 只有概览页（dashboard.html）在用，改这里不影响别的页面。 */
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(118px,1fr));gap:8px;margin-bottom:16px}
.card{background:var(--tint,#fff);border:1px solid var(--line);border-radius:10px;
      padding:8px 6px;text-align:center}
/* 标签**不许折行**（用户口径「宁可变宽、绝不可变厚」）：折了行卡片就变高，
   而这一行 10 张卡是等高排列的 → 一张折行会把整排都撑高。12.5px 下最长标签
   「🟢 已确认·已付款」≈97px < 内宽 104px（118−padding12−border2），放得下。 */
.card .l{color:var(--tone,var(--muted));font-size:12.5px;font-weight:700;line-height:1.35;white-space:nowrap}
.card .n{font-size:20px;font-weight:700;margin-top:1px}
/* 每张卡的主题色：--tone=标签/强调色，--tint=卡片底色（tb 蓝 / tg 绿 / tr 红 / ts 灰 / ty 黄） */
.card.tb{--tone:#1f4e79;--tint:#e8eef5}
.card.tg{--tone:#1a7f37;--tint:#e7f4ea}
.card.tr{--tone:#c0392b;--tint:#fbeceb}
.card.ts{--tone:#6b7280;--tint:#eef0f3}
.card.ty{--tone:#9a6700;--tint:#fdf3e0}

/* ★★ 2026-09-21：概览页卡片改成**可点击**（跳「订单」页并套用对应筛选）。
   这里只补「链接化」必需的几条：display:block 让 <a> 和原来的 <div> 一样撑满格子、
   color:var(--txt) 抵掉全局 a{color:var(--blue)}（否则数字会变蓝）、
   hover 去掉下划线并给一圈浅色提示。
   尺寸 / 间距 / 字号一律沿用上面的 .card —— 卡片高度和以前完全一致。 */
a.card{display:block;color:var(--txt);text-decoration:none}
a.card:hover{border-color:var(--blue);box-shadow:0 2px 10px rgba(31,78,121,.12);text-decoration:none}
a.card:focus-visible{outline:2px solid var(--blue);outline-offset:1px}

.panel{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:14px;margin-bottom:16px}
.panel h2{margin:0 0 10px;font-size:15px}
.row{display:flex;gap:8px;flex-wrap:wrap;align-items:flex-end}
label{display:block;font-size:12px;color:var(--muted);margin-bottom:3px}
input,select,textarea{font:inherit;padding:7px 9px;border:1px solid var(--line);
  border-radius:7px;background:#fff;min-width:110px;max-width:100%}
textarea{min-height:64px;width:100%}
button,.btn{font:inherit;padding:8px 14px;border:0;border-radius:7px;background:var(--blue);
  color:#fff;cursor:pointer;display:inline-block}
button:hover,.btn:hover{opacity:.92;text-decoration:none}
.btn.sec{background:#e9edf2;color:var(--txt)}
.btn.danger{background:var(--red)}

table{width:100%;border-collapse:collapse;background:var(--card)}
th,td{padding:8px 9px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top;font-size:13px}
th{background:#f0f3f7;font-weight:600;white-space:nowrap}
tr:hover td{background:#fafbfd}
.tag{display:inline-block;padding:1px 7px;border-radius:20px;font-size:12px;
  background:#eef2f7;color:#33415c;white-space:nowrap}
.tag.back{background:#f0f1f3;color:#4b5563;border:1px solid #e0e3e8}
.tag.flew{background:var(--blue);color:#fff;border:1px solid var(--blue)}   /* 已起飞标记：实心蓝底白字 */
/* 「定时任务跑的订单」表格里的查询状态小标签（2026-09-16） */
.tag.wait{background:#eef1f5;color:#6b7280;border:1px solid #e0e3e8}
.tag.run{background:#fff4cc;color:#8a6d00;border:1px solid #f0dfa0}
.tag.ok{background:#e3f5e6;color:#1e7b34;border:1px solid #bfe6c7}
.tag.err{background:#fdecea;color:#b3261e;border:1px solid #f2b8b5}
/* 右上角「重置」按钮（2026-09-21 由「急停」改名：强制停掉全部任务 + 关 VPN/浏览器 + 回到初始状态） */
.topright{margin-left:auto;display:flex;align-items:center;gap:22px}   /* 「对话」和「重置」拉开距离（2026-09-16 用户要求） */
.topright form{display:inline}

/* ★★ 2026-09-20 顶栏「查询进度条」（用户：「把进度条移到 我标记的那个地方，这样我无论在什么页面也能看到」）
   原在「订单」页顶部，现搬到顶栏中间（导航右边、VPN 徽标左边）：一行放完 = 文案 + 计数 + 细进度条 + 清空队列。
   口径：**宁可变宽、绝不可变厚** —— 2026-09-21 用户「进度条和字样稍微小了点，弄长一点、字体大一点」→
   字号 12→14px、条 160px→200~320px（弹性，有富余才变长）、按钮 11→12px；
   ⚠️ **宽度够时仍单行（≥1920px：顶栏 51.50px 不变）；不够时和以前一样换行**（1219px 仍 133.89px，与旧版同）。
   改宽度前先看这段的实测表（旧版在 ≤1600px 本来就会换行，别误当成回归）；
   不在查询时 JS 不加 .on → 整块 display:none，完全不占位（顶栏和以前一模一样）。
   ⚠️ 只有窄屏（≤900px）在「正在查询」期间会多占一行 —— 那是有查询在跑时才出现的临时状态。 */
.qbar{display:none;flex:1 1 auto;min-width:0;align-items:center;gap:10px;
  font-size:14px;line-height:1.45;color:#eaf2ff;white-space:nowrap;overflow:hidden}
.qbar.on{display:flex}
.qbar .qtext{font-weight:600;overflow:hidden;text-overflow:ellipsis;min-width:0}
.qbar .qcount{color:#cfe0f5;overflow:hidden;text-overflow:ellipsis;min-width:0}
.qbar .qtrack{flex:1 1 200px;min-width:160px;max-width:320px;height:5px;border-radius:3px;background:rgba(255,255,255,.28);overflow:hidden}
.qbar .qfill{display:block;height:100%;width:0;background:#fff;border-radius:3px;transition:width .4s ease}
.qbar form{display:inline;flex:0 0 auto;margin:0}
.qbar button{padding:3px 11px;font-size:12px;border-radius:6px;border:0;cursor:pointer;
  background:rgba(255,255,255,.92);color:var(--blue);font-weight:500}
.qbar button:hover{background:#fff}
@media (max-width:900px){                     /* 窄屏：整块换到单独一行，细条改成吃富余 */
  .qbar{flex:1 1 100%;font-size:12px;gap:8px}
  .qbar .qtrack{flex:1 1 auto;min-width:60px}
}
.btnstop{border:0;border-radius:6px;padding:6px 12px;font-size:13px;cursor:pointer;font-weight:500;color:#fff;background:#c0392b}
.btnstop:hover{background:#a93226}
/* ★ 2026-09-21：重置进行中（按钮显示「⏳ 重置中…」）—— 变淡 + 禁点，完成后由 JS 自动恢复 */
.btnstop.busy{background:#d9534f;opacity:.85;cursor:progress}
.btnstop[disabled]{cursor:progress}
.whoami{font-size:12px;color:var(--muted)}
.btnlogout{font-size:12px;color:var(--muted);text-decoration:none;border-bottom:1px dotted var(--muted)}
.btnlogout:hover{color:var(--blue);border-bottom-color:var(--blue)}
.btnchat{border:1px solid #cfdff0;border-radius:6px;padding:5px 11px;font-size:13px;cursor:pointer;
  font-weight:500;color:var(--blue);background:#e8eff7}
.btnchat:hover{background:#dbe8f5}
/* 右侧对话抽屉 */
.chatdrawer{position:fixed;top:0;right:0;bottom:0;width:350px;max-width:92vw;background:#fff;
  border-left:1px solid var(--line);box-shadow:-3px 0 14px rgba(0,0,0,.10);display:flex;
  flex-direction:column;z-index:80}
/* ★ 必须显式写：作者样式里的 display:flex 会盖掉浏览器默认的 [hidden]{display:none}，
   否则"隐藏"无效、抽屉会一直显示（2026-09-16 实测踩到） */
.chatdrawer[hidden]{display:none}
.btnchat.hasnew{border-color:#c0392b;color:#c0392b;background:#fdecea}
.chathead{display:flex;align-items:center;gap:8px;padding:10px 12px;border-bottom:1px solid var(--line);
  background:var(--blue);color:#fff;font-size:13px}
.chathead .muted{color:#dbe8f5;font-size:12px}
.chathead b{font-weight:500}
.chatx{margin-left:auto;background:transparent;border:0;color:#fff;font-size:18px;line-height:1;cursor:pointer}
.chatlist{flex:1;overflow-y:auto;padding:10px;background:#f7f9fb}
.chatmsg{max-width:86%;margin:6px 0;padding:7px 10px;border-radius:10px;font-size:13px;
  white-space:pre-wrap;word-break:break-word;line-height:1.5}
.chatmsg.me{margin-left:auto;background:var(--blue);color:#fff;border-bottom-right-radius:3px}
.chatmsg.ai{background:#fff;border:1px solid var(--line);color:var(--txt);border-bottom-left-radius:3px}
.chatts{display:block;font-size:10px;opacity:.6;margin-top:3px}
.chatform{display:flex;gap:6px;padding:9px;border-top:1px solid var(--line);background:#fff}
.chatform input{flex:1;min-width:0}
@media(max-width:640px){.chatdrawer{width:100vw;max-width:100vw}}
/* ===== 紧凑视图（2026-09-16 用户：手机上排版太大、效率低，要像电脑一样） ===== */
.btnview{border:1px solid var(--line);background:#fff;color:var(--txt);border-radius:6px;
  padding:4px 9px;font-size:12px;cursor:pointer;font-weight:500}
.btnview:hover{border-color:var(--blue);color:var(--blue)}
body.compact{--cf:9px}                      /* ← 紧凑视图的字号，想再大/小改这一个数就行 */
body.compact main{padding:4px}
body.compact .panel{padding:4px}
body.compact .topbar nav a{padding:2px 6px;font-size:10px}
body.compact th,body.compact td{font-size:var(--cf);padding:1px 3px;line-height:1.2}
body.compact .tag{font-size:8px;padding:0 3px}
body.compact code{font-size:var(--cf);padding:0 2px}
body.compact .muted,body.compact label{font-size:var(--cf)}
body.compact input,body.compact select,body.compact button{padding:2px 4px;font-size:10px}
body.compact .btnstop,body.compact .btnchat,body.compact .btnview{padding:2px 6px;font-size:10px}
body.compact .foot{font-size:9px;padding:6px}
body.compact h2{font-size:13px;margin:2px 0 6px}
body.compact .brand{font-size:13px}
body.compact .row{gap:4px}
body.compact .flash{font-size:9px;padding:4px 6px}
body.compact .depleg{white-space:nowrap}
body.compact table{white-space:nowrap}
body.compact .tablewrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
/* ★★ 2026-09-24 用户要求：**查票订单页不要底部那条滑块，整张表一屏看完**。
   → 这页的表格容器不再常驻 overflow-x；只有窗口真的窄到装不下（<1460px）时才给兜底，
     否则宁可让 main 满宽（orders.html 里 main{max-width:none}）也不让用户左右拖。 */
.orderspage .tablewrap{overflow-x:visible}
@media (max-width:1460px){ .orderspage .tablewrap{overflow-x:auto} }
/* 手机上原本会把表格"卡片化"——紧凑模式下恢复成真表格（选择器更具体，必然覆盖） */
@media (max-width:760px){
  body.compact table.resp thead{display:table-header-group}
  body.compact table.resp tr{display:table-row;border:0;border-radius:0;margin:0;padding:0;background:transparent}
  body.compact table.resp td{display:table-cell;border-bottom:1px solid var(--line);padding:1px 3px}
  body.compact table.resp td::before{content:none}
}
.depleg{display:block;white-space:nowrap}
/* ★ 2026-09-20：往返单在这一格里是两行（去程 / 回程，各自一行），行高 1.32×2 = 37.5px
   会把这行撑到 58px；订单页收到 1.28 更紧凑（只作用于订单页，不动别的页面） */
.orderspage .depleg{line-height:1.28}
.muted{color:var(--muted)}
.nowrap{white-space:nowrap}
.warn{background:#fff3cd}
.overdue{background:#fdecea}
.actions form{display:inline}
.bar{height:9px;background:#e9edf2;border-radius:6px;overflow:hidden;margin-top:8px}
.barfill{height:100%;width:0;background:var(--blue);transition:width .4s ease}
hr{border:0;border-top:1px solid var(--line)}
code{background:#eef2f7;padding:1px 5px;border-radius:4px;font-size:12px}

.formgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px}

@media (max-width:760px){
  .topbar nav a{padding:5px 9px;font-size:13px}
  main{padding:10px}
  /* 表格转卡片，手机上竖排可读 */
  table.resp thead{display:none}
  table.resp tr{display:block;border:1px solid var(--line);border-radius:10px;
    margin-bottom:10px;padding:6px 8px;background:#fff}
  table.resp td{display:flex;gap:10px;border:0;border-bottom:1px dashed #eef1f5;padding:6px 2px}
  table.resp td:last-child{border-bottom:0}
  table.resp td::before{content:attr(data-label);color:var(--muted);
    min-width:64px;flex:0 0 64px;font-size:12px}
}

/* ===== 「新增定时任务」美化（2026-09-21 用户选定**模板 1 · 紧凑网格**）=====
   口径：「小巧精致」—— 4 个字段并排一行、字号与间距整体收小、说明文字收成一行浅灰小字、
   颜色只做点缀。所有样式都限定在 .newtask 里，避免影响订单页/航司页等其它表单。
   表单字段名一个都没改：name / interval_hours / days_ahead / enabled / airline_pick。
   ★★ 用户特别交代：「启用」那格**保持原样**（还是原来那句「是；新建后先等一个间隔才跑…」），
      不要改成「新建即启用」。 */
.newtask{padding:12px 14px 13px}
.newtask .phead{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.newtask .phead h2{margin:0;font-size:13px}
/* 标题旁的小问号（原来那几行长说明收进它的悬停提示里，不再占版面） */
.newtask .qh{width:14px;height:14px;border-radius:50%;border:1px solid #cfd6de;color:#98a1ad;
  font-size:10px;line-height:12px;text-align:center;cursor:help;flex:0 0 14px}
.newtask .formgrid{grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;align-items:start}
.newtask label{font-size:11.5px;color:#7b8494;font-weight:600;margin-bottom:4px}
.newtask .req{color:var(--red);font-weight:700}
.newtask .hint{font-size:11px;color:#98a1ad;margin-top:3px;line-height:1.35}
.newtask .formgrid input:not([type=checkbox]){height:30px;font-size:12.5px;padding:0 8px;border-radius:6px}
.newtask input:focus,.newtask select:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(31,78,121,.14);outline:none}
/* 输入框右侧的单位后缀（小时 / 天） */
.newtask .ig{position:relative;display:block}
.newtask .ig input{width:100%;padding-right:34px}
.newtask .ig .unit{position:absolute;right:9px;top:50%;transform:translateY(-50%);
  color:#98a1ad;font-size:11.5px;pointer-events:none}
/* 航司：小胶囊（选中 = 浅蓝底 + 蓝字，比原来整块深蓝更轻） */
.newtask .pills{display:flex;gap:6px;flex-wrap:wrap}
.newtask .pill input{display:none}
.newtask .pill span{display:inline-block;padding:3px 11px;border:1px solid #e3e7ec;border-radius:14px;
  font-size:11.5px;background:#fff;cursor:pointer;color:#4b5563;transition:.15s}
.newtask .pill span:hover{border-color:var(--blue);color:var(--blue)}
.newtask .pill input:checked+span{background:#eef3f8;border-color:#9db8d2;color:var(--blue);font-weight:600}
.newtask .pill input:checked+span:hover{color:var(--blue)}
/* 启用：开关（★ 文案保持原样，只是字号跟着整体收小） */
.newtask .sw{display:flex;align-items:flex-start;gap:8px}
.newtask .swtxt{font-size:11.5px;color:#6b7280;line-height:1.35}
.newtask .switch{position:relative;display:inline-block;width:34px;height:19px;flex:0 0 34px;margin-top:1px}
.newtask .switch input{opacity:0;width:0;height:0;position:absolute;min-width:0}
.newtask .slider{position:absolute;inset:0;background:#cfd6de;border-radius:19px;cursor:pointer;transition:.2s}
.newtask .slider:before{content:"";position:absolute;height:15px;width:15px;left:2px;top:2px;
  background:#fff;border-radius:50%;transition:.2s;box-shadow:0 1px 3px rgba(0,0,0,.25)}
.newtask .switch input:checked+.slider{background:var(--green)}
.newtask .switch input:checked+.slider:before{transform:translateX(15px)}
/* 「限定航司」那一行：细分隔线 + 行内排布 */
.newtask .sect{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin-top:12px;padding-top:11px;border-top:1px solid #f1f3f6}
.newtask .sect>label{margin:0}
.newtask .btnrow{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:12px}
.newtask .btn-p{background:var(--blue);font-weight:500;padding:6px 14px;font-size:12.5px;border-radius:6px}
.newtask .btn-p:hover{opacity:1;background:#17405f}
.newtask .btn-s{background:#eef2f7;color:#33415c;padding:6px 14px;font-size:12.5px;border-radius:6px}
.newtask .btn-s:hover{opacity:1;background:#e3e9f0}
/* 紧凑视图（Aa）下同步缩小，别破坏原来的紧凑效果 */
body.compact .newtask{padding:6px}
body.compact .newtask .phead{margin-bottom:6px}
body.compact .newtask .hint{font-size:9px;margin-top:1px;line-height:1.25}
body.compact .newtask .pill span{padding:2px 8px;font-size:10px}
body.compact .newtask .swtxt{font-size:10px}
body.compact .newtask .switch{width:28px;height:16px;flex:0 0 28px}
body.compact .newtask .slider:before{height:12px;width:12px;left:2px;top:2px}
body.compact .newtask .switch input:checked+.slider:before{transform:translateX(12px)}
body.compact .newtask .ig input{padding-right:30px}
body.compact .newtask .ig .unit{font-size:9px;right:6px}
body.compact .newtask .btn-p,body.compact .newtask .btn-s{padding:3px 9px}
body.compact .newtask .sect,body.compact .newtask .btnrow{margin-top:7px}

/* ===== 订单「失效」标记（2026-09-16 用户要求：点了失效就不再查它）===== */
.tag.void{background:#f3f4f6;color:#8b95a3;border:1px solid #e3e6ea;text-decoration:line-through}
tr.voidrow td{background:#fbfbfc;color:#9aa4b2}
tr.voidrow td a{color:#9aa4b2}
tr.voidrow:hover td{background:#f7f8fa}

/* ===== 订单「备注」列（2026-09-16 用户要求：自己填，填过就不许自动改）===== */
input.rmk{width:160px;min-width:110px;font-size:12.5px}
input.rmk::placeholder{color:#b6bfca}
input.rmk.hasnote{background:#fffdf3;border-color:#f0dfa0}          /* 有备注 → 淡黄底，一眼能扫到 */
input.rmk.hasnote:focus{background:#fff}
input.rmk.ok{border-color:var(--green);box-shadow:0 0 0 3px rgba(26,127,55,.18)}   /* 存上了 */
input.rmk.err{border-color:var(--red);box-shadow:0 0 0 3px rgba(192,57,43,.18)}    /* 没存上 */
body.compact input.rmk{width:110px;font-size:var(--cf)}

/* ===== 订单表排版优化（2026-09-16 用户：状态 / 最近查询 被挤压、断行难看）=====
   思路：① 短内容列（标记/航司/PNR/航段/航程类型/价格）不许从中间断行；
        ② 需要两行的地方改成"按语义换行"——状态列「确认」「付款」各一行，
           最近查询列「日期」「时刻」各一行，既窄又不会出现「已确 / 认」这种断字。
   全部限定在订单页表格（table.orders），不动航司页 / 历史页 / 定时页同名的 data-label 列。 */
table.orders td[data-label="标记"],
table.orders td[data-label="航司"],
table.orders td[data-label="PNR"],
table.orders td[data-label="航段"],
table.orders td[data-label="航程类型"],
table.orders td[data-label="价格"]{white-space:nowrap}
/* ★ 只在"普通视图"生效：紧凑视图（Aa）本来就整表 nowrap，别再插换行把行撑高 */
body:not(.compact) table.orders .stline{display:block;white-space:nowrap}
body:not(.compact) table.orders .qtsline{display:block;white-space:nowrap;line-height:1.32}

/* ===== 订单页 · 方案 B「极简线框」（2026-09-16 用户从 4 套方案里选定）=====
   全部限定在 .orderspage 作用域内 —— 航司页 / 历史页 / 定时页 / 订单详情页完全不受影响。
   做法：一条竖线都不要；表头变浅灰小字；行分隔线更淡；价格右对齐并加粗；
        状态改成淡色小胶囊；已飞的行整行变淡；左侧 3px 色条（inset shadow）。
   ⚠️ 边界：本文件后半段的「紧凑视图」规则要跟着覆盖，否则紧凑模式下会被这里的
      padding / font-size 顶回去（特异性 .orderspage table.orders td 高于 body.compact td）。 */
.orderspage .panel.flat{padding:0;overflow:hidden}
.orderspage .phead{padding:15px 16px 6px;margin:0}
.orderspage .filters{padding:0 16px 14px}
.orderspage .psep{margin:0}
.orderspage .importrow{padding:12px 16px;margin:0}
.orderspage .toolbar{padding:13px 16px;margin:0;border-bottom:1px solid #eef0f3}

.orderspage table.orders{border-collapse:collapse}
.orderspage table.orders th{padding:7px 6px;font-size:11px;font-weight:600;color:#9aa1a9;
  letter-spacing:.4px;background:#fff;border-bottom:1px solid #e6e9ec}
.orderspage table.orders th.pr{text-align:right}
/* ★★ 2026-09-20 三次排版优化（用户：「这个界面的留白间隔过宽」）——
   上一次**只收横向**（10px 8px）是为了守「宁可变宽、绝不可变厚」；这次用户明确嫌留白多，
   于是**纵向也收回**：td 上下 10→6、左右 8→6；th 10px 8px → 7px 6px。
   另外两处「隐形留白」：① 备注输入框继承全局 `input{padding:7px 9px}` → 自身高 33.89px，
   是行高的主要来源（见下面 input.rmk 那条）；② 往返单的「起飞」格是两行，行高 1.32×2。
   A/B（2187px 窗口 / big 视图 / 83 行）：改前 行高 54.46（往返行 58.07）、表格宽 1767、无横滚。 */
.orderspage table.orders td{padding:6px 6px;font-size:12.5px;vertical-align:middle;
  border-bottom:1px solid #f2f4f6}
.orderspage table.orders td:first-child{padding-left:12px}

/* ★★ 2026-09-20 四次排版（用户：①「起飞标记改到中间、和勾选框分开一个位置，然后就能收窄」；
   ② 图2 标记的几列「再窄一点」）。
   ⚠️ 左侧第一列 135px 的真凶**不是 padding** —— 全局 `input,select,textarea{min-width:110px}`
      把**复选框**也撑到 110px 宽（实测 checkboxW=110）。先修它，「选」列立刻回到 28px。
   「已飞 ✈ / 已失效」标签同时从「选」列搬到中间的「标记」列（和圆点同一个位置，谁有谁上）。 */
.orderspage table.orders input[type="checkbox"]{min-width:0;width:13px;height:13px;padding:0;
  margin:0;vertical-align:middle}
/* ★ 2026-09-20 五次排版：颜色圆点去掉，「选」列并进「标记」列（能查的行=勾选框，
   已飞/已失效=标签），所以这一列（现在是第 1 列）居中、左右各 6px，不吃 first-child 的 12px */
.orderspage table.orders td[data-label="标记"]{text-align:center;padding-left:6px;padding-right:6px}
/* ★ 2026-09-20：表头那个「全选」勾选框原来靠左（th 默认 text-align:left），
   和 body 里居中的勾选框差了 6px → 看着没对齐。表头第 1 格也居中（和 td 同 padding）。 */
.orderspage table.orders th:first-child{text-align:center;padding-left:6px;padding-right:6px}
/* 圆点不再使用（保留规则，别的页面/老缓存页面还能正常显示） */
.orderspage table.orders td .dot{display:none}
.orderspage .tag.void{font-size:10.5px;padding:1px 4px}   /* 已失效 收到和 已飞 一样大（原 12px / 1px 7px） */
/* ★ 列宽：按**实测的内容需要宽度**钉住（need），富余宽度**全部留给「备注」输入框**
   （它是唯一可伸缩的一列，宽点还能多写字），于是订单号/姓名/价格这些列的多余空白就没了。
   need 实测（2187px 窗口）：订单号 151 / 姓名 206 / 航段 71 / 起飞 213 / 价格 50 / 状态 111 / 最近查询 70 / 操作 120。
   ⚠️ 钉的宽度必须 ≥ need：单元格是 nowrap，窄了会溢出到邻列，而 panel 是 overflow:hidden → 会被切掉。
   ⚠️ 表格 min-width:1400px：窄窗口仍交给 .tablewrap 的横向兜底，不压缩列宽（避免把内容挤溢）。 */
@media (min-width:900px){
  .orderspage table.orders{table-layout:fixed;min-width:1400px}
  /* ★ 2026-09-20 五次排版：「选」列并入「标记」列，14 列 → 13 列，编号整体前移一位 */
  .orderspage table.orders th:nth-child(1){width:64px}     /* 标记（勾选框 / 已飞 ✈ / 已失效） */
  .orderspage table.orders th:nth-child(2){width:44px}     /* 航司 */
  .orderspage table.orders th:nth-child(3){width:58px}     /* PNR */
  .orderspage table.orders th:nth-child(4){width:154px}    /* 订单号 */
  .orderspage table.orders th:nth-child(5){width:209px}    /* 姓名 */
  .orderspage table.orders th:nth-child(6){width:75px}     /* 航段 */
  /* ⚠️ 2026-09-20 修：钉 39px 时**表头「航程类型」4 个字装不下**（11px 字 ≈ 44px + 内边距 12
     = 56px），文字溢出到「起飞」表头、两个字头粘在一起。列宽必须 ≥ 表头文字宽度，不只是内容宽度。 */
  .orderspage table.orders th:nth-child(7){width:58px}     /* 航程类型 */
  .orderspage table.orders th:nth-child(8){width:217px}    /* 起飞（往返两段，再窄就折行） */
  .orderspage table.orders th:nth-child(9){width:53px}     /* 价格 */
  .orderspage table.orders th:nth-child(10){width:116px}   /* 状态 */
  .orderspage table.orders th:nth-child(11){width:74px}    /* 最近查询 */
  /* ★ 2026-09-24：124 → 178px —— 操作列现在是 5 个动作（查/记录/编辑/失效/删除），
     原来 124px 装不下，末尾被 panel 的 overflow:hidden 切掉（用户截图里「失效」后面就被切了）。 */
  .orderspage table.orders th:nth-child(13){width:178px}   /* 操作 */
  /* 12 = 备注：故意**不写宽度** → 吃掉全部富余宽度 */
}

/* ★★ 2026-09-20 批次订单表（原「定时」页的「定时任务跑的订单」，当天搬到「概览」页的「最近查询」）
   实测（2187px 窗口、29 行）：富余 = 订单号 79.8 / 姓名 78.4 / 状态备注 57.4 / 查询状态 44.4 /
   PNR 28.8 / 航司 22.4 / 价格 20.7；「起飞」列 cur=need=311.4 其实是**块级撑满**造成的假象，
   单段起飞文字实测只要 196.7px（`2026/9/11 00:30（京 9/10 22:30）`）——这是它看着空的真原因。
    做法：前 8 列按「内容需要 + 一点余量」钉住，**最后一列「查询时间」不写宽度 → 吃掉富余**
   （表格仍 `width:100%` 铺满卡片），于是被标记的那几列之间的空档全部消失。
   ⚠️ 试过 `width:auto`（整表按内容收紧到 971px）：列确实紧，但卡片右侧空出 368px、
      表格像「中途断掉」，而且和上面「已设任务」表（铺满）不一致 → **不要用 width:auto**。
   ⚠️ 也不能给最后一列写死宽度：那样列宽之和 < 表宽时，浏览器会把**所有**列按比例放大，
      钉死的宽度全部失效（订单号会从 184 涨回去）。
   ⚠️ 钉宽 ≥ need，否则 nowrap 内容溢出（`.panel` 是 overflow:hidden，会被切）。
    ★ 2026-09-20 用户要求「订单框里加上行程」→ 姓名后插入第 5 列「行程」（= 航段 SEL-SYD），
      后面所有列号顺移一位；列宽之和 1062 + 「查询时间」吃富余，概览页容器 1400 仍放得下、无横滚。 */
@media (min-width:900px){
  .srtable{table-layout:fixed}
  .srtable th:nth-child(1){width:56px}     /* 航司 */
  .srtable th:nth-child(2){width:70px}     /* PNR */
  .srtable th:nth-child(3){width:184px}    /* 订单号 */
  .srtable th:nth-child(4){width:180px}    /* 姓名 */
  .srtable th:nth-child(5){width:90px}     /* ★ 行程（SEL-SYD / TYO-SEL，内容 ≈56px + 内边距） */
  .srtable th:nth-child(6){width:214px}    /* 起飞（当地/北京）—— 单段文字 196.7 + 内边距 */
  .srtable th:nth-child(7){width:52px}     /* 价格 */
  .srtable th:nth-child(8){width:70px}     /* 查询状态（表头 4 字 52 + 内边距，实测最紧的一列） */
   .srtable th:nth-child(9){width:150px}    /* 状态备注（实测内容 139） */
   .srtable td.segcell{white-space:nowrap;font-family:Consolas,ui-monospace,monospace;
     font-size:11.5px;color:#5d6570}
   /* 10 = 查询时间：★ 2026-09-20 用户要求「后面加一个具体的查询时间补满」→ 它吃掉富余宽度，
      内容右对齐，时间就贴在表格右边界上（不写宽度 = 自适应吃满） */
   .srtable td.cktime{text-align:right;white-space:nowrap;color:#5d6570;font-variant-numeric:tabular-nums}
   .srtable th:nth-child(10){text-align:right}
 }

/* ★★ 2026-09-20 顶栏「VPN 出口」徽标（用户：VPN 可能掉线、人不在家，要能远程一眼看出）
   三种状态：ok=非大陆出口（LJ 能查）/ bad=中国大陆出口（查不了）/ unknown=探测失败 */
.vpnbadge{font-size:12px;line-height:1.4;padding:3px 9px;border-radius:999px;
  border:1px solid #cfd8e3;background:#f4f7fa;color:#5d6570;white-space:nowrap;cursor:pointer}
.vpnbadge.ok{background:#eaf7ef;border-color:#b7e0c6;color:#1f7a45}
.vpnbadge.bad{background:#fdecec;border-color:#f3c2c2;color:#b02a2a}
.vpnbadge.unknown{background:#f6f6f6;border-color:#e0e0e0;color:#8a8a8a}
.orderspage table.orders tbody tr:last-child td{border-bottom:0}
.orderspage table.orders tbody tr:hover td{background:#f8fbfd}
/* 左侧 3px 状态色条：green=正常 / red=异常 / n=未查 */
.orderspage table.orders tr.green td:first-child{box-shadow:inset 3px 0 0 var(--green)}
.orderspage table.orders tr.red td:first-child{box-shadow:inset 3px 0 0 var(--red)}
.orderspage table.orders tr.n td:first-child{box-shadow:inset 3px 0 0 #dfe3e8}
/* 已飞：整行变淡（状态胶囊有自己的颜色，不受影响） */
.orderspage table.orders tr.dim td{color:#a4abb3}
.orderspage table.orders tr.dim code{color:#a4abb3}
.orderspage table.orders tr.dim:hover td{background:#fbfcfd}

/* —— 单元格里的小零件 —— */
.orderspage .al{font-size:10.5px;font-weight:700;color:#fff;background:var(--blue);
  border-radius:4px;padding:1px 5px;letter-spacing:.4px;white-space:nowrap}
.orderspage code{background:transparent;padding:0;font-weight:700;font-size:12.5px;
  font-family:Consolas,ui-monospace,monospace;letter-spacing:.3px}
.orderspage .dot{width:7px;height:7px;border-radius:50%;display:inline-block;
  vertical-align:middle;flex:0 0 7px}
.orderspage .dot.green{background:var(--green)}
.orderspage .dot.red{background:var(--red)}
.orderspage .dot.gray{background:#c9ced6}
.orderspage .segc{white-space:nowrap}                 /* 航段 MEL-DPS 绝不断行 */
.orderspage .trip{font-size:11.5px;color:#6b7280;white-space:nowrap}
.orderspage .trip.rt{color:var(--blue)}
.orderspage .bj{font-size:11px;color:#9aa1a9}
.orderspage td.pr{text-align:right;font-weight:600;font-variant-numeric:tabular-nums;font-size:13px}
.orderspage .last{font-size:11.5px;color:#9aa1a9;white-space:nowrap}
/* 状态胶囊 */
.orderspage .stbox{display:inline-flex;align-items:center;gap:6px;border-radius:20px;
  padding:2px 10px;font-size:11.5px;white-space:nowrap}
.orderspage .stbox.green{background:#eaf7ef;color:#136c2f}
.orderspage .stbox.red{background:#fdeceb;color:#a93226}
.orderspage .stbox.gray{background:#f2f4f6;color:#767d85}
.orderspage .stbox .pay{color:#9aa1a9}
.orderspage .tag.flew{background:#e8eff7;color:var(--blue);border:1px solid #cfdff0}
/* 操作列：查 = 描边小按钮，其余 = 灰色小字 */
.orderspage td[data-label="操作"]{white-space:nowrap}
/* 操作列内部间距：不用改模板，直接给直接子元素统一右边距（和样张的 .ops gap:6px 对齐） */
.orderspage td[data-label="操作"] > *{margin-right:5px}
.orderspage td[data-label="操作"] > *:last-child{margin-right:0}
.orderspage td[data-label="操作"] .ico{background:transparent;border:1px solid #dfe3e8;
  color:#33415c;padding:3px 9px;font-size:12px;border-radius:6px;line-height:1.35;font-weight:400}
.orderspage td[data-label="操作"] .ico:hover{background:#eef2f7;border-color:#c8d2dc;opacity:1}
.orderspage td[data-label="操作"] a{font-size:12px;color:#6b7280}
.orderspage td[data-label="操作"] a:hover{color:var(--blue);text-decoration:none}
.orderspage td[data-label="操作"] .link{background:transparent;border:0;padding:0;
  font-size:12px;color:#6b7280;cursor:pointer;line-height:1.35;font-weight:400}
.orderspage td[data-label="操作"] .link:hover{color:var(--red)}
.orderspage td[data-label="操作"] .link.restore{color:var(--blue)}
.orderspage td[data-label="操作"] .link.restore:hover{text-decoration:underline}

/* 紧凑视图（Aa）：把上面的间距/字号再收回去，别把用户调好的紧凑模式顶坏 */
/* margin:0 必须补：基线 `body.compact h2{margin:2px 0 6px}` 特异性 (0,1,2) 会压过
   `.orderspage .phead{margin:0}` (0,1,0)，不补的话紧凑模式标题下会多出 6px 留白 */
body.compact .orderspage .phead{padding:6px 8px 2px;margin:0}
body.compact .orderspage .filters{padding:0 8px 6px}
body.compact .orderspage .importrow,body.compact .orderspage .toolbar{padding:5px 8px}
body.compact .orderspage table.orders th,
body.compact .orderspage table.orders td{font-size:var(--cf);padding:1px 4px}
body.compact .orderspage table.orders td:first-child{padding-left:5px}
body.compact .orderspage td.pr{font-size:var(--cf)}
body.compact .orderspage .al{font-size:8px;padding:0 3px;letter-spacing:0}
body.compact .orderspage .dot{width:5px;height:5px;flex:0 0 5px}
body.compact .orderspage .stbox{font-size:8px;padding:0 5px;gap:3px}
body.compact .orderspage .trip,body.compact .orderspage .last,
body.compact .orderspage .bj{font-size:var(--cf)}
body.compact .orderspage td[data-label="操作"] .ico,
body.compact .orderspage td[data-label="操作"] a,
body.compact .orderspage td[data-label="操作"] .link{font-size:10px}
body.compact .orderspage td[data-label="操作"] .ico{padding:1px 4px}

/* ===== 订单页宽度定稿（2026-09-17 用户拍板）=====
   决定：**不要「同行人」列**（用户原话：没有意义、还占地方）—— 一张预定多个旅客时
   **只取第一位**当姓名；并且「姓名」列必须**一行显示、不许折行挤压**。
   宽度账（容器约 1367px，现在 13 列）：删掉同行人列腾出的宽度全部给姓名，
   姓名能拿到 ~200px，足够放下库里最长的 POLOCHEARENAS-MARIANALUCIA（26 字符）。
   ⚠️ 因此下面这几条「为让宽度」的收窄**必须保留**：全部还原回原值的话总宽会超出容器
      ~35px，最右边「失效」又会被切掉。 */
.orderspage table.orders td[data-label="姓名"]{white-space:nowrap}   /* ★ 姓名一行到底 */
.orderspage input.rmk{width:100%;min-width:96px;padding:3px 7px}     /* 备注框跟着列宽自适应
   ★ 2026-09-20：补 `padding:3px 7px` —— 全局 `input{padding:7px 9px}` 让这个框高 33.89px，
     而 td 上下内边距只有 20px，所以「行高 54.46px」基本由它决定。收掉后行高直接降 ~8px。 */
/* —— 为给姓名让路而保留的收窄（别随手还原）—— */
.orderspage .stbox{padding:2px 6px;font-size:11px}                   /* 状态胶囊 */
.orderspage td[data-label="操作"] > *{margin-right:2px}             /* 操作列元素间距 5 → 2 */
.orderspage td[data-label="操作"] .ico{padding:3px 7px}
.orderspage td[data-label="操作"] .ico,
.orderspage td[data-label="操作"] a,
.orderspage td[data-label="操作"] .link{font-size:11px}             /* 操作列文字 12 → 11 */
.orderspage .tag.flew{font-size:10.5px;padding:1px 4px}             /* 已飞小标签 */
/* 姓名列的兜底：现在列宽 214px、最长名 194px（余量 20px）。
   以后出现更长姓名时，宁可显示「…」也不要溢出到「航段」列上（悬停暂无 tooltip，够长再说）。 */
.orderspage table.orders td[data-label="姓名"]{overflow:hidden;text-overflow:ellipsis}

/* ★ 2026-09-20 新增「订单号」列（用户要求：网页端各页面都能看到源表的订单号）。
   ⚠️ 用户口径（当天二次修正，别再改回去）：**宁可整张表变宽，也绝不能让行变厚** ——
      折行方案（max-width + word-break）会把每行撑成 3 行高（实测 89px），已被否掉。
      这里一律**单行不换行**，号码长就把这一列撑宽。 */
.orderspage table.orders td[data-label="订单号"]{
  white-space:nowrap;
  font-family:Consolas,ui-monospace,monospace;font-size:11px;color:#6b7280}
body.compact .orderspage table.orders td[data-label="订单号"]{font-size:9.5px}
/* ★★ 2026-09-20 二次定稿（用户口径：「订单页的订单表需要扩宽，加了订单号后底部出现了滑块，
   不方便，我需要一眼就看到全部内容」）—— 结论：**放宽这一页的容器**，不是把表格挤窄。
   - 加了「订单号」列（23 位，单行不折行）后整表最小宽 1492px > main 的 1367px → 底部冒滑块；
   - 现在的组合拳：
     ① 订单页容器 1400px → 1800px（写在 templates/orders.html 的 <style> 里，
        因为要改的是祖先 main，没法用 .orderspage 作用域；只有订单页渲染它，其它页面宽度不变）；
     ② 本表 th/td 左右内边距 10px → 8px（**只收横向，纵向仍是 10px → 行高一点都不变**，
        守住用户「宁可变宽、绝不可变厚」的口径）。
    实测最小宽 1492 → ~1436px：窗口 ≥ ~1470px 就整表放得下、底部不再有滑块（用户机器窗口 ~2187px，余量很大）。 */
/* ⚠️⚠️ 2026-09-24 修订：这里原来那条**常驻** `.orderspage .tablewrap{overflow-x:auto}` 已删。
   原因：它和文件前段（约 190~194 行）**同选择器、同特异性**，靠后的会覆盖靠前的
   → 前段「订单页常驻 overflow-x:visible + 窄窗口才兜底」的改动被它悄悄顶掉（改了个寂寞）。
   现在全页只有前段那一条在管 .orderspage .tablewrap，**别再在这里写同选择器的 overflow-x**。 */

/* ===== 2026-09-17 手机端排版修正 v2 =====
   ⚠️ 全部规则都在 @media (max-width:760px) 内 —— **桌面版完全不受影响**。
   背景：定时页「已设任务」表 9 列 + 内嵌输入框，紧凑视图下表格不换行、又没包滚动容器
        → 把整页撑宽（实测 docSW 663px vs 视口 495px，右边全被切）。
   v1 我改成竖排卡片 → 用户否掉（"太厚了，我还是喜欢横向的"）。
   v2 定稿：① 表保持**表格 + 横向滚动**（矮）；② 内嵌输入框收窄；③ 首列吸顶，横滑不迷路；
           ④ 新增任务表单手机端排**两列**（矮一半）。 */
@media (max-width:760px){
  /* ① 滚动容器兜底（紧凑视图下表格是不换行的，必须能横滑） */
  .tablewrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
  /* ② 已设任务表：仍是表格，但更紧凑；第一列吸顶（横滑时知道看的是哪一行） */
  table.sched{white-space:nowrap}
  table.sched th, table.sched td{padding:3px 6px;font-size:12px}
  table.sched th{font-size:11px}
  table.sched th:first-child, table.sched td:first-child{
    position:sticky;left:0;background:#fff;z-index:2;box-shadow:1px 0 0 var(--line)}
  table.sched td input{font-size:12px;padding:3px 5px;min-width:62px!important;width:auto!important}
  table.sched td input[type=checkbox]{min-width:0!important}
  body.compact table.sched{white-space:nowrap}
  body.compact table.sched th, body.compact table.sched td{padding:2px 5px;font-size:11px}
  body.compact table.sched td input{padding:2px 4px;font-size:11px;min-width:56px!important}
  /* ③ 新增任务表单：手机端两列（比竖排矮一半）—— 只作用于 .newtask，不影响别的页面的 .formgrid */
  .newtask .formgrid{grid-template-columns:repeat(2,minmax(0,1fr))!important;gap:8px 10px}
  .newtask .formgrid label{font-size:12px}
  .newtask .formgrid input, .newtask .formgrid select{font-size:12px;padding:4px 6px}
  .newtask .formgrid .hint, .newtask .formgrid .muted{font-size:11px;line-height:1.35}
  .newtask .formgrid > div:nth-child(4){grid-column:1 / -1}   /* 「启用」开关独占一行，别挤窄 */
  /* ④ 兜底：输入框/代码块不许把页面撑宽 */
  .panel input, .panel select, .panel textarea{max-width:100%;box-sizing:border-box}
  .panel pre{overflow-x:auto;max-width:100%}
  /* ⑤ 说明块、顶栏收紧一点（内容不变） */
  .intro p{font-size:12px;line-height:1.5}
  .intro h2{font-size:15px}
  .topbar{padding:6px 8px}
  .topbar nav a{padding:3px 7px;font-size:12px}
}


/* ===== 2026-09-17 手机端：订单表不用卡片（修正版 v3.1）=====
   ⚠️ 全部在 @media (max-width:760px) 内 —— 桌面版完全不受影响。
   用户口径：「手机端订单不要卡片，很难翻」→ 手机上订单表一律表格 + 横向滚动。
   ⚠️⚠️ 关键坑（第一版写错，导致用户看到"订单标题对不上"）：
       原卡片模式把 thead 设成 display:none、tr/td 设成 block；
       恢复表格时 **tbody 必须还原成 table-row-group**，我第一版误写成 `display:table`
       → thead 与 tbody 变成两张各自独立的表、列宽各算各的：
       实测（495px 宽、13 列）表头第一格被撑到 1317px、后面标题全挤到 x=1328 之外，
       而表体列正常（142/27/48…）→ 标题和内容完全对不上。
   ⚠️ 这里**刻意不加 sticky**（首列/表头都不吸顶）：sticky 单元格会触发表格重新计算列宽，
       容易再次错位；宁可简单可靠。（要吸顶就单独改、并且必须重新量 th 与 td 的 x 是否逐列一致。） */
@media (max-width:760px){
  table.resp{display:table!important}
  table.resp tbody{display:table-row-group!important}
  table.resp thead{display:table-header-group!important}
  table.resp tr{display:table-row!important;border:0!important;border-radius:0!important;
    margin:0!important;padding:0!important;background:transparent!important}
  table.resp th{display:table-cell!important;border-bottom:1px solid var(--line)!important}
  table.resp td{display:table-cell!important;border-bottom:1px solid var(--line)!important;white-space:nowrap}
  table.resp td::before{content:none!important}
}

/* ===== 2026-09-17 手机端排版修正 v4：已设任务改成"新增任务"同款表单样式 =====
   ⚠️ 仍在 @media (max-width:760px) 内 —— 桌面版保持原来的表格，完全不受影响。
   用户：「已设定任务 样式不好看 改成 新增任务一样的样式」
   → 手机端把这张表改成**两列表单**：每条任务一张卡，卡内 2 列网格，
     每个字段"标签在上（用 td 的 data-label）、输入框在下"，与「新增定时任务」的 .formgrid 观感一致。
   注意（踩过的坑）：这张表在紧凑视图下会被 `body.compact table{white-space:nowrap}` 影响，
   所以这里要显式改回 normal；display 类属性一律 !important 覆盖紧凑与卡片两套旧规则。 */
@media (max-width:760px){
  table.sched{display:block!important;white-space:normal!important;background:transparent!important;border:0!important}
  table.sched thead{display:none!important}
  table.sched tbody{display:block!important}
  table.sched tr{
    display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr));
    gap:8px 10px;border:1px solid var(--line);border-radius:10px;
    background:#fff;padding:10px;margin:0 0 10px}
  table.sched td{
    display:block!important;border:0!important;padding:0!important;
    min-width:0;white-space:normal!important}
  /* ⚠️ 必须带 !important：这张表同时有 `resp` 类，会被上面 v3.1 的
     `table.resp td::before{content:none!important}` 盖掉（踩过一次） */
  table.sched td::before{
    content:attr(data-label)!important;display:block!important;color:var(--muted);
    font-size:12px;line-height:1.7;margin-bottom:2px}
  table.sched td input{width:100%!important;max-width:100%!important;min-width:0!important;box-sizing:border-box}
  table.sched td input[type=checkbox]{width:auto!important;margin:2px 0}
  /* 长内容/按钮独占一整行 */
  table.sched td[data-label="上次结果"],
  table.sched td[data-label="操作"]{grid-column:1 / -1}
  table.sched td[data-label="操作"]{display:flex!important;gap:8px;flex-wrap:wrap;align-items:center}
  table.sched td[data-label="上次执行"],
  table.sched td[data-label="下次执行"]{font-size:12px}
}
