/* Scanner QR intégré à la page (02/09, demande Nicolas : "à chaque fois que
   tu démarres, tu scannes" -- le pipeline usine ne dépend plus de l'appareil
   photo natif du téléphone, qu'une page web ne peut de toute façon pas
   ouvrir). Partagé par la page de démarrage (/pipeline) et l'écran de fin
   de séance du pipeline (pipeline.html) : même écran plein cadre, même
   vidéo, même bandeau d'information. Le décodage lui-même est dans
   qc-qr-scan.js (jsQR vendu localement, cf. static/jsqr.js). */
.qr-scan-screen { position:fixed; inset:0; height:100dvh; z-index:1000;
  display:flex; flex-direction:column; justify-content:flex-end;
  background:#000; overflow:hidden; }
.qr-scan-screen[hidden] { display:none; }
.qr-scan-video { position:absolute; inset:0; width:100%; height:100%; object-fit:cover; }
/* Cadre de visée : STATIQUE (règle design -- aucune animation décorative),
   juste un repère pour centrer le QR. pointer-events:none pour que le tap
   de relance de la vidéo (iOS, cf. qc-qr-scan.js) atteigne bien la vidéo. */
.qr-scan-reticle { position:absolute; left:50%; top:42%; width:min(62vw, 300px);
  aspect-ratio:1; transform:translate(-50%,-50%); border-radius:14px;
  border:2px solid rgba(255,255,255,.85); pointer-events:none; }
.qr-scan-close { position:absolute; top:max(env(safe-area-inset-top,0px),14px); right:14px;
  width:44px; height:44px; border-radius:999px; border:0; z-index:2;
  background:rgba(0,0,0,.55); color:#fff; display:grid; place-items:center; cursor:pointer; }
.qr-scan-close svg { width:20px; height:20px; }
/* Bandeau bas posé PAR-DESSUS la vidéo (dégradé, même famille que
   .qcphoto-bar du viseur photo) -- titre + consigne + statut texte. */
.qr-scan-info { position:relative; z-index:1; text-align:center;
  padding:24px 20px max(env(safe-area-inset-bottom,0px),24px);
  background:linear-gradient(to top, rgba(0,0,0,.75), rgba(0,0,0,0) 92%); }
.qr-scan-info svg { width:52px; height:52px; color:var(--pass); margin-bottom:12px; }
.qr-scan-info h3 { margin:0 0 6px; font-size:18px; color:#fff; }
.qr-scan-info p { margin:0; color:rgba(255,255,255,.75); font-size:14px; }
/* Statut (caméra refusée, QR non reconnu...) : texte seul, jamais une
   pastille animée. min-height pour ne pas faire sauter le bandeau. */
.qr-scan-status { min-height:18px; margin-top:8px !important; color:#fff !important; font-size:13px !important; }
/* Bouton "démarrer une séance" en HAUT de la page pipeline (02/09) --
   même gabarit que le déclencheur photo pleine largeur (.qcphoto-trigger-
   big), même bleu : c'est la première action de la séance. */
.qr-scan-start-btn { width:100%; margin:0 0 18px; padding:18px; border-radius:14px; border:0;
  background:#3b82f6; color:#fff; font-size:16px; font-weight:600; cursor:pointer;
  display:flex; align-items:center; justify-content:center; gap:10px; }
.qr-scan-start-btn svg { width:22px; height:22px; }
.qr-scan-start-btn:active { opacity:.85; }
