/* ================= 基础 ================= */
:root{
  --blue:#2563eb;
  --blue-dark:#1d4ed8;
  --ok:#12b981;
  --warn:#f59e0b;
  --err:#ef4444;
  --text:#111827;
  --text-2:#6b7280;
  --text-3:#9ca3af;
  --line:#e5e7eb;
  --bg:#ffffff;
  --bg-2:#f6f7f9;
  --radius:12px;
  --safe-b:env(safe-area-inset-bottom,0px);
}
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
/* 让 hidden 属性压过任何 display 声明，否则类选择器的 display 会把它盖掉 */
[hidden]{display:none!important}
html,body{height:100%}
body{
  font-family:-apple-system,BlinkMacSystemFont,"PingFang SC","HarmonyOS Sans SC","Microsoft YaHei",sans-serif;
  background:var(--bg);color:var(--text);
  font-size:15px;line-height:1.5;
  -webkit-font-smoothing:antialiased;
  overscroll-behavior-y:none;
}
input,button{font-family:inherit;font-size:inherit;color:inherit}
a{color:var(--blue);text-decoration:none}

.app{min-height:100%;display:flex;flex-direction:column;max-width:560px;margin:0 auto}

/* ================= 顶部 ================= */
.topbar{padding:calc(18px + env(safe-area-inset-top,0px)) 20px 10px;text-align:center}
.topbar h1{font-size:20px;font-weight:800;letter-spacing:.5px}
.topbar .sub{margin-top:6px;font-size:13px;color:var(--text-2)}

/* ================= 步骤条 ================= */
.steps{display:flex;align-items:center;justify-content:center;gap:0;padding:14px 20px 18px}
.step-dot{display:flex;flex-direction:column;align-items:center;gap:6px;flex:0 0 auto}
.step-dot i{
  width:22px;height:22px;border-radius:50%;background:var(--bg-2);border:2px solid var(--line);
  display:block;position:relative;transition:.25s;
}
.step-dot i::after{
  content:attr(data-n);position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-size:11px;font-weight:700;color:var(--text-3);
}
.step-dot span{font-size:11px;color:var(--text-3);font-weight:500;white-space:nowrap}
.step-dot.active i{background:var(--blue);border-color:var(--blue);box-shadow:0 0 0 4px rgba(37,99,235,.12)}
.step-dot.active i::after{color:#fff}
.step-dot.active span{color:var(--blue);font-weight:700}
.step-dot.done i{background:var(--ok);border-color:var(--ok)}
.step-dot.done i::after{content:"✓";color:#fff;font-size:12px}
.step-dot.done span{color:var(--ok)}
.step-line{width:36px;height:2px;background:var(--line);margin:0 8px 18px;border-radius:2px}

/* ================= 主区 ================= */
.main{flex:1;padding:0 20px 24px}
.panel{display:none;animation:fade .25s ease}
.panel.show{display:block}
@keyframes fade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}

/* ================= 表单 ================= */
.org-bar{
  display:flex;align-items:center;gap:10px;padding:12px 14px;margin-bottom:18px;
  background:#eef4ff;border:1px solid #dbe6ff;border-radius:var(--radius);
}
.org-bar[hidden]{display:none}
.org-label{font-size:12px;font-weight:700;color:var(--blue);background:#fff;padding:3px 8px;border-radius:6px;flex:0 0 auto}
.org-name{font-size:14px;font-weight:700;color:var(--text);word-break:break-all}

.field{margin-bottom:16px}
.field label{display:block;font-size:13px;font-weight:700;color:var(--text);margin-bottom:7px}
.field label em{color:var(--err);font-style:normal}
.field input{
  width:100%;height:48px;padding:0 14px;border:1.5px solid var(--line);border-radius:var(--radius);
  background:var(--bg-2);font-size:16px;outline:none;transition:.18s;
}
.field input::placeholder{color:var(--text-3);font-weight:400}
.field input:focus{border-color:var(--blue);background:#fff;box-shadow:0 0 0 3px rgba(37,99,235,.1)}
.field input:disabled{color:var(--text-2);background:#eef0f4}
.field input.err{border-color:var(--err);background:#fff5f5;animation:shake .3s}
@keyframes shake{0%,100%{transform:translateX(0)}25%{transform:translateX(-5px)}75%{transform:translateX(5px)}}

.agree{display:flex;gap:9px;align-items:flex-start;margin:20px 0 22px;font-size:12.5px;color:var(--text-2);line-height:1.6}
.agree input{
  appearance:none;-webkit-appearance:none;width:18px;height:18px;flex:0 0 18px;margin-top:1px;
  border:2px solid #cbd5e1;border-radius:5px;background:#fff;position:relative;transition:.15s;cursor:pointer;
}
.agree input:checked{background:var(--blue);border-color:var(--blue)}
.agree input:checked::after{content:"";position:absolute;left:5px;top:1.5px;width:5px;height:9px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
.agree a{font-weight:600}

/* ================= 按钮 ================= */
.btn{
  display:block;width:100%;height:50px;border:none;border-radius:var(--radius);
  font-size:16px;font-weight:700;cursor:pointer;transition:.18s;
}
.btn:active{transform:scale(.985)}
.btn-primary{background:var(--blue);color:#fff;box-shadow:0 6px 16px -6px rgba(37,99,235,.55)}
.btn-primary:active{background:var(--blue-dark)}
.btn-primary:disabled{background:#c7d2e5;box-shadow:none;color:#fff}
.btn-ghost{background:var(--bg-2);color:var(--text);border:1.5px solid var(--line)}
.btn-row{display:flex;gap:12px;margin-top:16px}
.btn-row .btn{flex:1}

/* ================= 摄像头 ================= */
.cam-wrap{
  position:relative;width:100%;aspect-ratio:3/4;background:#0b0f14;border-radius:16px;overflow:hidden;
  margin-bottom:14px;
}
.cam-wrap video{
  position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  transform:scaleX(-1);background:#0b0f14;
}
.cam-mask{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none}
.oval{
  width:64%;height:74%;border-radius:50%;
  box-shadow:0 0 0 9999px rgba(2,6,12,.62);
  border:3px solid rgba(255,255,255,.85);
  transition:border-color .2s;
}
.oval.ok{border-color:var(--ok)}
.oval.bad{border-color:rgba(255,255,255,.6)}

.hint{
  position:absolute;left:0;right:0;top:14px;text-align:center;
  font-size:13px;font-weight:600;color:#fff;text-shadow:0 1px 4px rgba(0,0,0,.6);
  padding:0 24px;
}
.btn-shoot{margin-top:2px}
.btn-shoot + .btn-row{margin-top:12px}

.flash{position:absolute;inset:0;background:#fff;opacity:0;pointer-events:none;transition:opacity .12s}
.flash.on{opacity:.85}

/* ================= 提示 ================= */
.tip{margin-top:14px;text-align:center;font-size:12px;color:var(--text-3);line-height:1.5}

/* ================= 裁剪（固定框 + 拖动缩放照片） ================= */
.crop-tip{margin:0 0 12px;font-size:12.5px;color:var(--text-2);line-height:1.6;text-align:center}
.crop-stage{
  position:relative;width:100%;height:clamp(300px,52vh,440px);
  background:#0b0f14;border-radius:14px;overflow:hidden;
  touch-action:none;user-select:none;-webkit-user-select:none;cursor:grab;
}
.crop-stage:active{cursor:grabbing}
.crop-stage img{
  position:absolute;left:0;top:0;transform-origin:0 0;
  max-width:none;max-height:none;pointer-events:none;
  will-change:transform;-webkit-user-drag:none;
}
/* 固定的裁剪框：不响应指针事件，只负责视觉 */
.crop-frame{
  position:absolute;border:2px solid #fff;border-radius:4px;
  box-shadow:0 0 0 9999px rgba(2,6,12,.6);
  pointer-events:none;
}
.cf-grid{
  position:absolute;inset:0;
  background-image:
    linear-gradient(to right,rgba(255,255,255,.26) 1px,transparent 1px),
    linear-gradient(to bottom,rgba(255,255,255,.26) 1px,transparent 1px);
  background-size:33.333% 33.333%;
  background-position:-1px -1px;
  opacity:.9;
}
.cf-corner{position:absolute;width:18px;height:18px;border:3px solid #fff}
.cf-corner.tl{left:-2px;top:-2px;border-right:0;border-bottom:0;border-radius:4px 0 0 0}
.cf-corner.tr{right:-2px;top:-2px;border-left:0;border-bottom:0;border-radius:0 4px 0 0}
.cf-corner.bl{left:-2px;bottom:-2px;border-right:0;border-top:0;border-radius:0 0 0 4px}
.cf-corner.br{right:-2px;bottom:-2px;border-left:0;border-top:0;border-radius:0 0 4px 0}

.zoom-bar{display:flex;align-items:center;gap:10px;margin:14px 2px 2px}
.zoom-btn{
  width:34px;height:34px;flex:0 0 34px;border-radius:10px;border:1.5px solid var(--line);
  background:var(--bg-2);color:var(--text);font-size:17px;font-weight:700;line-height:1;
  display:flex;align-items:center;justify-content:center;cursor:pointer;
}
.zoom-btn:active{background:#e8ecf2}
.zoom-bar input[type=range]{
  flex:1;appearance:none;-webkit-appearance:none;height:4px;border-radius:4px;
  background:#dfe3ea;outline:none;
}
.zoom-bar input[type=range]::-webkit-slider-thumb{
  appearance:none;-webkit-appearance:none;width:20px;height:20px;border-radius:50%;
  background:#fff;border:2px solid var(--blue);box-shadow:0 2px 6px rgba(37,99,235,.35);cursor:pointer;
}
.zoom-bar input[type=range]::-moz-range-thumb{
  width:18px;height:18px;border-radius:50%;background:#fff;border:2px solid var(--blue);
}

.crop-tools{display:flex;align-items:center;justify-content:space-between;margin-top:10px}
.crop-tools .link-btn{font-size:13px;font-weight:700;color:var(--blue);background:none;border:none;padding:4px 0;cursor:pointer}
.crop-size{font-size:11.5px;color:var(--text-3)}
.crop-size.warn{color:var(--warn);font-weight:700}

/* ================= 预览 ================= */
.preview-wrap{
  width:100%;padding:16px 0;border-radius:16px;background:var(--bg-2);
  display:flex;align-items:center;justify-content:center;margin-bottom:10px;
}
/* 按比例缩放展示（原图 640×680，等比例缩到手机可看的大小） */
.preview-wrap img{
  width:200px;height:212px;object-fit:cover;border-radius:8px;
  box-shadow:0 6px 18px -8px rgba(17,24,39,.35);background:#fff;
}
.preview-note{text-align:center;font-size:11.5px;color:var(--text-3);margin-bottom:16px}
.summary{
  background:var(--bg-2);border-radius:var(--radius);padding:4px 14px;
}
.summary div{display:flex;justify-content:space-between;gap:12px;padding:11px 0;border-bottom:1px solid #eceef2;font-size:13.5px}
.summary div:last-child{border-bottom:none}
.summary dt{color:var(--text-3);flex:0 0 auto}
.summary dd{color:var(--text);font-weight:600;text-align:right;word-break:break-all}

/* ================= 完成 ================= */
#panelDone{text-align:center;padding-top:26px}
.done-icon{
  width:76px;height:76px;border-radius:50%;margin:0 auto 20px;
  background:var(--ok);color:#fff;font-size:38px;line-height:76px;font-weight:700;
  box-shadow:0 10px 26px -10px rgba(18,185,129,.6);
}
.done-icon.fail{background:var(--err);box-shadow:0 10px 26px -10px rgba(239,68,68,.6)}
.done-title{font-size:20px;font-weight:800;margin-bottom:8px}
.done-desc{font-size:14px;color:var(--text-2);margin-bottom:18px}
.done-code{
  display:inline-block;font-size:12.5px;color:var(--text-2);background:var(--bg-2);
  padding:8px 14px;border-radius:8px;margin-bottom:24px;font-family:ui-monospace,Menlo,Consolas,monospace;
}
.done-code:empty{display:none}

/* ================= 底部 ================= */
.foot{padding:10px 20px calc(16px + var(--safe-b));text-align:center;font-size:11px;color:var(--text-3)}

/* ================= 弹窗 ================= */
.modal{
  position:fixed;inset:0;background:rgba(8,12,18,.55);z-index:90;
  display:none;align-items:flex-end;justify-content:center;
  backdrop-filter:blur(2px);
}
.modal.show{display:flex}
.modal-box{
  width:100%;max-width:560px;background:#fff;border-radius:18px 18px 0 0;
  padding:22px 20px calc(20px + var(--safe-b));animation:up .26s cubic-bezier(.2,.8,.3,1);
  max-height:86vh;display:flex;flex-direction:column;
}
@keyframes up{from{transform:translateY(100%)}to{transform:none}}
.modal-box h3{font-size:16px;font-weight:800;margin-bottom:14px;text-align:center;flex:0 0 auto}
.modal-body{overflow-y:auto;-webkit-overflow-scrolling:touch;font-size:13px;color:#374151;line-height:1.75;margin-bottom:18px}
.modal-body p{margin-bottom:12px}
.modal-body b{color:var(--text)}
.modal-box .btn{flex:0 0 auto}

/* ================= Toast ================= */
.toast{
  position:fixed;left:50%;top:50%;transform:translate(-50%,-50%) scale(.95);
  background:rgba(17,24,39,.92);color:#fff;font-size:14px;font-weight:600;
  padding:12px 20px;border-radius:10px;max-width:78vw;text-align:center;
  opacity:0;pointer-events:none;transition:.2s;z-index:120;
}
.toast.show{opacity:1;transform:translate(-50%,-50%) scale(1)}

/* ================= 小屏微调 ================= */
@media (max-height:700px){
  .topbar h1{font-size:18px}
  .cam-wrap{aspect-ratio:4/5}
  .step-dot span{display:none}
}
