/* ===== Identité visuelle du portail mafacture =====
   Vert de marque #00BE65 sur fond clair et calme. Sobre, pro, rassurant. */
@import url("jetons.cca40db587ca.css");
@import url("avis.4c3ad1e15e88.css");
/* 950 : jetons déplacés dans jetons.css (importé ci-dessus). */

/* Onglets / sous-menus (nav-pills) : bleu de marque, via variables */
.nav-pills{
  --bs-nav-pills-link-active-bg:var(--blue);
  --bs-nav-link-color:var(--blue);
  --bs-nav-link-hover-color:var(--blue-dark);
}

/* Onglets « contrôle segmenté » (Réglages) : les 4 onglets forment un bloc gris,
   l'actif est une pastille blanche. Le groupe se lit comme un seul commutateur. */
.settings-seg{
  display:inline-flex; gap:2px; flex-wrap:wrap;
  background:#F0F0EC; border:1px solid var(--line);
  border-radius:11px; padding:3px; width:max-content; max-width:100%;
}
.settings-seg .nav-item{ display:flex; }
.settings-seg .nav-link{
  --bs-nav-pills-link-active-bg:transparent;
  color:var(--muted); font-weight:500; border-radius:8px; padding:.4rem 1rem;
  transition:background-color .12s ease, color .12s ease;
}
.settings-seg .nav-link:hover{ color:var(--ink); }
.settings-seg .nav-link.active{
  background:#fff; color:var(--ink); font-weight:600;
  box-shadow:0 1px 2px rgba(14,27,20,.10);
}

/* Recherche Acuity en ligne : survol des résultats en vert pâle (fidèle à la maquette). */
#acuityInlineResults .list-group-item{ cursor:default; transition:background-color .12s ease; }
#acuityInlineResults .list-group-item:hover{ background:var(--brand-soft); }

*{ -webkit-font-smoothing:antialiased; }
body{
  background:var(--surface);
  color:var(--ink);
  font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
}
h1,h2,h3,h4,.brand-wordmark,.display-face{
  font-family:'Plus Jakarta Sans','Inter',sans-serif;
  letter-spacing:-.015em;
}

/* Marque */
.brand-wordmark{
  font-weight:800; font-size:1.18rem; color:var(--ink);
  text-decoration:none; display:inline-flex; align-items:center; gap:.5rem;
}
.brand-wordmark .dot{
  width:.62rem; height:.62rem; border-radius:50%;
  background:var(--brand); display:inline-block;
}
/* Logo agrandi de 25% dans le header de l'accueil uniquement */
.lp-nav .brand-wordmark{ font-size:1.475rem; }
.lp-nav .brand-wordmark .dot{ width:.775rem; height:.775rem; }
.text-brand{ color:var(--brand-dark)!important; }   /* 846 : texte vert sur blanc → vert foncé (4,5:1). */
/* 830 — Accueil : texte vert lisible (WCAG AA). #00BE65 (2,46:1 sur blanc) reste pour
   les boutons et les accents non textuels. Le !important est nécessaire ici : la règle
   .text-brand ci-dessus en porte un, qu'aucune spécificité seule ne peut battre.
   - Texte des diapositives du carrousel (cartes blanches) → --brand-dark (5,09:1).
   - Mot en vert du titre H1 (grand texte, ≥ 32 px) → --brand-titre (3,66:1, seuil 3:1). */
.hero-card .text-brand{ color:var(--brand-dark)!important; }
.lp-hero h1 .text-brand{ color:var(--brand-titre)!important; }

/* Boutons */
.btn-primary{
  --bs-btn-bg:var(--brand); --bs-btn-border-color:var(--brand);
  --bs-btn-color:var(--sur-vert); --bs-btn-disabled-color:var(--sur-vert);
  --bs-btn-hover-bg:var(--brand-dark); --bs-btn-hover-border-color:var(--brand-dark); --bs-btn-hover-color:#fff;
  --bs-btn-active-bg:var(--brand-dark); --bs-btn-active-border-color:var(--brand-dark); --bs-btn-active-color:#fff;
  --bs-btn-disabled-bg:var(--brand); --bs-btn-disabled-border-color:var(--brand);
  font-weight:600;
}
/* Bouton secondaire : blanc bordé au repos ; survol et appui GRIS PÂLE (941, règle d'Annie :
   plus jamais de noir, ni au survol). Une seule définition, la même sur toutes les pages. */
.btn-outline-secondary{
  --bs-btn-color:var(--ink); --bs-btn-bg:#fff; --bs-btn-border-color:var(--line);   /* 946 : texte --ink */
  --bs-btn-hover-color:var(--ink); --bs-btn-hover-bg:var(--surface); --bs-btn-hover-border-color:var(--line-strong);
  --bs-btn-active-color:var(--ink); --bs-btn-active-bg:var(--line); --bs-btn-active-border-color:var(--line-strong);
}
/* ── Journal du suivi d'envoi (fiche de facture) ──
   Un journal se lit à la verticale : une colonne d'heures alignées, puis ce qui
   s'est passé. Rien en gras — un journal n'a pas de titres, il a des entrées. */
.suivi{ list-style:none; margin:0; padding:0; display:grid; grid-template-columns:auto 1fr; gap:.6rem .75rem;
        max-height:17rem; overflow-y:auto; }
.suivi::-webkit-scrollbar{ width:8px; }
.suivi::-webkit-scrollbar-thumb{ background:var(--line); border-radius:8px; }
.suivi li{ display:contents; }
.suivi-h{ color:var(--muted); font-size:.8125rem; font-variant-numeric:tabular-nums; white-space:nowrap; padding-top:.05rem; }
.suivi-e{ font-size:.875rem; color:var(--ink); min-width:0; }
.suivi-e.echec{ color:#C0392B; }
/* Ligne secondaire : adresse, raison d'un rebond, compteur d'ouvertures. */
.suivi-sec{ display:block; font-size:.78125rem; color:var(--muted);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* 898 : lien sous la ligne du dernier refus ; note grise sous « Signalée comme pourriel ». */
.suivi-lien{ display:inline-block; margin-top:.15rem; font-size:.78125rem; font-weight:500;
  color:var(--brand-dark); text-decoration:none; }
.suivi-lien:focus-visible{ text-decoration:underline; }
@media (hover:hover){ .suivi-lien:hover{text-decoration:underline; } }   /* 961 : soulignement au survol, souris seulement */
.suivi-note{ white-space:normal; }
.suivi-sous-titre{ font-size:.8125rem; color:var(--muted); margin-top:.05rem; }
.suivi-jour{ font-size:.78125rem; color:var(--muted); margin-top:.9rem;
  padding-top:.55rem; border-top:1px solid var(--line); }

/* ── Pastilles de filtre (choix unique) ──
   Périodes des Rapports, statut des Clients. Un « btn-group » disait « barre
   d'outils » alors qu'il s'agit d'un filtre : une seule pastille est pleine. */
.pastilles{ display:flex; flex-wrap:wrap; gap:.5rem; }
.pastille{
  display:inline-flex; align-items:center; justify-content:center;
  padding:.375rem 1rem; border-radius:999px; border:1px solid var(--line);
  background:#fff; color:var(--muted); font-size:.875rem; font-weight:500;
  text-decoration:none; line-height:1.4; transition:background-color .12s, color .12s, border-color .12s;
}
.pastille:hover{ border-color:var(--brand); color:var(--brand-dark); }   /* 846 */
.pastille[aria-current="true"]{
  background:var(--brand); border-color:var(--brand); color:var(--sur-vert); font-weight:600;
}
.pastille[aria-current="true"]:hover{ background:var(--brand-dark); border-color:var(--brand-dark); color:#fff; }

/* 941 : .btn-noir retiré (règle d'Annie : aucun bouton noir). Les boutons qui l'utilisaient sont
   des boutons secondaires blancs bordés (.btn-outline-secondary) ; garde-fou test_936. */
.btn-blue{
  --bs-btn-color:#fff; --bs-btn-bg:var(--blue); --bs-btn-border-color:var(--blue);
  --bs-btn-hover-color:#fff; --bs-btn-hover-bg:var(--blue-dark); --bs-btn-hover-border-color:var(--blue-dark);
  --bs-btn-active-color:#fff; --bs-btn-active-bg:var(--blue-active); --bs-btn-active-border-color:var(--blue-active);
  --bs-btn-disabled-color:#fff; --bs-btn-disabled-bg:var(--blue); --bs-btn-disabled-border-color:var(--blue);
  font-weight:600;
}
/* Ligne délai sous le CTA de la carte noire. */
.cta-ink-delai{ color:rgba(255,255,255,.75); font-size:.85rem; margin:.25rem 0 0; }

/* Boutons d'action compacts et uniformes (listes) — hauteur fixe, sans icône, typo Inter */
.btn-chip{
  display:inline-flex; align-items:center; justify-content:center;
  height:36px; padding:0 1rem; border-radius:10px;
  font-family:'Inter',sans-serif; font-weight:600; font-size:.82rem; line-height:1;
  white-space:nowrap; border:1px solid transparent; cursor:pointer;
  text-decoration:none; transition:background .15s, color .15s, border-color .15s;
}
.btn-chip:focus-visible{ outline:2px solid var(--brand); outline-offset:2px; }
.btn-chip-neutral{ background:#fff; color:var(--ink); border-color:var(--line); }
.btn-chip-neutral:hover{ background:var(--surface); color:var(--ink); }
.btn-chip-warn{ background:#FFF6E6; color:#9A6B00; border-color:#F1E2BD; }
.btn-chip-warn:hover{ background:#FBEED0; color:#9A6B00; }
.btn-chip-go{ background:var(--brand-soft); color:var(--brand-dark); border-color:#C8EED9; }
.btn-chip-go:hover{ background:#D5F3E3; color:var(--brand-dark); }
.btn-chip-danger{ background:#FCEAEA; color:#C0392B; border-color:#F3D2D0; }
.btn-chip-danger:hover{ background:#F8DBD9; color:#C0392B; }

/* Barre de navigation de l'app */
.app-nav{ background:#fff; border-bottom:1px solid var(--line); padding-block:.5rem; }
.app-nav .nav-link{ color:var(--muted); font-weight:500; border-radius:8px; padding:.4rem .7rem; }
.app-nav .nav-link:hover{ color:var(--ink); background:var(--surface); }
.app-nav .nav-link.active{ color:var(--brand-dark); background:var(--brand-soft); }

/* Cartes */
.card{ border:1px solid var(--line); border-radius:16px; box-shadow:0 1px 2px rgba(14,27,20,.03); }
.card-soft{ background:#fff; }

/* Cartes indicateurs (KPI) */
.kpi{ position:relative; }
.kpi .kpi-label{
  font-size:.72rem; text-transform:uppercase; letter-spacing:.08em;
  color:var(--muted); font-weight:600;
}
.kpi .kpi-value{ font-family:'Plus Jakarta Sans',sans-serif; font-weight:800;
  font-size:1.9rem; line-height:1.1; letter-spacing:-.02em; }
/* Cartes teintées douces — une teinte par indicateur (option 3) */
.kpi.kpi-green  { background:var(--brand-soft); }
.kpi.kpi-green  .kpi-label, .kpi.kpi-green  .kpi-value { color:var(--brand-dark); }
.kpi.kpi-blue   { background:#E7EEFD; }
.kpi.kpi-blue   .kpi-label, .kpi.kpi-blue   .kpi-value { color:var(--blue-dark); }
.kpi.kpi-amber  { background:var(--attention-soft); }   /* 946 : variables */
.kpi.kpi-amber  .kpi-label, .kpi.kpi-amber  .kpi-value { color:var(--attention); }
/* Neutre (gris) : pour un chiffre « d'information », PAS une alerte (ex. Taxes payées).
   L'ambre est réservé aux alertes (« Sans reçu », « En attente »). */
.kpi.kpi-neutral { background:#F1F3F5; }
.kpi.kpi-neutral .kpi-label, .kpi.kpi-neutral .kpi-value { color:#566; }
/* Rouge RÉSERVÉ au « en retard » (cohérent avec la pastille badge-retard).
   L'ambre reste pour « à surveiller » (en attente, taxes…). */
.kpi.kpi-danger { background:#FDECEC; }
.kpi.kpi-danger .kpi-label, .kpi.kpi-danger .kpi-value { color:#B42318; }
.kpi.kpi-violet { background:#F1EBFD; }
.kpi.kpi-violet .kpi-label, .kpi.kpi-violet .kpi-value { color:#6D28D9; }
.kpi .kpi-value .muted{ color:inherit!important; opacity:.65; }

/* Badges de statut */
.badge-status{ font-weight:600; padding:.34em .7em; border-radius:999px; font-size:.74rem; white-space:nowrap; }
.badge-draft{ background:var(--statut-draft-fond); color:var(--statut-draft-texte); }
.pastille-sans-taxes{ background:var(--surface); color:var(--muted); }   /* 964 : catégorie « Sans taxes par défaut » */
.badge-sent{ background:var(--statut-sent-fond); color:var(--statut-sent-texte); }
.badge-paid{ background:var(--statut-paid-fond); color:var(--statut-paid-texte); }
.badge-void{ background:var(--statut-void-fond); color:var(--statut-void-texte); }
.badge-refunded{ background:var(--statut-refunded-fond); color:var(--statut-refunded-texte); }
/* Livraison échouée : la facture n'a jamais atteint le client. Rouge, parce que
   c'est le seul état de cette liste qui exige une action immédiate. */
.badge-nondelivre{ background:var(--statut-nondelivre-fond); color:var(--statut-nondelivre-texte); display:inline-flex; align-items:center; gap:4px; }
/* Facture en retard (échue et impayée). 950 (décision d'Annie) : fond pâle comme toutes les
   pastilles (plus de rouge plein) ; « Annulée » passe au gris pour ne pas s'y confondre. */
.badge-retard{ background:var(--statut-retard-fond); color:var(--statut-retard-texte); }  /* 950 : pâle comme les autres (6,1:1) */
/* « Sans reçu » : ambre d'ALERTE (à régler avant la fin de l'année fiscale).
   Exception seulement — une dépense AVEC reçu est la normale et n'affiche rien. */
.badge-sansrecu{ background:var(--statut-sansrecu-fond); color:var(--statut-sansrecu-texte); }
/* 864 : « Province à vérifier » (liste des clients) : mêmes couleurs, 5,9:1. */

/* Cases de sélection d'un tableau.
   Bootstrap dimensionne .form-check-input en « em » : la case hérite donc de la
   taille du texte de sa cellule. Comme l'entête est à .74rem et les lignes à 1rem,
   la case du « tout sélectionner » apparaissait 26 % plus petite que les autres.
   On fige la taille en rem pour qu'elles soient identiques, où qu'elles soient. */
.bulk-check{ width:1rem; height:1rem; margin-top:0; vertical-align:middle; }

/* Barre segmentée : cinq segments font environ 520 px et ne tiennent pas sur un
   téléphone. Plutôt que de les replier sur deux rangées — ce qui casse l'effet de
   groupe — la barre défile au doigt sur une seule ligne. La barre de défilement
   est masquée : c'est le débordement visible du dernier segment qui annonce la
   suite, comme dans les applications mobiles natives. */
.segments-scroll{ overflow-x:auto; -webkit-overflow-scrolling:touch;
  scrollbar-width:none; padding-bottom:2px; }
.segments-scroll::-webkit-scrollbar{ display:none; }
.segments-scroll .btn-group{ flex-wrap:nowrap; }
/* Rangées d'onglets qui débordent (périodes, réglages) : dégradé à droite pour
   annoncer qu'il reste du contenu — mais SEULEMENT quand ça déborde vraiment
   (classe .is-scrollable posée par le JS). Sinon un dégradé fade le dernier onglet
   pour rien. L'onglet actif est amené dans le champ au chargement (JS). */
.segments-scroll.is-scrollable, .settings-seg.is-scrollable{
  -webkit-mask-image:linear-gradient(to right, #000 calc(100% - 44px), transparent);
          mask-image:linear-gradient(to right, #000 calc(100% - 44px), transparent);
}
/* 941 (règle d'Annie : RIEN ne glisse de côté au téléphone). Sous 576 px, les filtres des
   listes (#segmentsBar) passent en GRILLE dans un seul cadre : 2 colonnes à partir de 4 choix
   (2 × 2, un 5e choix prend toute la rangée) ; 3 choix ou moins sur une rangée, SAUF si un
   libellé ne tient pas sur une ligne : le JS de base.html pose alors .segments--2col (2 + 1).
   La Période (_periode.html) devient une liste déroulante au téléphone. */
@media (max-width: 575.98px){
  #segmentsBar.segments-scroll{ overflow:visible; padding-bottom:0; -webkit-mask-image:none; mask-image:none;
    flex:1 1 100%; width:100%; }
  #segmentsBar .btn-group{ display:grid; width:100%; grid-template-columns:repeat(2, minmax(0,1fr));
    gap:1px; background:var(--line); border:1px solid var(--line); border-radius:10px; overflow:hidden; }
  #segmentsBar .btn-group:not(:has(> :nth-child(4))){ grid-template-columns:repeat(3, minmax(0,1fr)); }
  #segmentsBar .btn-group:not(:has(> :nth-child(3))){ grid-template-columns:repeat(2, minmax(0,1fr)); }
  #segmentsBar .btn-group.segments--2col{ grid-template-columns:repeat(2, minmax(0,1fr)); }
  #segmentsBar .btn-group > .btn{ border:0; border-radius:0; margin:0; display:flex; align-items:center;
    justify-content:center; text-align:center; background:#fff; }
  #segmentsBar .btn-group > .btn-primary{ background:var(--brand-soft); color:var(--brand-dark); }
  #segmentsBar .btn-group > .btn:last-child:nth-child(odd):not(:nth-child(1)){ grid-column:1 / -1; }
  #segmentsBar .btn-group:not(:has(> :nth-child(4))):not(.segments--2col) > .btn:last-child{ grid-column:auto; }
  #segmentsBar .btn-group.segments--2col > .btn{ white-space:normal; }
  .periode-segments{ display:none; }
}
@media (min-width: 576px){ .periode-liste{ display:none; } }
/* Période « Personnalisé » au téléphone : Du et Au côte à côte (moitié chacun), boutons dessous. */
@media (max-width: 575.98px){
  .periode-dates > div{ flex:1 1 calc(50% - .5rem); min-width:0; }
  .periode-dates > div .form-control{ width:100%; min-width:0; }
}
/* Chaque libellé sur UNE ligne (Bootstrap 5 laisse le texte casser par défaut) :
   sinon « À encaisser (7) » se replie en 3 lignes et désaligne la barre. Le
   débordement est absorbé par le défilement horizontal ci-dessus. */
.segments-scroll .btn{ white-space:nowrap; }
/* Segment ACTIF = filtre sélectionné, pas un bouton d'action : vert PÂLE + texte
   vert foncé, pour ne pas imiter le bouton vert plein « Nouvelle facture ».
   Scopé aux segments : btn-primary garde son vert plein ailleurs dans l'app. */
.segments-scroll .btn-group > .btn-primary,
.segments-scroll .btn-group > .btn-primary:focus,
.segments-scroll .btn-group > .btn-primary:hover{
  background:var(--brand-soft); border-color:#CDEBD9; color:var(--brand-dark); box-shadow:none;   /* 941 */
}
/* 941 : survol d'un segment non choisi = gris pâle (Bootstrap le remplissait de gris foncé). */
.segments-scroll .btn-group > .btn-outline-secondary:hover{
  background:var(--surface); border-color:var(--bs-border-color); color:var(--ink);
}
.badge-part-refunded{ background:var(--statut-part-refunded-fond); color:var(--statut-part-refunded-texte); }
/* 834 : lien texte dans la couleur des liens de l'app (--brand-dark, #037F45), pour
   les boutons .btn-link (Bootstrap les met sinon dans --bs-link-color, bleu). */
.btn-link.lien-app{ --bs-btn-color:var(--brand-dark); --bs-btn-hover-color:var(--brand-dark);
  --bs-btn-active-color:var(--brand-dark); }
/* 838 : montant mis en valeur en vert LISIBLE (--brand-dark, 5,09:1 sur blanc) au lieu
   de .text-brand (#00BE65, 2,46:1). Ex. « Nette à remettre » de la page Rapports. */
.montant-vert{ color:var(--brand-dark); }

/* Tableaux */
.table thead th{ font-size:.74rem; text-transform:uppercase; letter-spacing:.06em;
  color:var(--muted); font-weight:600; border-bottom:1px solid var(--line); }
/* En-têtes de colonne TRIABLES : lien à pleine intensité #5F6B64 (5,56:1 sur blanc).
   L'ancien opacity-75 rabaissait var(--muted) à ~#849089 (sous le seuil 4,5:1). */
thead th a.th-tri{ color:#5F6B64; }
thead th a.th-tri .th-fleche{ opacity:1; }
.table td{ vertical-align:middle; }

/* Pages d'authentification (accueil, connexion, choix d'entreprise) */
.auth-wrap{ min-height:100vh; display:flex; flex-direction:column;
  align-items:center; justify-content:center; padding:2rem 1rem;
  background:
    radial-gradient(60rem 40rem at 50% -10%, var(--brand-soft), transparent 60%),
    var(--surface);
}
.auth-card{ width:100%; max-width:420px; background:#fff; border:1px solid var(--line);
  border-radius:20px; padding:2.2rem; box-shadow:0 10px 40px rgba(14,27,20,.06); }
.auth-card .form-label{ font-weight:600; font-size:.85rem; }
/* Mobile : moins de padding sur la carte de connexion pour laisser ≥300px au widget
   Cloudflare Turnstile (largeur minimale ~300px, sinon il déborde). + filet anti-débordement. */
@media (max-width:575.98px){
  /* Donner assez de largeur au widget Turnstile (plancher ~300px) pour qu'il remplisse
     le conteneur = même largeur que les champs. Padding réduit (page + carte). */
  .auth-wrap{ padding:1.5rem 0.5rem; }
  .auth-card{ padding:1.25rem 0.9rem; }
}
/* Turnstile en mode « flexible » : remplit 100% du conteneur = largeur des champs (tous viewports). */
.cf-turnstile{ width:100%; }
.muted{ color:var(--muted); }

/* Sélecteur d'entreprise */
.company-pill{ display:inline-flex; align-items:center; gap:.5rem; border:1px solid var(--line);
  background:#fff; border-radius:999px; padding:.3rem .8rem; font-weight:600; color:var(--ink); }
.company-pill img{ height:20px; width:auto; border-radius:4px; }


/* ===== Barre latérale verticale (bleu --blue, items mafacture) ===== */
:root{ --sidebar:#1748c0; --sidebar-line:rgba(255,255,255,.16); --bs-offcanvas-width:250px; }

.layout{ display:flex; min-height:100vh; align-items:stretch; }

.sidebar{ width:250px; background:var(--sidebar) !important; color:rgba(255,255,255,.88); }
.sidebar.offcanvas-lg{ border:0; }
@media (min-width:992px){
  .sidebar{ position:sticky; top:0; height:100vh; flex:0 0 250px; }
  .sidebar .offcanvas-body{ height:100vh; }
}
.sidebar .offcanvas-body{ display:flex; flex-direction:column; padding:0; }

/* Entreprise + rôle : même typo que le menu mais nettement plus petit */
.side-top{ padding:1rem .8rem .5rem; }
.co-switch{ width:100%; text-align:left; background:rgba(255,255,255,.08);
  border:1px solid var(--sidebar-line); border-radius:12px; color:#fff;
  padding:.5rem .7rem; display:flex; align-items:center; justify-content:space-between; gap:.5rem; }
.co-switch:hover{ background:rgba(255,255,255,.14); }
.co-switch .co-block{ display:flex; flex-direction:column; min-width:0; }
.co-switch .co-name{ font-weight:700; font-size:.8rem; line-height:1.15;
  white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.co-switch .role{ font-size:.68rem; color:rgba(255,255,255,.85); }

.side-nav{ padding:.5rem; flex:1 1 auto; overflow-y:auto; }
.side-nav a{ display:flex; align-items:center; gap:.7rem; padding:.6rem .8rem; border-radius:10px;
  color:rgba(255,255,255,.86); text-decoration:none; font-weight:500; font-size:.95rem; margin-bottom:2px; }
.side-nav a:hover{ background:rgba(255,255,255,.10); color:#fff; }
.side-nav a.active{ background:var(--blue-active); color:#fff; }
.side-nav a i{ font-size:1.05rem; opacity:.95; width:1.25rem; text-align:center; }

/* Sous-section « Administration » : petite et secondaire */
.side-section-label{ font-size:.66rem; text-transform:uppercase; letter-spacing:.09em;
  color:rgba(255,255,255,.72); font-weight:700; padding:.9rem .8rem .25rem; margin-top:.4rem;
  border-top:1px solid var(--sidebar-line); }
.side-nav a.side-sm{ font-size:.82rem; color:rgba(255,255,255,.72); padding:.45rem .8rem; }
.side-nav a.side-sm i{ font-size:.92rem; }

.side-foot{ padding:.7rem .8rem; border-top:1px solid var(--sidebar-line); }
.user-pill{ width:100%; text-align:left; display:flex; align-items:center; gap:.5rem;
  background:rgba(255,255,255,.08); border:1px solid var(--sidebar-line); border-radius:10px;
  color:rgba(255,255,255,.92); padding:.45rem .7rem; font-size:.82rem; }
.user-pill:hover{ background:rgba(255,255,255,.14); }

.content{ flex:1 1 auto; min-width:0; background:var(--surface); }
.content-inner{ padding:1.6rem clamp(1rem,3vw,2.2rem); }
/* Conteneur centré à deux largeurs : l'en-tête ET le contenu partagent la même
   largeur, donc tout reste aligné (le « ⋯ » ne file plus au bord de l'écran).
   .page-narrow = formulaires/détails; .page-wide = listes/tableaux/tableau de bord. */
.page-container{ width:100%; margin-inline:auto; }
.page-container.page-narrow{ max-width:820px; }
.page-container.page-wide{ max-width:1140px; }

.mobile-bar{ background:var(--sidebar); color:#fff; padding:.55rem .8rem;
  display:flex; align-items:center; justify-content:space-between; gap:.5rem; position:sticky; top:0; z-index:1030; }

/* Bouton « Envoyer par courriel » (bleu, distinct du vert « Payée ») */
.btn-send{ background:var(--blue); border-color:var(--blue); color:#fff; font-weight:600; }
.btn-send:hover,.btn-send:focus{ background:var(--blue-dark); border-color:var(--blue-dark); color:#fff; }

/* Bouton « Encaissement manuel » (contour bleu discret, style secondaire) */
.btn-counter{ background:#fff; border:1px solid var(--blue); color:var(--blue); font-weight:600; }
.btn-counter:hover,.btn-counter:focus{ background:var(--blue); border-color:var(--blue); color:#fff; }

/* Bouton « Repasser en brouillon » (noir encre, au lieu du gris) */
.btn-ink{ background:#12181F; border-color:#12181F; color:#fff; font-weight:600; }
.btn-ink:hover,.btn-ink:focus{ background:#000; border-color:#000; color:#fff; }

/* Contrôle segmenté du statut de facture (lot 144) : un clic sur un segment bascule
   le statut (avec confirmation) ; segment actif en noir encre ; segment désactivé
   quand la transition est interdite (ex. facture payée par Stripe). */
.seg-status{ display:flex; border:1px solid var(--line); border-radius:9px; overflow:hidden; background:#fff; }
.seg-status form{ flex:1 1 0; display:flex; margin:0; min-width:0; }
.seg-status .seg{ flex:1 1 0; min-width:0; border:0; background:transparent; color:var(--muted);
  font-size:.85rem; font-weight:600; padding:.45rem .2rem; cursor:pointer; }
.seg-status > * + *{ border-left:1px solid var(--line); }
/* Segment actif : vert de marque. Le noir venait du même accident que « Rech. Acuity ». */
.seg-status .seg.active{ background:var(--brand-soft); color:var(--brand-dark); cursor:default; }   /* 941 : comme .choix-seg */
.seg-status .seg:disabled{ color:#C9C6BC; cursor:not-allowed; background:#FAFAF7; }
.seg-status .seg:not(.active):not(:disabled):hover{ background:var(--surface); color:#12181F; }

/* ===== Page d'accueil (marketing sobre, sur invitation) ===== */
/* L'accueil remplit toujours la hauteur de l'écran, et s'adapte au redimensionnement */
.lp-body{ min-height:100vh; min-height:100dvh; display:flex; flex-direction:column; background:#fff; }
.lp-body .lp-hero{ flex:1 0 auto; display:flex; flex-direction:column; justify-content:center; }

.lp-nav{ background:#fff; border-bottom:1px solid var(--line); }
.lp-hero{ background:
  url('https://cdn.mafacture.ca/images/hero.jpg') center center/cover no-repeat,
  #fff; }
/* iPad en PAYSAGE : image dédiée. Plage étendue à 1200 px pour couvrir aussi l'iPad
   Pro 10,5" (1112 px), sans toucher au 12,9" (1366 px) qui est bien en image desktop. */
@media (min-width:768px) and (max-width:1200px) and (orientation:landscape){
  .lp-hero{ background:
    url('https://cdn.mafacture.ca/images/hero-ipad.jpg') 40% center/cover no-repeat,
    #fff; }
}
/* Mobile ET iPad en portrait : image portrait dédiée (mieux cadrée verticalement). */
@media (max-width:767px), (min-width:768px) and (max-width:1024px) and (orientation:portrait){
  .lp-hero{ background:
    url('https://cdn.mafacture.ca/images/hero-mobile.jpg') center/cover no-repeat,
    #fff; }
}
.lp-hero h1{ font-size:clamp(2rem,4vw,3rem); line-height:1.08; }
/* Panneau translucide (verre clair) derrière le texte du hero, pour la lisibilité
   par-dessus la photo de fond. Variante A : blanc 72 %, léger flou, ombre douce. */
.lp-hero .hero-text{ background:rgba(255,255,255,.52);
  -webkit-backdrop-filter:blur(7px); backdrop-filter:blur(7px);
  border:1px solid rgba(255,255,255,.6); border-radius:16px;
  padding:2rem 2rem 2.25rem; box-shadow:0 12px 34px rgba(10,37,64,.12); }
@media (max-width:991px){ .lp-hero .hero-text{ padding:1.5rem 1.25rem; } }
/* Texte du hero (paragraphe + prix) en noir sur le panneau, pour la lisibilité. */
.lp-hero .hero-text .muted{ color:var(--ink); }
/* Panneau plus compact sur grand écran (~36 %) et cartes de droite alignées en bas
   (révèle le visage sur la photo). Desktop seulement : rien ne change sur mobile. */
@media (min-width:992px){
  .lp-hero .hero-text{ max-width:518px; }
  .lp-hero .col-lg-6:has(.hero-stage){ align-self:flex-end; }
}
.lp-eyebrow{ font-size:.78rem; font-weight:700; letter-spacing:.12em;
  text-transform:uppercase; color:var(--brand-dark); }
.lp-feature{ background:var(--feature-bg); border:0; border-radius:16px;
  height:100%; display:flex; flex-direction:column; padding:1.5rem 1.5rem calc(1.5rem + 50px); }
.lp-feature h2{ color:#fff; font-size:1.08rem; }
.lp-feature .muted{ color:#fff; font-size:.92rem; line-height:1.45; }
.lp-feature .ico{ width:auto; height:auto; border-radius:0; display:block;
  background:none; color:#fff; font-size:1.8rem; line-height:1; }


/* ===== Visuels défilants de l'accueil ===== */
/* 837 — La CARTE est la scène elle-même : blanche, opaque et fixe pendant les
   transitions. Seul le contenu des diapositives (.hero-slide) fait un fondu ; la hauteur
   suit en douceur celle de la diapositive active (fixée en JS), sans saut. 300 px = repli
   sans JavaScript. Mouvement réduit : aucune transition de hauteur. */
.hero-stage{ position:relative; max-width:430px; margin-inline:auto; height:300px;
  background:#fff; border:1px solid var(--line); border-radius:18px; box-sizing:border-box;
  box-shadow:0 18px 50px rgba(14,27,20,.10); overflow:hidden; transition:height .35s ease; }
@media (prefers-reduced-motion:reduce){ .hero-stage{ transition:none; } }
.hero-slide{ position:absolute; inset:0; opacity:0; }
.hero-slide.is-active{ opacity:1; }
/* 837 : .hero-card n'est plus qu'une couche de CONTENU, sans fond ni bordure ni ombre
   (c'est .hero-stage qui porte la carte) ; sa hauteur suit son contenu. */
.hero-card{ background:transparent; box-sizing:border-box; padding:1.5rem;
  display:flex; flex-direction:column; justify-content:center; }
.hero-card .row-line{ display:flex; justify-content:space-between; padding:.28rem 0; }
.hero-dots{ display:flex; gap:.4rem; justify-content:center; margin-top:1.1rem; }
.hero-dots button{ width:8px; height:8px; border-radius:50%; border:0; background:#CBD6CE;
  padding:0; cursor:pointer; transition:width .25s, background .25s; }
.hero-dots button.is-active{ background:var(--brand); width:22px; border-radius:999px; }
/* 837 — Points du carrousel de l'ACCUEIL, lisibles sur toute la photo : pastille blanche
   opaque derrière les points ; inactif #7A8A80 (3,64:1), actif --brand-dark (5,09:1),
   seuil 3:1 des éléments graphiques. Le carrousel des fonctionnalités n'est pas touché. */
.lp-hero .hero-dots{ width:fit-content; margin:1.1rem auto 0; padding:6px 10px;
  background:#fff; border-radius:999px; box-shadow:0 2px 8px rgba(14,27,20,.12); }
.lp-hero .hero-dots button{ background:#7A8A80; }
.lp-hero .hero-dots button.is-active{ background:var(--brand-dark); }
@media (prefers-reduced-motion:reduce){ .lp-hero .hero-dots button{ transition:none; } }
.mini-bar{ display:flex; align-items:flex-end; gap:6px; height:64px; }
.mini-bar span{ flex:1; background:var(--brand-soft); border-radius:5px 5px 0 0; }
.mini-bar span.hi{ background:var(--brand); }
.lp-features{ background:#fff; }

/* Carrousel des fonctionnalités */
.feat-carousel{ overflow:hidden; }
.feat-track{ display:flex; gap:1.5rem; align-items:stretch; will-change:transform; }
.feat-slide{ flex:0 0 calc((100% - 3rem) / 3); display:flex; }
.feat-slide > .lp-feature{ width:100%; }
@media (max-width:992px){ .feat-slide{ flex-basis:calc((100% - 1.5rem) / 2); } }
@media (max-width:640px){ .feat-slide{ flex-basis:100%; } }
.feat-nav{ display:flex; gap:1rem; justify-content:center; margin-top:1.75rem; }
.feat-dots{ margin-top:1.9rem; }
.feat-arrow{ width:46px; height:46px; border-radius:50%; border:1px solid var(--line);
  background:#fff; color:var(--brand); font-size:1.15rem; line-height:1;
  display:inline-flex; align-items:center; justify-content:center; cursor:pointer;
  transition:background .15s ease, color .15s ease, border-color .15s ease; }
.feat-arrow:hover{ background:var(--brand); color:var(--sur-vert); border-color:var(--brand); }


/* Boîte d'appel à l'action (fond noir, texte blanc) */

/* Bouton d'action du popup (bleu) */
/* 842 : .btn-cta (blanc sur vert) retiré ; utiliser .btn-primary. */


/* Espacement standard sous l'en-tête d'une page (titre/barre d'actions → contenu).
   Valeur centrale : la modifier ici la change PARTOUT où .page-header est utilisée. */
.page-header { margin-bottom: 3rem; }   /* 48px — la SEULE distance entre un en-tête et son contenu */

/* Lien de retour NOMMÉ, au-dessus du titre. Voir templates/portal/_retour.html.
   Une flèche seule n'annonce pas sa destination ; ce lien l'écrit. */
.retour-lien{
  display:inline-flex; align-items:center; gap:.3rem;
  font-size:.9375rem; font-weight:500; text-decoration:none;
  color:var(--brand-dark); padding:.25rem 0;
}
@media (hover:hover){ .retour-lien:hover{color:var(--brand-dark); text-decoration:underline; } }   /* 961 : soulignement au survol, souris seulement */
.retour-lien .bi{ font-size:1rem; }

/* Mobile : plus d'air latéral sur les pages publiques (landing, calculatrices, légales) */
@media (max-width:575.98px){
  .lp-body .container{ padding-left:30px; padding-right:30px; }
}

/* ===== Header public : hauteur pilotée par --lp-nav-h, contenu centré ===== */
.lp-nav .container{ min-height:var(--lp-nav-h); }
.lp-body > main{ flex:1 0 auto; }   /* pousse le footer en bas même sans hero */

/* ===== 941 : SÉLECTEUR D'OPTION, un seul style dans toute l'app (règle d'Annie) =====
   Référence : « Pourcentage / Montant » de la page d'acompte (882). Un cadre, des séparateurs,
   choix actif fond --brand-soft + texte --brand-dark, survol gris pâle (jamais noir).
   Balisage : <div class="choix-seg" role="group"> puis <input type="radio" class="btn-check">
   + <label class="btn"> (ou <button class="btn"> avec .active). Garde-fous : test_936. */
.choix-seg{ display:inline-flex; max-width:100%; border:1px solid var(--line); border-radius:10px;
  overflow:hidden; background:#fff; vertical-align:middle; }
.choix-seg > .btn{ border:0; border-radius:0; margin:0; background:#fff; color:var(--muted);
  font-weight:400; padding:.45rem 1.1rem; box-shadow:none; }
.choix-seg > .btn + .btn, .choix-seg > .btn + .btn-check + .btn{ border-left:1px solid var(--line); }
.choix-seg > .btn:hover, .choix-seg > .btn-check:not(:checked) + .btn:hover{ background:var(--surface); color:var(--ink); }
.choix-seg > .btn-check:checked + .btn, .choix-seg > .btn.active,
.choix-seg > .btn-check:checked + .btn:hover, .choix-seg > .btn.active:hover{
  background:var(--brand-soft); color:var(--brand-dark); font-weight:600; }
.choix-seg > .btn-check:focus-visible + .btn, .choix-seg > .btn:focus-visible{
  box-shadow:inset 0 0 0 2px var(--brand-dark); outline:0; }
/* Téléphone : les choix se partagent la largeur ; le texte revient à la ligne entre les mots. */
@media (max-width: 575.98px){
  .choix-seg--plein{ display:flex; width:100%; }
  .choix-seg--plein > .btn{ flex:1 1 auto; padding:.45rem .55rem; overflow-wrap:normal; word-break:normal; }
}

/* 958 ; 968 : portion affaire « 100 % / 50 % / 0 % / Autre », mêmes 4 boutons à largeurs égales dans la fiche d'une
   dépense ET la fiche d'une récurrente (« 100 % » jamais coupé à 360 px). */
.dep-pct{ display:grid; grid-template-columns:repeat(4, minmax(0,1fr)); width:100%; }
.dep-pct > .btn{ min-width:0; white-space:nowrap; padding-left:.25rem; padding-right:.25rem; }
@media (max-width:767.98px){ .dep-pct > .btn{ min-height:44px; } }
/* 970 (Annie) : « Fin » (Sans fin / À une date / Après X paiements) au style de « Portion affaire » : mêmes boutons
   (btn-sm), pleine largeur, 3 colonnes égales ; le libellé peut passer à la ligne entre les mots au téléphone. */
.dep-fin{ display:grid; grid-template-columns:repeat(3, minmax(0,1fr)); width:100%; }
.dep-fin > .btn{ min-width:0; padding-left:.25rem; padding-right:.25rem; overflow-wrap:normal; word-break:normal; }
@media (max-width:767.98px){ .dep-fin > .btn{ min-height:44px; display:flex; align-items:center; justify-content:center; } }

/* ===== FAQ accordéon + CTA mafacture unifiés (calculateurs ET blogue) =====
   Source de vérité UNIQUE du style : les gabarits utilisent les partiels
   _faq_accordion.html et _cta_mafacture.html. Ne pas dupliquer ces règles. */
/* FAQ : style identique à la page /aide/ — cartes blanches séparées, ombre douce,
   texte aéré, seul le chevron bouge (aucun fond noir). Appliqué partout (accueil,
   calculateurs, blogue) via .calc-accordion. */
.calc-accordion{ --bs-accordion-border-width:0; --bs-accordion-active-bg:#fff;
  --bs-accordion-active-color:#0E1B14; --bs-accordion-btn-focus-box-shadow:none;
  --bs-accordion-btn-active-icon:var(--bs-accordion-btn-icon); background:transparent; margin-top:30px; }
.calc-accordion .accordion-item{ background:#fff; border:0.5px solid #e5e7eb;
  border-radius:12px !important; box-shadow:0 2px 8px rgba(0,0,0,.05); margin-bottom:10px; overflow:hidden; }
.calc-accordion .accordion-item:hover{ box-shadow:0 3px 12px rgba(0,0,0,.08); }
.calc-accordion .accordion-button{ font-size:15px; font-weight:500; line-height:1.6;
  padding:16px 18px; color:#0E1B14; background:#fff; box-shadow:none; }
.calc-accordion .accordion-button:not(.collapsed){ background:#fff; color:#0E1B14; box-shadow:none; }
.calc-accordion .accordion-button:focus{ box-shadow:none; }
.calc-accordion .accordion-body{ font-size:14px; line-height:1.75; color:#3A463F; padding:2px 18px 16px; }
/* Neutralise les styles d'article (marges des h3/p du blogue) DANS l'accordéon. */
.calc-accordion .accordion-header{ margin:0; }
.calc-accordion .accordion-body p{ margin:0; }
.calc-cta { background:#fff; border:1px solid var(--line); border-radius:16px; padding:24px; margin-top:2.5rem; text-align:center; }


/* ── Historique des activités (facture) : une timeline à pastilles ────────────
   Chaque action est un point relié par une ligne verticale fine. Texte à 13 px,
   sans gras ; l'horodatage à droite, à chasse fixe. Une facture vit des mois,
   donc l'horodatage porte la date complète, pas seulement l'heure. */
/* Fond gris pâle pour distinguer l'historique des cartes blanches principales. */
.card.card-activite { background: #F6F6F3; border-color: #E3E3DE; }
/* Option F : le bas de l'historique s'estompe pour signaler qu'il y a plus. */
.chrono-wrap{ position:relative; }
.chrono-fade::after{ content:""; position:absolute; left:0; right:0; bottom:0; height:3rem;
  background:linear-gradient(to bottom, rgba(246,246,243,0), #F6F6F3); pointer-events:none; }
.chrono-plus{ display:flex; justify-content:center; margin-top:.5rem; }
.chrono-plus .retour-lien{ color:var(--ink); font-weight:600; }
.chrono-plus .retour-lien:hover{ color:var(--ink); }
.chrono { list-style: none; margin: 0; padding: 0; position: relative; }
.chrono::before { content: ""; position: absolute; left: 4.5px; top: .8rem; bottom: .8rem; width: 1.5px; background: #D8D8D2; }
.chrono-item { position: relative; display: flex; justify-content: space-between; align-items: baseline; gap: 1rem; padding: .35rem 0 .35rem 1.5rem; }
.chrono-dot { position: absolute; left: 0; top: .55rem; width: 10px; height: 10px; border-radius: 50%; background: rgb(48, 48, 48); box-sizing: border-box; }
.chrono-txt { font-size: 13px; font-weight: 400; color: rgb(48, 48, 48); line-height: 1.5; min-width: 0; }
.chrono-who { color: #6c757d; }
.chrono-who::before { content: " · "; }
.chrono-when { font-size: 13px; font-weight: 400; color: #6c757d; white-space: nowrap; font-variant-numeric: tabular-nums; }

/* ── Actions de la carte Statut : petits boutons alignés, comme « Modifier le
   paiement ». Plus de d-grid pleine largeur. ── */
.statut-actions > * + * { margin-top: .5rem; }

/* Numéro de facture cliquable dans « Factures récentes » (tableau de bord) :
   repos neutre (hérite du noir semi-gras de la cellule), vert foncé + souligné au survol. */
.lien-facture{ color:inherit; text-decoration:none; }
.lien-facture:focus{ color:var(--brand-dark); text-decoration:underline; }
@media (hover:hover){ .lien-facture:hover{color:var(--brand-dark); text-decoration:underline; } }   /* 961 : soulignement au survol, souris seulement */

/* Bouton divisé (split) : fine ligne verticale translucide pour démarquer la
   flèche (menu) du bouton principal. Sur le bouton plein vert, un blanc translucide
   fait un séparateur discret et conforme aux standards (941 : plus de bouton noir). */
.btn-group > .dropdown-toggle-split.btn-primary { border-left: 1px solid rgba(255, 255, 255, .45); }

/* Choix d'entreprise : au survol, on met seulement la bordure en vert (pas le
   remplissage noir de la règle générale des boutons contour). */
.company-choice{
  --bs-btn-hover-color:var(--muted); --bs-btn-hover-bg:var(--brand-soft); --bs-btn-hover-border-color:var(--brand);
  --bs-btn-active-color:var(--muted); --bs-btn-active-bg:var(--brand-soft); --bs-btn-active-border-color:var(--brand);
}
/* Liseré interne : épaissit la bordure verte à ~2 px sans décaler le contenu. */
.company-choice:hover, .company-choice:focus{ box-shadow:inset 0 0 0 1px var(--brand); }

/* 836 : le menu de l'entreprise suit désormais la source unique des menus déroulants
   (plus de survol propre à ce menu). */

/* ── Ajustements MOBILE (Phase 1) ──────────────────────────────────────────
   Onglets Réglages : au lieu de déborder sur 2 lignes, ils défilent sur UNE
   ligne (glisser horizontalement). Logos d'entreprise masqués pour gagner de
   l'espace (ex. écran « Quelle entreprise? »). Ordinateur : inchangé.        */
@media (max-width: 575.98px){
  .settings-seg{
    display:flex; flex-wrap:nowrap; overflow-x:auto; width:100%;
    -webkit-overflow-scrolling:touch; scrollbar-width:none;
  }
  .settings-seg::-webkit-scrollbar{ display:none; }
  .settings-seg .nav-link{ white-space:nowrap; }
}

/* ── Phase 2 mobile : barre (titre + AJ) et bouton flottant « créer » ─────── */
.mb-title .mb-t{ display:block; font-weight:600; font-size:1rem; line-height:1.15; color:#fff; }
.mb-title .mb-s{ display:block; font-size:.72rem; line-height:1.1; color:#fff; opacity:.82; }
.mb-avatar{
  width:34px; height:34px; border-radius:50%; border:none; flex-shrink:0;
  background:#2F5FD0; color:#fff; font-size:.78rem; font-weight:600;
  display:flex; align-items:center; justify-content:center;
}
:root{ --fab-taille:60px; --fab-bas:28px; }   /* 960 : taille et marge du « + », lues aussi par l'espace sous les listes */
.fab-create{ position:fixed; right:20px; bottom:var(--fab-bas); z-index:1045; }
.fab-btn{
  width:var(--fab-taille); height:var(--fab-taille); border-radius:50%; border:none;
  background:var(--brand); color:var(--sur-vert); font-size:1.85rem;
  display:flex; align-items:center; justify-content:center;
  box-shadow:0 8px 20px rgba(3,155,83,.35); cursor:pointer; position:relative; z-index:1048;
}
.fab-btn:active{ transform:scale(.96); }
.fab-btn:focus{ outline:none; }                                   /* plus d'anneau au doigt */
.fab-btn:focus-visible{ outline:3px solid var(--blue); outline-offset:2px; }   /* clavier seulement */
.fab-ico{ transition:transform .22s cubic-bezier(.34,1.3,.64,1); }
.fab-create.is-open .fab-ico{ transform:rotate(135deg); }          /* + → × */
.fab-create.is-open .fab-btn{ display:none; }   /* feuille ouverte : seul le × de l'en-tête reste */

.fab-backdrop{
  position:fixed; inset:0; z-index:1046; background:rgba(14,27,20,.45);
  opacity:0; pointer-events:none; transition:opacity .2s ease;
}
.fab-create.is-open .fab-backdrop{ opacity:1; pointer-events:auto; }

.fab-sheet:focus{ outline:none; }
.fab-sheet{
  position:fixed; left:0; right:0; bottom:0; z-index:1047; background:#fff;
  border-radius:22px 22px 0 0; box-shadow:0 -10px 30px rgba(14,27,20,.18);
  padding:8px 16px calc(24px + env(safe-area-inset-bottom)); display:flex; flex-direction:column;
  max-height:85vh; overflow-y:auto;
  transform:translateY(100%); visibility:hidden;
  transition:transform .26s cubic-bezier(.32,.72,0,1), visibility 0s linear .26s;
}
.fab-create.is-open .fab-sheet{ transform:translateY(0); visibility:visible; transition:transform .26s cubic-bezier(.32,.72,0,1); }
.fab-handle{ align-self:center; width:40px; height:4px; border-radius:2px; background:#CBD5CF; margin-bottom:2px; }
.fab-sheet-head{ display:flex; align-items:center; justify-content:space-between; padding:8px 0 4px 4px; }
.fab-sheet-head h2{ margin:0; font-family:'Plus Jakarta Sans',sans-serif; font-size:20px; font-weight:800; }
.fab-close{ width:44px; height:44px; border:none; border-radius:12px; background:var(--surface); color:var(--prose);
  display:inline-flex; align-items:center; justify-content:center; cursor:pointer; }
.fab-group-label{ padding:12px 4px 6px; font-size:12px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; color:var(--muted); }
.fab-item{ display:flex; align-items:center; gap:14px; height:56px; padding:0 4px; border-radius:12px;
  font-weight:600; font-size:16px; color:var(--ink); text-decoration:none; }
.fab-item:hover, .fab-item:focus-visible{ background:var(--surface); color:var(--ink); }
.fab-item-ic{ width:40px; height:40px; flex:none; border-radius:12px; background:var(--brand-soft); color:var(--brand-dark);
  display:flex; align-items:center; justify-content:center; font-size:1.25rem; }

/* La note de bas de page ne doit pas être cachée par le FAB (mobile) */
@media (max-width:991.98px){ .content-inner{ padding-bottom:96px; } }
/* 960 (défaut vu par Annie à la 958) : sur les pages qui ont le « + », l'espace sous la liste = la hauteur du « + »
   + sa marge du bas + 16 px : défilée jusqu'en bas, aucune carte, aucun bouton ni « ⋯ » n'est sous le « + ». */
@media (max-width:991.98px){
  body:has(#fabCreate) .content-inner{ padding-bottom:calc(var(--fab-taille) + var(--fab-bas) + 16px + env(safe-area-inset-bottom)); }
}

/* ── KPI compacts sur mobile (les 4 cases du tableau de bord) ─────────────── */
@media (max-width: 575.98px){
  .kpi .card-body{ padding:.7rem .85rem; }
  .kpi .kpi-label{ font-size:.64rem; letter-spacing:.04em; margin-bottom:.15rem!important; }
  .kpi .kpi-value{ font-size:1.3rem; white-space:nowrap; }
}

/* ── Sélecteur de client avec recherche (Nouvelle facture) ────────────────── */
.client-combo{ position:relative; }
.client-combo-list{
  position:absolute; z-index:1050; left:0; right:0; top:100%; margin-top:3px;
  background:#fff; border:1px solid var(--line); border-radius:9px; padding:4px;
  max-height:260px; overflow-y:auto; list-style:none;
  box-shadow:0 8px 20px rgba(14,27,20,.14);
}
.client-combo-list li{ padding:9px 12px; border-radius:7px; cursor:pointer; font-size:.95rem; }
.client-combo-list li:hover, .client-combo-list li.active{ background:var(--brand-soft); }
.client-combo-list li.empty{ color:var(--muted); cursor:default; }
/* Combo générique (client / catégorie) : lignes avec pastille, séparateur, pied « + créer » */
.client-combo-list li:not(.empty):not(.combo-sep){ display:flex; align-items:center; }
.combo-ini{ width:26px; height:26px; flex:none; margin-right:.6rem; border-radius:50%;
  background:var(--brand-soft); color:var(--brand-dark); display:inline-flex;
  align-items:center; justify-content:center; font-size:.72rem; font-weight:700; }
/* 968 : ligne avec exemples (catégories de dépense) : nom, puis exemples en petit dessous. */
/* 970 : sélecteur plus fort que « li:not(.empty):not(.combo-sep) » (display:flex l'emportait : exemple collé À DROITE).
   Nom sur toute la largeur, jamais coupé (il passe à la ligne au besoin) ; exemple dessous, plus petit et gris. */
.client-combo-list li.combo-avec-sous:not(.empty):not(.combo-sep){ display:block; }
.client-combo-list .combo-nom{ display:block; white-space:normal; overflow-wrap:anywhere; }
.client-combo-list .combo-sous{ display:block; font-size:.8rem; line-height:1.25; color:var(--muted); margin-top:1px;
  white-space:normal; }
.client-combo-list li.combo-sep{ height:1px; padding:0; margin:4px 2px; background:var(--line);
  border-radius:0; cursor:default; }
.client-combo-list li.combo-sep:hover{ background:var(--line); }
.client-combo-list li.combo-add{ color:var(--brand-dark); font-weight:600; gap:.6rem; }
.client-combo-list li.combo-add:hover, .client-combo-list li.combo-add.active{ background:var(--brand-soft); }
.combo-add-ic{ width:26px; height:26px; flex:none; border-radius:50%; border:1.5px dashed var(--brand);
  display:inline-flex; align-items:center; justify-content:center; color:var(--brand-dark); }

/* ✕ pour vider le champ de recherche de client (gris discret, jamais rouge) */
.client-combo input{ padding-right:2rem; }
.client-combo-clear{
  position:absolute; top:50%; right:8px; transform:translateY(-50%);
  border:none; background:transparent; color:var(--muted);
  padding:4px 6px; line-height:1; cursor:pointer; font-size:.8rem; border-radius:6px;
}
.client-combo-clear:hover{ color:var(--ink); background:var(--brand-soft); }

/* ✕ « effacer » DANS le champ de recherche de liste (950, décision d'Annie). Le champ garde
   toujours sa bordure et ses coins arrondis ; le ✕ se place par-dessus, à droite, à l'intérieur.
   Aucune dépendance à :has(). Avant le 950, la règle qui rendait bordure et coins au champ (946,
   avec :has()) était moins prioritaire que celle de Bootstrap pour les éléments d'un groupe
   (0,5,0 contre 0,6,0) : coins carrés, et bordure droite absente dans Safari sur iPhone.
   Garde-fou : test_950.RechercheNavigateurTests (Chromium et WebKit, 390 et 360 px, 0 px). */
.search-group{ position:relative; }
.search-group > .form-control{ padding-right:2.4rem; }
.input-group.search-group.recherche-live > .form-control.form-control.form-control{
  border-top-right-radius:var(--bs-border-radius); border-bottom-right-radius:var(--bs-border-radius);
}
.search-group .search-clear{
  position:absolute; top:50%; right:.4rem; transform:translateY(-50%); z-index:6;
  display:flex; align-items:center; justify-content:center; width:1.8rem; height:1.8rem; padding:0; margin:0;
  cursor:pointer; background:transparent; color:var(--muted); font-size:.8rem; border:0; border-radius:50%;
}
.search-group .search-clear:hover{ color:var(--ink); background:var(--surface); }
.search-group .search-clear[hidden]{ display:none; }
/* Sans la recherche en direct (sans JS), le ✕ n'a pas d'effet : il reste caché. */
.search-group:not(.recherche-live) .search-clear{ display:none; }


/* Badge « Programmée » : un brouillon en attente d'envoi automatique */
.badge-status.badge-programme{ background:var(--statut-programme-fond); color:var(--statut-programme-texte); }

/* ── Barre publique : liens Métiers / Blogue ──────────────────────────────
   Ajoutés pour le maillage interne (le blogue n'était lié nulle part depuis
   l'accueil). Masqués sous 576 px : sur un petit écran, le wordmark et le
   bouton « Se connecter » doivent rester lisibles — les liens restent
   atteignables par le pied de page. */
.lp-nav-link{
  color:var(--ink); text-decoration:none; font-size:.9375rem; font-weight:500;
  padding:.25rem 0; transition:color .12s;
}
.lp-nav-link:hover{ color:var(--brand-dark); }
.lp-nav-link.is-actif{ color:var(--brand-dark); font-weight:700; }
@media (max-width:991.98px){ .lp-nav-link{ display:none; } }

/* ── Page Métiers (/logiciel-facturation/) ────────────────────────────────
   Même largeur de lecture et même typographie que les calculateurs et le
   blogue : les trois pages publiques doivent se ressembler au pixel près. */
.metiers-wrap{ max-width:760px; }
.metiers-fil{ font-size:.8125rem; color:var(--muted); margin-bottom:1rem; }
.metiers-fil a{ color:var(--muted); text-decoration:none; }
.metiers-fil a:hover{ color:var(--brand-dark); }
.metiers-fil span{ margin:0 .35rem; }
.metiers-h1{ font-size:2rem; line-height:1.25; margin-bottom:1rem; }
.metiers-intro{ color:var(--prose); line-height:1.65; font-size:1.05rem; }
/* 840 : bouton d'inscription (hero et bas de page), même style que l'accueil. */
.metiers-cta{ margin:1.25rem 0 .25rem; }

/* Sommaire en pastilles : l'équivalent du menu déroulant, sans JavaScript. */
.metiers-sommaire{
  background:#FFF9E8; border:1px solid var(--line); border-radius:16px;
  padding:20px; margin-top:2rem;
}
.metiers-sommaire-label{
  font-size:.6875rem; letter-spacing:.08em; color:var(--muted);
  font-weight:600; margin-bottom:.75rem;
}
/* Même grille régulière que la bande de l'accueil : 8 pastilles en flex-wrap
   produisaient 7 + 1 orpheline. Cible d'au moins 44 px au doigt. */
.metiers-sommaire .pastilles{
  display:grid; grid-template-columns:repeat(4,minmax(0,1fr)); gap:.6rem;
}
.metiers-sommaire .pastille{
  flex-direction:column; gap:.45rem; padding:.9rem .5rem; min-height:74px;
  border-radius:12px; text-align:center;
  transition:background-color .12s, color .12s, border-color .12s, transform .12s, box-shadow .12s;
}
.metiers-sommaire .pastille i{ font-size:1.45rem; color:var(--brand); line-height:1; }
.metiers-sommaire .pastille span{ font-size:.85rem; }
/* 830 : texte du survol en --brand-dark (4,61:1 sur --brand-soft) ; #00BE65 donnait 2,22:1. */
.metiers-sommaire .pastille:hover{
  border-color:var(--brand); color:var(--brand-dark); background:var(--brand-soft);
  transform:translateY(-2px); box-shadow:0 4px 12px rgba(0,0,0,.06);
}
@media (max-width:767.98px){
  .metiers-sommaire .pastilles{ grid-template-columns:repeat(2,minmax(0,1fr)); }
}
@media (max-width:575.98px){
  .metiers-sommaire .pastille{ font-size:.8rem; padding:.55rem .4rem; }
}

.metiers-sec h2{
  font-family:'Plus Jakarta Sans',sans-serif; font-weight:800; font-size:1.35rem;
  margin-top:2.6rem; margin-bottom:.6rem; color:var(--ink);
}
.metiers-sec p{ color:var(--prose); line-height:1.65; }
.metiers-besoin{
  display:inline-flex; align-items:center; gap:.4rem;
  background:#fff; border:1px solid var(--line); color:#0E1B14;
  border-radius:999px; padding:.3rem .85rem; font-size:.8125rem; font-weight:600;
  margin-bottom:.85rem;
}
.metiers-besoin i{ color:var(--brand); }
.metiers-liste{
  list-style:none; padding:0; margin:.9rem 0 0;
  display:flex; flex-wrap:wrap; gap:.4rem;
}
.metiers-liste li{
  border:1px solid var(--line); border-radius:8px; background:#FFF9E8;
  padding:.3rem .7rem; font-size:.8125rem; color:var(--muted);
}
/* Pages dédiées : cartes cliquables (icône + titre), pour mettre en valeur le renvoi. */
.metiers-cartes{ margin:1.3rem 0 0; }
.metiers-cartes-label{
  display:block; font-size:.6875rem; letter-spacing:.08em; text-transform:uppercase;
  color:var(--muted); font-weight:700; margin-bottom:.6rem;
}
.metiers-cartes-grille{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); gap:.65rem;
}
.metiers-carte{
  display:flex; align-items:center; gap:.7rem;
  border:1px solid var(--line); border-radius:12px; background:#fff;
  padding:.7rem .85rem; text-decoration:none;
  transition:border-color .15s ease, box-shadow .15s ease, transform .15s ease;
}
.metiers-carte:hover{
  border-color:var(--brand); background:var(--brand-soft);
  transform:translateY(-2px); box-shadow:0 4px 12px rgba(0,0,0,.06);
}
.metiers-carte-ico{
  flex:none; width:38px; height:38px; border-radius:10px;
  background:var(--brand-soft); color:var(--brand);
  display:flex; align-items:center; justify-content:center; font-size:1.2rem;
}
.metiers-carte:hover .metiers-carte-ico{ background:#fff; }
.metiers-carte-txt{ display:flex; flex-direction:column; line-height:1.25; min-width:0; }
.metiers-carte-titre{ font-weight:700; color:var(--ink); font-size:.95rem; }
.metiers-carte-sous{ font-size:.75rem; color:var(--muted); font-weight:500; }
.metiers-carte-fleche{
  margin-left:auto; color:var(--muted); font-size:1rem; flex:none;
  transition:color .15s ease, transform .15s ease;
}
.metiers-carte:hover .metiers-carte-fleche{ color:var(--brand); transform:translateX(2px); }
/* Décale l'ancre sous la barre pour que le H2 ne soit pas collé en haut. */
.metiers-sec[id]{ scroll-margin-top:1.5rem; }

/* Clic sur une carte de métier : la section visée s'illumine brièvement.
   Pur CSS via :target — aucun JavaScript, aucun contenu caché (SEO intact). */
html{ scroll-behavior:smooth; }
.metiers-sec:target{ animation:metier-flash 1.8s ease-out 1; border-radius:12px; }
@keyframes metier-flash{
  0%{ background:var(--brand-soft); }
  100%{ background:transparent; }
}
@media (prefers-reduced-motion:reduce){
  html{ scroll-behavior:auto; }
  .metiers-sec:target{ animation:none; }
}


/* ── Accueil : zone rédactionnelle, métiers, FAQ ──────────────────────────
   Même largeur de lecture (760 px) et même typographie que les calculateurs,
   le blogue et la page Métiers : les pages publiques se ressemblent partout. */
.prose-wrap{ max-width:760px; }
.lp-prose{ background:#fff; }
.lp-prose p{ color:var(--prose); line-height:1.65; }
.lp-prose a{ color:var(--brand-dark); font-weight:600; }

/* ── Section rédactionnelle en deux colonnes (option D, 2026-08-14) ──────────
   Colonne de gauche collante pendant le défilement du corps : le lecteur garde
   le contexte de la section sous les yeux. Remplace un bloc unique centré, qui
   se lisait comme un article plutôt que comme une page produit.
   Le sticky ne tient QUE si aucun parent ne porte overflow:hidden — d'où la
   grille dédiée plutôt qu'un .row Bootstrap. */
.prose-grid{
  display:grid; grid-template-columns:minmax(200px,270px) 1fr; gap:3rem;
  max-width:1040px; margin:0 auto;
}
.prose-aside{ position:sticky; top:2rem; align-self:start; }
.prose-kicker{
  font-size:.7rem; letter-spacing:.09em; text-transform:uppercase;
  color:var(--brand-dark); font-weight:700; margin:0 0 .5rem;
}
.lp-prose .prose-aside h2{
  font-family:'Plus Jakarta Sans',sans-serif; font-weight:800;
  font-size:1.5rem; line-height:1.2; margin:0; color:var(--ink);
}
.prose-accroche{ font-size:.9rem; margin:.75rem 0 0; }
.prose-bloc{ padding-bottom:1.9rem; margin-bottom:1.9rem; border-bottom:1px solid var(--line); }
.prose-bloc:last-child{ padding-bottom:0; margin-bottom:0; border-bottom:0; }
.lp-prose .prose-bloc h3{
  font-family:'Plus Jakarta Sans',sans-serif; font-weight:800; font-size:1.15rem;
  margin:0 0 .55rem; color:var(--ink);
}
.lp-prose .prose-bloc p:last-child{ margin-bottom:0; }
/* Sous 900 px : une seule colonne, la gauche redevient un en-tête ordinaire.
   `position:static` désamorce le sticky, qui n'a aucun sens empilé. */
@media (max-width:899.98px){
  .prose-grid{ grid-template-columns:1fr; gap:1.75rem; max-width:760px; }
  .prose-aside{ position:static; }
  .lp-prose .prose-aside h2{ font-size:1.35rem; }
}

/* ── Bande « métiers » (options E + D, 2026-08-14) ───────────────────────────
   Fond = var(--ink), l'encre déjà utilisée par tous les titres : aucune couleur
   nouvelle. Le gris #f7f9f8 précédent se confondait avec les cartes de
   fonctionnalités qui suivent — trois valeurs proches à la file.
   Filigrane de points en radial-gradient répété : aucune image à télécharger,
   donc aucun poids ajouté à la page. Opacité volontairement basse (10 %) : la
   texture doit se deviner, pas se voir. */
.lp-metiers{
  background-color:var(--ink);
  background-image:radial-gradient(rgba(255,255,255,.05) 1px, transparent 1px);
  background-size:26px 26px;
  background-position:0 0;
  /* Section plus aérée : plus de respiration haut/bas (option 1). */
  padding-top:4.5rem!important; padding-bottom:4.5rem!important;
}
.lp-metiers h2{
  font-family:'Plus Jakarta Sans',sans-serif; font-weight:800;
  font-size:1.45rem; text-align:center; color:#fff; margin:0 0 .4rem;
}
.lp-metiers-aide{
  text-align:center; font-size:.92rem; color:rgba(255,255,255,.72); margin:0 0 2.4rem;
}

/* Grille régulière plutôt qu'un flex-wrap : avec 8 sections, le retour à la
   ligne automatique produisait 7 + 1, une pastille orpheline centrée. Les
   paliers ne retiennent que des diviseurs de 8 (4, 2) pour que chaque ligne
   soit toujours pleine. Un test refuse que le nombre de sections cesse d'être
   un multiple de 4. */
.lp-metiers .pastilles{
  display:grid; grid-template-columns:repeat(4,minmax(0,1fr));
  gap:1rem; max-width:56rem; margin:0 auto;
}
.lp-metiers .pastille{
  padding:.85rem 1.4rem; background:transparent;
  border-color:rgba(255,255,255,.28); color:rgba(255,255,255,.92);
  justify-content:center; text-align:center;
}
.lp-metiers .pastille:hover{
  border-color:var(--brand); color:var(--brand); background:rgba(0,190,101,.12);
}
.lp-metiers-pme{
  text-align:center; font-size:.85rem; color:rgba(255,255,255,.72); margin:2.4rem 0 0;
}
.lp-metiers-pme a{ color:var(--brand); font-weight:600; }
.lp-metiers-pme a:hover{ color:#fff; }
/* 2 colonnes sous 768 px : 4 lignes pleines, jamais d'orpheline. */
@media (max-width:767.98px){
  .lp-metiers .pastilles{ grid-template-columns:repeat(2,minmax(0,1fr)); gap:.6rem; }
}
@media (max-width:575.98px){
  .lp-metiers h2{ font-size:1.2rem; }
  .lp-metiers .pastille{ font-size:.8rem; padding:.6rem .5rem; }
}

.lp-faq{ background:#fff; }
.lp-faq h2{ font-family:'Plus Jakarta Sans',sans-serif; font-weight:800; font-size:1.35rem; color:var(--ink); }
.faq-plus{ margin-top:1.25rem; text-align:center; }
.faq-plus a{ color:var(--ink); font-weight:600; text-decoration:none; }
@media (hover:hover){ .faq-plus a:hover{text-decoration:underline; } }   /* 961 : soulignement au survol, souris seulement */

/* ── Lignes de facture : lisibilité de la saisie ──────────────────────────
   Point 1 — champs nombre sans flèches (▲▼) : elles volaient la place des
   chiffres (« 36 » apparaissait coupé). On garde la saisie au clavier. */
#linesTable input[type=number]{ -moz-appearance:textfield; appearance:textfield; }
#linesTable input[type=number]::-webkit-outer-spin-button,
#linesTable input[type=number]::-webkit-inner-spin-button{ -webkit-appearance:none; margin:0; }

/* Rabais (TOUTES tailles d'écran) : brut barré empilé AU-DESSUS du net, pour
   éviter que les deux nombres se collent (ex. « 42,157,15 »). Règle GLOBALE —
   surtout pas à l'intérieur d'un @media, sinon inactive sur desktop. */
#linesTable tr.line-row td.line-amount .disc-wrap{ display:inline-flex; flex-direction:row; align-items:baseline; gap:6px; justify-content:flex-end; }
#linesTable tr.line-row td.line-amount .line-gross{ color:#98a29b; text-decoration:line-through; font-weight:500; font-size:.85em; }

/* Point 5 — sous 768 px, chaque ligne devient une carte étiquetée : plus
   rien de serré, on ne dépend plus du défilement horizontal du tableau.
   Sur grand écran, le tableau reste identique. */
@media (max-width:767.98px){
  #linesTable{ min-width:0 !important; }
  #linesTable thead{ display:none; }
  #linesTable, #linesTable tbody{ display:block; }
  #linesTable tr.line-row{
    display:block; background:#fff;
    border:1px solid var(--line); border-radius:10px;
    padding:10px 12px; margin-bottom:12px;
  }
  #linesTable tr.line-row td{
    display:flex; align-items:center; justify-content:space-between; gap:12px;
    width:auto !important; border:0; padding:.35rem 0; text-align:left;
  }
  #linesTable tr.line-row td::before{
    content:attr(data-label);
    flex:0 0 auto; font-size:.72rem; font-weight:600; color:var(--muted);
  }
  #linesTable tr.line-row td .form-control,
  #linesTable tr.line-row td .form-select,
  #linesTable tr.line-row td .input-group{ max-width:62%; }
  #linesTable tr.line-row td.line-amount{ font-weight:600; }
  /* Colonne « supprimer » : bouton à droite, sans étiquette. */
  #linesTable tr.line-row td.line-remove{ justify-content:flex-end; }
  #linesTable tr.line-row td.line-remove::before{ content:""; }
}

/* ── Rabais : champ élargi + bascule $/% (remplace le menu déroulant) ──────
   Le nombre prend la largeur disponible ; le type $/% devient deux petits
   boutons. La valeur envoyée au serveur (champ caché .line-disctype) reste
   « amount » ou « percent » — aucun changement côté données. */
.rabais-group{ display:flex; align-items:center; gap:6px; }
.rabais-group .line-discount{ flex:1 1 auto; min-width:0; text-align:right; }
.disctype-seg{ display:inline-flex; flex:0 0 auto; border:1px solid var(--line); border-radius:6px; overflow:hidden; }
.disctype-btn{ border:0; background:#fff; color:var(--muted); font-size:.85rem; line-height:1.2; padding:6px 10px; cursor:pointer; }
.disctype-btn + .disctype-btn{ border-left:1px solid var(--line); }
.disctype-btn.is-active{ background:var(--brand); color:var(--sur-vert); font-weight:600; }

/* ── Bas de carte de ligne sur petit écran (option 1) ─────────────────────── */
@media (max-width:767.98px){
  /* Le champ rabais (nombre + bascule) occupe la portion droite, comme les autres. */
  #linesTable tr.line-row td .rabais-group{ max-width:62%; }

  /* Non taxable : la case à cocher devient un interrupteur clair. */
  #linesTable tr.line-row td .notax-toggle{
    -webkit-appearance:none; appearance:none; position:relative; flex:0 0 auto;
    width:42px; height:24px; border-radius:999px; background:var(--line);
    border:0; cursor:pointer; transition:background-color .15s;
  }
  #linesTable tr.line-row td .notax-toggle::after{
    content:""; position:absolute; top:2px; left:2px; width:20px; height:20px;
    border-radius:50%; background:#fff; transition:left .15s;
  }
  #linesTable tr.line-row td .notax-toggle:checked{ background:var(--brand); }
  #linesTable tr.line-row td .notax-toggle:checked::after{ left:20px; }

  /* Montant : bloc mis en évidence (point focal de la carte). */
  #linesTable tr.line-row td.line-amount{
    background:var(--brand-soft); border-radius:8px; padding:10px 12px;
    font-size:1.05rem; font-weight:600; color:var(--brand-dark); margin-top:4px;
  }

  /* Supprimer : bouton pleine largeur avec libellé (au lieu du « × » isolé). */
  #linesTable tr.line-row td.line-remove{ display:block; }
  #linesTable tr.line-row td.line-remove .removeLine{
    display:block; width:100%; font-size:0; text-decoration:none;
    border:1px solid #f5c6cb; border-radius:8px; padding:11.5px !important; margin-top:8px;
  }
  #linesTable tr.line-row td.line-remove .removeLine::after{
    content:"Supprimer la ligne"; font-size:.82rem;
  }
}

/* ── Ajustements mobile (ligne de facture) ────────────────────────────────
   Non taxable : l'interrupteur s'aligne sur le bord gauche des champs du
   dessus (colonne 62 %). Supprimer : rouge plein au survol. */
@media (max-width:767.98px){
  #linesTable tr.line-row td .notax-wrap{
    width:62%; flex:0 0 62%; display:flex; justify-content:flex-start;
  }
  #linesTable tr.line-row td.line-remove .removeLine:hover,
  #linesTable tr.line-row td.line-remove .removeLine:focus{
    background:#e24b4a; border-color:#e24b4a; color:#fff;
  }
  #linesTable tr.line-row td.line-remove .removeLine:hover::after,
  #linesTable tr.line-row td.line-remove .removeLine:focus::after{ color:#fff; }
}


/* ===== Articles de blog =====================================================
   Auparavant en <style> inline dans blog/base_article.html — centralisé ici
   pour éviter les retouches « à l'unité ». Les fonds teintés suivent la charte :
   callout = beige #FFF9E8, en-tête de tableau = blanc. */
.blog-wrap{
  max-width:760px;
  --espace-ariane-surtitre:35px;   /* fil d'Ariane -> « BLOGUE MAFACTURE » */
  --espace-surtitre-titre:50px;    /* surtitre -> titre de l'article */
}
.blog-breadcrumb{ margin-bottom:var(--espace-ariane-surtitre); }
.blog-breadcrumb .breadcrumb{ margin-bottom:0; }
.blog-eyebrow{ color:#037F45; font-weight:700; font-size:.82rem; letter-spacing:.08em;
  text-transform:uppercase; margin-bottom:var(--espace-surtitre-titre); }
.blog-meta{ color:#6b7a71; font-size:.9rem; }
article.blog-body h2{ font-family:'Plus Jakarta Sans',sans-serif; font-weight:800;
  font-size:1.45rem; margin-top:2.4rem; margin-bottom:.7rem; color:#0E1B14; }
article.blog-body h3{ font-family:'Plus Jakarta Sans',sans-serif; font-weight:700;
  font-size:1.12rem; margin-top:1.6rem; margin-bottom:.5rem; color:#0E1B14; }
article.blog-body p, article.blog-body li{ color:#3a463f; line-height:1.7; font-size:1.02rem; }
article.blog-body figure{ margin:1.8rem 0; }
article.blog-body figure svg{ width:100%; height:auto; display:block;
  border:1px solid #e7ece8; border-radius:14px; background:#fff; }
article.blog-body figcaption{ color:#6b7a71; font-size:.85rem; margin-top:.5rem; text-align:center; }
article.blog-body img.blog-img{ width:100%; height:auto; border:1px solid #e7ece8; border-radius:14px; }
.blog-callout{ background:#FFF9E8; border:1px solid #F0E6C8; border-radius:14px; padding:18px 20px; margin:1.6rem 0; }
.blog-callout p:last-child{ margin-bottom:0; }
article.blog-body blockquote{ margin:1.6rem 0; padding:.25rem 0 .25rem 1.25rem;
  border-left:3px solid #bfe9d4; color:#3a463f; }
article.blog-body blockquote p:last-child{ margin-bottom:0; }
.blog-table{ width:100%; border-collapse:collapse; margin:1.2rem 0; font-size:.98rem; }
.blog-table th, .blog-table td{ border:1px solid #e7ece8; padding:10px 12px; text-align:left; color:#3a463f; }
.blog-table th{ background:#fff; color:#0E1B14; font-weight:700; }
/* 924 (go d'Annie, 28 oct. 2026) : au téléphone (640 px et moins), chaque rangée d'un tableau du
   blogue devient un encadré : la 1re case en titre (gras), puis une ligne par colonne avec le nom
   de la colonne à gauche (data-label, copie exacte de l'en-tête) et la valeur à droite. Aucun mot
   ne change ; rien ne glisse de côté. Au bureau, le tableau garde ses colonnes. Comparatifs
   « mafacture vs » : le nom « mafacture » en vert foncé, les autres en gris. */
@media (max-width:640px){
  .blog-table, .blog-table tbody, .blog-table tr, .blog-table td{ display:block; width:100%; }
  .blog-table thead, .blog-table tr:has(> th){ display:none; }
  .blog-table tr{ border:1px solid var(--line); border-radius:12px; padding:12px 14px; margin:0 0 10px; background:#fff; }
  .blog-table td{ border:0; padding:3px 0; display:flex; justify-content:space-between; gap:12px; text-align:right; }
  .blog-table td::before{ content:attr(data-label); color:var(--muted); text-align:left; flex:none; max-width:45%; }
  .blog-table td:first-child{ display:block; text-align:left; font-weight:700; color:var(--ink); padding-bottom:6px; }
  .blog-table td:first-child::before{ content:none; }
  .blog-table--comparatif td[data-label="mafacture"]::before{ color:var(--brand-dark); }
}
.blog-related .card{ border:1px solid #e7ece8; border-radius:14px; height:100%; }
.blog-related a{ text-decoration:none; }
.breadcrumb a{ color:#037F45; text-decoration:none; }


/* ===== CTA d'article (hero haut + bloc bas encre) ===== */
.blog-hero-cta{ display:flex; align-items:center; gap:1rem; flex-wrap:wrap;
  background:var(--ink); border:0; border-radius:14px; padding:1rem 1.3rem; margin:0 0 2rem; }
.blog-hero-cta .bh-txt{ flex:1 1 260px; }
.blog-hero-cta .bh-kicker{ font-size:.7rem; letter-spacing:.06em; text-transform:uppercase;
  font-weight:800; color:#fff; display:inline-flex; align-items:center; gap:.4rem; margin:0 0 .25rem; }
.blog-hero-cta .bh-kicker .dot{ width:.6rem; height:.6rem; border-radius:50%; background:var(--brand); display:inline-block; }
.blog-hero-cta .bh-title{ font-family:'Plus Jakarta Sans',sans-serif; font-weight:800;
  font-size:1.08rem; line-height:1.2; margin:0; color:#fff; }
.blog-hero-cta .bh-title span{ color:var(--brand); }
.blog-hero-cta .bh-sub{ color:#c9d2cc; margin:.15rem 0 0; font-size:.9rem; }
.blog-hero-cta .bh-footer{ flex-basis:100%; border-top:1px solid rgba(255,255,255,.15);
  margin:.7rem 0 0; padding-top:.55rem; text-align:center; color:#9fb0a8; font-size:.78rem; }
.blog-hero-cta .bh-btn{ flex:none; display:inline-flex; align-items:center; gap:.5rem; background:var(--brand);
  color:var(--sur-vert); font-weight:700; border-radius:8px; padding:.68rem 1.25rem; text-decoration:none;
  box-shadow:0 6px 16px rgba(0,190,101,.28); white-space:nowrap; }
/* 830 : texte --ink sur le vert (blanc = 2,45:1, échec axe), comme .btn-primary ; le
   survol garde blanc sur --brand-dark (5,09:1). */
.blog-hero-cta .bh-btn:hover{ background:var(--brand-dark); color:#fff; }

/* ── Mobile : héro centré + sous-titre masqué, logos de paiement centrés ── */
/* Modes de paiement : centrés sur tous les viewports */
.lp-pay-title{ text-align:center; }
.lp-pay-logos{ justify-content:center; }
@media (max-width:575.98px){
  .blog-hero-cta{ text-align:center; }
  .blog-hero-cta .bh-txt{ flex-basis:100%; }
  .blog-hero-cta .bh-kicker{ justify-content:center; }
  .blog-hero-cta .bh-sub{ display:none; }
  .blog-hero-cta .bh-btn{ display:flex; width:100%; justify-content:center; }
}

.calc-cta.cta-ink{ background:var(--ink); border:0; color:#fff; }
.calc-cta.cta-beige{ background:#FFF9E8; border-color:#E8E2CC; }
.cta-ink .cta-ink-title{ font-family:'Plus Jakarta Sans',sans-serif; font-weight:800;
  font-size:1.4rem; color:#fff; margin:0 0 .2rem; }
.cta-ink .cta-chips{ display:flex; gap:.5rem; justify-content:center; flex-wrap:wrap; margin:.9rem 0 1.1rem; }
.cta-ink .cta-chip{ display:inline-flex; align-items:center; gap:.35rem; font-size:.82rem; font-weight:600;
  padding:.3rem .7rem; border-radius:999px; background:rgba(255,255,255,.08);
  border:1px solid rgba(255,255,255,.18); color:#fff; }
.cta-ink .cta-chip i{ color:var(--brand); }
.cta-ink .cta-ink-price{ color:#c9d2cc; font-size:.85rem; margin:.7rem 0 0; }

/* ── Pagination (chevrons + numéros de page) : partagée par toutes les listes ── */
.pager-bar{ display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:.5rem; }
.pager{ display:flex; align-items:center; gap:6px; }
.pager-arrow, .pager-num{ min-width:32px; height:32px; display:inline-flex; align-items:center; justify-content:center; padding:0 9px; border:1px solid var(--line); border-radius:8px; font-size:13px; color:var(--ink); text-decoration:none; background:#fff; }
.pager-arrow:hover, .pager-num:hover{ border-color:#c7cdc9; background:#f6f8f7; }
.pager-num.is-active{ background:var(--brand); border-color:var(--brand); color:var(--sur-vert); font-weight:600; }
.pager-arrow.is-disabled{ color:#c2c8c4; background:#fafbfa; cursor:default; }
.pager-gap{ padding:0 2px; color:var(--muted); font-size:13px; }

/* Un menu « … » ouvert dans un tableau court (ex. Fournisseurs à une seule ligne)
   ne doit pas être rogné par l'overflow du conteneur .table-responsive. On rouvre
   le débordement uniquement pendant qu'un menu est affiché : le défilement
   horizontal normal reste intact le reste du temps. */
.table-responsive:has(.dropdown-menu.show){ overflow: visible; }

/* Bouton « … » d'actions en en-tête de page : taille unique pour toutes les vues
   (détail, liste, formulaires d'édition). Pilotée ici une seule fois via les
   variables Bootstrap — plus aucune dérive possible d'une vue à l'autre. Les menus
   « … » DANS une ligne de tableau gardent, eux, .btn-sm (contexte plus discret). */
.btn-actions{
  --bs-btn-padding-x:.6rem;
  --bs-btn-padding-y:.375rem;
  --bs-btn-font-size:1rem;
  --bs-btn-line-height:1.25;
}

/* ===== Composant de récurrence (cartes Ponctuelle/Récurrente) ===== */
.rec-tile{ flex:1; border:2px solid var(--line); border-radius:12px; padding:14px 12px;
  text-align:center; cursor:pointer; background:#fff; transition:border-color .15s, background .15s; }
.rec-tile:hover{ border-color:#cfd6d2; }
.rec-tile.active{ border-color:var(--brand); background:var(--brand-soft); }
.rec-tile .rec-ic{ font-size:1.5rem; display:block; line-height:1; }
.rec-tile .rec-t{ display:block; font-weight:700; margin-top:5px; color:var(--ink); }
.rec-tile .rec-d{ display:block; font-size:.78rem; color:var(--muted); }
.rec-panel{ border-top:1px solid var(--line); padding-top:14px; margin-top:4px; }

/* Bascule Avant taxes / Taxes incluses (formulaire de dépense) : composant .choix-seg (941). */
.champ-calcule{ background:#F3F5F4 !important; color:var(--muted); }
/* Champ actif de la bascule taxes (#4) : celui que l'usager remplit, encadré en vert. */
.champ-actif{ border-color:var(--brand) !important; box-shadow:0 0 0 .18rem rgba(0,190,101,.18) !important; }

/* ── Champs date : largeur plafonnée (une date a une largeur fixe) + un peu d'air ── */
input[type="date"]{ max-width: 14rem; }

/* ── Cartes de liste sur mobile (le tableau passe en cartes sous lg) ── */
.mcard{background:#fff;border:1px solid var(--line);border-radius:14px;padding:14px;margin-bottom:10px;transition:background .15s,border-color .15s,box-shadow .15s}
/* Tactile : le retour visuel se fait au tap (:active), pas au survol (absent sur mobile). */
.mcard:active{background:#EFF6F1;border-color:#CFE7D8}
.mcard:hover,.mcard:focus-visible{background:#F6FAF7;border-color:#CFE7D8;box-shadow:0 2px 10px rgba(0,0,0,.05)}
.mcard{-webkit-tap-highlight-color:transparent}
.mcard-title{font-weight:700;color:var(--brand-dark)}
@media (hover:hover){ .mcard.text-reset:hover .mcard-title{text-decoration:underline } }   /* 961 : soulignement au survol, souris seulement */
.mcard-r1{display:flex;align-items:center;justify-content:space-between;gap:8px}
.mcard-sub{font-size:.9rem;margin-top:2px}
.mcard-r2{display:flex;align-items:baseline;justify-content:space-between;margin-top:10px;gap:8px}
.mcard-meta{font-size:.82rem;color:var(--muted)}
.mcard-amt{font-size:1.02rem;font-weight:700;white-space:nowrap}
.mcard-chip{display:inline-flex;align-items:center;padding:2px 10px;border-radius:999px;font-size:.74rem;font-weight:600}

/* ── Barre de poids sous un libellé (ex. part d'une catégorie) ── */
.wbar{height:6px;border-radius:4px;background:#EEF1EE;overflow:hidden;margin-top:7px;max-width:220px}
.wbar>span{display:block;height:100%;background:var(--brand,#00BE65)}
.wpct{font-size:.72rem;color:var(--muted);margin-top:3px}

/* ── Pastilles (KPI) cliquables : toute la carte est un lien, chevron « › » discret.
   Retour tactile au tap (:active) en plus du survol (desktop). ── */
a.kpi{ text-decoration:none; display:block; color:inherit; }
a.kpi:hover, a.kpi:focus, a.kpi:hover *, a.kpi:focus *{ text-decoration:none !important; }   /* 884 */
/* 829 — Mise en page des cartes KPI.
   (1) Chiffre ancré en BAS de la carte : carte et contenu en colonne flex, valeur en
       margin-top:auto. Un titre sur 2 lignes ne décale plus le chiffre de sa rangée.
       a.kpi doit être flex (le display:block ci-dessus annulait le flex de .card).
   (2) Le titre laisse la place du chevron › (il passait dessous à largeur moyenne).
   (3) Rangée de 4 KPI (.kpi-rangee, tableau de bord) : container query → 2 × 2 dès que
       chaque carte ferait < ~220 px. Carte ≈ rangée/4 − 16 px de gouttière, donc seuil à
       944 px de rangée. Les 3 KPI de la liste des factures n'ont PAS cette classe (choix
       d'Annie : elles ne se brisent pas ; le chiffre ancré suffit). */
a.kpi{ display:flex; flex-direction:column; }
.kpi > .card-body{ display:flex; flex-direction:column; flex:1 1 auto; }
.kpi .kpi-value{ margin-top:auto; }
.kpi .kpi-label{ padding-right:1rem; }
.kpi-rangee{ container-type:inline-size; container-name:kpi-rangee; }
@container kpi-rangee (max-width: 943.98px){
  .kpi-rangee > [class*="col-"]{ flex:0 0 auto; width:50%; }
}
.kpi-link{ cursor:pointer; -webkit-tap-highlight-color:transparent;
  transition:transform .12s, box-shadow .15s; }
.kpi-link:hover{ box-shadow:0 6px 18px rgba(0,0,0,.07); transform:translateY(-1px); }
.kpi-link:active{ transform:translateY(0); box-shadow:0 2px 8px rgba(0,0,0,.08); }
.kpi-link:focus-visible{ outline:2px solid var(--brand); outline-offset:2px; }
.kpi-chevron{ position:absolute; top:12px; right:14px; font-size:1.2rem; line-height:1;
  font-weight:800; opacity:.42; }
.kpi-link:hover .kpi-chevron{ opacity:.85; }
.kpi.kpi-green  .kpi-chevron{ color:var(--brand-dark); }
.kpi.kpi-blue   .kpi-chevron{ color:var(--blue-dark); }
.kpi.kpi-amber  .kpi-chevron{ color:var(--attention); }
.kpi.kpi-danger .kpi-chevron{ color:#B42318; }
.kpi.kpi-violet .kpi-chevron{ color:#6D28D9; }

/* ═══ Barre d'action de formulaire — UNIFORME ═══
   Desktop (≥768px) : « Annuler » texte seul à gauche · action(s) à droite.
   Mobile (<768px)  : barre collante en bas ; « Annuler » garde son CONTOUR (plus visible). */
.form-actions{ display:flex; align-items:center; gap:.5rem; margin-top:1.5rem; }
.form-actions > .form-actions-right{ margin-left:auto; display:flex; align-items:center; gap:.5rem; }
@media (min-width:768px){
  .btn-annuler{ border-color:transparent !important; background:transparent !important; color:var(--muted) !important; box-shadow:none !important; }
  .btn-annuler:focus-visible{ color:var(--ink) !important; background:transparent !important; text-decoration:underline; }
@media (hover:hover){ .btn-annuler:hover{color:var(--ink) !important; background:transparent !important; text-decoration:underline; } }   /* 961 : soulignement au survol, souris seulement */
}
@media (max-width:767.98px){
  .form-actions{ position:fixed; left:0; right:0; bottom:0; margin:0; background:#fff;
    border-top:1px solid var(--line); box-shadow:0 -6px 20px rgba(23,32,26,.06);
    padding:12px 16px calc(12px + env(safe-area-inset-bottom)); gap:10px; z-index:1030; }
  .form-actions > .form-actions-right{ margin-left:0; flex:1; gap:10px; }
  .form-actions .btn{ height:52px; display:inline-flex; align-items:center; justify-content:center; font-size:16px; border-radius:12px; }
  .form-actions .form-actions-right > .btn-primary{ flex:1; }
  /* 930 : bouton vert avec flèche « Plus d'options » (nouveau client) : le groupe prend toute la place aussi. */
  .form-actions .form-actions-right > .btn-group{ flex:1; display:flex; }
  .form-actions .form-actions-right > .btn-group > .btn-primary:first-child{ flex:1 1 auto; }
  .form-actions .form-actions-right > .btn-group > .dropdown-toggle-split{ flex:0 0 auto; }
  /* Réserve l'espace sous la barre collante (évite de masquer le bas du contenu). */
  .page-container:has(.form-actions){ padding-bottom:88px; }
}
/* 926 : barre « en ligne » (Réglages > Mon compte : plusieurs petits formulaires sur la même
   page). Même disposition, mais jamais collée au téléphone : plusieurs barres collées se
   superposeraient. */
.form-actions--inline{ margin-top:1rem; }
@media (max-width:767.98px){
  .form-actions.form-actions--inline{ position:static; margin:12px 0 0; padding:0; background:transparent;
    border-top:0; box-shadow:none; z-index:auto; }
}

/* ======================================================================
   Tableau de données mafacture — un seul balisage, deux rendus.
   Bureau : une colonne « main » élastique, les autres serrées sur leur
   contenu. Mobile (repli par @container, selon la largeur du tableau) :
   la même ligne devient une carte. Couleurs = variables du site.
   ====================================================================== */
.data-table-wrap{
  /* 920 : conteneur NOMMÉ « liste » (bascule en cartes à 900 px). Les tableaux de détail
     (.data-table-wrap--detail) portent le nom « detail » et basculent à 560 px : voir plus bas. */
  /* 961 (Annie) : plus de limite de 1120 px : le tableau suit la limite du contenu (1140 px), comme la recherche et
     les tuiles (écart de 20 px au-delà d'environ 1450 px de fenêtre). */
  container-type:inline-size; container-name:liste;
  background:#fff; border:1px solid var(--line); border-radius:16px;
  /* overflow VISIBLE : depuis la bascule cartes à 900 px, un tableau ne dépasse
     jamais son conteneur, donc le défilement horizontal est inutile — et il coupait
     les menus ⋯ qui débordent sous la dernière ligne. Les coins arrondis sont
     obtenus par border-radius sur les cellules de bord (ci-dessous), pas par overflow. */
  overflow:visible;
}
/* Variante « à ras » : le conteneur est DÉJÀ dans une carte (widget du tableau de
   bord). On retire sa propre carte (bordure, coins, fond, largeur max) pour éviter
   la double bordure et laisser le tableau remplir la carte. container-type intact
   → la bascule vers les cartes à 900 px continue de fonctionner. */
.data-table-wrap--flush{ max-width:none; border:none; border-radius:0; background:transparent; }
/* 832 : la règle :has du 826 qui neutralisait la carte externe en double autour du
   .data-table-wrap est retirée ; la carte a été enlevée des gabarits de listes. */
.data-table{ width:100%; border-collapse:collapse; table-layout:auto; font-size:15px; color:var(--ink); }
.data-table th, .data-table td{
  padding:14px 16px; vertical-align:middle; text-align:left; border-bottom:1px solid var(--line);
}
.data-table th{
  font-size:12px; font-weight:600; letter-spacing:.06em; text-transform:uppercase;
  color:var(--muted); white-space:nowrap;
}
.data-table tbody tr:last-child td{ border-bottom:none; }
.data-table tr.is-inactive{ opacity:.55; }
/* Ligne cliquable : affordance de survol (souris). Perdue à la migration depuis
   l'ancienne table Bootstrap .table-hover ; rétablie ici, en commun (tableau ET
   cartes). SEULEMENT .ligne-cliquable : là où la ligne n'ouvre rien (Catégories),
   pas de survol trompeur. @media (hover:hover) évite le survol « collé » après un
   toucher. #F0F5F2 (et non le fond de la rangée Total) pour ne pas imiter un pied. */
@media (hover:hover){
  .data-table tbody tr.ligne-cliquable{ cursor:pointer; transition:background-color .12s ease; }
  .data-table tbody tr.ligne-cliquable:hover{ background:#F0F5F2; }
}
/* Repère clavier : les lignes cliquables réagissent déjà à Entrée. */
.data-table tbody tr.ligne-cliquable:focus-visible{ outline:2px solid #1F5FEA; outline-offset:-2px; }
/* col-sub : texte secondaire sous le titre (courriel, téléphone, description),
   SANS libellé — un courriel/téléphone/description se reconnaît de lui-même.
   Les liens tel:/mailto: restent discrets (couleur héritée) mais tactiles. */
.data-table .col-sub{ color:#5B6B62; }
.data-table .col-sub a{ color:inherit; text-decoration:none; }
/* clamp-2 : limite à 2 lignes. SUR UN ÉLÉMENT INTÉRIEUR (un <span>), jamais sur le
   <td> : changer le display d'une cellule la fait cesser de se comporter comme une
   cellule (width ignorée, hauteur de rangée faussée). S'applique pareil bureau/mobile. */
.data-table .clamp-2{ display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
@media (hover:hover){ .data-table .col-sub a:hover{ text-decoration:underline; } }

/* === Système .data-table : règles séparées par rendu pour éviter les fuites ===
   Commun aux deux rendus (couleurs, chiffres tabulaires), puis BUREAU dans
   @container (width > 900px) et MOBILE dans @container (width <= 900px).
   Aucune règle « d'annulation » : chaque rendu n'a que ses propres règles, donc
   aucune largeur/espacement du bureau ne peut fuir sur la carte mobile. */

/* Commun : chiffres tabulaires pour les colonnes numériques.
   PAS sur col-date : en Inter, tabular-nums donne au trait d'union la largeur
   d'un chiffre (« 2026 - 11 - 09 »). Les dates ISO font toutes 10 caractères,
   donc sans chiffres tabulaires l'alignement ne perd qu'un ou deux pixels. */
.data-table .col-count, .data-table .col-money, .data-table .col-pct{ font-variant-numeric:tabular-nums; }
.data-table .col-date{ font-variant-numeric:normal; }

/* 867 : par défaut (bureau), le texte réservé à la carte est caché. */
.data-table .seul-carte{ display:none; }

/* Bureau seulement : largeurs, min-widths et espacements du tableau */
@container liste (width > 900px){
  .data-table th:first-child, .data-table td:first-child{ padding-left:20px; }
  /* 867 : seule colonne élastique, avec une largeur minimale qui garde les noms usuels
     sur une ligne (« Gabrielle Thériault », « GAB-0003 · Ava Déziel-Tremblay »). Un nom
     très long passe à la ligne : jamais coupé, jamais de « … », jamais de défilement. */
  .data-table .col-main{ width:auto; min-width:13rem; overflow-wrap:anywhere; }
  .data-table .col-num, .data-table .col-count, .data-table .col-money, .data-table .col-date,
  .data-table .col-status, .data-table .col-actions, .data-table .col-text, .data-table .col-pct,
  .data-table .col-check, .data-table tbody td:not([class*="col-"]){
    width:1%; white-space:nowrap;   /* se serrent sur leur contenu */
  }
  .data-table .col-count, .data-table .col-money, .data-table .col-pct{ text-align:right; }
  .data-table .col-pct, .data-table .col-text{ color:var(--muted); }
  .data-table .col-date, .data-table .col-text{ text-align:left; }
  /* 888 : précision d'un paiement (jusqu'à 100 caractères) : passe à la ligne. */
  .data-table .col-text.col-note{ white-space:normal; min-width:8rem; max-width:16rem; overflow-wrap:anywhere; }
  .data-table .col-count{ min-width:88px; }
  .data-table .col-money{ min-width:128px; }
  .data-table .col-status{ padding-left:32px; }
  .data-table .col-actions{ width:56px; padding:8px 12px; text-align:right; }
  .data-table .col-check{ width:44px; padding:0; text-align:center; }
  /* Téléphone : ne jamais couper « 514 555-0192 » au trait d'union (comme col-num). */
  .data-table .col-phone{ width:1%; white-space:nowrap; }
  /* Description des items (col-sub col-desc) : c'est elle qui a besoin de place, pas le
     Nom. On élargit la CELLULE ; la limite 2 lignes est portée par le <span class="clamp-2">.
     867 : SEULEMENT la description des items. Avant, la règle visait toute cellule col-sub,
     dont le Courriel des clients (45 % de la largeur), et le Nom passait sur deux lignes. */
  .data-table .col-sub.col-desc{ width:45%; }
  /* Coins arrondis par border-radius (overflow conteneur = visible, pour les menus ⋯). */
  .data-table thead th:first-child{ border-top-left-radius:16px; }
  .data-table thead th:last-child{ border-top-right-radius:16px; }
  .data-table tfoot td:first-child{ border-bottom-left-radius:16px; }
  .data-table tfoot td:last-child{ border-bottom-right-radius:16px; }
}

/* Commun : case à cocher, pied, barre d'actions en lot */
.data-table .col-check .form-check-input{ margin:0; cursor:pointer; }
/* ⋯ : supprimer l'anneau de focus Bootstrap (.btn:focus) au CLIC SOURIS ; le garder
   au clavier via :focus-visible (comme les lignes cliquables). */
/* ── Menu ⋯ dans une cellule .data-table : la cellule mobile est une grille et un
   élément de carte ; ses règles (grid-column, text-align) ne doivent PAS déteindre
   sur le menu déroulant, sinon « Supprimer » (dans un <form>) sort de la boîte. ── */
/* Dans une cellule .data-table (grille), on remet les éléments du menu en flux normal. */
.data-table .dropdown-menu, .data-table .dropdown-menu *{ grid-column:auto; text-align:left; }

/* ===== 836 — Menus déroulants : SOURCE UNIQUE pour l'app ET le site public =====
   Tout passe par les variables Bootstrap du dropdown : aucune règle page par page.
   Menu : rayon 12 px, marge intérieure 6 px, bordure 1 px pâle, ombre douce, largeur
   minimale 180 px puis ajustée au texte le plus long (éléments sans retour à la ligne).
   Éléments : ~36 px de haut, rayon 8 px, texte à la taille des tableaux (15 px),
   icônes 16 px ; survol et focus sur fond --menu-survol. Le séparateur reste dans la
   marge intérieure (il n'atteint plus les bords). */
.dropdown-menu{
  --bs-dropdown-min-width:180px;
  --bs-dropdown-padding-x:6px;
  --bs-dropdown-padding-y:6px;
  --bs-dropdown-font-size:15px;
  --bs-dropdown-color:var(--ink);
  --bs-dropdown-border-color:var(--line);
  --bs-dropdown-border-width:1px;
  --bs-dropdown-border-radius:12px;
  --bs-dropdown-inner-border-radius:11px;
  --bs-dropdown-box-shadow:0 8px 24px rgba(14,27,20,.12);
  --bs-dropdown-divider-bg:var(--line);
  --bs-dropdown-divider-margin-y:4px;
  --bs-dropdown-link-color:var(--ink);
  --bs-dropdown-link-hover-color:var(--ink);
  --bs-dropdown-link-hover-bg:var(--menu-survol);
  --bs-dropdown-link-active-color:var(--ink);
  --bs-dropdown-link-active-bg:var(--menu-survol);
  --bs-dropdown-item-padding-x:12px;
  --bs-dropdown-item-padding-y:7.5px;
  --bs-dropdown-item-border-radius:8px;
  --bs-dropdown-header-padding-x:12px;
  box-shadow:var(--bs-dropdown-box-shadow);
}
/* Alignement identique des éléments de menu dans TOUTE l'app : un <a> (Modifier) et
   un <button> dans un <form> (Supprimer, POST) démarrent au même point à gauche et ont
   la même hauteur — sinon le bouton se centre et paraît décalé. Le padding vient des
   variables ci-dessus (plus de valeur en dur ici). */
.dropdown-menu .dropdown-item{
  display:flex;
  align-items:center;
  justify-content:flex-start;
  gap:10px;
  width:100%;
  text-align:left;
  font:inherit;
  line-height:1.4;
  white-space:nowrap;
}
.dropdown-menu .dropdown-item > i.bi{ font-size:16px; line-height:1; width:16px; flex:none; margin-right:0 !important; }
/* Focus CLAVIER d'un élément : contour --brand-dark (≥ 4,5:1 sur blanc et sur les fonds
   de survol), en plus du fond pâle. Jamais au survol de la souris. */
.dropdown-menu .dropdown-item:focus-visible{ outline:2px solid var(--brand-dark); outline-offset:-2px; }
/* Action destructive : rouge #C93332 (au lieu du #DC3545 de Bootstrap), fond rouge très
   pâle au survol/focus. !important : .text-danger de Bootstrap en porte un. */
.dropdown-menu .dropdown-item.text-danger{ color:var(--menu-danger) !important; }
.dropdown-menu .dropdown-item.text-danger:hover,
.dropdown-menu .dropdown-item.text-danger:focus{ background-color:var(--menu-danger-survol); }
/* Téléphone / écran tactile : zone de toucher d'au moins 40 px de haut. */
@media (max-width:991.98px), (pointer:coarse){
  .dropdown-menu .dropdown-item{ min-height:40px; }
}
/* Bouton « ··· » (et tout bouton secondaire qui ouvre un menu) : menu OUVERT = fond gris
   pâle, plus de noir. Contour de focus seulement au CLAVIER (:focus-visible), jamais au
   clic de souris. */
.btn-outline-secondary[data-bs-toggle="dropdown"]{
  --bs-btn-active-bg:var(--menu-survol);
  --bs-btn-active-color:var(--ink);
  --bs-btn-active-border-color:var(--line-strong);
}
.btn[data-bs-toggle="dropdown"]:focus:not(:focus-visible){ outline:none; box-shadow:none; }
.btn[data-bs-toggle="dropdown"]:focus-visible{ outline:2px solid var(--brand-dark); outline-offset:2px; box-shadow:none; }
.dropdown-menu button.dropdown-item{
  border:none;
  background:transparent;
}
.dropdown-menu form{ margin:0; }
/* ⋯ : aucun anneau au clic/ouverture SOURIS (box-shadow, outline, bordure bleue) ;
   le repère clavier reste via :focus-visible — SAUF quand le menu est ouvert (.show),
   où l'on neutralise tout anneau (le menu déroulant signale déjà l'état). */
.data-table .col-actions [data-bs-toggle="dropdown"]:focus-visible{ outline:2px solid var(--brand-dark); outline-offset:2px; }
.data-table .col-actions [data-bs-toggle="dropdown"]:focus:not(:focus-visible),
.data-table .col-actions [data-bs-toggle="dropdown"]:active{ outline:none; box-shadow:none; border-color:var(--brand); }   /* 936 : contour vert (règle d'Annie) */
.data-table .col-actions [data-bs-toggle="dropdown"].show{ outline:none; box-shadow:none; border-color:var(--brand); }
.data-table tfoot tr{ background:var(--surface); }
.data-table tfoot td{ font-weight:700; background:none; border:none; }
@media (max-width:991.98px){ #bulkBar{ display:none !important; } }

/* Mobile seulement : la grille des cartes (selon la largeur DU TABLEAU : menu, modale…) */
/* 960 : au téléphone, la période des Dépenses suit la carte des totaux au même espace que les autres blocs (16 px,
   le mb-3 des totaux) ; les 50 px d'écart restent au bureau et dans Rapports et Paiements. */
/* 960 (règle d'Annie) : l'air entre les tuiles et les filtres (période, onglets) est de 50 px au bureau et sur iPad,
   16 px sous 768 px (les tuiles y sont empilées), comme entre les autres blocs. Factures, Paiements, Rapports, Dépenses. */
.air-haut{ margin-top:50px; }
@media (max-width:767.98px){ .air-haut{ margin-top:16px; } }   /* même seuil que les tuiles (col-md-4) */
@container liste (width <= 900px){
  .data-table thead{ display:none; }
  .data-table, .data-table tbody, .data-table tfoot{ display:block; }
  .data-table tr{
    display:grid;
    /* 943 : la 2e colonne (catégorie, numéro…) peut rétrécir (points de suspension) : avec un
       texte long ET une pastille, la carte débordait à droite et décalait le montant (Safari et
       Chromium, données réelles d'Annie). Le montant reste ainsi au même endroit sur chaque ligne. */
    grid-template-columns:max-content minmax(0,max-content) minmax(0,1fr) auto auto;
    align-items:center; row-gap:6px; width:100%; box-sizing:border-box; padding:14px 12px 14px 16px; border-bottom:1px solid var(--line);
  }
  .data-table td, .data-table th{ display:block; min-width:0; padding:0; border:none; background:none; text-align:left; }
  .data-table td:empty{ display:none; }

  /* Ligne 1 : client (élastique), montant, ⋯ */
  .data-table .col-main{ grid-column:1 / 4; grid-row:1; font-weight:600; }
  .data-table .col-money{ grid-column:4; grid-row:1; padding:0 8px 0 12px; text-align:right; font-weight:700; white-space:nowrap; }
  .data-table .col-actions{ grid-column:5; grid-row:1 / 3; justify-self:end; }
  .data-table .col-actions [data-bs-toggle="dropdown"]{
    width:44px; height:44px; padding:0; display:inline-flex; align-items:center; justify-content:center;
    border:none; border-radius:10px; background:transparent; color:var(--prose);
  }
  .data-table .col-actions [data-bs-toggle="dropdown"]:active{ background:var(--brand-soft); color:var(--ink); }
  .data-table .col-actions [data-bs-toggle="dropdown"]:focus-visible{ outline:2px solid var(--brand-dark); outline-offset:2px; }
  @media (hover:hover){ .data-table .col-actions [data-bs-toggle="dropdown"]:hover{ background:var(--brand-soft); color:var(--ink); } }
  .data-table .wbar{ display:none; }

  /* Ligne 2 : état (jamais rétréci), numéro/nombre, date (s'étend sous le montant) */
  .data-table .col-status{ grid-column:1; grid-row:2; padding-right:8px; }
  .data-table .col-num, .data-table .col-count{ grid-column:2; grid-row:2; padding-right:8px; font-size:13px; color:var(--muted); text-align:left; white-space:nowrap;
    overflow:hidden; text-overflow:ellipsis; }   /* 943 */
  .data-table .col-count[data-unit]::after{ content:" " attr(data-unit); }
  .data-table .col-date{ grid-column:3 / 5; grid-row:2; font-size:13px; color:var(--muted); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }

  /* Filet de sécurité : colonne sans place définie → ligne « Étiquette : valeur » */
  .data-table .col-text, .data-table .col-pct, .data-table td:not([class*="col-"]){ grid-column:1 / 5; grid-row:auto; font-size:13px; color:var(--prose); text-align:left; }
  .data-table .col-pct[data-label]::before,
  .data-table .col-text[data-label]::before,
  .data-table td:not([class*="col-"])[data-label]::before{ content:attr(data-label) " : "; color:var(--muted); }

  /* 867 : texte réservé au bureau (.sauf-carte) ou à la carte (.seul-carte). */
  .data-table .sauf-carte{ display:none; }
  .data-table .seul-carte{ display:inline; }

  /* col-sub : ligne grise pleine largeur, sans libellé (clamp-2 = max 2 lignes). */
  .data-table .col-sub{ grid-column:1 / 5; grid-row:auto; font-size:13px; color:#5B6B62; }
  .data-table .col-sub::before{ content:none; }

  /* Masqués sur la carte */
  .data-table .col-check, .data-table .col-mobile-hide, .data-table .vide-mobile{ display:none; }
  /* Cellule ne contenant QUE l'élément masqué (trombone « Reçu » présent, « — » vide…) :
     masquer la cellule entière, sinon elle garde sa place dans la grille (padding) et
     décale la colonne voisine d'environ 8 px. Corrige aussi toute cellule « — » masquée. */
  .data-table td:has(> .vide-mobile:only-child){ display:none; }
  /* 954 : lien du reçu sur la carte (téléphone) : visible, cible tactile de 44 px. */
  .data-table .lien-recu{ display:inline-flex; align-items:center; min-height:44px; padding:0 4px; font-weight:600; color:var(--brand-dark) !important; }
  /* Coins arrondis du bas de la dernière carte (overflow visible). */
  .data-table tbody:last-child tr:last-child,
  .data-table tfoot tr:last-child{ border-radius:0 0 16px 16px; }
  .data-table tfoot tr{ border-bottom:none; }
}

/* ======================================================================
   Liens de l'application aux couleurs mafacture (build 802)
   Scopé à .content-inner : le contenu de l'app seulement — ni la barre
   latérale (qui a son propre style), ni le site public (qui garde ses
   liens bleus #1F5FEA). Par défaut, un lien dans l'app est vert marque
   et sans soulignement ; les vrais liens DANS un paragraphe / une aide /
   une alerte restent soulignés pour rester lisibles comme des liens.
   ====================================================================== */
.content-inner a:not(.btn):not(.btn-texte):not(.dropdown-item):not(.nav-link):not(.rx-saisir){
  color:#037F45;
  text-decoration:none;
}
/* 884 : les cartes de chiffres (a.kpi) ne se soulignent jamais : l'ombre au survol est le seul
   signal, et le clavier garde le contour :focus-visible de la carte entière (.kpi-link). */
.content-inner a:not(.btn):not(.btn-texte):not(.dropdown-item):not(.nav-link):not(.rx-saisir):not(.kpi):focus{
  color:#0E1B14;
  text-decoration:underline;
  text-underline-offset:3px;
}
@media (hover:hover){ .content-inner a:not(.btn):not(.btn-texte):not(.dropdown-item):not(.nav-link):not(.rx-saisir):not(.kpi):hover{color:#0E1B14;
  text-decoration:underline;
  text-underline-offset:3px; } }   /* 961 : soulignement au survol, souris seulement */
/* Vrais liens dans un corps de texte / une aide / une alerte : soulignés d'emblée. */
.content-inner p a:not(.btn):not(.btn-texte),
.content-inner .form-text a:not(.btn):not(.btn-texte),
.content-inner .avis__texte a:not(.btn):not(.btn-texte),
.content-inner .muted a:not(.btn):not(.btn-texte),
.content-inner small a:not(.btn):not(.btn-texte){
  text-decoration:underline;
  text-underline-offset:3px;
}

/* Bouton-texte : une action secondaire écrite comme un lien (Réinitialiser,
   Effacer, etc.) sans le bleu souligné de Bootstrap. Gris discret, fond pâle
   au survol, hauteur alignée sur les petits boutons voisins. */
.btn-texte{
  --bs-btn-color:#3A463F;
  color:#3A463F;
  background:transparent;
  border:1px solid transparent;
  text-decoration:none;
  display:inline-flex;
  align-items:center;
  gap:6px;
  min-height:40px;
}
.btn-texte:hover,
.btn-texte:focus{
  color:#0E1B14;
  background:#F0F5F2;
  text-decoration:none;
}
.btn-sm.btn-texte{ min-height:34px; }

/* ======================================================================
   Pied de page public — 4 colonnes, fond marine (build 799b / 815).
   ====================================================================== */
.site-footer{
  background:#012D79;
  color:rgba(255,255,255,0.78);
  font-family:'Inter', system-ui, sans-serif;
  font-size:15px;
}
/* 817/820 — Lignes décoratives (2 bandes) en arrière-plan, À PARTIR de 1100px.
   Sous 1100px : fond marine uni (règle de base ci-dessus, aucune image).
   La bande claire (#0041B2) peut passer n'importe où selon la largeur (cover) ;
   les couleurs de texte du footer sont choisies pour rester >=4,5:1 dessus
   (voir billing/test_footer_lignes.py). Le background-color marine subsiste
   sous les zones transparentes du SVG. */
@media (min-width:1100px){
  .site-footer{
    background-image:url("footer-lignes.926bf9ea82af.svg");
    background-repeat:no-repeat;
    background-position:center;
    background-size:cover;
  }
}
.site-footer__inner{
  max-width:1120px; margin:0 auto; padding:56px 24px 40px;
  display:grid; grid-template-columns:1.6fr repeat(3, 1fr); gap:40px;
}
.site-footer__logo{
  display:inline-flex; align-items:center; gap:8px;
  font-family:'Plus Jakarta Sans', sans-serif; font-size:22px; font-weight:800;
  letter-spacing:-0.03em; color:#FFFFFF; text-decoration:none;
}
.site-footer__dot{ width:11px; height:11px; border-radius:50%; background:#00BE65; }
.site-footer__tagline{ margin:12px 0 20px; max-width:30ch; line-height:1.55; }
.site-footer__cta{
  display:inline-flex; align-items:center; gap:6px; min-height:44px;
  font-weight:700; color:#4ADE8F; text-decoration:none;  /* 817 : vert éclairci (4,5:1 sur la bande #0041B2) — footer seulement */
}
.site-footer__title{
  margin:0 0 14px; font-size:12px; font-weight:600; letter-spacing:0.08em;
  text-transform:uppercase; color:#FFFFFF;
}
.site-footer__col ul{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:4px; }
.site-footer__col a{
  display:inline-flex; align-items:center; min-height:36px;
  color:rgba(255,255,255,0.78); text-decoration:none;
}
@media (hover:hover){ .site-footer a:hover{color:#FFFFFF; text-decoration:underline; text-underline-offset:3px; } }   /* 961 : soulignement au survol, souris seulement */
.site-footer a:focus-visible{ outline:2px solid #00BE65; outline-offset:3px; border-radius:4px; }
.site-footer__bottom{
  position:relative; max-width:1120px; margin:0 auto;
  padding:20px 24px 28px; font-size:13px; color:rgba(255,255,255,0.7);  /* 817 : 70% (4,5:1 sur bande claire) */
}
/* Ligne de séparation ALIGNÉE sur le contenu (même retrait de 24px que les colonnes),
   à toutes les largeurs — pas étirée jusqu'au bord du conteneur. */
.site-footer__bottom::before{
  content:""; position:absolute; top:0; left:24px; right:24px;
  border-top:1px solid rgba(255,255,255,0.12);
}
.site-footer__bottom p{ margin:0; }
@media (max-width:900px){
  .site-footer__inner{ grid-template-columns:repeat(3, 1fr); }
  .site-footer__brand{ grid-column:1 / -1; }
}
@media (max-width:560px){
  .site-footer__inner{ grid-template-columns:1fr; gap:28px; padding-top:44px; }
}

/* 827 — Rangées cliquables (Catégories, Fournisseurs) : la rangée entière mène aux
   dépenses filtrées, mais le nom reste un vrai lien (clavier + lecteur d'écran). */
.ligne-cliquable{ cursor:pointer; }
.ligne-cliquable:hover{ background:#F5F8F6; }
.lien-ligne{ color:var(--ink,#0E1B14); text-decoration:none; }
@media (hover:hover){ .lien-ligne:hover{color:var(--brand-dark,#037F45); text-decoration:underline; } }   /* 961 : soulignement au survol, souris seulement */
/* Bouton ⋯ : anneau de focus visible au clavier. */
.data-table .dropdown > .btn:focus-visible{
  outline:2px solid var(--brand-dark,#037F45); outline-offset:2px; border-radius:6px;
}
/* Bannière de filtre actif (venue de Catégories / Fournisseurs), retirable. */
.filtre-actif{ display:flex; flex-wrap:wrap; align-items:center; gap:.5rem;
  padding:.5rem .75rem; background:#EEF5F0; border:1px solid #CDEBD9;
  border-radius:12px; font-size:.9rem; }
.filtre-actif-label{ color:#52635B; }
.filtre-actif-valeur{ font-weight:600; color:var(--ink,#0E1B14); }
.filtre-actif-retirer{ margin-left:auto; color:var(--brand-dark,#037F45);
  font-weight:600; text-decoration:none; }
@media (hover:hover){ .filtre-actif-retirer:hover{text-decoration:underline; } }   /* 961 : soulignement au survol, souris seulement */

/* ── 841 : page /prix/ (styles déplacés du gabarit, valeurs inchangées) ── */
:root{ --promo-fond:#FFF3D6; --promo-texte:#8A5A00; }
.promo-banner{ background:var(--promo-fond); color:var(--promo-texte); text-align:center; padding:11px 16px; font-size:14.5px; font-weight:500; }
.promo-banner .bi{ margin-right:6px; }
.promo-banner a{ color:var(--promo-texte); font-weight:700; text-decoration:underline; margin-left:6px; }
.pf-grid{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:14px; align-items:start; }
.pf-card{ border:1px solid var(--line,#e5e7eb); border-radius:14px; padding:20px; background:#fff; }
.pf-card.pf-pop{ border:2px solid #00BE65; position:relative; }
.pf-pop-badge{ position:absolute; top:-11px; left:50%; transform:translateX(-50%); font-size:.72rem; font-weight:700; color:#0B7A45; background:#E6F7EE; padding:3px 12px; border-radius:20px; }
.pf-name{ text-align:center; color:var(--muted); font-size:.95rem; margin:0 0 12px; font-family:inherit; font-weight:400; line-height:inherit; letter-spacing:normal; }   /* H3 au rendu identique à l'ancien div */
/* 999 (maquette « Prix finale » d'Annie) : ligne grise de 12 px à 7 px sous le prix (« pour N mois, puis 19 $/mois ») ;
   aucun prix barré ; le seul vert de la carte : le bouton et le contour du forfait populaire.
   1000 (Annie) : typographie du prix = exactement celle d'avant la 999 (2rem, 800, « /mois » .8rem 400 ; couleur var(--muted) depuis la 1001). */
.pf-price{ text-align:center; font-size:2rem; font-weight:800; line-height:1; margin:0; }
.pf-price small{ font-size:.8rem; color:var(--muted); font-weight:400; }   /* 1001 (Annie) : var(--muted), plus de #6b7280 */
/* 1001 (maquette « pastille 5 vues » d'Annie) : promo en % de moins de 100 % : pastille au-dessus du prix (12 px dessous) ;
   entier 32 px 800 ; à droite, cents et « $ » en exposant (16 px 800 ; « $ » .75em 500) et « /mois » dessous (12,8 px 400). */
/* 1004 (maquette « bulle jaune C » d'Annie) : la pastille devient une bulle jaune, pointe de 4 px vers le prix ; 12 px du bas
   de la bulle au prix (8 px du bout de la pointe, voulu). */
.pf-pastille{ position:relative; display:block; width:fit-content; margin:0 auto 12px; font-size:11px; font-weight:700;
  line-height:normal; padding:4px 8px; border-radius:5px; background:var(--promo-bulle); color:var(--ink);
  box-shadow:0 2px 6px rgba(14,27,20,.12); }
.pf-pastille::after{ content:""; position:absolute; left:50%; bottom:-4px; transform:translateX(-50%);
  border:4px solid transparent; border-bottom:0; border-top-color:var(--promo-bulle); }
.pf-price--exposant{ display:flex; justify-content:center; align-items:flex-start; }
.pf-entier{ font-size:32px; }
.pf-exposant{ display:flex; flex-direction:column; align-items:flex-start; margin-left:3px; }
.pf-exposant b{ font-size:16px; font-weight:800; margin-top:2px; }
.pf-exposant b span{ font-size:.75em; font-weight:500; }
.pf-exposant small{ font-size:12.8px; font-weight:400; color:var(--muted); margin-top:3px; }
.pf-sous{ text-align:center; font-size:12px; color:var(--muted); margin:7px 0 0; }
.pf-card > a[data-forfait]{ margin-top:20px; }
.pf-diff{ font-size:.92rem; line-height:2; margin-top:16px; }
.pf-feat{ border-top:1px solid var(--line,#e5e7eb); margin-top:10px; padding-top:10px; font-size:.86rem; color:#5b6b62; line-height:1.95; }
.pf-grp{ font-weight:600; color:#0B7A45; margin:10px 0 2px; }
/* 953 (Annie) : listes à crochets des cartes de forfaits : retrait suspendu. Le crochet est sorti du flux ; la
   2e ligne d'un élément coupé commence exactement sous le début du texte de la 1re. */
.pf-li{ position:relative; padding-left:1.164em; }   /* = largeur de « ✓ » + espace avant le 953 : le texte reste à la même place */
.pf-coche{ position:absolute; left:0; top:0; }
/* 1003 (Annie) : marge intérieure de 16 px jusqu'à 991 px (900 px avant) : « Toutes les fonctionnalités » tient sur une ligne. */
@media (max-width:991.98px){ .pf-grid{ gap:16px; } .pf-card{ padding:20px 16px; } }
/* 1000 : bouton « Toutes les fonctionnalités » (allure de lien, texte de la 1002), seulement sous 992 px (1002 ; 700 px
   avant) et avec JavaScript. */
.pf-voir{ display:none; background:none; border:0; padding:12px 0 4px; min-height:44px; margin-top:4px;
  color:var(--brand-dark); font:inherit; font-size:.92rem; font-weight:600; cursor:pointer; text-align:left; }
.pf-voir:focus-visible{ outline:2px solid var(--brand-dark); outline-offset:2px; border-radius:4px; text-decoration:underline; }
@media (hover: hover){ .pf-voir:hover{ text-decoration:underline; } }
/* 999 : cartes empilées, forfait populaire en premier (3 colonnes au-dessus). 1003 (Annie) : bascule à 768 px (700 avant),
   mesurée : de 701 à 767 px, le bouton, la ligne grise et le lien passaient sur deux lignes (14,75 $, « pour 12 mois… »). */
@media (max-width:767.98px){
  .pf-grid{ grid-template-columns:1fr; max-width:420px; margin-left:auto; margin-right:auto; gap:22px; }
  .pf-card.pf-pop{ order:-1; }
}
/* 1002 (maquette « tablette 820 » A d'Annie) : repli des fonctionnalités sous 992 px (bascule du menu ☰) ; de 768 à 991 px
   (1003) les 3 cartes restent côte à côte, repliées ; dessous, empilées (règle ci-dessus). */
@media (max-width:991.98px){
  .pf-repli .pf-voir{ display:inline-block; }
  .pf-repli .pf-card:not(.pf-ouverte) .pf-feat{ display:none; }
}
.pf-h2-carte{ font-size:1rem; font-weight:600; margin-bottom:.5rem; font-family:inherit; }
.pf-addon-row{ display:flex; justify-content:space-between; gap:12px; }
.pf-addon-price{ white-space:nowrap; }
@media (max-width:575.98px){
  .pf-addon-row{ flex-direction:column; gap:6px; }   /* 841 : 2px collait le prix au nom */
  .pf-addon-price{ font-weight:600; color:#0F6E56; }
}
.pf-section{ margin-top:48px; scroll-margin-top:90px; }
.pf-h2{ font-size:1.5rem; margin-bottom:1rem; }
.pf-demande{ max-width:640px; margin-left:auto; margin-right:auto; }

/* ── 847 : liste « Bien démarrer » et célébration de la première facture ── */
.bd-carte{ border:1px solid var(--line); }
.bd-barre-fond{ height:8px; background:var(--surface); }
.bd-barre{ background:var(--brand); transition:width .4s ease; }
.bd-etapes{ list-style:none; padding:0; display:flex; flex-direction:column; gap:.6rem; }
.bd-etape{ display:flex; align-items:center; gap:.8rem; padding:.65rem .8rem; border-radius:12px; border:1px solid var(--line); background:#fff; }
.bd-etape.bd-suivante{ border-color:var(--brand); background:var(--brand-soft); }
.bd-etape.bd-fait{ background:var(--surface); }
.bd-etape.bd-fait .bd-titre{ color:var(--muted); text-decoration:line-through; text-decoration-color:var(--line); }
.bd-coche{ flex:none; width:30px; height:30px; border-radius:50%; display:inline-flex; align-items:center; justify-content:center;
  font-weight:700; font-size:.9rem; border:2px solid var(--line); color:var(--muted); background:#fff; }
.bd-suivante .bd-coche{ border-color:var(--brand-dark); color:var(--brand-dark); }
.bd-fait .bd-coche{ background:var(--brand); border-color:var(--brand); color:var(--sur-vert); }
.bd-texte{ flex:1; min-width:0; display:flex; flex-direction:column; }
.bd-titre{ font-weight:600; color:var(--ink); }
.bd-detail{ font-size:.85rem; color:var(--muted); }
.bd-action{ flex:none; white-space:nowrap; }
@keyframes bd-pop{ 0%{ transform:scale(.4); } 60%{ transform:scale(1.25); } 100%{ transform:scale(1); } }
.bd-vient-de-cocher{ animation:bd-pop .5s ease-out both; }
/* 948 (décision d'Annie) : au téléphone, l'action passe SOUS le texte (comme les avis) : plus aucun mot coupé. */
@media (max-width:575.98px){
  .bd-etape{ flex-wrap:wrap; align-items:flex-start; }
  .bd-texte{ flex:1 1 calc(100% - 30px - .8rem); }
  .bd-action{ flex:1 1 100%; margin-left:calc(30px + .8rem); white-space:normal; }
  .bd-action.btn{ flex:0 1 auto; }
}
.bd-confettis{ position:fixed; inset:0; pointer-events:none; overflow:hidden; z-index:2000; }
.bd-confetti{ position:absolute; top:-12px; width:8px; height:14px; border-radius:2px; animation:bd-chute 1.6s ease-in forwards; }
.bd-confetti.c0{ background:var(--brand); } .bd-confetti.c1{ background:#1F5FEA; } .bd-confetti.c2{ background:#FFB020; }
.bd-confetti.c3{ background:#9B6BFF; } .bd-confetti.c4{ background:#E24B4A; }
@keyframes bd-chute{ 0%{ opacity:1; translate:0 0; } 100%{ opacity:.9; translate:0 105vh; } }
@media (prefers-reduced-motion:reduce){ .bd-vient-de-cocher{ animation:none; } .bd-confettis{ display:none; } .bd-barre{ transition:none; } }
/* 849 : « Réduire » (une ligne) et « Ne plus afficher » (message avec « Annuler ») */
/* En-tête de la carte (852) ; version RÉDUITE en quatre segments (853, remplace la bordure
   verte du 852). Règle permanente : jamais de bordure de couleur sur un seul côté. */
.bd-entete{ display:flex; align-items:center; gap:1rem; }
.bd-entete-titre{ flex:1 1 auto; min-width:0; }
.bd-resume[hidden]{ display:none; }
.bd-bascule-form{ flex:none; margin:0; }
.bd-carte .card-body{ padding:1.5rem; }
.bd-carte:not(.bd-reduit) .bd-si-reduit{ display:none !important; }
.bd-carte.bd-reduit{ background:#fff; border:0 !important; border-radius:12px;
  box-shadow:0 1px 2px rgba(14,27,20,.05), 0 2px 8px rgba(14,27,20,.05); }
.bd-carte.bd-reduit .card-body{ padding:12px 14px; }
.bd-carte.bd-reduit .bd-entete{ gap:12px; }
.bd-carte.bd-reduit .bd-entete-titre{ flex:0 0 auto; }
.bd-carte.bd-reduit #bdTitre{ font-size:1rem; font-weight:600; color:var(--ink); white-space:nowrap; }
.bd-segments{ display:inline-flex; gap:4px; flex:none; }
.bd-segment{ width:22px; height:6px; border-radius:3px; background:var(--line); }   /* à venir : #E7ECE8 */
.bd-segment.bd-segment-en-cours{ background:var(--brand-pale); }                    /* #9FE5C2 */
.bd-segment.bd-segment-fait{ background:var(--brand); }                             /* #00BE65 */
.bd-resume{ display:flex; align-items:center; min-width:0; flex:0 1 auto; }
.bd-prochaine{ font-size:.92rem; min-width:0; white-space:normal; overflow-wrap:break-word; }   /* jamais de « … » */
.bd-prochaine-libelle{ color:var(--muted); }                                        /* #5B6B62 */
.bd-prochaine-nom{ color:var(--ink); }                                              /* #0E1B14 */
.bd-espace{ flex:1 1 auto; }
.bd-prochaine-action{ flex:0 0 auto; flex-shrink:0; white-space:nowrap; background:var(--brand); color:var(--ink);
  font-weight:600; border:0; border-radius:8px; padding:.35rem .8rem; font-size:.9rem; }
.bd-prochaine-action:hover, .bd-prochaine-action:focus-visible{ background:var(--brand); color:var(--ink); filter:brightness(.95); }
.bd-chevron{ width:32px; height:32px; display:inline-flex; align-items:center; justify-content:center;
  border-radius:8px; color:var(--ink); font-size:1rem; text-decoration:none; }
.bd-chevron:hover, .bd-chevron:focus-visible{ background:var(--surface); color:var(--ink); }
@media (max-width:559.98px){
  /* Ligne 1 : segments, « Bien démarrer » au complet, chevron à droite.
     Ligne 2 : « Prochaine étape : nom » à gauche (passe à la ligne si long), bouton à droite.
     Aucune troncature ; le bouton ne rétrécit jamais. */
  .bd-carte.bd-reduit .bd-entete{ flex-wrap:wrap; gap:8px; row-gap:5px; }   /* 2 × 5 px autour du saut */
  .bd-carte.bd-reduit .bd-segments{ order:1; }
  .bd-carte.bd-reduit .bd-entete-titre{ order:2; flex:1 1 auto; }
  .bd-carte.bd-reduit .bd-bascule-form{ order:3; }
  .bd-carte.bd-reduit .bd-espace{ order:4; flex:0 0 100%; height:0; }      /* saut de ligne */
  .bd-carte.bd-reduit .bd-resume{ order:5; flex:1 1 0; min-width:0; }
  .bd-carte.bd-reduit .bd-prochaine-action{ order:6; }
}
.bd-ne-plus{ color:var(--muted); text-decoration:underline; font-size:.875rem; }   /* 852 : ~14 px, un cran sous les étapes */
.bd-ne-plus:hover, .bd-ne-plus:focus-visible{ color:var(--ink); }
.bd-annulation{ display:flex; align-items:center; gap:.8rem; padding:.6rem 1rem; margin-bottom:1.5rem;
  border:1px solid var(--line); border-radius:12px; background:var(--surface); color:var(--ink); }

/* ── 850 : état vide uniforme des listes (templates/portal/_etat_vide.html) ── */
.etat-vide{ text-align:center; padding:3rem 1.5rem; background:#fff; border:1px solid var(--line);
  border-radius:16px; margin-bottom:1rem; }
.etat-vide-icone{ display:inline-flex; align-items:center; justify-content:center; width:56px; height:56px;
  border-radius:50%; background:var(--brand-soft); color:var(--brand-dark); font-size:1.5rem; margin-bottom:.9rem; }
.etat-vide-phrase{ font-weight:600; color:var(--ink); margin:0 0 .35rem; }
.etat-vide-aide{ color:var(--muted); font-size:.9rem; max-width:34rem; margin:0 auto; }
.etat-vide-actions{ display:flex; justify-content:center; flex-wrap:wrap; gap:.5rem; margin-top:1.1rem; }

/* 870 : client sans province, sous le champ Client (facture et soumission). Même rendu
   que l'avis « client sans courriel » de la facture. */
/* 951 : .avis-province-client remplacée par le composant d'avis (attention). */

/* 872 : point vert sur l'onglet Note quand la fiche a une note interne. */
.point-note{ display:inline-block; width:7px; height:7px; border-radius:50%;
  background:var(--brand); margin-left:6px; vertical-align:middle; }
/* 872 : rappel « Note du client » sous le champ Client (facture, soumission). */
.rappel-note-client{ display:flex; gap:10px; align-items:flex-start; background:var(--surface);
  border:1px solid var(--line); border-radius:10px; padding:10px 12px; font-size:13px; }
.rappel-note-client .bi{ margin-top:2px; flex:0 0 auto; color:var(--muted); }
.rappel-note-client .rnc-titre{ font-size:11px; font-weight:600; letter-spacing:.04em;
  text-transform:uppercase; color:var(--muted); }
.rappel-note-client .rnc-texte{ white-space:pre-wrap; overflow-wrap:anywhere; color:var(--ink); }

/* 874 : avis sous un champ déjà enregistré hors format (téléphone, code postal). C'est une
   information, pas une erreur, tant que le champ n'est pas modifié : jaune, pas rouge.
   Même teinte que l'avis « client sans courriel » (contraste AA sur blanc). */
.avis-champ-info{ color:#7a5b12; }

/* ── 875 : onglet « Taxes » des Réglages ─────────────────────────────────────────── */
.onglet-taxes .tx-surtitre{ font-size:13px; font-weight:600; letter-spacing:.05em;
  text-transform:uppercase; color:var(--muted); margin:0 0 .75rem; }
.onglet-taxes .tx-ligne{ display:grid; grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);
  align-items:center; gap:.75rem 1rem; padding:.7rem 0; border-bottom:1px solid var(--line); }
.onglet-taxes .tx-ligne:last-of-type{ border-bottom:0; }
.onglet-taxes .tx-num{ text-align:right; font-variant-numeric:tabular-nums; overflow-wrap:anywhere; }
.onglet-taxes .tx-pastille{ display:inline-block; padding:.15rem .6rem; border-radius:999px;
  font-size:13px; font-weight:600; white-space:nowrap; }
.onglet-taxes .tx-ok{ background:var(--brand-soft); color:var(--statut-paid-texte); }
.onglet-taxes .tx-non{ background:var(--statut-draft-fond); color:var(--statut-draft-texte); }
.onglet-taxes .tx-recap{ display:flex; justify-content:space-between; gap:1rem; padding:.55rem 0;
  border-bottom:1px solid var(--line); }
.onglet-taxes .tx-recap:last-child{ border-bottom:0; }
.onglet-taxes .tx-recap > span:last-child{ text-align:right; }
.onglet-taxes .tx-avance > summary{ cursor:pointer; }
/* Oui / Non : composant .choix-seg (941). */
@media (max-width: 575.98px){
  .onglet-taxes .tx-ligne{ grid-template-columns:minmax(0,1fr) auto; }
  .onglet-taxes .tx-num{ grid-column:1 / -1; text-align:left; }
}

/* 888 : élément grisé des menus ⋯ — libellé sur une ligne, raison courte dessous, bulle au clic. */
.dropdown-item.item-indispo{ cursor:help; color:var(--muted); background:transparent; }
.dropdown-item.item-indispo:hover, .dropdown-item.item-indispo:focus{ background:var(--line); color:var(--muted); }
.item-indispo-lib{ display:block; white-space:nowrap; }
.item-indispo-raison{ display:block; white-space:nowrap; font-size:.78rem; line-height:1.25; padding-left:1.4em; }
.item-indispo-bulle{ margin:.25rem .75rem .5rem; padding:.5rem .65rem; max-width:18rem; font-size:.8rem;
  line-height:1.35; color:var(--ink); background:var(--brand-soft); border:1px solid var(--line-strong);
  border-radius:8px; white-space:normal; }

/* ======================================================================
   897 : pastilles de statut des TABLEAUX DE FACTURES (.data-table--factures).
   Le statut de la facture d'abord, « Courriel refusé » ensuite, dans .status-pills
   qui passe à la ligne au lieu de déborder. Les autres tableaux ne sont pas touchés.
   ====================================================================== */
.status-pills{ display:flex; flex-wrap:wrap; gap:4px 6px; align-items:center; }
@container liste (width > 900px){
  /* Colonne Statut bornée : 270 px au bureau. Largeur automatique : une seule ligne quand
     la place le permet, retour à la ligne quand elle manque (portable de 1280 px). */
  .data-table--factures .col-status{ width:auto; white-space:normal; }
  .data-table--factures .col-status .status-pills{ max-width:270px; }
}
@media (max-width:1023.98px){
  /* Tablette (écran de moins de 1024 px, tableau encore en colonnes) : 170 px, les pastilles
     passent sur deux lignes ; Échéance masquée. Selon l'ÉCRAN et non le conteneur : un
     portable de 1280 px (tableau d'environ 960 px à côté du menu) garde le rendu bureau. */
  @container liste (width > 900px){
    .data-table--factures .col-status .status-pills{ max-width:170px; }
    .data-table--factures .col-echeance{ display:none; }
  }
}
@container liste (width <= 900px){
  /* Carte : client et montant ; numéro et date ; puis les pastilles sur leur propre ligne. */
  .data-table--factures .col-num{ grid-column:1; grid-row:2; }
  .data-table--factures .col-date{ grid-column:2 / 5; grid-row:2; }
  /* 899 : la date prend toute la ligne 2 SEULEMENT s'il n'y a pas de cellule numéro (fiche
     client : le numéro est le titre). Le 897 visait « .col-main + .col-date », qui touchait
     aussi les tableaux avec colonne Client : la date passait par-dessus le numéro. */
  .data-table--factures tr:not(:has(> .col-num)) .col-date{ grid-column:1 / 5; }
  .data-table--factures .col-status{ grid-column:1 / 5; grid-row:3; padding:0; }
}

/* ======================================================================
   920 : TABLEAUX DE DÉTAIL (lignes d'une facture ou d'une soumission, acomptes, aperçus
   d'import, remise nette des Rapports). Même système .data-table et mêmes classes col-*,
   mais conteneur nommé « detail » qui bascule en cartes sous 560 px de largeur de TABLEAU
   (choix B d'Annie, 28 oct. 2026) : colonnes au bureau, cartes au téléphone. Aucun tableau
   ne glisse de côté. Le conteneur « liste » (900 px) ne s'applique jamais ici.
   Carte : zone « main » (col-main, gras) et zone « coin » à droite (col-money ou col-coin) ;
   dessous, zone « sous » (col-status ou col-sub, gris). Avec une case à cocher (aperçus
   d'import), la case reste VISIBLE au téléphone, dans la zone « case ».
   ====================================================================== */
.data-table-wrap--detail{ container-name:detail; }
@container detail (width > 560px){
  .data-table th:first-child, .data-table td:first-child{ padding-left:0; }
  .data-table th:last-child, .data-table td:last-child{ padding-right:0; }
  .data-table .col-main{ width:auto; overflow-wrap:anywhere; }
  .data-table .col-num, .data-table .col-count, .data-table .col-money, .data-table .col-status,
  .data-table .col-text, .data-table .col-check, .data-table .col-coin{ width:1%; white-space:nowrap; }
  .data-table .col-count, .data-table .col-money{ text-align:right; }
  .data-table .col-check{ width:36px; padding-right:4px; }
}
@container detail (width <= 560px){
  .data-table thead{ display:none; }
  .data-table, .data-table tbody, .data-table tfoot{ display:block; }
  .data-table tr{
    display:grid; grid-template-columns:minmax(0,1fr) auto; grid-template-areas:"main coin" "sous sous";
    column-gap:12px; row-gap:4px; align-items:start; padding:12px 0; border-bottom:1px solid var(--line);
  }
  .data-table tr:has(> .col-check){ grid-template-columns:auto minmax(0,1fr) auto; grid-template-areas:"case main coin" ". sous sous"; }
  .data-table tbody tr:last-child{ border-bottom:none; }
  .data-table td, .data-table th{ display:block; min-width:0; padding:0; border:none; background:none; text-align:left; }
  .data-table td:empty{ display:none; }
  .data-table .col-check{ grid-area:case; }
  .data-table .col-main{ grid-area:main; font-weight:600; overflow-wrap:anywhere; }
  .data-table .col-money, .data-table .col-coin{ grid-area:coin; text-align:right; white-space:nowrap; }
  .data-table .col-money{ font-weight:700; }
  .data-table .col-status, .data-table .col-sub{ grid-area:sous; font-size:13px; color:var(--muted); }
  .data-table .col-status.col-coin{ grid-area:coin; }
  .data-table .col-mobile-hide, .data-table .sauf-carte{ display:none; }
  .data-table .seul-carte{ display:inline; }
  .data-table .seul-carte--bloc{ display:block; margin-top:2px; font-weight:400; font-size:13px; color:var(--muted); }
  .data-table .col-main div{ font-weight:400; }   /* avertissements sous un nom (import) : pas en gras */
}

/* 920 : paires étiquette-valeur (remplacent les petits tableaux à 2 colonnes : abonnement des
   Réglages, taxes perçues des Rapports, recalcul des taxes). Une ligne par paire, rien ne glisse. */
.paires > div{ display:flex; justify-content:space-between; align-items:baseline; gap:12px;
  padding:8px 0; border-bottom:1px solid var(--line); }
.paires > div:last-child{ border-bottom:none; }
.paires > div > :last-child{ text-align:right; font-variant-numeric:tabular-nums; }
.paires--total{ border-top:1px solid var(--line); margin-top:4px; font-weight:700; }
.encadre-compar{ border:1px solid var(--line); border-radius:12px; padding:1rem; height:100%; }

/* 900 : champ Courriel de la fiche client après un refus (texte d'aide, sans encadré). */
.form-control.champ-refuse{ border-color:var(--danger); }
.form-control.champ-refuse:focus{ border-color:var(--danger); box-shadow:0 0 0 .2rem rgba(201,51,50,.18); }
.aide-courriel{ margin-top:.35rem; font-size:.8125rem; line-height:1.4; color:var(--muted); }
.aide-courriel--refus, .aide-courriel--recu{ color:var(--danger); }
.aide-courriel a{ color:var(--brand-dark); font-weight:600; }
.aide-courriel--refus a, .aide-courriel--recu a{ color:var(--danger); text-decoration:underline; }

/* 902 : pages d'erreur (404 publique et 404 de l'app). */
.erreur-page{ text-align:center; padding:72px 16px 80px; }
.erreur-page--app{ padding:56px 16px; }
.erreur-code{ display:inline-block; font-family:"Plus Jakarta Sans",Inter,sans-serif; font-weight:700; font-size:14px;
  letter-spacing:.12em; color:var(--brand-dark); background:var(--brand-soft); padding:4px 14px; border-radius:999px; margin-bottom:18px; }
.erreur-titre{ font-family:"Plus Jakarta Sans",Inter,sans-serif; font-size:2.5rem; line-height:1.15; margin:0 0 12px; color:var(--ink); }
.erreur-page--app .erreur-titre{ font-size:2rem; }
.erreur-texte{ color:var(--muted); font-size:1.0625rem; max-width:520px; margin:0 auto 30px; }
.erreur-liens{ display:grid; grid-template-columns:repeat(4, minmax(0, 170px)); gap:12px; justify-content:center; }
.erreur-lien{ display:block; border:1px solid var(--line); border-radius:12px; padding:16px 14px; text-align:left;
  text-decoration:none; color:var(--ink); background:#fff; }
.erreur-lien:hover, .erreur-lien:focus-visible{ border-color:var(--line-strong); color:var(--ink); }
.erreur-lien i{ display:block; color:var(--brand-dark); font-size:1.15rem; margin-bottom:8px; }
.erreur-lien b{ display:block; font-size:15px; font-weight:600; margin-bottom:2px; }
.erreur-lien span{ display:block; font-size:13px; color:var(--muted); }
.erreur-boutons{ display:flex; gap:10px; justify-content:center; flex-wrap:wrap; }
@media (max-width:767.98px){
  .erreur-page{ padding:44px 16px 50px; }
  .erreur-titre{ font-size:1.875rem; }
  .erreur-liens{ grid-template-columns:1fr 1fr; }
  .erreur-lien span{ display:none; }
}

/* 903 : abonnement en retard (page de suspension et bandeau de l'app). */
.suspension-page{ max-width:640px; }

/* 908 : page « À propos » (/a-propos/), version sombre et sobre, sans couleur (choix d'Annie).
   La barre de navigation et le pied de page restent ceux du site. Contrastes ≥ 4,5:1. */
:root{ --apropos-fond:#0C0D0E; --apropos-texte:#F2F2F0; --apropos-texte-2:#BFC2C5;
       --apropos-texte-3:#9A9FA4; --apropos-trait:#2A2D30; }
.apropos{ background:var(--apropos-fond); color:var(--apropos-texte); flex:1 0 auto; }
.apropos__contenu{ max-width:680px; margin:0 auto; padding:110px 24px 100px; }
.apropos__surtitre, .apropos h2{ font-size:12px; letter-spacing:.22em; text-transform:uppercase;
  color:var(--apropos-texte-3); font-weight:500; margin:0 0 28px; font-family:Inter, system-ui, sans-serif; }
.apropos h1{ font-family:"Plus Jakarta Sans", Inter, sans-serif; font-weight:700; font-size:52px; line-height:1.08;
  letter-spacing:-.025em; margin:0 0 56px; color:var(--apropos-texte); }
.apropos p{ font-size:18px; line-height:1.8; color:var(--apropos-texte-2); margin:0 0 22px; }
.apropos .apropos__chute{ color:var(--apropos-texte); font-size:21px; line-height:1.6; margin-top:36px; }
.apropos__separateur{ height:1px; background:var(--apropos-trait); margin:80px 0 60px; border:0; }
.apropos__valeurs{ margin:0; padding:0; list-style:none; }
.apropos__valeurs li{ display:grid; grid-template-columns:200px 1fr; gap:24px; padding:22px 0;
  border-top:1px solid var(--apropos-trait); }
.apropos__valeurs li:last-child{ border-bottom:1px solid var(--apropos-trait); }
.apropos__valeurs b{ font-family:"Plus Jakarta Sans", Inter, sans-serif; font-weight:600; font-size:17px;
  color:var(--apropos-texte); }
.apropos__valeurs span{ font-size:16px; line-height:1.65; color:var(--apropos-texte-2); }
.apropos .apropos__foi{ margin-top:34px; font-size:17px; font-style:italic; }
.apropos a{ color:var(--apropos-texte); text-decoration:underline; text-underline-offset:3px; }
@media (max-width:700px){
  .apropos__contenu{ padding:64px 20px 70px; }
  .apropos h1{ font-size:36px; margin-bottom:40px; }
  .apropos__valeurs li{ grid-template-columns:1fr; gap:6px; }
  .apropos__separateur{ margin:56px 0 44px; }
}
/* 908 : ligne « Conçu au Québec… » (sous le titre de /prix/ et au pied de page). */
/* 911 : surtitre au-dessus du titre de /prix/, couleur du titre (choix d'Annie, 27 oct. 2026) */
.ligne-quebec{ color:var(--ink); font-size:12px; font-weight:600; letter-spacing:.14em;
  text-transform:uppercase; margin:0 0 14px; }
.site-footer__quebec{ margin:0; }
.site-footer__bottom{ display:flex; flex-wrap:wrap; justify-content:space-between; gap:6px 24px; }   /* 908 */

/* ===== 910 : barre publique sombre (/a-propos/ seulement, « with nav_sombre=True ») =====
   Même contenu que la barre blanche. Seuls le point du logo et le bouton « Demander un accès »
   restent verts (choix A d'Annie, 27 oct. 2026). */
:root{ --apropos-fond-2:#141618; --apropos-survol:#1F2225; }
.lp-nav.mf-nav--sombre{ background:var(--apropos-fond); border-bottom-color:var(--apropos-trait); }
.mf-nav--sombre .brand-wordmark{ color:var(--apropos-texte); }
.mf-nav--sombre .mf-navlink, .mf-nav--sombre .mf-mega-btn,
.mf-nav--sombre .mf-login{ color:var(--apropos-texte-2); }
.mf-nav--sombre .mf-navlink:hover, .mf-nav--sombre .mf-mega-btn:hover,
.mf-nav--sombre .mf-mega-btn[aria-expanded="true"],
.mf-nav--sombre .mf-login:hover{ background:var(--apropos-survol); color:var(--apropos-texte); }
.mf-nav--sombre .mf-navlink.is-actif, .mf-nav--sombre .mf-mega-btn.is-actif{ color:var(--apropos-texte); }
.mf-nav--sombre .lp-menu-btn{ color:var(--apropos-texte); }
.mf-nav--sombre .mf-mega-panel{ background:var(--apropos-fond-2); border-color:var(--apropos-trait);
  box-shadow:0 20px 48px rgba(0,0,0,.5); }
.mf-nav--sombre .mf-mega-card:hover{ background:var(--apropos-survol); }
.mf-nav--sombre .mf-mega-ico{ background:var(--apropos-survol); color:var(--apropos-texte); }
.mf-nav--sombre .mf-mega-t{ color:var(--apropos-texte); }
.mf-nav--sombre .mf-mega-d{ color:var(--apropos-texte-3); }
.mf-nav--sombre .mf-mega-all{ color:var(--apropos-texte); border-top-color:var(--apropos-trait); }
.mf-nav--sombre .mf-mega-all:hover{ color:var(--apropos-texte); }
.lp-sheet.lp-sheet--sombre{ background:var(--apropos-fond-2); }
.lp-sheet--sombre .lp-sheet-handle{ background:var(--apropos-trait); }
.lp-sheet--sombre .lp-sheet-close, .lp-sheet--sombre .lp-sheet-signin{ color:var(--apropos-texte-3); }
.lp-sheet--sombre .lp-sheet-links a:not(.btn){ color:var(--apropos-texte); border-bottom-color:var(--apropos-trait); }
.lp-sheet--sombre .lp-sheet-signin a{ color:var(--apropos-texte); }

/* ===== 910 : pied de page noir (/a-propos/ seulement, « with pied_sombre=True ») =====
   Même contenu ; fond noir de la page, sans les lignes décoratives. Le point du logo et
   « Demander un accès » restent verts (choix A). */
.site-footer.site-footer--sombre{ background:var(--apropos-fond); background-image:none;
  color:var(--apropos-texte-2); border-top:1px solid var(--apropos-trait); }
.site-footer--sombre .site-footer__logo, .site-footer--sombre .site-footer__title{ color:var(--apropos-texte); }
.site-footer--sombre .site-footer__col a{ color:var(--apropos-texte-2); }
.site-footer--sombre a:hover{ color:var(--apropos-texte); }
.site-footer--sombre .site-footer__bottom{ color:var(--apropos-texte-3); }
.site-footer--sombre .site-footer__bottom::before{ border-top-color:var(--apropos-trait); }
/* 910 : fond du body noir aussi sur /a-propos/ (pas d'éclair blanc au rebond du défilement) */
.lp-body.lp-body--sombre{ background:var(--apropos-fond); }

/* ===== 914 : inscription instantanée (/inscription/), maquette « allégée » approuvée =====
   Fond blanc, beaucoup d'espace, un seul cadre (le formulaire), « Votre commande » sur gris
   très pâle sans bordure, bande pâle centrée en bas. Au téléphone : le formulaire d'abord, puis la commande (Annie). */
:root{ --ins-bande:#E3ECE7; --ins-champ:#B9C3BD; }
.ins-body{ background:#fff; color:var(--ink); font-family:'Inter', system-ui, sans-serif; }
.ins-nav{ padding:20px 56px; }
.ins-retour{ padding:0 56px; margin-top:28px; font-size:15px; }   /* 915 : plus d'air sous le logo */
.ins-retour a{ color:var(--blue); }                                    /* 915 : « Précédent » en bleu */
.ins-deja a, .ins-changer, .ins-case a{ color:var(--brand-dark); }
.ins-page{ max-width:1180px; margin:40px auto 80px; padding:0 56px; display:grid;
  grid-template-columns:minmax(0,460px) minmax(0,400px); justify-content:space-between; align-items:start; gap:40px; }
.ins-form{ border:1px solid var(--line); border-radius:16px; padding:44px 48px 36px; }
.ins-titre{ font-family:'Plus Jakarta Sans','Inter',sans-serif; font-weight:600; font-size:24px; text-align:center; margin:0 0 28px; }
.ins-alerte{ font-size:14px; }
.ins-deux{ display:grid; grid-template-columns:1fr 1fr; gap:14px; }
.ins-champ{ margin-bottom:20px; }
.ins-champ label, .ins-label-ligne label{ font-size:14px; color:var(--prose); margin-bottom:7px; display:block; }
.ins-champ .form-control{ height:46px; border-color:var(--ins-champ); border-radius:6px; }
.ins-champ .form-control:focus{ border-color:var(--brand-dark); box-shadow:0 0 0 1px var(--brand-dark); }
.ins-label-ligne{ display:flex; justify-content:space-between; align-items:baseline; }
.ins-afficher{ background:none; border:0; padding:0 0 7px; color:var(--brand-dark); font-size:14px; min-height:24px; }
.ins-case{ display:flex; gap:10px; align-items:flex-start; font-size:14px; color:var(--prose); margin:4px 0 22px; line-height:1.5; }
.ins-case .form-check-input{ margin-top:3px; flex:none; width:18px; height:18px; }
.ins-erreur-case{ color:var(--danger); font-size:13px; margin:-14px 0 16px; }
.ins-bouton{ width:100%; height:48px; font-size:16px; font-weight:600; border-radius:8px; display:flex; align-items:center; justify-content:center; gap:8px; }
.ins-deja{ text-align:center; font-size:15px; margin:24px 0 0; color:var(--prose); }
.ins-piege{ position:absolute; left:-10000px; width:1px; height:1px; overflow:hidden; }
.ins-commande{ background:var(--surface); border-radius:16px; overflow:hidden; }
.ins-commande-corps{ padding:32px 32px 26px; }
.ins-commande-titre{ font-family:'Plus Jakarta Sans','Inter',sans-serif; font-weight:600; font-size:22px; margin:0 0 16px; }
.ins-petit{ font-size:14px; color:var(--prose); margin-bottom:8px; }
.ins-forfait{ background:#fff; border-radius:10px; padding:16px; display:flex; justify-content:space-between; align-items:center; gap:12px; margin-bottom:16px; }
.ins-forfait-nom{ display:block; font-size:17px; font-weight:600; }
.ins-changer{ display:inline-block; font-size:13px; margin-top:2px; }
.ins-forfait-prix{ text-align:right; white-space:nowrap; }
.ins-forfait-prix b{ font-size:16px; font-weight:600; }
.ins-province{ display:flex; justify-content:space-between; align-items:center; gap:12px; padding-bottom:16px; border-bottom:1px solid var(--line-strong); }
.ins-province label{ font-size:14px; color:var(--prose); margin:0; }
.ins-province-val{ position:relative; display:inline-flex; align-items:center; max-width:65%; }
/* 917 : triangle deux fois plus gros (demande d'Annie) : dessiné en CSS, net à toute taille. */
.ins-province-val::after{ content:""; width:0; height:0; border-left:6px solid transparent; border-right:6px solid transparent;
  border-top:7px solid var(--ink); margin-left:8px; pointer-events:none; }
/* 916 : discret, comme la maquette : pas de cadre ni de fond ; contour seulement au clavier. */
.ins-province-choix{ appearance:none; -webkit-appearance:none; border:0; background:transparent; padding:4px 0;
  min-height:32px; font:inherit; font-size:15px; font-weight:700; color:var(--ink); text-align:right;
  text-align-last:right; cursor:pointer; max-width:100%; }
.ins-province-choix{ field-sizing:content; }
/* 917 : aucun encadré au clic (demande d'Annie). Pour l'accessibilité au clavier, seul un fin
   soulignement vert sous « Québec » montre que le champ est actif, et SEULEMENT au clavier :
   un clic de souris n'affiche rien. */
.ins-province-choix:focus, .ins-province-choix:focus-visible{ outline:none; box-shadow:none; }
.ins-clavier .ins-province-choix:focus{ text-decoration:underline; text-decoration-color:var(--brand-dark);
  text-decoration-thickness:2px; text-underline-offset:4px; }   /* seulement au clavier (classe posée par la touche Tab) */
.ins-total{ display:flex; justify-content:space-between; align-items:baseline; margin-top:18px; }
.ins-total-libelle{ font-family:'Plus Jakarta Sans','Inter',sans-serif; font-size:21px; font-weight:600; }
.ins-total-montant{ font-size:22px; font-weight:700; }
.ins-sous{ display:flex; justify-content:space-between; gap:12px; font-size:13.5px; margin-top:6px; }
.ins-tx{ color:var(--muted); }
.ins-ensuite{ font-size:13px; color:var(--muted); margin:10px 0 0; }
.ins-bande{ background:var(--ins-bande); padding:17px 24px; display:flex; flex-wrap:wrap; justify-content:center; text-align:center; gap:6px 28px; font-size:14px; font-weight:500; }
.ins-bande span::before{ content:"✓\00a0\00a0"; color:var(--brand-dark); font-weight:700; }
.ins-attente{ max-width:520px; margin:120px auto; padding:0 16px; text-align:center; }
.ins-attente-roue{ color:var(--brand-dark); margin-bottom:18px; }
@media (max-width:900px){
  .ins-page{ grid-template-columns:minmax(0,1fr); max-width:560px; padding:0 16px; margin-top:20px; gap:20px; }
  .ins-nav{ padding:16px; } .ins-retour{ padding:0 16px; margin-top:20px; }
  .ins-form{ padding:28px 20px 24px; }
}
@media (max-width:420px){ .ins-deux{ grid-template-columns:1fr; gap:0; } .ins-commande-corps{ padding:22px 18px 18px; } }

/* ===== 918 : barre publique collée (tout le site) et grand bloc de promo de /prix/ ===== */
html:has(.mf-nav){ scroll-padding-top:calc(var(--lp-nav-h) + 12px); }   /* ancres jamais cachées sous la barre */
.prose-aside{ top:calc(var(--lp-nav-h) + 1.5rem); }                       /* colonne collante du blogue sous la barre */
#forfaits:focus{ outline:none; }
:root{ --promo-hero-fond:#EEF7F2; }
.promo-hero{ background:var(--promo-hero-fond); padding:56px 24px 60px; }
.promo-hero__in{ max-width:1120px; margin:0 auto; display:grid; grid-template-columns:1fr 1fr; gap:110px; align-items:center; }
.promo-hero__sur{ font-size:clamp(14px, 4vw, 17px); font-weight:700; margin:0 0 12px; white-space:nowrap; color:var(--ink); }
.promo-hero__titre{ font-family:'Plus Jakarta Sans','Inter',sans-serif; font-weight:800; font-size:52px; line-height:1.05;
  letter-spacing:-.02em; margin:0; color:var(--ink); }
.promo-hero__titre em{ font-style:normal; color:var(--brand-dark); }
.promo-hero__fin{ font-size:12.5px; color:var(--muted); font-weight:500; margin:26px 0 0; }
.promo-hero__fin a{ color:var(--muted); }
.promo-hero__texte{ font-size:18px; line-height:1.55; color:var(--ink);   /* 928 : demande d'Annie (#0E1B14, comme la grille du bas) */ margin:0 0 22px; }
.promo-hero__cta{ display:inline-block; background:var(--brand); color:var(--sur-vert); font-weight:700; border-radius:8px;   /* 921 : 8 px, arrondi des boutons d'action du site */
  padding:14px 28px; font-size:17px; text-decoration:none; box-shadow:0 4px 14px rgba(3,155,83,.28); }
.promo-hero__cta:hover{ background:var(--brand-dark); color:#fff; }
@media (max-width:991.98px){ .promo-hero__in{ gap:48px; } .promo-hero__titre{ font-size:44px; } }
/* 921 (option A d'Annie, comme l'image FreshBooks) : au téléphone, tout est centré ; surtitre,
   titre, bouton à la largeur de son texte, puis la date sous le bouton. Le paragraphe est masqué
   au téléphone seulement (il reste au bureau). Les deux colonnes s'effacent (display:contents)
   pour que la date puisse passer sous le bouton sans changer le gabarit. */
@media (max-width:760px){
  .promo-hero{ padding:40px 20px 44px; text-align:center; }
  .promo-hero__in{ grid-template-columns:1fr; gap:0; justify-items:center; }
  .promo-hero__gauche, .promo-hero__droite{ display:contents; }
  .promo-hero__sur{ order:1; }
  .promo-hero__titre{ order:2; font-size:38px; }
  .promo-hero__texte{ display:none; }
  .promo-hero__cta{ order:3; display:inline-block; margin-top:22px; padding:14px 34px; }
  .promo-hero__fin{ order:4; margin-top:14px; }
}

/* ======================================================================
   967 : garantie « satisfait ou remboursé » de /prix/ (planches approuvées par Annie, 2 nov. 2026).
   Promo en % : dernière rangée de la bande .promo-hero, pleine largeur ; RETOUCHE approuvée : au bureau,
   l'espace entre « Offre valable… » et la garantie est réduit (la grille garde 110 px entre les colonnes,
   mais l'espace vertical est plus petit). Promo en texte ou aucune promo : garantie seule (.promo-hero--garantie),
   même fond, même forme. Le bouclier flotte doucement, sauf avec prefers-reduced-motion. Aucun survol.
   ====================================================================== */
@media (min-width:761px){ .promo-hero__in{ row-gap:36px; } }   /* retouche : la 2e rangée (garantie) seulement */
.garantie{ grid-column:1 / -1; display:flex; gap:16px; align-items:center; background:#fff; border:1px solid var(--line);
  border-radius:14px; padding:12px 18px; text-align:left; }
.garantie__bouclier{ width:66px; height:76px; flex:none; animation:garantie-flotte 3s ease-in-out infinite; }
.garantie__bouclier .b1{ fill:var(--brand); }
.garantie__bouclier .b2{ fill:var(--brand-dark); }
.garantie__bouclier .n{ fill:#fff; font-family:'Plus Jakarta Sans','Inter',sans-serif; font-size:24px; font-weight:800; }
.garantie__bouclier .j{ fill:var(--brand-soft); font-family:'Inter',sans-serif; font-size:6.5px; font-weight:700; letter-spacing:.6px; }
.garantie__texte{ flex:1; font-size:14.5px; line-height:1.45; color:var(--brand-dark); margin:0; }
.garantie__texte strong{ color:var(--ink); }
.garantie__ok{ display:flex; gap:18px; font-size:13.5px; font-weight:600; color:var(--brand-dark); white-space:nowrap; }
@keyframes garantie-flotte{ 0%,100%{ transform:translateY(0); } 50%{ transform:translateY(-4px); } }
@media (prefers-reduced-motion:reduce){ .garantie__bouclier{ animation:none; } }
.promo-hero--garantie{ padding-top:24px; padding-bottom:24px; }
.promo-hero--garantie .promo-hero__in{ display:block; }
@media (max-width:760px){
  .garantie{ flex-wrap:wrap; order:5; margin-top:24px; width:100%; }
  .garantie__ok{ flex-direction:column; gap:4px; width:100%; padding-left:82px; }
  .promo-hero--garantie{ padding-top:24px; padding-bottom:24px; }
  .promo-hero--garantie .garantie{ margin-top:0; }
}

/* ======================================================================
   922 : un seul arrondi pour les boutons d'action du SITE PUBLIC (pages .lp-body et
   /inscription/ .ins-body) : 8 px (décision d'Annie, 28 oct. 2026). Les boutons Bootstrap
   (.btn) prennent 8 px ici ; les boutons maison (.mf-cta, .ct-send, .bh-btn, .ins-bouton,
   .lp-vid-cta, .promo-hero__cta) portent 8 px dans leur propre règle. Les pastilles et la FAQ
   ne sont pas des boutons d'action : elles gardent leur forme. L'application et Boréal ne
   changent pas. Garde-fou : billing/test_922.py.
   ====================================================================== */
.lp-body .btn, .ins-body .btn{ --bs-btn-border-radius:8px; }

/* ======================================================================
   925 (go d'Annie, 28 oct. 2026) : pages de détail à deux colonnes (facture, soumission,
   gabarit récurrent). Deux colonnes SEULEMENT quand la largeur réelle du contenu, à côté de la
   barre latérale, le permet : 560 px à gauche (le tableau des lignes garde ses colonnes, 920)
   + 360 px à droite (« Note sur la facture » + sa pastille, le statut, sans mot coupé) + 16 px
   = 936 px. En dessous (tablette, téléphone) : une seule colonne, et la carte « Statut » se place
   juste sous la carte principale. Garde-fou : billing/test_925.py.
   ====================================================================== */
.zone-2col{ container-type:inline-size; container-name:page; }
.zone-2col > .row-2col{ display:grid; grid-template-columns:minmax(0,1fr); gap:1rem; margin:0; }
.zone-2col > .row-2col > *{ width:auto; max-width:none; padding:0; margin:0; display:flex; flex-direction:column; gap:1rem; min-width:0; }
.zone-2col > .row-2col > * > *{ margin-top:0 !important; margin-bottom:0 !important; }
@container page (width >= 936px){
  .zone-2col > .row-2col{ grid-template-columns:minmax(0,2fr) minmax(360px,1fr); align-items:start; }
  .zone-2col > .row-2col--75{ grid-template-columns:minmax(0,7fr) minmax(360px,5fr); }
}
@container page (width < 936px){
  /* Une seule colonne : les cartes des deux colonnes forment une seule suite, dans cet ordre :
     carte principale, Statut, le reste de la colonne principale, puis la colonne de côté. */
  .zone-2col > .row-2col > *{ display:contents; }
  .zone-2col > .row-2col > :first-child > *{ order:3; }
  .zone-2col > .row-2col > :first-child > :first-child{ order:1; }
  .zone-2col > .row-2col > :last-child > *{ order:4; }
  .zone-2col > .row-2col .carte-statut{ order:2; }
  .zone-2col > .row-2col .carte-conditions{ order:2; }   /* 930 : conditions de l'offre juste sous la soumission */
  /* 967 (Annie) : fiche d'une facture et d'un gabarit : la colonne principale entière (facture, acomptes, Note ou
     « + Ajouter une note privée ») passe avant Statut ; la colonne de côté suit dans son ordre (Statut, Paiement,
     Lien public, Suivi). Soumissions inchangées (Statut juste sous la soumission, 925). */
  .zone-2col > .row-2col.row-2col--facture .carte-statut{ order:4; }
}

/* ═══ 930 : titre de carte + pastille de visibilité (composant unique, portal/_pastille_visibilite.html) ═══
   La pastille reste à côté du titre ; elle passe dessous seulement si elle manque de place
   (petit téléphone). Contour + icône + fond blanc : jamais confondue avec une pastille de statut
   (pleine, sans icône). Contraste : --brand-dark 5,1:1 et --muted 5,6:1 sur blanc. */
.titre-visibilite{ display:flex; flex-wrap:wrap; align-items:center; column-gap:8px; row-gap:4px; margin-bottom:.5rem; }
.titre-visibilite > .tv-titre{ margin:0; }
span.titre-visibilite{ display:inline-flex; margin:0; }
.pastille-visibilite{ display:inline-flex; align-items:center; gap:5px; border:1px solid; border-radius:999px;
  padding:1px 9px 1px 7px; font-size:12px; font-weight:600; line-height:1.6; white-space:nowrap; background:#fff; }
.pastille-visibilite .bi{ font-size:13px; }
.pastille-visibilite--client{ border-color:var(--brand-dark); color:var(--brand-dark); }
.pastille-visibilite--privee{ border-color:var(--line-strong); color:var(--muted); }
/* 930 : barre repliable « Note sur la facture / la soumission » des formulaires : titre et pastille
   à gauche, « Ajouter / Masquer » à droite, à toutes les largeurs (le bouton centrait son texte). */
.noteint-bar{ text-align:left; }
.noteint-bar .ni-r{ flex-shrink:0; white-space:nowrap; }

/* 950 : composant d'avis déplacé dans avis.css (importé en tête de ce fichier). */

/* ═══ 932 : en-têtes de page (règle d'Annie) ═══
   Titre et pastille à gauche ; « ··· » et bouton principal TOUJOURS au bord droit, même quand ils
   passent à la ligne suivante. Libellés des boutons jamais coupés. Au téléphone, seul le bouton
   principal reste visible : les actions secondaires passent dans le menu « ··· » (.entete-plus). */
.page-header.d-flex{ flex-wrap:wrap; }
.page-header.justify-content-between > :last-child:not(:first-child){ margin-left:auto; }
.page-header .btn{ white-space:nowrap; }

/* ═══ 934 : historique des activités (décisions d'Annie) ═══
   « Voir plus » et « Réduire » (les deux états du même bouton) prennent la couleur du texte de
   l'historique. Au téléphone (toutes les cartes d'historique), la date passe sous le texte, en
   petit gris, et le texte prend toute la largeur.
   (#activite : plus fort que la règle verte des liens, .content-inner a:not(...).) */
#activite .chrono-plus a.chrono-voir,
#activite .chrono-plus a.chrono-voir:hover,
#activite .chrono-plus a.chrono-reduire,
#activite .chrono-plus a.chrono-reduire:hover{ color:rgb(48, 48, 48); }
@media (max-width:767.98px){
  .chrono-item{ flex-direction:column; align-items:stretch; gap:.1rem; }
  .chrono-when{ font-size:12px; white-space:normal; }
}

/* ═══ 936 : en-tête des pages au téléphone et « ··· » (décisions d'Annie, 29 oct. 2026) ═══
   1) « ··· » (en-têtes ET lignes de tableau), partout, bureau compris : survol, toucher, focus et
      menu ouvert en vert pâle (fond --brand-soft, contour --brand). Plus jamais de noir. */
.btn:has(> .bi-three-dots), .btn:has(> .bi-three-dots-vertical){
  --bs-btn-hover-bg:var(--brand-soft); --bs-btn-hover-border-color:var(--brand); --bs-btn-hover-color:var(--brand-dark);
  --bs-btn-active-bg:var(--brand-soft); --bs-btn-active-border-color:var(--brand); --bs-btn-active-color:var(--brand-dark);
}
.btn:has(> .bi-three-dots):is(:focus, :focus-visible),
.btn:has(> .bi-three-dots-vertical):is(:focus, :focus-visible){
  background-color:var(--brand-soft); border-color:var(--brand); color:var(--brand-dark);
}
/* Rangée d'onglets avec UN seul onglet (ex. fiche item « Détails ») : inutile, masquée partout
   (décision d'Annie). Le contenu de l'onglet unique reste affiché. */
.settings-seg:not(:has(> .nav-item:nth-child(2))){ display:none !important; }
/* 2) Au téléphone (< 768 px ; iPad portrait et plus : inchangé). Option B de la maquette d'Annie :
      ligne 1 retour, ligne 2 titre + pastille, ligne 3 barre d'actions pleine largeur (« ··· » à
      gauche, bouton principal .entete-principal qui prend le reste, flèche comprise). Sans bouton
      principal : « ··· » seul à droite sur la ligne du titre. Écart régulier de 12 px ; 20 px avant
      la première carte. Classes nommées dans les gabarits : .entete-actions, .entete-principal. */
@media (max-width:767.98px){
  /* Espacement régulier sur TOUS les en-têtes au téléphone (pages jumelles au même endroit). */
  :is(.retour-lien, :has(> .retour-lien)) ~ .page-header{ margin-top:.75rem; }
  .page-header{ margin-bottom:1.25rem; }
  .page-header:has(.entete-actions){ flex-wrap:wrap; row-gap:.75rem !important; column-gap:.5rem !important; }
  /* Sans bouton principal, le « ··· » reste sur la ligne du titre : si la place manque (360 px),
     c'est la pastille qui passe sous le titre (comme les pastilles de visibilité, 930). */
  .page-header:has(.entete-actions):not(:has(.entete-principal)) > :is(div, h1):first-child{ flex:1 1 0; min-width:0; flex-wrap:wrap; }
  .page-header .entete-actions:not(:has(.entete-principal)){ margin-left:auto; }
  .page-header .entete-actions:has(.entete-principal){
    flex:1 1 100%; display:flex; align-items:stretch; gap:.5rem; margin-left:0 !important; }
  .entete-actions > .dropdown{ flex:0 0 auto; }
  .entete-principal{ flex:1 1 auto; display:flex; min-width:0; }
  .entete-principal :is(form, .btn-group){ flex:1 1 auto; display:flex; min-width:0; }
  .entete-principal .btn:not(.dropdown-toggle-split), .btn.entete-principal{
    flex:1 1 auto; display:inline-flex; justify-content:center; align-items:center; gap:.4rem; }
  .entete-principal .dropdown-toggle-split{ flex:0 0 auto; }
  .btn-sm.entete-principal{ --bs-btn-padding-y:.375rem; --bs-btn-padding-x:.75rem; --bs-btn-font-size:1rem; --bs-btn-border-radius:var(--bs-border-radius); }
  /* 3) Onglets segmentés (fiche client, fiche item, Réglages) : tiennent sur la largeur, sans
        glisser de côté. Jusqu'à 3 onglets : une rangée, chaque onglet selon son libellé ; au-delà
        (Réglages) : grille de 3 colonnes égales, sur deux rangées. */
  .settings-seg{ display:flex; flex-wrap:nowrap; width:100%; overflow:visible;
    -webkit-mask-image:none; mask-image:none; }
  .settings-seg .nav-item{ flex:1 1 auto; min-width:0; }
  .settings-seg:has(> .nav-item:nth-child(4)){ display:grid; grid-template-columns:repeat(3, minmax(0, 1fr)); }
  .settings-seg .nav-link{ width:100%; padding:.4rem .25rem; font-size:.875rem; text-align:center;
    white-space:nowrap; justify-content:center; }
}

/* ═══ 946 (règle d'Annie) : filtres des listes au téléphone et sur iPad portrait (< 992 px) ═══
   Une seule règle : TOUTES les rangées de filtres finissent au bord droit (celui de la recherche), onglets
   compris ; bureau et iPad paysage inchangés. Garde-fou : billing/test_946.py (Chromium et WebKit). */
.filtre-auto{ width:auto; max-width:100%; }
.filtres-extra{ display:contents; }
@media (max-width: 991.98px){
  .periode-liste{ flex:1 1 0; min-width:0; }
  .periode-segments{ flex:1 1 0; min-width:0; }
  .periode-segments .btn-group{ width:100%; }
  .periode-segments .btn-group > .btn{ flex:1 1 auto; }
  #segmentsBar .btn-group{ width:100%; }
  #segmentsBar .btn-group > .btn{ flex:1 1 0; }          /* onglets à parts égales, comme au téléphone */
  .filtres-extra{ flex:1 1 100%; display:grid; grid-template-columns:repeat(2, minmax(0,1fr)); gap:.5rem; }
  .filtres-extra .form-select{ width:100%; min-width:0; }
  #filtreRegion{ flex:1 1 12rem; min-width:0; }
  #filtreRegion .form-select{ flex:1 1 auto; width:auto; min-width:0; }
}
@media (max-width: 575.98px){ .filtres-extra{ grid-template-columns:minmax(0,1fr); } }

/* 948 : « Mes taxes sont exactes » (carte « En vigueur »). */
.tx-confirmer{ border-top:1px solid var(--line); }

/* ═══ 948 : question « inscrite à la TPS/TVQ ? » (inscription et adhésion) ═══ */
.ins-taxes{ border:0; padding:0; margin:0 0 20px; min-width:0; }
.ins-taxes-question{ font-size:14px; color:var(--prose); margin-bottom:7px; float:none; width:auto; padding:0; }
.ins-taxes-choix{ display:flex; width:100%; }
.ins-taxes-choix > .btn{ flex:1 1 auto; padding:.6rem .5rem; font-size:15px; white-space:nowrap; }
.ins-taxes .ins-erreur-case{ margin:6px 0 0; }
.ins-taxes-choix.is-invalid{ border-color:var(--danger); }
.ins-taxes-aide{ font-size:13px; color:var(--muted); margin:8px 0 0; line-height:1.5; }
.ins-taxes-aide a{ color:var(--brand-dark); }

/* 950 : styles sortis des balises (garde-fou test_950 : aucun fond + bordure écrit dans une balise). Mêmes valeurs. */
.barre-groupee{ background:#E6F7EE; border:1px solid #9FE1CB; padding:.5rem 1rem; gap:30px; }
.barre-groupee--factures{ padding:.5rem 1rem .5rem 24px; gap:50px; }
.lp-gpay{ background:#fff; border:1px solid #dadce0; border-radius:11px; padding:11px; font-weight:600; color:#3c4043; }
.apercu-logo{ width:56px; height:56px; border:1px solid var(--line); border-radius:8px; display:flex; align-items:center;
  justify-content:center; overflow:hidden; background:#fff; flex-shrink:0; }


/* ───────────── 953 (Annie) : messages d'erreur sous un champ ─────────────
   UN seul style, sur --danger (le rouge du contour d'un champ en erreur ; 5,25:1 sur blanc).
   .invalid-feedback (Bootstrap) et .erreur-champ (nos messages) ont exactement la même apparence.
   Garde-fous : billing/test_953.py (gabarits, et vrai navigateur : couleur du message = couleur du contour). */
:root{ --bs-form-invalid-color:var(--danger); --bs-form-invalid-border-color:var(--danger); }
.invalid-feedback, .erreur-champ{ color:var(--danger); font-size:.875em; margin-top:.25rem; }
.form-control.is-invalid, .form-select.is-invalid{ border-color:var(--danger); }
/* Champ suivi d'un message .erreur-champ visible (formulaires de l'app rendus sans « is-invalid ») : même contour rouge. */
.form-control:has(~ .erreur-champ:not(.d-none)), .form-select:has(~ .erreur-champ:not(.d-none)){ border-color:var(--danger); }

/* ───────────── 953 (Annie, option A) : cases, boutons radio, interrupteurs, contour de focus ─────────────
   Vert foncé --brand-dark (5,1:1 sur blanc), crochet blanc ; plus aucun bleu de Bootstrap (#0d6efd, #86b7fe,
   rgba(13,110,253,…)). Garde-fou : billing/test_953.py. */
.form-check-input:checked,
.form-check-input[type=checkbox]:indeterminate{ background-color:var(--brand-dark); border-color:var(--brand-dark); }
.form-check-input:focus,
.form-control:focus,
.form-select:focus{ border-color:var(--brand-dark); box-shadow:0 0 0 .25rem var(--focus-anneau); }
.form-control.is-invalid:focus, .form-select.is-invalid:focus{ border-color:var(--danger); box-shadow:0 0 0 .25rem rgba(201, 51, 50, .25); }
.form-switch .form-check-input:focus:not(:checked){
  --bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23037F45'/%3e%3c/svg%3e"); }
.btn-check:focus-visible + .btn, .btn:focus-visible{ box-shadow:0 0 0 .25rem var(--focus-anneau); }
:root{ --bs-focus-ring-color:var(--focus-anneau); }
/* Contours de focus maison encore en bleu ou en vert trop pâle (2,5:1) : vert foncé. */
.btn-chip:focus-visible, .kpi-link:focus-visible{ outline-color:var(--brand-dark); }
.fab-btn:focus-visible{ outline-color:var(--brand-dark); }
.data-table tbody tr.ligne-cliquable:focus-visible{ outline-color:var(--brand-dark); }

/* ═══ 958 (maquette d'Annie du 1er nov. 2026) : section Dépenses ═══ */

/* 960 : les totaux des Dépenses utilisent la disposition des Factures (row g-3 + col-md-4) : plus de .dep-tuiles ni de carte de 3 lignes. */
/* Pastille « Reçu » : même forme que « Sans reçu », vert pâle ; elle ouvre le reçu. */
.badge-recu{ background:var(--brand-soft); color:var(--brand-dark) !important; text-decoration:none !important; position:relative; }
@media (hover:hover){ .badge-recu:hover{background:var(--brand-soft); color:var(--ink) !important; text-decoration:underline !important; } }   /* 961 : soulignement au survol, souris seulement */
.badge-recu::after{ content:""; position:absolute; inset:-10px -6px; }   /* cible tactile de 44 px sans grossir la pastille */
/* L'ancien lien « Reçu » des cartes avait 44 px de haut ; la pastille garde la hauteur de « Sans reçu ». */
.data-table .lien-recu.badge-recu{ display:inline-flex; align-items:center; gap:.25em; min-height:0; padding:.34em .7em; }
.data-table .badge-sansrecu{ display:inline-flex; align-items:center; }   /* même hauteur que « Reçu » */
.data-table .col-status{ text-align:left; }
/* Période : menu sous 992 px (téléphone et iPad portrait) pour Dépenses. */
@media (max-width:991.98px){
  .periode--menu-992 .periode-segments{ display:none !important; }
  .periode--menu-992 .periode-liste{ display:block !important; flex:1 1 0; min-width:0; }
  .periode--menu-992 #anneeSel{ flex:0 0 auto; }
}
@media (min-width:992px){ .periode--menu-992 .periode-liste{ display:none !important; } }
/* Bureau : avec la colonne « Réclamable », la catégorie peut passer à la ligne (jamais coupée) pour que le
   tableau tienne dans sa carte à 1280 avec la barre latérale. */
@container liste (width > 900px){
  .data-table-wrap--depenses .data-table .col-num{ white-space:normal; min-width:9rem; }
}
/* Cartes au téléphone : fournisseur et montant ; pastille et date ; catégorie (gris, passe à la ligne) ;
   le ⋯ centré à droite. Même disposition pour toutes les cartes. */
@container liste (width <= 900px){
  .data-table-wrap--depenses .data-table tr{ grid-template-columns:max-content minmax(0,1fr) auto auto; }
  .data-table-wrap--depenses .data-table .col-main{ grid-column:1 / 3; grid-row:1; }
  .data-table-wrap--depenses .data-table .col-money{ grid-column:3; grid-row:1; }
  .data-table-wrap--depenses .data-table .col-actions{ grid-column:4; grid-row:1 / 4; align-self:center; }
  .data-table-wrap--depenses .data-table .col-status{ grid-column:1; grid-row:2; }
  .data-table-wrap--depenses .data-table .col-date{ grid-column:2 / 4; grid-row:2; }
  .data-table-wrap--depenses .data-table .col-num{ grid-column:1 / 4; grid-row:3; white-space:normal; overflow:visible;
    text-overflow:clip; overflow-wrap:anywhere; padding-right:0; font-size:13px; color:var(--muted); }
  .data-table-wrap--depenses .data-table td.col-num:has(> .vide-mobile:only-child){ display:none; }
}

/* 961 (Annie) : « Choisir une date » dans une case de date vide, sur écran tactile (script de base.html). */
.date-indice-boite{ position:relative; display:block; }
.date-indice{ position:absolute; left:1px; top:1px; bottom:1px; right:2.25rem; display:flex; align-items:center;
  padding-left:calc(.75rem - 1px); color:var(--muted); background:var(--bs-white); border-radius:var(--bs-border-radius);
  pointer-events:none; font-size:inherit; white-space:nowrap; overflow:hidden; }
.date-indice[hidden]{ display:none; }

/* 961 (go d'Annie) : au téléphone, les 2 dates du filtre des Factures se partagent la largeur de la ligne
   (« Choisir une date » entier) ; « Filtrer » passe dessous. */
@media (max-width:575.98px){
  .filtre-dates > div{ flex:1 1 calc(50% - .25rem); min-width:0; }
  .filtre-dates > div > input[type=date], .filtre-dates .date-indice-boite{ width:100%; }
}

/* 971 : « ✨ Remplir les descriptions » = lien (style de « ↻ Traduire du français ») ; nom vide : gris. */
.lien-remplir.lien-inactif{ color:var(--muted) !important; cursor:not-allowed; }
/* 971 : « $ » gris à droite dans un champ de prix (fiche item, lignes de facture et de soumission). */
.champ-dollar{ position:relative; display:block; }
.champ-dollar > input{ padding-right:1.8rem; }
.champ-dollar__signe{ position:absolute; right:.75rem; top:50%; transform:translateY(-50%); color:var(--muted);
  pointer-events:none; }
/* 970 (maquette d'Annie) : fiche d'un item, « ✨ Remplir automatiquement » (fond --brand-soft, comme « Photographier »),
   pleine largeur au téléphone ; champs remplis surlignés comme une lecture de reçu, jusqu'à la première frappe. */
.btn-remplir{ background:var(--brand-soft); color:var(--brand-dark); border:1px solid var(--brand-soft); font-weight:600; }
@media (hover: hover){ .btn-remplir:hover{ background:var(--brand-soft); color:var(--brand-dark); border-color:var(--brand-dark); } }
.btn-remplir:disabled{ background:var(--brand-soft); color:var(--brand-dark); opacity:.55; }
@media (max-width:767.98px){ .btn-remplir{ display:block; width:100%; min-height:44px; } }
.champ-rempli{ background:var(--attention-soft); }
.remplir-ok{ color:var(--brand-dark); }
.lien-traduire{ color:var(--brand-dark); }
.item-separateur{ margin:.25rem 0 0; border-color:var(--line); opacity:1; }

/* 970 (Annie) : « Voir tout → » des cartes du tableau de bord : un lien (jamais un bouton), gras 600, vert ; sur une
   carte avec liste en cartes, son bord droit s'aligne sur celui des montants (script de dashboard.html). Au téléphone : bouton secondaire pleine largeur en bas de la liste (contour gris, fond blanc, 44 px). */
.voir-tout{ font-size:14px; font-weight:500; color:var(--brand-dark); text-decoration:none; white-space:nowrap; }   /* 971 : 14 px, 500 */
@media (hover: hover){ .voir-tout:hover{ color:var(--brand-dark); text-decoration:underline; } }
.voir-tout-bas{ display:none; }
@media (max-width:767.98px){
  .voir-tout-bas{ display:flex; align-items:center; justify-content:center; width:100%; min-height:44px; margin-top:1rem;
    background:#fff; color:var(--ink); border:1px solid var(--line-strong); font-weight:600; }
}

/* 971 (maquette v4) : note à puces vertes (page Catégories). */
.note-puces{ list-style:none; padding-left:0; color:var(--muted); font-size:.9rem; }
.note-puces li{ position:relative; padding-left:1.4rem; margin-bottom:.35rem; }
.note-puces li::before{ content:""; position:absolute; left:.2rem; top:.45em; width:.6rem; height:.6rem; border-radius:50%;
  background:var(--brand-dark); }
.note-puces strong{ color:var(--ink); }
/* 971 : fiche d'un item, libellés « Nom (interne) » (avec son lien) et « Prix unitaire » de même hauteur. */
.item-nom-entete, .item-prix-libelle{ min-height:1.75rem; }
.item-prix-libelle{ display:flex; align-items:center; }

/* 972 : lien « Afficher les N postes à 0 » / « Masquer les postes à 0 » de l'État des résultats (maquette v2 d'Annie,
   code autonome « mf-zeros- »). */
.mf-zeros{display:inline-flex;align-items:center;gap:7px;margin-top:12px;font-family:Inter,system-ui,sans-serif;font-size:13.5px;font-weight:500;color:var(--brand-dark);text-decoration:none;background:none;border:0;padding:0;cursor:pointer}
@media (hover: hover){ .mf-zeros:hover{text-decoration:underline;color:var(--brand-dark)} }
.mf-zeros:focus-visible{outline:2px solid var(--brand-dark);outline-offset:3px;border-radius:4px}
.mf-zeros svg{width:15px;height:15px;flex:none}

/* ===== 975 : bande « Pourquoi mafacture » de l'accueil (maquette finale d'Annie, 4 nov. 2026) ===== */
.pq{ padding:100px 0 90px; background:var(--surface); overflow:hidden; }
.pq-wrap{ max-width:1040px; margin:0 auto; padding:0 40px; }
.pq-surtitre{ font-size:13px; font-weight:600; color:var(--brand-dark); letter-spacing:.02em; margin:0; }
.pq-titre, .pq-tuile h3, .pq-sous-titre, .pq-carte h4, .pq-gros, .pq-jours{
  font-family:"Plus Jakarta Sans", Inter, sans-serif; letter-spacing:-.025em; font-weight:800; color:var(--ink); }
.pq-titre{ font-size:52px; margin:10px 0 48px; line-height:1.05; }
.pq-titre-gris{ color:var(--muted); }
.pq-mosaique{ display:grid; grid-template-columns:repeat(6, minmax(0,1fr)); gap:16px; }
.pq-tuile{ background:#fff; border-radius:26px; padding:30px; overflow:hidden; min-width:0; }
.pq-tuile h3{ font-size:24px; margin:0 0 8px; line-height:1.1; font-weight:700; }
.pq-tuile p{ margin:0; font-size:15px; line-height:1.5; color:var(--prose); }
.pq-tuile--large{ grid-column:span 4; }
.pq-tuile--noire{ grid-column:span 2; background:var(--ink); display:flex; flex-direction:column; }
.pq-tuile--noire h3{ color:#fff; }
.pq-tuile--noire p{ color:var(--line-strong); }
.pq-gros{ font-size:72px; margin-top:auto; padding-top:24px; color:var(--brand); line-height:1; }
.pq-tuile--impots{ grid-column:span 6; display:grid; grid-template-columns:1fr 1.1fr; gap:30px; align-items:center; }
.pq-extrait{ margin-top:24px; background:var(--surface); border-radius:16px; padding:16px 20px; font-size:14px; }
.pq-tuile--impots .pq-extrait{ margin-top:0; }
.pq-paires{ margin:0; }
.pq-paire{ display:flex; justify-content:space-between; gap:12px; padding:6px 0; }
.pq-paire dt{ font-weight:400; min-width:0; }
.pq-paire dd{ margin:0; white-space:nowrap; font-variant-numeric:tabular-nums; }
.pq-paire--gris{ color:var(--muted); }
.pq-paire--total{ font-weight:700; border-top:1px solid var(--line); margin-top:4px; padding-top:10px; }
.pq-paire--total dt{ font-weight:700; }
.pq-lignes{ color:var(--muted); font-size:13px; }
.pq-sous{ display:flex; justify-content:space-between; align-items:flex-end; margin:56px 0 22px; }
.pq-sous-titre{ font-size:28px; margin:0; font-weight:700; }
.pq-fleches{ display:flex; gap:10px; }
.pq-fleche{ width:40px; height:40px; border-radius:50%; background:#fff; border:0; color:var(--muted);
  display:flex; align-items:center; justify-content:center; }
.pq-fleche:disabled{ opacity:.4; }
.pq-fleche:focus-visible, .pq-rail:focus-visible, .pq-lien-prix:focus-visible{ outline:2px solid var(--brand-dark); outline-offset:3px; }
.pq-rail{ display:flex; gap:16px; overflow-x:auto; scroll-snap-type:x mandatory; scrollbar-width:none;
  padding-left:max(40px, calc((100vw - 1040px) / 2 + 40px)); padding-right:40px; scroll-padding-left:max(40px, calc((100vw - 1040px) / 2 + 40px)); }
.pq-rail::-webkit-scrollbar{ display:none; }
.pq-carte{ flex:none; width:400px; height:380px; border-radius:28px; padding:34px; display:flex; flex-direction:column;
  background:#fff; scroll-snap-align:start; }
.pq-etiquette{ font-size:13px; font-weight:600; color:var(--brand-dark); margin:0; }
.pq-visuel{ margin:auto 0 24px; }
.pq-carte h4{ font-size:28px; line-height:1.08; margin:0 0 10px; font-weight:700; }
.pq-carte p:not(.pq-etiquette){ margin:0; font-size:15.5px; line-height:1.5; color:var(--prose); }
.pq-carte--garantie{ background:linear-gradient(160deg, var(--ink), var(--vert-nuit)); }
.pq-carte--garantie h4{ color:#fff; }
.pq-carte--garantie p:not(.pq-etiquette){ color:var(--line-strong); }
.pq-carte--garantie .pq-etiquette{ color:var(--brand); }
.pq-langues{ display:flex; gap:8px; }
.pq-langue{ border:1px solid var(--line); border-radius:999px; padding:7px 14px; font-size:14px; font-weight:600; }
.pq-langue--on{ background:var(--ink); color:#fff; border-color:var(--ink); }
.pq-recu{ display:flex; gap:12px; align-items:center; font-size:14px; }
.pq-recu-vignette{ width:44px; height:56px; border-radius:8px; background:var(--surface); border:1px solid var(--line); display:block; flex:none; }
.pq-recu b{ display:block; }
.pq-recu small{ color:var(--muted); }
.pq-jours{ font-size:64px; color:var(--brand); line-height:1; }
.pq-fin{ margin-top:44px; }
/* 978 : lien texte « Voir les prix › » (remplace le bouton noir « Commencer »), --ink, 17 px, poids 500. */
/* 981 : seul le texte se souligne (survol, focus clavier) ; le chevron est une boîte atomique (inline-block), que le
   soulignement du lien ne traverse jamais, et il glisse de 2 px (0,2 s), sauf avec « réduire les animations ». */
.pq-lien-prix{ display:inline-block; color:var(--ink); font-size:17px; font-weight:500;
  text-decoration:none; text-underline-offset:3px; }
.pq-lien-prix > span{ display:inline-block; margin-left:.35em; text-decoration:none; transition:transform .2s ease; }
.pq-lien-prix:focus-visible{ text-decoration:underline; }
.pq-lien-prix:focus-visible > span{ transform:translateX(2px); }
@media (hover: hover){ .pq-lien-prix:hover{ color:var(--ink); text-decoration:underline; }
  .pq-lien-prix:hover > span{ transform:translateX(2px); } }
@media (prefers-reduced-motion:reduce){ .pq-lien-prix > span{ transition:none; transform:none !important; } }
@media (max-width:1000px){
  .pq-titre{ font-size:44px; }
  .pq-tuile--large, .pq-tuile--noire, .pq-tuile--impots{ grid-column:span 6; }
  .pq-tuile--noire{ min-height:200px; }
  .pq-tuile--impots{ grid-template-columns:1fr; }
  .pq-carte{ width:340px; height:360px; }
}
@media (max-width:991.98px), (hover: none){ .pq-fleches{ display:none; } }   /* flèches au bureau seulement */
@media (max-width:639px){
  .pq-wrap{ padding:0 16px; }
  .pq{ padding:56px 0 52px; }
  .pq-titre{ font-size:34px; margin-bottom:28px; }
  .pq-mosaique{ gap:12px; }
  .pq-tuile{ padding:22px; border-radius:22px; }
  .pq-tuile h3{ font-size:21px; }
  .pq-gros{ font-size:56px; }
  .pq-sous{ margin:40px 0 16px; }
  .pq-sous-titre{ font-size:22px; }
  .pq-rail{ padding-left:16px; padding-right:16px; scroll-padding-left:16px; gap:12px; }
  .pq-carte{ width:78vw; height:340px; padding:26px; border-radius:24px; }
  .pq-carte h4{ font-size:24px; }
  .pq-jours{ font-size:52px; }
}

/* ======================================================================
   979 : effet « rideau » de /prix/ (démo d'Annie, 5 nov. 2026). Le bandeau promo (.rideau-bandeau) devient fixe en
   couche inférieure SEULEMENT quand le script l'a mesuré (html.rideau-actif) ; la feuille (.rideau-feuille : menu
   collé + contenu, fond blanc opaque) glisse par-dessus, avec une ombre au bord haut. Sans JavaScript, à l'impression
   ou si le bandeau est trop haut pour l'écran : flux normal.
   ====================================================================== */
.rideau-feuille{ position:relative; z-index:1; background:#fff; display:flex; flex-direction:column; flex:1 0 auto; }
html.rideau-actif .rideau-bandeau{ position:fixed; top:0; left:0; right:0; z-index:0; }
/* 980 (option A d'Annie) : l'ombre n'apparaît que quand la page commence à monter sur le bandeau (html.rideau-defile),
   avec un fondu de 0,2 s ; au repos, la page blanche commence net au bas de la promo. Fond du bandeau = celui de la promo. */
.rideau-bandeau{ background:var(--promo-hero-fond); }
.rideau-repere{ position:absolute; top:0; left:0; width:1px; height:1px; pointer-events:none; }
html.rideau-actif .rideau-feuille{ box-shadow:0 -12px 30px rgba(14,27,20,0); transition:box-shadow .2s ease; }
html.rideau-actif.rideau-defile .rideau-feuille{ box-shadow:0 -12px 30px rgba(14,27,20,.10); }
@media print{
  html.rideau-actif .rideau-bandeau{ position:static; }
  html.rideau-actif .rideau-feuille{ margin-top:0 !important; box-shadow:none; }
}
/* 979 : ligne de garantie du bandeau, téléphone seulement (même vert et même poids que les crochets). */
.promo-hero__garantie-ligne{ display:none; }
@media (max-width:760px){
  #promoHero .garantie{ display:none; }
  .promo-hero__garantie-ligne{ display:block; order:4; margin:12px 0 0; font-size:13.5px; font-weight:600;
    color:var(--brand-dark); }
  #promoHero .promo-hero__fin{ order:5; }
}

/* ======================================================================
   980 : menu commun en « verre dépoli » (maquette d'Annie, version 3 à 78 %). Au repos : blanc plein, sans bordure ni
   ombre. Collé (attribut data-colle posé par le repère .mf-nav-repere, sans calcul au défilement) : blanc à 78 % +
   flou, filet de 1 px. Navigateur sans backdrop-filter : blanc plein + filet. Transition de 0,2 s. La variante sombre
   d'À propos (.mf-nav--sombre) garde son fond.
   ====================================================================== */
.mf-nav-repere{ height:1px; margin-bottom:-1px; pointer-events:none; }
.lp-nav.mf-nav:not(.mf-nav--sombre){ background:#fff; border-bottom:1px solid transparent; box-shadow:none;
  transition:background-color .2s ease, border-color .2s ease; }
.lp-nav.mf-nav:not(.mf-nav--sombre)[data-colle]{ border-bottom-color:rgba(20,32,26,.08); }
@supports ((-webkit-backdrop-filter: blur(1px)) or (backdrop-filter: blur(1px))){
  .lp-nav.mf-nav:not(.mf-nav--sombre)[data-colle]{ background:rgba(255,255,255,.78);
    -webkit-backdrop-filter:saturate(180%) blur(16px); backdrop-filter:saturate(180%) blur(16px); }
}
@media (prefers-reduced-motion:reduce){ .lp-nav.mf-nav:not(.mf-nav--sombre), html.rideau-actif .rideau-feuille{ transition:none; } }

/* 982 (go d'Annie du 5 nov. 2026, maquette « calculateur inversé final ») : calculateur de la page Calcul inverse TPS TVQ.
   987 (go d'Annie du 6 nov. 2026, version A) : résultats en liste à deux colonnes, à toutes les tailles (le tableau à
   3 colonnes des 982 à 986 est retiré). Chaque ligne copiable est un vrai bouton (.ci-ligne) : toute la ligne est la zone
   de toucher (52 px ; 46 px pour TPS et TVQ, en retrait de 16 px). Montants alignés à droite, chiffres tabulaires.
   Au-dessus de 480 px, la liste fait au plus 440 px, à gauche sous le champ ; dessous, toute la largeur de la carte. */
.ci-carte{ --ci-trait:#D3D9D5; --ci-icone:#9AA49E; }
/* 988 (version B, maquette d'Annie du 6 nov. 2026) : au-dessus de 700 px, deux colonnes dans la carte (champ 260 px à
   gauche, résultats à droite sur fond gris très pâle) ; de 481 à 700 px, résultats sous le champ, même fond ; 480 px et
   moins, liste pleine largeur sans fond, aide masquée. CHAQUE ligne, total compris, est une grille de 3 cases : libellé
   minmax(0, 1fr), montant auto aligné à droite, case icône de 16 px (17 px au téléphone), écart de 10 px. Le « $ » de
   tous les montants tombe ainsi sur la même verticale, à toutes les tailles. */
.ci-aide{ font-size:13px; color:var(--muted); margin:10px 0 0; line-height:1.5; }
.ci-res{ background:#F6F8F7; border-radius:12px; padding:10px 20px 14px; margin-top:16px; font-variant-numeric:tabular-nums; }
@media (min-width:701px){
  .ci-grille{ display:grid; grid-template-columns:260px minmax(0, 1fr); gap:28px; align-items:start; }
  .ci-res{ margin-top:0; }
}
.ci-ligne{ position:relative; display:grid; grid-template-columns:minmax(0, 1fr) auto 16px; column-gap:10px;
  align-items:center; width:calc(100% + 20px); min-height:52px; margin:0 -10px; padding:0 10px; border:0;
  border-radius:10px; background:none; color:var(--ink); font:400 15px Inter, sans-serif; text-align:left;
  -webkit-tap-highlight-color:transparent; transition:background-color .15s; }
button.ci-ligne{ cursor:pointer; }
.ci-lib{ min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.ci-m{ text-align:right; font-weight:600; white-space:nowrap; font-variant-numeric:tabular-nums; }
.ci-case{ display:flex; width:100%; }
.ci-ligne--gros{ min-height:58px; }
.ci-ligne--gros .ci-lib{ font-weight:600; }
.ci-ligne--gros .ci-m{ font-size:21px; font-weight:700; }
.ci-ligne--sous{ min-height:46px; }
.ci-ligne--sous .ci-lib{ padding-left:16px; color:var(--muted); font-size:14px; }
.ci-ligne--sous .ci-m{ font-size:14px; font-weight:500; }
.ci-ligne--fort .ci-lib{ font-weight:600; }
.ci-ligne--total{ min-height:58px; margin:6px -10px 0; padding-top:6px; border-top:1px solid var(--ci-trait); border-radius:0; }
.ci-ligne--total .ci-lib{ font-weight:700; font-size:17px; }
.ci-totm{ font-weight:700; font-size:21px; color:var(--brand-dark); }
.ci-ic{ width:16px; height:16px; flex:none; color:var(--ci-icone); transition:color .15s; }
.ci-ok{ display:none; }
.ci-ligne.copie{ background:var(--brand-soft); }
.ci-ligne.copie .ci-ok{ display:block; color:var(--brand-dark); }
.ci-ligne.copie .ci-cp{ display:none; }
@media (hover: hover){ button.ci-ligne:hover{ background:var(--brand-soft); } button.ci-ligne:hover .ci-ic{ color:var(--brand-dark); } }
button.ci-ligne:focus-visible{ outline:2px solid var(--brand-dark); outline-offset:1px; }
.ci-pill{ position:absolute; right:4px; top:-11px; background:var(--brand-dark); color:#fff; font-size:11px; font-weight:700;
  padding:3px 8px; border-radius:999px; white-space:nowrap; opacity:0; pointer-events:none; transition:opacity .2s; z-index:2; }
.ci-ligne.copie .ci-pill{ opacity:1; }
.ci-apres{ max-height:0; overflow:hidden; opacity:0; transition:max-height .3s, opacity .3s, margin .3s; font-size:14px;
  color:var(--muted); line-height:1.5; }
.ci-apres.vu{ max-height:80px; opacity:1; margin-top:10px; }
.ci-apres a{ color:var(--brand-dark); font-weight:600; text-decoration:none; }
@media (hover: hover){ .ci-apres a:hover{ text-decoration:underline; } }
.ci-cta{ background:var(--ink); color:#fff; border-radius:16px; padding:34px 36px; margin-top:1.5rem;
  scroll-margin-top:calc(var(--lp-nav-h) + 16px); }
.ci-cta-titre{ font-family:Inter, sans-serif; font-size:24px; font-weight:700; letter-spacing:-.01em; line-height:1.3;
  color:#fff; margin:0; }
.ci-cta-titre em{ font-style:normal; color:#7ED592; }
.ci-choix{ display:grid; grid-template-columns:1fr 1fr; gap:14px; margin:22px 0 26px; }
.ci-choix-carte{ background:rgba(255,255,255,.06); border:1px solid rgba(255,255,255,.1); border-radius:12px; padding:18px; }
.ci-choix-carte svg{ width:24px; height:24px; color:#7ED592; display:block; }
.ci-choix-carte b{ display:block; font-size:15px; margin:10px 0 4px; }
.ci-choix-carte span{ font-size:14px; color:#C9D3CD; line-height:1.5; }
.ci-choix-carte strong{ color:#fff; }
.ci-bas{ display:flex; align-items:center; gap:14px 22px; flex-wrap:wrap; }
.ci-bouton{ font-weight:700; font-size:16px; padding:13px 26px; white-space:nowrap; color:var(--ink); }
.ci-offre{ font-size:14px; color:#C9D3CD; line-height:1.5; }
.ci-offre b{ color:#fff; }
.ci-offre i{ font-style:normal; color:#7ED592; }
@media (max-width:700px){
  .ci-choix{ grid-template-columns:1fr; }
  .ci-cta{ padding:26px 22px; }
  .ci-cta-titre{ font-size:21px; }
}
@media (max-width:480px){
  .calc-card.ci-carte{ padding:18px 14px 14px; }
  .ci-aide{ display:none; }
  .ci-res{ background:none; padding:0; margin-top:8px; border-radius:0; }
  .ci-ligne{ grid-template-columns:minmax(0, 1fr) auto 17px; width:calc(100% + 16px); margin:0 -8px; padding:0 8px; }
  .ci-ligne--total{ margin:6px -8px 0; padding-top:6px; }
  .ci-ic{ width:17px; height:17px; }
  .ci-ligne--gros .ci-m, .ci-totm{ font-size:19px; }
  .ci-bouton{ width:100%; text-align:center; }
  .ci-offre{ width:100%; text-align:center; }
}
@media (prefers-reduced-motion:reduce){ .ci-ligne, .ci-ic, .ci-pill, .ci-apres{ transition:none; } }

/* 993 : styles des pages calculateurs (Calcul TPS TVQ, Calcul inverse, Frais de kilométrage), sortis de
   calculator.html (même ordre, à la fin de la feuille comme l'était le bloc <style> de la page). */
.calc-wrap { max-width: 760px; }
.calc-card { background:#fff; border:1px solid #e7ece8; border-radius:18px; padding:24px; box-shadow:0 10px 30px rgba(14,27,20,.06); }
.calc-card label { font-weight:600; color:#0E1B14; margin-bottom:6px; display:block; }
.calc-input { font-size:1.4rem; font-weight:700; padding:14px 16px; border:2px solid #d9e2dc; border-radius:12px; width:100%; }
.calc-input:focus { outline:none; border-color:#00BE65; box-shadow:0 0 0 3px rgba(0,190,101,.15); }
.calc-row { display:flex; justify-content:space-between; align-items:center; padding:10px 0; border-bottom:1px solid #eef2ef; }
.calc-row:last-child { border-bottom:0; }
.calc-row .v { font-variant-numeric: tabular-nums; font-weight:600; white-space:nowrap; padding-left:10px; }
.calc-total { font-size:1.25rem; }
.calc-total .v { color:#00a257; font-weight:800; }
.calc-section h2 { font-family:'Plus Jakarta Sans',sans-serif; font-weight:800; font-size:1.35rem; margin-top:2.2rem; margin-bottom:.6rem; color:#0E1B14; }
.calc-section p, .calc-section li { color:#3a463f; line-height:1.65; }
.rate-table { width:100%; border-collapse:collapse; margin:.5rem 0; }
.rate-table th, .rate-table td { text-align:left; padding:10px 12px; border-bottom:1px solid #eef2ef; }
.rate-table th { font-size:.8rem; text-transform:uppercase; letter-spacing:.05em; color:var(--muted); }   /* 858 : contraste ≥ 4,5:1 */
.calc-body-img { width:100%; max-width:560px; height:auto; border-radius:12px; border:1px solid #e7ece8; margin:.5rem 0; }

/* 993 (go d'Annie du 6 nov. 2026, maquette « Frais de kilométrage ») : ajouts au composant .ci-* pour la page
   /frais-kilometrage/ : deux onglets (boutons de 44 px au moins), unité à droite du champ, case « inscrit », ligne
   d'information non copiable (proportion), aide gardée au téléphone (elle porte la limite des 5 000 km), exemples. */
.ci-onglets{ display:flex; gap:6px; background:var(--surface); padding:5px; border-radius:12px; margin-bottom:18px; }
.ci-onglet{ flex:1 1 0; min-width:0; min-height:44px; border:0; background:none; border-radius:9px; padding:10px 10px;
  font:600 14px/1.3 Inter, sans-serif; color:var(--muted); cursor:pointer; -webkit-tap-highlight-color:transparent; }
.ci-onglet[aria-selected="true"]{ background:#fff; color:var(--ink); box-shadow:0 1px 3px rgba(0,0,0,.08); }
.ci-onglet:focus-visible{ outline:2px solid var(--brand-dark); outline-offset:1px; }
.ci-panneau[hidden]{ display:none; }
.ci-champ + .ci-champ{ margin-top:14px; }
.ci-suffixe{ position:relative; }
.ci-suffixe .calc-input{ padding-right:64px; }
.ci-suffixe > span{ position:absolute; right:14px; top:50%; transform:translateY(-50%); color:var(--muted); font-weight:600;
  pointer-events:none; }
.calc-card label.ci-coche{ display:flex; align-items:center; gap:10px; min-height:44px; margin:10px 0 0; font-weight:500;
  font-size:14px; cursor:pointer; }
.ci-coche .form-check-input{ width:20px; height:20px; margin:0; flex:none; }
.ci-ligne--info{ cursor:default; }
.ci-ligne--info .ci-lib{ color:var(--muted); }
.ci-ligne[hidden]{ display:none; }
.calc-intro{ color:var(--prose); }
.km-exemple{ background:var(--surface); border-radius:12px; padding:16px 18px; margin:14px 0; }
.km-exemple p{ font-size:15px; margin:0; }
.km-source{ font-size:13px; color:var(--muted); margin-top:8px; }
/* 993 (retouche d'Annie) : hiérarchie des titres de la page Frais de kilométrage = celle des articles du blogue
   (article.blog-body : h2 1,45 rem, h3 1,12 rem, à toutes les tailles). Sans cette règle, le h3 prenait la taille de
   Bootstrap (jusqu'à 1,75 rem) et paraissait plus gros que le h2. Pages TPS et blogue inchangés (classe .km-page). */
.km-page .calc-section h2{ font-size:1.45rem; margin-top:2.4rem; margin-bottom:.7rem; }
.km-page .calc-section h3{ font-family:'Plus Jakarta Sans',sans-serif; font-weight:700; font-size:1.12rem;
  margin-top:1.6rem; margin-bottom:.5rem; color:var(--ink); }
.rate-table th.n{ text-align:right; }
.rate-table td.n{ text-align:right; white-space:nowrap; font-variant-numeric:tabular-nums; }
@media (max-width:480px){
  .ci-aide.ci-aide--garde{ display:block; }
  .ci-onglet{ font-size:13px; padding:10px 6px; }
  .km-page .rate-table th, .km-page .rate-table td{ padding:10px 6px; }
  .km-page .rate-table td.n{ white-space:normal; }   /* « 1 100 $ par mois avant taxes » passe à la ligne ; montant et $ restent liés */
}
