/* ==========================================================================
   设计系统 —— 对齐原版小程序 app.wxss
   主色 #1a3a5c，次色 #2d5a8e，圆角 8，卡片阴影 0 1px 6px rgba(0,0,0,.04)
   ========================================================================== */
:root{
  --primary:#1a3a5c;
  --primary-light:#2d5a8e;
  --success:#07c160;
  --success-bg:#e8f8ef;
  --warning:#ff976a;
  --warning-bg:#fff7e6;
  --danger:#ee0a24;
  --danger-bg:#fde8eb;
  --text:#323233;
  --text-secondary:#969799;
  --text-placeholder:#c8c9cc;
  --border:#ebedf0;
  --bg:#f7f8fa;
  --card-bg:#fff;
  --radius:8px;

  /* 运营后台沿用旧变量名，这里做映射，避免两套样式打架 */
  --navy:var(--primary);
  --navy-2:var(--primary-light);
  --blue:var(--primary-light);
  --ink:var(--text);
  --muted:var(--text-secondary);
  --line:var(--border);
  --card:var(--card-bg);
  --ok:var(--success);
  --warn:#ed6a0c;
}

*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;
  background:var(--bg);color:var(--text);font-size:14px;line-height:1.5;
  -webkit-font-smoothing:antialiased;
}
.hidden{display:none !important}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}

/* ---------------------------------------------------------------- 通用组件 */
.card{background:var(--card-bg);border-radius:var(--radius);box-shadow:0 1px 6px rgba(0,0,0,.04);
  margin:12px;padding:14px}
.card-title{display:flex;align-items:center;justify-content:space-between;color:var(--primary);
  font-size:15px;font-weight:600;margin-bottom:12px}
.card-title-link{color:var(--primary-light);font-size:13px;font-weight:400;cursor:pointer;
  background:none;border:0;padding:0;font-family:inherit}

.form-item{margin-bottom:12px}
.form-item:last-child{margin-bottom:0}
.form-label{color:var(--text-secondary);font-size:13px;margin-bottom:6px;display:block}
.form-input{box-sizing:border-box;font-size:14px;height:44px;line-height:44px;width:100%;
  background:#f7f8fa;border:1px solid transparent;border-radius:6px;padding:0 12px;
  color:var(--text);outline:none;font-family:inherit;transition:border-color .15s}
.form-input:focus{border-color:var(--primary-light);background:#fff}
.form-input::placeholder{color:var(--text-placeholder)}
.form-input-row{display:flex;align-items:center;background:#f7f8fa;border-radius:6px;
  border:1px solid transparent;padding:0 12px}
.form-input-row:focus-within{border-color:var(--primary-light);background:#fff}
.form-input-row .form-input{background:transparent;flex:1;padding:0}

.btn{display:inline-flex;align-items:center;justify-content:center;border:0;border-radius:6px;
  font-size:15px;height:44px;padding:0 16px;cursor:pointer;font-family:inherit;
  transition:opacity .15s;white-space:nowrap}
.btn:active{opacity:.85}
.btn-primary{background:var(--primary);color:#fff}
.btn-success{background:var(--success);color:#fff}
.btn-warning{background:#ff8c00;color:#fff}
.btn-danger{background:var(--danger);color:#fff}
.btn-outline{background:#fff;border:1px solid var(--border);color:var(--text);font-size:14px;height:40px}
.btn-block{width:100%}
.btn-sm{font-size:12px;height:32px;padding:0 12px}
.btn:disabled{opacity:.5;cursor:not-allowed}

.tip-bar{display:flex;align-items:center;gap:6px;border-radius:6px;font-size:12px;
  margin-top:8px;padding:8px 10px}
.tip-success{background:var(--success-bg);color:var(--success)}
.tip-warning{background:var(--warning-bg);color:var(--warn)}
.tip-danger{background:var(--danger-bg);color:var(--danger)}

.info-row{display:flex;justify-content:space-between;font-size:13px;padding:8px 0;
  border-bottom:.5px solid var(--border)}
.info-row:last-child{border-bottom:none}
.info-label{color:var(--text-secondary);flex-shrink:0}
.info-value{color:var(--text);flex:1;margin-left:12px;text-align:right;word-break:break-all}

.empty-state{color:var(--text-secondary);font-size:14px;padding:40px 20px;text-align:center}

.collapse-header{display:flex;align-items:center;justify-content:space-between;
  color:var(--text-secondary);font-size:13px;padding:10px 0;cursor:pointer;user-select:none}
.collapse-body{padding-bottom:8px}

.coord-tag{background:#e8f0fe;border-radius:4px;color:var(--primary-light);
  display:inline-block;font-size:11px;padding:2px 8px}
.link-action{display:inline-flex;align-items:center;gap:3px;color:var(--primary-light);
  font-size:12px;padding:2px 0;cursor:pointer;background:none;border:0;font-family:inherit}
.link-action.disabled{opacity:.4;pointer-events:none}

.status-card{background:var(--success-bg);border-radius:var(--radius);margin:12px;padding:14px}
.status-card.connecting{background:#e8f0fe}
.status-card.failed{background:var(--danger-bg)}
.status-head{display:flex;align-items:center;gap:6px;font-size:14px;font-weight:600;color:var(--text)}
.status-dot{width:8px;height:8px;border-radius:50%;background:var(--success);display:inline-block}
.status-dot.connecting{background:var(--primary-light)}
.status-dot.failed{background:var(--danger)}
.status-metrics{display:flex;justify-content:space-around;align-items:flex-start;gap:4px;
  border-top:.5px solid rgba(0,0,0,.06);margin-top:12px;padding-top:12px}
.metric-item{display:flex;flex-direction:column;align-items:center;flex:1;min-width:0;text-align:center}
.metric-value{display:block;font-size:14px;font-weight:600;line-height:1.3;width:100%;word-break:break-all}
.metric-label{display:block;font-size:11px;color:var(--text-secondary);line-height:1.2;margin-top:5px;width:100%}

.badge{font-size:11px;padding:2px 7px;border-radius:4px;background:#eef2f7;color:var(--text-secondary)}
.badge.official{background:#e8f0fe;color:var(--primary-light)}
.badge.ok{background:var(--success-bg);color:var(--success)}
.badge.warn{background:var(--warning-bg);color:var(--warn)}
.badge.bad{background:var(--danger-bg);color:var(--danger)}

/* ---------------------------------------------------------------- 导航栏 + 底部 tab */
.nav-bar{position:sticky;top:0;z-index:40;background:var(--primary);color:#fff;
  height:48px;display:flex;align-items:center;justify-content:center;font-size:16px;font-weight:500}
.nav-back{position:absolute;left:6px;background:none;border:0;color:#fff;font-size:22px;
  width:40px;height:40px;cursor:pointer;line-height:1;padding:0}
.nav-right{position:absolute;right:12px;background:none;border:0;color:#fff;font-size:13px;
  cursor:pointer;font-family:inherit;opacity:.9}

.tabbar{position:fixed;bottom:0;left:0;right:0;height:56px;background:#fff;z-index:60;
  display:flex;border-top:.5px solid var(--border);padding-bottom:env(safe-area-inset-bottom)}
.tabbar-item{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:3px;font-size:11px;color:var(--text-secondary);cursor:pointer;border:0;background:none;
  font-family:inherit;padding:0}
.tabbar-item .ico{font-size:19px;line-height:1}
.tabbar-item.active{color:var(--primary)}

/* ---------------------------------------------------------------- 主内容 */
main{max-width:720px;margin:0 auto;padding-bottom:calc(56px + env(safe-area-inset-bottom))}

.hero-card{position:relative;background:linear-gradient(135deg,#1a3a5c,#2d5a8e);border-radius:8px;
  color:#fff;margin:12px;padding:20px;cursor:pointer;box-shadow:0 4px 14px rgba(26,58,92,.22)}
.hero-title{font-size:18px;font-weight:600;margin-bottom:4px}
.hero-sub{font-size:12px;opacity:.82}
.hero-arrow{position:absolute;right:18px;top:50%;transform:translateY(-50%);font-size:24px;opacity:.7}

.quick-bar{display:flex;padding:12px 0}
.quick-item{flex:1;display:flex;flex-direction:column;align-items:center;gap:5px;
  position:relative;cursor:pointer;background:none;border:0;font-family:inherit}
.quick-item::after{content:"";position:absolute;right:0;top:15%;height:70%;width:.5px;
  background:var(--border)}
.quick-item:last-child::after{display:none}
.quick-icon{font-size:20px;line-height:1}
.quick-text{color:#646566;font-size:12px}

.account-picker{position:relative;display:flex;align-items:center;gap:6px;background:#f7f8fa;
  border:1px solid var(--border);border-radius:6px;padding:12px;cursor:pointer}
.account-icon{width:32px;height:32px;flex:0 0 32px;border-radius:50%;background:#e8f0fe;
  color:var(--primary-light);display:grid;place-items:center;font-size:16px}
.account-info{flex:1;min-width:0}
.account-tags{display:flex;align-items:center;gap:6px;margin-bottom:2px}
.account-name{font-size:14px;font-weight:600;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis}
.account-meta-row{display:flex;justify-content:space-between;align-items:flex-start;
  gap:8px;margin-top:8px}
.integral-tip{flex:1;min-width:0;text-align:right;color:var(--text-secondary);font-size:11px;line-height:17px}
.account-picker select{position:absolute;inset:0;opacity:0;cursor:pointer;width:100%}

.location-info{background:#f7f8fa;border-radius:6px;padding:10px;margin-bottom:8px;
  color:#646566;font-size:13px}
.btn-row{display:flex;gap:8px;margin-bottom:8px}
.btn-row .btn{flex:1}
.switch-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0}
.coord-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.map{height:220px;border-radius:6px;border:1px solid var(--border);margin-bottom:10px;background:#e9eef5}
.map:empty::after{content:"地图加载中…";display:grid;place-items:center;height:100%;
  color:var(--text-secondary);font-size:13px}

.duration-row{display:flex;align-items:center;justify-content:space-between;padding:8px 0}
.duration-label{font-size:14px;color:var(--text)}
.duration-right{display:flex;align-items:center;gap:10px}
.duration-value{font-size:13px;color:var(--text-secondary)}
.duration-action{font-size:13px;color:var(--primary-light);cursor:pointer}

.bottom-bar{position:fixed;left:0;right:0;bottom:56px;background:#fff;z-index:55;
  padding:10px 16px;box-shadow:0 -1px 6px rgba(0,0,0,.06)}
.bottom-bar .btn{width:100%}
.bottom-spacer{height:76px}

.list{display:flex;flex-direction:column;gap:8px}
.item{border:1px solid var(--border);border-radius:8px;padding:11px 12px;background:#fff}
.item-head{display:flex;align-items:center;gap:8px;margin-bottom:5px}
.item-head strong{font-size:13.5px}
.item-head .spacer{margin-left:auto}
.item-sub{color:var(--text-secondary);font-size:12px;display:flex;flex-wrap:wrap;gap:10px}
.item-actions{display:flex;gap:8px;margin-top:9px;flex-wrap:wrap}

.probe{margin-top:12px;border:1px solid var(--border);border-radius:8px;padding:12px;background:#fafcff}
.probe .verdict{font-weight:600;margin-bottom:8px;font-size:13.5px}
.probe .verdict.ok{color:var(--success)}
.probe .verdict.warn{color:var(--warn)}
.probe .verdict.bad{color:var(--danger)}
.probe dl{display:grid;grid-template-columns:100px 1fr;gap:5px 10px;margin:0;font-size:12.5px}
.probe dt{color:var(--text-secondary)}
.probe dd{margin:0;word-break:break-all}

.gga-preview{background:#f7f8fa;border:1px solid var(--border);color:var(--primary-light);
  font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11.5px;padding:9px 11px;
  border-radius:6px;margin:4px 0 12px;overflow-x:auto;white-space:nowrap}

.logs{background:#1a2733;color:#cfe3f5;border-radius:6px;padding:12px;font-size:12px;
  max-height:340px;overflow:auto;margin:0;white-space:pre-wrap;line-height:1.6}
.logs .lv-error{color:#ff8a9b}
.logs .lv-warn{color:#ffd479}

.products{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px}
.product{border:1px solid var(--border);border-radius:8px;padding:12px;text-align:center;cursor:pointer}
.product:hover{border-color:var(--primary-light);background:#fafcff}
.product b{display:block;font-size:15px;color:var(--primary)}
.product span{font-size:12px;color:var(--text-secondary)}

/* ---------------------------------------------------------------- 登录 */
.auth-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px;
  background:linear-gradient(135deg,#1a3a5c,#2d5a8e)}
.auth-card{width:100%;max-width:400px;background:#fff;border-radius:12px;padding:26px 24px 22px;
  box-shadow:0 20px 50px rgba(6,20,34,.3)}
.auth-brand{text-align:center;margin-bottom:22px}
.auth-brand .mark{width:52px;height:52px;border-radius:14px;background:var(--primary);color:#fff;
  display:grid;place-items:center;font-size:24px;margin:0 auto 12px}
.auth-brand h1{font-size:18px;margin:0 0 6px;color:var(--primary)}
.auth-brand p{margin:0;color:var(--text-secondary);font-size:12.5px}
.tabs-line{display:flex;gap:6px;background:#f2f4f7;padding:4px;border-radius:8px;margin-bottom:18px}
.tab-btn{flex:1;border:0;background:transparent;padding:8px;border-radius:6px;font-size:13px;
  color:var(--text-secondary);cursor:pointer;font-family:inherit}
.tab-btn.active{background:#fff;color:var(--primary);box-shadow:0 1px 3px rgba(16,32,52,.12)}
.hint{color:var(--text-secondary);font-size:12.5px;margin:8px 0 0;line-height:1.5}
.hint.inline{margin:0}
.row{display:flex;gap:10px;align-items:center;margin-bottom:12px}
.row.end{justify-content:flex-end;margin-bottom:0}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
.grow{flex:1}

/* ---------------------------------------------------------------- 弹窗 */
/* Leaflet 图层 z-index 最高 1000，弹窗必须高于它 */
.modal{position:fixed;inset:0;background:rgba(0,0,0,.45);display:grid;place-items:center;
  z-index:1200;padding:20px;overflow-y:auto}
.modal-card{background:#fff;border-radius:12px;padding:20px;width:100%;max-width:420px;
  box-shadow:0 20px 60px rgba(6,20,34,.3);max-height:calc(100vh - 40px);overflow-y:auto}
.modal-card.wide{max-width:580px}
.modal-card h3{margin:0 0 16px;font-size:15.5px;color:var(--primary)}
body:has(.modal:not(.hidden)){overflow:hidden}

.input-with-btn{display:flex;gap:8px}
.input-with-btn .form-input{flex:1}
.input-with-btn .btn{white-space:nowrap;height:44px}

.mount-list{margin:-4px 0 12px;border:1px solid var(--border);border-radius:8px;
  max-height:280px;overflow-y:auto;background:#fafcff}
.mount-item{padding:10px 12px;border-bottom:1px solid var(--border)}
.mount-item:last-child{border-bottom:0}
.mount-item:hover{background:#f2f7ff}
.mount-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.mount-top b{font-size:13px;color:var(--primary);font-family:ui-monospace,Menlo,Consolas,monospace}
.mount-sub{color:var(--text-secondary);font-size:11.5px;margin-top:2px}
.mount-act{display:flex;gap:6px;margin-left:auto}
.mount-res{margin-top:6px;font-size:12px;line-height:1.6;color:var(--text)}
.mount-res .ok{color:var(--success);font-weight:600}
.mount-res .bad{color:var(--danger);font-weight:600}
.mount-res .warn{color:var(--warn);font-weight:600}
.mount-empty{padding:14px;text-align:center;color:var(--text-secondary);font-size:12.5px}

/* ---------------------------------------------------------------- toast */
.toast{position:fixed;left:50%;bottom:100px;transform:translateX(-50%);
  background:rgba(0,0,0,.8);color:#fff;padding:11px 18px;border-radius:8px;font-size:13px;
  z-index:1300;max-width:88vw;box-shadow:0 8px 28px rgba(6,20,34,.3)}
.toast.err{background:rgba(238,10,36,.95)}

.notice{background:var(--warning-bg);color:var(--warn);padding:9px 16px;font-size:12.5px;
  text-align:center}

@media (max-width:560px){
  .grid3{grid-template-columns:1fr 1fr}
  .status-metrics{flex-wrap:wrap;gap:10px}
  .metric-item{flex:0 0 45%}
}

/* 子页面隐藏底部 tab 时，固定栏贴底 */
body.no-tabbar .tabbar{display:none}
body.no-tabbar .bottom-bar{bottom:0}
body.no-tabbar main{padding-bottom:0}

/* ==========================================================================
   地图纠偏（全屏页）—— 尺寸/配色取自原版 pages/map-correction/map-correction.wxss
   ========================================================================== */
.link-action.warn{color:#ed6a0c}

.cv-root{position:fixed;inset:0;z-index:3000;background:#f5f6f8;
  display:flex;flex-direction:column}
.cv-root.hidden{display:none}

.cv-nav{height:48px;flex:0 0 48px;background:var(--primary);color:#fff;
  display:flex;align-items:center;padding:0 6px;position:relative}
.cv-nav-back{background:none;border:0;color:#fff;font-size:26px;line-height:1;
  width:40px;height:40px;cursor:pointer;padding:0 0 4px}
.cv-nav-title{font-size:16px;font-weight:600;position:absolute;left:0;right:0;
  text-align:center;pointer-events:none}
.cv-nav-sys{margin-left:auto;font-size:11px;background:rgba(255,255,255,.16);
  border-radius:10px;padding:2px 9px;z-index:1}

.cv-map-wrap{flex:1;min-height:0;position:relative;width:100%}
.cv-map{position:relative;z-index:0;width:100%;height:100%;background:#e9eef5}

/* 中心固定图钉：尖端（bottom center）落在屏幕正中 */
.cv-center-pin{position:absolute;left:50%;top:50%;width:24px;height:32px;
  margin-left:-12px;margin-top:-32px;pointer-events:none;z-index:20;
  filter:drop-shadow(0 1px 3px rgba(0,0,0,.35))}
.cv-center-pin svg{display:block}

.cv-controls{position:absolute;right:12px;bottom:180px;z-index:30;
  display:flex;flex-direction:column;align-items:center}
.cv-ctl-btn{width:36px;height:36px;border-radius:6px;background:#fff;border:0;
  color:var(--primary);font-size:11px;font-weight:600;margin-bottom:8px;
  cursor:pointer;font-family:inherit;box-shadow:0 1px 4px rgba(6,20,34,.14)}
.cv-zoom{background:#fff;border-radius:6px;overflow:hidden;
  box-shadow:0 1px 4px rgba(6,20,34,.14)}
.cv-zoom-btn{width:36px;height:36px;background:#fff;border:0;color:var(--primary);
  font-size:22px;font-weight:500;line-height:34px;cursor:pointer;display:block;
  font-family:inherit}
.cv-zoom-minus{border-top:1px solid var(--border);font-size:24px;line-height:32px}

.cv-bottom{position:absolute;left:12px;right:12px;bottom:calc(6px + env(safe-area-inset-bottom));
  background:rgba(255,255,255,.94);border-radius:12px;padding:10px 14px 12px;
  z-index:40;box-shadow:0 4px 18px rgba(6,20,34,.16)}
.cv-legend-row{display:flex;align-items:center;justify-content:center;height:22px;position:relative}
.cv-legend-item{display:flex;align-items:center;margin:0 12px}
.cv-dot{width:8px;height:8px;border-radius:50%;margin-right:5px;display:inline-block}
.cv-dot-original{background:#ed6a0c}
.cv-dot-correct{background:var(--primary)}
.cv-offset{position:absolute;right:0;font-size:11px;color:var(--text-secondary)}
.cv-coord{color:#646566;font-size:12px;height:20px;line-height:20px;margin-top:4px;
  text-align:center;font-variant-numeric:tabular-nums}
.cv-actions{height:40px;margin-top:6px;position:relative;width:100%}
.cv-btn{border-radius:6px;font-size:15px;height:40px;line-height:40px;
  position:absolute;top:0;width:48%;text-align:center;cursor:pointer;
  font-family:inherit;padding:0}
.cv-btn-cancel{background:#fff;border:1px solid #c8c9cc;color:var(--text);left:0}
.cv-btn-confirm{background:var(--primary);border:0;color:#fff;right:0}

/* 原始点标注气泡 */
.cv-tip{background:#ed6a0c !important;border:0 !important;border-radius:6px !important;
  color:#fff !important;font-size:12px !important;padding:3px 7px !important;
  box-shadow:none !important}
.cv-tip::before{border-top-color:#ed6a0c !important}
.cv-pin{background:none;border:0}

body.cv-open{overflow:hidden}

/* ---------- 查看模式 / 测距 ---------- */
.cv-bottom-view{padding:12px 16px 14px}
.cv-view-hint{color:var(--text-secondary);font-size:11.5px;text-align:center;margin-top:4px}
.cv-distance-text{color:var(--primary);font-size:15px;font-weight:600;line-height:22px;
  margin-top:6px;text-align:center}
.cv-dot-current{background:var(--primary)}
.cv-dot-station{background:#ed6a0c}

.cv-mode-row{background:#eef2f6;border-radius:6px;height:32px;margin-bottom:8px;position:relative;width:100%}
.cv-mode-btn{position:absolute;top:2px;width:48%;height:28px;line-height:28px;border:0;border-radius:5px;
  background:#f0f2f5;color:#4a5d73;font-size:13px;cursor:pointer;font-family:inherit;padding:0}
.cv-mode-btn-left{left:2px}
.cv-mode-btn-right{right:2px}
.cv-mode-btn.active{background:var(--primary);color:#fff;font-weight:600}

.cv-measure-hint{color:var(--text-secondary);font-size:12px;text-align:center;line-height:18px}
.cv-finish-btn{width:100%;height:28px;line-height:28px;border:0;border-radius:6px;
  background:var(--primary);color:#fff;font-size:13px;margin-top:6px;cursor:pointer;font-family:inherit}
.cv-measure-actions{display:flex;gap:8px;margin-top:8px}
.cv-btn-sm{flex:1;height:32px;line-height:32px;border:0;border-radius:6px;font-size:13px;
  cursor:pointer;font-family:inherit;background:#fff;color:var(--primary);font-weight:500}
.cv-btn-exit{background:#e54d42;color:#fff}
.cv-btn-del{background:#e54d42;color:#fff;margin-top:8px;width:100%}
.cv-sel-title{color:#8a9bb0;font-size:12px;letter-spacing:1px;text-align:center;margin-bottom:4px}
.cv-sel-distance{color:var(--primary);font-size:18px;font-weight:700;text-align:center;line-height:26px}

.cv-ctl-btn.active{background:var(--primary);color:#fff}
.cv-controls.mid{bottom:168px}
.cv-controls.low{bottom:124px}

/* 距离标签：用 0 尺寸 divIcon 定位，靠 span 自身居中 */
.cv-dist-wrap{background:none;border:0}
.cv-dist-tip{position:absolute;left:0;top:0;transform:translate(-50%,-50%);
  display:inline-block;background:#1989fa;color:#fff;border-radius:6px;
  font-size:11px;line-height:1.3;padding:2px 5px;white-space:nowrap;
  box-shadow:0 1px 4px rgba(6,20,34,.25)}
.cv-dist-tip-sel{background:#ff6b00}
.cv-dist-tip-station{background:#07c160}

/* 蓝色气泡（定位点） */
.cv-tip-blue{background:var(--primary) !important}
.cv-tip-blue::before{border-top-color:var(--primary) !important}
