/* Calculateur de tarif — feuille séparée, chargée par les seules pages qui
   en ont besoin. Les pages existantes ne paient donc rien pour ce code, et
   style.css n'a pas à changer de version (ce qui aurait invalidé le cache
   des neuf pages du site d'un coup). Les jetons de couleur viennent de
   style.css : --blue, --ink, --muted, --line, --pale. */

/* --- La carte ------------------------------------------------------------
   Deux colonnes : la saisie sur fond blanc, le résultat sur fond sombre.
   C'est tout l'enjeu du bloc — une page faite de blanc et de bleu pâle ne
   donne aucun poids à ce qui compte. Le panneau sombre fait ressortir le
   total, et il raccourcit la carte de moitié en hauteur.                  */

.calc {
  display: grid;
  grid-template-columns: 1fr 0.74fr;
  background: white;
  border-radius: 16px;
  overflow: hidden;
  margin: 44px 0 30px;
  box-shadow: 0 2px 4px rgba(21, 44, 75, .06),
              0 26px 56px -28px rgba(21, 44, 75, .34);
}

/* `hidden` est une règle du navigateur à faible priorité : le
   `display: grid` ci-dessus la battrait, et le bloc resterait visible sans
   JavaScript avec un total vide. Il faut donc la réaffirmer ici. */
.calc[hidden] { display: none; }

/* --- Colonne de saisie --------------------------------------------------- */

.calc-saisie {
  padding: 36px 38px 34px;
  border: 1px solid var(--line);
  border-right: 0;
  border-radius: 16px 0 0 16px;
}

.calc-titre {
  font-family: Manrope, system-ui, sans-serif;
  font-weight: 600;
  font-size: 24px;
  letter-spacing: -0.6px;
  margin: 0 0 5px;
  color: var(--ink);
}

.calc-sous { color: var(--muted); font-size: 14.5px; margin: 0 0 28px; line-height: 1.6; }

.calc-champ { margin: 0 0 26px; padding: 0; border: 0; min-width: 0; }
.calc-champ:last-child { margin-bottom: 0; }

.calc-champ > legend,
.calc-label {
  display: block;
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: 1.6px;
  color: var(--ink);
  margin: 0 0 12px;
  padding: 0;
}

/* --- Nombre de cassettes : − [ 12 ] + ------------------------------------ */

.calc-nombre { display: flex; align-items: stretch; gap: 9px; max-width: 214px; }

.calc-pas {
  width: 44px;
  flex: 0 0 44px;
  border: 1px solid var(--line);
  background: white;
  border-radius: 8px;
  font-size: 20px;
  line-height: 1;
  color: var(--ink);
  cursor: pointer;
  transition: border-color .18s, color .18s;
}

.calc-pas:hover:not(:disabled) { border-color: var(--blue); color: var(--blue); }
.calc-pas:disabled { opacity: .35; cursor: default; }

.calc-nombre input {
  flex: 1 1 auto;
  width: 100%;
  min-width: 0;
  text-align: center;
  font-family: Manrope, system-ui, sans-serif;
  font-size: 19px;
  font-weight: 600;
  color: var(--ink);
  padding: 11px 6px;
  border: 1px solid var(--line);
  border-radius: 8px;
  background: white;
  -moz-appearance: textfield;
}

.calc-nombre input::-webkit-outer-spin-button,
.calc-nombre input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.calc-nombre input:focus-visible { outline: 2px solid var(--blue); outline-offset: 1px; }

/* Sous le compteur : ce que « un element » recouvre, et a quel prix. Le
   montant vient de TARIFS, pas du HTML — comme partout ailleurs ici. */
.calc-aide { font-size: 13px; color: var(--muted); line-height: 1.6; margin: 11px 0 0; }

/* --- Choix du support ----------------------------------------------------
   Grille plutôt que flex : l'entrée radio occupe les deux rangées de la
   première colonne, le titre et la description s'empilent dans la seconde.
   Le balisage reste plat — input, b, span frères — donc aucun span
   d'emballage dont les styles retomberaient sur la description.          */

.calc-options { display: grid; gap: 9px; border: 0; margin: 0; padding: 0; }

.calc-option {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: 2px 13px;
  align-items: start;
  padding: 14px 16px;
  background: white;
  border: 1px solid var(--line);
  border-radius: 9px;
  cursor: pointer;
  transition: border-color .18s, background .18s, box-shadow .18s;
}

.calc-option:hover { border-color: #b9ccea; }
.calc-option input { grid-row: 1 / 3; margin: 3px 0 0; accent-color: var(--blue); }
.calc-option:has(input:checked) { border-color: var(--blue); background: #f5f9ff; box-shadow: inset 0 0 0 1px var(--blue); }
.calc-option:has(input:focus-visible) { outline: 2px solid var(--blue); outline-offset: 2px; }
/* Une rangee a quantite n est plus un <label> cliquable : c est un <div>
   qui contient son propre compteur. L etat  actif  ne peut donc plus venir
   de :has(input:checked) — une valeur superieure a zero ne se lit pas en
   CSS. C est le script qui pose la classe. */
div.calc-option { cursor: default; }
.calc-option.actif { border-color: var(--blue); background: #f5f9ff; box-shadow: inset 0 0 0 1px var(--blue); }

/* --- Le compteur d une rangee ------------------------------------------- */
.calc-qte { grid-row: 1 / 3; align-self: center; display: flex; align-items: stretch; gap: 4px; }
.calc-qte button {
  width: 28px; flex: 0 0 28px;
  border: 1px solid var(--line); background: white; border-radius: 6px;
  font-size: 15px; line-height: 1; color: var(--ink); cursor: pointer;
  transition: border-color .18s, color .18s;
}
.calc-qte button:hover:not(:disabled) { border-color: var(--blue); color: var(--blue); }
.calc-qte button:disabled { opacity: .3; cursor: default; }
.calc-qte input {
  width: 34px; min-width: 0; text-align: center;
  font-family: Manrope, system-ui, sans-serif; font-weight: 600; font-size: 14.5px;
  color: var(--ink); padding: 6px 2px;
  border: 1px solid var(--line); border-radius: 6px; background: white;
  -moz-appearance: textfield;
}
.calc-qte input::-webkit-outer-spin-button,
.calc-qte input::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.calc-qte input:focus-visible { outline: 2px solid var(--blue); outline-offset: 1px; }

.calc-option b { grid-column: 2; font-weight: 600; font-size: 15px; color: var(--ink); }

/* --- Troisieme colonne : le prix de la prestation ------------------------
   Ajoutee pour la page des forfaits. Les options de la page VHS n ont pas
   de prix a afficher ; sans troisieme enfant, la colonne  auto  se reduit
   a zero et leur mise en page ne bouge pas. */
/* Selecteur a deux classes, et non une : .calc-option span vaut (0,1,1) et
   l emporterait sinon sur .calc-option-prix (0,1,0) — le prix repartait en
   colonne 2, au-dessus du titre. Une specificite plus faible ne gagne pas
   parce qu elle est plus precise a la lecture. */
.calc-option .calc-option-prix {
  grid-column: 3;
  grid-row: 1 / 3;
  align-self: center;
  font-family: Manrope, system-ui, sans-serif;
  font-weight: 600;
  font-size: 16px;
  color: var(--ink);
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
}
.calc-option .calc-option-prix small { display: block; font-size: 11px; font-weight: 400; color: var(--muted); letter-spacing: .3px; }

/* Les options rattachees au forfait : un filet a gauche montre la
   dependance sans avoir a l ecrire. */
.calc-rattache { padding-left: 17px; border-left: 2px solid var(--line); margin-top: 11px; }
.calc-rattache .calc-label { font-size: 10.5px; color: var(--muted); margin-bottom: 9px; }
.calc-option span { grid-column: 2; font-size: 13px; color: var(--muted); line-height: 1.55; }

/* --- Panneau de résultat, sur fond sombre -------------------------------- */

.calc-resultat {
  background: #18354e;
  /* Meme famille de degrade que .bandeau, mais recalibree : le panneau est
     haut et etroit la ou le bandeau est large et court, donc la halo doit
     rester une tache en haut plutot qu un lavis sur toute la hauteur. */
  background-image:
    radial-gradient(86% 52% at 88% 0%, rgba(72, 134, 205, .22), transparent 60%),
    linear-gradient(165deg, #1d4060 0%, #18354e 48%, #132b41 100%);
  color: #e3ecf8;
  padding: 34px 32px 30px;
  display: flex;
  flex-direction: column;
  /* Centré plutôt que collé en haut : la colonne de gauche est plus
     haute, et un bouton poussé tout en bas laissait un grand vide. */
  justify-content: center;
}

.calc-resultat-titre {
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: 1.6px;
  color: #8fb3dd;
  margin: 0 0 18px;
}

.calc-ligne {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 16px;
  font-size: 14.5px;
  padding: 8px 0;
  color: #e3ecf8;
}

.calc-ligne span:last-child { white-space: nowrap; font-variant-numeric: tabular-nums; }
.calc-ligne.calc-vide { color: #90aece; }

.calc-total {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 16px;
  margin-top: 16px;
  padding-top: 18px;
  border-top: 1px solid #ffffff26;
}

.calc-total > span:first-child {
  font-size: 11.5px;
  font-weight: 700;
  letter-spacing: 1.6px;
  color: #8fb3dd;
}

.calc-total strong {
  font-family: Manrope, system-ui, sans-serif;
  font-size: 38px;
  font-weight: 600;
  letter-spacing: -1.4px;
  color: #a8d3ff;
  line-height: 1;
  font-variant-numeric: tabular-nums;
}

.calc-note { font-size: 12.5px; color: #9bb8d8; line-height: 1.65; margin: 16px 0 0; }

/* `margin-top: auto` colle le bouton en bas du panneau quelle que soit la
   longueur du détail : la carte garde la même silhouette à 1 ou 23 cassettes. */
.calc-actions { margin-top: 26px; }
.calc-actions .button { width: 100%; justify-content: center; }

/* --- Grille tarifaire, repliée ------------------------------------------
   Repliée parce qu'elle répète le calculateur : la laisser ouverte juste
   en dessous donnait deux fois la même information, la seconde plus lourde
   que la première. <details> fonctionne sans JavaScript, donc un visiteur
   qui n'a pas le calculateur garde l'accès aux tarifs.                   */

/* style.css habille <details> et <summary> pour la FAQ, mais sans limiter
   ses règles à celle-ci : un bord en bas, un gros rembourrage, et surtout
   une flèche + / − en position absolue contre le bord droit. Tout cela
   retombe ici — d'où la flèche égarée à 700 px de son libellé. On remet
   donc chaque propriété héritée à sa place, y compris celles qu'on ne
   change pas (position, top, right) : les redéclarer est le seul moyen de
   les annuler. Une spécificité plus forte n'éteint pas ce qu'elle tait. */
.calc-grille-repli { border: 0; border-top: 1px solid var(--line); padding-top: 22px; }

.calc-grille-repli > summary {
  position: static;
  cursor: pointer;
  font-size: 13px;
  font-weight: 600;
  color: var(--blue);
  list-style: none;
  padding: 2px 0;
}

.calc-grille-repli > summary::-webkit-details-marker { display: none; }
.calc-grille-repli > summary::after { content: ' \2193'; }
.calc-grille-repli > summary::after,
.calc-grille-repli[open] > summary::after {
  position: static;
  top: auto;
  right: auto;
  font-size: inherit;
  font-weight: inherit;
  color: inherit;
}

.calc-grille-repli[open] > summary::after { content: ' \2191'; }

.calc-grille { width: 100%; border-collapse: collapse; margin: 18px 0 0; font-size: 14.5px; }
.calc-grille caption { text-align: left; font-size: 12.5px; color: var(--muted); padding-bottom: 12px; }
.calc-grille th, .calc-grille td { text-align: left; padding: 12px 14px; border-bottom: 1px solid var(--line); }
.calc-grille th { font-size: 11.5px; font-weight: 700; letter-spacing: 1.4px; color: var(--ink); }

/* Intertitre dans le corps du tableau : il regroupe sans imiter l en-tete,
   d ou un fond pale plutot qu un filet de plus. */
.calc-grille tbody th { background: var(--pale); font-size: 10.5px; color: var(--muted); padding-top: 14px; padding-bottom: 8px; }
.calc-grille td:last-child, .calc-grille th:last-child { text-align: right; white-space: nowrap; font-variant-numeric: tabular-nums; }

/* En mobile, compteur + texte + prix sur une seule rangee laissaient 127 px
   au libelle : trois lignes pour  Reinstallation, donnees conservees . On
   empile donc titre+prix, puis la description, puis le compteur.
   :has(.calc-qte) limite la regle aux rangees a quantite — les options de
   la page VHS, qui n ont qu une case a cocher, gardent leur mise en page. */
@media (max-width: 760px) {
  .calc-option:has(.calc-qte) { grid-template-columns: 1fr auto; gap: 4px 12px; }
  .calc-option:has(.calc-qte) b { grid-column: 1; grid-row: 1; }
  .calc-option:has(.calc-qte) span { grid-column: 1 / 3; grid-row: 2; }
  .calc-option:has(.calc-qte) .calc-option-prix { grid-column: 2; grid-row: 1; align-self: baseline; }
  .calc-option:has(.calc-qte) .calc-qte { grid-column: 1 / 3; grid-row: 3; justify-self: start; align-self: start; margin-top: 10px; }
}

@media (max-width: 1000px) {
  .calc { grid-template-columns: 1fr; margin: 34px 0 26px; border-radius: 13px; }
  .calc-saisie { border-right: 1px solid var(--line); border-bottom: 0; border-radius: 13px 13px 0 0; padding: 28px 24px 26px; }
  .calc-resultat { padding: 26px 24px 24px; }
  .calc-actions { margin-top: 22px; padding-top: 0; }
  .calc-titre { font-size: 21px; }
  .calc-nombre { max-width: none; }
  .calc-total strong { font-size: 32px; }
  .calc-grille th, .calc-grille td { padding: 11px 8px; }
}

/* --- Les deux blocs de la page des tarifs ------------------------------
   Plus de selecteur a part : ce sont les deux boutons du bandeau qui
   menent aux ancres. Un seul point d entree, rien a maintenir en double.
   Le decalage empeche l ancre de coller le titre au bord de la fenetre. */
.bloc-tarif { scroll-margin-top: 18px; }

/* Le premier bloc suit le bandeau de pres : 95 px y feraient un trou. */
.bloc-tarif > .section:first-child { padding-top: 58px; }

@media (max-width: 760px) {
  .bloc-tarif > .section:first-child { padding-top: 38px; }
}
