/* AG-360 — feuille de base (mu-plugin).
   ATTENTION: elle charge AVANT le selectors.css d'Oxygen. Toute propriete
   qu'Oxygen definit deja sur la MEME classe exige !important. */

/* ---- resets de la maquette (Oxygen interdit les selecteurs de balise nue,
        donc ils ne peuvent pas vivre dans le systeme de design) ---- */
*{box-sizing:border-box}
body{margin:0;background:var(--bg-alt);color:var(--ink);font-family:var(--font);-webkit-font-smoothing:antialiased}
a{color:var(--accent);text-decoration:none}
h1,h2,h3,h4{margin:0;font-family:var(--font-display);font-weight:700;letter-spacing:-.02em;line-height:1.06;text-wrap:pretty}
p{margin:0;text-wrap:pretty}
button{font-family:inherit}
input,select,textarea{font-family:inherit;font-size:16px}
img{max-width:100%}

@keyframes agFade{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@keyframes agDash{to{stroke-dashoffset:-320}}

/* ---- responsive: points d'arret de la maquette (1060/860), qui ne sont PAS
        ceux d'Oxygen et seraient ignores en silence dans son magasin ---- */
.ag-navdesk{display:none}
.ag-ctadesk{display:none}
@media (min-width:1060px){
  .ag-navdesk{display:flex !important}
  .ag-ctadesk{display:inline-flex !important}
  .ag-burger{display:none !important}
}
@media (max-width:860px){
  .ag-twocol{grid-template-columns:minmax(0,1fr) !important}
}

/* ---- accordeon des services ---- */
.ag-svcpanel{display:none !important}
.ag-089.is-open .ag-svcpanel{display:flex !important;flex-direction:column;gap:14px;max-width:72ch;animation:agFade 220ms var(--ease) both}

/* ---- panneau de menu mobile (construit en JS depuis la nav de bureau) ---- */
.ag-mpanel{display:none;border-top:1px solid var(--line);background:#fff;padding:10px 24px 20px}
.ag-mpanel.is-open{display:block}
.ag-mpanel a{display:block;padding:14px 4px;border-bottom:1px solid var(--line);font-size:17px;font-weight:600;color:var(--ink)}
.ag-mpanel a.ag-mcta{margin-top:16px;text-align:center;background:var(--accent);color:#fff;padding:15px;border-radius:var(--btn-border-radius);font-size:15px;border-bottom:0}
@media (min-width:1060px){ .ag-mpanel{display:none !important} }

/* ---- carte des bureaux: etat actif d'une fiche ---- */
.ag-officecard.is-active{background:var(--accent) !important;color:#fff !important;border-color:var(--accent) !important}
.ag-officecard{cursor:pointer}

/* ---- largeur de contenu selon l'ecran (demande client 2026-09-14) ----
   1360 par defaut: un ecran 1360x768 est alors plein (il reste la gouttiere
   interne de 24px). Au-dela, on elargit pour ne pas laisser des centaines de
   pixels vides de chaque cote. !important car cette feuille charge AVANT le
   variables.css d'Oxygen, qui redefinit --maxw. */
@media (min-width:1600px){ :root{ --maxw:1520px !important } }
@media (min-width:1800px){ :root{ --maxw:1680px !important } }
@media (min-width:2100px){ :root{ --maxw:1900px !important } }

/* ---- gouttieres laterales plus serrees sur grand ecran ---- */
@media (min-width:1600px){
  .ag-012,.ag-027,.ag-075{ padding-left:32px !important; padding-right:32px !important }
}

/* ---- formulaire: empecher le debordement horizontal ----
   Le champ « fichier » de CF7 a une largeur intrinseque fixe et ne se reduit
   pas; et un minmax(280px,...) deborde des que la fenetre passe sous 280+gouttieres.
   Mesure: /soumission/ debordait a 360, 390, 768 et 1024. */
.wpcf7-form-control{ max-width:100% }
.wpcf7-form-control-wrap{ display:block; min-width:0 }
input[type="file"].wpcf7-form-control{ width:100%; box-sizing:border-box }
.ag-155{ grid-template-columns:repeat(auto-fit,minmax(min(280px,100%),1fr)) !important }
.ag-155 > *{ min-width:0 }

/* ---- etiquettes de section retirees (demande client 2026-09-14) ----
   « Services », « Nos valeurs », « Territoire »... et leur pastille. La grille
   a deux colonnes reservait 180px a cette etiquette: on la repasse en une
   colonne pour que le contenu occupe toute la largeur. */
.ag-028,.ag-056,.ag-029,.ag-030,.ag-057,.ag-058{ display:none !important }
.ag-027.ag-twocol{ grid-template-columns:minmax(0,1fr) !important }

/* ---- carte des succursales a la place du creux « photo » de l'accueil ---- */
/* .ag-039 est position:relative + overflow:hidden et porte une hauteur en clamp():
   un height:100% sur l'iframe ne se resolvait pas et laissait un vide gris. */
/* Le conteneur de la maquette est bien plus large (~3.2:1) que la carte
   (1200x620): en « cover » il coupait Matane et le bloc de Montreal. On cale
   donc le conteneur sur le rapport de la carte, rien n'est rogne. */
.ag-mapembed{ position:absolute; inset:0; width:100%; height:100%; border:0; display:block; object-fit:cover }
.ag-039{ height:auto !important; aspect-ratio:16/9; background:var(--surface) }

/* ---- visuel de la section « a propos » (image generee) ---- */
.ag-visuel{ position:absolute; inset:0; width:100%; height:100%; border:0; display:block; object-fit:cover; object-position:center }

/* ---- bloc des partenaires: le cadre blanc autour du panneau devient le meme
       bleu clair que l'interieur de la section (demande client). `:has()` cible
       uniquement CE conteneur: la classe .ag-065 sert de section blanche sur
       toutes les autres pages. ---- */
.ag-065:has(> .ag-132){ background:#dde4ea !important }

/* ---- pied: logo en version blanche, donc plus de pastille blanche ---- */
.ag-077{ background:transparent !important; padding:0 !important; border-radius:0 !important }

/* ---- bloc « Vous avez un projet » : titre a GAUCHE, phrase + bouton a DROITE,
       sur la meme rangee. Grille plutot que flex: les deux elements de droite
       n'ont pas de conteneur commun dans le balisage, la grille les place sans
       toucher au code. Le <h2> reste premier dans le code (SEO). ---- */
.ag-071{ display:grid !important; grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);
         column-gap:56px; row-gap:16px; align-items:center }
.ag-071 > .ag-072{ grid-column:1; grid-row:1 / span 2; align-self:center }
.ag-071 > .ag-073{ grid-column:2; grid-row:1; align-self:end }
.ag-071 > .ag-074{ grid-column:2; grid-row:2; justify-self:start; align-self:start }
@media (max-width:860px){
  .ag-071{ grid-template-columns:minmax(0,1fr) }
  .ag-071 > .ag-072{ grid-column:1; grid-row:auto }
  .ag-071 > .ag-073, .ag-071 > .ag-074{ grid-column:1; grid-row:auto }
}

/* ---- fiches de bureaux: aligner titres / adresses / boutons d'une carte a
       l'autre. `subgrid` fait partager a chaque carte les rangees de la grille
       parente, donc chaque element se pose a la meme hauteur sur toute la
       rangee. La cale .ag-vide tient la place du badge « Maison mere ». ---- */
.ag-119 > *{ display:grid !important; grid-template-rows:subgrid; grid-row:span 4; align-content:start; gap:16px }
.ag-vide{ display:block; min-height:0 }

/* ---- heros: le paragraphe respire davantage (demande client) ---- */
.ag-019{ max-width:74ch !important }

/* ---- heros anime: le limbe gradue tourne lentement, l'anneau interieur en
       sens inverse. Les @keyframes ne peuvent pas vivre dans le magasin de
       selecteurs d'Oxygen: ils sont donc ici, et survivent aux rebuilds.
       transform-box:view-box pour que l'origine soit en unites du viewBox. ---- */
@keyframes agSpin    { to { transform: rotate(360deg) } }
@keyframes agSpinInv { to { transform: rotate(-360deg) } }
.ag-limbe, .ag-limbe2{ transform-box: view-box; transform-origin: 812px 322px }
.ag-limbe { animation: agSpin    150s linear infinite }
.ag-limbe2{ animation: agSpinInv  90s linear infinite }

/* Respecter le reglage systeme « animations reduites ». */
@media (prefers-reduced-motion: reduce){
  .ag-limbe, .ag-limbe2{ animation: none }
}

/* ================= CARRIERES : postes, modales, candidature ================= */

.ag-postes{ display:flex; flex-direction:column; gap:14px }
.ag-poste .ag-151{ flex:1 1 380px }
.ag-postemeta{ font:600 11.5px/1 var(--font); letter-spacing:.12em; text-transform:uppercase; color:var(--accent) }
.ag-posteactions{ display:flex; flex-wrap:wrap; gap:10px; align-items:center }

/* Les boutons sont des <button>: annuler le style natif, sinon le navigateur
   impose son propre fond et un liseré. */
.ag-154, .ag-btn-secondaire{ border:0; cursor:pointer; font-family:inherit; line-height:1 }
.ag-btn-secondaire{ display:inline-flex; align-items:center; gap:8px; background:transparent;
  color:var(--accent); border:1px solid var(--line); padding:14px 22px; border-radius:999px;
  font-size:14.5px; font-weight:600 }
.ag-btn-secondaire:hover{ border-color:var(--accent); background:var(--bg) }
button.ag-154:hover{ background:var(--deep) }

/* ---- modales ---- */
.ag-modale{ position:fixed; inset:0; z-index:9000; display:flex; align-items:center; justify-content:center; padding:20px }
.ag-modale[hidden]{ display:none !important }
.ag-modale-fond{ position:absolute; inset:0; background:rgba(6,48,79,.55); backdrop-filter:blur(2px) }
.ag-modale-boite{ position:relative; background:var(--bg); border-radius:var(--radius);
  width:min(680px,100%); max-height:88vh; overflow:auto; padding:34px 34px 28px;
  box-shadow:0 24px 70px rgba(6,48,79,.3) }
/* la fiche de poste respire davantage que le formulaire */
#ag-modale-detail .ag-modale-boite{ width:min(900px,100%); padding:38px 40px 30px }
.ag-detail-corps{ column-gap:38px }
.ag-detail-corps > *:first-child{ margin-top:0 }
.ag-detail-corps strong{ color:var(--deep) }
.ag-modale-x{ position:absolute; top:12px; right:14px; width:38px; height:38px; border:0; background:transparent;
  font-size:26px; line-height:1; color:var(--ink-soft); cursor:pointer; border-radius:50% }
.ag-modale-x:hover{ background:var(--surface); color:var(--ink) }
.ag-modale-titre{ font-family:var(--font-display); font-size:26px; color:var(--deep); margin:0 34px 6px 0 }
.ag-modale-sous{ font-size:14.5px; color:var(--ink-soft); margin:0 0 20px }
.ag-modale-pied{ margin-top:22px; display:flex; justify-content:flex-start }

.ag-cand-form{ display:grid; grid-template-columns:repeat(auto-fit,minmax(min(230px,100%),1fr)); gap:16px }
.ag-champ{ display:flex; flex-direction:column; gap:7px; min-width:0 }
.ag-champ-large{ grid-column:1 / -1 }
.ag-champ > span{ font-size:13.5px; font-weight:600; color:var(--ink) }
.ag-champ em{ font-weight:400; font-style:normal; color:var(--ink-soft) }
.ag-champ input, .ag-champ select, .ag-champ textarea{
  width:100%; max-width:100%; box-sizing:border-box; padding:13px 15px; border:1px solid var(--line);
  border-radius:var(--radius-ui); background:var(--bg); color:var(--ink); font-size:15px }
.ag-champ input[type=file]{ padding:11px; background:var(--bg-alt) }
.ag-champ input:focus, .ag-champ select:focus, .ag-champ textarea:focus{ outline:2px solid var(--accent-lt); outline-offset:1px }
.ag-modale-pied .ag-154{ width:auto }
.ag-hp{ position:absolute !important; left:-9999px !important; width:1px !important; height:1px !important }

.ag-detail-corps{ font-size:15.5px; line-height:1.62; color:var(--ink) }
.ag-detail-corps p{ margin:0 0 12px }
.ag-detail-corps ul{ margin:0 0 12px; padding-left:20px }
.ag-detail-corps li{ margin:0 0 6px }

/* ---- avis apres envoi ---- */
.ag-avis{ border-radius:var(--radius); padding:16px 20px; font-size:15px; margin-bottom:16px }
.ag-avis-ok{ background:#e7f4ea; color:#14532d; border:1px solid #bcdcc6 }
.ag-avis-ko{ background:#fdeceb; color:#7f1d1d; border:1px solid #f3c7c4 }

@media (max-width:620px){
  .ag-modale-boite{ padding:26px 20px 22px }
  .ag-posteactions{ width:100% }
  .ag-posteactions > *{ flex:1 1 auto; justify-content:center }
}

/* ============ APPARITION AU DEFILEMENT + TRANSITION DE PAGE ============
   Regles de performance tenues ici:
   - on n'anime QUE `opacity` et `transform`: le navigateur les traite sur le
     compositeur, sans recalcul de mise en page ni repeinture;
   - le masquage depend de `.ag-js`, posee par un script EN LIGNE minuscule:
     sans JS (ou s'il echoue), tout reste visible. Aucun contenu ne depend
     d'une animation pour s'afficher;
   - le heros n'est jamais masque: c'est le plus grand rendu (LCP), le cacher
     rendrait la page plus lente a l'oeil comme a la mesure;
   - la transition entre pages est la View Transition NATIVE du navigateur:
     zero JS, zero requete, aucun delai ajoute a la navigation. */

.ag-js .ag-reveal{ opacity:0; transform:translate3d(0,16px,0) }
.ag-js .ag-reveal.ag-vu{
  opacity:1; transform:none;
  transition:opacity .5s cubic-bezier(.22,.61,.36,1), transform .5s cubic-bezier(.22,.61,.36,1);
}
/* will-change seulement tant que l'element n'est pas revele: le laisser en
   permanence garderait une couche GPU par section pour rien. */
.ag-js .ag-reveal:not(.ag-vu){ will-change:opacity, transform }

@view-transition{ navigation:auto }
::view-transition-old(root){ animation:agSortie .18s ease both }
::view-transition-new(root){ animation:agEntree .26s ease both }
@keyframes agSortie{ to{ opacity:0 } }
@keyframes agEntree{ from{ opacity:0 } }

@media (prefers-reduced-motion: reduce){
  .ag-js .ag-reveal{ opacity:1 !important; transform:none !important; transition:none !important }
  ::view-transition-old(root), ::view-transition-new(root){ animation:none }
}

/* ---- paragraphe « a propos »: plus large (demande client) ---- */
/* Paragraphe « a propos »: pleine largeur du conteneur (demande client).
   La colonne d'etiquette de 180px ayant ete retiree, il occupe toute la
   largeur utile de la section. */
.ag-034{ max-width:none !important }

/* ---- fleche des boutons ----
   Le caractere « \2197 » est un glyphe de police: trait plus fin que le libelle
   en gras a cote, et ligne de base decalee. On le masque et on peint un trace
   vectoriel, par `mask`: la couleur suit `currentColor`, et aucun <svg> n'entre
   dans l'arbre Oxygen (qui ecraserait fill/stroke via .oxy-svg-icon>svg).
   Le caractere reste dans le balisage: sans CSS, la fleche s'affiche quand meme.

   Deux pieges rencontres:
   - les attributs du SVG sont en apostrophes simples, sinon leurs guillemets
     doubles ferment la chaine CSS et `mask` retombe a `none`;
   - la taille est en PIXELS: avec `font-size:0` (qui masque le glyphe), une
     taille en `em` vaut zero. */
.ag-008, .ag-022{
  display:inline-block; flex:0 0 auto;
  font-size:0 !important; line-height:0 !important;
  width:15px; height:15px;
  background-color:currentColor;
  /* Les boutons sont des conteneurs flex: `vertical-align` y est ignore. On
     centre par le flex et on remonte d'un cheveu, parce que le centre optique
     des capitales est legerement au-dessus du centre geometrique de la ligne. */
  align-self:center; position:relative; top:-1px; vertical-align:middle;
  -webkit-mask:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'><path d='M5 12h13'/><path d='M12.5 6.5 18 12l-5.5 5.5'/></svg>") center/contain no-repeat;
          mask:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'><path d='M5 12h13'/><path d='M12.5 6.5 18 12l-5.5 5.5'/></svg>") center/contain no-repeat;
  transition:transform .22s cubic-bezier(.22,.61,.36,1);
}
.ag-022{ width:17px; height:17px }

/* deplacement au survol: seulement `transform`, aucun recalcul de mise en page */
a:hover > .ag-008, a:hover > .ag-022,
button:hover > .ag-008, button:hover > .ag-022{ transform:translate3d(3px,0,0) }

@media (prefers-reduced-motion: reduce){
  .ag-008, .ag-022{ transition:none }
  a:hover > .ag-008, a:hover > .ag-022,
  button:hover > .ag-008, button:hover > .ag-022{ transform:none }
}

/* ======================= FORMULAIRE DE SOUMISSION =======================
   La maquette donnait des champs a hauteurs inegales (48 px pour les champs
   texte, 52 pour les listes) et une liste qui ne remplissait pas sa cellule.
   Tout est ramene sur une meme trame. */

.wpcf7-form.ag-155{ max-width:none }
.ag-155 .wpcf7-form-control-wrap{ display:block; width:100%; min-width:0 }

/* --- tous les controles sur la meme trame --- */
.ag-155 input[type=text], .ag-155 input[type=tel], .ag-155 input[type=email],
.ag-155 select, .ag-155 textarea{
  width:100% !important; box-sizing:border-box;
  min-height:54px; padding:15px 16px;
  border:1px solid var(--line); border-radius:var(--radius-ui);
  background:var(--bg); color:var(--ink);
  font-family:inherit; font-size:15.5px; line-height:1.3;
  transition:border-color .16s, box-shadow .16s, background-color .16s;
  appearance:none; -webkit-appearance:none;
}
.ag-155 textarea{ min-height:120px; resize:vertical }
.ag-155 ::placeholder{ color:#9aa9b6; opacity:1 }

/* --- liste deroulante: chevron dessine, celui du systeme differe d'un
       navigateur a l'autre et ne suit pas la charte --- */
.ag-155 select{
  padding-right:46px; cursor:pointer;
  background-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><path d='M6 9.5 12 15.5 18 9.5'/></svg>");
  background-repeat:no-repeat;
  background-position:right 16px center;
  background-size:19px 19px;
}

/* --- survol et focus --- */
.ag-155 input:hover, .ag-155 select:hover, .ag-155 textarea:hover{ border-color:#c2cfda }
.ag-155 input:focus, .ag-155 select:focus, .ag-155 textarea:focus{
  outline:none; border-color:var(--accent);
  box-shadow:0 0 0 3px rgba(8,72,120,.14);
}

/* --- libelles --- */
.ag-156, .ag-160{ gap:9px }
.ag-157{ font-size:13.5px; font-weight:600; color:var(--deep); letter-spacing:.01em }

/* --- champ « fichier »: une vraie zone de depot --- */
.ag-155 input[type=file]{
  width:100%; box-sizing:border-box; cursor:pointer;
  border:1.5px dashed #c6d3de; border-radius:var(--radius-ui);
  padding:22px 20px 22px 58px; background:var(--bg-alt);
  color:var(--ink-soft); font-family:inherit; font-size:14.5px;
  background-image:url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'><path d='M13 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V9z'/><path d='M13 3v6h6'/></svg>");
  background-repeat:no-repeat; background-position:left 20px center; background-size:22px 22px;
  transition:border-color .16s, background-color .16s;
}
.ag-155 input[type=file]:hover{ border-color:var(--accent-lt); background-color:#eef4f9 }
.ag-155 input[type=file]::file-selector-button{
  margin-right:14px; padding:9px 16px; border:1px solid var(--line); border-radius:999px;
  background:var(--bg); color:var(--accent); font:600 13.5px/1 var(--font); cursor:pointer;
}
.ag-155 input[type=file]::file-selector-button:hover{ border-color:var(--accent); background:#eef4f9 }

/* --- bouton d'envoi --- */
.ag-163{ padding-top:10px; gap:18px }
.ag-164{ padding:17px 34px; font-size:15px; letter-spacing:.01em;
  transition:background-color .18s, transform .18s }
.ag-164:hover{ background:var(--deep) }
.ag-164:active{ transform:translateY(1px) }
.ag-164:disabled{ opacity:.6; cursor:default }

/* --- etats de validation de CF7 --- */
.ag-155 .wpcf7-not-valid{ border-color:#c0392b !important; background:#fdf7f7 }
.ag-155 .wpcf7-not-valid:focus{ box-shadow:0 0 0 3px rgba(192,57,43,.15) }
.ag-155 .wpcf7-not-valid-tip{
  display:block; margin-top:7px; color:#b3261e; font-size:12.5px; font-weight:500 }
.wpcf7 form .wpcf7-response-output{
  margin:22px 0 0; padding:15px 19px; border-radius:var(--radius);
  border:1px solid var(--line); font-size:14.5px; line-height:1.5 }
.wpcf7 form.sent .wpcf7-response-output{ background:#e7f4ea; border-color:#bcdcc6; color:#14532d }
.wpcf7 form.invalid .wpcf7-response-output,
.wpcf7 form.failed .wpcf7-response-output{ background:#fdeceb; border-color:#f3c7c4; color:#7f1d1d }
.wpcf7-spinner{ margin:0 0 0 12px }

@media (max-width:640px){
  .ag-155{ gap:18px }
  .ag-163 .ag-164{ width:100%; justify-content:center }
}

/* ---- ordre des champs: « Succursale visee » et « Type de travaux » sur la
       MEME rangee (demande client). L'ordre du BALISAGE ne bouge pas (CF7 le
       genere): on se sert de `order`, et `:has()` designe chaque champ par la
       commande qu'il contient plutot que par une position fragile. ---- */
@media (min-width:900px){
  .ag-155 > *{ order:5 }
  .ag-155 > label:has(select[name=bureau]){  order:1; grid-column:span 2 }
  .ag-155 > label:has(select[name=travaux]){ order:2; grid-column:span 2 }
  .ag-155 > label:has(input[type=file]){ order:8 }
  .ag-155 > .ag-163{ order:9 }
  .ag-155 > .wpcf7-response-output{ order:10 }
}

/* ---- titre « Nous ne faisons pas que mesurer : ... » : plus large ----
   Il tenait sur trois lignes dans une colonne etroite heritee de la maquette. */
.ag-032{ max-width:26ch !important }
@media (min-width:1100px){ .ag-032{ max-width:none !important } }

/* ---- pied: la phrase d'introduction en gris, comme le reste du pied ---- */
.ag-079{ color:#9fb4c6 !important }

/* ---- fiche de service (modale de l'accueil) ---- */
#ag-modale-service .ag-svc-boite{ width:min(940px,100%); padding:0;
  display:grid; grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr) }
.ag-svc-visuel{ margin:0; min-height:100%; background:var(--surface) }
.ag-svc-visuel img{ display:block; width:100%; height:100%; object-fit:cover }
.ag-svc-visuel[hidden]{ display:none }
#ag-modale-service .ag-svc-boite:has(.ag-svc-visuel[hidden]){ grid-template-columns:minmax(0,1fr) }
.ag-svc-texte{ padding:38px 38px 32px; min-width:0 }
.ag-svc-corps{ font-size:15.5px; line-height:1.62; color:var(--ink-soft) }
.ag-svc-corps p{ margin:0 0 12px }
.ag-svc-cta{ margin:16px 0 0; padding:14px 16px; border-left:3px solid var(--accent-lt);
  background:var(--bg-alt); font-size:14.5px; color:var(--deep); font-weight:500 }
.ag-svc-cta:empty{ display:none }
.ag-svc-actions{ display:flex; flex-wrap:wrap; gap:12px; margin-top:26px; align-items:center }
.ag-svc-actions .ag-154, .ag-svc-actions .ag-btn-secondaire{ text-decoration:none }
#ag-modale-service .ag-modale-x{ z-index:2; background:rgba(255,255,255,.9) }
@media (max-width:820px){
  #ag-modale-service .ag-svc-boite{ grid-template-columns:minmax(0,1fr) }
  .ag-svc-visuel{ max-height:210px }
  .ag-svc-texte{ padding:26px 22px 24px }
}

/* =================== MODALES : tenue sur petit ecran ===================
   Trois corrections mesurees:
   - la fiche de service etait en `overflow:hidden`: passe la hauteur de l'ecran,
     le bas du contenu etait coupe SANS possibilite de defiler;
   - `vh` sur mobile compte la barre d'adresse comme si elle etait masquee, donc
     une boite en 88vh depasse reellement l'ecran. `dvh` suit la hauteur VISIBLE;
   - le conteneur lui-meme doit pouvoir defiler quand la boite est plus haute
     que l'ecran, sinon on ne peut plus atteindre le bouton de fermeture. */

.ag-modale{ overflow-y:auto; -webkit-overflow-scrolling:touch;
  align-items:flex-start; padding:16px }
@media (min-width:720px){ .ag-modale{ align-items:center; padding:20px } }

.ag-modale-boite{
  max-height:88vh;
  max-height:88dvh;          /* suit la hauteur reellement visible sur mobile */
  overflow-y:auto; -webkit-overflow-scrolling:touch;
  margin:auto;
}
/* la fiche de service defile elle aussi (elle etait en overflow:hidden) */
#ag-modale-service .ag-svc-boite{ overflow-y:auto; -webkit-overflow-scrolling:touch }

/* le bouton de fermeture reste atteignable meme apres defilement */
/* colle en haut de la boite qui defile: reste visible quel que soit le defilement */
.ag-modale-x{ position:sticky; top:8px; float:right; margin:-8px -8px 0 0; z-index:3;
  background:rgba(255,255,255,.92); backdrop-filter:blur(3px) }
#ag-modale-service .ag-modale-x{ position:sticky; top:10px; float:right; right:auto;
  margin:10px 10px 0 0; background:rgba(255,255,255,.92) }
/* la fiche de service est une grille: le bouton doit etre sorti du flux des colonnes */
#ag-modale-service .ag-svc-boite > .ag-modale-x{ grid-column:1 / -1; grid-row:1;
  justify-self:end; position:sticky; top:10px }

@media (max-width:719px){
  /* C'est la BOITE qui defile, pas le conteneur. Avec un conteneur defilant, le
     bouton de fermeture (colle en haut de la boite) sortait de l'ecran des qu'on
     descendait: mesure faite, il devenait inatteignable. */
  .ag-modale{ align-items:flex-start; padding:12px }
  .ag-modale-boite{ max-height:calc(100vh - 24px); max-height:calc(100dvh - 24px) }
  .ag-modale-titre{ font-size:22px; margin-right:40px }
  .ag-modale-sous{ font-size:14px; margin-bottom:16px }
  .ag-cand-form{ grid-template-columns:minmax(0,1fr) }     /* un champ par ligne */
  .ag-champ input, .ag-champ select, .ag-champ textarea{ font-size:16px }  /* 16px: iOS ne zoome pas */
  .ag-modale-pied .ag-154{ width:100%; justify-content:center }
  #ag-modale-service .ag-svc-boite{ grid-template-columns:minmax(0,1fr) }
  .ag-svc-visuel{ max-height:180px }
  .ag-svc-actions > *{ width:100%; justify-content:center }
}

/* ---- section « a propos »: texte a gauche, visuel a droite ---- */
.ag-valeurs-rangee{ display:grid; grid-template-columns:minmax(0,1.9fr) minmax(0,1fr);
  gap:52px; align-items:start }
.ag-valeurs-visuel{ margin:0; border-radius:var(--radius); overflow:hidden;
  background:var(--surface); aspect-ratio:4/5 }
.ag-valeurs-visuel img{ display:block; width:100%; height:100%; object-fit:cover }
/* le paragraphe n'a plus besoin de toute la largeur: il partage la rangee */
/* Le paragraphe est FLUIDE: aucune largeur maximale, il occupe la colonne que
   la grille lui donne. C'est donc la grille qui gouverne la mesure, et elle
   s'adapte seule a la largeur de l'ecran. */
.ag-valeurs-rangee .ag-034,
.ag-valeurs-rangee .ag-103{ max-width:none !important; width:100% }
@media (max-width:900px){ .ag-valeurs-rangee .ag-103{ max-width:76ch !important } }

/* ---- le visuel epouse la hauteur de la colonne de texte ----
   Avec un `aspect-ratio` fixe, l'image etait bien plus haute que le texte et
   laissait un grand vide sous « En savoir plus sur nous ». On l'etire sur toute
   la rangee et on recadre par `object-fit`. */
@media (min-width:901px){
  .ag-valeurs-rangee{ align-items:stretch }
  .ag-valeurs-visuel{ aspect-ratio:auto; height:100%; min-height:420px }
}

/* ---- page Services: le texte deplie occupe toute la largeur disponible ----
   Il etait plafonne a 72ch alors que le titre du service, juste au-dessus,
   va jusqu'au bord du conteneur. */
.ag-094, .ag-svcpanel{ max-width:none !important }
.ag-089.is-open .ag-svcpanel{ max-width:none !important }

/* ---- logos des partenaires: taille OPTIQUE homogene ----
   Une hauteur unique ne peut pas marcher: les rapports vont de 1,3 (Bio-Logik,
   presque carre) a 6,6 (Leveille Gascon, tres allonge). A hauteur egale, le
   carre parait minuscule et l'allonge parait enorme. On vise donc une AIRE
   comparable pour chacun, ce qui est ce que l'oeil compare reellement.
   Les marges internes des fichiers ont ete rognees au prealable. */
.ag-134{ height:104px !important; padding:14px }
.ag-135{ max-height:none !important; max-width:none !important;
  width:auto; height:auto; object-fit:contain }

/* Le `max-height:none !important` ci-dessus l'emporte sur toute regle par logo
   qui n'est PAS !important, quelle que soit sa specificite: chaque valeur par
   logo doit donc l'etre aussi, sinon les images reprennent leur taille
   naturelle et sortent du cadre. */
/* rapport ~6,6 : tres allonge -> limite par la largeur */
.ag-135[src*="leveille"]{ width:90% !important; max-height:46px !important }
/* rapports ~2,6 a 3,0 : logos-bandeaux classiques */
.ag-135[src*="geoti"],
.ag-135[src*="mtb"],
.ag-135[src*="trifide"]{ width:82% !important; max-height:62px !important }
/* rapport ~1,3 : presque carre -> c'est la HAUTEUR qui doit porter */
.ag-135[src*="biologik"]{ width:auto !important; height:76px !important; max-width:80% !important }

@media (max-width:620px){
  .ag-134{ height:92px !important }
  .ag-135[src*="biologik"]{ height:66px !important }
}

/* ---- grille des partenaires: 5 cartes ----
   En auto-fit elles tombaient en 4+1, la derniere seule sur sa rangee.
   Trois colonnes donnent 3+2, nettement plus equilibre. */
@media (min-width:1040px){ .ag-132{ grid-template-columns:repeat(3,minmax(0,1fr)) !important } }
@media (min-width:660px) and (max-width:1039px){ .ag-132{ grid-template-columns:repeat(2,minmax(0,1fr)) !important } }

/* ---- fiches de bureaux: les boutons ne doivent PAS s'etirer ----
   Le subgrid impose a chaque rangee la hauteur de la plus haute fiche. La
   rangee des boutons s'etirait donc en hauteur, et `border-radius:999px` sur
   une boite haute donne une ellipse au lieu d'une pastille. */
.ag-119 > * > .ag-126{ align-content:start; align-items:center }
.ag-127{ align-self:center; height:auto; line-height:1.3; white-space:nowrap }
/* les courriels sont longs: sur une carte etroite, un par ligne plutot que
   deux serres qui debordent */
@media (max-width:1180px){
  .ag-126{ flex-direction:column; align-items:flex-start }
  .ag-127{ width:auto; max-width:100% }
}
@media (max-width:420px){
  .ag-127{ white-space:normal; word-break:break-word; border-radius:14px }
}

/* ---- grilles: plancher qui ne depasse jamais l'ecran ----
   `minmax(310px, 1fr)` impose 310 px meme quand la colonne n'en fait que 272:
   la grille deborde alors horizontalement. `min(310px, 100%)` prend la plus
   petite des deux, donc le plancher s'efface sur un ecran etroit.
   Mesure: /nos-bureaux/ debordait de 14 px a 320 px de large. */
.ag-035{ grid-template-columns:repeat(auto-fit,minmax(min(150px,100%),1fr)) !important }
.ag-044{ grid-template-columns:repeat(auto-fit,minmax(min(230px,100%),1fr)) !important }
.ag-060{ grid-template-columns:repeat(auto-fit,minmax(min(200px,100%),1fr)) !important }
.ag-075{ grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr)) !important }
.ag-108{ grid-template-columns:repeat(auto-fit,minmax(min(170px,100%),1fr)) !important }
.ag-119{ grid-template-columns:repeat(auto-fit,minmax(min(310px,100%),1fr)) !important }
.ag-145{ grid-template-columns:repeat(auto-fit,minmax(min(240px,100%),1fr)) !important }
@media (max-width:659px){
  .ag-132{ grid-template-columns:repeat(auto-fit,minmax(min(290px,100%),1fr)) !important }
}

/* ---- selecteur de langue (marqueur [ag_langue] dans l'arbre de l'entete) ----
   L'element flex est l'hote pose par l'arbre, pas le lien: c'est lui qui porte
   la marge automatique. En dessous de 1060px la nav et le bouton d'appel sont
   masques, donc la marge automatique passe sur l'hote pour coller le selecteur
   a droite, juste avant le burger. */
#ag-langue-hote{ display:flex; align-items:center; flex:0 0 auto; margin-left:auto }
@media (min-width:1060px){ #ag-langue-hote{ margin-left:0; margin-right:2px } }
.ag-langue{
  display:inline-flex; align-items:center; justify-content:center;
  min-width:38px; height:34px; padding:0 10px;
  border:1px solid var(--line); border-radius:var(--radius-ui);
  font:600 12.5px/1 var(--font); letter-spacing:.06em;
  color:var(--ink-soft); background:var(--white); text-decoration:none;
}
.ag-langue:hover{ color:var(--ink); border-color:var(--ink-soft) }
@media (max-width:1059px){ #ag-langue-hote{ margin-right:8px } }


/* ---- icones des valeurs (accueil et /en/home/) ----
   Posees en CSS et non dans l'arbre Oxygen: le trait suit le bleu clair deja
   utilise par le numero, et surtout un rebuild de la page ne les efface pas.
   SVG en ligne, donc aucune requete supplementaire. Attributs en apostrophes
   SIMPLES: une guillemet double fermerait la chaine CSS et la regle deviendrait
   `none` en silence. */
.ag-061{ position:relative }
.ag-061::before{
  content:''; display:block; width:26px; height:26px; margin-bottom:4px;
  background-repeat:no-repeat; background-position:left center; background-size:26px 26px;
  opacity:.92;
}
.ag-060 > .ag-061:nth-child(1)::before{ background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27%238ecdf5%27%20stroke-width%3D%271.6%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Ccircle%20cx%3D%279.2%27%20cy%3D%2712%27%20r%3D%275.3%27%2F%3E%3Ccircle%20cx%3D%2714.8%27%20cy%3D%2712%27%20r%3D%275.3%27%2F%3E%3C%2Fsvg%3E") }  /* Collaboration */
.ag-060 > .ag-061:nth-child(2)::before{ background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27%238ecdf5%27%20stroke-width%3D%271.6%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M12%202.8%2019.2%206v5.6c0%204.3-2.9%207.6-7.2%209.6-4.3-2-7.2-5.3-7.2-9.6V6z%27%2F%3E%3Cpath%20d%3D%27m8.8%2012.1%202.3%202.3%204.4-4.6%27%2F%3E%3C%2Fsvg%3E") }  /* Intégrité */
.ag-060 > .ag-061:nth-child(3)::before{ background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27%238ecdf5%27%20stroke-width%3D%271.6%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Ccircle%20cx%3D%2712%27%20cy%3D%279%27%20r%3D%275.4%27%2F%3E%3Cpath%20d%3D%27M8.7%2013.5%207.2%2021%2012%2018.4%2016.8%2021l-1.5-7.5%27%2F%3E%3C%2Fsvg%3E") }  /* Professionnalisme */
.ag-060 > .ag-061:nth-child(4)::before{ background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27%238ecdf5%27%20stroke-width%3D%271.6%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Ccircle%20cx%3D%2712%27%20cy%3D%2712%27%20r%3D%278.4%27%2F%3E%3Cpath%20d%3D%27M12%207.1V12l3.4%202%27%2F%3E%3C%2Fsvg%3E") }  /* Engagement */
.ag-060 > .ag-061:nth-child(5)::before{ background-image:url("data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2024%2024%27%20fill%3D%27none%27%20stroke%3D%27%238ecdf5%27%20stroke-width%3D%271.6%27%20stroke-linecap%3D%27round%27%20stroke-linejoin%3D%27round%27%3E%3Cpath%20d%3D%27M4.2%2019.8%206.4%2013.6%2014.7%205.3a2.2%202.2%200%200%201%203.1%200l.9.9a2.2%202.2%200%200%201%200%203.1L10.4%2017.6%204.2%2019.8z%27%2F%3E%3Cpath%20d%3D%27m13.5%206.5%204%204%27%2F%3E%3C%2Fsvg%3E") }  /* Fierté */
@media (max-width:520px){ .ag-061::before{ width:22px; height:22px; background-size:22px 22px } }

/* ---- /a-propos/ : visuel plus petit que celui de l'accueil (demande client) ----
   Les deux pages partagent les memes classes; on distingue par le FICHIER, ce
   qui evite de toucher l'arbre Oxygen et donc de devoir republier la page. */
@media (min-width:901px){
  .ag-valeurs-rangee:has(img[src*="apropos-valeurs"]){
    grid-template-columns:minmax(0,2.5fr) minmax(0,1fr); align-items:start }
  .ag-valeurs-visuel:has(img[src*="apropos-valeurs"]){
    height:auto; min-height:0; max-height:400px; aspect-ratio:4/5; align-self:start }
}

/* ---- accueil: le titre tient sur DEUX lignes, toujours ----
   La coupure venait du repli naturel et changeait donc avec la largeur.
   Le fragment en accent devient un bloc: la ligne 2 est garantie. */
.ag-032 .ag-033{ display:block }

/* ---- /a-propos/ (et sa version EN): deux titres sur une seule ligne ----
   Les classes sont partagees par toutes les pages; on borne donc a l'identifiant
   de page, sinon les titres plus longs des autres pages perdraient leur mesure.
   Sur mobile le repli naturel reprend, aucune valeur fixe n'est posee. */
.page-id-12 .ag-101, .page-id-104 .ag-101,
.page-id-12 .ag-105, .page-id-104 .ag-105{ max-width:none !important }

/* ---- valeurs: l'icone remplace le numero (demande client) ----
   Masque plutot que retire de l'arbre: la page n'a pas besoin d'etre republiee
   et la version anglaise, qui partage les classes, suit automatiquement. */
.ag-061 > .ag-062{ display:none }

/* ---- titre des services: le fragment en accent ne se coupe pas en deux ----
   En anglais « Land surveying from end to end » se repliait sur « end to / end, »,
   ce qui se lit mal. Uniquement au-dessus de 1100px: en dessous, le repli
   naturel est necessaire pour ne pas deborder. */
@media (min-width:1100px){ .ag-043 .ag-033{ white-space:nowrap } }

/* ---- tres petits ecrans: l'entete doit tenir dans 320px ----
   Logo + espacement + selecteur + burger faisaient 355px de contenu pour 320px
   d'ecran. On resserre l'espacement et on reduit le logo et la pastille de
   langue, plutot que de masquer le selecteur: un anglophone doit pouvoir
   changer de langue depuis un telephone. */
@media (max-width:400px){
  .ag-002{ gap:12px !important }
  .ag-004{ height:42px }
  #ag-langue-hote{ margin-right:0 }
  .ag-langue{ min-width:34px; height:30px; padding:0 7px; font-size:11.5px }
}
