/* 实训通 · 终末地工业编辑风：纸与墨是主体，信号黄只标记「现在该看这里」 */
:root{
  --paper:#f2f2f0; --paper-2:#e6e6e2; --surface:#fafaf7;
  --ink:#191919; --ink-2:#5c5d59;
  --rule:#c9cac4; --rule-2:#a8a9a3;
  --signal:#fffa00; --signal-ink:#6b5d00;
  --ok:#0f7b4f; --warn:#b26205; --bad:#b3261e;
  --on-ink:#f2f2f0;
  --ok-soft:#edf5ef; --warn-soft:#f4e8d9; --bad-soft:#f2e1df; --signal-wash:#f8f6cf;
  --warn-ink:#8a4b03;
  --overlay:rgba(25,25,25,.72); --overlay-photo:rgba(12,12,10,.88); --ink-hover:rgba(242,242,240,.10);
  --font-cn:"Noto Sans SC","Source Han Sans SC","PingFang SC","Microsoft YaHei",sans-serif;
  --font-display:"Arial Narrow","Roboto Condensed","DIN Condensed",sans-serif;
  --font-mono:"IBM Plex Mono","SFMono-Regular",Consolas,monospace;
}
*{box-sizing:border-box;border-radius:0;-webkit-tap-highlight-color:transparent}
[hidden]{display:none !important}
html,body{margin:0;padding:0;max-width:100%}
body{font-family:var(--font-cn);background:var(--paper);color:var(--ink);font-size:15px;line-height:1.55;
  padding-bottom:env(safe-area-inset-bottom);overflow-wrap:break-word;font-variant-numeric:tabular-nums}
button{font:inherit;cursor:pointer;border-radius:0}
input,select,textarea{font:inherit}
::selection{background:var(--signal);color:var(--ink)}
a{color:var(--ink);text-decoration:none}

/* 登录 / 口令 */
.login{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;
  background:var(--ink);position:relative;overflow:hidden}
.login::before{content:'';position:absolute;inset:0;pointer-events:none;
  background-image:linear-gradient(var(--ink-hover) 1px,transparent 1px),
    linear-gradient(90deg,var(--ink-hover) 1px,transparent 1px);
  background-size:44px 44px}
.login::after{content:'';position:absolute;left:0;right:0;top:0;height:3px;background:var(--signal)}
.login-card{position:relative;width:100%;max-width:380px;background:var(--surface);
  border:1px solid var(--rule-2);border-top:3px solid var(--signal);padding:28px 22px;z-index:1}
.login-card::after{content:'';position:absolute;right:6px;bottom:6px;width:10px;height:10px;
  border-right:1px solid var(--rule-2);border-bottom:1px solid var(--rule-2);pointer-events:none}
.brand{text-align:center;margin-bottom:22px}
.logo{font-family:var(--font-display);font-size:28px;font-weight:800;letter-spacing:.18em;color:var(--ink);text-transform:uppercase}
.sub{margin:6px 0 0;color:var(--ink-2);font-size:11px;letter-spacing:.12em;font-family:var(--font-mono)}
.field{display:block;margin-bottom:14px}
.field span{display:block;font-family:var(--font-display);font-size:10px;letter-spacing:.12em;
  text-transform:uppercase;color:var(--ink-2);margin-bottom:6px}
.demo-tip{margin-top:18px;font-size:11px;color:var(--ink-2);line-height:1.8;
  border-top:1px dashed var(--rule);padding-top:14px;font-family:var(--font-mono)}
.install-tip{margin-top:16px;border-top:1px dashed var(--rule);padding-top:14px;text-align:center}
.install-title{font-family:var(--font-display);font-weight:700;font-size:12px;letter-spacing:.12em;color:var(--signal-ink)}
.install-help{font-size:12px;color:var(--ink-2);line-height:1.7;margin-top:6px}
#pwa-install-btn{margin-top:10px}
.gate-err{color:var(--bad);font-size:12px;line-height:1.5;background:var(--bad-soft);
  border:1px solid var(--bad);border-left-width:3px;padding:9px 12px;margin:12px 0 0}

/* 外壳 / 顶栏 */
.topbar{position:sticky;top:0;z-index:40;display:flex;justify-content:space-between;align-items:center;gap:12px;
  padding:12px 16px;background:var(--ink);color:var(--on-ink);border-bottom:2px solid var(--signal)}
#tb-title{display:flex;align-items:center;gap:8px;font-family:var(--font-display);font-weight:700;
  font-size:16px;letter-spacing:.12em;text-transform:uppercase;color:var(--on-ink);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:54vw}
#tb-title::before{content:'';width:8px;height:8px;background:var(--signal);flex:0 0 auto}
.chip{font-family:var(--font-mono);font-size:11px;letter-spacing:.02em;color:var(--on-ink);
  background:transparent;border:1px solid var(--rule-2);padding:4px 8px;
  max-width:58vw;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
#main{padding:18px 14px calc(96px + env(safe-area-inset-bottom));max-width:1080px;margin:0 auto}
.view{min-width:0}

/* 页面标题区 */
.page-head{margin:2px 0 18px}
.ph-micro{display:flex;align-items:center;gap:8px;font-family:var(--font-display);
  font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-2)}
.ph-micro::before{content:'';width:16px;height:2px;background:var(--signal);flex:0 0 auto}
.ph-sep{color:var(--rule-2)}
.ph-row{display:flex;align-items:flex-end;gap:14px;margin-top:6px}
.ph-title{margin:0;font-size:30px;line-height:1;font-weight:800;letter-spacing:.08em;color:var(--ink)}
.ph-line{flex:1;height:1px;background:var(--rule-2);margin-bottom:8px;min-width:20px}

/* hero */
.hero{position:relative;background:var(--ink);color:var(--on-ink);
  border:1px solid var(--ink);border-bottom:2px solid var(--signal);padding:20px;margin-bottom:14px;overflow:hidden}
.hero .date{font-family:var(--font-mono);font-size:11px;letter-spacing:.06em;color:var(--rule)}
.hero .big{font-size:30px;font-weight:800;letter-spacing:.06em;margin:8px 0 2px;color:var(--on-ink)}
.hero .meta{font-size:12px;color:var(--rule);font-family:var(--font-mono)}
.hero .actions{display:flex;gap:10px;margin-top:16px}
.hero .actions .btn{flex:1;background:transparent;color:var(--on-ink);border:1px solid var(--rule-2);border-left:4px solid var(--signal)}
.hero .actions .btn:hover{background:var(--signal);color:var(--ink);border-color:var(--signal)}
.hero .actions .btn.main{background:var(--signal);color:var(--ink);border-color:var(--signal);font-weight:800}
.hero .actions .btn.main:hover{background:transparent;color:var(--on-ink);border-color:var(--rule-2);border-left-color:var(--signal)}
.hero-index{position:absolute;right:14px;top:8px;font-family:var(--font-display);font-weight:800;
  font-size:46px;line-height:1;letter-spacing:.02em;color:var(--rule-2);pointer-events:none}

/* 卡片 / 面板 */
.card{position:relative;background:var(--surface);border:1px solid var(--rule);padding:16px;margin-bottom:12px;min-width:0}
.card::before{content:'';position:absolute;left:6px;top:6px;width:9px;height:9px;
  border-left:1px solid var(--rule-2);border-top:1px solid var(--rule-2);pointer-events:none}
.card::after{content:'';position:absolute;right:6px;bottom:6px;width:9px;height:9px;
  border-right:1px solid var(--rule-2);border-bottom:1px solid var(--rule-2);pointer-events:none}
.card h3{margin:0 0 10px;font-size:15px;font-weight:800;letter-spacing:.04em;color:var(--ink)}
.card h4{margin:14px 0 8px;font-size:13px;color:var(--ink-2);font-weight:700}
.muted{color:var(--ink-2);font-size:12px}
.row{display:flex;justify-content:space-between;align-items:center;gap:10px;min-width:0}
.row>*{min-width:0}
.split{display:flex;gap:10px;min-width:0}
.split>*{flex:1;min-width:0}
.subcard{background:var(--paper-2);border:1px solid var(--rule);padding:12px;min-width:0}
.subcard-val{font-family:var(--font-mono);font-weight:700;font-size:16px;font-variant-numeric:tabular-nums}
.subcard-val-lg{font-family:var(--font-mono);font-weight:800;font-size:18px;font-variant-numeric:tabular-nums}
.subcard a{color:var(--ink);border-bottom:1px solid var(--rule-2)}
.warn-banner{margin-top:12px;background:var(--warn-soft);color:var(--warn-ink);border:1px solid var(--warn);
  border-left-width:4px;padding:10px 12px;font-size:12px;line-height:1.6}
.late-tip{margin:0 0 12px;background:var(--warn-soft);color:var(--warn-ink);border:1px solid var(--warn);
  border-left-width:4px;padding:9px 12px;font-size:12px;font-weight:700;line-height:1.5}
.pending-text{color:var(--ink-2);font-weight:400}
.pillrow{display:flex;gap:6px;align-items:center;flex-shrink:0}
.empty{text-align:center;color:var(--ink-2);font-size:12px;padding:26px 10px;font-family:var(--font-mono)}
.tbl-wrap{width:100%;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--rule)}
.tbl-wrap>table{width:100%}

/* 按钮 */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:40px;padding:11px 16px;
  border:1px solid var(--ink);background:transparent;color:var(--ink);font-weight:700;font-size:14px;
  transition:background-color .2s ease-out,color .2s ease-out,border-color .2s ease-out;text-align:center}
.btn:hover{background:var(--paper-2);border-color:var(--ink)}
.btn:disabled{opacity:.45;cursor:not-allowed}
.btn.primary{background:var(--ink);color:var(--on-ink);border:1px solid var(--ink);border-left:4px solid var(--signal)}
.btn.primary:hover{background:var(--signal);color:var(--ink);border-color:var(--ink);border-left-color:var(--ink)}
.btn.ghost{background:transparent;border:1px solid var(--ink)}
.btn.ghost:hover{background:var(--paper-2)}
.btn.block{width:100%;padding:13px 16px;font-size:15px;margin-top:6px}
.btn.sm{min-height:40px;padding:8px 12px;font-size:12px}

/* 状态标签 */
.pill{display:inline-block;padding:3px 8px;border:1px solid var(--rule);border-left:3px solid var(--ink-2);
  background:var(--paper-2);color:var(--ink-2);font-family:var(--font-display);font-size:11px;
  letter-spacing:.06em;white-space:nowrap;line-height:1.6}
.pill.ok,.pill.state-normal{border-left-color:var(--ok);border-color:var(--rule);color:var(--ok);background:var(--ok-soft)}
.pill.warn,.pill.state-late,.pill.state-early,.pill.state-partial{border-left-color:var(--warn);border-color:var(--rule);color:var(--warn-ink);background:var(--warn-soft)}
.pill.bad,.pill.state-missing,.pill.state-far{border-left-color:var(--bad);border-color:var(--rule);color:var(--bad);background:var(--bad-soft)}
.pill.info{border-left-color:var(--signal);color:var(--signal-ink);background:var(--signal-wash)}

/* 列表 */
.list{list-style:none;margin:0;padding:0}
.list li{padding:12px 0;border-bottom:1px solid var(--rule);display:flex;justify-content:space-between;gap:12px;min-width:0}
.list li:last-child{border-bottom:none}
.list li>div{flex:1 1 auto;min-width:0}
.list .t{font-weight:700;overflow-wrap:anywhere}
.list .s{font-size:12px;color:var(--ink-2);margin-top:2px;overflow-wrap:anywhere}
.list li>.pill{flex:0 0 auto;white-space:nowrap;align-self:flex-start}
.taglist{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.tag{font-size:11px;padding:3px 8px;border:1px solid var(--rule);border-left:3px solid var(--ok);
  background:var(--ok-soft);color:var(--ok);line-height:1.7;max-width:100%;overflow-wrap:anywhere}
.tag.bad{border-left-color:var(--bad);background:var(--bad-soft);color:var(--bad)}
.tag.mute{border-left-color:var(--ink-2);background:var(--paper-2);color:var(--ink-2)}
.act-row{display:flex;gap:8px;margin-top:8px;flex-wrap:wrap}

/* 表格 */
table{width:100%;border-collapse:collapse;font-size:12px;font-family:var(--font-mono);font-variant-numeric:tabular-nums}
th,td{text-align:left;padding:8px 6px;border-bottom:1px solid var(--rule);white-space:nowrap}
th{background:var(--paper-2);color:var(--ink-2);font-weight:700;font-size:10px;letter-spacing:.10em;
  text-transform:uppercase;font-family:var(--font-display);border-bottom:1px solid var(--rule-2)}
td.wrap,th.wrap{white-space:normal}
.legend{margin-top:10px;font-size:11px;color:var(--ink-2);line-height:2;font-family:var(--font-mono)}
.c-ok{color:var(--ok);font-weight:700}
.c-warn{color:var(--warn-ink);font-weight:700}
.c-bad{color:var(--bad);font-weight:700}
.c-info{color:var(--signal-ink);font-weight:700}
.c-mute{color:var(--ink-2)}

/* 月度表 */
.mt-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--rule);background:var(--surface);max-width:100%}
.mt{width:auto;min-width:100%;border-collapse:separate;border-spacing:0;font-size:11px}
.mt th,.mt td{padding:7px 6px;border-bottom:1px solid var(--rule);text-align:center;white-space:nowrap;background:var(--surface)}
.mt tbody tr:last-child td{border-bottom:none}
.mt thead th{color:var(--ink-2);font-weight:700;font-size:10px;line-height:1.25;background:var(--paper-2)}
.mt thead th i{display:block;font-style:normal;font-size:9px;color:var(--ink-2)}
.mt th.we{background:var(--paper-2);color:var(--signal-ink)}
.mt .mt-name{position:sticky;left:0;z-index:2;min-width:72px;max-width:92px;text-align:left;
  overflow:hidden;text-overflow:ellipsis;border-right:1px solid var(--rule);background:var(--surface)}
.mt .mt-grp{min-width:56px;max-width:80px;text-align:left;color:var(--ink-2);overflow:hidden;text-overflow:ellipsis}
.mt thead .mt-name{z-index:3;background:var(--paper-2)}

/* tabbar */
.tabbar{position:fixed;left:0;right:0;bottom:0;display:flex;background:var(--paper);
  border-top:1px solid var(--rule);padding-bottom:env(safe-area-inset-bottom);z-index:50}
.tabbar button{position:relative;flex:1;background:transparent;border:none;padding:9px 0 8px;color:var(--ink-2);
  font-family:var(--font-display);font-size:10px;letter-spacing:.08em;display:flex;flex-direction:column;
  align-items:center;gap:3px;min-height:56px;transition:color .2s ease-out,background-color .2s ease-out}
.tabbar button .ic{font-size:19px;line-height:1;filter:grayscale(1);opacity:.8}
.tabbar button.on{color:var(--ink);font-weight:800}
.tabbar button.on .ic{opacity:1}
.tabbar button.on::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:var(--signal)}
.tb-dot{position:absolute;top:4px;left:calc(50% + 5px);min-width:16px;height:16px;padding:0 4px;
  background:var(--bad);color:var(--on-ink);font-size:9px;font-weight:700;line-height:16px;
  text-align:center;font-family:var(--font-mono)}

/* 宽屏侧栏 */
.sidenav{display:none}
.sn-brand,.sn-label{display:none}
@media (min-width:1024px){
  #app{padding-left:88px}
  #app.no-sidenav{padding-left:0}
  #main{max-width:1080px;padding:24px 24px 48px}
  .tabbar{display:none}
  .sidenav{display:flex;position:fixed;left:0;top:0;bottom:0;width:88px;z-index:60;flex-direction:column;
    background:var(--ink);color:var(--on-ink);border-right:1px solid var(--rule-2)}
  .sn-brand{display:flex;flex-direction:column;align-items:center;gap:2px;padding:14px 0 16px;
    border-bottom:2px solid var(--signal);font-family:var(--font-display);font-weight:800;
    font-size:14px;letter-spacing:.08em;color:var(--on-ink)}
  .sidenav button{position:relative;display:flex;flex-direction:column;align-items:center;gap:8px;
    background:transparent;border:none;border-bottom:1px solid var(--rule-2);color:var(--rule);
    padding:14px 0;min-height:78px;transition:background-color .2s ease-out,color .2s ease-out}
  .sidenav button .ic{font-size:18px;line-height:1;filter:grayscale(1)}
  .sn-label{display:block;writing-mode:vertical-rl;text-orientation:upright;
    font-family:var(--font-display);font-size:11px;letter-spacing:.14em}
  .sidenav button:hover{background:var(--ink-hover);color:var(--on-ink)}
  .sidenav button.on{background:var(--ink-hover);color:var(--on-ink)}
  .sidenav button.on::before{content:'';position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--signal)}
  th,td{padding:10px 8px}
  .card{padding:18px}
  .ph-title{font-size:36px}
}

/* 表单 */
textarea,input[type=text],input[type=password],input[type=date],input[type=time],input[type=month],input[type=tel],select{
  width:100%;max-width:100%;padding:10px 12px;border:1px solid var(--rule-2);background:var(--paper);
  color:var(--ink);border-radius:0;transition:border-color .2s ease-out,box-shadow .2s ease-out}
textarea:focus,input[type=text]:focus,input[type=password]:focus,input[type=date]:focus,
input[type=time]:focus,input[type=month]:focus,input[type=tel]:focus,select:focus{
  outline:none;border-color:var(--ink);box-shadow:inset 0 0 0 2px var(--signal)}
textarea{min-height:90px;resize:vertical}
.formline{margin-bottom:10px;min-width:0}
.formline label{display:block;font-family:var(--font-display);font-size:10px;letter-spacing:.10em;
  text-transform:uppercase;color:var(--ink-2);margin-bottom:5px}
.hintline{font-size:12px;color:var(--ink-2);line-height:1.6;margin:-4px 0 10px;padding:8px 10px;
  background:var(--paper-2);border-left:3px solid var(--signal)}

/* 折叠 */
.fold>summary{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;
  font-weight:800;font-size:14px;color:var(--ink);min-height:40px;padding:2px 0;letter-spacing:.04em}
.fold>summary::-webkit-details-marker{display:none}
.fold>summary::after{content:'展开';font-family:var(--font-display);font-size:10px;font-weight:700;
  letter-spacing:.12em;color:var(--ink-2)}
.fold[open]>summary::after{content:'收起'}
.fold[open]>summary{margin-bottom:10px}

/* 概览 */
.ovc .ov-head{margin-bottom:2px}
.ov-proj{width:auto;max-width:58%;padding:6px 8px;font-size:12px;border:1px solid var(--rule-2);background:var(--paper)}
.ov-date{font-family:var(--font-mono);font-size:11px;color:var(--ink-2);margin-top:6px}
.ov-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-top:12px}
.ov-stat{background:var(--surface);border:1px solid var(--rule);padding:10px 4px;text-align:center}
.ov-num{font-family:var(--font-mono);font-size:18px;font-weight:800;color:var(--ink);white-space:nowrap}
.ov-lab{font-size:10px;color:var(--ink-2);margin-top:3px;white-space:nowrap;letter-spacing:.04em}
.ov-ok .ov-num{color:var(--ok)}
.ov-brand .ov-num{color:var(--ink)}
.ov-warn .ov-num{color:var(--warn-ink)}
.ov-sec-title{font-size:12px;font-weight:800;margin:14px 0 8px;letter-spacing:.04em}
.ov-note{font-size:11px;color:var(--ink-2);margin-top:10px;background:var(--paper-2);
  border-left:3px solid var(--rule-2);padding:8px 10px;line-height:1.6}
.ov-done{color:var(--ok);background:var(--ok-soft);border-left-color:var(--ok)}
.ov-more{font-size:11px;color:var(--ink-2);margin-top:6px;font-family:var(--font-mono)}
.ov-chart{display:flex;align-items:flex-end;gap:8px;margin-top:10px;padding:6px 2px 0}
.ov-col{flex:1;min-width:0;text-align:center}
.ov-rate{font-family:var(--font-mono);font-size:9px;color:var(--ink-2);margin-bottom:4px}
.ov-track{height:84px;display:flex;align-items:flex-end;background:var(--paper-2);border:1px solid var(--rule);overflow:hidden}
.ov-bar{width:100%;background:var(--signal);min-height:3px}
.ov-bar.zero{background:var(--rule)}
.ov-day{font-family:var(--font-mono);font-size:10px;color:var(--ink);margin-top:4px}
.ov-wd{font-family:var(--font-display);font-size:9px;color:var(--ink-2)}

/* 打卡 */
.seg{display:flex;gap:0;background:var(--paper-2);border:1px solid var(--rule-2)}
.seg button{flex:1;border:none;border-right:1px solid var(--rule-2);background:transparent;padding:9px 8px;
  font-size:13px;font-weight:700;color:var(--ink-2);min-height:40px;transition:background-color .2s ease-out,color .2s ease-out}
.seg button:last-child{border-right:none}
.seg button.on{background:var(--signal);color:var(--ink)}
.seg button:focus-visible{outline:2px solid var(--ink);outline-offset:-2px}
.shift-info{margin-top:10px;font-size:12px;color:var(--ink-2)}
.shift-info b{color:var(--ink)}
.done-line{margin-top:8px;font-size:12px;color:var(--ink-2);display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.cam{width:100%;aspect-ratio:4/3;background:var(--ink);border:1px solid var(--rule-2);overflow:hidden;
  display:flex;align-items:center;justify-content:center;color:var(--rule);font-size:12px;
  position:relative;font-family:var(--font-mono)}
.cam img{width:100%;height:100%;object-fit:cover}
.gpsline{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--ink-2);margin:10px 0;font-family:var(--font-mono)}
.dot{width:8px;height:8px;border-radius:50%;background:var(--warn);flex:0 0 auto}
.dot.ok{background:var(--ok)}
.dot.bad{background:var(--bad)}

/* toast */
.toast{position:fixed;left:50%;top:22%;transform:translateX(-50%);background:var(--ink);color:var(--on-ink);
  border-left:3px solid var(--signal);padding:12px 18px;font-size:13px;z-index:99;max-width:80vw;
  text-align:center;font-family:var(--font-mono)}

/* 弹窗 */
.modal-mask{position:fixed;inset:0;background:var(--overlay);display:flex;align-items:flex-end;
  justify-content:center;z-index:80;padding:0;overflow:hidden}
.modal{background:var(--surface);width:100%;max-width:560px;border:2px solid var(--ink);border-bottom:none;
  padding:18px 16px max(24px,env(safe-area-inset-bottom));max-height:88vh;
  max-height:min(88vh,calc(100dvh - 12px));
  overflow-y:auto;-webkit-overflow-scrolling:touch;overscroll-behavior:contain}
.modal h3{margin:0 0 10px;font-size:16px;font-weight:800;letter-spacing:.04em}
.modal .hint{font-size:11px;color:var(--ink-2);font-family:var(--font-mono);margin:8px 0}
.doc-box{background:var(--paper);border:1px solid var(--rule);padding:12px;font-size:12px;
  max-height:min(34vh,220px);overflow:auto;white-space:pre-wrap;line-height:1.7}
#sign-pad{width:100%;height:170px;border:1px dashed var(--rule-2);margin-top:10px;
  background:var(--surface);touch-action:none;display:block}
.modal-actions{display:flex;gap:10px;margin-top:14px}
.modal-actions .btn{flex:1}
.pwd-show{font-family:var(--font-mono);font-size:24px;font-weight:800;letter-spacing:.18em;text-align:center;
  color:var(--ink);background:var(--paper);border:1px dashed var(--rule-2);padding:14px 10px;word-break:break-all}

/* 照片 */
.thumb{width:48px;height:48px;object-fit:cover;border:1px solid var(--ink);background:var(--paper-2);
  display:block;cursor:zoom-in}
.thumb-ph{display:inline-flex;align-items:center;justify-content:center;width:48px;height:48px;
  border:1px dashed var(--rule-2);background:var(--paper);color:var(--ink-2);font-size:10px;font-family:var(--font-mono)}
body.photo-open{overflow:hidden}
.photo-mask{position:fixed;inset:0;z-index:120;background:var(--overlay-photo);display:flex;
  align-items:center;justify-content:center;padding:16px}
.photo-box{background:var(--surface);border:2px solid var(--ink);padding:10px;width:auto;
  max-width:min(560px,94vw);max-height:92vh;overflow:auto;text-align:center}
.photo-big{display:block;max-width:100%;max-height:70vh;width:auto;height:auto;margin:0 auto;background:var(--paper-2)}
.photo-cap{font-size:11px;color:var(--ink-2);margin:8px 0 10px;overflow-wrap:anywhere;font-family:var(--font-mono)}
.photo-box .btn{min-height:40px}

/* 素材 / 报告 */
.gallery{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.gallery div{aspect-ratio:1;overflow:hidden;background:var(--paper-2);border:1px solid var(--rule)}
.gallery img{width:100%;height:100%;object-fit:cover}
.report-body{background:var(--surface);border:1px solid var(--rule);padding:16px;font-size:13px;line-height:1.75;
  white-space:pre-wrap;margin-bottom:12px}
.report-body h2{font-size:19px;margin:18px 0 10px;color:var(--ink)}
.report-body h3{font-size:16px;margin:16px 0 8px}
.report-body h4{font-size:13px;margin:12px 0 6px;color:var(--ink-2)}
.report-body p{margin:6px 0;line-height:1.8}
.report-body blockquote{margin:8px 0;padding:8px 12px;border-left:3px solid var(--signal);background:var(--paper-2);color:var(--ink-2);font-size:12px}
.report-body ul,.report-body ol{margin:8px 0 8px 20px;padding:0}
.report-body li{margin:4px 0;line-height:1.75}
.report-body hr{border:none;border-top:1px solid var(--rule);margin:16px 0}
.md-table{width:100%;border-collapse:collapse;margin:10px 0;font-size:12px}
.md-table th{background:var(--paper-2);color:var(--ink);text-align:left}
.md-table th,.md-table td{border:1px solid var(--rule);padding:7px 10px;white-space:normal}

/* 打印页 */
body.print-mode{background:var(--paper)}
.print-sheet{background:var(--surface);color:var(--ink);border:1px solid var(--rule);max-width:820px;
  margin:0 auto;padding:30px 24px 36px;text-align:center}
.ps-brand{font-family:var(--font-display);font-size:11px;letter-spacing:.18em;text-transform:uppercase;color:var(--ink-2)}
.ps-name{font-size:clamp(26px,6vw,44px);font-weight:800;line-height:1.25;margin:10px 0 22px;color:var(--ink)}
.ps-label{font-family:var(--font-display);font-size:11px;letter-spacing:.24em;text-transform:uppercase;color:var(--ink-2)}
.ps-code{font-family:var(--font-mono);font-size:clamp(52px,17vw,120px);font-weight:800;letter-spacing:.14em;
  line-height:1.1;margin:6px 0 18px;color:var(--ink);word-break:break-all}
.ps-code.off{font-size:clamp(30px,8vw,56px);letter-spacing:.08em;color:var(--ink-2)}
.ps-tip{display:inline-block;background:var(--signal);color:var(--ink);font-family:var(--font-display);
  font-size:15px;font-weight:800;letter-spacing:.06em;padding:9px 18px}
.ps-qr-wrap{text-align:center;margin-top:18px}
.ps-qr{width:170px;height:170px;display:block;margin:0 auto;background:var(--surface);border:1px solid var(--rule-2);padding:6px}
.ps-qr-tip{font-size:11px;color:var(--ink-2);margin-top:6px;font-family:var(--font-mono)}
.ps-rules{text-align:left;margin:24px auto 0;max-width:640px;font-size:15px;line-height:2;color:var(--ink)}
.ps-rules b{color:var(--ink);font-family:var(--font-mono)}
.ps-foot{margin-top:22px;font-size:11px;color:var(--ink-2);font-family:var(--font-mono)}
body.print-mode #main{padding-bottom:24px}
.ua-row .s{white-space:normal}

/* 动效 */
@keyframes surfaceReveal{from{clip-path:inset(0 100% 0 0)}to{clip-path:inset(0 0 0 0)}}
.view:not([hidden]) > .hero,
.view:not([hidden]) > .card{animation:surfaceReveal .52s ease-out both}
.btn,.seg button,.tabbar button,input[type=text],input[type=password],input[type=date],
input[type=time],input[type=month],input[type=tel],select,textarea{
  transition-duration:.2s;transition-timing-function:ease-out}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none !important;transition:none !important}
}

/* 375 保护 */
@media (max-width:400px){
  .hero .big{font-size:27px}
  .ov-stats{gap:6px}
  .btn.block{padding:13px}
  .print-sheet{padding:24px 16px 28px}
  .ps-code{font-size:clamp(44px,16vw,100px);letter-spacing:.1em}
  .ps-rules{font-size:15px;line-height:1.9}
}

/* 打印 */
@media print{
  body{background:var(--surface)}
  .topbar,#tabbar,.sidenav,#toast,.no-print{display:none !important}
  #main{padding:0;max-width:none;margin:0}
  .print-sheet{border:none;padding:0;max-width:none}
  .ps-rules{font-size:14px}
  .ps-qr{width:150px;height:150px;break-inside:avoid}
  .photo-mask{display:none !important}
}
