:root {
  --navy: #0a1730;
  --navy-2: #0f2344;
  --ink: #15243d;
  --muted: #66748a;
  --line: #e4eaf1;
  --soft: #f5f8fb;
  --blue: #1769e0;
  --cyan: #18a6d9;
  --white: #fff;
  --shadow: 0 22px 60px rgba(10, 23, 48, .12);
}

* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
  margin: 0;
  font-family: "DM Sans", sans-serif;
  color: var(--ink);
  background: var(--white);
  line-height: 1.65;
}
a { color: inherit; text-decoration: none; }
.container { width: min(1160px, calc(100% - 40px)); margin: 0 auto; }

.site-header {
  position: sticky; top: 0; z-index: 20;
  background: rgba(255,255,255,.92);
  backdrop-filter: blur(14px);
  border-bottom: 1px solid rgba(228,234,241,.8);
}
.nav-wrap { min-height: 78px; display:flex; align-items:center; justify-content:space-between; gap: 30px; }
.brand { display:flex; align-items:center; gap:12px; }
.brand-mark {
  display:grid; place-items:center; width:42px; height:42px; border-radius:12px;
  background: linear-gradient(145deg, var(--blue), var(--cyan)); color:#fff;
  font-family:Manrope,sans-serif; font-weight:800; font-size:20px;
}
.brand strong { display:block; font-family:Manrope,sans-serif; letter-spacing:.08em; font-size:16px; }
.brand small { display:block; color:var(--muted); font-size:10px; letter-spacing:.05em; }
.nav { display:flex; align-items:center; gap:28px; font-size:14px; font-weight:600; }
.nav a:not(.nav-cta):hover { color:var(--blue); }
.nav-cta { padding:11px 17px; background:var(--navy); color:#fff; border-radius:9px; }
.menu-toggle { display:none; border:0; background:none; font-size:25px; color:var(--navy); }

.hero {
  position:relative; overflow:hidden; background:
  radial-gradient(circle at 90% 20%, rgba(24,166,217,.14), transparent 32%),
  linear-gradient(135deg,#f7fbff 0%,#fff 55%);
  padding: 58px 0 50px;
}
/* La bannière ne porte plus de carte de démonstration : le texte d'accueil
   occupe la première colonne, le globe terrestre la seconde. */
.hero-grid { display:grid; grid-template-columns:minmax(0,1fr) minmax(0,320px); gap:40px; align-items:center; }
.hero-copy { max-width:780px; }

/* Globe terrestre de la bannière. Le disque est fixe — ombré comme une sphère,
   quadrillé de ses parallèles et de ses méridiens —, et c'est la carte qui
   défile dessous, de la droite vers la gauche. La carte est posée deux fois
   bout à bout et le déplacement d'un tour vaut exactement sa largeur (360
   degrés de longitude) : la boucle se referme sans saut. */
.hero-globe { display:flex; justify-content:center; }
.globe { width:100%; max-width:300px; height:auto; filter:drop-shadow(0 18px 34px rgba(12,52,120,.28)); }
.globe-spin { animation:globe-turn 36s linear infinite; will-change:transform; }
.globe-grid { stroke-width:.7; opacity:.28; }
@keyframes globe-turn {
  from { transform:translateX(0); }
  to   { transform:translateX(-360px); }
}
/* Un appareil qui demande moins d'animation garde le globe, immobile. */
@media (prefers-reduced-motion:reduce) {
  .globe-spin { animation:none; }
}
@media (max-width:900px) {
  .globe { max-width:210px; }
}
.eyebrow,.section-kicker { text-transform:uppercase; letter-spacing:.14em; font-size:10.5px; font-weight:800; color:var(--blue); }
.hero h1, h2 { font-family:Manrope,sans-serif; letter-spacing:-.03em; line-height:1.12; }
.hero h1 { font-size:clamp(26px,2.7vw,34px); margin:11px 0 14px; color:var(--navy); }
.hero h1 span { color:var(--blue); }
.hero-text { max-width:640px; color:var(--muted); font-size:15.5px; }
.hero-actions { display:flex; gap:12px; flex-wrap:wrap; margin:22px 0 0; }
.btn { display:inline-flex; align-items:center; gap:14px; padding:12px 18px; border-radius:10px; font-weight:700; font-size:13.5px; transition:.2s; }
.btn span { font-size:20px; line-height:0; }
.btn-primary { background:var(--blue); color:#fff; box-shadow:0 12px 30px rgba(23,105,224,.2); }
.btn-primary:hover { transform:translateY(-2px); }
.btn-secondary { border:1px solid var(--line); background:#fff; }

/* Bouton « Installer l'application » : révélé par assets/pwa-install.js quand
   le navigateur accepte d'ajouter FONTEXTE à l'écran d'accueil. La loupe du
   bouton est celle de l'icône installée, pour qu'on la reconnaisse ensuite. */
.btn-install {
  gap:10px; border:1px solid #cfe1fa; background:#f1f7ff; color:var(--navy);
}
.btn-install:hover { background:#e4f0fe; }
.btn-install[hidden] { display:none; }
.btn-install img { width:20px; height:20px; border-radius:5px; flex:none; }

/* Même bouton dans la barre de navigation, à côté de « Services » : il y prend
   la taille des autres entrées du menu. */
.nav-install { padding:9px 13px; font-size:13px; gap:8px; }
.nav-install img { width:17px; height:17px; }

/* Même bouton dans la bannière d'accueil, à la suite des deux appels à l'action.
   Il y garde la taille des boutons voisins, et reste visible sur téléphone, là
   où la barre de navigation se replie derrière le menu ☰. */
.hero-install { padding:12px 18px; font-size:13.5px; }

/* Dans l'application déjà installée, il n'y a plus rien à installer : le bouton
   s'efface sans attendre que le script s'en charge, pour qu'il n'apparaisse pas
   le temps du chargement. */
@media all and (display-mode: standalone) {
  .btn-install { display:none; }
}
@media all and (display-mode: fullscreen) {
  .btn-install { display:none; }
}

/* Bande d'assistance, juste sous la bannière : les deux cas qui sortent du
   parcours ordinaire — le blocage technique et l'accès illimité — et l'adresse
   qui les règle. Écrite en gras pour se voir avant tout le reste de l'accueil. */
.support-band { padding:24px 0 0; }
.support-callout {
  display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between;
  gap:10px 24px; padding:15px 20px; border:1px solid #cfe0f7; border-radius:14px;
  background:linear-gradient(180deg,#f2f7ff,#eaf2ff); color:var(--ink);
}
.support-cases { margin:0; padding:0 0 0 19px; list-style:disc; font-size:14px; line-height:1.55; }
.support-cases li { margin:0 0 2px; }
.support-cases li::marker { color:var(--blue); }
.support-cases strong { color:var(--navy); font-weight:800; }
.support-call { margin:0; font-size:14px; font-weight:700; color:var(--navy); }
.support-call strong { display:block; font-weight:800; }
.support-call a { color:var(--blue); font-weight:800; word-break:break-word; }
.support-call a:hover { text-decoration:underline; }
@media (max-width:720px) {
  .support-band { padding-top:26px; }
  .support-callout { padding:17px 18px; }
  .support-cases, .support-call { font-size:14px; }
}

/* Panneau « Contact / Demander un accès » — même fiche sur toutes les pages,
   construite par assets/contact-panel.js. La typographie reprend, en un peu plus
   grand, celle du bloc de présentation ci-dessus. */
.contact-panel { position:fixed; inset:0; z-index:80; display:grid; place-items:center; padding:20px; }
.contact-panel[hidden] { display:none; }
.contact-backdrop { position:absolute; inset:0; background:rgba(10,23,48,.55); backdrop-filter:blur(3px); }
.contact-card {
  position:relative; z-index:1; width:min(560px,100%); max-height:calc(100vh - 40px);
  overflow:auto; background:#fff; border:1px solid var(--line); border-radius:20px;
  padding:26px 28px; box-shadow:0 30px 70px rgba(10,23,48,.32);
}
.contact-close {
  position:absolute; top:12px; right:14px; width:32px; height:32px; border:0; cursor:pointer;
  border-radius:50%; background:#f2f6fb; color:#42546d; font-size:20px; line-height:1;
}
.contact-close:hover { background:#e6eef8; }
.contact-head { display:flex; align-items:center; gap:10px; flex-wrap:wrap; padding-right:34px; }
.contact-tag {
  flex:none; text-transform:uppercase; letter-spacing:.11em; font-size:10px; font-weight:800;
  color:var(--blue); background:#edf4fc; border-radius:99px; padding:5px 11px;
}
.contact-head strong { font-family:Manrope,sans-serif; font-size:18px; color:var(--navy); }
.contact-points { list-style:none; padding:0; margin:18px 0 0; display:grid; gap:13px; }
.contact-points li { position:relative; padding-left:26px; font-size:15px; line-height:1.5; }
.contact-points li::before {
  content:"✓"; position:absolute; left:0; top:1px; color:#1c9c6b; font-weight:800; font-size:14px;
}
.contact-points b { color:var(--navy); }
.contact-points span { display:block; color:#647286; font-size:14px; }
.contact-mail {
  margin:19px 0 0; padding-top:16px; border-top:1px dashed var(--line);
  color:#647286; font-size:15px; line-height:1.6;
}
.contact-mail b { display:block; color:var(--navy); font-size:15.5px; margin-bottom:3px; }
.contact-mail a { color:var(--blue); font-weight:700; word-break:break-word; }
.contact-mail a:hover { text-decoration:underline; }
.contact-actions { display:flex; flex-wrap:wrap; gap:12px; margin-top:22px; }

.section { padding:56px 0; }
h2 { font-size:clamp(24px,2.5vw,32px); margin:8px 0 0; color:var(--navy); }

.services { background:var(--soft); }
.section-heading { display:flex; justify-content:space-between; align-items:end; gap:34px; margin-bottom:28px; }
.section-heading p { max-width:430px; color:var(--muted); margin:0; font-size:14.5px; }
.service-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:16px; }
.service-card {
  position:relative; background:#fff; border:1px solid var(--line); border-radius:16px; padding:24px;
  box-shadow:0 5px 25px rgba(15,35,68,.035);
}
.service-card.featured { border-top:4px solid var(--blue); }
.card-number { position:absolute; right:22px; top:22px; font-family:Manrope,sans-serif; color:#c5d0dd; font-weight:800; font-size:12px; }
.icon { width:38px; height:38px; display:grid; place-items:center; border-radius:11px; background:#edf5ff; color:var(--blue); font-size:18px; margin-bottom:16px; }
.service-card h3 { font-family:Manrope,sans-serif; font-size:17.5px; line-height:1.2; margin:0 26px 8px 0; color:var(--navy); }
.service-card p { color:var(--muted); font-size:13.5px; margin:0; }
.service-card ul { list-style:none; padding:0; margin:14px 0 0; }
.service-card li { position:relative; padding-left:20px; margin:7px 0; font-size:13px; color:#42516a; line-height:1.5; }
.service-card li::before { content:"✓"; position:absolute; left:0; color:var(--blue); font-weight:800; }
.note { margin-top:16px; padding:9px 12px; background:#f1f7ff; color:#426587; font-size:11px; border-radius:8px; }

.process { background:var(--navy); color:#fff; }
.process h2 { color:#fff; }
.process .section-kicker { color:#66d4f0; }
.center { display:block; text-align:center; }
.center h2 { margin-top:8px; }
.steps { display:grid; grid-template-columns:1fr 35px 1fr 35px 1fr; align-items:center; margin-top:32px; }
.step { padding:20px; border:1px solid rgba(255,255,255,.14); border-radius:14px; background:rgba(255,255,255,.035); }
.step-num { font-family:Manrope,sans-serif; color:#66d4f0; font-size:12px; font-weight:800; }
.step h3 { font-family:Manrope,sans-serif; margin:12px 0 7px; font-size:17px; }
.step p { color:#b6c2d2; font-size:13px; margin:0 0 10px; }
.step a { color:#66d4f0; font-weight:700; font-size:13px; }
.connector { height:1px; background:rgba(255,255,255,.18); }

.footer { background:#071225; color:#fff; padding:42px 0 16px; }
.footer-grid { display:grid; grid-template-columns:1.4fr .7fr .7fr; gap:48px; padding-bottom:30px; }
.footer-brand { font-family:Manrope,sans-serif; font-size:21px; letter-spacing:.1em; }
.footer p { max-width:360px; color:#94a3b8; font-size:13px; }
.footer a { display:block; color:#b8c3d2; font-size:13px; margin:6px 0; }
.footer-title { display:block; text-transform:uppercase; letter-spacing:.12em; color:#6f8099; font-size:10px; font-weight:800; margin-bottom:12px; }
.footer-bottom { border-top:1px solid rgba(255,255,255,.09); padding-top:18px; display:flex; justify-content:space-between; gap:20px; color:#718097; font-size:11px; }

@media (max-width: 900px) {
  .nav { display:none; position:absolute; left:20px; right:20px; top:70px; background:#fff; border:1px solid var(--line); border-radius:12px; padding:15px; box-shadow:var(--shadow); flex-direction:column; align-items:stretch; }
  .nav.open { display:flex; }
  .menu-toggle { display:block; }
  .hero-grid { grid-template-columns:1fr; gap:32px; }
  .hero { padding-top:44px; }
  .service-grid { grid-template-columns:1fr; }
  .steps { grid-template-columns:1fr; gap:12px; }
  .connector { display:none; }
  .footer-grid { grid-template-columns:1fr 1fr; }
}
@media (max-width: 560px) {
  .container { width:min(100% - 28px,1160px); }
  .hero h1 { font-size:26px; }
  .hero-text { font-size:15px; }
  .section { padding:42px 0; }
  .section-heading { display:block; }
  .section-heading p { margin-top:14px; }
  .footer-grid { grid-template-columns:1fr; gap:24px; }
  .footer-bottom { flex-direction:column; }
}

/* ============================================================
   Outil d'analyse et rapport
   ============================================================ */
.sr-only {
  position:absolute; width:1px; height:1px; padding:0; margin:-1px;
  overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0;
}

.analyse { background:linear-gradient(180deg,#fff 0%,#f7fafd 100%); border-top:1px solid var(--line); }
.analyse-shell { display:grid; grid-template-columns:1.35fr .65fr; gap:20px; align-items:start; }

.analyse-form {
  background:#fff; border:1px solid var(--line); border-radius:20px; padding:26px;
  box-shadow:0 10px 40px rgba(15,35,68,.05);
}

.drop {
  display:grid; place-items:center; gap:6px; text-align:center; cursor:pointer;
  padding:34px 20px; border:2px dashed #cddced; border-radius:16px; background:#fafcfe;
  transition:border-color .2s, background .2s, transform .2s;
}
.drop:hover, .drop:focus-visible { border-color:var(--blue); background:#f4f9ff; }
.drop:focus-visible { outline:3px solid rgba(23,105,224,.25); outline-offset:2px; }
.drop.is-over { border-color:var(--blue); background:#eef6ff; transform:scale(1.005); }
.drop-icon {
  width:46px; height:46px; border-radius:14px; display:grid; place-items:center; font-size:22px;
  background:linear-gradient(145deg,var(--blue),var(--cyan)); color:#fff;
}
.drop strong { font-family:Manrope,sans-serif; font-size:15px; color:var(--navy); }
.drop small { color:var(--muted); font-size:11.5px; }
/* Zone de dépôt inerte tant que la session n'est pas confirmée. */
.drop[aria-disabled="true"] { cursor:not-allowed; opacity:.5; }
.drop[aria-disabled="true"]:hover { border-color:#cddced; background:#fafcfe; }

.file-info {
  display:flex; align-items:center; gap:12px; margin-top:12px; padding:11px 14px;
  background:#f1f7ff; border:1px solid #d9e7fa; border-radius:11px; font-size:13px;
}
.file-info strong { font-weight:700; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.file-info span { color:var(--muted); font-size:11.5px; flex:none; }
.file-info button {
  margin-left:auto; flex:none; border:1px solid #cbdcf2; background:#fff; color:#3f6cbe;
  border-radius:7px; padding:5px 10px; font-size:11px; font-weight:700; cursor:pointer;
}
.file-info button:hover { background:#e9f2fe; }

.or-line { display:flex; align-items:center; gap:14px; margin:20px 0 14px; color:#9aa7b7; font-size:11px; letter-spacing:.08em; text-transform:uppercase; font-weight:800; }
.or-line::before, .or-line::after { content:""; height:1px; flex:1; background:var(--line); }

.analyse-form textarea {
  width:100%; border:1px solid var(--line); border-radius:13px; padding:15px;
  font-family:inherit; font-size:14px; color:var(--ink); line-height:1.6; resize:vertical;
  background:#fcfdfe;
}
.analyse-form textarea:focus { outline:none; border-color:var(--blue); box-shadow:0 0 0 4px rgba(23,105,224,.1); }

.refs-toggle {
  display:flex; align-items:center; justify-content:space-between; gap:12px; width:100%;
  margin-top:14px; padding:12px 15px; border:1px solid var(--line); background:#fafcfe;
  border-radius:11px; font-family:inherit; font-size:13px; font-weight:700; color:var(--navy); cursor:pointer;
}
.refs-toggle:hover { border-color:#bfd5ef; background:#f4f9ff; }
.refs-toggle i { font-style:normal; color:var(--blue); font-size:17px; line-height:1; }
.refs-toggle[aria-expanded="true"] i { transform:rotate(45deg); }
.refs-panel { padding:14px 2px 0; }
.refs-panel p { margin:0 0 10px; color:var(--muted); font-size:12.5px; }
.refs-panel code, .side-note code { background:#eef4fc; color:#33608f; padding:1px 5px; border-radius:5px; font-size:11.5px; }

.options { margin:18px 0 0; padding:14px 16px; border:1px solid var(--line); border-radius:12px; }
.options legend { padding:0 7px; font-size:10.5px; font-weight:800; letter-spacing:.1em; text-transform:uppercase; color:var(--muted); }
.options label { display:inline-flex; align-items:center; gap:8px; margin:4px 18px 4px 0; font-size:13px; font-weight:600; cursor:pointer; }
.options input { accent-color:var(--blue); width:16px; height:16px; }
.options label.option-net { display:flex; align-items:flex-start; margin:10px 0 0; padding-top:10px; border-top:1px solid var(--line); flex-wrap:wrap; }

.analyse-actions { display:flex; flex-wrap:wrap; gap:10px; margin-top:20px; }
.btn-danger { background:#c8452f; color:#fff; }
.btn-danger:hover { background:#b03a26; }
.btn-ghost { color:var(--blue); background:#f1f7ff; }
.btn-ghost:hover { background:#e4f0fe; }
.btn[disabled] { opacity:.45; cursor:not-allowed; transform:none; box-shadow:none; }

.counter { margin:13px 0 0; color:var(--muted); font-size:12px; }
.form-error {
  margin:13px 0 0; padding:11px 14px; border-radius:10px; font-size:13px;
  background:#fdeceb; color:#a5321f; border:1px solid #f6d3cd;
}

.progress { margin-top:20px; padding:16px 18px; border:1px solid #dceafa; background:#f6faff; border-radius:14px; }
.progress-top { display:flex; justify-content:space-between; align-items:baseline; gap:14px; font-size:13px; }
.progress-top strong { font-family:Manrope,sans-serif; color:var(--navy); }
.progress-top span { color:var(--muted); font-size:12px; }
.progress-top b { color:var(--blue); font-size:14px; }
.progress-top i { font-style:normal; }
.progress-track { height:9px; margin-top:11px; border-radius:99px; background:#e3edf9; overflow:hidden; }
.progress-track i {
  display:block; height:100%; border-radius:99px; transform:scaleX(0); transform-origin:left;
  background:linear-gradient(90deg,var(--blue),var(--cyan)); transition:transform .18s linear;
}
.progress-wait { margin:11px 0 0; color:#c62f2f; font-size:13px; font-weight:800; }

.analyse-side {
  background:var(--navy); color:#fff; border-radius:20px; padding:26px;
  position:sticky; top:100px;
}
.analyse-side h3 { font-family:Manrope,sans-serif; font-size:17px; margin:0 0 16px; }
.analyse-side ul { list-style:none; margin:0 0 18px; padding:0; }
.analyse-side li { font-size:12.5px; color:#b9c6d7; padding:9px 0; border-bottom:1px solid rgba(255,255,255,.09); }
.analyse-side li strong { color:#fff; display:block; font-size:13px; margin-bottom:2px; }

/* Règle capitale du relevé — ce qui n'est jamais compté comme plagiat : tout le
   paragraphe est écrit en rouge fixe, et seul son intitulé « Ce qui n'est jamais
   compté comme plagiat » clignote. Le texte reste ainsi lisible d'un bout à
   l'autre pendant que le titre attire l'œil. Le clignotement s'arrête (le rouge
   reste) dès que l'appareil demande moins d'animation, et à l'impression. */
.blink-red, .analyse-side .blink-red, .analyse-side .blink-red strong {
  color:#ff5b52; font-weight:700;
}
.blink-red strong { animation:blink-red 1.1s steps(1,end) infinite; }
@keyframes blink-red {
  0%, 49% { opacity:1; }
  50%, 100% { opacity:.18; }
}
@media (prefers-reduced-motion: reduce) {
  .blink-red strong { animation:none; opacity:1; }
}
.side-note { background:rgba(102,212,240,.1); border:1px solid rgba(102,212,240,.25); border-radius:12px; padding:14px; font-size:12px; color:#c3d4e4; margin-bottom:18px; }
.side-note strong { display:block; color:#66d4f0; font-size:11px; text-transform:uppercase; letter-spacing:.1em; margin-bottom:6px; }
.analyse-side .btn { width:100%; justify-content:center; }

/* ------------------------------------------------------------- rapport */
.report { margin-top:24px; }
.report h4 {
  font-family:Manrope,sans-serif; font-size:13px; text-transform:uppercase; letter-spacing:.1em;
  color:var(--blue); margin:0 0 15px; display:flex; align-items:center; flex-wrap:wrap;
}
.report-head, .report-block, .certificate {
  background:#fff; border:1px solid var(--line); border-radius:18px; padding:24px; margin-bottom:16px;
}
.report-head { display:flex; justify-content:space-between; align-items:center; gap:26px; flex-wrap:wrap; }
.report-head-main { flex:1 1 320px; min-width:0; }
.report-head-main h3, .report-meta { overflow-wrap:anywhere; }
.report-head h3 { font-family:Manrope,sans-serif; font-size:23px; margin:8px 0 6px; color:var(--navy); letter-spacing:-.02em; }
/* Nom reconnu dans le document, annoncé avant les mesures. */
.report-author { margin:0 0 6px; color:var(--navy); font-size:13.5px; overflow-wrap:anywhere; }
.report-meta { margin:0; color:#4d5c72; font-size:13px; }
.report-score { display:flex; align-items:center; gap:15px; }
.report-score .ring {
  width:86px; height:86px; border-radius:50%; display:grid; place-items:center; flex:none;
  font-family:Manrope,sans-serif; font-weight:800; font-size:23px; color:var(--navy);
  background:conic-gradient(var(--ring,#1769e0) calc(var(--v) * 1%), #eaf0f7 0);
  position:relative;
}
.report-score .ring::before { content:""; position:absolute; inset:9px; background:#fff; border-radius:50%; }
/* Le taux affiché dans l'anneau comporte une décimale et le signe % : la
   taille de police laisse la place à « 100,0 % ». */
.report-score .ring span { position:relative; font-size:19px; }
.report-score.good .ring { --ring:#1c9c6b; }
.report-score.warn .ring { --ring:#d98324; }
.report-score.bad .ring { --ring:#c8452f; }
/* Anneau du taux de similitude : même barème de couleurs que le bandeau. */
.report-score.sim-green .ring { --ring:#1c9c6b; }
.report-score.sim-green strong { color:#127750; }
.report-score.sim-orange .ring { --ring:#e08a1e; }
.report-score.sim-orange strong { color:#96601a; }
.report-score.sim-red .ring { --ring:#c8452f; }
.report-score.sim-red strong { color:#b23a26; }
.report-score strong { display:block; font-family:Manrope,sans-serif; font-size:16px; color:var(--navy); }
.report-score small { color:#55647b; font-size:12px; }

.metric-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(206px,1fr)); gap:12px; margin-bottom:16px; }
.metric { background:#fff; border:1px solid var(--line); border-radius:14px; padding:16px; }
.metric-top { display:flex; justify-content:space-between; align-items:baseline; gap:10px; font-size:13px; font-weight:700; color:#3f4f66; }
.metric-top strong { font-family:Manrope,sans-serif; font-size:16px; color:var(--navy); }
.metric-track { height:7px; border-radius:99px; background:#eef3f8; margin:11px 0 8px; overflow:hidden; }
.metric-track i { display:block; height:100%; border-radius:99px; background:var(--blue); }
.metric.good .metric-track i { background:#1c9c6b; }
.metric.warn .metric-track i { background:#d98324; }
.metric.bad .metric-track i { background:#c8452f; }
.metric small { color:#55647b; font-size:12.5px; }

.stat-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(158px,1fr)); gap:10px; }
.stat { background:#f7fafd; border:1px solid #eaf0f6; border-radius:11px; padding:12px 14px; }
.stat span { display:block; color:#55647b; font-size:12.5px; }
.stat strong { font-family:Manrope,sans-serif; font-size:18px; color:var(--navy); }

.reco { margin:0; padding-left:20px; }
.reco li { margin:9px 0; font-size:15px; }
/* Les recommandations sont annoncées en rouge : elles disent ce qu'il reste à
   reprendre dans le document, avant le reste du rapport. */
.report-reco h4, .reco li, .reco li strong { color:#c8452f; }
.reco li::marker { color:#c8452f; font-weight:700; }
.report-note { background:#f1f7ff; border:1px solid #d8e7fb; color:#34526f; border-radius:12px; padding:14px 16px; font-size:13.5px; margin-bottom:16px; }
.block-intro { margin:0 0 14px; color:#55647b; font-size:14px; }
.empty { margin:0; color:#55647b; font-size:14px; }
.badge { background:#edf4fc; color:var(--blue); border-radius:99px; padding:3px 10px; font-size:12px; margin-left:9px; letter-spacing:0; text-transform:none; }

.passages { display:grid; gap:11px; }
.passage { border:1px solid var(--line); border-radius:13px; padding:15px; background:#fdfefe; }
.passage header { display:flex; align-items:center; gap:10px; flex-wrap:wrap; font-size:13px; margin-bottom:11px; }
.passage-num { width:24px; height:24px; flex:none; border-radius:7px; background:#edf4fc; color:var(--blue); display:grid; place-items:center; font-weight:800; font-size:12px; }
.passage header strong { font-family:Manrope,sans-serif; color:var(--navy); }
.passage-pos { margin-left:auto; color:#5f6e83; }
.passage blockquote {
  margin:0; padding:13px 15px; background:#f5f8fb; border-left:3px solid var(--blue);
  border-radius:0 9px 9px 0; font-size:15px; line-height:1.6; color:#22314a; overflow-wrap:anywhere;
}
.passage-echo { margin-top:11px; font-size:14px; line-height:1.6; color:#3d4c62; overflow-wrap:anywhere; }
.passage-echo span { font-weight:800; color:var(--blue); margin-right:8px; font-size:11px; text-transform:uppercase; letter-spacing:.08em; }

.source-list { display:grid; gap:9px; margin-bottom:15px; }
.source-list div { border:1px solid var(--line); border-radius:10px; padding:11px 13px; font-size:14px; }
.source-list span { display:block; color:#55647b; font-size:12.5px; }

/* Le détail que l'on peut vouloir vérifier, sans qu'il encombre la lecture :
   liste exacte des corpus, sources de faible emprise, passages supplémentaires. */
.corpus-detail { margin:0 0 15px; border:1px solid var(--line); border-radius:10px; background:#fbfcfe; }
.corpus-detail > summary { cursor:pointer; padding:10px 13px; font-size:13px; color:#42618a; list-style:none; }
.corpus-detail > summary::-webkit-details-marker { display:none; }
.corpus-detail > summary::before { content:'▸ '; color:#8aa0bd; }
.corpus-detail[open] > summary::before { content:'▾ '; }
.corpus-detail > summary:hover { color:var(--blue); }
.corpus-detail > p { margin:0; padding:0 13px 12px; font-size:12.5px; color:#55647b; word-break:break-word; }
.corpus-detail > .source-list,
.corpus-detail > .passages { margin:0; padding:0 13px 13px; }

.findings { list-style:none; margin:0; padding:0; }
.finding { display:flex; gap:13px; padding:14px 0; border-bottom:1px solid #eef2f7; }
.finding:last-of-type { border-bottom:0; }
.finding strong { font-family:Manrope,sans-serif; font-size:15px; color:var(--navy); }
.finding p { margin:4px 0 8px; color:#4d5c72; font-size:14px; }
.finding code { display:block; background:#f6f8fb; border-radius:8px; padding:10px 12px; font-size:13.5px; line-height:1.55; color:#2b3a51; overflow-wrap:anywhere; }
.finding small { display:block; margin-top:6px; color:#4d5c72; font-size:12.5px; }
.chip {
  flex:none; height:24px; padding:0 11px; border-radius:99px; font-size:11px; font-weight:800;
  display:inline-grid; place-items:center; text-transform:uppercase; letter-spacing:.06em;
}
.chip-alert { background:#fdeceb; color:#b23a26; }
.chip-warn { background:#fdf4e7; color:#96601a; }
.chip-info { background:#eef4fc; color:#3a6699; }

.rule-counts { display:flex; flex-wrap:wrap; gap:7px; margin-top:15px; }
.rule-counts span { background:#f2f6fb; border-radius:99px; padding:6px 12px; font-size:12.5px; color:#39485f; }
.rule-counts i { font-style:normal; color:var(--blue); font-weight:800; margin-left:7px; }
.rule-counts { margin-top:18px; }

.certificate { border:2px solid var(--navy); }
.cert-head { display:flex; align-items:center; gap:15px; margin-bottom:18px; }
.cert-seal {
  width:56px; height:56px; flex:none; border-radius:50%; background:var(--navy); color:#fff;
  display:grid; place-items:center; font-family:Manrope,sans-serif; font-size:11px; font-weight:800; letter-spacing:.08em;
}
.cert-head strong { display:block; font-family:Manrope,sans-serif; font-size:17px; color:var(--navy); }
.cert-head small { color:#55647b; font-size:12.5px; }
.cert-grid { margin-top:2px; }
.cert-row { display:flex; justify-content:space-between; gap:18px; padding:10px 0; border-bottom:1px dashed #dfe6ee; font-size:14px; }
.cert-grid .cert-row:last-child { border-bottom:none; }
.cert-row span { color:#55647b; flex:none; max-width:240px; }
.cert-row strong { text-align:right; font-weight:600; word-break:break-all; }

.report-actions { display:flex; flex-wrap:wrap; gap:10px; margin-top:18px; align-items:center; }
.cert-register-state { font-size:13px; color:#55647b; }
.cert-register-state.is-ok { color:#127750; font-weight:700; }
.cert-register-state.is-bad { color:#b23a26; font-weight:700; }

/* ------------------------------- authentification du rapport (code QR) */
/* Premier bloc du rapport, donc première page à l'impression comme à
   l'export : le code QR ouvre /verifier.html, qui recalcule le sceau. */
.report-auth {
  display:flex; gap:24px; align-items:flex-start; flex-wrap:wrap;
  background:#fff; border:2px solid var(--navy); border-radius:16px;
  padding:20px 24px; margin-bottom:16px;
}
.auth-qr { flex:none; text-align:center; }
.auth-qr svg { display:block; width:150px; height:150px; border-radius:8px; }
.auth-qr small { display:block; margin-top:7px; font-size:12px; color:#4d5c72; letter-spacing:.02em; }
.auth-qr-fallback { display:grid; place-items:center; width:150px; height:150px; background:#f2f6fb; border-radius:8px; font-size:12.5px; color:#42546d; padding:10px; }
.auth-body { flex:1; min-width:255px; }
.auth-tag {
  display:inline-block; font-size:11px; font-weight:800; letter-spacing:.13em; text-transform:uppercase;
  color:var(--blue); background:#edf4fc; border-radius:99px; padding:5px 11px;
}
.auth-body strong { display:block; font-family:Manrope,sans-serif; font-size:18px; color:var(--navy); margin:10px 0 7px; }
.auth-lede { margin:0 0 12px; font-size:14px; line-height:1.55; color:#42546d; }
.auth-rows { margin:0; display:grid; gap:0; }
.auth-rows div { display:flex; justify-content:space-between; gap:16px; padding:8px 0; border-bottom:1px dashed #dfe6ee; }
.auth-rows div:last-child { border-bottom:none; }
.auth-rows dt { color:#55647b; font-size:13px; flex:none; }
.auth-rows dd { margin:0; font-size:13px; font-weight:600; text-align:right; word-break:break-all; }
.auth-rows code { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:12.5px; color:var(--navy); }
.auth-link { margin:11px 0 0; font-size:12.5px; color:#4d5c72; word-break:break-all; }
.auth-link span { color:#42546d; }

/* ---------------------------------------- taux de similitude en couleur */
/* 0 à 10 % bleu, 11 à 19 % orange, 20 % et plus rouge. */
.sim-banner {
  display:flex; gap:22px; align-items:center; flex-wrap:wrap;
  background:#fff; border:1px solid var(--line); border-left-width:7px;
  border-radius:16px; padding:20px 24px; margin-bottom:16px;
}
.sim-figure { text-align:center; min-width:132px; }
.sim-figure strong { display:block; font-family:Manrope,sans-serif; font-size:36px; line-height:1.05; font-weight:800; }
.sim-figure span { font-size:11.5px; text-transform:uppercase; letter-spacing:.1em; color:#55647b; }
.sim-body { flex:1; min-width:250px; }
.sim-label { font-family:Manrope,sans-serif; font-weight:800; font-size:16px; color:var(--navy); margin-bottom:10px; }
.sim-scale { position:relative; height:12px; border-radius:99px; background:#eef3f8; overflow:hidden; }
.sim-fill { display:block; height:100%; border-radius:99px; transition:width .5s ease; }
.sim-tick { position:absolute; top:0; bottom:0; width:2px; background:#fff; opacity:.9; }
.sim-tick-10 { left:10%; }
.sim-tick-20 { left:20%; }
.sim-legend { display:flex; gap:8px; flex-wrap:wrap; margin:10px 0 8px; }
.sim-key { font-size:11px; font-weight:800; border-radius:99px; padding:3px 11px; letter-spacing:.04em; }
.sim-key.sim-green { background:#e6f6ee; color:#127750; }
.sim-key.sim-orange { background:#fdf2e3; color:#96601a; }
.sim-key.sim-red { background:#fdeceb; color:#b23a26; }
.sim-message { margin:0; font-size:14px; color:#39485f; }
.sim-parts { color:#42546d; }
/* Décomposition du taux : d'où vient le chiffre, nature de reprise par nature. */
.sim-formula { margin:7px 0 0; font-size:12.5px; color:#55647b; }
/* Le relevé des reprises complète le calcul du taux : même paragraphe, une
   nuance de moins, pour que le calcul reste la première chose lue. */
.sim-formula.sim-detail { color:#6b7891; font-size:12px; }
.sim-banner.sim-green { border-left-color:#1c9c6b; }
.sim-banner.sim-green .sim-figure strong { color:#127750; }
.sim-banner.sim-green .sim-fill { background:#1c9c6b; }
.sim-banner.sim-orange { border-left-color:#e08a1e; }
.sim-banner.sim-orange .sim-figure strong { color:#96601a; }
.sim-banner.sim-orange .sim-fill { background:#e08a1e; }
.sim-banner.sim-red { border-left-color:#c8452f; }
.sim-banner.sim-red .sim-figure strong { color:#b23a26; }
.sim-banner.sim-red .sim-fill { background:#c8452f; }

/* -------------------------------------------- similitudes externes (web) */
.web-source strong a { color:#1055b5; text-decoration:none; word-break:break-word; }
.web-source strong a:hover { text-decoration:underline; }
/* Corpus qui a trouvé la page et chemin par lequel son texte a été lu :
   une indication de provenance, plus discrète que la référence elle-même. */
.source-route { display:block; color:#77869c; font-size:12px; margin-top:3px; font-style:italic; }
/* Référence bibliographique de la source — auteurs, année, revue, DOI — telle
   que le corpus la publie. Elle prime sur les chiffres de similitude dans la
   lecture : c'est elle qui permet de vérifier la source, et c'est ce qu'on
   recopie dans une bibliographie. Les sélecteurs portent le conteneur parce que
   `.source-list span` et `.web-matches span` sont plus spécifiques qu'une
   classe seule et imposeraient sinon leur couleur et leur corps. */
.source-list .source-citation,
.web-matches .source-citation {
  display:block; color:#2b3a51; font-size:13px; margin-top:4px; line-height:1.45;
}
.source-citation a { color:#1055b5; text-decoration:none; }
.source-citation a:hover { text-decoration:underline; }
/* Où lire le passage dans la source : page du document, lien qui l'ouvre à cet
   endroit précis. */
.source-list .source-locator,
.web-matches .source-locator {
  display:block; font-size:12.5px; margin-top:3px; color:#4d5c72;
}
.source-locator a { color:#1055b5; font-weight:600; text-decoration:none; }
.source-locator a:hover { text-decoration:underline; }
.web-matches { list-style:none; margin:11px 0 0; padding:0; display:grid; gap:8px; }
.web-matches li { background:#f7fafd; border:1px solid #eaf0f6; border-radius:10px; padding:11px 13px; font-size:13.5px; }
.web-matches a { color:#1055b5; font-weight:700; text-decoration:none; word-break:break-word; }
.web-matches a:hover { text-decoration:underline; }
.web-matches em { color:#42546d; font-style:normal; margin-left:7px; }
.web-matches span { display:block; color:#4d5c72; font-size:12.5px; margin-top:4px; }
.web-matches code { display:block; margin-top:8px; background:#fff; border-radius:7px; padding:9px 11px; color:#2b3a51; font-size:13px; line-height:1.55; overflow-wrap:anywhere; }
/* Portion exactement retrouvée, côté document comme côté source. */
mark.src-hit { background:#ffe9b3; color:#5c4300; padding:0 2px; border-radius:3px; font-weight:600; }
.passage-web { border-left:3px solid #c8452f; }
.passage-ai { border-left:3px solid #7c5cd6; }

/* ------------------------------------------------ fautes : correction */
.fix { display:flex; gap:9px; align-items:center; flex-wrap:wrap; margin:7px 0 5px; font-size:14px; }
.fix del { background:#fdeceb; color:#b23a26; text-decoration:line-through; border-radius:6px; padding:2px 8px; }
.fix ins { background:#e7f5ee; color:#146a49; text-decoration:none; border-radius:6px; padding:2px 8px; font-weight:700; }
.report-note-alert { background:#fdeceb; border-color:#f4cfc9; color:#93301f; }

/* ------------------------------------------------- indices d'écriture IA */
.ai-head { display:flex; gap:15px; align-items:center; flex-wrap:wrap; margin-bottom:15px; }
.ai-gauge { flex:1; min-width:170px; height:12px; border-radius:99px; background:#eef3f8; overflow:hidden; }
.ai-gauge i { display:block; height:100%; border-radius:99px; background:#7c5cd6; }
.ai-head.warn .ai-gauge i { background:#d98324; }
.ai-head.bad .ai-gauge i { background:#c8452f; }
.ai-head.good .ai-gauge i { background:#1c9c6b; }
.ai-head strong { display:block; font-family:Manrope,sans-serif; font-size:15px; color:var(--navy); }
.ai-head span { color:#55647b; font-size:13.5px; }
.ai-signals { list-style:none; margin:0 0 15px; padding:0; display:grid; gap:11px; }
.ai-signals li { background:#f7fafd; border:1px solid #eaf0f6; border-radius:11px; padding:12px 14px; }
.ai-signal-top { display:flex; justify-content:space-between; gap:10px; font-size:13.5px; font-weight:700; color:var(--navy); }
.ai-signals small { color:#55647b; font-size:12.5px; }
.ai-signals .metric-track { margin:9px 0 7px; }
.ai-signals .metric-track i { background:#7c5cd6; }
.ai-signal-family {
  display:inline-block; margin-top:4px; font-style:normal; font-size:11.5px;
  font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:#5b46a8;
}

/* Confiance de la mesure : dite à part, pour qu'une note calculée sur deux
   cents mots ne soit jamais lue comme un verdict. */
.ai-confidence {
  margin:0 0 14px; font-size:13px; color:#42546d; background:#f7fafd;
  border:1px solid #eaf0f6; border-left:3px solid #b7c2d0;
  border-radius:9px; padding:9px 12px;
}
.ai-confidence-elevee { border-left-color:#1c9c6b; }
.ai-confidence-moyenne { border-left-color:#d98324; }
.ai-confidence-faible { border-left-color:#c8452f; }

/* Contribution des quatre familles d'indices. */
.ai-families { list-style:none; margin:0 0 15px; padding:0; display:grid; gap:7px; }
.ai-families li {
  display:grid; grid-template-columns:96px 1fr 52px; align-items:center;
  gap:11px; font-size:12.5px; color:#42546d;
}
.ai-families b { text-align:right; font-size:12.5px; color:var(--navy); }
.ai-families .metric-track { margin:0; }
.ai-families .metric-track i { background:#a494dd; }

/* ------------------------------------- passages et mots signalés (relevé) */
.zone-legend { display:flex; flex-wrap:wrap; gap:8px; margin-bottom:15px; }
.zone-key {
  border:1px solid var(--line); background:#fff; border-radius:99px;
  padding:6px 13px; font:inherit; font-size:12.5px; font-weight:700;
  color:#33445c; cursor:pointer; transition:opacity .15s ease;
}
.zone-key i { font-style:normal; margin-left:8px; font-weight:800; }
.zone-key:not(.is-on) { background:#eef1f5; color:#55647b; border-bottom-color:var(--line); }
.annotated {
  white-space:pre-wrap; word-break:break-word; font-size:14.5px; line-height:1.85;
  background:#fdfefe; border:1px solid var(--line); border-radius:13px;
  padding:17px 19px; max-height:620px; overflow:auto; color:#22314a;
}
/* Le relevé n'est pas un document reproduit : rien à faire défiler, tout doit
   se lire d'un trait, à l'écran comme sur le PDF. */
.annotated-samples { white-space:normal; max-height:none; overflow:visible; }
.annotated .sample { margin:0 0 14px; padding-bottom:13px; border-bottom:1px solid #e7ecf3; }
.annotated .sample:last-child { border-bottom:0; margin-bottom:0; }
.sample-off { display:none !important; }
.sample-head { display:flex; align-items:center; gap:9px; flex-wrap:wrap; margin-bottom:7px; }
.sample-num {
  width:23px; height:23px; flex:none; border-radius:7px; background:#edf4fc; color:#1055b5;
  display:grid; place-items:center; font-weight:800; font-size:12px;
}
.sample-tag {
  display:inline-block; font-size:11.5px; font-weight:800; color:#22314a;
  border-radius:99px; padding:3px 11px; letter-spacing:.01em;
}
/* Numéro de page : l'information la plus utile du relevé, donc lisible. */
.sample-page {
  margin-left:auto; font-size:12.5px; font-weight:700; color:#1a2c47;
  background:#f1f5fa; border:1px solid #dfe7f1; border-radius:99px; padding:2px 10px;
}
.sample-text { display:block; color:#22314a; font-size:14.5px; line-height:1.75; }
.findings-grammar { margin-top:16px; }
.annotated .sample small { display:block; color:#4d5c72; font-size:12.5px; margin-top:7px; }
mark.zone {
  border-radius:4px; padding:1px 2px; background:transparent; color:#15243d;
  box-decoration-break:clone; -webkit-box-decoration-break:clone;
}
mark.zone.zone-off { background:transparent !important; border-bottom:0 !important; }
.zone-externe { background:#fbdcd7; border-bottom:2px solid #c8452f; }
.zone-reference { background:#fbe3d5; border-bottom:2px solid #b4571f; }
.zone-interne { background:#fdf0d8; border-bottom:2px solid #e08a1e; }
.zone-faute { background:#f9dbe4; border-bottom:2px solid #b62b57; }
.zone-ia { background:#e9e2fb; border-bottom:2px solid #7c5cd6; }

@media (max-width: 1000px) {
  .analyse-shell { grid-template-columns:1fr; }
  .analyse-side { position:static; }
}
@media (max-width: 560px) {
  .analyse-form { padding:18px; }
  .report-head, .report-block, .certificate { padding:18px; }
  .report-head { flex-direction:column; align-items:flex-start; }
  .cert-row { flex-direction:column; gap:3px; }
  .cert-row strong { text-align:left; }
  .analyse-actions .btn, .report-actions .btn { flex:1 1 100%; justify-content:center; }
  .report-auth { padding:18px; gap:16px; }
  .auth-rows div { flex-direction:column; gap:3px; }
  .auth-rows dd { text-align:left; }
}

@media print {
  .site-header, .hero, .support-band, .services, .process, .footer,
  .analyse-form, .analyse-side, .section-heading, .report-actions { display:none !important; }
  body { background:#fff; }
  .analyse { padding:0; background:#fff; border:0; }
  .report { margin:0; }
  .report-head, .report-block, .certificate, .metric, .passage { break-inside:avoid; box-shadow:none; }
  /* L'encart d'authentification ouvre le document : il doit rester entier,
     sur la première page. */
  .report-auth { break-inside:avoid; break-after:avoid; box-shadow:none; }
  .finding.extra { display:flex !important; }
  .finding.extra-grammar { display:flex !important; }
  .annotated { max-height:none; overflow:visible; }
  /* Le relevé des passages signalés doit sortir en entier et en couleurs :
     c'est le cœur du rapport imprimé ou exporté en PDF. */
  .annotated .sample { break-inside:avoid; }
  mark.zone, .sample-tag, .sample-num, .sample-page, .chip, .fix del, .fix ins,
  .report-reco h4, .reco li {
    -webkit-print-color-adjust:exact; print-color-adjust:exact;
  }
  .zone-legend { display:none !important; }
}

/* =====================================================================
   Contrôle d'accès : en-tête connecté, portail de l'outil, connexion,
   administration des mots de passe.
   ===================================================================== */

/* ------------------------------------------------- en-tête et session */
.nav-session { display:inline-flex; align-items:center; gap:16px; }
.nav-admin { padding:9px 14px; border:1px solid var(--line); border-radius:9px; background:#f1f7ff; color:var(--blue); }
.nav-admin:hover { background:#e4f0fe; }
.nav-logout {
  border:0; background:var(--navy); color:#fff; border-radius:9px; padding:10px 15px;
  font:inherit; font-size:13px; font-weight:700; cursor:pointer; transition:.2s;
}
.nav-logout:hover { background:var(--navy-2); }
.nav-logout[disabled] { opacity:.5; cursor:progress; }

/* ------------------------------------------- portail de l'outil d'analyse */
.access-checking, .admin-checking {
  margin:0; padding:16px 18px; border:1px dashed #cfe0f5; border-radius:14px;
  background:#f7fbff; color:var(--muted); font-size:13px;
}
.admin-checking { margin:40px 0; }
.access-gate {
  text-align:center; padding:44px 30px; border-radius:22px;
  border:1px solid var(--line); background:
    radial-gradient(circle at 50% 0%, rgba(23,105,224,.08), transparent 60%), #fff;
  box-shadow:var(--shadow);
}
.access-gate .gate-icon { font-size:30px; line-height:1; margin-bottom:14px; }
.access-gate h1, .access-gate h3 {
  font-family:Manrope,sans-serif; color:var(--navy); margin:0 0 12px;
  font-size:clamp(20px,2.6vw,27px); letter-spacing:-.02em;
}
.access-gate p { max-width:620px; margin:0 auto; color:var(--muted); font-size:14.5px; }
.gate-actions { display:flex; justify-content:center; flex-wrap:wrap; gap:12px; margin-top:24px; }

/* ------------------------------------------------------ page de connexion */
.auth-main { padding:70px 0 90px; background:linear-gradient(135deg,#f7fbff 0%,#fff 60%); }
.auth-grid { display:grid; grid-template-columns:1.1fr .9fr; gap:34px; align-items:start; }
.auth-card {
  background:#fff; border:1px solid var(--line); border-radius:22px;
  padding:38px; box-shadow:var(--shadow);
}
.auth-card h1 { font-family:Manrope,sans-serif; color:var(--navy); font-size:clamp(28px,3.4vw,38px); margin:14px 0 14px; letter-spacing:-.03em; }
.auth-lead { color:var(--muted); font-size:14.5px; margin:0 0 26px; }
.auth-form { display:block; }
.auth-label { display:block; font-size:11px; font-weight:800; letter-spacing:.1em; text-transform:uppercase; color:var(--muted); margin-bottom:8px; }
.auth-field { display:flex; gap:9px; align-items:stretch; }
.auth-field input {
  flex:1 1 auto; min-width:0; font:inherit; font-size:15px; letter-spacing:.04em;
  padding:14px 15px; border:1px solid var(--line); border-radius:11px; background:#fcfdff; color:var(--ink);
}
.auth-field input:focus { outline:2px solid rgba(23,105,224,.35); outline-offset:1px; border-color:var(--blue); }
.auth-reveal {
  border:1px solid var(--line); background:#f1f7ff; color:var(--blue); border-radius:11px;
  padding:0 15px; font:inherit; font-size:12.5px; font-weight:700; cursor:pointer;
}
.auth-reveal:hover { background:#e4f0fe; }
.auth-submit { width:100%; justify-content:center; margin-top:18px; }
.auth-help { margin:22px 0 0; color:var(--muted); font-size:12.5px; }
.auth-help a { color:var(--blue); font-weight:700; }
.auth-side { background:var(--navy); color:#fff; border-radius:22px; padding:30px; }
.auth-side h2 { font-family:Manrope,sans-serif; font-size:18px; margin:0 0 20px; }
.auth-role { padding:14px 0; border-bottom:1px solid rgba(255,255,255,.09); }
.auth-role p { margin:9px 0 0; color:#b9c6d7; font-size:12.5px; }
.auth-side .side-note { margin:20px 0 0; }

/* ----------------------------------------------------------- rôles et états */
.role-badge {
  display:inline-block; border-radius:99px; padding:4px 12px;
  font-size:10.5px; font-weight:800; letter-spacing:.06em; text-transform:uppercase;
}
.role-admin { background:#e9e2fb; color:#5a3fbd; }
.role-user { background:#e3ecfb; color:#1a5cb8; }
.state-badge {
  display:inline-block; border-radius:99px; padding:4px 11px;
  font-size:10.5px; font-weight:800; letter-spacing:.05em; text-transform:uppercase;
}
.state-badge.is-on { background:#ddf3e8; color:#17734c; }
.state-badge.is-off { background:#f1f3f6; color:#7b8798; }
.state-badge.is-warn { background:#fdf0d8; color:#8a6d2f; }
.tag-self { font-size:10px; font-weight:800; color:var(--blue); letter-spacing:.05em; text-transform:uppercase; }

/* ------------------------------------------------------ page d'administration */
.admin-main { padding:46px 0 80px; background:var(--soft); min-height:60vh; }
.admin-head { display:flex; justify-content:space-between; align-items:flex-end; gap:24px; flex-wrap:wrap; }
.admin-head h1 { font-family:Manrope,sans-serif; color:var(--navy); font-size:clamp(26px,3.2vw,36px); margin:14px 0 12px; letter-spacing:-.03em; }
.admin-lead { max-width:720px; color:var(--muted); font-size:14px; margin:0; }
.admin-stats { display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:14px; margin:28px 0; }
.admin-stats .stat { background:#fff; border:1px solid var(--line); border-radius:16px; padding:18px 20px; }
.admin-stats strong { display:block; font-family:Manrope,sans-serif; font-size:27px; color:var(--navy); line-height:1.1; }
.admin-stats small { display:block; margin-top:5px; color:var(--muted); font-size:11.5px; }
.admin-card {
  background:#fff; border:1px solid var(--line); border-radius:20px;
  padding:26px; margin-bottom:20px;
}
.admin-card h2 { font-family:Manrope,sans-serif; font-size:18px; color:var(--navy); margin:0 0 20px; }
.admin-hint { margin:16px 0 0; color:var(--muted); font-size:12px; }
.codes-empty { margin:16px 0 0; color:var(--muted); font-size:13px; }

.admin-form { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:16px; }
.admin-form .field { display:flex; flex-direction:column; gap:7px; min-width:0; }
.admin-form .field-wide { grid-column:1 / -1; }
.admin-form label { font-size:11px; font-weight:800; letter-spacing:.09em; text-transform:uppercase; color:var(--muted); }
.admin-form label span { text-transform:none; letter-spacing:0; font-weight:600; color:#9aa7b7; }
.admin-form input, .admin-form select {
  font:inherit; font-size:14px; padding:12px 13px; border:1px solid var(--line);
  border-radius:11px; background:#fcfdff; color:var(--ink); min-width:0;
}
.admin-form input:focus, .admin-form select:focus { outline:2px solid rgba(23,105,224,.3); border-color:var(--blue); }
.field-inline { display:flex; gap:9px; }
.field-inline input { flex:1 1 auto; }
.admin-form .form-foot { display:flex; align-items:center; gap:16px; flex-wrap:wrap; }
.admin-form .form-foot .form-error { margin:0; flex:1 1 240px; }
.btn-xs { padding:9px 13px; font-size:12px; gap:0; border-radius:9px; }

.table-scroll { overflow-x:auto; }
.codes-table { width:100%; border-collapse:collapse; font-size:13px; min-width:860px; }
.codes-table th {
  text-align:left; font-size:10.5px; letter-spacing:.09em; text-transform:uppercase;
  color:var(--muted); padding:0 12px 11px; border-bottom:1px solid var(--line); white-space:nowrap;
}
.codes-table td { padding:14px 12px; border-bottom:1px solid #eef2f7; vertical-align:top; }
.codes-table tr.row-off { background:#fbfcfd; color:#8b97a7; }
.codes-table td strong { display:block; font-size:13.5px; color:var(--navy); }
.codes-table td small { display:block; margin-top:4px; color:var(--muted); font-size:11px; }
.row-actions { display:flex; flex-wrap:wrap; gap:7px; }

.secret-panel {
  display:flex; justify-content:space-between; align-items:flex-start; gap:22px; flex-wrap:wrap;
  background:var(--navy); color:#fff; border-radius:20px; padding:24px 26px; margin-bottom:20px;
}
.secret-kicker { display:block; font-size:10.5px; font-weight:800; letter-spacing:.12em; text-transform:uppercase; color:#66d4f0; }
.secret-value {
  display:block; margin:12px 0 8px; font-family:Manrope,monospace; font-size:clamp(20px,3vw,28px);
  letter-spacing:.14em; color:#fff; word-break:break-all;
}
.secret-panel small { display:block; color:#b9c6d7; font-size:12px; }
.secret-warning { margin:12px 0 0; max-width:560px; color:#ffd7a8; font-size:12.5px; }
.secret-actions { display:flex; gap:9px; flex-wrap:wrap; }

@media (max-width: 900px) {
  .auth-grid { grid-template-columns:1fr; }
  .admin-form { grid-template-columns:1fr; }
  .nav-session { width:100%; justify-content:flex-start; flex-wrap:wrap; gap:10px; }
}

/* =====================================================================
   Vérification d'un rapport (verifier.html) : la page ouverte par le
   code QR de la première page du rapport.
   ===================================================================== */
.verify-main { padding:70px 0 90px; background:linear-gradient(135deg,#f7fbff 0%,#fff 60%); }
.verify-main h1 { font-family:Manrope,sans-serif; color:var(--navy); font-size:clamp(28px,3.4vw,38px); margin:14px 0 16px; letter-spacing:-.03em; }
.verify-lead { color:var(--muted); font-size:14.5px; line-height:1.65; max-width:760px; margin:0 0 26px; }
.verify-lead strong { color:var(--navy); }

.verify-status {
  display:block; border:1px solid var(--line); border-left-width:7px; border-radius:16px;
  background:#fff; padding:20px 24px; margin-bottom:20px; box-shadow:var(--shadow);
}
.verify-status strong { display:block; font-family:Manrope,sans-serif; font-size:19px; color:var(--navy); }
.verify-status p { margin:8px 0 0; font-size:14px; line-height:1.6; color:#42546d; }
.verify-status.is-ok { border-left-color:#1c9c6b; }
.verify-status.is-ok strong { color:#127750; }
.verify-status.is-bad { border-left-color:#c8452f; }
.verify-status.is-bad strong { color:#b23a26; }
.verify-status.is-warn { border-left-color:#e08a1e; }
.verify-status.is-warn strong { color:#96601a; }

.verify-card {
  background:#fff; border:1px solid var(--line); border-radius:18px;
  padding:26px 28px; margin-bottom:16px;
}
.verify-card h2 { font-family:Manrope,sans-serif; font-size:17px; color:var(--navy); margin:0 0 12px; }
.verify-card p { margin:0 0 14px; font-size:14px; line-height:1.6; color:#42546d; }
.verify-card code { font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:13px; }
.verify-card textarea {
  width:100%; box-sizing:border-box; font:inherit; font-size:13.5px; padding:13px 14px;
  border:1px solid var(--line); border-radius:12px; background:#fcfdff; color:var(--ink);
  resize:vertical; margin-bottom:12px;
}
.verify-card textarea:focus { outline:none; border-color:var(--blue); box-shadow:0 0 0 4px rgba(23,105,224,.1); }
.verify-rows { margin:0; }
.verify-rows div { display:flex; justify-content:space-between; gap:18px; padding:9px 0; border-bottom:1px dashed #dfe6ee; }
.verify-rows div:last-child { border-bottom:none; }
.verify-rows dt { color:#55647b; font-size:13.5px; flex:none; }
.verify-rows dd { margin:0; font-size:13.5px; font-weight:600; text-align:right; word-break:break-all; color:var(--navy); }
.verify-registry-state, .verify-doc-state { margin:0 0 10px; font-size:14px; line-height:1.6; }
.verify-registry-state.is-ok, .verify-doc-state.is-ok { color:#127750; font-weight:700; }
.verify-registry-state.is-bad, .verify-doc-state.is-bad { color:#b23a26; font-weight:700; }
.verify-registry-state.is-warn, .verify-doc-state.is-warn { color:#96601a; font-weight:700; }
.verify-note { color:var(--muted); font-size:12.5px; margin:0; }
.verify-card .drop { margin-bottom:6px; }

@media (max-width: 560px) {
  .verify-card { padding:20px; }
  .verify-rows div { flex-direction:column; gap:3px; }
  .verify-rows dd { text-align:left; }
}

/* =====================================================================
   PAIEMENT DE LA RELECTURE
   Tarifs affichés sur la page d'accueil, fenêtre de paiement qui s'ouvre
   à la fin de l'analyse, et bandeau des exemplaires restants.
   ===================================================================== */

.pricing { background:var(--soft); }
.price-grid { display:grid; grid-template-columns:repeat(auto-fit,minmax(230px,1fr)); gap:16px; }
.price-card {
  background:#fff; border:1px solid var(--line); border-radius:16px;
  padding:22px 22px; box-shadow:0 12px 34px rgba(10,23,48,.05);
}
.price-card.featured { border-color:rgba(23,105,224,.35); box-shadow:0 20px 46px rgba(23,105,224,.14); }
.price-card h3 { font-family:Manrope,sans-serif; font-size:16.5px; color:var(--navy); margin:0 0 4px; }
.price-detail { margin:0 0 12px; color:var(--muted); font-size:13px; }
.price-amount { font-family:Manrope,sans-serif; font-size:27px; font-weight:800; color:var(--navy); letter-spacing:-.03em; }
.price-amount span { font-size:14px; font-weight:700; color:var(--blue); letter-spacing:0; }
.price-notes { display:grid; grid-template-columns:repeat(auto-fit,minmax(280px,1fr)); gap:18px; margin-top:20px; }
.price-notes strong { display:block; font-size:11px; font-weight:800; letter-spacing:.09em; text-transform:uppercase; color:var(--blue); margin-bottom:7px; }
.price-notes p { margin:0; color:var(--muted); font-size:13.5px; }

/* --- rapport scellé et exemplaires restants */
.pay-locked {
  display:flex; align-items:center; gap:20px; flex-wrap:wrap;
  background:#fff; border:1px solid var(--line); border-left:4px solid var(--blue);
  border-radius:18px; padding:22px 24px; margin-top:26px;
}
.pay-locked-icon { font-size:26px; line-height:1; }
.pay-locked strong { display:block; font-family:Manrope,sans-serif; font-size:16px; color:var(--navy); }
.pay-locked p { margin:4px 0 0; color:var(--muted); font-size:13.5px; max-width:520px; }
.pay-locked .btn { margin-left:auto; }

.pay-copies {
  display:flex; align-items:center; gap:12px;
  background:#eefaf3; border:1px solid #c7ead9; border-radius:14px;
  padding:14px 18px; margin-top:22px; color:#146c4b; font-size:13.5px;
}
.pay-copies-mark {
  flex:none; width:24px; height:24px; border-radius:50%; background:#1a8a5f; color:#fff;
  display:inline-flex; align-items:center; justify-content:center; font-size:13px; font-weight:800;
}
.pay-copies strong { color:#0f5236; }

/* --- fenêtre des modalités de paiement */
.pay-modal { position:fixed; inset:0; z-index:60; display:flex; align-items:center; justify-content:center; padding:22px; }
.pay-modal[hidden] { display:none; }
.pay-backdrop { position:absolute; inset:0; background:rgba(10,23,48,.62); backdrop-filter:blur(3px); }
.pay-panel {
  position:relative; width:min(680px,100%); max-height:92vh; overflow-y:auto;
  background:#fff; border-radius:22px; box-shadow:0 34px 80px rgba(10,23,48,.34);
}
.pay-head { padding:28px 30px 20px; border-bottom:1px solid var(--line); }
.pay-kicker { display:block; font-size:10.5px; font-weight:800; letter-spacing:.12em; text-transform:uppercase; color:var(--blue); }
.pay-head h3 { font-family:Manrope,sans-serif; font-size:22px; color:var(--navy); margin:9px 0 8px; letter-spacing:-.02em; }
.pay-head p { margin:0; color:var(--muted); font-size:13.5px; line-height:1.6; }
.pay-body { padding:22px 30px 4px; }
.pay-section { margin-bottom:24px; }
.pay-section h4 {
  font-size:11px; font-weight:800; letter-spacing:.09em; text-transform:uppercase;
  color:var(--muted); margin:0 0 12px;
}

.pay-tiers { display:grid; gap:10px; }
.pay-tier {
  display:flex; align-items:center; gap:14px; cursor:pointer;
  border:1px solid var(--line); border-radius:14px; padding:14px 16px; background:#fcfdff;
}
.pay-tier.is-on { border-color:var(--blue); background:#f2f8ff; box-shadow:0 0 0 3px rgba(23,105,224,.08); }
/* Palier arrêté par l'analyse : il s'affiche, il ne se clique pas. */
.pay-tier.is-fixed { cursor:default; }
.pay-tier-fixed {
  display:inline-block; margin-top:6px; padding:2px 8px; border-radius:999px;
  background:var(--blue); color:#fff; font-size:11px; letter-spacing:.02em; text-transform:uppercase;
}
.pay-tier-body { flex:1 1 auto; min-width:0; }
.pay-tier-body strong { display:block; font-size:14px; color:var(--navy); }
.pay-tier-body small { display:block; color:var(--muted); font-size:12px; }
.pay-tier-price { font-family:Manrope,sans-serif; font-size:16px; color:var(--navy); white-space:nowrap; }

.pay-methods { display:grid; gap:10px; }
.pay-method { border:1px solid var(--line); border-radius:14px; background:#fcfdff; overflow:hidden; }
.pay-method.is-on { border-color:var(--blue); background:#f2f8ff; }
.pay-method-head { display:flex; align-items:center; gap:12px; padding:14px 16px; cursor:pointer; font-size:14px; color:var(--navy); }
.pay-method-body { padding:0 16px 16px; }
.pay-method-body[hidden] { display:none; }
.pay-fields { display:grid; gap:1px; background:var(--line); border:1px solid var(--line); border-radius:11px; overflow:hidden; margin-bottom:12px; }
.pay-field-row { display:flex; justify-content:space-between; gap:16px; padding:11px 14px; background:#fff; font-size:13px; }
.pay-field-row span { color:var(--muted); flex:none; }
.pay-field-row strong { color:var(--navy); text-align:right; word-break:break-all; }
.pay-note { margin:0 0 12px; color:var(--muted); font-size:12.5px; line-height:1.6; }
.pay-missing { margin:0 0 12px; padding:12px 14px 12px 30px; border:1px solid var(--line); border-radius:11px; background:#fff8ee; color:var(--muted); font-size:12.5px; line-height:1.7; }
.pay-missing li { margin:0; }

/* Rubrique activée mais pas encore renseignée : annoncée, jamais choisissable. */
.pay-method.is-waiting { background:#fbfbfc; border-style:dashed; }
.pay-method.is-waiting .pay-method-head { cursor:default; color:var(--muted); }
.pay-method-wait {
  margin-left:auto; padding:4px 9px; border-radius:999px; background:#fff2dd;
  color:#8a5a12; font-size:10.5px; font-weight:800; letter-spacing:.08em; text-transform:uppercase;
}
.pay-pending { margin:0 0 12px; padding:11px 13px; border-radius:11px; background:#fff8ee; color:#8a5a12; font-size:12.5px; line-height:1.6; }

/* Assistance et accès illimité : la voie hors tarif à l'unité, en gras. */
.pay-institution {
  margin:0 0 16px; padding:14px 16px; border:1px solid #cfe0f7; border-radius:11px;
  background:#eef5ff; color:var(--ink); font-size:13px; line-height:1.7;
}
.pay-institution-cases { margin:0 0 8px; padding:0 0 0 18px; list-style:disc; }
.pay-institution-cases li { margin:0 0 3px; }
.pay-institution-cases strong { color:var(--navy); font-weight:800; }
.pay-institution-call { margin:0; color:var(--navy); font-weight:700; }
.pay-institution a { color:var(--blue); font-weight:800; word-break:break-all; }

/* Code QR Wave : donné en image, à scanner depuis le téléphone. */
.pay-qr { margin:0 0 12px; display:flex; flex-direction:column; align-items:center; gap:8px; }
.pay-qr-image { width:180px; height:180px; object-fit:contain; border:1px solid var(--line); border-radius:11px; background:#fff; padding:8px; }
.pay-qr figcaption { color:var(--muted); font-size:12px; text-align:center; }

/* Paiement Wave par commande : le bouton ouvre une commande au montant du
   service, puis conduit chez Wave. Le montant n'est jamais dans le lien. */
.pay-wave {
  margin:0 0 12px; padding:13px 15px; border:1px solid #cfe0f7; border-radius:11px;
  background:#f2f8ff; display:flex; flex-direction:column; align-items:flex-start; gap:9px;
}
.pay-wave-note { margin:0; color:var(--muted); font-size:12.5px; line-height:1.6; }
.pay-wave-test {
  margin:0; align-self:stretch; padding:4px 9px; border-radius:999px; background:#fff2dd;
  color:#8a5a12; font-size:10.5px; font-weight:800; letter-spacing:.08em; text-transform:uppercase;
}
.pay-wave-resume { margin:0 0 12px; }

.pay-inputs { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:14px; }
.pay-inputs label { display:flex; flex-direction:column; gap:7px; font-size:11px; font-weight:800; letter-spacing:.09em; text-transform:uppercase; color:var(--muted); }
.pay-inputs label span { text-transform:none; letter-spacing:0; font-weight:600; color:#9aa7b7; }
.pay-inputs input {
  font:inherit; font-size:14px; padding:12px 13px; border:1px solid var(--line);
  border-radius:11px; background:#fcfdff; color:var(--ink); min-width:0;
}
.pay-inputs input:focus { outline:2px solid rgba(23,105,224,.3); border-color:var(--blue); }
.pay-error { margin:0 0 6px; color:#b23a26; font-size:13px; font-weight:600; }
.pay-error[hidden] { display:none; }

.pay-foot {
  display:flex; align-items:center; justify-content:space-between; gap:18px; flex-wrap:wrap;
  padding:18px 30px 26px; border-top:1px solid var(--line); background:#fbfcfe;
  border-radius:0 0 22px 22px;
}
.pay-total { font-family:Manrope,sans-serif; font-size:16px; color:var(--navy); }
.pay-wait { color:var(--muted); font-size:12.5px; }
.pay-actions { display:flex; gap:10px; flex-wrap:wrap; margin-left:auto; }

/* --- paiements, côté administration */
.pay-setup {
  margin:0 0 18px; padding:14px 16px; border-radius:12px; border:1px solid var(--line);
  background:#f6f8fb; color:var(--navy); font-size:13px; line-height:1.65;
}
.pay-setup ul { margin:8px 0 0; padding-left:20px; }
.pay-setup li { margin:2px 0; }
.pay-setup.is-ok { border-color:#bfe4d2; background:#f0faf5; }
.pay-setup.is-alert { border-color:#f0c4b9; background:#fdf1ee; }
.pay-setup.is-off { border-color:#e6d6ae; background:#fdf8ec; }
.pay-settings-group { grid-column:1 / -1; margin-top:8px; }
.pay-settings-group h3 {
  font-size:11px; font-weight:800; letter-spacing:.09em; text-transform:uppercase;
  color:var(--blue); margin:0 0 4px; padding-top:14px; border-top:1px solid var(--line);
}
.pay-settings-group p { margin:0; color:var(--muted); font-size:12.5px; }
.status-en_attente { background:#fdf1dc; color:#96601a; }
.status-valide { background:#e2f6ec; color:#146c4b; }
.status-refuse { background:#fbe4e0; color:#b23a26; }
.status-echoue { background:#fbe4e0; color:#b23a26; }
.status-annule { background:#eef1f5; color:#5c6a7c; }
.pay-amount { font-family:Manrope,sans-serif; font-weight:700; color:var(--navy); white-space:nowrap; }

/* --- page « Paiements Wave » */
.wave-state {
  margin:0 0 18px; padding:14px 16px; border-radius:12px; border:1px solid var(--line);
  background:#f6f8fb; color:var(--navy); font-size:13px; line-height:1.65;
}
.wave-state.is-ok { border-color:#bfe4d2; background:#f0faf5; }
.wave-state.is-alert { border-color:#f0c4b9; background:#fdf1ee; }
.wave-state.is-off { border-color:#e6d6ae; background:#fdf8ec; }
.wave-filters {
  display:flex; align-items:flex-end; justify-content:space-between; gap:16px;
  flex-wrap:wrap; margin:0 0 14px;
}
.wave-tabs { display:flex; gap:6px; flex-wrap:wrap; }
.wave-tab {
  font:inherit; font-size:12.5px; font-weight:700; padding:8px 13px; border-radius:999px;
  border:1px solid var(--line); background:#fff; color:var(--muted); cursor:pointer;
}
.wave-tab:hover { border-color:#cfe0f7; color:var(--navy); }
.wave-tab.is-on { border-color:var(--blue); background:#f2f8ff; color:var(--navy); }
.wave-search { display:flex; gap:8px; align-items:center; margin-left:auto; }
.wave-search input {
  font:inherit; font-size:13.5px; padding:9px 12px; border:1px solid var(--line);
  border-radius:11px; background:#fcfdff; color:var(--ink); min-width:220px;
}
.wave-search input:focus { outline:2px solid rgba(23,105,224,.3); border-color:var(--blue); }
.wave-id {
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace; font-size:12px;
  color:var(--muted); word-break:break-all;
}
.field-hint { display:block; margin-top:5px; color:var(--muted); font-size:12px; line-height:1.55; }

@media (max-width: 640px) {
  .pay-inputs { grid-template-columns:1fr; }
  .pay-head, .pay-body, .pay-foot { padding-left:20px; padding-right:20px; }
  .pay-actions { width:100%; }
  .pay-actions .btn { flex:1 1 100%; justify-content:center; }
  .pay-locked .btn { margin-left:0; width:100%; justify-content:center; }
  .pay-wave .btn { width:100%; justify-content:center; }
  .wave-search { width:100%; }
  .wave-search input { min-width:0; flex:1 1 auto; }
}
