/* ===== 主题变量 (2026-08 新版配色: 深蓝主色 + 柔和底) ===== */
:root{
  --bg:#eef2f7;--card:#ffffff;--card2:#f4f7fb;--ink:#17233b;--mut:#5b6b85;
  --ac:#1d4ed8;--ac-soft:#dbe7ff;--ok:#059669;--bad:#dc2626;--warn:#d97706;
  --line:#e2e8f0;--line2:#eef1f6;--input-bg:#fff;--input-line:#cbd5e1;
  --badge-info-bg:#e3ecff;--badge-info-ink:#1d4ed8;
  --badge-ok-bg:#e5f7ef;--badge-ok-ink:#047857;
  --badge-warn-bg:#fdf0dc;--badge-warn-ink:#b45309;
  --badge-over-bg:#fdeaea;--badge-over-ink:#b91c1c;
  --chip-bg:#e3ecff;--chip-line:#b9ccf5;--chip-ink:#1d4ed8;--chip-hover:#d3e0fb;
  --chip-on-bg:#d7f3e7;--chip-on-line:#6fd3ac;--chip-on-ink:#047857;
  --warn-bg:#fdeaea;--warn-ink:#b91c1c;--warn-line:#f5c2c2;
  --okcard-bg:#e5f7ef;--okcard-ink:#047857;--okcard-line:#a7e3c8;
  --over-card-line:#f5c2c2;--over-card-bg:#fff8f8;
  --prog-bg:#e2e8f0;--shadow:rgba(29,78,216,.08);
  --hub-big:#ffffff;--hub-line:#dfe7f3;
}
:root[data-theme="dark"]{
  --bg:#0d1220;--card:#151c2e;--card2:#111827;--ink:#dbe4f5;--mut:#8fa0c0;
  --ac:#4f7dff;--ac-soft:#1d2b4d;--ok:#22c55e;--bad:#ef4444;--warn:#f59e0b;
  --line:#26314a;--line2:#1f2937;--input-bg:#1a2236;--input-line:#334155;
  --badge-info-bg:#1c2b52;--badge-info-ink:#93b4ff;
  --badge-ok-bg:#0b2e22;--badge-ok-ink:#5ee6a8;
  --badge-warn-bg:#3a2a0c;--badge-warn-ink:#fcd07a;
  --badge-over-bg:#3a1114;--badge-over-ink:#fda4a4;
  --chip-bg:#1c2b52;--chip-line:#32436e;--chip-ink:#93b4ff;--chip-hover:#24355f;
  --chip-on-bg:#0b2e22;--chip-on-line:#16a34a;--chip-on-ink:#5ee6a8;
  --warn-bg:#3a1114;--warn-ink:#fda4a4;--warn-line:#7f1d1d;
  --okcard-bg:#0b2e22;--okcard-ink:#5ee6a8;--okcard-line:#166534;
  --over-card-line:#7f1d1d;--over-card-bg:#1c1111;
  --prog-bg:#26314a;--shadow:rgba(0,0,0,.45);
  --hub-big:#151c2e;--hub-line:#26314a;
}

/* ===== 基础 ===== */
*{box-sizing:border-box}
body{font-family:system-ui,-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;background:var(--bg);color:var(--ink);margin:0;transition:background .2s,color .2s}
.container{max-width:560px;margin:0 auto;padding:14px}
.card{background:var(--card);border-radius:12px;padding:16px;margin-bottom:12px;box-shadow:0 1px 3px var(--shadow)}
h1{font-size:20px;margin:0 0 4px}
h2{font-size:16px;margin:0 0 8px}
p{margin:6px 0}
label{display:block;font-size:13px;color:var(--mut);margin:10px 0 4px}
input,select{width:100%;padding:10px;border:1px solid var(--input-line);border-radius:8px;font-size:16px;background:var(--input-bg);color:var(--ink)}
input[type=file]{padding:8px;font-size:14px}
/* 已有工单列表行 (checkbox 唔受 width:100% 影响) */
.jobck{width:18px;height:18px;padding:0;flex:none;accent-color:var(--primary)}
.jobrow{display:flex;align-items:center;gap:10px;padding:9px 2px;border-bottom:1px dashed var(--line2)}
.jobmain{flex:1;min-width:0}
.jobcode{font-weight:700;color:var(--ink);text-decoration:none;font-size:15px}
.jobmeta{color:var(--mut);font-size:12px;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.btn{display:inline-block;padding:10px 16px;border:0;border-radius:8px;background:var(--line);font-size:15px;cursor:pointer;text-decoration:none;color:var(--ink);text-align:center;margin:4px 0}
.btn.primary{background:var(--ac);color:#fff;width:100%;margin-top:12px}
.btn.ok{background:var(--ok);color:#fff}
.hidden{display:none}
.warn{background:var(--warn-bg);color:var(--warn-ink);border:1px solid var(--warn-line);border-radius:12px;padding:14px;margin-bottom:12px}
.okcard{background:var(--okcard-bg);color:var(--okcard-ink);border:1px solid var(--okcard-line);border-radius:12px;padding:16px;margin-bottom:12px}
table{width:100%;border-collapse:collapse;font-size:13px}
th,td{padding:6px 4px;text-align:left;border-bottom:1px solid var(--line2);vertical-align:top}
tr.over td{background:var(--warn-bg);color:var(--warn-ink)}
tr.done td{color:var(--mut)}
.tl{list-style:none;padding:0;margin:0;border-left:2px solid var(--line);margin-left:8px;padding-left:18px}
.tl li{position:relative;padding:10px 0}
.tl li::before{content:"";position:absolute;left:-24px;top:15px;width:10px;height:10px;border-radius:50%;background:var(--ac)}
.tl li.ng::before{background:var(--bad)}
.tl li.ok::before,.tl li.ship::before{background:var(--ok)}
.tl .t{font-size:12px;color:var(--mut);margin-top:2px}
.badge{display:inline-block;background:var(--badge-info-bg);color:var(--badge-info-ink);border-radius:6px;padding:2px 8px;font-size:12px}
.badge.done{background:var(--badge-ok-bg);color:var(--badge-ok-ink)}
.badge.over{background:var(--badge-over-bg);color:var(--badge-over-ink)}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:4px 12px}
.grid2 .lbl{color:var(--mut);font-size:12px}
.chips{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0}
.chip{display:inline-block;padding:8px 12px;border-radius:999px;border:1px solid var(--chip-line);background:var(--chip-bg);color:var(--chip-ink);font-size:14px;cursor:pointer;margin:0}
.chip:hover{background:var(--chip-hover)}
.chip-on{background:var(--chip-on-bg);border-color:var(--chip-on-line);color:var(--chip-on-ink);opacity:.75;cursor:default}
.chip:disabled{cursor:default}
/* 首页总览 */
.stats{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:10px}
.stat{display:block;background:var(--card2);border:1px solid var(--line2);border-radius:12px;padding:12px;text-decoration:none;color:var(--ink)}
.stat-n{font-size:26px;font-weight:700;line-height:1.1}
.stat-l{font-size:12px;color:var(--mut);margin-top:2px}
.stat-red .stat-n{color:var(--bad)}
/* Tab 页签 */
.tabs{display:flex;gap:6px;overflow-x:auto;margin:0 0 12px;padding-bottom:2px;-webkit-overflow-scrolling:touch}
.tab{flex:0 0 auto;white-space:nowrap;padding:9px 14px;border-radius:10px;border:1px solid var(--line);background:var(--card);font-size:14px;cursor:pointer;color:var(--mut)}
.tab.active{background:var(--ac);color:#fff;border-color:var(--ac);font-weight:600}
/* 看板卡片 */
.sec{font-size:14px;margin:16px 0 8px;color:var(--mut);display:flex;align-items:center;gap:6px}
.cnt{display:inline-block;background:var(--line);color:var(--mut);border-radius:999px;padding:0 8px;font-size:12px;line-height:18px}
.job-card{display:block;background:var(--card);border-radius:12px;padding:12px 14px;margin-bottom:10px;box-shadow:0 1px 3px var(--shadow);text-decoration:none;color:var(--ink);border:1px solid transparent}
.job-card:active{transform:scale(.995)}
.job-card.over{border-color:var(--over-card-line);background:var(--over-card-bg)}
.job-card.done{opacity:.72}
.jc-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px}
.jc-top b{font-size:15px}
.jc-mid{display:flex;align-items:center;gap:8px;margin:8px 0 4px;flex-wrap:wrap}
.prog{height:6px;border-radius:999px;background:var(--prog-bg);overflow:hidden;margin:6px 0 4px}
.bar{height:100%;background:var(--ac);border-radius:999px}
.bar-done{background:var(--ok)}
.bar-over{background:var(--bad)}
.badge.info-b{background:var(--badge-info-bg);color:var(--badge-info-ink)}
.badge.ok-b{background:var(--badge-ok-bg);color:var(--badge-ok-ink)}
.badge.warn-b{background:var(--badge-warn-bg);color:var(--badge-warn-ink)}
.badge.over-b{background:var(--badge-over-bg);color:var(--badge-over-ink)}
/* 时间线 */
.tl{list-style:none;padding:0;margin:0;border-left:2px solid var(--line);margin-left:10px;padding-left:18px}
.tl li{position:relative;padding:10px 0}
.tl li::before{content:"";position:absolute;left:-25px;top:16px;width:12px;height:12px;border-radius:50%;border:2px solid var(--card);box-shadow:0 0 0 2px var(--ac)}
.tl li.tl-in::before{box-shadow:0 0 0 2px var(--ac)}
.tl li.tl-out::before{box-shadow:0 0 0 2px var(--warn)}
.tl li.tl-ok::before,.tl li.tl-ship::before{box-shadow:0 0 0 2px var(--ok)}
.tl li.tl-ng::before{box-shadow:0 0 0 2px var(--bad)}
.tl li.tl-claim::before{box-shadow:0 0 0 2px #7c3aed}
.tl li.last{font-weight:600}
.tl .t{font-size:12px;color:var(--mut);margin-top:2px}
.tl .time{font-size:12px;color:var(--mut)}
.jobstep{display:flex;align-items:center;gap:6px;padding:4px 0;font-size:14px;border-bottom:1px dashed var(--line2)}
.jobstep a{color:var(--bad);text-decoration:none;font-size:13px;margin-left:auto;padding:0 6px}
video#cam{width:100%;max-height:320px;border-radius:12px;background:#000;margin:8px 0}
.qa-btn{display:block;background:#f8fafc;border:1px solid #eef0f2;border-radius:12px;padding:16px 8px;font-size:16px;cursor:pointer;color:var(--ink);width:100%}
.qa-btn:active{transform:scale(.97)}
.qa-btn:disabled{opacity:.45;cursor:default}
img.thumb{max-width:120px;border-radius:8px;margin-top:6px}
.small{font-size:12px;color:var(--mut)}
#last{font-size:12px;color:var(--mut);margin-bottom:8px}
/* 模式切换按钮 (右上角) */
.lang-btns{position:fixed;top:8px;right:8px;z-index:99;display:flex;gap:2px;background:var(--card);border:1px solid var(--input-line);border-radius:8px;padding:2px}
.lang-btns button{border:0;background:none;color:var(--mut);font-size:12px;padding:3px 8px;border-radius:6px;cursor:pointer}
.lang-btns button.on{background:var(--ac);color:#fff;font-weight:700}
.mode-btn{position:fixed;top:8px;z-index:99;padding:4px 8px;border-radius:6px;border:1px solid var(--input-line);background:var(--card);color:var(--ink);font-size:13px;cursor:pointer}
#themeBtn{right:118px}
#layoutBtn{right:164px}

/* ===== PC 布局 (自动 ≥768px 或 手动 body.layout-pc) ===== */
@media (min-width:768px){
  body:not(.layout-phone) .container{max-width:1100px}
  body:not(.layout-phone) #sections, body:not(.layout-phone) #board, body:not(.layout-phone) #body{
    display:grid;grid-template-columns:repeat(3,1fr);gap:12px;align-items:start}
  body:not(.layout-phone) #body{grid-template-columns:repeat(2,1fr)}
  body:not(.layout-phone) .sec{grid-column:1/-1}
  body:not(.layout-phone) .job-card{margin-bottom:0}
  body:not(.layout-phone) .stats{grid-template-columns:repeat(4,1fr)}
}
body.layout-pc .container{max-width:1100px}
body.layout-pc #sections, body.layout-pc #board, body.layout-pc #body{
  display:grid;grid-template-columns:repeat(3,1fr);gap:12px;align-items:start}
body.layout-pc #body{grid-template-columns:repeat(2,1fr)}
body.layout-pc .sec{grid-column:1/-1}
body.layout-pc .job-card{margin-bottom:0}
body.layout-pc .stats{grid-template-columns:repeat(4,1fr)}
/* 手动锁手机布局 */
body.layout-phone .container{max-width:560px}
body.layout-phone #sections, body.layout-phone #board, body.layout-phone #body{display:block}

/* ===== 功能中心 (首页) ===== */
.hub-hero{background:linear-gradient(135deg,var(--ac) 0%,#3b6cf0 100%);color:#fff;border-radius:16px;padding:20px 18px;margin-bottom:14px;box-shadow:0 6px 18px rgba(29,78,216,.25)}
.hub-hero h1{color:#fff;font-size:22px;margin:0 0 4px}
.hub-hero p{color:rgba(255,255,255,.85);margin:0;font-size:13px}
.hub-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.hub-card{display:block;background:var(--hub-big);border:1px solid var(--hub-line);border-radius:16px;padding:18px 14px;text-decoration:none;color:var(--ink);box-shadow:0 2px 8px var(--shadow);transition:transform .1s,box-shadow .1s}
.hub-card:active{transform:scale(.98)}
.hub-card .hc-ico{font-size:30px;display:block;margin-bottom:8px}
.hub-card .hc-name{font-size:16px;font-weight:700;display:block;margin-bottom:4px}
.hub-card .hc-sub{font-size:12px;color:var(--mut);line-height:1.5}
.hub-card.wide{grid-column:1/-1}
@media (min-width:768px){
  body:not(.layout-phone) .hub-grid{grid-template-columns:repeat(3,1fr)}
}
body.layout-pc .hub-grid{grid-template-columns:repeat(3,1fr)}

/* ===== 每日计划 ===== */
.plan-datebar{display:flex;align-items:center;gap:8px;margin-bottom:10px}
.plan-datebar .btn{padding:8px 14px;margin:0}
.plan-datebar input[type=date]{flex:1;padding:8px}
.plan-add{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:6px}
.plan-add input[type=text]{flex:2;min-width:140px}
.plan-add select{flex:1;min-width:90px}
.plan-add input[type=number]{flex:0 0 70px}
.plan-add .btn{flex:0 0 auto;margin:0}
.plan-task{display:flex;align-items:center;gap:10px;padding:10px 4px;border-bottom:1px dashed var(--line2)}
.plan-task input[type=checkbox]{width:22px;height:22px;accent-color:var(--ok);flex:0 0 auto}
.plan-task .pt-main{flex:1;min-width:0}
.plan-task .pt-task{font-size:15px;word-break:break-word}
.plan-task.done .pt-task{color:var(--mut);text-decoration:line-through}
.plan-task .pt-meta{font-size:12px;color:var(--mut);margin-top:2px}
.plan-task .pt-del{background:none;border:0;color:var(--bad);font-size:16px;cursor:pointer;padding:4px 8px}
.plan-task.overdue{border-left:3px solid var(--bad);background:var(--over-card-bg);border-radius:6px;padding-left:10px}
.plan-summary{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--mut);margin:8px 0}
.plan-summary .bar{flex:1;max-width:200px}
