:root{
  --ink:#171a20;
  --ink-2:#2c3038;
  --muted:#6b7280;
  --muted-2:#9aa3af;
  --line:#e6e9ee;
  --line-2:#eef1f5;
  --bg:#f3f5f7;
  --card:#ffffff;
  --accent:#166bc7;
  --accent-2:#114a78;
  --accent-soft:#eaf2fb;
  --brand:#4eb389;
  --brand-2:#3da076;
  --brand-soft:#eaf6f1;
  --brand-line:#c6e3d5;
  --ok:#00a13b;
  --ok-soft:#e9f7ee;
  --warn:#c2410c;
  --warn-soft:#fdf0e7;
  --radius:14px;
  --radius-sm:10px;
  --shadow:0 1px 2px rgba(23,26,32,.04), 0 8px 24px -12px rgba(23,26,32,.18);
  --shadow-sm:0 1px 2px rgba(23,26,32,.05);
  --font:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",Roboto,sans-serif;
  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;
}
*,*::before,*::after{box-sizing:border-box}
html,body{margin:0;padding:0}
body{
  font-family:var(--font);
  color:var(--ink);
  background:
    radial-gradient(1200px 600px at 85% -10%, #eaf2fb 0%, rgba(234,242,251,0) 55%),
    var(--bg);
  line-height:1.55;
  -webkit-font-smoothing:antialiased;
  font-size:14px;
  min-height:100vh;
}
code,.mono{font-family:var(--mono)}

/* ---------- Header ---------- */
header.topbar{
  position:sticky;top:0;z-index:20;
  background:rgba(255,255,255,.86);
  backdrop-filter:saturate(1.6) blur(10px);
  border-bottom:1px solid var(--line);
}
.topbar-inner{
  max-width:1200px;margin:0 auto;padding:14px 22px;
  display:flex;align-items:center;gap:14px;
}
.logo{
  width:38px;height:38px;border-radius:10px;flex:0 0 auto;
  display:grid;place-items:center;
  background:linear-gradient(150deg,var(--brand) 0%,var(--brand-2) 100%);
  color:#fff;box-shadow:var(--shadow-sm);
}
.brand h1{font-size:16px;margin:0;font-weight:700;letter-spacing:.2px}
.brand p{margin:0;font-size:12px;color:var(--muted)}
.topbar .spacer{flex:1}
.pill{
  display:inline-flex;align-items:center;gap:6px;
  font-size:12px;color:var(--accent-2);
  background:var(--accent-soft);border:1px solid #d6e6f7;
  padding:5px 11px;border-radius:999px;white-space:nowrap;
}
.pill .dot{width:7px;height:7px;border-radius:50%;background:var(--ok);box-shadow:0 0 0 3px var(--ok-soft)}
.pill .dot.loading{background:#e0a500;box-shadow:0 0 0 3px #fdf3d5;animation:pulse 1.1s ease-in-out infinite}

/* ---------- Layout ---------- */
main{max-width:1200px;margin:0 auto;padding:22px}
.layout{
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(260px,280px);
  gap:20px;
  align-items:start;
}
.col{display:flex;flex-direction:column;gap:20px;min-width:0}

/* ---------- Panel ---------- */
.panel{
  background:var(--card);border:1px solid var(--line);
  border-radius:var(--radius);box-shadow:var(--shadow-sm);
  overflow:hidden;
}
.panel-head{
  display:flex;align-items:center;gap:10px;
  padding:15px 18px;border-bottom:1px solid var(--line-2);
}
.panel-head .ic{
  width:30px;height:30px;border-radius:8px;display:grid;place-items:center;flex:0 0 auto;
  background:var(--accent-soft);color:var(--accent);
}
.panel-head h2{font-size:14.5px;margin:0;font-weight:650}
.panel-head .hint{font-size:12px;color:var(--muted);margin-left:auto;text-align:right}
.panel-body{padding:18px}

/* ---------- Dropzone ---------- */
.dropzone{
  border:1.5px dashed #c7d2e0;border-radius:var(--radius-sm);
  background:linear-gradient(#fbfcfe,#f6f9fc);
  padding:30px 18px;text-align:center;cursor:pointer;
  transition:border-color .18s,background .18s,transform .18s;
  position:relative;
}
.dropzone:hover{border-color:var(--accent);background:#f3f8fd}
.dropzone.drag{border-color:var(--accent);background:var(--accent-soft);transform:translateY(-1px)}
.dropzone .dz-ic{
  width:46px;height:46px;margin:0 auto 12px;border-radius:12px;
  display:grid;place-items:center;background:#fff;border:1px solid var(--line);
  color:var(--accent);box-shadow:var(--shadow-sm);
}
.dropzone .dz-title{font-weight:600;font-size:14px}
.dropzone .dz-sub{font-size:12.5px;color:var(--muted);margin-top:4px}
.dropzone .dz-sub b{color:var(--accent);font-weight:600}

/* ---------- URL row ---------- */
.field-label{font-size:12.5px;color:var(--muted);margin:16px 0 7px;display:flex;align-items:center;gap:6px}
.url-row{display:flex;gap:10px;align-items:stretch}
textarea.url-input{
  flex:1;resize:vertical;min-height:44px;max-height:140px;
  padding:11px 12px;border:1px solid var(--line);border-radius:var(--radius-sm);
  font:inherit;font-size:13px;color:var(--ink);background:#fcfdff;outline:none;
  transition:border-color .16s,box-shadow .16s;
}
textarea.url-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px rgba(22,107,199,.12);background:#fff}
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:7px;
  border:1px solid transparent;border-radius:var(--radius-sm);
  padding:11px 18px;font:inherit;font-size:13.5px;font-weight:600;cursor:pointer;
  transition:background .16s,border-color .16s,color .16s,transform .06s;
  white-space:nowrap;user-select:none;
}
.btn:active{transform:translateY(1px)}
.btn-primary{background:var(--brand);color:#fff}
.btn-primary:hover{background:var(--brand-2)}
.btn-ghost{background:#fff;border-color:var(--line);color:var(--ink-2)}
.btn-ghost:hover{border-color:#c7d2e0;background:#fafbfd}
.btn-danger{background:#fff;border-color:#f0d6cb;color:var(--warn)}
.btn-danger:hover{background:var(--warn-soft)}
.btn:disabled{opacity:.55;cursor:not-allowed}
.btn-sm{padding:7px 12px;font-size:12.5px;border-radius:8px}
.btn .spin{width:15px;height:15px;border-radius:50%;border:2px solid rgba(255,255,255,.45);border-top-color:#fff;animation:spin .7s linear infinite;display:none}
.btn.loading .spin{display:block}
@keyframes spin{to{transform:rotate(360deg)}}

/* ---------- Results ---------- */
.results{margin-top:18px;display:flex;flex-direction:column;gap:10px}
.result{
  border:1px solid var(--line);border-radius:var(--radius-sm);
  padding:12px 13px;background:#fcfdff;
  animation:fade .25s ease both;
}
@keyframes fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
.result.ok{border-color:#cdebd8;background:var(--ok-soft)}
.result.fail{border-color:#f3ddd3;background:var(--warn-soft)}
.result-top{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--muted);margin-bottom:6px}
.result-top .src{font-family:var(--mono);font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:60%}
.result-top .badge{margin-left:auto;display:inline-flex;align-items:center;gap:5px;font-weight:600}
.badge.g{color:var(--ok)} .badge.r{color:var(--warn)}
.result-text{
  font-family:var(--mono);font-size:13px;color:var(--ink);
  word-break:break-all;line-height:1.6;white-space:pre-wrap;
}
.result-text.empty{color:var(--muted-2);font-family:var(--font)}
.result-actions{display:flex;gap:8px;margin-top:9px;flex-wrap:wrap}

/* ---------- Camera ---------- */
.cam-stage{
  position:relative;border-radius:var(--radius-sm);overflow:hidden;
  background:var(--card);border:1px solid var(--line);aspect-ratio:4/3;
}
/* 摄像头真正出画面后才用深色底，避免未开启时是一块黑 */
.cam-stage.live{background:#0e1116;border-color:#0e1116}
.cam-stage video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
.cam-stage canvas{display:none}
.cam-placeholder{position:absolute;inset:0;display:grid;place-items:center;align-content:center;justify-items:center;color:var(--muted);text-align:center;padding:24px}
.cam-placeholder svg{color:var(--accent);opacity:.9;margin-bottom:10px}
.cam-placeholder .ph-t{font-size:13.5px;color:var(--ink);font-weight:600}
.scan-frame{position:absolute;inset:0;pointer-events:none;display:none}
.scan-frame.on{display:block}
.scan-frame::before,.scan-frame::after{
  content:"";position:absolute;width:42px;height:42px;
  border:3px solid rgba(0,241,140,.9);
}
.scan-frame::before{top:14px;left:14px;border-right:0;border-bottom:0;border-top-left-radius:6px}
.scan-frame::after{bottom:14px;right:14px;border-left:0;border-top:0;border-bottom-right-radius:6px}
.scan-line{
  position:absolute;left:12px;right:12px;height:2px;
  background:linear-gradient(90deg,transparent,#00f18c,transparent);
  box-shadow:0 0 10px #00f18c;animation:scanmove 2s ease-in-out infinite;
}
@keyframes scanmove{0%,100%{top:16%}50%{top:82%}}
.cam-controls{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:14px}
.cam-settings{display:flex;gap:14px;align-items:center;flex-wrap:wrap;margin-top:12px;padding-top:12px;border-top:1px dashed var(--line)}
.setting{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--muted)}
.setting select{
  font:inherit;font-size:12.5px;padding:6px 9px;border:1px solid var(--line);
  border-radius:8px;background:#fff;color:var(--ink);outline:none;
}
.setting select:focus{border-color:var(--accent)}
.switch{position:relative;display:inline-flex;align-items:center;cursor:pointer;gap:8px}
.switch input{position:absolute;opacity:0;width:0;height:0}
.track{width:36px;height:20px;border-radius:999px;background:#cfd6e0;transition:background .18s;position:relative;flex:0 0 auto}
.track::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:#fff;transition:left .18s;box-shadow:0 1px 2px rgba(0,0,0,.25)}
.switch input:checked + .track{background:var(--ok)}
.switch input:checked + .track::after{left:18px}
.cam-live{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--ok);font-weight:600}
.cam-live .live{width:8px;height:8px;border-radius:50%;background:var(--ok);animation:pulse 1.1s ease-in-out infinite}
@keyframes pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.35;transform:scale(.8)}}

/* ---------- History ---------- */
.panel-head .count{
  font-size:12px;font-weight:600;color:var(--accent);
  background:var(--accent-soft);border-radius:999px;padding:2px 9px;margin-left:8px;
}
.hist-list{display:flex;flex-direction:column;gap:8px}
.hist-item{
  border:1px solid var(--line);border-radius:var(--radius-sm);
  padding:10px 11px;background:#fcfdff;transition:border-color .15s,background .15s;
}
.hist-item:hover{border-color:#c7d2e0;background:#fff}
.hist-meta{display:flex;align-items:center;gap:7px;font-size:11.5px;color:var(--muted-2);margin-bottom:5px}
.hist-src{
  display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;
  color:var(--accent-2);background:var(--accent-soft);border-radius:6px;padding:1px 7px;
}
.hist-src.cam{color:var(--ok);background:var(--ok-soft)}
.hist-time{margin-left:auto;font-variant-numeric:tabular-nums}
.hist-text{
  font-family:var(--mono);font-size:12.5px;color:var(--ink-2);
  word-break:break-all;line-height:1.55;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.hist-actions{display:flex;gap:6px;margin-top:8px}
.icon-btn{
  display:inline-flex;align-items:center;gap:5px;font-size:11.5px;color:var(--muted);
  background:#fff;border:1px solid var(--line);border-radius:7px;padding:4px 9px;cursor:pointer;
  transition:all .15s;font-family:inherit;
}
.icon-btn:hover{color:var(--brand);border-color:var(--brand-line);background:var(--brand-soft)}
.icon-btn svg{width:16px;height:16px;flex:0 0 auto}
.icon-btn .ib-check{display:none}
.icon-btn.is-copied,.icon-btn.is-copied:hover{color:var(--brand-2);border-color:var(--brand-line);background:var(--brand-soft)}
.icon-btn.is-copied .ib-copy{display:none}
.icon-btn.is-copied .ib-check{display:block}
/* 删除：鼠标移到记录上才出现，避免一行摆四个按钮 */
.hist-del{margin-left:auto;opacity:0;pointer-events:none}
.hist-item:hover .hist-del,.hist-del:focus-visible{opacity:1;pointer-events:auto}
.hist-del:hover{color:var(--warn);border-color:#f0d6cb;background:var(--warn-soft)}
@media (hover:none){.hist-del{opacity:1;pointer-events:auto}}

/* ---------- Pager ---------- */
.pager{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:10px}
.pg-nav,.pg-num{
  display:inline-flex;align-items:center;justify-content:center;height:28px;min-width:28px;
  padding:0 9px;font-family:inherit;font-size:12px;color:var(--muted);
  background:#fff;border:1px solid var(--line);border-radius:8px;cursor:pointer;transition:all .15s;
}
.pg-nav:hover:not(:disabled),.pg-num:hover{color:var(--brand);border-color:var(--brand-line);background:var(--brand-soft)}
.pg-num.on{color:#fff;background:var(--brand);border-color:var(--brand);font-weight:600}
.pg-nav:disabled{opacity:.45;cursor:not-allowed}
.pg-info{font-size:12px;color:var(--muted-2);margin-left:2px}
.empty-state{text-align:center;color:var(--muted-2);font-size:12.5px;padding:26px 14px}
.empty-state .es-ic{color:#ccd4de;margin-bottom:8px}
.history-bar{display:flex;gap:8px;align-items:center;padding:12px 18px;border-top:1px solid var(--line-2);background:#fbfcfe;flex-wrap:wrap}
.history-bar .spacer{flex:1}

/* ---------- Toast ---------- */
#toast{
  position:fixed;left:50%;bottom:26px;transform:translate(-50%,120%);
  background:var(--ink);color:#fff;font-size:13px;padding:10px 18px;border-radius:999px;
  box-shadow:0 10px 30px -8px rgba(0,0,0,.4);z-index:60;opacity:0;
  transition:transform .28s cubic-bezier(.2,.8,.2,1),opacity .28s;pointer-events:none;
  display:flex;align-items:center;gap:8px;max-width:90vw;
}
#toast.show{transform:translate(-50%,0);opacity:1}

footer.foot{max-width:1200px;margin:8px auto 40px;padding:0 22px;color:var(--muted-2);font-size:12px;text-align:center}
footer.foot b{color:var(--muted);font-weight:600}

@media (max-width:900px){
  .layout{grid-template-columns:1fr}
  .col.right{order:-1}
  .topbar-inner{padding:12px 16px}
  main{padding:16px}
  .panel-head .hint{display:none}
}
