*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{height:100%}
body{font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
  background:#f2f4f7;color:#1a202c;font-size:14px;line-height:1.5}
:root{
  --pending:#a0aec0; --doing:#ecc94b; --revisit:#ed8936; --done:#48bb78; --doubt:#f56565;
  --pri:#2b6cb0; --pri-d:#2c5282; --out:#c05621;
  --bd:#e2e8f0; --mut:#718096; --bg:#fff;
}
.hide{display:none !important}

/* 通用 */
.wrap{max-width:640px;margin:0 auto;min-height:100%;background:#f2f4f7;padding-bottom:24px}
.nav{position:sticky;top:0;z-index:50;background:var(--pri);color:#fff;padding:11px 14px;
  display:flex;align-items:center;gap:10px;box-shadow:0 1px 4px rgba(0,0,0,.12)}
.nav h1{font-size:15px;font-weight:700;flex:1;letter-spacing:.3px}
/* 顶部"返回／首页／消息"也是要戴手套点的，把点击区撑到 44px */
.nav a,.nav .back{color:#fff;text-decoration:none;font-size:14px;opacity:.92;cursor:pointer;
  padding:8px 4px;display:inline-flex;align-items:center;min-height:44px}
.nav h1 a{color:#fff;text-decoration:none;font-weight:700;opacity:.9}
.nav h1 a:hover{opacity:1;text-decoration:underline}
.nav h1 .sep{margin:0 5px;opacity:.55;font-weight:400}
.card{background:var(--bg);border-radius:8px;margin:10px;padding:0;overflow:hidden;box-shadow:0 1px 3px rgba(0,0,0,.06)}
.card>h2{font-size:14px;font-weight:700;color:#2d3748;padding:10px 12px;border-bottom:1px solid var(--bd);
  display:flex;align-items:center;justify-content:space-between}
.card>h2 .r{font-weight:400;color:var(--mut);font-size:12px}
.card .body{padding:12px}
.row{display:flex;gap:8px;flex-wrap:wrap}
.btn{padding:11px 16px;border-radius:6px;border:1px solid var(--bd);background:#fff;color:#2d3748;
  font-size:14.5px;font-weight:600;cursor:pointer;text-align:center;
  display:inline-flex;align-items:center;justify-content:center}
.btn.pri{background:var(--pri);border-color:var(--pri);color:#fff}
.btn.pri:active{background:var(--pri-d)}
.btn.big{width:100%;padding:15px;font-size:17px}
.btn.gh{background:#fff;color:var(--pri);border-color:var(--pri)}
.btn:disabled{opacity:.45;cursor:not-allowed}
.btn.sm{padding:9px 14px;font-size:13.5px}

/* 列表项 */
.li{display:flex;align-items:center;gap:9px;padding:11px 12px;border-bottom:1px solid #edf2f7;
  background:#fff;cursor:pointer;text-decoration:none;color:inherit}
.li:active{background:#f7fafc}
.li:last-child{border-bottom:none}
.li .dot{width:9px;height:9px;border-radius:50%;flex-shrink:0}
.li .tx{flex:1;min-width:0}
.li .t1{font-size:14.5px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.li .t2{font-size:12.5px;color:var(--mut);margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.li .rt{font-size:12.5px;color:var(--mut);text-align:right;flex-shrink:0}
.li .ar{color:#cbd5e0;font-size:16px;flex-shrink:0}
/* badge 之前 10px，中年人在楼道里看不清状态，统一抬到 12px */
.badge{display:inline-block;padding:2px 8px;border-radius:9px;font-size:12px;font-weight:600;color:#fff}

/* 进度条 */
.pbar{height:5px;background:#edf2f7;border-radius:3px;overflow:hidden;margin-top:4px}
.pbar i{display:block;height:100%;background:var(--done);transition:width .3s}

/* 表单 */
.fld{margin-bottom:13px}
.fld>label{display:block;font-size:14px;font-weight:600;color:#2d3748;margin-bottom:6px}
.fld>label .req{color:#e53e3e;margin-left:2px}
.fld>label .tip{font-weight:400;color:var(--mut);font-size:12.5px;margin-left:4px}
.opts{display:flex;flex-wrap:wrap;gap:7px}
.opt{padding:11px 12px;border:1px solid var(--bd);border-radius:6px;background:#fff;font-size:15px;
  cursor:pointer;user-select:none;min-width:calc(50% - 4px);flex:1;text-align:center}
.opt.on{background:var(--pri);border-color:var(--pri);color:#fff;font-weight:600}
.opt.sm3{min-width:calc(33.33% - 5px);flex:1}
input[type=text],input[type=number],textarea,select{width:100%;padding:9px 11px;border:1px solid var(--bd);
  border-radius:6px;font-size:14px;font-family:inherit;background:#fff;color:#1a202c}
input:focus,textarea:focus,select:focus{outline:none;border-color:var(--pri)}
textarea{min-height:62px;resize:vertical}
.chk{display:flex;align-items:flex-start;gap:9px;padding:11px 12px;background:#fffaf0;border:1px solid #feebc8;
  border-radius:6px;font-size:14px;color:#744210;cursor:pointer;line-height:1.6}
.chk input{margin-top:2px;width:20px;height:20px;flex-shrink:0}

/* 照片 */
.photos{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
/* 高度用 padding-top 百分比撑，不用 aspect-ratio。
   iOS 15 以下（兼职常用的老 iPhone 6/7 正是 iOS 12–15）不认 aspect-ratio，
   格子会塌成一条线——那不是"不好看"，是"点不到 +、拍不了照、这户提交不了"，
   等同于功能不可用。padding-top:100% 是正方形，全浏览器一致；
   代价是内部内容必须绝对定位，下面几条就是为这个。 */
.ph{position:relative;display:block;border:1px dashed var(--bd);border-radius:6px;overflow:hidden;
  background:#f7fafc;cursor:pointer}
.ph::after{content:'';display:block;padding-top:100%}
.ph img{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover}
.ph .add{position:absolute;left:0;top:0;width:100%;height:100%;display:flex;flex-direction:column;
  align-items:center;justify-content:center;font-size:13px;color:var(--mut);text-align:center;
  line-height:1.4;padding:4px}
.ph .add b{font-size:26px;color:#cbd5e0;font-weight:400;line-height:1}
/* 删除键原来只有 19px，戴手套点不中。视觉 34px，触控区用伪元素撑到 46px */
.ph .del{position:absolute;top:3px;right:3px;width:34px;height:34px;border-radius:50%;
  background:rgba(0,0,0,.62);color:#fff;font-size:21px;line-height:32px;text-align:center;z-index:2}
.ph .del::after{content:'';position:absolute;left:-6px;right:-6px;top:-6px;bottom:-6px}
.ph .nm{position:absolute;bottom:0;left:0;right:0;background:rgba(0,0,0,.5);color:#fff;font-size:11px;
  padding:2px 3px;text-align:center}
.ph.done{border-style:solid;border-color:var(--done)}
.ph .ok{position:absolute;top:2px;left:2px;background:var(--done);color:#fff;font-size:11px;
  padding:2px 6px;border-radius:3px;z-index:2}
.ph .add .sub{font-size:11px}
/* 必填标记：勾了「表具长期未动迹象」后，表具照片从"建议拍"变成"不拍提交不了"。
   用伪元素画红条，不额外插 DOM——老 iPhone 上每少一次重排都是钱。
   红条期间必须盖掉「已拍 / 本楼已拍过」两处绿提示：那俩说的是"本楼别的单元拍过"，
   和"本户这次有没有照片"是两回事，同时显示会让人以为已经满足了，然后卡在提交上。 */
.ph.reqd{border-style:solid;border-color:#c53030;background:#fff5f5}
.ph.reqd::before{content:'本户必拍';position:absolute;bottom:0;left:0;right:0;z-index:3;
  background:#c53030;color:#fff;font-size:12px;font-weight:700;text-align:center;padding:4px 3px}
.ph.reqd .ok,.ph.reqd .add .sub{display:none}

/* 提示 */
.tip2{font-size:13px;color:var(--mut);line-height:1.65;padding:9px 11px;background:#f7fafc;border-radius:6px;margin-top:6px}
.warn{background:#fffaf0;border:1px solid #feebc8;color:#744210}
.err{background:#fff5f5;border:1px solid #fed7d7;color:#742a2a}
.ok{background:#f0fff4;border:1px solid #c6f6d5;color:#22543d}
#toast{position:fixed;left:50%;transform:translateX(-50%);bottom:26px;background:rgba(26,32,44,.93);color:#fff;
  padding:11px 18px;border-radius:18px;font-size:14px;z-index:999;opacity:0;transition:opacity .25s;
  pointer-events:none;max-width:88vw;text-align:center;line-height:1.6}
#toast.show{opacity:1}
.load{padding:26px;text-align:center;color:var(--mut);font-size:13.5px}

/* 统计块 */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:7px;padding:12px}
.st{background:#f7fafc;border-radius:6px;padding:8px 4px;text-align:center}
.st .v{font-size:18px;font-weight:800;color:#2d3748;font-variant-numeric:tabular-nums}
.st .l{font-size:12px;color:var(--mut);margin-top:1px}

/* 地图 */
#map{width:100%;height:calc(100vh - 46px)}
.mfull{position:fixed;inset:0;display:flex;flex-direction:column}
.filters{display:flex;gap:6px;padding:8px 10px;background:#fff;border-bottom:1px solid var(--bd);
  flex-wrap:wrap;align-items:center}
.filters select,.filters input{padding:5px 8px;font-size:12px;border:1px solid var(--bd);border-radius:5px}
.chip{padding:4px 10px;border-radius:14px;font-size:11.5px;border:1px solid var(--bd);background:#fff;cursor:pointer}
.chip.on{background:var(--pri);border-color:var(--pri);color:#fff;font-weight:600}
.mhead{display:flex;align-items:center;gap:8px;background:var(--pri);color:#fff;padding:9px 12px}
.mhead h1{font-size:14px;font-weight:700;flex:1}
.mhead a{color:#fff;text-decoration:none;font-size:12.5px;opacity:.92}
#mleg{position:absolute;right:10px;bottom:10px;background:rgba(255,255,255,.96);border:1px solid var(--bd);
  border-radius:6px;padding:8px 10px;font-size:10.5px;z-index:10;box-shadow:0 2px 6px rgba(0,0,0,.1)}
#mleg .t{font-weight:700;margin-bottom:4px;font-size:11px}
#mleg div{display:flex;align-items:center;gap:5px;margin-bottom:2px;color:#4a5568}
#mleg .sw{width:10px;height:10px;border-radius:2px}
#mleg .sq{border-radius:1px}
#mleg .rd{border-radius:50%}
#minfo{position:absolute;left:10px;top:10px;background:rgba(255,255,255,.96);border:1px solid var(--bd);
  border-radius:6px;padding:8px 10px;font-size:11px;z-index:10;max-width:250px;line-height:1.6;box-shadow:0 2px 6px rgba(0,0,0,.1)}

/* 图片查看器（点缩略图放大） */
#pvMask{position:fixed;left:0;right:0;top:0;bottom:0;background:rgba(8,12,18,.95);z-index:900;display:flex;flex-direction:column}
#pvMask.hide{display:none}
.pv-bar{display:flex;align-items:center;gap:10px;padding:9px 14px;color:#fff;font-size:12px;flex-shrink:0}
.pv-bar .pvInfo{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}
.pv-bar .pvX{cursor:pointer;font-size:16px;padding:0 8px;opacity:.85;flex-shrink:0;
  display:inline-flex;align-items:center;min-height:44px}
.pv-stage{flex:1;position:relative;overflow:hidden;display:flex;align-items:center;justify-content:center;touch-action:none}
.pv-stage img{max-width:100%;max-height:100%;cursor:zoom-in;will-change:transform}
.pv-stage img.zoomed{cursor:grab}
.pv-nav{position:absolute;top:50%;margin-top:-23px;width:46px;height:46px;line-height:44px;text-align:center;
  border-radius:50%;background:rgba(255,255,255,.16);color:#fff;font-size:26px;cursor:pointer;user-select:none;z-index:2}
.pv-nav.l{left:10px}.pv-nav.r{right:10px}
.pv-foot{padding:8px 14px;color:rgba(255,255,255,.7);font-size:12.5px;display:flex;gap:14px;align-items:center;flex-shrink:0}
.pv-foot a{color:#90c4ff}

/* 通用优化：安全区、触摸目标、横向滚动表格、空状态 */
.nav{padding-top:calc(11px + env(safe-area-inset-top))}
.wrap{padding-bottom:calc(24px + env(safe-area-inset-bottom))}
/* 触控区下限 44px：现场中年人戴手套点，38px 会连续点空 */
.btn,.opt,.chip,.li,.qrow{min-height:44px}
.opt{display:flex;align-items:center;justify-content:center}
.tabwrap{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 -12px;padding:0 12px}
.tabwrap table{min-width:560px;border-collapse:collapse;font-size:13px}
.tabwrap th,.tabwrap td{padding:8px 10px;border-bottom:1px solid var(--bd);text-align:left;white-space:nowrap}
.tabwrap th{color:var(--mut);font-weight:600;background:#f7fafc;position:sticky;top:0}
.empty{padding:30px 16px;text-align:center;color:var(--mut);font-size:13.5px}
.empty b{display:block;font-size:14px;color:#4a5568;margin-bottom:4px}
select,input[type=text],input[type=number],textarea{font-size:16px}  /* 防 iOS 聚焦自动放大 */
/* 强制改密弹层：不可跳过，盖在一切之上 */
#pwdGate .tip2{font-size:13px}
@media (max-width:360px){
  .stats{grid-template-columns:repeat(2,1fr)}
  .opt{min-width:100%}
}
