.scanbtns{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:4px 0 18px}
.scanb{display:grid;justify-items:start;align-content:start;gap:2px;text-align:left;background:var(--surface);border:1px solid var(--line2);border-radius:var(--r-lg);padding:16px;min-height:112px;color:var(--ink);cursor:pointer}
.scanb svg{width:28px;height:28px;color:var(--accent);margin-bottom:8px}
.scanb b{font-size:15px}
.scanb span{font-size:13px;color:var(--muted)}
.scanb:active{transform:scale(.98)}
.msg{background:var(--surface);border:1px solid var(--line2);border-radius:var(--r-md);padding:14px 16px;margin-bottom:16px}
.msg.bad{border-color:rgba(255,107,94,.45)}
.msg.warn{border-color:rgba(245,196,81,.45)}
.msg .row{margin-top:10px}
.camview{position:fixed;inset:0;z-index:70;background:#000;display:flex;flex-direction:column}
.camview video{flex:1;width:100%;object-fit:cover;min-height:0}
.camview .frame{position:absolute;left:50%;top:42%;width:min(68vw,300px);aspect-ratio:1;transform:translate(-50%,-50%);border-radius:28px;box-shadow:0 0 0 9999px rgba(0,0,0,.45);border:3px solid rgba(255,255,255,.9)}
.camfoot{position:absolute;left:0;right:0;bottom:0;padding:18px 16px calc(22px + env(safe-area-inset-bottom,0px));display:grid;gap:12px;justify-items:center;background:linear-gradient(transparent,rgba(0,0,0,.8))}
.camfoot p{margin:0;color:#fff;font-weight:600}
